package org.argouml.activity2.diagram;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.argouml.model.Model;
import org.argouml.uml.diagram.ArgoDiagram;
import org.argouml.uml.diagram.DiagramSettings;
import org.tigris.gef.base.FigModifyingModeImpl;
import org.tigris.gef.base.Globals;
import org.tigris.gef.base.Layer;
import org.tigris.gef.di.GraphNode;
import org.tigris.gef.graph.GraphModel;
import org.tigris.gef.graph.GraphNodeHooks;
import org.tigris.gef.graph.GraphNodeRenderer;
import org.tigris.gef.graph.MutableGraphModel;
import org.tigris.gef.presentation.Fig;
import org.tigris.gef.presentation.FigNode;
import org.tigris.gef.undo.UndoManager;
public class ModePlaceDiagramElement extends FigModifyingModeImpl {
private static final Logger LOG = Logger.getLogger(ModePlaceDiagramElement.class);
private final Object metaType;
private final String style;
private final String instructions;
private final ArgoDiagram diagram;
private Object modelElement;
private GraphNode graphNode;
private static final int WIDTH = 90;
private static final int HEIGHT = 25;
public ModePlaceDiagramElement(
ArgoDiagram diagram,
Object metaType,
String style,
String instructions) {
this.diagram = diagram;
this.metaType = metaType;
this.style = style;
if (instructions == null) {
this.instructions = "";
} else {
this.instructions = instructions;
}
}
public String instructions() {
return instructions;
}
public Cursor getInitialCursor() {
return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
}
public void mousePressed(MouseEvent me) {
if (me.isConsumed()) {
return;
}
UndoManager.getInstance().addMementoLock(this);
// TODO: Something might go wrong during processing. We don't really
// want to create the model element until the user releases the mouse
// in the place expected.
modelElement = Model.getUmlFactory().buildNode(metaType);
//
start();
editor = Globals.curEditor();
Layer lay = editor.getLayerManager().getActiveLayer();
graphNode = createDiagramElement(lay, modelElement, diagram.getDiagramSettings());
mouseMoved(me);
me.consume();
}
private GraphNode createDiagramElement(Layer lay, Object owner, DiagramSettings settings) {
FigBaseNode fig = new FigBaseNode(modelElement, new Rectangle(0, 0, 0, 0), settings);
fig.setLayer(lay);
DiagramElementBuilder.buildDiagramElement(fig, style, owner, settings);
return fig;
}
public void mouseExited(MouseEvent me) {
editor.damageAll();
me.consume();
}
public void mouseMoved(MouseEvent me) {
mouseDragged(me);
}
public void mouseDragged(MouseEvent me) {
if (me.isConsumed()) {
return;
}
if (graphNode == null) {
me.consume();
return;
}
editor.damageAll();
Point snapPt = new Point(me.getX(), me.getY());
editor.snap(snapPt);
((Fig) graphNode).setLocation(snapPt.x, snapPt.y);
editor.damageAll();
me.consume();
}
public void mouseEntered(MouseEvent me) {
me.consume();
}
public void mouseReleased(MouseEvent me) {
if (me.isConsumed()) {
return;
}
LOG.info("Mouse released");
MutableGraphModel mgm = (MutableGraphModel) editor.getGraphModel();
UndoManager.getInstance().startChain();
editor.add((Fig) graphNode);
mgm.addNode(modelElement);
editor.getSelectionManager().select((Fig) graphNode);
LOG.info("The diagram element " + graphNode + " was added");
done();
me.consume();
}
public void keyTyped(KeyEvent ke) {
if (ke.getKeyChar() == KeyEvent.VK_ESCAPE) {
leave();
}
}
public void paint(Graphics g) {
if (graphNode != null) {
((Fig) graphNode).paint(g);
}
}
}