1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
2 // Copyright (C) 2016 Nathanaƫl Courant
3 // Modified this class to work with EnrichedStrings too
4 // This file is part of the "Irrlicht Engine".
5 // For conditions of distribution and use, see copyright notice in irrlicht.h
9 #include "IrrCompileConfig.h"
10 #ifdef _IRR_COMPILE_WITH_GUI_
12 #include "IGUIStaticText.h"
19 #include "util/enriched_string.h"
21 #include <IGUIEnvironment.h>
31 const EGUI_ELEMENT_TYPE EGUIET_ENRICHED_STATIC_TEXT = (EGUI_ELEMENT_TYPE)(0x1000);
33 class StaticText : public IGUIStaticText
38 StaticText(const EnrichedString &text, bool border, IGUIEnvironment* environment,
39 IGUIElement* parent, s32 id, const core::rect<s32>& rectangle,
40 bool background = false);
43 virtual ~StaticText();
45 //! draws the element and its children
48 //! Sets another skin independent font.
49 virtual void setOverrideFont(IGUIFont* font=0);
51 //! Gets the override font (if any)
52 virtual IGUIFont* getOverrideFont() const;
54 //! Get the font which is used right now for drawing
55 virtual IGUIFont* getActiveFont() const;
57 //! Sets another color for the text.
58 virtual void setOverrideColor(video::SColor color);
60 //! Sets another color for the background.
61 virtual void setBackgroundColor(video::SColor color);
63 //! Sets whether to draw the background
64 virtual void setDrawBackground(bool draw);
66 //! Gets the background color
67 virtual video::SColor getBackgroundColor() const;
69 //! Checks if background drawing is enabled
70 virtual bool isDrawBackgroundEnabled() const;
72 //! Sets whether to draw the border
73 virtual void setDrawBorder(bool draw);
75 //! Checks if border drawing is enabled
76 virtual bool isDrawBorderEnabled() const;
78 //! Sets alignment mode for text
79 virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical);
81 //! Gets the override color
82 #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7
83 virtual const video::SColor& getOverrideColor() const;
85 virtual video::SColor getOverrideColor() const;
88 //! Sets if the static text should use the overide color or the
89 //! color in the gui skin.
90 virtual void enableOverrideColor(bool enable);
92 //! Checks if an override color is enabled
93 virtual bool isOverrideColorEnabled() const;
95 //! Set whether the text in this label should be clipped if it goes outside bounds
96 virtual void setTextRestrainedInside(bool restrainedInside);
98 //! Checks if the text in this label should be clipped if it goes outside bounds
99 virtual bool isTextRestrainedInside() const;
101 //! Enables or disables word wrap for using the static text as
102 //! multiline text control.
103 virtual void setWordWrap(bool enable);
105 //! Checks if word wrap is enabled
106 virtual bool isWordWrapEnabled() const;
108 //! Sets the new caption of this element.
109 virtual void setText(const wchar_t* text);
111 //! Returns the height of the text in pixels when it is drawn.
112 virtual s32 getTextHeight() const;
114 //! Returns the width of the current text, in the current font
115 virtual s32 getTextWidth() const;
117 //! Updates the absolute position, splits text if word wrap is enabled
118 virtual void updateAbsolutePosition();
120 //! Set whether the string should be interpreted as right-to-left (RTL) text
121 /** \note This component does not implement the Unicode bidi standard, the
122 text of the component should be already RTL if you call this. The
123 main difference when RTL is enabled is that the linebreaks for multiline
124 elements are performed starting from the end.
126 virtual void setRightToLeft(bool rtl);
128 //! Checks if the text should be interpreted as right-to-left text
129 virtual bool isRightToLeft() const;
131 //! Writes attributes of the element.
132 virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const;
134 //! Reads attributes of the element
135 virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options);
137 virtual bool hasType(EGUI_ELEMENT_TYPE t) const {
138 return (t == EGUIET_ENRICHED_STATIC_TEXT) || (t == EGUIET_STATIC_TEXT);
141 virtual bool hasType(EGUI_ELEMENT_TYPE t) {
142 return (t == EGUIET_ENRICHED_STATIC_TEXT) || (t == EGUIET_STATIC_TEXT);
145 void setText(const EnrichedString &text);
149 //! Breaks the single text line.
152 EGUI_ALIGNMENT HAlign, VAlign;
154 bool OverrideColorEnabled;
155 bool OverrideBGColorEnabled;
158 bool RestrainTextInside;
161 video::SColor OverrideColor, BGColor;
162 gui::IGUIFont* OverrideFont;
163 gui::IGUIFont* LastBreakFont; // stored because: if skin changes, line break must be recalculated.
165 EnrichedString cText;
166 core::array< EnrichedString > BrokenText;
170 } // end namespace gui
172 } // end namespace irr
174 inline irr::gui::IGUIStaticText *addStaticText(
175 irr::gui::IGUIEnvironment *guienv,
176 const EnrichedString &text,
177 const core::rect< s32 > &rectangle,
179 bool wordWrap = true,
180 irr::gui::IGUIElement *parent = NULL,
182 bool fillBackground = false)
184 if (parent == NULL) {
185 // parent is NULL, so we must find one, or we need not to drop
186 // result, but then there will be a memory leak.
188 // What Irrlicht does is to use guienv as a parent, but the problem
189 // is that guienv is here only an IGUIEnvironment, while it is a
190 // CGUIEnvironment in Irrlicht, which inherits from both IGUIElement
191 // and IGUIEnvironment.
193 // A solution would be to dynamic_cast guienv to a
194 // IGUIElement*, but Irrlicht is shipped without rtti support
195 // in some distributions, causing the dymanic_cast to segfault.
197 // Thus, to find the parent, we create a dummy StaticText and ask
198 // for its parent, and then remove it.
199 irr::gui::IGUIStaticText *dummy_text =
200 guienv->addStaticText(L"", rectangle, border, wordWrap,
201 parent, id, fillBackground);
202 parent = dummy_text->getParent();
203 dummy_text->remove();
205 irr::gui::IGUIStaticText *result = new irr::gui::StaticText(
206 text, border, guienv, parent,
207 id, rectangle, fillBackground);
209 result->setWordWrap(wordWrap);
214 inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text)
216 // dynamic_cast not possible due to some distributions shipped
217 // without rtti support in irrlicht
218 if (static_text->hasType(irr::gui::EGUIET_ENRICHED_STATIC_TEXT)) {
219 irr::gui::StaticText* stext = static_cast<irr::gui::StaticText*>(static_text);
220 stext->setText(text);
222 static_text->setText(text.c_str());
226 #else // USE_FREETYPE
228 inline irr::gui::IGUIStaticText *addStaticText(
229 irr::gui::IGUIEnvironment *guienv,
230 const EnrichedString &text,
231 const core::rect< s32 > &rectangle,
233 bool wordWrap = true,
234 irr::gui::IGUIElement *parent = NULL,
236 bool fillBackground = false)
238 return guienv->addStaticText(text.c_str(), rectangle, border, wordWrap, parent, id, fillBackground);
241 inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text)
243 static_text->setText(text.c_str());
248 inline irr::gui::IGUIStaticText *addStaticText(
249 irr::gui::IGUIEnvironment *guienv,
251 const core::rect< s32 > &rectangle,
253 bool wordWrap = true,
254 irr::gui::IGUIElement *parent = NULL,
256 bool fillBackground = false) {
257 return addStaticText(guienv, EnrichedString(text), rectangle, border, wordWrap, parent, id, fillBackground);
260 inline void setStaticText(irr::gui::IGUIStaticText *static_text, const wchar_t *text)
262 setStaticText(static_text, EnrichedString(text));
265 #endif // _IRR_COMPILE_WITH_GUI_