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