Dispatcher.java
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((ListListenerthis.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          ((Texturablecurrent).clearTexture();
079          ((Texturablecurrent).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          ((Fontablecurrent).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          ((Fontablecurrent).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 = (Texturableobj;
151             to.setTexture(this.texture);
152          }
153 
154          if (obj instanceof Fontable) {
155             Fontable fo = (Fontableobj;
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          ((Fontablecurrent).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 = ((Fontablecurrent).getText();
273          if (text.length() == 0) {
274             return;
275          }
276          ((Fontablecurrent).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 }