# HG changeset patch # User Peter Hofer # Date 1310383911 -7200 # Node ID ca968e2cf7cbb0aca1cbdcba338c9ae511018652 # Parent 8f51f58506522b8de466c72bcd5b99ba58f23a88 IdealGraphVisualizer: select blocks in the control flow graph by double-clicking them, thus allowing to move blocks without selecting them and changing the selecting in the node graph diff -r 8f51f5850652 -r ca968e2cf7cb src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java --- a/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java Sun Jul 10 11:21:37 2011 +0200 +++ b/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java Mon Jul 11 13:31:51 2011 +0200 @@ -65,7 +65,7 @@ private LayerWidget mainLayer; private LayerWidget selectLayer; private WidgetAction hoverAction = this.createWidgetHoverAction(); - private WidgetAction selectAction = ActionFactory.createSelectAction(this); + private WidgetAction selectAction = new DoubleClickSelectAction(this); private WidgetAction moveAction = ActionFactory.createMoveAction(null, this); public ControlFlowScene() { @@ -196,15 +196,19 @@ } public void setNewLocation(Widget widget, Point location) { - Point originalLocation = getOriginalLocation(widget); - int xOffset = location.x - originalLocation.x; - int yOffset = location.y - originalLocation.y; - for (Widget w : this.selection) { - Point p = new Point(w.getPreferredLocation()); - p.translate(xOffset, yOffset); - w.setPreferredLocation(p); + if (selection.contains(widget)) { + // move entire selection + Point originalLocation = getOriginalLocation(widget); + int xOffset = location.x - originalLocation.x; + int yOffset = location.y - originalLocation.y; + for (Widget w : selection) { + Point p = new Point(w.getPreferredLocation()); + p.translate(xOffset, yOffset); + w.setPreferredLocation(p); + } + } else { + widget.setPreferredLocation(location); } - } public Widget createSelectionWidget() { diff -r 8f51f5850652 -r ca968e2cf7cb src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/DoubleClickSelectAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/DoubleClickSelectAction.java Mon Jul 11 13:31:51 2011 +0200 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +package com.sun.hotspot.igv.controlflow; + +import java.awt.Point; +import java.awt.event.MouseEvent; +import org.netbeans.api.visual.action.SelectProvider; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.widget.Widget; + +/** + * Selection action that acts on double-click only. Does not support aiming. + * + * @author Peter Hofer + */ +public class DoubleClickSelectAction extends WidgetAction.LockedAdapter { + + private final SelectProvider provider; + + public DoubleClickSelectAction(SelectProvider provider) { + this.provider = provider; + } + + protected boolean isLocked() { + return false; + } + + @Override + public State mousePressed(Widget widget, WidgetMouseEvent event) { + if (event.getClickCount() >= 2 && (event.getButton() == MouseEvent.BUTTON1 || event.getButton() == MouseEvent.BUTTON2)) { + boolean invert = (event.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) != 0; + Point point = event.getPoint(); + if (provider.isSelectionAllowed(widget, point, invert)) { + provider.select(widget, point, invert); + return State.CHAIN_ONLY; + } + } + return State.REJECTED; + } +}