1/* 2 * Copyright 2003-2010, Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Fernando Francisco de Oliveira 7 * Michael Wilber 8 * Axel D��rfler, axeld@pinc-software.de 9 */ 10 11 12#include "ShowImageStatusView.h" 13 14#include <ControlLook.h> 15#include <Entry.h> 16#include <MenuItem.h> 17#include <NumberFormat.h> 18#include <Path.h> 19#include <PopUpMenu.h> 20#include <ScrollView.h> 21#include <StatusView.h> 22 23#include <tracker_private.h> 24#include "DirMenu.h" 25 26#include "ShowImageView.h" 27#include "ShowImageWindow.h" 28 29const float kHorzSpacing = 5.f; 30 31 32ShowImageStatusView::ShowImageStatusView() 33 : 34 BView("statusview", B_WILL_DRAW), 35 fPreferredSize(0.0, 0.0) 36{ 37 memset(fCellWidth, 0, sizeof(fCellWidth)); 38} 39 40 41void 42ShowImageStatusView::AttachedToWindow() 43{ 44 SetFont(be_plain_font); 45 BPrivate::AdoptScrollBarFontSize(this); 46 47 AdoptParentColors(); 48 49 ResizeToPreferred(); 50} 51 52 53void 54ShowImageStatusView::GetPreferredSize(float* _width, float* _height) 55{ 56 _ValidatePreferredSize(); 57 58 if (_width) 59 *_width = fPreferredSize.width; 60 61 if (_height) 62 *_height = fPreferredSize.height; 63} 64 65 66void 67ShowImageStatusView::ResizeToPreferred() 68{ 69 float width, height; 70 GetPreferredSize(&width, &height); 71 72 if (Bounds().Width() > width) 73 width = Bounds().Width(); 74 75 BView::ResizeTo(width, height); 76} 77 78 79void 80ShowImageStatusView::Draw(BRect updateRect) 81{ 82 if (fPreferredSize.width <= 0) 83 return; 84 85 if (be_control_look != NULL) { 86 BRect bounds(Bounds()); 87 be_control_look->DrawMenuBarBackground(this, 88 bounds, updateRect, ViewColor()); 89 } 90 91 BRect bounds(Bounds()); 92 rgb_color highColor = ui_color(B_PANEL_TEXT_COLOR); 93 94 SetHighColor(tint_color(ViewColor(), B_DARKEN_2_TINT)); 95 StrokeLine(bounds.LeftTop(), bounds.RightTop()); 96 97 float x = bounds.left; 98 for (size_t i = 0; i < kStatusCellCount - 1; i++) { 99 x += fCellWidth[i]; 100 StrokeLine(BPoint(x, bounds.top + 3), BPoint(x, bounds.bottom - 3)); 101 } 102 103 SetLowColor(ViewColor()); 104 SetHighColor(highColor); 105 106 font_height fontHeight; 107 GetFontHeight(&fontHeight); 108 109 x = bounds.left; 110 float y = (bounds.bottom + bounds.top 111 + ceilf(fontHeight.ascent) - ceilf(fontHeight.descent)) / 2; 112 113 for (size_t i = 0; i < kStatusCellCount; i++) { 114 if (fCellText[i].Length() == 0) 115 continue; 116 DrawString(fCellText[i], BPoint(x + kHorzSpacing, y)); 117 x += fCellWidth[i]; 118 } 119} 120 121 122void 123ShowImageStatusView::MouseDown(BPoint where) 124{ 125 BPrivate::BDirMenu* menu = new BDirMenu(NULL, BMessenger(kTrackerSignature), 126 B_REFS_RECEIVED); 127 BEntry entry; 128 if (entry.SetTo(&fRef) == B_OK) 129 menu->Populate(&entry, Window(), false, false, true, false, true); 130 else 131 menu->Populate(NULL, Window(), false, false, true, false, true); 132 133 BPoint point = Bounds().LeftBottom(); 134 point.y += 3; 135 ConvertToScreen(&point); 136 BRect clickToOpenRect(Bounds()); 137 ConvertToScreen(&clickToOpenRect); 138 menu->Go(point, true, true, clickToOpenRect); 139 delete menu; 140} 141 142 143void 144ShowImageStatusView::Update(const entry_ref& ref, const BString& text, 145 const BString& pages, const BString& imageType, float zoom) 146{ 147 fRef = ref; 148 149 _SetFrameText(text); 150 _SetZoomText(zoom); 151 _SetPagesText(pages); 152 _SetImageTypeText(imageType); 153 154 _ValidatePreferredSize(); 155 Invalidate(); 156} 157 158 159void 160ShowImageStatusView::SetZoom(float zoom) 161{ 162 _SetZoomText(zoom); 163 _ValidatePreferredSize(); 164 Invalidate(); 165} 166 167 168void 169ShowImageStatusView::_SetFrameText(const BString& text) 170{ 171 fCellText[kFrameSizeCell] = text; 172} 173 174 175void 176ShowImageStatusView::_SetZoomText(float zoom) 177{ 178 BNumberFormat numberFormat; 179 BString data; 180 numberFormat.FormatPercent(data, zoom); 181 182 fCellText[kZoomCell] = data; 183} 184 185 186void 187ShowImageStatusView::_SetPagesText(const BString& pages) 188{ 189 fCellText[kPagesCell] = pages; 190} 191 192 193void 194ShowImageStatusView::_SetImageTypeText(const BString& imageType) 195{ 196 fCellText[kImageTypeCell] = imageType; 197} 198 199 200void 201ShowImageStatusView::_ValidatePreferredSize() 202{ 203 // width 204 fPreferredSize.width = 0.f; 205 for (size_t i = 0; i < kStatusCellCount; i++) { 206 if (fCellText[i].Length() == 0) { 207 fCellWidth[i] = 0; 208 continue; 209 } 210 float width = ceilf(StringWidth(fCellText[i])); 211 if (width > 0) 212 width += kHorzSpacing * 2; 213 fCellWidth[i] = width; 214 fPreferredSize.width += fCellWidth[i]; 215 } 216 217 // height 218 font_height fontHeight; 219 GetFontHeight(&fontHeight); 220 221 fPreferredSize.height = ceilf(fontHeight.ascent + fontHeight.descent 222 + fontHeight.leading); 223 224 float scrollBarSize = be_control_look->GetScrollBarWidth(B_HORIZONTAL); 225 if (fPreferredSize.height < scrollBarSize) 226 fPreferredSize.height = scrollBarSize; 227 228 SetExplicitMinSize(fPreferredSize); 229 SetExplicitMaxSize(fPreferredSize); 230} 231