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 0ab54a123077..0c72a9e0ff49 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 @@ -68,6 +68,43 @@ public class JavaRearranger implements Rearranger, MODIFIERS_BY_TYPE.put(FIELD, concat(commonModifiers, TRANSIENT, VOLATILE)); } + private static final List> DEFAULT_RULES = + new ArrayList>(); + static { + ArrangementModifier[] visibility = { PUBLIC, PROTECTED, PACKAGE_PRIVATE, PRIVATE }; + for (ArrangementModifier modifier : visibility) { + and(FIELD, STATIC, FINAL, modifier); + } + for (ArrangementModifier modifier : visibility) { + and(FIELD, STATIC, modifier); + } + for (ArrangementModifier modifier : visibility) { + and(FIELD, FINAL, modifier); + } + for (ArrangementModifier modifier : visibility) { + and(FIELD, modifier); + } + and(METHOD); + and(ENUM); + and(INTERFACE); + and(CLASS); + } + + private static void and(@NotNull Object ... conditions) { + if (conditions.length == 1) { + DEFAULT_RULES.add(new ArrangementRule(new StdArrangementEntryMatcher(new ArrangementAtomMatchCondition( + ArrangementUtil.parseType(conditions[0]), conditions[0] + )))); + return; + } + + ArrangementCompositeMatchCondition composite = new ArrangementCompositeMatchCondition(ArrangementOperator.AND); + for (Object condition : conditions) { + composite.addOperand(new ArrangementAtomMatchCondition(ArrangementUtil.parseType(condition), condition)); + } + DEFAULT_RULES.add(new ArrangementRule(new StdArrangementEntryMatcher(composite))); + } + @NotNull private static Set concat(@NotNull Set base, ArrangementModifier... modifiers) { EnumSet result = EnumSet.copyOf(base); @@ -174,7 +211,6 @@ public class JavaRearranger implements Rearranger, @Nullable @Override public List> getDefaultRules() { - // TODO den implement - return null; + return DEFAULT_RULES; } } 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 59f29e1a69d2..60b591076bc0 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 @@ -18,10 +18,9 @@ package com.intellij.psi.codeStyle.arrangement; import com.intellij.lang.Language; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; -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.ArrangementMatchConditionVisitor; +import com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryType; +import com.intellij.psi.codeStyle.arrangement.match.ArrangementModifier; +import com.intellij.psi.codeStyle.arrangement.model.*; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -211,4 +210,19 @@ public class ArrangementUtil { return TextRange.create(startOffsetToUse, endOffsetToUse); } //endregion + + @NotNull + public static ArrangementSettingType parseType(@NotNull Object condition) throws IllegalArgumentException { + if (condition instanceof ArrangementEntryType) { + return ArrangementSettingType.TYPE; + } + else if (condition instanceof ArrangementModifier) { + return ArrangementSettingType.MODIFIER; + } + else { + throw new IllegalArgumentException(String.format( + "Can't parse type for the given condition of class '%s': %s", condition.getClass(), condition + )); + } + } } 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 8bc625d8e9df..f0090494a3be 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 @@ -57,6 +57,29 @@ public class StdArrangementEntryMatcher implements ArrangementEntryMatcher { return myDelegate.isMatched(entry); } + @Override + public int hashCode() { + return myCondition.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + StdArrangementEntryMatcher matcher = (StdArrangementEntryMatcher)o; + return myCondition.equals(matcher.myCondition); + } + + @Override + public String toString() { + return myCondition.toString(); + } + @NotNull private static ArrangementEntryMatcher doBuildMatcher(@NotNull ArrangementMatchCondition condition) { MyVisitor visitor = new MyVisitor(); diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementCompositeMatchCondition.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementCompositeMatchCondition.java index 451c83c9a6dc..ca70fb31e7fc 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementCompositeMatchCondition.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementCompositeMatchCondition.java @@ -44,8 +44,8 @@ public class ArrangementCompositeMatchCondition implements ArrangementMatchCondi return myOperands; } - public ArrangementCompositeMatchCondition addOperand(@NotNull ArrangementMatchCondition node) { - myOperands.add(node); + public ArrangementCompositeMatchCondition addOperand(@NotNull ArrangementMatchCondition condition) { + myOperands.add(condition); return this; } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleTree.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleTree.java index 9a17bc51d869..2cbe9368bf69 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleTree.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleTree.java @@ -181,22 +181,10 @@ public class ArrangementRuleTree { } }); - map(rules); - - expandAll(myTree, new TreePath(myRoot)); + setRules(rules); + myTree.setShowsRootHandles(false); myTree.setCellRenderer(new MyCellRenderer()); - - if (ArrangementConstants.LOG_RULE_MODIFICATION) { - LOG.info("Arrangement tree is constructed. Models:"); - myModels.forEachValue(new TObjectProcedure() { - @Override - public boolean execute(ArrangementRuleEditingModelImpl model) { - LOG.info(String.format(" row %d, model '%s'", model.getRow(), model.getRule())); - return true; - } - }); - } } private void selectPreviousRule() { @@ -377,6 +365,30 @@ public class ArrangementRuleTree { } return result; } + + public void setRules(@NotNull List> rules) { + myRenderers.clear(); + myModels.clear(); + while (myRoot.getChildCount() > 0) + myTreeModel.removeNodeFromParent(myRoot.getFirstChild()); + map(rules); + expandAll(myTree, new TreePath(myRoot)); + + if (ArrangementConstants.LOG_RULE_MODIFICATION) { + LOG.info("Arrangement tree is refreshed. Given rules:"); + for (ArrangementRule rule : rules) { + LOG.info(" " + rule.toString()); + } + LOG.info("Following models have been built:"); + myModels.forEachValue(new TObjectProcedure() { + @Override + public boolean execute(ArrangementRuleEditingModelImpl model) { + LOG.info(String.format(" row %d, model '%s'", model.getRow(), model.getRule())); + return true; + } + }); + } + } @NotNull private ArrangementNodeComponent getNodeComponentAt(int row, @NotNull ArrangementMatchCondition condition) { diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementSettingsPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementSettingsPanel.java index 15dc969f2726..1cdd11935675 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementSettingsPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementSettingsPanel.java @@ -188,24 +188,24 @@ public abstract class ArrangementSettingsPanel extends CodeStyleAbstractPanel { @SuppressWarnings("unchecked") @NotNull private List> getRules(@NotNull CodeStyleSettings settings) { - List> result = Collections.emptyList(); - List> storedRules = settings.getCommonSettings(myLanguage).getArrangementRules(); if (storedRules.isEmpty()) { List> defaultRules = mySettingsAware.getDefaultRules(); if (defaultRules != null) { - result = defaultRules; + return defaultRules; } } else { // We use unchecked cast here in assumption that current rearranger is based on standard settings if it uses standard // settings-based rule editor. // Note: unchecked cast for the whole collection doesn't work here (compiler error). + List> result = new ArrayList>(); for (ArrangementRule rule : storedRules) { result.add((ArrangementRule)rule); } + return result; } - return result; + return Collections.emptyList(); } private static void setupKeyboardActions(@NotNull ActionManager actionManager, @NotNull Tree treeComponent) { @@ -231,18 +231,18 @@ public abstract class ArrangementSettingsPanel extends CodeStyleAbstractPanel { } @Override - public boolean isModified(CodeStyleSettings settings) { - return getRules(settings).equals(myRuleTree.getRules()); + public boolean isModified(@NotNull CodeStyleSettings settings) { + return !getRules(settings).equals(myRuleTree.getRules()); } @Override - public void apply(CodeStyleSettings settings) { + public void apply(@NotNull CodeStyleSettings settings) { settings.getCommonSettings(myLanguage).setArrangementRules(myRuleTree.getRules()); } @Override - protected void resetImpl(CodeStyleSettings settings) { - // TODO den implement + protected void resetImpl(@NotNull CodeStyleSettings settings) { + myRuleTree.setRules(getRules(settings)); } @Override