Dispatcher.java
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((ListListenerthis.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 = (Texturableobj;
077             to.setTexture(this.texture);
078          }
079 
080          if (obj instanceof Fontable) {
081             Fontable fo = (Fontableobj;
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          ((Fontablecurrent).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 = ((Fontablecurrent).getText();
193          if (text.length() == 0)
194             return;
195          ((Fontablecurrent).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          ((Texturablecurrent).clearTexture();
216          ((Texturablecurrent).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          ((Fontablecurrent).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          ((Fontablecurrent).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 }