| /******************************************************************************* |
| * Copyright (c) 2001, 2007 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.design.editparts; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.draw2d.Figure; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.PositionConstants; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPartFactory; |
| import org.eclipse.gef.EditPolicy; |
| import org.eclipse.gef.GraphicalEditPart; |
| import org.eclipse.gef.LayerConstants; |
| import org.eclipse.wst.xsd.ui.internal.adapters.XSDBaseAdapter; |
| import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.BaseEditPart; |
| 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.editpolicies.ADTSelectionFeedbackEditPolicy; |
| import org.eclipse.wst.xsd.ui.internal.adt.design.editpolicies.KeyBoardAccessibilityEditPolicy; |
| import org.eclipse.wst.xsd.ui.internal.design.figures.CenteredIconFigure; |
| import org.eclipse.wst.xsd.ui.internal.design.figures.GenericGroupFigure; |
| import org.eclipse.wst.xsd.ui.internal.design.figures.IExtendedFigureFactory; |
| import org.eclipse.xsd.XSDConcreteComponent; |
| |
| public abstract class ConnectableEditPart extends BaseEditPart |
| { |
| protected ArrayList connectionFigures = new ArrayList(); |
| |
| public IExtendedFigureFactory getExtendedFigureFactory() |
| { |
| EditPartFactory factory = getViewer().getEditPartFactory(); |
| Assert.isTrue(factory instanceof IExtendedFigureFactory, "EditPartFactory must be an instanceof of IExtendedFigureFactory"); //$NON-NLS-1$ |
| return (IExtendedFigureFactory)factory; |
| } |
| |
| public ConnectableEditPart() |
| { |
| super(); |
| } |
| |
| protected IFigure createFigure() |
| { |
| GenericGroupFigure figure = new GenericGroupFigure(); |
| return figure; |
| } |
| |
| public XSDConcreteComponent getXSDConcreteComponent() |
| { |
| return (XSDConcreteComponent)((XSDBaseAdapter)getModel()).getTarget(); |
| } |
| |
| public List getConnectionFigures() |
| { |
| return connectionFigures; |
| } |
| |
| public abstract ReferenceConnection createConnectionFigure(BaseEditPart child); |
| |
| public void activate() |
| { |
| super.activate(); |
| activateConnection(); |
| } |
| |
| protected void activateConnection() |
| { |
| if (connectionFigures == null) |
| { |
| connectionFigures = new ArrayList(); |
| } |
| for (Iterator i = getChildren().iterator(); i.hasNext();) |
| { |
| Object o = i.next(); |
| if (o instanceof BaseEditPart) |
| { |
| BaseEditPart g = (BaseEditPart) o; |
| ReferenceConnection figure = createConnectionFigure(g); |
| connectionFigures.add(figure); |
| figure.setPoints(figure.getPoints()); |
| |
| getLayer(LayerConstants.CONNECTION_LAYER).add(figure); |
| } |
| } |
| } |
| |
| public void deactivate() |
| { |
| super.deactivate(); |
| deactivateConnection(); |
| } |
| |
| protected void deactivateConnection() |
| { |
| // if we have a connection, remove it |
| ReferenceConnection connectionFigure; |
| if (connectionFigures != null && !connectionFigures.isEmpty()) |
| { |
| for (Iterator i = connectionFigures.iterator(); i.hasNext();) |
| { |
| connectionFigure = (ReferenceConnection) i.next(); |
| |
| if (getLayer(LayerConstants.CONNECTION_LAYER).getChildren().contains(connectionFigure)) |
| { |
| getLayer(LayerConstants.CONNECTION_LAYER).remove(connectionFigure); |
| } |
| } |
| connectionFigures = null; |
| } |
| } |
| |
| public void refresh() |
| { |
| super.refresh(); |
| refreshConnection(); |
| } |
| |
| protected void refreshConnection() |
| { |
| if (!isActive()) |
| return; |
| |
| if (connectionFigures == null || connectionFigures.isEmpty()) |
| { |
| activateConnection(); |
| } |
| else |
| { |
| deactivateConnection(); |
| activateConnection(); |
| } |
| } |
| |
| public void addFeedback() |
| { |
| ReferenceConnection connectionFigure; |
| if (connectionFigures != null && !connectionFigures.isEmpty()) |
| { |
| for (Iterator i = connectionFigures.iterator(); i.hasNext();) |
| { |
| connectionFigure = (ReferenceConnection) i.next(); |
| connectionFigure.setHighlight(true); |
| } |
| } |
| GenericGroupFigure figure = (GenericGroupFigure)getFigure(); |
| figure.getIconFigure().setMode(CenteredIconFigure.SELECTED); |
| figure.getIconFigure().refresh(); |
| } |
| |
| public void removeFeedback() |
| { |
| ReferenceConnection connectionFigure; |
| if (connectionFigures != null && !connectionFigures.isEmpty()) |
| { |
| for (Iterator i = connectionFigures.iterator(); i.hasNext();) |
| { |
| connectionFigure = (ReferenceConnection) i.next(); |
| connectionFigure.setHighlight(false); |
| } |
| } |
| GenericGroupFigure figure = (GenericGroupFigure)getFigure(); |
| figure.getIconFigure().setMode(CenteredIconFigure.NORMAL); |
| figure.getIconFigure().refresh(); |
| } |
| |
| protected void refreshVisuals() |
| { |
| super.refreshVisuals(); |
| GenericGroupFigure figure = (GenericGroupFigure)getFigure(); |
| figure.getIconFigure().refresh(); |
| } |
| |
| protected void createEditPolicies() |
| { |
| super.createEditPolicies(); |
| installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ADTSelectionFeedbackEditPolicy()); |
| } |
| |
| protected void addChildVisual(EditPart childEditPart, int index) |
| { |
| IFigure child = ((GraphicalEditPart) childEditPart).getFigure(); |
| getContentPane().add(child, index); |
| } |
| |
| protected void removeChildVisual(EditPart childEditPart) |
| { |
| IFigure child = ((GraphicalEditPart) childEditPart).getFigure(); |
| getContentPane().remove(child); |
| } |
| |
| public IFigure getContentPane() |
| { |
| return ((GenericGroupFigure)getFigure()).getContentFigure(); |
| } |
| |
| public Figure getTargetFigure() |
| { |
| return ((GenericGroupFigure)getFigure()).getTargetFigure(); |
| } |
| |
| public EditPart doGetRelativeEditPart(EditPart editPart, int direction) |
| { |
| EditPart result = null; |
| if (direction == PositionConstants.WEST) |
| { |
| if (getParent() instanceof ConnectableEditPart) |
| { |
| result = getParent(); |
| } |
| else |
| { |
| result = this; |
| } |
| } |
| else if (direction == PositionConstants.EAST) |
| { |
| result = (EditPart) editPart.getChildren().get(0); |
| TargetConnectionSpacingFigureEditPart target = null; |
| boolean foundSelectableGroup = false; |
| for (Iterator i = editPart.getChildren().iterator(); i.hasNext(); ) |
| { |
| EditPart child = (EditPart)i.next(); |
| if (!(child instanceof TargetConnectionSpacingFigureEditPart)) |
| { |
| foundSelectableGroup = true; |
| result = child; |
| break; |
| } |
| } |
| if (result instanceof TargetConnectionSpacingFigureEditPart) |
| { |
| target = (TargetConnectionSpacingFigureEditPart) result; |
| } |
| if (!foundSelectableGroup && target != null) |
| { |
| EditPart parent = editPart.getParent(); |
| while (!(parent instanceof CompartmentEditPart)) |
| { |
| parent = parent.getParent(); |
| if (parent == null) break; |
| } |
| for (Iterator i = parent.getChildren().iterator(); i.hasNext(); ) |
| { |
| EditPart child = (EditPart) i.next(); |
| if (child instanceof BaseFieldEditPart && !(child instanceof SpaceFillerForFieldEditPart)) |
| { |
| BaseFieldEditPart field = (BaseFieldEditPart) child; |
| if (field.getFigure().getBounds().getCenter().y < target.getFigure().getBounds().bottom() && |
| field.getFigure().getBounds().getCenter().y > target.getFigure().getBounds().y) |
| { |
| return child; |
| } |
| } |
| } |
| return editPart; |
| } |
| } |
| else if (direction == KeyBoardAccessibilityEditPolicy.IN_TO_FIRST_CHILD) |
| { |
| result = (EditPart) editPart.getChildren().get(0); |
| } |
| return result; |
| } |
| } |