1 /* 2 * Copyright 2007, Ingo Weinhold <bonefish@cs.tu-berlin.de>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 6 #include "StringView.h" 7 8 #include <math.h> 9 10 #include <View.h> 11 12 13 StringView::StringView(const char* string) 14 : View(), 15 fString(string), 16 fAlignment(B_ALIGN_LEFT), 17 fStringAscent(0), 18 fStringDescent(0), 19 fStringWidth(0), 20 fExplicitMinSize(B_SIZE_UNSET, B_SIZE_UNSET) 21 { 22 SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 23 fTextColor = (rgb_color){ 0, 0, 0, 255 }; 24 } 25 26 27 void 28 StringView::SetString(const char* string) 29 { 30 fString = string; 31 32 _UpdateStringMetrics(); 33 Invalidate(); 34 InvalidateLayout(); 35 } 36 37 38 void 39 StringView::SetAlignment(alignment align) 40 { 41 if (align != fAlignment) { 42 fAlignment = align; 43 Invalidate(); 44 } 45 } 46 47 48 void 49 StringView::SetTextColor(rgb_color color) 50 { 51 fTextColor = color; 52 Invalidate(); 53 } 54 55 56 BSize 57 StringView::MinSize() 58 { 59 BSize size(fExplicitMinSize); 60 if (!size.IsWidthSet()) 61 size.width = fStringWidth - 1; 62 if (!size.IsHeightSet()) 63 size.height = fStringAscent + fStringDescent - 1; 64 return size; 65 } 66 67 68 void 69 StringView::SetExplicitMinSize(BSize size) 70 { 71 fExplicitMinSize = size; 72 } 73 74 75 void 76 StringView::AddedToContainer() 77 { 78 _UpdateStringMetrics(); 79 } 80 81 82 void 83 StringView::Draw(BView* container, BRect updateRect) 84 { 85 BSize size(Size()); 86 int widthDiff = (int)size.width + 1 - (int)fStringWidth; 87 int heightDiff = (int)size.height + 1 88 - (int)(fStringAscent + (int)fStringDescent); 89 BPoint base; 90 91 // horizontal alignment 92 switch (fAlignment) { 93 case B_ALIGN_RIGHT: 94 base.x = widthDiff; 95 break; 96 case B_ALIGN_LEFT: 97 default: 98 base.x = 0; 99 break; 100 } 101 102 base.y = heightDiff / 2 + fStringAscent; 103 104 container->SetHighColor(fTextColor); 105 container->DrawString(fString.String(), base); 106 } 107 108 109 void 110 StringView::_UpdateStringMetrics() 111 { 112 BView* container = Container(); 113 if (!container) 114 return; 115 116 BFont font; 117 container->GetFont(&font); 118 119 font_height fh; 120 font.GetHeight(&fh); 121 122 fStringAscent = ceilf(fh.ascent); 123 fStringDescent = ceilf(fh.descent); 124 fStringWidth = font.StringWidth(fString.String()); 125 } 126