2 |
|
|
3 |
package gzz.modules.pp; |
package gzz.modules.pp; |
4 |
|
|
5 |
|
import gzz.view.AbstractViewContext; |
6 |
import gzz.vob.VobScene; |
import gzz.vob.VobScene; |
7 |
import gzz.util.Pair; |
import gzz.util.Pair; |
8 |
|
|
14 |
* STATE: PROTOTYPE |
* STATE: PROTOTYPE |
15 |
*/ |
*/ |
16 |
public class EventHandling { |
public class EventHandling { |
17 |
public void pa(String s) { System.out.println(s); } |
public boolean dbg = false; |
18 |
|
private void pa(String s) { System.out.println(s); } |
19 |
|
|
20 |
// Singleton |
// Singleton |
21 |
static private EventHandling instance; |
static private EventHandling instance; |
35 |
private Map callers = new TreeMap(); |
private Map callers = new TreeMap(); |
36 |
private Map ev_handlers = new TreeMap(); |
private Map ev_handlers = new TreeMap(); |
37 |
|
|
|
|
|
|
|
|
38 |
private final int MASK = 10000000; |
private final int MASK = 10000000; |
39 |
private final int CLICK = 20000000; |
private final int CLICK = 20000000; |
40 |
private final int DRAG = 30000000; |
private final int DRAG = 30000000; |
41 |
|
|
42 |
|
|
43 |
// give cs. |
// give cs. |
44 |
|
public void onClick(int cs, String key) { onClick(cs, key, null); } |
45 |
public void onClick(int cs, String key, Object[] obs) { |
public void onClick(int cs, String key, Object[] obs) { |
46 |
callers.put(""+(cs + CLICK), new Pair(key, obs) ); |
callers.put(""+(cs + CLICK), new Pair(key, obs) ); |
47 |
} |
} |
48 |
|
|
49 |
|
public void onDrag(int cs, String key) { onDrag(cs, key, null); } |
50 |
public void onDrag(int cs, String key, Object[] obs) { |
public void onDrag(int cs, String key, Object[] obs) { |
51 |
callers.put(""+(cs + DRAG), new Pair(key, obs) ); |
callers.put(""+(cs + DRAG), new Pair(key, obs) ); |
52 |
} |
} |
53 |
|
|
54 |
|
// give object |
55 |
public void assign(String key, Object obs) { |
public void assign(String key, Object obs) { |
56 |
ev_handlers.put(key, obs); |
ev_handlers.put(key, obs); |
57 |
} |
} |
58 |
|
|
59 |
|
/** If someone wants to pass new time the event call |
60 |
|
*/ |
61 |
|
public void passEvent(String key, MouseEvent ev, Object[] obs) { |
62 |
|
Object ev_h = ev_handlers.get(key); |
63 |
|
if (ev_h instanceof EventMouseObj) |
64 |
|
((EventMouseObj)ev_h).event(ev, press_state, obs); |
65 |
|
} |
66 |
|
|
67 |
|
|
68 |
|
/** Used to clean callers at the beginning of render. |
69 |
|
*/ |
70 |
|
public void cleanCallers() { |
71 |
|
callers = new TreeMap(); |
72 |
|
} |
73 |
|
|
74 |
|
|
75 |
|
|
76 |
|
|
77 |
private int last_cs = -10; |
private String last_key = null; |
78 |
|
private boolean just_pressed = false; |
79 |
|
private boolean dragging = false; |
80 |
|
private MousePressState press_state = null; |
81 |
|
public EventMouseObj when_pressed = null; |
82 |
|
|
83 |
|
|
84 |
public void handleEvent(VobScene vs, MouseEvent ev) { |
public void handleEvent(VobScene vs, MouseEvent ev) { |
85 |
|
|
86 |
int cs = vs.getCSAt(0, ev.getX(), ev.getY(), null); |
int cs = vs.getCSAt(0, ev.getX(), ev.getY(), null); |
87 |
pa("cs: " + cs); |
if (dbg) pa("cs: " + cs); |
88 |
|
|
89 |
switch(ev.getID()) { |
switch(ev.getID()) { |
|
case MouseEvent.MOUSE_CLICKED: { |
|
|
cs += CLICK; |
|
|
pa("mouse click"); |
|
|
break; |
|
|
} |
|
90 |
case MouseEvent.MOUSE_PRESSED: { |
case MouseEvent.MOUSE_PRESSED: { |
91 |
pa("mouse pressed"); |
press_state = new MousePressState(ev.getX(), ev.getY(), |
92 |
|
ev.getModifiers()); |
93 |
|
if (when_pressed != null) |
94 |
|
when_pressed.event(ev, press_state, null); |
95 |
|
|
96 |
|
dragging = false; |
97 |
|
just_pressed = true; |
98 |
|
if (dbg) pa("mouse pressed"); |
99 |
break; |
break; |
100 |
} |
} |
101 |
case MouseEvent.MOUSE_EXITED: { |
case MouseEvent.MOUSE_CLICKED: { |
102 |
pa("mouse exited"); |
dragging = false; |
103 |
last_cs = -1; |
just_pressed = false; |
104 |
|
cs += CLICK; |
105 |
|
if (dbg) pa("mouse click"); |
106 |
break; |
break; |
107 |
} |
} |
108 |
case MouseEvent.MOUSE_DRAGGED: { |
case MouseEvent.MOUSE_DRAGGED: { |
109 |
|
dragging = true; |
110 |
cs += DRAG; |
cs += DRAG; |
111 |
pa("mouse dragged"); |
if (dbg) pa("mouse dragged"); |
112 |
break; |
break; |
113 |
} |
} |
114 |
|
/* |
115 |
|
case MouseEvent.MOUSE_EXITED: { |
116 |
|
if (dbg) pa("mouse exited"); |
117 |
|
break; |
118 |
|
} |
119 |
|
*/ |
120 |
}; |
}; |
121 |
|
|
|
pa("cs: " + cs); |
|
122 |
Object pair = callers.get(""+cs); |
Object pair = callers.get(""+cs); |
123 |
if (pair == null) return; |
if (pair == null) return; |
124 |
if (!(pair instanceof Pair)) { throw new Error("NOT PAIR!"); } |
if (!(pair instanceof Pair)) { throw new Error("NOT PAIR!"); } |
125 |
|
|
126 |
String key = (String)((Pair)pair).first; |
String key = (String)((Pair)pair).first; |
127 |
|
if (just_pressed && dragging) { |
128 |
|
last_key = key; |
129 |
|
just_pressed = false; |
130 |
|
} |
131 |
|
|
132 |
Object ev_h = ev_handlers.get(key); |
if (dbg) pa("key: " + key); |
133 |
pa("foo: "+ev_h); |
|
134 |
if (ev_h instanceof EventObj) |
// event hanlder |
135 |
((EventObj)ev_h).event(ev, ( (Object[]) ((Pair)pair).second)); |
Object ev_h; |
136 |
|
if (dragging) ev_h = ev_handlers.get(last_key); |
137 |
|
else ev_h = ev_handlers.get(key); |
138 |
|
|
139 |
|
if (ev_h instanceof EventMouseObj) |
140 |
|
((EventMouseObj)ev_h).event(ev, press_state, |
141 |
|
((Object[]) ((Pair)pair).second)); |
142 |
} |
} |
143 |
|
|
144 |
|
|
145 |
public interface EventObj { |
public interface EventMouseObj { |
146 |
public void event(MouseEvent ev, Object[] obs); |
public void event(MouseEvent ev, MousePressState p_state, Object[] obs); |
147 |
} |
} |
148 |
|
|
149 |
|
public class MousePressState { |
150 |
|
private int x, y, buttons; |
151 |
|
|
152 |
|
public MousePressState(int x, int y, int b) { |
153 |
|
this.x=x; this.y=y; this.buttons=b; |
154 |
|
} |
155 |
|
public int getX() { return x; } |
156 |
|
public int getY() { return y; } |
157 |
|
public int getButtons() { return buttons; } |
158 |
|
} |
159 |
} |
} |