From 5d7e8d5f7646504fee994dbaefac339b45a8913f Mon Sep 17 00:00:00 2001 From: Joachim Rohde Date: Sun, 25 Jan 2026 11:13:25 +0100 Subject: [PATCH 1/2] Added keybindings to move the graph with cursor keys around. Also added keybindings and mouse wheel listener to zoom in (CTRL + +) and zoom out (CTRL + -). --- .../modules/maven/graph/Bundle.properties | 4 +- .../graph/DependencyGraphTopComponent.form | 7 +- .../graph/DependencyGraphTopComponent.java | 98 ++++++++++++++++++- 3 files changed, 105 insertions(+), 4 deletions(-) diff --git a/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties b/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties index 18dc9a84980c..13318b0a5f5c 100644 --- a/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties +++ b/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties @@ -29,4 +29,6 @@ FixVersionConflictPanel.fixPossibL.text=Fix possibilities: FixVersionConflictPanel.summaryL.text=Fix Summary: ERR_UpdateModel=Cannot update POM: {0} -DependencyGraphTopComponent.btnGraph.text=Show Graph \ No newline at end of file +DependencyGraphTopComponent.btnGraph.text=Show Graph +DependencyGraphTopComponent.btnBigger.toolTipText=CTRL + + +DependencyGraphTopComponent.btnSmaller.toolTipText=CTRL + - diff --git a/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.form b/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.form index 309532513129..1ec966a5cfee 100644 --- a/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.form +++ b/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.form @@ -50,7 +50,6 @@ - @@ -74,6 +73,9 @@ + + + @@ -87,6 +89,9 @@ + + + diff --git a/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java b/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java index e31eac9cae44..d5565230399c 100644 --- a/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java +++ b/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java @@ -29,6 +29,9 @@ import java.awt.Stroke; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; @@ -41,6 +44,7 @@ import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; +import javax.swing.AbstractAction; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; @@ -51,6 +55,7 @@ import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JToolBar; +import javax.swing.KeyStroke; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.Timer; @@ -94,7 +99,7 @@ * component showing graph of dependencies for project. * @author Milos Kleint */ -public class DependencyGraphTopComponent extends TopComponent implements LookupListener, MultiViewElement { +public class DependencyGraphTopComponent extends TopComponent implements LookupListener, MultiViewElement, MouseWheelListener { private static final @StaticResource String ZOOM_IN_ICON = "org/netbeans/modules/maven/graph/zoomin.gif"; private static final @StaticResource String ZOOM_OUT_ICON = "org/netbeans/modules/maven/graph/zoomout.gif"; @@ -326,6 +331,93 @@ public void componentActivated() { } } + /** + * Adds key bindings to move the graph with the cursor-keys around. + * Zoom-in/-out with CTRL + + and CTRL + - or the mouse wheel. + */ + public void addKeyboardBindings() { + + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_DOWN_MASK), "zoomIn"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, KeyEvent.CTRL_DOWN_MASK), "zoomIn"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, KeyEvent.CTRL_DOWN_MASK), "zoomOut"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.CTRL_DOWN_MASK), "zoomOut"); + + getActionMap().put("left", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + pane.getHorizontalScrollBar().setValue(pane.getHorizontalScrollBar().getValue() - 10); + } + }); + + getActionMap().put("right", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + pane.getHorizontalScrollBar().setValue(pane.getHorizontalScrollBar().getValue() + 10); + } + }); + + getActionMap().put("up", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + pane.getVerticalScrollBar().setValue(pane.getVerticalScrollBar().getValue() - 10); + } + }); + + getActionMap().put("down", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + pane.getVerticalScrollBar().setValue(pane.getVerticalScrollBar().getValue() + 10); + } + }); + + getActionMap().put("zoomIn", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + btnBiggerActionPerformed(e); + } + }); + + getActionMap().put("zoomOut", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + btnSmallerActionPerformed(e); + } + }); + + if (scene != null) { + pane.setWheelScrollingEnabled(false); + JComponent sceneView = scene.getView(); + if (sceneView == null) { + sceneView = scene.createView(); + } + pane.setViewportView(sceneView); + sceneView.addMouseWheelListener(this); + + sceneView.setFocusable(true); + sceneView.requestFocusInWindow(); + + sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK), "left"); + sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK), "right"); + sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up"); + sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down"); + + } + } + + + @Override + public void mouseWheelMoved(MouseWheelEvent evt) { + + final int notches = evt.getWheelRotation(); + if (notches < 0) { + // mouse wheel moved up, zoom in + btnBiggerActionPerformed(null); + } else { + // mouse wheel moved down, zoom out + btnSmallerActionPerformed(null); + } + } + @Override public void componentClosed() { super.componentClosed(); @@ -371,7 +463,6 @@ private void initComponents() { jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); - jToolBar1.setFloatable(false); jToolBar1.setRollover(true); org.openide.awt.Mnemonics.setLocalizedText(btnGraph, org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.btnGraph.text")); // NOI18N @@ -386,6 +477,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { jToolBar1.add(btnGraph); btnBigger.setIcon(ImageUtilities.loadImageIcon(ZOOM_IN_ICON, true)); + btnBigger.setToolTipText(org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.btnBigger.toolTipText")); // NOI18N btnBigger.setFocusable(false); btnBigger.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); btnBigger.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); @@ -397,6 +489,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { jToolBar1.add(btnBigger); btnSmaller.setIcon(ImageUtilities.loadImageIcon(ZOOM_OUT_ICON, true)); + btnSmaller.setToolTipText(org.openide.util.NbBundle.getMessage(DependencyGraphTopComponent.class, "DependencyGraphTopComponent.btnSmaller.toolTipText")); // NOI18N btnSmaller.setFocusable(false); btnSmaller.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); btnSmaller.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); @@ -621,6 +714,7 @@ public Stroke getStroke(MavenDependencyNode source, MavenDependencyNode target) sceneView = scene.createView(); // vlv: print sceneView.putClientProperty("print.printable", true); // NOI18N + addKeyboardBindings(); } pane.setViewportView(sceneView); scene.setSurroundingScrollPane(pane); From 8127fa4c37f44af9e1e36ed20565a84dfaf4ec0f Mon Sep 17 00:00:00 2001 From: Joachim Rohde Date: Fri, 30 Jan 2026 12:31:15 +0100 Subject: [PATCH 2/2] Removed the mousewheel listener, removed previously added shortcuts for keyboard navigation and changed the tooltips. --- .../modules/maven/graph/Bundle.properties | 4 +- .../graph/DependencyGraphTopComponent.java | 68 ++----------------- 2 files changed, 9 insertions(+), 63 deletions(-) diff --git a/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties b/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties index 13318b0a5f5c..769594f6bf56 100644 --- a/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties +++ b/java/maven.graph/src/org/netbeans/modules/maven/graph/Bundle.properties @@ -30,5 +30,5 @@ FixVersionConflictPanel.summaryL.text=Fix Summary: ERR_UpdateModel=Cannot update POM: {0} DependencyGraphTopComponent.btnGraph.text=Show Graph -DependencyGraphTopComponent.btnBigger.toolTipText=CTRL + + -DependencyGraphTopComponent.btnSmaller.toolTipText=CTRL + - +DependencyGraphTopComponent.btnBigger.toolTipText=Zoom in (Alt+- or Ctrl+mousewheel) +DependencyGraphTopComponent.btnSmaller.toolTipText=Zoom out (Alt++ or Ctrl+mousewheel) diff --git a/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java b/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java index d5565230399c..fde107b7713b 100644 --- a/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java +++ b/java/maven.graph/src/org/netbeans/modules/maven/graph/DependencyGraphTopComponent.java @@ -30,8 +30,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; -import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; @@ -99,7 +97,7 @@ * component showing graph of dependencies for project. * @author Milos Kleint */ -public class DependencyGraphTopComponent extends TopComponent implements LookupListener, MultiViewElement, MouseWheelListener { +public class DependencyGraphTopComponent extends TopComponent implements LookupListener, MultiViewElement { private static final @StaticResource String ZOOM_IN_ICON = "org/netbeans/modules/maven/graph/zoomin.gif"; private static final @StaticResource String ZOOM_OUT_ICON = "org/netbeans/modules/maven/graph/zoomout.gif"; @@ -333,42 +331,14 @@ public void componentActivated() { /** * Adds key bindings to move the graph with the cursor-keys around. - * Zoom-in/-out with CTRL + + and CTRL + - or the mouse wheel. + * Zoom-in/-out with Alt++ and Alt+- */ public void addKeyboardBindings() { - getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.CTRL_DOWN_MASK), "zoomIn"); - getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, KeyEvent.CTRL_DOWN_MASK), "zoomIn"); - getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, KeyEvent.CTRL_DOWN_MASK), "zoomOut"); - getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.CTRL_DOWN_MASK), "zoomOut"); - - getActionMap().put("left", new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - pane.getHorizontalScrollBar().setValue(pane.getHorizontalScrollBar().getValue() - 10); - } - }); - - getActionMap().put("right", new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - pane.getHorizontalScrollBar().setValue(pane.getHorizontalScrollBar().getValue() + 10); - } - }); - - getActionMap().put("up", new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - pane.getVerticalScrollBar().setValue(pane.getVerticalScrollBar().getValue() - 10); - } - }); - - getActionMap().put("down", new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - pane.getVerticalScrollBar().setValue(pane.getVerticalScrollBar().getValue() + 10); - } - }); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, KeyEvent.ALT_DOWN_MASK), "zoomIn"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, KeyEvent.ALT_DOWN_MASK), "zoomIn"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, KeyEvent.ALT_DOWN_MASK), "zoomOut"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.ALT_DOWN_MASK), "zoomOut"); getActionMap().put("zoomIn", new AbstractAction() { @Override @@ -385,39 +355,15 @@ public void actionPerformed(ActionEvent e) { }); if (scene != null) { - pane.setWheelScrollingEnabled(false); JComponent sceneView = scene.getView(); if (sceneView == null) { sceneView = scene.createView(); } pane.setViewportView(sceneView); - sceneView.addMouseWheelListener(this); - - sceneView.setFocusable(true); sceneView.requestFocusInWindow(); - - sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK), "left"); - sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK), "right"); - sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up"); - sceneView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down"); - } } - - - @Override - public void mouseWheelMoved(MouseWheelEvent evt) { - - final int notches = evt.getWheelRotation(); - if (notches < 0) { - // mouse wheel moved up, zoom in - btnBiggerActionPerformed(null); - } else { - // mouse wheel moved down, zoom out - btnSmallerActionPerformed(null); - } - } - + @Override public void componentClosed() { super.componentClosed();