From eca2163961ca281244fd2ce33b4c8e54669940fc Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Mon, 16 Apr 2012 18:46:36 +0400 Subject: [PATCH] Tree --- .../designSurface/TreeDropToOperation.java | 3 +- .../model/RadSingleChildrenViewLayout.java | 6 +- .../model/layout/RadAbsoluteLayout.java | 6 +- .../designer/model/layout/RadFrameLayout.java | 6 +- .../model/layout/RadLinearLayout.java | 6 +- .../designer/model/table/RadTableLayout.java | 6 +- .../viewAnimator/RadViewAnimatorLayout.java | 7 +- .../componentTree/TreeEditOperation.java | 95 +++++++++---------- 8 files changed, 76 insertions(+), 59 deletions(-) diff --git a/plugins/android-designer/src/com/intellij/android/designer/designSurface/TreeDropToOperation.java b/plugins/android-designer/src/com/intellij/android/designer/designSurface/TreeDropToOperation.java index 56b2dcdbbbfb..69c8282c6763 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/designSurface/TreeDropToOperation.java +++ b/plugins/android-designer/src/com/intellij/android/designer/designSurface/TreeDropToOperation.java @@ -19,6 +19,7 @@ import com.intellij.android.designer.model.RadViewComponent; import com.intellij.designer.componentTree.TreeEditOperation; import com.intellij.designer.designSurface.OperationContext; import com.intellij.designer.model.RadComponent; +import org.jetbrains.annotations.Nullable; /** * @author Alexander Lobas @@ -29,7 +30,7 @@ public class TreeDropToOperation extends TreeEditOperation { } @Override - protected void execute(RadComponent insertBefore) throws Exception { + protected void execute(@Nullable RadComponent insertBefore) throws Exception { AbstractEditOperation.execute(myContext, (RadViewComponent)myContainer, myComponents, (RadViewComponent)insertBefore); } } \ No newline at end of file diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/RadSingleChildrenViewLayout.java b/plugins/android-designer/src/com/intellij/android/designer/model/RadSingleChildrenViewLayout.java index 700944062ca8..9d004a1e40b3 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/RadSingleChildrenViewLayout.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/RadSingleChildrenViewLayout.java @@ -17,6 +17,7 @@ package com.intellij.android.designer.model; import com.intellij.android.designer.designSurface.DropToOperation; import com.intellij.android.designer.designSurface.TreeDropToOperation; +import com.intellij.designer.componentTree.TreeEditOperation; import com.intellij.designer.designSurface.EditOperation; import com.intellij.designer.designSurface.OperationContext; @@ -30,7 +31,10 @@ public class RadSingleChildrenViewLayout extends RadViewLayout { (context.isCreate() || context.isPaste() || context.isAdd()) && context.getComponents().size() == 1) { if (context.isTree()) { - return new TreeDropToOperation(myContainer, context); + if (TreeEditOperation.isTarget(myContainer, context)) { + return new TreeDropToOperation(myContainer, context); + } + return null; } return new DropToOperation(myContainer, context); } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadAbsoluteLayout.java b/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadAbsoluteLayout.java index e3dab18fc3c9..bea6245f5eac 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadAbsoluteLayout.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadAbsoluteLayout.java @@ -19,6 +19,7 @@ import com.intellij.android.designer.designSurface.TreeDropToOperation; import com.intellij.android.designer.designSurface.layout.AbsoluteLayoutOperation; import com.intellij.android.designer.designSurface.layout.ResizeOperation; import com.intellij.android.designer.model.RadViewLayoutWithData; +import com.intellij.designer.componentTree.TreeEditOperation; import com.intellij.designer.designSurface.ComponentDecorator; import com.intellij.designer.designSurface.EditOperation; import com.intellij.designer.designSurface.OperationContext; @@ -47,7 +48,10 @@ public class RadAbsoluteLayout extends RadViewLayoutWithData { public EditOperation processChildOperation(OperationContext context) { if (context.isCreate() || context.isPaste() || context.isAdd() || context.isMove()) { if (context.isTree()) { - return new TreeDropToOperation(myContainer, context); + if (TreeEditOperation.isTarget(myContainer, context)) { + return new TreeDropToOperation(myContainer, context); + } + return null; } return new AbsoluteLayoutOperation(myContainer, context); } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadFrameLayout.java b/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadFrameLayout.java index 1569560bac0c..437541f69692 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadFrameLayout.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadFrameLayout.java @@ -22,6 +22,7 @@ import com.intellij.android.designer.designSurface.layout.ResizeOperation; import com.intellij.android.designer.model.RadViewComponent; import com.intellij.android.designer.model.RadViewLayoutWithData; import com.intellij.designer.actions.AbstractComboBoxAction; +import com.intellij.designer.componentTree.TreeEditOperation; import com.intellij.designer.designSurface.ComponentDecorator; import com.intellij.designer.designSurface.DesignerEditorPanel; import com.intellij.designer.designSurface.EditOperation; @@ -61,7 +62,10 @@ public class RadFrameLayout extends RadViewLayoutWithData { public EditOperation processChildOperation(OperationContext context) { if (context.isCreate() || context.isPaste() || context.isAdd() || context.isMove()) { if (context.isTree()) { - return new TreeDropToOperation(myContainer, context); + if (TreeEditOperation.isTarget(myContainer, context)) { + return new TreeDropToOperation(myContainer, context); + } + return null; } return new FrameLayoutOperation(myContainer, context); } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadLinearLayout.java b/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadLinearLayout.java index b657bd4005da..212f0811e818 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadLinearLayout.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/layout/RadLinearLayout.java @@ -20,6 +20,7 @@ import com.intellij.android.designer.designSurface.layout.*; import com.intellij.android.designer.model.RadViewComponent; import com.intellij.android.designer.model.RadViewLayoutWithData; import com.intellij.designer.actions.AbstractComboBoxAction; +import com.intellij.designer.componentTree.TreeEditOperation; import com.intellij.designer.designSurface.*; import com.intellij.designer.designSurface.selection.DirectionResizePoint; import com.intellij.designer.designSurface.selection.ResizePoint; @@ -69,7 +70,10 @@ public class RadLinearLayout extends RadViewLayoutWithData implements ILayoutDec public EditOperation processChildOperation(OperationContext context) { if (context.isCreate() || context.isPaste() || context.isAdd() || context.isMove()) { if (context.isTree()) { - return new TreeDropToOperation(myContainer, context); + if (TreeEditOperation.isTarget(myContainer, context)) { + return new TreeDropToOperation(myContainer, context); + } + return null; } return new LinearLayoutOperation(myContainer, context, isHorizontal()); } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/table/RadTableLayout.java b/plugins/android-designer/src/com/intellij/android/designer/model/table/RadTableLayout.java index ace7915df4c7..6d4859a5f237 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/table/RadTableLayout.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/table/RadTableLayout.java @@ -22,6 +22,7 @@ import com.intellij.android.designer.designSurface.layout.TableLayoutDecorator; import com.intellij.android.designer.model.RadViewComponent; import com.intellij.android.designer.model.RadViewLayout; import com.intellij.android.designer.model.RadViewLayoutWithData; +import com.intellij.designer.componentTree.TreeEditOperation; import com.intellij.designer.designSurface.*; import com.intellij.designer.designSurface.selection.ResizeSelectionDecorator; import com.intellij.designer.model.RadComponent; @@ -54,7 +55,10 @@ public class RadTableLayout extends RadViewLayoutWithData implements ILayoutDeco public EditOperation processChildOperation(OperationContext context) { if (context.isCreate() || context.isPaste() || context.isAdd() || context.isMove()) { if (context.isTree()) { - return new TreeDropToOperation(myContainer, context); + if (TreeEditOperation.isTarget(myContainer, context)) { + return new TreeDropToOperation(myContainer, context); + } + return null; } // XXX } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/viewAnimator/RadViewAnimatorLayout.java b/plugins/android-designer/src/com/intellij/android/designer/model/viewAnimator/RadViewAnimatorLayout.java index 76460653c8bc..c333c2157112 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/viewAnimator/RadViewAnimatorLayout.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/viewAnimator/RadViewAnimatorLayout.java @@ -18,6 +18,7 @@ package com.intellij.android.designer.model.viewAnimator; import com.intellij.android.designer.designSurface.DropToOperation; import com.intellij.android.designer.designSurface.TreeDropToOperation; import com.intellij.android.designer.model.RadViewLayout; +import com.intellij.designer.componentTree.TreeEditOperation; import com.intellij.designer.designSurface.EditOperation; import com.intellij.designer.designSurface.OperationContext; @@ -28,11 +29,13 @@ public class RadViewAnimatorLayout extends RadViewLayout { public EditOperation processChildOperation(OperationContext context) { if ((context.isCreate() || context.isPaste() || context.isAdd() || context.isMove()) && checkChildOperation(context)) { if (context.isTree()) { - return new TreeDropToOperation(myContainer, context); + if (TreeEditOperation.isTarget(myContainer, context)) { + return new TreeDropToOperation(myContainer, context); + } + return null; } return new DropToOperation(myContainer, context); } - return null; } diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditOperation.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditOperation.java index 39085733be1d..9bc36e53acd8 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditOperation.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditOperation.java @@ -22,11 +22,19 @@ import com.intellij.designer.model.RadComponent; import org.jetbrains.annotations.Nullable; import java.awt.*; +import java.util.List; /** * @author Alexander Lobas */ public abstract class TreeEditOperation extends AbstractEditOperation { + private RadComponent myTarget; + private boolean myInsertBefore; + + public TreeEditOperation(RadComponent container, OperationContext context) { + super(container, context); + } + public static boolean isTarget(RadComponent container, OperationContext context) { Point location = context.getLocation(); RadComponent target = context.getArea().findTarget(location.x, location.y, null); @@ -38,25 +46,22 @@ public abstract class TreeEditOperation extends AbstractEditOperation { return true; } - public TreeEditOperation(RadComponent container, OperationContext context) { - super(container, context); - } - @Override public void showFeedback() { Point location = myContext.getLocation(); - RadComponent target = myContext.getArea().findTarget(location.x, location.y, null); FeedbackTreeLayer layer = myContext.getArea().getFeedbackTreeLayer(); - if (myContainer == target) { - layer.mark(target, FeedbackTreeLayer.INSERT_SELECTION); + myTarget = myContext.getArea().findTarget(location.x, location.y, null); + + if (myContainer == myTarget) { + layer.mark(myTarget, FeedbackTreeLayer.INSERT_SELECTION); } - else if (target != null && isChildren(target)) { - layer.mark(target, - layer.isBeforeLocation(target, location.x, location.y) ? - FeedbackTreeLayer.INSERT_BEFORE : FeedbackTreeLayer.INSERT_AFTER); + else if (myTarget != null && isChildren(myTarget)) { + myInsertBefore = layer.isBeforeLocation(myTarget, location.x, location.y); + layer.mark(myTarget, myInsertBefore ? FeedbackTreeLayer.INSERT_BEFORE : FeedbackTreeLayer.INSERT_AFTER); } else { + myTarget = null; eraseFeedback(); } } @@ -77,54 +82,42 @@ public abstract class TreeEditOperation extends AbstractEditOperation { @Override public boolean canExecute() { - RadComponent reference = getReference(); - if (reference == null) { + if (myTarget == null) { return false; } - return canExecute(myContainer == reference ? null : reference); - } + if (myContext.isMove() && myTarget != myContainer) { + if (myComponents.contains(myTarget)) { + return false; + } - protected boolean canExecute(RadComponent insertBefore) { + List children = myContainer.getChildren(); + int index = children.indexOf(myTarget) + (myInsertBefore ? -1 : 1); + if (0 <= index && index < children.size()) { + return !myComponents.contains(children.get(index)); + } + } return true; } @Override public void execute() throws Exception { - RadComponent reference = getReference(); - execute(myContainer == reference ? null : reference); + if (myTarget == myContainer) { + execute(null); + } + else if (myInsertBefore) { + execute(myTarget); + } + else { + List children = myContainer.getChildren(); + int index = children.indexOf(myTarget) + 1; + if (index < children.size()) { + execute(children.get(index)); + } + else { + execute(null); + } + } } - protected abstract void execute(RadComponent insertBefore) throws Exception; - - @Nullable - private RadComponent getReference() { - Point location = myContext.getLocation(); - RadComponent target = myContext.getArea().findTarget(location.x, location.y, null); - - if (myContainer == target) { - return myContainer; - } - if (target != null) { - Object[] children = myContainer.getTreeChildren(); - int index = -1; - - for (int i = 0; i < children.length; i++) { - if (children[i] == target) { - index = i + 1; - break; - } - } - if (index == -1) { - return null; - } - if (myContext.getArea().getFeedbackTreeLayer().isBeforeLocation(target, location.x, location.y)) { - return target; - } - if (index < children.length) { - return (RadComponent)children[index]; - } - return myContainer; - } - return null; - } + protected abstract void execute(@Nullable RadComponent insertBefore) throws Exception; } \ No newline at end of file