From 8d5426dc31e28fab44dcb98b09e1635991e41bf3 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 7 Dec 2012 15:17:30 +0400 Subject: [PATCH] IDEA-42567 Settings / File encoding / Default encoding for properties files combobox has GUI defects --- .../LossyEncodingInspection.java | 2 +- .../encoding/FileEncodingConfigurable.form | 67 ++++++++-------- .../encoding/FileEncodingConfigurable.java | 77 ++++++++++--------- .../encoding/ChooseFileEncodingAction.java | 15 ++-- .../openapi/wm/impl/status/EncodingPanel.java | 2 +- 5 files changed, 83 insertions(+), 80 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java b/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java index 38747fe3759f..c5c1349acbd7 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/LossyEncodingInspection.java @@ -199,7 +199,7 @@ public class LossyEncodingInspection extends LocalInspectionTool { } } }; - DefaultActionGroup group = action.createGroup(false); + DefaultActionGroup group = action.createGroup(null); DataContext dataContext = DataManager.getInstance().getDataContext(); JBPopupFactory.getInstance().createActionGroupPopup(null, group, dataContext, false, false, false, null, 30, null).showInBestPositionFor(dataContext); } diff --git a/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.form b/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.form index c8a0b127205a..bc395378367e 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.form +++ b/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.form @@ -1,9 +1,9 @@
- + - + @@ -11,14 +11,6 @@ - - - - - - - - @@ -29,21 +21,16 @@ - - - - - - - - - + - + - + + + + @@ -63,7 +50,7 @@ - + @@ -71,20 +58,14 @@ - + - + - - - - - - @@ -93,13 +74,33 @@ + + + + + + + + + + + + + + + + + - + - + - + + + +
diff --git a/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.java b/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.java index 99a4cf77dd5a..ba84c1e14244 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.java +++ b/platform/lang-impl/src/com/intellij/openapi/vfs/encoding/FileEncodingConfigurable.java @@ -18,6 +18,7 @@ package com.intellij.openapi.vfs.encoding; import com.intellij.ide.IdeBundle; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.options.Configurable; @@ -26,8 +27,8 @@ import com.intellij.openapi.options.OptionalConfigurable; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.table.JBTable; @@ -51,10 +52,12 @@ public class FileEncodingConfigurable implements SearchableConfigurable, Optiona private JCheckBox myAutodetectUTFEncodedFilesCheckBox; private JCheckBox myTransparentNativeToAsciiCheckBox; private JPanel myPropertiesFilesEncodingCombo; - private Charset mySelectedCharsetForPropertiesFiles; - private JComboBox myIdeEncodingsCombo; + private final Ref mySelectedCharsetForPropertiesFiles = new Ref(); + private final Ref mySelectedIdeCharset = new Ref(); private JLabel myTitleLabel; - private ChooseFileEncodingAction myAction; + private JPanel myIdeEncodingsListCombo; + private ChooseFileEncodingAction myPropertiesEncodingAction; + private ChooseFileEncodingAction myIdeEncodingAction; public FileEncodingConfigurable(Project project) { myProject = project; @@ -85,25 +88,38 @@ public class FileEncodingConfigurable implements SearchableConfigurable, Optiona return null; } - @Override - public JComponent createComponent() { - myAction = new ChooseFileEncodingAction(null) { + private static ChooseFileEncodingAction installChooseEncodingCombo(@NotNull JPanel parentPanel, @NotNull final Ref selected) { + ChooseFileEncodingAction myAction = new ChooseFileEncodingAction(null) { @Override public void update(final AnActionEvent e) { getTemplatePresentation().setEnabled(true); - getTemplatePresentation().setText(mySelectedCharsetForPropertiesFiles == null ? SYSTEM_DEFAULT : - mySelectedCharsetForPropertiesFiles.displayName()); + Charset charset = selected.get(); + getTemplatePresentation().setText(charset == null ? SYSTEM_DEFAULT : charset.displayName()); } @Override protected void chosen(final VirtualFile virtualFile, final Charset charset) { - mySelectedCharsetForPropertiesFiles = charset == NO_ENCODING ? null : charset; + selected.set(charset == NO_ENCODING ? null : charset); update((AnActionEvent)null); } + + @NotNull + @Override + protected DefaultActionGroup createPopupActionGroup(JComponent button) { + return createGroup(""); + } }; - myPropertiesFilesEncodingCombo.removeAll(); + parentPanel.removeAll(); Presentation templatePresentation = myAction.getTemplatePresentation(); - myPropertiesFilesEncodingCombo.add(myAction.createCustomComponent(templatePresentation), BorderLayout.CENTER); + parentPanel.add(myAction.createCustomComponent(templatePresentation), BorderLayout.CENTER); + myAction.update((AnActionEvent)null); + return myAction; + } + + @Override + public JComponent createComponent() { + myPropertiesEncodingAction = installChooseEncodingCombo(myPropertiesFilesEncodingCombo, mySelectedCharsetForPropertiesFiles); + myIdeEncodingAction = installChooseEncodingCombo(myIdeEncodingsListCombo, mySelectedIdeCharset); myTreeView = new FileTreeTable(myProject); myTreePanel.setViewportView(myTreeView); myTreeView.getEmptyText().setText(IdeBundle.message("file.encodings.not.configured")); @@ -118,7 +134,7 @@ public class FileEncodingConfigurable implements SearchableConfigurable, Optiona Map editing = myTreeView.getValues(); Map mapping = EncodingProjectManager.getInstance(myProject).getAllMappings(); boolean same = editing.equals(mapping) - && Comparing.equal(encodingManager.getDefaultCharsetForPropertiesFiles(null), mySelectedCharsetForPropertiesFiles) + && Comparing.equal(encodingManager.getDefaultCharsetForPropertiesFiles(null), mySelectedCharsetForPropertiesFiles.get()) && encodingManager.isUseUTFGuessing(null) == myAutodetectUTFEncodedFilesCheckBox.isSelected() && encodingManager.isNative2AsciiForPropertiesFiles() == myTransparentNativeToAsciiCheckBox.isSelected() ; @@ -126,12 +142,12 @@ public class FileEncodingConfigurable implements SearchableConfigurable, Optiona } public boolean isEncodingModified() { - final Object item = myIdeEncodingsCombo.getSelectedItem(); - if (SYSTEM_DEFAULT.equals(item)) { + Charset charset = mySelectedIdeCharset.get(); + if (null == charset) { return !StringUtil.isEmpty(EncodingManager.getInstance().getDefaultCharsetName()); } - return !Comparing.equal(item, EncodingManager.getInstance().getDefaultCharset()); + return !Comparing.equal(charset, EncodingManager.getInstance().getDefaultCharset()); } @Override @@ -139,17 +155,12 @@ public class FileEncodingConfigurable implements SearchableConfigurable, Optiona Map result = myTreeView.getValues(); EncodingProjectManager encodingManager = EncodingProjectManager.getInstance(myProject); encodingManager.setMapping(result); - encodingManager.setDefaultCharsetForPropertiesFiles(null, mySelectedCharsetForPropertiesFiles); + encodingManager.setDefaultCharsetForPropertiesFiles(null, mySelectedCharsetForPropertiesFiles.get()); encodingManager.setNative2AsciiForPropertiesFiles(null, myTransparentNativeToAsciiCheckBox.isSelected()); encodingManager.setUseUTFGuessing(null, myAutodetectUTFEncodedFilesCheckBox.isSelected()); - final Object item = myIdeEncodingsCombo.getSelectedItem(); - if (SYSTEM_DEFAULT.equals(item)) { - EncodingManager.getInstance().setDefaultCharsetName(""); - } - else if (item != null) { - EncodingManager.getInstance().setDefaultCharsetName(((Charset)item).name()); - } + Charset charset = mySelectedIdeCharset.get(); + EncodingManager.getInstance().setDefaultCharsetName(charset == null ? "" : charset.name()); } @Override @@ -158,25 +169,15 @@ public class FileEncodingConfigurable implements SearchableConfigurable, Optiona myTreeView.reset(encodingManager.getAllMappings()); myAutodetectUTFEncodedFilesCheckBox.setSelected(encodingManager.isUseUTFGuessing(null)); myTransparentNativeToAsciiCheckBox.setSelected(encodingManager.isNative2AsciiForPropertiesFiles()); - mySelectedCharsetForPropertiesFiles = encodingManager.getDefaultCharsetForPropertiesFiles(null); - myAction.update((AnActionEvent)null); + mySelectedCharsetForPropertiesFiles.set(encodingManager.getDefaultCharsetForPropertiesFiles(null)); - final DefaultComboBoxModel encodingsModel = new DefaultComboBoxModel(CharsetToolkit.getAvailableCharsets()); - encodingsModel.insertElementAt(SYSTEM_DEFAULT, 0); - myIdeEncodingsCombo.setModel(encodingsModel); - - final String name = EncodingManager.getInstance().getDefaultCharsetName(); - if (StringUtil.isEmpty(name)) { - myIdeEncodingsCombo.setSelectedItem(SYSTEM_DEFAULT); - } - else { - myIdeEncodingsCombo.setSelectedItem(EncodingManager.getInstance().getDefaultCharset()); - } + mySelectedIdeCharset.set(EncodingManager.getInstance().getDefaultCharset()); + myPropertiesEncodingAction.update((AnActionEvent)null); + myIdeEncodingAction.update((AnActionEvent)null); } @Override public void disposeUIResources() { - myAction = null; } public void selectFile(@NotNull VirtualFile virtualFile) { 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 11209843fc1a..eced2dfd7500 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 @@ -112,7 +112,7 @@ public abstract class ChooseFileEncodingAction extends ComboBoxAction { @Override @NotNull protected DefaultActionGroup createPopupActionGroup(final JComponent button) { - return createGroup(true); + return createGroup(""); } private void fillCharsetActions(DefaultActionGroup group, final VirtualFile virtualFile, List charsets) { @@ -174,8 +174,8 @@ public abstract class ChooseFileEncodingAction extends ComboBoxAction { private class ClearThisFileEncodingAction extends AnAction { private final VirtualFile myFile; - private ClearThisFileEncodingAction(@Nullable VirtualFile file) { - super("", "Clear " + + private ClearThisFileEncodingAction(@Nullable VirtualFile file, @NotNull String clearItemText) { + super(clearItemText, "Clear " + (file == null ? "default" : "file '"+file.getName()+"'") + " encoding.", null); myFile = file; @@ -205,17 +205,18 @@ public abstract class ChooseFileEncodingAction extends ComboBoxAction { }; protected abstract void chosen(VirtualFile virtualFile, Charset charset); - public DefaultActionGroup createGroup(boolean showClear) { + @NotNull + public DefaultActionGroup createGroup(@Nullable String clearItemText) { DefaultActionGroup group = new DefaultActionGroup(); List favorites = new ArrayList(EncodingManager.getInstance().getFavorites()); Collections.sort(favorites); Charset current = myVirtualFile == null ? null : myVirtualFile.getCharset(); favorites.remove(current); - if (showClear) { - group.add(new ClearThisFileEncodingAction(myVirtualFile)); + if (clearItemText != null) { + group.add(new ClearThisFileEncodingAction(myVirtualFile, clearItemText)); } - if (favorites.isEmpty() && !showClear) { + if (favorites.isEmpty() && clearItemText == null) { fillCharsetActions(group, myVirtualFile, Arrays.asList(CharsetToolkit.getAvailableCharsets())); } else { 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 c6fa0d095dc6..ac8997c4fd1b 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 @@ -185,7 +185,7 @@ public class EncodingPanel extends EditorBasedWidget implements StatusBarWidget. EncodingPanel.this.update(); } } - }.createGroup(false); + }.createGroup(null); return JBPopupFactory.getInstance().createActionGroupPopup(null, group, dataContext, false, false, false, null, 30, null); }