1/* 2 * Copyright 2004-2008, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * J��r��me Duval 7 */ 8 9#include "TeamListItem.h" 10 11#include <string.h> 12 13#include <ControlLook.h> 14#include <FindDirectory.h> 15#include <LocaleRoster.h> 16#include <NodeInfo.h> 17#include <Path.h> 18#include <View.h> 19 20 21bool gLocalizedNamePreferred; 22 23 24TeamListItem::TeamListItem(team_info &teamInfo) 25 : 26 fTeamInfo(teamInfo), 27 fAppInfo(), 28 fMiniIcon(BRect(BPoint(0, 0), be_control_look->ComposeIconSize(B_MINI_ICON)), B_RGBA32), 29 fLargeIcon(BRect(BPoint(0, 0), be_control_look->ComposeIconSize(B_LARGE_ICON)), B_RGBA32), 30 fFound(false), 31 fRefusingToQuit(false) 32{ 33 int32 cookie = 0; 34 image_info info; 35 if (get_next_image_info(teamInfo.team, &cookie, &info) == B_OK) { 36 fPath = BPath(info.name); 37 BNode node(info.name); 38 BNodeInfo nodeInfo(&node); 39 nodeInfo.GetTrackerIcon(&fMiniIcon, (icon_size)-1); 40 nodeInfo.GetTrackerIcon(&fLargeIcon, (icon_size)-1); 41 } 42 43 if (be_roster->GetRunningAppInfo(fTeamInfo.team, &fAppInfo) != B_OK) 44 fAppInfo.signature[0] = '\0'; 45 46 CacheLocalizedName(); 47} 48 49 50TeamListItem::~TeamListItem() 51{ 52} 53 54 55void 56TeamListItem::CacheLocalizedName() 57{ 58 if (BLocaleRoster::Default()->GetLocalizedFileName(fLocalizedName, 59 fAppInfo.ref, true) != B_OK) 60 fLocalizedName = fPath.Leaf(); 61} 62 63 64void 65TeamListItem::DrawItem(BView* owner, BRect frame, bool complete) 66{ 67 rgb_color kHighlight = ui_color(B_LIST_SELECTED_BACKGROUND_COLOR); 68 rgb_color kHighlightText = ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR); 69 rgb_color kText = ui_color(B_LIST_ITEM_TEXT_COLOR); 70 71 rgb_color kIdealRed = { 255, 0, 0, 0 }; 72 rgb_color kIdealBlue = { 0, 0, 255, 0 }; 73 rgb_color kRed = mix_color(kIdealRed, kText, 191); 74 rgb_color kBlue = mix_color(kIdealBlue, kText, 191); 75 rgb_color kHighlightRed = mix_color(kIdealRed, kHighlightText, 191); 76 rgb_color kHighlightBlue = mix_color(kIdealBlue, kHighlightText, 191); 77 78 BRect r(frame); 79 80 if (IsSelected() || complete) { 81 owner->SetHighColor(kHighlight); 82 owner->SetLowColor(kHighlight); 83 owner->FillRect(r); 84 } 85 86 frame.left += 4; 87 BRect iconFrame(frame); 88 iconFrame.Set(iconFrame.left, iconFrame.top + 1, 89 iconFrame.left + fMiniIcon.Bounds().Width(), 90 iconFrame.top + fMiniIcon.Bounds().Height() + 1); 91 owner->SetDrawingMode(B_OP_ALPHA); 92 owner->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); 93 owner->DrawBitmap(&fMiniIcon, iconFrame); 94 owner->SetDrawingMode(B_OP_COPY); 95 96 frame.left += fMiniIcon.Bounds().Width(); 97 if (fRefusingToQuit) 98 owner->SetHighColor(IsSelected() ? kHighlightRed : kRed); 99 else { 100 if (IsSystemServer()) 101 owner->SetHighColor(IsSelected() ? kHighlightBlue : kBlue); 102 else 103 owner->SetHighColor(IsSelected() ? kHighlightText : kText); 104 } 105 BFont font = be_plain_font; 106 font_height finfo; 107 font.GetHeight(&finfo); 108 owner->SetFont(&font); 109 owner->MovePenTo(frame.left + (fMiniIcon.Bounds().Width() / 2), 110 frame.top + ((frame.Height() 111 - (finfo.ascent + finfo.descent + finfo.leading)) / 2) 112 + finfo.ascent); 113 114 if (gLocalizedNamePreferred) 115 owner->DrawString(fLocalizedName.String()); 116 else 117 owner->DrawString(fPath.Leaf()); 118} 119 120 121int32 122TeamListItem::MinimalHeight() 123{ 124 return fMiniIcon.Bounds().IntegerHeight() + 125 (int32)(be_control_look->DefaultLabelSpacing() / 3.0f); 126} 127 128 129void 130TeamListItem::Update(BView* owner, const BFont* font) 131{ 132 // we need to override the update method so we can make sure 133 // the list item size doesn't change 134 BListItem::Update(owner, font); 135 136 if (Height() < MinimalHeight()) 137 SetHeight(MinimalHeight()); 138} 139 140 141const team_info* 142TeamListItem::GetInfo() 143{ 144 return &fTeamInfo; 145} 146 147 148bool 149TeamListItem::IsSystemServer() 150{ 151 static bool firstCall = true; 152 static BPath systemServersPath; 153 static BPath trackerPath; 154 static BPath deskbarPath; 155 156 if (firstCall) { 157 find_directory(B_SYSTEM_SERVERS_DIRECTORY, &systemServersPath); 158 159 find_directory(B_SYSTEM_DIRECTORY, &trackerPath); 160 trackerPath.Append("Tracker"); 161 162 find_directory(B_SYSTEM_DIRECTORY, &deskbarPath); 163 deskbarPath.Append("Deskbar"); 164 165 firstCall = false; 166 } 167 168 if (strncmp(systemServersPath.Path(), fTeamInfo.args, 169 strlen(systemServersPath.Path())) == 0) 170 return true; 171 172 if (strncmp(trackerPath.Path(), fTeamInfo.args, 173 strlen(trackerPath.Path())) == 0) 174 return true; 175 176 if (strncmp(deskbarPath.Path(), fTeamInfo.args, 177 strlen(deskbarPath.Path())) == 0) 178 return true; 179 180 return false; 181} 182 183 184bool 185TeamListItem::IsApplication() const 186{ 187 return fAppInfo.signature[0] != '\0'; 188} 189 190 191void 192TeamListItem::SetRefusingToQuit(bool refusing) 193{ 194 fRefusingToQuit = refusing; 195} 196 197 198bool 199TeamListItem::IsRefusingToQuit() 200{ 201 return fRefusingToQuit; 202} 203