1 package edu.berkeley.slipway.gui;
3 import com.atmel.fpslic.*;
4 import static com.atmel.fpslic.FpslicConstants.*;
5 import static com.atmel.fpslic.FpslicUtil.*;
6 import edu.berkeley.slipway.*;
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 ZoomingPanel2 extends JComponent implements KeyListener, MouseMotionListener, MouseListener {
19 HashSet<Gui2.Cell> cells = new HashSet<Gui2.Cell>();
22 public boolean shiftkey = false;
23 public Gui2.Cell oldcell = null;
24 public abstract Gui2.Cell whichCell(int x, int y);
25 public boolean mousebutton = false;
26 public boolean xkey = false;
27 public boolean ykey = false;
28 public abstract void pressed();
29 public abstract void released();
35 public boolean drag = false;
38 protected AffineTransform transform = new AffineTransform();
39 private Point2D recenter = new Point2D.Double(-100, 2500);
40 private Point2D recenter2;
42 public ZoomingPanel2() {
43 setDoubleBuffered(true);
45 addMouseMotionListener(this);
46 addMouseListener(this);
49 public abstract void _paint(Graphics2D g);
51 public final void paint(Graphics _g) {
52 Graphics2D g = (Graphics2D)_g;
56 g.translate(5, -1 * getHeight() + 10);
58 transform = g.getTransform();
60 Point2D p = new Point2D.Float();
61 if (recenter != null) {
62 transform.transform(recenter, p);
63 transform.preConcatenate(AffineTransform.getTranslateInstance(dragx - p.getX(),
66 g.setTransform(transform);
69 g.setColor(Color.blue);
70 g.drawLine((int)(recenter.getX() - 10),
71 (int)(recenter.getY() - 10),
72 (int)(recenter.getX() + 10),
73 (int)(recenter.getY() + 10));
74 g.drawLine((int)(recenter.getX() + 10),
75 (int)(recenter.getY() - 10),
76 (int)(recenter.getX() - 10),
77 (int)(recenter.getY() + 10));
83 public void keyTyped(KeyEvent k) {
85 public void keyReleased(KeyEvent k) {
86 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
87 if (k.getKeyCode() == k.VK_ALT) {
94 switch(k.getKeyCode()) {
95 case VK_X: xkey = false; return;
96 case VK_Y: ykey = false; return;
100 public void keyPressed(KeyEvent k) {
101 shiftkey = (k.getModifiers() & k.SHIFT_MASK) != 0;
103 char c = k.getKeyChar();
107 public void keyPressed0(KeyEvent k) {
109 if (k.getKeyCode() == k.VK_ALT) {
113 recenter = new Point2D.Float(dragx, dragy);
115 transform.inverseTransform(recenter, recenter);
116 } catch (Exception e) {
120 Gui2.Cell cell = whichCell(mousex, mousey);
121 Fpslic.Cell c = cell == null ? null : cell.cell;
122 if ((k.getModifiers() & k.ALT_MASK) != 0 || (k.getModifiers() & k.META_MASK) != 0)
123 switch(k.getKeyCode()) {
137 int save1y = c.fpslic().cell(19,22).ylut();
138 int save1x = c.fpslic().cell(19,22).xlut();
139 int save2y = c.fpslic().cell(20,22).ylut();
140 int save2x = c.fpslic().cell(20,22).xlut();
141 c.fpslic().cell(19,22).ylut(0xff);
142 c.fpslic().cell(19,22).xlut(0xff);
143 for(int i=0; i<800; i++) {
144 c.fpslic().cell(20,22).ylut(0xff);
145 c.fpslic().cell(20,22).xlut(0xff);
147 c.fpslic().cell(20,22).ylut(0x00);
148 c.fpslic().cell(20,22).xlut(0x00);
151 c.fpslic().cell(19,22).ylut(save1y);
152 c.fpslic().cell(19,22).xlut(save1x);
153 c.fpslic().cell(20,22).ylut(save2y);
154 c.fpslic().cell(20,22).xlut(save2x);
155 System.out.println("done");
159 case VK_BACK_QUOTE: {
166 c.xlut(LUT_SELF & LUT_OTHER);
167 c.ylut(LUT_SELF & LUT_OTHER);
179 c.ylut((LUT_SELF & ~LUT_OTHER) |
180 (LUT_Z & ~LUT_OTHER) |
197 c.xlut((LUT_SELF & ~LUT_OTHER) |
198 (LUT_Z & ~LUT_OTHER) |
227 c.xlut(LUT_SELF | LUT_OTHER | LUT_Z);
228 c.ylut(LUT_SELF | LUT_OTHER | LUT_Z);
250 else switch(k.getKeyCode()) {
251 case VK_ESCAPE: scale = 1.0; recenter = null; repaint(); return;
253 case VK_BACK_QUOTE: case VK_0: case VK_1: case VK_2: case VK_3: case VK_4: {
254 int i = k.getKeyCode()==VK_BACK_QUOTE ? NONE : (L0 + (k.getKeyChar() - '0'));
256 case 'x': c.xi(i); break;
257 case 'y': case 'q': c.yi(i); break;
258 case 'w': c.wi(i); break;
259 case 'z': c.zi(i); break;
260 case 'o': c.out(i, !c.out(i)); break;
261 case 'h': c.h(i, !c.hx(i)); break;
262 case 'v': c.v(i, !c.vx(i)); break;
268 case VK_W: if (lastChar == 'w') c.wi(NONE); repaint(); return;
269 case VK_X: if (lastChar == 'x') c.xi(NONE); repaint(); return;
270 case VK_Y: if (lastChar == 'y') c.yi(NONE); repaint(); return;
271 case VK_Z: if (lastChar == 'z') c.zi(NONE); repaint(); return;
272 case VK_Q: if (lastChar == 'q') c.yi(NONE); repaint(); return;
275 if (lastChar == 'x') { c.xo(true); repaint(); return; }
276 if (lastChar == 'y' || lastChar == 'q') { c.yo(true); repaint(); return; }
278 case XLUT: c.c(YLUT); break;
279 case YLUT: c.c(ZMUX); break;
280 case ZMUX: c.c(XLUT); break;
281 default: c.c(ZMUX); break;
286 case VK_F: c.f(!c.f()); repaint(); return;
288 Gui2.Cell gc = whichCell(mousex,mousey);
289 gc.scanme = !gc.scanme;
290 //case VK_S: c.ff_reset_value(!c.ff_reset_value()); repaint(); return;
291 case VK_R: c.b(!c.b()); repaint(); return;
314 case H4: c.oe(V4); break;
315 case V4: c.oe(NONE); break;
316 case NONE: c.oe(H4); break;
332 public void mouseMoved(MouseEvent m) {
333 Gui2.Cell newcell = whichCell(m.getX(), m.getY());
334 if (oldcell != newcell) {
335 if (oldcell != null) oldcell.in = false;
336 if (newcell != null) newcell.in = true;
343 if (mousey > dragy + 5) {
344 scale = 1 / ((1 / oscale) + ((mousey - dragy) / 50.0));
345 } else if (mousey < dragy - 5) {
346 scale = oscale + ((dragy - mousey) / 50.0);
355 public boolean isFocusable() { return true; }
357 public void mouseDragged(MouseEvent m) { mouseMoved(m); }
358 public void mousePressed(MouseEvent m) {
362 public void mouseEntered(MouseEvent e) { }
363 public void mouseExited(MouseEvent e) { }
364 public void mouseClicked(MouseEvent e) { }
365 public void mouseReleased(MouseEvent e) {