/**
* Copyright (c) 2007 Borland Software Corporation
*
* 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:
* bblajer - initial API and implementation
*/
package org.eclipse.gmf.runtime.lite.edit.parts.labels;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Handle;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.SharedCursors;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.editpolicies.ResizableEditPolicy;
import org.eclipse.gef.handles.NonResizableHandleKit;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gef.tools.DragEditPartsTracker;
import org.eclipse.gmf.runtime.lite.commands.ChangeLocationCommand;
import org.eclipse.gmf.runtime.lite.commands.WrappingCommand;
import org.eclipse.gmf.runtime.lite.edit.parts.update.IExternallyUpdatableEditPart;
import org.eclipse.gmf.runtime.lite.edit.parts.update.UpdaterUtil;
import org.eclipse.gmf.runtime.lite.figures.ExternalChildPositionTracker;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.graphics.Cursor;
public abstract class BaseExternalLabelEditPart extends AbstractGraphicalEditPart {
public BaseExternalLabelEditPart(View view) {
setModel(view);
}
@Override
protected void createEditPolicies() {
installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new ResizableEditPolicy() {
@Override
public EditPart getTargetEditPart(Request request) {
if (RequestConstants.REQ_SELECTION.equals(request.getType())) {
return getHost().getParent();
}
return super.getTargetEditPart(request);
}
@Override
protected Command getMoveCommand(ChangeBoundsRequest request) {
final Node node = (Node) getModel();
ChangeLocationCommand emfCommand = new ChangeLocationCommand(node, request, getFigure());
return new WrappingCommand(TransactionUtil.getEditingDomain(node.getDiagram().getElement()), emfCommand);
}
});
}
public List<Handle> createSelectionHandles() {
ArrayList<Handle> result = new ArrayList<Handle>();
NonResizableHandleKit.addHandles(this, result, getLabelDragTracker(), getHandleCursor());
return result;
}
protected Cursor getHandleCursor() {
return SharedCursors.HAND;
}
protected DragTracker getLabelDragTracker() {
return new DragEditPartsTracker(this) {
@Override
protected boolean isMove() {
return true;
}
@Override
protected boolean handleButtonUp(int button) {
boolean result = super.handleButtonUp(button);
getViewer().setSelection(new StructuredSelection(getParent()));
return result;
}
};
}
@SuppressWarnings("unchecked")
@Override
public Object getAdapter(Class key) {
if (ExternalChildPositionTracker.class == key) {
return getPositionTracker();
}
return super.getAdapter(key);
}
@Override
public DragTracker getDragTracker(Request request) {
return getLabelDragTracker();
}
public ExternalChildPositionTracker getPositionTracker() {
if (myPositionTracker == null) {
myPositionTracker = new ExternalChildPositionTracker(this);
}
return myPositionTracker;
}
protected IExternallyUpdatableEditPart.ExternalRefresher boundsRefresher = new IExternallyUpdatableEditPart.ExternalRefresher() {
public void refresh() {
if (!isActive()) {
return;
}
refreshBounds();
}
public boolean isAffectingEvent(Notification msg) {
if (NotationPackage.eINSTANCE.getLocation().getEStructuralFeatures().contains(msg.getFeature())) {
return true;
}
if (NotationPackage.eINSTANCE.getNode_LayoutConstraint() == msg.getFeature()) {
return UpdaterUtil.affects(msg, NotationPackage.eINSTANCE.getLocation());
}
return false;
}
};
protected void refreshVisuals() {
super.refreshVisuals();
refreshBounds();
}
protected abstract void refreshBounds();
private ExternalChildPositionTracker myPositionTracker;
}