This commit is contained in:
Alexander Lobas
2012-04-16 18:46:36 +04:00
parent fefac72660
commit eca2163961
8 changed files with 76 additions and 59 deletions
@@ -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);
}
}
@@ -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);
}
@@ -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);
}
@@ -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);
}
@@ -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());
}
@@ -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
}
@@ -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;
}
@@ -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<RadComponent> 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<RadComponent> 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;
}