Chemical Data Processing Library C++ API - Version 1.2.0
TextBlockPrimitive2D.hpp
Go to the documentation of this file.
1 /*
2  * TextBlockPrimitive2D.hpp
3  *
4  * This file is part of the Chemical Data Processing Toolkit
5  *
6  * Copyright (C) 2003 Thomas Seidel <thomas.seidel@univie.ac.at>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this library; see the file COPYING. If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23 
29 #ifndef CDPL_VIS_TEXTBLOCKPRIMITIVE2D_HPP
30 #define CDPL_VIS_TEXTBLOCKPRIMITIVE2D_HPP
31 
32 #include <string>
33 #include <vector>
34 #include <cstddef>
35 #include <memory>
36 
38 #include "CDPL/Vis/Pen.hpp"
39 #include "CDPL/Vis/Font.hpp"
40 #include "CDPL/Math/Vector.hpp"
41 
42 
43 namespace rapidxml
44 {
45 
46  template <typename C> class xml_node;
47 }
48 
49 
50 namespace CDPL
51 {
52 
53  namespace Vis
54  {
55 
69  {
70 
71  public:
75  typedef std::shared_ptr<TextBlockPrimitive2D> SharedPointer;
76 
81 
82  void render(Renderer2D& renderer) const;
83 
140  void setText(const std::string& text);
141 
145  void clearText();
146 
151  const std::string& getText() const;
152 
157  bool hasText() const;
158 
166  void setPosition(const Math::Vector2D& pos);
167 
176  void setPosition(double x, double y);
177 
183  const Math::Vector2D& getPosition() const;
184 
189  void setPen(const Pen& pen);
190 
195  const Pen& getPen() const;
196 
202  void setFont(const Font& font);
203 
208  const Font& getFont() const;
209 
217  void setAlignment(unsigned int alignment);
218 
226  unsigned int getAlignment() const;
227 
236  void setLineSpacing(double spacing);
237 
242  double getLineSpacing() const;
243 
250  void layout(FontMetrics& font_metrics);
251 
253 
254  void getBounds(Rectangle2D& bounds, FontMetrics* font_metrics) const;
255 
256  private:
257  struct Style
258  {
259 
260  bool bold{false};
261  bool italic{false};
262  bool underlined{false};
263  bool overlined{false};
264  bool strikedOut{false};
265  bool subscripted{false};
266  bool superscripted{false};
267  };
268 
269  struct TextFragment
270  {
271 
272  TextFragment(std::string& text, const Style& style, const Color& color,
273  bool def_color, std::size_t line):
274  style(style), color(color), defColor(def_color), line(line)
275  {
276  this->text.swap(text);
277  }
278 
279  std::string text;
280  Style style;
281  Color color;
282  bool defColor;
283  std::size_t line;
284  double xPos;
285  double yPos;
286  };
287 
288  typedef rapidxml::xml_node<char> XMLNode;
289  typedef std::vector<Color> ColorStack;
290  typedef std::vector<Style> StyleStack;
291  typedef std::vector<TextFragment> TextFragmentList;
292 
293  void processText(const std::string& text);
294  void processNode(XMLNode* node);
295  void getColor(XMLNode* node);
296  void applyStyle(Font& font, const Style& style) const;
297 
298  Pen pen;
299  Font font;
300  Math::Vector2D position;
301  std::string text;
302  unsigned int alignment;
303  double lineSpacing;
304  ColorStack colorStack;
305  StyleStack styleStack;
306  Color currColor;
307  Style currStyle;
308  std::size_t currLine;
309  TextFragmentList textFragments;
310  };
311  } // namespace Vis
312 } // namespace CDPL
313 
314 #endif // CDPL_VIS_TEXTBLOCKPRIMITIVE2D_HPP
Definition of the class CDPL::Vis::Font.
Definition of the class CDPL::Vis::GraphicsPrimitive2D.
Definition of the class CDPL::Vis::Pen.
Definition of vector data types.
#define CDPL_VIS_API
Tells the compiler/linker which classes, functions and variables are part of the library API.
An interface class with methods that provide information about the metrics of a font.
Definition: FontMetrics.hpp:71
Specifies a font for drawing text.
Definition: Font.hpp:54
The abstract base class of all 2D graphics primitives.
Definition: GraphicsPrimitive2D.hpp:57
std::shared_ptr< GraphicsPrimitive2D > SharedPointer
A reference-counted smart pointer [SHPTR] for dynamically allocated GraphicsPrimitive2D instances.
Definition: GraphicsPrimitive2D.hpp:63
Specifies how to draw lines and outlines of shapes.
Definition: Pen.hpp:53
Specifies an axis aligned rectangular area in 2D space.
Definition: Rectangle2D.hpp:51
An interface that provides methods for low level 2D drawing operations.
Definition: Renderer2D.hpp:86
A graphics primitive representing a block of styled text.
Definition: TextBlockPrimitive2D.hpp:69
const Pen & getPen() const
Returns the pen defining the default text color.
void setText(const std::string &text)
Specifies the block's text content.
TextBlockPrimitive2D()
Construct an empty text block primitive at position (0, 0).
const Math::Vector2D & getPosition() const
Returns the position of the text block.
bool hasText() const
Tells whether the text block has any visible text (includes whitespace).
double getLineSpacing() const
Returns the active line spacing value.
std::shared_ptr< TextBlockPrimitive2D > SharedPointer
A reference-counted smart pointer [SHPTR] for dynamically allocated TextBlockPrimitive2D instances.
Definition: TextBlockPrimitive2D.hpp:75
void render(Renderer2D &renderer) const
Visualizes the graphics primitive by means of the Renderer2D instance renderer.
void clearText()
Clears the block's text content.
GraphicsPrimitive2D::SharedPointer clone() const
Creates a dynamically allocated copy of the graphics primitive.
void setPosition(double x, double y)
Sets the position of the text block to (x, y).
void setLineSpacing(double spacing)
Sets the line spacing value.
void setAlignment(unsigned int alignment)
Specifies the way lines should be horizontally aligned.
void layout(FontMetrics &font_metrics)
Performs a layout of the text for the currently specified font using the provided Vis::FontMetrics in...
unsigned int getAlignment() const
Returns the active horizontal text alignment specification.
void setFont(const Font &font)
Sets the font used for text rendering.
const Font & getFont() const
Returns the font used for text rendering.
void getBounds(Rectangle2D &bounds, FontMetrics *font_metrics) const
Calculates the bounds of the graphics primitive.
const std::string & getText() const
Returns the block's text content.
void setPen(const Pen &pen)
Sets the pen defining the default text color.
void setPosition(const Math::Vector2D &pos)
Sets the position of the text block in 2D space.
CVector< double, 2 > Vector2D
A bounded 2 element vector holding floating point values of type double.
Definition: Vector.hpp:1632
CDPL_VIS_API const Color & getColor(const Chem::Atom &atom)
The namespace of the Chemical Data Processing Library.