// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
-#ifdef HAVE_CONFIG_H
-# include "../config.h"
-#endif
+#include "config.h"
#include "label.hh"
#include "display.hh"
_text(""),
_justify_horz(RenderStyle::LeftTopJustify),
_justify_vert(RenderStyle::LeftTopJustify),
- _highlight(true)
+ _highlight(false)
{
styleChanged(*RenderStyle::style(screen()));
}
std::string s = text.c_str(); // use a normal string, for its functionality
_parsedtext.clear();
+ _text = text;
// parse it into multiple lines
std::string::size_type p = 0;
while (p != std::string::npos) {
std::string::size_type p2 = s.find('\n', p);
- _parsedtext.push_back(s.substr(p, (p2==std::string::npos?p2:p2-p)));
+ std::string s(s.substr(p, (p2==std::string::npos?p2:p2-p)));
+
+ // turn tabs into spaces (multiples of 8)
+ std::string::size_type t;
+ while ((t = s.find('\t')) != std::string::npos)
+ s.replace(t, 1, std::string(8 - t % 8, ' '));
+
+ _parsedtext.push_back(s);
_parsedtext.back().setUtf8(utf);
p = (p2==std::string::npos?p2:p2+1);
}
void Label::calcDefaultSizes()
{
- unsigned int longest = 0;
+ int longest = 0;
// find the longest line
std::vector<ustring>::iterator it, end = _parsedtext.end();
for (it = _parsedtext.begin(); it != end; ++it) {
- unsigned int length = _font->measureString(*it);
+ int length = _font->measureString(*it);
+ if (length < 0) continue; // lines too long get skipped
if (length > longest) longest = length;
}
setMinSize(Size(longest + borderWidth() * 2 + bevel() * 4,
_texture = style.labelUnfocusBackground();
_forecolor = style.textUnfocusColor();
}
- _font = style.labelFont();
- Widget::styleChanged(style);
- calcDefaultSizes();
+ if (_font != style.labelFont()) {
+ _font = style.labelFont();
+ calcDefaultSizes();
+ }
}
void Label::renderForeground(Surface &surface)
{
const RenderControl *control = display->renderControl(screen());
- unsigned int sidemargin = bevel() * 2;
+ int sidemargin = bevel() * 2;
int y = bevel();
- unsigned int w = area().width() - borderWidth() * 2 - sidemargin * 2;
- unsigned int h = area().height() - borderWidth() * 2 - bevel() * 2;
+ int w = area().width() - borderWidth() * 2 - sidemargin * 2;
+ int h = area().height() - borderWidth() * 2 - bevel() * 2;
switch (_justify_vert) {
case RenderStyle::RightBottomJustify:
// find a string that will fit inside the area for text
ustring::size_type text_len = t.size();
- unsigned int length;
+ int length;
do {
t.resize(text_len);
length = _font->measureString(t);
} while (length > w && text_len-- > 0);
+ if (length < 0) continue; // lines too long get skipped
if (text_len <= 0) continue; // won't fit anything