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