1/*
2	ProcessController © 2000, Georges-Edouard Berenger, All Rights Reserved.
3	Copyright (C) 2004 beunited.org
4
5	This library is free software; you can redistribute it and/or
6	modify it under the terms of the GNU Lesser General Public
7	License as published by the Free Software Foundation; either
8	version 2.1 of the License, or (at your option) any later version.
9
10	This library is distributed in the hope that it will be useful,
11	but WITHOUT ANY WARRANTY; without even the implied warranty of
12	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13	Lesser General Public License for more details.
14
15	You should have received a copy of the GNU Lesser General Public
16	License along with this library; if not, write to the Free Software
17	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18*/
19
20
21#include "PriorityMenu.h"
22#include "ProcessController.h"
23
24#include <Catalog.h>
25#include <MenuItem.h>
26#include <Window.h>
27
28#include <stdio.h>
29
30#undef B_TRANSLATION_CONTEXT
31#define B_TRANSLATION_CONTEXT "ProcessController"
32
33PriorityMenu::PriorityMenu(thread_id thread, int32 priority)
34	: BMenu(B_EMPTY_STRING),
35	fThreadID(thread),
36	fPriority(priority)
37{
38}
39
40
41void
42PriorityMenu::Update(int32 priority)
43{
44	if (priority != fPriority && CountItems() > 0)
45		RemoveItems(0, CountItems(), true);
46	if (CountItems() < 1)
47		BuildMenu();
48
49	fPriority = priority;
50}
51
52
53typedef struct {
54	const char*	name;
55	long		priority;
56} PriorityRec;
57
58static PriorityRec	priorities[] = {
59	{ B_TRANSLATE("Idle priority"),	0 },
60	{ B_TRANSLATE("Lowest active priority"), 1 },
61	{ B_TRANSLATE("Low priority"), 5 },
62	{ B_TRANSLATE("Normal priority"), 10 },
63	{ B_TRANSLATE("Display priority"), 15 },
64	{ B_TRANSLATE("Urgent display priority"), 20 },
65	{ B_TRANSLATE("Real-time display priority"), 100 },
66	{ B_TRANSLATE("Urgent priority"), 110 },
67	{ B_TRANSLATE("Real-time priority"), 120 },
68	{ "",	-1 }
69};
70
71PriorityRec customPriority = { B_TRANSLATE("Custom priority"), 0 };
72
73
74void
75PriorityMenu::BuildMenu()
76{
77	BMenuItem* item;
78	BMessage* message;
79	long found = false;
80
81	for (long index = 0; ; index++) {
82		PriorityRec	*priority = &priorities[index];
83		if (priority->priority < 0)
84			break;
85		if (!found && fPriority < priority->priority) {
86			priority = &customPriority;
87			priority->priority = fPriority;
88			index--;
89		}
90		message = new BMessage('PrTh');
91		message->AddInt32("thread", fThreadID);
92		message->AddInt32("priority", priority->priority);
93		BString name;
94		const size_t size = B_OS_NAME_LENGTH * 4;
95		snprintf(name.LockBuffer(size), size,
96			"%s [%d]", priority->name, (int)priority->priority);
97		name.UnlockBuffer();
98		item = new BMenuItem(name.String(), message);
99		item->SetTarget(gPCView);
100		if (fPriority == priority->priority)
101			found = true, item->SetMarked(true);
102		AddItem(item);
103	}
104}
105
106