IDEA-19061 Integrate the Rearranger-plugin into core-IDEA

Refreshing tree nodes on changes (work in progress)
This commit is contained in:
Denis.Zhdanov
2012-08-20 17:36:09 +04:00
parent 2f48cb7994
commit 4f5f66866f
6 changed files with 85 additions and 32 deletions
@@ -39,11 +39,11 @@ import static org.junit.Assert.assertTrue;
*/
public abstract class AbstractArrangementRuleEditingModelTest {
@NotNull protected ArrangementRuleEditingModelBuilder myBuilder;
@NotNull protected JTree myTree;
@NotNull protected DefaultMutableTreeNode myRoot;
@NotNull protected TIntObjectHashMap<ArrangementRuleEditingModel> myRowMappings;
@NotNull protected JavaRearranger myGrouper;
@NotNull protected ArrangementRuleEditingModelBuilder myBuilder;
@NotNull protected JTree myTree;
@NotNull protected DefaultMutableTreeNode myRoot;
@NotNull protected TIntObjectHashMap<ArrangementRuleEditingModelImpl> myRowMappings;
@NotNull protected JavaRearranger myGrouper;
@Before
public void setUp() {
@@ -51,7 +51,7 @@ public abstract class AbstractArrangementRuleEditingModelTest {
myRoot = new DefaultMutableTreeNode();
myTree = new Tree(myRoot);
myTree.expandPath(new TreePath(myRoot));
myRowMappings = new TIntObjectHashMap<ArrangementRuleEditingModel>();
myRowMappings = new TIntObjectHashMap<ArrangementRuleEditingModelImpl>();
myGrouper = new JavaRearranger();
}
@@ -73,7 +73,7 @@ public abstract class AbstractArrangementRuleEditingModelTest {
return new ArrangementSettingsAtomNode(type, condition);
}
protected void checkRows(int ... rows) {
protected void checkRows(int... rows) {
for (int row : rows) {
assertTrue(
String.format("Expected to find mappings for rows %s. Actual: %s", Arrays.toString(rows), Arrays.toString(myRowMappings.keys())),
@@ -15,7 +15,9 @@
*/
package com.intellij.application.options.codeStyle.arrangement;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingsNode;
import gnu.trove.TObjectProcedure;
import org.junit.Test;
import javax.swing.tree.DefaultMutableTreeNode;
@@ -164,5 +166,26 @@ public class ArrangementRuleEditingModelImplTest extends AbstractArrangementRule
DefaultMutableTreeNode staticNode = (DefaultMutableTreeNode)layeredFieldNode.getFirstChild();
assertNotNull(staticNode);
assertEquals(atom(STATIC), staticNode.getUserObject());
//checkTreeNodesConsistency();
}
private void checkTreeNodesConsistency() {
final Ref<DefaultMutableTreeNode> rootRef = new Ref<DefaultMutableTreeNode>();
myRowMappings.forEachValue(new TObjectProcedure<ArrangementRuleEditingModelImpl>() {
@Override
public boolean execute(ArrangementRuleEditingModelImpl model) {
DefaultMutableTreeNode root = ArrangementConfigUtil.getRoot(model.getTopMost());
assertSame(root, ArrangementConfigUtil.getRoot(model.getBottomMost()));
if (rootRef.get() == null) {
rootRef.set(root);
}
else {
assertSame(rootRef.get(), root);
}
return true;
}
});
}
}
@@ -343,10 +343,7 @@ public class ArrangementConfigUtil {
* @param node reference to the target hierarchy
*/
private static void markRows(@NotNull DefaultMutableTreeNode node) {
DefaultMutableTreeNode root = node;
for (TreeNode n = root; n != null; n = n.getParent()) {
root = (DefaultMutableTreeNode)n;
}
DefaultMutableTreeNode root = getRoot(node);
int row = 0;
Stack<DefaultMutableTreeNode> nodes = new Stack<DefaultMutableTreeNode>();
nodes.push(root);
@@ -359,6 +356,15 @@ public class ArrangementConfigUtil {
}
}
@NotNull
public static DefaultMutableTreeNode getRoot(DefaultMutableTreeNode node) {
DefaultMutableTreeNode root = node;
for (TreeNode n = root; n != null; n = n.getParent()) {
root = (DefaultMutableTreeNode)n;
}
return root;
}
/**
* Processes hierarchy denoted by the given node assuming that every node there contains information about its initial row
* (see {@link #markRows(DefaultMutableTreeNode)}).
@@ -371,10 +377,7 @@ public class ArrangementConfigUtil {
@NotNull
private static TIntIntHashMap collectRowChangesAndUnmark(@NotNull DefaultMutableTreeNode node) {
@NotNull TIntIntHashMap changes = new TIntIntHashMap();
DefaultMutableTreeNode root = node;
for (TreeNode n = root; n != null; n = n.getParent()) {
root = (DefaultMutableTreeNode)n;
}
DefaultMutableTreeNode root = getRoot(node);
int row = 0;
Stack<DefaultMutableTreeNode> nodes = new Stack<DefaultMutableTreeNode>();
nodes.push(root);
@@ -403,10 +406,7 @@ public class ArrangementConfigUtil {
* @return given node's row at the nodes hierarchy (0-based)
*/
public static int getRow(@NotNull DefaultMutableTreeNode node) {
DefaultMutableTreeNode root = node;
for (TreeNode n = root; n != null; n = n.getParent()) {
root = (DefaultMutableTreeNode)n;
}
DefaultMutableTreeNode root = getRoot(node);
int row = 0;
Stack<DefaultMutableTreeNode> nodes = new Stack<DefaultMutableTreeNode>();
nodes.push(root);
@@ -70,7 +70,7 @@ public class ArrangementRuleEditingModelBuilder {
@NotNull JTree tree,
@NotNull DefaultMutableTreeNode root,
@NotNull ArrangementSettingsGrouper grouper,
@NotNull TIntObjectHashMap<ArrangementRuleEditingModel> rowMappings)
@NotNull TIntObjectHashMap<ArrangementRuleEditingModelImpl> rowMappings)
{
int initialInsertRow = 0;
@@ -40,8 +40,8 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
@NotNull private final Set<Listener> myListeners = new HashSet<Listener>();
@NotNull private final Set<Object> myConditions = new HashSet<Object>();
@NotNull private final TIntObjectHashMap<ArrangementRuleEditingModel> myRowMappings;
@NotNull private final ArrangementSettingsGrouper myGrouper;
@NotNull private final TIntObjectHashMap<ArrangementRuleEditingModelImpl> myRowMappings;
@NotNull private final ArrangementSettingsGrouper myGrouper;
@NotNull private DefaultMutableTreeNode myTopMost;
@NotNull private DefaultMutableTreeNode myBottomMost;
@@ -64,7 +64,7 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
@NotNull DefaultMutableTreeNode topMost,
@NotNull DefaultMutableTreeNode bottomMost,
@NotNull ArrangementSettingsGrouper grouper,
@NotNull TIntObjectHashMap<ArrangementRuleEditingModel> mappings,
@NotNull TIntObjectHashMap<ArrangementRuleEditingModelImpl> mappings,
int row)
{
mySettingsNode = node;
@@ -93,11 +93,40 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
return mySettingsNode;
}
@NotNull
public DefaultMutableTreeNode getTopMost() {
return myTopMost;
}
@NotNull
public DefaultMutableTreeNode getBottomMost() {
return myBottomMost;
}
@Override
public boolean hasCondition(@NotNull Object key) {
return myConditions.contains(key);
}
/**
* There is a possible case that tree nodes referenced by the current model become out of date due to a tree modification.
* <p/>
* This method asks the model to refresh its tree nodes if necessary.
*/
public void refreshTreeNodes() {
for (DefaultMutableTreeNode node = myBottomMost; node != null; node = (DefaultMutableTreeNode)node.getParent()) {
if (node == myTopMost) {
// No refresh is necessary.
return;
}
else if (mySettingsNode.equals(node.getUserObject())) {
myTopMost = node;
return;
}
}
assert false;
}
@Override
public void addAndCondition(@NotNull ArrangementSettingsAtomNode node) {
doAddAndCondition(node);
@@ -181,12 +210,12 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
return;
}
final TIntObjectHashMap<ArrangementRuleEditingModel> newMappings = new TIntObjectHashMap<ArrangementRuleEditingModel>();
final TIntObjectHashMap<ArrangementRuleEditingModelImpl> newMappings = new TIntObjectHashMap<ArrangementRuleEditingModelImpl>();
// Update model mappings.
myRowMappings.forEachEntry(new TIntObjectProcedure<ArrangementRuleEditingModel>() {
myRowMappings.forEachEntry(new TIntObjectProcedure<ArrangementRuleEditingModelImpl>() {
@Override
public boolean execute(int row, ArrangementRuleEditingModel model) {
public boolean execute(int row, ArrangementRuleEditingModelImpl model) {
if (row == myRow) {
return true;
}
@@ -196,6 +225,7 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
else {
newMappings.put(row, model);
}
model.refreshTreeNodes();
return true;
}
});
@@ -203,9 +233,9 @@ public class ArrangementRuleEditingModelImpl implements ArrangementRuleEditingMo
newMappings.put(myRow, this);
myRowMappings.clear();
newMappings.forEachEntry(new TIntObjectProcedure<ArrangementRuleEditingModel>() {
newMappings.forEachEntry(new TIntObjectProcedure<ArrangementRuleEditingModelImpl>() {
@Override
public boolean execute(int row, ArrangementRuleEditingModel model) {
public boolean execute(int row, ArrangementRuleEditingModelImpl model) {
myRowMappings.put(row, model);
return true;
}
@@ -54,8 +54,8 @@ public class ArrangementRuleTree {
@NotNull private final TIntObjectHashMap<ArrangementNodeComponent> myRenderers =
new TIntObjectHashMap<ArrangementNodeComponent>();
@NotNull private final TIntObjectHashMap<ArrangementRuleEditingModel> myModels =
new TIntObjectHashMap<ArrangementRuleEditingModel>();
@NotNull private final TIntObjectHashMap<ArrangementRuleEditingModelImpl> myModels =
new TIntObjectHashMap<ArrangementRuleEditingModelImpl>();
@NotNull private final DefaultTreeModel myTreeModel;
@NotNull private final Tree myTree;
@@ -176,9 +176,9 @@ public class ArrangementRuleTree {
for (ArrangementSettingsNode setting : settings) {
builder.build(setting, myTree, root, grouper, myModels);
}
myModels.forEachValue(new TObjectProcedure<ArrangementRuleEditingModel>() {
myModels.forEachValue(new TObjectProcedure<ArrangementRuleEditingModelImpl>() {
@Override
public boolean execute(ArrangementRuleEditingModel model) {
public boolean execute(ArrangementRuleEditingModelImpl model) {
model.addListener(myModelChangeListener);
return true;
}