src/nodes/Pad.java
author Matthias Mann
Sat Feb 11 13:27:12 2012 +0100 (3 months ago)
changeset 262 f896aec65113
permissions -rw-r--r--
allow mouse input for scrolling, don't update text area model when nothing has changed
     1 /*
     2  * Copyright (c) 2008-2011, Matthias Mann
     3  *
     4  * All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *     * Redistributions of source code must retain the above copyright notice,
    10  *       this list of conditions and the following disclaimer.
    11  *     * Redistributions in binary form must reproduce the above copyright
    12  *       notice, this list of conditions and the following disclaimer in the
    13  *       documentation and/or other materials provided with the distribution.
    14  *     * Neither the name of Matthias Mann nor the names of its contributors may
    15  *       be used to endorse or promote products derived from this software
    16  *       without specific prior written permission.
    17  *
    18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    26  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    27  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    29  */
    30 package nodes;
    31 
    32 import de.matthiasmann.twl.Event;
    33 import de.matthiasmann.twl.Widget;
    34 import de.matthiasmann.twl.renderer.AnimationState.StateKey;
    35 
    36 /**
    37  *
    38  * @author Matthias Mann
    39  */
    40 public class Pad extends Widget {
    41 
    42     public static final StateKey STATE_HOVER            = StateKey.get("hover");
    43     public static final StateKey STATE_DRAG_DESTINATION = StateKey.get("dragDestination");
    44     
    45     public static final int RADIUS = 5;
    46 
    47     private final Node node;
    48     private final boolean input;
    49     private Connection inConnection;
    50 
    51     private boolean isDragActive;
    52     private Pad dragDestinationPad;
    53 
    54     public Pad(Node node, boolean input) {
    55         this.node = node;
    56         this.input = input;
    57     }
    58 
    59     public Node getNode() {
    60         return node;
    61     }
    62 
    63     public boolean isInput() {
    64         return input;
    65     }
    66 
    67     public Connection getInConnection() {
    68         return inConnection;
    69     }
    70 
    71     public void setInConnection(Connection inConnection) {
    72         this.inConnection = inConnection;
    73     }
    74     
    75     @Override
    76     protected boolean handleEvent(Event evt) {
    77         if(evt.isMouseEvent()) {
    78             getAnimationState().setAnimationState(STATE_HOVER, evt.getType() != Event.Type.MOUSE_EXITED);
    79         }
    80         
    81         if(evt.getType() == Event.Type.MOUSE_DRAGGED) {
    82             NodeArea nodeArea = node.getNodeArea();
    83 
    84             if(!isDragActive) {
    85                 isDragActive = true;
    86                 
    87                 if(isInput()) {
    88                     nodeArea.removeConnection(getInConnection());
    89                 }
    90             }
    91 
    92             nodeArea.dragNewConnection(this, evt.getMouseX(), evt.getMouseY());
    93 
    94             Pad pad = nodeArea.padFromMouse(evt.getMouseX(), evt.getMouseY());
    95             setDragDestPad(pad);
    96         }
    97 
    98         if(isDragActive && evt.isMouseDragEnd()) {
    99             NodeArea nodeArea = node.getNodeArea();
   100             if(dragDestinationPad != null) {
   101                 if(isInput()) {
   102                     nodeArea.addConnection(dragDestinationPad, this);
   103                 } else {
   104                     nodeArea.addConnection(this, dragDestinationPad);
   105                 }
   106             }
   107             setDragDestPad(null);
   108             nodeArea.dragNewConnection(null, 0, 0);
   109             isDragActive = false;
   110         }
   111 
   112         return evt.isMouseEventNoWheel();
   113     }
   114 
   115     @Override
   116     public int getPreferredHeight() {
   117         return RADIUS*2;
   118     }
   119 
   120     @Override
   121     public int getPreferredWidth() {
   122         return RADIUS*2;
   123     }
   124 
   125     public int getCenterX() {
   126         return getX() + RADIUS;
   127     }
   128 
   129     public int getCenterY() {
   130         return getY() + RADIUS;
   131     }
   132 
   133     @Override
   134     public boolean isInside(int x, int y) {
   135         int dx = x - getCenterX();
   136         int dy = y - getCenterY();
   137         return dx*dx + dy*dy <= RADIUS*RADIUS;
   138     }
   139 
   140     private void setDragDestPad(Pad pad) {
   141         if(pad != dragDestinationPad) {
   142             if(dragDestinationPad != null) {
   143                 dragDestinationPad.getAnimationState().setAnimationState(STATE_DRAG_DESTINATION, false);
   144             }
   145             dragDestinationPad = pad;
   146             if(dragDestinationPad != null) {
   147                 dragDestinationPad.getAnimationState().setAnimationState(STATE_DRAG_DESTINATION, true);
   148             }
   149         }
   150     }
   151 }