1/*
2 * Copyright 2010, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Clemens Zeidler <haiku@clemens-zeidler.de>
7 */
8
9#include "WindowStackTest.h"
10
11#include <Alert.h>
12#include <Application.h>
13#include <ControlLook.h>
14#include <Roster.h>
15#include <String.h>
16#include <Window.h>
17
18#include <WindowStack.h>
19
20
21const int32 kGetWindows = '&GeW';
22const int32 kAddWindow = '&AdW';
23const int32 kRemoveWindow = '&ReW';
24
25
26WindowListItem::WindowListItem(const char* text, BWindow* window)
27	:
28	BStringItem(text),
29	fWindow(window)
30{
31
32}
33
34
35MainView::MainView()
36	:
37	BBox("MainView")
38{
39	fStackedWindowsLabel = new BStringView("label", "Stacked windows:");
40	fStackedWindowsList = new BListView;
41	fGetWindowsButton = new BButton("Get Windows", new BMessage(kGetWindows));
42	fAddWindowButton = new BButton("Add Window", new BMessage(kAddWindow));
43	fRemoveWindowButton = new BButton("Remove Window",
44		new BMessage(kRemoveWindow));
45
46	float spacing = be_control_look->DefaultItemSpacing();
47	SetLayout(new BGroupLayout(B_HORIZONTAL));
48	AddChild(BGroupLayoutBuilder(B_VERTICAL, spacing)
49		.AddGroup(B_HORIZONTAL, spacing)
50			.Add(fStackedWindowsLabel)
51			.AddGlue()
52		.End()
53			.Add(fStackedWindowsList)
54		.AddGroup(B_HORIZONTAL, spacing)
55			.AddGlue()
56			.Add(fGetWindowsButton)
57			.Add(fRemoveWindowButton)
58			.Add(fAddWindowButton)
59		.End()
60		//.SetInsets(spacing, spacing, spacing, spacing)
61	);
62
63}
64
65
66void
67MainView::AttachedToWindow()
68{
69	fGetWindowsButton->SetTarget(this);
70	fAddWindowButton->SetTarget(this);
71	fRemoveWindowButton->SetTarget(this);
72}
73
74
75void
76MainView::MessageReceived(BMessage* message)
77{
78	switch (message->what) {
79		case kGetWindows:
80		{
81			BWindowStack windowStack(Window());
82			/*BString string;
83			string << windowStack.CountWindows();
84			BAlert* alert = new BAlert("title", "Count: ", string.String());
85			alert->Go();*/
86			int32 stackWindowCount = windowStack.CountWindows();
87			fStackedWindowsList->MakeEmpty();
88			for (int i = 0; i < stackWindowCount; i++) {
89				BString result;
90
91				BMessenger messenger;//(NULL, Window());
92				windowStack.WindowAt(i, messenger);
93
94				// don't deadlock
95				if (!messenger.IsTargetLocal()) {
96					BMessage message(B_GET_PROPERTY);
97					message.AddSpecifier("Title");
98					BMessage reply;
99
100					messenger.SendMessage(&message, &reply);
101					reply.FindString("result", &result);
102				}
103				else
104					result = Window()->Title();
105
106				fStackedWindowsList->AddItem(new BStringItem(
107					result.String()));
108			}
109			break;
110		}
111
112		case kAddWindow:
113		{
114			app_info appInfo;
115			if (be_app->GetAppInfo(&appInfo) != B_OK)
116				break;
117
118			team_id team;
119			BRoster roster;
120			//roster.Launch("application/x-vnd.windowstack_test", (BMessage*)NULL,
121			//	&team);
122			roster.Launch(&appInfo.ref, (BMessage*)NULL,
123				&team);
124
125			BMessage message(B_GET_PROPERTY);
126			message.AddSpecifier("Window", int32(0));
127			BMessage reply;
128			BMessenger appMessenger(NULL, team);
129			appMessenger.SendMessage(&message, &reply);
130
131			BMessenger window;
132			reply.FindMessenger("result", &window);
133			int32 error = 0;
134			reply.FindInt32("error", &error);
135
136			BWindowStack windowStack(Window());
137			if (windowStack.HasWindow(window)) {
138				BAlert* alert = new BAlert("API Error",
139					"Window on stack but should not be there!", "OK");
140				alert->Go();
141			}
142			windowStack.AddWindow(window);
143			if (!windowStack.HasWindow(window)) {
144				BAlert* alert = new BAlert("API Error",
145					"Window not on stack but should be there!", "OK");
146				alert->Go();
147			}
148			break;
149		}
150
151		case kRemoveWindow:
152		{
153			BWindowStack windowStack(Window());
154			BMessenger messenger;
155			windowStack.WindowAt(0, messenger);
156			windowStack.RemoveWindow(messenger);
157			break;
158		}
159	}
160
161	BView::MessageReceived(message);
162}
163
164
165int main()
166{
167	BApplication app("application/x-vnd.windowstack_test");
168	BWindow *window = new BWindow(BRect(100, 100, 500, 300),
169		"BWindowStackTest", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE);
170	window->SetLayout(new BGroupLayout(B_VERTICAL));
171	window->AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
172		.Add(new MainView)
173		.SetInsets(10, 10, 10, 10)
174	);
175
176	window->Show();
177	app.Run();
178}
179