001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.visual.action;
042:
043: import org.netbeans.api.visual.action.MoveProvider;
044: import org.netbeans.api.visual.action.MoveStrategy;
045: import org.netbeans.api.visual.action.WidgetAction;
046: import org.netbeans.api.visual.widget.Widget;
047:
048: import java.awt.*;
049: import java.awt.event.MouseEvent;
050:
051: /**
052: * @author David Kaspar
053: */
054: public final class MoveAction extends WidgetAction.LockedAdapter {
055:
056: private MoveStrategy strategy;
057: private MoveProvider provider;
058:
059: private Widget movingWidget = null;
060: private Point dragSceneLocation = null;
061: private Point originalSceneLocation = null;
062: private Point initialMouseLocation = null;
063:
064: public MoveAction(MoveStrategy strategy, MoveProvider provider) {
065: this .strategy = strategy;
066: this .provider = provider;
067: }
068:
069: protected boolean isLocked() {
070: return movingWidget != null;
071: }
072:
073: public State mousePressed(Widget widget, WidgetMouseEvent event) {
074: if (isLocked())
075: return State.createLocked(widget, this );
076: if (event.getButton() == MouseEvent.BUTTON1
077: && event.getClickCount() == 1) {
078: movingWidget = widget;
079: initialMouseLocation = event.getPoint();
080: originalSceneLocation = provider
081: .getOriginalLocation(widget);
082: if (originalSceneLocation == null)
083: originalSceneLocation = new Point();
084: dragSceneLocation = widget.convertLocalToScene(event
085: .getPoint());
086: provider.movementStarted(widget);
087: return State.createLocked(widget, this );
088: }
089: return State.REJECTED;
090: }
091:
092: public State mouseReleased(Widget widget, WidgetMouseEvent event) {
093: boolean state;
094: if (initialMouseLocation != null
095: && initialMouseLocation.equals(event.getPoint()))
096: state = true;
097: else
098: state = move(widget, event.getPoint());
099: if (state) {
100: movingWidget = null;
101: dragSceneLocation = null;
102: originalSceneLocation = null;
103: initialMouseLocation = null;
104: provider.movementFinished(widget);
105: }
106: return state ? State.CONSUMED : State.REJECTED;
107: }
108:
109: public State mouseDragged(Widget widget, WidgetMouseEvent event) {
110: return move(widget, event.getPoint()) ? State.createLocked(
111: widget, this ) : State.REJECTED;
112: }
113:
114: private boolean move(Widget widget, Point newLocation) {
115: if (movingWidget != widget)
116: return false;
117: initialMouseLocation = null;
118: newLocation = widget.convertLocalToScene(newLocation);
119: Point location = new Point(originalSceneLocation.x
120: + newLocation.x - dragSceneLocation.x,
121: originalSceneLocation.y + newLocation.y
122: - dragSceneLocation.y);
123: provider.setNewLocation(widget, strategy.locationSuggested(
124: widget, originalSceneLocation, location));
125: return true;
126: }
127:
128: }
|