/*******************************************************************************
* Copyright (c) 2007-2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.hibernate.ui.diagram.editors.parts;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.ConnectionLayer;
import org.eclipse.draw2d.FanRouter;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ManhattanConnectionRouter;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.gef.CompoundSnapToHelper;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.SnapToGeometry;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.SnapToGuides;
import org.eclipse.gef.SnapToHelper;
import org.eclipse.gef.rulers.RulerProvider;
import org.jboss.tools.hibernate.ui.diagram.editors.DiagramViewer;
import org.jboss.tools.hibernate.ui.diagram.editors.autolayout.IDiagramInfo;
import org.jboss.tools.hibernate.ui.diagram.editors.autolayout.data.DiagramInfo;
import org.jboss.tools.hibernate.ui.diagram.editors.autolayout.impl.AutoLayoutImpl;
import org.jboss.tools.hibernate.ui.diagram.editors.model.BaseElement;
import org.jboss.tools.hibernate.ui.diagram.editors.model.OrmDiagram;
import org.jboss.tools.hibernate.ui.diagram.editors.model.Shape;
/**
* @author some modifications from Vitali
*/
public class DiagramEditPart extends OrmEditPart {
protected void createEditPolicies() {
installEditPolicy(EditPolicy.LAYOUT_ROLE,
new ShapesXYLayoutEditPolicy((XYLayout)getContentPane().getLayoutManager()));
}
protected IFigure createFigure() {
Figure f = new FreeformLayer();
f.setBorder(new MarginBorder(3));
f.setLayoutManager(new FreeformLayout());
if (isManhattanConnectionRouter()) {
getOrmDiagram().setupFanConnectionRouter();
setupManhattanConnectionRouter();
} else {
getOrmDiagram().setupManhattanConnectionRouter();
setupFanConnectionRouter();
}
return f;
}
public void setupManhattanConnectionRouter() {
ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
connLayer.setConnectionRouter(new ManhattanConnectionRouter());
getOrmDiagram().setupManhattanConnectionRouter();
}
public void setupFanConnectionRouter() {
ConnectionLayer connLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
connLayer.setConnectionRouter(new FanRouter());
getOrmDiagram().setupFanConnectionRouter();
}
public boolean isManhattanConnectionRouter() {
return getOrmDiagram().isManhattanConnectionRouter();
}
public boolean isFanConnectionRouter() {
return getOrmDiagram().isFanConnectionRouter();
}
/**
* @see java.beans.PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if (OrmDiagram.AUTOLAYOUT.equals(prop)) {
refresh();
autolayout();
} else if (BaseElement.REFRESH.equals(prop)) {
refresh();
} else if (OrmDiagram.DIRTY.equals(prop)) {
((DiagramViewer) ((DefaultEditDomain) getViewer().getEditDomain())
.getEditorPart()).refreshDirty();
}
refresh();
}
@Override
public void refresh() {
IFigure layer = getLayer(LayerConstants.PRIMARY_LAYER);
getOrmDiagram().updateWidthAndHeight(layer.getBounds().width, layer.getBounds().height);
double zoom = ((DiagramViewer) ((DefaultEditDomain) getViewer().getEditDomain())
.getEditorPart()).getZoom();
getOrmDiagram().setZoom(zoom);
super.refresh();
}
/**
* Returns a <code>List</code> containing the children model objects.
* @return the List of children
*/
@Override
protected List<Shape> getModelChildren() {
List<Shape> res = new ArrayList<Shape>();
Iterator<Shape> it = getOrmDiagram().getChildrenIterator();
while (it.hasNext()) {
res.add(it.next());
}
return res;
}
public void activate() {
if (!isActive()) {
super.activate();
((BaseElement) getModel()).addPropertyChangeListener(this);
if (!getOrmDiagram().isFileLoadSuccessfull()) {
refresh();
autolayout();
refresh();
getOrmDiagram().setDirty(false);
}
}
}
public void autolayout() {
IDiagramInfo process = new DiagramInfo(getViewer(), getOrmDiagram());
AutoLayoutImpl layout = new AutoLayoutImpl();
layout.setGridStep(5);
layout.setOverride(true);
layout.setProcess(process);
}
public void setToFront(EditPart ep) {
int index = getChildren().indexOf(ep);
if (index == -1) {
return;
}
if (index != getChildren().size() - 1) {
reorderChild(ep, getChildren().size() - 1);
}
}
public void deactivate() {
if (isActive()) {
super.deactivate();
((BaseElement) getModel()).removePropertyChangeListener(this);
}
}
/**
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@SuppressWarnings("unchecked")
public Object getAdapter(Class adapter) {
if (adapter == SnapToHelper.class) {
List<SnapToHelper> snapStrategies = new ArrayList<SnapToHelper>();
Boolean val = (Boolean)getViewer().getProperty(RulerProvider.PROPERTY_RULER_VISIBILITY);
if (val != null && val.booleanValue()) {
snapStrategies.add(new SnapToGuides(this));
}
val = (Boolean)getViewer().getProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED);
if (val != null && val.booleanValue()) {
snapStrategies.add(new SnapToGeometry(this));
}
val = (Boolean)getViewer().getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);
if (val != null && val.booleanValue()) {
snapStrategies.add(new SnapToGrid(this));
}
if (snapStrategies.size() == 0) {
return null;
}
if (snapStrategies.size() == 1) {
return snapStrategies.get(0);
}
SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
for (int i = 0; i < snapStrategies.size(); i++) {
ss[i] = (SnapToHelper)snapStrategies.get(i);
}
return new CompoundSnapToHelper(ss);
}
return super.getAdapter(adapter);
}
public IFigure getLayer(Object layer) {
return super.getLayer(layer);
}
}