1 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 16 public class WhiteBoardCanvas extends java.awt.Canvas 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(); 28 private Vector freehandVector; 30 31 private Point lineStartPoint = null; 33 private Point lineEndPoint = null; 34 35 private StringBuffer textBuffer; 37 private Point textStartPoint; 38 private boolean textCursorVisible = false; 39 private Point textCursorPosition; 40 41 private Vector eraserVector; 43 44 private Point rectangleStartPoint; 46 private Rectangle rectangle = null; 47 48 private Point ovalStartPoint; 50 private Rectangle oval = null; 51 52 ObjectListenerInterface listener = null; 53 54 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 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 (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 g.drawRect(textCursorPosition.x, textCursorPosition.y, 205 fm.charWidth('w'), fm.getHeight()); 206 } 207 } 208 else { 210 if (textCursorVisible == true) 211 { 212 FontMetrics fm = g.getFontMetrics(); 214 g.setXORMode(Color.gray); 215 216 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 public void addDrawingObject (WhiteBoardObjectInterface object) 251 { 252 objects.addElement(object); 253 object.draw(); 254 } 255 256 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 (); 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 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 Graphics g = getGraphics(); 337 drawLine(g); 338 339 lineEndPoint = new Point(e.getX(), e.getY()); 340 341 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 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 g = getGraphics(); 368 drawRectangle(g); 369 370 rectangle = RectangleObject.getRectangleDimension(rectangleStartPoint.x, 371 rectangleStartPoint.y, 372 e.getX(), e.getY()); 373 374 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 g = getGraphics(); 389 drawOval(g); 390 391 oval = OvalObject.getOvalDimension(ovalStartPoint.x, 392 ovalStartPoint.y, 393 e.getX(), e.getY()); 394 395 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 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 drawLine(g); 440 441 lineEndPoint = new Point(e.getX(), e.getY()); 442 443 drawLine(g); 445 break; 446 447 case MODE_ERASER: 448 p = new Point(e.getX(), e.getY()); 449 eraserVector.addElement(p); 450 451 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 g = getGraphics(); 470 drawRectangle(g); 471 472 rectangle = RectangleObject.getRectangleDimension(rectangleStartPoint.x, 473 rectangleStartPoint.y, e.getX(), e.getY()); 474 475 drawRectangle(g); 477 break; 478 479 480 case MODE_OVAL: 481 g = getGraphics(); 483 drawOval(g); 484 485 oval = OvalObject.getOvalDimension(ovalStartPoint.x, 486 ovalStartPoint.y, 487 e.getX(), e.getY()); 488 489 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 String old_string = textBuffer.toString(); 520 char last_char = old_string.charAt(old_string.length() 521 - 1); 522 523 String text = old_string.substring(0, 524 textBuffer.length() - 1); 525 textBuffer = new StringBuffer (text); 526 527 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 (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 |