excessive encoding panel update, status bar border

This commit is contained in:
Alexey Kudravtsev
2011-01-19 16:54:27 +03:00
parent 4971921e85
commit 8590ec992a
9 changed files with 56 additions and 50 deletions
@@ -285,7 +285,7 @@ public class ColorAndFontDescriptionPanel extends JPanel {
return panel;
}
public void addActionListener(ActionListener actionListener) {
public void setActionListener(ActionListener actionListener) {
myActionListener = actionListener;
}
@@ -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();
}
@@ -56,7 +56,7 @@ public class FileTreeTable extends AbstractFileTreeTable<Charset> {
setText(t.displayName());
}
else if (file != null) {
Charset charset = ChooseFileEncodingAction.charsetFromContent(file);
Charset charset = ChooseFileEncodingAction.cachedCharsetFromContent(file);
if (charset != null) {
setText(charset.displayName());
}
@@ -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);
}
@@ -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<String,Boolean> 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) {
@@ -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) {
@@ -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);
}
@@ -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();
@@ -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