gzz-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gzz-commits] fenfire/org/fenfire/view/buoy MainNode2D.java


From: Benja Fallenstein
Subject: [Gzz-commits] fenfire/org/fenfire/view/buoy MainNode2D.java
Date: Fri, 25 Apr 2003 08:16:02 -0400

CVSROOT:        /cvsroot/fenfire
Module name:    fenfire
Changes by:     Benja Fallenstein <address@hidden>      03/04/25 08:16:02

Modified files:
        org/fenfire/view/buoy: MainNode2D.java 

Log message:
        Start porting mouse code for moving on 2D planes

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/view/buoy/MainNode2D.java.diff?tr1=1.5&tr2=1.6&r1=text&r2=text

Patches:
Index: fenfire/org/fenfire/view/buoy/MainNode2D.java
diff -u fenfire/org/fenfire/view/buoy/MainNode2D.java:1.5 
fenfire/org/fenfire/view/buoy/MainNode2D.java:1.6
--- fenfire/org/fenfire/view/buoy/MainNode2D.java:1.5   Thu Apr 24 16:52:24 2003
+++ fenfire/org/fenfire/view/buoy/MainNode2D.java       Fri Apr 25 08:16:02 2003
@@ -1,7 +1,7 @@
 /*
 PageScrollView2D.java
  *    
- *    Copyright (c) 2003 by Benja Fallenstein
+ *    Copyright (c) 2003 by Benja Fallenstein and Matti Katila
  *    
  *    This file is part of Fenfire.
  *    
@@ -22,11 +22,13 @@
  *    
  */
 /*
- * Written by Benja Fallenstein
+ * Written by Benja Fallenstein 
+ * Based on code by Matti Katila
  */
 package org.fenfire.view.buoy;
 import org.fenfire.view.View2D;
 import org.nongnu.libvob.*;
+import org.nongnu.libvob.impl.DefaultVobMatcher;
 import org.nongnu.libvob.buoy.*;
 
 import java.awt.event.MouseEvent;
@@ -36,6 +38,8 @@
  *  command for moving on the spatial plane.
  */
 public class MainNode2D implements BuoyViewMainNode {
+    public static boolean dbg = false;
+    private static void pa(String s) { System.out.println(s); }
     
     protected Object plane;
     protected View2D view;
@@ -65,19 +69,98 @@
        }
     }
 
+    private int focusFrame = -1;
+    private int box2paper = -1;
+    private float w, h;
     public void renderMain(VobScene vs, int into) {
        vs.coords.getSqSize(into, tmp);
-       float w = tmp[0], h = tmp[1];
-       int box2paper = 
+       w = tmp[0]; h = tmp[1];
+       focusFrame = into;
+       box2paper =
            vs.coords.orthoBox(0, 0, panX-w/2, panY-h/2, 
                               1/zoom, 1/zoom, w, h);
+
        view.render(vs, plane, into, into, box2paper);
     }
     public void keystroke(String s) {
        // XXX
     }
+
+    // Mouse press state
+    // x, y, buttons
+    private int [] m_state = null;
+    private float m_state_zoom = -1;
+    private float pan[] = new float[2];
     public boolean mouse(MouseEvent e, VobScene oldVobScene) {
-       // XXX
+       if (e.getID() == MouseEvent.MOUSE_PRESSED) {
+           m_state = new int[]{ e.getX(), e.getY(), e.getModifiers()};
+           m_state_zoom = zoom;
+           pan[0] = panX; pan[1] = panY;
+
+           return false;
+       }
+       if (m_state == null) throw new Error("Mouse state not found!");
+
+       // let's zoom!!
+       if (m_state[2] == e.BUTTON3_MASK) {
+           zoom = m_state_zoom * (float) 
+               Math.exp((m_state[1] - e.getY())/150.0);
+           AbstractUpdateManager.setNoAnimation();
+           setZoomPan(oldVobScene, focusFrame);
+           return true;
+       }
+
+       // Move by dragging with button 1
+       if (m_state[2] == e.BUTTON1_MASK && e.getID() == 
MouseEvent.MOUSE_DRAGGED) {
+           panX = pan[0] + (m_state[0] - e.getX())/zoom;
+           panY = pan[1] + (m_state[1] - e.getY())/zoom;
+
+           setZoomPan(oldVobScene, focusFrame);
+           return true;
+       }
+       
+       // Move around by clicking
+       if (m_state[2] == e.BUTTON1_MASK && e.getID() == 
MouseEvent.MOUSE_CLICKED){
+
+           float[] pt = new float[] { e.getX(), e.getY(), 0 };
+
+           // We must transform into Frame, and then the C2F coordinate system
+           int mainctrCS = ((DefaultVobMatcher)oldVobScene.matcher).getCS(0, 
"FocusCenter");
+           //pa("mainctr"+ mainctrCS);
+               
+           int frame = 
((DefaultVobMatcher)oldVobScene.matcher).getCS(mainctrCS, "FocusFrame");
+           //int frame = focusFrame;
+           int f2c = ((DefaultVobMatcher)oldVobScene.matcher).getCS(frame, 
"F2C");
+           if (f2c < 0) f2c = box2paper;
+           if(frame < 0 || f2c < 0)
+               throw new Error("No cs point!"+frame+" "+f2c);
+               
+           // XXX vp, not frame!
+           oldVobScene.coords.inverseTransformPoints3(mainctrCS, pt, pt);
+           //oldVobScene.coords.inverseTransformPoints3(frame, pt, pt);
+           oldVobScene.coords.transformPoints3(f2c, pt, pt);
+           panX = pt[0]; panY = pt[1];
+               
+           // XXX current = current.h(d.contains);   
+           //setZoomPan(oldVobScene, focusFrame);
+           AbstractUpdateManager.chg();
+           return false;
+       }
+
+       if(dbg) pa("nothing!");
        return false;
+    }
+
+
+    /** Cause the changes to the zooming and panning variables
+     * to be shown in the given vobscene.
+     * This changes the parameters of the coordinate systems created by 
render().
+     */
+    private void setZoomPan(VobScene vs, int mainFrame) {
+       DefaultVobMatcher m = (DefaultVobMatcher)vs.matcher;
+       // The point is that cs should transform (panx, pany) to (0,0)
+       // and (panx+1, pany+1) to (zoom, zoom)
+       vs.coords.setOrthoBoxParams(box2paper, 0, panX-w/2, panY-h/2, 
+                                   1/zoom, 1/zoom, w, h);
     }
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]