// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.plugins.main.core.actions.edge;
import graphtea.graph.atributeset.GraphAttrSet;
import graphtea.graph.event.EdgeEvent;
import graphtea.graph.event.GraphEvent;
import graphtea.graph.graph.Edge;
import graphtea.graph.graph.GPoint;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.PaintHandler;
import graphtea.platform.core.AbstractAction;
import graphtea.platform.core.BlackBoard;
import java.awt.*;
/**
* @author Rouzbeh Ebrahimi, Azin Azadi
* Email: ruzbehus@gmail.com
*/
public class DragEdge extends AbstractAction implements PaintHandler {
/**
* constructor
*
* @param bb the blackboard of the action
*/
public DragEdge(BlackBoard bb) {
super(bb);
listen4Event(EdgeEvent.EVENT_KEY);
listen4Event(GraphEvent.EVENT_KEY);
}
protected Edge edge;
protected GraphModel g;
// protected AbstractGraphRenderer gv;
// protected boolean isClick = false;
// protected boolean isDrag = false;
// protected int x1;
// protected int y1;
// protected int cx;
// protected int cy;
private GPoint lastPos, firstPos, cpfirstPos;
private GPoint clickPos;
public void track(){}
public void performAction(String eventName, Object value) {
g = blackboard.getData(GraphAttrSet.name);
if (!g.isEdgesCurved())
return;
// gv = blackboard.getData(AbstractGraphRenderer.name);
if (eventName == EdgeEvent.EVENT_KEY) {
EdgeEvent ee = (EdgeEvent) value;
edge = ee.e;
if (ee.eventType == EdgeEvent.DRAGGING_STARTED) {
// if (ee.mouseBtn == MouseEvent.BUTTON3) {
lastPos = ee.mousePos;
firstPos = ee.mousePos;
cpfirstPos = edge.getCurveControlPoint();
// startPainting(ee.e);
// }
// else {
// isDrag = false;
// clickPos = ee.mousePos;
// isClick = true;
// startPainting(ee.e);
//// gv.repaint();
// }
} else if (ee.eventType == EdgeEvent.DRAGGING) {
GPoint ctrlPnt = edge.getCurveControlPoint();
if (!edge.isLoop()) {
edge.setCurveControlPoint(
new GPoint(ctrlPnt.x - lastPos.x + ee.mousePos.x,
ctrlPnt.y - lastPos.y + ee.mousePos.y));
} else {
edge.setCurveControlPoint(new GPoint(ee.mousePos.x, ee.mousePos.y));
}
lastPos = ee.mousePos;
// gv.repaint();
// isDrag = true;
// isClick = false;
} else if (ee.eventType == EdgeEvent.RELEASED) {
GPoint ctrlPnt = edge.getCurveControlPoint();
lastPos = ee.mousePos;
GPoint newpos = new GPoint(ctrlPnt.x + lastPos.x - ee.mousePos.x,
ctrlPnt.y + lastPos.y - ee.mousePos.y);
edge.setCurveControlPoint(
newpos);
}
}
// else if (eventName ==GraphEvent.name.getName())) {
// GraphEvent ge = (GraphEvent) value;
// if (ge.eventType == GraphEvent.DROPPED) {
// stopPainting();
// }
//
// }
}
protected void stopPainting() {
// gv.removePaintHandler(this);
}
protected void startPainting(Edge e) {
//
// GPoint location = new GPoint(e.curve.getCtrlX(), e.curve.getCtrlY());
// Point viewPoint = GPoint.createViewPoint(g, location);
// x1 = viewPoint.x;
// y1 = viewPoint.y;
//// listen4Event(VertexMouseDraggingData.event);
// gv.addPostPaintHandler(this);
}
public void paint(Graphics g, Object destinationComponent, Boolean drawExtras) {
// if (g != null) {
// if (isDrag) {
//// double yDiff = (lastPos.getY() - firstPos.getY());
//// double xDiff = (lastPos.getX() - firstPos.getX());
//// GPoint difference=new GPoint(xDiff, yDiff);
// Point viewPoint = GPoint.createViewPoint(this.g, lastPos);
// Point2D p1 = e1.curve.getP1();
// Point2D p2 = e1.curve.getP2();
// Point2D pMouse = viewPoint;
// Point2D ctrP = e1.curve.getCtrlPt();
// Point2D newCtrlP = new Point2D.Double((Math.signum(pMouse.getX()) * Math.pow(pMouse.getX(), 1) + ctrP.getX()) / 2, (Math.signum(pMouse.getY()) * Math.pow(pMouse.getY(), 1) + ctrP.getY()) / 2);
// e1.curve.setCurve(p1, newCtrlP, p2);
// } else if (isClick) {
// Point viewPoint = GPoint.createViewPoint(this.g, clickPos);
// Point2D p1 = e1.curve.getP1();
// Point2D p2 = e1.curve.getP2();
// int ctrlX1 = (int) (p1.getX() + viewPoint.getX()) / 2 + 30;
// int ctrlY1 = 30 + (int) (p1.getY() + viewPoint.getY()) / 2;
// double dividingPointX = viewPoint.getX();
// double dividingPointY = viewPoint.getY();
//// QuadCurve2D leftCurve = new QuadCurve2D.Double(p1.getX(), p1.getY(), ctrlX1, ctrlY1, dividingPointX, dividingPointY);
// int ctrlX2 = (int) (p2.getX() + dividingPointX) / 2 - 30;
// int ctrlY2 = (int) (p2.getY() + dividingPointY) / 2 - 30;
//// QuadCurve2D rightCurve = new QuadCurve2D.Double(dividingPointX, dividingPointY, ctrlX2, ctrlY2,p2.getX(),p2.getY() );
// QuadCurve2D rightCurve = new QuadCurve2D.Double(), leftCurve = new QuadCurve2D.Double();
// e1.curve.subdivide(leftCurve, rightCurve);
// Point2D p = leftCurve.getCtrlPt();
// int gh1 = (int) (p.getX() + 30);
// int gh2 = (int) (p.getY() + 30);
// p = new Point2D.Double(gh1, gh2);
// leftCurve.setCurve(leftCurve.getP1(), p, leftCurve.getP2());
// Point2D p4 = rightCurve.getCtrlPt();
// int fh1 = (int) (p4.getX() - 30);
// int fh2 = (int) (p4.getY() - 30);
// p = new Point2D.Double(fh1, fh2);
// rightCurve.setCurve(rightCurve.getP1(), p, rightCurve.getP2());
// Graphics2D gg = (Graphics2D) g;
// gg.draw(leftCurve);
// g.drawString("*", (int) dividingPointX, (int) dividingPointY);
// gg.draw(rightCurve);
//// stopPainting();
// }
//
//// gg.draw(e1.curve);
// }
//
}
}