a36bbcb805bd2bc207891fa0afbc1f7b2f227ea4
[slipway.git] / src / edu / berkeley / obits / gui / ZoomingPanel.java
1 package edu.berkeley.obits.gui;
2
3 import static edu.berkeley.obits.device.atmel.AtmelDevice.Constants.*;
4 import static edu.berkeley.obits.device.atmel.AtmelDevice.Util.*;
5 import edu.berkeley.obits.*;
6 import edu.berkeley.obits.device.atmel.*;
7 import java.awt.*;
8 import java.awt.geom.*;
9 import java.awt.event.*;
10 import java.awt.color.*;
11 import org.ibex.util.*;
12 import java.io.*;
13 import java.util.*;
14 import javax.swing.*;
15
16 public abstract class ZoomingPanel extends JComponent implements KeyListener, MouseMotionListener {
17
18     double scale = 1.0;
19     double oscale = 1.0;
20     public    int dragx = 0;
21     public    int dragy = 0;
22     public    boolean drag = false;
23     protected int mousex;
24     protected int mousey;
25     protected AffineTransform transform = new AffineTransform();
26     private   Point2D recenter;
27     private   Point2D recenter2;
28
29     public ZoomingPanel() {
30         setDoubleBuffered(true);
31         addKeyListener(this);
32         addMouseMotionListener(this);
33     }
34
35     public abstract void _paint(Graphics2D g);
36
37     public final void paint(Graphics _g) {
38         Graphics2D g = (Graphics2D)_g;
39         g.scale(scale,scale);
40         g.translate(10, 0);
41         g.scale(1, -1);
42         g.translate(5, -1 * getHeight() + 10);
43
44         transform = g.getTransform();
45
46         Point2D p = new Point2D.Float();
47         if (recenter != null) {
48             transform.transform(recenter, p);
49             transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
50                                                                           dragy - p.getY()));
51         }
52         g.setTransform(transform);
53
54         if (drag) {
55             g.setColor(Color.blue);
56             g.drawLine((int)(recenter.getX() - 10),
57                        (int)(recenter.getY() - 10),
58                        (int)(recenter.getX() + 10),
59                        (int)(recenter.getY() + 10));
60             g.drawLine((int)(recenter.getX() + 10),
61                        (int)(recenter.getY() - 10),
62                        (int)(recenter.getX() - 10),
63                        (int)(recenter.getY() + 10));
64         }
65         _paint(g);
66     }
67
68
69     public void keyTyped(KeyEvent k) {
70     }
71     public void keyReleased(KeyEvent k) {
72         if (k.getKeyCode() == k.VK_ALT) {
73             if (drag) {
74                 drag = false;
75                 oscale = scale;
76                 repaint();
77             }
78         }
79     }
80     public void keyPressed(KeyEvent k) {
81         if (k.getKeyCode() == k.VK_ALT) {
82             drag = true;
83             dragx = mousex;
84             dragy = mousey;
85             recenter = new Point2D.Float(dragx, dragy);
86             try {
87                 transform.inverseTransform(recenter, recenter);
88             } catch (Exception e) {
89                 e.printStackTrace();
90             }
91         }
92         char c = k.getKeyChar();
93         switch(c) {
94             case '+': scale += 0.1; repaint(); return;
95             case '-': scale -= 0.1; repaint(); return;
96             case 'z': scale = 1.0; recenter = null; repaint(); return;
97         }
98     }
99     public void mouseMoved(MouseEvent m) {
100         /*
101         Cell oldcell = whichCell(mousex, mousey);
102         Cell newcell = whichCell(m.getX(), m.getY());
103         System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+"  "))+
104                            (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+"  ")));
105         if (oldcell != newcell) {
106             if (oldcell != null) oldcell.in = false;
107             if (newcell != null) newcell.in = true;
108             repaint();
109         }
110         */
111         mousex = m.getX();
112         mousey = m.getY();
113         if (drag) {
114             if (mousey > dragy + 5) {
115                 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
116             } else if (mousey < dragy - 5) {
117                 scale = oscale + ((dragy - mousey) / 50.0);
118             } else {
119                 scale = oscale;
120             }
121             repaint();
122         }
123     }
124
125    
126     public boolean isFocusable() { return true; }
127
128     public void mouseDragged(MouseEvent m) {
129         mouseMoved(m);
130         dragx = m.getX();
131         dragy = m.getY();
132     }
133     public void mousePressed(MouseEvent m) {
134         recenter = new Point2D.Float(m.getX(), m.getY());
135         try {
136             transform.transform(recenter, recenter);
137         } catch (Exception e) {
138             e.printStackTrace();
139         }
140         repaint();
141     }
142     public void mouseEntered(MouseEvent e) { }
143     public void mouseExited(MouseEvent e) { }
144     public void mouseClicked(MouseEvent e) { }
145     public void mouseReleased(MouseEvent e) { }
146 }