diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java index 040cf525f9f3..0bd885d59434 100644 --- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java +++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaRearranger.java @@ -351,10 +351,6 @@ public class JavaRearranger implements Rearranger, n.invite(this); } } - - @Override - public void visit(@NotNull ArrangementNameMatchCondition condition) { - } }); Object key = typeRef.get() == null ? NO_TYPE : typeRef.get(); Set modifiers = MODIFIERS_BY_TYPE.get(key); @@ -380,6 +376,11 @@ public class JavaRearranger implements Rearranger, return DEFAULT_SETTINGS; } + @Override + public boolean isNameFilterSupported() { + return true; + } + @Override public boolean isEnabled(@NotNull ArrangementGroupingType groupingType, @Nullable ArrangementEntryOrderType orderType) { Set orderTypes = GROUPING_RULES.get(groupingType); diff --git a/platform/icons/src/actions/back@2x.png b/platform/icons/src/actions/back@2x.png new file mode 100644 index 000000000000..f1ce7a479a7d Binary files /dev/null and b/platform/icons/src/actions/back@2x.png differ diff --git a/platform/icons/src/actions/checkOut@2x_dark.png b/platform/icons/src/actions/checkOut@2x_dark.png new file mode 100644 index 000000000000..1da64228bd68 Binary files /dev/null and b/platform/icons/src/actions/checkOut@2x_dark.png differ diff --git a/platform/icons/src/actions/commit@2x_dark.png b/platform/icons/src/actions/commit@2x_dark.png new file mode 100644 index 000000000000..9c7300640dd9 Binary files /dev/null and b/platform/icons/src/actions/commit@2x_dark.png differ diff --git a/platform/icons/src/actions/compile@2x_dark.png b/platform/icons/src/actions/compile@2x_dark.png new file mode 100644 index 000000000000..fd6d07c9a284 Binary files /dev/null and b/platform/icons/src/actions/compile@2x_dark.png differ diff --git a/platform/icons/src/actions/copy@2x_dark.png b/platform/icons/src/actions/copy@2x_dark.png new file mode 100644 index 000000000000..2ac22a9621f0 Binary files /dev/null and b/platform/icons/src/actions/copy@2x_dark.png differ diff --git a/platform/icons/src/actions/createFromUsage.png b/platform/icons/src/actions/createFromUsage.png index 57e38399ae47..6b091541d652 100644 Binary files a/platform/icons/src/actions/createFromUsage.png and b/platform/icons/src/actions/createFromUsage.png differ diff --git a/platform/icons/src/actions/delete.png b/platform/icons/src/actions/delete.png index d871c89418e4..721c469e6172 100644 Binary files a/platform/icons/src/actions/delete.png and b/platform/icons/src/actions/delete.png differ diff --git a/platform/icons/src/actions/find@2x.png b/platform/icons/src/actions/find@2x.png new file mode 100644 index 000000000000..c5d6a36aa95b Binary files /dev/null and b/platform/icons/src/actions/find@2x.png differ diff --git a/platform/icons/src/actions/forward@2x.png b/platform/icons/src/actions/forward@2x.png new file mode 100644 index 000000000000..c96c6f7643a2 Binary files /dev/null and b/platform/icons/src/actions/forward@2x.png differ diff --git a/platform/icons/src/actions/forward@2x_dark.png b/platform/icons/src/actions/forward@2x_dark.png new file mode 100644 index 000000000000..7fe1f8c21822 Binary files /dev/null and b/platform/icons/src/actions/forward@2x_dark.png differ diff --git a/platform/icons/src/actions/help@2x_dark.png b/platform/icons/src/actions/help@2x_dark.png new file mode 100644 index 000000000000..9235fb8916fb Binary files /dev/null and b/platform/icons/src/actions/help@2x_dark.png differ diff --git a/platform/icons/src/actions/install@2_dark.png b/platform/icons/src/actions/install@2_dark.png new file mode 100644 index 000000000000..3d17641315fa Binary files /dev/null and b/platform/icons/src/actions/install@2_dark.png differ diff --git a/platform/icons/src/actions/intentionBulb.png b/platform/icons/src/actions/intentionBulb.png index a3fc7abc1c2d..b6f9dd26eb92 100644 Binary files a/platform/icons/src/actions/intentionBulb.png and b/platform/icons/src/actions/intentionBulb.png differ diff --git a/platform/icons/src/actions/menu-cut@2x_dark.png b/platform/icons/src/actions/menu-cut@2x_dark.png new file mode 100644 index 000000000000..dc4a589f8424 Binary files /dev/null and b/platform/icons/src/actions/menu-cut@2x_dark.png differ diff --git a/platform/icons/src/actions/menu-find@2x_dark.png b/platform/icons/src/actions/menu-find@2x_dark.png new file mode 100644 index 000000000000..de19d8fdb4a2 Binary files /dev/null and b/platform/icons/src/actions/menu-find@2x_dark.png differ diff --git a/platform/icons/src/actions/menu-help@2x_dark.png b/platform/icons/src/actions/menu-help@2x_dark.png new file mode 100644 index 000000000000..9235fb8916fb Binary files /dev/null and b/platform/icons/src/actions/menu-help@2x_dark.png differ diff --git a/platform/icons/src/actions/menu-open@2x.png b/platform/icons/src/actions/menu-open@2x.png new file mode 100644 index 000000000000..39aed0a53144 Binary files /dev/null and b/platform/icons/src/actions/menu-open@2x.png differ diff --git a/platform/icons/src/actions/menu-paste@2x.png b/platform/icons/src/actions/menu-paste@2x.png new file mode 100644 index 000000000000..e676bdd40fbc Binary files /dev/null and b/platform/icons/src/actions/menu-paste@2x.png differ diff --git a/platform/icons/src/actions/menu-replace@2x_dark.png b/platform/icons/src/actions/menu-replace@2x_dark.png new file mode 100644 index 000000000000..ba40cd559b4e Binary files /dev/null and b/platform/icons/src/actions/menu-replace@2x_dark.png differ diff --git a/platform/icons/src/actions/menu-saveall@2x.png b/platform/icons/src/actions/menu-saveall@2x.png new file mode 100644 index 000000000000..35ace8f7e35c Binary files /dev/null and b/platform/icons/src/actions/menu-saveall@2x.png differ diff --git a/platform/icons/src/actions/preview@2x.png b/platform/icons/src/actions/preview@2x.png new file mode 100644 index 000000000000..b7f1bca6c1d3 Binary files /dev/null and b/platform/icons/src/actions/preview@2x.png differ diff --git a/platform/icons/src/actions/profileCPU@2x.png b/platform/icons/src/actions/profileCPU@2x.png new file mode 100644 index 000000000000..7eaf9bc78439 Binary files /dev/null and b/platform/icons/src/actions/profileCPU@2x.png differ diff --git a/platform/icons/src/actions/profileMemory@2x_dark.png b/platform/icons/src/actions/profileMemory@2x_dark.png new file mode 100644 index 000000000000..54d9177ac351 Binary files /dev/null and b/platform/icons/src/actions/profileMemory@2x_dark.png differ diff --git a/platform/icons/src/actions/quickfixBulb.png b/platform/icons/src/actions/quickfixBulb.png index b744bf48275f..7b71fd7f0765 100644 Binary files a/platform/icons/src/actions/quickfixBulb.png and b/platform/icons/src/actions/quickfixBulb.png differ diff --git a/platform/icons/src/actions/realIntentionOffBulb.png b/platform/icons/src/actions/realIntentionOffBulb.png index 9223e85c71e2..dfaf4b0c45e9 100644 Binary files a/platform/icons/src/actions/realIntentionOffBulb.png and b/platform/icons/src/actions/realIntentionOffBulb.png differ diff --git a/platform/icons/src/actions/redo@2x.png b/platform/icons/src/actions/redo@2x.png new file mode 100644 index 000000000000..72e3116afdf5 Binary files /dev/null and b/platform/icons/src/actions/redo@2x.png differ diff --git a/platform/icons/src/actions/replace@2x_dark.png b/platform/icons/src/actions/replace@2x_dark.png new file mode 100644 index 000000000000..ba40cd559b4e Binary files /dev/null and b/platform/icons/src/actions/replace@2x_dark.png differ diff --git a/platform/icons/src/actions/startDebugger@2x_dark.png b/platform/icons/src/actions/startDebugger@2x_dark.png new file mode 100644 index 000000000000..bd71e044237b Binary files /dev/null and b/platform/icons/src/actions/startDebugger@2x_dark.png differ diff --git a/platform/icons/src/actions/undo@2x.png b/platform/icons/src/actions/undo@2x.png new file mode 100644 index 000000000000..32b749e1a8bd Binary files /dev/null and b/platform/icons/src/actions/undo@2x.png differ diff --git a/platform/icons/src/actions/uninstall@2x.png b/platform/icons/src/actions/uninstall@2x.png new file mode 100644 index 000000000000..fb813ec87a7c Binary files /dev/null and b/platform/icons/src/actions/uninstall@2x.png differ diff --git a/platform/icons/src/debugger/actions/force_run_to_cursor.png b/platform/icons/src/debugger/actions/force_run_to_cursor.png index 625e14769325..065d3b7d0e75 100644 Binary files a/platform/icons/src/debugger/actions/force_run_to_cursor.png and b/platform/icons/src/debugger/actions/force_run_to_cursor.png differ diff --git a/platform/icons/src/debugger/actions/force_step_into.png b/platform/icons/src/debugger/actions/force_step_into.png index 36e6cafc60d0..94394f2a0a55 100644 Binary files a/platform/icons/src/debugger/actions/force_step_into.png and b/platform/icons/src/debugger/actions/force_step_into.png differ diff --git a/platform/icons/src/debugger/actions/force_step_over.png b/platform/icons/src/debugger/actions/force_step_over.png index a97f67f1ee0d..fe313305fdbe 100644 Binary files a/platform/icons/src/debugger/actions/force_step_over.png and b/platform/icons/src/debugger/actions/force_step_over.png differ diff --git a/platform/icons/src/debugger/addToWatch.png b/platform/icons/src/debugger/addToWatch.png index d5345637e0f7..8e828150daee 100644 Binary files a/platform/icons/src/debugger/addToWatch.png and b/platform/icons/src/debugger/addToWatch.png differ diff --git a/platform/icons/src/debugger/console.png b/platform/icons/src/debugger/console.png index 77b7cefd57ff..5912a27695ba 100644 Binary files a/platform/icons/src/debugger/console.png and b/platform/icons/src/debugger/console.png differ diff --git a/platform/icons/src/debugger/db_array.png b/platform/icons/src/debugger/db_array.png index e596f1b2697b..2ddb41b0ea56 100644 Binary files a/platform/icons/src/debugger/db_array.png and b/platform/icons/src/debugger/db_array.png differ diff --git a/platform/icons/src/debugger/db_muted_verified_breakpoint.png b/platform/icons/src/debugger/db_muted_verified_breakpoint.png index 0c2bc48e72f9..ddb3ffeca97e 100644 Binary files a/platform/icons/src/debugger/db_muted_verified_breakpoint.png and b/platform/icons/src/debugger/db_muted_verified_breakpoint.png differ diff --git a/platform/icons/src/debugger/db_verified_breakpoint.png b/platform/icons/src/debugger/db_verified_breakpoint.png index e5ea7510b5c2..6217375474d7 100644 Binary files a/platform/icons/src/debugger/db_verified_breakpoint.png and b/platform/icons/src/debugger/db_verified_breakpoint.png differ diff --git a/platform/icons/src/debugger/killProcess.png b/platform/icons/src/debugger/killProcess.png index 0749af03f1a0..68aceefd5881 100644 Binary files a/platform/icons/src/debugger/killProcess.png and b/platform/icons/src/debugger/killProcess.png differ diff --git a/platform/icons/src/debugger/newWatch.png b/platform/icons/src/debugger/newWatch.png index 938a3e1f977f..5461f3164786 100644 Binary files a/platform/icons/src/debugger/newWatch.png and b/platform/icons/src/debugger/newWatch.png differ diff --git a/platform/icons/src/debugger/showCurrentFrame.png b/platform/icons/src/debugger/showCurrentFrame.png index 9bf1f9ea7e41..be54ca72ca80 100644 Binary files a/platform/icons/src/debugger/showCurrentFrame.png and b/platform/icons/src/debugger/showCurrentFrame.png differ diff --git a/platform/icons/src/debugger/threadAtBreakpoint.png b/platform/icons/src/debugger/threadAtBreakpoint.png index 86c716293d1d..b3d6f616d55e 100644 Binary files a/platform/icons/src/debugger/threadAtBreakpoint.png and b/platform/icons/src/debugger/threadAtBreakpoint.png differ diff --git a/platform/icons/src/debugger/threadCurrent.png b/platform/icons/src/debugger/threadCurrent.png index 604e8eda7c14..05872a38fd00 100644 Binary files a/platform/icons/src/debugger/threadCurrent.png and b/platform/icons/src/debugger/threadCurrent.png differ diff --git a/platform/icons/src/debugger/threadFrozen.png b/platform/icons/src/debugger/threadFrozen.png index 20f0fe674dee..780426971c3a 100644 Binary files a/platform/icons/src/debugger/threadFrozen.png and b/platform/icons/src/debugger/threadFrozen.png differ diff --git a/platform/icons/src/debugger/threadGroup.png b/platform/icons/src/debugger/threadGroup.png index 67f1489df1c9..3de6f192e24d 100644 Binary files a/platform/icons/src/debugger/threadGroup.png and b/platform/icons/src/debugger/threadGroup.png differ diff --git a/platform/icons/src/debugger/threadGroupCurrent.png b/platform/icons/src/debugger/threadGroupCurrent.png index 3a0393c88d13..58ec13260ca9 100644 Binary files a/platform/icons/src/debugger/threadGroupCurrent.png and b/platform/icons/src/debugger/threadGroupCurrent.png differ diff --git a/platform/icons/src/debugger/threadStates/daemon_sign.png b/platform/icons/src/debugger/threadStates/daemon_sign.png index 15497c8ca18d..a89bd3a2b9de 100644 Binary files a/platform/icons/src/debugger/threadStates/daemon_sign.png and b/platform/icons/src/debugger/threadStates/daemon_sign.png differ diff --git a/platform/icons/src/debugger/threadStates/edtBusy.png b/platform/icons/src/debugger/threadStates/edtBusy.png index 93df3537bdee..4414cbd28328 100644 Binary files a/platform/icons/src/debugger/threadStates/edtBusy.png and b/platform/icons/src/debugger/threadStates/edtBusy.png differ diff --git a/platform/icons/src/debugger/threadStates/exception.png b/platform/icons/src/debugger/threadStates/exception.png index 86fb98603273..2e80bf80d865 100644 Binary files a/platform/icons/src/debugger/threadStates/exception.png and b/platform/icons/src/debugger/threadStates/exception.png differ diff --git a/platform/icons/src/debugger/threadStates/idle.png b/platform/icons/src/debugger/threadStates/idle.png index 80402b47eab1..1f02c73f1c79 100644 Binary files a/platform/icons/src/debugger/threadStates/idle.png and b/platform/icons/src/debugger/threadStates/idle.png differ diff --git a/platform/icons/src/debugger/threadStates/threaddump.png b/platform/icons/src/debugger/threadStates/threaddump.png index 294334ca1426..1ac00fac779c 100644 Binary files a/platform/icons/src/debugger/threadStates/threaddump.png and b/platform/icons/src/debugger/threadStates/threaddump.png differ diff --git a/platform/icons/src/debugger/threadSuspended.png b/platform/icons/src/debugger/threadSuspended.png index 7718bc51bc12..95754fcee9af 100644 Binary files a/platform/icons/src/debugger/threadSuspended.png and b/platform/icons/src/debugger/threadSuspended.png differ diff --git a/platform/icons/src/debugger/threads.png b/platform/icons/src/debugger/threads.png index 017bd0795708..3215425ed565 100644 Binary files a/platform/icons/src/debugger/threads.png and b/platform/icons/src/debugger/threads.png differ diff --git a/platform/icons/src/debugger/toolConsole.png b/platform/icons/src/debugger/toolConsole.png index 9ef452607935..16bdcb1a02e4 100644 Binary files a/platform/icons/src/debugger/toolConsole.png and b/platform/icons/src/debugger/toolConsole.png differ diff --git a/platform/icons/src/debugger/watch.png b/platform/icons/src/debugger/watch.png index de192cf6bfb8..194edca611af 100644 Binary files a/platform/icons/src/debugger/watch.png and b/platform/icons/src/debugger/watch.png differ diff --git a/platform/icons/src/debugger/watchLastReturnValue.png b/platform/icons/src/debugger/watchLastReturnValue.png index 5f04511f43ef..131cff747e12 100644 Binary files a/platform/icons/src/debugger/watchLastReturnValue.png and b/platform/icons/src/debugger/watchLastReturnValue.png differ diff --git a/platform/icons/src/debugger/watches.png b/platform/icons/src/debugger/watches.png index 1749b74da2e0..8d68010d6f9a 100644 Binary files a/platform/icons/src/debugger/watches.png and b/platform/icons/src/debugger/watches.png differ diff --git a/platform/icons/src/general/settings@2x.png b/platform/icons/src/general/settings@2x.png new file mode 100644 index 000000000000..b1f630df67f1 Binary files /dev/null and b/platform/icons/src/general/settings@2x.png differ diff --git a/platform/icons/src/runConfigurations/scrollToStackTrace.png b/platform/icons/src/runConfigurations/scrollToStackTrace.png index 9bf1f9ea7e41..be54ca72ca80 100644 Binary files a/platform/icons/src/runConfigurations/scrollToStackTrace.png and b/platform/icons/src/runConfigurations/scrollToStackTrace.png differ diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementConditionInfo.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementConditionInfo.java index c1d99426e213..94b688681af3 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementConditionInfo.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementConditionInfo.java @@ -18,7 +18,7 @@ package com.intellij.psi.codeStyle.arrangement; import com.intellij.psi.codeStyle.arrangement.model.ArrangementAtomMatchCondition; import com.intellij.psi.codeStyle.arrangement.model.ArrangementCompositeMatchCondition; import com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchCondition; -import com.intellij.psi.codeStyle.arrangement.model.ArrangementNameMatchCondition; +import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingType; import com.intellij.util.containers.ContainerUtilRt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,16 +34,25 @@ public class ArrangementConditionInfo { @NotNull private final Set myAtomConditions = ContainerUtilRt.newHashSet(); @NotNull private final Set myConditions = ContainerUtilRt.newHashSet(); - - @Nullable private ArrangementNameMatchCondition myNameCondition; - public void setNameCondition(@Nullable ArrangementNameMatchCondition condition) { - myNameCondition = condition; + @Nullable private String myNamePattern; + + @Nullable + public String getNamePattern() { + return myNamePattern; } - + + public void setNamePattern(@Nullable String namePattern) { + myNamePattern = namePattern; + } + public void addAtomCondition(@NotNull ArrangementAtomMatchCondition condition) { - myAtomConditions.add(condition); - myConditions.add(condition.getValue()); + switch (condition.getType()) { + case NAME: myNamePattern = condition.getValue().toString(); break; + default: + myAtomConditions.add(condition); + myConditions.add(condition.getValue()); + } } public boolean hasCondition(@NotNull Object condition) { @@ -66,15 +75,15 @@ public class ArrangementConditionInfo { @Nullable public ArrangementMatchCondition buildCondition() { if (myAtomConditions.isEmpty()) { - return myNameCondition == null ? null : myNameCondition; + return myNamePattern == null ? null : new ArrangementAtomMatchCondition(ArrangementSettingType.NAME, myNamePattern); } - else if (myAtomConditions.size() == 1 && myNameCondition == null) { + else if (myAtomConditions.size() == 1 && myNamePattern == null) { return myAtomConditions.iterator().next(); } else { ArrangementCompositeMatchCondition result = new ArrangementCompositeMatchCondition(myAtomConditions); - if (myNameCondition != null) { - result.addOperand(myNameCondition); + if (myNamePattern != null) { + result.addOperand(new ArrangementAtomMatchCondition(ArrangementSettingType.NAME, myNamePattern)); } return result; } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementUtil.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementUtil.java index f6b265e6d85c..f7b5bb67cf50 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementUtil.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/ArrangementUtil.java @@ -75,11 +75,6 @@ public class ArrangementUtil { operand.invite(this); } } - - @Override - public void visit(@NotNull ArrangementNameMatchCondition condition) { - result.addOperand(condition); - } }; for (ArrangementMatchCondition node : nodes) { node.invite(visitor); @@ -148,6 +143,9 @@ public class ArrangementUtil { else if (condition instanceof ArrangementModifier) { return ArrangementSettingType.MODIFIER; } + else if (condition instanceof String) { + return ArrangementSettingType.NAME; + } else { throw new IllegalArgumentException(String.format( "Can't parse type for the given condition of class '%s': %s", condition.getClass(), condition @@ -180,11 +178,6 @@ public class ArrangementUtil { operand.invite(this); } } - - @Override - public void visit(@NotNull ArrangementNameMatchCondition condition) { - result.setNameCondition(condition); - } }); return result; } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializer.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializer.java index 4f1123958cde..a6d209982541 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializer.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializer.java @@ -75,8 +75,6 @@ public class DefaultArrangementEntryMatcherSerializer { private static final Logger LOG = Logger.getInstance("#" + DefaultArrangementEntryMatcherSerializer.class.getName()); @NotNull private static final String COMPOSITE_CONDITION_NAME = "AND"; - @NotNull private static final String PATTERN_CONDITION_NAME = "NAME"; - private static final Set ATOM_SETTINGS_TYPES = new HashSet(); static { @@ -115,10 +113,7 @@ public class DefaultArrangementEntryMatcherSerializer { @Nullable private static ArrangementMatchCondition deserializeCondition(@NotNull Element matcherElement) { String name = matcherElement.getName(); - if (PATTERN_CONDITION_NAME.equals(name)) { - return new ArrangementNameMatchCondition(StringUtil.unescapeStringCharacters(matcherElement.getText())); - } - else if (!COMPOSITE_CONDITION_NAME.equals(name)) { + if (!COMPOSITE_CONDITION_NAME.equals(name)) { if (ATOM_SETTINGS_TYPES.contains(name)) { return deserializeAtomCondition(matcherElement); } @@ -150,6 +145,7 @@ public class DefaultArrangementEntryMatcherSerializer { switch (settingType) { case TYPE: value = ArrangementEntryType.valueOf(matcherElement.getText()); break; case MODIFIER: value = ArrangementModifier.valueOf(matcherElement.getText()); break; + case NAME: value = StringUtil.unescapeStringCharacters(matcherElement.getText()); break; default: LOG.warn(String.format( "Can't deserialize an arrangement entry matcher from element of type '%s' with text '%s'", @@ -167,7 +163,11 @@ public class DefaultArrangementEntryMatcherSerializer { @Override public void visit(@NotNull ArrangementAtomMatchCondition condition) { - Element element = new Element(condition.getType().toString()).setText(condition.getValue().toString()); + String content = condition.getValue().toString(); + if (condition.getType() == ArrangementSettingType.NAME) { + content = StringUtil.escapeStringCharacters(content); + } + Element element = new Element(condition.getType().toString()).setText(content); register(element); } @@ -183,12 +183,6 @@ public class DefaultArrangementEntryMatcherSerializer { } } - @Override - public void visit(@NotNull ArrangementNameMatchCondition condition) { - Element element = new Element(PATTERN_CONDITION_NAME).setText(StringUtil.escapeStringCharacters(condition.getPattern())); - register(element); - } - private void register(@NotNull Element element) { if (result == null) { result = element; diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/StdArrangementEntryMatcher.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/StdArrangementEntryMatcher.java index 373c267c84c0..5a463ce7ed8c 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/StdArrangementEntryMatcher.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/match/StdArrangementEntryMatcher.java @@ -19,6 +19,7 @@ import com.intellij.psi.codeStyle.arrangement.ArrangementEntry; import com.intellij.psi.codeStyle.arrangement.model.*; import com.intellij.util.containers.ContainerUtilRt; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.EnumSet; import java.util.List; @@ -85,10 +86,11 @@ public class StdArrangementEntryMatcher implements ArrangementEntryMatcher { private static class MyVisitor implements ArrangementMatchConditionVisitor { - @NotNull private final List myMatchers = ContainerUtilRt.newArrayList(); - @NotNull private final Set myTypes = EnumSet.noneOf(ArrangementEntryType.class); - @NotNull private final Set myModifiers = EnumSet.noneOf(ArrangementModifier.class); - @NotNull private final List myNamePatterns = ContainerUtilRt.newArrayList(); + @NotNull private final List myMatchers = ContainerUtilRt.newArrayList(); + @NotNull private final Set myTypes = EnumSet.noneOf(ArrangementEntryType.class); + @NotNull private final Set myModifiers = EnumSet.noneOf(ArrangementModifier.class); + + @Nullable private String myNamePattern; private boolean nestedComposite; @@ -100,6 +102,9 @@ public class StdArrangementEntryMatcher implements ArrangementEntryMatcher { break; case MODIFIER: myModifiers.add((ArrangementModifier)condition.getValue()); + break; + case NAME: + myNamePattern = condition.getValue().toString(); } } @@ -116,17 +121,12 @@ public class StdArrangementEntryMatcher implements ArrangementEntryMatcher { } } - @Override - public void visit(@NotNull ArrangementNameMatchCondition condition) { - myNamePatterns.add(condition.getPattern()); - } - @SuppressWarnings("ConstantConditions") @NotNull public ArrangementEntryMatcher getMatcher() { ByTypeArrangementEntryMatcher byType = myTypes.isEmpty() ? null : new ByTypeArrangementEntryMatcher(myTypes); ByModifierArrangementEntryMatcher byModifiers = myModifiers.isEmpty() ? null : new ByModifierArrangementEntryMatcher(myModifiers); - ByNameArrangementEntryMatcher byName = myNamePatterns.size() != 1 ? null : new ByNameArrangementEntryMatcher(myNamePatterns.get(0)); + ByNameArrangementEntryMatcher byName = myNamePattern == null ? null : new ByNameArrangementEntryMatcher(myNamePattern); int i = countNonNulls(byType, byModifiers, byName); if (i == 0 && myMatchers.isEmpty()) { return ArrangementEntryMatcher.EMPTY; diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementMatchConditionVisitor.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementMatchConditionVisitor.java index 9106c81f5e70..38b188ed8ff8 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementMatchConditionVisitor.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementMatchConditionVisitor.java @@ -26,6 +26,4 @@ public interface ArrangementMatchConditionVisitor { void visit(@NotNull ArrangementAtomMatchCondition condition); void visit(@NotNull ArrangementCompositeMatchCondition condition); - - void visit(@NotNull ArrangementNameMatchCondition condition); } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementNameMatchCondition.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementNameMatchCondition.java deleted file mode 100644 index 892b69e51242..000000000000 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementNameMatchCondition.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.psi.codeStyle.arrangement.model; - -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.codeStyle.arrangement.NameAwareArrangementEntry; -import org.jetbrains.annotations.NotNull; - -/** - * Condition which works on {@link NameAwareArrangementEntry} - * - * @author Denis Zhdanov - * @since 11/14/12 12:18 PM - */ -public class ArrangementNameMatchCondition implements ArrangementMatchCondition { - - @NotNull private final String myPattern; - - public ArrangementNameMatchCondition(@NotNull String pattern) { - myPattern = pattern; - } - - @NotNull - public String getPattern() { - return myPattern; - } - - @Override - public void invite(@NotNull ArrangementMatchConditionVisitor visitor) { - visitor.visit(this); - } - - @NotNull - @Override - public ArrangementMatchCondition clone() { - return new ArrangementNameMatchCondition(myPattern); - } - - @Override - public int hashCode() { - return myPattern.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ArrangementNameMatchCondition condition = (ArrangementNameMatchCondition)o; - return myPattern.equals(condition.myPattern); - } - - @Override - public String toString() { - return String.format("name like '%s'", StringUtil.escapeStringCharacters(myPattern)); - } -} diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingType.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingType.java index e2b229ccd2b4..d95368afe0a5 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingType.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingType.java @@ -20,5 +20,5 @@ package com.intellij.psi.codeStyle.arrangement.model; * @since 8/6/12 5:02 PM */ public enum ArrangementSettingType { - TYPE, MODIFIER + TYPE, MODIFIER, NAME } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementStandardSettingsAware.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementStandardSettingsAware.java index a338fa566b37..4835108610f5 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementStandardSettingsAware.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementStandardSettingsAware.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.codeStyle.arrangement.settings; +import com.intellij.psi.codeStyle.arrangement.NameAwareArrangementEntry; import com.intellij.psi.codeStyle.arrangement.StdArrangementSettings; import com.intellij.psi.codeStyle.arrangement.group.ArrangementGroupingType; import com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryType; @@ -42,6 +43,13 @@ public interface ArrangementStandardSettingsAware { */ @Nullable StdArrangementSettings getDefaultSettings(); + + /** + * @return true if name-based rules are supported by the current rearranger (it knows + * about {@link NameAwareArrangementEntry}); + * false otherwise + */ + boolean isNameFilterSupported(); /** * Allows to answer if given entry type can be applied for the rule specified by the given settings node. diff --git a/platform/lang-api/testSources/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializerTest.java b/platform/lang-api/testSources/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializerTest.java index eddbd4eaf1dd..53bc9ab656e3 100644 --- a/platform/lang-api/testSources/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializerTest.java +++ b/platform/lang-api/testSources/com/intellij/psi/codeStyle/arrangement/match/DefaultArrangementEntryMatcherSerializerTest.java @@ -19,7 +19,6 @@ import com.intellij.openapi.util.Comparing; import com.intellij.psi.codeStyle.arrangement.model.ArrangementAtomMatchCondition; import com.intellij.psi.codeStyle.arrangement.model.ArrangementCompositeMatchCondition; import com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchCondition; -import com.intellij.psi.codeStyle.arrangement.model.ArrangementNameMatchCondition; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.junit.Test; @@ -33,6 +32,7 @@ import static com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryType. import static com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryType.METHOD; import static com.intellij.psi.codeStyle.arrangement.match.ArrangementModifier.*; import static com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingType.MODIFIER; +import static com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingType.NAME; import static com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingType.TYPE; import static org.junit.Assert.*; @@ -109,7 +109,7 @@ public class DefaultArrangementEntryMatcherSerializerTest { @Test public void nameConditionOnly() { - ArrangementNameMatchCondition condition = new ArrangementNameMatchCondition("get*"); + ArrangementAtomMatchCondition condition = new ArrangementAtomMatchCondition(NAME, "get*"); doTest(condition); } @@ -118,7 +118,7 @@ public class DefaultArrangementEntryMatcherSerializerTest { ArrangementCompositeMatchCondition condition = new ArrangementCompositeMatchCondition(); condition.addOperand(new ArrangementAtomMatchCondition(TYPE, METHOD)); condition.addOperand(new ArrangementAtomMatchCondition(MODIFIER, SYNCHRONIZED)); - condition.addOperand(new ArrangementNameMatchCondition("get*")); + condition.addOperand(new ArrangementAtomMatchCondition(NAME, ("get*"))); doTest(condition); } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java index 75c4de893254..a4c11ee5407b 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java @@ -46,9 +46,10 @@ public class ArrangementConstants { public static final int CALLOUT_BORDER_HEIGHT = 10; public static final int BORDER_ARC_SIZE = 12; - public static final int ANIMATION_ITERATION_PIXEL_STEP = 5; - public static final int ANIMATION_STEPS_TIME_GAP_MILLIS = 40; - + public static final int ANIMATION_ITERATION_PIXEL_STEP = 5; + public static final int ANIMATION_STEPS_TIME_GAP_MILLIS = 40; + public static final int NAME_CONDITION_UPDATE_DELAY_MILLIS = 1000; + public static final boolean LOG_RULE_MODIFICATION = Boolean.parseBoolean(System.getProperty("log.arrangement.rule.modification")); private ArrangementConstants() { diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementNodeDisplayManager.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementNodeDisplayManager.java index 2a30831c5ede..7c6e5d2a78b6 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementNodeDisplayManager.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementNodeDisplayManager.java @@ -48,6 +48,7 @@ import java.util.Set; public class ArrangementNodeDisplayManager { @NotNull private final TObjectIntHashMap myMaxWidths = new TObjectIntHashMap(); + @NotNull private final ArrangementStandardSettingsAware myFilter; @NotNull private final ArrangementColorsProvider myColorsProvider; @NotNull private ArrangementStandardSettingsRepresentationAware myRepresentationManager; @@ -119,8 +120,16 @@ public class ArrangementNodeDisplayManager { return value.toString(); } } - + + /** + * @param type target condition type + * @return max width in pixels for the condition value of the given type if any; + * '-1' as an indication that no max width limit exists for the condition value of the given type + */ public int getMaxWidth(@NotNull ArrangementSettingType type) { + if (type == ArrangementSettingType.NAME) { + return -1; + } return myMaxWidths.get(type); } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAndMatchConditionComponent.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAndMatchConditionComponent.java index 5a29993af850..b94a4ad1b09c 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAndMatchConditionComponent.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAndMatchConditionComponent.java @@ -58,11 +58,9 @@ public class ArrangementAndMatchConditionComponent extends JPanel implements Arr setOpaque(false); setLayout(new GridBagLayout()); final Map operands = new HashMap(); - final List nameConditions = new ArrayList(); ArrangementMatchConditionVisitor visitor = new ArrangementMatchConditionVisitor() { @Override public void visit(@NotNull ArrangementAtomMatchCondition condition) { operands.put(condition.getValue(), condition); } @Override public void visit(@NotNull ArrangementCompositeMatchCondition condition) { operands.put(condition, condition); } - @Override public void visit(@NotNull ArrangementNameMatchCondition condition) { nameConditions.add(condition); } }; for (ArrangementMatchCondition operand : setting.getOperands()) { operand.invite(visitor); @@ -78,12 +76,6 @@ public class ArrangementAndMatchConditionComponent extends JPanel implements Arr JComponent uiComponent = component.getUiComponent(); add(uiComponent, constraints); } - for (ArrangementNameMatchCondition condition : nameConditions) { - ArrangementMatchConditionComponent component = factory.getComponent(condition, rule, true); - myComponents.add(component); - JComponent uiComponent = component.getUiComponent(); - add(uiComponent, constraints); - } } @NotNull diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAtomMatchConditionComponent.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAtomMatchConditionComponent.java index a2f87e52c813..86c35f51ac2e 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAtomMatchConditionComponent.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementAtomMatchConditionComponent.java @@ -25,11 +25,13 @@ import com.intellij.application.options.codeStyle.arrangement.util.InsetsPanel; import com.intellij.openapi.actionSystem.impl.ActionButton; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.psi.codeStyle.arrangement.model.ArrangementAtomMatchCondition; +import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingType; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.RoundedLineBorder; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.Consumer; +import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.ui.GridBag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,6 +39,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; +import java.util.Map; /** * {@link ArrangementMatchConditionComponent} for {@link ArrangementAtomMatchCondition} representation. @@ -48,6 +51,16 @@ import java.awt.event.MouseEvent; */ public class ArrangementAtomMatchConditionComponent implements ArrangementMatchConditionComponent { + @NotNull private static final Map BORDER_STRATEGIES = ContainerUtilRt.newHashMap(); + static { + BORDER_STRATEGIES.put(ArrangementSettingType.NAME, new NameBorderStrategy()); + + PredefinedConditionBorderStrategy strategy = new PredefinedConditionBorderStrategy(); + BORDER_STRATEGIES.put(ArrangementSettingType.TYPE, strategy); + BORDER_STRATEGIES.put(ArrangementSettingType.MODIFIER, strategy); + assert BORDER_STRATEGIES.size() == ArrangementSettingType.values().length; + } + @NotNull private final SimpleColoredComponent myTextControl = new SimpleColoredComponent() { @Override @@ -71,6 +84,7 @@ public class ArrangementAtomMatchConditionComponent implements ArrangementMatchC } }; + @NotNull private final BorderStrategy myBorderStrategy; @NotNull private final String myText; @NotNull private final ArrangementColorsProvider myColorsProvider; @NotNull private final RoundedLineBorder myBorder; @@ -97,10 +111,17 @@ public class ArrangementAtomMatchConditionComponent implements ArrangementMatchC myColorsProvider = colorsProvider; myCondition = condition; myCloseCallback = closeCallback; + myBorderStrategy = BORDER_STRATEGIES.get(condition.getType()); myText = manager.getDisplayValue(condition); myTextControl.setTextAlign(SwingConstants.CENTER); myTextControl.append(myText, SimpleTextAttributes.fromTextAttributes(colorsProvider.getTextAttributes(condition.getType(), false))); - myTextControlSize = new Dimension(manager.getMaxWidth(condition.getType()), myTextControl.getPreferredSize().height); + int maxWidth = manager.getMaxWidth(condition.getType()); + if (maxWidth > 0) { + myTextControlSize = new Dimension(maxWidth, myTextControl.getPreferredSize().height); + } + else { + myTextControlSize = myTextControl.getPreferredSize(); + } final ArrangementRemoveConditionAction action = new ArrangementRemoveConditionAction(); Icon buttonIcon = action.getTemplatePresentation().getIcon(); @@ -124,8 +145,6 @@ public class ArrangementAtomMatchConditionComponent implements ArrangementMatchC myCloseButtonBounds = new Rectangle(0, 0, buttonIcon.getIconWidth(), buttonIcon.getIconHeight()); } - - JPanel insetsPanel = new JPanel(new GridBagLayout()) { @Override public String toString() { @@ -158,12 +177,18 @@ public class ArrangementAtomMatchConditionComponent implements ArrangementMatchC public String toString() { return "round border panel for " + myText; } + + @Override + protected void paintBorder(Graphics g) { + myBorderStrategy.setup((Graphics2D)g); + super.paintBorder(g); + } }; roundBorderPanel.add(insetsPanel, new GridBag().anchor(GridBagConstraints.WEST)); if (myCloseButton != null) { roundBorderPanel.add(new InsetsPanel(myCloseButton), new GridBag().anchor(GridBagConstraints.EAST)); } - myBorder = IdeBorderFactory.createRoundedBorder(ArrangementConstants.BORDER_ARC_SIZE); + myBorder = myBorderStrategy.create(); roundBorderPanel.setBorder(myBorder); roundBorderPanel.setOpaque(false); @@ -297,4 +322,35 @@ public class ArrangementAtomMatchConditionComponent implements ArrangementMatchC public String toString() { return myText; } + + private interface BorderStrategy { + RoundedLineBorder create(); + void setup(@NotNull Graphics2D g); + } + + private static class PredefinedConditionBorderStrategy implements BorderStrategy { + @Override + public RoundedLineBorder create() { + return IdeBorderFactory.createRoundedBorder(ArrangementConstants.BORDER_ARC_SIZE); + } + + @Override + public void setup(@NotNull Graphics2D g) { + } + } + + private static class NameBorderStrategy implements BorderStrategy { + + @NotNull private final BasicStroke myStroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1, new float[]{5, 5}, 0); + + @Override + public RoundedLineBorder create() { + return IdeBorderFactory.createRoundedBorder(ArrangementConstants.BORDER_ARC_SIZE, 2); + } + + @Override + public void setup(@NotNull Graphics2D g) { + g.setStroke(myStroke); + } + } } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java index 061f330cb0b7..5f7e8d962050 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java @@ -80,11 +80,6 @@ public class ArrangementMatchNodeComponentFactory { public void visit(@NotNull ArrangementCompositeMatchCondition condition) { ref.set(new ArrangementAndMatchConditionComponent(rule, condition, ArrangementMatchNodeComponentFactory.this, myDisplayManager)); } - - @Override - public void visit(@NotNull ArrangementNameMatchCondition condition) { - ref.set(new ArrangementNameConditionComponent(condition)); - } }); return ref.get(); } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRuleEditor.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRuleEditor.java index a53e3ad7a78f..b24dfdadf7ab 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRuleEditor.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRuleEditor.java @@ -19,6 +19,9 @@ import com.intellij.application.options.codeStyle.arrangement.ArrangementConstan import com.intellij.application.options.codeStyle.arrangement.ArrangementNodeDisplayManager; import com.intellij.application.options.codeStyle.arrangement.color.ArrangementColorsProvider; import com.intellij.application.options.codeStyle.arrangement.util.ArrangementConfigUtil; +import com.intellij.openapi.application.ApplicationBundle; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.codeStyle.arrangement.ArrangementConditionInfo; import com.intellij.psi.codeStyle.arrangement.ArrangementUtil; import com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryMatcher; @@ -30,6 +33,9 @@ import com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchCondition; import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingType; import com.intellij.psi.codeStyle.arrangement.settings.ArrangementStandardSettingsAware; import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.components.JBTextField; +import com.intellij.util.Alarm; +import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.ui.GridBag; import com.intellij.util.ui.MultiRowFlowPanel; import com.intellij.util.ui.UIUtil; @@ -37,11 +43,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.*; +import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.Set; /** * Control for managing {@link ArrangementEntryMatcher matching rule conditions} for a single {@link ArrangementMatchRule}. @@ -53,11 +65,12 @@ import java.util.List; */ public class ArrangementMatchingRuleEditor extends JPanel { - @NotNull private final List myRows = new ArrayList(); + @NotNull private final Map myComponents = ContainerUtilRt.newHashMap(); + @NotNull private final List myRows = ContainerUtilRt.newArrayList(); + + @NotNull private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); + @NotNull private final JBTextField myNameField = new JBTextField(20); - @NotNull private final Map myComponents = - new HashMap(); - @NotNull private final ArrangementMatchingRulesControl myControl; @NotNull private final ArrangementStandardSettingsAware myFilter; @NotNull private final ArrangementColorsProvider myColorsProvider; @@ -65,6 +78,7 @@ public class ArrangementMatchingRuleEditor extends JPanel { @Nullable private ArrangementConditionInfo myConditionInfo; private int myRow = -1; private int myLabelWidth; + private boolean myRequestFocus; public ArrangementMatchingRuleEditor(@NotNull ArrangementStandardSettingsAware filter, @NotNull ArrangementColorsProvider provider, @@ -81,6 +95,11 @@ public class ArrangementMatchingRuleEditor extends JPanel { onMouseClicked(e); } }); + myNameField.getDocument().addDocumentListener(new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { scheduleNameUpdate(); } + @Override public void removeUpdate(DocumentEvent e) { scheduleNameUpdate(); } + @Override public void changedUpdate(DocumentEvent e) { scheduleNameUpdate(); } + }); } private void init(@NotNull ArrangementNodeDisplayManager displayManager) { @@ -90,8 +109,42 @@ public class ArrangementMatchingRuleEditor extends JPanel { Map> supportedSettings = ArrangementConfigUtil.buildAvailableConditions(myFilter, null); addRowIfPossible(ArrangementSettingType.TYPE, supportedSettings, displayManager); addRowIfPossible(ArrangementSettingType.MODIFIER, supportedSettings, displayManager); + addNameFilterIfPossible(); + applyBackground(UIUtil.getListBackground()); } + private void scheduleNameUpdate() { + myAlarm.cancelAllRequests(); + myAlarm.addRequest(new Runnable() { + @Override + public void run() { + updateName(); + } + }, ArrangementConstants.NAME_CONDITION_UPDATE_DELAY_MILLIS); + } + + private void updateName() { + myAlarm.cancelAllRequests(); + if (myRow < 0 || myConditionInfo == null) { + return; + } + + String namePattern = myNameField.getText(); + if (StringUtil.isEmpty(namePattern)) { + namePattern = null; + } + if (Comparing.equal(namePattern, myConditionInfo.getNamePattern())) { + return; + } + myConditionInfo.setNamePattern(namePattern); + ArrangementMatchCondition newCondition = myConditionInfo.buildCondition(); + Object modelValue = newCondition == null + ? new EmptyArrangementRuleComponent(myControl.getRowHeight(myRow)) + : new StdArrangementMatchRule(new StdArrangementEntryMatcher(newCondition)); + myControl.getModel().set(myRow, modelValue); + myControl.repaintRows(myRow, myRow, true); + } + private void addRowIfPossible(@NotNull ArrangementSettingType key, @NotNull Map> supportedSettings, @NotNull ArrangementNodeDisplayManager manager) @@ -101,23 +154,47 @@ public class ArrangementMatchingRuleEditor extends JPanel { return; } - MultiRowFlowPanel valuesPanel = new MultiRowFlowPanel( - FlowLayout.LEFT, ArrangementConstants.HORIZONTAL_GAP, ArrangementConstants.VERTICAL_GAP - ); + MultiRowFlowPanel valuesPanel = newRow(manager.getDisplayLabel(key)); for (Object value : manager.sort(values)) { ArrangementAtomMatchConditionComponent component = new ArrangementAtomMatchConditionComponent(manager, myColorsProvider, new ArrangementAtomMatchCondition(key, value), null); myComponents.put(value, component); valuesPanel.add(component.getUiComponent()); } + } - int top = ArrangementConstants.VERTICAL_PADDING; - JLabel label = new JLabel(manager.getDisplayLabel(key) + ":"); - add(label, new GridBag().anchor(GridBagConstraints.NORTHWEST).insets(top, 0, 0, 0)); + private void addNameFilterIfPossible() { + if (!myFilter.isNameFilterSupported()) { + return; + } + MultiRowFlowPanel panel = newRow(ApplicationBundle.message("arrangement.text.name")); + panel.add(myNameField); + } + + private MultiRowFlowPanel newRow(@NotNull String rowLabel) { + MultiRowFlowPanel result = new MultiRowFlowPanel( + FlowLayout.LEFT, ArrangementConstants.HORIZONTAL_GAP, ArrangementConstants.VERTICAL_GAP + ); + JLabel label = new JLabel(rowLabel + ":"); + add(label, new GridBag().anchor(GridBagConstraints.NORTHWEST).insets(ArrangementConstants.VERTICAL_PADDING, 0, 0, 0)); myLabelWidth = Math.max(myLabelWidth, label.getPreferredSize().width); - add(valuesPanel, new GridBag().anchor(GridBagConstraints.WEST).weightx(1).fillCellHorizontally().coverLine()); - myRows.add(valuesPanel); - applyBackground(UIUtil.getListBackground()); + + add(result, new GridBag().anchor(GridBagConstraints.WEST).weightx(1).fillCellHorizontally().coverLine()); + myRows.add(result); + return result; + } + + @Override + protected void paintComponent(Graphics g) { + if (myRequestFocus) { + if (myNameField.isFocusOwner()) { + myRequestFocus = false; + } + else { + myNameField.requestFocusInWindow(); + } + } + super.paintComponent(g); } /** @@ -131,9 +208,13 @@ public class ArrangementMatchingRuleEditor extends JPanel { } private void updateState(int row, boolean newModel) { + myAlarm.cancelAllRequests(); if (newModel) { myRow = row; myConditionInfo = null; + myNameField.setText(""); + myAlarm.cancelAllRequests(); + myRequestFocus = true; } // Reset state. @@ -164,6 +245,7 @@ public class ArrangementMatchingRuleEditor extends JPanel { ArrangementMatchCondition condition = ((StdArrangementMatchRule)element).getMatcher().getCondition(); myConditionInfo = ArrangementUtil.extractConditions(condition); + myNameField.setText(myConditionInfo.getNamePattern() == null ? "" : myConditionInfo.getNamePattern()); Map> available = ArrangementConfigUtil.buildAvailableConditions(myFilter, condition); for (Collection ids : available.values()) { diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java index ee4b33a0a771..644cab1f8a95 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java @@ -79,6 +79,7 @@ public class ArrangementMatchingRulesControl extends JBTable { setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); setShowColumns(false); setShowGrid(false); + setSurrendersFocusOnKeystroke(true); putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); myEditor = new ArrangementMatchingRuleEditor(settingsFilter, colorsProvider, displayManager, this); addMouseMotionListener(new MouseAdapter() { diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementNameConditionComponent.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementNameConditionComponent.java deleted file mode 100644 index a3b7a4bc6810..000000000000 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementNameConditionComponent.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.application.options.codeStyle.arrangement.match; - -import com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchCondition; -import com.intellij.psi.codeStyle.arrangement.model.ArrangementNameMatchCondition; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; - -/** - * @author Denis Zhdanov - * @since 11/14/12 12:24 PM - */ -public class ArrangementNameConditionComponent implements ArrangementMatchConditionComponent { - - @NotNull private final ArrangementNameMatchCondition myCondition; - - public ArrangementNameConditionComponent(@NotNull ArrangementNameMatchCondition condition) { - myCondition = condition; - } - - @NotNull - @Override - public ArrangementMatchCondition getMatchCondition() { - return myCondition; - } - - @NotNull - @Override - public JComponent getUiComponent() { - // TODO den implement - return null; - } - - @Nullable - @Override - public Rectangle getScreenBounds() { - // TODO den implement - return null; - } - - @Override - public void setSelected(boolean selected) { - // TODO den implement - } - - @Nullable - @Override - public Rectangle onMouseMove(@NotNull MouseEvent event) { - // TODO den implement - return null; - } - - @Override - public void onMouseRelease(@NotNull MouseEvent event) { - // TODO den implement - } - - @Nullable - @Override - public Rectangle onMouseExited() { - // TODO den implement - return null; - } - - @Nullable - @Override - public Rectangle onMouseEntered(@NotNull MouseEvent e) { - // TODO den implement - return null; - } -} diff --git a/platform/platform-api/src/com/intellij/ui/IdeBorderFactory.java b/platform/platform-api/src/com/intellij/ui/IdeBorderFactory.java index 50632f6c9d6f..3a2b37c75340 100644 --- a/platform/platform-api/src/com/intellij/ui/IdeBorderFactory.java +++ b/platform/platform-api/src/com/intellij/ui/IdeBorderFactory.java @@ -54,6 +54,11 @@ public class IdeBorderFactory { return new RoundedLineBorder(getBorderColor(), arcSize); } + @NotNull + public static RoundedLineBorder createRoundedBorder(int arcSize, final int thickness) { + return new RoundedLineBorder(getBorderColor(), arcSize, thickness); + } + public static Border createEmptyBorder(Insets insets) { return new EmptyBorder(insets); } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index cd72d7a88cc9..3e1ebb4b8381 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -557,6 +557,7 @@ arrangement.title.settings.tab=Arrangement arrangement.text.empty.rule= arrangement.text.type=Type arrangement.text.modifier=Modifier +arrangement.text.name=Name arrangement.action.rule.add.text=Add rule arrangement.action.rule.add.description=Add new arrangement rule arrangement.action.rule.remove.text=Remove rule(s) diff --git a/platform/testFramework/testSrc/com/intellij/psi/codeStyle/arrangement/AbstractRearrangerTest.groovy b/platform/testFramework/testSrc/com/intellij/psi/codeStyle/arrangement/AbstractRearrangerTest.groovy index 744bfc6485bc..9e0cb0d08ddf 100644 --- a/platform/testFramework/testSrc/com/intellij/psi/codeStyle/arrangement/AbstractRearrangerTest.groovy +++ b/platform/testFramework/testSrc/com/intellij/psi/codeStyle/arrangement/AbstractRearrangerTest.groovy @@ -29,7 +29,6 @@ import com.intellij.psi.codeStyle.arrangement.match.StdArrangementEntryMatcher import com.intellij.psi.codeStyle.arrangement.match.StdArrangementMatchRule import com.intellij.psi.codeStyle.arrangement.model.ArrangementAtomMatchCondition import com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchCondition -import com.intellij.psi.codeStyle.arrangement.model.ArrangementNameMatchCondition import com.intellij.psi.codeStyle.arrangement.order.ArrangementEntryOrderType import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase import org.jetbrains.annotations.NotNull @@ -69,18 +68,6 @@ abstract class AbstractRearrangerTest extends LightPlatformCodeInsightFixtureTes new ArrangementGroupingRule(type, order) } - @NotNull - protected static StdArrangementMatchRule rule(@NotNull String name) { - new StdArrangementMatchRule(new StdArrangementEntryMatcher(new ArrangementNameMatchCondition(name))) - } - - @NotNull - protected static StdArrangementMatchRule rule(@NotNull String name, Object ... conditions) { - def c = conditions.collect { atom(it) } - c << new ArrangementNameMatchCondition(name) - new StdArrangementMatchRule(new StdArrangementEntryMatcher(ArrangementUtil.combine(c as ArrangementMatchCondition[]))) - } - @NotNull protected static StdArrangementMatchRule rule(@NotNull Object ... conditions) { def condition