diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form index 286e671bbde3..3b0391ecd073 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.form @@ -1,467 +1,478 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java index 28155d114ff8..78203d203f13 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsPanel.java @@ -1,487 +1,529 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.intellij.application.options.editor; - -import com.intellij.application.options.OptionId; -import com.intellij.application.options.OptionsApplicabilityFilter; -import com.intellij.codeInsight.CodeInsightSettings; -import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; -import com.intellij.codeInsight.daemon.impl.IdentifierHighlighterPass; -import com.intellij.codeInsight.documentation.QuickDocOnMouseOverManager; -import com.intellij.ide.ui.UISettings; -import com.intellij.openapi.application.ApplicationBundle; -import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.editor.ex.EditorEx; -import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; -import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces; -import com.intellij.openapi.fileEditor.FileEditor; -import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.fileEditor.TextEditor; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.util.text.StringUtil; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; - -public class EditorOptionsPanel { - private JPanel myBehaviourPanel; - private JCheckBox myCbHighlightBraces; - private static final String STRIP_CHANGED = ApplicationBundle.message("combobox.strip.modified.lines"); - - private static final String STRIP_ALL = ApplicationBundle.message("combobox.strip.all"); - private static final String STRIP_NONE = ApplicationBundle.message("combobox.strip.none"); - private JComboBox myStripTrailingSpacesCombo; - - private JCheckBox myCbVirtualSpace; - private JCheckBox myCbCaretInsideTabs; - - private JTextField myRecentFilesLimitField; - private JTextField myCommandsHistoryLimitField; - - private JCheckBox myCbHighlightScope; - - private JTextField myClipboardContentLimitTextField; - private JCheckBox myCbSmoothScrolling; - private JCheckBox myCbVirtualPageAtBottom; - private JCheckBox myCbEnableDnD; - private JCheckBox myCbEnableWheelFontChange; - private JCheckBox myCbHonorCamelHumpsWhenSelectingByClicking; - - private JPanel myHighlightSettingsPanel; - private JRadioButton myRbPreferScrolling; - private JRadioButton myRbPreferMovingCaret; - private JCheckBox myCbRenameLocalVariablesInplace; - private JCheckBox myCbHighlightIdentifierUnderCaret; - private JCheckBox myCbEnsureBlankLineBeforeCheckBox; - private JCheckBox myShowReformatCodeDialogCheckBox; - private JCheckBox myShowOptimizeImportsDialogCheckBox; - private JCheckBox myCbUseSoftWrapsAtEditor; - private JCheckBox myCbUseSoftWrapsAtConsole; - private JCheckBox myCbUseCustomSoftWrapIndent; - private JTextField myCustomSoftWrapIndent; - private JCheckBox myCbShowAllSoftWraps; - private JCheckBox myPreselectCheckBox; - private JCheckBox myCbShowQuickDocOnCheckBox; - - private final ErrorHighlightingPanel myErrorHighlightingPanel = new ErrorHighlightingPanel(); - private final MyConfigurable myConfigurable; - - - public EditorOptionsPanel(){ - if (SystemInfo.isMac) { - myCbEnableWheelFontChange.setText(ApplicationBundle.message("checkbox.enable.ctrl.mousewheel.changes.font.size.macos")); - } - - - myStripTrailingSpacesCombo.addItem(STRIP_CHANGED); - myStripTrailingSpacesCombo.addItem(STRIP_ALL); - myStripTrailingSpacesCombo.addItem(STRIP_NONE); - - - myHighlightSettingsPanel.setLayout(new BorderLayout()); - myHighlightSettingsPanel.add(myErrorHighlightingPanel.getPanel(), BorderLayout.CENTER); - - - myCbRenameLocalVariablesInplace.setVisible(OptionsApplicabilityFilter.isApplicable(OptionId.RENAME_IN_PLACE)); - - myConfigurable = new MyConfigurable(); - initSoftWrapsSettingsProcessing(); - } - - - public void reset() { - EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); - CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); - UISettings uiSettings=UISettings.getInstance(); - - // Display - - - myCbSmoothScrolling.setSelected(editorSettings.isSmoothScrolling()); - - // Brace highlighting - - myCbHighlightBraces.setSelected(codeInsightSettings.HIGHLIGHT_BRACES); - myCbHighlightScope.setSelected(codeInsightSettings.HIGHLIGHT_SCOPE); - myCbHighlightIdentifierUnderCaret.setSelected(codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET); - - // Virtual space - - myCbUseSoftWrapsAtEditor.setSelected(editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR)); - myCbUseSoftWrapsAtConsole.setSelected(editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.CONSOLE)); - myCbUseCustomSoftWrapIndent.setSelected(editorSettings.isUseCustomSoftWrapIndent()); - myCustomSoftWrapIndent.setText(Integer.toString(editorSettings.getCustomSoftWrapIndent())); - myCbShowAllSoftWraps.setSelected(editorSettings.isAllSoftWrapsShown()); - updateSoftWrapSettingsRepresentation(); - - myCbVirtualSpace.setSelected(editorSettings.isVirtualSpace()); - myCbCaretInsideTabs.setSelected(editorSettings.isCaretInsideTabs()); - myCbVirtualPageAtBottom.setSelected(editorSettings.isAdditionalPageAtBottom()); - - // Limits - myClipboardContentLimitTextField.setText(Integer.toString(uiSettings.MAX_CLIPBOARD_CONTENTS)); - - // Strip trailing spaces on save - - String stripTrailingSpaces = editorSettings.getStripTrailingSpaces(); - if(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE.equals(stripTrailingSpaces)) { - myStripTrailingSpacesCombo.setSelectedItem(STRIP_NONE); - } - else if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED.equals(stripTrailingSpaces)) { - myStripTrailingSpacesCombo.setSelectedItem(STRIP_CHANGED); - } - else if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE.equals(stripTrailingSpaces)) { - myStripTrailingSpacesCombo.setSelectedItem(STRIP_ALL); - } - - myCbEnsureBlankLineBeforeCheckBox.setSelected(editorSettings.isEnsureNewLineAtEOF()); - myCbShowQuickDocOnCheckBox.setSelected(editorSettings.isShowQuickDocOnMouseOverElement()); - - // Advanced mouse - myCbEnableDnD.setSelected(editorSettings.isDndEnabled()); - myCbEnableWheelFontChange.setSelected(editorSettings.isWheelFontChangeEnabled()); - myCbHonorCamelHumpsWhenSelectingByClicking.setSelected(editorSettings.isMouseClickSelectionHonorsCamelWords()); - - myRbPreferMovingCaret.setSelected(editorSettings.isRefrainFromScrolling()); - myRbPreferScrolling.setSelected(!editorSettings.isRefrainFromScrolling()); - - - myRecentFilesLimitField.setText(Integer.toString(uiSettings.RECENT_FILES_LIMIT)); - myCommandsHistoryLimitField.setText(Integer.toString(uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT)); - - myCbRenameLocalVariablesInplace.setSelected(editorSettings.isVariableInplaceRenameEnabled()); - myPreselectCheckBox.setSelected(editorSettings.isPreselectRename()); - - myShowReformatCodeDialogCheckBox.setSelected(editorSettings.getOptions().SHOW_REFORMAT_DIALOG); - myShowOptimizeImportsDialogCheckBox.setSelected(editorSettings.getOptions().SHOW_OPIMIZE_IMPORTS_DIALOG); - - myErrorHighlightingPanel.reset(); - } - - public void apply() throws ConfigurationException { - EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); - CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); - UISettings uiSettings=UISettings.getInstance(); - - // Display - - editorSettings.setSmoothScrolling(myCbSmoothScrolling.isSelected()); - - - // Brace Highlighting - - codeInsightSettings.HIGHLIGHT_BRACES = myCbHighlightBraces.isSelected(); - codeInsightSettings.HIGHLIGHT_SCOPE = myCbHighlightScope.isSelected(); - codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET = myCbHighlightIdentifierUnderCaret.isSelected(); - clearAllIdentifierHighlighters(); - - // Virtual space - - editorSettings.setUseSoftWraps(myCbUseSoftWrapsAtEditor.isSelected(), SoftWrapAppliancePlaces.MAIN_EDITOR); - editorSettings.setUseSoftWraps(myCbUseSoftWrapsAtConsole.isSelected(), SoftWrapAppliancePlaces.CONSOLE); - editorSettings.setUseCustomSoftWrapIndent(myCbUseCustomSoftWrapIndent.isSelected()); - editorSettings.setCustomSoftWrapIndent(getCustomSoftWrapIndent()); - editorSettings.setAllSoftwrapsShown(myCbShowAllSoftWraps.isSelected()); - editorSettings.setVirtualSpace(myCbVirtualSpace.isSelected()); - editorSettings.setCaretInsideTabs(myCbCaretInsideTabs.isSelected()); - editorSettings.setAdditionalPageAtBottom(myCbVirtualPageAtBottom.isSelected()); - - // Limits - - - - boolean uiSettingsChanged = false; - int maxClipboardContents = getMaxClipboardContents(); - if (uiSettings.MAX_CLIPBOARD_CONTENTS != maxClipboardContents) { - uiSettings.MAX_CLIPBOARD_CONTENTS = maxClipboardContents; - uiSettingsChanged = true; - } - - if(uiSettingsChanged){ - uiSettings.fireUISettingsChanged(); - } - - // Strip trailing spaces on save - - if(STRIP_NONE.equals(myStripTrailingSpacesCombo.getSelectedItem())) { - editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE); - } - else if(STRIP_CHANGED.equals(myStripTrailingSpacesCombo.getSelectedItem())){ - editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED); - } - else { - editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE); - } - - editorSettings.setEnsureNewLineAtEOF(myCbEnsureBlankLineBeforeCheckBox.isSelected()); - - if (myCbShowQuickDocOnCheckBox.isSelected() ^ editorSettings.isShowQuickDocOnMouseOverElement()) { - boolean enabled = myCbShowQuickDocOnCheckBox.isSelected(); - editorSettings.setShowQuickDocOnMouseOverElement(enabled); - ServiceManager.getService(QuickDocOnMouseOverManager.class).setEnabled(enabled); - } - - editorSettings.setDndEnabled(myCbEnableDnD.isSelected()); - - editorSettings.setWheelFontChangeEnabled(myCbEnableWheelFontChange.isSelected()); - editorSettings.setMouseClickSelectionHonorsCamelWords(myCbHonorCamelHumpsWhenSelectingByClicking.isSelected()); - editorSettings.setRefrainFromScrolling(myRbPreferMovingCaret.isSelected()); - - editorSettings.setVariableInplaceRenameEnabled(myCbRenameLocalVariablesInplace.isSelected()); - editorSettings.setPreselectRename(myPreselectCheckBox.isSelected()); - - editorSettings.getOptions().SHOW_REFORMAT_DIALOG = myShowReformatCodeDialogCheckBox.isSelected(); - editorSettings.getOptions().SHOW_OPIMIZE_IMPORTS_DIALOG = myShowOptimizeImportsDialogCheckBox.isSelected(); - - reinitAllEditors(); - - String temp=myRecentFilesLimitField.getText(); - if(temp.trim().length() > 0){ - try { - int newRecentFilesLimit= Integer.parseInt(temp); - if(newRecentFilesLimit>0&&uiSettings.RECENT_FILES_LIMIT!=newRecentFilesLimit){ - uiSettings.RECENT_FILES_LIMIT=newRecentFilesLimit; - uiSettingsChanged = true; - } - }catch (NumberFormatException ignored){} - } - if(uiSettingsChanged){ - uiSettings.fireUISettingsChanged(); - } - uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT = StringUtil.parseInt(myCommandsHistoryLimitField.getText(), uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT); - - myErrorHighlightingPanel.apply(); - restartDaemons(); - } - - public static void restartDaemons() { - Project[] projects = ProjectManager.getInstance().getOpenProjects(); - for (Project project : projects) { - DaemonCodeAnalyzer.getInstance(project).settingsChanged(); - } - } - - private static void clearAllIdentifierHighlighters() { - for (Project project : ProjectManager.getInstance().getOpenProjects()) { - for (FileEditor fileEditor : FileEditorManager.getInstance(project).getAllEditors()) { - if (fileEditor instanceof TextEditor) { - Document document = ((TextEditor)fileEditor).getEditor().getDocument(); - IdentifierHighlighterPass.clearMyHighlights(document, project); - } - } - } - } - - public static void reinitAllEditors() { - Editor[] editors = EditorFactory.getInstance().getAllEditors(); - for (Editor editor : editors) { - ((EditorEx)editor).reinitSettings(); - } - } - - public void disposeUIResources() { - myErrorHighlightingPanel.disposeUIResources(); - } - - private int getMaxClipboardContents(){ - int maxClipboardContents = -1; - try { - maxClipboardContents = Integer.parseInt(myClipboardContentLimitTextField.getText()); - } catch (NumberFormatException ignored) {} - if (maxClipboardContents <= 0) { - maxClipboardContents = 1; - } - return maxClipboardContents; - } - - public boolean isModified() { - EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); - CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); - UISettings uiSettings=UISettings.getInstance(); - - // Display - boolean isModified = isModified(myCbSmoothScrolling, editorSettings.isSmoothScrolling()); - - // Brace highlighting - isModified |= isModified(myCbHighlightBraces, codeInsightSettings.HIGHLIGHT_BRACES); - isModified |= isModified(myCbHighlightScope, codeInsightSettings.HIGHLIGHT_SCOPE); - isModified |= isModified(myCbHighlightIdentifierUnderCaret, codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET); - - // Virtual space - isModified |= isModified(myCbUseSoftWrapsAtEditor, editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR)); - isModified |= isModified(myCbUseSoftWrapsAtConsole, editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.CONSOLE)); - isModified |= isModified(myCbUseCustomSoftWrapIndent, editorSettings.isUseCustomSoftWrapIndent()); - isModified |= editorSettings.getCustomSoftWrapIndent() != getCustomSoftWrapIndent(); - isModified |= isModified(myCbShowAllSoftWraps, editorSettings.isAllSoftWrapsShown()); - isModified |= isModified(myCbVirtualSpace, editorSettings.isVirtualSpace()); - isModified |= isModified(myCbCaretInsideTabs, editorSettings.isCaretInsideTabs()); - isModified |= isModified(myCbVirtualPageAtBottom, editorSettings.isAdditionalPageAtBottom()); - - // Limits - - - isModified |= getMaxClipboardContents() != uiSettings.MAX_CLIPBOARD_CONTENTS; - - // Paste - - // Strip trailing spaces, ensure EOL on EOF on save - isModified |= !getStripTrailingSpacesValue().equals(editorSettings.getStripTrailingSpaces()); - isModified |= isModified(myCbEnsureBlankLineBeforeCheckBox, editorSettings.isEnsureNewLineAtEOF()); - isModified |= isModified(myCbShowQuickDocOnCheckBox, editorSettings.isShowQuickDocOnMouseOverElement()); - - // advanced mouse - isModified |= isModified(myCbEnableDnD, editorSettings.isDndEnabled()); - isModified |= isModified(myCbEnableWheelFontChange, editorSettings.isWheelFontChangeEnabled()); - isModified |= isModified(myCbHonorCamelHumpsWhenSelectingByClicking, editorSettings.isMouseClickSelectionHonorsCamelWords()); - - isModified |= myRbPreferMovingCaret.isSelected() != editorSettings.isRefrainFromScrolling(); - - - isModified |= isModified(myRecentFilesLimitField, UISettings.getInstance().RECENT_FILES_LIMIT); - isModified |= isModified(myCommandsHistoryLimitField, UISettings.getInstance().CONSOLE_COMMAND_HISTORY_LIMIT); - isModified |= isModified(myCbRenameLocalVariablesInplace, editorSettings.isVariableInplaceRenameEnabled()); - isModified |= isModified(myPreselectCheckBox, editorSettings.isPreselectRename()); - - isModified |= isModified(myShowReformatCodeDialogCheckBox, editorSettings.getOptions().SHOW_REFORMAT_DIALOG); - isModified |= isModified(myShowOptimizeImportsDialogCheckBox, editorSettings.getOptions().SHOW_OPIMIZE_IMPORTS_DIALOG); - - isModified |= myErrorHighlightingPanel.isModified(); - return isModified; - } - - private static boolean isModified(JToggleButton checkBox, boolean value) { - return checkBox.isSelected() != value; - } - - private static boolean isModified(JTextField textField, int value) { - try { - int fieldValue = Integer.parseInt(textField.getText().trim()); - return fieldValue != value; - } - catch(NumberFormatException e) { - return false; - } - } - - private String getStripTrailingSpacesValue() { - Object selectedItem = myStripTrailingSpacesCombo.getSelectedItem(); - if(STRIP_NONE.equals(selectedItem)) { - return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE; - } - else if(STRIP_CHANGED.equals(selectedItem)){ - return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED; - } - else { - return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE; - } - } - - private int getCustomSoftWrapIndent() { - String indentAsString = myCustomSoftWrapIndent.getText(); - int defaultIndent = 0; - if (indentAsString == null) { - return defaultIndent; - } - try { - int indent = Integer.parseInt(indentAsString.trim()); - return indent >= 0 ? indent : defaultIndent; - } catch (IllegalArgumentException e) { - // Ignore - } - return defaultIndent; - } - - private void initSoftWrapsSettingsProcessing() { - ItemListener listener = new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - updateSoftWrapSettingsRepresentation(); - } - }; - myCbUseSoftWrapsAtEditor.addItemListener(listener); - myCbUseSoftWrapsAtConsole.addItemListener(listener); - myCbUseCustomSoftWrapIndent.addItemListener(listener); - } - - private void updateSoftWrapSettingsRepresentation() { - myCbUseCustomSoftWrapIndent.setEnabled(myCbUseSoftWrapsAtEditor.isSelected() || myCbUseSoftWrapsAtConsole.isSelected()); - myCustomSoftWrapIndent.setEnabled(myCbUseCustomSoftWrapIndent.isEnabled() && myCbUseCustomSoftWrapIndent.isSelected()); - } - - public JComponent getComponent() { - return myBehaviourPanel; - } - - public class MyConfigurable implements SearchableConfigurable { - @Override - @NotNull - public String getId() { - return "Editor.Behavior"; - } - - @Override - public Runnable enableSearch(final String option) { - return null; - } - - @Override - public String getDisplayName() { - return ApplicationBundle.message("tab.editor.settings.behavior"); - } - - @Override - public String getHelpTopic() { - return null; - } - - @Override - public JComponent createComponent() { - return myBehaviourPanel; - } - - @Override - public boolean isModified() { - return EditorOptionsPanel.this.isModified(); - } - - @Override - public void apply() throws ConfigurationException { - EditorOptionsPanel.this.apply(); - } - - @Override - public void reset() { - EditorOptionsPanel.this.reset(); - } - - @Override - public void disposeUIResources() { - EditorOptionsPanel.this.disposeUIResources(); - } - } - -} +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intellij.application.options.editor; + +import com.intellij.application.options.OptionId; +import com.intellij.application.options.OptionsApplicabilityFilter; +import com.intellij.codeInsight.CodeInsightSettings; +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; +import com.intellij.codeInsight.daemon.impl.IdentifierHighlighterPass; +import com.intellij.codeInsight.documentation.QuickDocOnMouseOverManager; +import com.intellij.ide.ui.UISettings; +import com.intellij.openapi.application.ApplicationBundle; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorFactory; +import com.intellij.openapi.editor.ex.EditorEx; +import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; +import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.TextEditor; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +public class EditorOptionsPanel { + private JPanel myBehaviourPanel; + private JCheckBox myCbHighlightBraces; + private static final String STRIP_CHANGED = ApplicationBundle.message("combobox.strip.modified.lines"); + + private static final String STRIP_ALL = ApplicationBundle.message("combobox.strip.all"); + private static final String STRIP_NONE = ApplicationBundle.message("combobox.strip.none"); + private JComboBox myStripTrailingSpacesCombo; + + private JCheckBox myCbVirtualSpace; + private JCheckBox myCbCaretInsideTabs; + + private JTextField myRecentFilesLimitField; + private JTextField myCommandsHistoryLimitField; + + private JCheckBox myCbHighlightScope; + + private JTextField myClipboardContentLimitTextField; + private JCheckBox myCbSmoothScrolling; + private JCheckBox myCbVirtualPageAtBottom; + private JCheckBox myCbEnableDnD; + private JCheckBox myCbEnableWheelFontChange; + private JCheckBox myCbHonorCamelHumpsWhenSelectingByClicking; + + private JPanel myHighlightSettingsPanel; + private JRadioButton myRbPreferScrolling; + private JRadioButton myRbPreferMovingCaret; + private JCheckBox myCbRenameLocalVariablesInplace; + private JCheckBox myCbHighlightIdentifierUnderCaret; + private JCheckBox myCbEnsureBlankLineBeforeCheckBox; + private JCheckBox myShowReformatCodeDialogCheckBox; + private JCheckBox myShowOptimizeImportsDialogCheckBox; + private JCheckBox myCbUseSoftWrapsAtEditor; + private JCheckBox myCbUseSoftWrapsAtConsole; + private JCheckBox myCbUseCustomSoftWrapIndent; + private JTextField myCustomSoftWrapIndent; + private JCheckBox myCbShowAllSoftWraps; + private JCheckBox myPreselectCheckBox; + private JCheckBox myCbShowQuickDocOnCheckBox; + private JTextField myQuickDocDelayTextField; + + private final ErrorHighlightingPanel myErrorHighlightingPanel = new ErrorHighlightingPanel(); + private final MyConfigurable myConfigurable; + + + public EditorOptionsPanel() { + if (SystemInfo.isMac) { + myCbEnableWheelFontChange.setText(ApplicationBundle.message("checkbox.enable.ctrl.mousewheel.changes.font.size.macos")); + } + + + myStripTrailingSpacesCombo.addItem(STRIP_CHANGED); + myStripTrailingSpacesCombo.addItem(STRIP_ALL); + myStripTrailingSpacesCombo.addItem(STRIP_NONE); + + + myHighlightSettingsPanel.setLayout(new BorderLayout()); + myHighlightSettingsPanel.add(myErrorHighlightingPanel.getPanel(), BorderLayout.CENTER); + + + myCbRenameLocalVariablesInplace.setVisible(OptionsApplicabilityFilter.isApplicable(OptionId.RENAME_IN_PLACE)); + + myConfigurable = new MyConfigurable(); + initQuickDocProcessing(); + initSoftWrapsSettingsProcessing(); + } + + + public void reset() { + EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); + CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); + UISettings uiSettings=UISettings.getInstance(); + + // Display + + + myCbSmoothScrolling.setSelected(editorSettings.isSmoothScrolling()); + + // Brace highlighting + + myCbHighlightBraces.setSelected(codeInsightSettings.HIGHLIGHT_BRACES); + myCbHighlightScope.setSelected(codeInsightSettings.HIGHLIGHT_SCOPE); + myCbHighlightIdentifierUnderCaret.setSelected(codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET); + + // Virtual space + + myCbUseSoftWrapsAtEditor.setSelected(editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR)); + myCbUseSoftWrapsAtConsole.setSelected(editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.CONSOLE)); + myCbUseCustomSoftWrapIndent.setSelected(editorSettings.isUseCustomSoftWrapIndent()); + myCustomSoftWrapIndent.setText(Integer.toString(editorSettings.getCustomSoftWrapIndent())); + myCbShowAllSoftWraps.setSelected(editorSettings.isAllSoftWrapsShown()); + updateSoftWrapSettingsRepresentation(); + + myCbVirtualSpace.setSelected(editorSettings.isVirtualSpace()); + myCbCaretInsideTabs.setSelected(editorSettings.isCaretInsideTabs()); + myCbVirtualPageAtBottom.setSelected(editorSettings.isAdditionalPageAtBottom()); + + // Limits + myClipboardContentLimitTextField.setText(Integer.toString(uiSettings.MAX_CLIPBOARD_CONTENTS)); + + // Strip trailing spaces on save + + String stripTrailingSpaces = editorSettings.getStripTrailingSpaces(); + if(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE.equals(stripTrailingSpaces)) { + myStripTrailingSpacesCombo.setSelectedItem(STRIP_NONE); + } + else if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED.equals(stripTrailingSpaces)) { + myStripTrailingSpacesCombo.setSelectedItem(STRIP_CHANGED); + } + else if (EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE.equals(stripTrailingSpaces)) { + myStripTrailingSpacesCombo.setSelectedItem(STRIP_ALL); + } + + myCbEnsureBlankLineBeforeCheckBox.setSelected(editorSettings.isEnsureNewLineAtEOF()); + myCbShowQuickDocOnCheckBox.setSelected(editorSettings.isShowQuickDocOnMouseOverElement()); + myQuickDocDelayTextField.setText(Long.toString(editorSettings.getQuickDocOnMouseOverElementDelayMillis())); + myQuickDocDelayTextField.setEnabled(editorSettings.isShowQuickDocOnMouseOverElement()); + + // Advanced mouse + myCbEnableDnD.setSelected(editorSettings.isDndEnabled()); + myCbEnableWheelFontChange.setSelected(editorSettings.isWheelFontChangeEnabled()); + myCbHonorCamelHumpsWhenSelectingByClicking.setSelected(editorSettings.isMouseClickSelectionHonorsCamelWords()); + + myRbPreferMovingCaret.setSelected(editorSettings.isRefrainFromScrolling()); + myRbPreferScrolling.setSelected(!editorSettings.isRefrainFromScrolling()); + + + myRecentFilesLimitField.setText(Integer.toString(uiSettings.RECENT_FILES_LIMIT)); + myCommandsHistoryLimitField.setText(Integer.toString(uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT)); + + myCbRenameLocalVariablesInplace.setSelected(editorSettings.isVariableInplaceRenameEnabled()); + myPreselectCheckBox.setSelected(editorSettings.isPreselectRename()); + + myShowReformatCodeDialogCheckBox.setSelected(editorSettings.getOptions().SHOW_REFORMAT_DIALOG); + myShowOptimizeImportsDialogCheckBox.setSelected(editorSettings.getOptions().SHOW_OPIMIZE_IMPORTS_DIALOG); + + myErrorHighlightingPanel.reset(); + } + + public void apply() throws ConfigurationException { + EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); + CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); + UISettings uiSettings=UISettings.getInstance(); + + // Display + + editorSettings.setSmoothScrolling(myCbSmoothScrolling.isSelected()); + + + // Brace Highlighting + + codeInsightSettings.HIGHLIGHT_BRACES = myCbHighlightBraces.isSelected(); + codeInsightSettings.HIGHLIGHT_SCOPE = myCbHighlightScope.isSelected(); + codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET = myCbHighlightIdentifierUnderCaret.isSelected(); + clearAllIdentifierHighlighters(); + + // Virtual space + + editorSettings.setUseSoftWraps(myCbUseSoftWrapsAtEditor.isSelected(), SoftWrapAppliancePlaces.MAIN_EDITOR); + editorSettings.setUseSoftWraps(myCbUseSoftWrapsAtConsole.isSelected(), SoftWrapAppliancePlaces.CONSOLE); + editorSettings.setUseCustomSoftWrapIndent(myCbUseCustomSoftWrapIndent.isSelected()); + editorSettings.setCustomSoftWrapIndent(getCustomSoftWrapIndent()); + editorSettings.setAllSoftwrapsShown(myCbShowAllSoftWraps.isSelected()); + editorSettings.setVirtualSpace(myCbVirtualSpace.isSelected()); + editorSettings.setCaretInsideTabs(myCbCaretInsideTabs.isSelected()); + editorSettings.setAdditionalPageAtBottom(myCbVirtualPageAtBottom.isSelected()); + + // Limits + + + + boolean uiSettingsChanged = false; + int maxClipboardContents = getMaxClipboardContents(); + if (uiSettings.MAX_CLIPBOARD_CONTENTS != maxClipboardContents) { + uiSettings.MAX_CLIPBOARD_CONTENTS = maxClipboardContents; + uiSettingsChanged = true; + } + + if(uiSettingsChanged){ + uiSettings.fireUISettingsChanged(); + } + + // Strip trailing spaces on save + + if(STRIP_NONE.equals(myStripTrailingSpacesCombo.getSelectedItem())) { + editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE); + } + else if(STRIP_CHANGED.equals(myStripTrailingSpacesCombo.getSelectedItem())){ + editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED); + } + else { + editorSettings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE); + } + + editorSettings.setEnsureNewLineAtEOF(myCbEnsureBlankLineBeforeCheckBox.isSelected()); + + if (myCbShowQuickDocOnCheckBox.isSelected() ^ editorSettings.isShowQuickDocOnMouseOverElement()) { + boolean enabled = myCbShowQuickDocOnCheckBox.isSelected(); + editorSettings.setShowQuickDocOnMouseOverElement(enabled); + ServiceManager.getService(QuickDocOnMouseOverManager.class).setEnabled(enabled); + } + + Long quickDocDelay = getQuickDocDelayFromGui(); + if (quickDocDelay != null) { + editorSettings.setQuickDocOnMouseOverElementDelayMillis(quickDocDelay); + } + + editorSettings.setDndEnabled(myCbEnableDnD.isSelected()); + + editorSettings.setWheelFontChangeEnabled(myCbEnableWheelFontChange.isSelected()); + editorSettings.setMouseClickSelectionHonorsCamelWords(myCbHonorCamelHumpsWhenSelectingByClicking.isSelected()); + editorSettings.setRefrainFromScrolling(myRbPreferMovingCaret.isSelected()); + + editorSettings.setVariableInplaceRenameEnabled(myCbRenameLocalVariablesInplace.isSelected()); + editorSettings.setPreselectRename(myPreselectCheckBox.isSelected()); + + editorSettings.getOptions().SHOW_REFORMAT_DIALOG = myShowReformatCodeDialogCheckBox.isSelected(); + editorSettings.getOptions().SHOW_OPIMIZE_IMPORTS_DIALOG = myShowOptimizeImportsDialogCheckBox.isSelected(); + + reinitAllEditors(); + + String temp=myRecentFilesLimitField.getText(); + if(temp.trim().length() > 0){ + try { + int newRecentFilesLimit= Integer.parseInt(temp); + if(newRecentFilesLimit>0&&uiSettings.RECENT_FILES_LIMIT!=newRecentFilesLimit){ + uiSettings.RECENT_FILES_LIMIT=newRecentFilesLimit; + uiSettingsChanged = true; + } + }catch (NumberFormatException ignored){} + } + if(uiSettingsChanged){ + uiSettings.fireUISettingsChanged(); + } + uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT = StringUtil.parseInt(myCommandsHistoryLimitField.getText(), uiSettings.CONSOLE_COMMAND_HISTORY_LIMIT); + + myErrorHighlightingPanel.apply(); + restartDaemons(); + } + + @Nullable + private Long getQuickDocDelayFromGui() { + String quickDocDelayAsText = myQuickDocDelayTextField.getText(); + if (StringUtil.isEmptyOrSpaces(quickDocDelayAsText)) { + return null; + } + + try { + long delay = Long.parseLong(quickDocDelayAsText); + return delay > 0 ? delay : null; + } + catch (NumberFormatException e) { + // Ignore incorrect value. + return null; + } + } + + public static void restartDaemons() { + Project[] projects = ProjectManager.getInstance().getOpenProjects(); + for (Project project : projects) { + DaemonCodeAnalyzer.getInstance(project).settingsChanged(); + } + } + + private static void clearAllIdentifierHighlighters() { + for (Project project : ProjectManager.getInstance().getOpenProjects()) { + for (FileEditor fileEditor : FileEditorManager.getInstance(project).getAllEditors()) { + if (fileEditor instanceof TextEditor) { + Document document = ((TextEditor)fileEditor).getEditor().getDocument(); + IdentifierHighlighterPass.clearMyHighlights(document, project); + } + } + } + } + + public static void reinitAllEditors() { + Editor[] editors = EditorFactory.getInstance().getAllEditors(); + for (Editor editor : editors) { + ((EditorEx)editor).reinitSettings(); + } + } + + public void disposeUIResources() { + myErrorHighlightingPanel.disposeUIResources(); + } + + private int getMaxClipboardContents(){ + int maxClipboardContents = -1; + try { + maxClipboardContents = Integer.parseInt(myClipboardContentLimitTextField.getText()); + } catch (NumberFormatException ignored) {} + if (maxClipboardContents <= 0) { + maxClipboardContents = 1; + } + return maxClipboardContents; + } + + public boolean isModified() { + EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); + CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); + UISettings uiSettings=UISettings.getInstance(); + + // Display + boolean isModified = isModified(myCbSmoothScrolling, editorSettings.isSmoothScrolling()); + + // Brace highlighting + isModified |= isModified(myCbHighlightBraces, codeInsightSettings.HIGHLIGHT_BRACES); + isModified |= isModified(myCbHighlightScope, codeInsightSettings.HIGHLIGHT_SCOPE); + isModified |= isModified(myCbHighlightIdentifierUnderCaret, codeInsightSettings.HIGHLIGHT_IDENTIFIER_UNDER_CARET); + + // Virtual space + isModified |= isModified(myCbUseSoftWrapsAtEditor, editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR)); + isModified |= isModified(myCbUseSoftWrapsAtConsole, editorSettings.isUseSoftWraps(SoftWrapAppliancePlaces.CONSOLE)); + isModified |= isModified(myCbUseCustomSoftWrapIndent, editorSettings.isUseCustomSoftWrapIndent()); + isModified |= editorSettings.getCustomSoftWrapIndent() != getCustomSoftWrapIndent(); + isModified |= isModified(myCbShowAllSoftWraps, editorSettings.isAllSoftWrapsShown()); + isModified |= isModified(myCbVirtualSpace, editorSettings.isVirtualSpace()); + isModified |= isModified(myCbCaretInsideTabs, editorSettings.isCaretInsideTabs()); + isModified |= isModified(myCbVirtualPageAtBottom, editorSettings.isAdditionalPageAtBottom()); + + // Limits + + + isModified |= getMaxClipboardContents() != uiSettings.MAX_CLIPBOARD_CONTENTS; + + // Paste + + // Strip trailing spaces, ensure EOL on EOF on save + isModified |= !getStripTrailingSpacesValue().equals(editorSettings.getStripTrailingSpaces()); + isModified |= isModified(myCbEnsureBlankLineBeforeCheckBox, editorSettings.isEnsureNewLineAtEOF()); + isModified |= isModified(myCbShowQuickDocOnCheckBox, editorSettings.isShowQuickDocOnMouseOverElement()); + Long quickDocDelay = getQuickDocDelayFromGui(); + if (quickDocDelay != null && quickDocDelay.equals(Long.valueOf(editorSettings.getQuickDocOnMouseOverElementDelayMillis()))) { + return true; + } + + // advanced mouse + isModified |= isModified(myCbEnableDnD, editorSettings.isDndEnabled()); + isModified |= isModified(myCbEnableWheelFontChange, editorSettings.isWheelFontChangeEnabled()); + isModified |= isModified(myCbHonorCamelHumpsWhenSelectingByClicking, editorSettings.isMouseClickSelectionHonorsCamelWords()); + + isModified |= myRbPreferMovingCaret.isSelected() != editorSettings.isRefrainFromScrolling(); + + + isModified |= isModified(myRecentFilesLimitField, UISettings.getInstance().RECENT_FILES_LIMIT); + isModified |= isModified(myCommandsHistoryLimitField, UISettings.getInstance().CONSOLE_COMMAND_HISTORY_LIMIT); + isModified |= isModified(myCbRenameLocalVariablesInplace, editorSettings.isVariableInplaceRenameEnabled()); + isModified |= isModified(myPreselectCheckBox, editorSettings.isPreselectRename()); + + isModified |= isModified(myShowReformatCodeDialogCheckBox, editorSettings.getOptions().SHOW_REFORMAT_DIALOG); + isModified |= isModified(myShowOptimizeImportsDialogCheckBox, editorSettings.getOptions().SHOW_OPIMIZE_IMPORTS_DIALOG); + + isModified |= myErrorHighlightingPanel.isModified(); + return isModified; + } + + + + private static boolean isModified(JToggleButton checkBox, boolean value) { + return checkBox.isSelected() != value; + } + + private static boolean isModified(JTextField textField, int value) { + try { + int fieldValue = Integer.parseInt(textField.getText().trim()); + return fieldValue != value; + } + catch(NumberFormatException e) { + return false; + } + } + + private String getStripTrailingSpacesValue() { + Object selectedItem = myStripTrailingSpacesCombo.getSelectedItem(); + if(STRIP_NONE.equals(selectedItem)) { + return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_NONE; + } + else if(STRIP_CHANGED.equals(selectedItem)){ + return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED; + } + else { + return EditorSettingsExternalizable.STRIP_TRAILING_SPACES_WHOLE; + } + } + + private int getCustomSoftWrapIndent() { + String indentAsString = myCustomSoftWrapIndent.getText(); + int defaultIndent = 0; + if (indentAsString == null) { + return defaultIndent; + } + try { + int indent = Integer.parseInt(indentAsString.trim()); + return indent >= 0 ? indent : defaultIndent; + } catch (IllegalArgumentException e) { + // Ignore + } + return defaultIndent; + } + + private void initQuickDocProcessing() { + myCbShowQuickDocOnCheckBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + myQuickDocDelayTextField.setEnabled(myCbShowQuickDocOnCheckBox.isSelected()); + } + }); + } + + private void initSoftWrapsSettingsProcessing() { + ItemListener listener = new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + updateSoftWrapSettingsRepresentation(); + } + }; + myCbUseSoftWrapsAtEditor.addItemListener(listener); + myCbUseSoftWrapsAtConsole.addItemListener(listener); + myCbUseCustomSoftWrapIndent.addItemListener(listener); + } + + private void updateSoftWrapSettingsRepresentation() { + myCbUseCustomSoftWrapIndent.setEnabled(myCbUseSoftWrapsAtEditor.isSelected() || myCbUseSoftWrapsAtConsole.isSelected()); + myCustomSoftWrapIndent.setEnabled(myCbUseCustomSoftWrapIndent.isEnabled() && myCbUseCustomSoftWrapIndent.isSelected()); + } + + public JComponent getComponent() { + return myBehaviourPanel; + } + + public class MyConfigurable implements SearchableConfigurable { + @Override + @NotNull + public String getId() { + return "Editor.Behavior"; + } + + @Override + public Runnable enableSearch(final String option) { + return null; + } + + @Override + public String getDisplayName() { + return ApplicationBundle.message("tab.editor.settings.behavior"); + } + + @Override + public String getHelpTopic() { + return null; + } + + @Override + public JComponent createComponent() { + return myBehaviourPanel; + } + + @Override + public boolean isModified() { + return EditorOptionsPanel.this.isModified(); + } + + @Override + public void apply() throws ConfigurationException { + EditorOptionsPanel.this.apply(); + } + + @Override + public void reset() { + EditorOptionsPanel.this.reset(); + } + + @Override + public void disposeUIResources() { + EditorOptionsPanel.this.disposeUIResources(); + } + } + +} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocOnMouseOverManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocOnMouseOverManager.java index 90bdcb7c93e9..532236407e7c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocOnMouseOverManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/QuickDocOnMouseOverManager.java @@ -19,6 +19,7 @@ import com.intellij.openapi.application.Application; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.event.*; +import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.psi.PsiDocumentManager; @@ -45,24 +46,6 @@ import java.util.Map; */ public class QuickDocOnMouseOverManager { - private static final long QUICK_DOC_DELAY_MILLIS; - static { - long delay = 500; - String property = System.getProperty("editor.auto.quick.doc.delay.ms"); - if (property != null) { - try { - long parsed = Long.parseLong(property); - if (parsed > 0) { - delay = parsed; - } - } - catch (Exception e) { - // Ignore. - } - } - QUICK_DOC_DELAY_MILLIS = delay; - } - @NotNull private final EditorMouseMotionListener myMouseListener = new MyEditorMouseListener(); @NotNull private final VisibleAreaListener myVisibleAreaListener = new MyVisibleAreaListener(); @NotNull private final CaretListener myCaretListener = new MyCaretListener(); @@ -179,7 +162,7 @@ public class QuickDocOnMouseOverManager { myDelayedQuickDocInfo = new DelayedQuickDocInfo(documentationManager, editor, targetElementUnderMouse, elementUnderMouse); myAlarm.cancelAllRequests(); - myAlarm.addRequest(myRequest, QUICK_DOC_DELAY_MILLIS); + myAlarm.addRequest(myRequest, EditorSettingsExternalizable.getInstance().getQuickDocOnMouseOverElementDelayMillis()); } private void closeAutoQuickDocComponentIfNecessary() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java index 6e29b8eecc9a..476863b6adaf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorSettingsExternalizable.java @@ -1,518 +1,534 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.openapi.editor.ex; - -import com.intellij.openapi.application.Application; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.PathManager; -import com.intellij.openapi.components.ExportableApplicationComponent; -import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces; -import com.intellij.openapi.options.OptionsBundle; -import com.intellij.openapi.util.DefaultJDOMExternalizer; -import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.NamedJDOMExternalizable; -import com.intellij.openapi.util.WriteExternalException; -import com.intellij.openapi.vfs.CharsetToolkit; -import com.intellij.openapi.vfs.encoding.EncodingManager; -import org.jdom.Element; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.io.File; -import java.lang.reflect.Field; -import java.nio.charset.Charset; -import java.util.EnumSet; -import java.util.Set; - -public class EditorSettingsExternalizable implements NamedJDOMExternalizable, ExportableApplicationComponent, Cloneable { - //Q: make it interface? - public static class OptionSet implements Cloneable { - public String LINE_SEPARATOR; - public String USE_SOFT_WRAPS; - public boolean USE_CUSTOM_SOFT_WRAP_INDENT = false; - public int CUSTOM_SOFT_WRAP_INDENT = 0; - public boolean IS_VIRTUAL_SPACE = true; - public boolean IS_CARET_INSIDE_TABS; - @NonNls public String STRIP_TRAILING_SPACES = "Changed"; - public boolean IS_ENSURE_NEWLINE_AT_EOF = false; - public boolean SHOW_QUICK_DOC_ON_MOUSE_OVER_ELEMENT = false; - public boolean IS_CARET_BLINKING = true; - public int CARET_BLINKING_PERIOD = 500; - public boolean IS_RIGHT_MARGIN_SHOWN = true; - public boolean ARE_LINE_NUMBERS_SHOWN = false; - public boolean IS_FOLDING_OUTLINE_SHOWN = true; - - public boolean SMART_HOME = true; - - public boolean IS_BLOCK_CURSOR = false; - public boolean IS_WHITESPACES_SHOWN = false; - public boolean IS_ALL_SOFTWRAPS_SHOWN = false; - public boolean IS_INDENT_GUIDES_SHOWN = true; - public boolean IS_ANIMATED_SCROLLING = true; - public boolean IS_CAMEL_WORDS = false; - public boolean ADDITIONAL_PAGE_AT_BOTTOM = false; - - public boolean IS_DND_ENABLED = true; - public boolean IS_WHEEL_FONTCHANGE_ENABLED = false; - public boolean IS_MOUSE_CLICK_SELECTION_HONORS_CAMEL_WORDS = true; - @Deprecated - public boolean IS_NATIVE2ASCII_FOR_PROPERTIES_FILES; - @Deprecated - public String DEFAULT_PROPERTIES_FILES_CHARSET_NAME; - - public boolean RENAME_VARIABLES_INPLACE = true; - public boolean PRESELECT_RENAME = true; - public boolean REFRAIN_FROM_SCROLLING = false; - - public boolean SHOW_REFORMAT_DIALOG = true; - public boolean SHOW_OPIMIZE_IMPORTS_DIALOG = true; - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - } - - private static final String COMPOSITE_PROPERTY_SEPARATOR = ":"; - - private final Set myPlacesToUseSoftWraps = EnumSet.noneOf(SoftWrapAppliancePlaces.class); - private OptionSet myOptions = new OptionSet(); - private final PropertyChangeSupport myPropertyChangeSupport = new PropertyChangeSupport(this); - - private int myBlockIndent; - //private int myTabSize = 4; - //private boolean myUseTabCharacter = false; - - private int myAdditionalLinesCount = 10; - private int myAdditinalColumnsCount = 20; - private boolean myLineMarkerAreaShown = true; - - @NonNls public static final String STRIP_TRAILING_SPACES_NONE = "None"; - @NonNls public static final String STRIP_TRAILING_SPACES_CHANGED = "Changed"; - @NonNls public static final String STRIP_TRAILING_SPACES_WHOLE = "Whole"; - - - @NonNls public static final String DEFAULT_FONT_NAME = "Courier"; - - public static EditorSettingsExternalizable getInstance() { - final Application app = ApplicationManager.getApplication(); - if (app.isDisposed()) return new EditorSettingsExternalizable(); - return app.getComponent(EditorSettingsExternalizable.class); - } - - @Override - public void initComponent() { } - - @Override - public void disposeComponent() { - } - - public void addPropertyChangeListener(PropertyChangeListener listener){ - myPropertyChangeSupport.addPropertyChangeListener(listener); - } - - public void removePropertyChangeListener(PropertyChangeListener listener){ - myPropertyChangeSupport.removePropertyChangeListener(listener); - } - - @Override - public void readExternal(Element element) throws InvalidDataException { - DefaultJDOMExternalizer.readExternal(myOptions, element); - parseRawSoftWraps(); - } - - @Override - public void writeExternal(Element element) throws WriteExternalException { - DefaultJDOMExternalizer.writeExternal(myOptions, element, new DefaultJDOMExternalizer.JDOMFilter() { - @Override - public boolean isAccept(final Field field) { - return !field.getName().equals("IS_NATIVE2ASCII_FOR_PROPERTIES_FILES") && !field.getName().equals("DEFAULT_PROPERTIES_FILES_CHARSET_NAME"); - } - }); - } - - private void parseRawSoftWraps() { - if (myOptions.USE_SOFT_WRAPS == null || myOptions.USE_SOFT_WRAPS.isEmpty()) { - return; - } - - String[] placeNames = myOptions.USE_SOFT_WRAPS.split(COMPOSITE_PROPERTY_SEPARATOR); - for (String placeName : placeNames) { - try { - SoftWrapAppliancePlaces place = SoftWrapAppliancePlaces.valueOf(placeName); - if (place == SoftWrapAppliancePlaces.VCS_DIFF) { - // Don't keep separate setting for vcs diff window for now and let it share the value for main editor. - continue; - } - myPlacesToUseSoftWraps.add(place); - } - catch (IllegalArgumentException e) { - // Ignore bad value - } - } - - // There is a possible case that there were invalid/old format values. We want to replace them by up-to-date data. - storeRawSoftWraps(); - } - - private void storeRawSoftWraps() { - StringBuilder buffer = new StringBuilder(); - for (SoftWrapAppliancePlaces placeToStore : myPlacesToUseSoftWraps) { - buffer.append(placeToStore).append(COMPOSITE_PROPERTY_SEPARATOR); - } - if (buffer.length() > 0) { - buffer.setLength(buffer.length() - 1); - } - myOptions.USE_SOFT_WRAPS = buffer.toString(); - } - - @Override - public String getExternalFileName() { - return "editor"; - } - - public OptionSet getOptions() { - return myOptions; - } - - public boolean isRightMarginShown() { - return myOptions.IS_RIGHT_MARGIN_SHOWN; - } - - public void setRightMarginShown(boolean val) { - myOptions.IS_RIGHT_MARGIN_SHOWN = val; - } - - public boolean isLineNumbersShown() { - return myOptions.ARE_LINE_NUMBERS_SHOWN; - } - - public void setLineNumbersShown(boolean val) { - myOptions.ARE_LINE_NUMBERS_SHOWN = val; - } - - public int getAdditionalLinesCount() { - return myAdditionalLinesCount; - } - - public void setAdditionalLinesCount(int additionalLinesCount) { - myAdditionalLinesCount = additionalLinesCount; - } - - public int getAdditinalColumnsCount() { - return myAdditinalColumnsCount; - } - - public void setAdditionalColumnsCount(int additinalColumnsCount) { - myAdditinalColumnsCount = additinalColumnsCount; - } - - public boolean isLineMarkerAreaShown() { - return myLineMarkerAreaShown; - } - - public void setLineMarkerAreaShown(boolean lineMarkerAreaShown) { - myLineMarkerAreaShown = lineMarkerAreaShown; - } - - public boolean isFoldingOutlineShown() { - return myOptions.IS_FOLDING_OUTLINE_SHOWN; - } - - public void setFoldingOutlineShown(boolean val) { - myOptions.IS_FOLDING_OUTLINE_SHOWN = val; - } - - public boolean isBlockCursor() { - return myOptions.IS_BLOCK_CURSOR; - } - - public void setBlockCursor(boolean val) { - myOptions.IS_BLOCK_CURSOR = val; - } - - public int getBlockIndent() { - return myBlockIndent; - } - - public void setBlockIndent(int blockIndent) { - myBlockIndent = blockIndent; - } - - public boolean isSmartHome() { - return myOptions.SMART_HOME; - } - - public void setSmartHome(boolean val) { - myOptions.SMART_HOME = val; - } - - public boolean isUseSoftWraps() { - return isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR); - } - - public boolean isUseSoftWraps(@NotNull SoftWrapAppliancePlaces place) { - if (myPlacesToUseSoftWraps.contains(place)) { - return true; - } - - // For now use soft wraps at vcs diff if they are enabled for the main editors. - if (place == SoftWrapAppliancePlaces.VCS_DIFF) { - return myPlacesToUseSoftWraps.contains(SoftWrapAppliancePlaces.MAIN_EDITOR); - } - return false; - } - - public void setUseSoftWraps(boolean use) { - setUseSoftWraps(use, SoftWrapAppliancePlaces.MAIN_EDITOR); - } - - public void setUseSoftWraps(boolean use, @NotNull SoftWrapAppliancePlaces place) { - boolean update = use ^ myPlacesToUseSoftWraps.contains(place); - if (!update) { - return; - } - - if (use) { - myPlacesToUseSoftWraps.add(place); - } - else { - myPlacesToUseSoftWraps.remove(place); - } - storeRawSoftWraps(); - } - - public boolean isUseCustomSoftWrapIndent() { - return myOptions.USE_CUSTOM_SOFT_WRAP_INDENT; - } - - public void setUseCustomSoftWrapIndent(boolean use) { - myOptions.USE_CUSTOM_SOFT_WRAP_INDENT = use; - } - - public int getCustomSoftWrapIndent() { - return myOptions.CUSTOM_SOFT_WRAP_INDENT; - } - - public void setCustomSoftWrapIndent(int indent) { - myOptions.CUSTOM_SOFT_WRAP_INDENT = indent; - } - - public boolean isVirtualSpace() { - return myOptions.IS_VIRTUAL_SPACE; - } - - public void setVirtualSpace(boolean val) { - myOptions.IS_VIRTUAL_SPACE = val; - } - - public boolean isCaretInsideTabs() { - return myOptions.IS_CARET_INSIDE_TABS; - } - - public void setCaretInsideTabs(boolean val) { - myOptions.IS_CARET_INSIDE_TABS = val; - } - - public boolean isBlinkCaret() { - return myOptions.IS_CARET_BLINKING; - } - - public void setBlinkCaret(boolean blinkCaret) { - myOptions.IS_CARET_BLINKING = blinkCaret; - } - - public int getBlinkPeriod() { - return myOptions.CARET_BLINKING_PERIOD; - } - - public void setBlinkPeriod(int blinkInterval) { - myOptions.CARET_BLINKING_PERIOD = blinkInterval; - } - - - public boolean isEnsureNewLineAtEOF() { - return myOptions.IS_ENSURE_NEWLINE_AT_EOF; - } - - public void setEnsureNewLineAtEOF(boolean ensure) { - myOptions.IS_ENSURE_NEWLINE_AT_EOF = ensure; - } - - public String getStripTrailingSpaces() { - return myOptions.STRIP_TRAILING_SPACES; - } // TODO: move to CodeEditorManager or something else - - public void setStripTrailingSpaces(String stripTrailingSpaces) { - myOptions.STRIP_TRAILING_SPACES = stripTrailingSpaces; - } - - public boolean isShowQuickDocOnMouseOverElement() { - return myOptions.SHOW_QUICK_DOC_ON_MOUSE_OVER_ELEMENT; - } - - public void setShowQuickDocOnMouseOverElement(boolean show) { - myOptions.SHOW_QUICK_DOC_ON_MOUSE_OVER_ELEMENT = show; - } - - public boolean isRefrainFromScrolling() { - return myOptions.REFRAIN_FROM_SCROLLING; - } - - public void setRefrainFromScrolling(boolean b) { - myOptions.REFRAIN_FROM_SCROLLING = b; - } - - @Override - public Object clone() { - EditorSettingsExternalizable copy = new EditorSettingsExternalizable(); - copy.myOptions = (OptionSet) myOptions.clone(); - copy.myBlockIndent = myBlockIndent; - //copy.myTabSize = myTabSize; - //copy.myUseTabCharacter = myUseTabCharacter; - copy.myAdditionalLinesCount = myAdditionalLinesCount; - copy.myAdditinalColumnsCount = myAdditinalColumnsCount; - copy.myLineMarkerAreaShown = myLineMarkerAreaShown; - - return copy; - } - - @Override - @NotNull - public String getComponentName() { - return "EditorSettings"; - } - - @Override - @NotNull - public File[] getExportFiles() { - return new File[]{PathManager.getOptionsFile(this)}; - } - - @Override - @NotNull - public String getPresentableName() { - return OptionsBundle.message("options.editor.settings.presentable.name"); - } - - public boolean isWhitespacesShown() { - return myOptions.IS_WHITESPACES_SHOWN; - } - - public void setWhitespacesShown(boolean val) { - myOptions.IS_WHITESPACES_SHOWN = val; - } - - public boolean isAllSoftWrapsShown() { - return myOptions.IS_ALL_SOFTWRAPS_SHOWN; - } - - public void setAllSoftwrapsShown(boolean val) { - myOptions.IS_ALL_SOFTWRAPS_SHOWN = val; - } - - public boolean isIndentGuidesShown() { - return myOptions.IS_INDENT_GUIDES_SHOWN; - } - - public void setIndentGuidesShown(boolean val) { - myOptions.IS_INDENT_GUIDES_SHOWN = val; - } - - public boolean isSmoothScrolling() { - return myOptions.IS_ANIMATED_SCROLLING; - } - - public void setSmoothScrolling(boolean val){ - myOptions.IS_ANIMATED_SCROLLING = val; - } - - public boolean isCamelWords() { - return myOptions.IS_CAMEL_WORDS; - } - - public void setCamelWords(boolean val) { - myOptions.IS_CAMEL_WORDS = val; - } - - public boolean isAdditionalPageAtBottom() { - return myOptions.ADDITIONAL_PAGE_AT_BOTTOM; - } - - public void setAdditionalPageAtBottom(boolean val) { - myOptions.ADDITIONAL_PAGE_AT_BOTTOM = val; - } - - public boolean isDndEnabled() { - return myOptions.IS_DND_ENABLED; - } - - public void setDndEnabled(boolean val) { - myOptions.IS_DND_ENABLED = val; - } - - public boolean isWheelFontChangeEnabled() { - return myOptions.IS_WHEEL_FONTCHANGE_ENABLED; - } - - public void setWheelFontChangeEnabled(boolean val) { - myOptions.IS_WHEEL_FONTCHANGE_ENABLED = val; - } - - public boolean isMouseClickSelectionHonorsCamelWords() { - return myOptions.IS_MOUSE_CLICK_SELECTION_HONORS_CAMEL_WORDS; - } - - public void setMouseClickSelectionHonorsCamelWords(boolean val) { - myOptions.IS_MOUSE_CLICK_SELECTION_HONORS_CAMEL_WORDS = val; - } - - public boolean isVariableInplaceRenameEnabled() { - return myOptions.RENAME_VARIABLES_INPLACE; - } - - public void setVariableInplaceRenameEnabled(final boolean val) { - myOptions.RENAME_VARIABLES_INPLACE = val; - } - - public boolean isPreselectRename() { - return myOptions.PRESELECT_RENAME; - } - - public void setPreselectRename(final boolean val) { - myOptions.PRESELECT_RENAME = val; - } - - - // returns true if something has been migrated - public boolean migrateCharsetSettingsTo(EncodingManager encodingManager) { - if (myOptions.DEFAULT_PROPERTIES_FILES_CHARSET_NAME != null) { - Charset charset = CharsetToolkit.forName(myOptions.DEFAULT_PROPERTIES_FILES_CHARSET_NAME); - if (charset != null) { - encodingManager.setDefaultCharsetForPropertiesFiles(null, charset); - encodingManager.setNative2AsciiForPropertiesFiles(null, myOptions.IS_NATIVE2ASCII_FOR_PROPERTIES_FILES); - } - return true; - } - return false; - } -} +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.editor.ex; + +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.components.ExportableApplicationComponent; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces; +import com.intellij.openapi.options.OptionsBundle; +import com.intellij.openapi.util.DefaultJDOMExternalizer; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.NamedJDOMExternalizable; +import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.openapi.vfs.encoding.EncodingManager; +import org.jdom.Element; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.File; +import java.lang.reflect.Field; +import java.nio.charset.Charset; +import java.util.EnumSet; +import java.util.Set; + +public class EditorSettingsExternalizable implements NamedJDOMExternalizable, ExportableApplicationComponent, Cloneable { + //Q: make it interface? + public static class OptionSet implements Cloneable { + public String LINE_SEPARATOR; + public String USE_SOFT_WRAPS; + public boolean USE_CUSTOM_SOFT_WRAP_INDENT = false; + public int CUSTOM_SOFT_WRAP_INDENT = 0; + public boolean IS_VIRTUAL_SPACE = true; + public boolean IS_CARET_INSIDE_TABS; + @NonNls public String STRIP_TRAILING_SPACES = "Changed"; + public boolean IS_ENSURE_NEWLINE_AT_EOF = false; + public boolean SHOW_QUICK_DOC_ON_MOUSE_OVER_ELEMENT = false; + public long QUICK_DOC_ON_MOUSE_OVER_DELAY_MS = 500; + public boolean IS_CARET_BLINKING = true; + public int CARET_BLINKING_PERIOD = 500; + public boolean IS_RIGHT_MARGIN_SHOWN = true; + public boolean ARE_LINE_NUMBERS_SHOWN = false; + public boolean IS_FOLDING_OUTLINE_SHOWN = true; + + public boolean SMART_HOME = true; + + public boolean IS_BLOCK_CURSOR = false; + public boolean IS_WHITESPACES_SHOWN = false; + public boolean IS_ALL_SOFTWRAPS_SHOWN = false; + public boolean IS_INDENT_GUIDES_SHOWN = true; + public boolean IS_ANIMATED_SCROLLING = true; + public boolean IS_CAMEL_WORDS = false; + public boolean ADDITIONAL_PAGE_AT_BOTTOM = false; + + public boolean IS_DND_ENABLED = true; + public boolean IS_WHEEL_FONTCHANGE_ENABLED = false; + public boolean IS_MOUSE_CLICK_SELECTION_HONORS_CAMEL_WORDS = true; + @Deprecated + public boolean IS_NATIVE2ASCII_FOR_PROPERTIES_FILES; + @Deprecated + public String DEFAULT_PROPERTIES_FILES_CHARSET_NAME; + + public boolean RENAME_VARIABLES_INPLACE = true; + public boolean PRESELECT_RENAME = true; + public boolean REFRAIN_FROM_SCROLLING = false; + + public boolean SHOW_REFORMAT_DIALOG = true; + public boolean SHOW_OPIMIZE_IMPORTS_DIALOG = true; + + @Override + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + return null; + } + } + } + + private static final String COMPOSITE_PROPERTY_SEPARATOR = ":"; + + private final Set myPlacesToUseSoftWraps = EnumSet.noneOf(SoftWrapAppliancePlaces.class); + private OptionSet myOptions = new OptionSet(); + private final PropertyChangeSupport myPropertyChangeSupport = new PropertyChangeSupport(this); + + private int myBlockIndent; + //private int myTabSize = 4; + //private boolean myUseTabCharacter = false; + + private int myAdditionalLinesCount = 10; + private int myAdditinalColumnsCount = 20; + private boolean myLineMarkerAreaShown = true; + + @NonNls public static final String STRIP_TRAILING_SPACES_NONE = "None"; + @NonNls public static final String STRIP_TRAILING_SPACES_CHANGED = "Changed"; + @NonNls public static final String STRIP_TRAILING_SPACES_WHOLE = "Whole"; + + + @NonNls public static final String DEFAULT_FONT_NAME = "Courier"; + + public static EditorSettingsExternalizable getInstance() { + final Application app = ApplicationManager.getApplication(); + if (app.isDisposed()) return new EditorSettingsExternalizable(); + return app.getComponent(EditorSettingsExternalizable.class); + } + + @Override + public void initComponent() { } + + @Override + public void disposeComponent() { + } + + public void addPropertyChangeListener(PropertyChangeListener listener){ + myPropertyChangeSupport.addPropertyChangeListener(listener); + } + + public void removePropertyChangeListener(PropertyChangeListener listener){ + myPropertyChangeSupport.removePropertyChangeListener(listener); + } + + @Override + public void readExternal(Element element) throws InvalidDataException { + DefaultJDOMExternalizer.readExternal(myOptions, element); + parseRawSoftWraps(); + } + + @Override + public void writeExternal(Element element) throws WriteExternalException { + DefaultJDOMExternalizer.writeExternal(myOptions, element, new DefaultJDOMExternalizer.JDOMFilter() { + @Override + public boolean isAccept(final Field field) { + return !field.getName().equals("IS_NATIVE2ASCII_FOR_PROPERTIES_FILES") && !field.getName().equals("DEFAULT_PROPERTIES_FILES_CHARSET_NAME"); + } + }); + } + + private void parseRawSoftWraps() { + if (myOptions.USE_SOFT_WRAPS == null || myOptions.USE_SOFT_WRAPS.isEmpty()) { + return; + } + + String[] placeNames = myOptions.USE_SOFT_WRAPS.split(COMPOSITE_PROPERTY_SEPARATOR); + for (String placeName : placeNames) { + try { + SoftWrapAppliancePlaces place = SoftWrapAppliancePlaces.valueOf(placeName); + if (place == SoftWrapAppliancePlaces.VCS_DIFF) { + // Don't keep separate setting for vcs diff window for now and let it share the value for main editor. + continue; + } + myPlacesToUseSoftWraps.add(place); + } + catch (IllegalArgumentException e) { + // Ignore bad value + } + } + + // There is a possible case that there were invalid/old format values. We want to replace them by up-to-date data. + storeRawSoftWraps(); + } + + private void storeRawSoftWraps() { + StringBuilder buffer = new StringBuilder(); + for (SoftWrapAppliancePlaces placeToStore : myPlacesToUseSoftWraps) { + buffer.append(placeToStore).append(COMPOSITE_PROPERTY_SEPARATOR); + } + if (buffer.length() > 0) { + buffer.setLength(buffer.length() - 1); + } + myOptions.USE_SOFT_WRAPS = buffer.toString(); + } + + @Override + public String getExternalFileName() { + return "editor"; + } + + public OptionSet getOptions() { + return myOptions; + } + + public boolean isRightMarginShown() { + return myOptions.IS_RIGHT_MARGIN_SHOWN; + } + + public void setRightMarginShown(boolean val) { + myOptions.IS_RIGHT_MARGIN_SHOWN = val; + } + + public boolean isLineNumbersShown() { + return myOptions.ARE_LINE_NUMBERS_SHOWN; + } + + public void setLineNumbersShown(boolean val) { + myOptions.ARE_LINE_NUMBERS_SHOWN = val; + } + + public int getAdditionalLinesCount() { + return myAdditionalLinesCount; + } + + public void setAdditionalLinesCount(int additionalLinesCount) { + myAdditionalLinesCount = additionalLinesCount; + } + + public int getAdditinalColumnsCount() { + return myAdditinalColumnsCount; + } + + public void setAdditionalColumnsCount(int additinalColumnsCount) { + myAdditinalColumnsCount = additinalColumnsCount; + } + + public boolean isLineMarkerAreaShown() { + return myLineMarkerAreaShown; + } + + public void setLineMarkerAreaShown(boolean lineMarkerAreaShown) { + myLineMarkerAreaShown = lineMarkerAreaShown; + } + + public boolean isFoldingOutlineShown() { + return myOptions.IS_FOLDING_OUTLINE_SHOWN; + } + + public void setFoldingOutlineShown(boolean val) { + myOptions.IS_FOLDING_OUTLINE_SHOWN = val; + } + + public boolean isBlockCursor() { + return myOptions.IS_BLOCK_CURSOR; + } + + public void setBlockCursor(boolean val) { + myOptions.IS_BLOCK_CURSOR = val; + } + + public int getBlockIndent() { + return myBlockIndent; + } + + public void setBlockIndent(int blockIndent) { + myBlockIndent = blockIndent; + } + + public boolean isSmartHome() { + return myOptions.SMART_HOME; + } + + public void setSmartHome(boolean val) { + myOptions.SMART_HOME = val; + } + + public boolean isUseSoftWraps() { + return isUseSoftWraps(SoftWrapAppliancePlaces.MAIN_EDITOR); + } + + public boolean isUseSoftWraps(@NotNull SoftWrapAppliancePlaces place) { + if (myPlacesToUseSoftWraps.contains(place)) { + return true; + } + + // For now use soft wraps at vcs diff if they are enabled for the main editors. + if (place == SoftWrapAppliancePlaces.VCS_DIFF) { + return myPlacesToUseSoftWraps.contains(SoftWrapAppliancePlaces.MAIN_EDITOR); + } + return false; + } + + public void setUseSoftWraps(boolean use) { + setUseSoftWraps(use, SoftWrapAppliancePlaces.MAIN_EDITOR); + } + + public void setUseSoftWraps(boolean use, @NotNull SoftWrapAppliancePlaces place) { + boolean update = use ^ myPlacesToUseSoftWraps.contains(place); + if (!update) { + return; + } + + if (use) { + myPlacesToUseSoftWraps.add(place); + } + else { + myPlacesToUseSoftWraps.remove(place); + } + storeRawSoftWraps(); + } + + public boolean isUseCustomSoftWrapIndent() { + return myOptions.USE_CUSTOM_SOFT_WRAP_INDENT; + } + + public void setUseCustomSoftWrapIndent(boolean use) { + myOptions.USE_CUSTOM_SOFT_WRAP_INDENT = use; + } + + public int getCustomSoftWrapIndent() { + return myOptions.CUSTOM_SOFT_WRAP_INDENT; + } + + public void setCustomSoftWrapIndent(int indent) { + myOptions.CUSTOM_SOFT_WRAP_INDENT = indent; + } + + public boolean isVirtualSpace() { + return myOptions.IS_VIRTUAL_SPACE; + } + + public void setVirtualSpace(boolean val) { + myOptions.IS_VIRTUAL_SPACE = val; + } + + public boolean isCaretInsideTabs() { + return myOptions.IS_CARET_INSIDE_TABS; + } + + public void setCaretInsideTabs(boolean val) { + myOptions.IS_CARET_INSIDE_TABS = val; + } + + public boolean isBlinkCaret() { + return myOptions.IS_CARET_BLINKING; + } + + public void setBlinkCaret(boolean blinkCaret) { + myOptions.IS_CARET_BLINKING = blinkCaret; + } + + public int getBlinkPeriod() { + return myOptions.CARET_BLINKING_PERIOD; + } + + public void setBlinkPeriod(int blinkInterval) { + myOptions.CARET_BLINKING_PERIOD = blinkInterval; + } + + + public boolean isEnsureNewLineAtEOF() { + return myOptions.IS_ENSURE_NEWLINE_AT_EOF; + } + + public void setEnsureNewLineAtEOF(boolean ensure) { + myOptions.IS_ENSURE_NEWLINE_AT_EOF = ensure; + } + + public String getStripTrailingSpaces() { + return myOptions.STRIP_TRAILING_SPACES; + } // TODO: move to CodeEditorManager or something else + + public void setStripTrailingSpaces(String stripTrailingSpaces) { + myOptions.STRIP_TRAILING_SPACES = stripTrailingSpaces; + } + + public boolean isShowQuickDocOnMouseOverElement() { + return myOptions.SHOW_QUICK_DOC_ON_MOUSE_OVER_ELEMENT; + } + + public void setShowQuickDocOnMouseOverElement(boolean show) { + myOptions.SHOW_QUICK_DOC_ON_MOUSE_OVER_ELEMENT = show; + } + + public long getQuickDocOnMouseOverElementDelayMillis() { + return myOptions.QUICK_DOC_ON_MOUSE_OVER_DELAY_MS; + } + + public void setQuickDocOnMouseOverElementDelayMillis(long delay) throws IllegalArgumentException { + if (delay <= 0) { + throw new IllegalArgumentException(String.format( + "Non-positive delay for the 'show quick doc on mouse over element' value detected! Expected positive value but got %d", + delay + )); + } + myOptions.QUICK_DOC_ON_MOUSE_OVER_DELAY_MS = delay; + } + + public boolean isRefrainFromScrolling() { + return myOptions.REFRAIN_FROM_SCROLLING; + } + + public void setRefrainFromScrolling(boolean b) { + myOptions.REFRAIN_FROM_SCROLLING = b; + } + + @Override + public Object clone() { + EditorSettingsExternalizable copy = new EditorSettingsExternalizable(); + copy.myOptions = (OptionSet) myOptions.clone(); + copy.myBlockIndent = myBlockIndent; + //copy.myTabSize = myTabSize; + //copy.myUseTabCharacter = myUseTabCharacter; + copy.myAdditionalLinesCount = myAdditionalLinesCount; + copy.myAdditinalColumnsCount = myAdditinalColumnsCount; + copy.myLineMarkerAreaShown = myLineMarkerAreaShown; + + return copy; + } + + @Override + @NotNull + public String getComponentName() { + return "EditorSettings"; + } + + @Override + @NotNull + public File[] getExportFiles() { + return new File[]{PathManager.getOptionsFile(this)}; + } + + @Override + @NotNull + public String getPresentableName() { + return OptionsBundle.message("options.editor.settings.presentable.name"); + } + + public boolean isWhitespacesShown() { + return myOptions.IS_WHITESPACES_SHOWN; + } + + public void setWhitespacesShown(boolean val) { + myOptions.IS_WHITESPACES_SHOWN = val; + } + + public boolean isAllSoftWrapsShown() { + return myOptions.IS_ALL_SOFTWRAPS_SHOWN; + } + + public void setAllSoftwrapsShown(boolean val) { + myOptions.IS_ALL_SOFTWRAPS_SHOWN = val; + } + + public boolean isIndentGuidesShown() { + return myOptions.IS_INDENT_GUIDES_SHOWN; + } + + public void setIndentGuidesShown(boolean val) { + myOptions.IS_INDENT_GUIDES_SHOWN = val; + } + + public boolean isSmoothScrolling() { + return myOptions.IS_ANIMATED_SCROLLING; + } + + public void setSmoothScrolling(boolean val){ + myOptions.IS_ANIMATED_SCROLLING = val; + } + + public boolean isCamelWords() { + return myOptions.IS_CAMEL_WORDS; + } + + public void setCamelWords(boolean val) { + myOptions.IS_CAMEL_WORDS = val; + } + + public boolean isAdditionalPageAtBottom() { + return myOptions.ADDITIONAL_PAGE_AT_BOTTOM; + } + + public void setAdditionalPageAtBottom(boolean val) { + myOptions.ADDITIONAL_PAGE_AT_BOTTOM = val; + } + + public boolean isDndEnabled() { + return myOptions.IS_DND_ENABLED; + } + + public void setDndEnabled(boolean val) { + myOptions.IS_DND_ENABLED = val; + } + + public boolean isWheelFontChangeEnabled() { + return myOptions.IS_WHEEL_FONTCHANGE_ENABLED; + } + + public void setWheelFontChangeEnabled(boolean val) { + myOptions.IS_WHEEL_FONTCHANGE_ENABLED = val; + } + + public boolean isMouseClickSelectionHonorsCamelWords() { + return myOptions.IS_MOUSE_CLICK_SELECTION_HONORS_CAMEL_WORDS; + } + + public void setMouseClickSelectionHonorsCamelWords(boolean val) { + myOptions.IS_MOUSE_CLICK_SELECTION_HONORS_CAMEL_WORDS = val; + } + + public boolean isVariableInplaceRenameEnabled() { + return myOptions.RENAME_VARIABLES_INPLACE; + } + + public void setVariableInplaceRenameEnabled(final boolean val) { + myOptions.RENAME_VARIABLES_INPLACE = val; + } + + public boolean isPreselectRename() { + return myOptions.PRESELECT_RENAME; + } + + public void setPreselectRename(final boolean val) { + myOptions.PRESELECT_RENAME = val; + } + + + // returns true if something has been migrated + public boolean migrateCharsetSettingsTo(EncodingManager encodingManager) { + if (myOptions.DEFAULT_PROPERTIES_FILES_CHARSET_NAME != null) { + Charset charset = CharsetToolkit.forName(myOptions.DEFAULT_PROPERTIES_FILES_CHARSET_NAME); + if (charset != null) { + encodingManager.setDefaultCharsetForPropertiesFiles(null, charset); + encodingManager.setNative2AsciiForPropertiesFiles(null, myOptions.IS_NATIVE2ASCII_FOR_PROPERTIES_FILES); + } + return true; + } + return false; + } +}