xref: /haiku/src/tests/servers/app/playground/ObjectWindow.cpp (revision bab64f65bb775dc23060e276f1f1c4498ab7af6c)
178c1c29bSStephan Aßmus // main.cpp
278c1c29bSStephan Aßmus 
378c1c29bSStephan Aßmus #include <stdio.h>
478c1c29bSStephan Aßmus #include <stdlib.h>
578c1c29bSStephan Aßmus 
678c1c29bSStephan Aßmus #include <Application.h>
74dfc2afbSAxel Dörfler #include <Alert.h>
8040ce757SStephan Aßmus #include <Bitmap.h>
978c1c29bSStephan Aßmus #include <Box.h>
1078c1c29bSStephan Aßmus #include <Button.h>
1141b920bcSHumdinger #include <Catalog.h>
1278c1c29bSStephan Aßmus #include <CheckBox.h>
136d990309SStephan Aßmus #include <ColorControl.h>
14040ce757SStephan Aßmus #include <ListItem.h>
15040ce757SStephan Aßmus #include <ListView.h>
1678c1c29bSStephan Aßmus #include <Menu.h>
1778c1c29bSStephan Aßmus #include <MenuBar.h>
1881cc749fSStephan Aßmus #include <MenuField.h>
1978c1c29bSStephan Aßmus #include <MenuItem.h>
2081cc749fSStephan Aßmus #include <PopUpMenu.h>
218e05e376SStephan Aßmus #include <ScrollBar.h>
228e05e376SStephan Aßmus #include <ScrollView.h>
23b7f478e2SStephan Aßmus #include <Slider.h>
2478c1c29bSStephan Aßmus #include <String.h>
2578c1c29bSStephan Aßmus #include <RadioButton.h>
265a2b3bacSStephan Aßmus #include <Region.h>
27040ce757SStephan Aßmus #include <TabView.h>
2878c1c29bSStephan Aßmus #include <TextControl.h>
2978c1c29bSStephan Aßmus #include <TextView.h>
3078c1c29bSStephan Aßmus 
3178c1c29bSStephan Aßmus #include "ObjectView.h"
3241b920bcSHumdinger #include "ObjectWindow.h"
3378c1c29bSStephan Aßmus #include "States.h"
34b1836934SStephan Aßmus //#include "StatusView.h"
3578c1c29bSStephan Aßmus 
3641b920bcSHumdinger 
3741b920bcSHumdinger #undef B_TRANSLATION_CONTEXT
3841b920bcSHumdinger #define B_TRANSLATION_CONTEXT "Playground"
3978c1c29bSStephan Aßmus 
4078c1c29bSStephan Aßmus enum {
4178c1c29bSStephan Aßmus 	MSG_SET_OBJECT_TYPE		= 'stot',
4278c1c29bSStephan Aßmus 	MSG_SET_FILL_OR_STROKE	= 'stfs',
4378c1c29bSStephan Aßmus 	MSG_SET_COLOR			= 'stcl',
4478c1c29bSStephan Aßmus 	MSG_SET_PEN_SIZE		= 'stps',
4581cc749fSStephan Aßmus 	MSG_SET_DRAWING_MODE	= 'stdm',
4678c1c29bSStephan Aßmus 
4778c1c29bSStephan Aßmus 	MSG_NEW_OBJECT			= 'nobj',
4878c1c29bSStephan Aßmus 
4978c1c29bSStephan Aßmus 	MSG_UNDO				= 'undo',
5078c1c29bSStephan Aßmus 	MSG_REDO				= 'redo',
5178c1c29bSStephan Aßmus 
5278c1c29bSStephan Aßmus 	MSG_CLEAR				= 'clir',
5375bf993eSStephan Aßmus 
5475bf993eSStephan Aßmus 	MSG_OBJECT_SELECTED		= 'obsl',
55269293b0SStephan Aßmus 	MSG_REMOVE_OBJECT		= 'rmob',
5678c1c29bSStephan Aßmus };
5778c1c29bSStephan Aßmus 
5875bf993eSStephan Aßmus // ObjectItem
5975bf993eSStephan Aßmus class ObjectItem : public BStringItem {
6075bf993eSStephan Aßmus  public:
ObjectItem(const char * name,State * object)6175bf993eSStephan Aßmus 			ObjectItem(const char* name, State* object)
6275bf993eSStephan Aßmus 				: BStringItem(name),
6375bf993eSStephan Aßmus 				  fObject(object)
6475bf993eSStephan Aßmus 			{
6575bf993eSStephan Aßmus 			}
6675bf993eSStephan Aßmus 
Object() const6775bf993eSStephan Aßmus 	State*	Object() const
6875bf993eSStephan Aßmus 			{ return fObject; }
6975bf993eSStephan Aßmus 
7075bf993eSStephan Aßmus  private:
7175bf993eSStephan Aßmus 	State*	fObject;
7275bf993eSStephan Aßmus };
7375bf993eSStephan Aßmus 
74269293b0SStephan Aßmus // ObjectListView
75269293b0SStephan Aßmus class ObjectListView : public BListView {
76269293b0SStephan Aßmus  public:
ObjectListView(BRect frame,const char * name,list_view_type listType)77269293b0SStephan Aßmus 			ObjectListView(BRect frame, const char* name, list_view_type listType)
78269293b0SStephan Aßmus 				: BListView(frame, name, listType)
79269293b0SStephan Aßmus 			{
80269293b0SStephan Aßmus 			}
81269293b0SStephan Aßmus 
KeyDown(const char * bytes,int32 numBytes)82269293b0SStephan Aßmus 	virtual	void KeyDown(const char* bytes, int32 numBytes)
83269293b0SStephan Aßmus 			{
84269293b0SStephan Aßmus 				switch (*bytes) {
85269293b0SStephan Aßmus 					case B_DELETE:
86269293b0SStephan Aßmus 						Window()->PostMessage(MSG_REMOVE_OBJECT);
87269293b0SStephan Aßmus 						break;
88269293b0SStephan Aßmus 					default:
89269293b0SStephan Aßmus 						BListView::KeyDown(bytes, numBytes);
90269293b0SStephan Aßmus 				}
91269293b0SStephan Aßmus 			}
92778e3c64SStephan Aßmus 
InitiateDrag(BPoint point,int32 itemIndex,bool wasSelected)93778e3c64SStephan Aßmus 	virtual bool InitiateDrag(BPoint point, int32 itemIndex, bool wasSelected)
94778e3c64SStephan Aßmus 			{
95e431f228SJérôme Duval 				printf("InitiateDrag(BPoint(%.1f, %.1f), itemIndex: %" B_PRId32
96e431f228SJérôme Duval 					", wasSelected: %d)\n", point.x, point.y, itemIndex,
97e431f228SJérôme Duval 					wasSelected);
98778e3c64SStephan Aßmus 				SwapItems(itemIndex, itemIndex + 1);
99778e3c64SStephan Aßmus 				return true;
100778e3c64SStephan Aßmus 			}
101778e3c64SStephan Aßmus 
SelectionChanged()102778e3c64SStephan Aßmus 	virtual void SelectionChanged()
103778e3c64SStephan Aßmus 			{
104b1836934SStephan Aßmus //				printf("SelectionChanged() - first selected: %ld\n", CurrentSelection(0));
105778e3c64SStephan Aßmus 			}
106269293b0SStephan Aßmus };
107269293b0SStephan Aßmus 
10875bf993eSStephan Aßmus // #pragma mark -
10975bf993eSStephan Aßmus 
110778e3c64SStephan Aßmus class TestView : public BView {
111778e3c64SStephan Aßmus public:
TestView(BRect frame,const char * name,uint32 resizeMode,uint32 flags)112778e3c64SStephan Aßmus 	TestView(BRect frame, const char* name, uint32 resizeMode, uint32 flags)
113778e3c64SStephan Aßmus 		: BView(frame, name, resizeMode, flags)
114778e3c64SStephan Aßmus 	{
115778e3c64SStephan Aßmus 	}
116778e3c64SStephan Aßmus 
AttachedToWindow()117778e3c64SStephan Aßmus 	void AttachedToWindow()
118778e3c64SStephan Aßmus 	{
119778e3c64SStephan Aßmus 		SetViewColor(255, 0, 0);
120778e3c64SStephan Aßmus 	}
121778e3c64SStephan Aßmus };
122778e3c64SStephan Aßmus 
12378c1c29bSStephan Aßmus // constructor
ObjectWindow(BRect frame,const char * name)12478c1c29bSStephan Aßmus ObjectWindow::ObjectWindow(BRect frame, const char* name)
12575bf993eSStephan Aßmus 	: BWindow(frame, name, B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
12675bf993eSStephan Aßmus 			  B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE)
12778c1c29bSStephan Aßmus {
12878c1c29bSStephan Aßmus 	BRect b(Bounds());
12978c1c29bSStephan Aßmus 
13078c1c29bSStephan Aßmus 	b.bottom = b.top + 8;
13178c1c29bSStephan Aßmus 	BMenuBar* menuBar = new BMenuBar(b, "menu bar");
13278c1c29bSStephan Aßmus 	AddChild(menuBar);
13378c1c29bSStephan Aßmus 
1347c178559SDancsó Róbert 	BMenu* menu = new BMenu(B_TRANSLATE("File"));
13578c1c29bSStephan Aßmus 	menuBar->AddItem(menu);
13678c1c29bSStephan Aßmus 
1377c178559SDancsó Róbert 	menu->AddItem(new BMenu(B_TRANSLATE("Submenu")));
138778e3c64SStephan Aßmus 
1397c178559SDancsó Róbert 	BMenuItem* menuItem = new BMenuItem(B_TRANSLATE("Quit"), new BMessage(B_QUIT_REQUESTED),
140d5233162SStephan Aßmus 										'Q');
14178c1c29bSStephan Aßmus 	menu->AddItem(menuItem);
14278c1c29bSStephan Aßmus 
14378c1c29bSStephan Aßmus 	b = Bounds();
14478c1c29bSStephan Aßmus 	b.top = menuBar->Bounds().bottom + 1;
145040ce757SStephan Aßmus 	b.right = ceilf((b.left + b.right) / 2.0);
1466d990309SStephan Aßmus 	BBox* bg = new BBox(b, "bg box", B_FOLLOW_TOP_BOTTOM, B_WILL_DRAW,
1476d990309SStephan Aßmus 		B_PLAIN_BORDER);
14878c1c29bSStephan Aßmus 
14978c1c29bSStephan Aßmus 	AddChild(bg);
150*d231c2a7Slooncraz 	bg->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
15178c1c29bSStephan Aßmus 
1528e05e376SStephan Aßmus 	// object view occupies the right side of the window
1538e05e376SStephan Aßmus 	b.left = b.right + 1.0;
1548e05e376SStephan Aßmus 	b.right = Bounds().right - B_V_SCROLL_BAR_WIDTH;
1558e05e376SStephan Aßmus 	b.bottom -= B_H_SCROLL_BAR_HEIGHT;
15678c1c29bSStephan Aßmus 	fObjectView = new ObjectView(b, "object view", B_FOLLOW_ALL,
15778c1c29bSStephan Aßmus 								 B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
1588e05e376SStephan Aßmus 	// wrap a scroll view around the object view
1598e05e376SStephan Aßmus 	BScrollView* scrollView = new BScrollView("object scroller", fObjectView,
1606d990309SStephan Aßmus 		B_FOLLOW_ALL, 0, true, true, B_NO_BORDER);
16178c1c29bSStephan Aßmus 
1628e05e376SStephan Aßmus 	if (BScrollBar* scrollBar = fObjectView->ScrollBar(B_VERTICAL)) {
1638e05e376SStephan Aßmus 		scrollBar->SetRange(0.0, fObjectView->Bounds().Height());
1648e05e376SStephan Aßmus 		scrollBar->SetProportion(0.5);
1658e05e376SStephan Aßmus 	}
1668e05e376SStephan Aßmus 	if (BScrollBar* scrollBar = fObjectView->ScrollBar(B_HORIZONTAL)) {
1678e05e376SStephan Aßmus 		scrollBar->SetRange(0.0, fObjectView->Bounds().Width());
1688e05e376SStephan Aßmus 		scrollBar->SetProportion(0.5);
1698e05e376SStephan Aßmus 	}
1708e05e376SStephan Aßmus 	AddChild(scrollView);
17178c1c29bSStephan Aßmus 
17278c1c29bSStephan Aßmus 	b = bg->Bounds();
17378c1c29bSStephan Aßmus 	// controls occupy the left side of the window
1748e05e376SStephan Aßmus 	b.InsetBy(5.0, 5.0);
1756d990309SStephan Aßmus 	BBox* controlGroup = new BBox(b, "controls box",
1766d990309SStephan Aßmus 		B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM, B_WILL_DRAW, B_FANCY_BORDER);
17778c1c29bSStephan Aßmus 
1787c178559SDancsó Róbert 	controlGroup->SetLabel(B_TRANSLATE("Controls"));
17978c1c29bSStephan Aßmus 	bg->AddChild(controlGroup);
18078c1c29bSStephan Aßmus 
18178c1c29bSStephan Aßmus 	b = controlGroup->Bounds();
1826d990309SStephan Aßmus 	b.top += controlGroup->InnerFrame().top;
18378c1c29bSStephan Aßmus 	b.bottom = b.top + 25.0;
1846d990309SStephan Aßmus 	b.InsetBy(10.0, 10.0);
1856d990309SStephan Aßmus 	b.right = b.left + b.Width() / 2.0 - 5.0;
18678c1c29bSStephan Aßmus 
18778c1c29bSStephan Aßmus 	// new button
188f92bcd19SHumdinger 	fNewB = new BButton(b, "new button", B_TRANSLATE("New object"),
1896d990309SStephan Aßmus 		new BMessage(MSG_NEW_OBJECT));
19078c1c29bSStephan Aßmus 	controlGroup->AddChild(fNewB);
191040ce757SStephan Aßmus 	SetDefaultButton(fNewB);
19278c1c29bSStephan Aßmus 
19378c1c29bSStephan Aßmus 	// clear button
19478c1c29bSStephan Aßmus 	b.OffsetBy(0, fNewB->Bounds().Height() + 5.0);
1957c178559SDancsó Róbert 	fClearB = new BButton(b, "clear button", B_TRANSLATE("Clear"), new BMessage(MSG_CLEAR));
19678c1c29bSStephan Aßmus 	controlGroup->AddChild(fClearB);
19778c1c29bSStephan Aßmus 
19878c1c29bSStephan Aßmus 	// object type radio buttons
19978c1c29bSStephan Aßmus 	BMessage* message;
20078c1c29bSStephan Aßmus 	BRadioButton* radioButton;
20178c1c29bSStephan Aßmus 
20278c1c29bSStephan Aßmus 	b.OffsetBy(0, fClearB->Bounds().Height() + 5.0);
20378c1c29bSStephan Aßmus 	message = new BMessage(MSG_SET_OBJECT_TYPE);
20478c1c29bSStephan Aßmus 	message->AddInt32("type", OBJECT_LINE);
2057c178559SDancsó Róbert 	radioButton = new BRadioButton(b, "radio 1", B_TRANSLATE("Line"), message);
20678c1c29bSStephan Aßmus 	controlGroup->AddChild(radioButton);
20778c1c29bSStephan Aßmus 
20878c1c29bSStephan Aßmus 	radioButton->SetValue(B_CONTROL_ON);
20978c1c29bSStephan Aßmus 
21078c1c29bSStephan Aßmus 	b.OffsetBy(0, radioButton->Bounds().Height() + 5.0);
21178c1c29bSStephan Aßmus 	message = new BMessage(MSG_SET_OBJECT_TYPE);
21278c1c29bSStephan Aßmus 	message->AddInt32("type", OBJECT_RECT);
2137c178559SDancsó Róbert 	radioButton = new BRadioButton(b, "radio 2", B_TRANSLATE("Rect"), message);
21478c1c29bSStephan Aßmus 	controlGroup->AddChild(radioButton);
21578c1c29bSStephan Aßmus 
21678c1c29bSStephan Aßmus 	b.OffsetBy(0, radioButton->Bounds().Height() + 5.0);
21778c1c29bSStephan Aßmus 	message = new BMessage(MSG_SET_OBJECT_TYPE);
21878c1c29bSStephan Aßmus 	message->AddInt32("type", OBJECT_ROUND_RECT);
219f92bcd19SHumdinger 	radioButton = new BRadioButton(b, "radio 3", B_TRANSLATE("Round rect"), message);
22078c1c29bSStephan Aßmus 	controlGroup->AddChild(radioButton);
22178c1c29bSStephan Aßmus 
22278c1c29bSStephan Aßmus 	b.OffsetBy(0, radioButton->Bounds().Height() + 5.0);
22378c1c29bSStephan Aßmus 	message = new BMessage(MSG_SET_OBJECT_TYPE);
22478c1c29bSStephan Aßmus 	message->AddInt32("type", OBJECT_ELLIPSE);
2257c178559SDancsó Róbert 	radioButton = new BRadioButton(b, "radio 4", B_TRANSLATE("Ellipse"), message);
22678c1c29bSStephan Aßmus 	controlGroup->AddChild(radioButton);
22778c1c29bSStephan Aßmus 
22881cc749fSStephan Aßmus 	// drawing mode
2297c178559SDancsó Róbert 	BPopUpMenu* popupMenu = new BPopUpMenu(B_TRANSLATE("<pick>"));
23081cc749fSStephan Aßmus 
23181cc749fSStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
23281cc749fSStephan Aßmus 	message->AddInt32("mode", B_OP_COPY);
2337c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Copy"), message));
23481cc749fSStephan Aßmus 
23581cc749fSStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
23681cc749fSStephan Aßmus 	message->AddInt32("mode", B_OP_OVER);
2377c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Over"), message));
238579be6b8SStephan Aßmus 
239579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
240579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_INVERT);
2417c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Invert"), message));
242579be6b8SStephan Aßmus 
243579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
244579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_BLEND);
2457c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Blend"), message));
246579be6b8SStephan Aßmus 
247579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
248579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_SELECT);
2497c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Select"), message));
250579be6b8SStephan Aßmus 
251579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
252579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_ERASE);
2537c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Erase"), message));
254579be6b8SStephan Aßmus 
255579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
256579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_ADD);
2577c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Add"), message));
258579be6b8SStephan Aßmus 
259579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
260579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_SUBTRACT);
2617c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Subtract"), message));
262579be6b8SStephan Aßmus 
263579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
264579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_MIN);
2657c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Min"), message));
266579be6b8SStephan Aßmus 
267579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
268579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_MAX);
2697c178559SDancsó Róbert 	popupMenu->AddItem(new BMenuItem(B_TRANSLATE("Max"), message));
270579be6b8SStephan Aßmus 
271579be6b8SStephan Aßmus 	message = new BMessage(MSG_SET_DRAWING_MODE);
272579be6b8SStephan Aßmus 	message->AddInt32("mode", B_OP_ALPHA);
2737c178559SDancsó Róbert 	BMenuItem* item = new BMenuItem(B_TRANSLATE("Alpha"), message);
274040ce757SStephan Aßmus 	item->SetMarked(true);
275040ce757SStephan Aßmus 	popupMenu->AddItem(item);
27681cc749fSStephan Aßmus 
2776d990309SStephan Aßmus 	b.OffsetBy(0, radioButton->Bounds().Height() + 10.0);
2787c178559SDancsó Róbert 	fDrawingModeMF = new BMenuField(b, "drawing mode field", B_TRANSLATE("Mode:"),
27981cc749fSStephan Aßmus 		popupMenu);
28081cc749fSStephan Aßmus 
28181cc749fSStephan Aßmus 	controlGroup->AddChild(fDrawingModeMF);
28281cc749fSStephan Aßmus 
2836d990309SStephan Aßmus 	fDrawingModeMF->SetDivider(fDrawingModeMF->StringWidth(
2846d990309SStephan Aßmus 		fDrawingModeMF->Label()) + 10.0);
285579be6b8SStephan Aßmus 
2866d990309SStephan Aßmus 	// color control
2876d990309SStephan Aßmus 	b.OffsetBy(0, fDrawingModeMF->Bounds().Height() + 10.0);
2886d990309SStephan Aßmus 	fColorControl = new BColorControl(b.LeftTop(), B_CELLS_16x16, 8,
2896d990309SStephan Aßmus 		"color control", new BMessage(MSG_SET_COLOR));
2906d990309SStephan Aßmus 	controlGroup->AddChild(fColorControl);
29178c1c29bSStephan Aßmus 
29278c1c29bSStephan Aßmus 	// alpha text control
2936d990309SStephan Aßmus 	b.OffsetBy(0, fColorControl-> Bounds().Height() + 5.0);
2947c178559SDancsó Róbert 	fAlphaTC = new BTextControl(b, "alpha text control", B_TRANSLATE("Alpha:"), "",
29578c1c29bSStephan Aßmus 		new BMessage(MSG_SET_COLOR));
29678c1c29bSStephan Aßmus 	controlGroup->AddChild(fAlphaTC);
2978e05e376SStephan Aßmus 
29878c1c29bSStephan Aßmus 	// divide text controls the same
2998e05e376SStephan Aßmus     float mWidth = fDrawingModeMF->StringWidth(fDrawingModeMF->Label());
30078c1c29bSStephan Aßmus     float aWidth = fAlphaTC->StringWidth(fAlphaTC->Label());
30178c1c29bSStephan Aßmus 
3026d990309SStephan Aßmus     float width = max_c(mWidth, aWidth) + 20.0;
3038e05e376SStephan Aßmus 	fDrawingModeMF->SetDivider(width);
3048e05e376SStephan Aßmus 	fAlphaTC->SetDivider(width);
30578c1c29bSStephan Aßmus 
30678c1c29bSStephan Aßmus 	// fill check box
30778c1c29bSStephan Aßmus 	b.OffsetBy(0, fAlphaTC->Bounds().Height() + 5.0);
3087c178559SDancsó Róbert 	fFillCB = new BCheckBox(b, "fill check box", B_TRANSLATE("Fill"),
30978c1c29bSStephan Aßmus 		new BMessage(MSG_SET_FILL_OR_STROKE));
31078c1c29bSStephan Aßmus 	controlGroup->AddChild(fFillCB);
31178c1c29bSStephan Aßmus 
31278c1c29bSStephan Aßmus 	// pen size text control
31378c1c29bSStephan Aßmus 	b.OffsetBy(0, radioButton->Bounds().Height() + 5.0);
314b7f478e2SStephan Aßmus 	b.bottom = b.top + 10.0;//35;
3157c178559SDancsó Róbert 	fPenSizeS = new BSlider(b, "width slider", B_TRANSLATE("Width:"), NULL, 1, 100,
3166d990309SStephan Aßmus 		B_TRIANGLE_THUMB);
317b7f478e2SStephan Aßmus 	fPenSizeS->SetLimitLabels("1", "100");
318b7f478e2SStephan Aßmus 	fPenSizeS->SetModificationMessage(new BMessage(MSG_SET_PEN_SIZE));
319b7f478e2SStephan Aßmus 	fPenSizeS->SetHashMarks(B_HASH_MARKS_BOTTOM);
320b7f478e2SStephan Aßmus 	fPenSizeS->SetHashMarkCount(10);
321b7f478e2SStephan Aßmus 
322b7f478e2SStephan Aßmus 	controlGroup->AddChild(fPenSizeS);
323b7f478e2SStephan Aßmus 
324040ce757SStephan Aßmus 	// list view with objects
325040ce757SStephan Aßmus 	b = controlGroup->Bounds();
3266d990309SStephan Aßmus 	b.top += controlGroup->InnerFrame().top;
3276d990309SStephan Aßmus 	b.InsetBy(10.0, 10.0);
328040ce757SStephan Aßmus 	b.left = b.left + b.Width() / 2.0 + 6.0;
329269293b0SStephan Aßmus 	b.right -= B_V_SCROLL_BAR_WIDTH;
3306d990309SStephan Aßmus     b.bottom = fDrawingModeMF->Frame().top - 10.0;
331040ce757SStephan Aßmus 
332778e3c64SStephan Aßmus 	fObjectLV = new ObjectListView(b, "object list", B_SINGLE_SELECTION_LIST);
33375bf993eSStephan Aßmus 	fObjectLV->SetSelectionMessage(new BMessage(MSG_OBJECT_SELECTED));
334040ce757SStephan Aßmus 
335040ce757SStephan Aßmus 	// wrap a scroll view around the list view
336040ce757SStephan Aßmus 	scrollView = new BScrollView("list scroller", fObjectLV,
3376d990309SStephan Aßmus 		B_FOLLOW_NONE, 0, false, true, B_FANCY_BORDER);
338040ce757SStephan Aßmus 	controlGroup->AddChild(scrollView);
339040ce757SStephan Aßmus 
340b7f478e2SStephan Aßmus 	// enforce some size limits
341b7f478e2SStephan Aßmus 	float minWidth = controlGroup->Frame().Width() + 30.0;
3426d990309SStephan Aßmus 	float minHeight = fPenSizeS->Frame().bottom
3436d990309SStephan Aßmus 		+ menuBar->Bounds().Height() + 15.0;
344b7f478e2SStephan Aßmus 	float maxWidth = minWidth * 4.0;
345040ce757SStephan Aßmus 	float maxHeight = minHeight + 100;
346b7f478e2SStephan Aßmus 	SetSizeLimits(minWidth, maxWidth, minHeight, maxHeight);
34778c1c29bSStephan Aßmus 
348e4bcf6e0SStephan Aßmus 	ResizeTo(max_c(frame.Width(), minWidth), max_c(frame.Height(), minHeight));
349e4bcf6e0SStephan Aßmus 
35078c1c29bSStephan Aßmus 	_UpdateControls();
35178c1c29bSStephan Aßmus }
35278c1c29bSStephan Aßmus 
35378c1c29bSStephan Aßmus // destructor
~ObjectWindow()35478c1c29bSStephan Aßmus ObjectWindow::~ObjectWindow()
35578c1c29bSStephan Aßmus {
35678c1c29bSStephan Aßmus }
35778c1c29bSStephan Aßmus 
35878c1c29bSStephan Aßmus // QuitRequested
35978c1c29bSStephan Aßmus bool
QuitRequested()36078c1c29bSStephan Aßmus ObjectWindow::QuitRequested()
36178c1c29bSStephan Aßmus {
36278c1c29bSStephan Aßmus 	be_app->PostMessage(B_QUIT_REQUESTED);
36378c1c29bSStephan Aßmus 	return true;
36478c1c29bSStephan Aßmus }
36578c1c29bSStephan Aßmus 
36678c1c29bSStephan Aßmus // MessageReceived
36778c1c29bSStephan Aßmus void
MessageReceived(BMessage * message)36878c1c29bSStephan Aßmus ObjectWindow::MessageReceived(BMessage* message)
36978c1c29bSStephan Aßmus {
37078c1c29bSStephan Aßmus 	switch (message->what) {
37178c1c29bSStephan Aßmus 		case MSG_SET_OBJECT_TYPE: {
37278c1c29bSStephan Aßmus 			int32 type;
37378c1c29bSStephan Aßmus 			if (message->FindInt32("type", &type) >= B_OK) {
37478c1c29bSStephan Aßmus 				fObjectView->SetObjectType(type);
37578c1c29bSStephan Aßmus 				fFillCB->SetEnabled(type != OBJECT_LINE);
376e803c97cSStephan Aßmus 				if (!fFillCB->IsEnabled())
377b7f478e2SStephan Aßmus 					fPenSizeS->SetEnabled(true);
378e803c97cSStephan Aßmus 				else
379b7f478e2SStephan Aßmus 					fPenSizeS->SetEnabled(fFillCB->Value() == B_CONTROL_OFF);
38078c1c29bSStephan Aßmus 			}
38178c1c29bSStephan Aßmus 			break;
38278c1c29bSStephan Aßmus 		}
38378c1c29bSStephan Aßmus 		case MSG_SET_FILL_OR_STROKE: {
38478c1c29bSStephan Aßmus 			int32 value;
38578c1c29bSStephan Aßmus 			if (message->FindInt32("be:value", &value) >= B_OK) {
38678c1c29bSStephan Aßmus 				fObjectView->SetStateFill(value);
387b7f478e2SStephan Aßmus 				fPenSizeS->SetEnabled(value == B_CONTROL_OFF);
38878c1c29bSStephan Aßmus 			}
38978c1c29bSStephan Aßmus 			break;
39078c1c29bSStephan Aßmus 		}
39178c1c29bSStephan Aßmus 		case MSG_SET_COLOR:
39278c1c29bSStephan Aßmus 			fObjectView->SetStateColor(_GetColor());
39381cc749fSStephan Aßmus 			_UpdateColorControls();
39478c1c29bSStephan Aßmus 			break;
39575bf993eSStephan Aßmus 		case MSG_OBJECT_ADDED: {
39675bf993eSStephan Aßmus 			State* object;
39775bf993eSStephan Aßmus 			if (message->FindPointer("object", (void**)&object) >= B_OK) {
39875bf993eSStephan Aßmus 				fObjectLV->AddItem(new ObjectItem("Object", object));
399040ce757SStephan Aßmus 			}
40075bf993eSStephan Aßmus 			// fall through
40175bf993eSStephan Aßmus 		}
40275bf993eSStephan Aßmus 		case MSG_OBJECT_COUNT_CHANGED:
40375bf993eSStephan Aßmus 			fClearB->SetEnabled(fObjectView->CountObjects() > 0);
40478c1c29bSStephan Aßmus 			break;
40575bf993eSStephan Aßmus 		case MSG_OBJECT_SELECTED:
40675bf993eSStephan Aßmus 			if (ObjectItem* item = (ObjectItem*)fObjectLV->ItemAt(fObjectLV->CurrentSelection(0))) {
40775bf993eSStephan Aßmus 				fObjectView->SetState(item->Object());
408b1836934SStephan Aßmus 				fObjectView->SetStateColor(item->Object()->Color());
409b1836934SStephan Aßmus 				_UpdateControls();
41075bf993eSStephan Aßmus 			} else
41175bf993eSStephan Aßmus 				fObjectView->SetState(NULL);
41275bf993eSStephan Aßmus 			break;
413269293b0SStephan Aßmus 		case MSG_REMOVE_OBJECT:
414269293b0SStephan Aßmus 			while (ObjectItem* item = (ObjectItem*)fObjectLV->ItemAt(fObjectLV->CurrentSelection(0))) {
415269293b0SStephan Aßmus 				fObjectView->RemoveObject(item->Object());
416269293b0SStephan Aßmus 				fObjectLV->RemoveItem(item);
417269293b0SStephan Aßmus 				delete item;
418269293b0SStephan Aßmus 			}
419269293b0SStephan Aßmus 			break;
42078c1c29bSStephan Aßmus 		case MSG_NEW_OBJECT:
42178c1c29bSStephan Aßmus 			fObjectView->SetState(NULL);
42278c1c29bSStephan Aßmus 			break;
4234dfc2afbSAxel Dörfler 		case MSG_CLEAR: {
424269293b0SStephan Aßmus 			BAlert *alert = new BAlert("Playground",
425f92bcd19SHumdinger 				B_TRANSLATE("Clear all drawing objects?"),
426f92bcd19SHumdinger 				B_TRANSLATE("Cancel"), B_TRANSLATE("Clear"));
427f92bcd19SHumdinger 			alert->SetShortcut(0, B_ESCAPE);
428590fdd3fSStephan Aßmus 			if (alert->Go() == 1) {
42978c1c29bSStephan Aßmus 				fObjectView->MakeEmpty();
430269293b0SStephan Aßmus 				fObjectLV->MakeEmpty();
431590fdd3fSStephan Aßmus 			}
43278c1c29bSStephan Aßmus 			break;
4334dfc2afbSAxel Dörfler 		}
43478c1c29bSStephan Aßmus 		case MSG_SET_PEN_SIZE:
435b7f478e2SStephan Aßmus 			fObjectView->SetStatePenSize((float)fPenSizeS->Value());
43678c1c29bSStephan Aßmus 			break;
4378e05e376SStephan Aßmus 		case MSG_SET_DRAWING_MODE: {
4388e05e376SStephan Aßmus 			drawing_mode mode;
4398e05e376SStephan Aßmus 			if (message->FindInt32("mode", (int32*)&mode) >= B_OK) {
4408e05e376SStephan Aßmus 				fObjectView->SetStateDrawingMode(mode);
4418e05e376SStephan Aßmus 			}
4428e05e376SStephan Aßmus 			break;
4438e05e376SStephan Aßmus 		}
44478c1c29bSStephan Aßmus 		default:
44578c1c29bSStephan Aßmus 			BWindow::MessageReceived(message);
44678c1c29bSStephan Aßmus 	}
44778c1c29bSStephan Aßmus }
44878c1c29bSStephan Aßmus 
44978c1c29bSStephan Aßmus // _UpdateControls
45078c1c29bSStephan Aßmus void
_UpdateControls() const45178c1c29bSStephan Aßmus ObjectWindow::_UpdateControls() const
45278c1c29bSStephan Aßmus {
45381cc749fSStephan Aßmus 	_UpdateColorControls();
45481cc749fSStephan Aßmus 
45581cc749fSStephan Aßmus 	// update buttons
45681cc749fSStephan Aßmus 	fClearB->SetEnabled(fObjectView->CountObjects() > 0);
45781cc749fSStephan Aßmus 
45881cc749fSStephan Aßmus 	fFillCB->SetEnabled(fObjectView->ObjectType() != OBJECT_LINE);
45981cc749fSStephan Aßmus 
46081cc749fSStephan Aßmus 	// pen size
461b7f478e2SStephan Aßmus 	fPenSizeS->SetValue((int32)fObjectView->StatePenSize());
46281cc749fSStephan Aßmus 
46381cc749fSStephan Aßmus 	// disable penSize if fill is on
46481cc749fSStephan Aßmus 	if (!fFillCB->IsEnabled())
465b7f478e2SStephan Aßmus 		fPenSizeS->SetEnabled(true);
46681cc749fSStephan Aßmus 	else
467b7f478e2SStephan Aßmus 		fPenSizeS->SetEnabled(fFillCB->Value() == B_CONTROL_OFF);
46881cc749fSStephan Aßmus }
46981cc749fSStephan Aßmus 
47081cc749fSStephan Aßmus // _UpdateColorControls
47181cc749fSStephan Aßmus void
_UpdateColorControls() const47281cc749fSStephan Aßmus ObjectWindow::_UpdateColorControls() const
47381cc749fSStephan Aßmus {
47478c1c29bSStephan Aßmus 	// update color
47578c1c29bSStephan Aßmus 	rgb_color c = fObjectView->StateColor();
47678c1c29bSStephan Aßmus 	char string[32];
47778c1c29bSStephan Aßmus 
47878c1c29bSStephan Aßmus 	sprintf(string, "%d", c.alpha);
47978c1c29bSStephan Aßmus 	fAlphaTC->SetText(string);
4806d990309SStephan Aßmus 
4816d990309SStephan Aßmus 	fColorControl->SetValue(c);
48278c1c29bSStephan Aßmus }
48378c1c29bSStephan Aßmus 
48478c1c29bSStephan Aßmus // _GetColor
48578c1c29bSStephan Aßmus rgb_color
_GetColor() const48678c1c29bSStephan Aßmus ObjectWindow::_GetColor() const
48778c1c29bSStephan Aßmus {
48878c1c29bSStephan Aßmus 	rgb_color c;
4896d990309SStephan Aßmus 
4906d990309SStephan Aßmus 	c = fColorControl->ValueAsColor();
49178c1c29bSStephan Aßmus 	c.alpha = max_c(0, min_c(255, atoi(fAlphaTC->Text())));
49278c1c29bSStephan Aßmus 
49378c1c29bSStephan Aßmus 	return c;
49478c1c29bSStephan Aßmus }
49578c1c29bSStephan Aßmus 
496