00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _CEGUIRenderedStringWordWrapper_h_
00029 #define _CEGUIRenderedStringWordWrapper_h_
00030
00031 #include "CEGUIFormattedRenderedString.h"
00032 #include "CEGUIJustifiedRenderedString.h"
00033 #include "CEGUIVector.h"
00034 #include <vector>
00035
00036
00037 namespace CEGUI
00038 {
00044 template <typename T>
00045 class RenderedStringWordWrapper : public FormattedRenderedString
00046 {
00047 public:
00049 RenderedStringWordWrapper(const RenderedString& string);
00051 ~RenderedStringWordWrapper();
00052
00053
00054 void format(const Size& area_size);
00055 void draw(GeometryBuffer& buffer, const Vector2& position,
00056 const ColourRect* mod_colours, const Rect* clip_rect) const;
00057 size_t getFormattedLineCount() const;
00058 float getHorizontalExtent() const;
00059 float getVerticalExtent() const;
00060
00061 protected:
00063 void deleteFormatters();
00065 typedef std::vector<FormattedRenderedString*> LineList;
00067 LineList d_lines;
00068 };
00069
00071 template <> CEGUIEXPORT
00072 void RenderedStringWordWrapper<JustifiedRenderedString>::format(const Size& area_size);
00073
00074
00075 template <typename T>
00076 RenderedStringWordWrapper<T>::RenderedStringWordWrapper(
00077 const RenderedString& string) :
00078 FormattedRenderedString(string)
00079 {
00080 }
00081
00082
00083 template <typename T>
00084 RenderedStringWordWrapper<T>::~RenderedStringWordWrapper()
00085 {
00086 deleteFormatters();
00087 }
00088
00089
00090 template <typename T>
00091 void RenderedStringWordWrapper<T>::format(const Size& area_size)
00092 {
00093 deleteFormatters();
00094
00095 RenderedString rstring, lstring;
00096 rstring = *d_renderedString;
00097 float rs_width;
00098
00099 T* frs;
00100
00101 for (size_t line = 0; line < rstring.getLineCount(); ++line)
00102 {
00103 while ((rs_width = rstring.getPixelSize(line).d_width) > 0)
00104 {
00105
00106 if (rs_width <= area_size.d_width)
00107 break;
00108
00109
00110 rstring.split(line, area_size.d_width, lstring);
00111 frs = new T(*new RenderedString(lstring));
00112 frs->format(area_size);
00113 d_lines.push_back(frs);
00114 line = 0;
00115 }
00116 }
00117
00118
00119 frs = new T(*new RenderedString(rstring));
00120 frs->format(area_size);
00121 d_lines.push_back(frs);
00122 }
00123
00124
00125 template <typename T>
00126 void RenderedStringWordWrapper<T>::draw(GeometryBuffer& buffer,
00127 const Vector2& position,
00128 const ColourRect* mod_colours,
00129 const Rect* clip_rect) const
00130 {
00131 Vector2 line_pos(position);
00132 typename LineList::const_iterator i = d_lines.begin();
00133 for (; i != d_lines.end(); ++i)
00134 {
00135 (*i)->draw(buffer, line_pos, mod_colours, clip_rect);
00136 line_pos.d_y += (*i)->getVerticalExtent();
00137 }
00138 }
00139
00140
00141 template <typename T>
00142 size_t RenderedStringWordWrapper<T>::getFormattedLineCount() const
00143 {
00144 return d_lines.size();
00145 }
00146
00147
00148 template <typename T>
00149 float RenderedStringWordWrapper<T>::getHorizontalExtent() const
00150 {
00151
00152
00153 float w = 0;
00154 typename LineList::const_iterator i = d_lines.begin();
00155 for (; i != d_lines.end(); ++i)
00156 {
00157 const float cur_width = (*i)->getHorizontalExtent();
00158 if (cur_width > w)
00159 w = cur_width;
00160 }
00161
00162 return w;
00163 }
00164
00165
00166 template <typename T>
00167 float RenderedStringWordWrapper<T>::getVerticalExtent() const
00168 {
00169
00170
00171 float h = 0;
00172 typename LineList::const_iterator i = d_lines.begin();
00173 for (; i != d_lines.end(); ++i)
00174 h += (*i)->getVerticalExtent();
00175
00176 return h;
00177 }
00178
00179
00180 template <typename T>
00181 void RenderedStringWordWrapper<T>::deleteFormatters()
00182 {
00183 for (size_t i = 0; i < d_lines.size(); ++i)
00184 {
00185
00186 const RenderedString* rs = &d_lines[i]->getRenderedString();
00187
00188 delete d_lines[i];
00189
00190 delete rs;
00191 }
00192
00193 d_lines.clear();
00194 }
00195
00196
00197
00198 }
00199
00200 #endif // end of guard _CEGUIRenderedStringWordWrapper_h_