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