IDEA-129568 'Tab title limit' setting does not dither out when Tab Placement set...
[idea/community.git] / platform / lang-impl / src / com / intellij / application / options / editor / EditorTabsConfigurable.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.application.options.editor;
18
19 import com.intellij.ui.ListCellRendererWrapper;
20 import com.intellij.ide.ui.UISettings;
21 import com.intellij.openapi.application.ApplicationBundle;
22 import com.intellij.openapi.options.ConfigurationException;
23 import org.jetbrains.annotations.Nls;
24 import org.jetbrains.annotations.NotNull;
25
26 import javax.swing.*;
27 import java.awt.event.ItemEvent;
28 import java.awt.event.ItemListener;
29
30 /**
31  * @author yole
32  */
33 public class EditorTabsConfigurable implements EditorOptionsProvider {
34   private JPanel myRootPanel;
35   private JCheckBox myHideKnownExtensions;
36   private JCheckBox myScrollTabLayoutInEditorCheckBox;
37   private JTextField myEditorTabLimitField;
38   private JComboBox myEditorTabPlacement;
39   private JRadioButton myCloseNonModifiedFilesFirstRadio;
40   private JRadioButton myCloseLRUFilesRadio;
41   private JRadioButton myActivateLeftEditorOnCloseRadio;
42   private JRadioButton myActivateMRUEditorOnCloseRadio;
43   private JCheckBox myCbModifiedTabsMarkedWithAsterisk;
44   private JCheckBox myShowTabsTooltipsCheckBox;
45   private JCheckBox myShowCloseButtonOnCheckBox;
46   private JCheckBox myShowDirectoryInTabCheckBox;
47   private JRadioButton myActivateRightNeighbouringTabRadioButton;
48   private JTextField myTabTitleLimitField;
49   private JLabel myTabTitleLimitLabel;
50
51   public EditorTabsConfigurable() {
52     myEditorTabPlacement.setModel(new DefaultComboBoxModel(new Object[]{
53       SwingConstants.TOP,
54       SwingConstants.LEFT,
55       SwingConstants.BOTTOM,
56       SwingConstants.RIGHT,
57       UISettings.TABS_NONE,
58     }));
59     myEditorTabPlacement.setRenderer(new MyTabsPlacementComboBoxRenderer(myEditorTabPlacement.getRenderer()));
60     myEditorTabPlacement.addItemListener(new ItemListener() {
61       @Override
62       public void itemStateChanged(ItemEvent e) {
63         revalidateSingleRowCheckbox();
64       }
65     });
66
67     revalidateSingleRowCheckbox();
68   }
69
70   private void revalidateSingleRowCheckbox() {
71     final int i = ((Integer)myEditorTabPlacement.getSelectedItem()).intValue();
72
73     boolean none = i == UISettings.TABS_NONE;
74     myHideKnownExtensions.setEnabled(!none);
75     myScrollTabLayoutInEditorCheckBox.setEnabled(!none);
76     myCbModifiedTabsMarkedWithAsterisk.setEnabled(!none);
77     myShowTabsTooltipsCheckBox.setEnabled(!none);
78     myShowCloseButtonOnCheckBox.setEnabled(!none);
79     myShowDirectoryInTabCheckBox.setEnabled(!none);
80     myTabTitleLimitField.setEnabled(!none);
81     myTabTitleLimitLabel.setEnabled(!none);
82
83     if (SwingConstants.TOP == i) {
84       myScrollTabLayoutInEditorCheckBox.setEnabled(true);
85     } else {
86       myScrollTabLayoutInEditorCheckBox.setSelected(true);
87       myScrollTabLayoutInEditorCheckBox.setEnabled(false);
88     }
89   }
90
91   @Override
92   @Nls
93   public String getDisplayName() {
94     return "Editor Tabs";
95   }
96
97   @Override
98   public String getHelpTopic() {
99     return "reference.settingsdialog.IDE.editor.tabs";
100   }
101
102   @Override
103   public JComponent createComponent() {
104     return myRootPanel;
105   }
106
107   @Override
108   public void reset() {
109     UISettings uiSettings=UISettings.getInstance();
110
111     myCbModifiedTabsMarkedWithAsterisk.setSelected(uiSettings.MARK_MODIFIED_TABS_WITH_ASTERISK);
112     myShowTabsTooltipsCheckBox.setSelected(uiSettings.SHOW_TABS_TOOLTIPS);
113     myScrollTabLayoutInEditorCheckBox.setSelected(uiSettings.SCROLL_TAB_LAYOUT_IN_EDITOR);
114     myEditorTabPlacement.setSelectedItem(uiSettings.EDITOR_TAB_PLACEMENT);
115     myHideKnownExtensions.setSelected(uiSettings.HIDE_KNOWN_EXTENSION_IN_TABS);
116     myShowDirectoryInTabCheckBox.setSelected(uiSettings.SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES);
117     myEditorTabLimitField.setText(Integer.toString(uiSettings.EDITOR_TAB_LIMIT));
118     myTabTitleLimitField.setText(Integer.toString(uiSettings.EDITOR_TAB_TITLE_LIMIT));
119     myShowCloseButtonOnCheckBox.setSelected(uiSettings.SHOW_CLOSE_BUTTON);
120
121     if (uiSettings.CLOSE_NON_MODIFIED_FILES_FIRST) {
122       myCloseNonModifiedFilesFirstRadio.setSelected(true);
123     }
124     else {
125       myCloseLRUFilesRadio.setSelected(true);
126     }
127     if (uiSettings.ACTIVATE_MRU_EDITOR_ON_CLOSE) {
128       myActivateMRUEditorOnCloseRadio.setSelected(true);
129     }
130     else if (uiSettings.ACTIVATE_RIGHT_EDITOR_ON_CLOSE) {
131       myActivateRightNeighbouringTabRadioButton.setSelected(true);
132     }
133     else {
134       myActivateLeftEditorOnCloseRadio.setSelected(true);
135     }
136   }
137
138   @Override
139   public void apply() throws ConfigurationException {
140     UISettings uiSettings=UISettings.getInstance();
141
142     boolean uiSettingsChanged = uiSettings.MARK_MODIFIED_TABS_WITH_ASTERISK != myCbModifiedTabsMarkedWithAsterisk.isSelected();
143     uiSettings.MARK_MODIFIED_TABS_WITH_ASTERISK = myCbModifiedTabsMarkedWithAsterisk.isSelected();
144
145     if (isModified(myShowTabsTooltipsCheckBox, uiSettings.SHOW_TABS_TOOLTIPS)) uiSettingsChanged = true;
146     uiSettings.SHOW_TABS_TOOLTIPS = myShowTabsTooltipsCheckBox.isSelected();
147
148     if (isModified(myScrollTabLayoutInEditorCheckBox, uiSettings.SCROLL_TAB_LAYOUT_IN_EDITOR)) uiSettingsChanged = true;
149     uiSettings.SCROLL_TAB_LAYOUT_IN_EDITOR = myScrollTabLayoutInEditorCheckBox.isSelected();
150
151     if (isModified(myShowCloseButtonOnCheckBox, uiSettings.SHOW_CLOSE_BUTTON)) uiSettingsChanged = true;
152     uiSettings.SHOW_CLOSE_BUTTON = myShowCloseButtonOnCheckBox.isSelected();
153
154     final int tabPlacement = ((Integer)myEditorTabPlacement.getSelectedItem()).intValue();
155     if (uiSettings.EDITOR_TAB_PLACEMENT != tabPlacement) uiSettingsChanged = true;
156     uiSettings.EDITOR_TAB_PLACEMENT = tabPlacement;
157
158     boolean hide = myHideKnownExtensions.isSelected();
159     if (uiSettings.HIDE_KNOWN_EXTENSION_IN_TABS != hide) uiSettingsChanged = true;
160     uiSettings.HIDE_KNOWN_EXTENSION_IN_TABS = hide;
161
162     boolean dir = myShowDirectoryInTabCheckBox.isSelected();
163     if (uiSettings.SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES != hide) uiSettingsChanged = true;
164     uiSettings.SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES = myShowDirectoryInTabCheckBox.isSelected();
165
166     uiSettings.CLOSE_NON_MODIFIED_FILES_FIRST = myCloseNonModifiedFilesFirstRadio.isSelected();
167     uiSettings.ACTIVATE_MRU_EDITOR_ON_CLOSE = myActivateMRUEditorOnCloseRadio.isSelected();
168     uiSettings.ACTIVATE_RIGHT_EDITOR_ON_CLOSE = myActivateRightNeighbouringTabRadioButton.isSelected();
169
170     String temp = myEditorTabLimitField.getText();
171     if (temp.trim().length() > 0) {
172       try {
173         int newEditorTabLimit = Integer.parseInt(temp);
174         if (newEditorTabLimit > 0 && newEditorTabLimit != uiSettings.EDITOR_TAB_LIMIT) {
175           uiSettings.EDITOR_TAB_LIMIT = newEditorTabLimit;
176           uiSettingsChanged = true;
177         }
178       }
179       catch (NumberFormatException ignored) {
180       }
181     }
182     temp = myTabTitleLimitField.getText();
183     if (temp.trim().length() > 0) {
184       try {
185         int newTabTitleLimit = Integer.parseInt(temp);
186         newTabTitleLimit = Math.max(25, Math.min(100, newTabTitleLimit));
187         if (newTabTitleLimit != uiSettings.EDITOR_TAB_TITLE_LIMIT){
188           uiSettings.EDITOR_TAB_TITLE_LIMIT = newTabTitleLimit;
189           uiSettingsChanged = true;
190         }
191       }
192       catch (NumberFormatException ignored) {
193       }
194     }
195     if(uiSettingsChanged){
196       uiSettings.fireUISettingsChanged();
197     }
198   }
199
200   @Override
201   public boolean isModified() {
202     final UISettings uiSettings = UISettings.getInstance();
203     boolean isModified = isModified(myCbModifiedTabsMarkedWithAsterisk, uiSettings.MARK_MODIFIED_TABS_WITH_ASTERISK);
204     isModified |= isModified(myShowTabsTooltipsCheckBox, uiSettings.SHOW_TABS_TOOLTIPS);
205     isModified |= isModified(myEditorTabLimitField, uiSettings.EDITOR_TAB_LIMIT);
206     isModified |= isModified(myTabTitleLimitField, uiSettings.EDITOR_TAB_TITLE_LIMIT);
207     int tabPlacement = ((Integer)myEditorTabPlacement.getSelectedItem()).intValue();
208     isModified |= tabPlacement != uiSettings.EDITOR_TAB_PLACEMENT;
209     isModified |= myHideKnownExtensions.isSelected() != uiSettings.HIDE_KNOWN_EXTENSION_IN_TABS;
210     isModified |= myShowDirectoryInTabCheckBox.isSelected() != uiSettings.SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES;
211
212     isModified |= myScrollTabLayoutInEditorCheckBox.isSelected() != uiSettings.SCROLL_TAB_LAYOUT_IN_EDITOR;
213     isModified |= myShowCloseButtonOnCheckBox.isSelected() != uiSettings.SHOW_CLOSE_BUTTON;
214
215     isModified |= isModified(myCloseNonModifiedFilesFirstRadio, uiSettings.CLOSE_NON_MODIFIED_FILES_FIRST);
216     isModified |= isModified(myActivateMRUEditorOnCloseRadio, uiSettings.ACTIVATE_MRU_EDITOR_ON_CLOSE);
217     isModified |= isModified(myActivateRightNeighbouringTabRadioButton, uiSettings.ACTIVATE_RIGHT_EDITOR_ON_CLOSE);
218
219     return isModified;
220   }
221
222   @Override
223   public void disposeUIResources() {
224   }
225
226
227   private static boolean isModified(JToggleButton checkBox, boolean value) {
228     return checkBox.isSelected() != value;
229   }
230
231   private static boolean isModified(JTextField textField, int value) {
232     try {
233       int fieldValue = Integer.parseInt(textField.getText().trim());
234       return fieldValue != value;
235     }
236     catch(NumberFormatException e) {
237       return false;
238     }
239   }
240
241   private static final class MyTabsPlacementComboBoxRenderer extends ListCellRendererWrapper<Integer> {
242     public MyTabsPlacementComboBoxRenderer(final ListCellRenderer listCellRenderer) {
243       super();
244     }
245
246     @Override
247     public void customize(JList list, Integer value, int index, boolean selected, boolean hasFocus) {
248       int tabPlacement = value.intValue();
249       String text;
250       if (UISettings.TABS_NONE == tabPlacement) {
251         text = ApplicationBundle.message("combobox.tab.placement.none");
252       }
253       else if (SwingConstants.TOP == tabPlacement) {
254         text = ApplicationBundle.message("combobox.tab.placement.top");
255       }
256       else if (SwingConstants.LEFT == tabPlacement) {
257         text = ApplicationBundle.message("combobox.tab.placement.left");
258       }
259       else if (SwingConstants.BOTTOM == tabPlacement) {
260         text = ApplicationBundle.message("combobox.tab.placement.bottom");
261       }
262       else if (SwingConstants.RIGHT == tabPlacement) {
263         text = ApplicationBundle.message("combobox.tab.placement.right");
264       }
265       else {
266         throw new IllegalArgumentException("unknown tabPlacement: " + tabPlacement);
267       }
268       setText(text);
269     }
270   }
271
272   @Override
273   @NotNull
274   public String getId() {
275     return "editor.preferences.tabs";
276   }
277
278   @Override
279   public Runnable enableSearch(final String option) {
280     return null;
281   }
282 }