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