001 /*
002 *
003 * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.
004 *
005 */
006 package demo.sharededitor.controls;
007
008 //import java.awt.BasicStroke;
009 import java.awt.Color;
010 import java.awt.Image;
011 import java.awt.Stroke;
012 import java.awt.event.KeyEvent;
013 import java.awt.event.KeyListener;
014 import java.awt.event.MouseEvent;
015
016 import javax.swing.event.MouseInputAdapter;
017
018 import demo.sharededitor.events.ListListener;
019 import demo.sharededitor.models.BaseObject;
020 import demo.sharededitor.models.ObjectManager;
021 import demo.sharededitor.ui.Fontable;
022 import demo.sharededitor.ui.Texturable;
023 import demo.sharededitor.ui.Renderer;
024
025 public final class Dispatcher extends MouseInputAdapter implements KeyListener {
026 private ObjectManager objmgr;
027
028 private transient Renderer renderer;
029
030 private transient int lx;
031
032 private transient int ly;
033
034 private transient Image texture;
035
036 private transient String drawTool;
037
038 private transient Color foreground;
039
040 private transient Color background;
041
042 private transient int fillstyle;
043
044 private transient Stroke stroke;
045
046 private transient String fontName;
047
048 private transient int fontSize;
049
050 public Dispatcher(ObjectManager objects, Renderer renderer) {
051 this.renderer = renderer;
052 this.renderer.addMouseListener(this);
053 this.renderer.addMouseMotionListener(this);
054 this.renderer.addKeyListener(this);
055
056 this.objmgr = objects;
057 this.objmgr.setListener((ListListener) this.renderer);
058 }
059
060 public synchronized void mousePressed(MouseEvent e) {
061 this.renderer.requestFocusInWindow();
062 int x = e.getX();
063 int y = e.getY();
064 trackXY(x, y);
065
066 if (objmgr.canGrabAt(x, y))
067 objmgr.grabAt(x, y, !e.isControlDown());
068 else {
069 BaseObject obj = objmgr.create(x, y, this.drawTool);
070 obj.setFillStyle(this.fillstyle);
071 obj.setForeground(this.foreground);
072 obj.setBackground(this.background);
073 obj.setStroke(this.stroke);
074 if ((obj instanceof Texturable)
075 && (BaseObject.FILLSTYLE_TEXTURED == fillstyle)) {
076 Texturable to = (Texturable) obj;
077 to.setTexture(this.texture);
078 }
079
080 if (obj instanceof Fontable) {
081 Fontable fo = (Fontable) obj;
082 fo.setFontInfo(this.fontName, this.fontSize, "");
083 }
084 }
085 }
086
087 public synchronized void mouseDragged(MouseEvent e) {
088 if (objmgr.lastGrabbed() == null)
089 return;
090
091 int x = e.getX();
092 int y = e.getY();
093 BaseObject current = objmgr.lastGrabbed();
094
095 if (current.isAnchorGrabbed())
096 current.resize(x, y);
097 else
098 current.move(x - lx, y - ly);
099
100 trackXY(x, y);
101 }
102
103 public synchronized void mouseClicked(MouseEvent e) {
104 BaseObject current = objmgr.grabAt(e.getX(), e.getY(), !e
105 .isControlDown());
106 if (current != null) {
107 switch (e.getClickCount()) {
108 case 1:
109 current.selectAction(true);
110 break;
111 case 2:
112 current.alternateSelectAction(true);
113 break;
114 }
115 }
116 trackXY(e.getX(), e.getY());
117 }
118
119 public synchronized void mouseMoved(MouseEvent e) {
120 trackXY(e.getX(), e.getY());
121 }
122
123 public synchronized void mouseReleased(MouseEvent e) {
124 trackXY(e.getX(), e.getY());
125 BaseObject current = objmgr.lastGrabbed();
126 if ((current != null) && current.isTransient()) {
127 objmgr.deleteSelection();
128 objmgr.selectAllWithin(current);
129 }
130 }
131
132 public synchronized void keyPressed(KeyEvent e) {
133 processCommand(e);
134 }
135
136 public synchronized void keyTyped(KeyEvent e) {
137 processCommand(e);
138 }
139
140 public synchronized void keyReleased(KeyEvent e) {
141 // no need to do anything here
142 }
143
144 private void processCommand(KeyEvent e) {
145 if (KeyEvent.KEY_TYPED == e.getID()) {
146 if ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy1234567890!@#$%^&*() _+=-`~[]\\{}|:;'?/><,.\""
147 .indexOf(e.getKeyChar()) != -1)
148 sendCharToObject(e.getKeyChar());
149 } else {
150 int keyCode = e.getKeyCode();
151 if (e.isControlDown()) {
152 switch (keyCode) {
153 case KeyEvent.VK_BACK_SPACE:
154 this.objmgr.deleteSelection();
155 break;
156 case KeyEvent.VK_I:
157 this.objmgr.invertSelection();
158 break;
159 case KeyEvent.VK_A:
160 this.objmgr.toggleSelection();
161 break;
162 }
163 } else {
164 switch (keyCode) {
165 case KeyEvent.VK_BACK_SPACE:
166 sendKeyToObject(keyCode);
167 break;
168 case KeyEvent.VK_DELETE:
169 this.objmgr.deleteSelection();
170 break;
171 case KeyEvent.VK_ENTER:
172 case KeyEvent.VK_ESCAPE:
173 this.objmgr.clearSelection();
174 break;
175 }
176 }
177 }
178 }
179
180 private void sendCharToObject(char c) {
181 BaseObject current = objmgr.lastGrabbed();
182 if ((current != null) && (current instanceof Fontable)) {
183 ((Fontable) current).appendToText(c);
184 //String text = ((IFontable) current).getText();
185 //((IFontable) current).setText(text + c);
186 }
187 }
188
189 private void sendKeyToObject(int keyCode) {
190 BaseObject current = objmgr.lastGrabbed();
191 if ((current != null) && (current instanceof Fontable)) {
192 String text = ((Fontable) current).getText();
193 if (text.length() == 0)
194 return;
195 ((Fontable) current).setText(text.substring(0, text.length() - 1));
196 }
197 }
198
199 private void trackXY(int x, int y) {
200 lx = x;
201 ly = y;
202 }
203
204 public synchronized void setDrawTool(String name) {
205 this.renderer.requestFocusInWindow();
206 this.drawTool = name;
207 }
208
209 public synchronized void setTexture(Image texture) {
210 this.renderer.requestFocusInWindow();
211 this.texture = texture;
212 BaseObject current = objmgr.lastGrabbed();
213 if ((current != null) && (current instanceof Texturable)
214 && (BaseObject.FILLSTYLE_TEXTURED == fillstyle)) {
215 ((Texturable) current).clearTexture();
216 ((Texturable) current).setTexture(texture);
217 }
218 }
219
220 public synchronized void setFontName(String fontName) {
221 this.renderer.requestFocusInWindow();
222 this.fontName = fontName;
223 BaseObject current = objmgr.lastGrabbed();
224 if ((current != null) && (current instanceof Fontable))
225 ((Fontable) current).setFontName(fontName);
226 }
227
228 public synchronized void setFontSize(int fontSize) {
229 this.renderer.requestFocusInWindow();
230 this.fontSize = fontSize;
231 BaseObject current = objmgr.lastGrabbed();
232 if ((current != null) && (current instanceof Fontable))
233 ((Fontable) current).setFontSize(fontSize);
234 }
235
236 public synchronized void setFillStyle(int fillstyle) {
237 this.renderer.requestFocusInWindow();
238 this.fillstyle = fillstyle;
239 }
240
241 public synchronized void setStroke(Stroke stroke) {
242 this.renderer.requestFocusInWindow();
243 this.stroke = stroke;
244 BaseObject current = objmgr.lastGrabbed();
245 if (current != null)
246 current.setStroke(stroke);
247 }
248
249 public synchronized void setForeground(Color foreground) {
250 this.renderer.requestFocusInWindow();
251 this.foreground = foreground;
252 BaseObject current = objmgr.lastGrabbed();
253 if (current != null)
254 current.setForeground(foreground);
255 }
256
257 public synchronized void setBackground(Color background) {
258 this.renderer.requestFocusInWindow();
259 this.background = background;
260 BaseObject current = objmgr.lastGrabbed();
261 if (current != null)
262 current.setBackground(background);
263 }
264 }
|