class LegendItem implements Cloneable, Serializable {

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof LegendItem)) {
            return false;
        }
        LegendItem that = (LegendItem) obj;
        if (this.datasetIndex != that.datasetIndex) {
            return false;
        }
        if (this.series != that.series) {
            return false;
        }
        if (!this.label.equals(that.label)) {
            return false;
        }
        if (!AttributedStringUtils.equal(this.attributedLabel,
                that.attributedLabel)) {
            return false;
        }
        if (!ObjectUtils.equal(this.description, that.description)) {
            return false;
        }
        if (this.shapeVisible != that.shapeVisible) {
            return false;
        }
        if (!ShapeUtils.equal(this.shape, that.shape)) {
            return false;
        }
        if (this.shapeFilled != that.shapeFilled) {
            return false;
        }
        if (!PaintUtils.equal(this.fillPaint, that.fillPaint)) {
            return false;
        }
        if (!ObjectUtils.equal(this.fillPaintTransformer,
                that.fillPaintTransformer)) {
            return false;
        }
        if (this.shapeOutlineVisible != that.shapeOutlineVisible) {
            return false;
        }
        if (!this.outlineStroke.equals(that.outlineStroke)) {
            return false;
        }
        if (!PaintUtils.equal(this.outlinePaint, that.outlinePaint)) {
            return false;
        }
        if (!this.lineVisible == that.lineVisible) {
            return false;
        }
        if (!ShapeUtils.equal(this.line, that.line)) {
            return false;
        }
        if (!this.lineStroke.equals(that.lineStroke)) {
            return false;
        }
        if (!PaintUtils.equal(this.linePaint, that.linePaint)) {
            return false;
        }
        if (!ObjectUtils.equal(this.labelFont, that.labelFont)) {
            return false;
        }
        if (!PaintUtils.equal(this.labelPaint, that.labelPaint)) {
            return false;
        }
        return true;
    }

    public  LegendItem(String label);
    public  LegendItem(String label, Paint paint);
    public  LegendItem(String label, String description,
                      String toolTipText, String urlText,
                      Shape shape, Paint fillPaint);
    public  LegendItem(String label, String description, String toolTipText, 
            String urlText, Shape shape, Paint fillPaint,
            Stroke outlineStroke, Paint outlinePaint);
    public  LegendItem(String label, String description, String toolTipText, 
            String urlText, Shape line, Stroke lineStroke, Paint linePaint);
    public  LegendItem(String label, String description,
                      String toolTipText, String urlText,
                      boolean shapeVisible, Shape shape,
                      boolean shapeFilled, Paint fillPaint,
                      boolean shapeOutlineVisible, Paint outlinePaint,
                      Stroke outlineStroke,
                      boolean lineVisible, Shape line,
                      Stroke lineStroke, Paint linePaint);
    public  LegendItem(AttributedString label, String description, 
            String toolTipText, String urlText, Shape shape, Paint fillPaint);
    public  LegendItem(AttributedString label, String description,
            String toolTipText, String urlText, Shape shape, Paint fillPaint,
            Stroke outlineStroke, Paint outlinePaint);
    public  LegendItem(AttributedString label, String description,
            String toolTipText, String urlText, Shape line, Stroke lineStroke, 
            Paint linePaint);
    public  LegendItem(AttributedString label, String description, 
            String toolTipText, String urlText, boolean shapeVisible, 
            Shape shape, boolean shapeFilled, Paint fillPaint,
            boolean shapeOutlineVisible, Paint outlinePaint, 
            Stroke outlineStroke, boolean lineVisible, Shape line, 
            Stroke lineStroke, Paint linePaint);

}