From 8590ec992a14ba787f40ed8a432c7fec0debe333 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 19 Jan 2011 16:47:24 +0300 Subject: [PATCH] excessive encoding panel update, status bar border --- .../colors/ColorAndFontDescriptionPanel.java | 2 +- .../options/colors/OptionsPanelImpl.java | 2 +- .../openapi/vfs/encoding/FileTreeTable.java | 2 +- .../openapi/vfs/encoding/EncodingManager.java | 9 +++-- .../encoding/ChooseFileEncodingAction.java | 8 ++--- .../vfs/encoding/EncodingManagerImpl.java | 26 +++++++++++--- .../encoding/EncodingProjectManagerImpl.java | 12 +++++-- .../openapi/wm/impl/status/EncodingPanel.java | 36 ++++++------------- .../properties/PropertiesFilesManager.java | 9 +---- 9 files changed, 56 insertions(+), 50 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java index f88ac48e7699..a310b00c4e01 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java @@ -285,7 +285,7 @@ public class ColorAndFontDescriptionPanel extends JPanel { return panel; } - public void addActionListener(ActionListener actionListener) { + public void setActionListener(ActionListener actionListener) { myActionListener = actionListener; } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java index d3d295d1f078..0d45e1e1d5d6 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java @@ -47,7 +47,7 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { mySchemesProvider = schemesProvider; myCategoryName = categoryName; - optionsPanel.addActionListener(new ActionListener(){ + optionsPanel.setActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { myDispatcher.getMulticaster().settingsChanged(); } diff --git a/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileTreeTable.java b/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileTreeTable.java index 969994593af9..37eeb70f0c03 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileTreeTable.java +++ b/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileTreeTable.java @@ -56,7 +56,7 @@ public class FileTreeTable extends AbstractFileTreeTable { setText(t.displayName()); } else if (file != null) { - Charset charset = ChooseFileEncodingAction.charsetFromContent(file); + Charset charset = ChooseFileEncodingAction.cachedCharsetFromContent(file); if (charset != null) { setText(charset.displayName()); } diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/encoding/EncodingManager.java b/platform/platform-api/src/com/intellij/openapi/vfs/encoding/EncodingManager.java index f48fe710d7bd..7fdade2e7c40 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/encoding/EncodingManager.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/encoding/EncodingManager.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.vfs.encoding; +import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.vfs.VirtualFile; @@ -78,9 +79,13 @@ public abstract class EncodingManager { public abstract Charset getDefaultCharsetForPropertiesFiles(@Nullable VirtualFile virtualFile); public abstract void setDefaultCharsetForPropertiesFiles(@Nullable VirtualFile virtualFile, @Nullable Charset charset); - public abstract void addPropertyChangeListener(PropertyChangeListener listener); + /** + * @deprecated use {@link EncodingManager#addPropertyChangeListener(java.beans.PropertyChangeListener, com.intellij.openapi.Disposable)} instead + */ + public abstract void addPropertyChangeListener(@NotNull PropertyChangeListener listener); + public abstract void addPropertyChangeListener(@NotNull PropertyChangeListener listener, @NotNull Disposable parentDisposable); - public abstract void removePropertyChangeListener(PropertyChangeListener listener); + public abstract void removePropertyChangeListener(@NotNull PropertyChangeListener listener); public abstract Charset getCachedCharsetFromContent(@NotNull Document document); } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChooseFileEncodingAction.java b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChooseFileEncodingAction.java index a808d4686fcf..e4a12e4c0fba 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChooseFileEncodingAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/ChooseFileEncodingAction.java @@ -60,7 +60,7 @@ public abstract class ChooseFileEncodingAction extends ComboBoxAction { boolean enabled = result.second; if (myVirtualFile != null) { - Charset charset = charsetFromContent(myVirtualFile); + Charset charset = cachedCharsetFromContent(myVirtualFile); String prefix = charset == null ? "" : "Encoding (auto-detected):"; if (charset == null) charset = myVirtualFile.getCharset(); e.getPresentation().setText(prefix + " " + charset.toString()); @@ -72,7 +72,7 @@ public abstract class ChooseFileEncodingAction extends ComboBoxAction { public static boolean isEnabled(@Nullable VirtualFile virtualFile) { boolean enabled = true; if (virtualFile != null) { - Charset charset = charsetFromContent(virtualFile); + Charset charset = cachedCharsetFromContent(virtualFile); if (charset != null) { enabled = false; } @@ -97,7 +97,7 @@ public abstract class ChooseFileEncodingAction extends ComboBoxAction { } @Nullable("returns null if charset set cannot be determined from content") - public static Charset charsetFromContent(final VirtualFile virtualFile) { + public static Charset cachedCharsetFromContent(final VirtualFile virtualFile) { if (virtualFile == null) return null; final Document document = FileDocumentManager.getInstance().getDocument(virtualFile); if (document == null) return null; @@ -126,7 +126,7 @@ public abstract class ChooseFileEncodingAction extends ComboBoxAction { public static Pair update(@Nullable VirtualFile virtualFile) { String pattern; boolean enabled = virtualFile != null && isEnabled(virtualFile); - Charset charsetFromContent = charsetFromContent(virtualFile); + Charset charsetFromContent = cachedCharsetFromContent(virtualFile); if (virtualFile != null && FileDocumentManager.getInstance().isFileModified(virtualFile)) { //no sense to reload file with UTF-detected chars using other encoding if (charsetFromContent != null) { diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java index 663f2e991f21..efe9acd263ff 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java @@ -38,6 +38,7 @@ import com.intellij.openapi.fileEditor.impl.LoadTextUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectLocator; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.CharsetToolkit; @@ -45,6 +46,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Alarm; import gnu.trove.THashSet; import org.jdom.Element; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -85,17 +87,18 @@ public class EncodingManagerImpl extends EncodingManager implements PersistentSt editorFactory.getEventMulticaster().addDocumentListener(new DocumentAdapter() { @Override public void documentChanged(DocumentEvent e) { - updateEncodingFromContent(e.getDocument()); + queueUpdateEncodingFromContent(e.getDocument()); } }, this); editorFactory.addEditorFactoryListener(new EditorFactoryAdapter() { @Override public void editorCreated(EditorFactoryEvent event) { - updateEncodingFromContent(event.getEditor().getDocument()); + queueUpdateEncodingFromContent(event.getEditor().getDocument()); } }, this); } + @NonNls public static final String PROP_CACHED_ENCODING_CHANGED = "cachedEncoding"; private boolean pollAndHandleDocument() { final Document document = myChangedDocuments.poll(); if (document == null) return false; @@ -106,7 +109,9 @@ public class EncodingManagerImpl extends EncodingManager implements PersistentSt Project project = guessProject(virtualFile); if (project != null && project.isDisposed()) return; Charset charset = LoadTextUtil.charsetFromContentOrNull(project, virtualFile, document.getText()); + Charset oldCached = getCachedCharsetFromContent(document); document.putUserData(CACHED_CHARSET_FROM_CONTENT, charset); + ((EncodingManagerImpl)EncodingManager.getInstance()).firePropertyChange(PROP_CACHED_ENCODING_CHANGED, oldCached, charset); } }); return true; @@ -123,7 +128,7 @@ public class EncodingManagerImpl extends EncodingManager implements PersistentSt } } - public void updateEncodingFromContent(@NotNull Document document) { + public void queueUpdateEncodingFromContent(@NotNull Document document) { myChangedDocuments.offer(document); addCacheEncodingAlarm(); } @@ -244,11 +249,22 @@ public class EncodingManagerImpl extends EncodingManager implements PersistentSt EncodingProjectManager.getInstance(project).setDefaultCharsetForPropertiesFiles(virtualFile, charset); } - public void addPropertyChangeListener(PropertyChangeListener listener){ + public void addPropertyChangeListener(@NotNull PropertyChangeListener listener){ myPropertyChangeSupport.addPropertyChangeListener(listener); } - public void removePropertyChangeListener(PropertyChangeListener listener){ + @Override + public void addPropertyChangeListener(@NotNull final PropertyChangeListener listener, @NotNull Disposable parentDisposable) { + myPropertyChangeSupport.addPropertyChangeListener(listener); + Disposer.register(parentDisposable, new Disposable() { + @Override + public void dispose() { + removePropertyChangeListener(listener); + } + }); + } + + public void removePropertyChangeListener(@NotNull PropertyChangeListener listener){ myPropertyChangeSupport.removePropertyChangeListener(listener); } void firePropertyChange(final String propertyName, final Object oldValue, final Object newValue) { diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingProjectManagerImpl.java index 5dc4fb3aa6d9..b11cbb42f2a4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingProjectManagerImpl.java @@ -23,6 +23,7 @@ package com.intellij.openapi.vfs.encoding; import com.intellij.ide.GeneralSettings; +import com.intellij.openapi.Disposable; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.openapi.components.StorageScheme; @@ -71,7 +72,7 @@ public class EncodingProjectManagerImpl extends EncodingProjectManager { documentManager.addListener(new PsiDocumentManager.Listener() { public void documentCreated(Document document, PsiFile psiFile) { if (document != null) { - ((EncodingManagerImpl)EncodingManager.getInstance()).updateEncodingFromContent(document); + ((EncodingManagerImpl)EncodingManager.getInstance()).queueUpdateEncodingFromContent(document); } } @@ -274,11 +275,16 @@ public class EncodingProjectManagerImpl extends EncodingProjectManager { } } - public void addPropertyChangeListener(PropertyChangeListener listener){ + public void addPropertyChangeListener(@NotNull PropertyChangeListener listener){ EncodingManager.getInstance().addPropertyChangeListener(listener); } - public void removePropertyChangeListener(PropertyChangeListener listener){ + @Override + public void addPropertyChangeListener(@NotNull PropertyChangeListener listener, @NotNull Disposable parentDisposable) { + EncodingManager.getInstance().addPropertyChangeListener(listener,parentDisposable); + } + + public void removePropertyChangeListener(@NotNull PropertyChangeListener listener){ EncodingManager.getInstance().removePropertyChangeListener(listener); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/EncodingPanel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/EncodingPanel.java index aa0d531af7ad..053397f5e6a2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/EncodingPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/EncodingPanel.java @@ -18,11 +18,6 @@ package com.intellij.openapi.wm.impl.status; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.impl.SimpleDataContext; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.editor.event.DocumentAdapter; -import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.FileEditorManagerEvent; import com.intellij.openapi.project.Project; @@ -34,11 +29,11 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.encoding.ChooseFileEncodingAction; import com.intellij.openapi.vfs.encoding.EncodingManager; +import com.intellij.openapi.vfs.encoding.EncodingManagerImpl; import com.intellij.openapi.wm.CustomStatusBarWidget; import com.intellij.openapi.wm.StatusBar; import com.intellij.openapi.wm.StatusBarWidget; import com.intellij.ui.awt.RelativePoint; -import com.intellij.util.Alarm; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -46,25 +41,24 @@ import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.nio.charset.Charset; /** * @author cdr */ public class EncodingPanel extends EditorBasedWidget implements StatusBarWidget.Multiframe, CustomStatusBarWidget { - private final Alarm myUpdateAlarm; private final TextPanel myComponent; private boolean actionEnabled; public EncodingPanel(@NotNull final Project project) { super(project); - myUpdateAlarm = new Alarm(this); myComponent = new TextPanel(getMaxValue()){ @Override protected void paintComponent(@NotNull final Graphics g) { super.paintComponent(g); - EncodingPanel.this.update(); if (actionEnabled) { setForeground(UIUtil.getActiveTextColor()); if (getText() != null) { @@ -85,6 +79,7 @@ public class EncodingPanel extends EditorBasedWidget implements StatusBarWidget. showPopup(e); } }); + myComponent.setBorder(WidgetBorder.INSTANCE); } @Override @@ -122,23 +117,14 @@ public class EncodingPanel extends EditorBasedWidget implements StatusBarWidget. public void install(@NotNull StatusBar statusBar) { super.install(statusBar); // should update to reflect encoding-from-content - EditorFactory.getInstance().getEventMulticaster().addDocumentListener(new DocumentAdapter() { + EncodingManager.getInstance().addPropertyChangeListener(new PropertyChangeListener() { @Override - public void documentChanged(DocumentEvent e) { - Editor editor = getEditor(); - if (editor == null) return; - Document current = editor.getDocument(); - if (e.getDocument() != current) return; - - myUpdateAlarm.cancelAllRequests(); - myUpdateAlarm.addRequest(new Runnable() { - @Override - public void run() { - update(); - } - }, 300); + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(EncodingManagerImpl.PROP_CACHED_ENCODING_CHANGED)) { + update(); + } } - },this); + }, this); } private void showPopup(MouseEvent e) { @@ -179,7 +165,7 @@ public class EncodingPanel extends EditorBasedWidget implements StatusBarWidget. String text; String toolTip; if (file != null) { - Charset charset = ChooseFileEncodingAction.charsetFromContent(file); + Charset charset = ChooseFileEncodingAction.cachedCharsetFromContent(file); if (charset == null) charset = file.getCharset(); text = charset.displayName(); diff --git a/plugins/properties/src/com/intellij/lang/properties/PropertiesFilesManager.java b/plugins/properties/src/com/intellij/lang/properties/PropertiesFilesManager.java index 886a3e3b61ff..41bf8e71296f 100644 --- a/plugins/properties/src/com/intellij/lang/properties/PropertiesFilesManager.java +++ b/plugins/properties/src/com/intellij/lang/properties/PropertiesFilesManager.java @@ -15,13 +15,11 @@ */ package com.intellij.lang.properties; -import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.encoding.EncodingManager; @@ -74,12 +72,7 @@ public class PropertiesFilesManager extends AbstractProjectComponent { } } }; - EncodingManager.getInstance().addPropertyChangeListener(myListener); - Disposer.register(myProject, new Disposable() { - public void dispose() { - EncodingManager.getInstance().removePropertyChangeListener(myListener); - } - }); + EncodingManager.getInstance().addPropertyChangeListener(myListener,myProject); } @NotNull