001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * -------------------------
028     * CategoryItemRenderer.java
029     * -------------------------
030     *
031     * (C) Copyright 2001-2007, by Object Refinery Limited and Contributors.
032     *
033     * Original Author:  David Gilbert (for Object Refinery Limited);
034     * Contributor(s):   Mark Watson (www.markwatson.com);
035     *
036     * $Id: CategoryItemRenderer.java,v 1.10.2.9 2007/06/14 13:13:43 mungady Exp $
037     *
038     * Changes
039     * -------
040     * 23-Oct-2001 : Version 1 (DG);
041     * 16-Jan-2002 : Renamed HorizontalCategoryItemRenderer.java 
042     *               --> CategoryItemRenderer.java (DG);
043     * 05-Feb-2002 : Changed return type of the drawCategoryItem method from void 
044     *               to Shape, as part of the tooltips implementation (DG)        
045     *
046     *               NOTE (30-May-2002) : this has subsequently been changed back 
047     *               to void, tooltips are now collected along with entities in 
048     *               ChartRenderingInfo (DG);
049     *
050     * 14-Mar-2002 : Added the initialise method, and changed all bar plots to use 
051     *               this renderer (DG);
052     * 23-May-2002 : Added ChartRenderingInfo to the initialise method (DG);
053     * 29-May-2002 : Added the getAxisArea(Rectangle2D) method (DG);
054     * 06-Jun-2002 : Updated Javadoc comments (DG);
055     * 26-Jun-2002 : Added range axis to the initialise method (DG);
056     * 24-Sep-2002 : Added getLegendItem() method (DG);
057     * 23-Oct-2002 : Added methods to get/setToolTipGenerator (DG);
058     * 05-Nov-2002 : Replaced references to CategoryDataset with TableDataset (DG);
059     * 06-Nov-2002 : Added the domain axis to the drawCategoryItem method.  Renamed
060     *               drawCategoryItem() --> drawItem() (DG);
061     * 20-Nov-2002 : Changed signature of drawItem() method to reflect use of 
062     *               TableDataset (DG);
063     * 26-Nov-2002 : Replaced the isStacked() method with the getRangeType() 
064     *               method (DG);
065     * 08-Jan-2003 : Changed getSeriesCount() --> getRowCount() and
066     *               getCategoryCount() --> getColumnCount() (DG);
067     * 09-Jan-2003 : Changed name of grid-line methods (DG);
068     * 21-Jan-2003 : Merged TableDataset with CategoryDataset (DG);
069     * 10-Apr-2003 : Changed CategoryDataset to KeyedValues2DDataset in 
070     *               drawItem() method (DG);
071     * 29-Apr-2003 : Eliminated Renderer interface (DG);
072     * 02-Sep-2003 : Fix for bug 790407 (DG);
073     * 16-Sep-2003 : Changed ChartRenderingInfo --> PlotRenderingInfo (DG);
074     * 20-Oct-2003 : Added setOutlinePaint() method (DG);
075     * 06-Feb-2004 : Added missing methods, and moved deprecated methods (DG);
076     * 19-Feb-2004 : Added extra setXXXLabelsVisible() methods (DG);
077     * 29-Apr-2004 : Changed Integer --> int in initialise() method (DG);
078     * 18-May-2004 : Added methods for item label paint (DG);
079     * 05-Nov-2004 : Added getPassCount() method and 'pass' parameter to drawItem() 
080     *               method (DG);
081     * 07-Jan-2005 : Renamed getRangeExtent() --> findRangeBounds (DG);
082     * 11-Jan-2005 : Removed deprecated code in preparation for 1.0.0 release (DG);
083     * 23-Feb-2005 : Now extends LegendItemSource (DG);
084     * 20-Apr-2005 : Renamed CategoryLabelGenerator 
085     *               --> CategoryItemLabelGenerator (DG);
086     * 20-May-2005 : Added drawDomainMarker() method (DG);
087     * ------------- JFREECHART 1.0.x ---------------------------------------------
088     * 20-Feb-2007 : Updated API docs (DG);
089     * 19-Apr-2007 : Deprecated seriesVisible and seriesVisibleInLegend flags (DG);
090     * 20-Apr-2007 : Deprecated paint, fillPaint, outlinePaint, stroke, 
091     *               outlineStroke, shape, itemLabelsVisible, itemLabelFont, 
092     *               itemLabelPaint, positiveItemLabelPosition, 
093     *               negativeItemLabelPosition and createEntities override 
094     *               fields (DG);
095     *
096     */
097    
098    package org.jfree.chart.renderer.category;
099    
100    import java.awt.Font;
101    import java.awt.Graphics2D;
102    import java.awt.Paint;
103    import java.awt.Shape;
104    import java.awt.Stroke;
105    import java.awt.geom.Rectangle2D;
106    
107    import org.jfree.chart.LegendItem;
108    import org.jfree.chart.LegendItemSource;
109    import org.jfree.chart.axis.CategoryAxis;
110    import org.jfree.chart.axis.ValueAxis;
111    import org.jfree.chart.event.RendererChangeEvent;
112    import org.jfree.chart.event.RendererChangeListener;
113    import org.jfree.chart.labels.CategoryItemLabelGenerator;
114    import org.jfree.chart.labels.CategoryToolTipGenerator;
115    import org.jfree.chart.labels.ItemLabelPosition;
116    import org.jfree.chart.plot.CategoryMarker;
117    import org.jfree.chart.plot.CategoryPlot;
118    import org.jfree.chart.plot.Marker;
119    import org.jfree.chart.plot.PlotRenderingInfo;
120    import org.jfree.chart.urls.CategoryURLGenerator;
121    import org.jfree.data.Range;
122    import org.jfree.data.category.CategoryDataset;
123    
124    /**
125     * A plug-in object that is used by the {@link CategoryPlot} class to display 
126     * individual data items from a {@link CategoryDataset}.
127     * <p>
128     * This interface defines the methods that must be provided by all renderers.  
129     * If you are implementing a custom renderer, you should consider extending the
130     * {@link AbstractCategoryItemRenderer} class.
131     * <p>
132     * Most renderer attributes are defined using a "three layer" approach.  When 
133     * looking up an attribute (for example, the outline paint) the renderer first 
134     * checks to see if there is a setting (in layer 0) that applies to ALL items 
135     * that the renderer draws.  If there is, that setting is used, but if it is 
136     * <code>null</code> the renderer looks up the next layer, which contains 
137     * "per series" settings for the attribute (many attributes are defined on a
138     * per series basis, so this is the layer that is most commonly used).  If the 
139     * layer 1 setting is <code>null</code>, the renderer will look up the final 
140     * layer, which provides a default or "base" setting.  Some attributes allow 
141     * the base setting to be <code>null</code>, while other attributes enforce 
142     * non-<code>null</code> values.
143     */
144    
145    public interface CategoryItemRenderer extends LegendItemSource {
146    
147        /**
148         * Returns the number of passes through the dataset required by the 
149         * renderer.  Usually this will be one, but some renderers may use
150         * a second or third pass to overlay items on top of things that were
151         * drawn in an earlier pass.
152         * 
153         * @return The pass count.
154         */
155        public int getPassCount();
156    
157        /**
158         * Returns the plot that the renderer has been assigned to (where 
159         * <code>null</code> indicates that the renderer is not currently assigned 
160         * to a plot).
161         *
162         * @return The plot (possibly <code>null</code>).
163         * 
164         * @see #setPlot(CategoryPlot)
165         */
166        public CategoryPlot getPlot();
167    
168        /**
169         * Sets the plot that the renderer has been assigned to.  This method is 
170         * usually called by the {@link CategoryPlot}, in normal usage you 
171         * shouldn't need to call this method directly.
172         *
173         * @param plot  the plot (<code>null</code> not permitted).
174         * 
175         * @see #getPlot()
176         */
177        public void setPlot(CategoryPlot plot);
178    
179        /**
180         * Adds a change listener.
181         * 
182         * @param listener  the listener.
183         * 
184         * @see #removeChangeListener(RendererChangeListener)
185         */
186        public void addChangeListener(RendererChangeListener listener);
187        
188        /**
189         * Removes a change listener.
190         * 
191         * @param listener  the listener.
192         * 
193         * @see #addChangeListener(RendererChangeListener)
194         */
195        public void removeChangeListener(RendererChangeListener listener);
196    
197        /**
198         * Returns the range of values the renderer requires to display all the 
199         * items from the specified dataset.
200         * 
201         * @param dataset  the dataset (<code>null</code> permitted).
202         * 
203         * @return The range (or <code>null</code> if the dataset is 
204         *         <code>null</code> or empty).
205         */
206        public Range findRangeBounds(CategoryDataset dataset);
207        
208        /**
209         * Initialises the renderer.  This method will be called before the first 
210         * item is rendered, giving the renderer an opportunity to initialise any 
211         * state information it wants to maintain. The renderer can do nothing if 
212         * it chooses.
213         *
214         * @param g2  the graphics device.
215         * @param dataArea  the area inside the axes.
216         * @param plot  the plot.
217         * @param rendererIndex  the renderer index.
218         * @param info  collects chart rendering information for return to caller.
219         * 
220         * @return A state object (maintains state information relevant to one 
221         *         chart drawing).
222         */
223        public CategoryItemRendererState initialise(Graphics2D g2,
224                                                    Rectangle2D dataArea,
225                                                    CategoryPlot plot,
226                                                    int rendererIndex,
227                                                    PlotRenderingInfo info);
228                               
229        /**
230         * Returns a boolean that indicates whether or not the specified item 
231         * should be drawn (this is typically used to hide an entire series).
232         * 
233         * @param series  the series index.
234         * @param item  the item index.
235         * 
236         * @return A boolean.
237         */
238        public boolean getItemVisible(int series, int item);
239        
240        /**
241         * Returns a boolean that indicates whether or not the specified series 
242         * should be drawn (this is typically used to hide an entire series).
243         * 
244         * @param series  the series index.
245         * 
246         * @return A boolean.
247         */
248        public boolean isSeriesVisible(int series);
249        
250        /**
251         * Returns the flag that controls the visibility of ALL series.  This flag 
252         * overrides the per series and default settings - you must set it to 
253         * <code>null</code> if you want the other settings to apply.
254         * 
255         * @return The flag (possibly <code>null</code>).
256         * 
257         * @see #setSeriesVisible(Boolean)
258         * 
259         * @deprecated This method should no longer be used (as of version 1.0.6). 
260         *     It is sufficient to rely on {@link #getSeriesVisible(int)} and
261         *     {@link #getBaseSeriesVisible()}.
262         */
263        public Boolean getSeriesVisible();
264        
265        /**
266         * Sets the flag that controls the visibility of ALL series and sends a 
267         * {@link RendererChangeEvent} to all registered listeners.  This flag 
268         * overrides the per series and default settings - you must set it to 
269         * <code>null</code> if you want the other settings to apply.
270         * 
271         * @param visible  the flag (<code>null</code> permitted).
272         * 
273         * @see #getSeriesVisible()
274         *
275         * @deprecated This method should no longer be used (as of version 1.0.6). 
276         *     It is sufficient to rely on {@link #setSeriesVisible(int, Boolean)} 
277         *     and {@link #setBaseSeriesVisible(boolean)}.
278         */
279        public void setSeriesVisible(Boolean visible);
280        
281        /**
282         * Sets the flag that controls the visibility of ALL series and sends a 
283         * {@link RendererChangeEvent} to all registered listeners.  This flag 
284         * overrides the per series and default settings - you must set it to 
285         * <code>null</code> if you want the other settings to apply.
286         * 
287         * @param visible  the flag (<code>null</code> permitted).
288         * @param notify  notify listeners?
289         * 
290         * @see #getSeriesVisible()
291         *
292         * @deprecated This method should no longer be used (as of version 1.0.6). 
293         *     It is sufficient to rely on {@link #setSeriesVisible(int, Boolean, 
294         *     boolean)} and {@link #setBaseSeriesVisible(boolean, boolean)}.
295         */
296        public void setSeriesVisible(Boolean visible, boolean notify);
297        
298        /**
299         * Returns the flag that controls whether a series is visible.
300         *
301         * @param series  the series index (zero-based).
302         *
303         * @return The flag (possibly <code>null</code>).
304         * 
305         * @see #setSeriesVisible(int, Boolean)
306         */
307        public Boolean getSeriesVisible(int series);
308        
309        /**
310         * Sets the flag that controls whether a series is visible and sends a 
311         * {@link RendererChangeEvent} to all registered listeners.
312         *
313         * @param series  the series index (zero-based).
314         * @param visible  the flag (<code>null</code> permitted).
315         * 
316         * @see #getSeriesVisible(int)
317         */
318        public void setSeriesVisible(int series, Boolean visible);
319        
320        /**
321         * Sets the flag that controls whether a series is visible and, if 
322         * requested, sends a {@link RendererChangeEvent} to all registered 
323         * listeners.
324         * 
325         * @param series  the series index.
326         * @param visible  the flag (<code>null</code> permitted).
327         * @param notify  notify listeners?
328         * 
329         * @see #getSeriesVisible(int)
330         */
331        public void setSeriesVisible(int series, Boolean visible, boolean notify);
332    
333        /**
334         * Returns the base visibility for all series.
335         *
336         * @return The base visibility.
337         * 
338         * @see #setBaseSeriesVisible(boolean)
339         */
340        public boolean getBaseSeriesVisible();
341    
342        /**
343         * Sets the base visibility and sends a {@link RendererChangeEvent} to all
344         * registered listeners.
345         *
346         * @param visible  the flag.
347         * 
348         * @see #getBaseSeriesVisible()
349         */
350        public void setBaseSeriesVisible(boolean visible);
351        
352        /**
353         * Sets the base visibility and, if requested, sends 
354         * a {@link RendererChangeEvent} to all registered listeners.
355         * 
356         * @param visible  the visibility.
357         * @param notify  notify listeners?
358         * 
359         * @see #getBaseSeriesVisible()
360         */
361        public void setBaseSeriesVisible(boolean visible, boolean notify);
362    
363        // SERIES VISIBLE IN LEGEND (not yet respected by all renderers)
364        
365        /**
366         * Returns <code>true</code> if the series should be shown in the legend,
367         * and <code>false</code> otherwise.
368         * 
369         * @param series  the series index.
370         * 
371         * @return A boolean.
372         */
373        public boolean isSeriesVisibleInLegend(int series);
374        
375        /**
376         * Returns the flag that controls the visibility of ALL series in the 
377         * legend.  This flag overrides the per series and default settings - you 
378         * must set it to <code>null</code> if you want the other settings to 
379         * apply.
380         * 
381         * @return The flag (possibly <code>null</code>).
382         * 
383         * @see #setSeriesVisibleInLegend(Boolean)
384         * 
385         * @deprecated This method should no longer be used (as of version 1.0.6). 
386         *     It is sufficient to rely on {@link #getSeriesVisibleInLegend(int)} 
387         *     and {@link #getBaseSeriesVisibleInLegend()}.
388         */
389        public Boolean getSeriesVisibleInLegend();
390        
391        /**
392         * Sets the flag that controls the visibility of ALL series in the legend 
393         * and sends a {@link RendererChangeEvent} to all registered listeners.  
394         * This flag overrides the per series and default settings - you must set 
395         * it to <code>null</code> if you want the other settings to apply.
396         * 
397         * @param visible  the flag (<code>null</code> permitted).
398         * 
399         * @see #getSeriesVisibleInLegend()
400         * 
401         * @deprecated This method should no longer be used (as of version 1.0.6). 
402         *     It is sufficient to rely on {@link #setSeriesVisibleInLegend(int, 
403         *     Boolean)} and {@link #setBaseSeriesVisibleInLegend(boolean)}.
404         */
405        public void setSeriesVisibleInLegend(Boolean visible);
406        
407        /**
408         * Sets the flag that controls the visibility of ALL series in the legend 
409         * and sends a {@link RendererChangeEvent} to all registered listeners.  
410         * This flag overrides the per series and default settings - you must set 
411         * it to <code>null</code> if you want the other settings to apply.
412         * 
413         * @param visible  the flag (<code>null</code> permitted).
414         * @param notify  notify listeners?
415         * 
416         * @see #getSeriesVisibleInLegend()
417         * 
418         * @deprecated This method should no longer be used (as of version 1.0.6). 
419         *     It is sufficient to rely on {@link #setSeriesVisibleInLegend(int, 
420         *     Boolean, boolean)} and {@link #setBaseSeriesVisibleInLegend(boolean,
421         *     boolean)}.
422         */
423        public void setSeriesVisibleInLegend(Boolean visible, boolean notify);
424        
425        /**
426         * Returns the flag that controls whether a series is visible in the 
427         * legend.  This method returns only the "per series" settings - to 
428         * incorporate the override and base settings as well, you need to use the 
429         * {@link #isSeriesVisibleInLegend(int)} method.
430         *
431         * @param series  the series index (zero-based).
432         *
433         * @return The flag (possibly <code>null</code>).
434         * 
435         * @see #setSeriesVisibleInLegend(int, Boolean)
436         */
437        public Boolean getSeriesVisibleInLegend(int series);
438        
439        /**
440         * Sets the flag that controls whether a series is visible in the legend 
441         * and sends a {@link RendererChangeEvent} to all registered listeners.
442         *
443         * @param series  the series index (zero-based).
444         * @param visible  the flag (<code>null</code> permitted).
445         * 
446         * @see #getSeriesVisibleInLegend(int)
447         */
448        public void setSeriesVisibleInLegend(int series, Boolean visible);
449        
450        /**
451         * Sets the flag that controls whether a series is visible in the legend
452         * and, if requested, sends a {@link RendererChangeEvent} to all registered 
453         * listeners.
454         * 
455         * @param series  the series index.
456         * @param visible  the flag (<code>null</code> permitted).
457         * @param notify  notify listeners?
458         * 
459         * @see #getSeriesVisibleInLegend(int)
460         */
461        public void setSeriesVisibleInLegend(int series, Boolean visible, 
462                                             boolean notify);
463    
464        /**
465         * Returns the base visibility in the legend for all series.
466         *
467         * @return The base visibility.
468         * 
469         * @see #setBaseSeriesVisibleInLegend(boolean)
470         */
471        public boolean getBaseSeriesVisibleInLegend();
472    
473        /**
474         * Sets the base visibility in the legend and sends a 
475         * {@link RendererChangeEvent} to all registered listeners.
476         *
477         * @param visible  the flag.
478         * 
479         * @see #getBaseSeriesVisibleInLegend()
480         */
481        public void setBaseSeriesVisibleInLegend(boolean visible);
482        
483        /**
484         * Sets the base visibility in the legend and, if requested, sends 
485         * a {@link RendererChangeEvent} to all registered listeners.
486         * 
487         * @param visible  the visibility.
488         * @param notify  notify listeners?
489         * 
490         * @see #getBaseSeriesVisibleInLegend()
491         */
492        public void setBaseSeriesVisibleInLegend(boolean visible, boolean notify);
493    
494    
495        //// PAINT /////////////////////////////////////////////////////////////////
496        
497        /**
498         * Returns the paint used to fill data items as they are drawn.
499         *
500         * @param row  the row (or series) index (zero-based).
501         * @param column  the column (or category) index (zero-based).
502         *
503         * @return The paint (never <code>null</code>).
504         */
505        public Paint getItemPaint(int row, int column);
506        
507        /**
508         * Sets the paint to be used for ALL series, and sends a 
509         * {@link RendererChangeEvent} to all registered listeners.  If this is 
510         * <code>null</code>, the renderer will use the paint for the series.
511         * 
512         * @param paint  the paint (<code>null</code> permitted).
513         * 
514         * @deprecated This method should no longer be used (as of version 1.0.6). 
515         *     It is sufficient to rely on {@link #setSeriesPaint(int, Paint)} and 
516         *     {@link #setBasePaint(Paint)}.
517         */
518        public void setPaint(Paint paint);
519        
520        /**
521         * Returns the paint used to fill an item drawn by the renderer.
522         *
523         * @param series  the series index (zero-based).
524         *
525         * @return The paint (possibly <code>null</code>).
526         * 
527         * @see #setSeriesPaint(int, Paint)
528         */
529        public Paint getSeriesPaint(int series);
530    
531        /**
532         * Sets the paint used for a series and sends a {@link RendererChangeEvent}
533         * to all registered listeners.
534         *
535         * @param series  the series index (zero-based).
536         * @param paint  the paint (<code>null</code> permitted).
537         * 
538         * @see #getSeriesPaint(int)
539         */
540        public void setSeriesPaint(int series, Paint paint);
541        
542        // FIXME: add setSeriesPaint(int, Paint, boolean)?
543        
544        /**
545         * Returns the base paint.
546         *
547         * @return The base paint (never <code>null</code>).
548         * 
549         * @see #setBasePaint(Paint)
550         */
551        public Paint getBasePaint();
552    
553        /**
554         * Sets the base paint and sends a {@link RendererChangeEvent} to all 
555         * registered listeners.
556         *
557         * @param paint  the paint (<code>null</code> not permitted).
558         * 
559         * @see #getBasePaint()
560         */
561        public void setBasePaint(Paint paint);
562        
563        // FIXME: add setBasePaint(int, Paint, boolean)?
564    
565        //// FILL PAINT /////////////////////////////////////////////////////////
566        
567    //    /**
568    //     * Returns the paint used to fill data items as they are drawn.
569    //     *
570    //     * @param row  the row (or series) index (zero-based).
571    //     * @param column  the column (or category) index (zero-based).
572    //     *
573    //     * @return The paint (never <code>null</code>).
574    //     */
575    //    public Paint getItemFillPaint(int row, int column);
576    //    
577    //    /**
578    //     * Returns the paint used to fill an item drawn by the renderer.
579    //     *
580    //     * @param series  the series (zero-based index).
581    //     *
582    //     * @return The paint (possibly <code>null</code>).
583    //     * 
584    //     * @see #setSeriesFillPaint(int, Paint)
585    //     */
586    //    public Paint getSeriesFillPaint(int series);
587    //
588    //    /**
589    //     * Sets the paint used for a series outline and sends a 
590    //     * {@link RendererChangeEvent} to all registered listeners.
591    //     *
592    //     * @param series  the series index (zero-based).
593    //     * @param paint  the paint (<code>null</code> permitted).
594    //     * 
595    //     * @see #getSeriesFillPaint(int)
596    //     */
597    //    public void setSeriesFillPaint(int series, Paint paint);
598    //
599    //    /**
600    //     * Returns the base outline paint.
601    //     *
602    //     * @return The paint (never <code>null</code>).
603    //     * 
604    //     * @see #setBaseFillPaint(Paint)
605    //     */
606    //    public Paint getBaseFillPaint();
607    //
608    //    /**
609    //     * Sets the base outline paint and sends a {@link RendererChangeEvent} to 
610    //     * all registered listeners.
611    //     *
612    //     * @param paint  the paint (<code>null</code> not permitted).
613    //     * 
614    //     * @see #getBaseFillPaint()
615    //     */
616    //    public void setBaseFillPaint(Paint paint);
617    
618        //// OUTLINE PAINT /////////////////////////////////////////////////////////
619        
620        /**
621         * Returns the paint used to outline data items as they are drawn.
622         *
623         * @param row  the row (or series) index (zero-based).
624         * @param column  the column (or category) index (zero-based).
625         *
626         * @return The paint (never <code>null</code>).
627         */
628        public Paint getItemOutlinePaint(int row, int column);
629        
630        /**
631         * Sets the outline paint for ALL series (optional).
632         * 
633         * @param paint  the paint (<code>null</code> permitted).
634         * 
635         * @deprecated This method should no longer be used (as of version 1.0.6). 
636         *     It is sufficient to rely on {@link #setSeriesOutlinePaint(int, 
637         *     Paint)} and {@link #setBaseOutlinePaint(Paint)}.
638         */
639        public void setOutlinePaint(Paint paint);
640        
641        /**
642         * Returns the paint used to outline an item drawn by the renderer.
643         *
644         * @param series  the series (zero-based index).
645         *
646         * @return The paint (possibly <code>null</code>).
647         * 
648         * @see #setSeriesOutlinePaint(int, Paint)
649         */
650        public Paint getSeriesOutlinePaint(int series);
651    
652        /**
653         * Sets the paint used for a series outline and sends a 
654         * {@link RendererChangeEvent} to all registered listeners.
655         *
656         * @param series  the series index (zero-based).
657         * @param paint  the paint (<code>null</code> permitted).
658         * 
659         * @see #getSeriesOutlinePaint(int)
660         */
661        public void setSeriesOutlinePaint(int series, Paint paint);
662    
663        // FIXME: add setSeriesOutlinePaint(int, Paint, boolean)?
664    
665        /**
666         * Returns the base outline paint.
667         *
668         * @return The paint (never <code>null</code>).
669         * 
670         * @see #setBaseOutlinePaint(Paint)
671         */
672        public Paint getBaseOutlinePaint();
673    
674        /**
675         * Sets the base outline paint and sends a {@link RendererChangeEvent} to 
676         * all registered listeners.
677         *
678         * @param paint  the paint (<code>null</code> not permitted).
679         * 
680         * @see #getBaseOutlinePaint()
681         */
682        public void setBaseOutlinePaint(Paint paint);
683    
684        // FIXME: add setBaseOutlinePaint(Paint, boolean)?
685    
686        //// STROKE ////////////////////////////////////////////////////////////////
687        
688        /**
689         * Returns the stroke used to draw data items.
690         *
691         * @param row  the row (or series) index (zero-based).
692         * @param column  the column (or category) index (zero-based).
693         *
694         * @return The stroke (never <code>null</code>).
695         */
696        public Stroke getItemStroke(int row, int column);
697    
698        /**
699         * Sets the stroke for ALL series and sends a {@link RendererChangeEvent} 
700         * to all registered listeners.
701         * 
702         * @param stroke  the stroke (<code>null</code> permitted).
703         * 
704         * @deprecated This method should no longer be used (as of version 1.0.6). 
705         *     It is sufficient to rely on {@link #setSeriesStroke(int, Stroke)} 
706         *     and {@link #setBaseStroke(Stroke)}.
707         */
708        public void setStroke(Stroke stroke);
709    
710        /**
711         * Returns the stroke used to draw the items in a series.
712         *
713         * @param series  the series (zero-based index).
714         *
715         * @return The stroke (never <code>null</code>).
716         * 
717         * @see #setSeriesStroke(int, Stroke)
718         */
719        public Stroke getSeriesStroke(int series);
720        
721        /**
722         * Sets the stroke used for a series and sends a 
723         * {@link RendererChangeEvent} to all registered listeners.
724         *
725         * @param series  the series index (zero-based).
726         * @param stroke  the stroke (<code>null</code> permitted).
727         * 
728         * @see #getSeriesStroke(int)
729         */
730        public void setSeriesStroke(int series, Stroke stroke);
731    
732        // FIXME: add setSeriesStroke(int, Stroke, boolean) ?
733        
734        /**
735         * Returns the base stroke.
736         *
737         * @return The base stroke (never <code>null</code>).
738         * 
739         * @see #setBaseStroke(Stroke)
740         */
741        public Stroke getBaseStroke();
742    
743        /**
744         * Sets the base stroke and sends a {@link RendererChangeEvent} to all
745         * registered listeners.
746         *
747         * @param stroke  the stroke (<code>null</code> not permitted).
748         * 
749         * @see #getBaseStroke()
750         */
751        public void setBaseStroke(Stroke stroke);
752        
753        // FIXME: add setBaseStroke(Stroke, boolean) ?
754        
755        //// OUTLINE STROKE ////////////////////////////////////////////////////////
756        
757        /**
758         * Returns the stroke used to outline data items.
759         * <p>
760         * The default implementation passes control to the 
761         * lookupSeriesOutlineStroke method.  You can override this method if you 
762         * require different behaviour.
763         *
764         * @param row  the row (or series) index (zero-based).
765         * @param column  the column (or category) index (zero-based).
766         *
767         * @return The stroke (never <code>null</code>).
768         */
769        public Stroke getItemOutlineStroke(int row, int column);
770    
771        /**
772         * Sets the outline stroke for ALL series and sends a 
773         * {@link RendererChangeEvent} to all registered listeners.
774         *
775         * @param stroke  the stroke (<code>null</code> permitted).
776         * 
777         * @deprecated This method should no longer be used (as of version 1.0.6). 
778         *     It is sufficient to rely on {@link #setSeriesOutlineStroke(int, 
779         *     Stroke)} and {@link #setBaseOutlineStroke(Stroke)}.
780         */
781        public void setOutlineStroke(Stroke stroke);
782        
783        /**
784         * Returns the stroke used to outline the items in a series.
785         *
786         * @param series  the series (zero-based index).
787         *
788         * @return The stroke (possibly <code>null</code>).
789         * 
790         * @see #setSeriesOutlineStroke(int, Stroke)
791         */
792        public Stroke getSeriesOutlineStroke(int series);
793    
794        /**
795         * Sets the outline stroke used for a series and sends a 
796         * {@link RendererChangeEvent} to all registered listeners.
797         *
798         * @param series  the series index (zero-based).
799         * @param stroke  the stroke (<code>null</code> permitted).
800         * 
801         * @see #getSeriesOutlineStroke(int)
802         */
803        public void setSeriesOutlineStroke(int series, Stroke stroke);
804        
805        // FIXME: add setSeriesOutlineStroke(int, Stroke, boolean) ?
806        
807        /**
808         * Returns the base outline stroke.
809         *
810         * @return The stroke (never <code>null</code>).
811         * 
812         * @see #setBaseOutlineStroke(Stroke)
813         */
814        public Stroke getBaseOutlineStroke();
815    
816        /**
817         * Sets the base outline stroke and sends a {@link RendererChangeEvent} to 
818         * all registered listeners.
819         *
820         * @param stroke  the stroke (<code>null</code> not permitted).
821         * 
822         * @see #getBaseOutlineStroke()
823         */
824        public void setBaseOutlineStroke(Stroke stroke);
825        
826        // FIXME: add setBaseOutlineStroke(Stroke, boolean) ?
827    
828        //// SHAPE /////////////////////////////////////////////////////////////////
829        
830        /**
831         * Returns a shape used to represent a data item.
832         *
833         * @param row  the row (or series) index (zero-based).
834         * @param column  the column (or category) index (zero-based).
835         *
836         * @return The shape (never <code>null</code>).
837         */
838        public Shape getItemShape(int row, int column);
839    
840        /**
841         * Sets the shape for ALL series (optional) and sends a 
842         * {@link RendererChangeEvent} to all registered listeners.
843         * 
844         * @param shape  the shape (<code>null</code> permitted).
845         * 
846         * @deprecated This method should no longer be used (as of version 1.0.6). 
847         *     It is sufficient to rely on {@link #setSeriesShape(int, Shape)} and 
848         *     {@link #setBaseShape(Shape)}.
849         */
850        public void setShape(Shape shape);
851        
852        /**
853         * Returns a shape used to represent the items in a series.
854         *
855         * @param series  the series (zero-based index).
856         *
857         * @return The shape (possibly <code>null</code>).
858         * 
859         * @see #setSeriesShape(int, Shape)
860         */
861        public Shape getSeriesShape(int series);
862    
863        /**
864         * Sets the shape used for a series and sends a {@link RendererChangeEvent}
865         * to all registered listeners.
866         *
867         * @param series  the series index (zero-based).
868         * @param shape  the shape (<code>null</code> permitted).
869         * 
870         * @see #getSeriesShape(int)
871         */
872        public void setSeriesShape(int series, Shape shape);
873        
874        // FIXME: add setSeriesShape(int, Shape, boolean) ?
875        
876        /**
877         * Returns the base shape.
878         *
879         * @return The shape (never <code>null</code>).
880         * 
881         * @see #setBaseShape(Shape)
882         */
883        public Shape getBaseShape();
884    
885        /**
886         * Sets the base shape and sends a {@link RendererChangeEvent} to all 
887         * registered listeners.
888         *
889         * @param shape  the shape (<code>null</code> not permitted).
890         * 
891         * @see #getBaseShape()
892         */
893        public void setBaseShape(Shape shape);
894    
895        // FIXME: add setBaseShape(Shape, boolean) ?
896    
897        // ITEM LABELS VISIBLE 
898        
899        /**
900         * Returns <code>true</code> if an item label is visible, and 
901         * <code>false</code> otherwise.
902         * 
903         * @param row  the row index (zero-based).
904         * @param column  the column index (zero-based).
905         * 
906         * @return A boolean.
907         */
908        public boolean isItemLabelVisible(int row, int column);
909        
910        /**
911         * Sets a flag that controls whether or not the item labels for ALL series 
912         * are visible.
913         * 
914         * @param visible  the flag.
915         * 
916         * @see #setItemLabelsVisible(Boolean)
917         * 
918         * @deprecated This method should no longer be used (as of version 1.0.6). 
919         *     It is sufficient to rely on {@link #setSeriesItemLabelsVisible(int, 
920         *     Boolean)} and {@link #setBaseItemLabelsVisible(boolean)}.
921         */
922        public void setItemLabelsVisible(boolean visible);
923    
924        /**
925         * Sets a flag that controls whether or not the item labels for ALL series 
926         * are visible.
927         * 
928         * @param visible  the flag (<code>null</code> permitted).
929         * 
930         * @see #setItemLabelsVisible(boolean)
931         * 
932         * @deprecated This method should no longer be used (as of version 1.0.6). 
933         *     It is sufficient to rely on {@link #setSeriesItemLabelsVisible(int, 
934         *     Boolean)} and {@link #setBaseItemLabelsVisible(boolean)}.
935         */
936        public void setItemLabelsVisible(Boolean visible);
937    
938        /**
939         * Sets the visibility of item labels for ALL series and, if requested, 
940         * sends a {@link RendererChangeEvent} to all registered listeners.
941         * 
942         * @param visible  a flag that controls whether or not the item labels are
943         *                 visible (<code>null</code> permitted).
944         * @param notify  a flag that controls whether or not listeners are 
945         *                notified.
946         *                
947         * @deprecated This method should no longer be used (as of version 1.0.6). 
948         *     It is sufficient to rely on {@link #setSeriesItemLabelsVisible(int, 
949         *     Boolean, boolean)} and {@link #setBaseItemLabelsVisible(Boolean, 
950         *     boolean)}.
951         */
952        public void setItemLabelsVisible(Boolean visible, boolean notify);
953    
954        /**
955         * Returns <code>true</code> if the item labels for a series are visible, 
956         * and <code>false</code> otherwise.
957         * 
958         * @param series  the series index (zero-based).
959         * 
960         * @return A boolean.
961         * 
962         * @see #setSeriesItemLabelsVisible(int, Boolean)
963         */    
964        public boolean isSeriesItemLabelsVisible(int series);
965        
966        /**
967         * Sets a flag that controls the visibility of the item labels for a series.
968         * 
969         * @param series  the series index (zero-based).
970         * @param visible  the flag.
971         * 
972         * @see #isSeriesItemLabelsVisible(int)
973         */
974        public void setSeriesItemLabelsVisible(int series, boolean visible);
975        
976        /**
977         * Sets a flag that controls the visibility of the item labels for a series.
978         * 
979         * @param series  the series index (zero-based).
980         * @param visible  the flag (<code>null</code> permitted).
981         * 
982         * @see #isSeriesItemLabelsVisible(int)
983         */
984        public void setSeriesItemLabelsVisible(int series, Boolean visible);
985        
986        /**
987         * Sets the visibility of item labels for a series and, if requested, sends 
988         * a {@link RendererChangeEvent} to all registered listeners.
989         * 
990         * @param series  the series index (zero-based).
991         * @param visible  the visible flag.
992         * @param notify  a flag that controls whether or not listeners are 
993         *                notified.
994         *                
995         * @see #isSeriesItemLabelsVisible(int)
996         */
997        public void setSeriesItemLabelsVisible(int series, Boolean visible, 
998                                               boolean notify);
999        
1000        /**
1001         * Returns the base setting for item label visibility.
1002         * 
1003         * @return A flag (possibly <code>null</code>).
1004         * 
1005         * @see #setBaseItemLabelsVisible(Boolean)
1006         */
1007        public Boolean getBaseItemLabelsVisible();
1008        
1009        /**
1010         * Sets the base flag that controls whether or not item labels are visible.
1011         * 
1012         * @param visible  the flag.
1013         * 
1014         * @see #getBaseItemLabelsVisible()
1015         */
1016        public void setBaseItemLabelsVisible(boolean visible);
1017        
1018        /**
1019         * Sets the base setting for item label visibility.
1020         * 
1021         * @param visible  the flag (<code>null</code> permitted).
1022         * 
1023         * @see #getBaseItemLabelsVisible()
1024         */
1025        public void setBaseItemLabelsVisible(Boolean visible);
1026        
1027        /**
1028         * Sets the base visibility for item labels and, if requested, sends a 
1029         * {@link RendererChangeEvent} to all registered listeners.
1030         * 
1031         * @param visible  the visibility flag.
1032         * @param notify  a flag that controls whether or not listeners are 
1033         *                notified.
1034         *                
1035         * @see #getBaseItemLabelsVisible()
1036         */
1037        public void setBaseItemLabelsVisible(Boolean visible, boolean notify);
1038        
1039        // ITEM LABEL GENERATOR
1040        
1041        /**
1042         * Returns the item label generator for the specified data item.
1043         *
1044         * @param series  the series index (zero-based).
1045         * @param item  the item index (zero-based).
1046         *
1047         * @return The generator (possibly <code>null</code>).
1048         */
1049        public CategoryItemLabelGenerator getItemLabelGenerator(int series, 
1050                int item);
1051    
1052        /**
1053         * Sets the item label generator for ALL series and sends a 
1054         * {@link RendererChangeEvent} to all registered listeners.  This overrides 
1055         * the per-series settings. 
1056         * 
1057         * @param generator  the generator (<code>null</code> permitted).
1058         * 
1059         * @deprecated This method should no longer be used (as of version 1.0.6). 
1060         *     It is sufficient to rely on {@link #setSeriesItemLabelGenerator(int, 
1061         *     CategoryItemLabelGenerator)} and 
1062         *     {@link #setBaseItemLabelGenerator(CategoryItemLabelGenerator)}.
1063         */
1064        public void setItemLabelGenerator(CategoryItemLabelGenerator generator);
1065        
1066        /**
1067         * Returns the item label generator for a series.
1068         *
1069         * @param series  the series index (zero-based).
1070         *
1071         * @return The label generator (possibly <code>null</code>).
1072         * 
1073         * @see #setSeriesItemLabelGenerator(int, CategoryItemLabelGenerator)
1074         */
1075        public CategoryItemLabelGenerator getSeriesItemLabelGenerator(int series);
1076    
1077        /**
1078         * Sets the item label generator for a series and sends a 
1079         * {@link RendererChangeEvent} to all registered listeners.  
1080         *
1081         * @param series  the series index (zero-based).
1082         * @param generator  the generator.
1083         * 
1084         * @see #getSeriesItemLabelGenerator(int)
1085         */
1086        public void setSeriesItemLabelGenerator(int series, 
1087                CategoryItemLabelGenerator generator);
1088        
1089        // FIXME: add setSeriesItemLabelGenerator(int, CategoryItemLabelGenerator,
1090        //            boolean)
1091    
1092        /**
1093         * Returns the base item label generator.
1094         *
1095         * @return The generator (possibly <code>null</code>).
1096         * 
1097         * @see #setBaseItemLabelGenerator(CategoryItemLabelGenerator)
1098         */
1099        public CategoryItemLabelGenerator getBaseItemLabelGenerator();
1100    
1101        /**
1102         * Sets the base item label generator and sends a 
1103         * {@link RendererChangeEvent} to all registered listeners.
1104         *
1105         * @param generator  the generator (<code>null</code> permitted).
1106         * 
1107         * @see #getBaseItemLabelGenerator()
1108         */
1109        public void setBaseItemLabelGenerator(CategoryItemLabelGenerator generator);
1110        
1111        // FIXME: add setBaseItemLabelGenerator(CategoryItemLabelGenerator, 
1112        //            boolean) ?
1113    
1114        // TOOL TIP GENERATOR
1115        
1116        /**
1117         * Returns the tool tip generator that should be used for the specified 
1118         * item.  This method looks up the generator using the "three-layer" 
1119         * approach outlined in the general description of this interface.  
1120         *
1121         * @param row  the row index (zero-based).
1122         * @param column  the column index (zero-based).
1123         *
1124         * @return The generator (possibly <code>null</code>).
1125         */
1126        public CategoryToolTipGenerator getToolTipGenerator(int row, int column);
1127    
1128        /**
1129         * Returns the tool tip generator that will be used for ALL items in the 
1130         * dataset (the "layer 0" generator).
1131         * 
1132         * @return A tool tip generator (possibly <code>null</code>).
1133         * 
1134         * @see #setToolTipGenerator(CategoryToolTipGenerator)
1135         * 
1136         * @deprecated This method should no longer be used (as of version 1.0.6). 
1137         *     It is sufficient to rely on {@link #getSeriesToolTipGenerator(int)} 
1138         *     and {@link #getBaseToolTipGenerator()}.
1139         */
1140        public CategoryToolTipGenerator getToolTipGenerator();
1141    
1142        /**
1143         * Sets the tool tip generator for ALL series and sends a 
1144         * {@link org.jfree.chart.event.RendererChangeEvent} to all registered 
1145         * listeners.
1146         * 
1147         * @param generator  the generator (<code>null</code> permitted).
1148         * 
1149         * @see #getToolTipGenerator()
1150         * 
1151         * @deprecated This method should no longer be used (as of version 1.0.6). 
1152         *     It is sufficient to rely on {@link #setSeriesToolTipGenerator(int, 
1153         *     CategoryToolTipGenerator)} and 
1154         *     {@link #setBaseToolTipGenerator(CategoryToolTipGenerator)}.
1155         */
1156        public void setToolTipGenerator(CategoryToolTipGenerator generator);
1157        
1158        /**
1159         * Returns the tool tip generator for the specified series (a "layer 1" 
1160         * generator).
1161         *
1162         * @param series  the series index (zero-based).
1163         *
1164         * @return The tool tip generator (possibly <code>null</code>).
1165         * 
1166         * @see #setSeriesToolTipGenerator(int, CategoryToolTipGenerator)
1167         */
1168        public CategoryToolTipGenerator getSeriesToolTipGenerator(int series);
1169    
1170        /**
1171         * Sets the tool tip generator for a series and sends a 
1172         * {@link org.jfree.chart.event.RendererChangeEvent} to all registered 
1173         * listeners.
1174         *
1175         * @param series  the series index (zero-based).
1176         * @param generator  the generator (<code>null</code> permitted).
1177         * 
1178         * @see #getSeriesToolTipGenerator(int)
1179         */
1180        public void setSeriesToolTipGenerator(int series, 
1181                                              CategoryToolTipGenerator generator);
1182        
1183        // FIXME: add setSeriesToolTipGenerator(int, CategoryToolTipGenerator, 
1184        //            boolean) ?
1185    
1186        /**
1187         * Returns the base tool tip generator (the "layer 2" generator).
1188         *
1189         * @return The tool tip generator (possibly <code>null</code>).
1190         * 
1191         * @see #setBaseToolTipGenerator(CategoryToolTipGenerator)
1192         */
1193        public CategoryToolTipGenerator getBaseToolTipGenerator();
1194    
1195        /**
1196         * Sets the base tool tip generator and sends a 
1197         * {@link org.jfree.chart.event.RendererChangeEvent} to all registered 
1198         * listeners.
1199         *
1200         * @param generator  the generator (<code>null</code> permitted).
1201         * 
1202         * @see #getBaseToolTipGenerator()
1203         */
1204        public void setBaseToolTipGenerator(CategoryToolTipGenerator generator);
1205        
1206        // FIXME: add setBaseToolTipGenerator(CategoryToolTipGenerator, boolean) ?
1207    
1208        //// ITEM LABEL FONT  //////////////////////////////////////////////////////
1209        
1210        /**
1211         * Returns the font for an item label.
1212         * 
1213         * @param row  the row index (zero-based).
1214         * @param column  the column index (zero-based).
1215         * 
1216         * @return The font (never <code>null</code>).
1217         */
1218        public Font getItemLabelFont(int row, int column);
1219    
1220        /**
1221         * Returns the font used for all item labels.  This may be 
1222         * <code>null</code>, in which case the per series font settings will apply.
1223         * 
1224         * @return The font (possibly <code>null</code>).
1225         * 
1226         * @see #setItemLabelFont(Font)
1227         * 
1228         * @deprecated This method should no longer be used (as of version 1.0.6). 
1229         *     It is sufficient to rely on {@link #getSeriesItemLabelFont(int)} and
1230         *     {@link #getBaseItemLabelFont()}.
1231         */
1232        public Font getItemLabelFont();
1233        
1234        /**
1235         * Sets the item label font for ALL series and sends a 
1236         * {@link RendererChangeEvent} to all registered listeners.  You can set 
1237         * this to <code>null</code> if you prefer to set the font on a per series 
1238         * basis.
1239         * 
1240         * @param font  the font (<code>null</code> permitted).
1241         * 
1242         * @see #getItemLabelFont()
1243         * 
1244         * @deprecated This method should no longer be used (as of version 1.0.6). 
1245         *     It is sufficient to rely on {@link #setSeriesItemLabelFont(int, 
1246         *     Font)} and {@link #setBaseItemLabelFont(Font)}.
1247         */
1248        public void setItemLabelFont(Font font);
1249        
1250        /**
1251         * Returns the font for all the item labels in a series.
1252         * 
1253         * @param series  the series index (zero-based).
1254         * 
1255         * @return The font (possibly <code>null</code>).
1256         * 
1257         * @see #setSeriesItemLabelFont(int, Font)
1258         */
1259        public Font getSeriesItemLabelFont(int series);
1260    
1261        /**
1262         * Sets the item label font for a series and sends a 
1263         * {@link RendererChangeEvent} to all registered listeners.  
1264         * 
1265         * @param series  the series index (zero-based).
1266         * @param font  the font (<code>null</code> permitted).
1267         * 
1268         * @see #getSeriesItemLabelFont(int)
1269         */
1270        public void setSeriesItemLabelFont(int series, Font font);
1271        
1272        // FIXME: add setSeriesItemLabelFont(int, Font, boolean) ?
1273    
1274        /**
1275         * Returns the base item label font (this is used when no other font 
1276         * setting is available).
1277         * 
1278         * @return The font (<code>never</code> null).
1279         * 
1280         * @see #setBaseItemLabelFont(Font)
1281         */
1282        public Font getBaseItemLabelFont();
1283    
1284        /**
1285         * Sets the base item label font and sends a {@link RendererChangeEvent} 
1286         * to all registered listeners.  
1287         * 
1288         * @param font  the font (<code>null</code> not permitted).
1289         * 
1290         * @see #getBaseItemLabelFont()
1291         */
1292        public void setBaseItemLabelFont(Font font);
1293        
1294        // FIXME: add setBaseItemLabelFont(Font, boolean) ?
1295        
1296        //// ITEM LABEL PAINT  /////////////////////////////////////////////////////
1297    
1298        /**
1299         * Returns the paint used to draw an item label.
1300         * 
1301         * @param row  the row index (zero based).
1302         * @param column  the column index (zero based).
1303         * 
1304         * @return The paint (never <code>null</code>).
1305         */
1306        public Paint getItemLabelPaint(int row, int column);
1307        
1308        /**
1309         * Returns the paint used for all item labels.  This may be 
1310         * <code>null</code>, in which case the per series paint settings will 
1311         * apply.
1312         * 
1313         * @return The paint (possibly <code>null</code>).
1314         * 
1315         * @see #setItemLabelPaint(Paint)
1316         * 
1317         * @deprecated This method should no longer be used (as of version 1.0.6). 
1318         *     It is sufficient to rely on {@link #getSeriesItemLabelPaint(int)} 
1319         *     and {@link #getBaseItemLabelPaint()}.
1320         */
1321        public Paint getItemLabelPaint();
1322    
1323        /**
1324         * Sets the item label paint for ALL series and sends a 
1325         * {@link RendererChangeEvent} to all registered listeners.
1326         * 
1327         * @param paint  the paint (<code>null</code> permitted).
1328         * 
1329         * @see #getItemLabelPaint()
1330         * 
1331         * @deprecated This method should no longer be used (as of version 1.0.6). 
1332         *     It is sufficient to rely on {@link #setSeriesItemLabelPaint(int, 
1333         *     Paint)} and {@link #setBaseItemLabelPaint(Paint)}.
1334         */
1335        public void setItemLabelPaint(Paint paint);
1336    
1337        /**
1338         * Returns the paint used to draw the item labels for a series.
1339         * 
1340         * @param series  the series index (zero based).
1341         * 
1342         * @return The paint (possibly <code>null<code>).
1343         * 
1344         * @see #setSeriesItemLabelPaint(int, Paint)
1345         */
1346        public Paint getSeriesItemLabelPaint(int series);
1347    
1348        /**
1349         * Sets the item label paint for a series and sends a 
1350         * {@link RendererChangeEvent} to all registered listeners.
1351         * 
1352         * @param series  the series (zero based index).
1353         * @param paint  the paint (<code>null</code> permitted).
1354         * 
1355         * @see #getSeriesItemLabelPaint(int)
1356         */
1357        public void setSeriesItemLabelPaint(int series, Paint paint);
1358        
1359        // FIXME: add setSeriesItemLabelPaint(int, Paint, boolean) ?
1360        
1361        /**
1362         * Returns the base item label paint.
1363         * 
1364         * @return The paint (never <code>null<code>).
1365         * 
1366         * @see #setBaseItemLabelPaint(Paint)
1367         */
1368        public Paint getBaseItemLabelPaint();
1369    
1370        /**
1371         * Sets the base item label paint and sends a {@link RendererChangeEvent} 
1372         * to all registered listeners.
1373         * 
1374         * @param paint  the paint (<code>null</code> not permitted).
1375         * 
1376         * @see #getBaseItemLabelPaint()
1377         */
1378        public void setBaseItemLabelPaint(Paint paint);
1379        
1380        // FIXME: add setBaseItemLabelPaint(Paint, boolean) ?
1381        
1382        // POSITIVE ITEM LABEL POSITION...
1383    
1384        /**
1385         * Returns the item label position for positive values.
1386         * 
1387         * @param row  the row index (zero-based).
1388         * @param column  the column index (zero-based).
1389         * 
1390         * @return The item label position (never <code>null</code>).
1391         */
1392        public ItemLabelPosition getPositiveItemLabelPosition(int row, int column);
1393    
1394        /**
1395         * Returns the item label position for positive values in ALL series.
1396         *