# HG changeset patch # User Thomas Wuerthinger # Date 1321306454 -3600 # Node ID fc07cf6848fbe78d7c2dd9553cf16f08bb329e39 # Parent 136ea96eb7f88aed704e39d82df42966d664e800# Parent 1ae6a886a45f0cd650dfcca0cc572715d08bcfd1 Merge. diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java --- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java Mon Nov 14 22:33:15 2011 +0100 +++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java Mon Nov 14 22:34:14 2011 +0100 @@ -48,6 +48,7 @@ import com.sun.hotspot.igv.selectioncoordinator.SelectionCoordinator; import com.sun.hotspot.igv.util.ColorIcon; import com.sun.hotspot.igv.util.PropertiesSheet; +import com.sun.hotspot.igv.view.actions.CustomizablePanAction; import com.sun.hotspot.igv.view.widgets.InputSlotWidget; import com.sun.hotspot.igv.view.widgets.OutputSlotWidget; import com.sun.hotspot.igv.view.widgets.SlotWidget; @@ -57,6 +58,7 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.util.ArrayList; @@ -107,6 +109,7 @@ */ public class DiagramScene extends ObjectScene implements DiagramViewer { + private CustomizablePanAction panAction; private WidgetAction hoverAction; private WidgetAction selectAction; private Lookup lookup; @@ -409,7 +412,13 @@ this.getInputBindings().setZoomActionModifiers(0); scrollPane = createScrollPane(); - this.getActions().addAction(ActionFactory.createPanAction()); + + // This panAction handles the event only when the left mouse button is + // pressed without any modifier keys, otherwise it will not consume it + // and the selection action will handle the event + panAction = new CustomizablePanAction(~0, MouseEvent.BUTTON1_DOWN_MASK); + this.getActions().addAction(panAction); + hoverAction = createObjectHoverAction(); selectAction = createSelectAction(); this.getActions().addAction(selectAction); @@ -830,6 +839,12 @@ } } + public void setInteractionMode(InteractionMode mode) { + panAction.setEnabled(mode == InteractionMode.PANNING); + // When panAction is not enabled, it does not consume the event + // and the selection action handles it instead + } + private class ConnectionSet { private Set connections; diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewer.java --- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewer.java Mon Nov 14 22:33:15 2011 +0100 +++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewer.java Mon Nov 14 22:34:14 2011 +0100 @@ -39,6 +39,11 @@ */ interface DiagramViewer { + enum InteractionMode { + SELECTION, + PANNING, + } + public void paint(Graphics2D svgGenerator); public Lookup getLookup(); @@ -62,5 +67,7 @@ public void setSelection(Collection
list); public void centerFigures(List
list); + + public void setInteractionMode(InteractionMode mode); } diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java --- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java Mon Nov 14 22:33:15 2011 +0100 +++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java Mon Nov 14 22:34:14 2011 +0100 @@ -49,6 +49,8 @@ import com.sun.hotspot.igv.util.RangeSlider; import com.sun.hotspot.igv.svg.BatikSVG; import com.sun.hotspot.igv.util.LookupHistory; +import com.sun.hotspot.igv.view.actions.PanModeAction; +import com.sun.hotspot.igv.view.actions.SelectionModeAction; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; @@ -72,6 +74,7 @@ import java.util.List; import java.util.Set; import javax.swing.Action; +import javax.swing.ButtonGroup; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JToggleButton; @@ -106,6 +109,8 @@ private EnableBlockLayoutAction blockLayoutAction; private OverviewAction overviewAction; private PredSuccAction predSuccAction; + private SelectionModeAction selectionModeAction; + private PanModeAction panModeAction; private boolean notFirstTime; private JComponent satelliteComponent; private JPanel centerPanel; @@ -263,6 +268,23 @@ toolBar.add(UndoAction.get(UndoAction.class)); toolBar.add(RedoAction.get(RedoAction.class)); + toolBar.addSeparator(); + ButtonGroup interactionButtons = new ButtonGroup(); + + panModeAction = new PanModeAction(); + panModeAction.setSelected(true); + button = new JToggleButton(panModeAction); + button.setSelected(true); + interactionButtons.add(button); + toolBar.add(button); + panModeAction.addPropertyChangeListener(this); + + selectionModeAction = new SelectionModeAction(); + button = new JToggleButton(selectionModeAction); + interactionButtons.add(button); + toolBar.add(button); + selectionModeAction.addPropertyChangeListener(this); + centerPanel = new JPanel(); this.add(centerPanel, BorderLayout.CENTER); cardLayout = new CardLayout(); @@ -472,6 +494,12 @@ } else if (evt.getSource() == this.blockLayoutAction) { boolean b = (Boolean) blockLayoutAction.getValue(EnableBlockLayoutAction.STATE); this.getModel().setShowBlocks(b); + } else if (evt.getSource() == this.selectionModeAction || evt.getSource() == this.panModeAction) { + if (panModeAction.isSelected()) { + scene.setInteractionMode(DiagramViewer.InteractionMode.PANNING); + } else if (selectionModeAction.isSelected()) { + scene.setInteractionMode(DiagramViewer.InteractionMode.SELECTION); + } } else { assert false : "Unknown event source"; } diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/CustomizablePanAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/CustomizablePanAction.java Mon Nov 14 22:34:14 2011 +0100 @@ -0,0 +1,145 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun + * Microsystems, Inc. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ +package com.sun.hotspot.igv.view.actions; + +import java.awt.Container; +import java.awt.Point; +import java.awt.Rectangle; +import javax.swing.JComponent; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.action.WidgetAction.State; +import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent; +import org.netbeans.api.visual.widget.Scene; +import org.netbeans.api.visual.widget.Widget; + +/** + * @author David Kaspar + * @author Peter Hofer + */ +public class CustomizablePanAction extends WidgetAction.LockedAdapter { + private boolean enabled = true; + + private Scene scene; + private JScrollPane scrollPane; + private Point lastLocation; + + private final int modifiersExMask; + private final int modifiersEx; + + public CustomizablePanAction(int modifiersExMask, int modifiersEx) { + this.modifiersExMask = modifiersExMask; + this.modifiersEx = modifiersEx; + } + + protected boolean isLocked() { + return scrollPane != null; + } + + public void setEnabled(boolean enabled) { + if (this.enabled != enabled) { + if (isLocked()) + throw new IllegalStateException(); + + this.enabled = enabled; + } + } + + @Override + public State mousePressed (Widget widget, WidgetMouseEvent event) { + if (isLocked ()) + return State.createLocked (widget, this); + if (enabled && (event.getModifiersEx() & modifiersExMask) == modifiersEx) { + scene = widget.getScene (); + scrollPane = findScrollPane (scene.getView ()); + if (scrollPane != null) { + lastLocation = scene.convertSceneToView (widget.convertLocalToScene (event.getPoint ())); + SwingUtilities.convertPointToScreen (lastLocation, scene.getView ()); + return State.createLocked (widget, this); + } + } + return State.REJECTED; + } + + private JScrollPane findScrollPane (JComponent component) { + for (;;) { + if (component == null) + return null; + if (component instanceof JScrollPane) + return ((JScrollPane) component); + Container parent = component.getParent (); + if (! (parent instanceof JComponent)) + return null; + component = (JComponent) parent; + } + } + + @Override + public State mouseReleased (Widget widget, WidgetMouseEvent event) { + boolean state = pan (widget, event.getPoint ()); + if (state) + scrollPane = null; + return state ? State.createLocked (widget, this) : State.REJECTED; + } + + @Override + public State mouseDragged (Widget widget, WidgetMouseEvent event) { + return pan (widget, event.getPoint ()) ? State.createLocked (widget, this) : State.REJECTED; + } + + private boolean pan (Widget widget, Point newLocation) { + if (scrollPane == null || scene != widget.getScene ()) + return false; + newLocation = scene.convertSceneToView (widget.convertLocalToScene (newLocation)); + SwingUtilities.convertPointToScreen (newLocation, scene.getView ()); + JComponent view = scene.getView (); + Rectangle rectangle = view.getVisibleRect (); + rectangle.x += lastLocation.x - newLocation.x; + rectangle.y += lastLocation.y - newLocation.y; + view.scrollRectToVisible (rectangle); + lastLocation = newLocation; + return true; + } +} diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PanModeAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PanModeAction.java Mon Nov 14 22:34:14 2011 +0100 @@ -0,0 +1,58 @@ +/* + * 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.view.actions; + +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ImageIcon; +import org.openide.util.ImageUtilities; + +public class PanModeAction extends AbstractAction { + + private boolean state; + + public PanModeAction() { + putValue(AbstractAction.SMALL_ICON, new ImageIcon(ImageUtilities.loadImage(iconResource()))); + putValue(SELECTED_KEY, false); + putValue(Action.SHORT_DESCRIPTION, "Panning mode"); + } + + public boolean isSelected() { + return (Boolean)getValue(SELECTED_KEY); + } + + public void setSelected(boolean b) { + if (isSelected() != b) { + this.putValue(SELECTED_KEY, b); + } + } + + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/pan_mode.png"; + } + + public void actionPerformed(ActionEvent e) { + } +} diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/SelectionModeAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/SelectionModeAction.java Mon Nov 14 22:34:14 2011 +0100 @@ -0,0 +1,56 @@ +/* + * 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.view.actions; + +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ImageIcon; +import org.openide.util.ImageUtilities; + +public class SelectionModeAction extends AbstractAction { + + public SelectionModeAction() { + putValue(AbstractAction.SMALL_ICON, new ImageIcon(ImageUtilities.loadImage(iconResource()))); + putValue(SELECTED_KEY, false); + putValue(Action.SHORT_DESCRIPTION, "Selection mode"); + } + + public boolean isSelected() { + return (Boolean)getValue(SELECTED_KEY); + } + + public void setSelected(boolean b) { + if (isSelected() != b) { + this.putValue(SELECTED_KEY, b); + } + } + + protected String iconResource() { + return "com/sun/hotspot/igv/view/images/selection_mode.png"; + } + + public void actionPerformed(ActionEvent e) { + } +} diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/pan_mode.png Binary file src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/pan_mode.png has changed diff -r 136ea96eb7f8 -r fc07cf6848fb src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/selection_mode.png Binary file src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/selection_mode.png has changed