Crazy Eddie's GUI System 0.8.7
Loading...
Searching...
No Matches
RenderedStringWordWrapper.h
1/***********************************************************************
2 created: 25/05/2009
3 author: Paul Turner
4 *************************************************************************/
5/***************************************************************************
6 * Copyright (C) 2004 - 2009 Paul D Turner & The CEGUI Development Team
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining
9 * a copy of this software and associated documentation files (the
10 * "Software"), to deal in the Software without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sublicense, and/or sell copies of the Software, and to
13 * permit persons to whom the Software is furnished to do so, subject to
14 * the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be
17 * included in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 ***************************************************************************/
27#ifndef _CEGUIRenderedStringWordWrapper_h_
28#define _CEGUIRenderedStringWordWrapper_h_
29
30#include "CEGUI/FormattedRenderedString.h"
31#include "CEGUI/JustifiedRenderedString.h"
32#include "CEGUI/Vector.h"
33#include <vector>
34
35// Start of CEGUI namespace section
36namespace CEGUI
37{
43template <typename T>
45{
46public:
51
52 // implementation of base interface
53 void format(const Window* ref_wnd, const Sizef& area_size);
54 void draw(const Window* ref_wnd, GeometryBuffer& buffer,
55 const Vector2f& position, const ColourRect* mod_colours,
56 const Rectf* clip_rect) const;
57 size_t getFormattedLineCount() const;
58 float getHorizontalExtent(const Window* ref_wnd) const;
59 float getVerticalExtent(const Window* ref_wnd) const;
60
61protected:
63 void deleteFormatters();
65 typedef std::vector<FormattedRenderedString*
66 CEGUI_VECTOR_ALLOC(FormattedRenderedString*)> LineList;
69};
70
72template <> CEGUIEXPORT
74 const Sizef& area_size);
75
76//----------------------------------------------------------------------------//
77template <typename T>
83
84//----------------------------------------------------------------------------//
85template <typename T>
90
91//----------------------------------------------------------------------------//
92template <typename T>
94 const Sizef& area_size)
95{
96 deleteFormatters();
97
99 rstring = *d_renderedString;
100 float rs_width;
101
102 T* frs;
103
104 for (size_t line = 0; line < rstring.getLineCount(); ++line)
105 {
106 while ((rs_width = rstring.getPixelSize(ref_wnd, line).d_width) > 0)
107 {
108 // skip line if no wrapping occurs
109 if (rs_width <= area_size.d_width)
110 break;
111
112 // split rstring at width into lstring and remaining rstring
113 rstring.split(ref_wnd, line, area_size.d_width, lstring);
114 frs = CEGUI_NEW_AO T(*new RenderedString(lstring));
115 frs->format(ref_wnd, area_size);
116 d_lines.push_back(frs);
117 line = 0;
118 }
119 }
120
121 // last line.
122 frs = CEGUI_NEW_AO T(*new RenderedString(rstring));
123 frs->format(ref_wnd, area_size);
124 d_lines.push_back(frs);
125}
126
127//----------------------------------------------------------------------------//
128template <typename T>
129void RenderedStringWordWrapper<T>::draw(const Window* ref_wnd,
130 GeometryBuffer& buffer,
131 const Vector2f& position,
132 const ColourRect* mod_colours,
133 const Rectf* clip_rect) const
134{
135 Vector2f line_pos(position);
136 typename LineList::const_iterator i = d_lines.begin();
137 for (; i != d_lines.end(); ++i)
138 {
139 (*i)->draw(ref_wnd, buffer, line_pos, mod_colours, clip_rect);
140 line_pos.d_y += (*i)->getVerticalExtent(ref_wnd);
141 }
142}
143
144//----------------------------------------------------------------------------//
145template <typename T>
146size_t RenderedStringWordWrapper<T>::getFormattedLineCount() const
147{
148 return d_lines.size();
149}
150
151//----------------------------------------------------------------------------//
152template <typename T>
153float RenderedStringWordWrapper<T>::getHorizontalExtent(const Window* ref_wnd) const
154{
155 // TODO: Cache at format time.
156
157 float w = 0;
158 typename LineList::const_iterator i = d_lines.begin();
159 for (; i != d_lines.end(); ++i)
160 {
161 const float cur_width = (*i)->getHorizontalExtent(ref_wnd);
162 if (cur_width > w)
163 w = cur_width;
164 }
165
166 return w;
167}
168
169//----------------------------------------------------------------------------//
170template <typename T>
171float RenderedStringWordWrapper<T>::getVerticalExtent(const Window* ref_wnd) const
172{
173 // TODO: Cache at format time.
174
175 float h = 0;
176 typename LineList::const_iterator i = d_lines.begin();
177 for (; i != d_lines.end(); ++i)
178 h += (*i)->getVerticalExtent(ref_wnd);
179
180 return h;
181}
182
183//----------------------------------------------------------------------------//
184template <typename T>
186{
187 for (size_t i = 0; i < d_lines.size(); ++i)
188 {
189 // get the rendered string back from rthe formatter
190 const RenderedString* rs = &d_lines[i]->getRenderedString();
191 // delete the formatter
192 CEGUI_DELETE_AO d_lines[i];
193 // delete the rendered string.
194 CEGUI_DELETE_AO rs;
195 }
196
197 d_lines.clear();
198}
199
200//----------------------------------------------------------------------------//
201
202} // End of CEGUI namespace section
203
204#endif // end of guard _CEGUIRenderedStringWordWrapper_h_
Class that holds details of colours for the four corners of a rectangle.
Definition ColourRect.h:45
Root of a class hierarchy that wrap RenderedString objects and render them with additional formatting...
Definition FormattedRenderedString.h:42
Abstract class defining the interface for objects that buffer geometry for later rendering.
Definition GeometryBuffer.h:44
Class that handles wrapping of a rendered string into sub-strings. Each sub-string is rendered using ...
Definition RenderedStringWordWrapper.h:45
std::vector< FormattedRenderedString *CEGUI_VECTOR_ALLOC(FormattedRenderedString *)> LineList
type of collection used to track the formatted lines.
Definition RenderedStringWordWrapper.h:66
RenderedStringWordWrapper(const RenderedString &string)
Constructor.
Definition RenderedStringWordWrapper.h:78
~RenderedStringWordWrapper()
Destructor.
Definition RenderedStringWordWrapper.h:86
void deleteFormatters()
Delete the current formatters and associated RenderedStrings.
Definition RenderedStringWordWrapper.h:185
LineList d_lines
collection of lines.
Definition RenderedStringWordWrapper.h:68
Class representing a rendered string of entities.
Definition RenderedString.h:52
base class for properties able to do native set/get
Definition TypedProperty.h:50
An abstract base class providing common functionality and specifying the required interface for deriv...
Definition Window.h:151
Main namespace for Crazy Eddie's GUI Library.
Definition arch_overview.dox:1