xref: /haiku/src/apps/debugger/user_interface/gui/value/TableCellValueRendererUtils.cpp (revision 9563f44bfd75799f67201067483694e82b5779b9)
1 /*
2  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "TableCellValueRendererUtils.h"
8 
9 #include <Font.h>
10 #include <String.h>
11 #include <View.h>
12 
13 
14 static const float kTextMargin = 8;
15 
16 
17 /*static*/ void
18 TableCellValueRendererUtils::DrawString(BView* view, BRect rect,
19 	const char* string, enum alignment alignment, bool truncate)
20 {
21 	// get font height info
22 	font_height	fontHeight;
23 	view->GetFontHeight(&fontHeight);
24 
25 	// truncate, if requested
26 	BString truncatedString;
27 	if (truncate) {
28 		truncatedString = string;
29 		view->TruncateString(&truncatedString, B_TRUNCATE_END,
30 			rect.Width() - 2 * kTextMargin + 2);
31 		string = truncatedString.String();
32 	}
33 
34 	// compute horizontal position according to alignment
35 	float x;
36 	switch (alignment) {
37 		default:
38 		case B_ALIGN_LEFT:
39 			x = rect.left + kTextMargin;
40 			break;
41 
42 		case B_ALIGN_CENTER:
43 			x = rect.left + (rect.Width() - view->StringWidth(string)) / 2;
44 			break;
45 
46 		case B_ALIGN_RIGHT:
47 			x = rect.right - kTextMargin - view->StringWidth(string);
48 			break;
49 	}
50 
51 	// compute vertical position (base line)
52 	float y = rect.top
53 		+ (rect.Height() - (fontHeight.ascent + fontHeight.descent
54 			+ fontHeight.leading)) / 2
55 		+ (fontHeight.ascent + fontHeight.descent) - 2;
56 		// TODO: This is the computation BColumnListView (respectively
57 		// BTitledColumn) is using, which I find somewhat weird.
58 
59 	view->DrawString(string, BPoint(x, y));
60 }
61 
62 
63 /*static*/ float
64 TableCellValueRendererUtils::PreferredStringWidth(BView* view,
65 	const char* string)
66 {
67 	return view->StringWidth(string) + 2 * kTextMargin;
68 }
69