xref: /haiku/src/tests/libs/alm/HelloWorld.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
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  * Distributed under the terms of the MIT License.
6  */
7 
8 #include <Application.h>
9 #include <Button.h>
10 #include <GroupLayout.h>
11 #include <List.h>
12 #include <StringView.h>
13 #include <Window.h>
14 
15 // include this for ALM
16 #include "ALMLayout.h"
17 
18 
19 const uint32 kMsgClone = 'clne';
20 
21 
22 class HelloWorldWindow : public BWindow {
23 public:
24 	HelloWorldWindow(BRect frame)
25 		:
26 		BWindow(frame, "ALM Hello World", B_TITLED_WINDOW,
27 			B_QUIT_ON_WINDOW_CLOSE)
28 	{
29 		button1 = new BButton("Hello World!");
30 
31 		// create a new BALMLayout and use  it for this window
32 		fLayout = new BALMLayout();
33 		BView* view = new BView("alm view", 0, fLayout);
34 		fLayout->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
35 			B_ALIGN_USE_FULL_HEIGHT));
36 		SetLayout(new BGroupLayout(B_VERTICAL));
37 		AddChild(view);
38 
39 		// add an area containing the button
40 		// use the borders of the layout as the borders for the area
41 		fLayout->AddView(button1, fLayout->Left(), fLayout->Top(),
42 			fLayout->Right(), fLayout->Bottom());
43 		button1->SetExplicitMinSize(BSize(0, 50));
44 		button1->SetExplicitMaxSize(BSize(500, 500));
45 		button1->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH,
46 			B_ALIGN_USE_FULL_HEIGHT));
47 
48 		// test size limits
49 		BSize min = fLayout->MinSize();
50 		BSize max = fLayout->MaxSize();
51 		SetSizeLimits(min.Width(), max.Width(), min.Height(), max.Height());
52 
53 		AddShortcut('c', B_COMMAND_KEY, new BMessage(kMsgClone));
54 	}
55 
56 	void MessageReceived(BMessage* message)
57 	{
58 		switch (message->what) {
59 			case kMsgClone:
60 			{
61 				BView* view = fLayout->View();
62 				BMessage archive;
63 				view->Archive(&archive, true);
64 				BWindow* window = new BWindow(BRect(30, 30, 100, 100),
65 					"ALM HelloWorld Clone", B_TITLED_WINDOW,
66 					B_QUIT_ON_WINDOW_CLOSE | B_AUTO_UPDATE_SIZE_LIMITS);
67 				window->SetLayout(new BGroupLayout(B_VERTICAL));
68 				BView* clone;
69 				status_t err = BUnarchiver::InstantiateObject(&archive, clone);
70 				if (err != B_OK)
71 					window->AddChild(new BStringView("", "An error occurred!"));
72 				else
73 					window->AddChild(clone);
74 				window->Show();
75 
76 				break;
77 			}
78 			default:
79 				BWindow::MessageReceived(message);
80 		}
81 	}
82 
83 private:
84 
85 	BALMLayout* fLayout;
86 	BButton* button1;
87 };
88 
89 
90 class HelloWorld : public BApplication {
91 public:
92 	HelloWorld()
93 		:
94 		BApplication("application/x-vnd.haiku.HelloWorld")
95 	{
96 		BRect frameRect;
97 		frameRect.Set(100, 100, 300, 300);
98 		HelloWorldWindow* window = new HelloWorldWindow(frameRect);
99 		window->Show();
100 	}
101 };
102 
103 
104 int
105 main()
106 {
107 	HelloWorld app;
108 	app.Run();
109 	return 0;
110 }
111