package org.insightech.er.editor.controller.editpolicy.element.connection; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Polyline; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.editparts.ZoomManager; import org.eclipse.gef.handles.BendpointMoveHandle; import org.eclipse.gef.requests.BendpointRequest; import org.eclipse.swt.SWT; import org.insightech.er.editor.controller.command.diagram_contents.element.connection.relation.bendpoint.MoveRelationBendpointCommand; import org.insightech.er.editor.controller.editpart.element.ERDiagramEditPart; import org.insightech.er.editor.controller.editpart.element.connection.RelationEditPart; import org.insightech.er.editor.controller.editpart.element.node.ERTableEditPart; import org.insightech.er.editor.model.diagram_contents.element.connection.Bendpoint; import org.insightech.er.editor.model.diagram_contents.element.connection.Relation; public class RelationBendpointEditPolicy extends ERDiagramBendpointEditPolicy { /** * {@inheritDoc} */ @Override protected void showMoveBendpointFeedback(BendpointRequest bendpointrequest) { Relation relation = (Relation) getHost().getModel(); RelationEditPart editPart = (RelationEditPart) this.getHost(); if (relation.getSource() == relation.getTarget()) { if (bendpointrequest.getIndex() != 1) { return; } Point point = bendpointrequest.getLocation(); this.getConnection().translateToRelative(point); Bendpoint rate = this.getRate(point); rate.setRelative(true); float rateX = (100f - (rate.getX() / 2)) / 100; float rateY = (100f - (rate.getY() / 2)) / 100; ERTableEditPart tableEditPart = (ERTableEditPart) editPart .getSource(); Rectangle bounds = tableEditPart.getFigure().getBounds(); Rectangle rect = new Rectangle(); rect.x = (int) (bounds.x + (bounds.width * rateX)); rect.y = (int) (bounds.y + (bounds.height * rateY)); rect.width = (int) (bounds.width * rate.getX() / 100); rect.height = (int) (bounds.height * rate.getY() / 100); relation.setSourceLocationp(100, (int) (100 * rateY)); relation.setTargetLocationp((int) (100 * rateX), 100); LayerManager manager = (LayerManager) tableEditPart.getRoot(); IFigure layer = manager.getLayer(LayerConstants.PRIMARY_LAYER); this.getFeedbackLayer().setBounds(layer.getBounds()); List children = this.getFeedbackLayer().getChildren(); children.clear(); this.getFeedbackLayer().repaint(); ZoomManager zoomManager = ((ScalableFreeformRootEditPart) this .getHost().getRoot()).getZoomManager(); double zoom = zoomManager.getZoom(); Polyline feedbackFigure = new Polyline(); feedbackFigure.addPoint(new Point((int) (rect.x * zoom), (int) (rect.y * zoom))); feedbackFigure.addPoint(new Point((int) (rect.x * zoom), (int) ((rect.y + rect.height) * zoom))); feedbackFigure.addPoint(new Point( (int) ((rect.x + rect.width) * zoom), (int) ((rect.y + rect.height) * zoom))); feedbackFigure .addPoint(new Point((int) ((rect.x + rect.width) * zoom), (int) (rect.y * zoom))); feedbackFigure.addPoint(new Point((int) (rect.x * zoom), (int) (rect.y * zoom))); feedbackFigure.setLineStyle(SWT.LINE_DASH); feedbackFigure.translateToRelative(feedbackFigure.getLocation()); this.addFeedback(feedbackFigure); } else { super.showMoveBendpointFeedback(bendpointrequest); } } /** * {@inheritDoc} */ @Override protected void showCreateBendpointFeedback(BendpointRequest bendpointrequest) { Relation relation = (Relation) getHost().getModel(); if (relation.getSource() == relation.getTarget()) { return; } super.showCreateBendpointFeedback(bendpointrequest); } /** * {@inheritDoc} */ @Override protected void eraseConnectionFeedback(BendpointRequest request) { this.getFeedbackLayer().getChildren().clear(); super.eraseConnectionFeedback(request); } /** * {@inheritDoc} */ @Override protected Command getMoveBendpointCommand(BendpointRequest bendpointrequest) { Relation relation = (Relation) getHost().getModel(); RelationEditPart editPart = (RelationEditPart) this.getHost(); if (relation.getSource() == relation.getTarget()) { if (bendpointrequest.getIndex() != 1) { return null; } else { Point point = bendpointrequest.getLocation(); Bendpoint rate = this.getRate(point); MoveRelationBendpointCommand command = new MoveRelationBendpointCommand( editPart, rate.getX(), rate.getY(), bendpointrequest .getIndex()); return command; } } Point point = bendpointrequest.getLocation(); this.getConnection().translateToRelative(point); MoveRelationBendpointCommand command = new MoveRelationBendpointCommand( editPart, point.x, point.y, bendpointrequest.getIndex()); return command; } private Bendpoint getRate(Point point) { RelationEditPart editPart = (RelationEditPart) this.getHost(); ERTableEditPart tableEditPart = (ERTableEditPart) editPart.getSource(); Rectangle rectangle = tableEditPart.getFigure().getBounds(); int xRate = (point.x - rectangle.x - rectangle.width) * 200 / rectangle.width; int yRate = (point.y - rectangle.y - rectangle.height) * 200 / rectangle.height; return new Bendpoint(xRate, yRate); } @Override protected void showSelection() { super.showSelection(); RelationEditPart editPart = (RelationEditPart) this.getHost(); editPart.refresh(); } @Override protected void hideSelection() { super.hideSelection(); RelationEditPart editPart = (RelationEditPart) this.getHost(); editPart.refresh(); } @Override protected List createSelectionHandles() { Relation relation = (Relation) getHost().getModel(); if (relation.getSource() == relation.getTarget()) { List<BendpointMoveHandle> list = new ArrayList<BendpointMoveHandle>(); ConnectionEditPart connEP = (ConnectionEditPart) getHost(); list.add(new BendpointMoveHandle(connEP, 1, 2)); this.showSelectedLine(); ERDiagramEditPart diagramEditPart = (ERDiagramEditPart) this .getHost().getRoot().getContents(); diagramEditPart.refreshVisuals(); return list; } return super.createSelectionHandles(); } }