1#include <Application.h>
2#include <Resources.h>
3#include <Window.h>
4#include <Region.h>
5#include <Alert.h>
6#include <Button.h>
7#include "Mime.h"
8#include "FindDirectory.h"
9
10#include <string.h>
11#include <dirent.h>
12#include <stdlib.h>
13#include <stdio.h>
14
15#include "ColumnListView.h"
16#include "CLVColumn.h"
17#include "CLVListItem.h"
18#include "CLVEasyItem.h"
19#include "NewStrings.h"
20
21#include "ConsoleHeaderView.h"
22#include "UserProperties.h"
23#include "TreeControl.h"
24#include "ListControl.h"
25#include "Users.h"
26#include "Groups.h"
27#include "Servers.h"
28#include "Icons.h"
29
30const int32 MSG_ITEM_SELECT		= 'ISel';
31const int32 MSG_ITEM_INVOKE		= 'IInv';
32const int32 MSG_LIST_DESELECT	= 'CLV0';
33
34
35// ----- GenericWindow --------------------------------------------
36
37class GenericWindow : public BWindow
38{
39	public:
40		GenericWindow() :
41		  BWindow(BRect(40, 40, 630, 430), "Domain Management Console", B_DOCUMENT_WINDOW, 0)
42		{
43			BRect r = Bounds();
44			r.bottom = 82;
45			headerView = new ConsoleHeaderView(r);
46			AddChild(headerView);
47
48			r = Bounds();
49			r.top = 85;
50			r.right = 160;
51		//	r.bottom -= B_H_SCROLL_BAR_HEIGHT;
52
53			CLVContainerView *treeContView, *listContView;
54
55			treeView = new SmartTreeListView(r, &treeContView, NULL, B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM,
56				B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE, B_SINGLE_SELECTION_LIST,
57				true, true, true, false, B_FANCY_BORDER);
58			treeView->AddColumn(new CLVColumn(NULL, 20.0, CLV_EXPANDER | CLV_LOCK_AT_BEGINNING | CLV_NOT_MOVABLE, 20.0));
59			treeView->AddColumn(new CLVColumn(NULL, 16.0, CLV_LOCK_AT_BEGINNING | CLV_NOT_MOVABLE |
60				CLV_NOT_RESIZABLE | CLV_PUSH_PASS | CLV_MERGE_WITH_RIGHT, 16.0));
61			treeView->AddColumn(new CLVColumn("Snap-ins", 125.0, CLV_SORT_KEYABLE, 50.0));
62			treeView->SetSortFunction(TreeItem::MyCompare);
63
64			r = Bounds();
65			r.top = 85;
66			r.left = 165 + B_V_SCROLL_BAR_WIDTH;
67			r.right -= B_V_SCROLL_BAR_WIDTH;
68
69			listView = new SmartColumnListView(r, &listContView, NULL, B_FOLLOW_ALL_SIDES,
70				B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE, B_SINGLE_SELECTION_LIST,
71				false, true, true, false, B_FANCY_BORDER);
72
73			listView->SetSelectionMessage(new BMessage(MSG_ITEM_SELECT));
74			listView->SetInvocationMessage(new BMessage(MSG_ITEM_INVOKE));
75
76			AddTreeItems(treeView);
77			AddChild(treeContView);
78			AddChild(listContView);
79
80			SetSizeLimits(300, 2000, 150, 2000);
81			Show();
82		}
83
84		~GenericWindow()
85		{
86			be_app->PostMessage(B_QUIT_REQUESTED);
87		}
88
89		// MessageReceived()
90		//
91		void MessageReceived(BMessage *msg)
92		{
93			TreeItem *treeItem = NULL;
94			ListItem *listItem = NULL;
95			int32 curTreeItem = treeView->CurrentSelection();
96			int32 curListItem = listView->CurrentSelection();
97
98			if (curTreeItem >= 0)
99				treeItem = (TreeItem *) treeView->ItemAt(curTreeItem);
100
101			if (curListItem >= 0)
102				listItem = (ListItem *) listView->ItemAt(curListItem);
103
104			switch (msg->what)
105			{
106				case MSG_ITEM_INVOKE:
107					if (listItem)
108						if (listItem->ItemInvoked())
109							if (treeItem)
110								treeItem->ListItemUpdated(curListItem, listItem);
111					break;
112
113				case MSG_ITEM_SELECT:
114					if (treeItem)
115						treeItem->ListItemSelected();
116					if (listItem)
117						listItem->ItemSelected();
118					break;
119
120				case MSG_LIST_DESELECT:
121					if (treeItem)
122						treeItem->ListItemDeselected();
123					if (listItem)
124						listItem->ItemDeselected();
125					break;
126
127				// If we get here, this may be a message we don't handle, or it may be one
128				// that comes from the header view and needs to be processed by the associated
129				// tree node.
130				default:
131					if (treeItem)
132						if (treeItem->HeaderMessageReceived(msg))
133							break;
134
135					BWindow::MessageReceived(msg);
136					break;
137			}
138		}
139
140		void Quit()
141		{
142			TreeItem *item;
143
144			do
145			{
146				item = (TreeItem *) treeView->RemoveItem(int32(0));
147				if (item)
148					delete item;
149			} while(item);
150
151			BWindow::Quit();
152		}
153
154	private:
155		void AddTreeItems(ColumnListView* treeView)
156		{
157			treeView->AddItem(new TreeItem(0, true, true, ICON_NETADMIN_SMALL, headerView, listView, "Network Administration"));
158			treeView->AddItem(new TreeItem(1, true, true, ICON_DOMAIN_SMALL, headerView, listView, "Domains"));
159			treeView->AddItem(new TreeItem(2, true, true, ICON_DOMAIN_SMALL, headerView, listView, "default"));
160			treeView->AddItem(new GroupsItem(3, false, false, ICON_GROUP_SMALL, headerView, listView, "Groups"));
161			treeView->AddItem(new ServersItem(3, false, false, ICON_HOST_SMALL, headerView, listView, "Servers"));
162			treeView->AddItem(new UsersItem(3, false, false, ICON_USER_SMALL, headerView, listView, "Users"));
163			treeView->AddItem(new TreeItem(1, false, false, ICON_SERVICES_SMALL, headerView, listView, "Services"));
164		}
165
166		ConsoleHeaderView *headerView;
167		SmartTreeListView *treeView;
168		SmartColumnListView *listView;
169};
170
171
172// ----- GenericApp ---------------------------------------------------
173
174class GenericApp : public BApplication
175{
176	public:
177		GenericApp() : BApplication("application/x-vnd.Teldar-DomainManager")
178		{
179			checkMimeTypes();
180			new GenericWindow;
181		}
182
183		~GenericApp()
184		{
185		}
186
187	private:
188		void checkMimeTypes()
189		{
190			BMimeType mime;
191			mime.SetTo("application/x-vnd.BeServed-DomainManager");
192			if (!mime.IsInstalled())
193			{
194				mime.Install();
195				mime.SetShortDescription("DomainManager");
196				mime.SetLongDescription("BeServed Domain Management Console 1.2.6");
197				setMimeIcon(&mime, ICON_BMC_LARGE, B_LARGE_ICON);
198				setMimeIcon(&mime, ICON_BMC_SMALL, B_MINI_ICON);
199			}
200
201			mime.SetTo("application/x-vnd.Teldar-User");
202			if (!mime.IsInstalled())
203			{
204				mime.Install();
205				mime.SetShortDescription("User");
206				mime.SetLongDescription("BeSure User Account");
207				setMimeIcon(&mime, ICON_USER_LARGE, B_LARGE_ICON);
208				setMimeIcon(&mime, ICON_USER_SMALL, B_MINI_ICON);
209			}
210
211			mime.SetTo("application/x-vnd.Teldar-Group");
212			if (!mime.IsInstalled())
213			{
214				mime.Install();
215				mime.SetShortDescription("User Group");
216				mime.SetLongDescription("BeSure Group Account");
217				setMimeIcon(&mime, ICON_GROUP_LARGE, B_LARGE_ICON);
218				setMimeIcon(&mime, ICON_GROUP_SMALL, B_MINI_ICON);
219			}
220		}
221
222		bool setMimeIcon(BMimeType *mime, int32 resourceID, icon_size which)
223		{
224			BMessage archive;
225			size_t size;
226			char *bits = (char *) be_app->AppResources()->LoadResource(type_code('BBMP'), resourceID, &size);
227			if (bits)
228				if (archive.Unflatten(bits) == B_OK)
229				{
230					BBitmap *icon = new BBitmap(&archive);
231					mime->SetIcon(icon, which);
232					return true;
233				}
234
235			return false;
236		}
237};
238
239#include "besure_auth.h"
240
241int main()
242{
243	new GenericApp;
244	be_app->Run();
245	delete be_app;
246}
247