From 08ecb06551c1c2a8d278e379a342656192ae4075 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Thu, 4 Aug 2016 23:09:02 +0300 Subject: [PATCH 01/17] IDEA-158861 UI for activation of semantic highlighting and rainbow colors customization --- .../colors/pages/JavaColorSettingsPage.java | 45 +++- .../codeHighlighting/RainbowHighlighter.java | 19 +- .../EditorSchemeAttributeDescriptor.java | 6 +- ...itorSchemeAttributeDescriptorWithPath.java | 20 ++ .../colors/RainbowColorSettingsPage.java | 26 +++ .../options/colors/ClickNavigator.java | 1 + .../colors/ColorAndFontDescription.java | 3 +- .../colors/ColorAndFontDescriptionPanel.java | 14 +- .../colors/ColorAndFontGlobalState.java | 54 +++++ .../options/colors/ColorAndFontOptions.java | 65 +++++- .../options/colors/ColorOptionsTree.java | 12 +- .../options/colors/ColorSettingsUtil.java | 4 - .../colors/CustomizedSwitcherPanel.java | 192 +++++++++++++++++ .../options/colors/FontOptions.java | 2 +- .../options/colors/NewColorAndFontPanel.java | 11 +- .../options/colors/OptionsPanelImpl.java | 12 +- .../colors/RainbowAttributeDescriptor.java | 153 ++++++++++++++ .../colors/RainbowDescriptionPanel.form | 199 ++++++++++++++++++ .../colors/RainbowDescriptionPanel.java | 155 ++++++++++++++ .../options/colors/SchemesPanel.java | 9 +- .../options/colors/SimpleEditorPreview.java | 89 +++++--- .../colors/highlighting/HighlightData.java | 4 + .../settings/DiffColorDescriptionPanel.java | 11 +- .../src/messages/ApplicationBundle.properties | 6 +- 24 files changed, 1024 insertions(+), 88 deletions(-) rename platform/{lang-impl/src/com/intellij/application/options => editor-ui-api/src/com/intellij/openapi/editor}/colors/EditorSchemeAttributeDescriptor.java (83%) create mode 100644 platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorSchemeAttributeDescriptorWithPath.java create mode 100644 platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java create mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java create mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java create mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java create mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form create mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java diff --git a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java index 2ca12f5840a0..90391ee43d34 100644 --- a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java +++ b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java @@ -25,7 +25,7 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.options.colors.AttributesDescriptor; import com.intellij.openapi.options.colors.ColorDescriptor; -import com.intellij.openapi.options.colors.ColorSettingsPage; +import com.intellij.openapi.options.colors.RainbowColorSettingsPage; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.codeStyle.DisplayPriority; import com.intellij.psi.codeStyle.DisplayPrioritySortable; @@ -36,7 +36,7 @@ import javax.swing.*; import java.util.HashMap; import java.util.Map; -public class JavaColorSettingsPage implements ColorSettingsPage, InspectionColorSettingsPage, DisplayPrioritySortable { +public class JavaColorSettingsPage implements RainbowColorSettingsPage, InspectionColorSettingsPage, DisplayPrioritySortable { private static final AttributesDescriptor[] ourDescriptors = { new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.keyword"), JavaHighlightingColors.KEYWORD), new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.number"), JavaHighlightingColors.NUMBER), @@ -205,4 +205,45 @@ public class JavaColorSettingsPage implements ColorSettingsPage, InspectionColor public DisplayPriority getPriority() { return DisplayPriority.KEY_LANGUAGE_SETTINGS; } + + @Override + public boolean isRainbowType(TextAttributesKey type) { + return JavaHighlightingColors.LOCAL_VARIABLE_ATTRIBUTES.equals(type) + || JavaHighlightingColors.REASSIGNED_LOCAL_VARIABLE_ATTRIBUTES.equals(type) + || JavaHighlightingColors.PARAMETER_ATTRIBUTES.equals(type) + || JavaHighlightingColors.REASSIGNED_PARAMETER_ATTRIBUTES.equals(type) + + || JavaHighlightingColors.DOC_COMMENT_TAG_VALUE.equals(type); + } + + @NotNull + @Override + public String getRainbowDemoText() { + return + "import java.util.Date;\n" + + "class SomeClass {\n" + + " public int field;\n" + + " SomeClass(AnInterface param) {\n" + + "\n" + + " }\n" + + " /**\n" + + " * Doc comment\n" + + " * @param param1 function param\n" + + " * @param param2\n" + + " * @param param3\n" + + " * @param param4\n" + + " * @param param5\n" + + " */\n" + + " void method(int param1,\n" + + " int param2,\n" + + " int param3,\n" + + " int param4,\n" + + " int param5) {\n" + + " int localVar1, localVar2, localVar3, localVar4, localVar5;\n" + + "\n" + + " localVar3 = param2;\n" + + " this.field = localVar3 + param1 + param5;\n" + + " }\n" + + "}\n"; + } } diff --git a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java index 8f908f393be9..a54003e010e8 100644 --- a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java +++ b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java @@ -46,6 +46,7 @@ public class RainbowHighlighter { @NotNull private final TextAttributesScheme myColorsScheme; @NotNull private final List myRainbowColors; + public final static String RAINBOW_TYPE = "rainbow"; public RainbowHighlighter(@Nullable TextAttributesScheme colorsScheme) { myColorsScheme = colorsScheme != null ? colorsScheme : EditorColorsManager.getInstance().getGlobalScheme(); @@ -59,6 +60,10 @@ public class RainbowHighlighter { return Registry.is("editor.rainbow.identifiers", false); } + public static void setRainbowEnabled(boolean enabled) { + Registry.get("editor.rainbow.identifiers").setValue(enabled); + } + @NotNull public Color calculateForeground(int colorIndex) { return myRainbowColors.get(Math.abs(colorIndex) % myRainbowColors.size()); @@ -78,6 +83,14 @@ public class RainbowHighlighter { return registryColors.stream().map(s -> ColorUtil.fromHex(s.trim())).collect(Collectors.toList()); } + return ColorGenerator.generateLinearColorSequence(getRainbowKeys() + .stream() + .map(key -> colorsScheme.getAttributes(key).getForegroundColor()) + .collect(Collectors.toList()), + RAINBOW_COLORS_BETWEEN); + } + + public static synchronized List getRainbowKeys() { if (RAINBOW_COLOR_KEYS.isEmpty()) { for (int i = 0; i < RAINBOW_COLORS_DEFAULT.length; ++i) { RAINBOW_COLOR_KEYS.add(TextAttributesKey.createTextAttributesKey("RAINBOW_COLOR" + i, @@ -87,11 +100,7 @@ public class RainbowHighlighter { null, null, null, Font.PLAIN))); } } - return ColorGenerator.generateLinearColorSequence(RAINBOW_COLOR_KEYS - .stream() - .map(key -> colorsScheme.getAttributes(key).getForegroundColor()) - .collect(Collectors.toList()), - RAINBOW_COLORS_BETWEEN); + return RAINBOW_COLOR_KEYS; } public HighlightInfo getInfo(int colorIndex, @Nullable PsiElement id, @Nullable TextAttributesKey colorKey) { diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/EditorSchemeAttributeDescriptor.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorSchemeAttributeDescriptor.java similarity index 83% rename from platform/lang-impl/src/com/intellij/application/options/colors/EditorSchemeAttributeDescriptor.java rename to platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorSchemeAttributeDescriptor.java index fd5315664271..f174507a51c2 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/EditorSchemeAttributeDescriptor.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorSchemeAttributeDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -14,9 +14,7 @@ * limitations under the License. */ -package com.intellij.application.options.colors; - -import com.intellij.openapi.editor.colors.EditorColorsScheme; +package com.intellij.openapi.editor.colors; public interface EditorSchemeAttributeDescriptor { String getGroup(); diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorSchemeAttributeDescriptorWithPath.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorSchemeAttributeDescriptorWithPath.java new file mode 100644 index 000000000000..e5bc406340fd --- /dev/null +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorSchemeAttributeDescriptorWithPath.java @@ -0,0 +1,20 @@ +/* + * Copyright 2000-2016 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.colors; + +public interface EditorSchemeAttributeDescriptorWithPath extends EditorSchemeAttributeDescriptor { + String NAME_SEPARATOR = "//"; +} diff --git a/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java b/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java new file mode 100644 index 000000000000..f2e1a790ad7b --- /dev/null +++ b/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2016 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.options.colors; + +import com.intellij.openapi.editor.colors.TextAttributesKey; +import org.jetbrains.annotations.NotNull; + +public interface RainbowColorSettingsPage extends ColorSettingsPage { + boolean isRainbowType(TextAttributesKey type); + + @NotNull + String getRainbowDemoText(); +} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java b/platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java index 043aa0fd9bca..4025e031f1c5 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java @@ -28,6 +28,7 @@ import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.psi.tree.IElementType; import com.intellij.ui.ScrollingUtil; import com.intellij.util.ui.UIUtil; diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescription.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescription.java index 0e45a0af226e..db93b7363385 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescription.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescription.java @@ -17,6 +17,7 @@ package com.intellij.application.options.colors; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; import com.intellij.openapi.editor.colors.impl.AbstractColorsScheme; import com.intellij.openapi.editor.colors.impl.ReadOnlyColorsScheme; import com.intellij.openapi.editor.markup.EffectType; @@ -30,7 +31,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -public abstract class ColorAndFontDescription extends TextAttributes implements EditorSchemeAttributeDescriptor { +public abstract class ColorAndFontDescription extends TextAttributes implements EditorSchemeAttributeDescriptorWithPath { private final String myName; private final String myGroup; private final String myType; diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java index 152710c650e3..5c1de9b3ee9f 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java @@ -17,6 +17,8 @@ package com.intellij.application.options.colors; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.options.colors.AttributesDescriptor; @@ -172,7 +174,10 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel colorPanel.setEnabled(isChecked); } - public void reset(@NotNull ColorAndFontDescription description) { + public void reset(@NotNull EditorSchemeAttributeDescriptor attrDescription) { + if (!(attrDescription instanceof ColorAndFontDescription)) return; + ColorAndFontDescription description = (ColorAndFontDescription)attrDescription; + if (description.isFontEnabled()) { myLabelFont.setEnabled(description.isEditable()); myCbBold.setEnabled(description.isEditable()); @@ -218,7 +223,7 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel Pair baseDescriptor = description.getBaseAttributeDescriptor(); if (baseDescriptor != null && baseDescriptor.second.getDisplayName() != null) { String attrName = baseDescriptor.second.getDisplayName(); - String attrLabel = attrName.replaceAll(ColorOptionsTree.NAME_SEPARATOR, FontUtil.rightArrow(UIUtil.getLabelFont())); + String attrLabel = attrName.replaceAll(EditorSchemeAttributeDescriptorWithPath.NAME_SEPARATOR, FontUtil.rightArrow(UIUtil.getLabelFont())); ColorSettingsPage settingsPage = baseDescriptor.first; String style = "
"; String tooltipText; @@ -263,7 +268,10 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel myBackgroundChooser.setEditable(isEditEnabled); } - public void apply(@NotNull ColorAndFontDescription description, EditorColorsScheme scheme) { + public void apply(@NotNull EditorSchemeAttributeDescriptor attrDescription, EditorColorsScheme scheme) { + if (!(attrDescription instanceof ColorAndFontDescription)) return; + ColorAndFontDescription description = (ColorAndFontDescription)attrDescription; + description.setInherited(myInheritAttributesBox.isSelected()); if (description.isInherited()) { TextAttributes baseAttributes = description.getBaseAttributes(); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java new file mode 100644 index 000000000000..ba0a93d95bc0 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2016 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.colors; + +import com.intellij.codeHighlighting.RainbowHighlighter; +import org.jetbrains.annotations.NotNull; + +public class ColorAndFontGlobalState { + public boolean isRainbowOn; + + ColorAndFontGlobalState() { + isRainbowOn = RainbowHighlighter.isRainbowEnabled(); + } + + public ColorAndFontGlobalState(@NotNull ColorAndFontGlobalState state) { + copyFrom(state); + } + + public void copyFrom(@NotNull ColorAndFontGlobalState state) { + assert this != state; + isRainbowOn = state.isRainbowOn; + } + + public void apply() { + RainbowHighlighter.setRainbowEnabled(isRainbowOn); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ColorAndFontGlobalState state = (ColorAndFontGlobalState)o; + return isRainbowOn == state.isRainbowOn; + } + + @Override + public int hashCode() { + return 31 * (isRainbowOn ? 1 : 0); + } +} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java index 08a57fcf3e3a..c90af35acfee 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java @@ -27,10 +27,7 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationNamesInfo; -import com.intellij.openapi.editor.colors.ColorKey; -import com.intellij.openapi.editor.colors.EditorColorsManager; -import com.intellij.openapi.editor.colors.EditorColorsScheme; -import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.editor.colors.*; import com.intellij.openapi.editor.colors.impl.*; import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.TextAttributes; @@ -77,6 +74,10 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private Map mySchemes; private MyColorScheme mySelectedScheme; + + private final ColorAndFontGlobalState myInitGlobalOption = new ColorAndFontGlobalState(); + private final ColorAndFontGlobalState myCurGlobalOption = new ColorAndFontGlobalState(myInitGlobalOption); + public static final String FILE_STATUS_GROUP = ApplicationBundle.message("title.file.status"); public static final String SCOPES_GROUP = ApplicationBundle.message("title.scope.based"); @@ -94,19 +95,28 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private boolean myDisposeCompleted = false; private final Disposable myDisposable = Disposer.newDisposable(); + public ColorAndFontGlobalState getGlobalOption() { + return myCurGlobalOption; + } + @Override public boolean isModified() { boolean listModified = isSchemeListModified(); boolean schemeModified = isSomeSchemeModified(); + boolean globalModified = isGlobalOptionModified(); - if (listModified || schemeModified) { + if (listModified || schemeModified || globalModified) { myApplyCompleted = false; } - return listModified; + return listModified || globalModified; } - private boolean isSchemeListModified(){ + private boolean isGlobalOptionModified() { + return !myInitGlobalOption.equals(myCurGlobalOption); + } + + private boolean isSchemeListModified() { if (mySomeSchemesDeleted) return true; if (!mySelectedScheme.getName().equals(EditorColorsManager.getInstance().getGlobalScheme().getName())) return true; @@ -240,6 +250,9 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } try { + myCurGlobalOption.apply(); + myInitGlobalOption.copyFrom(myCurGlobalOption); + EditorColorsManager myColorsManager = EditorColorsManager.getInstance(); SchemeManager schemeManager = ((EditorColorsManagerImpl)myColorsManager).getSchemeManager(); @@ -488,6 +501,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } private void initAll() { + myCurGlobalOption.copyFrom(myInitGlobalOption); mySchemes = new THashMap(); for (EditorColorsScheme allScheme : EditorColorsManager.getInstance().getAllSchemes()) { MyColorScheme schemeDelegate = new MyColorScheme(allScheme); @@ -523,8 +537,27 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract @NotNull MyColorScheme scheme) { String group = provider.getDisplayName(); List attributeDescriptors = ColorSettingsUtil.getAllAttributeDescriptors(provider); + //todo: single point configuration? + //if (provider instanceof RainbowColorSettingsPage) { + // descriptions.add(new RainbowAttributeDescriptor(group, + // ApplicationBundle.message("rainbow.option.panel.display.name"), + // scheme, + // scheme.getInitRainbowState(), + // scheme.getCurrentRainbowState())); + //} for (AttributesDescriptor descriptor : attributeDescriptors) { addSchemedDescription(descriptions, descriptor.getDisplayName(), group, descriptor.getKey(), scheme, null, null); + if (provider instanceof RainbowColorSettingsPage + && ((RainbowColorSettingsPage)provider).isRainbowType(descriptor.getKey())) { + //todo: joined sub-descriptor + descriptions.add(new RainbowAttributeDescriptor(group, + descriptor.getDisplayName() + + EditorSchemeAttributeDescriptorWithPath.NAME_SEPARATOR + + ApplicationBundle.message("rainbow.option.panel.display.name"), + scheme, + scheme.getInitRainbowState(), + scheme.getCurrentRainbowState())); + } } ColorDescriptor[] colorDescriptors = provider.getColorDescriptors(); @@ -626,7 +659,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } private void revertChanges(){ - if (isSchemeListModified() || isSomeSchemeModified()) { + if (isSchemeListModified() || isSomeSchemeModified() || isGlobalOptionModified()) { myRevertChangesCompleted = false; } @@ -984,6 +1017,8 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private EditorSchemeAttributeDescriptor[] myDescriptors; private String myName; private boolean myIsNew = false; + private RainbowAttributeDescriptor.RainbowInSchemeState myInitRainbowState; + private RainbowAttributeDescriptor.RainbowInSchemeState myCurrentRainbowState; private MyColorScheme(@NotNull EditorColorsScheme parentScheme) { super(parentScheme); @@ -1113,6 +1148,20 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } return false; } + + public RainbowAttributeDescriptor.RainbowInSchemeState getInitRainbowState() { + if (myInitRainbowState == null) { + myInitRainbowState = new RainbowAttributeDescriptor.RainbowInSchemeState(this); + } + return myInitRainbowState; + } + + public RainbowAttributeDescriptor.RainbowInSchemeState getCurrentRainbowState() { + if (myCurrentRainbowState == null) { + myCurrentRainbowState = new RainbowAttributeDescriptor.RainbowInSchemeState(getInitRainbowState()); + } + return myCurrentRainbowState; + } } @Override diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorOptionsTree.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorOptionsTree.java index 3c431b189946..6592921a26e4 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorOptionsTree.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorOptionsTree.java @@ -15,6 +15,8 @@ */ package com.intellij.application.options.colors; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.TreeSpeedSearch; import com.intellij.ui.treeStructure.Tree; @@ -26,6 +28,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.tree.*; import java.util.*; +import static com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath.NAME_SEPARATOR; + /** * @author Rustam Vishnyakov */ @@ -33,8 +37,6 @@ public class ColorOptionsTree extends Tree { private final String myCategoryName; private final DefaultTreeModel myTreeModel; - public final static String NAME_SEPARATOR = "//"; - private static final Comparator ATTR_COMPARATOR = (o1, o2) -> StringUtil.naturalCompare(o1.toString(), o2.toString()); @@ -78,9 +80,9 @@ public class ColorOptionsTree extends Tree { } @Nullable - public ColorAndFontDescription getSelectedDescriptor() { + public EditorSchemeAttributeDescriptor getSelectedDescriptor() { Object selectedValue = getSelectedValue(); - return selectedValue instanceof ColorAndFontDescription ? (ColorAndFontDescription)selectedValue : null; + return selectedValue instanceof EditorSchemeAttributeDescriptor ? (EditorSchemeAttributeDescriptor)selectedValue : null; } @Nullable @@ -138,7 +140,7 @@ public class ColorOptionsTree extends Tree { @Nullable private static List extractPath(@NotNull EditorSchemeAttributeDescriptor descriptor) { - if (descriptor instanceof ColorAndFontDescription) { + if (descriptor instanceof EditorSchemeAttributeDescriptorWithPath) { String name = descriptor.toString(); List path = new ArrayList(); int separatorStart = name.indexOf(NAME_SEPARATOR); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorSettingsUtil.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorSettingsUtil.java index a25a6a3c2815..0012fe3443a8 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorSettingsUtil.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorSettingsUtil.java @@ -72,10 +72,6 @@ public class ColorSettingsUtil { return true; } - static boolean isSharedScheme(EditorColorsScheme selected) { - return false; - } - private static void addInspectionSeverityAttributes(List descriptors) { descriptors.add(new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.unknown.symbol"), CodeInsightColors.WRONG_REFERENCES_ATTRIBUTES)); descriptors.add(new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.deprecated.symbol"), CodeInsightColors.DEPRECATED_ATTRIBUTES)); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java new file mode 100644 index 000000000000..f56409a7ef5a --- /dev/null +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -0,0 +1,192 @@ +/* + * Copyright 2000-2016 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.colors; + +import com.intellij.application.options.colors.highlighting.HighlightData; +import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.editor.ex.DocumentEx; +import com.intellij.openapi.options.colors.ColorSettingsPage; +import com.intellij.openapi.options.colors.RainbowColorSettingsPage; +import com.intellij.openapi.util.TextRange; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; +import java.util.*; +import java.util.List; + +class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDescriptionPanel { + private ColorSettingsPage myPage; + + private PreviewPanel myPreviewPanel; + private ColorAndFontDescriptionPanel myColorAndFontPanel; + private RainbowDescriptionPanel myRainbowPanel; + + private OptionsPanelImpl.ColorDescriptionPanel myActive; + + public CustomizedSwitcherPanel(ColorAndFontGlobalState options, @Nullable PreviewPanel previewPanel, ColorSettingsPage page) { + super(); + myPage = page; + myPreviewPanel = previewPanel; + + myRainbowPanel = new RainbowDescriptionPanel(options); + myColorAndFontPanel = new ColorAndFontDescriptionPanel(); + + Dimension sizeR = myRainbowPanel.getPreferredSize(); + Dimension sizeC = myColorAndFontPanel.getPreferredSize(); + Dimension preferredSize = new Dimension(); + preferredSize.setSize(Math.max(sizeR.getWidth(), sizeC.getWidth()), + Math.max(sizeR.getHeight(), sizeC.getHeight())); + setPreferredSize(preferredSize); + } + + @NotNull + @Override + public JComponent getPanel() { + return this; + } + + @Override + public void resetDefault() { + myActive = null; + if (getComponentCount() != 0) { + try { + setIgnoreRepaint(true); + setPreferredSize(getSize()); + remove(0); + } + finally { + setIgnoreRepaint(false); + revalidate(); + } + } + } + + @Override + public void reset(@NotNull EditorSchemeAttributeDescriptor descriptor) { + myActive = null; + if (descriptor instanceof RainbowAttributeDescriptor) { + myActive = myRainbowPanel; + } + else if (descriptor instanceof ColorAndFontDescription) { + myActive = myColorAndFontPanel; + } + + if (getComponentCount() == 0 || myActive != getComponent(0)) { + boolean ignoreRepaint = getIgnoreRepaint(); + try { + setIgnoreRepaint(true); + if (getComponentCount() != 0) { + remove(0); + } + setPreferredSize(null); + add((JPanel)myActive); + } + finally { + setIgnoreRepaint(ignoreRepaint); + revalidate(); + } + } + myActive.reset(descriptor); + updatePreviewPanel(descriptor); + } + + private void addRainbowHighlighting(DocumentEx document, @NotNull List data) { + List keys = RainbowHighlighter.getRainbowKeys(); + if (!keys.isEmpty()) { + List newData = new ArrayList(); + int i = 0; + HashMap id2index = new HashMap(); + for (HighlightData d : data) { + if (((RainbowColorSettingsPage)myPage).isRainbowType(d.getHighlightKey())) { + // sequential approach for color selection + String id = document.getText(TextRange.create(d.getStartOffset(), d.getEndOffset())); + Integer index = id2index.get(id); + if (index == null) { + index = i++ % keys.size(); + id2index.put(id, index); + } + TextAttributesKey type = keys.get(index); + + HighlightData rainbow = new HighlightData(d.getStartOffset(), d.getEndOffset(), type); + //fixme: twisted coloring in editor. We need add rainbow-tag twice. + newData.add(rainbow); + newData.add(d); + newData.add(rainbow); + } + else { + newData.add(d); + } + } + data.clear(); + data.addAll(newData); + } + } + + private static void removeRainbowHighlighting(@NotNull List data) { + List keys = RainbowHighlighter.getRainbowKeys(); + if (!keys.isEmpty()) { + List newData = new ArrayList(); + for (HighlightData d : data) { + if (!keys.contains(d.getHighlightKey())) { + newData.add(d); + } + } + data.clear(); + data.addAll(newData); + } + } + + @Override + public void apply(@NotNull EditorSchemeAttributeDescriptor descriptor, EditorColorsScheme scheme) { + if (myActive != null) { + myActive.apply(descriptor, scheme); + updatePreviewPanel(descriptor); + } + } + + protected void updatePreviewPanel(@NotNull EditorSchemeAttributeDescriptor descriptor) { + if (!(myPreviewPanel instanceof SimpleEditorPreview)) return; + + SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; + + if (myActive == myRainbowPanel + && myPage instanceof RainbowColorSettingsPage + && descriptor instanceof RainbowAttributeDescriptor) { + simpleEditorPreview.setDemoText(((RainbowColorSettingsPage)myPage).getRainbowDemoText()); + List highlightDatas = simpleEditorPreview.getHighlightDataForExtension(); + if (myRainbowPanel.myGlobalState.isRainbowOn) { + addRainbowHighlighting(simpleEditorPreview.getEditor().getDocument(), highlightDatas); + } + else { + removeRainbowHighlighting(highlightDatas); + } + } + else { + simpleEditorPreview.setDemoText(myPage.getDemoText()); + } + } + + @Override + public void addListener(@NotNull Listener listener) { + myRainbowPanel.addListener(listener); + myColorAndFontPanel.addListener(listener); + } +} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java index 35c49f0653eb..6e43fa0c7306 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java @@ -325,7 +325,7 @@ public class FontOptions extends JPanel implements OptionsPanel{ public boolean updateDescription(boolean modified) { EditorColorsScheme scheme = myOptions.getSelectedScheme(); - if (modified && (ColorAndFontOptions.isReadOnly(scheme) || ColorSettingsUtil.isSharedScheme(scheme))) { + if (modified && ColorAndFontOptions.isReadOnly(scheme)) { return false; } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java index aefed308cfdc..65e279121214 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.options.colors.ColorSettingsPage; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.GuiUtils; import org.jetbrains.annotations.NotNull; @@ -100,10 +101,8 @@ public class NewColorAndFontPanel extends JPanel { optionsPanel.addListener(new ColorAndFontSettingsListener.Abstract() { @Override public void settingsChanged() { - if (schemesPanel.updateDescription(true)) { - optionsPanel.applyChangesToScheme(); - previewPanel.updateView(); - } + optionsPanel.applyChangesToScheme(); + previewPanel.updateView(); } @Override @@ -133,8 +132,8 @@ public class NewColorAndFontPanel extends JPanel { Collection optionList, ColorSettingsPage page) { final SchemesPanel schemesPanel = new SchemesPanel(options); - final OptionsPanel optionsPanel = new OptionsPanelImpl(options, schemesPanel, category); - + final OptionsPanel optionsPanel = new OptionsPanelImpl(options, schemesPanel, category, + new CustomizedSwitcherPanel(options.getGlobalOption(), previewPanel, page)); return new NewColorAndFontPanel(schemesPanel, optionsPanel, previewPanel, category, optionList, page); } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java index e46dd0023124..4bdd6b9c2407 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java @@ -20,11 +20,11 @@ import com.intellij.ide.DataManager; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.openapi.options.ex.Settings; import com.intellij.openapi.util.ActionCallback; import com.intellij.ui.ScrollPaneFactory; import com.intellij.util.EventDispatcher; -import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -122,7 +122,9 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { private void processListValueChanged() { Object selectedValue = myOptionsTree.getSelectedValue(); - ColorAndFontDescription description = selectedValue instanceof ColorAndFontDescription ? (ColorAndFontDescription)selectedValue : null; + EditorSchemeAttributeDescriptor description = selectedValue instanceof EditorSchemeAttributeDescriptor + ? (EditorSchemeAttributeDescriptor)selectedValue + : null; if (description == null) { if (selectedValue == null) { String preselectedType = myProperties.getValue(SELECTED_COLOR_OPTION_PROPERTY); @@ -164,7 +166,7 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { @Override public void applyChangesToScheme() { - ColorAndFontDescription descriptor = myOptionsTree.getSelectedDescriptor(); + EditorSchemeAttributeDescriptor descriptor = myOptionsTree.getSelectedDescriptor(); if (descriptor != null) { myOptionsPanel.apply(descriptor, myOptions.getSelectedScheme()); } @@ -193,9 +195,9 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { void resetDefault(); - void reset(@NotNull ColorAndFontDescription description); + void reset(@NotNull EditorSchemeAttributeDescriptor description); - void apply(@NotNull ColorAndFontDescription descriptor, EditorColorsScheme scheme); + void apply(@NotNull EditorSchemeAttributeDescriptor descriptor, EditorColorsScheme scheme); void addListener(@NotNull Listener listener); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java new file mode 100644 index 000000000000..a036071b31ea --- /dev/null +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java @@ -0,0 +1,153 @@ +/* + * Copyright 2000-2016 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.colors; + +import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithPath { + private final String myGroup; + private final String myDisplayName; + private final EditorColorsScheme myScheme; + + // can be shared between instances + private final RainbowInSchemeState myCurState; + private final RainbowInSchemeState myInitState; + + public RainbowAttributeDescriptor(@NotNull String group, + @NotNull String displayNameWithPath, + @NotNull EditorColorsScheme scheme, + RainbowInSchemeState initState, + RainbowInSchemeState curState) { + myDisplayName = displayNameWithPath; + myInitState = initState; + myCurState = curState; + myScheme = scheme; + myGroup = group; + } + + @Override + public String toString() { + return myDisplayName; + } + + @Override + public String getGroup() { + return myGroup; + } + + @Override + public String getType() { + return RainbowHighlighter.RAINBOW_TYPE; + } + + @Override + public EditorColorsScheme getScheme() { + return myScheme; + } + + @Override + public void apply(@NotNull EditorColorsScheme scheme) { + myCurState.apply(scheme); + } + + @Override + public boolean isModified() { + return !myInitState.equals(myCurState); + } + + public List> getRainbowCurState() { + return myCurState.myRainbowState; + } + + public Color getDefaultColor(int index) { + return RainbowHighlighter.getRainbowKeys().get(index).getDefaultAttributes().getForegroundColor(); + } + + public static class RainbowInSchemeState { + private final List> myRainbowState = new ArrayList<>(); + + public RainbowInSchemeState(@NotNull EditorColorsScheme scheme) { + for (TextAttributesKey rainbowKey : RainbowHighlighter.getRainbowKeys()) { + myRainbowState.add(getColorStateFromScheme(scheme, rainbowKey)); + } + } + + public RainbowInSchemeState(@NotNull RainbowInSchemeState state) { + copyFrom(state); + } + + public void copyFrom(@NotNull RainbowInSchemeState state) { + assert this != state; + + myRainbowState.clear(); + myRainbowState.addAll(state.myRainbowState); + } + + public void apply(@NotNull EditorColorsScheme scheme) { + int i = 0; + for (TextAttributesKey rainbowKey : RainbowHighlighter.getRainbowKeys()) { + Pair pair = myRainbowState.get(i); + scheme.setAttributes(rainbowKey, pair.first ? new TextAttributes(pair.second, null, null, null, Font.PLAIN) + : rainbowKey.getDefaultAttributes()); + ++i; + } + } + + @NotNull + private static Pair getColorStateFromScheme(@NotNull EditorColorsScheme scheme, TextAttributesKey rainbowKey) { + TextAttributes schemeAttributes = scheme.getAttributes(rainbowKey); + @NotNull Color defaultRainbow = rainbowKey.getDefaultAttributes().getForegroundColor(); + Pair pair; + if (schemeAttributes == null) { + pair = Pair.create(false, defaultRainbow); + } + else { + Color schemeColor = schemeAttributes.getForegroundColor(); + if (schemeColor == null) { + pair = Pair.create(false, defaultRainbow); + } + else { + pair = Pair.create(!defaultRainbow.equals(schemeColor), schemeColor); + } + } + return pair; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + RainbowInSchemeState state = (RainbowInSchemeState)o; + return myRainbowState.equals(state.myRainbowState); + } + + @Override + public int hashCode() { + return myRainbowState.hashCode(); + } + } +} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form new file mode 100644 index 000000000000..acf9a1722aed --- /dev/null +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form @@ -0,0 +1,199 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java new file mode 100644 index 000000000000..a5964959e020 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -0,0 +1,155 @@ +/* + * Copyright 2000-2016 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.colors; + +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Pair; +import com.intellij.ui.ColorPanel; +import com.intellij.ui.HyperlinkAdapter; +import com.intellij.ui.components.JBCheckBox; +import com.intellij.util.EventDispatcher; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import javax.swing.event.HyperlinkEvent; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + + +public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl.ColorDescriptionPanel { + private final EventDispatcher myDispatcher = EventDispatcher.create(Listener.class); + + protected JPanel myPanel; + + private JBCheckBox myCbStop1; + private JBCheckBox myCbStop2; + private JBCheckBox myCbStop3; + private JBCheckBox myCbStop4; + private JBCheckBox myCbStop5; + private JBCheckBox[] myCbStops = new JBCheckBox[]{myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5}; + + protected ColorPanel myStop1; + protected ColorPanel myStop2; + protected ColorPanel myStop3; + protected ColorPanel myStop4; + protected ColorPanel myStop5; + private ColorPanel[] myStops = new ColorPanel[]{myStop1, myStop2, myStop3, myStop4, myStop5}; + + private JTextPane myInheritanceLabel; + + private JBCheckBox myInheritAttributesBox; + private JBCheckBox myRainbow; + + ColorAndFontGlobalState myGlobalState; + + public RainbowDescriptionPanel(ColorAndFontGlobalState globalState) { + super(new BorderLayout()); + myGlobalState = globalState; + add(myPanel, BorderLayout.CENTER); + + setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 4)); + ActionListener actionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + onSettingsChanged(e); + } + }; + for (JBCheckBox c : new JBCheckBox[]{myRainbow, myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5, myInheritAttributesBox}) { + c.addActionListener(actionListener); + } + for (ColorPanel c : new ColorPanel[]{myStop1, myStop2, myStop3, myStop4, myStop5}) { + c.addActionListener(actionListener); + } + + Messages.configureMessagePaneUi(myInheritanceLabel, "", null); + myInheritanceLabel.addHyperlinkListener(new HyperlinkAdapter() { + @Override + protected void hyperlinkActivated(HyperlinkEvent e) { + onHyperLinkClicked(e); + } + }); + myInheritanceLabel.setBorder(BorderFactory.createEmptyBorder()); + } + + @NotNull + @Override + public JComponent getPanel() { + return this; + } + + private void onHyperLinkClicked(HyperlinkEvent e) { + myDispatcher.getMulticaster().onHyperLinkClicked(e); + } + + private void onSettingsChanged(ActionEvent e) { + myDispatcher.getMulticaster().onSettingsChanged(e); + } + + @Override + public void resetDefault() { + } + + @Override + public void reset(@NotNull EditorSchemeAttributeDescriptor attributeDescriptor) { + if (!(attributeDescriptor instanceof RainbowAttributeDescriptor)) return; + RainbowAttributeDescriptor descriptor = (RainbowAttributeDescriptor)attributeDescriptor; + + List> rainbowCurState = descriptor.getRainbowCurState(); + if (rainbowCurState.size() < myCbStops.length) return; + + myRainbow.setSelected(myGlobalState.isRainbowOn); + + boolean isEnable = !ColorAndFontOptions.isReadOnly(attributeDescriptor.getScheme()) && myGlobalState.isRainbowOn; + for (int i = 0; i < myCbStops.length; ++i) { + Pair state = rainbowCurState.get(i); + myCbStops[i].setEnabled(isEnable); + + boolean isOverride = state.first; + myCbStops[i].setSelected(isOverride); + + myStops[i].setEditable(isEnable && isOverride); + myStops[i].setSelectedColor(state.second); + } + } + + @Override + public void apply(@NotNull EditorSchemeAttributeDescriptor attributeDescriptor, EditorColorsScheme scheme) { + if (!(attributeDescriptor instanceof RainbowAttributeDescriptor)) return; + RainbowAttributeDescriptor descriptor = (RainbowAttributeDescriptor)attributeDescriptor; + + List> rainbowCurState = descriptor.getRainbowCurState(); + if (rainbowCurState.size() < myCbStops.length) return; + + myGlobalState.isRainbowOn = myRainbow.isSelected(); + for (int i = 0; i < myCbStops.length; ++i) { + boolean isOverride = myCbStops[i].isSelected(); + rainbowCurState.set(i, Pair.create(isOverride, + isOverride ? myStops[i].getSelectedColor() : descriptor.getDefaultColor(i))); + } + + reset(descriptor); + descriptor.apply(scheme); + } + + @Override + public void addListener(@NotNull Listener listener) { + myDispatcher.addListener(listener); + } +} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/SchemesPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/SchemesPanel.java index 1d33a3f8a016..be4f71e75f42 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/SchemesPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/SchemesPanel.java @@ -171,14 +171,11 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent { } } - private void changeToScheme() { - updateDescription(false); - } - + @Deprecated public boolean updateDescription(boolean modified) { EditorColorsScheme scheme = myOptions.getSelectedScheme(); - if (modified && (ColorAndFontOptions.isReadOnly(scheme) || ColorSettingsUtil.isSharedScheme(scheme))) { + if (modified && ColorAndFontOptions.isReadOnly(scheme)) { return false; } @@ -200,8 +197,6 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent { mySchemeComboBox.setSelectedItem(selectedSchemeBackup); setListLoaded(true); - changeToScheme(); - myDispatcher.getMulticaster().schemeChanged(this); } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java index b1423acfa245..b257d2e90c89 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java @@ -19,6 +19,7 @@ package com.intellij.application.options.colors; import com.intellij.application.options.colors.highlighting.HighlightData; import com.intellij.application.options.colors.highlighting.HighlightsExtractor; import com.intellij.ide.highlighter.HighlighterFactory; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.LogicalPosition; @@ -35,6 +36,7 @@ import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.options.colors.ColorSettingsPage; import com.intellij.openapi.options.colors.EditorHighlightingProvidingColorSettingsPage; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.psi.tree.IElementType; import com.intellij.util.Alarm; import com.intellij.util.EventDispatcher; @@ -48,43 +50,50 @@ import java.awt.event.MouseMotionAdapter; import java.util.*; import java.util.List; -public class SimpleEditorPreview implements PreviewPanel{ +public class SimpleEditorPreview implements PreviewPanel { private final ColorSettingsPage myPage; private final EditorEx myEditor; private final Alarm myBlinkingAlarm; - private final HighlightData[] myHighlightData; + private final List myHighlightData = new ArrayList(); private final ColorAndFontOptions myOptions; private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); + private final HighlightsExtractor myHighlightsExtractor; + private boolean myTextIsChanging = false; public SimpleEditorPreview(final ColorAndFontOptions options, final ColorSettingsPage page) { this(options, page, true); } + @NotNull + public List getHighlightDataForExtension() { + return myHighlightData; + } + public SimpleEditorPreview(final ColorAndFontOptions options, final ColorSettingsPage page, final boolean navigatable) { myOptions = options; myPage = page; String text = page.getDemoText(); - HighlightsExtractor extractant2 = new HighlightsExtractor(page.getAdditionalHighlightingTagToDescriptorMap()); - List highlights = new ArrayList(); - String stripped = extractant2.extractHighlights(text, highlights); - myHighlightData = highlights.toArray(new HighlightData[highlights.size()]); + myHighlightsExtractor = new HighlightsExtractor(page.getAdditionalHighlightingTagToDescriptorMap()); + String stripped = myHighlightsExtractor.extractHighlights(text, myHighlightData); int selectedLine = -1; myEditor = (EditorEx)FontEditorPreview.createPreviewEditor(stripped, 10, 3, selectedLine, myOptions, false); FontEditorPreview.installTrafficLights(myEditor); myBlinkingAlarm = new Alarm().setActivationComponent(myEditor.getComponent()); if (navigatable) { - addMouseMotionListener(myEditor, page.getHighlighter(), myHighlightData, false); + addMouseMotionListener(myEditor, page.getHighlighter(), false); CaretListener listener = new CaretAdapter() { @Override public void caretPositionChanged(CaretEvent e) { - navigate(myEditor, true, e.getNewPosition(), page.getHighlighter(), myHighlightData, false); + if (!myTextIsChanging) { + navigate(myEditor, true, e.getNewPosition(), page.getHighlighter(), false); + } } }; myEditor.getCaretModel().addCaretListener(listener); @@ -95,14 +104,33 @@ public class SimpleEditorPreview implements PreviewPanel{ return myEditor; } + public void setDemoText(final String text) { + UIUtil.invokeAndWaitIfNeeded( new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(() -> { + try { + myTextIsChanging = true; + myHighlightData.clear(); + String stripped = myHighlightsExtractor.extractHighlights(text, myHighlightData); + myEditor.getSelectionModel().removeSelection(); + myEditor.getDocument().setText(stripped); + } finally { + myTextIsChanging = false; + } + }); + } + }); + } + private void addMouseMotionListener(final Editor view, final SyntaxHighlighter highlighter, - final HighlightData[] data, final boolean isBackgroundImportant) { + final boolean isBackgroundImportant) { view.getContentComponent().addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { LogicalPosition pos = view.xyToLogicalPosition(new Point(e.getX(), e.getY())); - navigate(view, false, pos, highlighter, data, isBackgroundImportant); + navigate(view, false, pos, highlighter, isBackgroundImportant); } }); } @@ -110,7 +138,7 @@ public class SimpleEditorPreview implements PreviewPanel{ private void navigate(final Editor editor, boolean select, LogicalPosition pos, final SyntaxHighlighter highlighter, - final HighlightData[] data, final boolean isBackgroundImportant) { + final boolean isBackgroundImportant) { int offset = editor.logicalPositionToOffset(pos); if (!isBackgroundImportant && editor.offsetToLogicalPosition(offset).column != pos.column) { @@ -120,17 +148,15 @@ public class SimpleEditorPreview implements PreviewPanel{ } } - if (data != null) { - for (HighlightData highlightData : data) { - if (ClickNavigator.highlightDataContainsOffset(highlightData, editor.logicalPositionToOffset(pos))) { - if (!select) { - ClickNavigator.setCursor(editor, Cursor.HAND_CURSOR); - } - else { - myDispatcher.getMulticaster().selectionInPreviewChanged(highlightData.getHighlightType()); - } - return; + for (HighlightData highlightData : myHighlightData) { + if (ClickNavigator.highlightDataContainsOffset(highlightData, editor.logicalPositionToOffset(pos))) { + if (!select) { + ClickNavigator.setCursor(editor, Cursor.HAND_CURSOR); } + else { + myDispatcher.getMulticaster().selectionInPreviewChanged(highlightData.getHighlightType()); + } + return; } } @@ -174,16 +200,14 @@ public class SimpleEditorPreview implements PreviewPanel{ updateHighlighters(); myEditor.reinitSettings(); - } private void updateHighlighters() { UIUtil.invokeLaterIfNeeded(() -> { if (myEditor.isDisposed()) return; myEditor.getMarkupModel().removeAllHighlighters(); - HighlightData[] datum = myHighlightData; final Map displayText = ColorSettingsUtil.keyToDisplayTextMap(myPage); - for (final HighlightData data : datum) { + for (final HighlightData data : myHighlightData) { data.addHighlToView(myEditor, myOptions.getSelectedScheme(), displayText); } }); @@ -193,11 +217,11 @@ public class SimpleEditorPreview implements PreviewPanel{ @Override public void blinkSelectedHighlightType(Object description) { - if (description instanceof EditorSchemeAttributeDescriptor){ + if (description instanceof EditorSchemeAttributeDescriptor) { String type = ((EditorSchemeAttributeDescriptor)description).getType(); List highlights = startBlinkingHighlights(myEditor, - myHighlightData, type, + type, myPage.getHighlighter(), true, myBlinkingAlarm, BLINK_COUNT, myPage); @@ -208,7 +232,7 @@ public class SimpleEditorPreview implements PreviewPanel{ private static void scrollHighlightInView(final List highlightDatas, final Editor editor) { boolean needScroll = true; int minOffset = Integer.MAX_VALUE; - for(HighlightData data: highlightDatas) { + for (HighlightData data : highlightDatas) { if (isOffsetVisible(editor, data.getStartOffset())) { needScroll = false; break; @@ -232,7 +256,6 @@ public class SimpleEditorPreview implements PreviewPanel{ } private List startBlinkingHighlights(final EditorEx editor, - final HighlightData[] highlightDatum, final String attrKey, final SyntaxHighlighter highlighter, final boolean show, @@ -244,14 +267,13 @@ public class SimpleEditorPreview implements PreviewPanel{ boolean found = false; List highlights = new ArrayList(); List matchingHighlights = new ArrayList(); - for (int i = 0; highlightDatum != null && i < highlightDatum.length; i++) { - HighlightData highlightData = highlightDatum[i]; + for (HighlightData highlightData : myHighlightData) { String type = highlightData.getHighlightType(); highlights.add(highlightData); if (show && type.equals(attrKey)) { highlightData = - new HighlightData(highlightData.getStartOffset(), highlightData.getEndOffset(), - CodeInsightColors.BLINKING_HIGHLIGHTS_ATTRIBUTES); + new HighlightData(highlightData.getStartOffset(), highlightData.getEndOffset(), + CodeInsightColors.BLINKING_HIGHLIGHTS_ATTRIBUTES); highlights.add(highlightData); matchingHighlights.add(highlightData); found = true; @@ -294,7 +316,7 @@ public class SimpleEditorPreview implements PreviewPanel{ } } alarm.cancelAllRequests(); - alarm.addComponentRequest(() -> startBlinkingHighlights(editor, highlightDatum, attrKey, highlighter, !show, alarm, count - 1, page), 400); + alarm.addComponentRequest(() -> startBlinkingHighlights(editor, attrKey, highlighter, !show, alarm, count - 1, page), 400); return matchingHighlights; } @@ -309,6 +331,5 @@ public class SimpleEditorPreview implements PreviewPanel{ EditorFactory editorFactory = EditorFactory.getInstance(); editorFactory.releaseEditor(myEditor); stopBlinking(); - } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/highlighting/HighlightData.java b/platform/lang-impl/src/com/intellij/application/options/colors/highlighting/HighlightData.java index 7d64bc12bd64..499605ab18b9 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/highlighting/HighlightData.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/highlighting/HighlightData.java @@ -92,4 +92,8 @@ public final class HighlightData { public String getHighlightType() { return myHighlightType.getExternalName(); } + + public TextAttributesKey getHighlightKey() { + return myHighlightType; + } } diff --git a/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffColorDescriptionPanel.java b/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffColorDescriptionPanel.java index ce5dd89fec4e..97207ef41378 100644 --- a/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffColorDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffColorDescriptionPanel.java @@ -21,6 +21,7 @@ import com.intellij.application.options.colors.ColorAndFontOptions; import com.intellij.application.options.colors.OptionsPanelImpl; import com.intellij.diff.util.TextDiffTypeFactory; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.ui.ColorPanel; import com.intellij.ui.JBColor; @@ -95,7 +96,10 @@ class DiffColorDescriptionPanel extends JPanel implements OptionsPanelImpl.Color myInheritIgnoredCheckBox.setSelected(false); } - public void reset(@NotNull ColorAndFontDescription description) { + public void reset(@NotNull EditorSchemeAttributeDescriptor attrDescription) { + if (!(attrDescription instanceof ColorAndFontDescription)) return; + ColorAndFontDescription description = (ColorAndFontDescription)attrDescription; + Color backgroundColor = getBackgroundColor(description); Color ignoredColor = getIgnoredColor(description); Color stripeMarkColor = getStripeMarkColor(description); @@ -112,7 +116,10 @@ class DiffColorDescriptionPanel extends JPanel implements OptionsPanelImpl.Color myInheritIgnoredCheckBox.setSelected(inheritIgnored); } - public void apply(@NotNull ColorAndFontDescription description, EditorColorsScheme scheme) { + public void apply(@NotNull EditorSchemeAttributeDescriptor attrDescription, EditorColorsScheme scheme) { + if (!(attrDescription instanceof ColorAndFontDescription)) return; + ColorAndFontDescription description = (ColorAndFontDescription)attrDescription; + description.setBackgroundChecked(true); description.setForegroundChecked(true); description.setErrorStripeChecked(true); diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 02c16408a64a..57271d875335 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -741,4 +741,8 @@ code.style.other.label=Text files and unsupported file types\: remote.desktop.detected.title=Remote desktop detected remote.desktop.detected.message=Animation disabled -checkbox.line.comment.add.space=Add a space at comment start \ No newline at end of file +checkbox.line.comment.add.space=Add a space at comment start + +rainbow.option.panel.display.name=Semantic highlighting +label.base.color=Override gradient color +checkbox.rainbow=Unique color for each
parameter and local variable \ No newline at end of file From fd45083d236c681b2e5137af520492a02002a260 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Fri, 5 Aug 2016 16:49:41 +0300 Subject: [PATCH 02/17] IDEA-158861 Add text gradient demo in first line --- .../codeHighlighting/RainbowHighlighter.java | 70 +++++++++++++++++-- .../codeInsight/daemon/RainbowVisitor.java | 32 ++------- .../colors/CustomizedSwitcherPanel.java | 64 ++++++++++++----- .../colors/RainbowDescriptionPanel.form | 11 ++- .../src/messages/ApplicationBundle.properties | 4 +- 5 files changed, 128 insertions(+), 53 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java index a54003e010e8..2d9615f9031c 100644 --- a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java +++ b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java @@ -25,6 +25,7 @@ import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.colors.TextAttributesScheme; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringHash; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.ui.ColorUtil; @@ -34,7 +35,9 @@ import org.jetbrains.annotations.Nullable; import java.awt.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class RainbowHighlighter { @@ -47,6 +50,7 @@ public class RainbowHighlighter { @NotNull private final TextAttributesScheme myColorsScheme; @NotNull private final List myRainbowColors; public final static String RAINBOW_TYPE = "rainbow"; + private final static String RAINBOW_TEMP_PREF = "RAINBOW_TEMP_"; public RainbowHighlighter(@Nullable TextAttributesScheme colorsScheme) { myColorsScheme = colorsScheme != null ? colorsScheme : EditorColorsManager.getInstance().getGlobalScheme(); @@ -85,7 +89,9 @@ public class RainbowHighlighter { return ColorGenerator.generateLinearColorSequence(getRainbowKeys() .stream() - .map(key -> colorsScheme.getAttributes(key).getForegroundColor()) + .map(key -> + colorsScheme.getAttributes(key).getForegroundColor() + ) .collect(Collectors.toList()), RAINBOW_COLORS_BETWEEN); } @@ -103,10 +109,64 @@ public class RainbowHighlighter { return RAINBOW_COLOR_KEYS; } + public static int getRainbowHash(@NotNull String id) { + return StringHash.murmur(id, 0x55AA); + } + + @NotNull + public List getRainbowTempKeys() { + int[] index = {0}; + return myRainbowColors + .stream() + .map(color -> { + TextAttributesKey key = TextAttributesKey.createTextAttributesKey(RAINBOW_TEMP_PREF + index[0]++, new TextAttributes()); + key.getDefaultAttributes().setForegroundColor(color); + return key; + }) + .collect(Collectors.toList()); + } + + public static boolean isRainbowTempKey(TextAttributesKey key) { + return key.getExternalName().startsWith(RAINBOW_TEMP_PREF); + } + public HighlightInfo getInfo(int colorIndex, @Nullable PsiElement id, @Nullable TextAttributesKey colorKey) { - if (id == null) { - return null; + return id == null ? null : getInfoBuilder(colorIndex, colorKey).range(id).create(); + } + + public HighlightInfo getInfo(int colorIndex, int start, int end, @Nullable TextAttributesKey colorKey) { + return getInfoBuilder(colorIndex, colorKey).range(start, end).create(); + } + + public int getColorIndex(HashMap id2index, @NotNull String id, int idHash) { + Integer colorIndex = id2index.get(id); + if (colorIndex == null) { + colorIndex = Math.abs(idHash); + + Map index2usage = new HashMap(); + id2index.values().forEach(i -> { + Integer useCount = index2usage.get(i); + index2usage.put(i, useCount == null ? 1 : ++useCount); + }); + + int colorsCount = getColorsCount(); + out: + for (int cutoff = 0; ; ++cutoff) { + for (int i = 0; i < colorsCount; ++i) { + colorIndex %= colorsCount; + Integer useCount = index2usage.get(colorIndex % colorsCount); + if (useCount == null) useCount = 0; + if (useCount == cutoff) break out; + ++colorIndex; + } + } + id2index.put(id, colorIndex); } + return colorIndex; + } + + @NotNull + protected HighlightInfo.Builder getInfoBuilder(int colorIndex, @Nullable TextAttributesKey colorKey) { if (colorKey == null) { colorKey = DefaultLanguageHighlighterColors.LOCAL_VARIABLE; } @@ -116,8 +176,6 @@ public class RainbowHighlighter { .fromFlyweight(myColorsScheme .getAttributes(colorKey) .getFlyweight() - .withForeground(calculateForeground(colorIndex)))) - .range(id) - .create(); + .withForeground(calculateForeground(colorIndex)))); } } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java index 52e6096c7667..43b2f17de331 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java @@ -86,30 +86,12 @@ public abstract class RainbowVisitor implements HighlightVisitor { @NotNull PsiElement rainbowElement, @NotNull String id, @Nullable TextAttributesKey colorKey) { - HashMap id2index = USED_COLORS.getValue(context); - Integer colorIndex = id2index.get(id); - if (colorIndex == null) { - colorIndex = Math.abs(StringHash.murmur(id, 0x55AA)); - - Map index2usage = new HashMap(); - id2index.values().forEach(i -> { - Integer useCount = index2usage.get(i); - index2usage.put(i, useCount == null ? 1 : ++useCount); - }); - - int colorsCount = getHighlighter().getColorsCount(); - out: - for (int cutoff = 0; ; ++cutoff) { - for (int i = 0; i < colorsCount; ++i) { - colorIndex %= colorsCount; - Integer useCount = index2usage.get(colorIndex % colorsCount); - if (useCount == null) useCount = 0; - if (useCount == cutoff) break out; - ++colorIndex; - } - } - id2index.put(id, colorIndex); - } - return getHighlighter().getInfo(colorIndex, rainbowElement, colorKey); + return getHighlighter() + .getInfo(getHighlighter().getColorIndex( + USED_COLORS.getValue(context), + id, + RainbowHighlighter.getRainbowHash(id)), + rainbowElement, + colorKey); } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index f56409a7ef5a..babd1ad7a464 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -23,6 +23,7 @@ import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.options.colors.ColorSettingsPage; import com.intellij.openapi.options.colors.RainbowColorSettingsPage; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -108,30 +109,28 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe updatePreviewPanel(descriptor); } - private void addRainbowHighlighting(DocumentEx document, @NotNull List data) { - List keys = RainbowHighlighter.getRainbowKeys(); - if (!keys.isEmpty()) { - List newData = new ArrayList(); - int i = 0; + private void addRainbowHighlighting(@NotNull DocumentEx document, + @NotNull List showLineData, + @NotNull List data, + @NotNull RainbowHighlighter rainbowHighlighter, + @NotNull List rainbowTempKeys) { + if (!rainbowTempKeys.isEmpty()) { + List newData = new ArrayList(showLineData); HashMap id2index = new HashMap(); + for (HighlightData d : data) { if (((RainbowColorSettingsPage)myPage).isRainbowType(d.getHighlightKey())) { - // sequential approach for color selection String id = document.getText(TextRange.create(d.getStartOffset(), d.getEndOffset())); - Integer index = id2index.get(id); - if (index == null) { - index = i++ % keys.size(); - id2index.put(id, index); - } - TextAttributesKey type = keys.get(index); - HighlightData rainbow = new HighlightData(d.getStartOffset(), d.getEndOffset(), type); + int index = rainbowHighlighter.getColorIndex(id2index, id, RainbowHighlighter.getRainbowHash(id)); + HighlightData rainbow = new HighlightData(d.getStartOffset(), d.getEndOffset(), rainbowTempKeys.get(index)); + //fixme: twisted coloring in editor. We need add rainbow-tag twice. newData.add(rainbow); newData.add(d); newData.add(rainbow); } - else { + else if (!RainbowHighlighter.isRainbowTempKey(d.getHighlightKey())) { newData.add(d); } } @@ -170,13 +169,20 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe if (myActive == myRainbowPanel && myPage instanceof RainbowColorSettingsPage && descriptor instanceof RainbowAttributeDescriptor) { - simpleEditorPreview.setDemoText(((RainbowColorSettingsPage)myPage).getRainbowDemoText()); - List highlightDatas = simpleEditorPreview.getHighlightDataForExtension(); if (myRainbowPanel.myGlobalState.isRainbowOn) { - addRainbowHighlighting(simpleEditorPreview.getEditor().getDocument(), highlightDatas); + RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); + List tempKeys = highlighter.getRainbowTempKeys(); + Pair> demo = getColorDemoLine(highlighter, tempKeys); + simpleEditorPreview.setDemoText(demo.first + "\n" + ((RainbowColorSettingsPage)myPage).getRainbowDemoText()); + addRainbowHighlighting(simpleEditorPreview.getEditor().getDocument(), + demo.second, + simpleEditorPreview.getHighlightDataForExtension(), + highlighter, + tempKeys); } else { - removeRainbowHighlighting(highlightDatas); + simpleEditorPreview.setDemoText(((RainbowColorSettingsPage)myPage).getRainbowDemoText()); + removeRainbowHighlighting(simpleEditorPreview.getHighlightDataForExtension()); } } else { @@ -184,6 +190,28 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe } } + @NotNull + private static Pair> getColorDemoLine(RainbowHighlighter highlighter, List tempKeys) { + int colorsCount = highlighter.getColorsCount(); + int stopCount = RainbowHighlighter.getRainbowKeys().size(); + List markup = new ArrayList(colorsCount); + StringBuilder sb = new StringBuilder(); + int pos = 0; + int i = 0; + for (TextAttributesKey key : tempKeys) { + String toAdd = (i % stopCount == 0) ? "Stop#" + String.valueOf(i / stopCount + 1) : "T"; + int end = pos + toAdd.length(); + markup.add(new HighlightData(pos, end, key)); + if (sb.length() != 0) { + sb.append(" "); + } + sb.append(toAdd); + pos = end + 1; + ++i; + } + return Pair.create(sb.toString(), markup); + } + @Override public void addListener(@NotNull Listener listener) { myRainbowPanel.addListener(listener); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form index acf9a1722aed..445133c29f42 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form @@ -3,7 +3,7 @@ - + @@ -153,7 +153,9 @@ - + + + @@ -162,6 +164,7 @@ + @@ -170,7 +173,11 @@ + + + + diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 57271d875335..d035a7428c18 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -744,5 +744,5 @@ remote.desktop.detected.message=Animation disabled checkbox.line.comment.add.space=Add a space at comment start rainbow.option.panel.display.name=Semantic highlighting -label.base.color=Override gradient color -checkbox.rainbow=Unique color for each
parameter and local variable \ No newline at end of file +label.base.color=Override gradient stop +checkbox.rainbow=Unique color for each
parameter and local variable
Chosen from generated gradient \ No newline at end of file From 9023c96ded3988e30b8d9a1f2846fb5324a48614 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Wed, 10 Aug 2016 12:27:51 +0300 Subject: [PATCH 03/17] IDEA-158861 changes from review --- .../options/colors/ColorAndFontOptions.java | 36 ++++----- .../colors/CustomizedSwitcherPanel.java | 78 +++++++++++++------ .../colors/RainbowDescriptionPanel.form | 56 +++++++------ .../options/colors/SimpleEditorPreview.java | 63 ++++++++------- .../src/messages/ApplicationBundle.properties | 5 +- 5 files changed, 140 insertions(+), 98 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java index c90af35acfee..bdd6d1c9a7dc 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java @@ -538,26 +538,26 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract String group = provider.getDisplayName(); List attributeDescriptors = ColorSettingsUtil.getAllAttributeDescriptors(provider); //todo: single point configuration? - //if (provider instanceof RainbowColorSettingsPage) { - // descriptions.add(new RainbowAttributeDescriptor(group, - // ApplicationBundle.message("rainbow.option.panel.display.name"), - // scheme, - // scheme.getInitRainbowState(), - // scheme.getCurrentRainbowState())); - //} + if (provider instanceof RainbowColorSettingsPage) { + descriptions.add(new RainbowAttributeDescriptor(group, + ApplicationBundle.message("rainbow.option.panel.display.name"), + scheme, + scheme.getInitRainbowState(), + scheme.getCurrentRainbowState())); + } for (AttributesDescriptor descriptor : attributeDescriptors) { addSchemedDescription(descriptions, descriptor.getDisplayName(), group, descriptor.getKey(), scheme, null, null); - if (provider instanceof RainbowColorSettingsPage - && ((RainbowColorSettingsPage)provider).isRainbowType(descriptor.getKey())) { - //todo: joined sub-descriptor - descriptions.add(new RainbowAttributeDescriptor(group, - descriptor.getDisplayName() - + EditorSchemeAttributeDescriptorWithPath.NAME_SEPARATOR - + ApplicationBundle.message("rainbow.option.panel.display.name"), - scheme, - scheme.getInitRainbowState(), - scheme.getCurrentRainbowState())); - } + // if (provider instanceof RainbowColorSettingsPage + // && ((RainbowColorSettingsPage)provider).isRainbowType(descriptor.getKey())) { + // //todo: joined sub-descriptor? + // descriptions.add(new RainbowAttributeDescriptor(group, + // descriptor.getDisplayName() + // + EditorSchemeAttributeDescriptorWithPath.NAME_SEPARATOR + // + ApplicationBundle.message("rainbow.option.panel.display.name"), + // scheme, + // scheme.getInitRainbowState(), + // scheme.getCurrentRainbowState())); + // } } ColorDescriptor[] colorDescriptors = provider.getColorDescriptors(); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index babd1ad7a464..e32494bb4557 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -17,14 +17,17 @@ package com.intellij.application.options.colors; import com.intellij.application.options.colors.highlighting.HighlightData; import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.ex.DocumentEx; +import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.options.colors.ColorSettingsPage; import com.intellij.openapi.options.colors.RainbowColorSettingsPage; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -68,14 +71,13 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe public void resetDefault() { myActive = null; if (getComponentCount() != 0) { + final PaintLocker locker = new PaintLocker(this); try { - setIgnoreRepaint(true); setPreferredSize(getSize()); remove(0); } finally { - setIgnoreRepaint(false); - revalidate(); + locker.release(); } } } @@ -91,9 +93,8 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe } if (getComponentCount() == 0 || myActive != getComponent(0)) { - boolean ignoreRepaint = getIgnoreRepaint(); + final PaintLocker locker = new PaintLocker(this); try { - setIgnoreRepaint(true); if (getComponentCount() != 0) { remove(0); } @@ -101,8 +102,7 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe add((JPanel)myActive); } finally { - setIgnoreRepaint(ignoreRepaint); - revalidate(); + locker.release(); } } myActive.reset(descriptor); @@ -110,12 +110,14 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe } private void addRainbowHighlighting(@NotNull DocumentEx document, - @NotNull List showLineData, + @Nullable List showLineData, @NotNull List data, @NotNull RainbowHighlighter rainbowHighlighter, @NotNull List rainbowTempKeys) { if (!rainbowTempKeys.isEmpty()) { - List newData = new ArrayList(showLineData); + List newData = new ArrayList(); + if (showLineData != null) newData.addAll(showLineData); + HashMap id2index = new HashMap(); for (HighlightData d : data) { @@ -163,31 +165,42 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe protected void updatePreviewPanel(@NotNull EditorSchemeAttributeDescriptor descriptor) { if (!(myPreviewPanel instanceof SimpleEditorPreview)) return; + UIUtil.invokeAndWaitIfNeeded((Runnable)() -> ApplicationManager.getApplication().runWriteAction(() -> { + SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; + String demoText = (myPage instanceof RainbowColorSettingsPage + && descriptor instanceof RainbowAttributeDescriptor) + ? ((RainbowColorSettingsPage)myPage).getRainbowDemoText() + : myPage.getDemoText(); + List showLineData = null; - SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; - - if (myActive == myRainbowPanel - && myPage instanceof RainbowColorSettingsPage - && descriptor instanceof RainbowAttributeDescriptor) { - if (myRainbowPanel.myGlobalState.isRainbowOn) { + if (myPage instanceof RainbowColorSettingsPage && myRainbowPanel.myGlobalState.isRainbowOn) { RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); List tempKeys = highlighter.getRainbowTempKeys(); - Pair> demo = getColorDemoLine(highlighter, tempKeys); - simpleEditorPreview.setDemoText(demo.first + "\n" + ((RainbowColorSettingsPage)myPage).getRainbowDemoText()); - addRainbowHighlighting(simpleEditorPreview.getEditor().getDocument(), - demo.second, + EditorEx editor = simpleEditorPreview.getEditor(); + if (myActive == myRainbowPanel) { + Pair> demo = getColorDemoLine(highlighter, tempKeys); + simpleEditorPreview.setDemoText(demo.first + "\n" + demoText); + showLineData = demo.second; + } + else { + simpleEditorPreview.setDemoText(demoText); + } + addRainbowHighlighting(editor.getDocument(), + showLineData, simpleEditorPreview.getHighlightDataForExtension(), highlighter, tempKeys); } else { - simpleEditorPreview.setDemoText(((RainbowColorSettingsPage)myPage).getRainbowDemoText()); + simpleEditorPreview.setDemoText(demoText); removeRainbowHighlighting(simpleEditorPreview.getHighlightDataForExtension()); } - } - else { - simpleEditorPreview.setDemoText(myPage.getDemoText()); - } + + simpleEditorPreview.updateView(); + if (descriptor instanceof RainbowAttributeDescriptor) { + simpleEditorPreview.scrollHighlightInView(showLineData); + } + })); } @NotNull @@ -217,4 +230,21 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe myRainbowPanel.addListener(listener); myColorAndFontPanel.addListener(listener); } + + private static class PaintLocker { + private Container myPaintHolder; + private boolean myPaintState; + + public PaintLocker(@NotNull JComponent component) { + myPaintHolder = component.getParent(); + myPaintState = myPaintHolder.getIgnoreRepaint(); + myPaintHolder.setIgnoreRepaint(true); + } + + public void release() { + myPaintHolder.validate(); + myPaintHolder.setIgnoreRepaint(myPaintState); + myPaintHolder.repaint(); + } + } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form index 445133c29f42..6cc712de6880 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form @@ -1,25 +1,33 @@
- + - + - + + + + + + + + + - - + + @@ -28,7 +36,7 @@ - + @@ -38,7 +46,7 @@ - + @@ -46,7 +54,7 @@ - + @@ -54,7 +62,7 @@ - + @@ -64,7 +72,7 @@ - + @@ -72,7 +80,7 @@ - + @@ -80,7 +88,7 @@ - + @@ -90,7 +98,7 @@ - + @@ -98,7 +106,7 @@ - + @@ -106,7 +114,7 @@ - + @@ -116,7 +124,7 @@ - + @@ -124,7 +132,7 @@ - + @@ -132,7 +140,7 @@ - + @@ -142,7 +150,7 @@ - + @@ -151,7 +159,7 @@ - + @@ -183,18 +191,18 @@ - + - + - - + + diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java index b257d2e90c89..527b469ce619 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java @@ -18,14 +18,15 @@ package com.intellij.application.options.colors; import com.intellij.application.options.colors.highlighting.HighlightData; import com.intellij.application.options.colors.highlighting.HighlightsExtractor; +import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.ide.highlighter.HighlighterFactory; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.event.CaretAdapter; import com.intellij.openapi.editor.event.CaretEvent; @@ -36,19 +37,21 @@ import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.options.colors.ColorSettingsPage; import com.intellij.openapi.options.colors.EditorHighlightingProvidingColorSettingsPage; -import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.psi.tree.IElementType; import com.intellij.util.Alarm; import com.intellij.util.EventDispatcher; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; public class SimpleEditorPreview implements PreviewPanel { private final ColorSettingsPage myPage; @@ -105,22 +108,16 @@ public class SimpleEditorPreview implements PreviewPanel { } public void setDemoText(final String text) { - UIUtil.invokeAndWaitIfNeeded( new Runnable() { - @Override - public void run() { - ApplicationManager.getApplication().runWriteAction(() -> { - try { - myTextIsChanging = true; - myHighlightData.clear(); - String stripped = myHighlightsExtractor.extractHighlights(text, myHighlightData); - myEditor.getSelectionModel().removeSelection(); - myEditor.getDocument().setText(stripped); - } finally { - myTextIsChanging = false; - } - }); - } - }); + try { + myTextIsChanging = true; + myHighlightData.clear(); + String stripped = myHighlightsExtractor.extractHighlights(text, myHighlightData); + myEditor.getSelectionModel().removeSelection(); + myEditor.getDocument().setText(stripped); + } + finally { + myTextIsChanging = false; + } } private void addMouseMotionListener(final Editor view, @@ -154,7 +151,10 @@ public class SimpleEditorPreview implements PreviewPanel { ClickNavigator.setCursor(editor, Cursor.HAND_CURSOR); } else { - myDispatcher.getMulticaster().selectionInPreviewChanged(highlightData.getHighlightType()); + myDispatcher.getMulticaster().selectionInPreviewChanged( + RainbowHighlighter.isRainbowTempKey(highlightData.getHighlightKey()) + ? RainbowHighlighter.RAINBOW_TYPE + : highlightData.getHighlightType()); } return; } @@ -225,33 +225,36 @@ public class SimpleEditorPreview implements PreviewPanel { myPage.getHighlighter(), true, myBlinkingAlarm, BLINK_COUNT, myPage); - scrollHighlightInView(highlights, myEditor); + scrollHighlightInView(highlights); } } - private static void scrollHighlightInView(final List highlightDatas, final Editor editor) { + void scrollHighlightInView(@Nullable final List highlightDatas) { + if (highlightDatas == null) return; + boolean needScroll = true; int minOffset = Integer.MAX_VALUE; for (HighlightData data : highlightDatas) { - if (isOffsetVisible(editor, data.getStartOffset())) { + if (isOffsetVisible(data.getStartOffset())) { needScroll = false; break; } minOffset = Math.min(minOffset, data.getStartOffset()); } if (needScroll && minOffset != Integer.MAX_VALUE) { - LogicalPosition pos = editor.offsetToLogicalPosition(minOffset); - editor.getScrollingModel().scrollTo(pos, ScrollType.MAKE_VISIBLE); + LogicalPosition pos = myEditor.offsetToLogicalPosition(minOffset); + myEditor.getScrollingModel().scrollTo(pos, ScrollType.MAKE_VISIBLE); } } - private static boolean isOffsetVisible(final Editor editor, final int startOffset) { - Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); - Point point = editor.logicalPositionToXY(editor.offsetToLogicalPosition(startOffset)); - return point.y >= visibleArea.y && point.y < (visibleArea.y + visibleArea.height); + private boolean isOffsetVisible(final int startOffset) { + return myEditor + .getScrollingModel() + .getVisibleArea() + .contains(myEditor.logicalPositionToXY(myEditor.offsetToLogicalPosition(startOffset))); } - private void stopBlinking() { + public void stopBlinking() { myBlinkingAlarm.cancelAllRequests(); } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index d035a7428c18..23f730874349 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -744,5 +744,6 @@ remote.desktop.detected.message=Animation disabled checkbox.line.comment.add.space=Add a space at comment start rainbow.option.panel.display.name=Semantic highlighting -label.base.color=Override gradient stop -checkbox.rainbow=Unique color for each
parameter and local variable
Chosen from generated gradient \ No newline at end of file +label.override.gradient=Override gradient: +label.base.color=Stop +checkbox.rainbow=Unique color for each parameter
and local variable
Chosen from generated gradient \ No newline at end of file From 5055dab3bfbf75014e73e9c14a892018df64397a Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Wed, 10 Aug 2016 20:40:43 +0300 Subject: [PATCH 04/17] IDEA-158861 changes from review #2 --- .../colors/ColorAndFontDescriptionPanel.java | 3 +- .../colors/ColorAndFontGlobalState.java | 3 +- .../colors/CustomizedSwitcherPanel.java | 44 +-- .../colors/RainbowDescriptionPanel.form | 263 ++++++------------ .../colors/RainbowDescriptionPanel.java | 29 +- .../src/messages/ApplicationBundle.properties | 6 +- 6 files changed, 132 insertions(+), 216 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java index 5c1de9b3ee9f..681a42aa8310 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java @@ -31,6 +31,7 @@ import com.intellij.util.BitUtil; import com.intellij.util.EventDispatcher; import com.intellij.util.FontUtil; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -87,7 +88,7 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel super(new BorderLayout()); add(myPanel, BorderLayout.CENTER); - setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 4)); + setBorder(JBUI.Borders.empty(4, 0, 4, 4)); myEffectsModel = new EffectsComboModel(ContainerUtil.newArrayList(myEffectsMap.keySet())); //noinspection unchecked myEffectsCombo.setModel(myEffectsModel); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java index ba0a93d95bc0..3ef237beaf2e 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java @@ -35,6 +35,7 @@ public class ColorAndFontGlobalState { } public void apply() { + //FIXME: we need better place for per-language state storage RainbowHighlighter.setRainbowEnabled(isRainbowOn); } @@ -49,6 +50,6 @@ public class ColorAndFontGlobalState { @Override public int hashCode() { - return 31 * (isRainbowOn ? 1 : 0); + return isRainbowOn ? 1 : 0; } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index e32494bb4557..7d2cb99f76e0 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -69,12 +69,12 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe @Override public void resetDefault() { - myActive = null; - if (getComponentCount() != 0) { + if (myActive != null) { final PaintLocker locker = new PaintLocker(this); try { - setPreferredSize(getSize()); - remove(0); + setPreferredSize(getSize());// froze [this] size + remove(myActive.getPanel()); + myActive = null; } finally { locker.release(); @@ -84,31 +84,41 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe @Override public void reset(@NotNull EditorSchemeAttributeDescriptor descriptor) { - myActive = null; - if (descriptor instanceof RainbowAttributeDescriptor) { - myActive = myRainbowPanel; - } - else if (descriptor instanceof ColorAndFontDescription) { - myActive = myColorAndFontPanel; - } + JComponent oldPanel = myActive == null ? null : myActive.getPanel(); + myActive = getPanelForDescriptor(descriptor); + JComponent newPanel = myActive == null ? null : myActive.getPanel(); - if (getComponentCount() == 0 || myActive != getComponent(0)) { + if (oldPanel != newPanel) { final PaintLocker locker = new PaintLocker(this); try { - if (getComponentCount() != 0) { - remove(0); + if (oldPanel != null) { + remove(oldPanel); + } + if (newPanel != null) { + setPreferredSize(null);// make [this] resizable + add(newPanel); } - setPreferredSize(null); - add((JPanel)myActive); } finally { locker.release(); } } - myActive.reset(descriptor); + if (myActive != null) { + myActive.reset(descriptor); + } updatePreviewPanel(descriptor); } + protected OptionsPanelImpl.ColorDescriptionPanel getPanelForDescriptor(@NotNull EditorSchemeAttributeDescriptor descriptor) { + if (descriptor instanceof RainbowAttributeDescriptor) { + return myRainbowPanel; + } + else if (descriptor instanceof ColorAndFontDescription) { + return myColorAndFontPanel; + } + return null; + } + private void addRainbowHighlighting(@NotNull DocumentEx document, @Nullable List showLineData, @NotNull List data, diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form index 6cc712de6880..d5fdb212f674 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form @@ -1,214 +1,115 @@ - + - + - + + + - + - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index a5964959e020..3242437eb30a 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -17,12 +17,11 @@ package com.intellij.application.options.colors; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; -import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pair; import com.intellij.ui.ColorPanel; -import com.intellij.ui.HyperlinkAdapter; import com.intellij.ui.components.JBCheckBox; import com.intellij.util.EventDispatcher; +import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -52,9 +51,8 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. protected ColorPanel myStop5; private ColorPanel[] myStops = new ColorPanel[]{myStop1, myStop2, myStop3, myStop4, myStop5}; - private JTextPane myInheritanceLabel; - - private JBCheckBox myInheritAttributesBox; + //private JTextPane myInheritanceLabel; + //private JBCheckBox myInheritAttributesBox; private JBCheckBox myRainbow; ColorAndFontGlobalState myGlobalState; @@ -64,28 +62,29 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. myGlobalState = globalState; add(myPanel, BorderLayout.CENTER); - setBorder(BorderFactory.createEmptyBorder(4, 0, 4, 4)); + setBorder(JBUI.Borders.empty(4, 0, 4, 4)); ActionListener actionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onSettingsChanged(e); } }; - for (JBCheckBox c : new JBCheckBox[]{myRainbow, myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5, myInheritAttributesBox}) { + for (JBCheckBox c : new JBCheckBox[]{myRainbow, myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5/*, myInheritAttributesBox*/}) { c.addActionListener(actionListener); } for (ColorPanel c : new ColorPanel[]{myStop1, myStop2, myStop3, myStop4, myStop5}) { c.addActionListener(actionListener); } - Messages.configureMessagePaneUi(myInheritanceLabel, "", null); - myInheritanceLabel.addHyperlinkListener(new HyperlinkAdapter() { - @Override - protected void hyperlinkActivated(HyperlinkEvent e) { - onHyperLinkClicked(e); - } - }); - myInheritanceLabel.setBorder(BorderFactory.createEmptyBorder()); + // FIXME: inherited per-language on/off + //Messages.configureMessagePaneUi(myInheritanceLabel, "", null); + //myInheritanceLabel.addHyperlinkListener(new HyperlinkAdapter() { + // @Override + // protected void hyperlinkActivated(HyperlinkEvent e) { + // onHyperLinkClicked(e); + // } + //}); + //myInheritanceLabel.setBorder(BorderFactory.createEmptyBorder()); } @NotNull diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 23f730874349..7954be9723f7 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -745,5 +745,9 @@ checkbox.line.comment.add.space=Add a space at comment start rainbow.option.panel.display.name=Semantic highlighting label.override.gradient=Override gradient: -label.base.color=Stop +checkbox.stop.1=Stop #1 +checkbox.stop.2=Stop #2 +checkbox.stop.3=Stop #3 +checkbox.stop.4=Stop #4 +checkbox.stop.5=Stop #5 checkbox.rainbow=Unique color for each parameter
and local variable
Chosen from generated gradient \ No newline at end of file From c6f40c0a0c483957bb7ebec7331ca452c8725bfd Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Thu, 11 Aug 2016 10:49:55 +0300 Subject: [PATCH 05/17] IDEA-158861 remove prefered sizes from form --- .../colors/RainbowDescriptionPanel.form | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form index d5fdb212f674..021b9593a05e 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form @@ -1,18 +1,16 @@
- + - + - - - + @@ -20,9 +18,7 @@ - - - + @@ -30,19 +26,17 @@ - + - - - + - + @@ -50,13 +44,13 @@ - + - + @@ -64,13 +58,13 @@ - + - + @@ -78,13 +72,13 @@ - + - + @@ -92,13 +86,13 @@ - + - + @@ -106,7 +100,7 @@ - + From adfb17a88265d2e4f68bd0176d372996532aeb12 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Thu, 11 Aug 2016 14:10:14 +0300 Subject: [PATCH 06/17] IDEA-158861 add Language Defaults to Semantic markup --- .../colors/ColorAndFontGlobalState.java | 31 ++++++++++++--- .../colors/CustomizedSwitcherPanel.java | 2 +- .../options/colors/OptionsPanelImpl.java | 9 +++++ .../colors/RainbowDescriptionPanel.java | 7 ++-- .../pages/DefaultLanguageColorsPage.java | 38 ++++++++++++++++++- 5 files changed, 75 insertions(+), 12 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java index 3ef237beaf2e..f70bd1dac825 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java @@ -16,13 +16,24 @@ package com.intellij.application.options.colors; import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.util.EventDispatcher; import org.jetbrains.annotations.NotNull; public class ColorAndFontGlobalState { - public boolean isRainbowOn; + private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); + + private boolean myIsRainbowOn; + public boolean isRainbowOn() { + return myIsRainbowOn; + } + public void setRainbowOn(boolean rainbowOn) { + if (rainbowOn != myIsRainbowOn) { + myIsRainbowOn = rainbowOn; + } + } ColorAndFontGlobalState() { - isRainbowOn = RainbowHighlighter.isRainbowEnabled(); + myIsRainbowOn = RainbowHighlighter.isRainbowEnabled(); } public ColorAndFontGlobalState(@NotNull ColorAndFontGlobalState state) { @@ -31,12 +42,12 @@ public class ColorAndFontGlobalState { public void copyFrom(@NotNull ColorAndFontGlobalState state) { assert this != state; - isRainbowOn = state.isRainbowOn; + myIsRainbowOn = state.myIsRainbowOn; } public void apply() { //FIXME: we need better place for per-language state storage - RainbowHighlighter.setRainbowEnabled(isRainbowOn); + RainbowHighlighter.setRainbowEnabled(myIsRainbowOn); } @Override @@ -45,11 +56,19 @@ public class ColorAndFontGlobalState { if (o == null || getClass() != o.getClass()) return false; ColorAndFontGlobalState state = (ColorAndFontGlobalState)o; - return isRainbowOn == state.isRainbowOn; + return myIsRainbowOn == state.myIsRainbowOn; } @Override public int hashCode() { - return isRainbowOn ? 1 : 0; + return myIsRainbowOn ? 1 : 0; + } + + public void addListener(@NotNull ColorAndFontSettingsListener listener) { + myDispatcher.addListener(listener); + } + + public void stateChanged() { + myDispatcher.getMulticaster().settingsChanged(); } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index 7d2cb99f76e0..cc1979e48a3b 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -183,7 +183,7 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe : myPage.getDemoText(); List showLineData = null; - if (myPage instanceof RainbowColorSettingsPage && myRainbowPanel.myGlobalState.isRainbowOn) { + if (myPage instanceof RainbowColorSettingsPage && myRainbowPanel.myGlobalState.isRainbowOn()) { RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); List tempKeys = highlighter.getRainbowTempKeys(); EditorEx editor = simpleEditorPreview.getEditor(); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java index 4bdd6b9c2407..3b874dd679fe 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java @@ -74,6 +74,7 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { @Override public void onSettingsChanged(ActionEvent e) { myDispatcher.getMulticaster().settingsChanged(); + myOptions.getGlobalOption().stateChanged(); } @Override @@ -99,6 +100,14 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { } }); + myOptions.getGlobalOption().addListener(new ColorAndFontSettingsListener.Abstract() { + @Override + public void settingsChanged() { + if (!mySchemesProvider.areSchemesLoaded()) return; + processListValueChanged(); + } + }); + myOptionsTree = new ColorOptionsTree(myCategoryName); myOptionsTree.addTreeSelectionListener(new TreeSelectionListener() { diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index 3242437eb30a..6d8eaf976bb0 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -113,9 +113,9 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. List> rainbowCurState = descriptor.getRainbowCurState(); if (rainbowCurState.size() < myCbStops.length) return; - myRainbow.setSelected(myGlobalState.isRainbowOn); + myRainbow.setSelected(myGlobalState.isRainbowOn()); - boolean isEnable = !ColorAndFontOptions.isReadOnly(attributeDescriptor.getScheme()) && myGlobalState.isRainbowOn; + boolean isEnable = !ColorAndFontOptions.isReadOnly(attributeDescriptor.getScheme()) && myGlobalState.isRainbowOn(); for (int i = 0; i < myCbStops.length; ++i) { Pair state = rainbowCurState.get(i); myCbStops[i].setEnabled(isEnable); @@ -136,14 +136,13 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. List> rainbowCurState = descriptor.getRainbowCurState(); if (rainbowCurState.size() < myCbStops.length) return; - myGlobalState.isRainbowOn = myRainbow.isSelected(); + myGlobalState.setRainbowOn(myRainbow.isSelected()); for (int i = 0; i < myCbStops.length; ++i) { boolean isOverride = myCbStops[i].isSelected(); rainbowCurState.set(i, Pair.create(isOverride, isOverride ? myStops[i].getSelectedColor() : descriptor.getDefaultColor(i))); } - reset(descriptor); descriptor.apply(scheme); } diff --git a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java index 22c78ac45401..d452ccefbdc2 100644 --- a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java +++ b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java @@ -25,6 +25,7 @@ import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.options.colors.AttributesDescriptor; import com.intellij.openapi.options.colors.ColorDescriptor; import com.intellij.openapi.options.colors.ColorSettingsPage; +import com.intellij.openapi.options.colors.RainbowColorSettingsPage; import com.intellij.psi.codeStyle.DisplayPriority; import com.intellij.psi.codeStyle.DisplayPrioritySortable; import org.jetbrains.annotations.NonNls; @@ -40,7 +41,7 @@ import java.util.Map; * * @author Rustam Vishnyakov */ -public class DefaultLanguageColorsPage implements ColorSettingsPage, DisplayPrioritySortable { +public class DefaultLanguageColorsPage implements RainbowColorSettingsPage, DisplayPrioritySortable { @NonNls private static final Map TAG_HIGHLIGHTING_MAP = new HashMap(); @@ -256,4 +257,39 @@ public class DefaultLanguageColorsPage implements ColorSettingsPage, DisplayPrio public DisplayPriority getPriority() { return DisplayPriority.GENERAL_SETTINGS; } + + @Override + public boolean isRainbowType(TextAttributesKey type) { + return DefaultLanguageHighlighterColors.LOCAL_VARIABLE.equals(type) + || DefaultLanguageHighlighterColors.PARAMETER.equals(type) + || DefaultLanguageHighlighterColors.DOC_COMMENT_TAG_VALUE.equals(type); + } + + @NotNull + @Override + public String getRainbowDemoText() { + return + "Global variable1\n" + + "Global variable2\n" + + "/** \n" + + " * Doc comment\n" + + " * @tag Markup\n" + + " * @param parameter1 documentation\n" + + " * @param parameter2 documentation\n" + + " * @param parameter3 documentation\n" + + " * @param parameter4 documentation\n" + + " * @param parameter5 documentation\n" + + " */\n" + + "Function declaration (parameter1\n" + + " parameter2\n" + + " parameter3\n" + + " parameter4\n" + + " parameter5)\n" + + " Local variable1\n" + + " Local variable2\n" + + " Local variable3\n" + + " Local variable4\n" + + " Local variable5\n" + + "Function call()"; + } } From 2182ee66db47d1074cd88e7903d9ff8a9bfc72e1 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Thu, 11 Aug 2016 15:30:49 +0300 Subject: [PATCH 07/17] IDEA-158861 add Language Defaults to Semantic markup #2 --- .../application/options/colors/OptionsPanelImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java index 3e3ec149bc04..6cca7f03c4b8 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java @@ -104,7 +104,10 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { @Override public void settingsChanged() { if (!mySchemesProvider.areSchemesLoaded()) return; - processListValueChanged(); + if (myOptionsTree.getSelectedValue() != null) { + // update options & preview after global state change + processListValueChanged(); + } } }); From 8b75b8dc5219c76b48a9f68cc5be4a5a9d2e521b Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Sat, 20 Aug 2016 01:15:40 +0300 Subject: [PATCH 08/17] IDEA-158861 resolve merge conflicts --- .../codeHighlighting/RainbowHighlighter.java | 50 +++++++++++++++++-- .../codeInsight/daemon/UsedColors.java | 28 ++--------- .../colors/CustomizedSwitcherPanel.java | 40 +++++---------- .../colors/RainbowAttributeDescriptor.java | 6 +-- 4 files changed, 67 insertions(+), 57 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java index ffadaea460cf..d42687c685ce 100644 --- a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java +++ b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java @@ -25,11 +25,13 @@ import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.colors.TextAttributesScheme; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringHash; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.ui.ColorUtil; import com.intellij.ui.JBColor; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,7 +46,7 @@ public class RainbowHighlighter { new JBColor(0x005910, 0xbe9970), new JBColor(0xbc5150, 0x9d527c), }; - private static final TextAttributesKey[] RAINBOW_COLOR_KEYS = new TextAttributesKey[RAINBOW_JB_COLORS_DEFAULT.length]; + public static final TextAttributesKey[] RAINBOW_COLOR_KEYS = new TextAttributesKey[RAINBOW_JB_COLORS_DEFAULT.length]; private static final int RAINBOW_COLORS_BETWEEN = 4; private static final String UNIT_TEST_COLORS = "#000001,#000002,#000003,#000004"; // Do not modify! static { @@ -54,6 +56,8 @@ public class RainbowHighlighter { RAINBOW_COLOR_KEYS[i] = TextAttributesKey.createTextAttributesKey("RAINBOW_COLOR" + i, textAttributes); } } + public final static String RAINBOW_TYPE = "rainbow"; + private final static String RAINBOW_TEMP_PREF = "RAINBOW_TEMP_"; @NotNull private final TextAttributesScheme myColorsScheme; @NotNull private final Color[] myRainbowColors; @@ -73,7 +77,32 @@ public class RainbowHighlighter { Registry.get("editor.rainbow.identifiers").setValue(enabled); } + public static int hashColor(@NotNull String name, int colorsCount) { + return Math.abs(StringHash.murmur(name, 0x55AA)) % colorsCount; + } + + public static int getColorIndex(@NotNull int[] index2usage, int hashedIndex, int colorsCount) { + int minIndex1 = indexOfMin(index2usage, hashedIndex, colorsCount); + int minIndex2 = indexOfMin(index2usage, 0, hashedIndex); + return index2usage[minIndex1] <= index2usage[minIndex2] ? minIndex1 : minIndex2; + } + + @Contract(pure = true) + private static int indexOfMin(@NotNull int[] index2usage, int start, int end) { + int min = Integer.MAX_VALUE; + int minIndex = start; + for (int i = start; i < end; i++) { + int value = index2usage[i]; + if (value < min) { + min = value; + minIndex = i; + } + } + return minIndex; + } + @NotNull + @Contract(pure = true) private Color calculateForeground(int colorIndex) { return myRainbowColors[colorIndex]; } @@ -93,11 +122,26 @@ public class RainbowHighlighter { return registryColors.stream().map(s -> ColorUtil.fromHex(s.trim())).toArray(Color[]::new); } - List foregroundColors = ContainerUtil.map(RAINBOW_COLOR_KEYS, key -> colorsScheme.getAttributes(key).getForegroundColor()); - List colors = ColorGenerator.generateLinearColorSequence(foregroundColors, RAINBOW_COLORS_BETWEEN); + List stopColors = ContainerUtil.map(RAINBOW_COLOR_KEYS, key -> colorsScheme.getAttributes(key).getForegroundColor()); + List colors = ColorGenerator.generateLinearColorSequence(stopColors, RAINBOW_COLORS_BETWEEN); return colors.toArray(new Color[colors.size()]); } + @NotNull + public TextAttributesKey[] getRainbowTempKeys() { + TextAttributesKey[] keys = new TextAttributesKey[myRainbowColors.length]; + for (int i = 0; i < myRainbowColors.length; ++i) { + TextAttributesKey key = TextAttributesKey.createTextAttributesKey(RAINBOW_TEMP_PREF + i, new TextAttributes()); + key.getDefaultAttributes().setForegroundColor(myRainbowColors[i]); + keys[i] = key; + } + return keys; + } + + public static boolean isRainbowTempKey(TextAttributesKey key) { + return key.getExternalName().startsWith(RAINBOW_TEMP_PREF); + } + public HighlightInfo getInfo(int colorIndex, @Nullable PsiElement id, @Nullable TextAttributesKey colorKey) { return id == null ? null : getInfoBuilder(colorIndex, colorKey).range(id).create(); } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java index c656596236c7..18cb439691af 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java @@ -18,7 +18,6 @@ package com.intellij.codeInsight.daemon; import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolderEx; -import com.intellij.openapi.util.text.StringHash; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; @@ -49,7 +48,7 @@ class UsedColors { while (true) { Object newColors; if (data == null) { - colorIndex = hashColor(name, colorsCount); + colorIndex = RainbowHighlighter.hashColor(name, colorsCount); newColors = new UsedColor(name, colorIndex); // put an object instead of array to save space } else if (data instanceof UsedColor) { @@ -59,7 +58,7 @@ class UsedColors { newColors = null; // found, no need to create new } else { - int hashedIndex = hashColor(name, colorsCount); + int hashedIndex = RainbowHighlighter.hashColor(name, colorsCount); if (hashedIndex == usedColor.index) hashedIndex = (hashedIndex + 1) % colorsCount; colorIndex = hashedIndex; UsedColor newColor = new UsedColor(name, colorIndex); @@ -68,7 +67,7 @@ class UsedColors { } else { colorIndex = -1; - int hashedIndex = hashColor(name, colorsCount); + int hashedIndex = RainbowHighlighter.hashColor(name, colorsCount); int[] index2usage = new int[colorsCount]; UsedColor[] usedColors = (UsedColor[])data; for (UsedColor usedColor : usedColors) { @@ -80,9 +79,7 @@ class UsedColors { } } if (colorIndex == -1) { - int minIndex1 = indexOfMin(index2usage, hashedIndex, colorsCount); - int minIndex2 = indexOfMin(index2usage, 0, hashedIndex); - colorIndex = index2usage[minIndex1] <= index2usage[minIndex2] ? minIndex1 : minIndex2; + colorIndex = RainbowHighlighter.getColorIndex(index2usage, hashedIndex, colorsCount); UsedColor newColor = new UsedColor(name, colorIndex); newColors = ArrayUtil.append(usedColors, newColor); } @@ -97,21 +94,4 @@ class UsedColors { return colorIndex; } - - private static int hashColor(@NotNull String name, int colorsCount) { - return Math.abs(StringHash.murmur(name, 0x55AA)) % colorsCount; - } - - private static int indexOfMin(@NotNull int[] values, int start, int end) { - int min = Integer.MAX_VALUE; - int minIndex = start; - for (int i = start; i < end; i++) { - int value = values[i]; - if (value < min) { - min = value; - minIndex = i; - } - } - return minIndex; - } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index cc1979e48a3b..3e23da008b81 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -123,40 +123,27 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe @Nullable List showLineData, @NotNull List data, @NotNull RainbowHighlighter rainbowHighlighter, - @NotNull List rainbowTempKeys) { - if (!rainbowTempKeys.isEmpty()) { - List newData = new ArrayList(); + @NotNull TextAttributesKey[] rainbowTempKeys) { + int colorCount = rainbowTempKeys.length; + if (colorCount != 0) { + List newData = new ArrayList<>(); if (showLineData != null) newData.addAll(showLineData); - HashMap id2index = new HashMap(); - + int[] index2usage = new int[colorCount]; for (HighlightData d : data) { if (((RainbowColorSettingsPage)myPage).isRainbowType(d.getHighlightKey())) { String id = document.getText(TextRange.create(d.getStartOffset(), d.getEndOffset())); - int index = rainbowHighlighter.getColorIndex(id2index, id, RainbowHighlighter.getRainbowHash(id)); - HighlightData rainbow = new HighlightData(d.getStartOffset(), d.getEndOffset(), rainbowTempKeys.get(index)); + int index = RainbowHighlighter.getColorIndex(index2usage, RainbowHighlighter.hashColor(id, colorCount), colorCount); + ++index2usage[index]; + HighlightData rainbow = new HighlightData(d.getStartOffset(), d.getEndOffset(), rainbowTempKeys[index]); //fixme: twisted coloring in editor. We need add rainbow-tag twice. newData.add(rainbow); newData.add(d); newData.add(rainbow); } - else if (!RainbowHighlighter.isRainbowTempKey(d.getHighlightKey())) { - newData.add(d); - } - } - data.clear(); - data.addAll(newData); - } - } - - private static void removeRainbowHighlighting(@NotNull List data) { - List keys = RainbowHighlighter.getRainbowKeys(); - if (!keys.isEmpty()) { - List newData = new ArrayList(); - for (HighlightData d : data) { - if (!keys.contains(d.getHighlightKey())) { + else { newData.add(d); } } @@ -185,7 +172,7 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe if (myPage instanceof RainbowColorSettingsPage && myRainbowPanel.myGlobalState.isRainbowOn()) { RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); - List tempKeys = highlighter.getRainbowTempKeys(); + TextAttributesKey[] tempKeys = highlighter.getRainbowTempKeys(); EditorEx editor = simpleEditorPreview.getEditor(); if (myActive == myRainbowPanel) { Pair> demo = getColorDemoLine(highlighter, tempKeys); @@ -203,7 +190,6 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe } else { simpleEditorPreview.setDemoText(demoText); - removeRainbowHighlighting(simpleEditorPreview.getHighlightDataForExtension()); } simpleEditorPreview.updateView(); @@ -214,10 +200,10 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe } @NotNull - private static Pair> getColorDemoLine(RainbowHighlighter highlighter, List tempKeys) { + private static Pair> getColorDemoLine(RainbowHighlighter highlighter, TextAttributesKey[] tempKeys) { int colorsCount = highlighter.getColorsCount(); - int stopCount = RainbowHighlighter.getRainbowKeys().size(); - List markup = new ArrayList(colorsCount); + int stopCount = RainbowHighlighter.RAINBOW_COLOR_KEYS.length; + List markup = new ArrayList<>(colorsCount); StringBuilder sb = new StringBuilder(); int pos = 0; int i = 0; diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java index a036071b31ea..9f967df90a92 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java @@ -83,14 +83,14 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP } public Color getDefaultColor(int index) { - return RainbowHighlighter.getRainbowKeys().get(index).getDefaultAttributes().getForegroundColor(); + return RainbowHighlighter.RAINBOW_COLOR_KEYS[index].getDefaultAttributes().getForegroundColor(); } public static class RainbowInSchemeState { private final List> myRainbowState = new ArrayList<>(); public RainbowInSchemeState(@NotNull EditorColorsScheme scheme) { - for (TextAttributesKey rainbowKey : RainbowHighlighter.getRainbowKeys()) { + for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { myRainbowState.add(getColorStateFromScheme(scheme, rainbowKey)); } } @@ -108,7 +108,7 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP public void apply(@NotNull EditorColorsScheme scheme) { int i = 0; - for (TextAttributesKey rainbowKey : RainbowHighlighter.getRainbowKeys()) { + for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { Pair pair = myRainbowState.get(i); scheme.setAttributes(rainbowKey, pair.first ? new TextAttributes(pair.second, null, null, null, Font.PLAIN) : rainbowKey.getDefaultAttributes()); From 905885c7dc2a0691aa26fe8fcdf5b4ca9399dbb2 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Mon, 22 Aug 2016 11:02:06 +0300 Subject: [PATCH 09/17] IDEA-158861 cleanup --- .../options/colors/SimpleEditorPreview.java | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java index 281c60335e82..4e23aa6b5c61 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java @@ -30,7 +30,6 @@ import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.event.CaretAdapter; import com.intellij.openapi.editor.event.CaretEvent; -import com.intellij.openapi.editor.event.CaretListener; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.highlighter.HighlighterIterator; @@ -58,7 +57,7 @@ public class SimpleEditorPreview implements PreviewPanel { private final EditorEx myEditor; private final Alarm myBlinkingAlarm; - private final List myHighlightData = new ArrayList(); + private final List myHighlightData = new ArrayList<>(); private final ColorAndFontOptions myOptions; @@ -79,27 +78,30 @@ public class SimpleEditorPreview implements PreviewPanel { myOptions = options; myPage = page; - String text = page.getDemoText(); - myHighlightsExtractor = new HighlightsExtractor(page.getAdditionalHighlightingTagToDescriptorMap()); - String stripped = myHighlightsExtractor.extractHighlights(text, myHighlightData); - int selectedLine = -1; - myEditor = (EditorEx)FontEditorPreview.createPreviewEditor(stripped, 10, 3, selectedLine, myOptions, false); + myEditor = (EditorEx)FontEditorPreview.createPreviewEditor( + myHighlightsExtractor.extractHighlights(page.getDemoText(), myHighlightData), // text without tags + 10, 3, -1, myOptions, false); FontEditorPreview.installTrafficLights(myEditor); myBlinkingAlarm = new Alarm().setActivationComponent(myEditor.getComponent()); if (navigatable) { - addMouseMotionListener(myEditor, page.getHighlighter(), false); + myEditor.getContentComponent().addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseMoved(MouseEvent e) { + LogicalPosition pos = myEditor.xyToLogicalPosition(new Point(e.getX(), e.getY())); + navigate(myEditor, false, pos, page.getHighlighter(), false); + } + }); - CaretListener listener = new CaretAdapter() { + myEditor.getCaretModel().addCaretListener(new CaretAdapter() { @Override public void caretPositionChanged(CaretEvent e) { if (!myTextIsChanging) { navigate(myEditor, true, e.getNewPosition(), page.getHighlighter(), false); } } - }; - myEditor.getCaretModel().addCaretListener(listener); + }); } } @@ -110,28 +112,15 @@ public class SimpleEditorPreview implements PreviewPanel { public void setDemoText(final String text) { try { myTextIsChanging = true; - myHighlightData.clear(); - String stripped = myHighlightsExtractor.extractHighlights(text, myHighlightData); myEditor.getSelectionModel().removeSelection(); - myEditor.getDocument().setText(stripped); + myHighlightData.clear(); + myEditor.getDocument().setText(myHighlightsExtractor.extractHighlights(text, myHighlightData)); } finally { myTextIsChanging = false; } } - private void addMouseMotionListener(final Editor view, - final SyntaxHighlighter highlighter, - final boolean isBackgroundImportant) { - view.getContentComponent().addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent e) { - LogicalPosition pos = view.xyToLogicalPosition(new Point(e.getX(), e.getY())); - navigate(view, false, pos, highlighter, isBackgroundImportant); - } - }); - } - private void navigate(final Editor editor, boolean select, LogicalPosition pos, final SyntaxHighlighter highlighter, From 0a3240e4c3d78000ac7ffcb7b26c0b5135353f44 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Tue, 23 Aug 2016 11:11:52 +0300 Subject: [PATCH 10/17] IDEA-158861 Properties container for "RainbowOn", support inheritance for semantic markup --- .../impl/analysis/HighlightNamesUtil.java | 4 +- .../colors/pages/JavaColorSettingsPage.java | 9 ++ .../codeHighlighting/RainbowHighlighter.java | 32 ++++- .../daemon/impl/GeneralHighlightingPass.java | 3 +- .../colors/RainbowColorSettingsPage.java | 5 + .../colors/ColorAndFontDescriptionPanel.java | 15 +-- .../colors/ColorAndFontGlobalState.java | 52 +++++--- .../options/colors/ColorAndFontOptions.java | 3 +- .../colors/CustomizedSwitcherPanel.java | 3 +- .../colors/RainbowAttributeDescriptor.java | 15 ++- .../colors/RainbowDescriptionPanel.form | 118 +++++++++++------- .../colors/RainbowDescriptionPanel.java | 78 ++++++++---- .../pages/DefaultLanguageColorsPage.java | 7 ++ .../src/messages/ApplicationBundle.properties | 8 +- 14 files changed, 246 insertions(+), 106 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java index d147a80369b7..914babab5bf4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.HighlightInfoType; import com.intellij.codeInsight.daemon.impl.JavaHighlightInfoTypes; import com.intellij.lang.ASTNode; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.colors.TextAttributesScheme; @@ -157,7 +158,8 @@ public class HighlightNamesUtil { } HighlightInfo.Builder builder = HighlightInfo.newHighlightInfo(varType).range(elementToHighlight); - return RainbowHighlighter.isRainbowEnabled() ? builder.createUnconditionally() : builder.create(); + return RainbowHighlighter.isRainbowEnabledWithInheritance(JavaLanguage.INSTANCE) ? builder.createUnconditionally() + : builder.create(); } @Nullable diff --git a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java index 0066ca3fd2bb..a2cd004b620e 100644 --- a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java +++ b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java @@ -18,6 +18,8 @@ package com.intellij.openapi.options.colors.pages; import com.intellij.application.options.colors.InspectionColorSettingsPage; import com.intellij.ide.highlighter.JavaFileHighlighter; import com.intellij.ide.highlighter.JavaHighlightingColors; +import com.intellij.lang.Language; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileTypes.StdFileTypes; @@ -31,6 +33,7 @@ import com.intellij.psi.codeStyle.DisplayPriority; import com.intellij.psi.codeStyle.DisplayPrioritySortable; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.HashMap; @@ -248,4 +251,10 @@ public class JavaColorSettingsPage implements RainbowColorSettingsPage, Inspecti " }\n" + "}\n"; } + + @Nullable + @Override + public Language getLanguage() { + return JavaLanguage.INSTANCE; + } } diff --git a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java index d42687c685ce..d19b3166758f 100644 --- a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java +++ b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java @@ -17,6 +17,8 @@ package com.intellij.codeHighlighting; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.HighlightInfoType; +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.lang.Language; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; @@ -49,6 +51,10 @@ public class RainbowHighlighter { public static final TextAttributesKey[] RAINBOW_COLOR_KEYS = new TextAttributesKey[RAINBOW_JB_COLORS_DEFAULT.length]; private static final int RAINBOW_COLORS_BETWEEN = 4; private static final String UNIT_TEST_COLORS = "#000001,#000002,#000003,#000004"; // Do not modify! + private static String FALSE = "false"; + private static String TRUE = "true"; + private static String INHERITED = "inherited"; + static { for (int i = 0; i < RAINBOW_JB_COLORS_DEFAULT.length; ++i) { JBColor jbColor = RAINBOW_JB_COLORS_DEFAULT[i]; @@ -58,6 +64,7 @@ public class RainbowHighlighter { } public final static String RAINBOW_TYPE = "rainbow"; private final static String RAINBOW_TEMP_PREF = "RAINBOW_TEMP_"; + public final static Boolean DEFAULT_RAINBOW_ON = Boolean.FALSE; @NotNull private final TextAttributesScheme myColorsScheme; @NotNull private final Color[] myRainbowColors; @@ -69,12 +76,29 @@ public class RainbowHighlighter { public static final HighlightInfoType RAINBOW_ELEMENT = new HighlightInfoType.HighlightInfoTypeImpl(HighlightSeverity.INFORMATION, DefaultLanguageHighlighterColors.CONSTANT); - public static boolean isRainbowEnabled() { - return Registry.is("editor.rainbow.identifiers", false); + @Nullable + @Contract("null -> !null") + public static Boolean isRainbowEnabled(@Nullable Language language) { + String value = PropertiesComponent.getInstance().getValue(getKey(language), INHERITED); + if (TRUE.equals(value)) return Boolean.TRUE; + if (FALSE.equals(value)) return Boolean.FALSE; + return language == null ? DEFAULT_RAINBOW_ON : null; } - public static void setRainbowEnabled(boolean enabled) { - Registry.get("editor.rainbow.identifiers").setValue(enabled); + public static boolean isRainbowEnabledWithInheritance(@Nullable Language language) { + Boolean rainbowEnabled = isRainbowEnabled(language); + return rainbowEnabled != null ? rainbowEnabled : isRainbowEnabled(null); + } + + public static void setRainbowEnabled(@Nullable Language language, @Nullable Boolean enabled) { + PropertiesComponent.getInstance().setValue( + getKey(language), + enabled == null ? INHERITED : enabled.toString()); + } + + @NotNull + private static String getKey(@Nullable Language language) { + return RAINBOW_TYPE + (language == null ? "Default language" : language.getID()); } public static int hashColor(@NotNull String name, int colorsCount) { diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java index ea2a593d93b6..2796d8898644 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java @@ -140,7 +140,8 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP final List visitors = new ArrayList<>(highlightVisitors.length); List list = Arrays.asList(highlightVisitors); for (HighlightVisitor visitor : DumbService.getInstance(myProject).filterByDumbAwareness(list)) { - if (visitor instanceof RainbowVisitor && !RainbowHighlighter.isRainbowEnabled()) { + if (visitor instanceof RainbowVisitor + && !RainbowHighlighter.isRainbowEnabledWithInheritance(psiFile.getLanguage())) { continue; } if (visitor.suitableForFile(psiFile)) { diff --git a/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java b/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java index f2e1a790ad7b..02986235d801 100644 --- a/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java +++ b/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java @@ -15,12 +15,17 @@ */ package com.intellij.openapi.options.colors; +import com.intellij.lang.Language; import com.intellij.openapi.editor.colors.TextAttributesKey; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public interface RainbowColorSettingsPage extends ColorSettingsPage { boolean isRainbowType(TextAttributesKey type); @NotNull String getRainbowDemoText(); + + @Nullable + Language getLanguage(); } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java index 681a42aa8310..ff0f1d6b6d37 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java @@ -37,7 +37,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.event.HyperlinkEvent; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -113,14 +112,10 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel c.addActionListener(actionListener); } myEffectsCombo.addActionListener(actionListener); + Messages.configureMessagePaneUi(myInheritanceLabel, "", null); - myInheritanceLabel.addHyperlinkListener(new HyperlinkAdapter() { - @Override - protected void hyperlinkActivated(HyperlinkEvent e) { - onHyperLinkClicked(e); - } - }); - myInheritanceLabel.setBorder(BorderFactory.createEmptyBorder()); + myInheritanceLabel.addHyperlinkListener(e -> myDispatcher.getMulticaster().onHyperLinkClicked(e)); + myInheritanceLabel.setBorder(JBUI.Borders.empty(4, 0, 4, 4)); myLabelFont.setVisible(false); // hide for now as it doesn't look that good } @@ -130,10 +125,6 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel return this; } - private void onHyperLinkClicked(HyperlinkEvent e) { - myDispatcher.getMulticaster().onHyperLinkClicked(e); - } - private void onSettingsChanged(ActionEvent e) { myErrorStripeColorChooser.setEnabled(myCbErrorStripe.isSelected()); myForegroundChooser.setEnabled(myCbForeground.isSelected()); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java index f70bd1dac825..84b2ac897e5d 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java @@ -16,38 +16,62 @@ package com.intellij.application.options.colors; import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.lang.Language; import com.intellij.util.EventDispatcher; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; public class ColorAndFontGlobalState { - private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); + @NotNull private final EventDispatcher myDispatcher = + EventDispatcher.create(ColorAndFontSettingsListener.class); + @NotNull private HashMap myLanguage2RainbowEnabled = new HashMap<>(); + private final ColorAndFontGlobalState myReferenceState; - private boolean myIsRainbowOn; - public boolean isRainbowOn() { - return myIsRainbowOn; - } - public void setRainbowOn(boolean rainbowOn) { - if (rainbowOn != myIsRainbowOn) { - myIsRainbowOn = rainbowOn; + @Nullable + @Contract("null -> !null") + public Boolean isRainbowOn(@Nullable Language language) { + assert myReferenceState != null; + if (myLanguage2RainbowEnabled.containsKey(language)) { + return myLanguage2RainbowEnabled.get(language); } + Boolean rainbowOn = RainbowHighlighter.isRainbowEnabled(language); + myReferenceState.myLanguage2RainbowEnabled.put(language, rainbowOn); + myLanguage2RainbowEnabled.put(language, rainbowOn); + return rainbowOn; + } + + public boolean isRainbowOnWithInheritance(@Nullable Language language) { + Boolean value = isRainbowOn(language); + return value == null ? isRainbowOn(null) : value.booleanValue(); + } + + public void setRainbowOn(@Nullable Language language, @Nullable Boolean rainbowOn) { + assert myReferenceState != null; + myLanguage2RainbowEnabled.put(language, rainbowOn); } ColorAndFontGlobalState() { - myIsRainbowOn = RainbowHighlighter.isRainbowEnabled(); + myReferenceState = null; } public ColorAndFontGlobalState(@NotNull ColorAndFontGlobalState state) { + myReferenceState = state; copyFrom(state); } public void copyFrom(@NotNull ColorAndFontGlobalState state) { assert this != state; - myIsRainbowOn = state.myIsRainbowOn; + myLanguage2RainbowEnabled = new HashMap<>(state.myLanguage2RainbowEnabled); } public void apply() { - //FIXME: we need better place for per-language state storage - RainbowHighlighter.setRainbowEnabled(myIsRainbowOn); + for (Map.Entry entry : myLanguage2RainbowEnabled.entrySet()) { + RainbowHighlighter.setRainbowEnabled(entry.getKey(), entry.getValue()); + } } @Override @@ -56,12 +80,12 @@ public class ColorAndFontGlobalState { if (o == null || getClass() != o.getClass()) return false; ColorAndFontGlobalState state = (ColorAndFontGlobalState)o; - return myIsRainbowOn == state.myIsRainbowOn; + return myLanguage2RainbowEnabled.equals(state.myLanguage2RainbowEnabled); } @Override public int hashCode() { - return myIsRainbowOn ? 1 : 0; + return myLanguage2RainbowEnabled.hashCode(); } public void addListener(@NotNull ColorAndFontSettingsListener listener) { diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java index 7d03eaae6f3d..9392f06ca967 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java @@ -539,7 +539,8 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract List attributeDescriptors = ColorSettingsUtil.getAllAttributeDescriptors(provider); //todo: single point configuration? if (provider instanceof RainbowColorSettingsPage) { - descriptions.add(new RainbowAttributeDescriptor(group, + descriptions.add(new RainbowAttributeDescriptor(((RainbowColorSettingsPage)provider).getLanguage(), + group, ApplicationBundle.message("rainbow.option.panel.display.name"), scheme, scheme.getInitRainbowState(), diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index 3e23da008b81..9130a1dbb6c6 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -170,7 +170,8 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe : myPage.getDemoText(); List showLineData = null; - if (myPage instanceof RainbowColorSettingsPage && myRainbowPanel.myGlobalState.isRainbowOn()) { + if (myPage instanceof RainbowColorSettingsPage + && myRainbowPanel.myGlobalState.isRainbowOnWithInheritance(((RainbowColorSettingsPage)myPage).getLanguage())) { RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); TextAttributesKey[] tempKeys = highlighter.getRainbowTempKeys(); EditorEx editor = simpleEditorPreview.getEditor(); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java index 9f967df90a92..0404185bdb81 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java @@ -16,12 +16,14 @@ package com.intellij.application.options.colors; import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.lang.Language; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.awt.*; import java.util.ArrayList; @@ -31,16 +33,19 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP private final String myGroup; private final String myDisplayName; private final EditorColorsScheme myScheme; + private final Language myLanguage; // can be shared between instances private final RainbowInSchemeState myCurState; private final RainbowInSchemeState myInitState; - public RainbowAttributeDescriptor(@NotNull String group, + public RainbowAttributeDescriptor(@Nullable Language language, + @NotNull String group, @NotNull String displayNameWithPath, @NotNull EditorColorsScheme scheme, - RainbowInSchemeState initState, - RainbowInSchemeState curState) { + @NotNull RainbowInSchemeState initState, + @NotNull RainbowInSchemeState curState) { + myLanguage = language; myDisplayName = displayNameWithPath; myInitState = initState; myCurState = curState; @@ -86,6 +91,10 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP return RainbowHighlighter.RAINBOW_COLOR_KEYS[index].getDefaultAttributes().getForegroundColor(); } + public Language getLanguage() { + return myLanguage; + } + public static class RainbowInSchemeState { private final List> myRainbowState = new ArrayList<>(); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form index 021b9593a05e..163b460101bb 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form @@ -1,109 +1,135 @@ - + - + - + - + - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - + - - - - - - - + - - - - - - - + - - - - - - - + - - - - - - diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index 6d8eaf976bb0..9ab5a081bdd9 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -15,8 +15,11 @@ */ package com.intellij.application.options.colors; +import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; +import com.intellij.openapi.options.OptionsBundle; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pair; import com.intellij.ui.ColorPanel; import com.intellij.ui.components.JBCheckBox; @@ -25,7 +28,7 @@ import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.NotNull; import javax.swing.*; -import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -37,6 +40,7 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. protected JPanel myPanel; + private JTextPane myGradientLabel; private JBCheckBox myCbStop1; private JBCheckBox myCbStop2; private JBCheckBox myCbStop3; @@ -51,11 +55,14 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. protected ColorPanel myStop5; private ColorPanel[] myStops = new ColorPanel[]{myStop1, myStop2, myStop3, myStop4, myStop5}; - //private JTextPane myInheritanceLabel; - //private JBCheckBox myInheritAttributesBox; private JBCheckBox myRainbow; + private JTextPane myInheritanceLabel; + private JBCheckBox myInheritAttributesBox; ColorAndFontGlobalState myGlobalState; + private final String myInheritedMessage; + private final String myOverrideMessage; + private final String myInheritedMessageTooltip; public RainbowDescriptionPanel(ColorAndFontGlobalState globalState) { super(new BorderLayout()); @@ -69,22 +76,36 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. onSettingsChanged(e); } }; - for (JBCheckBox c : new JBCheckBox[]{myRainbow, myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5/*, myInheritAttributesBox*/}) { + for (JBCheckBox c : new JBCheckBox[]{myRainbow, myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5, myInheritAttributesBox}) { c.addActionListener(actionListener); } for (ColorPanel c : new ColorPanel[]{myStop1, myStop2, myStop3, myStop4, myStop5}) { c.addActionListener(actionListener); } - // FIXME: inherited per-language on/off - //Messages.configureMessagePaneUi(myInheritanceLabel, "", null); - //myInheritanceLabel.addHyperlinkListener(new HyperlinkAdapter() { - // @Override - // protected void hyperlinkActivated(HyperlinkEvent e) { - // onHyperLinkClicked(e); - // } - //}); - //myInheritanceLabel.setBorder(BorderFactory.createEmptyBorder()); + String languageDefaultPageID = OptionsBundle.message("options.language.defaults.display.name"); + String rainbowOptionsID = ApplicationBundle.message("rainbow.option.panel.display.name"); + myInheritedMessage = ApplicationBundle.message("label.inherited.gradient", + rainbowOptionsID, + languageDefaultPageID); + myInheritedMessageTooltip =ApplicationBundle.message("label.inherited.gradient.tooltip", + rainbowOptionsID, + languageDefaultPageID); + myOverrideMessage = ApplicationBundle.message("label.override.gradient"); + HyperlinkListener listener = e -> myDispatcher.getMulticaster().onHyperLinkClicked(e); + + Messages.configureMessagePaneUi(myGradientLabel, myOverrideMessage, null); + myGradientLabel.addHyperlinkListener(listener); + + Messages.configureMessagePaneUi(myInheritanceLabel, ApplicationBundle.message("label.rainbow.inheritance", + rainbowOptionsID, + rainbowOptionsID, + languageDefaultPageID), null); + myInheritanceLabel.setToolTipText(ApplicationBundle.message("label.rainbow.inheritance.tooltip", + rainbowOptionsID, + languageDefaultPageID)); + myInheritanceLabel.addHyperlinkListener(listener); + myInheritanceLabel.setBorder(JBUI.Borders.empty(4, 0, 4, 4)); } @NotNull @@ -93,10 +114,6 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. return this; } - private void onHyperLinkClicked(HyperlinkEvent e) { - myDispatcher.getMulticaster().onHyperLinkClicked(e); - } - private void onSettingsChanged(ActionEvent e) { myDispatcher.getMulticaster().onSettingsChanged(e); } @@ -112,10 +129,19 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. List> rainbowCurState = descriptor.getRainbowCurState(); if (rainbowCurState.size() < myCbStops.length) return; + Boolean rainbowOn = myGlobalState.isRainbowOn(descriptor.getLanguage()); + boolean isInherited = false; + if (rainbowOn == null) { + isInherited = true; + rainbowOn = myGlobalState.isRainbowOn(null); + } + myRainbow.setEnabled(!isInherited); + myRainbow.setSelected(rainbowOn); - myRainbow.setSelected(myGlobalState.isRainbowOn()); - - boolean isEnable = !ColorAndFontOptions.isReadOnly(attributeDescriptor.getScheme()) && myGlobalState.isRainbowOn(); + // the colors are editable only for default language + boolean isDefaultLanguage = descriptor.getLanguage() == null; + boolean isEnable = !ColorAndFontOptions.isReadOnly(attributeDescriptor.getScheme()) && isDefaultLanguage; + //myGradientLabel.setEnabled(isEnable); for (int i = 0; i < myCbStops.length; ++i) { Pair state = rainbowCurState.get(i); myCbStops[i].setEnabled(isEnable); @@ -126,6 +152,12 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. myStops[i].setEditable(isEnable && isOverride); myStops[i].setSelectedColor(state.second); } + + myInheritanceLabel.setVisible(!isDefaultLanguage); + myInheritAttributesBox.setSelected(isInherited); + myInheritAttributesBox.setVisible(!isDefaultLanguage); + myGradientLabel.setText(isDefaultLanguage ? myOverrideMessage : myInheritedMessage); + myGradientLabel.setToolTipText(isDefaultLanguage ? null : myInheritedMessageTooltip); } @Override @@ -136,7 +168,11 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. List> rainbowCurState = descriptor.getRainbowCurState(); if (rainbowCurState.size() < myCbStops.length) return; - myGlobalState.setRainbowOn(myRainbow.isSelected()); + boolean isDefaultLanguage = descriptor.getLanguage() == null; + myGlobalState.setRainbowOn(descriptor.getLanguage(), + isDefaultLanguage ? Boolean.valueOf(myRainbow.isSelected()) + : myInheritAttributesBox.isSelected() ? null + : Boolean.valueOf(myRainbow.isSelected())); for (int i = 0; i < myCbStops.length; ++i) { boolean isOverride = myCbStops[i].isSelected(); rainbowCurState.set(i, Pair.create(isOverride, diff --git a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java index d625b94e4ade..f655dcfc1bb7 100644 --- a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java +++ b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.options.colors.pages; +import com.intellij.lang.Language; import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; import com.intellij.openapi.editor.HighlighterColors; import com.intellij.openapi.editor.colors.TextAttributesKey; @@ -292,4 +293,10 @@ public class DefaultLanguageColorsPage implements RainbowColorSettingsPage, Disp " Local variable5\n" + "Function call()"; } + + @Nullable + @Override + public Language getLanguage() { + return null; + } } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 7954be9723f7..0f0638e64983 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -744,10 +744,14 @@ remote.desktop.detected.message=Animation disabled checkbox.line.comment.add.space=Add a space at comment start rainbow.option.panel.display.name=Semantic highlighting -label.override.gradient=Override gradient: +label.override.gradient=Override gradient: +label.inherited.gradient=Inherited from {1} gradient: +label.inherited.gradient.tooltip=''{0}\u2192Override gradient'' from
''{1}'' section checkbox.stop.1=Stop #1 checkbox.stop.2=Stop #2 checkbox.stop.3=Stop #3 checkbox.stop.4=Stop #4 checkbox.stop.5=Stop #5 -checkbox.rainbow=Unique color for each parameter
and local variable
Chosen from generated gradient \ No newline at end of file +checkbox.rainbow=Unique color for each parameter
and local variable
Chosen from generated gradient +label.rainbow.inheritance=
''{0}\u2192Unique color''
of {2} +label.rainbow.inheritance.tooltip=''{0}\u2192Unique color'' from
''{1}'' section \ No newline at end of file From 5b2a11eb800a26ec7d7a3ca1f8e081fcd688ff81 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Tue, 23 Aug 2016 18:24:02 +0300 Subject: [PATCH 11/17] IDEA-158861 states cleanup --- .../colors/ColorAndFontGlobalState.java | 20 +++- .../options/colors/ColorAndFontOptions.java | 41 +++---- .../options/colors/NewColorAndFontPanel.java | 5 +- .../options/colors/OptionsPanelImpl.java | 4 +- .../colors/RainbowAttributeDescriptor.java | 87 ++------------- .../colors/RainbowColorsInSchemeState.java | 104 ++++++++++++++++++ .../colors/RainbowDescriptionPanel.java | 8 +- 7 files changed, 150 insertions(+), 119 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java index 84b2ac897e5d..3ce5675de356 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java @@ -54,16 +54,15 @@ public class ColorAndFontGlobalState { myLanguage2RainbowEnabled.put(language, rainbowOn); } - ColorAndFontGlobalState() { + private ColorAndFontGlobalState(@SuppressWarnings("UnusedParameters") boolean unused) { myReferenceState = null; } - public ColorAndFontGlobalState(@NotNull ColorAndFontGlobalState state) { - myReferenceState = state; - copyFrom(state); + public ColorAndFontGlobalState() { + myReferenceState = new ColorAndFontGlobalState(true); } - public void copyFrom(@NotNull ColorAndFontGlobalState state) { + private void copyFrom(@NotNull ColorAndFontGlobalState state) { assert this != state; myLanguage2RainbowEnabled = new HashMap<>(state.myLanguage2RainbowEnabled); } @@ -72,6 +71,8 @@ public class ColorAndFontGlobalState { for (Map.Entry entry : myLanguage2RainbowEnabled.entrySet()) { RainbowHighlighter.setRainbowEnabled(entry.getKey(), entry.getValue()); } + //noinspection ConstantConditions + myReferenceState.copyFrom(this); } @Override @@ -95,4 +96,13 @@ public class ColorAndFontGlobalState { public void stateChanged() { myDispatcher.getMulticaster().settingsChanged(); } + + public boolean isModified() { + return !equals(myReferenceState); + } + + public void reset() { + //noinspection ConstantConditions + copyFrom(myReferenceState); + } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java index 9392f06ca967..c695cb18d5cc 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java @@ -75,8 +75,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private Map mySchemes; private MyColorScheme mySelectedScheme; - private final ColorAndFontGlobalState myInitGlobalOption = new ColorAndFontGlobalState(); - private final ColorAndFontGlobalState myCurGlobalOption = new ColorAndFontGlobalState(myInitGlobalOption); + private final ColorAndFontGlobalState myColorAndFontGlobalState = new ColorAndFontGlobalState(); public static final String FILE_STATUS_GROUP = ApplicationBundle.message("title.file.status"); public static final String SCOPES_GROUP = ApplicationBundle.message("title.scope.based"); @@ -95,15 +94,15 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private boolean myDisposeCompleted = false; private final Disposable myDisposable = Disposer.newDisposable(); - public ColorAndFontGlobalState getGlobalOption() { - return myCurGlobalOption; + public ColorAndFontGlobalState getColorAndFontGlobalState() { + return myColorAndFontGlobalState; } @Override public boolean isModified() { boolean listModified = isSchemeListModified(); boolean schemeModified = isSomeSchemeModified(); - boolean globalModified = isGlobalOptionModified(); + boolean globalModified = isColorAndFontGlobalStateModified(); if (listModified || schemeModified || globalModified) { myApplyCompleted = false; @@ -112,8 +111,8 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract return listModified || globalModified; } - private boolean isGlobalOptionModified() { - return !myInitGlobalOption.equals(myCurGlobalOption); + private boolean isColorAndFontGlobalStateModified() { + return myColorAndFontGlobalState.isModified(); } private boolean isSchemeListModified() { @@ -250,8 +249,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } try { - myCurGlobalOption.apply(); - myInitGlobalOption.copyFrom(myCurGlobalOption); + myColorAndFontGlobalState.apply(); EditorColorsManager myColorsManager = EditorColorsManager.getInstance(); SchemeManager schemeManager = ((EditorColorsManagerImpl)myColorsManager).getSchemeManager(); @@ -501,7 +499,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } private void initAll() { - myCurGlobalOption.copyFrom(myInitGlobalOption); + myColorAndFontGlobalState.reset(); mySchemes = new THashMap<>(); for (EditorColorsScheme allScheme : EditorColorsManager.getInstance().getAllSchemes()) { MyColorScheme schemeDelegate = new MyColorScheme(allScheme); @@ -543,8 +541,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract group, ApplicationBundle.message("rainbow.option.panel.display.name"), scheme, - scheme.getInitRainbowState(), - scheme.getCurrentRainbowState())); + scheme.getRainbowState())); } for (AttributesDescriptor descriptor : attributeDescriptors) { addSchemedDescription(descriptions, descriptor.getDisplayName(), group, descriptor.getKey(), scheme, null, null); @@ -660,7 +657,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } private void revertChanges(){ - if (isSchemeListModified() || isSomeSchemeModified() || isGlobalOptionModified()) { + if (isSchemeListModified() || isSomeSchemeModified() || isColorAndFontGlobalStateModified()) { myRevertChangesCompleted = false; } @@ -1018,8 +1015,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private EditorSchemeAttributeDescriptor[] myDescriptors; private String myName; private boolean myIsNew = false; - private RainbowAttributeDescriptor.RainbowInSchemeState myInitRainbowState; - private RainbowAttributeDescriptor.RainbowInSchemeState myCurrentRainbowState; + private RainbowColorsInSchemeState myRainbowState; private MyColorScheme(@NotNull EditorColorsScheme parentScheme) { super(parentScheme); @@ -1150,18 +1146,11 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract return false; } - public RainbowAttributeDescriptor.RainbowInSchemeState getInitRainbowState() { - if (myInitRainbowState == null) { - myInitRainbowState = new RainbowAttributeDescriptor.RainbowInSchemeState(this); + public RainbowColorsInSchemeState getRainbowState() { + if (myRainbowState == null) { + myRainbowState = new RainbowColorsInSchemeState(this); } - return myInitRainbowState; - } - - public RainbowAttributeDescriptor.RainbowInSchemeState getCurrentRainbowState() { - if (myCurrentRainbowState == null) { - myCurrentRainbowState = new RainbowAttributeDescriptor.RainbowInSchemeState(getInitRainbowState()); - } - return myCurrentRainbowState; + return myRainbowState; } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java index 7aef5ec59635..b7388831cd6c 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java @@ -132,8 +132,9 @@ public class NewColorAndFontPanel extends JPanel { Collection optionList, ColorSettingsPage page) { final SchemesPanel schemesPanel = new SchemesPanel(options); - final OptionsPanel optionsPanel = new OptionsPanelImpl(options, schemesPanel, category, - new CustomizedSwitcherPanel(options.getGlobalOption(), previewPanel, page)); + final OptionsPanel optionsPanel = new OptionsPanelImpl( + options, schemesPanel, category, + new CustomizedSwitcherPanel(options.getColorAndFontGlobalState(), previewPanel, page)); return new NewColorAndFontPanel(schemesPanel, optionsPanel, previewPanel, category, optionList, page); } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java index 6cca7f03c4b8..fe9bf12d27b0 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java @@ -74,7 +74,7 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { @Override public void onSettingsChanged(ActionEvent e) { myDispatcher.getMulticaster().settingsChanged(); - myOptions.getGlobalOption().stateChanged(); + myOptions.getColorAndFontGlobalState().stateChanged(); } @Override @@ -100,7 +100,7 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { } }); - myOptions.getGlobalOption().addListener(new ColorAndFontSettingsListener.Abstract() { + myOptions.getColorAndFontGlobalState().addListener(new ColorAndFontSettingsListener.Abstract() { @Override public void settingsChanged() { if (!mySchemesProvider.areSchemesLoaded()) return; diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java index 0404185bdb81..7e26c82d7b8f 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java @@ -19,14 +19,11 @@ import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.lang.Language; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; -import com.intellij.openapi.editor.colors.TextAttributesKey; -import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; -import java.util.ArrayList; import java.util.List; class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithPath { @@ -34,21 +31,16 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP private final String myDisplayName; private final EditorColorsScheme myScheme; private final Language myLanguage; - - // can be shared between instances - private final RainbowInSchemeState myCurState; - private final RainbowInSchemeState myInitState; + private final RainbowColorsInSchemeState myRainbowColorsInSchemaState; public RainbowAttributeDescriptor(@Nullable Language language, @NotNull String group, @NotNull String displayNameWithPath, @NotNull EditorColorsScheme scheme, - @NotNull RainbowInSchemeState initState, - @NotNull RainbowInSchemeState curState) { + @NotNull RainbowColorsInSchemeState rainbowState) { myLanguage = language; myDisplayName = displayNameWithPath; - myInitState = initState; - myCurState = curState; + myRainbowColorsInSchemaState = rainbowState; myScheme = scheme; myGroup = group; } @@ -75,16 +67,16 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP @Override public void apply(@NotNull EditorColorsScheme scheme) { - myCurState.apply(scheme); + myRainbowColorsInSchemaState.apply(scheme); } @Override public boolean isModified() { - return !myInitState.equals(myCurState); + return myRainbowColorsInSchemaState.isModified(); } - public List> getRainbowCurState() { - return myCurState.myRainbowState; + public List> getRainbowColorsInSchemaState() { + return myRainbowColorsInSchemaState.getInheritanceAndColors(); } public Color getDefaultColor(int index) { @@ -94,69 +86,4 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP public Language getLanguage() { return myLanguage; } - - public static class RainbowInSchemeState { - private final List> myRainbowState = new ArrayList<>(); - - public RainbowInSchemeState(@NotNull EditorColorsScheme scheme) { - for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { - myRainbowState.add(getColorStateFromScheme(scheme, rainbowKey)); - } - } - - public RainbowInSchemeState(@NotNull RainbowInSchemeState state) { - copyFrom(state); - } - - public void copyFrom(@NotNull RainbowInSchemeState state) { - assert this != state; - - myRainbowState.clear(); - myRainbowState.addAll(state.myRainbowState); - } - - public void apply(@NotNull EditorColorsScheme scheme) { - int i = 0; - for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { - Pair pair = myRainbowState.get(i); - scheme.setAttributes(rainbowKey, pair.first ? new TextAttributes(pair.second, null, null, null, Font.PLAIN) - : rainbowKey.getDefaultAttributes()); - ++i; - } - } - - @NotNull - private static Pair getColorStateFromScheme(@NotNull EditorColorsScheme scheme, TextAttributesKey rainbowKey) { - TextAttributes schemeAttributes = scheme.getAttributes(rainbowKey); - @NotNull Color defaultRainbow = rainbowKey.getDefaultAttributes().getForegroundColor(); - Pair pair; - if (schemeAttributes == null) { - pair = Pair.create(false, defaultRainbow); - } - else { - Color schemeColor = schemeAttributes.getForegroundColor(); - if (schemeColor == null) { - pair = Pair.create(false, defaultRainbow); - } - else { - pair = Pair.create(!defaultRainbow.equals(schemeColor), schemeColor); - } - } - return pair; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - RainbowInSchemeState state = (RainbowInSchemeState)o; - return myRainbowState.equals(state.myRainbowState); - } - - @Override - public int hashCode() { - return myRainbowState.hashCode(); - } - } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java new file mode 100644 index 000000000000..40054cc1d1cd --- /dev/null +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java @@ -0,0 +1,104 @@ +/* + * Copyright 2000-2016 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.colors; + +import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.util.*; +import java.util.List; + +public class RainbowColorsInSchemeState { + private final RainbowColorsInSchemeState myReferenceState; + private final List> myInheritanceAndColors = new ArrayList<>(); + + public List> getInheritanceAndColors() { + return myInheritanceAndColors; + } + + private RainbowColorsInSchemeState(@NotNull EditorColorsScheme scheme, + @SuppressWarnings("UnusedParameters") boolean unused) { + myReferenceState = null; + for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { + myInheritanceAndColors.add(getColorStateFromScheme(scheme, rainbowKey)); + } + } + + public RainbowColorsInSchemeState(@NotNull EditorColorsScheme scheme) { + myReferenceState = new RainbowColorsInSchemeState(scheme, true); + copyFrom(myReferenceState); + } + + private void copyFrom(@NotNull RainbowColorsInSchemeState state) { + assert this != state; + myInheritanceAndColors.clear(); + myInheritanceAndColors.addAll(state.myInheritanceAndColors); + } + + public void apply(@NotNull EditorColorsScheme scheme) { + int i = 0; + for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { + Pair pair = myInheritanceAndColors.get(i); + scheme.setAttributes(rainbowKey, pair.first ? new TextAttributes(pair.second, null, null, null, Font.PLAIN) + : rainbowKey.getDefaultAttributes()); + ++i; + } + //myReferenceState.copyFrom(this); + } + + @NotNull + private static Pair getColorStateFromScheme(@NotNull EditorColorsScheme scheme, TextAttributesKey rainbowKey) { + TextAttributes schemeAttributes = scheme.getAttributes(rainbowKey); + @NotNull Color defaultRainbow = rainbowKey.getDefaultAttributes().getForegroundColor(); + Pair pair; + if (schemeAttributes == null) { + pair = Pair.create(false, defaultRainbow); + } + else { + Color schemeColor = schemeAttributes.getForegroundColor(); + if (schemeColor == null) { + pair = Pair.create(false, defaultRainbow); + } + else { + pair = Pair.create(!defaultRainbow.equals(schemeColor), schemeColor); + } + } + return pair; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + RainbowColorsInSchemeState state = (RainbowColorsInSchemeState)o; + return myInheritanceAndColors.equals(state.myInheritanceAndColors); + } + + @Override + public int hashCode() { + return myInheritanceAndColors.hashCode(); + } + + public boolean isModified() { + return !equals(myReferenceState); + } +} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index 9ab5a081bdd9..abfb4f5a41c2 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -127,8 +127,8 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. if (!(attributeDescriptor instanceof RainbowAttributeDescriptor)) return; RainbowAttributeDescriptor descriptor = (RainbowAttributeDescriptor)attributeDescriptor; - List> rainbowCurState = descriptor.getRainbowCurState(); - if (rainbowCurState.size() < myCbStops.length) return; + List> rainbowState = descriptor.getRainbowColorsInSchemaState(); + if (rainbowState.size() < myCbStops.length) return; Boolean rainbowOn = myGlobalState.isRainbowOn(descriptor.getLanguage()); boolean isInherited = false; if (rainbowOn == null) { @@ -143,7 +143,7 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. boolean isEnable = !ColorAndFontOptions.isReadOnly(attributeDescriptor.getScheme()) && isDefaultLanguage; //myGradientLabel.setEnabled(isEnable); for (int i = 0; i < myCbStops.length; ++i) { - Pair state = rainbowCurState.get(i); + Pair state = rainbowState.get(i); myCbStops[i].setEnabled(isEnable); boolean isOverride = state.first; @@ -165,7 +165,7 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. if (!(attributeDescriptor instanceof RainbowAttributeDescriptor)) return; RainbowAttributeDescriptor descriptor = (RainbowAttributeDescriptor)attributeDescriptor; - List> rainbowCurState = descriptor.getRainbowCurState(); + List> rainbowCurState = descriptor.getRainbowColorsInSchemaState(); if (rainbowCurState.size() < myCbStops.length) return; boolean isDefaultLanguage = descriptor.getLanguage() == null; From 0cacb8e9dd7aedabda872800b2f1ab00722d8e71 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Wed, 24 Aug 2016 12:55:36 +0300 Subject: [PATCH 12/17] IDEA-158861 global state management was changed, editors update after changes --- .../colors/ColorAndFontDescriptionPanel.java | 24 +++--- .../colors/ColorAndFontGlobalState.java | 44 +++++----- .../options/colors/ColorAndFontOptions.java | 33 ++++---- .../colors/CustomizedSwitcherPanel.java | 81 ++++++++++--------- .../colors/RainbowAttributeDescriptor.java | 15 +++- .../colors/RainbowColorsInSchemeState.java | 16 +--- .../colors/RainbowDescriptionPanel.java | 36 ++++----- .../options/colors/SimpleEditorPreview.java | 20 +++-- 8 files changed, 130 insertions(+), 139 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java index ff0f1d6b6d37..16c1462e75e6 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontDescriptionPanel.java @@ -99,12 +99,16 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel } }); - ActionListener actionListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - onSettingsChanged(e); - } + ActionListener actionListener = e -> { + myErrorStripeColorChooser.setEnabled(myCbErrorStripe.isSelected()); + myForegroundChooser.setEnabled(myCbForeground.isSelected()); + myBackgroundChooser.setEnabled(myCbBackground.isSelected()); + myEffectsColorChooser.setEnabled(myCbEffects.isSelected()); + myEffectsCombo.setEnabled(myCbEffects.isSelected()); + + myDispatcher.getMulticaster().onSettingsChanged(e); }; + for (JBCheckBox c : new JBCheckBox[]{myCbBackground, myCbForeground, myCbEffects, myCbErrorStripe, myCbItalic, myCbBold, myInheritAttributesBox}) { c.addActionListener(actionListener); } @@ -125,16 +129,6 @@ public class ColorAndFontDescriptionPanel extends JPanel implements OptionsPanel return this; } - private void onSettingsChanged(ActionEvent e) { - myErrorStripeColorChooser.setEnabled(myCbErrorStripe.isSelected()); - myForegroundChooser.setEnabled(myCbForeground.isSelected()); - myBackgroundChooser.setEnabled(myCbBackground.isSelected()); - myEffectsColorChooser.setEnabled(myCbEffects.isSelected()); - myEffectsCombo.setEnabled(myCbEffects.isSelected()); - - myDispatcher.getMulticaster().onSettingsChanged(e); - } - public void resetDefault() { myLabelFont.setEnabled(false); myCbBold.setSelected(false); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java index 3ce5675de356..4dc58d345507 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java @@ -16,7 +16,13 @@ package com.intellij.application.options.colors; import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.lang.Language; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorFactory; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; import com.intellij.util.EventDispatcher; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -26,9 +32,8 @@ import java.util.HashMap; import java.util.Map; public class ColorAndFontGlobalState { - @NotNull private final EventDispatcher myDispatcher = - EventDispatcher.create(ColorAndFontSettingsListener.class); - @NotNull private HashMap myLanguage2RainbowEnabled = new HashMap<>(); + private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); + private HashMap myLanguage2RainbowEnabled = new HashMap<>(); private final ColorAndFontGlobalState myReferenceState; @Nullable @@ -60,6 +65,7 @@ public class ColorAndFontGlobalState { public ColorAndFontGlobalState() { myReferenceState = new ColorAndFontGlobalState(true); + copyFrom(myReferenceState); //be ready to global data extension } private void copyFrom(@NotNull ColorAndFontGlobalState state) { @@ -71,24 +77,19 @@ public class ColorAndFontGlobalState { for (Map.Entry entry : myLanguage2RainbowEnabled.entrySet()) { RainbowHighlighter.setRainbowEnabled(entry.getKey(), entry.getValue()); } - //noinspection ConstantConditions + Editor[] allEditors = EditorFactory.getInstance().getAllEditors(); + for (Editor editor : allEditors) { + final Project project = editor.getProject(); + if (project != null) { + PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); + if (file != null) { + DaemonCodeAnalyzer.getInstance(project).restart(file); + } + } + } myReferenceState.copyFrom(this); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ColorAndFontGlobalState state = (ColorAndFontGlobalState)o; - return myLanguage2RainbowEnabled.equals(state.myLanguage2RainbowEnabled); - } - - @Override - public int hashCode() { - return myLanguage2RainbowEnabled.hashCode(); - } - public void addListener(@NotNull ColorAndFontSettingsListener listener) { myDispatcher.addListener(listener); } @@ -98,11 +99,14 @@ public class ColorAndFontGlobalState { } public boolean isModified() { - return !equals(myReferenceState); + return !myLanguage2RainbowEnabled.equals(myReferenceState.myLanguage2RainbowEnabled); + } + + public boolean isModified(@Nullable Language language) { + return myLanguage2RainbowEnabled.get(language) != myReferenceState.myLanguage2RainbowEnabled.get(language); } public void reset() { - //noinspection ConstantConditions copyFrom(myReferenceState); } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java index c695cb18d5cc..e090a1f2e08b 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java @@ -102,17 +102,12 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract public boolean isModified() { boolean listModified = isSchemeListModified(); boolean schemeModified = isSomeSchemeModified(); - boolean globalModified = isColorAndFontGlobalStateModified(); - if (listModified || schemeModified || globalModified) { + if (listModified || schemeModified) { myApplyCompleted = false; } - return listModified || globalModified; - } - - private boolean isColorAndFontGlobalStateModified() { - return myColorAndFontGlobalState.isModified(); + return listModified; } private boolean isSchemeListModified() { @@ -205,7 +200,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract clone.setName(name); MyColorScheme newScheme = new MyColorScheme(clone); - initScheme(newScheme); + initScheme(myColorAndFontGlobalState, newScheme); newScheme.setIsNew(); @@ -216,7 +211,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract public void addImportedScheme(@NotNull EditorColorsScheme imported) { MyColorScheme newScheme = new MyColorScheme(imported); - initScheme(newScheme); + initScheme(myColorAndFontGlobalState, newScheme); mySchemes.put(imported.getName(), newScheme); selectScheme(newScheme.getName()); @@ -503,7 +498,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract mySchemes = new THashMap<>(); for (EditorColorsScheme allScheme : EditorColorsManager.getInstance().getAllSchemes()) { MyColorScheme schemeDelegate = new MyColorScheme(allScheme); - initScheme(schemeDelegate); + initScheme(myColorAndFontGlobalState, schemeDelegate); mySchemes.put(schemeDelegate.getName(), schemeDelegate); } @@ -511,26 +506,29 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract assert mySelectedScheme != null : EditorColorsManager.getInstance().getGlobalScheme().getName() + "; myschemes=" + mySchemes; } - private static void initScheme(@NotNull MyColorScheme scheme) { + private static void initScheme(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, @NotNull MyColorScheme scheme) { List descriptions = new ArrayList<>(); - initPluggedDescriptions(descriptions, scheme); + initPluggedDescriptions(colorAndFontGlobalState, descriptions, scheme); initFileStatusDescriptors(descriptions, scheme); initScopesDescriptors(descriptions, scheme); scheme.setDescriptors(descriptions.toArray(new EditorSchemeAttributeDescriptor[descriptions.size()])); } - private static void initPluggedDescriptions(@NotNull List descriptions, @NotNull MyColorScheme scheme) { + private static void initPluggedDescriptions(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, + @NotNull List descriptions, + @NotNull MyColorScheme scheme) { ColorSettingsPage[] pages = ColorSettingsPages.getInstance().getRegisteredPages(); for (ColorSettingsPage page : pages) { - initDescriptions(page, descriptions, scheme); + initDescriptions(colorAndFontGlobalState, page, descriptions, scheme); } for (ColorAndFontDescriptorsProvider provider : Extensions.getExtensions(ColorAndFontDescriptorsProvider.EP_NAME)) { - initDescriptions(provider, descriptions, scheme); + initDescriptions(colorAndFontGlobalState, provider, descriptions, scheme); } } - private static void initDescriptions(@NotNull ColorAndFontDescriptorsProvider provider, + private static void initDescriptions(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, + @NotNull ColorAndFontDescriptorsProvider provider, @NotNull List descriptions, @NotNull MyColorScheme scheme) { String group = provider.getDisplayName(); @@ -538,6 +536,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract //todo: single point configuration? if (provider instanceof RainbowColorSettingsPage) { descriptions.add(new RainbowAttributeDescriptor(((RainbowColorSettingsPage)provider).getLanguage(), + colorAndFontGlobalState, group, ApplicationBundle.message("rainbow.option.panel.display.name"), scheme, @@ -657,7 +656,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } private void revertChanges(){ - if (isSchemeListModified() || isSomeSchemeModified() || isColorAndFontGlobalStateModified()) { + if (isSchemeListModified() || isSomeSchemeModified()) { myRevertChangesCompleted = false; } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index 9130a1dbb6c6..48d7d304401f 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -37,6 +37,7 @@ import java.util.*; import java.util.List; class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDescriptionPanel { + private ColorAndFontGlobalState myColorAndFontGlobalState; private ColorSettingsPage myPage; private PreviewPanel myPreviewPanel; @@ -45,12 +46,15 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe private OptionsPanelImpl.ColorDescriptionPanel myActive; - public CustomizedSwitcherPanel(ColorAndFontGlobalState options, @Nullable PreviewPanel previewPanel, ColorSettingsPage page) { + public CustomizedSwitcherPanel(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, + @Nullable PreviewPanel previewPanel, + @Nullable ColorSettingsPage page) { super(); + myColorAndFontGlobalState = colorAndFontGlobalState; myPage = page; myPreviewPanel = previewPanel; - myRainbowPanel = new RainbowDescriptionPanel(options); + myRainbowPanel = new RainbowDescriptionPanel(); myColorAndFontPanel = new ColorAndFontDescriptionPanel(); Dimension sizeR = myRainbowPanel.getPreferredSize(); @@ -122,7 +126,6 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe private void addRainbowHighlighting(@NotNull DocumentEx document, @Nullable List showLineData, @NotNull List data, - @NotNull RainbowHighlighter rainbowHighlighter, @NotNull TextAttributesKey[] rainbowTempKeys) { int colorCount = rainbowTempKeys.length; if (colorCount != 0) { @@ -162,42 +165,46 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe protected void updatePreviewPanel(@NotNull EditorSchemeAttributeDescriptor descriptor) { if (!(myPreviewPanel instanceof SimpleEditorPreview)) return; - UIUtil.invokeAndWaitIfNeeded((Runnable)() -> ApplicationManager.getApplication().runWriteAction(() -> { - SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; - String demoText = (myPage instanceof RainbowColorSettingsPage - && descriptor instanceof RainbowAttributeDescriptor) - ? ((RainbowColorSettingsPage)myPage).getRainbowDemoText() - : myPage.getDemoText(); - List showLineData = null; + UIUtil.invokeAndWaitIfNeeded((Runnable)() -> ApplicationManager.getApplication().runWriteAction(() -> { + SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; + try { + simpleEditorPreview.setNavigationBlocked(true); + String demoText = (myPage instanceof RainbowColorSettingsPage + && descriptor instanceof RainbowAttributeDescriptor) + ? ((RainbowColorSettingsPage)myPage).getRainbowDemoText() + : myPage.getDemoText(); + List showLineData = null; - if (myPage instanceof RainbowColorSettingsPage - && myRainbowPanel.myGlobalState.isRainbowOnWithInheritance(((RainbowColorSettingsPage)myPage).getLanguage())) { - RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); - TextAttributesKey[] tempKeys = highlighter.getRainbowTempKeys(); - EditorEx editor = simpleEditorPreview.getEditor(); - if (myActive == myRainbowPanel) { - Pair> demo = getColorDemoLine(highlighter, tempKeys); - simpleEditorPreview.setDemoText(demo.first + "\n" + demoText); - showLineData = demo.second; - } - else { - simpleEditorPreview.setDemoText(demoText); - } - addRainbowHighlighting(editor.getDocument(), - showLineData, - simpleEditorPreview.getHighlightDataForExtension(), - highlighter, - tempKeys); - } - else { - simpleEditorPreview.setDemoText(demoText); - } + if (myPage instanceof RainbowColorSettingsPage + && myColorAndFontGlobalState.isRainbowOnWithInheritance(((RainbowColorSettingsPage)myPage).getLanguage())) { + RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); + TextAttributesKey[] tempKeys = highlighter.getRainbowTempKeys(); + EditorEx editor = simpleEditorPreview.getEditor(); + if (myActive == myRainbowPanel) { + Pair> demo = getColorDemoLine(highlighter, tempKeys); + simpleEditorPreview.setDemoText(demo.first + "\n" + demoText); + showLineData = demo.second; + } + else { + simpleEditorPreview.setDemoText(demoText); + } + addRainbowHighlighting(editor.getDocument(), + showLineData, + simpleEditorPreview.getHighlightDataForExtension(), + tempKeys); + } + else { + simpleEditorPreview.setDemoText(demoText); + } - simpleEditorPreview.updateView(); - if (descriptor instanceof RainbowAttributeDescriptor) { - simpleEditorPreview.scrollHighlightInView(showLineData); - } - })); + simpleEditorPreview.updateView(); + if (descriptor instanceof RainbowAttributeDescriptor) { + simpleEditorPreview.scrollHighlightInView(showLineData); + } + } finally { + simpleEditorPreview.setNavigationBlocked(false); + } + })); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java index 7e26c82d7b8f..59d1b9e5046c 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java @@ -28,17 +28,24 @@ import java.util.List; class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithPath { private final String myGroup; + private final ColorAndFontGlobalState myColorAndFontGlobalState; private final String myDisplayName; private final EditorColorsScheme myScheme; private final Language myLanguage; private final RainbowColorsInSchemeState myRainbowColorsInSchemaState; + public ColorAndFontGlobalState getColorAndFontGlobalState() { + return myColorAndFontGlobalState; + } + public RainbowAttributeDescriptor(@Nullable Language language, + @NotNull ColorAndFontGlobalState colorAndFontGlobalState, @NotNull String group, @NotNull String displayNameWithPath, @NotNull EditorColorsScheme scheme, @NotNull RainbowColorsInSchemeState rainbowState) { myLanguage = language; + myColorAndFontGlobalState = colorAndFontGlobalState; myDisplayName = displayNameWithPath; myRainbowColorsInSchemaState = rainbowState; myScheme = scheme; @@ -67,12 +74,16 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP @Override public void apply(@NotNull EditorColorsScheme scheme) { - myRainbowColorsInSchemaState.apply(scheme); + if (myLanguage == null) { + myRainbowColorsInSchemaState.apply(scheme); + } + // see myColorAndFontGlobalState apply } @Override public boolean isModified() { - return myRainbowColorsInSchemaState.isModified(); + return (myLanguage == null && myRainbowColorsInSchemaState.isModified()) + || myColorAndFontGlobalState.isModified(myLanguage); } public List> getRainbowColorsInSchemaState() { diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java index 40054cc1d1cd..3b486c471e3a 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java @@ -84,21 +84,7 @@ public class RainbowColorsInSchemeState { return pair; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - RainbowColorsInSchemeState state = (RainbowColorsInSchemeState)o; - return myInheritanceAndColors.equals(state.myInheritanceAndColors); - } - - @Override - public int hashCode() { - return myInheritanceAndColors.hashCode(); - } - public boolean isModified() { - return !equals(myReferenceState); + return !myInheritanceAndColors.equals(myReferenceState.myInheritanceAndColors); } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index abfb4f5a41c2..77d65a359017 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -59,23 +59,17 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. private JTextPane myInheritanceLabel; private JBCheckBox myInheritAttributesBox; - ColorAndFontGlobalState myGlobalState; private final String myInheritedMessage; private final String myOverrideMessage; private final String myInheritedMessageTooltip; - public RainbowDescriptionPanel(ColorAndFontGlobalState globalState) { + public RainbowDescriptionPanel() { super(new BorderLayout()); - myGlobalState = globalState; add(myPanel, BorderLayout.CENTER); setBorder(JBUI.Borders.empty(4, 0, 4, 4)); - ActionListener actionListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - onSettingsChanged(e); - } - }; + + ActionListener actionListener = e -> myDispatcher.getMulticaster().onSettingsChanged(e); for (JBCheckBox c : new JBCheckBox[]{myRainbow, myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5, myInheritAttributesBox}) { c.addActionListener(actionListener); } @@ -88,9 +82,9 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. myInheritedMessage = ApplicationBundle.message("label.inherited.gradient", rainbowOptionsID, languageDefaultPageID); - myInheritedMessageTooltip =ApplicationBundle.message("label.inherited.gradient.tooltip", - rainbowOptionsID, - languageDefaultPageID); + myInheritedMessageTooltip = ApplicationBundle.message("label.inherited.gradient.tooltip", + rainbowOptionsID, + languageDefaultPageID); myOverrideMessage = ApplicationBundle.message("label.override.gradient"); HyperlinkListener listener = e -> myDispatcher.getMulticaster().onHyperLinkClicked(e); @@ -114,10 +108,6 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. return this; } - private void onSettingsChanged(ActionEvent e) { - myDispatcher.getMulticaster().onSettingsChanged(e); - } - @Override public void resetDefault() { } @@ -129,11 +119,11 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. List> rainbowState = descriptor.getRainbowColorsInSchemaState(); if (rainbowState.size() < myCbStops.length) return; - Boolean rainbowOn = myGlobalState.isRainbowOn(descriptor.getLanguage()); + Boolean rainbowOn = descriptor.getColorAndFontGlobalState().isRainbowOn(descriptor.getLanguage()); boolean isInherited = false; if (rainbowOn == null) { isInherited = true; - rainbowOn = myGlobalState.isRainbowOn(null); + rainbowOn = descriptor.getColorAndFontGlobalState().isRainbowOn(null); } myRainbow.setEnabled(!isInherited); myRainbow.setSelected(rainbowOn); @@ -169,10 +159,12 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. if (rainbowCurState.size() < myCbStops.length) return; boolean isDefaultLanguage = descriptor.getLanguage() == null; - myGlobalState.setRainbowOn(descriptor.getLanguage(), - isDefaultLanguage ? Boolean.valueOf(myRainbow.isSelected()) - : myInheritAttributesBox.isSelected() ? null - : Boolean.valueOf(myRainbow.isSelected())); + descriptor + .getColorAndFontGlobalState() + .setRainbowOn(descriptor.getLanguage(), + isDefaultLanguage ? Boolean.valueOf(myRainbow.isSelected()) + : myInheritAttributesBox.isSelected() ? null + : Boolean.valueOf(myRainbow.isSelected())); for (int i = 0; i < myCbStops.length; ++i) { boolean isOverride = myCbStops[i].isSelected(); rainbowCurState.set(i, Pair.create(isOverride, diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java index 4e23aa6b5c61..5ee4253663c4 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java @@ -63,7 +63,11 @@ public class SimpleEditorPreview implements PreviewPanel { private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); private final HighlightsExtractor myHighlightsExtractor; - private boolean myTextIsChanging = false; + + public void setNavigationBlocked(boolean isNavigationBlocked) { + myIsNavigationBlocked = isNavigationBlocked; + } + private boolean myIsNavigationBlocked = false; public SimpleEditorPreview(final ColorAndFontOptions options, final ColorSettingsPage page) { this(options, page, true); @@ -97,7 +101,7 @@ public class SimpleEditorPreview implements PreviewPanel { myEditor.getCaretModel().addCaretListener(new CaretAdapter() { @Override public void caretPositionChanged(CaretEvent e) { - if (!myTextIsChanging) { + if (!myIsNavigationBlocked) { navigate(myEditor, true, e.getNewPosition(), page.getHighlighter(), false); } } @@ -110,15 +114,9 @@ public class SimpleEditorPreview implements PreviewPanel { } public void setDemoText(final String text) { - try { - myTextIsChanging = true; - myEditor.getSelectionModel().removeSelection(); - myHighlightData.clear(); - myEditor.getDocument().setText(myHighlightsExtractor.extractHighlights(text, myHighlightData)); - } - finally { - myTextIsChanging = false; - } + myEditor.getSelectionModel().removeSelection(); + myHighlightData.clear(); + myEditor.getDocument().setText(myHighlightsExtractor.extractHighlights(text, myHighlightData)); } private void navigate(final Editor editor, boolean select, From 10b90a8ee10e18ad160acfd4d1823c1031ddb6d0 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Wed, 24 Aug 2016 15:38:44 +0300 Subject: [PATCH 13/17] IDEA-158861 right arrow correct support --- .../colors/RainbowDescriptionPanel.java | 32 +++++++++++++------ .../src/messages/ApplicationBundle.properties | 6 ++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index 77d65a359017..3c0a1d3a79b5 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -18,13 +18,16 @@ package com.intellij.application.options.colors; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; +import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pair; import com.intellij.ui.ColorPanel; import com.intellij.ui.components.JBCheckBox; import com.intellij.util.EventDispatcher; +import com.intellij.util.FontUtil; import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -82,26 +85,35 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. myInheritedMessage = ApplicationBundle.message("label.inherited.gradient", rainbowOptionsID, languageDefaultPageID); - myInheritedMessageTooltip = ApplicationBundle.message("label.inherited.gradient.tooltip", - rainbowOptionsID, - languageDefaultPageID); + + myInheritedMessageTooltip = checkRightArrow(ApplicationBundle.message("label.inherited.gradient.tooltip", + rainbowOptionsID, + languageDefaultPageID)); + myOverrideMessage = ApplicationBundle.message("label.override.gradient"); HyperlinkListener listener = e -> myDispatcher.getMulticaster().onHyperLinkClicked(e); Messages.configureMessagePaneUi(myGradientLabel, myOverrideMessage, null); myGradientLabel.addHyperlinkListener(listener); - Messages.configureMessagePaneUi(myInheritanceLabel, ApplicationBundle.message("label.rainbow.inheritance", - rainbowOptionsID, - rainbowOptionsID, - languageDefaultPageID), null); - myInheritanceLabel.setToolTipText(ApplicationBundle.message("label.rainbow.inheritance.tooltip", - rainbowOptionsID, - languageDefaultPageID)); + Messages.configureMessagePaneUi(myInheritanceLabel, + checkRightArrow(ApplicationBundle.message("label.rainbow.inheritance", + rainbowOptionsID, + rainbowOptionsID, + languageDefaultPageID)), + null); + myInheritanceLabel.setToolTipText(checkRightArrow(ApplicationBundle.message("label.rainbow.inheritance.tooltip", + rainbowOptionsID, + languageDefaultPageID))); myInheritanceLabel.addHyperlinkListener(listener); myInheritanceLabel.setBorder(JBUI.Borders.empty(4, 0, 4, 4)); } + @NotNull + private static String checkRightArrow(@NotNull String str) { + return str.replaceAll("->", FontUtil.rightArrow(UIUtil.getLabelFont())); + } + @NotNull @Override public JComponent getPanel() { diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 0f0638e64983..437d8e23a340 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -746,12 +746,12 @@ checkbox.line.comment.add.space=Add a space at comment start rainbow.option.panel.display.name=Semantic highlighting label.override.gradient=Override gradient: label.inherited.gradient=Inherited from
{1} gradient: -label.inherited.gradient.tooltip=''{0}\u2192Override gradient'' from
''{1}'' section +label.inherited.gradient.tooltip=''{0}->Override gradient'' from
''{1}'' section checkbox.stop.1=Stop #1 checkbox.stop.2=Stop #2 checkbox.stop.3=Stop #3 checkbox.stop.4=Stop #4 checkbox.stop.5=Stop #5 checkbox.rainbow=Unique color for each parameter
and local variable
Chosen from generated gradient -label.rainbow.inheritance=
''{0}\u2192Unique color''
of {2} -label.rainbow.inheritance.tooltip=''{0}\u2192Unique color'' from
''{1}'' section \ No newline at end of file +label.rainbow.inheritance=
''{0}->Unique color''
of
{2} +label.rainbow.inheritance.tooltip=''{0}->Unique color'' from
''{1}'' section \ No newline at end of file From ffb82e2ec7a55880fab197a6d357d165f8b5c2b7 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Tue, 30 Aug 2016 19:30:46 +0300 Subject: [PATCH 14/17] IDEA-158861 rainbow as meta-info in color scheme --- .../impl/analysis/HighlightNamesUtil.java | 5 +- .../codeHighlighting/RainbowHighlighter.java | 54 +++++---- .../daemon/impl/GeneralHighlightingPass.java | 2 +- .../openapi/options/SchemeMetaInfo.java | 25 ++++ .../editor/colors/EditorColorsScheme.java | 3 +- .../colors/impl/AbstractColorsScheme.java | 6 + .../colors/ColorAndFontGlobalState.java | 112 ------------------ .../options/colors/ColorAndFontOptions.java | 56 ++++----- .../colors/CustomizedSwitcherPanel.java | 75 ++++++------ .../options/colors/NewColorAndFontPanel.java | 2 +- .../options/colors/OptionsPanelImpl.java | 4 +- .../colors/RainbowAttributeDescriptor.java | 24 +--- .../colors/RainbowColorsInSchemeState.java | 98 +++++++-------- .../colors/RainbowDescriptionPanel.form | 20 ++-- .../colors/RainbowDescriptionPanel.java | 76 +++++------- .../colors/impl/DelegateColorScheme.java | 7 ++ .../src/DefaultColorSchemesManager.xml | 50 ++++++++ .../JBTerminalSystemSettingsProvider.java | 6 + 18 files changed, 287 insertions(+), 338 deletions(-) create mode 100644 platform/core-api/src/com/intellij/openapi/options/SchemeMetaInfo.java delete mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java index 5c915995234f..2346253229fc 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java @@ -155,8 +155,9 @@ public class HighlightNamesUtil { } HighlightInfo.Builder builder = HighlightInfo.newHighlightInfo(varType).range(elementToHighlight); - return RainbowHighlighter.isRainbowEnabledWithInheritance(JavaLanguage.INSTANCE) ? builder.createUnconditionally() - : builder.create(); + return RainbowHighlighter.isRainbowEnabledWithInheritance(colorsScheme, JavaLanguage.INSTANCE) + ? builder.createUnconditionally() + : builder.create(); } @Nullable diff --git a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java index d19b3166758f..8048ec28d173 100644 --- a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java +++ b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java @@ -17,7 +17,6 @@ package com.intellij.codeHighlighting; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.HighlightInfoType; -import com.intellij.ide.util.PropertiesComponent; import com.intellij.lang.Language; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.application.ApplicationManager; @@ -26,6 +25,7 @@ import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.colors.TextAttributesScheme; import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.options.SchemeMetaInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringHash; import com.intellij.openapi.util.text.StringUtil; @@ -39,6 +39,7 @@ import org.jetbrains.annotations.Nullable; import java.awt.*; import java.util.List; +import java.util.Properties; public class RainbowHighlighter { private static final JBColor[] RAINBOW_JB_COLORS_DEFAULT = { @@ -51,15 +52,11 @@ public class RainbowHighlighter { public static final TextAttributesKey[] RAINBOW_COLOR_KEYS = new TextAttributesKey[RAINBOW_JB_COLORS_DEFAULT.length]; private static final int RAINBOW_COLORS_BETWEEN = 4; private static final String UNIT_TEST_COLORS = "#000001,#000002,#000003,#000004"; // Do not modify! - private static String FALSE = "false"; - private static String TRUE = "true"; - private static String INHERITED = "inherited"; + private static final String INHERITED = "inherited"; static { for (int i = 0; i < RAINBOW_JB_COLORS_DEFAULT.length; ++i) { - JBColor jbColor = RAINBOW_JB_COLORS_DEFAULT[i]; - TextAttributes textAttributes = new TextAttributes(jbColor, null, null, null, Font.PLAIN); - RAINBOW_COLOR_KEYS[i] = TextAttributesKey.createTextAttributesKey("RAINBOW_COLOR" + i, textAttributes); + RAINBOW_COLOR_KEYS[i] = TextAttributesKey.createTextAttributesKey("RAINBOW_COLOR" + i, createRainbowAttribute(RAINBOW_JB_COLORS_DEFAULT[i])); } } public final static String RAINBOW_TYPE = "rainbow"; @@ -77,28 +74,36 @@ public class RainbowHighlighter { public static final HighlightInfoType RAINBOW_ELEMENT = new HighlightInfoType.HighlightInfoTypeImpl(HighlightSeverity.INFORMATION, DefaultLanguageHighlighterColors.CONSTANT); @Nullable - @Contract("null -> !null") - public static Boolean isRainbowEnabled(@Nullable Language language) { - String value = PropertiesComponent.getInstance().getValue(getKey(language), INHERITED); - if (TRUE.equals(value)) return Boolean.TRUE; - if (FALSE.equals(value)) return Boolean.FALSE; - return language == null ? DEFAULT_RAINBOW_ON : null; + @Contract("_, null -> !null") + public static Boolean isRainbowEnabled(@Nullable TextAttributesScheme colorsScheme, @Nullable Language language) { + if (colorsScheme instanceof SchemeMetaInfo) { + String value = ((SchemeMetaInfo)colorsScheme).getMetaProperties().getProperty(getKey(language), INHERITED); + if (String.valueOf(true).equals(value)) return Boolean.TRUE; + if (String.valueOf(false).equals(value)) return Boolean.FALSE; + return language == null ? DEFAULT_RAINBOW_ON : null; + } + return false; } - public static boolean isRainbowEnabledWithInheritance(@Nullable Language language) { - Boolean rainbowEnabled = isRainbowEnabled(language); - return rainbowEnabled != null ? rainbowEnabled : isRainbowEnabled(null); + public static boolean isRainbowEnabledWithInheritance(@Nullable TextAttributesScheme colorsScheme, @Nullable Language language) { + Boolean rainbowEnabled = isRainbowEnabled(colorsScheme, language); + return rainbowEnabled != null ? rainbowEnabled : isRainbowEnabled(colorsScheme, null); } - public static void setRainbowEnabled(@Nullable Language language, @Nullable Boolean enabled) { - PropertiesComponent.getInstance().setValue( - getKey(language), - enabled == null ? INHERITED : enabled.toString()); + public static void setRainbowEnabled(@NotNull SchemeMetaInfo colorsScheme, @Nullable Language language, @Nullable Boolean enabled) { + Properties properties = colorsScheme.getMetaProperties(); + String key = getKey(language); + if (enabled == null || (language == null && enabled == DEFAULT_RAINBOW_ON)) { + properties.remove(key); + } + else { + properties.setProperty(key, String.valueOf(enabled)); + } } @NotNull private static String getKey(@Nullable Language language) { - return RAINBOW_TYPE + (language == null ? "Default language" : language.getID()); + return RAINBOW_TYPE + " " + (language == null ? "Default language" : language.getID()); } public static int hashColor(@NotNull String name, int colorsCount) { @@ -187,4 +192,11 @@ public class RainbowHighlighter { .getFlyweight() .withForeground(calculateForeground(colorIndex)))); } + + @NotNull + public static TextAttributes createRainbowAttribute(@Nullable Color color) { + TextAttributes ret = new TextAttributes(); + ret.setForegroundColor(color); + return ret; + } } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java index 02494a2cd03d..88bd2c079394 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java @@ -143,7 +143,7 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP List list = Arrays.asList(highlightVisitors); for (HighlightVisitor visitor : DumbService.getInstance(myProject).filterByDumbAwareness(list)) { if (visitor instanceof RainbowVisitor - && !RainbowHighlighter.isRainbowEnabledWithInheritance(psiFile.getLanguage())) { + && !RainbowHighlighter.isRainbowEnabledWithInheritance(getColorsScheme(), psiFile.getLanguage())) { continue; } if (visitor.suitableForFile(psiFile)) { diff --git a/platform/core-api/src/com/intellij/openapi/options/SchemeMetaInfo.java b/platform/core-api/src/com/intellij/openapi/options/SchemeMetaInfo.java new file mode 100644 index 000000000000..45389fbbddbc --- /dev/null +++ b/platform/core-api/src/com/intellij/openapi/options/SchemeMetaInfo.java @@ -0,0 +1,25 @@ +/* + * Copyright 2000-2016 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.options; + +import org.jetbrains.annotations.NotNull; + +import java.util.Properties; + +public interface SchemeMetaInfo { + @NotNull + Properties getMetaProperties(); +} diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColorsScheme.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColorsScheme.java index c5ca81b54f42..2aaf813d3a2d 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColorsScheme.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorColorsScheme.java @@ -18,6 +18,7 @@ package com.intellij.openapi.editor.colors; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.options.FontSize; import com.intellij.openapi.options.Scheme; +import com.intellij.openapi.options.SchemeMetaInfo; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -25,7 +26,7 @@ import org.jetbrains.annotations.Nullable; import java.awt.*; -public interface EditorColorsScheme extends Cloneable, TextAttributesScheme, Scheme { +public interface EditorColorsScheme extends Cloneable, TextAttributesScheme, Scheme, SchemeMetaInfo { @NonNls String DEFAULT_SCHEME_NAME = "Default"; void setName(String name); diff --git a/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java b/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java index 1cb5c93d1f10..e3520f4bc8cf 100644 --- a/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java +++ b/platform/editor-ui-ex/src/com/intellij/openapi/editor/colors/impl/AbstractColorsScheme.java @@ -830,4 +830,10 @@ public abstract class AbstractColorsScheme implements EditorColorsScheme { } public boolean isReadOnly() { return false; } + + @NotNull + @Override + public Properties getMetaProperties() { + return myMetaInfo; + } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java deleted file mode 100644 index 4dc58d345507..000000000000 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontGlobalState.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2000-2016 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.colors; - -import com.intellij.codeHighlighting.RainbowHighlighter; -import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; -import com.intellij.lang.Language; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiFile; -import com.intellij.util.EventDispatcher; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.HashMap; -import java.util.Map; - -public class ColorAndFontGlobalState { - private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); - private HashMap myLanguage2RainbowEnabled = new HashMap<>(); - private final ColorAndFontGlobalState myReferenceState; - - @Nullable - @Contract("null -> !null") - public Boolean isRainbowOn(@Nullable Language language) { - assert myReferenceState != null; - if (myLanguage2RainbowEnabled.containsKey(language)) { - return myLanguage2RainbowEnabled.get(language); - } - Boolean rainbowOn = RainbowHighlighter.isRainbowEnabled(language); - myReferenceState.myLanguage2RainbowEnabled.put(language, rainbowOn); - myLanguage2RainbowEnabled.put(language, rainbowOn); - return rainbowOn; - } - - public boolean isRainbowOnWithInheritance(@Nullable Language language) { - Boolean value = isRainbowOn(language); - return value == null ? isRainbowOn(null) : value.booleanValue(); - } - - public void setRainbowOn(@Nullable Language language, @Nullable Boolean rainbowOn) { - assert myReferenceState != null; - myLanguage2RainbowEnabled.put(language, rainbowOn); - } - - private ColorAndFontGlobalState(@SuppressWarnings("UnusedParameters") boolean unused) { - myReferenceState = null; - } - - public ColorAndFontGlobalState() { - myReferenceState = new ColorAndFontGlobalState(true); - copyFrom(myReferenceState); //be ready to global data extension - } - - private void copyFrom(@NotNull ColorAndFontGlobalState state) { - assert this != state; - myLanguage2RainbowEnabled = new HashMap<>(state.myLanguage2RainbowEnabled); - } - - public void apply() { - for (Map.Entry entry : myLanguage2RainbowEnabled.entrySet()) { - RainbowHighlighter.setRainbowEnabled(entry.getKey(), entry.getValue()); - } - Editor[] allEditors = EditorFactory.getInstance().getAllEditors(); - for (Editor editor : allEditors) { - final Project project = editor.getProject(); - if (project != null) { - PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); - if (file != null) { - DaemonCodeAnalyzer.getInstance(project).restart(file); - } - } - } - myReferenceState.copyFrom(this); - } - - public void addListener(@NotNull ColorAndFontSettingsListener listener) { - myDispatcher.addListener(listener); - } - - public void stateChanged() { - myDispatcher.getMulticaster().settingsChanged(); - } - - public boolean isModified() { - return !myLanguage2RainbowEnabled.equals(myReferenceState.myLanguage2RainbowEnabled); - } - - public boolean isModified(@Nullable Language language) { - return myLanguage2RainbowEnabled.get(language) != myReferenceState.myLanguage2RainbowEnabled.get(language); - } - - public void reset() { - copyFrom(myReferenceState); - } -} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java index e090a1f2e08b..5b29aa3186b4 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java @@ -32,10 +32,7 @@ import com.intellij.openapi.editor.colors.impl.*; import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.SchemeManager; -import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.options.*; import com.intellij.openapi.options.colors.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; @@ -55,6 +52,7 @@ import com.intellij.psi.search.scope.packageSet.NamedScopesHolder; import com.intellij.psi.search.scope.packageSet.PackageSet; import com.intellij.ui.ColorUtil; import com.intellij.util.ArrayUtil; +import com.intellij.util.EventDispatcher; import com.intellij.util.ui.UIUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; @@ -75,8 +73,6 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private Map mySchemes; private MyColorScheme mySelectedScheme; - private final ColorAndFontGlobalState myColorAndFontGlobalState = new ColorAndFontGlobalState(); - public static final String FILE_STATUS_GROUP = ApplicationBundle.message("title.file.status"); public static final String SCOPES_GROUP = ApplicationBundle.message("title.scope.based"); @@ -94,8 +90,14 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private boolean myDisposeCompleted = false; private final Disposable myDisposable = Disposer.newDisposable(); - public ColorAndFontGlobalState getColorAndFontGlobalState() { - return myColorAndFontGlobalState; + private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); + + public void addListener(@NotNull ColorAndFontSettingsListener listener) { + myDispatcher.addListener(listener); + } + + public void stateChanged() { + myDispatcher.getMulticaster().settingsChanged(); } @Override @@ -200,7 +202,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract clone.setName(name); MyColorScheme newScheme = new MyColorScheme(clone); - initScheme(myColorAndFontGlobalState, newScheme); + initScheme(newScheme); newScheme.setIsNew(); @@ -211,7 +213,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract public void addImportedScheme(@NotNull EditorColorsScheme imported) { MyColorScheme newScheme = new MyColorScheme(imported); - initScheme(myColorAndFontGlobalState, newScheme); + initScheme(newScheme); mySchemes.put(imported.getName(), newScheme); selectScheme(newScheme.getName()); @@ -244,8 +246,6 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } try { - myColorAndFontGlobalState.apply(); - EditorColorsManager myColorsManager = EditorColorsManager.getInstance(); SchemeManager schemeManager = ((EditorColorsManagerImpl)myColorsManager).getSchemeManager(); @@ -494,11 +494,10 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } private void initAll() { - myColorAndFontGlobalState.reset(); mySchemes = new THashMap<>(); for (EditorColorsScheme allScheme : EditorColorsManager.getInstance().getAllSchemes()) { MyColorScheme schemeDelegate = new MyColorScheme(allScheme); - initScheme(myColorAndFontGlobalState, schemeDelegate); + initScheme(schemeDelegate); mySchemes.put(schemeDelegate.getName(), schemeDelegate); } @@ -506,29 +505,27 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract assert mySelectedScheme != null : EditorColorsManager.getInstance().getGlobalScheme().getName() + "; myschemes=" + mySchemes; } - private static void initScheme(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, @NotNull MyColorScheme scheme) { + private static void initScheme(@NotNull MyColorScheme scheme) { List descriptions = new ArrayList<>(); - initPluggedDescriptions(colorAndFontGlobalState, descriptions, scheme); + initPluggedDescriptions(descriptions, scheme); initFileStatusDescriptors(descriptions, scheme); initScopesDescriptors(descriptions, scheme); scheme.setDescriptors(descriptions.toArray(new EditorSchemeAttributeDescriptor[descriptions.size()])); } - private static void initPluggedDescriptions(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, - @NotNull List descriptions, + private static void initPluggedDescriptions(@NotNull List descriptions, @NotNull MyColorScheme scheme) { ColorSettingsPage[] pages = ColorSettingsPages.getInstance().getRegisteredPages(); for (ColorSettingsPage page : pages) { - initDescriptions(colorAndFontGlobalState, page, descriptions, scheme); + initDescriptions(page, descriptions, scheme); } for (ColorAndFontDescriptorsProvider provider : Extensions.getExtensions(ColorAndFontDescriptorsProvider.EP_NAME)) { - initDescriptions(colorAndFontGlobalState, provider, descriptions, scheme); + initDescriptions(provider, descriptions, scheme); } } - private static void initDescriptions(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, - @NotNull ColorAndFontDescriptorsProvider provider, + private static void initDescriptions(@NotNull ColorAndFontDescriptorsProvider provider, @NotNull List descriptions, @NotNull MyColorScheme scheme) { String group = provider.getDisplayName(); @@ -536,11 +533,10 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract //todo: single point configuration? if (provider instanceof RainbowColorSettingsPage) { descriptions.add(new RainbowAttributeDescriptor(((RainbowColorSettingsPage)provider).getLanguage(), - colorAndFontGlobalState, group, ApplicationBundle.message("rainbow.option.panel.display.name"), scheme, - scheme.getRainbowState())); + scheme.myRainbowState)); } for (AttributesDescriptor descriptor : attributeDescriptors) { addSchemedDescription(descriptions, descriptor.getDisplayName(), group, descriptor.getKey(), scheme, null, null); @@ -1027,6 +1023,11 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract setQuickDocFontSize(parentScheme.getQuickDocFontSize()); myName = parentScheme.getName(); + + //noinspection UseOfPropertiesAsHashtable + getMetaProperties().putAll(parentScheme.getMetaProperties()); + myRainbowState = new RainbowColorsInSchemeState(this, parentScheme); + initFonts(); } @@ -1144,13 +1145,6 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract } return false; } - - public RainbowColorsInSchemeState getRainbowState() { - if (myRainbowState == null) { - myRainbowState = new RainbowColorsInSchemeState(this); - } - return myRainbowState; - } } @Override diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index 48d7d304401f..d4c5619600b0 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -37,7 +37,6 @@ import java.util.*; import java.util.List; class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDescriptionPanel { - private ColorAndFontGlobalState myColorAndFontGlobalState; private ColorSettingsPage myPage; private PreviewPanel myPreviewPanel; @@ -46,11 +45,9 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe private OptionsPanelImpl.ColorDescriptionPanel myActive; - public CustomizedSwitcherPanel(@NotNull ColorAndFontGlobalState colorAndFontGlobalState, - @Nullable PreviewPanel previewPanel, + public CustomizedSwitcherPanel(@Nullable PreviewPanel previewPanel, @Nullable ColorSettingsPage page) { super(); - myColorAndFontGlobalState = colorAndFontGlobalState; myPage = page; myPreviewPanel = previewPanel; @@ -165,46 +162,48 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe protected void updatePreviewPanel(@NotNull EditorSchemeAttributeDescriptor descriptor) { if (!(myPreviewPanel instanceof SimpleEditorPreview)) return; - UIUtil.invokeAndWaitIfNeeded((Runnable)() -> ApplicationManager.getApplication().runWriteAction(() -> { - SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; - try { - simpleEditorPreview.setNavigationBlocked(true); - String demoText = (myPage instanceof RainbowColorSettingsPage - && descriptor instanceof RainbowAttributeDescriptor) - ? ((RainbowColorSettingsPage)myPage).getRainbowDemoText() - : myPage.getDemoText(); - List showLineData = null; + UIUtil.invokeAndWaitIfNeeded((Runnable)() -> ApplicationManager.getApplication().runWriteAction(() -> { + SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; + try { + simpleEditorPreview.setNavigationBlocked(true); + String demoText = (myPage instanceof RainbowColorSettingsPage + && descriptor instanceof RainbowAttributeDescriptor) + ? ((RainbowColorSettingsPage)myPage).getRainbowDemoText() + : myPage.getDemoText(); + List showLineData = null; - if (myPage instanceof RainbowColorSettingsPage - && myColorAndFontGlobalState.isRainbowOnWithInheritance(((RainbowColorSettingsPage)myPage).getLanguage())) { - RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); - TextAttributesKey[] tempKeys = highlighter.getRainbowTempKeys(); - EditorEx editor = simpleEditorPreview.getEditor(); - if (myActive == myRainbowPanel) { - Pair> demo = getColorDemoLine(highlighter, tempKeys); - simpleEditorPreview.setDemoText(demo.first + "\n" + demoText); - showLineData = demo.second; - } - else { - simpleEditorPreview.setDemoText(demoText); - } - addRainbowHighlighting(editor.getDocument(), - showLineData, - simpleEditorPreview.getHighlightDataForExtension(), - tempKeys); + if (myPage instanceof RainbowColorSettingsPage + && RainbowHighlighter.isRainbowEnabledWithInheritance(descriptor.getScheme(), + ((RainbowColorSettingsPage)myPage).getLanguage())) { + RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); + TextAttributesKey[] tempKeys = highlighter.getRainbowTempKeys(); + EditorEx editor = simpleEditorPreview.getEditor(); + if (myActive == myRainbowPanel) { + Pair> demo = getColorDemoLine(highlighter, tempKeys); + simpleEditorPreview.setDemoText(demo.first + "\n" + demoText); + showLineData = demo.second; } else { simpleEditorPreview.setDemoText(demoText); } - - simpleEditorPreview.updateView(); - if (descriptor instanceof RainbowAttributeDescriptor) { - simpleEditorPreview.scrollHighlightInView(showLineData); - } - } finally { - simpleEditorPreview.setNavigationBlocked(false); + addRainbowHighlighting(editor.getDocument(), + showLineData, + simpleEditorPreview.getHighlightDataForExtension(), + tempKeys); } - })); + else { + simpleEditorPreview.setDemoText(demoText); + } + + simpleEditorPreview.updateView(); + if (descriptor instanceof RainbowAttributeDescriptor) { + simpleEditorPreview.scrollHighlightInView(showLineData); + } + } + finally { + simpleEditorPreview.setNavigationBlocked(false); + } + })); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java index b7388831cd6c..f6f467c5ea4a 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java @@ -134,7 +134,7 @@ public class NewColorAndFontPanel extends JPanel { final OptionsPanel optionsPanel = new OptionsPanelImpl( options, schemesPanel, category, - new CustomizedSwitcherPanel(options.getColorAndFontGlobalState(), previewPanel, page)); + new CustomizedSwitcherPanel(previewPanel, page)); return new NewColorAndFontPanel(schemesPanel, optionsPanel, previewPanel, category, optionList, page); } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java index fe9bf12d27b0..0337f66d23dc 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/OptionsPanelImpl.java @@ -74,7 +74,7 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { @Override public void onSettingsChanged(ActionEvent e) { myDispatcher.getMulticaster().settingsChanged(); - myOptions.getColorAndFontGlobalState().stateChanged(); + myOptions.stateChanged(); } @Override @@ -100,7 +100,7 @@ public class OptionsPanelImpl extends JPanel implements OptionsPanel { } }); - myOptions.getColorAndFontGlobalState().addListener(new ColorAndFontSettingsListener.Abstract() { + myOptions.addListener(new ColorAndFontSettingsListener.Abstract() { @Override public void settingsChanged() { if (!mySchemesProvider.areSchemesLoaded()) return; diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java index 59d1b9e5046c..b4957eafd0b0 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowAttributeDescriptor.java @@ -19,33 +19,22 @@ import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.lang.Language; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; -import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.awt.*; -import java.util.List; - class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithPath { private final String myGroup; - private final ColorAndFontGlobalState myColorAndFontGlobalState; private final String myDisplayName; private final EditorColorsScheme myScheme; private final Language myLanguage; private final RainbowColorsInSchemeState myRainbowColorsInSchemaState; - public ColorAndFontGlobalState getColorAndFontGlobalState() { - return myColorAndFontGlobalState; - } - public RainbowAttributeDescriptor(@Nullable Language language, - @NotNull ColorAndFontGlobalState colorAndFontGlobalState, @NotNull String group, @NotNull String displayNameWithPath, @NotNull EditorColorsScheme scheme, @NotNull RainbowColorsInSchemeState rainbowState) { myLanguage = language; - myColorAndFontGlobalState = colorAndFontGlobalState; myDisplayName = displayNameWithPath; myRainbowColorsInSchemaState = rainbowState; myScheme = scheme; @@ -75,23 +64,14 @@ class RainbowAttributeDescriptor implements EditorSchemeAttributeDescriptorWithP @Override public void apply(@NotNull EditorColorsScheme scheme) { if (myLanguage == null) { + // call it once for 'Default Language' myRainbowColorsInSchemaState.apply(scheme); } - // see myColorAndFontGlobalState apply } @Override public boolean isModified() { - return (myLanguage == null && myRainbowColorsInSchemaState.isModified()) - || myColorAndFontGlobalState.isModified(myLanguage); - } - - public List> getRainbowColorsInSchemaState() { - return myRainbowColorsInSchemaState.getInheritanceAndColors(); - } - - public Color getDefaultColor(int index) { - return RainbowHighlighter.RAINBOW_COLOR_KEYS[index].getDefaultAttributes().getForegroundColor(); + return myRainbowColorsInSchemaState.isModified(myLanguage); } public Language getLanguage() { diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java index 3b486c471e3a..b02b2e81b087 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowColorsInSchemeState.java @@ -16,75 +16,69 @@ package com.intellij.application.options.colors; import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; +import com.intellij.lang.Language; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.TextAttributesKey; -import com.intellij.openapi.editor.markup.TextAttributes; -import com.intellij.openapi.util.Pair; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.awt.*; -import java.util.*; -import java.util.List; public class RainbowColorsInSchemeState { - private final RainbowColorsInSchemeState myReferenceState; - private final List> myInheritanceAndColors = new ArrayList<>(); + private final EditorColorsScheme myEditedScheme; + private final EditorColorsScheme myOriginalScheme; - public List> getInheritanceAndColors() { - return myInheritanceAndColors; - } - - private RainbowColorsInSchemeState(@NotNull EditorColorsScheme scheme, - @SuppressWarnings("UnusedParameters") boolean unused) { - myReferenceState = null; - for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { - myInheritanceAndColors.add(getColorStateFromScheme(scheme, rainbowKey)); - } - } - - public RainbowColorsInSchemeState(@NotNull EditorColorsScheme scheme) { - myReferenceState = new RainbowColorsInSchemeState(scheme, true); - copyFrom(myReferenceState); - } - - private void copyFrom(@NotNull RainbowColorsInSchemeState state) { - assert this != state; - myInheritanceAndColors.clear(); - myInheritanceAndColors.addAll(state.myInheritanceAndColors); + public RainbowColorsInSchemeState(@NotNull EditorColorsScheme editedScheme, + @NotNull EditorColorsScheme originalScheme) { + myEditedScheme = editedScheme; + myOriginalScheme = originalScheme; } public void apply(@NotNull EditorColorsScheme scheme) { - int i = 0; - for (TextAttributesKey rainbowKey : RainbowHighlighter.RAINBOW_COLOR_KEYS) { - Pair pair = myInheritanceAndColors.get(i); - scheme.setAttributes(rainbowKey, pair.first ? new TextAttributes(pair.second, null, null, null, Font.PLAIN) - : rainbowKey.getDefaultAttributes()); - ++i; + if (scheme != myEditedScheme) { + scheme.getMetaProperties().clear(); + //noinspection UseOfPropertiesAsHashtable + scheme.getMetaProperties().putAll(myEditedScheme.getMetaProperties()); + for (TextAttributesKey key : RainbowHighlighter.RAINBOW_COLOR_KEYS) { + Color color = myEditedScheme.getAttributes(key).getForegroundColor(); + if (!color.equals(scheme.getAttributes(key).getForegroundColor()) ) { + scheme.setAttributes(key, RainbowHighlighter.createRainbowAttribute(color)); + } + } + updateRainbowMarkup(); } - //myReferenceState.copyFrom(this); } - @NotNull - private static Pair getColorStateFromScheme(@NotNull EditorColorsScheme scheme, TextAttributesKey rainbowKey) { - TextAttributes schemeAttributes = scheme.getAttributes(rainbowKey); - @NotNull Color defaultRainbow = rainbowKey.getDefaultAttributes().getForegroundColor(); - Pair pair; - if (schemeAttributes == null) { - pair = Pair.create(false, defaultRainbow); - } - else { - Color schemeColor = schemeAttributes.getForegroundColor(); - if (schemeColor == null) { - pair = Pair.create(false, defaultRainbow); - } - else { - pair = Pair.create(!defaultRainbow.equals(schemeColor), schemeColor); + private static void updateRainbowMarkup() { + Editor[] allEditors = EditorFactory.getInstance().getAllEditors(); + for (Editor editor : allEditors) { + final Project project = editor.getProject(); + if (project != null) { + PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); + if (file != null) { + DaemonCodeAnalyzer.getInstance(project).restart(file); + } } } - return pair; } - public boolean isModified() { - return !myInheritanceAndColors.equals(myReferenceState.myInheritanceAndColors); + public boolean isModified(@Nullable Language language) { + return (language == null && isRainbowColorsModified()) + || RainbowHighlighter.isRainbowEnabled(myEditedScheme, language) != RainbowHighlighter.isRainbowEnabled(myOriginalScheme, language); + } + + private boolean isRainbowColorsModified() { + for (TextAttributesKey key : RainbowHighlighter.RAINBOW_COLOR_KEYS) { + if (!myEditedScheme.getAttributes(key).equals(myOriginalScheme.getAttributes(key)) ) { + return true; + } + } + return false; } } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form index 163b460101bb..0e8ddb02e857 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.form @@ -90,41 +90,41 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index 3c0a1d3a79b5..4347eb11b54b 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -15,15 +15,15 @@ */ package com.intellij.application.options.colors; +import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; -import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptorWithPath; import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.Pair; import com.intellij.ui.ColorPanel; import com.intellij.ui.components.JBCheckBox; +import com.intellij.ui.components.JBLabel; import com.intellij.util.EventDispatcher; import com.intellij.util.FontUtil; import com.intellij.util.ui.JBUI; @@ -33,9 +33,7 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.event.HyperlinkListener; import java.awt.*; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.List; public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl.ColorDescriptionPanel { @@ -44,12 +42,12 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. protected JPanel myPanel; private JTextPane myGradientLabel; - private JBCheckBox myCbStop1; - private JBCheckBox myCbStop2; - private JBCheckBox myCbStop3; - private JBCheckBox myCbStop4; - private JBCheckBox myCbStop5; - private JBCheckBox[] myCbStops = new JBCheckBox[]{myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5}; + private JBLabel myLStop1; + private JBLabel myLStop2; + private JBLabel myLStop3; + private JBLabel myLStop4; + private JBLabel myLStop5; + private JBLabel[] myLStops = new JBLabel[]{myLStop1, myLStop2, myLStop3, myLStop4, myLStop5}; protected ColorPanel myStop1; protected ColorPanel myStop2; @@ -73,7 +71,7 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. setBorder(JBUI.Borders.empty(4, 0, 4, 4)); ActionListener actionListener = e -> myDispatcher.getMulticaster().onSettingsChanged(e); - for (JBCheckBox c : new JBCheckBox[]{myRainbow, myCbStop1, myCbStop2, myCbStop3, myCbStop4, myCbStop5, myInheritAttributesBox}) { + for (JBCheckBox c : new JBCheckBox[]{myRainbow, myInheritAttributesBox}) { c.addActionListener(actionListener); } for (ColorPanel c : new ColorPanel[]{myStop1, myStop2, myStop3, myStop4, myStop5}) { @@ -129,33 +127,27 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. if (!(attributeDescriptor instanceof RainbowAttributeDescriptor)) return; RainbowAttributeDescriptor descriptor = (RainbowAttributeDescriptor)attributeDescriptor; - List> rainbowState = descriptor.getRainbowColorsInSchemaState(); - if (rainbowState.size() < myCbStops.length) return; - Boolean rainbowOn = descriptor.getColorAndFontGlobalState().isRainbowOn(descriptor.getLanguage()); + EditorColorsScheme editedColorsScheme = descriptor.getScheme(); + Boolean rainbowOn = RainbowHighlighter.isRainbowEnabled(editedColorsScheme, descriptor.getLanguage()); boolean isInherited = false; - if (rainbowOn == null) { - isInherited = true; - rainbowOn = descriptor.getColorAndFontGlobalState().isRainbowOn(null); - } - myRainbow.setEnabled(!isInherited); - myRainbow.setSelected(rainbowOn); - // the colors are editable only for default language boolean isDefaultLanguage = descriptor.getLanguage() == null; - boolean isEnable = !ColorAndFontOptions.isReadOnly(attributeDescriptor.getScheme()) && isDefaultLanguage; - //myGradientLabel.setEnabled(isEnable); - for (int i = 0; i < myCbStops.length; ++i) { - Pair state = rainbowState.get(i); - myCbStops[i].setEnabled(isEnable); + boolean isEnable = !ColorAndFontOptions.isReadOnly(editedColorsScheme); + if (rainbowOn == null) { + isInherited = true; + rainbowOn = RainbowHighlighter.isRainbowEnabled(editedColorsScheme, null); + } + myRainbow.setEnabled(isEnable && !isInherited); + myRainbow.setSelected(rainbowOn); - boolean isOverride = state.first; - myCbStops[i].setSelected(isOverride); - - myStops[i].setEditable(isEnable && isOverride); - myStops[i].setSelectedColor(state.second); + for (int i = 0; i < myLStops.length; ++i) { + myLStops[i].setEnabled(isEnable && isDefaultLanguage); + myStops[i].setEditable(isEnable && isDefaultLanguage); + myStops[i].setSelectedColor(editedColorsScheme.getAttributes(RainbowHighlighter.RAINBOW_COLOR_KEYS[i]).getForegroundColor()); } myInheritanceLabel.setVisible(!isDefaultLanguage); + myInheritAttributesBox.setEnabled(isEnable); myInheritAttributesBox.setSelected(isInherited); myInheritAttributesBox.setVisible(!isDefaultLanguage); myGradientLabel.setText(isDefaultLanguage ? myOverrideMessage : myInheritedMessage); @@ -167,22 +159,16 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. if (!(attributeDescriptor instanceof RainbowAttributeDescriptor)) return; RainbowAttributeDescriptor descriptor = (RainbowAttributeDescriptor)attributeDescriptor; - List> rainbowCurState = descriptor.getRainbowColorsInSchemaState(); - if (rainbowCurState.size() < myCbStops.length) return; - boolean isDefaultLanguage = descriptor.getLanguage() == null; - descriptor - .getColorAndFontGlobalState() - .setRainbowOn(descriptor.getLanguage(), - isDefaultLanguage ? Boolean.valueOf(myRainbow.isSelected()) - : myInheritAttributesBox.isSelected() ? null - : Boolean.valueOf(myRainbow.isSelected())); - for (int i = 0; i < myCbStops.length; ++i) { - boolean isOverride = myCbStops[i].isSelected(); - rainbowCurState.set(i, Pair.create(isOverride, - isOverride ? myStops[i].getSelectedColor() : descriptor.getDefaultColor(i))); - } + RainbowHighlighter.setRainbowEnabled(scheme, + descriptor.getLanguage(), + isDefaultLanguage ? Boolean.valueOf(myRainbow.isSelected()) + : myInheritAttributesBox.isSelected() ? null + : Boolean.valueOf(myRainbow.isSelected())); + for (int i = 0; i < myStops.length; ++i) { + scheme.setAttributes(RainbowHighlighter.RAINBOW_COLOR_KEYS[i], RainbowHighlighter.createRainbowAttribute(myStops[i].getSelectedColor())); + } descriptor.apply(scheme); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/DelegateColorScheme.java b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/DelegateColorScheme.java index 01fe0814f2c3..2105f6bba288 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/DelegateColorScheme.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/DelegateColorScheme.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; +import java.util.Properties; /** * User: spLeaner @@ -197,4 +198,10 @@ public abstract class DelegateColorScheme implements EditorColorsScheme { public void setConsoleLineSpacing(float lineSpacing) { myDelegate.setConsoleLineSpacing(lineSpacing); } + + @NotNull + @Override + public Properties getMetaProperties() { + return myDelegate.getMetaProperties(); + } } diff --git a/platform/platform-resources/src/DefaultColorSchemesManager.xml b/platform/platform-resources/src/DefaultColorSchemesManager.xml index 2abe4a25a8f6..656a01bfe9d5 100644 --- a/platform/platform-resources/src/DefaultColorSchemesManager.xml +++ b/platform/platform-resources/src/DefaultColorSchemesManager.xml @@ -1024,6 +1024,31 @@ + + + + + @@ -2086,6 +2111,31 @@ + + + + + diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java index 8360423f86e9..105fc26f600d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java @@ -489,6 +489,12 @@ public class JBTerminalSystemSettingsProvider extends DefaultTabbedSettingsProvi public void setConsoleLineSpacing(float lineSpacing) { getGlobal().setConsoleLineSpacing(lineSpacing); } + + @NotNull + @Override + public Properties getMetaProperties() { + return myGlobalScheme.getMetaProperties(); + } } public void addListener(TerminalSettingsListener listener) { From c012b87330f99ed849240ca2c512cf99b6d89326 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Thu, 1 Sep 2016 20:07:36 +0300 Subject: [PATCH 15/17] IDEA-158861 rollback changes in UserColors, make it public; the same code preview for rainbow/non-rainbow colors; PHP example tag-based markup --- .../colors/pages/JavaColorSettingsPage.java | 54 ++---- .../codeHighlighting/RainbowHighlighter.java | 54 ++++-- .../codeInsight/daemon/RainbowVisitor.java | 2 +- .../codeInsight/daemon/UsedColors.java | 40 +++- .../colors/RainbowColorSettingsPage.java | 4 - .../options/colors/ClickNavigator.java | 181 ------------------ .../colors/CustomizedSwitcherPanel.java | 105 +--------- .../options/colors/NewColorAndFontPanel.java | 8 +- .../colors/RainbowDescriptionPanel.java | 1 + .../options/colors/SimpleEditorPreview.java | 180 ++++++++++++----- .../pages/DefaultLanguageColorsPage.java | 54 ++---- 11 files changed, 228 insertions(+), 455 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java diff --git a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java index 853206b4d5d2..a6c706f4b8f7 100644 --- a/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java +++ b/java/java-impl/src/com/intellij/openapi/options/colors/pages/JavaColorSettingsPage.java @@ -16,10 +16,12 @@ package com.intellij.openapi.options.colors.pages; import com.intellij.application.options.colors.InspectionColorSettingsPage; +import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.ide.highlighter.JavaFileHighlighter; import com.intellij.ide.highlighter.JavaHighlightingColors; import com.intellij.lang.Language; import com.intellij.lang.java.JavaLanguage; +import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileTypes.StdFileTypes; @@ -36,7 +38,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.HashMap; import java.util.Map; public class JavaColorSettingsPage implements RainbowColorSettingsPage, InspectionColorSettingsPage, DisplayPrioritySortable { @@ -92,7 +93,7 @@ public class JavaColorSettingsPage implements RainbowColorSettingsPage, Inspecti new AttributesDescriptor(OptionsBundle.message("options.java.attribute.descriptor.annotation.attribute.name"), JavaHighlightingColors.ANNOTATION_ATTRIBUTE_NAME_ATTRIBUTES) }; - @NonNls private static final Map ourTags = new HashMap<>(); + @NonNls private static final Map ourTags = RainbowHighlighter.createRainbowHLM(); static { ourTags.put("field", JavaHighlightingColors.INSTANCE_FIELD_ATTRIBUTES); ourTags.put("unusedField", CodeInsightColors.NOT_USED_ELEMENT_ATTRIBUTES); @@ -178,11 +179,22 @@ public class JavaColorSettingsPage implements RainbowColorSettingsPage, Inspecti " public static int staticField = 0;\n" + " public final int instanceFinalField = 0;\n" + "\n" + - " public SomeClass(AnInterface param, int[] reassignedParam) {\n" + + " /**\n" + + " * " + ApplicationBundle.message("rainbow.option.panel.display.name") + ":\n" + + " * " + RainbowHighlighter.generatePaletteExample() + "\n" + + " * @param param1\n" + + " * @param reassignedParam\n" + + " * @param param2\n" + + " * @param param3\n" + + " */\n" + + " public SomeClass(AnInterface param1, int[] reassignedParam,\n" + + " int param2\n" + + " int param3) {\n" + + " int reassignedValue = this.staticField + param2 + param3;\n" + + " long localVar1, localVar2, localVar3, localVar4;\n" + " int localVar = \"IntelliJ\"; // Error, incompatible types\n" + " System.out.println(anotherString + toString() + localVar);\n" + " long time = Date.parse(\"1.2.3\"); // Method is deprecated\n" + - " int reassignedValue = this.staticField; \n" + " reassignedValue ++; \n" + " field.run(); \n" + " new SomeClass() {\n" + @@ -193,7 +205,7 @@ public class JavaColorSettingsPage implements RainbowColorSettingsPage, Inspecti " reassignedParam = new ArrayList<String>().toArray(new int[0]);\n" + " }\n" + "}\n" + - "enum AnEnum { CONST1, CONST2 }\n"+ + "enum AnEnum { CONST1, CONST2 }\n" + "interface AnInterface {\n" + " int CONSTANT = 2;\n" + " void method();\n" + @@ -218,41 +230,9 @@ public class JavaColorSettingsPage implements RainbowColorSettingsPage, Inspecti || JavaHighlightingColors.REASSIGNED_LOCAL_VARIABLE_ATTRIBUTES.equals(type) || JavaHighlightingColors.PARAMETER_ATTRIBUTES.equals(type) || JavaHighlightingColors.REASSIGNED_PARAMETER_ATTRIBUTES.equals(type) - || JavaHighlightingColors.DOC_COMMENT_TAG_VALUE.equals(type); } - @NotNull - @Override - public String getRainbowDemoText() { - return - "import java.util.Date;\n" + - "class SomeClass {\n" + - " public int field;\n" + - " SomeClass(AnInterface param) {\n" + - "\n" + - " }\n" + - " /**\n" + - " * Doc comment\n" + - " * @param param1 function param\n" + - " * @param param2\n" + - " * @param param3\n" + - " * @param param4\n" + - " * @param param5\n" + - " */\n" + - " void method(int param1,\n" + - " int param2,\n" + - " int param3,\n" + - " int param4,\n" + - " int param5) {\n" + - " int localVar1, localVar2, localVar3, localVar4, localVar5;\n" + - "\n" + - " localVar3 = param2;\n" + - " this.field = localVar3 + param1 + param5;\n" + - " }\n" + - "}\n"; - } - @Nullable @Override public Language getLanguage() { diff --git a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java index 8048ec28d173..d73fdc6abfd6 100644 --- a/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java +++ b/platform/analysis-impl/src/com/intellij/codeHighlighting/RainbowHighlighter.java @@ -27,7 +27,6 @@ import com.intellij.openapi.editor.colors.TextAttributesScheme; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.options.SchemeMetaInfo; import com.intellij.openapi.util.registry.Registry; -import com.intellij.openapi.util.text.StringHash; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.ui.ColorUtil; @@ -38,7 +37,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; public class RainbowHighlighter { @@ -56,11 +57,17 @@ public class RainbowHighlighter { static { for (int i = 0; i < RAINBOW_JB_COLORS_DEFAULT.length; ++i) { + //noinspection deprecation RAINBOW_COLOR_KEYS[i] = TextAttributesKey.createTextAttributesKey("RAINBOW_COLOR" + i, createRainbowAttribute(RAINBOW_JB_COLORS_DEFAULT[i])); } } public final static String RAINBOW_TYPE = "rainbow"; private final static String RAINBOW_TEMP_PREF = "RAINBOW_TEMP_"; + + @SuppressWarnings("deprecation") + public final static TextAttributesKey RAINBOW_ANCHOR = TextAttributesKey.createTextAttributesKey(RAINBOW_TYPE, new TextAttributes()); + @SuppressWarnings("deprecation") + public final static TextAttributesKey RAINBOW_GRADIENT_DEMO = TextAttributesKey.createTextAttributesKey("rainbow_demo", new TextAttributes()); public final static Boolean DEFAULT_RAINBOW_ON = Boolean.FALSE; @NotNull private final TextAttributesScheme myColorsScheme; @@ -106,28 +113,20 @@ public class RainbowHighlighter { return RAINBOW_TYPE + " " + (language == null ? "Default language" : language.getID()); } - public static int hashColor(@NotNull String name, int colorsCount) { - return Math.abs(StringHash.murmur(name, 0x55AA)) % colorsCount; - } - - public static int getColorIndex(@NotNull int[] index2usage, int hashedIndex, int colorsCount) { - int minIndex1 = indexOfMin(index2usage, hashedIndex, colorsCount); - int minIndex2 = indexOfMin(index2usage, 0, hashedIndex); - return index2usage[minIndex1] <= index2usage[minIndex2] ? minIndex1 : minIndex2; - } - - @Contract(pure = true) - private static int indexOfMin(@NotNull int[] index2usage, int start, int end) { - int min = Integer.MAX_VALUE; - int minIndex = start; - for (int i = start; i < end; i++) { - int value = index2usage[i]; - if (value < min) { - min = value; - minIndex = i; + @NotNull + public static String generatePaletteExample() { + int stopCount = RAINBOW_COLOR_KEYS.length; + StringBuilder sb = new StringBuilder(); + String tagRainbow = RAINBOW_GRADIENT_DEMO.getExternalName(); + for (int i = 0; i < RAINBOW_TEMP_KEYS.length; ++i) { + if (sb.length() != 0) { + sb.append(" "); } + sb.append("<").append(tagRainbow).append(">"); + sb.append((i % stopCount == 0) ? "Stop#" + String.valueOf(i / stopCount + 1) : "T"); + sb.append(""); } - return minIndex; + return sb.toString(); } @NotNull @@ -160,6 +159,7 @@ public class RainbowHighlighter { public TextAttributesKey[] getRainbowTempKeys() { TextAttributesKey[] keys = new TextAttributesKey[myRainbowColors.length]; for (int i = 0; i < myRainbowColors.length; ++i) { + //noinspection deprecation TextAttributesKey key = TextAttributesKey.createTextAttributesKey(RAINBOW_TEMP_PREF + i, new TextAttributes()); key.getDefaultAttributes().setForegroundColor(myRainbowColors[i]); keys[i] = key; @@ -193,10 +193,22 @@ public class RainbowHighlighter { .withForeground(calculateForeground(colorIndex)))); } + private static final TextAttributesKey[] RAINBOW_TEMP_KEYS = new RainbowHighlighter(null).getRainbowTempKeys(); + @NotNull public static TextAttributes createRainbowAttribute(@Nullable Color color) { TextAttributes ret = new TextAttributes(); ret.setForegroundColor(color); return ret; } + + public static Map createRainbowHLM() { + Map hashMap = new HashMap<>(); + hashMap.put(RAINBOW_ANCHOR.getExternalName(), RAINBOW_ANCHOR); + hashMap.put(RAINBOW_GRADIENT_DEMO.getExternalName(), RAINBOW_GRADIENT_DEMO); + for (TextAttributesKey key : RAINBOW_TEMP_KEYS) { + hashMap.put(key.getExternalName(), key); + } + return hashMap; + } } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java index 3fede742b423..44ff60534678 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/RainbowVisitor.java @@ -69,7 +69,7 @@ public abstract class RainbowVisitor implements HighlightVisitor { @NotNull final PsiElement rainbowElement, @NotNull final String name, @Nullable final TextAttributesKey colorKey) { - int colorIndex = UsedColors.getOrAddColorIndex((UserDataHolderEx)context, name, getHighlighter()); + int colorIndex = UsedColors.getOrAddColorIndex((UserDataHolderEx)context, name, getHighlighter().getColorsCount()); return getHighlighter().getInfo(colorIndex, rainbowElement, colorKey); } } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java index 18cb439691af..6157051844d0 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java @@ -15,15 +15,16 @@ */ package com.intellij.codeInsight.daemon; -import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolderEx; +import com.intellij.openapi.util.text.StringHash; import com.intellij.util.ArrayUtil; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.concurrent.atomic.AtomicInteger; -class UsedColors { +public class UsedColors { private static final Key USED_COLOR = Key.create("USED_COLOR"); public static final AtomicInteger counter = new AtomicInteger(); @@ -38,17 +39,16 @@ class UsedColors { } } - static int getOrAddColorIndex(@NotNull final UserDataHolderEx context, - @NotNull final String name, - @NotNull RainbowHighlighter rainbowHighlighter) { - int colorsCount = rainbowHighlighter.getColorsCount(); + public static int getOrAddColorIndex(@NotNull final UserDataHolderEx context, + @NotNull final String name, + int colorsCount) { Object data = context.getUserData(USED_COLOR); int colorIndex; while (true) { Object newColors; if (data == null) { - colorIndex = RainbowHighlighter.hashColor(name, colorsCount); + colorIndex = hashColor(name, colorsCount); newColors = new UsedColor(name, colorIndex); // put an object instead of array to save space } else if (data instanceof UsedColor) { @@ -58,7 +58,7 @@ class UsedColors { newColors = null; // found, no need to create new } else { - int hashedIndex = RainbowHighlighter.hashColor(name, colorsCount); + int hashedIndex = hashColor(name, colorsCount); if (hashedIndex == usedColor.index) hashedIndex = (hashedIndex + 1) % colorsCount; colorIndex = hashedIndex; UsedColor newColor = new UsedColor(name, colorIndex); @@ -67,7 +67,7 @@ class UsedColors { } else { colorIndex = -1; - int hashedIndex = RainbowHighlighter.hashColor(name, colorsCount); + int hashedIndex = hashColor(name, colorsCount); int[] index2usage = new int[colorsCount]; UsedColor[] usedColors = (UsedColor[])data; for (UsedColor usedColor : usedColors) { @@ -79,7 +79,9 @@ class UsedColors { } } if (colorIndex == -1) { - colorIndex = RainbowHighlighter.getColorIndex(index2usage, hashedIndex, colorsCount); + int minIndex1 = indexOfMin(index2usage, hashedIndex, colorsCount); + int minIndex2 = indexOfMin(index2usage, 0, hashedIndex); + colorIndex = index2usage[minIndex1] <= index2usage[minIndex2] ? minIndex1 : minIndex2; UsedColor newColor = new UsedColor(name, colorIndex); newColors = ArrayUtil.append(usedColors, newColor); } @@ -94,4 +96,22 @@ class UsedColors { return colorIndex; } + + private static int hashColor(@NotNull String name, int colorsCount) { + return Math.abs(StringHash.murmur(name, 0x55AA)) % colorsCount; + } + + @Contract(pure = true) + private static int indexOfMin(@NotNull int[] values, int start, int end) { + int min = Integer.MAX_VALUE; + int minIndex = start; + for (int i = start; i < end; i++) { + int value = values[i]; + if (value < min) { + min = value; + minIndex = i; + } + } + return minIndex; + } } diff --git a/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java b/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java index 02986235d801..29f2bdb397c9 100644 --- a/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java +++ b/platform/lang-api/src/com/intellij/openapi/options/colors/RainbowColorSettingsPage.java @@ -17,15 +17,11 @@ package com.intellij.openapi.options.colors; import com.intellij.lang.Language; import com.intellij.openapi.editor.colors.TextAttributesKey; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface RainbowColorSettingsPage extends ColorSettingsPage { boolean isRainbowType(TextAttributesKey type); - @NotNull - String getRainbowDemoText(); - @Nullable Language getLanguage(); } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java b/platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java deleted file mode 100644 index 4025e031f1c5..000000000000 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ClickNavigator.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2000-2016 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.colors; - -import com.intellij.application.options.colors.highlighting.HighlightData; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.HighlighterColors; -import com.intellij.openapi.editor.LogicalPosition; -import com.intellij.openapi.editor.colors.TextAttributesKey; -import com.intellij.openapi.editor.event.CaretAdapter; -import com.intellij.openapi.editor.event.CaretEvent; -import com.intellij.openapi.editor.event.CaretListener; -import com.intellij.openapi.editor.ex.EditorEx; -import com.intellij.openapi.editor.ex.util.EditorUtil; -import com.intellij.openapi.editor.highlighter.HighlighterIterator; -import com.intellij.openapi.fileTypes.SyntaxHighlighter; -import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; -import com.intellij.psi.tree.IElementType; -import com.intellij.ui.ScrollingUtil; -import com.intellij.util.ui.UIUtil; -import org.intellij.lang.annotations.JdkConstants; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; - -public class ClickNavigator { - private final JList myOptionsList; - - public ClickNavigator(JList optionsList) { - myOptionsList = optionsList; - } - - public void addClickNavigatorToGeneralView(final Editor view) { - view.getContentComponent().addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent e) { - EditorUtil.setHandCursor(view); - } - }); - - CaretListener listener = new CaretAdapter() { - @Override - public void caretPositionChanged(CaretEvent e) { - setSelectedItem(HighlighterColors.TEXT.getExternalName(), true); - } - }; - view.getCaretModel().addCaretListener(listener); - } - - private boolean setSelectedItem(String type, boolean select) { - DefaultListModel model = (DefaultListModel)myOptionsList.getModel(); - - for (int i = 0; i < model.size(); i++) { - Object o = model.get(i); - if (o instanceof EditorSchemeAttributeDescriptor) { - if (type.equals(((EditorSchemeAttributeDescriptor)o).getType())) { - if (select) { - ScrollingUtil.selectItem(myOptionsList, i); - } - return true; - } - } - } - return false; - } - - private static boolean isWhiteSpace(int offset, CharSequence text) { - return offset <= 0 || offset >= text.length() || - text.charAt(offset) == ' ' || text.charAt(offset) == '\t' || - text.charAt(offset) == '\n' || text.charAt(offset) == '\r'; - } - - public static boolean highlightDataContainsOffset(HighlightData data, int offset) { - return offset >= data.getStartOffset() && offset <= data.getEndOffset(); - } - - public void addClickNavigator(final Editor view, - final SyntaxHighlighter highlighter, - final HighlightData[] data, - final boolean isBackgroundImportant) { - addMouseMotionListener(view, highlighter, data, isBackgroundImportant); - - CaretListener listener = new CaretAdapter() { - @Override - public void caretPositionChanged(CaretEvent e) { - navigate(view, true, e.getNewPosition(), highlighter, data, isBackgroundImportant); - } - }; - view.getCaretModel().addCaretListener(listener); - } - - private boolean selectItem(boolean select, HighlighterIterator itr, SyntaxHighlighter highlighter) { - - IElementType tokenType = itr.getTokenType(); - if (tokenType == null) return false; - String type = highlightingTypeFromTokenType(tokenType, highlighter); - return setSelectedItem(type, select); - } - - public static String highlightingTypeFromTokenType(IElementType tokenType, SyntaxHighlighter highlighter) { - TextAttributesKey[] highlights = highlighter.getTokenHighlights(tokenType); - String s = null; - for (int i = highlights.length - 1; i >= 0; i--) { - if (highlights[i] != HighlighterColors.TEXT) { - s = highlights[i].getExternalName(); - break; - } - } - return s == null ? HighlighterColors.TEXT.getExternalName() : s; - } - - private void addMouseMotionListener(final Editor view, - final SyntaxHighlighter highlighter, - final HighlightData[] data, final boolean isBackgroundImportant) { - view.getContentComponent().addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent e) { - LogicalPosition pos = view.xyToLogicalPosition(new Point(e.getX(), e.getY())); - navigate(view, false, pos, highlighter, data, isBackgroundImportant); - } - }); - } - - private void navigate(final Editor editor, boolean select, - LogicalPosition pos, - final SyntaxHighlighter highlighter, - final HighlightData[] data, final boolean isBackgroundImportant) { - int offset = editor.logicalPositionToOffset(pos); - - if (!isBackgroundImportant && editor.offsetToLogicalPosition(offset).column != pos.column) { - if (!select) { - setCursor(editor, Cursor.TEXT_CURSOR); - return; - } - } - - if (data != null) { - for (HighlightData highlightData : data) { - if (highlightDataContainsOffset(highlightData, editor.logicalPositionToOffset(pos))) { - if (!select) setCursor(editor, Cursor.HAND_CURSOR); - setSelectedItem(highlightData.getHighlightType(), select); - return; - } - } - } - - if (highlighter != null) { - HighlighterIterator itr = ((EditorEx)editor).getHighlighter().createIterator(offset); - boolean selection = selectItem(select, itr, highlighter); - if (!select && selection) { - setCursor(editor, Cursor.HAND_CURSOR); - } - else { - setCursor(editor, Cursor.TEXT_CURSOR); - } - } - } - - public static void setCursor(final Editor view, @JdkConstants.CursorType int type) { - final Cursor cursor = type == Cursor.TEXT_CURSOR && view instanceof EditorEx ? - UIUtil.getTextCursor(((EditorEx)view).getBackgroundColor()) : Cursor.getPredefinedCursor(type); - view.getContentComponent().setCursor(cursor); - } - -} diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java index d4c5619600b0..0f18dfbfe188 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/CustomizedSwitcherPanel.java @@ -15,26 +15,17 @@ */ package com.intellij.application.options.colors; -import com.intellij.application.options.colors.highlighting.HighlightData; -import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; -import com.intellij.openapi.editor.colors.TextAttributesKey; -import com.intellij.openapi.editor.ex.DocumentEx; -import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.options.colors.ColorSettingsPage; import com.intellij.openapi.options.colors.RainbowColorSettingsPage; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.TextRange; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -import java.util.*; -import java.util.List; class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDescriptionPanel { private ColorSettingsPage myPage; @@ -120,37 +111,6 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe return null; } - private void addRainbowHighlighting(@NotNull DocumentEx document, - @Nullable List showLineData, - @NotNull List data, - @NotNull TextAttributesKey[] rainbowTempKeys) { - int colorCount = rainbowTempKeys.length; - if (colorCount != 0) { - List newData = new ArrayList<>(); - if (showLineData != null) newData.addAll(showLineData); - - int[] index2usage = new int[colorCount]; - for (HighlightData d : data) { - if (((RainbowColorSettingsPage)myPage).isRainbowType(d.getHighlightKey())) { - String id = document.getText(TextRange.create(d.getStartOffset(), d.getEndOffset())); - - int index = RainbowHighlighter.getColorIndex(index2usage, RainbowHighlighter.hashColor(id, colorCount), colorCount); - ++index2usage[index]; - HighlightData rainbow = new HighlightData(d.getStartOffset(), d.getEndOffset(), rainbowTempKeys[index]); - - //fixme: twisted coloring in editor. We need add rainbow-tag twice. - newData.add(rainbow); - newData.add(d); - newData.add(rainbow); - } - else { - newData.add(d); - } - } - data.clear(); - data.addAll(newData); - } - } @Override public void apply(@NotNull EditorSchemeAttributeDescriptor descriptor, EditorColorsScheme scheme) { @@ -161,73 +121,14 @@ class CustomizedSwitcherPanel extends JPanel implements OptionsPanelImpl.ColorDe } protected void updatePreviewPanel(@NotNull EditorSchemeAttributeDescriptor descriptor) { - if (!(myPreviewPanel instanceof SimpleEditorPreview)) return; + if (!(myPreviewPanel instanceof SimpleEditorPreview && myPage instanceof RainbowColorSettingsPage)) return; UIUtil.invokeAndWaitIfNeeded((Runnable)() -> ApplicationManager.getApplication().runWriteAction(() -> { SimpleEditorPreview simpleEditorPreview = (SimpleEditorPreview)myPreviewPanel; - try { - simpleEditorPreview.setNavigationBlocked(true); - String demoText = (myPage instanceof RainbowColorSettingsPage - && descriptor instanceof RainbowAttributeDescriptor) - ? ((RainbowColorSettingsPage)myPage).getRainbowDemoText() - : myPage.getDemoText(); - List showLineData = null; - - if (myPage instanceof RainbowColorSettingsPage - && RainbowHighlighter.isRainbowEnabledWithInheritance(descriptor.getScheme(), - ((RainbowColorSettingsPage)myPage).getLanguage())) { - RainbowHighlighter highlighter = new RainbowHighlighter(descriptor.getScheme()); - TextAttributesKey[] tempKeys = highlighter.getRainbowTempKeys(); - EditorEx editor = simpleEditorPreview.getEditor(); - if (myActive == myRainbowPanel) { - Pair> demo = getColorDemoLine(highlighter, tempKeys); - simpleEditorPreview.setDemoText(demo.first + "\n" + demoText); - showLineData = demo.second; - } - else { - simpleEditorPreview.setDemoText(demoText); - } - addRainbowHighlighting(editor.getDocument(), - showLineData, - simpleEditorPreview.getHighlightDataForExtension(), - tempKeys); - } - else { - simpleEditorPreview.setDemoText(demoText); - } - - simpleEditorPreview.updateView(); - if (descriptor instanceof RainbowAttributeDescriptor) { - simpleEditorPreview.scrollHighlightInView(showLineData); - } - } - finally { - simpleEditorPreview.setNavigationBlocked(false); - } + simpleEditorPreview.setupRainbow(descriptor.getScheme(), (RainbowColorSettingsPage)myPage); + simpleEditorPreview.updateView(); })); } - @NotNull - private static Pair> getColorDemoLine(RainbowHighlighter highlighter, TextAttributesKey[] tempKeys) { - int colorsCount = highlighter.getColorsCount(); - int stopCount = RainbowHighlighter.RAINBOW_COLOR_KEYS.length; - List markup = new ArrayList<>(colorsCount); - StringBuilder sb = new StringBuilder(); - int pos = 0; - int i = 0; - for (TextAttributesKey key : tempKeys) { - String toAdd = (i % stopCount == 0) ? "Stop#" + String.valueOf(i / stopCount + 1) : "T"; - int end = pos + toAdd.length(); - markup.add(new HighlightData(pos, end, key)); - if (sb.length() != 0) { - sb.append(" "); - } - sb.append(toAdd); - pos = end + 1; - ++i; - } - return Pair.create(sb.toString(), markup); - } - @Override public void addListener(@NotNull Listener listener) { myRainbowPanel.addListener(listener); diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java index f6f467c5ea4a..7e84e0f37b04 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/NewColorAndFontPanel.java @@ -148,13 +148,7 @@ public class NewColorAndFontPanel extends JPanel { if (myOptionList == null) { return myOptionsPanel.processListOptions(); } - else { - final HashSet result = new HashSet<>(); - for (String s : myOptionList) { - result.add(s); - } - return result; - } + return new HashSet<>(myOptionList); } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java index 4347eb11b54b..4c36dcd3c73d 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/RainbowDescriptionPanel.java @@ -142,6 +142,7 @@ public class RainbowDescriptionPanel extends JPanel implements OptionsPanelImpl. for (int i = 0; i < myLStops.length; ++i) { myLStops[i].setEnabled(isEnable && isDefaultLanguage); + myStops[i].setEnabled(rainbowOn); myStops[i].setEditable(isEnable && isDefaultLanguage); myStops[i].setSelectedColor(editedColorsScheme.getAttributes(RainbowHighlighter.RAINBOW_COLOR_KEYS[i]).getForegroundColor()); } diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java index 5ee4253663c4..401c9eb751c9 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/SimpleEditorPreview.java @@ -19,11 +19,9 @@ package com.intellij.application.options.colors; import com.intellij.application.options.colors.highlighting.HighlightData; import com.intellij.application.options.colors.highlighting.HighlightsExtractor; import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.codeInsight.daemon.UsedColors; import com.intellij.ide.highlighter.HighlighterFactory; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.editor.LogicalPosition; -import com.intellij.openapi.editor.ScrollType; +import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor; @@ -33,13 +31,17 @@ import com.intellij.openapi.editor.event.CaretEvent; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.highlighter.HighlighterIterator; +import com.intellij.openapi.editor.impl.EditorImpl; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.options.colors.ColorSettingsPage; import com.intellij.openapi.options.colors.EditorHighlightingProvidingColorSettingsPage; +import com.intellij.openapi.options.colors.RainbowColorSettingsPage; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.tree.IElementType; import com.intellij.util.Alarm; import com.intellij.util.EventDispatcher; import com.intellij.util.ui.UIUtil; +import org.intellij.lang.annotations.JdkConstants; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,20 +66,10 @@ public class SimpleEditorPreview implements PreviewPanel { private final EventDispatcher myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class); private final HighlightsExtractor myHighlightsExtractor; - public void setNavigationBlocked(boolean isNavigationBlocked) { - myIsNavigationBlocked = isNavigationBlocked; - } - private boolean myIsNavigationBlocked = false; - public SimpleEditorPreview(final ColorAndFontOptions options, final ColorSettingsPage page) { this(options, page, true); } - @NotNull - public List getHighlightDataForExtension() { - return myHighlightData; - } - public SimpleEditorPreview(final ColorAndFontOptions options, final ColorSettingsPage page, final boolean navigatable) { myOptions = options; myPage = page; @@ -93,17 +85,14 @@ public class SimpleEditorPreview implements PreviewPanel { myEditor.getContentComponent().addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { - LogicalPosition pos = myEditor.xyToLogicalPosition(new Point(e.getX(), e.getY())); - navigate(myEditor, false, pos, page.getHighlighter(), false); + navigate(false, myEditor.xyToLogicalPosition(new Point(e.getX(), e.getY()))); } }); myEditor.getCaretModel().addCaretListener(new CaretAdapter() { @Override public void caretPositionChanged(CaretEvent e) { - if (!myIsNavigationBlocked) { - navigate(myEditor, true, e.getNewPosition(), page.getHighlighter(), false); - } + navigate(true, e.getNewPosition()); } }); } @@ -119,48 +108,54 @@ public class SimpleEditorPreview implements PreviewPanel { myEditor.getDocument().setText(myHighlightsExtractor.extractHighlights(text, myHighlightData)); } - private void navigate(final Editor editor, boolean select, - LogicalPosition pos, - final SyntaxHighlighter highlighter, - final boolean isBackgroundImportant) { - int offset = editor.logicalPositionToOffset(pos); + private void navigate(boolean select, @NotNull final LogicalPosition pos) { + int offset = myEditor.logicalPositionToOffset(pos); + final SyntaxHighlighter highlighter = myPage.getHighlighter(); - if (!isBackgroundImportant && editor.offsetToLogicalPosition(offset).column != pos.column) { - if (!select) { - ClickNavigator.setCursor(editor, Cursor.TEXT_CURSOR); - return; - } + String type = null; + HighlightData highlightData = getDataFromOffset(offset); + if (highlightData != null) { + // tag-based navigation first + type = RainbowHighlighter.isRainbowTempKey(highlightData.getHighlightKey()) + ? RainbowHighlighter.RAINBOW_TYPE + : highlightData.getHighlightType(); + } + else { + // if failed, try the highlighter-based navigation + type = selectItem(((EditorEx)myEditor).getHighlighter().createIterator(offset), highlighter); } - for (HighlightData highlightData : myHighlightData) { - if (ClickNavigator.highlightDataContainsOffset(highlightData, editor.logicalPositionToOffset(pos))) { - if (!select) { - ClickNavigator.setCursor(editor, Cursor.HAND_CURSOR); - } - else { - myDispatcher.getMulticaster().selectionInPreviewChanged( - RainbowHighlighter.isRainbowTempKey(highlightData.getHighlightKey()) - ? RainbowHighlighter.RAINBOW_TYPE - : highlightData.getHighlightType()); - } - return; - } - } + setCursor(type == null ? Cursor.TEXT_CURSOR : Cursor.HAND_CURSOR); - if (highlighter != null) { - HighlighterIterator itr = ((EditorEx)editor).getHighlighter().createIterator(offset); - selectItem(itr, highlighter, select); - ClickNavigator.setCursor(editor, select ? Cursor.TEXT_CURSOR : Cursor.HAND_CURSOR); + if (select && type != null) { + myDispatcher.getMulticaster().selectionInPreviewChanged(type); } } - private void selectItem(HighlighterIterator itr, SyntaxHighlighter highlighter, final boolean select) { - IElementType tokenType = itr.getTokenType(); - if (tokenType == null) return; - String type = ClickNavigator.highlightingTypeFromTokenType(tokenType, highlighter); - if (select) { - myDispatcher.getMulticaster().selectionInPreviewChanged(type); + @Nullable + private HighlightData getDataFromOffset(int offset) { + for (HighlightData highlightData : myHighlightData) { + if (offset >= highlightData.getStartOffset() && offset <= highlightData.getEndOffset()) { + return highlightData; + } } + return null; + } + + @Nullable + private static String selectItem(HighlighterIterator itr, SyntaxHighlighter highlighter) { + IElementType tokenType = itr.getTokenType(); + if (tokenType == null) return null; + + TextAttributesKey[] highlights = highlighter.getTokenHighlights(tokenType); + String s = null; + for (int i = highlights.length - 1; i >= 0; i--) { + if (highlights[i] != HighlighterColors.TEXT) { + s = highlights[i].getExternalName(); + break; + } + } + return s == null ? HighlighterColors.TEXT.getExternalName() : s; } @Override @@ -322,4 +317,83 @@ public class SimpleEditorPreview implements PreviewPanel { editorFactory.releaseEditor(myEditor); stopBlinking(); } + + private void setCursor(@JdkConstants.CursorType int type) { + final Cursor cursor = type == Cursor.TEXT_CURSOR ? UIUtil.getTextCursor(myEditor.getBackgroundColor()) + : Cursor.getPredefinedCursor(type); + myEditor.getContentComponent().setCursor(cursor); + } + + public void setupRainbow(@NotNull EditorColorsScheme colorsScheme, @NotNull RainbowColorSettingsPage page) { + final List initialMarkup = new ArrayList<>(); + myHighlightsExtractor.extractHighlights(page.getDemoText(), initialMarkup); + + final List rainbowMarkup = setupRainbowHighlighting( + page, + initialMarkup, + new RainbowHighlighter(colorsScheme).getRainbowTempKeys(), + RainbowHighlighter.isRainbowEnabledWithInheritance(colorsScheme, page.getLanguage())); + + myHighlightData.clear(); + myHighlightData.addAll(rainbowMarkup); + } + + @NotNull + private List setupRainbowHighlighting(@NotNull final RainbowColorSettingsPage page, + @NotNull final List initialMarkup, + @NotNull final TextAttributesKey[] rainbowTempKeys, + boolean isRainbowOn) { + int colorCount = rainbowTempKeys.length; + if (colorCount == 0) { + return initialMarkup; + } + List rainbowMarkup = new ArrayList<>(); + + int tempKeyIndex = 0; + for (HighlightData d : initialMarkup) { + final TextAttributesKey highlightKey = d.getHighlightKey(); + final boolean rainbowType = page.isRainbowType(highlightKey); + final boolean rainbowDemoType = highlightKey == RainbowHighlighter.RAINBOW_GRADIENT_DEMO; + if (rainbowType || rainbowDemoType) { + final HighlightData rainbowAnchor = new HighlightData(d.getStartOffset(), d.getEndOffset(), RainbowHighlighter.RAINBOW_ANCHOR); + if (isRainbowOn) { + // rainbow on + HighlightData rainbowTemp; + if (rainbowType) { + rainbowTemp = getRainbowTemp(rainbowTempKeys, d.getStartOffset(), d.getEndOffset()); + } + else { + rainbowTemp = new HighlightData(d.getStartOffset(), d.getEndOffset(), rainbowTempKeys[tempKeyIndex++ % colorCount]); + } + rainbowMarkup.add(rainbowTemp); + rainbowMarkup.add(rainbowAnchor); + rainbowMarkup.add(rainbowTemp); + } + else { + // rainbow off + if (rainbowType) { + rainbowMarkup.add(d); + rainbowMarkup.add(rainbowAnchor); + rainbowMarkup.add(d); + } + else { + rainbowMarkup.add(rainbowAnchor); + } + } + } + else if (!(RainbowHighlighter.isRainbowTempKey(highlightKey) || highlightKey == RainbowHighlighter.RAINBOW_ANCHOR)) { + // filter rainbow RAINBOW_TEMP and RAINBOW_ANCHOR + rainbowMarkup.add(d); + } + } + return rainbowMarkup; + } + + @NotNull + private HighlightData getRainbowTemp(@NotNull TextAttributesKey[] rainbowTempKeys, + int startOffset, int endOffset) { + String id = myEditor.getDocument().getText(TextRange.create(startOffset, endOffset)); + int index = UsedColors.getOrAddColorIndex((EditorImpl)myEditor, id, rainbowTempKeys.length); + return new HighlightData(startOffset, endOffset, rainbowTempKeys[index]); + } } diff --git a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java index f655dcfc1bb7..2f783d7732dc 100644 --- a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java +++ b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/DefaultLanguageColorsPage.java @@ -15,7 +15,9 @@ */ package com.intellij.openapi.options.colors.pages; +import com.intellij.codeHighlighting.RainbowHighlighter; import com.intellij.lang.Language; +import com.intellij.openapi.application.ApplicationBundle; import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; import com.intellij.openapi.editor.HighlighterColors; import com.intellij.openapi.editor.colors.TextAttributesKey; @@ -25,7 +27,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.options.colors.AttributesDescriptor; import com.intellij.openapi.options.colors.ColorDescriptor; -import com.intellij.openapi.options.colors.ColorSettingsPage; import com.intellij.openapi.options.colors.RainbowColorSettingsPage; import com.intellij.psi.codeStyle.DisplayPriority; import com.intellij.psi.codeStyle.DisplayPrioritySortable; @@ -34,7 +35,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.HashMap; import java.util.Map; /** @@ -43,8 +43,7 @@ import java.util.Map; * @author Rustam Vishnyakov */ public class DefaultLanguageColorsPage implements RainbowColorSettingsPage, DisplayPrioritySortable { - - @NonNls private static final Map TAG_HIGHLIGHTING_MAP = new HashMap<>(); + @NonNls private static final Map TAG_HIGHLIGHTING_MAP = RainbowHighlighter.createRainbowHLM(); private final static TextAttributesKey FAKE_BAD_CHAR = TextAttributesKey.createTextAttributesKey("FAKE_BAD_CHAR", HighlighterColors.BAD_CHARACTER); @@ -205,17 +204,22 @@ public class DefaultLanguageColorsPage implements RainbowColorSettingsPage, Disp "[ Brackets ]\n" + "// Line comment\n" + "/* Block comment */\n" + - "/** \n" + - " * Doc comment\n" + - " * @tag Markup\n" + - " * @param param_name documentation\n" + - " */\n" + "\n" + "predefined_symbol()\n" + "CONSTANT\n" + "Global variable\n" + - "Function declaration (parameter)\n" + - " Local variable\n" + + "/** \n" + + " * Doc comment\n" + + " * @tag Markup\n" + + " * " + ApplicationBundle.message("rainbow.option.panel.display.name") + ":\n" + + " * " + RainbowHighlighter.generatePaletteExample() + "\n" + + " * @param parameter1 documentation\n" + + " * @param parameter2 documentation\n" + + " * @param parameter3 documentation\n" + + " * @param parameter4 documentation\n" + + " */\n" + + "Function declaration (parameter1 parameter2 parameter3 parameter4)\n" + + " Local variable1 variable2 variable3 variable4\n" + "Function call()\n" + "Interface Name\n" + "@Metadata\n" + @@ -266,34 +270,6 @@ public class DefaultLanguageColorsPage implements RainbowColorSettingsPage, Disp || DefaultLanguageHighlighterColors.DOC_COMMENT_TAG_VALUE.equals(type); } - @NotNull - @Override - public String getRainbowDemoText() { - return - "Global variable1\n" + - "Global variable2\n" + - "/** \n" + - " * Doc comment\n" + - " * @tag Markup\n" + - " * @param parameter1 documentation\n" + - " * @param parameter2 documentation\n" + - " * @param parameter3 documentation\n" + - " * @param parameter4 documentation\n" + - " * @param parameter5 documentation\n" + - " */\n" + - "Function declaration (parameter1\n" + - " parameter2\n" + - " parameter3\n" + - " parameter4\n" + - " parameter5)\n" + - " Local variable1\n" + - " Local variable2\n" + - " Local variable3\n" + - " Local variable4\n" + - " Local variable5\n" + - "Function call()"; - } - @Nullable @Override public Language getLanguage() { From 33700bc8615ad24ce0d6b9be31ce355065f92d17 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Thu, 1 Sep 2016 20:51:58 +0300 Subject: [PATCH 16/17] IDEA-158861 resolve merge conflicts #2 --- .../src/com/intellij/codeInsight/daemon/UsedColors.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java index 19e8e77af381..a8a708d4c6b4 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java @@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull; import java.util.concurrent.atomic.AtomicInteger; -class UsedColors { +public class UsedColors { private static final Key USED_COLOR = Key.create("USED_COLOR"); public static final AtomicInteger counter = new AtomicInteger(); From 8fcaee62dcec1b53a87ac120cec2d0ff62ef8424 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Fri, 2 Sep 2016 11:46:53 +0300 Subject: [PATCH 17/17] IDEA-158861 make tests green --- .../fixtures/impl/CodeInsightTestFixtureImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index b24c40004be3..acd2aa193454 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -67,6 +67,8 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.actionSystem.DocCommandGroupId; import com.intellij.openapi.editor.actionSystem.EditorActionManager; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.editor.impl.DocumentImpl; @@ -1738,10 +1740,10 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig @Override public void testRainbow(@NotNull String fileName, @NotNull String text, boolean isRainbowOn, boolean withColor) { - RegistryValue registryValue = Registry.get("editor.rainbow.identifiers"); - final boolean rainbowColors = registryValue.asBoolean(); + final EditorColorsScheme globalScheme = EditorColorsManager.getInstance().getGlobalScheme(); + final boolean isRainbowOnInScheme = RainbowHighlighter.isRainbowEnabled(globalScheme, null); try { - registryValue.setValue(isRainbowOn); + RainbowHighlighter.setRainbowEnabled(globalScheme, null, isRainbowOn); configureByText(fileName, text.replaceAll("<" + RAINBOW + "(\\scolor=\'[^\']*\')?>", "").replace("", "")); Assert.assertEquals(text, getHighlightingDescription(ContainerUtil.filter(doHighlighting(), @@ -1749,7 +1751,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig withColor)); } finally { - registryValue.setValue(rainbowColors); + RainbowHighlighter.setRainbowEnabled(globalScheme, null, isRainbowOnInScheme); } }