1 /*
2 * Copyright (c) 2008 Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
3 * Distributed under the terms of the MIT/X11 license.
4 *
5 * Copyright (c) 1999 Mike Steed. You are free to use and distribute this software
6 * as long as it is accompanied by it's documentation and this copyright notice.
7 * The software comes with no warranty, etc.
8 */
9
10
11 #include "InfoWindow.h"
12
13 #include <stdio.h>
14 #include <string.h>
15 #include <time.h>
16 #include <utility>
17 #include <vector>
18
19 #include <Catalog.h>
20 #include <StringFormat.h>
21 #include <StringForSize.h>
22 #include <StringView.h>
23 #include <Bitmap.h>
24 #include <NodeInfo.h>
25
26 #include "DiskUsage.h"
27 #include "Snapshot.h"
28
29 using std::string;
30 using std::vector;
31 using std::pair;
32
33 #undef B_TRANSLATION_CONTEXT
34 #define B_TRANSLATION_CONTEXT "Info Window"
35
LeftView(BRect frame,BBitmap * icon)36 LeftView::LeftView(BRect frame, BBitmap* icon)
37 :
38 BView(frame, NULL, B_FOLLOW_NONE, B_WILL_DRAW),
39 fIcon(icon)
40 {
41 SetViewColor(tint_color(kWindowColor, B_LIGHTEN_1_TINT));
42 }
43
44
~LeftView()45 LeftView::~LeftView()
46 {
47 delete fIcon;
48 }
49
50
51 void
Draw(BRect updateRect)52 LeftView::Draw(BRect updateRect)
53 {
54 float right = Bounds().Width() - kSmallHMargin;
55 BRect iconRect(right - 31.0, kSmallVMargin, right, kSmallVMargin + 31.0);
56 if (updateRect.Intersects(iconRect)) {
57 SetDrawingMode(B_OP_OVER);
58 DrawBitmap(fIcon, iconRect);
59 }
60 }
61
62
InfoWin(BPoint p,FileInfo * f,BWindow * parent)63 InfoWin::InfoWin(BPoint p, FileInfo *f, BWindow* parent)
64 : BWindow(BRect(p, p), kEmptyStr, B_FLOATING_WINDOW_LOOK,
65 B_FLOATING_SUBSET_WINDOW_FEEL,
66 B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE)
67 {
68 AddToSubset(parent);
69
70 typedef pair<string, string> Item;
71 typedef vector<Item> InfoList;
72
73 BString stringTitle("%refName% info");
74 stringTitle.ReplaceFirst("%refName%", f->ref.name);
75 SetTitle(stringTitle.String());
76
77 InfoList info;
78 Item item;
79
80 // Size
81 BString name;
82 if (f->count > 0) {
83 // This is a directory, include file count information
84 static BStringFormat format(B_TRANSLATE(
85 "%size% in {0, plural, one{# file} other{# files}}"));
86
87 format.Format(name, f->count);
88 } else
89 name = "%size%";
90
91 char tmp[B_PATH_NAME_LENGTH] = { 0 };
92 string_for_size(f->size, tmp, sizeof(tmp));
93 name.ReplaceFirst("%size%", tmp);
94
95 info.push_back(Item(B_TRANSLATE_MARK("Size"), name.String()));
96
97 // Created & modified dates
98 BEntry entry(&f->ref);
99 time_t t;
100 entry.GetCreationTime(&t);
101 strftime(tmp, 64, B_TRANSLATE("%a, %d %b %Y, %r"), localtime(&t));
102 info.push_back(Item(B_TRANSLATE("Created"), tmp));
103 entry.GetModificationTime(&t);
104 strftime(tmp, 64, B_TRANSLATE("%a, %d %b %Y, %r"), localtime(&t));
105 info.push_back(Item(B_TRANSLATE("Modified"), tmp));
106
107 // Kind
108 BMimeType* type = f->Type();
109 type->GetShortDescription(tmp);
110 info.push_back(Item(B_TRANSLATE("Kind"), tmp));
111 delete type;
112
113 // Path
114 string path;
115 f->GetPath(path);
116 info.push_back(Item(B_TRANSLATE("Path"), path));
117
118 // Icon
119 BBitmap *icon = new BBitmap(BRect(0.0, 0.0, 31.0, 31.0), B_RGBA32);
120 entry_ref ref;
121 entry.GetRef(&ref);
122 BNodeInfo::GetTrackerIcon(&ref, icon, B_LARGE_ICON);
123
124 // Compute the window size and add the views.
125 BFont smallFont(be_plain_font);
126 smallFont.SetSize(floorf(smallFont.Size() * 0.95));
127
128 struct font_height fh;
129 smallFont.GetHeight(&fh);
130 float fontHeight = fh.ascent + fh.descent + fh.leading;
131
132 float leftWidth = 32.0;
133 float rightWidth = 0.0;
134 InfoList::iterator i = info.begin();
135 while (i != info.end()) {
136 float w = smallFont.StringWidth((*i).first.c_str())
137 + 2.0 * kSmallHMargin;
138 leftWidth = max_c(leftWidth, w);
139 w = smallFont.StringWidth((*i).second.c_str()) + 2.0 * kSmallHMargin;
140 rightWidth = max_c(rightWidth, w);
141 i++;
142 }
143
144 float winHeight = 32.0 + 4.0 * kSmallVMargin + 5.0 * (fontHeight
145 + kSmallVMargin);
146 float winWidth = leftWidth + rightWidth;
147 ResizeTo(winWidth, winHeight);
148
149 LeftView *leftView = new LeftView(BRect(0.0, 0.0, leftWidth, winHeight),
150 icon);
151 BView *rightView = new BView(
152 BRect(leftWidth + 1.0, 0.0, winWidth, winHeight), NULL,
153 B_FOLLOW_NONE, B_WILL_DRAW);
154
155 AddChild(leftView);
156 AddChild(rightView);
157
158 BStringView *sv = new BStringView(
159 BRect(kSmallHMargin, kSmallVMargin, rightView->Bounds().Width(),
160 kSmallVMargin + 30.0), NULL, f->ref.name, B_FOLLOW_ALL);
161
162 BFont largeFont(be_plain_font);
163 largeFont.SetSize(ceilf(largeFont.Size() * 1.1));
164 sv->SetFont(&largeFont);
165 rightView->AddChild(sv);
166
167 float y = 32.0 + 4.0 * kSmallVMargin;
168 i = info.begin();
169 while (i != info.end()) {
170 sv = new BStringView(
171 BRect(kSmallHMargin, y, leftView->Bounds().Width(),
172 y + fontHeight), NULL, (*i).first.c_str());
173 sv->SetFont(&smallFont);
174 sv->SetAlignment(B_ALIGN_RIGHT);
175 sv->SetHighColor(kBasePieColor[1]); // arbitrary
176 leftView->AddChild(sv);
177
178 sv = new BStringView(
179 BRect(kSmallHMargin, y, rightView->Bounds().Width(),
180 y + fontHeight), NULL, (*i).second.c_str());
181 sv->SetFont(&smallFont);
182 rightView->AddChild(sv);
183
184 y += fontHeight + kSmallVMargin;
185 i++;
186 }
187
188 Show();
189 }
190
191
~InfoWin()192 InfoWin::~InfoWin()
193 {
194 }
195