fixed heinous bug in switchbox routing
[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_0: case VK_1: case VK_2: case VK_3: case VK_4: {
203                 int i = 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: c.t(TMUX_W_AND_FB); break;
245                     case TMUX_W_AND_FB: c.t(TMUX_W); break;
246                     case TMUX_W: c.t(TMUX_W_AND_Z); break;
247                     case TMUX_W_AND_Z: c.t(TMUX_Z); break;
248                     case TMUX_Z: c.t(TMUX_FB); break;
249                 }
250                 System.err.println("set " + c.t());
251                 repaint();
252                 return;
253
254             case VK_E:
255                 switch(c.oe()) {
256                     case H4:   c.oe(V4); break;
257                     case V4:   c.oe(NONE); break;
258                     case NONE: c.oe(H4); break;
259                 }
260                 repaint();
261                 return;
262
263                 // ff reset polarity
264                 // h0..h5, v0..v5
265                 // xi=0..5
266                 // yi=0..5
267                 // zi=0..5
268                 // wi=0..5
269                 // t-mux
270                 
271         }
272     }
273
274     public Gui.Cell oldcell = null;
275     public abstract Gui.Cell whichCell(int x, int y);
276     public void mouseMoved(MouseEvent m) {
277
278         Gui.Cell newcell = whichCell(m.getX(), m.getY());
279         /*
280         System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+"  "))+
281                            (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+"  ")));
282         */
283         if (oldcell != newcell) {
284             if (oldcell != null) oldcell.in = false;
285             if (newcell != null) newcell.in = true;
286             repaint();
287         }
288         oldcell = newcell;
289
290         mousex = m.getX();
291         mousey = m.getY();
292         if (drag) {
293             if (mousey > dragy + 5) {
294                 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
295             } else if (mousey < dragy - 5) {
296                 scale = oscale + ((dragy - mousey) / 50.0);
297             } else {
298                 scale = oscale;
299             }
300             repaint();
301         }
302     }
303
304    
305     public boolean isFocusable() { return true; }
306
307     public void mouseDragged(MouseEvent m) {
308         mouseMoved(m);
309         //dragx = m.getX();
310         //dragy = m.getY();
311
312     }
313     public abstract void pressed();
314     public abstract void released();
315     public void mousePressed(MouseEvent m) {
316         mousebutton = true;
317
318         /*
319         recenter = new Point2D.Float(m.getX(), m.getY());
320         try {
321             transform.transform(recenter, recenter);
322         } catch (Exception e) {
323             e.printStackTrace();
324         }
325         repaint();
326         */
327         pressed();
328     }
329     public void mouseEntered(MouseEvent e) { }
330     public void mouseExited(MouseEvent e) { }
331     public void mouseClicked(MouseEvent e) { }
332     public void mouseReleased(MouseEvent e) {
333         mousebutton = false;
334         released();
335     }
336     public boolean mousebutton = false;
337     public boolean xkey = false;
338     public boolean ykey = false;
339
340     HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
341     public abstract void scan(final Gui.Cell c);
342     public abstract void scan();
343     public abstract void writeMode4();
344     public abstract void readMode4();
345 }