1 package edu.berkeley.obits.gui;
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.*;
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.*;
17 public abstract class ZoomingPanel extends JComponent implements KeyListener, MouseMotionListener, MouseListener {
23 public boolean drag = false;
26 protected AffineTransform transform = new AffineTransform();
27 private Point2D recenter;
28 private Point2D recenter2;
30 public ZoomingPanel() {
31 setDoubleBuffered(true);
33 addMouseMotionListener(this);
34 addMouseListener(this);
37 public abstract void _paint(Graphics2D g);
39 public final void paint(Graphics _g) {
40 Graphics2D g = (Graphics2D)_g;
44 g.translate(5, -1 * getHeight() + 10);
46 transform = g.getTransform();
48 Point2D p = new Point2D.Float();
49 if (recenter != null) {
50 transform.transform(recenter, p);
51 transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
54 g.setTransform(transform);
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));
71 public void keyTyped(KeyEvent k) {
73 public void keyReleased(KeyEvent k) {
74 if (k.getKeyCode() == k.VK_ALT) {
81 switch(k.getKeyCode()) {
82 case VK_X: xkey = false; return;
83 case VK_Y: ykey = false; return;
87 public void keyPressed(KeyEvent k) {
89 char c = k.getKeyChar();
93 public void keyPressed0(KeyEvent k) {
94 if (k.getKeyCode() == k.VK_ALT) {
98 recenter = new Point2D.Float(dragx, dragy);
100 transform.inverseTransform(recenter, recenter);
101 } catch (Exception e) {
105 Gui.Cell cell = whichCell(mousex, mousey);
106 At40k.Cell c = cell == null ? null : cell.cell;
107 switch(k.getKeyCode()) {
110 c.xlut(LUT_SELF | LUT_OTHER | LUT_Z);
114 c.ylut(LUT_SELF | LUT_OTHER | LUT_Z);
118 scale += 0.1; repaint(); return;
121 c.xlut(LUT_SELF & LUT_OTHER & LUT_Z);
125 c.ylut(LUT_SELF & LUT_OTHER & LUT_Z);
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;
146 int i = L0 + (k.getKeyChar() - '0');
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;
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;
163 if (lastChar == 'x') { c.xo(true); repaint(); return; }
164 if (lastChar == 'y') { c.yo(true); repaint(); return; }
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;
174 case VK_F: c.f(!c.f()); repaint(); return;
175 case VK_B: c.b(!c.b()); repaint(); return;
178 if (lastChar == 'x') { c.xo(false); repaint(); return; }
184 if (lastChar == 'y') { c.yo(false); repaint(); return; }
208 case H4: c.oe(V4); break;
209 case V4: c.oe(NONE); break;
210 case NONE: c.oe(H4); break;
227 Gui.Cell oldcell = null;
228 public abstract Gui.Cell whichCell(int x, int y);
229 public void mouseMoved(MouseEvent m) {
231 Gui.Cell newcell = whichCell(m.getX(), m.getY());
233 System.out.println((oldcell==null ? "old=null" : ("old=" + oldcell._x+","+oldcell._y+" "))+
234 (newcell==null ? "new=null" : ("new=" + newcell._x+","+newcell._y+" ")));
236 if (oldcell != newcell) {
237 if (oldcell != null) oldcell.in = false;
238 if (newcell != null) newcell.in = true;
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);
258 public boolean isFocusable() { return true; }
260 public void mouseDragged(MouseEvent m) {
265 public void mousePressed(MouseEvent m) {
267 recenter = new Point2D.Float(m.getX(), m.getY());
269 transform.transform(recenter, recenter);
270 } catch (Exception e) {
276 public void mouseEntered(MouseEvent e) { }
277 public void mouseExited(MouseEvent e) { }
278 public void mouseClicked(MouseEvent e) { }
279 public void mouseReleased(MouseEvent e) {
283 public boolean xkey = false;
284 public boolean ykey = false;
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();