xref: /haiku/src/apps/diskusage/StatusView.cpp (revision f75a7bf508f3156d63a14f8fd77c5e0ca4d08c42)
1*f75a7bf5SStephan Aßmus /*
2*f75a7bf5SStephan Aßmus  * Copyright (c) 2008 Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
3*f75a7bf5SStephan Aßmus  * Distributed under the terms of the MIT/X11 license.
4*f75a7bf5SStephan Aßmus  *
5*f75a7bf5SStephan Aßmus  * Copyright (c) 1999 Mike Steed. You are free to use and distribute this software
6*f75a7bf5SStephan Aßmus  * as long as it is accompanied by it's documentation and this copyright notice.
7*f75a7bf5SStephan Aßmus  * The software comes with no warranty, etc.
8*f75a7bf5SStephan Aßmus  */
9*f75a7bf5SStephan Aßmus #include "StatusView.h"
10*f75a7bf5SStephan Aßmus 
11*f75a7bf5SStephan Aßmus #include <math.h>
12*f75a7bf5SStephan Aßmus #include <stdio.h>
13*f75a7bf5SStephan Aßmus 
14*f75a7bf5SStephan Aßmus #include <Box.h>
15*f75a7bf5SStephan Aßmus #include <Node.h>
16*f75a7bf5SStephan Aßmus #include <String.h>
17*f75a7bf5SStephan Aßmus #include <StringView.h>
18*f75a7bf5SStephan Aßmus 
19*f75a7bf5SStephan Aßmus #include "Common.h"
20*f75a7bf5SStephan Aßmus #include "Scanner.h"
21*f75a7bf5SStephan Aßmus 
22*f75a7bf5SStephan Aßmus 
23*f75a7bf5SStephan Aßmus StatusView::StatusView(BRect r)
24*f75a7bf5SStephan Aßmus 	: BView(r, NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM, B_WILL_DRAW),
25*f75a7bf5SStephan Aßmus 	  fCurrentFileInfo(NULL)
26*f75a7bf5SStephan Aßmus {
27*f75a7bf5SStephan Aßmus 	SetViewColor(kWindowColor);
28*f75a7bf5SStephan Aßmus 
29*f75a7bf5SStephan Aßmus 	struct font_height fh;
30*f75a7bf5SStephan Aßmus 	be_plain_font->GetHeight(&fh);
31*f75a7bf5SStephan Aßmus 	float plainHeight = ceilf(fh.ascent) + ceilf(fh.descent)
32*f75a7bf5SStephan Aßmus 		+ ceilf(fh.leading);
33*f75a7bf5SStephan Aßmus 	float fixedHeight = ceilf(fh.ascent) + ceilf(fh.descent)
34*f75a7bf5SStephan Aßmus 		+ ceilf(fh.leading);
35*f75a7bf5SStephan Aßmus 	ResizeTo(Bounds().Width(),
36*f75a7bf5SStephan Aßmus 		2.0 * kSmallVMargin + max(plainHeight, fixedHeight));
37*f75a7bf5SStephan Aßmus 
38*f75a7bf5SStephan Aßmus 	BRect r = Bounds();
39*f75a7bf5SStephan Aßmus 	r.top += kSmallVMargin;
40*f75a7bf5SStephan Aßmus 
41*f75a7bf5SStephan Aßmus 	// Size display
42*f75a7bf5SStephan Aßmus 	r.right -= kSmallHMargin;
43*f75a7bf5SStephan Aßmus 	r.left = r.right - StringWidth("9999.99 GB");
44*f75a7bf5SStephan Aßmus 	fSizeView = new BStringView(r, NULL, kEmptyStr,
45*f75a7bf5SStephan Aßmus 		B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM);
46*f75a7bf5SStephan Aßmus 	AddChild(fSizeView);
47*f75a7bf5SStephan Aßmus 
48*f75a7bf5SStephan Aßmus 	// Vertical divider
49*f75a7bf5SStephan Aßmus 	r.right = r.left - kSmallHMargin;
50*f75a7bf5SStephan Aßmus 	r.left = r.right - 1.0;
51*f75a7bf5SStephan Aßmus 	AddChild(new BBox(r.InsetByCopy(0, -5), NULL,
52*f75a7bf5SStephan Aßmus 		B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM));
53*f75a7bf5SStephan Aßmus 
54*f75a7bf5SStephan Aßmus 	// Count display
55*f75a7bf5SStephan Aßmus 	char testLabel[256];
56*f75a7bf5SStephan Aßmus 	sprintf(testLabel, kManyFiles, 999999);
57*f75a7bf5SStephan Aßmus 	r.right = r.left - kSmallHMargin;
58*f75a7bf5SStephan Aßmus 	r.left = r.right - (StringWidth(testLabel) + kSmallHMargin);
59*f75a7bf5SStephan Aßmus 	fCountView = new BStringView(r, NULL, kEmptyStr,
60*f75a7bf5SStephan Aßmus 		B_FOLLOW_RIGHT|B_FOLLOW_TOP_BOTTOM);
61*f75a7bf5SStephan Aßmus 	AddChild(fCountView);
62*f75a7bf5SStephan Aßmus 
63*f75a7bf5SStephan Aßmus 	// Vertical divider
64*f75a7bf5SStephan Aßmus 	r.right = r.left - kSmallHMargin;
65*f75a7bf5SStephan Aßmus 	r.left = r.right - 1.0;
66*f75a7bf5SStephan Aßmus 	AddChild(new BBox(r.InsetByCopy(0, -5), NULL,
67*f75a7bf5SStephan Aßmus 		B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM));
68*f75a7bf5SStephan Aßmus 
69*f75a7bf5SStephan Aßmus 	// Path display
70*f75a7bf5SStephan Aßmus 	r.right = r.left - kSmallHMargin;
71*f75a7bf5SStephan Aßmus 	r.left = kSmallHMargin;
72*f75a7bf5SStephan Aßmus 	fPathView = new BStringView(r, NULL, kEmptyStr,
73*f75a7bf5SStephan Aßmus 		B_FOLLOW_LEFT_RIGHT|B_FOLLOW_TOP_BOTTOM);
74*f75a7bf5SStephan Aßmus 	AddChild(fPathView);
75*f75a7bf5SStephan Aßmus 
76*f75a7bf5SStephan Aßmus 	// Horizontal divider
77*f75a7bf5SStephan Aßmus 	r = Bounds();
78*f75a7bf5SStephan Aßmus 	r.bottom = r.top + 1.0;
79*f75a7bf5SStephan Aßmus 	AddChild(new BBox(r.InsetByCopy(-5, 0), NULL,
80*f75a7bf5SStephan Aßmus 		B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM, B_WILL_DRAW));
81*f75a7bf5SStephan Aßmus }
82*f75a7bf5SStephan Aßmus 
83*f75a7bf5SStephan Aßmus 
84*f75a7bf5SStephan Aßmus StatusView::~StatusView()
85*f75a7bf5SStephan Aßmus {
86*f75a7bf5SStephan Aßmus }
87*f75a7bf5SStephan Aßmus 
88*f75a7bf5SStephan Aßmus 
89*f75a7bf5SStephan Aßmus void
90*f75a7bf5SStephan Aßmus StatusView::Show(const FileInfo* info)
91*f75a7bf5SStephan Aßmus {
92*f75a7bf5SStephan Aßmus 	if (info == fCurrentFileInfo)
93*f75a7bf5SStephan Aßmus 		return;
94*f75a7bf5SStephan Aßmus 
95*f75a7bf5SStephan Aßmus 	fCurrentFileInfo = info;
96*f75a7bf5SStephan Aßmus 
97*f75a7bf5SStephan Aßmus 	if (info == NULL) {
98*f75a7bf5SStephan Aßmus 		fPathView->SetText(kEmptyStr);
99*f75a7bf5SStephan Aßmus 		fSizeView->SetText(kEmptyStr);
100*f75a7bf5SStephan Aßmus 		fCountView->SetText(kEmptyStr);
101*f75a7bf5SStephan Aßmus 		return;
102*f75a7bf5SStephan Aßmus 	}
103*f75a7bf5SStephan Aßmus 
104*f75a7bf5SStephan Aßmus 	if (!info->pseudo) {
105*f75a7bf5SStephan Aßmus 		BNode node(&info->ref);
106*f75a7bf5SStephan Aßmus 		if (node.InitCheck() != B_OK) {
107*f75a7bf5SStephan Aßmus 			fPathView->SetText(kStrUnavail);
108*f75a7bf5SStephan Aßmus 			fSizeView->SetText(kEmptyStr);
109*f75a7bf5SStephan Aßmus 			fCountView->SetText(kEmptyStr);
110*f75a7bf5SStephan Aßmus 			return;
111*f75a7bf5SStephan Aßmus 		}
112*f75a7bf5SStephan Aßmus 	}
113*f75a7bf5SStephan Aßmus 
114*f75a7bf5SStephan Aßmus 	float viewWidth = fPathView->Bounds().Width();
115*f75a7bf5SStephan Aßmus 	string path;
116*f75a7bf5SStephan Aßmus 	info->GetPath(path);
117*f75a7bf5SStephan Aßmus 	BString pathLabel = path.c_str();
118*f75a7bf5SStephan Aßmus 	be_plain_font->TruncateString(&pathLabel, B_TRUNCATE_BEGINNING, viewWidth);
119*f75a7bf5SStephan Aßmus 	fPathView->SetText(pathLabel.String());
120*f75a7bf5SStephan Aßmus 
121*f75a7bf5SStephan Aßmus 	char label[B_PATH_NAME_LENGTH];
122*f75a7bf5SStephan Aßmus 	size_to_string(info->size, label);
123*f75a7bf5SStephan Aßmus 	fSizeView->SetText(label);
124*f75a7bf5SStephan Aßmus 
125*f75a7bf5SStephan Aßmus 	if (info->count > 0) {
126*f75a7bf5SStephan Aßmus 		char label[256];
127*f75a7bf5SStephan Aßmus 		sprintf(label, (info->count == 1) ? kOneFile : kManyFiles, info->count);
128*f75a7bf5SStephan Aßmus 		fCountView->SetText(label);
129*f75a7bf5SStephan Aßmus 	} else {
130*f75a7bf5SStephan Aßmus 		fCountView->SetText(kEmptyStr);
131*f75a7bf5SStephan Aßmus 	}
132*f75a7bf5SStephan Aßmus }
133*f75a7bf5SStephan Aßmus 
134*f75a7bf5SStephan Aßmus 
135