blob: 6103f62cd68e04d5f42f6b3dc38336c24f14a9a2 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.diff.impl.util;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.diff.impl.incrementalMerge.ui.EditorPlace;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.util.containers.HashSet;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Collection;
public class FontSizeSynchronizer {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.impl.util.FontSizeSynchronizer");
private final Collection<Editor> myEditors = new HashSet<Editor>();
private final MyFontSizeListener myFontSizeListener = new MyFontSizeListener();
private int myLastFontSize = -1;
public void synchronize(EditorEx editor) {
LOG.assertTrue(!myEditors.contains(editor));
editor.addPropertyChangeListener(myFontSizeListener);
myEditors.add(editor);
if (myLastFontSize != -1) myFontSizeListener.updateEditor(editor);
}
public void stopSynchronize(EditorEx editor) {
LOG.assertTrue(myEditors.contains(editor));
editor.removePropertyChangeListener(myFontSizeListener);
myEditors.remove(editor);
}
public static void attachTo(ArrayList<EditorPlace> editorPlaces) {
final FontSizeSynchronizer synchronizer = new FontSizeSynchronizer();
for (EditorPlace editorPlace : editorPlaces) {
editorPlace.addListener(new EditorPlace.EditorListener() {
public void onEditorCreated(EditorPlace place) {
synchronizer.synchronize((EditorEx)place.getEditor());
}
public void onEditorReleased(Editor releasedEditor) {
synchronizer.stopSynchronize((EditorEx)releasedEditor);
}
});
EditorEx editor = (EditorEx)editorPlace.getEditor();
if (editor != null) synchronizer.synchronize(editor);
}
}
private class MyFontSizeListener implements PropertyChangeListener {
private boolean myDuringUpdate = false;
public void propertyChange(PropertyChangeEvent evt) {
if (myDuringUpdate) return;
if (!EditorEx.PROP_FONT_SIZE.equals(evt.getPropertyName())) return;
if (evt.getOldValue().equals(evt.getNewValue())) return;
myLastFontSize = ((Integer)evt.getNewValue()).intValue();
for (Editor editor : myEditors) {
if (editor == null || editor == evt.getSource()) continue;
updateEditor((EditorEx)editor);
}
}
public void updateEditor(EditorEx editor) {
try {
myDuringUpdate = true;
editor.setFontSize(myLastFontSize);
} finally {
myDuringUpdate = false;
}
}
}
}