/* * (c) 2005-2009 Carlos G�mez Rodr�guez, todos los derechos reservados / all rights reserved. * Licencia en license/bsd.txt / License in license/bsd.txt * * Created at regulus on 19-jul-2005 19:51:01 * as file AddNodeTool.java on package org.f2o.absurdum.puck.gui */ package org.f2o.absurdum.puck.gui; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.Iterator; import java.util.List; import javax.swing.AbstractAction; import org.f2o.absurdum.puck.gui.cursors.CursorHandler; import org.f2o.absurdum.puck.gui.graph.Arrow; import org.f2o.absurdum.puck.gui.graph.StructuralArrow; import org.f2o.absurdum.puck.gui.graph.RoomNode; import org.f2o.absurdum.puck.gui.graph.GraphEditingPanel; import org.f2o.absurdum.puck.gui.graph.InvisibleNode; import org.f2o.absurdum.puck.gui.graph.Node; /** * @author carlos * * Created at regulus, 19-jul-2005 19:51:01 */ public class AddArrowTool extends ToolAction { private Arrow prototype; private MouseListener listener; private MouseMotionListener motionListener; private Node source; public AddArrowTool ( Arrow prototype , GraphEditingPanel panel ) { super(panel); this.prototype = prototype; listener = new MouseListener() { public void mouseClicked(MouseEvent arg0) { if ( source == null ) { Node n = getPanel().nodeAt(getPanel().panelToMapX(arg0.getX()),getPanel().panelToMapY(arg0.getY())); //structural arrows only allowed from rooms //nay! chars have items, etc. //if ( AddArrowTool.this.prototype instanceof StructuralArrow && !(n instanceof RoomNode ) ) // return; source = n; if ( n != null ) { InvisibleNode in = new InvisibleNode(getPanel().panelToMapX(arg0.getX()),getPanel().panelToMapY(arg0.getY())); getPanel().setSpecialNode(in); Arrow a = (Arrow) AddArrowTool.this.prototype.clone(); a.setSource(source); a.setDestination(in); getPanel().setSpecialArrow(a); } } else { Node n = getPanel().nodeAt(getPanel().panelToMapX(arg0.getX()),getPanel().panelToMapY(arg0.getY())); if ( n != null ) { Arrow a = (Arrow) AddArrowTool.this.prototype.clone(); a.setSource(source); a.setDestination(n); //check if there already exists an arrow to that destination boolean alreadyExists = false; List arrows = source.getArrows(); for (Iterator iterator = arrows.iterator(); iterator.hasNext();) { Arrow ar = (Arrow) iterator.next(); if ( ar.getDestination() != null && ar.getDestination().equals(n) ) { alreadyExists = true; break; } } getPanel().setSpecialNode(null); getPanel().setSpecialArrow(null); if ( !alreadyExists ) { source.addArrow(a); //this adds it to the panel getPanel().resetSelections(); getPanel().selectArrow(a); getPanel().getPropertiesPanel().show(a); getPanel().getPropertiesPanel().repaint(); } source = null; /* AddArrowTool.this.panel.setToolListener(null); AddArrowTool.this.panel.setToolMotionListener(new DefaultMouseMotionListener(AddArrowTool.this.panel)); */ toolDone(); } } getPanel().repaint(); } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { } public void mouseReleased(MouseEvent arg0) { } }; motionListener = new MouseMotionListener() { public void mouseDragged(MouseEvent arg0) { } public void mouseMoved(MouseEvent arg0) { /* AddNodeTool.this.prototype.paint( AddNodeTool.this.panel.getGraphics(),arg0.getX(),arg0.getY()); */ if ( getPanel().getSpecialNode() != null ) { getPanel().getSpecialNode().setLocation(getPanel().panelToMapX(arg0.getX()),getPanel().panelToMapY(arg0.getY())); getPanel().repaint(); } /* AddNodeTool.this.panel.repaint(); SwingUtilities.invokeLater ( new Runnable() { public void run() { AddNodeTool.this.panel.repaint(); System.out.println("Nay."); } } ); */ } }; } private void cleanup() { //cleanup arrows without destination from prior uses of this tool source=null; getPanel().setSpecialNode(null); if ( getPanel().getSpecialArrow() != null ) { Arrow a = getPanel().getSpecialArrow(); a.getSource().removeArrow(a); } getPanel().setSpecialArrow(null); } public void loadTool() { cleanup(); getPanel().setToolListener(listener); getPanel().setToolMotionListener(motionListener); getPanel().setCursor(CursorHandler.getInstance().getCursor("ADDARROW")); } public void unloadTool() { cleanup(); getPanel().resetToolListeners(); getPanel().setCursor(CursorHandler.getInstance().getCursor("DEFAULT")); } }