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