KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > quikj > application > web > talk > client > whiteboard > WhiteBoardCanvas


1 /*
2  * WhiteBoardCanvas.java
3  *
4  * Created on December 16, 2002, 2:56 AM
5  */

6
7 package com.quikj.application.web.talk.client.whiteboard;
8
9 import java.awt.*;
10 import java.awt.event.*;
11 import java.util.*;
12 /**
13  *
14  * @author amit
15  */

16 public class WhiteBoardCanvas extends java.awt.Canvas JavaDoc
17 {
18     public static final int MODE_LINE = 0;
19     public static final int MODE_TEXT = 1;
20     public static final int MODE_ERASER = 2;
21     public static final int MODE_FREEHAND = 3;
22     public static final int MODE_RECTANGLE = 4;
23     public static final int MODE_OVAL = 5;
24     
25     private int mode = MODE_FREEHAND;
26     private Vector objects = new Vector(); // contains WhiteBoardObjectInterface
27

28     // free-hand drawing attribute
29
private Vector freehandVector;
30     
31     // line drawing attribute
32
private Point lineStartPoint = null;
33     private Point lineEndPoint = null;
34     
35     // text drawing attribute
36
private StringBuffer JavaDoc textBuffer;
37     private Point textStartPoint;
38     private boolean textCursorVisible = false;
39     private Point textCursorPosition;
40     
41     // eraser drawing attributes
42
private Vector eraserVector;
43     
44     // rectangle drawing attribute
45
private Point rectangleStartPoint;
46     private Rectangle rectangle = null;
47     
48     // oval drawing attribute
49
private Point ovalStartPoint;
50     private Rectangle oval = null;
51     
52     ObjectListenerInterface listener = null;
53     
54     /** Creates a new instance of WhiteBoardCanvas */
55     public WhiteBoardCanvas()
56     {
57         setDefaultCursor();
58         addMouseListener(new MouseListener());
59         addMouseMotionListener(new MouseMotionListener());
60         addKeyListener(new KeyListener());
61     }
62     
63     public void paint(java.awt.Graphics JavaDoc graphics)
64     {
65         graphics.setPaintMode();
66         
67         graphics.clearRect(0, 0, getBounds().width, getBounds().height);
68         
69         int size = objects.size();
70         for (int i = 0; i < size; i++)
71         {
72             ((WhiteBoardObjectInterface)objects.elementAt(i)).draw();
73         }
74         
75         // if there is an unfinished text
76
if (mode == MODE_TEXT)
77         {
78             if (textBuffer != null)
79             {
80                 if (textBuffer.length() > 0)
81                 {
82                     graphics.setXORMode(Color.gray);
83                     graphics.drawString(textBuffer.toString(),
84                     textStartPoint.x, textStartPoint.y);
85                     FontMetrics fm = graphics.getFontMetrics();
86                     graphics.drawRect(textCursorPosition.x, textCursorPosition.y,
87                     fm.charWidth('w'), fm.getHeight());
88                 }
89             }
90         }
91     }
92     
93     public void setMode(int mode)
94     {
95         if (this.mode == MODE_TEXT)
96         {
97             completeText();
98         }
99         
100         this.mode = mode;
101         setDefaultCursor();
102     }
103     
104     public int getMode()
105     {
106         return mode;
107     }
108     
109     private void setDefaultCursor()
110     {
111         setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
112     }
113     
114     public void removeLastObject()
115     {
116         if (objects.size() > 0)
117         {
118             objects.removeElementAt(objects.size() - 1);
119             repaint();
120         }
121     }
122
123     private void drawRectangle(Graphics graphics)
124     {
125         if (rectangle != null)
126         {
127             if ((rectangle.width > 0) || (rectangle.height > 0))
128             graphics.setXORMode(Color.gray);
129             graphics.setColor(Color.black);
130             graphics.drawRect(rectangle.x, rectangle.y,
131             rectangle.width, rectangle.height);
132         }
133     }
134     
135     private void drawOval(Graphics graphics)
136     {
137         if (oval != null)
138         {
139             if ((oval.width > 0) || (oval.height > 0))
140             graphics.setXORMode(Color.gray);
141             graphics.setColor(Color.black);
142             graphics.drawOval(oval.x, oval.y,
143             oval.width, oval.height);
144         }
145     }
146     
147     private void drawLine(Graphics graphics)
148     {
149         if (lineEndPoint != null)
150         {
151             graphics.setXORMode(Color.gray);
152             graphics.setColor(Color.black);
153             graphics.drawLine(lineStartPoint.x, lineStartPoint.y,
154             lineEndPoint.x, lineEndPoint.y);
155         }
156     }
157     
158     
159     private void setCursor()
160     {
161         switch (mode)
162         {
163             case MODE_LINE:
164                 setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
165                 break;
166                 
167             case MODE_TEXT:
168                 setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
169                 break;
170                 
171             case MODE_ERASER:
172                 setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
173                 break;
174                 
175             case MODE_FREEHAND:
176                 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
177                 break;
178                 
179             case MODE_RECTANGLE:
180                 setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
181                 break;
182                 
183             case MODE_OVAL:
184                 setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
185                 break;
186         }
187     }
188     
189     private boolean isTextCursorVisible()
190     {
191         return textCursorVisible;
192     }
193     
194     private void setTextCursorVisible(Graphics g, boolean v)
195     {
196         if (v == true)
197         {
198             if (textCursorVisible == false)
199             {
200                 FontMetrics fm = g.getFontMetrics();
201                 g.setXORMode(Color.gray);
202                 
203                 // draw the cursor
204
g.drawRect(textCursorPosition.x, textCursorPosition.y,
205                 fm.charWidth('w'), fm.getHeight());
206             }
207         }
208         else // v == false
209
{
210             if (textCursorVisible == true)
211             {
212                 // erase the cursor
213
FontMetrics fm = g.getFontMetrics();
214                 g.setXORMode(Color.gray);
215                 
216                 // erase the cursor
217
g.drawRect(textCursorPosition.x, textCursorPosition.y,
218                 fm.charWidth('w'), fm.getHeight());
219             }
220         }
221         
222         textCursorVisible = v;
223     }
224     
225     private void setTextCursorPosition(int x, int y)
226     {
227         textCursorPosition = new Point(x, y);
228     }
229     
230     private void completeText()
231     {
232         if (textBuffer != null)
233         {
234             setTextCursorVisible(getGraphics(), false);
235             if (textBuffer.length() > 0)
236             {
237                 TextObject object = new TextObject(WhiteBoardCanvas.this,
238                 textStartPoint.x, textStartPoint.y,
239                 textBuffer.toString());
240                 object.draw();
241                 addDrawnObject(object);
242                 
243                 textBuffer = null;
244                 setDefaultCursor();
245             }
246         }
247     }
248     
249     // this method is called when a message is received
250
public void addDrawingObject (WhiteBoardObjectInterface object)
251     {
252         objects.addElement(object);
253         object.draw();
254     }
255     
256     // this method is called when an object is drawn
257
private void addDrawnObject (WhiteBoardObjectInterface object)
258     {
259         objects.addElement(object);
260         if (listener != null)
261         {
262             listener.objectAdded(object);
263         }
264     }
265     
266     public void registerObjectListener(ObjectListenerInterface listener)
267     {
268         this.listener = listener;
269     }
270     
271     class MouseListener extends MouseAdapter
272     {
273         public void mousePressed(MouseEvent e)
274         {
275             switch(mode)
276             {
277                 case MODE_FREEHAND:
278                     setCursor();
279                     freehandVector = new Vector();
280                     break;
281                     
282                 case MODE_TEXT:
283                     completeText();
284                     
285                     setCursor();
286                     textBuffer = new StringBuffer JavaDoc();
287                     textStartPoint = new Point(e.getX(), e.getY());
288                     Graphics g = getGraphics();
289                     setTextCursorPosition(e.getX(),
290                     e.getY() - g.getFontMetrics().getHeight());
291                     setTextCursorVisible(g, true);
292                     break;
293                     
294                 case MODE_LINE:
295                     setCursor();
296                     lineStartPoint = new Point(e.getX(), e.getY());
297                     break;
298                     
299                 case MODE_ERASER:
300                     setCursor();
301                     eraserVector = new Vector();
302                     break;
303                     
304                 case MODE_RECTANGLE:
305                     setCursor();
306                     rectangleStartPoint = new Point(e.getX(), e.getY());
307                     rectangle = new Rectangle(e.getX(), e.getY(), 0, 0);
308                     break;
309                     
310                 case MODE_OVAL:
311                     setCursor();
312                     ovalStartPoint = new Point(e.getX(), e.getY());
313                     oval = new Rectangle(e.getX(), e.getY(), 0, 0);
314                     break;
315             }
316             
317         }
318         
319         public void mouseReleased(MouseEvent e)
320         {
321             switch(mode)
322             {
323                 case MODE_FREEHAND:
324                     // copy the freehand vector to the objects
325
if (freehandVector.size() >= 2)
326                     {
327                         FreehandObject free_obj = new FreehandObject(WhiteBoardCanvas.this,
328                         freehandVector);
329                         addDrawnObject(free_obj);
330                     }
331                     setDefaultCursor();
332                     break;
333                     
334                 case MODE_LINE:
335                     // first erase the previous line
336
Graphics g = getGraphics();
337                     drawLine(g);
338                     
339                     lineEndPoint = new Point(e.getX(), e.getY());
340                     
341                     // next, draw the new line
342
drawLine(g);
343                     
344                     LineObject line_object = new LineObject(WhiteBoardCanvas.this,
345                     lineStartPoint,
346                     lineEndPoint);
347                     addDrawnObject(line_object);
348                     
349                     lineStartPoint = null;
350                     lineEndPoint = null;
351                     setDefaultCursor();
352                     break;
353                     
354                 case MODE_ERASER:
355                     // copy the eraser vector to the objects
356
if (eraserVector.size() >= 2)
357                     {
358                         EraserObject eraser_obj = new EraserObject(WhiteBoardCanvas.this,
359                         eraserVector);
360                         addDrawnObject(eraser_obj);
361                     }
362                     setDefaultCursor();
363                     break;
364                     
365                 case MODE_RECTANGLE:
366                     // first erase the previous rectangle
367
g = getGraphics();
368                     drawRectangle(g);
369                     
370                     rectangle = RectangleObject.getRectangleDimension(rectangleStartPoint.x,
371                     rectangleStartPoint.y,
372                     e.getX(), e.getY());
373                     
374                     // next, draw the new rectangle
375
drawRectangle(g);
376                     
377                     RectangleObject rect_object = new RectangleObject(WhiteBoardCanvas.this,
378                     rectangle);
379                     addDrawnObject(rect_object);
380                     
381                     rectangle = null;
382                     setDefaultCursor();
383                     break;
384                     
385                     
386                 case MODE_OVAL:
387                     // first erase the previous rectangle
388
g = getGraphics();
389                     drawOval(g);
390                     
391                     oval = OvalObject.getOvalDimension(ovalStartPoint.x,
392                     ovalStartPoint.y,
393                     e.getX(), e.getY());
394                     
395                     // next, draw the new rectangle
396
drawOval(g);
397                     
398                     OvalObject oval_object = new OvalObject(WhiteBoardCanvas.this,
399                     oval);
400                     addDrawnObject(oval_object);
401                     
402                     oval = null;
403                     setDefaultCursor();
404                     break;
405             }
406         }
407     }
408     
409     class MouseMotionListener extends MouseMotionAdapter
410     {
411         public void mouseDragged(MouseEvent e)
412         {
413             switch(mode)
414             {
415                 case MODE_FREEHAND:
416                     Point p = new Point(e.getX(), e.getY());
417                     freehandVector.addElement(p);
418                     
419                     // draw the object
420
int size = freehandVector.size();
421                     if (size > 1)
422                     {
423                         Point start = (Point)freehandVector.elementAt(size - 2);
424                         Point end = (Point)freehandVector.elementAt(size - 1);
425                         Graphics g = getGraphics();
426                         g.setColor(Color.black);
427                         
428                         for (int j = 0; j < FreehandObject.DEFAULT_FREEHAND_TIP_SIZE; j++)
429                         {
430                             g.drawLine(start.x + j, start.y, end.x + j, end.y);
431                         }
432                     }
433                     break;
434                     
435                 case MODE_LINE:
436                     Graphics g = getGraphics();
437                     
438                     // first erase the previous line
439
drawLine(g);
440                     
441                     lineEndPoint = new Point(e.getX(), e.getY());
442                     
443                     // next, draw the new line
444
drawLine(g);
445                     break;
446                     
447                 case MODE_ERASER:
448                     p = new Point(e.getX(), e.getY());
449                     eraserVector.addElement(p);
450                     
451                     // draw the object
452
size = eraserVector.size();
453                     if (size > 1)
454                     {
455                         Point start = (Point)eraserVector.elementAt(size - 2);
456                         Point end = (Point)eraserVector.elementAt(size - 1);
457                         g = getGraphics();
458                         g.setColor(getBackground());
459                         
460                         for (int j = 0; j < EraserObject.DEFAULT_ERASER_TIP_SIZE; j++)
461                         {
462                             g.drawLine(start.x+j, start.y, end.x+j, end.y);
463                         }
464                     }
465                     break;
466                     
467                 case MODE_RECTANGLE:
468                     // first erase the previous rectangle
469
g = getGraphics();
470                     drawRectangle(g);
471                     
472                     rectangle = RectangleObject.getRectangleDimension(rectangleStartPoint.x,
473                     rectangleStartPoint.y, e.getX(), e.getY());
474                     
475                     // next, draw the new rectangle
476
drawRectangle(g);
477                     break;
478                     
479                     
480                 case MODE_OVAL:
481                     // first erase the previous rectangle
482
g = getGraphics();
483                     drawOval(g);
484                     
485                     oval = OvalObject.getOvalDimension(ovalStartPoint.x,
486                     ovalStartPoint.y,
487                     e.getX(), e.getY());
488                     
489                     // next, draw the new rectangle
490
drawOval(g);
491             }
492         }
493     }
494     
495     class KeyListener extends KeyAdapter
496     {
497         public void keyTyped(KeyEvent e)
498         {
499             if (mode == MODE_TEXT)
500             {
501                 if (textBuffer != null)
502                 {
503                     char key = e.getKeyChar();
504                     
505                     switch(key)
506                     {
507                         case '\b':
508                             if (textBuffer != null)
509                             {
510                                 if (textBuffer.length() > 0)
511                                 {
512                                     setTextCursorVisible(getGraphics(), false);
513                                     
514                                     Graphics g = getGraphics();
515                                     FontMetrics fm = g.getFontMetrics();
516                                     
517                                     // first, create a new text buffer without the
518
// character that was just erased
519
String JavaDoc old_string = textBuffer.toString();
520                                     char last_char = old_string.charAt(old_string.length()
521                                     - 1);
522                                     
523                                     String JavaDoc text = old_string.substring(0,
524                                     textBuffer.length() - 1);
525                                     textBuffer = new StringBuffer JavaDoc(text);
526                                     
527                                     // next erase the last character
528
int x = textStartPoint.x + fm.stringWidth(text);
529                                     int y = textStartPoint.y;
530                                     g.setColor(getBackground());
531                                     g.fillRect(x, y - fm.getHeight(),
532                                     fm.charWidth(last_char),
533                                     fm.getHeight());
534                                     
535                                     setTextCursorPosition(x, y - fm.getHeight());
536                                     setTextCursorVisible(getGraphics(), true);
537                                 }
538                             }
539                             break;
540                             
541                         case '\r':
542                             break;
543                             
544                         case '\n':
545                             completeText();
546                             break;
547                             
548                         default:
549                             Graphics g = getGraphics();
550                             FontMetrics fm = g.getFontMetrics();
551                             
552                             setTextCursorVisible(g, false);
553                             
554                             int x = textStartPoint.x + fm.stringWidth(textBuffer.toString());
555                             int y = textStartPoint.y;
556                             char[] c = null;
557                             
558                             if (key == '\t')
559                             {
560                                 c = new char[8];
561                                 for (int i = 0; i < c.length; i++)
562                                 {
563                                     c[i] = ' ';
564                                 }
565                             }
566                             else
567                             {
568                                 c = new char[1];
569                                 c[0] = key;
570                             }
571                             
572                             Graphics tg = getGraphics();
573                             tg.setColor(Color.black);
574                             tg.drawString(new String JavaDoc(c), x, y);
575                             textBuffer.append(key);
576                             
577                             setTextCursorPosition(textStartPoint.x +
578                             fm.stringWidth(textBuffer.toString()),
579                             y - fm.getHeight());
580                             setTextCursorVisible(g, true);
581                             break;
582                     }
583                 }
584             }
585         }
586     }
587     
588 }
589
Popular Tags