1 package edu.berkeley.obits.gui;
3 import com.atmel.fpslic.*;
4 import static com.atmel.fpslic.FpslicConstants.*;
5 import static com.atmel.fpslic.Fpslic.Util.*;
6 import edu.berkeley.obits.*;
7 import edu.berkeley.obits.device.atmel.*;
9 import java.awt.geom.*;
10 import java.awt.event.*;
11 import static java.awt.event.KeyEvent.*;
12 import java.awt.color.*;
13 import org.ibex.util.*;
18 public abstract class ZoomingPanel extends JComponent implements KeyListener, MouseMotionListener, MouseListener {
24 public boolean drag = false;
27 protected AffineTransform transform = new AffineTransform();
28 private Point2D recenter;
29 private Point2D recenter2;
31 public ZoomingPanel() {
32 setDoubleBuffered(true);
34 addMouseMotionListener(this);
35 addMouseListener(this);
38 public abstract void _paint(Graphics2D g);
40 public final void paint(Graphics _g) {
41 Graphics2D g = (Graphics2D)_g;
45 g.translate(5, -1 * getHeight() + 10);
47 transform = g.getTransform();
49 Point2D p = new Point2D.Float();
50 if (recenter != null) {
51 transform.transform(recenter, p);
52 transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
55 g.setTransform(transform);
58 g.setColor(Color.blue);
59 g.drawLine((int)(recenter.getX() - 10),
60 (int)(recenter.getY() - 10),
61 (int)(recenter.getX() + 10),
62 (int)(recenter.getY() + 10));
63 g.drawLine((int)(recenter.getX() + 10),
64 (int)(recenter.getY() - 10),
65 (int)(recenter.getX() - 10),
66 (int)(recenter.getY() + 10));
72 public void keyTyped(KeyEvent k) {
74 public void keyReleased(KeyEvent k) {
75 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
76 if (k.getKeyCode() == k.VK_ALT) {
83 switch(k.getKeyCode()) {
84 case VK_X: xkey = false; return;
85 case VK_Y: ykey = false; return;
90 public void keyPressed(KeyEvent k) {
91 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
93 char c = k.getKeyChar();
97 public boolean shiftkey = false;
98 public void keyPressed0(KeyEvent k) {
100 if (k.getKeyCode() == k.VK_ALT) {
104 recenter = new Point2D.Float(dragx, dragy);
106 transform.inverseTransform(recenter, recenter);
107 } catch (Exception e) {
111 Gui.Cell cell = whichCell(mousex, mousey);
112 Fpslic.Cell c = cell == null ? null : cell.cell;
113 if ((k.getModifiers() & k.ALT_MASK) != 0)
114 switch(k.getKeyCode()) {
123 else switch(k.getKeyCode()) {
124 case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
126 case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
127 int i = L0 + (k.getKeyChar() - '0');
129 case 'x': c.xi(i); break;
130 case 'y': case 'q': c.yi(i); break;
131 case 'w': c.wi(i); break;
132 case 'z': c.zi(i); break;
133 case 'o': c.out(i, !c.out(i)); break;
134 case 'h': c.h(i, !c.hx(i)); break;
135 case 'v': c.v(i, !c.vx(i)); break;
141 case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
142 case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
143 case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
144 case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
145 case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
148 if (lastChar == 'x') { c.xo(true); repaint(); return; }
149 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
151 case XLUT: c.c(YLUT); break;
152 case YLUT: c.c(ZMUX); break;
153 case ZMUX: c.c(XLUT); break;
154 default: c.c(ZMUX); break;
159 case VK_F: c.f(!c.f()); repaint(); return;
160 case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
161 case VK_R: c.b(!c.b()); repaint(); return;
165 case TMUX_FB: c.t(TMUX_W_AND_FB); break;
166 case TMUX_W_AND_FB: c.t(TMUX_W); break;
167 case TMUX_W: c.t(TMUX_W_AND_Z); break;
168 case TMUX_W_AND_Z: c.t(TMUX_Z); break;
169 case TMUX_Z: c.t(TMUX_FB); break;
171 System.err.println("set " + c.t());
177 case H4: c.oe(V4); break;
178 case V4: c.oe(NONE); break;
179 case NONE: c.oe(H4); break;
195 public Gui.Cell oldcell = null;
196 public abstract Gui.Cell whichCell(int x, int y);
197 public void mouseMoved(MouseEvent m) {
199 Gui.Cell newcell = whichCell(m.getX(), m.getY());
201 System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+" "))+
202 (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+" ")));
204 if (oldcell != newcell) {
205 if (oldcell != null) oldcell.in = false;
206 if (newcell != null) newcell.in = true;
214 if (mousey > dragy + 5) {
215 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
216 } else if (mousey < dragy - 5) {
217 scale = oscale + ((dragy - mousey) / 50.0);
226 public boolean isFocusable() { return true; }
228 public void mouseDragged(MouseEvent m) {
234 public abstract void pressed();
235 public abstract void released();
236 public void mousePressed(MouseEvent m) {
240 recenter = new Point2D.Float(m.getX(), m.getY());
242 transform.transform(recenter, recenter);
243 } catch (Exception e) {
250 public void mouseEntered(MouseEvent e) { }
251 public void mouseExited(MouseEvent e) { }
252 public void mouseClicked(MouseEvent e) { }
253 public void mouseReleased(MouseEvent e) {
257 public boolean mousebutton = false;
258 public boolean xkey = false;
259 public boolean ykey = false;
261 HashSet<Gui.Cell> cells = new HashSet<Gui.Cell>();
262 public abstract void scan(final Gui.Cell c);
263 public abstract void scan();
264 public abstract void writeMode4();
265 public abstract void readMode4();