samer@0
|
1 /*
|
samer@0
|
2 * MatEditor.java
|
samer@0
|
3 *
|
samer@0
|
4 * Copyright (c) 2000, Samer Abdallah, King's College London.
|
samer@0
|
5 * All rights reserved.
|
samer@0
|
6 *
|
samer@0
|
7 * This software is provided AS iS and WITHOUT ANY WARRANTY;
|
samer@0
|
8 * without even the implied warranty of MERCHANTABILITY or
|
samer@0
|
9 * FITNESS FOR A PARTICULAR PURPOSE.
|
samer@0
|
10 */
|
samer@0
|
11
|
samer@0
|
12 package samer.maths;
|
samer@0
|
13
|
samer@0
|
14 import java.awt.*;
|
samer@0
|
15 import java.awt.event.*;
|
samer@0
|
16 import java.util.*;
|
samer@0
|
17 import samer.core.*;
|
samer@0
|
18 import samer.core.types.*;
|
samer@0
|
19 import samer.core.util.*;
|
samer@0
|
20
|
samer@0
|
21 /**
|
samer@0
|
22 This is a mouse event handler that interprets mouse clicks
|
samer@0
|
23 to edit a matrix. It assumes that it is handling mouse
|
samer@0
|
24 events for a component the contains some representation of the
|
samer@0
|
25 matrix that is arranged in rows and columns, just like the
|
samer@0
|
26 matrix itself (it doesn't have to be an image). The window
|
samer@0
|
27 relative coordinates are simply mapped to a matrix element
|
samer@0
|
28 address.
|
samer@0
|
29 */
|
samer@0
|
30
|
samer@0
|
31 public class MatEditor extends MouseAdapter
|
samer@0
|
32 implements MouseMotionListener, Agent
|
samer@0
|
33 {
|
samer@0
|
34 Component canvas;
|
samer@0
|
35 Mat M;
|
samer@0
|
36 VDouble setto;
|
samer@0
|
37 Observable obs;
|
samer@0
|
38 int lasti=-1, lastj=-1;
|
samer@0
|
39 double dragval=0;
|
samer@0
|
40 boolean add=false;
|
samer@0
|
41 boolean b1down=false;
|
samer@0
|
42
|
samer@0
|
43 public MatEditor( Mat m, Component c, Observable v, Viewer vwr)
|
samer@0
|
44 {
|
samer@0
|
45 M=m;
|
samer@0
|
46 canvas=c;
|
samer@0
|
47 setto = new VDouble("button1",1,0);
|
samer@0
|
48 canvas.addMouseListener(this);
|
samer@0
|
49 canvas.addMouseMotionListener(this);
|
samer@0
|
50 obs=v;
|
samer@0
|
51
|
samer@0
|
52 vwr.exposeCommands(this);
|
samer@0
|
53 }
|
samer@0
|
54
|
samer@0
|
55 public void getCommands(Agent.Registry r) { r.add("add",add); }
|
samer@0
|
56 public void execute(String cmd, Environment env) {
|
samer@0
|
57 add=X._bool(env.datum(),!add);
|
samer@0
|
58 }
|
samer@0
|
59
|
samer@0
|
60 private void handle(MouseEvent e)
|
samer@0
|
61 {
|
samer@0
|
62 // get position in matrix
|
samer@0
|
63 int i = (M.height()*e.getY())/canvas.getHeight();
|
samer@0
|
64 int j = (M.width()*e.getX())/canvas.getWidth();
|
samer@0
|
65
|
samer@0
|
66 // check bounds
|
samer@0
|
67 if (i<0 || i>=M.height()) return;
|
samer@0
|
68 if (j<0 || j>=M.width()) return;
|
samer@0
|
69
|
samer@0
|
70 // correct for vertical flip
|
samer@0
|
71 i=M.height()-i-1;
|
samer@0
|
72
|
samer@0
|
73 if (!add) {
|
samer@0
|
74 if (i==lasti && j==lastj) return;
|
samer@0
|
75 M.set(i,j,dragval);
|
samer@0
|
76 } else M.set(i,j,M.get(i,j)+dragval);
|
samer@0
|
77
|
samer@0
|
78 lasti=i;
|
samer@0
|
79 lastj=j;
|
samer@0
|
80 obs.notifyObservers(new Point(j,i)); // Point as x,y into image raster
|
samer@0
|
81 }
|
samer@0
|
82
|
samer@0
|
83 public void mouseMoved(MouseEvent e) {}
|
samer@0
|
84 public void mouseDragged(MouseEvent e) { if (b1down) { handle(e); e.consume(); } }
|
samer@0
|
85 public void mousePressed(MouseEvent e)
|
samer@0
|
86 {
|
samer@0
|
87 int f = e.getModifiers();
|
samer@0
|
88
|
samer@0
|
89 if ((f & InputEvent.BUTTON1_MASK)!=0) b1down=true;
|
samer@0
|
90 if (b1down) {
|
samer@0
|
91
|
samer@0
|
92 // if ((f&(InputEvent.BUTTON2_MASK|InputEvent.BUTTON3_MASK))==0) {
|
samer@0
|
93 if (!e.isControlDown()) {
|
samer@0
|
94 dragval=setto.value;
|
samer@0
|
95 } else {
|
samer@0
|
96 dragval=add ? -setto.value : 0;
|
samer@0
|
97 // canvas.addMouseListener(this); // to catch mouse up!
|
samer@0
|
98 // b2down=true;
|
samer@0
|
99 }
|
samer@0
|
100
|
samer@0
|
101 lasti=lastj=-1;
|
samer@0
|
102 handle(e);
|
samer@0
|
103 e.consume();
|
samer@0
|
104
|
samer@0
|
105 }
|
samer@0
|
106 }
|
samer@0
|
107
|
samer@0
|
108 public void mouseReleased(MouseEvent e)
|
samer@0
|
109 {
|
samer@0
|
110 int f = e.getModifiers();
|
samer@0
|
111
|
samer@0
|
112 if ((f & InputEvent.BUTTON1_MASK)!=0) {
|
samer@0
|
113 // button 1 up - stop all dragging
|
samer@0
|
114 b1down=false;
|
samer@0
|
115
|
samer@0
|
116 //if (b2down) {
|
samer@0
|
117 // canvas.removeMouseListener(this);
|
samer@0
|
118 // b2down=false;
|
samer@0
|
119 //}
|
samer@0
|
120 e.consume();
|
samer@0
|
121 } /* else {
|
samer@0
|
122
|
samer@0
|
123 // something else up
|
samer@0
|
124 if (b1down) {
|
samer@0
|
125
|
samer@0
|
126 if ((f&(InputEvent.BUTTON2_MASK|InputEvent.BUTTON3_MASK))!=0) {
|
samer@0
|
127 // button 2 up
|
samer@0
|
128 dragval=setto.value;
|
samer@0
|
129 b2down=false;
|
samer@0
|
130 canvas.removeMouseListener(this);
|
samer@0
|
131 handle(e);
|
samer@0
|
132 }
|
samer@0
|
133 e.consume();
|
samer@0
|
134
|
samer@0
|
135 } else {
|
samer@0
|
136 Shell.print("button up while button 1 not down?");
|
samer@0
|
137 }
|
samer@0
|
138 } */
|
samer@0
|
139 }
|
samer@0
|
140
|
samer@0
|
141 public void detach() { setto.dispose(); }
|
samer@0
|
142 }
|