1/*
2 * Copyright 2007-2008, Christof Lutteroth, lutteroth@cs.auckland.ac.nz
3 * Copyright 2007-2008, James Kim, jkim202@ec.auckland.ac.nz
4 * Copyright 2010, Clemens Zeidler <haiku@clemens-zeidler.de>
5 * Copyright 2012, Haiku, Inc.
6 * Distributed under the terms of the MIT License.
7 */
8
9#include <Application.h>
10#include <Button.h>
11#include <LayoutBuilder.h>
12#include <List.h>
13#include <Message.h>
14#include <StringView.h>
15#include <Window.h>
16
17// include this for ALM
18#include "ALMLayout.h"
19#include "ALMLayoutBuilder.h"
20#include "LinearProgrammingTypes.h"
21
22
23class FriendWindow : public BWindow {
24public:
25	FriendWindow(BRect frame)
26		:
27		BWindow(frame, "ALM Friend Test", B_TITLED_WINDOW,
28			B_QUIT_ON_WINDOW_CLOSE | B_AUTO_UPDATE_SIZE_LIMITS),
29		fLayout2(NULL),
30		fBoom(NULL),
31		fLeft(NULL),
32		fTop(NULL),
33		fRight(NULL),
34		fBottom(NULL)
35	{
36		BButton* button1 = _MakeButton("friends!");
37		BButton* button2 = _MakeButton("friends!");
38		BButton* button3 = _MakeButton("friends!");
39
40		BButton* button4 = _MakeButton("friends!");
41		BButton* button5 = _MakeButton("friends!");
42		BButton* button6 = _MakeButton("friends!");
43
44		BALMLayout* layout1 = new BALMLayout(10, 10);
45		BView* almView1 = _MakeALMView(layout1);
46
47		BReference<XTab> xTabs[2];
48		layout1->AddXTabs(xTabs, 2);
49
50		BALM::BALMLayoutBuilder(layout1)
51			.Add(button1, layout1->Left(), layout1->Top(),
52				xTabs[0], layout1->Bottom())
53			.StartingAt(button1)
54				.AddToRight(button2, xTabs[1])
55				.AddToRight(button3, layout1->Right());
56
57		fLayout2 = new BALMLayout(10, 10, layout1);
58		BView* almView2 = _MakeALMView(fLayout2);
59
60		BALM::BALMLayoutBuilder(fLayout2)
61			.Add(button4, fLayout2->Left(), fLayout2->Top(), xTabs[0])
62			.StartingAt(button4)
63				.AddBelow(button5, NULL, xTabs[1], fLayout2->Right())
64				.AddBelow(button6, fLayout2->Bottom(), xTabs[0]);
65
66		fLeft = fLayout2->Left();
67		fBottom = fLayout2->BottomOf(button5);
68		fTop = fLayout2->BottomOf(button4);
69		fRight = xTabs[1];
70
71		layout1->AreaFor(button2)->SetContentAspectRatio(1.0f);
72		fLayout2->Solver()->AddConstraint(-1.0f, layout1->Left(), 1.0f, xTabs[0],
73			LinearProgramming::kLE, 90.0f);
74
75		BButton* archiveButton = new BButton("clone", new BMessage('arcv'));
76		archiveButton->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED,
77				B_SIZE_UNSET));
78		BLayoutBuilder::Group<>(this, B_VERTICAL)
79			.Add(almView1->GetLayout())
80			.Add(almView2->GetLayout())
81			.Add(archiveButton);
82	}
83
84
85	void MessageReceived(BMessage* message)
86	{
87		switch (message->what) {
88			case 'BOOM':
89				if (!fBoom) {
90					fBoom = _MakeButton("BOOM");
91					fLayout2->AddView(fBoom, fLeft, fTop,
92						fRight, fBottom);
93				} else {
94					if (fBoom->IsHidden(fBoom))
95						fBoom->Show();
96					else
97						fBoom->Hide();
98				}
99				break;
100			case 'arcv': {
101				BView* view = GetLayout()->View();
102				BMessage archive;
103				status_t err = view->Archive(&archive, true);
104				BWindow* window = new BWindow(BRect(30, 30, 400, 400),
105					"ALM Friend Test Clone", B_TITLED_WINDOW,
106					B_QUIT_ON_WINDOW_CLOSE | B_AUTO_UPDATE_SIZE_LIMITS);
107				window->SetLayout(new BGroupLayout(B_VERTICAL));
108				BView* clone;
109				if (err == B_OK)
110					err = BUnarchiver::InstantiateObject(&archive, clone);
111				if (err != B_OK)
112					window->AddChild(new BStringView("", "An error occurred!"));
113				else {
114					window->AddChild(clone);
115				}
116				window->Show();
117
118				break;
119			}
120			default:
121				BWindow::MessageReceived(message);
122		}
123	}
124
125private:
126	BButton* _MakeButton(const char* label)
127	{
128		BButton* button = new BButton(label, new BMessage('BOOM'));
129		button->SetExplicitMinSize(BSize(10, 50));
130		button->SetExplicitMaxSize(BSize(500, 500));
131		button->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
132			B_ALIGN_USE_FULL_HEIGHT));
133		return button;
134	}
135
136	BView* _MakeALMView(BALMLayout* layout)
137	{
138		BView* view = new BView(NULL, 0, layout);
139		view->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
140		return view;
141	}
142
143	BALMLayout* fLayout2;
144	BButton*	fBoom;
145	XTab*		fLeft;
146	YTab*		fTop;
147	XTab*		fRight;
148	YTab*		fBottom;
149};
150
151
152class Friend : public BApplication {
153public:
154	Friend()
155		:
156		BApplication("application/x-vnd.haiku.Friend")
157	{
158		BRect frameRect;
159		frameRect.Set(100, 100, 300, 300);
160		FriendWindow* window = new FriendWindow(frameRect);
161		window->Show();
162	}
163};
164
165
166int
167main()
168{
169	Friend app;
170	app.Run();
171	return 0;
172}
173
174