legend.hpp
Go to the documentation of this file.
00001 
00005 /* Copyright (c) 2005-2011 Taneli Kalvas. All rights reserved.
00006  *
00007  * You can redistribute this software and/or modify it under the terms
00008  * of the GNU General Public License as published by the Free Software
00009  * Foundation; either version 2 of the License, or (at your option)
00010  * any later version.
00011  * 
00012  * This library is distributed in the hope that it will be useful, but
00013  * WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00015  * General Public License for more details.
00016  * 
00017  * You should have received a copy of the GNU General Public License
00018  * along with this library (file "COPYING" included in the package);
00019  * if not, write to the Free Software Foundation, Inc., 51 Franklin
00020  * Street, Fifth Floor, Boston, MA 02110-1301 USA
00021  * 
00022  * If you have questions about your rights to use or distribute this
00023  * software, please contact Berkeley Lab's Technology Transfer
00024  * Department at TTD@lbl.gov. Other questions, comments and bug
00025  * reports should be sent directly to the author via email at
00026  * taneli.kalvas@jyu.fi.
00027  * 
00028  * NOTICE. This software was developed under partial funding from the
00029  * U.S.  Department of Energy.  As such, the U.S. Government has been
00030  * granted for itself and others acting on its behalf a paid-up,
00031  * nonexclusive, irrevocable, worldwide license in the Software to
00032  * reproduce, prepare derivative works, and perform publicly and
00033  * display publicly.  Beginning five (5) years after the date
00034  * permission to assert copyright is obtained from the U.S. Department
00035  * of Energy, and subject to any subsequent five (5) year renewals,
00036  * the U.S. Government is granted for itself and others acting on its
00037  * behalf a paid-up, nonexclusive, irrevocable, worldwide license in
00038  * the Software to reproduce, prepare derivative works, distribute
00039  * copies to the public, perform publicly and display publicly, and to
00040  * permit others to do so.
00041  */
00042 
00043 #ifndef LEGEND_HPP
00044 #define LEGEND_HPP 1
00045 
00046 
00047 #include <vector>
00048 #include <string>
00049 #include "graph.hpp"
00050 #include "label.hpp"
00051 #include "colormap.hpp"
00052 
00053 
00058 enum legend_position_e {
00059     LEGEND_POS_BOTTOM_LEFT   = 0,
00060     LEGEND_POS_BOTTOM_CENTER = 1,
00061     LEGEND_POS_BOTTOM_RIGHT  = 2,
00062 
00063     LEGEND_POS_MIDDLE_LEFT   = 4+0,
00064     LEGEND_POS_MIDDLE_CENTER = 4+1,
00065     LEGEND_POS_MIDDLE_RIGHT  = 4+2,
00066 
00067     LEGEND_POS_TOP_LEFT      = 8+0,
00068     LEGEND_POS_TOP_CENTER    = 8+1,
00069     LEGEND_POS_TOP_RIGHT     = 8+2
00070 };
00071 
00072 
00073 #define LEGEND_POS_VERTICAL_MASK   12
00074 #define LEGEND_POS_HORIZONTAL_MASK 3
00075 
00076 #define LEGEND_POS_BOTTOM 0
00077 #define LEGEND_POS_MIDDLE 4
00078 #define LEGEND_POS_TOP    8
00079 
00080 #define LEGEND_POS_LEFT   0
00081 #define LEGEND_POS_CENTER 1
00082 #define LEGEND_POS_RIGHT  2
00083 
00084 
00093 class LegendEntry {
00094     
00095     Graph        &_graph;      
00096     Label         _label;      
00098 public:
00099     
00102     LegendEntry( Graph &graph, const std::string &label ) 
00103         : _graph(graph), _label(label) {}
00104 
00107     LegendEntry( const LegendEntry &le ) 
00108         : _graph(le._graph), _label(le._label) {}
00109 
00112     ~LegendEntry() {}
00113 
00116     LegendEntry &operator=( const LegendEntry &le ) {
00117         _graph = le._graph;
00118         _label = le._label;
00119         return( *this );
00120     }
00121 
00126     void plot( cairo_t *cairo, double x, double y );
00127 
00130     void get_size( cairo_t *cairo, double &width, double &height ) const;
00131 
00134     void set_font_size( double fontsize );
00135 };
00136 
00137 
00149 class Legend {
00150 
00151 public:
00152 
00155     Legend() {}
00156 
00159     virtual ~Legend() {}    
00160 
00165     virtual void plot( cairo_t *cairo, double x, double y ) = 0;
00166 
00169     virtual void get_size( cairo_t *cairo, double &width, double &height ) const = 0;
00170 };
00171 
00172 
00175 class MultiEntryLegend {
00176 
00177     double                     _fontsize; 
00178     std::vector<LegendEntry *> _entry;    
00180 public:
00181 
00184     MultiEntryLegend();
00185     
00188     virtual ~MultiEntryLegend() {}    
00189 
00194     virtual void plot( cairo_t *cairo, double x, double y );
00195 
00198     virtual void get_size( cairo_t *cairo, double &width, double &height ) const;
00199 
00202     void set_font_size( double fontsize );
00203 
00206     void add_entry( LegendEntry *entry );
00207 
00210     void clear_entries( void );
00211 };
00212 
00213 
00216 class ColormapLegend {
00217 
00218     double      _height;
00219     Colormap   &_colormap;
00220 
00221 
00222 public:
00223 
00226     ColormapLegend( Colormap &colormap ) : _height(0.0), _colormap(colormap) {}
00227 
00230     virtual ~ColormapLegend() {}
00231 
00236     virtual void plot( cairo_t *cairo, double x, double y );
00237 
00240     virtual void get_size( cairo_t *cairo, double &width, double &height ) const;
00241 
00244     void set_height( double height );
00245 };
00246 
00247 
00248 #endif
00249