xref: /haiku/src/apps/diskusage/StatusView.cpp (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2  * Copyright (c) 2010 Philippe St-Pierre <stpere@gmail.com>. All rights reserved.
3  * Copyright (c) 2008 Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
4  * Distributed under the terms of the MIT/X11 license.
5  *
6  * Copyright (c) 1999 Mike Steed. You are free to use and distribute this software
7  * as long as it is accompanied by it's documentation and this copyright notice.
8  * The software comes with no warranty, etc.
9  */
10 
11 
12 #include "StatusView.h"
13 
14 #include <math.h>
15 #include <stdio.h>
16 
17 #include <Catalog.h>
18 #include <Box.h>
19 #include <Button.h>
20 #include <MessageFormat.h>
21 #include <Node.h>
22 #include <String.h>
23 #include <StringForSize.h>
24 #include <StringView.h>
25 
26 #include <LayoutBuilder.h>
27 
28 #include "DiskUsage.h"
29 #include "Scanner.h"
30 
31 #undef B_TRANSLATION_CONTEXT
32 #define B_TRANSLATION_CONTEXT "Status View"
33 
34 StatusView::StatusView()
35 	:
36 	BView(NULL, B_WILL_DRAW),
37 	fCurrentFileInfo(NULL)
38 {
39 	SetViewColor(kPieBGColor);
40 	SetLowColor(kPieBGColor);
41 
42 	fSizeView = new BStringView(NULL, kEmptyStr);
43 	fSizeView->SetExplicitMinSize(BSize(StringWidth("9999.99 GiB"),
44 		B_SIZE_UNSET));
45 	fSizeView->SetExplicitMaxSize(BSize(StringWidth("9999.99 GiB"),
46 		B_SIZE_UNSET));
47 
48 	char testLabel[256];
49 	snprintf(testLabel, sizeof(testLabel), B_TRANSLATE_COMMENT("%d files",
50 		"For UI layouting only, use the longest plural form for your language"),
51 		999999);
52 
53 	fCountView = new BStringView(NULL, kEmptyStr);
54 	float width, height;
55 	fCountView->GetPreferredSize(&width, &height);
56 	fCountView->SetExplicitMinSize(BSize(StringWidth(testLabel),
57 		B_SIZE_UNSET));
58 	fCountView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, height));
59 
60 	fPathView = new BStringView(NULL, kEmptyStr);
61 	fPathView->GetPreferredSize(&width, &height);
62 	fPathView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, height));
63 
64 	fRefreshBtn = new BButton(NULL, B_TRANSLATE("Scan"),
65 		new BMessage(kBtnRescan));
66 
67 	fRefreshBtn->SetExplicitMaxSize(BSize(B_SIZE_UNSET, B_SIZE_UNLIMITED));
68 
69 	BBox* divider1 = new BBox(BRect(), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
70 		B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
71 
72 	BBox* divider2 = new BBox(BRect(), B_EMPTY_STRING, B_FOLLOW_ALL_SIDES,
73 		B_WILL_DRAW | B_FRAME_EVENTS, B_FANCY_BORDER);
74 
75 	divider1->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1));
76 	divider2->SetExplicitMaxSize(BSize(1, B_SIZE_UNLIMITED));
77 
78 	SetLayout(new BGroupLayout(B_VERTICAL));
79 
80 	AddChild(BLayoutBuilder::Group<>(B_HORIZONTAL, 0)
81 		.AddGroup(B_VERTICAL, 0)
82 			.Add(fPathView)
83 			.Add(divider1)
84 			.AddGroup(B_HORIZONTAL, 0)
85 				.Add(fCountView)
86 				.Add(divider2)
87 				.Add(fSizeView)
88 				.End()
89 			.End()
90 		.AddStrut(kSmallHMargin)
91 		.Add(fRefreshBtn)
92 		.SetInsets(kSmallVMargin, kSmallVMargin, kSmallVMargin, kSmallVMargin)
93 	);
94 }
95 
96 
97 StatusView::~StatusView()
98 {
99 }
100 
101 
102 void
103 StatusView::EnableRescan()
104 {
105 	fRefreshBtn->SetLabel(B_TRANSLATE("Rescan"));
106 	fRefreshBtn->SetMessage(new BMessage(kBtnRescan));
107 }
108 
109 
110 void
111 StatusView::EnableCancel()
112 {
113 	fRefreshBtn->SetLabel(B_TRANSLATE("Abort"));
114 	fRefreshBtn->SetMessage(new BMessage(kBtnCancel));
115 }
116 
117 
118 void
119 StatusView::ShowInfo(const FileInfo* info)
120 {
121 	if (info == fCurrentFileInfo)
122 		return;
123 
124 	fCurrentFileInfo = info;
125 
126 	if (info == NULL) {
127 		fPathView->SetText(kEmptyStr);
128 		fSizeView->SetText(kEmptyStr);
129 		fCountView->SetText(kEmptyStr);
130 		return;
131 	}
132 
133 	if (!info->pseudo) {
134 		BNode node(&info->ref);
135 		if (node.InitCheck() != B_OK) {
136 			fPathView->SetText(B_TRANSLATE("file unavailable"));
137 			fSizeView->SetText(kEmptyStr);
138 			fCountView->SetText(kEmptyStr);
139 			return;
140 		}
141 	}
142 
143 	float viewWidth = fPathView->Bounds().Width();
144 	string path;
145 	info->GetPath(path);
146 	BString pathLabel = path.c_str();
147 	be_plain_font->TruncateString(&pathLabel, B_TRUNCATE_BEGINNING, viewWidth);
148 	fPathView->SetText(pathLabel.String());
149 
150 	char label[B_PATH_NAME_LENGTH];
151 	string_for_size(info->size, label, sizeof(label));
152 	fSizeView->SetText(label);
153 
154 	if (info->count > 0) {
155 		static BMessageFormat format(B_TRANSLATE("{0, plural, "
156 			"one{# file} other{# files}}"));
157 		BString label;
158 		format.Format(label, info->count);
159 		fCountView->SetText(label);
160 	} else {
161 		fCountView->SetText(kEmptyStr);
162 	}
163 }
164