/* * Copyright 2000-2009 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.codeInsight.daemon.DaemonCodeAnalyzerSettings; import com.intellij.codeInsight.hints.InlayParameterHintsProvider; import com.intellij.codeInsight.hints.settings.ParameterNameHintsConfigurable; import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.options.CompositeConfigurable; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.options.ex.ConfigurableWrapper; import com.intellij.ui.components.JBCheckBox; import consulo.annotations.RequiredDispatchThread; import org.jetbrains.annotations.Nls; import javax.swing.*; import java.awt.*; import java.util.List; /** * To provide additional options in Editor | Appearance section register implementation of {@link com.intellij.openapi.options.UnnamedConfigurable} in the plugin.xml: * <p/> * <extensions defaultExtensionNs="com.intellij"><br> *   <editorAppearanceConfigurable instance="class-name"/><br> * </extensions> * <p> * A new instance of the specified class will be created each time then the Settings dialog is opened * * @author yole */ public class EditorAppearanceConfigurable extends CompositeConfigurable<UnnamedConfigurable> implements Configurable { private static final ExtensionPointName<EditorAppearanceConfigurableEP> EP_NAME = ExtensionPointName.create("com.intellij.editorAppearanceConfigurable"); private JPanel myRootPanel; private JCheckBox myCbBlinkCaret; private JCheckBox myCbBlockCursor; private JCheckBox myCbRightMargin; private JCheckBox myCbShowLineNumbers; private JCheckBox myCbShowWhitespaces; private JTextField myBlinkIntervalField; private JPanel myAddonPanel; private JCheckBox myCbShowMethodSeparators; private JCheckBox myShowVerticalIndentGuidesCheckBox; private JBCheckBox myShowParameterNameHints; private JButton myConfigureParameterHintsButton; private JPanel myParameterHintsSettingsPanel; public EditorAppearanceConfigurable() { myCbBlinkCaret.addActionListener(event -> myBlinkIntervalField.setEnabled(myCbBlinkCaret.isSelected())); initInlaysPanel(); } private void initInlaysPanel() { boolean isInlayProvidersAvailable = InlayParameterHintsProvider.EP.hasAnyExtensions(); myParameterHintsSettingsPanel.setVisible(isInlayProvidersAvailable); if (!isInlayProvidersAvailable) return; myConfigureParameterHintsButton.addActionListener(e -> { ParameterNameHintsConfigurable configurable = new ParameterNameHintsConfigurable(); configurable.show(); }); } private void applyNameHintsSettings() { EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); settings.setShowParameterNameHints(myShowParameterNameHints.isSelected()); } @RequiredDispatchThread @Override public void reset() { EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); myCbShowMethodSeparators.setSelected(DaemonCodeAnalyzerSettings.getInstance().SHOW_METHOD_SEPARATORS); myCbBlinkCaret.setSelected(editorSettings.isBlinkCaret()); myBlinkIntervalField.setText(Integer.toString(editorSettings.getBlinkPeriod())); myBlinkIntervalField.setEnabled(editorSettings.isBlinkCaret()); myCbRightMargin.setSelected(editorSettings.isRightMarginShown()); myCbShowLineNumbers.setSelected(editorSettings.isLineNumbersShown()); myCbBlockCursor.setSelected(editorSettings.isBlockCursor()); myCbShowWhitespaces.setSelected(editorSettings.isWhitespacesShown()); myShowVerticalIndentGuidesCheckBox.setSelected(editorSettings.isIndentGuidesShown()); myShowParameterNameHints.setSelected(editorSettings.isShowParameterNameHints()); super.reset(); } @RequiredDispatchThread @Override public void apply() throws ConfigurationException { EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); editorSettings.setBlinkCaret(myCbBlinkCaret.isSelected()); try { editorSettings.setBlinkPeriod(Integer.parseInt(myBlinkIntervalField.getText())); } catch (NumberFormatException ignored) { } editorSettings.setBlockCursor(myCbBlockCursor.isSelected()); editorSettings.setRightMarginShown(myCbRightMargin.isSelected()); editorSettings.setLineNumbersShown(myCbShowLineNumbers.isSelected()); editorSettings.setWhitespacesShown(myCbShowWhitespaces.isSelected()); editorSettings.setIndentGuidesShown(myShowVerticalIndentGuidesCheckBox.isSelected()); EditorOptionsPanel.reinitAllEditors(); DaemonCodeAnalyzerSettings.getInstance().SHOW_METHOD_SEPARATORS = myCbShowMethodSeparators.isSelected(); EditorOptionsPanel.restartDaemons(); applyNameHintsSettings(); super.apply(); } @RequiredDispatchThread @Override public boolean isModified() { if (super.isModified()) return true; EditorSettingsExternalizable editorSettings = EditorSettingsExternalizable.getInstance(); boolean isModified = isModified(myCbBlinkCaret, editorSettings.isBlinkCaret()); isModified |= isModified(myBlinkIntervalField, editorSettings.getBlinkPeriod()); isModified |= isModified(myCbBlockCursor, editorSettings.isBlockCursor()); isModified |= isModified(myCbRightMargin, editorSettings.isRightMarginShown()); isModified |= isModified(myCbShowLineNumbers, editorSettings.isLineNumbersShown()); isModified |= isModified(myCbShowWhitespaces, editorSettings.isWhitespacesShown()); isModified |= isModified(myShowVerticalIndentGuidesCheckBox, editorSettings.isIndentGuidesShown()); isModified |= isModified(myCbShowMethodSeparators, DaemonCodeAnalyzerSettings.getInstance().SHOW_METHOD_SEPARATORS); isModified |= myShowParameterNameHints.isSelected() != editorSettings.isShowParameterNameHints(); 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; } } @Override @Nls public String getDisplayName() { return "Gutters"; } @Override public String getHelpTopic() { return "reference.settingsdialog.IDE.editor.appearance"; } @RequiredDispatchThread @Override public JComponent createComponent() { for (UnnamedConfigurable provider : getConfigurables()) { myAddonPanel.add(provider.createComponent(), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,15,0), 0,0)); } return myRootPanel; } @RequiredDispatchThread @Override public void disposeUIResources() { myAddonPanel.removeAll(); super.disposeUIResources(); } @Override protected List<UnnamedConfigurable> createConfigurables() { return ConfigurableWrapper.createConfigurables(EP_NAME); } }