Source for org.jfree.chart.LegendItem

   1: /* ===========================================================
   2:  * JFreeChart : a free chart library for the Java(tm) platform
   3:  * ===========================================================
   4:  *
   5:  * (C) Copyright 2000-2006, by Object Refinery Limited and Contributors.
   6:  *
   7:  * Project Info:  http://www.jfree.org/jfreechart/index.html
   8:  *
   9:  * This library is free software; you can redistribute it and/or modify it 
  10:  * under the terms of the GNU Lesser General Public License as published by 
  11:  * the Free Software Foundation; either version 2.1 of the License, or 
  12:  * (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but 
  15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16:  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17:  * License for more details.
  18:  *
  19:  * You should have received a copy of the GNU Lesser General Public
  20:  * License along with this library; if not, write to the Free Software
  21:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22:  * USA.  
  23:  *
  24:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25:  * in the United States and other countries.]
  26:  *
  27:  * ---------------
  28:  * LegendItem.java
  29:  * ---------------
  30:  * (C) Copyright 2000-2006, by Object Refinery Limited and Contributors.
  31:  *
  32:  * Original Author:  David Gilbert (for Object Refinery Limited);
  33:  * Contributor(s):   Andrzej Porebski;
  34:  *                   David Li;
  35:  *                   Wolfgang Irler;
  36:  *                   Luke Quinane;
  37:  *
  38:  * $Id: LegendItem.java,v 1.9.2.6 2006/12/13 11:23:38 mungady Exp $
  39:  *
  40:  * Changes (from 2-Oct-2002)
  41:  * -------------------------
  42:  * 02-Oct-2002 : Fixed errors reported by Checkstyle (DG);
  43:  * 17-Jan-2003 : Dropped outlineStroke attribute (DG);
  44:  * 08-Oct-2003 : Applied patch for displaying series line style, contributed by
  45:  *               Luke Quinane (DG);
  46:  * 21-Jan-2004 : Added the shapeFilled flag (DG);
  47:  * 04-Jun-2004 : Added equals() method, implemented Serializable (DG);
  48:  * 25-Nov-2004 : Changes required by new LegendTitle implementation (DG);
  49:  * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 
  50:  *               release (DG);
  51:  * 20-Apr-2005 : Added tooltip and URL text (DG);
  52:  * 28-Nov-2005 : Separated constructors for AttributedString labels (DG);
  53:  * 10-Dec-2005 : Fixed serialization bug (1377239) (DG);
  54:  * ------------- JFREECHART 1.0.x ---------------------------------------------
  55:  * 20-Jul-2006 : Added dataset and series index fields (DG);
  56:  * 13-Dec-2006 : Added fillPaintTransformer attribute (DG);
  57:  *
  58:  */
  59: 
  60: package org.jfree.chart;
  61: 
  62: import java.awt.BasicStroke;
  63: import java.awt.Color;
  64: import java.awt.Paint;
  65: import java.awt.Shape;
  66: import java.awt.Stroke;
  67: import java.awt.geom.Line2D;
  68: import java.io.IOException;
  69: import java.io.ObjectInputStream;
  70: import java.io.ObjectOutputStream;
  71: import java.io.Serializable;
  72: import java.text.AttributedString;
  73: import java.text.CharacterIterator;
  74: 
  75: import org.jfree.io.SerialUtilities;
  76: import org.jfree.ui.GradientPaintTransformer;
  77: import org.jfree.ui.StandardGradientPaintTransformer;
  78: import org.jfree.util.AttributedStringUtilities;
  79: import org.jfree.util.ObjectUtilities;
  80: import org.jfree.util.ShapeUtilities;
  81: 
  82: /**
  83:  * A temporary storage object for recording the properties of a legend item, 
  84:  * without any consideration for layout issues. 
  85:  */
  86: public class LegendItem implements Serializable {
  87: 
  88:     /** For serialization. */
  89:     private static final long serialVersionUID = -797214582948827144L;
  90:     
  91:     /** The dataset index. */
  92:     private int datasetIndex;
  93:     
  94:     /** The series index. */
  95:     private int series;
  96:     
  97:     /** The label. */
  98:     private String label;
  99:     
 100:     /** The attributed label (if null, fall back to the regular label). */
 101:     private transient AttributedString attributedLabel;
 102: 
 103:     /** 
 104:      * The description (not currently used - could be displayed as a tool tip). 
 105:      */
 106:     private String description;
 107:     
 108:     /** The tool tip text. */
 109:     private String toolTipText;
 110:     
 111:     /** The url text. */
 112:     private String urlText;
 113: 
 114:     /** A flag that controls whether or not the shape is visible. */
 115:     private boolean shapeVisible;
 116:     
 117:     /** The shape. */
 118:     private transient Shape shape;
 119:     
 120:     /** A flag that controls whether or not the shape is filled. */
 121:     private boolean shapeFilled;
 122: 
 123:     /** The paint. */
 124:     private transient Paint fillPaint;
 125:     
 126:     /** 
 127:      * A gradient paint transformer. 
 128:      * 
 129:      * @since 1.0.4
 130:      */
 131:     private GradientPaintTransformer fillPaintTransformer;
 132:     
 133:     /** A flag that controls whether or not the shape outline is visible. */
 134:     private boolean shapeOutlineVisible;
 135:     
 136:     /** The outline paint. */
 137:     private transient Paint outlinePaint;
 138:     
 139:     /** The outline stroke. */
 140:     private transient Stroke outlineStroke;
 141: 
 142:     /** A flag that controls whether or not the line is visible. */
 143:     private boolean lineVisible;
 144:     
 145:     /** The line. */
 146:     private transient Shape line;
 147:     
 148:     /** The stroke. */
 149:     private transient Stroke lineStroke;
 150:     
 151:     /** The line paint. */
 152:     private transient Paint linePaint;
 153: 
 154:     /**
 155:      * The shape must be non-null for a LegendItem - if no shape is required,
 156:      * use this.
 157:      */
 158:     private static final Shape UNUSED_SHAPE = new Line2D.Float();
 159:     
 160:     /**
 161:      * The stroke must be non-null for a LegendItem - if no stroke is required,
 162:      * use this.
 163:      */
 164:     private static final Stroke UNUSED_STROKE = new BasicStroke(0.0f);
 165:     
 166:     /**
 167:      * Creates a legend item with a filled shape.  The shape is not outlined,
 168:      * and no line is visible.
 169:      * 
 170:      * @param label  the label (<code>null</code> not permitted).
 171:      * @param description  the description (<code>null</code> permitted).
 172:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 173:      * @param urlText  the URL text (<code>null</code> permitted).
 174:      * @param shape  the shape (<code>null</code> not permitted).
 175:      * @param fillPaint  the paint used to fill the shape (<code>null</code>
 176:      *                   not permitted).
 177:      */
 178:     public LegendItem(String label, String description, 
 179:                       String toolTipText, String urlText, 
 180:                       Shape shape, Paint fillPaint) {
 181:         
 182:         this(label, description, toolTipText, urlText, 
 183:                 /* shape visible = */ true, shape, 
 184:                 /* shape filled = */ true, fillPaint, 
 185:                 /* shape outlined */ false, Color.black, UNUSED_STROKE,
 186:                 /* line visible */ false, UNUSED_SHAPE, UNUSED_STROKE,
 187:                 Color.black);
 188: 
 189:     }
 190:     
 191:     /**
 192:      * Creates a legend item with a filled and outlined shape.
 193:      * 
 194:      * @param label  the label (<code>null</code> not permitted).
 195:      * @param description  the description (<code>null</code> permitted).
 196:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 197:      * @param urlText  the URL text (<code>null</code> permitted).
 198:      * @param shape  the shape (<code>null</code> not permitted).
 199:      * @param fillPaint  the paint used to fill the shape (<code>null</code>
 200:      *                   not permitted).
 201:      * @param outlineStroke  the outline stroke (<code>null</code> not 
 202:      *                       permitted).
 203:      * @param outlinePaint  the outline paint (<code>null</code> not 
 204:      *                      permitted).
 205:      */
 206:     public LegendItem(String label, String description, 
 207:                       String toolTipText, String urlText, 
 208:                       Shape shape, Paint fillPaint, 
 209:                       Stroke outlineStroke, Paint outlinePaint) {
 210:         
 211:         this(label, description, toolTipText, urlText,
 212:                 /* shape visible = */ true, shape, 
 213:                 /* shape filled = */ true, fillPaint, 
 214:                 /* shape outlined = */ true, outlinePaint, outlineStroke,
 215:                 /* line visible */ false, UNUSED_SHAPE, UNUSED_STROKE,
 216:                 Color.black);
 217: 
 218:     }
 219:     
 220:     /**
 221:      * Creates a legend item using a line.
 222:      * 
 223:      * @param label  the label (<code>null</code> not permitted).
 224:      * @param description  the description (<code>null</code> permitted).
 225:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 226:      * @param urlText  the URL text (<code>null</code> permitted).
 227:      * @param line  the line (<code>null</code> not permitted).
 228:      * @param lineStroke  the line stroke (<code>null</code> not permitted).
 229:      * @param linePaint  the line paint (<code>null</code> not permitted).
 230:      */
 231:     public LegendItem(String label, String description, 
 232:                       String toolTipText, String urlText, 
 233:                       Shape line, Stroke lineStroke, Paint linePaint) {
 234:         
 235:         this(label, description, toolTipText, urlText,
 236:                 /* shape visible = */ false, UNUSED_SHAPE,
 237:                 /* shape filled = */ false, Color.black,
 238:                 /* shape outlined = */ false, Color.black, UNUSED_STROKE,
 239:                 /* line visible = */ true, line, lineStroke, linePaint);
 240:     }
 241:     
 242:     /**
 243:      * Creates a new legend item.
 244:      *
 245:      * @param label  the label (<code>null</code> not permitted).
 246:      * @param description  the description (not currently used, 
 247:      *        <code>null</code> permitted).
 248:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 249:      * @param urlText  the URL text (<code>null</code> permitted).
 250:      * @param shapeVisible  a flag that controls whether or not the shape is 
 251:      *                      displayed.
 252:      * @param shape  the shape (<code>null</code> permitted).
 253:      * @param shapeFilled  a flag that controls whether or not the shape is 
 254:      *                     filled.
 255:      * @param fillPaint  the fill paint (<code>null</code> not permitted).
 256:      * @param shapeOutlineVisible  a flag that controls whether or not the 
 257:      *                             shape is outlined.
 258:      * @param outlinePaint  the outline paint (<code>null</code> not permitted).
 259:      * @param outlineStroke  the outline stroke (<code>null</code> not 
 260:      *                       permitted).
 261:      * @param lineVisible  a flag that controls whether or not the line is 
 262:      *                     visible.
 263:      * @param line  the line.
 264:      * @param lineStroke  the stroke (<code>null</code> not permitted).
 265:      * @param linePaint  the line paint (<code>null</code> not permitted).
 266:      */
 267:     public LegendItem(String label, String description,
 268:                       String toolTipText, String urlText,
 269:                       boolean shapeVisible, Shape shape,
 270:                       boolean shapeFilled, Paint fillPaint, 
 271:                       boolean shapeOutlineVisible, Paint outlinePaint,
 272:                       Stroke outlineStroke,
 273:                       boolean lineVisible, Shape line,
 274:                       Stroke lineStroke, Paint linePaint) {
 275:         
 276:         if (label == null) {
 277:             throw new IllegalArgumentException("Null 'label' argument.");   
 278:         }
 279:         if (fillPaint == null) {
 280:             throw new IllegalArgumentException("Null 'fillPaint' argument.");   
 281:         }
 282:         if (lineStroke == null) {
 283:             throw new IllegalArgumentException("Null 'lineStroke' argument.");
 284:         }
 285:         if (outlinePaint == null) {
 286:             throw new IllegalArgumentException("Null 'outlinePaint' argument.");
 287:         }
 288:         if (outlineStroke == null) {
 289:             throw new IllegalArgumentException(
 290:                     "Null 'outlineStroke' argument.");   
 291:         }
 292:         this.label = label;
 293:         this.attributedLabel = null;
 294:         this.description = description;
 295:         this.shapeVisible = shapeVisible;
 296:         this.shape = shape;
 297:         this.shapeFilled = shapeFilled;
 298:         this.fillPaint = fillPaint;
 299:         this.fillPaintTransformer = new StandardGradientPaintTransformer();
 300:         this.shapeOutlineVisible = shapeOutlineVisible;
 301:         this.outlinePaint = outlinePaint;
 302:         this.outlineStroke = outlineStroke;
 303:         this.lineVisible = lineVisible;
 304:         this.line = line;
 305:         this.lineStroke = lineStroke;
 306:         this.linePaint = linePaint;
 307:         this.toolTipText = toolTipText;
 308:         this.urlText = urlText;
 309:     }
 310:     
 311:     /**
 312:      * Creates a legend item with a filled shape.  The shape is not outlined,
 313:      * and no line is visible.
 314:      * 
 315:      * @param label  the label (<code>null</code> not permitted).
 316:      * @param description  the description (<code>null</code> permitted).
 317:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 318:      * @param urlText  the URL text (<code>null</code> permitted).
 319:      * @param shape  the shape (<code>null</code> not permitted).
 320:      * @param fillPaint  the paint used to fill the shape (<code>null</code>
 321:      *                   not permitted).
 322:      */
 323:     public LegendItem(AttributedString label, String description, 
 324:                       String toolTipText, String urlText, 
 325:                       Shape shape, Paint fillPaint) {
 326:         
 327:         this(label, description, toolTipText, urlText, 
 328:                 /* shape visible = */ true, shape,
 329:                 /* shape filled = */ true, fillPaint,
 330:                 /* shape outlined = */ false, Color.black, UNUSED_STROKE,
 331:                 /* line visible = */ false, UNUSED_SHAPE, UNUSED_STROKE,
 332:                 Color.black);
 333:         
 334:     }
 335:     
 336:     /**
 337:      * Creates a legend item with a filled and outlined shape.
 338:      * 
 339:      * @param label  the label (<code>null</code> not permitted).
 340:      * @param description  the description (<code>null</code> permitted).
 341:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 342:      * @param urlText  the URL text (<code>null</code> permitted).
 343:      * @param shape  the shape (<code>null</code> not permitted).
 344:      * @param fillPaint  the paint used to fill the shape (<code>null</code>
 345:      *                   not permitted).
 346:      * @param outlineStroke  the outline stroke (<code>null</code> not 
 347:      *                       permitted).
 348:      * @param outlinePaint  the outline paint (<code>null</code> not 
 349:      *                      permitted).
 350:      */
 351:     public LegendItem(AttributedString label, String description, 
 352:                       String toolTipText, String urlText, 
 353:                       Shape shape, Paint fillPaint, 
 354:                       Stroke outlineStroke, Paint outlinePaint) {
 355:         
 356:         this(label, description, toolTipText, urlText,
 357:                 /* shape visible = */ true, shape,
 358:                 /* shape filled = */ true, fillPaint,
 359:                 /* shape outlined = */ true, outlinePaint, outlineStroke,
 360:                 /* line visible = */ false, UNUSED_SHAPE, UNUSED_STROKE,
 361:                 Color.black);
 362:     }
 363:     
 364:     /**
 365:      * Creates a legend item using a line.
 366:      * 
 367:      * @param label  the label (<code>null</code> not permitted).
 368:      * @param description  the description (<code>null</code> permitted).
 369:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 370:      * @param urlText  the URL text (<code>null</code> permitted).
 371:      * @param line  the line (<code>null</code> not permitted).
 372:      * @param lineStroke  the line stroke (<code>null</code> not permitted).
 373:      * @param linePaint  the line paint (<code>null</code> not permitted).
 374:      */
 375:     public LegendItem(AttributedString label, String description, 
 376:                       String toolTipText, String urlText, 
 377:                       Shape line, Stroke lineStroke, Paint linePaint) {
 378:         
 379:         this(label, description, toolTipText, urlText,
 380:                 /* shape visible = */ false, UNUSED_SHAPE,
 381:                 /* shape filled = */ false, Color.black,
 382:                 /* shape outlined = */ false, Color.black, UNUSED_STROKE,
 383:                 /* line visible = */ true, line, lineStroke, linePaint
 384:         );
 385:     }
 386:     
 387:     /**
 388:      * Creates a new legend item.
 389:      *
 390:      * @param label  the label (<code>null</code> not permitted).
 391:      * @param description  the description (not currently used, 
 392:      *        <code>null</code> permitted).
 393:      * @param toolTipText  the tool tip text (<code>null</code> permitted).
 394:      * @param urlText  the URL text (<code>null</code> permitted).
 395:      * @param shapeVisible  a flag that controls whether or not the shape is 
 396:      *                      displayed.
 397:      * @param shape  the shape (<code>null</code> permitted).
 398:      * @param shapeFilled  a flag that controls whether or not the shape is 
 399:      *                     filled.
 400:      * @param fillPaint  the fill paint (<code>null</code> not permitted).
 401:      * @param shapeOutlineVisible  a flag that controls whether or not the 
 402:      *                             shape is outlined.
 403:      * @param outlinePaint  the outline paint (<code>null</code> not permitted).
 404:      * @param outlineStroke  the outline stroke (<code>null</code> not 
 405:      *                       permitted).
 406:      * @param lineVisible  a flag that controls whether or not the line is 
 407:      *                     visible.
 408:      * @param line  the line.
 409:      * @param lineStroke  the stroke (<code>null</code> not permitted).
 410:      * @param linePaint  the line paint (<code>null</code> not permitted).
 411:      */
 412:     public LegendItem(AttributedString label, String description,
 413:                       String toolTipText, String urlText,
 414:                       boolean shapeVisible, Shape shape,
 415:                       boolean shapeFilled, Paint fillPaint, 
 416:                       boolean shapeOutlineVisible, Paint outlinePaint,
 417:                       Stroke outlineStroke,
 418:                       boolean lineVisible, Shape line, Stroke lineStroke,
 419:                       Paint linePaint) {
 420:         
 421:         if (label == null) {
 422:             throw new IllegalArgumentException("Null 'label' argument.");   
 423:         }
 424:         if (fillPaint == null) {
 425:             throw new IllegalArgumentException("Null 'fillPaint' argument.");   
 426:         }
 427:         if (lineStroke == null) {
 428:             throw new IllegalArgumentException("Null 'lineStroke' argument.");
 429:         }
 430:         if (outlinePaint == null) {
 431:             throw new IllegalArgumentException("Null 'outlinePaint' argument.");
 432:         }
 433:         if (outlineStroke == null) {
 434:             throw new IllegalArgumentException(
 435:                 "Null 'outlineStroke' argument.");   
 436:         }
 437:         this.label = characterIteratorToString(label.getIterator());
 438:         this.attributedLabel = label;
 439:         this.description = description;
 440:         this.shapeVisible = shapeVisible;
 441:         this.shape = shape;
 442:         this.shapeFilled = shapeFilled;
 443:         this.fillPaint = fillPaint;
 444:         this.shapeOutlineVisible = shapeOutlineVisible;
 445:         this.outlinePaint = outlinePaint;
 446:         this.outlineStroke = outlineStroke;
 447:         this.lineVisible = lineVisible;
 448:         this.line = line;
 449:         this.lineStroke = lineStroke;
 450:         this.linePaint = linePaint;
 451:         this.toolTipText = toolTipText;
 452:         this.urlText = urlText;
 453:     }
 454: 
 455:     /**
 456:      * Returns a string containing the characters from the given iterator.
 457:      * 
 458:      * @param iterator  the iterator (<code>null</code> not permitted).
 459:      * 
 460:      * @return A string.
 461:      */
 462:     private String characterIteratorToString(CharacterIterator iterator) {
 463:         int endIndex = iterator.getEndIndex();
 464:         int beginIndex = iterator.getBeginIndex();
 465:         int count = endIndex - beginIndex;
 466:         if (count <= 0) {
 467:             return "";
 468:         }
 469:         char[] chars = new char[count];
 470:         int i = 0;
 471:         char c = iterator.first();
 472:         while (c != CharacterIterator.DONE) {
 473:             chars[i] = c;
 474:             i++;
 475:             c = iterator.next();
 476:         }
 477:         return new String(chars);
 478:     }
 479:     
 480:     /**
 481:      * Returns the dataset index for this legend item.
 482:      * 
 483:      * @return The dataset index.
 484:      * 
 485:      * @since 1.0.2
 486:      */
 487:     public int getDatasetIndex() {
 488:         return this.datasetIndex;
 489:     }
 490:     
 491:     /**
 492:      * Sets the dataset index for this legend item.
 493:      * 
 494:      * @param index  the index.
 495:      * 
 496:      * @since 1.0.2
 497:      */
 498:     public void setDatasetIndex(int index) {
 499:         this.datasetIndex = index;
 500:     }
 501:     
 502:     /**
 503:      * Returns the series index for this legend item.
 504:      * 
 505:      * @return The series index.
 506:      * 
 507:      * @since 1.0.2
 508:      */
 509:     public int getSeriesIndex() {
 510:         return this.series;
 511:     }
 512:     
 513:     /**
 514:      * Sets the series index for this legend item.
 515:      * 
 516:      * @param index  the index.
 517:      * 
 518:      * @since 1.0.2
 519:      */
 520:     public void setSeriesIndex(int index) {
 521:         this.series = index;
 522:     }
 523:     
 524:     /**
 525:      * Returns the label.
 526:      *
 527:      * @return The label (never <code>null</code>).
 528:      */
 529:     public String getLabel() {
 530:         return this.label;
 531:     }
 532: 
 533:     /**
 534:      * Returns the attributed label.
 535:      *
 536:      * @return The attributed label (possibly <code>null</code>).
 537:      */
 538:     public AttributedString getAttributedLabel() {
 539:         return this.attributedLabel;
 540:     }
 541: 
 542:     /**
 543:      * Returns the description for the legend item.
 544:      * 
 545:      * @return The description.
 546:      */
 547:     public String getDescription() {
 548:         return this.description;   
 549:     }
 550:     
 551:     /**
 552:      * Returns the tool tip text.
 553:      * 
 554:      * @return The tool tip text (possibly <code>null</code>).
 555:      */
 556:     public String getToolTipText() {
 557:         return this.toolTipText;   
 558:     }
 559:     
 560:     /**
 561:      * Returns the URL text.
 562:      * 
 563:      * @return The URL text (possibly <code>null</code>).
 564:      */
 565:     public String getURLText() {
 566:         return this.urlText; 
 567:     }
 568:     
 569:     /**
 570:      * Returns a flag that indicates whether or not the shape is visible.
 571:      * 
 572:      * @return A boolean.
 573:      */
 574:     public boolean isShapeVisible() {
 575:         return this.shapeVisible;
 576:     }
 577:     
 578:     /**
 579:      * Returns the shape used to label the series represented by this legend 
 580:      * item.
 581:      *
 582:      * @return The shape (never <code>null</code>).
 583:      */
 584:     public Shape getShape() {
 585:         return this.shape;
 586:     }
 587:     
 588:     /**
 589:      * Returns a flag that controls whether or not the shape is filled.
 590:      * 
 591:      * @return A boolean.
 592:      */
 593:     public boolean isShapeFilled() {
 594:         return this.shapeFilled;
 595:     }
 596: 
 597:     /**
 598:      * Returns the fill paint.
 599:      *
 600:      * @return The fill paint (never <code>null</code>).
 601:      */
 602:     public Paint getFillPaint() {
 603:         return this.fillPaint;
 604:     }
 605: 
 606:     /**
 607:      * Returns the flag that controls whether or not the shape outline
 608:      * is visible.
 609:      * 
 610:      * @return A boolean.
 611:      */
 612:     public boolean isShapeOutlineVisible() {
 613:         return this.shapeOutlineVisible;
 614:     }
 615:     
 616:     /**
 617:      * Returns the line stroke for the series.
 618:      *
 619:      * @return The stroke (never <code>null</code>).
 620:      */
 621:     public Stroke getLineStroke() {
 622:         return this.lineStroke;
 623:     }
 624:     
 625:     /**
 626:      * Returns the paint used for lines.
 627:      * 
 628:      * @return The paint.
 629:      */
 630:     public Paint getLinePaint() {
 631:         return this.linePaint;
 632:     }
 633:     
 634:     /**
 635:      * Returns the outline paint.
 636:      *
 637:      * @return The outline paint (never <code>null</code>).
 638:      */
 639:     public Paint getOutlinePaint() {
 640:         return this.outlinePaint;
 641:     }
 642: 
 643:     /**
 644:      * Returns the outline stroke.
 645:      *
 646:      * @return The outline stroke (never <code>null</code>).
 647:      */
 648:     public Stroke getOutlineStroke() {
 649:         return this.outlineStroke;
 650:     }
 651:     
 652:     /**
 653:      * Returns a flag that indicates whether or not the line is visible.
 654:      * 
 655:      * @return A boolean.
 656:      */
 657:     public boolean isLineVisible() {
 658:         return this.lineVisible;
 659:     }
 660:     
 661:     /**
 662:      * Returns the line.
 663:      * 
 664:      * @return The line.
 665:      */
 666:     public Shape getLine() {
 667:         return this.line;
 668:     }
 669:     
 670:     /**
 671:      * Returns the transformer used when the fill paint is an instance of 
 672:      * <code>GradientPaint</code>.
 673:      * 
 674:      * @return The transformer (never <code>null</code>).
 675:      * 
 676:      * @since 1.0.4
 677:      * 
 678:      * @see #setFillPaintTransformer(GradientPaintTransformer)
 679:      */
 680:     public GradientPaintTransformer getFillPaintTransformer() {
 681:         return this.fillPaintTransformer;
 682:     }
 683:     
 684:     /**
 685:      * Sets the transformer used when the fill paint is an instance of 
 686:      * <code>GradientPaint</code>.
 687:      * 
 688:      * @param transformer  the transformer (<code>null</code> not permitted).
 689:      * 
 690:      * @since 1.0.4
 691:      * 
 692:      * @see #getFillPaintTransformer()
 693:      */
 694:     public void setFillPaintTransformer(GradientPaintTransformer transformer) {
 695:         if (transformer == null) { 
 696:             throw new IllegalArgumentException("Null 'transformer' attribute.");
 697:         }
 698:         this.fillPaintTransformer = transformer;
 699:     }
 700:     
 701:     /**
 702:      * Tests this item for equality with an arbitrary object.
 703:      * 
 704:      * @param obj  the object (<code>null</code> permitted).
 705:      * 
 706:      * @return A boolean.
 707:      */
 708:     public boolean equals(Object obj) {
 709:         if (obj == this) {
 710:             return true;   
 711:         }
 712:         if (!(obj instanceof LegendItem)) {
 713:                 return false;
 714:         }
 715:         LegendItem that = (LegendItem) obj;
 716:         if (this.datasetIndex != that.datasetIndex) {
 717:             return false;
 718:         }
 719:         if (this.series != that.series) {
 720:             return false;
 721:         }
 722:         if (!this.label.equals(that.label)) {
 723:             return false;
 724:         }
 725:         if (!AttributedStringUtilities.equal(this.attributedLabel, 
 726:                 that.attributedLabel)) {
 727:             return false;
 728:         }
 729:         if (!ObjectUtilities.equal(this.description, that.description)) {
 730:             return false;
 731:         }
 732:         if (this.shapeVisible != that.shapeVisible) {
 733:             return false;
 734:         }
 735:         if (!ShapeUtilities.equal(this.shape, that.shape)) {
 736:             return false;
 737:         }
 738:         if (this.shapeFilled != that.shapeFilled) {
 739:             return false;
 740:         }
 741:         if (!this.fillPaint.equals(that.fillPaint)) {
 742:             return false;   
 743:         }
 744:         if (!ObjectUtilities.equal(this.fillPaintTransformer, 
 745:                 that.fillPaintTransformer)) {
 746:             return false;
 747:         }
 748:         if (this.shapeOutlineVisible != that.shapeOutlineVisible) {
 749:             return false;
 750:         }
 751:         if (!this.outlineStroke.equals(that.outlineStroke)) {
 752:             return false;   
 753:         }
 754:         if (!this.outlinePaint.equals(that.outlinePaint)) {
 755:             return false;   
 756:         }
 757:         if (!this.lineVisible == that.lineVisible) {
 758:             return false;
 759:         }
 760:         if (!ShapeUtilities.equal(this.line, that.line)) {
 761:             return false;
 762:         }
 763:         if (!this.lineStroke.equals(that.lineStroke)) {
 764:             return false;   
 765:         }
 766:         if (!this.linePaint.equals(that.linePaint)) {
 767:             return false;
 768:         }
 769:         return true;
 770:     }
 771:     
 772:     /**
 773:      * Provides serialization support.
 774:      *
 775:      * @param stream  the output stream (<code>null</code> not permitted).
 776:      *
 777:      * @throws IOException  if there is an I/O error.
 778:      */
 779:     private void writeObject(ObjectOutputStream stream) throws IOException {
 780:         stream.defaultWriteObject();
 781:         SerialUtilities.writeAttributedString(this.attributedLabel, stream);
 782:         SerialUtilities.writeShape(this.shape, stream);
 783:         SerialUtilities.writePaint(this.fillPaint, stream);
 784:         SerialUtilities.writeStroke(this.outlineStroke, stream);
 785:         SerialUtilities.writePaint(this.outlinePaint, stream);
 786:         SerialUtilities.writeShape(this.line, stream);
 787:         SerialUtilities.writeStroke(this.lineStroke, stream);
 788:         SerialUtilities.writePaint(this.linePaint, stream);
 789:     }
 790: 
 791:     /**
 792:      * Provides serialization support.
 793:      *
 794:      * @param stream  the input stream (<code>null</code> not permitted).
 795:      *
 796:      * @throws IOException  if there is an I/O error.
 797:      * @throws ClassNotFoundException  if there is a classpath problem.
 798:      */
 799:     private void readObject(ObjectInputStream stream) 
 800:         throws IOException, ClassNotFoundException {
 801:         stream.defaultReadObject();
 802:         this.attributedLabel = SerialUtilities.readAttributedString(stream);
 803:         this.shape = SerialUtilities.readShape(stream);
 804:         this.fillPaint = SerialUtilities.readPaint(stream);
 805:         this.outlineStroke = SerialUtilities.readStroke(stream);
 806:         this.outlinePaint = SerialUtilities.readPaint(stream);
 807:         this.line = SerialUtilities.readShape(stream);
 808:         this.lineStroke = SerialUtilities.readStroke(stream);
 809:         this.linePaint = SerialUtilities.readPaint(stream);
 810:     }
 811:     
 812: }