9fbe2e4317ec14a43146d09637eff37ddcd9f5f0
[slipway.git] / src / edu / berkeley / obits / gui / ZoomingPanel.java
1 package edu.berkeley.obits.gui;
2
3 import com.atmel.fpslic.*;
4 import static com.atmel.fpslic.FpslicConstants.*;
5 import static com.atmel.fpslic.Fpslic.Util.*;
6 import edu.berkeley.obits.*;
7 import edu.berkeley.obits.device.atmel.*;
8 import java.awt.*;
9 import java.awt.geom.*;
10 import java.awt.event.*;
11 import static java.awt.event.KeyEvent.*;
12 import java.awt.color.*;
13 import org.ibex.util.*;
14 import java.io.*;
15 import java.util.*;
16 import javax.swing.*;
17
18 public abstract class ZoomingPanel extends JComponent implements KeyListener, MouseMotionListener, MouseListener {
19
20     double scale = 1.0;
21     double oscale = 1.0;
22     public    int dragx = 0;
23     public    int dragy = 0;
24     public    boolean drag = false;
25     protected int mousex;
26     protected int mousey;
27     protected AffineTransform transform = new AffineTransform();
28     private   Point2D recenter;
29     private   Point2D recenter2;
30
31     public ZoomingPanel() {
32         setDoubleBuffered(true);
33         addKeyListener(this);
34         addMouseMotionListener(this);
35         addMouseListener(this);
36     }
37
38     public abstract void _paint(Graphics2D g);
39
40     public final void paint(Graphics _g) {
41         Graphics2D g = (Graphics2D)_g;
42         g.scale(scale,scale);
43         g.translate(10, 0);
44         g.scale(1, -1);
45         g.translate(5, -1 * getHeight() + 10);
46
47         transform = g.getTransform();
48
49         Point2D p = new Point2D.Float();
50         if (recenter != null) {
51             transform.transform(recenter, p);
52             transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
53                                                                           dragy - p.getY()));
54         }
55         g.setTransform(transform);
56
57         if (drag) {
58             g.setColor(Color.blue);
59             g.drawLine((int)(recenter.getX() - 10),
60                        (int)(recenter.getY() - 10),
61                        (int)(recenter.getX() + 10),
62                        (int)(recenter.getY() + 10));
63             g.drawLine((int)(recenter.getX() + 10),
64                        (int)(recenter.getY() - 10),
65                        (int)(recenter.getX() - 10),
66                        (int)(recenter.getY() + 10));
67         }
68         _paint(g);
69     }
70
71
72     public void keyTyped(KeyEvent k) {
73     }
74     public void keyReleased(KeyEvent k) {
75         shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
76         if (k.getKeyCode() == k.VK_ALT) {
77             if (drag) {
78                 drag = false;
79                 oscale = scale;
80                 repaint();
81             }
82         }
83         switch(k.getKeyCode()) {
84             case VK_X: xkey = false; return; 
85             case VK_Y: ykey = false; return; 
86         }
87     }
88     public char lastChar;
89     public int keyMode;
90     public void keyPressed(KeyEvent k) {
91         shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
92         keyPressed0(k);
93         char c = k.getKeyChar();
94         if (c=='q') c = 'y';
95         lastChar = c;
96     }
97     public boolean shiftkey = false;
98     public void keyPressed0(KeyEvent k) {
99         repaint();
100         if (k.getKeyCode() == k.VK_ALT) {
101             drag = true;
102             dragx = mousex;
103             dragy = mousey;
104             recenter = new Point2D.Float(dragx, dragy);
105             try {
106                 transform.inverseTransform(recenter, recenter);
107             } catch (Exception e) {
108                 e.printStackTrace();
109             }
110         }
111         Gui.Cell cell = whichCell(mousex, mousey);
112         Fpslic.Cell c = cell == null ? null : cell.cell;
113         if ((k.getModifiers() & k.ALT_MASK) != 0)
114             switch(k.getKeyCode()) {
115                 case VK_S:
116                     writeMode4();
117                     break;
118                 case VK_O:
119                     readMode4();
120                     break;
121             }
122
123         else switch(k.getKeyCode()) {
124             case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
125
126             case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
127                 int i = L0 + (k.getKeyChar() - '0');
128                 switch(lastChar) {
129                     case 'x': c.xi(i); break;
130                     case 'y': case 'q': c.yi(i); break;
131                     case 'w': c.wi(i); break;
132                     case 'z': c.zi(i); break;
133                     case 'o': c.out(i, !c.out(i)); break;
134                     case 'h': c.h(i, !c.hx(i)); break;
135                     case 'v': c.v(i, !c.vx(i)); break;
136                 }
137                 repaint();
138                 return;
139                 }
140
141             case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
142             case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
143             case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
144             case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
145             case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
146
147             case VK_C:
148                 if (lastChar == 'x') { c.xo(true); repaint(); return; }
149                 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
150                 switch(c.c()) {
151                     case XLUT: c.c(YLUT); break;
152                     case YLUT: c.c(ZMUX); break;
153                     case ZMUX: c.c(XLUT); break;
154                     default:   c.c(ZMUX); break;
155                 }
156                 repaint();
157                 return;
158
159             case VK_F: c.f(!c.f()); repaint(); return;
160             case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
161             case VK_R: c.b(!c.b()); repaint(); return;
162
163             case VK_T:
164                 switch(c.t()) {
165                     case TMUX_FB: c.t(TMUX_W_AND_FB); break;
166                     case TMUX_W_AND_FB: c.t(TMUX_W); break;
167                     case TMUX_W: c.t(TMUX_W_AND_Z); break;
168                     case TMUX_W_AND_Z: c.t(TMUX_Z); break;
169                     case TMUX_Z: c.t(TMUX_FB); break;
170                 }
171                 System.err.println("set " + c.t());
172                 repaint();
173                 return;
174
175             case VK_E:
176                 switch(c.oe()) {
177                     case H4:   c.oe(V4); break;
178                     case V4:   c.oe(NONE); break;
179                     case NONE: c.oe(H4); break;
180                 }
181                 repaint();
182                 return;
183
184                 // ff reset polarity
185                 // h0..h5, v0..v5
186                 // xi=0..5
187                 // yi=0..5
188                 // zi=0..5
189                 // wi=0..5
190                 // t-mux
191                 
192         }
193     }
194
195     public Gui.Cell oldcell = null;
196     public abstract Gui.Cell whichCell(int x, int y);
197     public void mouseMoved(MouseEvent m) {
198
199         Gui.Cell newcell = whichCell(m.getX(), m.getY());
200         /*
201         System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+"  "))+
202                            (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+"  ")));
203         */
204         if (oldcell != newcell) {
205             if (oldcell != null) oldcell.in = false;
206             if (newcell != null) newcell.in = true;
207             repaint();
208         }
209         oldcell = newcell;
210
211         mousex = m.getX();
212         mousey = m.getY();
213         if (drag) {
214             if (mousey > dragy + 5) {
215                 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
216             } else if (mousey < dragy - 5) {
217                 scale = oscale + ((dragy - mousey) / 50.0);
218             } else {
219                 scale = oscale;
220             }
221             repaint();
222         }
223     }
224
225    
226     public boolean isFocusable() { return true; }
227
228     public void mouseDragged(MouseEvent m) {
229         mouseMoved(m);
230         //dragx = m.getX();
231         //dragy = m.getY();
232
233     }
234     public abstract void pressed();
235     public abstract void released();
236     public void mousePressed(MouseEvent m) {
237         mousebutton = true;
238
239         /*
240         recenter = new Point2D.Float(m.getX(), m.getY());
241         try {
242             transform.transform(recenter, recenter);
243         } catch (Exception e) {
244             e.printStackTrace();
245         }
246         repaint();
247         */
248         pressed();
249     }
250     public void mouseEntered(MouseEvent e) { }
251     public void mouseExited(MouseEvent e) { }
252     public void mouseClicked(MouseEvent e) { }
253     public void mouseReleased(MouseEvent e) {
254         mousebutton = false;
255         released();
256     }
257     public boolean mousebutton = false;
258     public boolean xkey = false;
259     public boolean ykey = false;
260
261     HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
262     public abstract void scan(final Gui.Cell c);
263     public abstract void scan();
264     public abstract void writeMode4();
265     public abstract void readMode4();
266 }