//# PlotAnnotation.h: Annotation class that can be drawn on a canvas.
//# Copyright (C) 2008
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//#        Internet email: aips2-request@nrao.edu.
//#        Postal address: AIPS++ Project Office
//#                        National Radio Astronomy Observatory
//#                        520 Edgemont Road
//#                        Charlottesville, VA 22903-2475 USA
//#
//# $Id: $
#ifndef PLOTANNOTATION_H_
#define PLOTANNOTATION_H_

#include <graphics/GenericPlotter/PlotItem.h>

#include <casacore/casa/BasicSL/String.h>

namespace casa {

// PlotAnnotation is an abstraction of text written directly on the canvas.  An
// annotation has text, font, orientation, outline, and background properties.
class PlotAnnotation : public virtual PlotItem {
public:
    // Constructor.
    PlotAnnotation() { }
    
    // Destructor.
    virtual ~PlotAnnotation() { }
    
    
    // Implements PlotItem::drawCount().  Provides default implementation that
    // returns 1.
    virtual unsigned int drawCount() const { return 1; }
    
    // ABSTRACT METHODS //
    
    // Returns the text of the annotation.
    virtual casacore::String text() const = 0;
    
    // Sets the text of the annotation.
    virtual void setText(const casacore::String& newText) = 0;
    
    // Returns a copy of the font used in the annotation.
    virtual PlotFontPtr font() const = 0;
    
    // Sets the annotation font to the given.
    virtual void setFont(const PlotFont& font) = 0;
    
    // Returns orientation in counterclockwise degrees (between 0 and 360).
    virtual int orientation() const = 0;
    
    // Sets the orientation in counterclockwise degrees (between 0 and 360).
    virtual void setOrientation(int orientation) = 0;
    
    // Returns the coordinate where the annotation is located on the canvas it
    // is attached to.
    virtual PlotCoordinate coordinate() const = 0;
    
    // Sets the location of the annotation to the given.
    virtual void setCoordinate(const PlotCoordinate& coord) = 0;
    
    // Returns true if an outline is shown around the annotation, false
    // otherwise.
    virtual bool outlineShown() const = 0;
    
    // Sets whether an outline is shown around the annotation.
    virtual void setOutlineShown(bool show = true) = 0;
    
    // Returns a copy of the line used to draw the outline for this annotation.
    virtual PlotLinePtr outline() const = 0;
    
    // Sets the outline to the given line.
    virtual void setOutline(const PlotLine& line) = 0;
    
    // Returns a copy of the area fill used for the annotation's background.
    virtual PlotAreaFillPtr background() const = 0;
    
    // Sets the annotation's background to the given.
    virtual void setBackground(const PlotAreaFill& area) = 0;
    
    
    // IMPLEMENTED METHODS //
    
    // Convenience methods for setting font.
    // <group>
    virtual void setFont(const PlotFontPtr font) {
        if(!font.null()) setFont(*font); }
    virtual void setFontColor(const casacore::String& color) {
        PlotFontPtr f = font();
        f->setColor(color);
        setFont(*f);
    }
    // </group>
    
    // Convenience methods for setting the outline.
    // <group>
    virtual void setOutline(const PlotLinePtr line) {
        if(!line.null()) setOutline(*line);
        else             setOutlineShown(false);
    }
    virtual void setOutline(const casacore::String& color,
            PlotLine::Style style = PlotLine::SOLID, double width = 1.0) {
        PlotLinePtr line = outline();
        line->setColor(color);
        line->setStyle(style);
        line->setWidth(width);
        setOutline(*line);
    }
    // </group>
    
    // Convenience methods for setting the background.
    // <group>
    virtual void setBackground(const PlotAreaFillPtr area) {
        if(!area.null()) setBackground(*area); }
    virtual void setBackground(const casacore::String& color,
            PlotAreaFill::Pattern pattern = PlotAreaFill::FILL) {
        PlotAreaFillPtr bg = background();
        bg->setColor(color);
        bg->setPattern(pattern);
        setBackground(*bg);
    }
    // </group>
};
INHERITANCE_POINTER2(PlotAnnotation, PlotAnnotationPtr, PlotItem, PlotItemPtr)

}

#endif /*PLOTANNOTATION_H_*/