Source for javax.swing.DebugGraphics

   1: /* DebugGraphics.java --
   2:    Copyright (C) 2002, 2004, 2005  Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: package javax.swing;
  39: 
  40: import java.awt.Color;
  41: import java.awt.Font;
  42: import java.awt.FontMetrics;
  43: import java.awt.Graphics;
  44: import java.awt.Image;
  45: import java.awt.Point;
  46: import java.awt.Rectangle;
  47: import java.awt.Shape;
  48: import java.awt.image.ImageObserver;
  49: import java.io.PrintStream;
  50: import java.text.AttributedCharacterIterator;
  51: 
  52: 
  53: /**
  54:  * An extension of {@link Graphics} that can be used for debugging
  55:  * custom Swing widgets. <code>DebugGraphics</code> has the ability to
  56:  * draw slowly and can log drawing actions.
  57:  *
  58:  * @author Andrew Selkirk
  59:  */
  60: public class DebugGraphics extends Graphics
  61: {
  62:   /**
  63:    * LOG_OPTION
  64:    */
  65:   public static final int LOG_OPTION = 1;
  66: 
  67:   /**
  68:    * FLASH_OPTION
  69:    */
  70:   public static final int FLASH_OPTION = 2;
  71: 
  72:   /**
  73:    * BUFFERED_OPTION
  74:    */
  75:   public static final int BUFFERED_OPTION = 4;
  76: 
  77:   /**
  78:    * NONE_OPTION
  79:    */
  80:   public static final int NONE_OPTION = -1;
  81: 
  82:   static Color debugFlashColor = Color.RED;
  83:   static int debugFlashCount = 10;
  84:   static int debugFlashTime = 1000;
  85:   static PrintStream debugLogStream = System.out;
  86: 
  87:   /**
  88:    * Counts the created DebugGraphics objects. This is used by the
  89:    * logging facility.
  90:    */
  91:   static int counter = 0;
  92: 
  93:   /**
  94:    * graphics
  95:    */
  96:   Graphics graphics;
  97: 
  98:   /**
  99:    * buffer
 100:    */
 101:   Image buffer;
 102: 
 103:   /**
 104:    * debugOptions
 105:    */
 106:   int debugOptions;
 107: 
 108:   /**
 109:    * graphicsID
 110:    */
 111:   int graphicsID;
 112: 
 113:   /**
 114:    * xOffset
 115:    */
 116:   int xOffset;
 117: 
 118:   /**
 119:    * yOffset
 120:    */
 121:   int yOffset;
 122: 
 123:   /**
 124:    * Creates a <code>DebugGraphics</code> object.
 125:    */
 126:   public DebugGraphics()
 127:   {
 128:     counter++;
 129:   }
 130: 
 131:   /**
 132:    * Creates a <code>DebugGraphics</code> object.
 133:    *
 134:    * @param graphics The <code>Graphics</code> object to wrap
 135:    * @param component TODO
 136:    */
 137:   public DebugGraphics(Graphics graphics, JComponent component)
 138:   {
 139:     this(graphics);
 140:     // FIXME: What shall we do with component ?
 141:   }
 142: 
 143:   /**
 144:    * Creates a <code>DebugGraphics</code> object.
 145:    *
 146:    * @param graphics The <code>Graphics</code> object to wrap
 147:    */
 148:   public DebugGraphics(Graphics graphics)
 149:   {
 150:     this();
 151:     this.graphics = graphics;
 152:   }
 153: 
 154:   /**
 155:    * Sets the color to draw stuff with.
 156:    *
 157:    * @param color The color
 158:    */
 159:   public void setColor(Color color)
 160:   {
 161:     if ((debugOptions & LOG_OPTION) != 0)
 162:       logStream().println(prefix() + " Setting color: " + color);
 163: 
 164:     graphics.setColor(color);
 165:   }
 166: 
 167:   /**
 168:    * Creates a overrides <code>Graphics.create</code> to create a
 169:    * <code>DebugGraphics</code> object.
 170:    *
 171:    * @return a new <code>DebugGraphics</code> object.
 172:    */
 173:   public Graphics create()
 174:   {
 175:     DebugGraphics copy = new DebugGraphics(graphics.create());
 176:     copy.debugOptions = debugOptions;
 177:     return copy;
 178:   }
 179: 
 180:   /**
 181:    * Creates a overrides <code>Graphics.create</code> to create a
 182:    * <code>DebugGraphics</code> object.
 183:    *
 184:    * @param x the x coordinate
 185:    * @param y the y coordinate
 186:    * @param width the width
 187:    * @param height the height
 188:    *
 189:    * @return a new <code>DebugGraphics</code> object.
 190:    */
 191:   public Graphics create(int x, int y, int width, int height)
 192:   {
 193:     DebugGraphics copy = new DebugGraphics(graphics.create(x, y, width,
 194:                                                            height));
 195:     copy.debugOptions = debugOptions;
 196:     return copy;
 197:   }
 198: 
 199:   /**
 200:    * flashColor
 201:    *
 202:    * @return Color
 203:    */
 204:   public static Color flashColor()
 205:   {
 206:     return debugFlashColor;
 207:   }
 208: 
 209:   /**
 210:    * setFlashColor
 211:    *
 212:    * @param color the color to use for flashing
 213:    */
 214:   public static void setFlashColor(Color color)
 215:   {
 216:     debugFlashColor = color;
 217:   }
 218: 
 219:   /**
 220:    * flashTime
 221:    *
 222:    * @return The time in milliseconds
 223:    */
 224:   public static int flashTime()
 225:   {
 226:     return debugFlashTime;
 227:   }
 228: 
 229:   /**
 230:    * setFlashTime
 231:    *
 232:    * @param time The time in milliseconds
 233:    */
 234:   public static void setFlashTime(int time)
 235:   {
 236:     debugFlashTime = time;
 237:   }
 238: 
 239:   /**
 240:    * flashCount
 241:    *
 242:    * @return The number of flashes
 243:    */
 244:   public static int flashCount()
 245:   {
 246:     return debugFlashCount;
 247:   }
 248: 
 249:   /**
 250:    * setFlashCount
 251:    *
 252:    * @param count The number of flashes
 253:    */
 254:   public static void setFlashCount(int count)
 255:   {
 256:     debugFlashCount = count;
 257:   }
 258: 
 259:   /**
 260:    * logStream
 261:    *
 262:    * @return The <code>PrintStream</code> to write logging messages to
 263:    */
 264:   public static PrintStream logStream()
 265:   {
 266:     return debugLogStream;
 267:   }
 268: 
 269:   /**
 270:    * setLogStream
 271:    *
 272:    * @param stream The currently set <code>PrintStream</code>.
 273:    */
 274:   public static void setLogStream(PrintStream stream)
 275:   {
 276:     debugLogStream = stream;
 277:   }
 278: 
 279:   /**
 280:    * getFont
 281:    *
 282:    * @return The font
 283:    */
 284:   public Font getFont()
 285:   {
 286:     return graphics.getFont();
 287:   }
 288: 
 289:   /**
 290:    * setFont
 291:    *
 292:    * @param font The font to use for drawing text
 293:    */
 294:   public void setFont(Font font)
 295:   {
 296:     if ((debugOptions & LOG_OPTION) != 0)
 297:       logStream().println(prefix() + " Setting font: " + font);
 298: 
 299:     graphics.setFont(font);
 300:   }
 301: 
 302:   /**
 303:    * Returns the color used for drawing.
 304:    *
 305:    * @return The color.
 306:    */
 307:   public Color getColor()
 308:   {
 309:     return graphics.getColor();
 310:   }
 311: 
 312:   /**
 313:    * Returns the font metrics of the current font.
 314:    *
 315:    * @return a <code>FontMetrics</code> object
 316:    */
 317:   public FontMetrics getFontMetrics()
 318:   {
 319:     return graphics.getFontMetrics();
 320:   }
 321: 
 322:   /**
 323:    * Returns the font metrics for a given font.
 324:    *
 325:    * @param font the font to get the metrics for
 326:    *
 327:    * @return a <code>FontMetrics</code> object
 328:    */
 329:   public FontMetrics getFontMetrics(Font font)
 330:   {
 331:     return graphics.getFontMetrics(font);
 332:   }
 333: 
 334:   /**
 335:    * translate
 336:    *
 337:    * @param x the x coordinate
 338:    * @param y the y coordinate
 339:    */
 340:   public void translate(int x, int y)
 341:   {
 342:     if ((debugOptions & LOG_OPTION) != 0)
 343:       logStream().println(prefix() + " Translating by: " + new Point(x, y));
 344: 
 345:     graphics.translate(x, y);
 346:   }
 347: 
 348:   /**
 349:    * setPaintMode
 350:    */
 351:   public void setPaintMode()
 352:   {
 353:     if ((debugOptions & LOG_OPTION) != 0)
 354:       logStream().println(prefix() + " Setting paint mode");
 355: 
 356:     graphics.setPaintMode();
 357:   }
 358: 
 359:   /**
 360:    * setXORMode
 361:    *
 362:    * @param color the color
 363:    */
 364:   public void setXORMode(Color color)
 365:   {
 366:     if ((debugOptions & LOG_OPTION) != 0)
 367:       logStream().println(prefix() + " Setting XOR mode: " + color);
 368: 
 369:     graphics.setXORMode(color);
 370:   }
 371: 
 372:   /**
 373:    * getClipBounds
 374:    *
 375:    * @return Rectangle
 376:    */
 377:   public Rectangle getClipBounds()
 378:   {
 379:     return graphics.getClipBounds();
 380:   }
 381: 
 382:   /**
 383:    * Intersects the current clip region with the given region.
 384:    *
 385:    * @param x The x-position of the region
 386:    * @param y The y-position of the region
 387:    * @param width The width of the region
 388:    * @param height The height of the region
 389:    */
 390:   public void clipRect(int x, int y, int width, int height)
 391:   {
 392:     if ((debugOptions & LOG_OPTION) != 0)
 393:       {
 394:         logStream().print(prefix() + " Setting clipRect: "
 395:                           + new Rectangle(x, y, width, height));
 396:       }
 397: 
 398:     graphics.clipRect(x, y, width, height);
 399: 
 400:     if ((debugOptions & LOG_OPTION) != 0)
 401:       logStream().println(" Netting clipRect: " + graphics.getClipBounds());
 402:   }
 403: 
 404:   /**
 405:    * Sets the clipping region.
 406:    *
 407:    * @param x The x-position of the region
 408:    * @param y The y-position of the region
 409:    * @param width The width of the region
 410:    * @param height The height of the region
 411:    */
 412:   public void setClip(int x, int y, int width, int height)
 413:   {
 414:     if ((debugOptions & LOG_OPTION) != 0)
 415:       {
 416:         logStream().println(prefix() + " Setting new clipRect: "
 417:                             + new Rectangle(x, y, width, height));
 418:       }
 419: 
 420:     graphics.setClip(x, y, width, height);
 421:   }
 422: 
 423:   /**
 424:    * Returns the current clipping region.
 425:    *
 426:    * @return Shape
 427:    */
 428:   public Shape getClip()
 429:   {
 430:     return graphics.getClip();
 431:   }
 432: 
 433:   /**
 434:    * Sets the current clipping region
 435:    *
 436:    * @param shape The clippin region
 437:    */
 438:   public void setClip(Shape shape)
 439:   {
 440:     if ((debugOptions & LOG_OPTION) != 0)
 441:       logStream().println(prefix() + " Setting new clipRect: " + shape);
 442: 
 443:     graphics.setClip(shape);
 444:   }
 445: 
 446:   private void sleep(int milliseconds)
 447:   {
 448:     try
 449:       {
 450:         Thread.sleep(milliseconds);
 451:       }
 452:     catch (InterruptedException e)
 453:       {
 454:         // Ignore this.
 455:       }
 456:   }
 457: 
 458:   /**
 459:    * Draws a rectangle.
 460:    *
 461:    * @param x The x-position of the rectangle
 462:    * @param y The y-position of the rectangle
 463:    * @param width The width of the rectangle
 464:    * @param height The height of the rectangle
 465:    */
 466:   public void drawRect(int x, int y, int width, int height)
 467:   {
 468:     if ((debugOptions & LOG_OPTION) != 0)
 469:       {
 470:         logStream().println(prefix() + " Drawing rect: "
 471:                             + new Rectangle(x, y, width, height));
 472:       }
 473: 
 474:     if ((debugOptions & FLASH_OPTION) != 0)
 475:       {
 476:         Color color = graphics.getColor();
 477:         for (int index = 0; index < (debugFlashCount - 1); ++index)
 478:           {
 479:             graphics.setColor(color);
 480:             graphics.drawRect(x, y, width, height);
 481:             sleep(debugFlashTime);
 482:             graphics.setColor(debugFlashColor);
 483:             graphics.drawRect(x, y, width, height);
 484:             sleep(debugFlashTime);
 485:           }
 486:         graphics.setColor(color);
 487:       }
 488: 
 489:     graphics.drawRect(x, y, width, height);
 490:   }
 491: 
 492:   /**
 493:    * Draws a filled rectangle.
 494:    *
 495:    * @param x The x-position of the rectangle
 496:    * @param y The y-position of the rectangle
 497:    * @param width The width of the rectangle
 498:    * @param height The height of the rectangle
 499:    */
 500:   public void fillRect(int x, int y, int width, int height)
 501:   {
 502:     if ((debugOptions & LOG_OPTION) != 0)
 503:       {
 504:         logStream().println(prefix() + " Filling rect: "
 505:                             + new Rectangle(x, y, width, height));
 506:       }
 507: 
 508:     if ((debugOptions & FLASH_OPTION) != 0)
 509:       {
 510:         Color color = graphics.getColor();
 511:         for (int index = 0; index < (debugFlashCount - 1); ++index)
 512:           {
 513:             graphics.setColor(color);
 514:             graphics.fillRect(x, y, width, height);
 515:             sleep(debugFlashTime);
 516:             graphics.setColor(debugFlashColor);
 517:             graphics.fillRect(x, y, width, height);
 518:             sleep(debugFlashTime);
 519:           }
 520:         graphics.setColor(color);
 521:       }
 522: 
 523:     graphics.fillRect(x, y, width, height);
 524:   }
 525: 
 526:   /**
 527:    * clearRect
 528:    *
 529:    * @param x The x-position of the rectangle
 530:    * @param y The y-position of the rectangle
 531:    * @param width The width of the rectangle
 532:    * @param height The height of the rectangle
 533:    */
 534:   public void clearRect(int x, int y, int width, int height)
 535:   {
 536:     if ((debugOptions & LOG_OPTION) != 0)
 537:       {
 538:         logStream().println(prefix() + " Clearing rect: "
 539:                             + new Rectangle(x, y, width, height));
 540:       }
 541: 
 542:     graphics.clearRect(x, y, width, height);
 543:   }
 544: 
 545:   /**
 546:    * drawRoundRect
 547:    *
 548:    * @param x The x-position of the rectangle
 549:    * @param y The y-position of the rectangle
 550:    * @param width The width of the rectangle
 551:    * @param height The height of the rectangle
 552:    * @param arcWidth TODO
 553:    * @param arcHeight TODO
 554:    */
 555:   public void drawRoundRect(int x, int y, int width, int height,
 556:                             int arcWidth, int arcHeight)
 557:   {
 558:     if ((debugOptions & LOG_OPTION) != 0)
 559:       {
 560:         logStream().println(prefix() + " Drawing round rect: "
 561:                             + new Rectangle(x, y, width, height)
 562:                             + " arcWidth: " + arcWidth
 563:                             + " arcHeight: " + arcHeight);
 564:       }
 565: 
 566:     graphics.drawRoundRect(x, y, width, height, arcWidth, arcHeight);
 567:   }
 568: 
 569:   /**
 570:    * fillRoundRect
 571:    *
 572:    * @param x The x-position of the rectangle
 573:    * @param y The y-position of the rectangle
 574:    * @param width The width of the rectangle
 575:    * @param height The height of the rectangle
 576:    * @param arcWidth TODO
 577:    * @param arcHeight TODO
 578:    */
 579:   public void fillRoundRect(int x, int y, int width, int height,
 580:                             int arcWidth, int arcHeight)
 581:   {
 582:     if ((debugOptions & LOG_OPTION) != 0)
 583:       {
 584:         logStream().println(prefix() + " Filling round rect: "
 585:                             + new Rectangle(x, y, width, height)
 586:                             + " arcWidth: " + arcWidth
 587:                             + " arcHeight: " + arcHeight);
 588:       }
 589: 
 590:     graphics.fillRoundRect(x, y, width, height, arcWidth, arcHeight);
 591:   }
 592: 
 593:   /**
 594:    * drawLine
 595:    *
 596:    * @param x1 The x-position of the start
 597:    * @param y1 The y-position of the start
 598:    * @param x2 The x-position of the end
 599:    * @param y2 The y-position of the end
 600:    */
 601:   public void drawLine(int x1, int y1, int x2, int y2)
 602:   {
 603:     if ((debugOptions & LOG_OPTION) != 0)
 604:       {
 605:         logStream().println(prefix() + " Drawing line: from (" + x1 + ", "
 606:                             + y1 + ") to (" + x2 + ", " + y2 + ")");
 607:       }
 608: 
 609:     graphics.drawLine(x1, y1, x2, y2);
 610:   }
 611: 
 612:   /**
 613:    * draw3DRect
 614:    *
 615:    * @param x The x-position of the rectangle
 616:    * @param y The y-position of the rectangle
 617:    * @param width The width of the rectangle
 618:    * @param height The height of the rectangle
 619:    * @param raised TODO
 620:    */
 621:   public void draw3DRect(int x, int y, int width, int height, boolean raised)
 622:   {
 623:     if ((debugOptions & LOG_OPTION) != 0)
 624:       {
 625:         logStream().println(prefix() + " Drawing 3D rect: "
 626:                             + new Rectangle(x, y, width, height)
 627:                             + "Raised bezel: " + raised);
 628:       }
 629: 
 630:     graphics.draw3DRect(x, y, width, height, raised);
 631:   }
 632: 
 633:   /**
 634:    * fill3DRect
 635:    *
 636:    * @param x The x-position of the rectangle
 637:    * @param y The y-position of the rectangle
 638:    * @param width The width of the rectangle
 639:    * @param height The height of the rectangle
 640:    * @param raised TODO
 641:    */
 642:   public void fill3DRect(int x, int y, int width, int height, boolean raised)
 643:   {
 644:     if ((debugOptions & LOG_OPTION) != 0)
 645:       {
 646:         logStream().println(prefix() + " Filling 3D rect: "
 647:                             + new Rectangle(x, y, width, height)
 648:                             + "Raised bezel: " + raised);
 649:       }
 650: 
 651:     graphics.fill3DRect(x, y, width, height, raised);
 652:   }
 653: 
 654:   /**
 655:    * drawOval
 656:    *
 657:    * @param x the x coordinate
 658:    * @param y the y coordiante
 659:    * @param width the width
 660:    * @param height the height
 661:    */
 662:   public void drawOval(int x, int y, int width, int height)
 663:   {
 664:     if ((debugOptions & LOG_OPTION) != 0)
 665:       {
 666:         logStream().println(prefix() + " Drawing oval: "
 667:                             + new Rectangle(x, y, width, height));
 668:       }
 669: 
 670:     graphics.drawOval(x, y, width, height);
 671:   }
 672: 
 673:   /**
 674:    * fillOval
 675:    *
 676:    * @param x the x coordinate
 677:    * @param y the y coordinate
 678:    * @param width the width
 679:    * @param height the height
 680:    */
 681:   public void fillOval(int x, int y, int width, int height)
 682:   {
 683:     if ((debugOptions & LOG_OPTION) != 0)
 684:       {
 685:         logStream().println(prefix() + " Filling oval: "
 686:                             + new Rectangle(x, y, width, height));
 687:       }
 688: 
 689:     graphics.fillOval(x, y, width, height);
 690:   }
 691: 
 692:   /**
 693:    * drawArc
 694:    *
 695:    * @param x the x coordinate
 696:    * @param y the y coordinate
 697:    * @param width the width
 698:    * @param height the height
 699:    * @param startAngle TODO
 700:    * @param arcAngle TODO
 701:    */
 702:   public void drawArc(int x, int y, int width, int height,
 703:                       int startAngle, int arcAngle)
 704:   {
 705:     if ((debugOptions & LOG_OPTION) != 0)
 706:       {
 707:         logStream().println(prefix() + " Drawing arc: "
 708:                             + new Rectangle(x, y, width, height)
 709:                             + " startAngle: " + startAngle
 710:                             + " arcAngle: " + arcAngle);
 711:       }
 712: 
 713:     graphics.drawArc(x, y, width, height, startAngle, arcAngle);
 714:   }
 715: 
 716:   /**
 717:    * fillArc
 718:    *
 719:    * @param x the coordinate
 720:    * @param y the y coordinate
 721:    * @param width the width
 722:    * @param height the height
 723:    * @param startAngle TODO
 724:    * @param arcAngle TODO
 725:    */
 726:   public void fillArc(int x, int y, int width, int height,
 727:                       int startAngle, int arcAngle)
 728:   {
 729:     if ((debugOptions & LOG_OPTION) != 0)
 730:       {
 731:         logStream().println(prefix() + " Filling arc: "
 732:                             + new Rectangle(x, y, width, height)
 733:                             + " startAngle: " + startAngle
 734:                             + " arcAngle: " + arcAngle);
 735:       }
 736: 
 737:     graphics.fillArc(x, y, width, height, startAngle, arcAngle);
 738:   }
 739: 
 740:   /**
 741:    * drawPolyline
 742:    *
 743:    * @param xpoints TODO
 744:    * @param ypoints TODO
 745:    * @param npoints TODO
 746:    */
 747:   public void drawPolyline(int[] xpoints, int[] ypoints, int npoints)
 748:   {
 749:     if ((debugOptions & LOG_OPTION) != 0)
 750:       {
 751:         logStream().println(prefix() + " Drawing polyline: nPoints: " + npoints
 752:                             + " X's: " + xpoints + " Y's: " + ypoints);
 753:       }
 754: 
 755:     graphics.drawPolyline(xpoints, ypoints, npoints);
 756:   }
 757: 
 758:   /**
 759:    * drawPolygon
 760:    *
 761:    * @param xpoints TODO
 762:    * @param ypoints TODO
 763:    * @param npoints TODO
 764:    */
 765:   public void drawPolygon(int[] xpoints, int[] ypoints, int npoints)
 766:   {
 767:     if ((debugOptions & LOG_OPTION) != 0)
 768:       {
 769:         logStream().println(prefix() + " Drawing polygon: nPoints: " + npoints
 770:                             + " X's: " + xpoints + " Y's: " + ypoints);
 771:       }
 772: 
 773:     graphics.drawPolygon(xpoints, ypoints, npoints);
 774:   }
 775: 
 776:   /**
 777:    * fillPolygon
 778:    *
 779:    * @param xpoints TODO
 780:    * @param ypoints TODO
 781:    * @param npoints TODO
 782:    */
 783:   public void fillPolygon(int[] xpoints, int[] ypoints, int npoints)
 784:   {
 785:     if ((debugOptions & LOG_OPTION) != 0)
 786:       {
 787:         logStream().println(prefix() + " Drawing polygon: nPoints: " + npoints
 788:                             + " X's: " + xpoints + " Y's: " + ypoints);
 789:       }
 790: 
 791:     graphics.fillPolygon(xpoints, ypoints, npoints);
 792:   }
 793: 
 794:   /**
 795:    * drawString
 796:    *
 797:    * @param string the string
 798:    * @param x the x coordinate
 799:    * @param y the y coordinate
 800:    */
 801:   public void drawString(String string, int x, int y)
 802:   {
 803:     if ((debugOptions & LOG_OPTION) != 0)
 804:       {
 805:         logStream().println(prefix() + " Drawing string: \"" + string
 806:                             + "\" at: " + new Point(x, y));
 807:       }
 808: 
 809:     graphics.drawString(string, x, y);
 810:   }
 811: 
 812:   /**
 813:    * drawString
 814:    *
 815:    * @param iterator TODO
 816:    * @param x the x coordinate
 817:    * @param y the y coordinate
 818:    */
 819:   public void drawString(AttributedCharacterIterator iterator,
 820:                          int x, int y)
 821:   {
 822:     if ((debugOptions & LOG_OPTION) != 0)
 823:       {
 824:         logStream().println(prefix() + " Drawing string: \"" + iterator
 825:                             + "\" at: " + new Point(x, y));
 826:       }
 827: 
 828:     graphics.drawString(iterator, x, y);
 829:   }
 830: 
 831:   /**
 832:    * drawBytes
 833:    *
 834:    * @param data TODO
 835:    * @param offset TODO
 836:    * @param length TODO
 837:    * @param x the x coordinate
 838:    * @param y the y coordinate
 839:    */
 840:   public void drawBytes(byte[] data, int offset, int length,
 841:                         int x, int y)
 842:   {
 843:     if ((debugOptions & LOG_OPTION) != 0)
 844:       logStream().println(prefix() + " Drawing bytes at: " + new Point(x, y));
 845: 
 846:     graphics.drawBytes(data, offset, length, x, y);
 847:   }
 848: 
 849:   /**
 850:    * drawChars
 851:    *
 852:    * @param data array of characters to draw
 853:    * @param offset offset in array
 854:    * @param length number of characters in array to draw
 855:    * @param x x-position
 856:    * @param y y-position
 857:    */
 858:   public void drawChars(char[] data, int offset, int length,
 859:                         int x, int y)
 860:   {
 861:     if ((debugOptions & LOG_OPTION) != 0)
 862:       logStream().println(prefix() + " Drawing chars at: " + new Point(x, y));
 863: 
 864:     if ((debugOptions & FLASH_OPTION) != 0)
 865:       {
 866:         Color color = graphics.getColor();
 867:         for (int index = 0; index < (debugFlashCount - 1); ++index)
 868:           {
 869:             graphics.setColor(color);
 870:             graphics.drawChars(data, offset, length, x, y);
 871:             sleep(debugFlashTime);
 872:             graphics.setColor(debugFlashColor);
 873:             graphics.drawChars(data, offset, length, x, y);
 874:             sleep(debugFlashTime);
 875:           }
 876:         graphics.setColor(color);
 877:       }
 878: 
 879:     graphics.drawChars(data, offset, length, x, y);
 880:   }
 881: 
 882:   /**
 883:    * drawImage
 884:    *
 885:    * @param image The image to draw
 886:    * @param x The x position
 887:    * @param y The y position
 888:    * @param observer The image observer
 889:    * @return boolean
 890:    */
 891:   public boolean drawImage(Image image, int x, int y,
 892:                            ImageObserver observer)
 893:   {
 894:     if ((debugOptions & LOG_OPTION) != 0)
 895:       {
 896:         logStream().println(prefix() + " Drawing image: " + image + " at: "
 897:                           + new Point(x, y));
 898:       }
 899: 
 900:     return graphics.drawImage(image, x, y, observer);
 901:   }
 902: 
 903:   /**
 904:    * drawImage
 905:    *
 906:    * @param image The image to draw
 907:    * @param x The x position
 908:    * @param y The y position
 909:    * @param width The width of the area to draw the image
 910:    * @param height The height of the area to draw the image
 911:    * @param observer The image observer
 912:    *
 913:    * @return boolean
 914:    */
 915:   public boolean drawImage(Image image, int x, int y, int width,
 916:                            int height, ImageObserver observer)
 917:   {
 918:     if ((debugOptions & LOG_OPTION) != 0)
 919:       {
 920:         logStream().println(prefix() + " Drawing image: " + image
 921:                             + " at: " + new Rectangle(x, y, width, height));
 922:       }
 923: 
 924:     return graphics.drawImage(image, x, y, width, height, observer);
 925:   }
 926: 
 927:   /**
 928:    * drawImage
 929:    *
 930:    * @param image The image to draw
 931:    * @param x The x position
 932:    * @param y The y position
 933:    * @param background The color for the background in the opaque regions
 934:    * of the image
 935:    * @param observer The image observer
 936:    *
 937:    * @return boolean
 938:    */
 939:   public boolean drawImage(Image image, int x, int y,
 940:                            Color background, ImageObserver observer)
 941:   {
 942:     if ((debugOptions & LOG_OPTION) != 0)
 943:       {
 944:         logStream().println(prefix() + " Drawing image: " + image
 945:                             + " at: " + new Point(x, y)
 946:                             + ", bgcolor: " + background);
 947:       }
 948: 
 949:     return graphics.drawImage(image, x, y, background, observer);
 950:   }
 951: 
 952:   /**
 953:    * drawImage
 954:    *
 955:    * @param image The image to draw
 956:    * @param x The x position
 957:    * @param y The y position
 958:    * @param width The width of the area to draw the image
 959:    * @param height The height of the area to draw the image
 960:    * @param background The color for the background in the opaque regions
 961:    * of the image
 962:    * @param observer The image observer
 963:    *
 964:    * @return boolean
 965:    */
 966:   public boolean drawImage(Image image, int x, int y, int width, int height,
 967:                            Color background, ImageObserver observer)
 968:   {
 969:     if ((debugOptions & LOG_OPTION) != 0)
 970:       {
 971:         logStream().println(prefix() + " Drawing image: " + image
 972:                             + " at: " + new Rectangle(x, y, width, height)
 973:                             + ", bgcolor: " + background);
 974:       }
 975: 
 976:     return graphics.drawImage(image, x, y, width, height, background, observer);
 977:   }
 978: 
 979:   /**
 980:    * drawImage
 981:    *
 982:    * @param image The image to draw
 983:    * @param dx1 TODO
 984:    * @param dy1 TODO
 985:    * @param dx2 TODO
 986:    * @param dy2 TODO
 987:    * @param sx1 TODO
 988:    * @param sy1 TODO
 989:    * @param sx2 TODO
 990:    * @param sy2 TODO
 991:    * @param observer The image observer
 992:    *
 993:    * @return boolean
 994:    */
 995:   public boolean drawImage(Image image, int dx1, int dy1,
 996:                            int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
 997:                            ImageObserver observer)
 998:   {
 999:     if ((debugOptions & LOG_OPTION) != 0)
1000:       {
1001:         logStream().println(prefix() + " Drawing image: " + image
1002:                          + " destination: " + new Rectangle(dx1, dy1, dx2, dy2)
1003:                          + " source: " + new Rectangle(sx1, sy1, sx2, sy2));
1004:       }
1005: 
1006:     return graphics.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer);
1007:   }
1008: 
1009:   /**
1010:    * drawImage
1011:    *
1012:    * @param image The image to draw
1013:    * @param dx1 TODO
1014:    * @param dy1 TODO
1015:    * @param dx2 TODO
1016:    * @param dy2 TODO
1017:    * @param sx1 TODO
1018:    * @param sy1 TODO
1019:    * @param sx2 TODO
1020:    * @param sy2 TODO
1021:    * @param background The color for the background in the opaque regions
1022:    * of the image
1023:    * @param observer The image observer
1024:    *
1025:    * @return boolean
1026:    */
1027:   public boolean drawImage(Image image, int dx1, int dy1,
1028:                            int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
1029:                            Color background, ImageObserver observer)
1030:   {
1031:     if ((debugOptions & LOG_OPTION) != 0)
1032:       {
1033:         logStream().println(prefix() + " Drawing image: " + image
1034:                          + " destination: " + new Rectangle(dx1, dy1, dx2, dy2)
1035:                          + " source: " + new Rectangle(sx1, sy1, sx2, sy2)
1036:                          + ", bgcolor: " + background);
1037:       }
1038: 
1039:     return graphics.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, background, observer);
1040:   }
1041: 
1042:   /**
1043:    * copyArea
1044:    *
1045:    * @param x The x position of the source area
1046:    * @param y The y position of the source area
1047:    * @param width The width of the area
1048:    * @param height The height of the area
1049:    * @param destx The x position of the destination area
1050:    * @param desty The y posiiton of the destination area
1051:    */
1052:   public void copyArea(int x, int y, int width, int height,
1053:                        int destx, int desty)
1054:   {
1055:     if ((debugOptions & LOG_OPTION) != 0)
1056:       {
1057:         logStream().println(prefix() + " Copying area from: "
1058:                             +  new Rectangle(x, y, width, height)
1059:                             + " to: " + new Point(destx, desty));
1060:       }
1061: 
1062:     graphics.copyArea(x, y, width, height, destx, desty);
1063:   }
1064: 
1065:   /**
1066:    * Releases all system resources that this <code>Graphics</code> is using.
1067:    */
1068:   public void dispose()
1069:   {
1070:     graphics.dispose();
1071:     graphics = null;
1072:   }
1073: 
1074:   /**
1075:    * isDrawingBuffer
1076:    *
1077:    * @return boolean
1078:    */
1079:   public boolean isDrawingBuffer()
1080:   {
1081:     return false; // TODO
1082:   }
1083: 
1084:   /**
1085:    * setDebugOptions
1086:    *
1087:    * @param options the debug options
1088:    */
1089:   public void setDebugOptions(int options)
1090:   {
1091:     debugOptions = options;
1092:     if ((debugOptions & LOG_OPTION) != 0)
1093:       if (options == NONE_OPTION)
1094:         logStream().println(prefix() + "Disabling debug");
1095:       else
1096:         logStream().println(prefix() + "Enabling debug");
1097:   }
1098: 
1099:   /**
1100:    * getDebugOptions
1101:    *
1102:    * @return the debug options
1103:    */
1104:   public int getDebugOptions()
1105:   {
1106:     return debugOptions;
1107:   }
1108: 
1109:   /**
1110:    * Creates and returns the prefix that should be prepended to all logging
1111:    * messages. The prefix is made up like this:
1112:    *
1113:    * <code>Graphics(<counter>-1)</code> where counter is an integer number
1114:    * saying how many DebugGraphics objects have been created so far. The second
1115:    * number always seem to be 1 on Sun's JDK, this has to be investigated a
1116:    * little more.
1117:    *
1118:    * @return the prefix that should be prepended to all logging
1119:    *         messages
1120:    */
1121:   private String prefix()
1122:   {
1123:     return "Graphics(" + counter + "-1)";
1124:   }
1125: }