package com.mxgraph.swing.handler; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import com.mxgraph.swing.mxGraphComponent; import com.mxgraph.swing.util.mxMouseAdapter; import com.mxgraph.util.mxEvent; import com.mxgraph.util.mxEventObject; import com.mxgraph.util.mxEventSource; import com.mxgraph.util.mxPoint; import com.mxgraph.util.mxRectangle; import com.mxgraph.util.mxEventSource.mxIEventListener; import com.mxgraph.view.mxGraph; public class mxInsertHandler extends mxMouseAdapter { /** * Reference to the enclosing graph component. */ protected mxGraphComponent graphComponent; /** * Specifies if this handler is enabled. Default is true. */ protected boolean enabled = true; /** * */ protected String style; /** * */ protected Point first; /** * */ protected float lineWidth = 1; /** * */ protected Color lineColor = Color.black; /** * */ protected boolean rounded = false; /** * */ protected mxRectangle current; /** * */ protected mxEventSource eventSource = new mxEventSource(this); /** * */ public mxInsertHandler(mxGraphComponent graphComponent, String style) { this.graphComponent = graphComponent; this.style = style; // Installs the paint handler graphComponent.addListener(mxEvent.AFTER_PAINT, new mxIEventListener() { public void invoke(Object sender, mxEventObject evt) { Graphics g = (Graphics) evt.getProperty("g"); paint(g); } }); // Listens to all mouse events on the rendering control graphComponent.getGraphControl().addMouseListener(this); graphComponent.getGraphControl().addMouseMotionListener(this); } /** * */ public mxGraphComponent getGraphComponent() { return graphComponent; } /** * */ public boolean isEnabled() { return enabled; } /** * */ public void setEnabled(boolean value) { enabled = value; } /** * */ public boolean isStartEvent(MouseEvent e) { return true; } /** * */ public void start(MouseEvent e) { first = e.getPoint(); } /** * */ public void mousePressed(MouseEvent e) { if (graphComponent.isEnabled() && isEnabled() && !e.isConsumed() && isStartEvent(e)) { start(e); e.consume(); } } /** * */ public void mouseDragged(MouseEvent e) { if (graphComponent.isEnabled() && isEnabled() && !e.isConsumed() && first != null) { mxRectangle dirty = current; current = new mxRectangle(first.x, first.y, 0, 0); current.add(new mxRectangle(e.getX(), e.getY(), 0, 0)); if (dirty != null) { dirty.add(current); } else { dirty = current; } Rectangle tmp = dirty.getRectangle(); int b = (int) Math.ceil(lineWidth); graphComponent.getGraphControl().repaint(tmp.x - b, tmp.y - b, tmp.width + 2 * b, tmp.height + 2 * b); e.consume(); } } /** * */ public void mouseReleased(MouseEvent e) { if (graphComponent.isEnabled() && isEnabled() && !e.isConsumed() && current != null) { mxGraph graph = graphComponent.getGraph(); double scale = graph.getView().getScale(); mxPoint tr = graph.getView().getTranslate(); current.setX(current.getX() / scale - tr.getX()); current.setY(current.getY() / scale - tr.getY()); current.setWidth(current.getWidth() / scale); current.setHeight(current.getHeight() / scale); Object cell = insertCell(current); eventSource.fireEvent(new mxEventObject(mxEvent.INSERT, "cell", cell)); e.consume(); } reset(); } /** * */ public Object insertCell(mxRectangle bounds) { // FIXME: Clone prototype cell for insert return graphComponent.getGraph().insertVertex(null, null, "", bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), style); } /** * */ public void reset() { Rectangle dirty = null; if (current != null) { dirty = current.getRectangle(); } current = null; first = null; if (dirty != null) { int b = (int) Math.ceil(lineWidth); graphComponent.getGraphControl().repaint(dirty.x - b, dirty.y - b, dirty.width + 2 * b, dirty.height + 2 * b); } } /** * */ public void paint(Graphics g) { if (first != null && current != null) { ((Graphics2D) g).setStroke(new BasicStroke(lineWidth)); g.setColor(lineColor); Rectangle rect = current.getRectangle(); if (rounded) { g.drawRoundRect(rect.x, rect.y, rect.width, rect.height, 8, 8); } else { g.drawRect(rect.x, rect.y, rect.width, rect.height); } } } /** * */ public void addListener(String eventName, mxIEventListener listener) { eventSource.addListener(eventName, listener); } /** * */ public void removeListener(mxIEventListener listener) { removeListener(listener, null); } /** * */ public void removeListener(mxIEventListener listener, String eventName) { eventSource.removeListener(listener, eventName); } }