summaryrefslogtreecommitdiff
path: root/widgets/FormattedListboxTextItem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/FormattedListboxTextItem.cpp')
-rw-r--r--widgets/FormattedListboxTextItem.cpp165
1 files changed, 165 insertions, 0 deletions
diff --git a/widgets/FormattedListboxTextItem.cpp b/widgets/FormattedListboxTextItem.cpp
new file mode 100644
index 0000000..b9362cc
--- /dev/null
+++ b/widgets/FormattedListboxTextItem.cpp
@@ -0,0 +1,165 @@
+#include "FormattedListboxTextItem.h"
+
+namespace CEGUI
+{
+//----------------------------------------------------------------------------//
+FormattedListboxTextItem::FormattedListboxTextItem(const String& text,
+ const HorizontalTextFormatting format,
+ const uint item_id,
+ void* const item_data,
+ const bool disabled,
+ const bool auto_delete) :
+ // initialise base class
+ ListboxTextItem(text, item_id, item_data, disabled, auto_delete),
+ // initialise subclass fields
+ d_formatting(format),
+ d_formattedRenderedString(0)
+{
+}
+
+//----------------------------------------------------------------------------//
+FormattedListboxTextItem::~FormattedListboxTextItem()
+{
+ delete d_formattedRenderedString;
+}
+
+//----------------------------------------------------------------------------//
+HorizontalTextFormatting FormattedListboxTextItem::getFormatting() const
+{
+ return d_formatting;
+}
+
+//----------------------------------------------------------------------------//
+void FormattedListboxTextItem::setFormatting(const HorizontalTextFormatting fmt)
+{
+ if (fmt == d_formatting)
+ return;
+
+ d_formatting = fmt;
+ delete d_formattedRenderedString;
+ d_formattedRenderedString = 0;
+ d_formattingAreaSize = Size(0, 0);
+}
+
+//----------------------------------------------------------------------------//
+Size FormattedListboxTextItem::getPixelSize(void) const
+{
+ if (!d_owner)
+ return Size(0, 0);
+
+ // reparse text if we need to.
+ if (!d_renderedStringValid)
+ parseTextString();
+
+ // create formatter if needed
+ if (!d_formattedRenderedString)
+ setupStringFormatter();
+
+ // get size of render area from target window, to see if we need to reformat
+ const Size area_sz(static_cast<const Listbox*>(d_owner)->
+ getListRenderArea().getSize());
+ if (area_sz != d_formattingAreaSize)
+ {
+ d_formattedRenderedString->format(area_sz);
+ d_formattingAreaSize = area_sz;
+ }
+
+ return Size(d_formattedRenderedString->getHorizontalExtent(),
+ d_formattedRenderedString->getVerticalExtent());
+}
+
+//----------------------------------------------------------------------------//
+void FormattedListboxTextItem::draw(GeometryBuffer& buffer,
+ const Rect& targetRect,
+ float alpha, const Rect* clipper) const
+{
+ // reparse text if we need to.
+ if (!d_renderedStringValid)
+ parseTextString();
+
+ // create formatter if needed
+ if (!d_formattedRenderedString)
+ setupStringFormatter();
+
+ // get size of render area from target window, to see if we need to reformat
+ // NB: We do not use targetRect, since it may not represent the same area.
+ const Size area_sz(static_cast<const Listbox*>(d_owner)->
+ getListRenderArea().getSize());
+ if (area_sz != d_formattingAreaSize)
+ {
+ d_formattedRenderedString->format(area_sz);
+ d_formattingAreaSize = area_sz;
+ }
+
+ // draw selection imagery
+ if (d_selected && d_selectBrush != 0)
+ d_selectBrush->draw(buffer, targetRect, clipper,
+ getModulateAlphaColourRect(d_selectCols, alpha));
+
+ // factor the window alpha into our colours.
+ const ColourRect final_colours(
+ getModulateAlphaColourRect(ColourRect(0xFFFFFFFF), alpha));
+
+ // draw the formatted text
+ d_formattedRenderedString->draw(buffer, targetRect.getPosition(),
+ &final_colours, clipper);
+}
+
+//----------------------------------------------------------------------------//
+void FormattedListboxTextItem::setupStringFormatter() const
+{
+ // delete any existing formatter
+ delete d_formattedRenderedString;
+ d_formattedRenderedString = 0;
+
+ // create new formatter of whichever type...
+ switch(d_formatting)
+ {
+ case HTF_LEFT_ALIGNED:
+ d_formattedRenderedString =
+ new LeftAlignedRenderedString(d_renderedString);
+ break;
+
+ case HTF_RIGHT_ALIGNED:
+ d_formattedRenderedString =
+ new RightAlignedRenderedString(d_renderedString);
+ break;
+
+ case HTF_CENTRE_ALIGNED:
+ d_formattedRenderedString =
+ new CentredRenderedString(d_renderedString);
+ break;
+
+ case HTF_JUSTIFIED:
+ d_formattedRenderedString =
+ new JustifiedRenderedString(d_renderedString);
+ break;
+
+ case HTF_WORDWRAP_LEFT_ALIGNED:
+ d_formattedRenderedString =
+ new RenderedStringWordWrapper
+ <LeftAlignedRenderedString>(d_renderedString);
+ break;
+
+ case HTF_WORDWRAP_RIGHT_ALIGNED:
+ d_formattedRenderedString =
+ new RenderedStringWordWrapper
+ <RightAlignedRenderedString>(d_renderedString);
+ break;
+
+ case HTF_WORDWRAP_CENTRE_ALIGNED:
+ d_formattedRenderedString =
+ new RenderedStringWordWrapper
+ <CentredRenderedString>(d_renderedString);
+ break;
+
+ case HTF_WORDWRAP_JUSTIFIED:
+ d_formattedRenderedString =
+ new RenderedStringWordWrapper
+ <JustifiedRenderedString>(d_renderedString);
+ break;
+ }
+}
+
+//----------------------------------------------------------------------------//
+}