// 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.graph.ui;
import graphtea.graph.GraphUtils;
import graphtea.graph.event.GraphEvent;
import graphtea.graph.graph.AbstractGraphRenderer;
import graphtea.graph.graph.PaintHandler;
import graphtea.graph.old.AcceleratedRenderer;
import graphtea.graph.old.GStroke;
import graphtea.platform.core.BlackBoard;
import graphtea.platform.core.Listener;
import java.awt.*;
/**
* @author azin azadi
* @email
*/
public abstract class GraphRectRegionSelect implements Listener, PaintHandler<AbstractGraphRenderer> {
public Rectangle getCurrentRect() {
return rect;
}
protected Rectangle rect = new Rectangle(0, 0, 0, 0);
protected int x;
protected int y;
protected AbstractGraphRenderer gv;
protected int xx;
protected int yy;
private BlackBoard blackboard;
public static boolean isSelecting = false;
public GraphRectRegionSelect(BlackBoard bb) {
this.blackboard = bb;
}
/**
* starts the process of selecting a0 rectangular region by the user on the graph
* this will listen for press the mouse button and drag it on the graph
* this will finished whenever the mouse released
*/
public void startSelectingRegion() {
blackboard.addListener(GraphEvent.EVENT_KEY, this);
//other things will be done on doJob
}
GraphEvent gdrag, gdrop, gmove;
boolean dragStarted = false;
public void keyChanged(String eventKey, Object value) {
gv = blackboard.getData(AbstractGraphRenderer.EVENT_KEY);
if (eventKey.equals(GraphEvent.EVENT_KEY)) {
GraphEvent ge = blackboard.getData(GraphEvent.EVENT_KEY);
if (ge.eventType == GraphEvent.DRAGGING_STARTED) {
gv.addPostPaintHandler(this);
gdrag = blackboard.getData(GraphEvent.EVENT_KEY);
drag();
dragStarted = true;
isSelecting = true;
}
if (dragStarted && ge.eventType == GraphEvent.DRAGGING) {
gmove = blackboard.getData(GraphEvent.EVENT_KEY);
mouseMove();
}
if (dragStarted && ge.eventType == GraphEvent.DROPPED) {
isSelecting = false;
gdrop = blackboard.getData(GraphEvent.EVENT_KEY);
blackboard.removeListener(GraphEvent.EVENT_KEY, this);
gv.removePaintHandler(this);
// if (!dragStarted) {
// rect = new Rectangle((int) gdrop.mousePos.getX(), (int) gdrop.mousePos.getY(), 300, 300);
// }
dragStarted = false;
drop();
}
}
}
abstract public void onMouseMoved(GraphEvent data);
abstract public void onDrop(GraphEvent data);
private void mouseMove() {
xx = (int) gmove.mousePos.x;
yy = (int) gmove.mousePos.y;
int dx = xx - x;
int dy = yy - y;
int _x = x;
int _y = y;
if (dx < 0) {
dx *= -1;
_x -= dx;
}
if (dy < 0) {
dy *= -1;
_y -= dy;
}
rect.setBounds(_x, _y, dx, dy);
if (gv != null) {
if (!(gv instanceof AcceleratedRenderer))
gv.repaint();
}
onMouseMoved(gmove);
}
private void drag() {
x = (int) gdrag.mousePos.x;
y = (int) gdrag.mousePos.y;
rect = new Rectangle(x, y, 300, 300);
}
private void drop() {
onDrop(gdrop);
gv.repaint();
}
public void paint(Graphics g, Object destinationComponent, Boolean drawExtras) {
if (!drawExtras)
return;
double zoomFactor = gv.getGraph().getZoomFactor();
Graphics2D gg = (Graphics2D) g;
gg.setStroke(GStroke.dashed.stroke);
gg.setColor(Color.DARK_GRAY);
Rectangle _rect = GraphUtils.createViewRectangle(gv.getGraph(), rect);
g.drawRoundRect(_rect.x, _rect.y, _rect.width, _rect.height, 5, 5);
}
public boolean isEnable() {
return true;
}
}