allow mouse input for scrolling, don't update text area model when nothing has changed
2 * Copyright (c) 2008-2011, Matthias Mann
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
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.
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.
32 import de.matthiasmann.twl.Event;
33 import de.matthiasmann.twl.Widget;
34 import de.matthiasmann.twl.renderer.AnimationState.StateKey;
38 * @author Matthias Mann
40 public class Pad extends Widget {
42 public static final StateKey STATE_HOVER = StateKey.get("hover");
43 public static final StateKey STATE_DRAG_DESTINATION = StateKey.get("dragDestination");
45 public static final int RADIUS = 5;
47 private final Node node;
48 private final boolean input;
49 private Connection inConnection;
51 private boolean isDragActive;
52 private Pad dragDestinationPad;
54 public Pad(Node node, boolean input) {
59 public Node getNode() {
63 public boolean isInput() {
67 public Connection getInConnection() {
71 public void setInConnection(Connection inConnection) {
72 this.inConnection = inConnection;
76 protected boolean handleEvent(Event evt) {
77 if(evt.isMouseEvent()) {
78 getAnimationState().setAnimationState(STATE_HOVER, evt.getType() != Event.Type.MOUSE_EXITED);
81 if(evt.getType() == Event.Type.MOUSE_DRAGGED) {
82 NodeArea nodeArea = node.getNodeArea();
88 nodeArea.removeConnection(getInConnection());
92 nodeArea.dragNewConnection(this, evt.getMouseX(), evt.getMouseY());
94 Pad pad = nodeArea.padFromMouse(evt.getMouseX(), evt.getMouseY());
98 if(isDragActive && evt.isMouseDragEnd()) {
99 NodeArea nodeArea = node.getNodeArea();
100 if(dragDestinationPad != null) {
102 nodeArea.addConnection(dragDestinationPad, this);
104 nodeArea.addConnection(this, dragDestinationPad);
107 setDragDestPad(null);
108 nodeArea.dragNewConnection(null, 0, 0);
109 isDragActive = false;
112 return evt.isMouseEventNoWheel();
116 public int getPreferredHeight() {
121 public int getPreferredWidth() {
125 public int getCenterX() {
126 return getX() + RADIUS;
129 public int getCenterY() {
130 return getY() + RADIUS;
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;
140 private void setDragDestPad(Pad pad) {
141 if(pad != dragDestinationPad) {
142 if(dragDestinationPad != null) {
143 dragDestinationPad.getAnimationState().setAnimationState(STATE_DRAG_DESTINATION, false);
145 dragDestinationPad = pad;
146 if(dragDestinationPad != null) {
147 dragDestinationPad.getAnimationState().setAnimationState(STATE_DRAG_DESTINATION, true);