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