diff --git a/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilderTest.java b/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilderTest.java
index 1ccb60943293..927eaccad33b 100644
--- a/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilderTest.java
+++ b/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilderTest.java
@@ -60,8 +60,7 @@ public class ArrangementRuleEditingModelBuilderTest extends AbstractArrangementR
assertEquals(and(atom(PUBLIC), atom(STATIC)), modifiersUiNode.getBackingSetting());
}
- // TODO den uncomment
- //@Test
+ @Test
public void addToExistingLayer() {
myBuilder.build(and(atom(PUBLIC), atom(STATIC), atom(FIELD)), myTree, myRoot, myGrouper, myRowMappings);
myBuilder.build(and(atom(PRIVATE), atom(FIELD)), myTree, myRoot, myGrouper, myRowMappings);
diff --git a/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImplTest.java b/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImplTest.java
index 947deab73231..4ba822e30d59 100644
--- a/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImplTest.java
+++ b/java/java-tests/testSrc/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImplTest.java
@@ -171,18 +171,17 @@ public class ArrangementRuleEditingModelImplTest extends AbstractArrangementRule
checkTreeNodesConsistency();
}
- // TODO den uncomment
- //@Test
+ @Test
public void removeLastRowConditionFromMultiChildrenParent() {
configure(and(atom(FIELD), atom(PUBLIC)));
configure(and(atom(FIELD), atom(STATIC)));
+ assertEquals(2, myRowMappings.size());
ArrangementRuleEditingModel siblingModel = myRowMappings.get(2);
assertNotNull(siblingModel);
ArrangementRuleEditingModel modelToChange = myRowMappings.get(3);
assertNotNull(modelToChange);
- assertEquals(2, myRowMappings.size());
modelToChange.removeAndCondition(atom(STATIC));
@@ -199,7 +198,7 @@ public class ArrangementRuleEditingModelImplTest extends AbstractArrangementRule
ArrangementTreeNode publicNode = compositeFieldNode.getFirstChild();
assertNotNull(publicNode);
- assertEquals(atom(PUBLIC), publicNode.getUserObject());
+ assertEquals(atom(PUBLIC), publicNode.getBackingSetting());
ArrangementTreeNode atomFieldNode = compositeFieldNode.getNextSibling();
assertNotNull(atomFieldNode);
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConfigUtil.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConfigUtil.java
index 06a5b78a06b0..a76e6ad72a5f 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConfigUtil.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConfigUtil.java
@@ -176,34 +176,38 @@ public class ArrangementConfigUtil {
* @param uiParentNode UI tree node which should hold UI nodes created for representing given settings node;
* null as an indication that we want to create a standalone nodes hierarchy
* @param settingsNode settings node which should be represented at the UI tree denoted by the given UI tree node
+ * @param model tree model to use for the tree modification
* @return pair {@code (bottom-most leaf node created; number of rows created)}
*/
@NotNull
public static Pair map(@Nullable ArrangementTreeNode uiParentNode,
- @NotNull HierarchicalArrangementSettingsNode settingsNode)
+ @NotNull HierarchicalArrangementSettingsNode settingsNode,
+ @Nullable DefaultTreeModel model)
{
ArrangementTreeNode uiNode = null;
int rowsCreated = 0;
- if (uiParentNode != null) {
- for (int i = uiParentNode.getChildCount() - 1; i >= 0; i--) {
- ArrangementTreeNode child = uiParentNode.getChildAt(i);
- if (settingsNode.getCurrent().equals(child.getUserObject())) {
- uiNode = child;
- break;
- }
+ if (uiParentNode != null && uiParentNode.getChildCount() > 0) {
+ ArrangementTreeNode child = uiParentNode.getChildAt(uiParentNode.getChildCount() - 1);
+ if (settingsNode.getCurrent().equals(child.getBackingSetting())) {
+ uiNode = child;
}
}
if (uiNode == null) {
uiNode = new ArrangementTreeNode(settingsNode.getCurrent());
if (uiParentNode != null) {
- uiParentNode.add(uiNode);
+ if (model == null) {
+ uiParentNode.add(uiNode);
+ }
+ else {
+ model.insertNodeInto(uiNode, uiParentNode, uiParentNode.getChildCount());
+ }
}
rowsCreated++;
}
ArrangementTreeNode leaf = uiNode;
HierarchicalArrangementSettingsNode childSettingsNode = settingsNode.getChild();
if (childSettingsNode != null) {
- Pair pair = map(uiNode, childSettingsNode);
+ Pair pair = map(uiNode, childSettingsNode, model);
leaf = pair.first;
rowsCreated += pair.second;
}
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilder.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilder.java
index f5788b850ea2..cb20a2da154f 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilder.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelBuilder.java
@@ -94,7 +94,7 @@ public class ArrangementRuleEditingModelBuilder {
HierarchicalArrangementSettingsNode grouped = grouper.group(setting);
DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
- Pair pair = ArrangementConfigUtil.map(root, grouped);
+ Pair pair = ArrangementConfigUtil.map(root, grouped, treeModel);
ArrangementTreeNode topMostNode = ArrangementConfigUtil.getLastBefore(pair.first, root);
int row = initialInsertRow + pair.second - 1;
ArrangementRuleEditingModelImpl model = new ArrangementRuleEditingModelImpl(
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImpl.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImpl.java
index a2481f8148e7..a96255425d90 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImpl.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementRuleEditingModelImpl.java
@@ -129,7 +129,8 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
// No refresh is necessary.
return;
}
- else if (myTopMost.getUserObject().equals(node.getUserObject())) {
+ ArrangementSettingsNode setting = myTopMost.getBackingSetting();
+ if (setting != null && setting.equals(node.getBackingSetting())) {
myTopMost = node;
return;
}
@@ -181,7 +182,7 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
return;
}
- Pair replacement = ArrangementConfigUtil.map(null, grouped);
+ Pair replacement = ArrangementConfigUtil.map(null, grouped, null);
ArrangementTreeNode newBottom = replacement.first;
ArrangementTreeNode newTop = ArrangementConfigUtil.getRoot(newBottom);
final TIntIntHashMap rowChanges = ArrangementConfigUtil.replace(myTopMost, myBottomMost, newTop, myTreeModel);