    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Graphics.Rendering.Chart.Plot.Annotation
    -- Copyright   :  (c) Tim Docker 2006
    -- License     :  BSD-style (see chart/COPYRIGHT)
    --
    -- Show textual annotations on a chart.

    {-# OPTIONS_GHC -XTemplateHaskell #-}

    module Graphics.Rendering.Chart.Plot.Annotation(
        PlotAnnotation(..),
        defaultPlotAnnotation,

        plot_annotation_hanchor,
        plot_annotation_vanchor,
        plot_annotation_angle,
        plot_annotation_style,
        plot_annotation_values
    ) where

    import Data.Accessor.Template
    import qualified Graphics.Rendering.Cairo as C
    import Graphics.Rendering.Chart.Types
    import Graphics.Rendering.Chart.Renderable
    import Graphics.Rendering.Chart.Plot.Types
    import Data.Colour (opaque)
    import Data.Colour.Names (black, blue)
    import Data.Colour.SRGB (sRGB)
    -- | Value for describing a series of text annotations
    --   to be placed at arbitrary points on the graph. Annotations
    --   can be rotated and styled. Rotation angle is given in degrees,
    --   rotation is performend around the anchor point.

    data PlotAnnotation  x y = PlotAnnotation {
          plot_annotation_hanchor_ :: HTextAnchor,
          plot_annotation_vanchor_ :: VTextAnchor,
          plot_annotation_angle_   :: Double,
          plot_annotation_style_   :: CairoFontStyle,
          plot_annotation_values_  :: [(x,y,String)]
    }

    instance ToPlot PlotAnnotation where
        toPlot p = Plot {
            plot_render_ = renderAnnotation p,
    	plot_legend_ = [],
    	plot_all_points_ = (map (\(x,_,_)->x)  vs , map (\(_,y,_)->y) vs)
        }
          where
            vs = plot_annotation_values_ p

    renderAnnotation :: PlotAnnotation x y -> PointMapFn x y -> CRender ()

    renderAnnotation p pMap = preserveCState $ do
                                setFontStyle style
                                mapM_ drawOne values
        where hta = plot_annotation_hanchor_ p
              vta = plot_annotation_vanchor_ p
              values = plot_annotation_values_ p
              angle =  plot_annotation_angle_ p
              style =  plot_annotation_style_ p
              drawOne (x,y,s) = drawTextsR hta vta angle point s
                  where point = pMap (LValue x, LValue y)

    defaultPlotAnnotation = PlotAnnotation {
                              plot_annotation_hanchor_ = HTA_Centre,
                              plot_annotation_vanchor_ = VTA_Centre,
                              plot_annotation_angle_   = 0,
                              plot_annotation_style_   = defaultFontStyle,
                              plot_annotation_values_  = []
    }

    ----------------------------------------------------------------------
    -- Template haskell to derive an instance of Data.Accessor.Accessor
    -- for each field.

    $( deriveAccessors ''PlotAnnotation )