From 2a1786665813328712d6e8d4ebbd211a90a8f97c Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Thu, 7 Sep 2017 13:44:32 +0300 Subject: [PATCH] Visual indent guides (soft margins) initial implementation (IDEA-99875) --- .../openapi/editor/EditorSettings.java | 22 +++- .../openapi/editor/colors/EditorColors.java | 2 + .../psi/codeStyle/CodeStyleSettings.java | 49 +++++++ .../codeStyle/CommonCodeStyleSettings.java | 15 +++ .../CommonCodeStyleSettingsManager.java | 1 + .../intellij/psi/codeStyle/SoftMargins.java | 109 ++++++++++++++++ .../CodeStyleSettingPresentation.java | 8 +- .../CodeStyleSoftMarginsPresentation.java | 27 ++++ .../options/CodeStyleAbstractPanel.java | 6 + .../options/GeneralCodeStylePanel.form | 117 ++++++++++++----- .../options/GeneralCodeStylePanel.java | 66 +++++----- .../CustomizableLanguageCodeStylePanel.java | 4 +- .../OptionTableWithPreviewPanel.java | 115 +++++++++++------ .../options/codeStyle/RightMarginForm.form | 42 +++++- .../options/codeStyle/RightMarginForm.java | 26 +++- .../codeStyle/WrappingAndBracesPanel.java | 122 ++++++++++++++++-- .../colors/pages/GeneralColorsPage.java | 2 + .../ui/components/ValidatingTextField.java | 49 ++----- .../fields/AbstractValueInputField.java | 105 +++++++++++++++ .../fields/CommaSeparatedIntegersField.java | 79 ++++++++++++ .../ui/components/fields/IntegerField.java | 61 +++++++++ .../openapi/editor/impl/SettingsImpl.java | 20 +++ .../editor/impl/view/EditorPainter.java | 39 +++++- .../src/messages/ApplicationBundle.properties | 10 +- .../src/messages/OptionsBundle.properties | 7 +- .../src/DefaultColorSchemesManager.xml | 2 + .../CodeStyleConfigurationTest.java | 37 +++++- .../options/CodeStyleHtmlPanel.java | 3 +- .../options/CodeStyleXmlPanel.java | 4 +- 29 files changed, 965 insertions(+), 184 deletions(-) create mode 100644 platform/lang-api/src/com/intellij/psi/codeStyle/SoftMargins.java create mode 100644 platform/lang-api/src/com/intellij/psi/codeStyle/presentation/CodeStyleSoftMarginsPresentation.java create mode 100644 platform/platform-api/src/com/intellij/ui/components/fields/AbstractValueInputField.java create mode 100644 platform/platform-api/src/com/intellij/ui/components/fields/CommaSeparatedIntegersField.java create mode 100644 platform/platform-api/src/com/intellij/ui/components/fields/IntegerField.java diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java index cca0b569d21d8..270e363868577 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/EditorSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 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. @@ -16,6 +16,10 @@ package com.intellij.openapi.editor; import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; public interface EditorSettings { boolean isRightMarginShown(); @@ -36,6 +40,22 @@ public interface EditorSettings { int getRightMargin(Project project); void setRightMargin(int myRightMargin); + /** + * Retrieves a list of soft margins (visual indent guides) to be used in the editor. If soft margins haven't been explicitly set + * with {@link #setSoftMargins(List)} method, they are obtained from code style settings: {@code CodeStyleSettings.getSoftMargins()}. + * @return A list of current editor soft margins. The list may be empty if no soft margins are defined. + */ + @NotNull + List getSoftMargins(); + + /** + * Explicitly sets soft margins (visual indent guides) to be used in the editor instead of obtaining them from code style settings via + * {@code CodeStyleSettings.getSoftMargins()} method. It is important to distinguish and empty list from {@code null} value: the first + * will define no soft margins for the eidtor while the latter will restore the default behavior of using them from code style settings. + * @param softMargins A list of soft margins or {@code null} to use margins from code style settings. + */ + void setSoftMargins(@Nullable List softMargins); + boolean isWrapWhenTypingReachesRightMargin(Project project); void setWrapWhenTypingReachesRightMargin(boolean val); diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColors.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColors.java index 451f9adf6d6fb..16c133297ea19 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColors.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColors.java @@ -73,4 +73,6 @@ public interface EditorColors { TextAttributesKey BREADCRUMBS_HOVERED = TextAttributesKey.createTextAttributesKey("BREADCRUMBS_HOVERED"); TextAttributesKey BREADCRUMBS_CURRENT = TextAttributesKey.createTextAttributesKey("BREADCRUMBS_CURRENT"); TextAttributesKey BREADCRUMBS_INACTIVE = TextAttributesKey.createTextAttributesKey("BREADCRUMBS_INACTIVE"); + + ColorKey VISUAL_INDENT_GUIDE_COLOR = ColorKey.createColorKey("VISUAL_INDENT_GUIDE"); } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java index e059584cdb838..d167985c52d53 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java @@ -183,6 +183,7 @@ private void copyCustomSettingsFrom(@NotNull CodeStyleSettings from) { public void copyFrom(CodeStyleSettings from) { copyPublicFields(from, this); copyPublicFields(from.OTHER_INDENT_OPTIONS, OTHER_INDENT_OPTIONS); + mySoftMargins.setValues(from.getSoftMargins()); copyCustomSettingsFrom(from); } @@ -760,6 +761,8 @@ public void readExternal(Element element) throws InvalidDataException { IGNORE_SAME_INDENTS_FOR_LANGUAGES = true; } + mySoftMargins.deserializeFrom(element); + migrateLegacySettings(); } @@ -768,6 +771,7 @@ public void writeExternal(Element element) throws WriteExternalException { setVersion(element, myVersion); CodeStyleSettings parentSettings = new CodeStyleSettings(); DefaultJDOMExternalizer.writeExternal(this, element, new DifferenceFilter<>(this, parentSettings)); + mySoftMargins.serializeInto(element); myUnknownElementWriter.write(element, getCustomSettingsValues(), CustomCodeStyleSettings::getTagName, settings -> { CustomCodeStyleSettings parentCustomSettings = parentSettings.getCustomSettings(settings.getClass()); @@ -1302,4 +1306,49 @@ public boolean isAccept(@NotNull Field field) { public int getVersion() { return myVersion; } + + /** + * Returns soft margins (visual indent guides positions) for the language. If language settings do not exists or language soft margins are + * empty, default (root) soft margins are returned. + * @param language The language to retrieve soft margins for or {@code null} for default soft margins. + * @return Language or default soft margins. + * @see #getDefaultSoftMargins() + */ + @NotNull + public List getSoftMargins(@Nullable Language language) { + if (language != null) { + CommonCodeStyleSettings languageSettings = getCommonSettings(language); + if (languageSettings != null && !languageSettings.getSoftMargins().isEmpty()) { + return languageSettings.getSoftMargins(); + } + } + return getDefaultSoftMargins(); + } + + /** + * Set soft margins (visual indent guides) for the language. Note: language code style settings must exist. + * @param language The language to set soft margins for. + * @param softMargins The soft margins to set. + */ + public void setSoftMargins(@NotNull Language language, List softMargins) { + CommonCodeStyleSettings languageSettings = getCommonSettings(language); + assert languageSettings != null : "Settings for language " + language.getDisplayName() + " do not exist"; + languageSettings.setSoftMargins(softMargins); + } + + /** + * @return Default (root) soft margins used for languages not defining them explicitly. + */ + @NotNull + public List getDefaultSoftMargins() { + return getSoftMargins(); + } + + /** + * Sets the default soft margins used for languages not defining them explicitly. + * @param softMargins The default soft margins. + */ + public void setDefaultSoftMargins(List softMargins) { + setSoftMargins(softMargins); + } } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java index bdd8fa40b19a2..a734df96de608 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java @@ -35,6 +35,7 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; +import java.util.List; import java.util.Set; /** @@ -59,6 +60,8 @@ public class CommonCodeStyleSettings { private final FileType myFileType; private boolean myForceArrangeMenuAvailable; + protected SoftMargins mySoftMargins = new SoftMargins(); + @NonNls private static final String INDENT_OPTIONS_TAG = "indentOptions"; public CommonCodeStyleSettings(Language language, FileType fileType) { @@ -129,6 +132,7 @@ public CommonCodeStyleSettings clone(@NotNull CodeStyleSettings rootSettings) { if (myArrangementSettings != null) { commonSettings.setArrangementSettings(myArrangementSettings.clone()); } + commonSettings.setSoftMargins(getSoftMargins()); return commonSettings; } @@ -167,6 +171,7 @@ public void readExternal(Element element) throws InvalidDataException { if (arrangementRulesContainer != null) { myArrangementSettings = ArrangementUtil.readExternal(arrangementRulesContainer, myLanguage); } + mySoftMargins.deserializeFrom(element); } public void writeExternal(Element element) throws WriteExternalException { @@ -177,6 +182,7 @@ public void writeExternal(Element element) throws WriteExternalException { supportedFields.add("FORCE_REARRANGE_MODE"); } DefaultJDOMExternalizer.writeExternal(this, element, new SupportedFieldsDiffFilter(this, supportedFields, defaultSettings)); + mySoftMargins.serializeInto(element); if (myIndentOptions != null) { IndentOptions defaultIndentOptions = defaultSettings != null ? defaultSettings.getIndentOptions() : null; Element indentOptionsElement = new Element(INDENT_OPTIONS_TAG); @@ -1074,4 +1080,13 @@ protected boolean arrangementSettingsEqual(CommonCodeStyleSettings obj) { } return Comparing.equal(theseSettings, obj.getArrangementSettings()); } + + @NotNull + public List getSoftMargins() { + return mySoftMargins.getValues(); + } + + void setSoftMargins(List values) { + mySoftMargins.setValues(values); + } } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java index f4c229c21b212..5812017c72f16 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettingsManager.java @@ -234,6 +234,7 @@ public static void copy(@NotNull CommonCodeStyleSettings source, @NotNull Common CommonCodeStyleSettings.copyPublicFields(sourceIndentOptions, targetIndentOptions); } } + target.setSoftMargins(source.getSoftMargins()); } @Override diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/SoftMargins.java b/platform/lang-api/src/com/intellij/psi/codeStyle/SoftMargins.java new file mode 100644 index 0000000000000..a0d58fdfe502a --- /dev/null +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/SoftMargins.java @@ -0,0 +1,109 @@ +/* + * Copyright 2000-2017 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.psi.codeStyle; + +import com.intellij.util.xmlb.XmlSerializer; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +class SoftMargins implements Cloneable { + + private List myValues; + + @SuppressWarnings("unused") // Serialization getter + @Nullable + public String getSOFT_MARGINS() { + return myValues != null ? toString() : null; + } + + @SuppressWarnings("unused") // Serialization setter + public void setSOFT_MARGINS(@Nullable String valueList) { + if (valueList != null) { + String[] values = valueList.split(",\\s*"); + myValues = new ArrayList<>(values.length); + int i = 0; + for (String value : values) { + try { + myValues.add(Integer.parseInt(value)); + } + catch (NumberFormatException nfe) { + myValues = null; + return; + } + } + Collections.sort(myValues); + } + } + + @NotNull + List getValues() { + return myValues != null ? myValues : Collections.emptyList(); + } + + void setValues(List values) { + if (values != null) { + myValues = new ArrayList<>(values); + Collections.sort(myValues); + } + else { + myValues = null; + } + } + + @SuppressWarnings("MethodDoesntCallSuperMethod") + @Override + public Object clone() { + SoftMargins copy = new SoftMargins(); + copy.setValues(myValues); + return copy; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof SoftMargins) { + List otherMargins = ((SoftMargins)obj).getValues(); + return otherMargins.equals(getValues()); + } + return false; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (myValues != null) { + for (int margin: myValues) { + if (sb.length() > 0) sb.append(","); + sb.append(margin); + } + } + return sb.toString(); + } + + public void serializeInto(@NotNull Element element) { + if (myValues != null && myValues.size() > 0) { + XmlSerializer.serializeInto(this, element); + } + } + + public void deserializeFrom(@NotNull Element element) { + XmlSerializer.deserializeInto(this, element); + } +} diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/presentation/CodeStyleSettingPresentation.java b/platform/lang-api/src/com/intellij/psi/codeStyle/presentation/CodeStyleSettingPresentation.java index 805630b12e6c8..16aae5f046399 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/presentation/CodeStyleSettingPresentation.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/presentation/CodeStyleSettingPresentation.java @@ -289,12 +289,12 @@ protected static void putGroupTop(@NotNull Map replaceText(finalProject), null, null); myEditor.getSettings().setRightMargin(getAdjustedRightMargin()); + myEditor.getSettings().setSoftMargins(getCurrentSoftMargins()); myLastDocumentModificationStamp = myEditor.getDocument().getModificationStamp(); myEditor.getScrollingModel().scrollVertically(currOffs); } + private List getCurrentSoftMargins() { + return getSettings().getSoftMargins(getDefaultLanguage()); + } + private int getAdjustedRightMargin() { int result = getRightMargin(); return result > 0 ? result : CodeStyleFacade.getInstance(ProjectUtil.guessCurrentProject(getPanel())).getRightMargin(getDefaultLanguage()); diff --git a/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.form b/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.form index 842cdb664f35d..2b73ef2eb8384 100644 --- a/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.form @@ -2,43 +2,26 @@
- + - + - - - - - - - - - - - - - - - - - - + - + @@ -60,7 +43,7 @@ - + @@ -122,23 +105,23 @@ - + - + - + - + - + @@ -146,31 +129,97 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + + + + + + + + + + + + + + + + + - + diff --git a/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.java b/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.java index f0f03866e53ba..2c478d9181f6d 100644 --- a/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/GeneralCodeStylePanel.java @@ -24,6 +24,7 @@ import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypes; +import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.ex.ConfigurableWrapper; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.MessageType; @@ -38,12 +39,16 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.FileIndentOptionsProvider; import com.intellij.ui.IdeBorderFactory; -import com.intellij.ui.LightColors; +import com.intellij.ui.JBColor; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.components.GradientViewport; +import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.components.JBLabel; +import com.intellij.ui.components.fields.CommaSeparatedIntegersField; +import com.intellij.ui.components.fields.IntegerField; import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,13 +70,11 @@ public class GeneralCodeStylePanel extends CodeStyleAbstractPanel { private static final String MACINTOSH_STRING = ApplicationBundle.message("combobox.crlf.mac"); private final List myAdditionalOptions; - private JTextField myRightMarginField; - private int myDefaultRightMargin; - private Color myInitialRightMarginFieldColor; + private IntegerField myRightMarginField; private JComboBox myLineSeparatorCombo; private JPanel myPanel; - private JCheckBox myCbWrapWhenTypingReachesRightMargin; + private JBCheckBox myCbWrapWhenTypingReachesRightMargin; private JCheckBox myEnableFormatterTags; private JTextField myFormatterOnTagField; private JTextField myFormatterOffTagField; @@ -83,8 +86,11 @@ public class GeneralCodeStylePanel extends CodeStyleAbstractPanel { private JPanel myAdditionalSettingsPanel; private JCheckBox myAutodetectIndentsBox; private JCheckBox myShowDetectedIndentNotification; - private JPanel myDefaultOptionsPanel; private JPanel myIndentsDetectionPanel; + private CommaSeparatedIntegersField myVisualGuides; + private JBLabel myVisualGuidesHint; + private JBLabel myLineSeparatorHint; + private JBLabel myVisualGuidesLabel; private final JScrollPane myScrollPane; @@ -101,9 +107,7 @@ public GeneralCodeStylePanel(CodeStyleSettings settings) { myLineSeparatorCombo.addItem(MACINTOSH_STRING); addPanelToWatch(myPanel); - myDefaultRightMargin = settings.getDefaultRightMargin(); - myRightMarginField.setHorizontalAlignment(SwingConstants.RIGHT); - myInitialRightMarginFieldColor = myRightMarginField.getBackground(); + myRightMarginField.setDefaultValue(settings.getDefaultRightMargin()); myEnableFormatterTags.addActionListener(new ActionListener() { @Override @@ -121,13 +125,9 @@ public void actionPerformed(ActionEvent e) { } }); - myDefaultOptionsPanel - .setBorder(IdeBorderFactory.createTitledBorder(ApplicationBundle.message("settings.code.style.general.default.options"))); myIndentsDetectionPanel .setBorder(IdeBorderFactory.createTitledBorder(ApplicationBundle.message("settings.code.style.general.indents.detection"))); - myMarkersPanel.setBorder(IdeBorderFactory.createTitledBorder( - ApplicationBundle.message("settings.code.style.general.formatter.marker.title"), true)); myMarkerOptionsPanel.setBorder( IdeBorderFactory.createTitledBorder(ApplicationBundle.message("settings.code.style.general.formatter.marker.options.title"), true)); myPanel.setBorder(JBUI.Borders.empty(0, 10)); @@ -143,6 +143,12 @@ public void actionPerformed(ActionEvent e) { myAdditionalSettingsPanel.add(generalSettingsComponent); } } + + myVisualGuidesLabel.setText(ApplicationBundle.message("settings.code.style.visual.guides") + ":"); + myVisualGuidesHint.setForeground(JBColor.GRAY); + myVisualGuidesHint.setFont(UIUtil.getLabelFont(UIUtil.FontSize.SMALL)); + myLineSeparatorHint.setForeground(JBColor.GRAY); + myLineSeparatorHint.setFont(UIUtil.getLabelFont(UIUtil.FontSize.SMALL)); } @Override @@ -153,21 +159,7 @@ protected void somethingChanged() { @Override protected int getRightMargin() { - String text = myRightMarginField.getText(); - int rightMargin; - myRightMarginField.setBackground(myInitialRightMarginFieldColor); - try { - rightMargin = Integer.parseInt(text); - if (rightMargin < 1 || rightMargin > CodeStyleSettings.MAX_RIGHT_MARGIN) { - rightMargin = myDefaultRightMargin; - myRightMarginField.setBackground(LightColors.RED); - } - } - catch (NumberFormatException nfe) { - myRightMarginField.setBackground(LightColors.RED); - rightMargin = myDefaultRightMargin; - } - return rightMargin; + return myRightMarginField.getValue(); } @Override @@ -183,7 +175,11 @@ protected String getPreviewText() { @Override - public void apply(CodeStyleSettings settings) { + public void apply(CodeStyleSettings settings) throws ConfigurationException { + myVisualGuides.validateContent(); + myRightMarginField.validateContent(); + settings.setDefaultSoftMargins(myVisualGuides.getValue()); + settings.LINE_SEPARATOR = getSelectedLineSeparator(); settings.setDefaultRightMargin(getRightMargin()); @@ -208,6 +204,13 @@ public void apply(CodeStyleSettings settings) { } } + private void createUIComponents() { + myRightMarginField = new IntegerField(0, CodeStyleSettings.MAX_RIGHT_MARGIN); + myRightMarginField.setName(ApplicationBundle.message("editbox.right.margin.columns")); + myVisualGuides = new CommaSeparatedIntegersField(0, CodeStyleSettings.MAX_RIGHT_MARGIN, "Optional"); + myVisualGuides.setName(ApplicationBundle.message("settings.code.style.visual.guides")); + } + @Nullable private static Pattern compilePattern(CodeStyleSettings settings, JTextField field, String patternText) { try { @@ -245,6 +248,8 @@ else if (WINDOWS_STRING.equals(myLineSeparatorCombo.getSelectedItem())) { @Override public boolean isModified(CodeStyleSettings settings) { + if (!myVisualGuides.getValue().equals(settings.getDefaultSoftMargins())) return true; + if (!Comparing.equal(getSelectedLineSeparator(), settings.LINE_SEPARATOR)) { return true; } @@ -288,6 +293,7 @@ public JComponent getPanel() { @Override protected void resetImpl(final CodeStyleSettings settings) { + myVisualGuides.setValue(settings.getDefaultSoftMargins()); String lineSeparator = settings.LINE_SEPARATOR; if ("\n".equals(lineSeparator)) { @@ -303,7 +309,7 @@ else if ("\r".equals(lineSeparator)) { myLineSeparatorCombo.setSelectedItem(SYSTEM_DEPENDANT_STRING); } - myRightMarginField.setText(String.valueOf(settings.getDefaultRightMargin())); + myRightMarginField.setValue(settings.getDefaultRightMargin()); myCbWrapWhenTypingReachesRightMargin.setSelected(settings.WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN); myAcceptRegularExpressionsCheckBox.setSelected(settings.FORMATTER_TAGS_ACCEPT_REGEXP); diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java index fbf5cd0ca3fae..c332cd87fb3ed 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CustomizableLanguageCodeStylePanel.java @@ -196,8 +196,8 @@ protected abstract static class OrderedOption { @Nullable private final String anchorOptionName; protected OrderedOption(@NotNull String optionName, - OptionAnchor anchor, - String anchorOptionName) { + @Nullable OptionAnchor anchor, + @Nullable String anchorOptionName) { this.optionName = optionName; this.anchor = anchor; this.anchorOptionName = anchorOptionName; diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java index 15a2994366454..4b2693f7fa53e 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java @@ -133,7 +133,7 @@ public void showStandardOptions(String... optionNames) { for (Option each : myOptions) { each.setEnabled(false); for (String optionName : optionNames) { - if (each.field.getName().equals(optionName)) { + if (each.getOptionName().equals(optionName)) { each.setEnabled(true); } } @@ -174,7 +174,7 @@ public void showCustomOption(Class settingsCl } else { for (Option each : myCustomOptions) { - if (each.clazz == settingsClass && each.field.getName().equals(fieldName)) { + if (each instanceof FieldOption && ((FieldOption)each).clazz == settingsClass && each.getOptionName().equals(fieldName)) { each.setEnabled(true); } } @@ -186,13 +186,17 @@ public void renameStandardOption(String fieldName, String newTitle) { myRenamedFields.put(fieldName, newTitle); } + public void showOption(@NotNull String optionName) { + myAllowedOptions.add(optionName); + } + protected TreeTable createOptionsTree(CodeStyleSettings settings) { DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(); Map groupsMap = new THashMap<>(); List