/******************************************************************************* * Copyright (c) 2007, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.xsd.ui.internal.commands; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.wst.xsd.ui.internal.actions.MoveXSDAttributeAction; import org.eclipse.wst.xsd.ui.internal.adapters.XSDAttributeDeclarationAdapter; import org.eclipse.wst.xsd.ui.internal.adapters.XSDWildcardAdapter; import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.BaseFieldEditPart; import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.CompartmentEditPart; import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.ComplexTypeEditPart; import org.eclipse.wst.xsd.ui.internal.design.editparts.AttributeGroupDefinitionEditPart; import org.eclipse.wst.xsd.ui.internal.design.editparts.TargetConnectionSpacingFigureEditPart; import org.eclipse.wst.xsd.ui.internal.design.editparts.XSDAttributesForAnnotationEditPart; import org.eclipse.wst.xsd.ui.internal.design.editparts.XSDBaseFieldEditPart; import org.eclipse.wst.xsd.ui.internal.design.figures.GenericGroupFigure; import org.eclipse.wst.xsd.ui.internal.editor.Messages; import org.eclipse.xsd.XSDAttributeDeclaration; import org.eclipse.xsd.XSDConcreteComponent; import org.eclipse.xsd.XSDWildcard; import org.w3c.dom.Element; public class XSDAttributeDragAndDropCommand extends BaseDragAndDropCommand { public XSDAttributeDragAndDropCommand(EditPartViewer viewer, ChangeBoundsRequest request, GraphicalEditPart target, XSDBaseFieldEditPart itemToDrag, Point location) { super(viewer, request); setLabel(Messages._UI_ACTION_DRAG_DROP_ATTRIBUTE); this.target = target; this.itemToDrag = itemToDrag; this.location = location; setup(); } public XSDAttributeDragAndDropCommand(XSDBaseFieldEditPart itemToDrag, XSDBaseFieldEditPart leftField, XSDBaseFieldEditPart rightField, int direction) { super(itemToDrag.getViewer(), null); setLabel(Messages._UI_ACTION_DRAG_DROP_ATTRIBUTE); this.itemToDrag = itemToDrag; canExecute = false; handleKeyboardDragAndDrop(leftField, rightField, direction); } protected void handleKeyboardDragAndDrop(XSDBaseFieldEditPart leftField, XSDBaseFieldEditPart rightField, int direction) { super.handleKeyboardDragAndDrop(leftField, rightField, direction); if (direction == PositionConstants.NORTH) { if (target == null) { target = rightField; this.location = target.getFigure().getBounds().getTop(); } else if (!(leftField.getModel() instanceof XSDAttributeDeclarationAdapter) || leftField.getModel() instanceof XSDWildcardAdapter) { target = rightField; this.location = target.getFigure().getBounds().getTop(); } } if (location == null) return; setup(); } protected void setup() { canExecute = false; // Drop target is attribute group ref if (target instanceof AttributeGroupDefinitionEditPart) { parentEditPart = (AttributeGroupDefinitionEditPart) target; if (((GenericGroupFigure) parentEditPart.getFigure()).getIconFigure().getBounds().contains(location)) { xsdComponentToDrag = (XSDConcreteComponent) ((XSDAttributeDeclarationAdapter) itemToDrag.getModel()).getTarget(); action = new MoveXSDAttributeAction(((AttributeGroupDefinitionEditPart) parentEditPart).getXSDAttributeGroupDefinition(), xsdComponentToDrag, null, null); canExecute = action.canMove(); } } else if (target instanceof BaseFieldEditPart) { targetSpacesList = new ArrayList(); // Calculate the list of all sibling field edit parts; List targetEditPartSiblings = calculateFieldEditParts(); calculateAttributeGroupList(); // Get 'left' and 'right' siblings doDrop(targetEditPartSiblings, itemToDrag); } } /* * (non-Javadoc) * @see org.eclipse.wst.xsd.ui.internal.commands.BaseDragAndDropCommand#getElement() */ protected Element getElement() { XSDAttributeDeclarationAdapter adapter = (XSDAttributeDeclarationAdapter) itemToDrag.getModel(); XSDAttributeDeclaration target = (XSDAttributeDeclaration)adapter.getTarget(); XSDConcreteComponent parent = (XSDConcreteComponent)target.eContainer(); return parent.getElement(); } protected void doDrop(List siblings, GraphicalEditPart movingEditPart) { commonSetup(siblings, movingEditPart); if ((previousRefComponent instanceof XSDAttributeDeclaration || previousRefComponent instanceof XSDWildcard) && (nextRefComponent instanceof XSDAttributeDeclaration || nextRefComponent instanceof XSDWildcard)) { XSDConcreteComponent parent = previousRefComponent.getContainer().getContainer(); if (closerSibling == BELOW_IS_CLOSER) { parent = nextRefComponent.getContainer().getContainer(); } action = new MoveXSDAttributeAction(parent, xsdComponentToDrag, previousRefComponent, nextRefComponent); } else if (previousRefComponent == null && (nextRefComponent instanceof XSDAttributeDeclaration || nextRefComponent instanceof XSDWildcard)) { XSDConcreteComponent parent = nextRefComponent.getContainer().getContainer(); if (closerSibling == ABOVE_IS_CLOSER) { if (leftSiblingEditPart == null) { action = new MoveXSDAttributeAction(parent, xsdComponentToDrag, previousRefComponent, nextRefComponent); } else if (parentEditPart != null) { action = new MoveXSDAttributeAction(parentEditPart.getXSDConcreteComponent(), xsdComponentToDrag, previousRefComponent, nextRefComponent); } } else { action = new MoveXSDAttributeAction(parent, xsdComponentToDrag, previousRefComponent, nextRefComponent); } } else if (previousRefComponent instanceof XSDAttributeDeclaration && nextRefComponent == null) { XSDConcreteComponent parent = previousRefComponent.getContainer().getContainer(); if (closerSibling == ABOVE_IS_CLOSER) { action = new MoveXSDAttributeAction(parent, xsdComponentToDrag, previousRefComponent, nextRefComponent); } else { if (rightSiblingEditPart == null) { action = new MoveXSDAttributeAction(parent, xsdComponentToDrag, previousRefComponent, nextRefComponent); } else { action = new MoveXSDAttributeAction(parent, xsdComponentToDrag, previousRefComponent, nextRefComponent); } } } if (action != null) canExecute = action.canMove(); } // Attribute Group related helper method protected void calculateAttributeGroupList() { EditPart editPart = target; while (editPart != null) { if (editPart instanceof ComplexTypeEditPart) { List list = editPart.getChildren(); for (Iterator i = list.iterator(); i.hasNext();) { Object child = i.next(); if (child instanceof CompartmentEditPart) { List compartmentList = ((CompartmentEditPart) child).getChildren(); for (Iterator it = compartmentList.iterator(); it.hasNext();) { Object obj = it.next(); if (obj instanceof XSDAttributesForAnnotationEditPart) { XSDAttributesForAnnotationEditPart groups = (XSDAttributesForAnnotationEditPart) obj; List groupList = groups.getChildren(); for (Iterator iter = groupList.iterator(); iter.hasNext();) { Object groupChild = iter.next(); if (groupChild instanceof TargetConnectionSpacingFigureEditPart) { targetSpacesList.add(groupChild); } else if (groupChild instanceof AttributeGroupDefinitionEditPart) { getAttributeGroupEditParts((AttributeGroupDefinitionEditPart) groupChild); } } } } } } } editPart = editPart.getParent(); } } // Attribute Group related helper method protected List getAttributeGroupEditParts(AttributeGroupDefinitionEditPart attributeGroupEditPart) { List groupList = new ArrayList(); List list = attributeGroupEditPart.getChildren(); for (Iterator i = list.iterator(); i.hasNext();) { Object object = i.next(); if (object instanceof TargetConnectionSpacingFigureEditPart) { targetSpacesList.add(object); } else if (object instanceof AttributeGroupDefinitionEditPart) { AttributeGroupDefinitionEditPart groupRef = (AttributeGroupDefinitionEditPart) object; List groupRefChildren = groupRef.getChildren(); for (Iterator it = groupRefChildren.iterator(); it.hasNext();) { Object o = it.next(); if (o instanceof TargetConnectionSpacingFigureEditPart) { targetSpacesList.add(o); } else if (o instanceof AttributeGroupDefinitionEditPart) { AttributeGroupDefinitionEditPart aGroup = (AttributeGroupDefinitionEditPart) o; groupList.add(aGroup); groupList.addAll(getAttributeGroupEditParts(aGroup)); } } } } return groupList; } }