checkpoint
[slipway.git] / src / edu / berkeley / obits / gui / ZoomingPanel.java
1 package edu.berkeley.obits.gui;
2
3 import static edu.berkeley.obits.device.atmel.AtmelDevice.Constants.*;
4 import static edu.berkeley.obits.device.atmel.AtmelDevice.Util.*;
5 import edu.berkeley.obits.*;
6 import edu.berkeley.obits.device.atmel.*;
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         if (k.getKeyCode() == k.VK_ALT) {
75             if (drag) {
76                 drag = false;
77                 oscale = scale;
78                 repaint();
79             }
80         }
81         switch(k.getKeyCode()) {
82             case VK_X: xkey = false; return; 
83             case VK_Y: ykey = false; return; 
84         }
85     }
86     public char lastChar;
87     public void keyPressed(KeyEvent k) {
88         keyPressed0(k);
89         char c = k.getKeyChar();
90         if (c=='q') c = 'y';
91         lastChar = c;
92     }
93     public void keyPressed0(KeyEvent k) {
94         if (k.getKeyCode() == k.VK_ALT) {
95             drag = true;
96             dragx = mousex;
97             dragy = mousey;
98             recenter = new Point2D.Float(dragx, dragy);
99             try {
100                 transform.inverseTransform(recenter, recenter);
101             } catch (Exception e) {
102                 e.printStackTrace();
103             }
104         }
105         Gui.Cell cell = whichCell(mousex, mousey);
106         At40k.Cell c = cell == null ? null : cell.cell;
107         switch(k.getKeyCode()) {
108             case VK_PLUS:
109                 if (xkey) {
110                     c.xlut(LUT_SELF | LUT_OTHER | LUT_Z);
111                     repaint();
112                     return;
113                 } else if (ykey) {
114                     c.ylut(LUT_SELF | LUT_OTHER | LUT_Z);
115                     repaint();
116                     return;
117                 }
118                 scale += 0.1; repaint(); return;
119             case VK_MULTIPLY:
120                 if (xkey) {
121                     c.xlut(LUT_SELF & LUT_OTHER & LUT_Z);
122                     repaint();
123                     return;
124                 } else if (ykey) {
125                     c.ylut(LUT_SELF & LUT_OTHER & LUT_Z);
126                     repaint();
127                     return;
128                 }
129                 scale += 0.1; repaint(); return;
130             case VK_MINUS: scale -= 0.1; repaint(); return;
131             case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
132             case VK_NUMPAD7: whichCell(mousex, mousey).cell.xi(NW); repaint(); return;
133             case VK_NUMPAD8: whichCell(mousex, mousey).cell.yi(NORTH); repaint(); return;
134             case VK_NUMPAD9: whichCell(mousex, mousey).cell.xi(NE); repaint(); return;
135             case VK_NUMPAD4: whichCell(mousex, mousey).cell.yi(WEST); repaint(); return;
136             case VK_NUMPAD6: whichCell(mousex, mousey).cell.yi(EAST); repaint(); return;
137             case VK_NUMPAD1: whichCell(mousex, mousey).cell.xi(SW); repaint(); return;
138             case VK_NUMPAD2: whichCell(mousex, mousey).cell.yi(SOUTH); repaint(); return;
139             case VK_NUMPAD3: whichCell(mousex, mousey).cell.xi(SE); repaint(); return;
140
141             case VK_0:
142             case VK_1:
143             case VK_2:
144             case VK_3:
145             case VK_4: {
146                 int i = L0 + (k.getKeyChar() - '0');
147                 switch(lastChar) {
148                     case 'x': c.xi(i); break;
149                     case 'y': c.yi(i); break;
150                     case 'w': c.wi(i); break;
151                     case 'z': c.zi(i); break;
152                     case ' ': c.out(i, !c.out(i)); break;
153                 }
154                 repaint();
155                 return;
156                 }
157
158                 //case VK_F: c.t(TMUX_W_AND_FB); repaint(); return;
159             case VK_W: c.t(TMUX_W); repaint(); return;
160                 //case VK_Z: c.t(TMUX_W_AND_Z); repaint(); return;
161
162             case VK_C:
163                 if (lastChar == 'x') { c.xo(true); repaint(); return; }
164                 if (lastChar == 'y') { c.yo(true); repaint(); return; }
165                 switch(c.c()) {
166                     case XLUT: c.c(YLUT); break;
167                     case YLUT: c.c(ZMUX); break;
168                     case ZMUX: c.c(XLUT); break;
169                     default:   c.c(ZMUX); break;
170                 }
171                 repaint();
172                 return;
173
174             case VK_F: c.f(!c.f()); repaint(); return;
175             case VK_B: c.b(!c.b()); repaint(); return;
176
177             case VK_X:
178                 if (lastChar == 'x') { c.xo(false); repaint(); return; }
179                 xkey = true;
180                 return; 
181
182             case VK_Q:
183             case VK_Y:
184                 if (lastChar == 'y') { c.yo(false); repaint(); return; }
185                 ykey = true;
186                 return; 
187
188             case VK_R:
189                 boolean reg = c.f();
190                 c.f(!reg);
191                 c.b(!reg);
192                 repaint();
193                 return;
194
195             case VK_SPACE:
196                 scan();
197                 break;
198
199             case VK_S:
200                 writeMode4();
201                 break;
202             case VK_L:
203                 readMode4();
204                 break;
205
206             case VK_O:
207                 switch(c.oe()) {
208                     case H4:   c.oe(V4); break;
209                     case V4:   c.oe(NONE); break;
210                     case NONE: c.oe(H4); break;
211                 }
212                 repaint();
213                 return;
214
215                 // xlut table
216                 // ylut table
217                 // ff reset polarity
218                 // h0..h5, v0..v5
219                 // xi=0..5
220                 // yi=0..5
221                 // zi=0..5
222                 // wi=0..5
223                 // t-mux
224         }
225     }
226
227     Gui.Cell oldcell = null;
228     public abstract Gui.Cell whichCell(int x, int y);
229     public void mouseMoved(MouseEvent m) {
230
231         Gui.Cell newcell = whichCell(m.getX(), m.getY());
232         /*
233         System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+"  "))+
234                            (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+"  ")));
235         */
236         if (oldcell != newcell) {
237             if (oldcell != null) oldcell.in = false;
238             if (newcell != null) newcell.in = true;
239             repaint();
240         }
241         oldcell = newcell;
242
243         mousex = m.getX();
244         mousey = m.getY();
245         if (drag) {
246             if (mousey > dragy + 5) {
247                 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
248             } else if (mousey < dragy - 5) {
249                 scale = oscale + ((dragy - mousey) / 50.0);
250             } else {
251                 scale = oscale;
252             }
253             repaint();
254         }
255     }
256
257    
258     public boolean isFocusable() { return true; }
259
260     public void mouseDragged(MouseEvent m) {
261         mouseMoved(m);
262         dragx = m.getX();
263         dragy = m.getY();
264     }
265     public void mousePressed(MouseEvent m) {
266         /*
267         recenter = new Point2D.Float(m.getX(), m.getY());
268         try {
269             transform.transform(recenter, recenter);
270         } catch (Exception e) {
271             e.printStackTrace();
272         }
273         repaint();
274         */
275     }
276     public void mouseEntered(MouseEvent e) { }
277     public void mouseExited(MouseEvent e) { }
278     public void mouseClicked(MouseEvent e) { }
279     public void mouseReleased(MouseEvent e) {
280         
281     }
282
283     public boolean xkey = false;
284     public boolean ykey = false;
285
286     HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
287     public abstract void scan(final Gui.Cell c);
288     public abstract void scan();
289     public abstract void writeMode4();
290     public abstract void readMode4();
291 }