checkpoint
[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)
113             switch(k.getKeyCode()) {
114                 case VK_S:
115                     writeMode4();
116                     break;
117                 case VK_O:
118                     readMode4();
119                     break;
120                 case VK_0: {
121                     c.xlut(0x00);
122                     c.ylut(0x00);
123                     repaint();
124                     return;
125                 }
126                 case VK_1: {
127                     c.xlut(0xff);
128                     c.ylut(0xff);
129                     repaint();
130                     return;
131                 }
132             }
133
134         else switch(k.getKeyCode()) {
135             case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
136
137             case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
138                 int i = L0 + (k.getKeyChar() - '0');
139                 switch(lastChar) {
140                     case 'x': c.xi(i); break;
141                     case 'y': case 'q': c.yi(i); break;
142                     case 'w': c.wi(i); break;
143                     case 'z': c.zi(i); break;
144                     case 'o': c.out(i, !c.out(i)); break;
145                     case 'h': c.h(i, !c.hx(i)); break;
146                     case 'v': c.v(i, !c.vx(i)); break;
147                 }
148                 repaint();
149                 return;
150                 }
151
152             case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
153             case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
154             case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
155             case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
156             case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
157
158             case VK_C:
159                 if (lastChar == 'x') { c.xo(true); repaint(); return; }
160                 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
161                 switch(c.c()) {
162                     case XLUT: c.c(YLUT); break;
163                     case YLUT: c.c(ZMUX); break;
164                     case ZMUX: c.c(XLUT); break;
165                     default:   c.c(ZMUX); break;
166                 }
167                 repaint();
168                 return;
169
170             case VK_F: c.f(!c.f()); repaint(); return;
171             case VK_S:
172                 Gui.Cell gc = whichCell(mousex,mousey);
173                 gc.scanme = !gc.scanme;
174                 //case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
175             case VK_R: c.b(!c.b()); repaint(); return;
176
177             case VK_T:
178                 switch(c.t()) {
179                     case TMUX_FB: c.t(TMUX_W_AND_FB); break;
180                     case TMUX_W_AND_FB: c.t(TMUX_W); break;
181                     case TMUX_W: c.t(TMUX_W_AND_Z); break;
182                     case TMUX_W_AND_Z: c.t(TMUX_Z); break;
183                     case TMUX_Z: c.t(TMUX_FB); break;
184                 }
185                 System.err.println("set " + c.t());
186                 repaint();
187                 return;
188
189             case VK_E:
190                 switch(c.oe()) {
191                     case H4:   c.oe(V4); break;
192                     case V4:   c.oe(NONE); break;
193                     case NONE: c.oe(H4); break;
194                 }
195                 repaint();
196                 return;
197
198                 // ff reset polarity
199                 // h0..h5, v0..v5
200                 // xi=0..5
201                 // yi=0..5
202                 // zi=0..5
203                 // wi=0..5
204                 // t-mux
205                 
206         }
207     }
208
209     public Gui.Cell oldcell = null;
210     public abstract Gui.Cell whichCell(int x, int y);
211     public void mouseMoved(MouseEvent m) {
212
213         Gui.Cell newcell = whichCell(m.getX(), m.getY());
214         /*
215         System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+"  "))+
216                            (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+"  ")));
217         */
218         if (oldcell != newcell) {
219             if (oldcell != null) oldcell.in = false;
220             if (newcell != null) newcell.in = true;
221             repaint();
222         }
223         oldcell = newcell;
224
225         mousex = m.getX();
226         mousey = m.getY();
227         if (drag) {
228             if (mousey > dragy + 5) {
229                 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
230             } else if (mousey < dragy - 5) {
231                 scale = oscale + ((dragy - mousey) / 50.0);
232             } else {
233                 scale = oscale;
234             }
235             repaint();
236         }
237     }
238
239    
240     public boolean isFocusable() { return true; }
241
242     public void mouseDragged(MouseEvent m) {
243         mouseMoved(m);
244         //dragx = m.getX();
245         //dragy = m.getY();
246
247     }
248     public abstract void pressed();
249     public abstract void released();
250     public void mousePressed(MouseEvent m) {
251         mousebutton = true;
252
253         /*
254         recenter = new Point2D.Float(m.getX(), m.getY());
255         try {
256             transform.transform(recenter, recenter);
257         } catch (Exception e) {
258             e.printStackTrace();
259         }
260         repaint();
261         */
262         pressed();
263     }
264     public void mouseEntered(MouseEvent e) { }
265     public void mouseExited(MouseEvent e) { }
266     public void mouseClicked(MouseEvent e) { }
267     public void mouseReleased(MouseEvent e) {
268         mousebutton = false;
269         released();
270     }
271     public boolean mousebutton = false;
272     public boolean xkey = false;
273     public boolean ykey = false;
274
275     HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
276     public abstract void scan(final Gui.Cell c);
277     public abstract void scan();
278     public abstract void writeMode4();
279     public abstract void readMode4();
280 }