/**
* 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.policies;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gmf.runtime.lite.figures.BorderItemLocator;
import org.eclipse.gmf.runtime.lite.figures.SideAffixedFeedbackPositioner;
/**
* Edit policy that operates with side-affixed children. Assumes side-affixed children are laid out using {@link BorderItemLocator} as
* a constraint.
*/
public abstract class SideAffixedLayoutEditPolicy extends XYLayoutEditPolicyEx {
@Override
protected Point getLayoutOrigin() {
return getLayoutContainer().getClientArea().getLocation();
}
@Override
protected Rectangle getCurrentConstraintFor(GraphicalEditPart child) {
IFigure fig = child.getFigure();
Object constraint = fig.getParent().getLayoutManager().getConstraint(fig);
if (constraint == null) {
return new Rectangle();
}
return ((BorderItemLocator) constraint).getModelConstraint();
}
@SuppressWarnings("unchecked")
protected final SideAffixedFeedbackPositioner getSideAffixedElementPositionerForRequest(CreateRequest request) {
SideAffixedFeedbackPositioner itemLocator = (SideAffixedFeedbackPositioner) request.getExtendedData().get(SideAffixedFeedbackPositioner.class);
if (itemLocator == null) {
itemLocator = createSideAffixedFeedbackPositioner(request);
}
request.getExtendedData().put(SideAffixedFeedbackPositioner.class, itemLocator);
return itemLocator;
}
/**
* @param request
* @return
*/
protected SideAffixedFeedbackPositioner createSideAffixedFeedbackPositioner(CreateRequest request) {
return new SideAffixedFeedbackPositioner((GraphicalEditPart) getHost());
}
@Override
protected IFigure getLayoutContainer() {
return getHostFigure();
}
@Override
protected Object getConstraintFor(CreateRequest request) {
Point location = request.getLocation();
Dimension size = request.getSize();
if (size == null || size.isEmpty()) {
size = new Dimension(0, 0);
}
Rectangle rect = new Rectangle(location, size);
getLayoutContainer().translateToRelative(rect);
adjustConstraint(request, rect);
getLayoutContainer().translateFromParent(rect);
rect.translate(getLayoutOrigin().getNegated());
return getConstraintFor(rect);
}
protected abstract void adjustConstraint(CreateRequest request, Rectangle rect);
}