blob: fbac2f032881685c26b39eaf1dc67b5e4fae25d8 [file] [log] [blame]
package org.eclipse.epf.diagram.ad.custom.policies;
/*
* Copyright (c) 2006 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:
* Yury Chernikov (Borland) - initial API and implementation
*
*
* Modified :
* Shilpa Toraskar
*/
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.gmf.runtime.diagram.core.listener.DiagramEventBroker;
import org.eclipse.gmf.runtime.diagram.core.listener.NotificationListener;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy;
import org.eclipse.gmf.runtime.notation.NotationPackage;
public class DynamicResizeDirectionsEditPolicy extends ResizableShapeEditPolicy implements NotificationListener {
private static final int VERTICAL = -1;
private static final int SQUARE = 0;
private static final int HORIZONTAL = 1;
private int myCurrentState;
public DynamicResizeDirectionsEditPolicy(){
myCurrentState = HORIZONTAL;
setResizeDirections(PositionConstants.EAST | PositionConstants.WEST);
}
@Override
public void activate() {
super.activate();
getDiagramEventBroker().addNotificationListener(getHostImpl().getNotationView(), this);
}
@Override
public void deactivate() {
getDiagramEventBroker().removeNotificationListener(getHostImpl().getNotationView(), this);
super.deactivate();
}
public void hostSizeChanged(){
IGraphicalEditPart host = getHostImpl();
Integer width = (Integer) host.getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Width());
Integer height = (Integer) host.getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Height());
if (width == null){
width = Integer.valueOf(0);
}
if (height == null){
height = Integer.valueOf(0);
}
Dimension size = new Dimension(width, height);
correctEditPolicy(size);
}
public void notifyChanged(Notification notification) {
Object feature = notification.getFeature();
if (NotationPackage.eINSTANCE.getSize_Width().equals(feature) || NotationPackage.eINSTANCE.getSize_Height().equals(feature)) {
hostSizeChanged();
}
}
private void correctEditPolicy(Dimension size) {
if (isChanged(size)) {
hideSelection();
setState(size);
showSelection();
}
}
private IGraphicalEditPart getHostImpl(){
return (IGraphicalEditPart) getHost();
}
private boolean isChanged(Dimension size) {
return (size.height - size.width) * myCurrentState > 0;
}
public void setState(Dimension size) {
int delta = size.height - size.width;
if (delta > 0) {
myCurrentState = VERTICAL;
setResizeDirections(PositionConstants.NORTH | PositionConstants.SOUTH);
} else if (delta < 0) {
myCurrentState = HORIZONTAL;
setResizeDirections(PositionConstants.WEST | PositionConstants.EAST);
} else {
myCurrentState = SQUARE;
}
}
private DiagramEventBroker getDiagramEventBroker() {
return DiagramEventBroker.getInstance(getHostImpl().getEditingDomain());
}
@Override
protected void showSelection() {
// set state correctly before showing it.
IGraphicalEditPart host = getHostImpl();
Integer width = (Integer) host.getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Width());
Integer height = (Integer) host.getStructuralFeatureValue(NotationPackage.eINSTANCE.getSize_Height());
if (width == null){
width = Integer.valueOf(0);
}
if (height == null){
height = Integer.valueOf(0);
}
Dimension size = new Dimension(width, height);
setState(size);
super.showSelection();
}
}