Home | History | Annotate | Download | only in views
      1 #include "SkWidgetViews.h"
      2 #include "SkTextBox.h"
      3 
      4 #ifdef SK_DEBUG
      5 static void assert_no_attr(const SkDOM& dom, const SkDOM::Node* node, const char attr[])
      6 {
      7     const char* value = dom.findAttr(node, attr);
      8     if (value)
      9         SkDebugf("unknown attribute %s=\"%s\"\n", attr, value);
     10 }
     11 #else
     12     #define assert_no_attr(dom, node, attr)
     13 #endif
     14 
     15 SkStaticTextView::SkStaticTextView()
     16 {
     17 	fMargin.set(0, 0);
     18 	fMode = kFixedSize_Mode;
     19 	fSpacingAlign = SkTextBox::kStart_SpacingAlign;
     20 
     21 //	init_skin_paint(kStaticText_SkinEnum, &fPaint);
     22 }
     23 
     24 SkStaticTextView::~SkStaticTextView()
     25 {
     26 }
     27 
     28 void SkStaticTextView::computeSize()
     29 {
     30 	if (fMode == kAutoWidth_Mode)
     31 	{
     32 		SkScalar width = fPaint.measureText(fText.c_str(), fText.size());
     33 		this->setWidth(width + fMargin.fX * 2);
     34 	}
     35 	else if (fMode == kAutoHeight_Mode)
     36 	{
     37 		SkScalar width = this->width() - fMargin.fX * 2;
     38 		int lines = width > 0 ? SkTextLineBreaker::CountLines(fText.c_str(), fText.size(), fPaint, width) : 0;
     39 
     40 		this->setHeight(lines * fPaint.getFontSpacing() + fMargin.fY * 2);
     41 	}
     42 }
     43 
     44 void SkStaticTextView::setMode(Mode mode)
     45 {
     46 	SkASSERT((unsigned)mode < kModeCount);
     47 
     48 	if (fMode != mode)
     49 	{
     50 		fMode = SkToU8(mode);
     51 		this->computeSize();
     52 	}
     53 }
     54 
     55 void SkStaticTextView::setSpacingAlign(SkTextBox::SpacingAlign align)
     56 {
     57 	fSpacingAlign = SkToU8(align);
     58 	this->inval(NULL);
     59 }
     60 
     61 void SkStaticTextView::getMargin(SkPoint* margin) const
     62 {
     63 	if (margin)
     64 		*margin = fMargin;
     65 }
     66 
     67 void SkStaticTextView::setMargin(SkScalar dx, SkScalar dy)
     68 {
     69 	if (fMargin.fX != dx || fMargin.fY != dy)
     70 	{
     71 		fMargin.set(dx, dy);
     72 		this->computeSize();
     73 		this->inval(NULL);
     74 	}
     75 }
     76 
     77 size_t SkStaticTextView::getText(SkString* text) const
     78 {
     79 	if (text)
     80 		*text = fText;
     81 	return fText.size();
     82 }
     83 
     84 size_t SkStaticTextView::getText(char text[]) const
     85 {
     86 	if (text)
     87 		memcpy(text, fText.c_str(), fText.size());
     88 	return fText.size();
     89 }
     90 
     91 void SkStaticTextView::setText(const SkString& text)
     92 {
     93 	this->setText(text.c_str(), text.size());
     94 }
     95 
     96 void SkStaticTextView::setText(const char text[])
     97 {
     98 	if (text == NULL)
     99 		text = "";
    100 	this->setText(text, strlen(text));
    101 }
    102 
    103 void SkStaticTextView::setText(const char text[], size_t len)
    104 {
    105 	if (!fText.equals(text, len))
    106 	{
    107 		fText.set(text, len);
    108 		this->computeSize();
    109 		this->inval(NULL);
    110 	}
    111 }
    112 
    113 void SkStaticTextView::getPaint(SkPaint* paint) const
    114 {
    115 	if (paint)
    116 		*paint = fPaint;
    117 }
    118 
    119 void SkStaticTextView::setPaint(const SkPaint& paint)
    120 {
    121 	if (fPaint != paint)
    122 	{
    123 		fPaint = paint;
    124 		this->computeSize();
    125 		this->inval(NULL);
    126 	}
    127 }
    128 
    129 void SkStaticTextView::onDraw(SkCanvas* canvas)
    130 {
    131 	this->INHERITED::onDraw(canvas);
    132 
    133 	if (fText.isEmpty())
    134 		return;
    135 
    136 	SkTextBox	box;
    137 
    138 	box.setMode(fMode == kAutoWidth_Mode ? SkTextBox::kOneLine_Mode : SkTextBox::kLineBreak_Mode);
    139 	box.setSpacingAlign(this->getSpacingAlign());
    140 	box.setBox(fMargin.fX, fMargin.fY, this->width() - fMargin.fX, this->height() - fMargin.fY);
    141 	box.draw(canvas, fText.c_str(), fText.size(), fPaint);
    142 }
    143 
    144 void SkStaticTextView::onInflate(const SkDOM& dom, const SkDOM::Node* node)
    145 {
    146 #if 0
    147 	this->INHERITED::onInflate(dom, node);
    148 
    149 	int	index;
    150 	if ((index = dom.findList(node, "mode", "fixed,auto-width,auto-height")) >= 0)
    151 		this->setMode((Mode)index);
    152 	else
    153 		assert_no_attr(dom, node, "mode");
    154 
    155 	if ((index = dom.findList(node, "spacing-align", "start,center,end")) >= 0)
    156 		this->setSpacingAlign((SkTextBox::SpacingAlign)index);
    157 	else
    158 		assert_no_attr(dom, node, "spacing-align");
    159 
    160 	SkScalar s[2];
    161 	if (dom.findScalars(node, "margin", s, 2))
    162 		this->setMargin(s[0], s[1]);
    163 	else
    164 		assert_no_attr(dom, node, "margin");
    165 
    166 	const char* text = dom.findAttr(node, "text");
    167 	if (text)
    168 		this->setText(text);
    169 
    170 	if ((node = dom.getFirstChild(node, "paint")) != NULL &&
    171 		(node = dom.getFirstChild(node, "screenplay")) != NULL)
    172 	{
    173 		inflate_paint(dom, node, &fPaint);
    174 	}
    175 #endif
    176 }
    177 
    178