updates that were lying around but never got checked in; includes reorg of gui
[slipway.git] / src / edu / berkeley / slipway / gui / ZoomingPanel.java
1 package edu.berkeley.slipway.gui;
2
3 import com.atmel.fpslic.*;
4 import static com.atmel.fpslic.FpslicConstants.*;
5 import edu.berkeley.slipway.*;
6 import java.awt.*;
7 import java.awt.geom.*;
8 import java.awt.event.*;
9 import static java.awt.event.KeyEvent.*;
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, MouseListener {
17
18     double scale = 0.3;
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 = new Point2D.Double(-100, 2500);
27     private   Point2D recenter2;
28
29     private SlipwayBoard ftdiboard;
30
31     public ZoomingPanel(SlipwayBoard ftdiboard) {
32         this.ftdiboard = ftdiboard;
33         setDoubleBuffered(true);
34         addKeyListener(this);
35         addMouseMotionListener(this);
36         addMouseListener(this);
37     }
38
39     public abstract void _paint(Graphics2D g);
40
41     public final void paint(Graphics _g) {
42         Graphics2D g = (Graphics2D)_g;
43         g.scale(scale,scale);
44         g.translate(10, 0);
45         g.scale(1, -1);
46         g.translate(5, -1 * getHeight() + 10);
47
48         transform = g.getTransform();
49
50         Point2D p = new Point2D.Float();
51         if (recenter != null) {
52             transform.transform(recenter, p);
53             transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
54                                                                           dragy - p.getY()));
55         }
56         g.setTransform(transform);
57
58         if (drag) {
59             g.setColor(Color.blue);
60             g.drawLine((int)(recenter.getX() - 10),
61                        (int)(recenter.getY() - 10),
62                        (int)(recenter.getX() + 10),
63                        (int)(recenter.getY() + 10));
64             g.drawLine((int)(recenter.getX() + 10),
65                        (int)(recenter.getY() - 10),
66                        (int)(recenter.getX() - 10),
67                        (int)(recenter.getY() + 10));
68         }
69         _paint(g);
70     }
71
72
73     public void keyTyped(KeyEvent k) {
74     }
75     public void keyReleased(KeyEvent k) {
76         shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
77         if (k.getKeyCode() == k.VK_ALT) {
78             if (drag) {
79                 drag = false;
80                 oscale = scale;
81                 repaint();
82             }
83         }
84         switch(k.getKeyCode()) {
85             case VK_X: xkey = false; return; 
86             case VK_Y: ykey = false; return; 
87         }
88     }
89     public char lastChar;
90     public int keyMode;
91     public void keyPressed(KeyEvent k) {
92         shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
93         keyPressed0(k);
94         char c = k.getKeyChar();
95         if (c=='q') c = 'y';
96         lastChar = c;
97     }
98     public boolean shiftkey = false;
99     public void keyPressed0(KeyEvent k) {
100         repaint();
101         if (k.getKeyCode() == k.VK_ALT) {
102             drag = true;
103             dragx = mousex;
104             dragy = mousey;
105             recenter = new Point2D.Float(dragx, dragy);
106             try {
107                 transform.inverseTransform(recenter, recenter);
108             } catch (Exception e) {
109                 e.printStackTrace();
110             }
111         }
112         Gui.Cell cell = whichCell(mousex, mousey);
113         FpslicDevice.Cell c = cell == null ? null : cell.cell;
114         if ((k.getModifiers() & k.ALT_MASK) != 0 || (k.getModifiers() & k.META_MASK) != 0)
115             switch(k.getKeyCode()) {
116                 case VK_S:
117                     writeMode4();
118                     break;
119                     /*
120                 case VK_O:
121                     readMode4();
122                     break;
123                     */
124                 case VK_0: {
125                     c.xlut(0x00);
126                     c.ylut(0x00);
127                     repaint();
128                     return;
129                 }
130                 case VK_1: {
131                     c.xlut(0xff);
132                     c.ylut(0xff);
133                     repaint();
134                     return;
135                 }
136                 case VK_F: {
137                     int save1y = c.fpslic().cell(19,22).ylut();
138                     int save1x = c.fpslic().cell(19,22).xlut();
139                     int save2y = c.fpslic().cell(20,22).ylut();
140                     int save2x = c.fpslic().cell(20,22).xlut();
141                     c.fpslic().cell(19,22).ylut(0xff);
142                     c.fpslic().cell(19,22).xlut(0xff);
143                     for(int i=0; i<800; i++) {
144                         c.fpslic().cell(20,22).ylut(0xff);
145                         c.fpslic().cell(20,22).xlut(0xff);
146                         c.fpslic().flush();
147                         c.fpslic().cell(20,22).ylut(0x00);
148                         c.fpslic().cell(20,22).xlut(0x00);
149                         c.fpslic().flush();
150                     }
151                     c.fpslic().cell(19,22).ylut(save1y);
152                     c.fpslic().cell(19,22).xlut(save1x);
153                     c.fpslic().cell(20,22).ylut(save2y);
154                     c.fpslic().cell(20,22).xlut(save2x);
155                     System.out.println("done");
156                     repaint();
157                     return;
158                 }
159                 case VK_BACK_QUOTE: {
160                     c.xlut(0xff);
161                     c.ylut(0xff);
162                     repaint();
163                     return;
164                 }
165                 case VK_A: {
166                     c.xlut(LUT_SELF & LUT_OTHER);
167                     c.ylut(LUT_SELF & LUT_OTHER);
168                     repaint();
169                     return;
170                 }
171                 case VK_2:
172                 case VK_G:
173                     {
174                 c.c(YLUT);
175                 c.ylut(0x00);
176                 c.xlut(0x00);
177                 c.wi(L0);
178                 c.t(TMUX_W_AND_FB);
179                 c.ylut((LUT_SELF & ~LUT_OTHER) |
180                        (LUT_Z & ~LUT_OTHER) |
181                        (LUT_Z & LUT_SELF));
182                 c.fpslic().flush();
183                 c.xlut(LUT_Z);
184                 c.fpslic().flush();
185                 c.wi(NONE);
186                 c.fpslic().flush();
187                     repaint();
188                     return;
189                 }
190                 case VK_3: {
191
192                 c.c(XLUT);
193                 c.xlut(0x00);
194                 c.ylut(0x00);
195                 c.wi(L0);
196                 c.t(TMUX_W_AND_FB);
197                 c.xlut((LUT_SELF & ~LUT_OTHER) |
198                        (LUT_Z & ~LUT_OTHER) |
199                        (LUT_Z & LUT_SELF));
200                 c.fpslic().flush();
201                 c.ylut(LUT_Z);
202                 c.fpslic().flush();
203                 c.wi(NONE);
204                 c.fpslic().flush();
205                     repaint();
206                     return;
207                 }
208                 case VK_Z: {
209                     c.xlut(LUT_Z);
210                     c.ylut(LUT_Z);
211                     repaint();
212                     return;
213                 }
214                 case VK_W: {
215                     c.xlut(LUT_Z);
216                     c.ylut(LUT_SELF);
217                     c.t(TMUX_W);
218                     repaint();
219                     return;
220                 }
221                 case VK_T: {
222                     //c.t(;
223                     repaint();
224                     return;
225                 }
226                 case VK_O: {
227                     c.xlut(LUT_SELF | LUT_OTHER);
228                     c.ylut(LUT_SELF | LUT_OTHER);
229                     repaint();
230                     return;
231                 }
232                 case VK_X: {
233                     c.xlut(LUT_SELF);
234                     c.ylut(LUT_OTHER);
235                     repaint();
236                     return;
237                 }
238                 case VK_Y: {
239                     c.xlut(LUT_OTHER);
240                     c.ylut(LUT_SELF);
241                     repaint();
242                     return;
243                 }
244                 case VK_I: {
245                     System.out.println("interrupt count => " + ftdiboard.readInterruptCount());
246                     repaint();
247                     return;
248                 }
249             }
250
251         else switch(k.getKeyCode()) {
252             case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
253
254             case VK_BACK_QUOTE: case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
255                 int i = k.getKeyCode()==VK_BACK_QUOTE ? NONE : (L0 + (k.getKeyChar() - '0'));
256                 switch(lastChar) {
257                     case 'x': c.xi(i); break;
258                     case 'y': case 'q': c.yi(i); break;
259                     case 'w': c.wi(i); break;
260                     case 'z': c.zi(i); break;
261                     case 'o': c.out(i, !c.out(i)); break;
262                     case 'h': c.h(i, !c.hx(i)); break;
263                     case 'v': c.v(i, !c.vx(i)); break;
264                 }
265                 repaint();
266                 return;
267                 }
268
269             case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
270             case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
271             case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
272             case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
273             case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
274
275             case VK_C:
276                 if (lastChar == 'x') { c.xo(true); repaint(); return; }
277                 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
278                 switch(c.c()) {
279                     case XLUT: c.c(YLUT); break;
280                     case YLUT: c.c(ZMUX); break;
281                     case ZMUX: c.c(XLUT); break;
282                     default:   c.c(ZMUX); break;
283                 }
284                 repaint();
285                 return;
286
287             case VK_F: c.f(!c.f()); repaint(); return;
288             case VK_S:
289                 Gui.Cell gc = whichCell(mousex,mousey);
290                 gc.scanme = !gc.scanme;
291                 //case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
292             case VK_R: c.b(!c.b()); repaint(); return;
293
294             case VK_T:
295                 switch(c.t()) {
296                     case TMUX_FB:
297                     case TMUX_W_AND_FB:
298                         c.t(TMUX_W_AND_Z);
299                         break;
300
301                     case TMUX_Z:
302                     case TMUX_W_AND_Z:
303                         c.t(TMUX_W);
304                         break;
305
306                     case TMUX_W:
307                         c.t(TMUX_W_AND_FB);
308                         break;
309                 }
310                 repaint();
311                 return;
312
313             case VK_E:
314                 switch(c.oe()) {
315                     case H4:   c.oe(V4); break;
316                     case V4:   c.oe(NONE); break;
317                     case NONE: c.oe(H4); break;
318                 }
319                 repaint();
320                 return;
321
322                 // ff reset polarity
323                 // h0..h5, v0..v5
324                 // xi=0..5
325                 // yi=0..5
326                 // zi=0..5
327                 // wi=0..5
328                 // t-mux
329                 
330         }
331     }
332
333     public Gui.Cell oldcell = null;
334     public abstract Gui.Cell whichCell(int x, int y);
335     public void mouseMoved(MouseEvent m) {
336
337         Gui.Cell newcell = whichCell(m.getX(), m.getY());
338         /*
339         System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+"  "))+
340                            (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+"  ")));
341         */
342         if (oldcell != newcell) {
343             if (oldcell != null) oldcell.in = false;
344             if (newcell != null) newcell.in = true;
345             repaint();
346         }
347         oldcell = newcell;
348
349         mousex = m.getX();
350         mousey = m.getY();
351         if (drag) {
352             if (mousey > dragy + 5) {
353                 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
354             } else if (mousey < dragy - 5) {
355                 scale = oscale + ((dragy - mousey) / 50.0);
356             } else {
357                 scale = oscale;
358             }
359             repaint();
360         }
361     }
362
363    
364     public boolean isFocusable() { return true; }
365
366     public void mouseDragged(MouseEvent m) {
367         mouseMoved(m);
368         //dragx = m.getX();
369         //dragy = m.getY();
370
371     }
372     public abstract void pressed();
373     public abstract void released();
374     public void mousePressed(MouseEvent m) {
375         mousebutton = true;
376
377         /*
378         recenter = new Point2D.Float(m.getX(), m.getY());
379         try {
380             transform.transform(recenter, recenter);
381         } catch (Exception e) {
382             e.printStackTrace();
383         }
384         repaint();
385         */
386         pressed();
387     }
388     public void mouseEntered(MouseEvent e) { }
389     public void mouseExited(MouseEvent e) { }
390     public void mouseClicked(MouseEvent e) { }
391     public void mouseReleased(MouseEvent e) {
392         mousebutton = false;
393         released();
394     }
395     public boolean mousebutton = false;
396     public boolean xkey = false;
397     public boolean ykey = false;
398
399     HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
400     public abstract void scan(final Gui.Cell c);
401     public abstract void scan();
402     public abstract void writeMode4();
403     public abstract void readMode4();
404 }