1 #include <lib/gui/elabel.h>
2 #include <lib/gdi/font.h>
4 eLabel::eLabel(eWidget *parent, int markedPos): eWidget(parent)
7 ePtr<eWindowStyle> style;
10 style->getFont(eWindowStyle::fontStatic, m_font);
12 /* default to topleft alignment */
16 m_have_foreground_color = 0;
17 m_have_shadow_color = 0;
20 int eLabel::event(int event, void *data, void *data2)
26 ePtr<eWindowStyle> style;
30 eWidget::event(event, data, data2);
32 gPainter &painter = *(gPainter*)data2;
36 style->setStyle(painter, eWindowStyle::styleLabel);
37 ePtr<eTextPara> para = new eTextPara(eRect(0, 0, size().width(), size().height()));
38 para->setFont(m_font);
39 para->renderString(m_text.empty()?0:m_text.c_str(), 0);
40 para->realign(eTextPara::dirLeft);
41 int glyphs = para->size();
43 if ((m_pos < 0) || (m_pos >= glyphs))
44 eWarning("glyph index %d in eLabel out of bounds!", m_pos);
47 para->setGlyphFlag(m_pos, GS_INVERT);
49 bbox = para->getGlyphBBox(m_pos);
50 bbox = eRect(bbox.left(), 0, bbox.width(), size().height());
54 painter.renderPara(para, ePoint(0, 0));
58 painter.setFont(m_font);
59 style->setStyle(painter, eWindowStyle::styleLabel);
61 if (m_have_shadow_color)
62 painter.setForegroundColor(m_shadow_color);
63 else if (m_have_foreground_color)
64 painter.setForegroundColor(m_foreground_color);
67 if (m_valign == alignTop)
68 flags |= gPainter::RT_VALIGN_TOP;
69 else if (m_valign == alignCenter)
70 flags |= gPainter::RT_VALIGN_CENTER;
71 else if (m_valign == alignBottom)
72 flags |= gPainter::RT_VALIGN_BOTTOM;
74 if (m_halign == alignLeft)
75 flags |= gPainter::RT_HALIGN_LEFT;
76 else if (m_halign == alignCenter)
77 flags |= gPainter::RT_HALIGN_CENTER;
78 else if (m_halign == alignRight)
79 flags |= gPainter::RT_HALIGN_RIGHT;
80 else if (m_halign == alignBlock)
81 flags |= gPainter::RT_HALIGN_BLOCK;
83 flags |= gPainter::RT_WRAP;
85 /* if we don't have shadow, m_shadow_offset will be 0,0 */
86 painter.renderText(eRect(-m_shadow_offset.x(), -m_shadow_offset.y(), size().width(), size().height()), m_text, flags);
88 if (m_have_shadow_color)
90 if (!m_have_foreground_color)
91 style->setStyle(painter, eWindowStyle::styleLabel);
93 painter.setForegroundColor(m_foreground_color);
94 painter.setBackgroundColor(m_shadow_color);
95 painter.renderText(eRect(0, 0, size().width(), size().height()), m_text, flags);
103 case evtChangedAlignment:
104 case evtChangedMarkedPos:
108 return eWidget::event(event, data, data2);
112 void eLabel::setText(const std::string &string)
114 if (m_text == string)
117 event(evtChangedText);
120 void eLabel::setMarkedPos(int markedPos)
123 event(evtChangedMarkedPos);
126 void eLabel::setFont(gFont *font)
129 event(evtChangedFont);
132 gFont* eLabel::getFont()
137 void eLabel::setVAlign(int align)
140 event(evtChangedAlignment);
143 void eLabel::setHAlign(int align)
146 event(evtChangedAlignment);
149 void eLabel::setForegroundColor(const gRGB &col)
151 if ((!m_have_foreground_color) || !(m_foreground_color == col))
153 m_foreground_color = col;
154 m_have_foreground_color = 1;
159 void eLabel::setShadowColor(const gRGB &col)
161 if ((!m_have_shadow_color) || !(m_shadow_color == col))
163 m_shadow_color = col;
164 m_have_shadow_color = 1;
169 void eLabel::setShadowOffset(const ePoint &offset)
171 m_shadow_offset = offset;
174 void eLabel::clearForegroundColor()
176 if (m_have_foreground_color)
178 m_have_foreground_color = 0;
183 eSize eLabel::calculateSize()
185 ePtr<eTextPara> p = new eTextPara(eRect(0, 0, size().width(), size().height()));
188 p->renderString(m_text.empty()?0:m_text.c_str(), RS_WRAP);
190 eRect bbox = p->getBoundBox();