View Javadoc

    1   /*
    2    * @(#) EditorInputListener.java Mar 2, 2004
    3    *
    4    * Copyright (c) 2002-2005 Delft University of Technology Jaffalaan 5, 2628 BX
    5    * Delft, the Netherlands. All rights reserved.
    6    *
    7    * This software is proprietary information of Delft University of Technology
    8    * The code is published under the Lesser General Public License
    9    */
    10  package nl.tudelft.simulation.dsol.gui.editor2D.mouse;
    11
    12  import java.awt.event.MouseEvent;
    13  import java.awt.geom.Point2D;
    14
    15  import nl.tudelft.simulation.dsol.animation.Editable;
    16  import nl.tudelft.simulation.dsol.animation.D2.EditableRenderable2DInterface;
    17  import nl.tudelft.simulation.dsol.animation.D2.Renderable2DInterface;
    18  import nl.tudelft.simulation.dsol.gui.DSOLApplicationInterface;
    19  import nl.tudelft.simulation.dsol.gui.animation2D.AnimationPanel;
    20  import nl.tudelft.simulation.dsol.gui.animation2D.mouse.InputListener;
    21  import nl.tudelft.simulation.dsol.gui.editor2D.Editor2DPanel;
    22  import nl.tudelft.simulation.dsol.gui.editor2D.actions.EditorUtilities;
    23  import nl.tudelft.simulation.introspection.gui.IntroSpectionDialog;
    24  import nl.tudelft.simulation.language.d3.CartesianPoint;
    25
    26  /***
    27   * An input listener for the editor
    28   * <p>
    29   * (c) copyright 2002-2005 <a href="http://www.simulation.tudelft.nl">Delft
    30   * University of Technology </a>, the Netherlands. <br>
    31   * See for project information <a
    32   * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a> <br>
    33   * License of use: <a href="http://www.gnu.org/copyleft/lesser.html">Lesser
    34   * General Public License (LGPL) </a>, no warranty.
    35   *
    36   * @version $Revision$ $Date$
    37   * @author <a href="http://www.tbm.tudelft.nl/webstaf/royc/index.htm">Roy Chin
    38   *         </a>
    39   */
    40  public class EditorInputListener extends InputListener
    41  {
    42  	/*** the source panel */
    43  	protected Editor2DPanel panel = null;
    44
    45  	/*** did we click within the selected object? */
    46  	protected boolean clickedWithinSelected = false;
    47
    48  	/*** Last mouse button that was pressed */
    49  	protected int mouseButton = 0;
    50
    51  	/*** Point where the mouse is when dragging */
    52  	protected Point2D dragCoord = null;
    53
    54  	/***
    55  	 * constructor
    56  	 *
    57  	 * @param application the application
    58  	 * @param panel the panel
    59  	 */
    60  	public EditorInputListener(final DSOLApplicationInterface application,
    61  			final AnimationPanel panel)
    62  	{
    63  		super(application, panel);
    64  		this.panel = (Editor2DPanel) panel;
    65  	}
    66
    67  	/***
    68  	 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
    69  	 */
    70  	public void mouseClicked(final MouseEvent event)
    71  	{
    72  		this.panel.requestFocus();
    73  	}
    74
    75  	/***
    76  	 * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
    77  	 */
    78  	public void mouseDragged(final MouseEvent event)
    79  	{
    80  		super.mouseDragged(event);
    81
    82  		Point2D newCoordinate = Renderable2DInterface.Util.getWorldCoordinates(
    83  				event.getPoint(), this.panel.getExtent(), this.panel.getSize());
    84  		Point2D centerCoordinate = Renderable2DInterface.Util
    85  				.getWorldCoordinates(this.mouseClicked, this.panel.getExtent(),
    86  						this.panel.getSize());
    87  		Point2D oldCoordinate = Renderable2DInterface.Util.getWorldCoordinates(
    88  				this.dragCoord, this.panel.getExtent(), this.panel.getSize());
    89
    90  		if ((this.mouseButton == MouseEvent.BUTTON1)
    91  				&& (this.panel.getSelectedMode() == Editor2DPanel.MODE_EDIT)
    92  				&& (this.panel.getSelectedPoint() == null)
    93  				&& (this.clickedWithinSelected))
    94  		{
    95  			if (this.panel.getSelectedEditMode() == Editor2DPanel.EDIT_MODE_MOVE)
    96  			{
    97  				// Move the entire shape
    98  				EditorUtilities.moveEditable(this.panel
    99  						.getSelectedEditableRenderable(), newCoordinate,
    100 						oldCoordinate);
    101 			} else if (this.panel.getSelectedEditMode() == Editor2DPanel.EDIT_MODE_ROTATE)
    102 			{
    103 				// Rotate the entire shape
    104 				EditorUtilities.rotateEditable(this.panel
    105 						.getSelectedEditableRenderable(), newCoordinate,
    106 						centerCoordinate, oldCoordinate);
    107 			}
    108 		}
    109
    110 		this.dragCoord = (Point2D) event.getPoint().clone();
    111 	}
    112
    113 	/***
    114 	 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
    115 	 */
    116 	public void mousePressed(final MouseEvent event)
    117 	{
    118 		super.mousePressed(event);
    119
    120 		this.mouseButton = event.getButton();
    121 		this.dragCoord = event.getPoint();
    122
    123 		// What to do in which mode
    124 		if (this.panel.getSelectedMode() == Editor2DPanel.MODE_EDIT)
    125 		{
    126 			CartesianPoint selectedPoint = this
    127 					.determineSelectedVertice(this.mouseClicked);
    128 			this.panel.setSelectedPoint(selectedPoint);
    129 			if (this.panel.getSelectedPoint() == null)
    130 			{
    131 				this.clickedWithinSelected = this.isInside(this.mouseClicked);
    132 			}
    133 		}
    134 	}
    135
    136 	/***
    137 	 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
    138 	 */
    139 	public void mouseReleased(final MouseEvent event)
    140 	{
    141 		super.mouseReleased(event);
    142
    143 		switch (this.mouseButton)
    144 		{
    145 			case MouseEvent.BUTTON1 :
    146 				this.performLeftMouseReleasedAction(event);
    147 				break;
    148 			case MouseEvent.BUTTON3 :
    149 				this.performRightMouseReleasedAction(event);
    150 				break;
    151 			default :
    152 		}
    153 		this.panel.repaint();
    154 	}
    155
    156 	/***
    157 	 * perform one of the actions of the editor
    158 	 *
    159 	 * @param event mouse event
    160 	 */
    161 	protected void performLeftMouseReleasedAction(final MouseEvent event)
    162 	{
    163 		Point2D point = event.getPoint();
    164 		Point2D newCoordinate = Renderable2DInterface.Util.getWorldCoordinates(
    165 				point, this.panel.getExtent(), this.panel.getSize());
    166 		Point2D oldCoordinate = Renderable2DInterface.Util.getWorldCoordinates(
    167 				this.dragCoord, this.panel.getExtent(), this.panel.getSize());
    168 		Point2D centerCoordinate = Renderable2DInterface.Util
    169 				.getWorldCoordinates(this.mouseClicked, this.panel.getExtent(),
    170 						this.panel.getSize());
    171 		switch (this.panel.getSelectedMode())
    172 		{
    173 			case Editor2DPanel.MODE_SELECT :
    174 				EditorUtilities.selectEditable(newCoordinate, this.panel);
    175 				break;
    176 			case Editor2DPanel.MODE_NEW :
    177 				EditorUtilities.instantiateNewEditable(newCoordinate,
    178 						this.application, this.panel);
    179 				break;
    180 			case Editor2DPanel.MODE_EDIT :
    181 				EditableRenderable2DInterface selected = this.panel
    182 						.getSelectedEditableRenderable();
    183 				if (selected != null)
    184 				{
    185 					if (this.panel.getSelectedPoint() != null)
    186 					{
    187 						// Move selected point
    188 						EditorUtilities.moveSelectedPoint(selected,
    189 								newCoordinate, this.panel);
    190 					} else if (this.clickedWithinSelected)
    191 					{
    192 						if (this.panel.getSelectedEditMode() == Editor2DPanel.EDIT_MODE_MOVE)
    193 						{
    194 							// Move the entire shape
    195 							EditorUtilities.moveEditable(selected,
    196 									newCoordinate, oldCoordinate);
    197 						}
    198 						if (this.panel.getSelectedEditMode() == Editor2DPanel.EDIT_MODE_ROTATE)
    199 						{
    200 							// Rotate the entire shape
    201 							EditorUtilities.rotateEditable(selected,
    202 									newCoordinate, centerCoordinate,
    203 									oldCoordinate);
    204 						}
    205 					}
    206 				}
    207 				break;
    208 			default :
    209 		}
    210 	}
    211
    212 	/***
    213 	 * what to do if the right mouse button was released
    214 	 *
    215 	 * @param event MouseEvent
    216 	 */
    217 	protected void performRightMouseReleasedAction(final MouseEvent event)
    218 	{
    219 		Point2D world = Renderable2DInterface.Util.getWorldCoordinates(event
    220 				.getPoint(), this.panel.getExtent(), this.panel.getSize());
    221 		if (this.panel.getSelectedMode() == Editor2DPanel.MODE_SELECT)
    222 		{
    223 			// Determine which object was selected, if any, and
    224 			// show the introspection window for it.
    225 			Renderable2DInterface selected = EditorUtilities.selectEditable(
    226 					world, this.panel);
    227 			if (selected != null)
    228 			{
    229 				new IntroSpectionDialog(selected.getSource(), selected
    230 						.getSource().toString());
    231 			}
    232 		} else if (this.panel.getSelectedMode() == Editor2DPanel.MODE_EDIT)
    233 		{
    234 			if (event.isPopupTrigger())
    235 			{
    236 				this.popup(event);
    237 				return;
    238 			}
    239 		}
    240 	}
    241
    242 	/***
    243 	 * determine if a vertice was selected
    244 	 *
    245 	 * @param mousePosition the position of the mouse cursor
    246 	 * @return the selected vertice
    247 	 */
    248 	private CartesianPoint determineSelectedVertice(final Point2D mousePosition)
    249 	{
    250 		CartesianPoint selectedPoint = null;
    251 		this.panel.setSelectedPoint(null);
    252 		EditableRenderable2DInterface selected = this.panel
    253 				.getSelectedEditableRenderable();
    254 		if (selected == null)
    255 		{
    256 			return null;
    257 		}
    258 		Editable editable = (Editable) selected.getSource();
    259 		CartesianPoint[] vertices = editable.getVertices();
    260 		CartesianPoint[] positions = new CartesianPoint[vertices.length];
    261 		for (int i = 0; i < vertices.length; i++)
    262 		{
    263 			positions[i] = EditorUtilities.convertToGlobalCoordinates(
    264 					vertices[i], editable.getLocation());
    265 			Point2D p1 = Renderable2DInterface.Util.getScreenCoordinates(
    266 					new Point2D.Double(positions[i].x, positions[i].y),
    267 					this.panel.getExtent(), this.panel.getSize());
    268 			if (Math.abs(mousePosition.getX() - (int) p1.getX()) <= Editor2DPanel.PLACEHOLDERSIZE)
    269 			{
    270 				if (Math.abs(mousePosition.getY() - (int) p1.getY()) <= Editor2DPanel.PLACEHOLDERSIZE)
    271 				{
    272 					selectedPoint = vertices[i];
    273 				}
    274 			}
    275 		}
    276 		return selectedPoint;
    277 	}
    278
    279 	/***
    280 	 * determine if the mouse pointer is inside a renderable
    281 	 *
    282 	 * @param mousePosition the position of the mouse cursor
    283 	 * @return true if inside
    284 	 */
    285 	private boolean isInside(final Point2D mousePosition)
    286 	{
    287 		EditableRenderable2DInterface selected = this.panel
    288 				.getSelectedEditableRenderable();
    289 		if (selected == null)
    290 		{
    291 			return false;
    292 		}
    293 		Point2D worldCoord = Renderable2DInterface.Util
    294 				.getWorldCoordinates(this.mouseClicked, this.panel.getExtent(),
    295 						this.panel.getSize());
    296 		if (((Renderable2DInterface) selected).contains(worldCoord, this.panel
    297 				.getExtent(), this.panel.getSize()))
    298 		{
    299 			return true;
    300 		}
    301 		return false;
    302
    303 	}
    304 }