diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/options/ex')
5 files changed, 132 insertions, 27 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java index 5f8dc0e890df..3b67a3478368 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java @@ -165,10 +165,6 @@ public class ConfigurableWrapper implements SearchableConfigurable { return myEp; } - public String getGroupId() { - return myEp.groupId; - } - public String getParentId() { return myEp.parentId; } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java index 96cc9e451185..c80a222ffd96 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -17,7 +17,10 @@ package com.intellij.openapi.options.ex; import com.intellij.ide.ui.search.SearchUtil; +import com.intellij.openapi.ui.GraphicsConfig; +import com.intellij.ui.ColorUtil; import com.intellij.ui.components.JBTabbedPane; +import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; @@ -27,6 +30,7 @@ import java.awt.geom.Area; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.Kernel; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -64,17 +68,19 @@ public class GlassPanel extends JComponent { final Point leftPoint = SwingUtilities.convertPoint(myPanel, new Point(visibleRect.x, visibleRect.y), surfaceComponent); Area innerPanel = new Area(new Rectangle2D.Double(leftPoint.x, leftPoint.y, visibleRect.width, visibleRect.height)); Area mask = new Area(screen); - + ArrayList<JComponent> components = new ArrayList<JComponent>(); for (JComponent lightComponent : myLightComponents) { - final Area area = getComponentArea(surfaceComponent, lightComponent); + final Area area = getComponentArea(surfaceComponent, lightComponent, 1); if (area == null) continue; + components.add(lightComponent); if (lightComponent instanceof JLabel) { final JLabel label = (JLabel)lightComponent; final Component labelFor = label.getLabelFor(); if (labelFor instanceof JComponent) { - final Area labelForArea = getComponentArea(surfaceComponent, (JComponent)labelFor); + final Area labelForArea = getComponentArea(surfaceComponent, (JComponent)labelFor, 1); if (labelForArea != null) { + components.add((JComponent)labelFor); area.add(labelForArea); } } @@ -86,19 +92,32 @@ public class GlassPanel extends JComponent { Graphics2D g2 = (Graphics2D)g; - Color shieldColor = new Color(0.0f, 0.0f, 0.0f, 0.15f); + Color shieldColor = new Color(0.0f, 0.0f, 0.0f, 0.20f); Color boundsColor = Color.gray; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(shieldColor); g2.fill(mask); - g2.setColor(boundsColor); - g2.draw(mask); + g2.setColor(ColorUtil.toAlpha(Color.orange, 25)); + GraphicsConfig config = GraphicsUtil.setupAAPainting(g2); + for (int i = 2; i > 0; i--) { + g2.setStroke(new BasicStroke(i)); + Area arrr = new Area(); + for (JComponent component : components) { + Area area = getComponentArea(surfaceComponent, component, i-1); + if (area != null) { + arrr.add(area); + } + } + g2.draw(arrr); + } + + config.restore(); } } @Nullable - private Area getComponentArea(final JComponent surfaceComponent, final JComponent lightComponent) { + private Area getComponentArea(final JComponent surfaceComponent, final JComponent lightComponent, int offset) { if (!lightComponent.isShowing()) return null; final Point panelPoint = SwingUtilities.convertPoint(lightComponent, new Point(0, 0), surfaceComponent); @@ -115,12 +134,17 @@ public class GlassPanel extends JComponent { int hInset = isWithBorder ? 7 : isLabelFromTabbedPane ? 20 : 7; int vInset = isWithBorder ? 1 : isLabelFromTabbedPane ? 10 : 5; - final Area area = new Area(new RoundRectangle2D.Double(x - hInset + insetsToIgnore.left, - y - vInset + insetsToIgnore.top, - lightComponent.getWidth() + hInset * 2 - insetsToIgnore.right - insetsToIgnore.left, - lightComponent.getHeight() + vInset * 2 - insetsToIgnore.top - insetsToIgnore.bottom, - 6, 6)); - return area; + hInset += offset; + vInset += offset; + int xCoord = x - hInset + insetsToIgnore.left; + int yCoord = y - vInset + insetsToIgnore.top; + int width = lightComponent.getWidth() + hInset * 2 - insetsToIgnore.right - insetsToIgnore.left; + int height = lightComponent.getHeight() + vInset * 2 - insetsToIgnore.top - insetsToIgnore.bottom; + return new Area(new RoundRectangle2D.Double(xCoord, + yCoord, + width, + height, + Math.min(height, 30), Math.min(height, 30))); } protected static Kernel getBlurKernel(int blurSize) { diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java index f1411cf3551d..e3404ec017cd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java @@ -17,15 +17,21 @@ package com.intellij.openapi.options.ex; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableGroup; +import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; +import javax.swing.JComponent; -public final class MixedConfigurableGroup implements ConfigurableGroup { +public final class MixedConfigurableGroup implements SearchableConfigurable, ConfigurableGroup { private final String myGroupId; private Configurable[] myConfigurables; @@ -34,6 +40,7 @@ public final class MixedConfigurableGroup implements ConfigurableGroup { myConfigurables = (configurables != null) ? configurables.toArray(new Configurable[configurables.size()]) : new Configurable[0]; + Arrays.sort(myConfigurables, COMPARATOR); } private MixedConfigurableGroup(String groupId, HashMap<String, ArrayList<Configurable>> configurables) { @@ -41,6 +48,45 @@ public final class MixedConfigurableGroup implements ConfigurableGroup { } @Override + public JComponent createComponent() { + return null; + } + + @Override + public boolean isModified() { + return false; + } + + @Override + public void apply() throws ConfigurationException { + } + + @Override + public void reset() { + } + + @Override + public void disposeUIResources() { + myConfigurables = null; + } + + @Override + public Runnable enableSearch(String option) { + return null; + } + + @NotNull + @Override + public String getId() { + return "configurable.group." + myGroupId; + } + + @Override + public String getHelpTopic() { + return "configurable.group." + myGroupId + ".help.topic"; + } + + @Override public String getDisplayName() { return OptionsBundle.message("configurable.group." + myGroupId + ".settings.display.name"); } @@ -60,7 +106,7 @@ public final class MixedConfigurableGroup implements ConfigurableGroup { for (Configurable configurable : configurables) { String groupId = null; if (configurable instanceof ConfigurableWrapper) { - groupId = ((ConfigurableWrapper)configurable).getGroupId(); + groupId = ((ConfigurableWrapper)configurable).getExtensionPoint().groupId; } ArrayList<Configurable> list = map.get(groupId); if (list == null) { @@ -70,7 +116,7 @@ public final class MixedConfigurableGroup implements ConfigurableGroup { } ArrayList<Configurable> buildList = map.get("build"); if (buildList != null) { - NodeConfigurable buildTools = new NodeConfigurable("build.tools"); + NodeConfigurable buildTools = new NodeConfigurable("build.tools", 1000); buildTools.add(find("MavenSettings", buildList.iterator())); buildTools.add(find("reference.settingsdialog.project.gradle", buildList.iterator())); buildTools.add(find("reference.settingsdialog.project.gant", buildList.iterator())); @@ -106,4 +152,27 @@ public final class MixedConfigurableGroup implements ConfigurableGroup { } return null; } + + public static int getGroupWeight(Configurable configurable) { + if (configurable instanceof NodeConfigurable) { + return ((NodeConfigurable)configurable).getGroupWeight(); + } + if (configurable instanceof ConfigurableWrapper) { + return ((ConfigurableWrapper)configurable).getExtensionPoint().groupWeight; + } + return 0; + } + + private static final Comparator<Configurable> COMPARATOR = new Comparator<Configurable>() { + @Override + public int compare(Configurable configurable1, Configurable configurable2) { + if (configurable1 == null || configurable2 == null) { + return configurable2 != null ? -1 : configurable1 != null ? 1 : 0; + } + int weight1 = getGroupWeight(configurable1); + int weight2 = getGroupWeight(configurable2); + return weight1 > weight2 ? -1 : weight1 < weight2 ? 1 : StringUtil.naturalCompare(configurable1.getDisplayName(), + configurable2.getDisplayName()); + } + }; } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/NodeConfigurable.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/NodeConfigurable.java index 6571c7a63746..609943d02943 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/NodeConfigurable.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/NodeConfigurable.java @@ -27,9 +27,15 @@ import java.util.ArrayList; public final class NodeConfigurable extends SearchableConfigurable.Parent.Abstract { private final ArrayList<Configurable> myConfigurables = new ArrayList<Configurable>(); private final String myId; + private final int myWeight; - public NodeConfigurable(@NotNull String id) { + public NodeConfigurable(@NotNull String id, int weight) { myId = id; + myWeight = weight; + } + + public int getGroupWeight() { + return myWeight; } public void add(Configurable configurable) { @@ -48,13 +54,13 @@ public final class NodeConfigurable extends SearchableConfigurable.Parent.Abstra @NotNull @Override public String getId() { - return myId; + return "node.configurable." + myId; } @Nullable @Override public String getHelpTopic() { - return myId; + return "node.configurable." + myId + ".help.topic"; } @Nls diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java index 80144d230eaf..def0dd16a2d2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/SingleConfigurableEditor.java @@ -46,7 +46,7 @@ public class SingleConfigurableEditor extends DialogWrapper { private Component myParentComponent; private Configurable myConfigurable; private JComponent myCenterPanel; - private String myDimensionKey; + private final String myDimensionKey; private final boolean myShowApplyButton; private boolean myChangesWereApplied; @@ -134,6 +134,7 @@ public class SingleConfigurableEditor extends DialogWrapper { return displayName.replaceAll("\n", " "); } + @Override protected String getDimensionServiceKey() { if (myDimensionKey == null) { return super.getDimensionServiceKey(); @@ -143,6 +144,7 @@ public class SingleConfigurableEditor extends DialogWrapper { } } + @Override @NotNull protected Action[] createActions() { List<Action> actions = new ArrayList<Action>(); @@ -157,6 +159,7 @@ public class SingleConfigurableEditor extends DialogWrapper { return actions.toArray(new Action[actions.size()]); } + @Override protected void doHelpAction() { HelpManager.getInstance().invokeHelp(myConfigurable.getHelpTopic()); } @@ -169,6 +172,7 @@ public class SingleConfigurableEditor extends DialogWrapper { super.doCancelAction(); } + @Override protected void doOKAction() { try { if (myConfigurable.isModified()) myConfigurable.apply(); @@ -201,10 +205,11 @@ public class SingleConfigurableEditor extends DialogWrapper { public ApplyAction() { super(CommonBundle.getApplyButtonText()); final Runnable updateRequest = new Runnable() { + @Override public void run() { - if (!SingleConfigurableEditor.this.isShowing()) return; + if (!isShowing()) return; try { - ApplyAction.this.setEnabled(myConfigurable != null && myConfigurable.isModified()); + setEnabled(myConfigurable != null && myConfigurable.isModified()); } catch (IndexNotReadyException ignored) { } @@ -214,6 +219,7 @@ public class SingleConfigurableEditor extends DialogWrapper { // invokeLater necessary to make sure dialog is already shown so we calculate modality state correctly. SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { addUpdateRequest(updateRequest); } @@ -224,6 +230,7 @@ public class SingleConfigurableEditor extends DialogWrapper { myUpdateAlarm.addRequest(updateRequest, 500, ModalityState.stateForComponent(getWindow())); } + @Override public void actionPerformed(ActionEvent event) { if (myPerformAction) return; try { @@ -248,11 +255,13 @@ public class SingleConfigurableEditor extends DialogWrapper { } } + @Override protected JComponent createCenterPanel() { myCenterPanel = myConfigurable.createComponent(); return myCenterPanel; } + @Override public JComponent getPreferredFocusedComponent() { if (myConfigurable instanceof BaseConfigurable) { JComponent preferred = ((BaseConfigurable)myConfigurable).getPreferredFocusedComponent(); @@ -261,6 +270,7 @@ public class SingleConfigurableEditor extends DialogWrapper { return IdeFocusTraversalPolicy.getPreferredFocusedComponent(myCenterPanel); } + @Override public void dispose() { super.dispose(); myConfigurable.disposeUIResources(); |