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.RectangularSelectDecorator;
044: import org.netbeans.api.visual.action.RectangularSelectProvider;
045: import org.netbeans.api.visual.action.WidgetAction;
046: import org.netbeans.api.visual.widget.LayerWidget;
047: import org.netbeans.api.visual.widget.Widget;
048:
049: import java.awt.*;
050: import java.awt.event.MouseEvent;
051:
052: /**
053: * @author David Kaspar
054: */
055: public final class RectangularSelectAction extends
056: WidgetAction.LockedAdapter {
057:
058: private RectangularSelectDecorator decorator;
059: private LayerWidget interractionLayer;
060: private RectangularSelectProvider provider;
061:
062: private Widget selectionWidget;
063: private Rectangle selectionSceneRectangle;
064:
065: public RectangularSelectAction(
066: RectangularSelectDecorator decorator,
067: LayerWidget interractionLayer,
068: RectangularSelectProvider provider) {
069: this .decorator = decorator;
070: this .interractionLayer = interractionLayer;
071: this .provider = provider;
072: }
073:
074: protected boolean isLocked() {
075: return selectionSceneRectangle != null;
076: }
077:
078: public State mousePressed(Widget widget, WidgetMouseEvent event) {
079: if (isLocked())
080: return State.createLocked(widget, this );
081: if (event.getButton() == MouseEvent.BUTTON1
082: && event.getClickCount() == 1) {
083: selectionWidget = decorator.createSelectionWidget();
084: assert selectionWidget != null;
085: interractionLayer.addChild(selectionWidget);
086: selectionSceneRectangle = new Rectangle(widget
087: .convertLocalToScene(event.getPoint()));
088: move(widget, event.getPoint());
089: return State.createLocked(widget, this );
090: }
091: return State.REJECTED;
092: }
093:
094: public State mouseReleased(Widget widget, WidgetMouseEvent event) {
095: if (selectionSceneRectangle != null) {
096: move(widget, event.getPoint());
097: selectionWidget.getParentWidget().removeChild(
098: selectionWidget);
099: provider.performSelection(selectionSceneRectangle);
100: selectionWidget = null;
101: selectionSceneRectangle = null;
102: }
103: return State.REJECTED;
104: }
105:
106: public State mouseDragged(Widget widget, WidgetMouseEvent event) {
107: if (selectionSceneRectangle != null) {
108: move(widget, event.getPoint());
109: return State.createLocked(widget, this );
110: }
111: return State.REJECTED;
112: }
113:
114: private void resolveSelectionWidgetLocationBounds() {
115: selectionWidget.setPreferredLocation(selectionSceneRectangle
116: .getLocation());
117: int w = selectionSceneRectangle.width;
118: int h = selectionSceneRectangle.height;
119: selectionWidget.setPreferredBounds(new Rectangle(
120: w >= 0 ? 0 : w, h >= 0 ? 0 : h, w >= 0 ? w : -w,
121: h >= 0 ? h : -h));
122: }
123:
124: private void move(Widget widget, Point newLocation) {
125: Point sceneLocation = widget.convertLocalToScene(newLocation);
126: selectionSceneRectangle.width = sceneLocation.x
127: - selectionSceneRectangle.x;
128: selectionSceneRectangle.height = sceneLocation.y
129: - selectionSceneRectangle.y;
130: resolveSelectionWidgetLocationBounds();
131: }
132:
133: }
|