GanttProjectのチャート上でのホイールの挙動をExcelライクにしてみた


Excelに慣れきった人にとって、GanttProjectの操作で一番違和感を感じるのはチャート上でのホイールを操作したときの挙動です。

Excel使いにとって、ホイールの操作は

  • ホイールの回転 = 上下スクロール
  • Ctrl+ホイールの操作 = ズームイン/アウト

という挙動を期待しますが、


GanttProjectでは

  • ホイールの回転 = ズームイン/アウト
  • Ctrl+ホイールの操作 = (反応なし)

という挙動をしてしまいます。


そのため、スクロールさせたいがためにホイールを操作してしまい、
チャートの縮尺が変わってしまうというという目に何度も遭遇してしまいます。


また、チャート上でのホイールによる上下スクロールができない(横スクロールはドラッグによるスクロールがサポートされているが...)ので、いちいち、画面左端のツリーペインまでマウスポインタを移動させなければならず、かなりストレスが溜まってしまいます。


そこで、このホイールの挙動をExcelライクにするためのパッチを作りました。ベースとなるソースは、現時点での安定版である 2.0.7 です。


パッチを作ったことがあまり無いので、これでいいのかは微妙ですが、とりあえず公開しますので、よろしければ使ってみてください。

Index: D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/ChartComponentBase.java
===================================================================
--- D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/ChartComponentBase.java	(revision 118)
+++ D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/ChartComponentBase.java	(working copy)
@@ -290,7 +290,14 @@
 
     protected class MouseWheelListenerBase implements MouseWheelListener {
         public void mouseWheelMoved(MouseWheelEvent e) {
-            if (isRotationUp(e)) {
+        	// Scroll
+        	if (!e.isControlDown()) {
+        		scrollTreePane(e.getWheelRotation() * 90);
+        		return;
+        	}
+        	
+        	// Zoom
+        	if (isRotationUp(e)) {
                 fireZoomOut();
             } else {
                 fireZoomIn();
@@ -313,6 +320,9 @@
             return e.getWheelRotation() < 0;
         }
     }
+    
+    protected void scrollTreePane(int amount) {
+    }
 
     protected abstract AbstractChartImplementation getImplementation();
 

Index: D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/GanttGraphicArea.java
===================================================================
--- D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/GanttGraphicArea.java	(revision 118)
+++ D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/GanttGraphicArea.java	(working copy)
@@ -973,6 +973,13 @@
             setActiveInteraction(new MoveTaskInteractions(e, tasks));
         }
     }
+    
+    /**
+     * Scrolling by relative amount.
+     */
+    protected void scrollTreePane(int amount) {
+    	tree.scrollVertical(amount);
+    }
 
     private class NewChartComponentImpl extends ChartImplementationBase
             implements ChartImplementation {


Index: D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/GanttTree2.java
===================================================================
--- D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/GanttTree2.java	(revision 118)
+++ D:/MyProject/GanttProject/ganttproject/src/net/sourceforge/ganttproject/GanttTree2.java	(working copy)
@@ -558,6 +558,24 @@
                 + (vbar.isVisible() ? vbar.getWidth() : 0), y - vbar.getValue()
                 + 20);
     }
+    
+    /** 
+     * Scroll up/down
+     */
+    public void scrollVertical(int amount) {
+    	int originalValue = vbar.getValue();
+    	
+    	int newValue = originalValue + amount;
+    	
+    	if (newValue < vbar.getMinimum()) {
+    		newValue = vbar.getMinimum();
+    	}
+    	else if (vbar.getMaximum() < newValue) {
+    		newValue = vbar.getMaximum();
+    	}
+    	
+    	vbar.setValue(newValue);
+    }
 
     /** Change grpahic part */
     public void setGraphicArea(GanttGraphicArea area) {

追記:2009.7.3

以下のエントリでバイナリの使い方とかを書いてます。(ちょっとわかりづらいかも...)