1// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2//
3//	Copyright (c) 2003-2004, Haiku
4//
5//  This software is part of the Haiku distribution and is covered
6//  by the MIT License.
7//
8//
9//  File:        ResourceUsageWindow.cpp
10//  Author:      Sikosis, J��r��me Duval
11//  Description: Devices Preferences
12//  Created :    July 19, 2003
13//
14// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
15
16
17// Includes ------------------------------------------------------------------
18#include <Box.h>
19#include <Catalog.h>
20#include <Screen.h>
21#include <ScrollView.h>
22#include <stdio.h>
23#include <strings.h>
24#include <TabView.h>
25
26#include "DevicesInfo.h"
27#include "DevicesWindows.h"
28
29#undef B_TRANSLATION_CONTEXT
30#define B_TRANSLATION_CONTEXT "ResourceUsageWindow"
31
32class IRQDMAItem : public BListItem
33{
34	public:
35		IRQDMAItem(int32 number, const char* name);
36		~IRQDMAItem();
37		virtual void DrawItem(BView *, BRect, bool = false);
38	private:
39		char* fName;
40		int32 fNumber;
41};
42
43
44IRQDMAItem::IRQDMAItem(int32 number, const char* name)
45	: BListItem(),
46	fNumber(number)
47{
48	fName = strdup(name);
49}
50
51IRQDMAItem::~IRQDMAItem()
52{
53	free(fName);
54}
55
56/***********************************************************
57 * DrawItem
58 ***********************************************************/
59void
60IRQDMAItem::DrawItem(BView *owner, BRect itemRect, bool complete)
61{
62	rgb_color kBlack = { 0,0,0,0 };
63	rgb_color kHighlight = { 156,154,156,0 };
64
65	if (IsSelected() || complete) {
66		rgb_color color;
67		if (IsSelected())
68			color = kHighlight;
69		else
70			color = owner->ViewColor();
71
72		owner->SetHighColor(color);
73		owner->SetLowColor(color);
74		owner->FillRect(itemRect);
75		owner->SetHighColor(kBlack);
76
77	} else {
78		owner->SetLowColor(owner->ViewColor());
79	}
80
81	BFont font = be_plain_font;
82	font_height	finfo;
83	font.GetHeight(&finfo);
84
85	BPoint point = BPoint(itemRect.left + 5, itemRect.bottom - finfo.descent + 1);
86
87	owner->SetHighColor(kBlack);
88	owner->SetFont(be_plain_font);
89	owner->MovePenTo(point);
90	if (fNumber > -1) {
91		char string[2];
92		sprintf(string, "%ld", fNumber);
93		owner->DrawString(string);
94	}
95	point += BPoint(28, 0);
96	owner->MovePenTo(point);
97	owner->DrawString(fName);
98}
99
100class RangeItem : public BListItem
101{
102	public:
103		RangeItem(uint32 lowAddress, uint32 highAddress, const char* name);
104		~RangeItem();
105		virtual void DrawItem(BView *, BRect, bool = false);
106		static int Compare(const void *firstArg, const void *secondArg);
107	private:
108		char* fName;
109		uint32 fLowAddress, fHighAddress;
110};
111
112
113RangeItem::RangeItem(uint32 lowAddress, uint32 highAddress, const char* name)
114	: BListItem(),
115	fLowAddress(lowAddress),
116	fHighAddress(highAddress)
117{
118	fName = strdup(name);
119}
120
121RangeItem::~RangeItem()
122{
123	free(fName);
124}
125
126/***********************************************************
127 * DrawItem
128 ***********************************************************/
129void
130RangeItem::DrawItem(BView *owner, BRect itemRect, bool complete)
131{
132	rgb_color kBlack = { 0,0,0,0 };
133	rgb_color kHighlight = { 156,154,156,0 };
134
135	if (IsSelected() || complete) {
136		rgb_color color;
137		if (IsSelected())
138			color = kHighlight;
139		else
140			color = owner->ViewColor();
141
142		owner->SetHighColor(color);
143		owner->SetLowColor(color);
144		owner->FillRect(itemRect);
145		owner->SetHighColor(kBlack);
146
147	} else {
148		owner->SetLowColor(owner->ViewColor());
149	}
150
151	BFont font = be_plain_font;
152	font_height	finfo;
153	font.GetHeight(&finfo);
154
155	BPoint point = BPoint(itemRect.left + 17, itemRect.bottom - finfo.descent + 1);
156	owner->SetFont(be_fixed_font);
157	owner->SetHighColor(kBlack);
158	owner->MovePenTo(point);
159
160	if (fLowAddress >= 0) {
161		char string[255];
162		sprintf(string, "0x%04lx - 0x%04lx", fLowAddress, fHighAddress);
163		owner->DrawString(string);
164	}
165	point += BPoint(174, 0);
166	owner->SetFont(be_plain_font);
167	owner->MovePenTo(point);
168	owner->DrawString(fName);
169}
170
171int
172RangeItem::Compare(const void *firstArg, const void *secondArg)
173{
174	const RangeItem *item1 = *static_cast<const RangeItem * const *>(firstArg);
175	const RangeItem *item2 = *static_cast<const RangeItem * const *>(secondArg);
176
177	if (item1->fLowAddress < item2->fLowAddress) {
178		return -1;
179	} else if (item1->fLowAddress > item2->fLowAddress) {
180		return 1;
181	} else
182		return 0;
183
184}
185
186
187// ----------------------------------------------------------------------------
188
189
190// ResourceUsageWindow - Constructor
191ResourceUsageWindow::ResourceUsageWindow(BRect frame, BList &list)
192	: BWindow (frame, B_TRANSLATE("Resource Usage"), B_TITLED_WINDOW_LOOK,
193		B_NORMAL_WINDOW_FEEL , B_NOT_ZOOMABLE|B_NOT_RESIZABLE)
194{
195	InitWindow(list);
196	CenterOnScreen();
197	Show();
198}
199// ----------------------------------------------------------------------------
200
201
202// ResourceUsageWindow - Destructor
203ResourceUsageWindow::~ResourceUsageWindow()
204{
205
206}
207// ----------------------------------------------------------------------------
208
209
210// ResourceUsageWindow::InitWindow -- Initialization Commands here
211void ResourceUsageWindow::InitWindow(BList &list)
212{
213	BRect rtab = Bounds();
214	BRect rlist = Bounds();
215	rtab.top += 10;
216	rlist.top += 10;
217	rlist.left += 12;
218	rlist.right -= 15 + B_V_SCROLL_BAR_WIDTH;
219	rlist.bottom -= 47;
220
221	// Create the TabView and Tabs
222	BTabView *tabView = new BTabView(rtab,"resource_usage_tabview");
223	tabView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
224
225	rtab = tabView->Bounds();
226	rtab.InsetBy(5,5);
227
228	// Create the ListViews
229	BListView *IRQListView = new BListView(rlist, "IRQListView",
230		B_SINGLE_SELECTION_LIST, B_FOLLOW_LEFT | B_FOLLOW_TOP,
231		B_WILL_DRAW | B_NAVIGABLE);
232	BListView *DMAListView = new BListView(rlist, "DMAListView",
233		B_SINGLE_SELECTION_LIST, B_FOLLOW_LEFT | B_FOLLOW_TOP,
234		B_WILL_DRAW | B_NAVIGABLE);
235	BListView *IORangeListView = new BListView(rlist, "IORangeListView",
236		B_SINGLE_SELECTION_LIST, B_FOLLOW_LEFT | B_FOLLOW_TOP,
237		B_WILL_DRAW | B_NAVIGABLE);
238	BListView *memoryListView = new BListView(rlist, "memoryListView",
239		B_SINGLE_SELECTION_LIST, B_FOLLOW_LEFT | B_FOLLOW_TOP,
240		B_WILL_DRAW | B_NAVIGABLE);
241
242	BScrollView *IRQScrollView = new BScrollView("scroll_list1", IRQListView,
243		B_FOLLOW_LEFT|B_FOLLOW_TOP, 0, false, true, B_FANCY_BORDER);
244	BScrollView *DMAScrollView = new BScrollView("scroll_list2", DMAListView,
245		B_FOLLOW_LEFT|B_FOLLOW_TOP, 0, false, true, B_FANCY_BORDER);
246	BScrollView *IORangeScrollView = new BScrollView("scroll_list3",
247		IORangeListView, B_FOLLOW_LEFT|B_FOLLOW_TOP, 0, false, true,
248		B_FANCY_BORDER);
249	BScrollView *memoryScrollView = new BScrollView("scroll_list4",
250		memoryListView, B_FOLLOW_LEFT|B_FOLLOW_TOP, 0, false, true,
251		B_FANCY_BORDER);
252
253	BTab *tab = new BTab();
254	tabView->AddTab(IRQScrollView, tab);
255	tab->SetLabel(B_TRANSLATE("IRQ"));
256	tab = new BTab();
257	tabView->AddTab(DMAScrollView, tab);
258	tab->SetLabel(B_TRANSLATE("DMA"));
259	tab = new BTab();
260	tabView->AddTab(IORangeScrollView, tab);
261	tab->SetLabel(B_TRANSLATE("IO Range"));
262	tab = new BTab();
263	tabView->AddTab(memoryScrollView, tab);
264	tab->SetLabel(B_TRANSLATE("Memory Range"));
265
266	{
267		uint32 mask = 1;
268
269		for (int i=0;i<16;mask<<=1,i++) {
270			bool first = true;
271
272			for (int32 j=0; j<list.CountItems(); j++) {
273				DevicesInfo *deviceInfo = (DevicesInfo *)list.ItemAt(j);
274				struct device_configuration *current = deviceInfo->GetCurrent();
275				resource_descriptor r;
276
277				int32 num = count_resource_descriptors_of_type(current,
278					B_IRQ_RESOURCE);
279
280				for (int32 k=0;k<num;k++) {
281					get_nth_resource_descriptor_of_type(current, k, B_IRQ_RESOURCE,
282							&r, sizeof(resource_descriptor));
283
284					if (mask & r.d.m.mask) {
285						IRQListView->AddItem(new IRQDMAItem(first ? i : -1,
286							deviceInfo->GetCardName()));
287						first = false;
288					}
289				}
290			}
291
292			if (first) {
293				IRQListView->AddItem(new IRQDMAItem(i, ""));
294			}
295		}
296	}
297
298	{
299		uint32 mask = 1;
300
301		for (int i=0;i<8;mask<<=1,i++) {
302			bool first = true;
303
304			for (int32 j=0; j<list.CountItems(); j++) {
305				DevicesInfo *deviceInfo = (DevicesInfo *)list.ItemAt(j);
306				struct device_configuration *current = deviceInfo->GetCurrent();
307				resource_descriptor r;
308
309				int32 num = count_resource_descriptors_of_type(current,
310					B_DMA_RESOURCE);
311
312				for (int32 k=0;k<num;k++) {
313					get_nth_resource_descriptor_of_type(current, k,
314						B_DMA_RESOURCE,	&r, sizeof(resource_descriptor));
315
316					if (mask & r.d.m.mask) {
317						DMAListView->AddItem(new IRQDMAItem(first ? i : -1,
318							deviceInfo->GetCardName()));
319						first = false;
320					}
321				}
322			}
323
324			if (first) {
325				DMAListView->AddItem(new IRQDMAItem(i, ""));
326			}
327		}
328	}
329
330	{
331		for (int32 j=0; j<list.CountItems(); j++) {
332			DevicesInfo *deviceInfo = (DevicesInfo *)list.ItemAt(j);
333			struct device_configuration *current = deviceInfo->GetCurrent();
334			resource_descriptor r;
335
336			int32 num = count_resource_descriptors_of_type(current,
337				B_IO_PORT_RESOURCE);
338
339			for (int32 k=0;k<num;k++) {
340				get_nth_resource_descriptor_of_type(current, k,
341					B_IO_PORT_RESOURCE,	&r, sizeof(resource_descriptor));
342
343				IORangeListView->AddItem(new RangeItem(r.d.r.minbase,
344					r.d.r.minbase + r.d.r.len - 1, deviceInfo->GetCardName()));
345			}
346		}
347
348		IORangeListView->SortItems(&RangeItem::Compare);
349	}
350
351	{
352		for (int32 j=0; j<list.CountItems(); j++) {
353			DevicesInfo *deviceInfo = (DevicesInfo *)list.ItemAt(j);
354			struct device_configuration *current = deviceInfo->GetCurrent();
355			resource_descriptor r;
356
357			int32 num = count_resource_descriptors_of_type(current,
358				B_MEMORY_RESOURCE);
359
360			for (int32 k=0;k<num;k++) {
361				get_nth_resource_descriptor_of_type(current, k, B_MEMORY_RESOURCE,
362						&r, sizeof(resource_descriptor));
363
364				memoryListView->AddItem(new RangeItem(r.d.r.minbase,
365					r.d.r.minbase + r.d.r.len - 1, deviceInfo->GetCardName()));
366			}
367		}
368
369		memoryListView->SortItems(&RangeItem::Compare);
370	}
371
372
373	BBox *background = new BBox(Bounds(), "background");
374	background->SetBorder(B_NO_BORDER);
375	AddChild(background);
376	background->AddChild(tabView);
377}
378// ----------------------------------------------------------------------------
379
380
381// ResourceUsageWindow::MessageReceived -- receives messages
382void
383ResourceUsageWindow::MessageReceived (BMessage *message)
384{
385	switch(message->what)
386	{
387		default:
388			BWindow::MessageReceived(message);
389			break;
390	}
391}
392// ----------------------------------------------------------------------------
393