blob: e03ce4772a17f26ff8a49530778d47d5894c64ea [file] [log] [blame]
/*******************************************************************************
* 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.adt.design.editparts;
import java.util.Iterator;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.model.IFeedbackHandler;
import org.eclipse.wst.xsd.ui.internal.adt.design.editpolicies.IADTUpdateCommand;
import org.eclipse.wst.xsd.ui.internal.adt.editor.Messages;
import org.eclipse.wst.xsd.ui.internal.adt.facade.IType;
/**
* This class provides some base function to enable drawing connections to a referenced type
*
*/
public abstract class BaseTypeConnectingEditPart extends BaseEditPart implements IFeedbackHandler, IConnectionContainer
{
private TypeReferenceConnection connectionFigure;
public void activate()
{
super.activate();
}
public void deactivate()
{
deactivateConnection();
super.deactivate();
}
public void refreshConnections()
{
deactivateConnection();
activateConnection();
}
protected void activateConnection()
{
// If appropriate, create our connectionFigure and add it to the appropriate layer
if (connectionFigure == null && shouldDrawConnection())
{
//System.out.println("activateeConnection()-pre:" + getClass().getName());
connectionFigure = createConnectionFigure();
if (connectionFigure != null)
{
// Add our editpolicy as a listener on the connection, so it can stay in synch
//connectionFigure.addPropertyChangeListener((AttributeSelectionFeedbackPolicy) getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE));
//connectionFigure.addMouseListener(this);
getLayer(LayerConstants.CONNECTION_LAYER).add(connectionFigure);
}
}
}
protected void deactivateConnection()
{
// if we have a connection, remove it
if (connectionFigure != null)
{
getLayer(LayerConstants.CONNECTION_LAYER).remove(connectionFigure);
// Remove our editpolicy listener(s)
//connectionFigure.removePropertyChangeListener((AttributeSelectionFeedbackPolicy) getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE));
//connectionFigure.removeMouseListener(this);
connectionFigure = null;
}
}
protected boolean shouldDrawConnection()
{
return true;
}
public abstract TypeReferenceConnection createConnectionFigure();
public void addFeedback()
{
if (connectionFigure != null)
{
connectionFigure.setHighlight(true);
}
}
public void removeFeedback()
{
if (connectionFigure != null)
{
connectionFigure.setHighlight(false);
}
}
protected class NameUpdateCommandWrapper extends Command implements IADTUpdateCommand
{
Command command;
protected DirectEditRequest request;
public NameUpdateCommandWrapper()
{
super(Messages._UI_ACTION_UPDATE_NAME);
}
public void setRequest(DirectEditRequest request)
{
this.request = request;
}
public void execute()
{
IType iType = (IType)getModel();
Object newValue = request.getCellEditor().getValue();
if (newValue instanceof String)
{
command = iType.getUpdateNameCommand((String)newValue);
}
if (command != null)
command.execute();
}
}
public boolean hitTest(IFigure target, Point location)
{
Rectangle b = target.getBounds().getCopy();
target.translateToAbsolute(b);
return b.contains(location);
}
public EditPart doGetRelativeEditPart(EditPart editPart, int direction)
{
EditPart result = null;
if (direction == PositionConstants.WEST)
{
result = getConnectionEditPart(PositionConstants.WEST);
}
else if (direction == PositionConstants.EAST)
{
result = getConnectionEditPart(PositionConstants.EAST);
}
return result;
}
private EditPart getConnectionEditPart(int direction)
{
// find the first connection that targets this editPart
// navigate backward along the connection (to the left) to find the source edit part
EditPart result = null;
for (Iterator i = getLayer(LayerConstants.CONNECTION_LAYER).getChildren().iterator(); i.hasNext(); )
{
Figure figure = (Figure)i.next();
if (figure instanceof TypeReferenceConnection)
{
TypeReferenceConnection typeReferenceConnection = (TypeReferenceConnection)figure;
ConnectionAnchor thisAnchor = null;
if (direction == PositionConstants.EAST)
{
thisAnchor = typeReferenceConnection.getSourceAnchor();
}
else if (direction == PositionConstants.WEST)
{
thisAnchor = typeReferenceConnection.getTargetAnchor();
}
if (thisAnchor != null && thisAnchor.getOwner() == getFigure())
{
ConnectionAnchor outAnchor = null;
if (direction == PositionConstants.EAST)
{
outAnchor = typeReferenceConnection.getTargetAnchor();
}
else if (direction == PositionConstants.WEST)
{
outAnchor = typeReferenceConnection.getSourceAnchor();
}
if (outAnchor != null)
{
IFigure sourceFigure = outAnchor.getOwner();
EditPart part = null;
while (part == null && sourceFigure != null)
{
part = (EditPart)getViewer().getVisualPartMap().get(sourceFigure);
sourceFigure = sourceFigure.getParent();
}
result = part;
break;
}
}
}
}
return result;
}
}