2 * Copyright 2000-2014 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.intellij.application.options.editor;
19 import com.intellij.application.options.OptionId;
20 import com.intellij.application.options.OptionsApplicabilityFilter;
21 import com.intellij.codeInsight.CodeInsightSettings;
22 import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
23 import com.intellij.codeInsight.daemon.impl.IdentifierHighlighterPass;
24 import com.intellij.codeInsight.documentation.QuickDocOnMouseOverManager;
25 import com.intellij.ide.ui.UISettings;
26 import com.intellij.openapi.application.ApplicationBundle;
27 import com.intellij.openapi.components.ServiceManager;
28 import com.intellij.openapi.editor.Document;
29 import com.intellij.openapi.editor.Editor;
30 import com.intellij.openapi.editor.EditorFactory;
31 import com.intellij.openapi.editor.colors.EditorColorsManager;
32 import com.intellij.openapi.editor.colors.EditorColorsScheme;
33 import com.intellij.openapi.editor.ex.EditorEx;
34 import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
35 import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces;
36 import com.intellij.openapi.editor.richcopy.settings.RichCopySettings;
37 import com.intellij.openapi.fileEditor.FileEditor;
38 import com.intellij.openapi.fileEditor.FileEditorManager;
39 import com.intellij.openapi.fileEditor.TextEditor;
40 import com.intellij.openapi.options.ConfigurationException;
41 import com.intellij.openapi.options.SearchableConfigurable;
42 import com.intellij.openapi.project.Project;
43 import com.intellij.openapi.project.ProjectManager;
44 import com.intellij.openapi.util.Comparing;
45 import com.intellij.openapi.util.SystemInfo;
46 import com.intellij.openapi.util.text.StringUtil;
47 import com.intellij.openapi.vcs.VcsApplicationSettings;
48 import com.intellij.openapi.vcs.impl.LineStatusTrackerManager;
49 import com.intellij.ui.ListCellRendererWrapper;
50 import com.intellij.ui.components.JBCheckBox;
51 import com.intellij.ui.components.JBLabel;
52 import com.intellij.xml.util.XmlStringUtil;
53 import org.jetbrains.annotations.NotNull;
54 import org.jetbrains.annotations.Nullable;
58 import java.awt.event.ActionEvent;
59 import java.awt.event.ActionListener;
60 import java.awt.event.ItemEvent;
61 import java.awt.event.ItemListener;
63 public class EditorOptionsPanel {
64 private JPanel myBehaviourPanel;
65 private JCheckBox myCbHighlightBraces;
66 private static final String STRIP_CHANGED = ApplicationBundle.message("combobox.strip.modified.lines");
68 private static final String STRIP_ALL = ApplicationBundle.message("combobox.strip.all");
69 private static final String STRIP_NONE = ApplicationBundle.message("combobox.strip.none");
70 private JComboBox myStripTrailingSpacesCombo;
72 private JCheckBox myCbVirtualSpace;
73 private JCheckBox myCbCaretInsideTabs;
75 private JTextField myRecentFilesLimitField;
76 private JTextField myCommandsHistoryLimitField;
78 private JCheckBox myCbHighlightScope;
80 private JTextField myClipboardContentLimitTextField;
81 private JCheckBox myCbSmoothScrolling;
82 private JCheckBox myCbVirtualPageAtBottom;
83 private JCheckBox myCbEnableDnD;
84 private JCheckBox myCbEnableWheelFontChange;
85 private JCheckBox myCbHonorCamelHumpsWhenSelectingByClicking;
87 private JPanel myHighlightSettingsPanel;
88 private JRadioButton myRbPreferScrolling;
89 private JRadioButton myRbPreferMovingCaret;
90 private JCheckBox myCbRenameLocalVariablesInplace;
91 private JCheckBox myCbHighlightIdentifierUnderCaret;
92 private JCheckBox myCbEnsureBlankLineBeforeCheckBox;
93 private JCheckBox myShowNotificationAfterReformatCodeCheckBox;
94 private JCheckBox myShowNotificationAfterOptimizeImportsCheckBox;
95 private JCheckBox myCbUseSoftWrapsAtEditor;
96 private JCheckBox myCbUseSoftWrapsAtConsole;
97 private JCheckBox myCbUseCustomSoftWrapIndent;
98 private JTextField myCustomSoftWrapIndent;
99 private JLabel myCustomSoftWrapIndentLabel;
100 private JCheckBox myCbShowSoftWrapsOnlyOnCaretLine;
101 private JCheckBox myPreselectCheckBox;
102 private JBCheckBox myCbShowQuickDocOnMouseMove;
103 private JBLabel myQuickDocDelayLabel;
104 private JTextField myQuickDocDelayTextField;
105 private JComboBox myRichCopyColorSchemeComboBox;
106 private JCheckBox myShowInlineDialogForCheckBox;
107 private JBLabel myStripTrailingSpacesExplanationLabel;
108 private JCheckBox myCbEnableRichCopyByDefault;
109 private JCheckBox myShowWhitespacesModificationsInLSTGutterCheckBox;
111 private static final String ACTIVE_COLOR_SCHEME = ApplicationBundle.message("combobox.richcopy.color.scheme.active");
113 private final ErrorHighlightingPanel myErrorHighlightingPanel = new ErrorHighlightingPanel();
114 private final MyConfigurable myConfigurable;
117 public EditorOptionsPanel() {
118 if (SystemInfo.isMac) {
119 myCbEnableWheelFontChange.setText(ApplicationBundle.message("checkbox.enable.ctrl.mousewheel.changes.font.size.macos"));
123 myStripTrailingSpacesCombo.addItem(STRIP_CHANGED);
124 myStripTrailingSpacesCombo.addItem(STRIP_ALL);
125 myStripTrailingSpacesCombo.addItem(STRIP_NONE);
126 ActionListener explainer = new ActionListener() {
128 public void actionPerformed(ActionEvent e) {
129 explainTrailingSpaces(getStripTrailingSpacesValue());
132 myStripTrailingSpacesCombo.addActionListener(explainer);
133 myCbVirtualSpace.addActionListener(explainer);
137 myHighlightSettingsPanel.setLayout(new BorderLayout());
138 myHighlightSettingsPanel.add(myErrorHighlightingPanel.getPanel(), BorderLayout.CENTER);
141 myCbRenameLocalVariablesInplace.setVisible(OptionsApplicabilityFilter.isApplicable(OptionId.RENAME_IN_PLACE));
143 myRichCopyColorSchemeComboBox.setRenderer(new ListCellRendererWrapper<String>() {
145 public void customize(JList list, String value, int index, boolean selected, boolean hasFocus) {
146 final String textToUse;
147 if (RichCopySettings.ACTIVE_GLOBAL_SCHEME_MARKER.equals(value)) {
148 textToUse = ACTIVE_COLOR_SCHEME;
157 myConfigurable = new MyConfigurable();
158 initQuickDocProcessing();
159 initSoftWrapsSettingsProcessing();
163 public void reset() {
164 EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance();
165 CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance();
166 UISettings uiSettings = UISettings.getInstance();
167 VcsApplicationSettings vcsSettings = VcsApplicationSettings.getInstance();
172 myCbSmoothScrolling.setSelected(editorSettings.isSmoothScrolling());
174 // Brace highlighting
176 myCbHighlightBraces.setSelected(codeInsightSettings.HIGHLIGHT_BRACES);
177 myCbHighlightScope.setSelected(codeInsightSettings.HIGHLIGHT_SCOPE);
178 myCbHighlightIdentifierUnderCaret.setSelected(codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET);
182 myCbUseSoftWrapsAtEditor.setSelected(editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR));
183 myCbUseSoftWrapsAtConsole.setSelected(editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.CONSOLE));
184 myCbUseCustomSoftWrapIndent.setSelected(editorSettings.isUseCustomSoftWrapIndent());
185 myCustomSoftWrapIndent.setText(Integer.toString(editorSettings.getCustomSoftWrapIndent()));
186 myCbShowSoftWrapsOnlyOnCaretLine.setSelected(!editorSettings.isAllSoftWrapsShown());
187 updateSoftWrapSettingsRepresentation();
189 myCbVirtualSpace.setSelected(editorSettings.isVirtualSpace());
190 myCbCaretInsideTabs.setSelected(editorSettings.isCaretInsideTabs());
191 myCbVirtualPageAtBottom.setSelected(editorSettings.isAdditionalPageAtBottom());
194 myClipboardContentLimitTextField.setText(Integer.toString(uiSettings.MAX_CLIPBOARD_CONTENTS));
196 // Strip trailing spaces on save
198 String stripTrailingSpaces = editorSettings.getStripTrailingSpaces();
199 if(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE.equals(stripTrailingSpaces)) {
200 myStripTrailingSpacesCombo.setSelectedItem(STRIP_NONE);
202 else if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED.equals(stripTrailingSpaces)) {
203 myStripTrailingSpacesCombo.setSelectedItem(STRIP_CHANGED);
205 else if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE.equals(stripTrailingSpaces)) {
206 myStripTrailingSpacesCombo.setSelectedItem(STRIP_ALL);
208 explainTrailingSpaces(stripTrailingSpaces);
210 myCbEnsureBlankLineBeforeCheckBox.setSelected(editorSettings.isEnsureNewLineAtEOF());
211 myCbShowQuickDocOnMouseMove.setSelected(editorSettings.isShowQuickDocOnMouseOverElement());
212 myQuickDocDelayTextField.setText(Long.toString(editorSettings.getQuickDocOnMouseOverElementDelayMillis()));
213 myQuickDocDelayTextField.setEnabled(editorSettings.isShowQuickDocOnMouseOverElement());
214 myQuickDocDelayLabel.setEnabled(editorSettings.isShowQuickDocOnMouseOverElement());
217 myCbEnableDnD.setSelected(editorSettings.isDndEnabled());
218 myCbEnableWheelFontChange.setSelected(editorSettings.isWheelFontChangeEnabled());
219 myCbHonorCamelHumpsWhenSelectingByClicking.setSelected(editorSettings.isMouseClickSelectionHonorsCamelWords());
221 myRbPreferMovingCaret.setSelected(editorSettings.isRefrainFromScrolling());
222 myRbPreferScrolling.setSelected(!editorSettings.isRefrainFromScrolling());
225 myRecentFilesLimitField.setText(Integer.toString(uiSettings.RECENT_FILES_LIMIT));
226 myCommandsHistoryLimitField.setText(Integer.toString(uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT));
228 myCbRenameLocalVariablesInplace.setSelected(editorSettings.isVariableInplaceRenameEnabled());
229 myPreselectCheckBox.setSelected(editorSettings.isPreselectRename());
230 myShowInlineDialogForCheckBox.setSelected(editorSettings.isShowInlineLocalDialog());
232 myShowNotificationAfterReformatCodeCheckBox.setSelected(editorSettings.getOptions().SHOW_NOTIFICATION_AFTER_REFORMAT_CODE_ACTION);
233 myShowNotificationAfterOptimizeImportsCheckBox.setSelected(editorSettings.getOptions().SHOW_NOTIFICATION_AFTER_OPTIMIZE_IMPORTS_ACTION);
235 myShowWhitespacesModificationsInLSTGutterCheckBox.setSelected(vcsSettings.SHOW_WHITESPACES_IN_LST);
237 myErrorHighlightingPanel.reset();
239 RichCopySettings settings = RichCopySettings.getInstance();
240 myCbEnableRichCopyByDefault.setSelected(settings.isEnabled());
241 myRichCopyColorSchemeComboBox.removeAllItems();
242 EditorColorsScheme[] schemes = EditorColorsManager.getInstance().getAllSchemes();
243 myRichCopyColorSchemeComboBox.addItem(RichCopySettings.ACTIVE_GLOBAL_SCHEME_MARKER);
244 for (EditorColorsScheme scheme : schemes) {
245 myRichCopyColorSchemeComboBox.addItem(scheme.getName());
247 String toSelect = settings.getSchemeName();
248 if (!StringUtil.isEmpty(toSelect)) {
249 myRichCopyColorSchemeComboBox.setSelectedItem(toSelect);
253 private void explainTrailingSpaces(@NotNull @EditorSettingsExternalizable.StripTrailingSpaces String stripTrailingSpaces) {
254 if(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE.equals(stripTrailingSpaces)) {
255 myStripTrailingSpacesExplanationLabel.setVisible(false);
258 myStripTrailingSpacesExplanationLabel.setVisible(true);
259 boolean isVirtualSpace = myCbVirtualSpace.isSelected();
261 String virtSpaceText = myCbVirtualSpace.getText();
262 if (isVirtualSpace) {
263 text = "Trailing spaces will be trimmed even in the line under caret.<br>To disable trimming in that line uncheck the '<b>"+virtSpaceText+"</b>' above.";
266 text = "Trailing spaces will <b><font color=red>NOT</font></b> be trimmed in the line under caret.<br>To enable trimming in that line too check the '<b>"+virtSpaceText+"</b>' above.";
268 myStripTrailingSpacesExplanationLabel.setText(XmlStringUtil.wrapInHtml(text));
271 public void apply() throws ConfigurationException {
272 EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance();
273 CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance();
274 UISettings uiSettings=UISettings.getInstance();
275 VcsApplicationSettings vcsSettings = VcsApplicationSettings.getInstance();
279 editorSettings.setSmoothScrolling(myCbSmoothScrolling.isSelected());
282 // Brace Highlighting
284 codeInsightSettings.HIGHLIGHT_BRACES = myCbHighlightBraces.isSelected();
285 codeInsightSettings.HIGHLIGHT_SCOPE = myCbHighlightScope.isSelected();
286 codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET = myCbHighlightIdentifierUnderCaret.isSelected();
287 clearAllIdentifierHighlighters();
291 editorSettings.setUseSoftWraps(myCbUseSoftWrapsAtEditor.isSelected(), SoftWrapAppliancePlaces.MAIN_EDITOR);
292 editorSettings.setUseSoftWraps(myCbUseSoftWrapsAtConsole.isSelected(), SoftWrapAppliancePlaces.CONSOLE);
293 editorSettings.setUseCustomSoftWrapIndent(myCbUseCustomSoftWrapIndent.isSelected());
294 editorSettings.setCustomSoftWrapIndent(getCustomSoftWrapIndent());
295 editorSettings.setAllSoftwrapsShown(!myCbShowSoftWrapsOnlyOnCaretLine.isSelected());
296 editorSettings.setVirtualSpace(myCbVirtualSpace.isSelected());
297 editorSettings.setCaretInsideTabs(myCbCaretInsideTabs.isSelected());
298 editorSettings.setAdditionalPageAtBottom(myCbVirtualPageAtBottom.isSelected());
304 boolean uiSettingsChanged = false;
305 int maxClipboardContents = getMaxClipboardContents();
306 if (uiSettings.MAX_CLIPBOARD_CONTENTS != maxClipboardContents) {
307 uiSettings.MAX_CLIPBOARD_CONTENTS = maxClipboardContents;
308 uiSettingsChanged = true;
311 if(uiSettingsChanged){
312 uiSettings.fireUISettingsChanged();
315 // Strip trailing spaces on save
317 if(STRIP_NONE.equals(myStripTrailingSpacesCombo.getSelectedItem())) {
318 editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE);
320 else if(STRIP_CHANGED.equals(myStripTrailingSpacesCombo.getSelectedItem())){
321 editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED);
324 editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE);
327 editorSettings.setEnsureNewLineAtEOF(myCbEnsureBlankLineBeforeCheckBox.isSelected());
329 if (myCbShowQuickDocOnMouseMove.isSelected() ^ editorSettings.isShowQuickDocOnMouseOverElement()) {
330 boolean enabled = myCbShowQuickDocOnMouseMove.isSelected();
331 editorSettings.setShowQuickDocOnMouseOverElement(enabled);
332 ServiceManager.getService(QuickDocOnMouseOverManager.class).setEnabled(enabled);
335 Long quickDocDelay = getQuickDocDelayFromGui();
336 if (quickDocDelay != null) {
337 editorSettings.setQuickDocOnMouseOverElementDelayMillis(quickDocDelay);
340 editorSettings.setDndEnabled(myCbEnableDnD.isSelected());
342 editorSettings.setWheelFontChangeEnabled(myCbEnableWheelFontChange.isSelected());
343 editorSettings.setMouseClickSelectionHonorsCamelWords(myCbHonorCamelHumpsWhenSelectingByClicking.isSelected());
344 editorSettings.setRefrainFromScrolling(myRbPreferMovingCaret.isSelected());
346 editorSettings.setVariableInplaceRenameEnabled(myCbRenameLocalVariablesInplace.isSelected());
347 editorSettings.setPreselectRename(myPreselectCheckBox.isSelected());
348 editorSettings.setShowInlineLocalDialog(myShowInlineDialogForCheckBox.isSelected());
350 editorSettings.getOptions().SHOW_NOTIFICATION_AFTER_REFORMAT_CODE_ACTION = myShowNotificationAfterReformatCodeCheckBox.isSelected();
351 editorSettings.getOptions().SHOW_NOTIFICATION_AFTER_OPTIMIZE_IMPORTS_ACTION = myShowNotificationAfterOptimizeImportsCheckBox.isSelected();
353 if (vcsSettings.SHOW_WHITESPACES_IN_LST != myShowWhitespacesModificationsInLSTGutterCheckBox.isSelected()) {
354 vcsSettings.SHOW_WHITESPACES_IN_LST = myShowWhitespacesModificationsInLSTGutterCheckBox.isSelected();
355 Project[] projects = ProjectManager.getInstance().getOpenProjects();
356 for (Project project : projects) {
357 LineStatusTrackerManager.getInstance(project).updateSettings();
363 String temp=myRecentFilesLimitField.getText();
364 if(temp.trim().length() > 0){
366 int newRecentFilesLimit= Integer.parseInt(temp);
367 if(newRecentFilesLimit>0&&uiSettings.RECENT_FILES_LIMIT!=newRecentFilesLimit){
368 uiSettings.RECENT_FILES_LIMIT=newRecentFilesLimit;
369 uiSettingsChanged = true;
371 }catch (NumberFormatException ignored){}
373 if(uiSettingsChanged){
374 uiSettings.fireUISettingsChanged();
376 uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT = StringUtil.parseInt(myCommandsHistoryLimitField.getText(), uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT);
378 myErrorHighlightingPanel.apply();
380 RichCopySettings settings = RichCopySettings.getInstance();
381 settings.setEnabled(myCbEnableRichCopyByDefault.isSelected());
382 Object item = myRichCopyColorSchemeComboBox.getSelectedItem();
383 if (item instanceof String) {
384 settings.setSchemeName(item.toString());
391 private Long getQuickDocDelayFromGui() {
392 String quickDocDelayAsText = myQuickDocDelayTextField.getText();
393 if (StringUtil.isEmptyOrSpaces(quickDocDelayAsText)) {
398 long delay = Long.parseLong(quickDocDelayAsText);
399 return delay > 0 ? delay : null;
401 catch (NumberFormatException e) {
402 // Ignore incorrect value.
407 public static void restartDaemons() {
408 Project[] projects = ProjectManager.getInstance().getOpenProjects();
409 for (Project project : projects) {
410 DaemonCodeAnalyzer.getInstance(project).settingsChanged();
414 private static void clearAllIdentifierHighlighters() {
415 for (Project project : ProjectManager.getInstance().getOpenProjects()) {
416 for (FileEditor fileEditor : FileEditorManager.getInstance(project).getAllEditors()) {
417 if (fileEditor instanceof TextEditor) {
418 Document document = ((TextEditor)fileEditor).getEditor().getDocument();
419 IdentifierHighlighterPass.clearMyHighlights(document, project);
425 public static void reinitAllEditors() {
426 Editor[] editors = EditorFactory.getInstance().getAllEditors();
427 for (Editor editor : editors) {
428 ((EditorEx)editor).reinitSettings();
432 public void disposeUIResources() {
433 myErrorHighlightingPanel.disposeUIResources();
436 private int getMaxClipboardContents(){
437 int maxClipboardContents = -1;
439 maxClipboardContents = Integer.parseInt(myClipboardContentLimitTextField.getText());
440 } catch (NumberFormatException ignored) {}
441 if (maxClipboardContents <= 0) {
442 maxClipboardContents = 1;
444 return maxClipboardContents;
447 public boolean isModified() {
448 EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance();
449 CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance();
450 UISettings uiSettings=UISettings.getInstance();
451 VcsApplicationSettings vcsSettings = VcsApplicationSettings.getInstance();
454 boolean isModified = isModified(myCbSmoothScrolling, editorSettings.isSmoothScrolling());
456 // Brace highlighting
457 isModified |= isModified(myCbHighlightBraces, codeInsightSettings.HIGHLIGHT_BRACES);
458 isModified |= isModified(myCbHighlightScope, codeInsightSettings.HIGHLIGHT_SCOPE);
459 isModified |= isModified(myCbHighlightIdentifierUnderCaret, codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET);
462 isModified |= isModified(myCbUseSoftWrapsAtEditor, editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR));
463 isModified |= isModified(myCbUseSoftWrapsAtConsole, editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.CONSOLE));
464 isModified |= isModified(myCbUseCustomSoftWrapIndent, editorSettings.isUseCustomSoftWrapIndent());
465 isModified |= editorSettings.getCustomSoftWrapIndent() != getCustomSoftWrapIndent();
466 isModified |= isModified(myCbShowSoftWrapsOnlyOnCaretLine, !editorSettings.isAllSoftWrapsShown());
467 isModified |= isModified(myCbVirtualSpace, editorSettings.isVirtualSpace());
468 isModified |= isModified(myCbCaretInsideTabs, editorSettings.isCaretInsideTabs());
469 isModified |= isModified(myCbVirtualPageAtBottom, editorSettings.isAdditionalPageAtBottom());
474 isModified |= getMaxClipboardContents() != uiSettings.MAX_CLIPBOARD_CONTENTS;
478 // Strip trailing spaces, ensure EOL on EOF on save
479 isModified |= !getStripTrailingSpacesValue().equals(editorSettings.getStripTrailingSpaces());
480 isModified |= isModified(myCbEnsureBlankLineBeforeCheckBox, editorSettings.isEnsureNewLineAtEOF());
482 isModified |= isModified(myCbShowQuickDocOnMouseMove, editorSettings.isShowQuickDocOnMouseOverElement());
483 Long quickDocDelay = getQuickDocDelayFromGui();
484 if (quickDocDelay != null && !quickDocDelay.equals(Long.valueOf(editorSettings.getQuickDocOnMouseOverElementDelayMillis()))) {
489 isModified |= isModified(myCbEnableDnD, editorSettings.isDndEnabled());
490 isModified |= isModified(myCbEnableWheelFontChange, editorSettings.isWheelFontChangeEnabled());
491 isModified |= isModified(myCbHonorCamelHumpsWhenSelectingByClicking, editorSettings.isMouseClickSelectionHonorsCamelWords());
493 isModified |= myRbPreferMovingCaret.isSelected() != editorSettings.isRefrainFromScrolling();
496 isModified |= isModified(myRecentFilesLimitField, UISettings.getInstance().RECENT_FILES_LIMIT);
497 isModified |= isModified(myCommandsHistoryLimitField, UISettings.getInstance().CONSOLE_COMMAND_HISTORY_LIMIT);
498 isModified |= isModified(myCbRenameLocalVariablesInplace, editorSettings.isVariableInplaceRenameEnabled());
499 isModified |= isModified(myPreselectCheckBox, editorSettings.isPreselectRename());
500 isModified |= isModified(myShowInlineDialogForCheckBox, editorSettings.isShowInlineLocalDialog());
502 isModified |= isModified(myShowNotificationAfterReformatCodeCheckBox, editorSettings.getOptions().SHOW_NOTIFICATION_AFTER_REFORMAT_CODE_ACTION);
503 isModified |= isModified(myShowNotificationAfterOptimizeImportsCheckBox, editorSettings.getOptions().SHOW_NOTIFICATION_AFTER_OPTIMIZE_IMPORTS_ACTION);
505 isModified |= isModified(myShowWhitespacesModificationsInLSTGutterCheckBox, vcsSettings.SHOW_WHITESPACES_IN_LST);
507 isModified |= myErrorHighlightingPanel.isModified();
509 RichCopySettings settings = RichCopySettings.getInstance();
510 isModified |= isModified(myCbEnableRichCopyByDefault, settings.isEnabled());
511 isModified |= !Comparing.equal(settings.getSchemeName(), myRichCopyColorSchemeComboBox.getSelectedItem());
516 private static boolean isModified(JToggleButton checkBox, boolean value) {
517 return checkBox.isSelected() != value;
520 private static boolean isModified(JTextField textField, int value) {
522 int fieldValue = Integer.parseInt(textField.getText().trim());
523 return fieldValue != value;
525 catch(NumberFormatException e) {
531 @EditorSettingsExternalizable.StripTrailingSpaces
532 private String getStripTrailingSpacesValue() {
533 Object selectedItem = myStripTrailingSpacesCombo.getSelectedItem();
534 if(STRIP_NONE.equals(selectedItem)) {
535 return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE;
537 if(STRIP_CHANGED.equals(selectedItem)){
538 return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED;
540 return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE;
543 private int getCustomSoftWrapIndent() {
544 String indentAsString = myCustomSoftWrapIndent.getText();
545 int defaultIndent = 0;
546 if (indentAsString == null) {
547 return defaultIndent;
550 int indent = Integer.parseInt(indentAsString.trim());
551 return indent >= 0 ? indent : defaultIndent;
552 } catch (IllegalArgumentException e) {
555 return defaultIndent;
558 private void initQuickDocProcessing() {
559 myCbShowQuickDocOnMouseMove.addItemListener(new ItemListener() {
561 public void itemStateChanged(ItemEvent e) {
562 myQuickDocDelayTextField.setEnabled(myCbShowQuickDocOnMouseMove.isSelected());
563 myQuickDocDelayLabel.setEnabled(myCbShowQuickDocOnMouseMove.isSelected());
568 private void initSoftWrapsSettingsProcessing() {
569 ItemListener listener = new ItemListener() {
571 public void itemStateChanged(ItemEvent e) {
572 updateSoftWrapSettingsRepresentation();
575 myCbUseSoftWrapsAtEditor.addItemListener(listener);
576 myCbUseSoftWrapsAtConsole.addItemListener(listener);
577 myCbUseCustomSoftWrapIndent.addItemListener(listener);
580 private void updateSoftWrapSettingsRepresentation() {
581 boolean softWrapsEnabled = myCbUseSoftWrapsAtEditor.isSelected() || myCbUseSoftWrapsAtConsole.isSelected();
582 myCbUseCustomSoftWrapIndent.setEnabled(softWrapsEnabled);
583 myCustomSoftWrapIndent.setEnabled(myCbUseCustomSoftWrapIndent.isEnabled() && myCbUseCustomSoftWrapIndent.isSelected());
584 myCustomSoftWrapIndentLabel.setEnabled(myCustomSoftWrapIndent.isEnabled());
585 myCbShowSoftWrapsOnlyOnCaretLine.setEnabled(softWrapsEnabled);
588 public JComponent getComponent() {
589 return myBehaviourPanel;
592 public class MyConfigurable implements SearchableConfigurable {
595 public String getId() {
596 return "Editor.Behavior";
600 public Runnable enableSearch(final String option) {
605 public String getDisplayName() {
606 return ApplicationBundle.message("tab.editor.settings.behavior");
610 public String getHelpTopic() {
615 public JComponent createComponent() {
616 return myBehaviourPanel;
620 public boolean isModified() {
621 return EditorOptionsPanel.this.isModified();
625 public void apply() throws ConfigurationException {
626 EditorOptionsPanel.this.apply();
630 public void reset() {
631 EditorOptionsPanel.this.reset();
635 public void disposeUIResources() {
636 EditorOptionsPanel.this.disposeUIResources();