1*dd98ed8dSStephan Aßmus // main.cpp
2*dd98ed8dSStephan Aßmus
3*dd98ed8dSStephan Aßmus #include <stdio.h>
4*dd98ed8dSStephan Aßmus #include <stdlib.h>
5*dd98ed8dSStephan Aßmus
6*dd98ed8dSStephan Aßmus #include <Application.h>
7*dd98ed8dSStephan Aßmus #include <Message.h>
8*dd98ed8dSStephan Aßmus #include <Button.h>
9*dd98ed8dSStephan Aßmus #include <View.h>
10*dd98ed8dSStephan Aßmus #include <Window.h>
11*dd98ed8dSStephan Aßmus
12*dd98ed8dSStephan Aßmus enum {
13*dd98ed8dSStephan Aßmus TRACKING_NONE = 0,
14*dd98ed8dSStephan Aßmus TRACKING_ALL,
15*dd98ed8dSStephan Aßmus TRACKING_RIGHT,
16*dd98ed8dSStephan Aßmus TRACKING_BOTTOM,
17*dd98ed8dSStephan Aßmus TRACKING_RIGHT_BOTTOM,
18*dd98ed8dSStephan Aßmus };
19*dd98ed8dSStephan Aßmus
20*dd98ed8dSStephan Aßmus class TestView : public BView {
21*dd98ed8dSStephan Aßmus
22*dd98ed8dSStephan Aßmus public:
TestView(BRect frame,const char * name,uint32 resizeFlags,uint32 flags)23*dd98ed8dSStephan Aßmus TestView(BRect frame, const char* name,
24*dd98ed8dSStephan Aßmus uint32 resizeFlags, uint32 flags)
25*dd98ed8dSStephan Aßmus : BView(frame, name, resizeFlags, flags),
26*dd98ed8dSStephan Aßmus fTracking(TRACKING_NONE),
27*dd98ed8dSStephan Aßmus fLastMousePos(0.0, 0.0)
28*dd98ed8dSStephan Aßmus {
29*dd98ed8dSStephan Aßmus rgb_color color;
30*dd98ed8dSStephan Aßmus color.red = rand() / 256;
31*dd98ed8dSStephan Aßmus color.green = rand() / 256;
32*dd98ed8dSStephan Aßmus color.blue = rand() / 256;
33*dd98ed8dSStephan Aßmus color.alpha = 255;
34*dd98ed8dSStephan Aßmus SetViewColor(color);
35*dd98ed8dSStephan Aßmus SetLowColor(color);
36*dd98ed8dSStephan Aßmus }
37*dd98ed8dSStephan Aßmus
38*dd98ed8dSStephan Aßmus virtual void Draw(BRect updateRect);
39*dd98ed8dSStephan Aßmus
40*dd98ed8dSStephan Aßmus virtual void MouseDown(BPoint where);
41*dd98ed8dSStephan Aßmus virtual void MouseUp(BPoint where);
42*dd98ed8dSStephan Aßmus virtual void MouseMoved(BPoint where, uint32 transit,
43*dd98ed8dSStephan Aßmus const BMessage* dragMessage);
44*dd98ed8dSStephan Aßmus
45*dd98ed8dSStephan Aßmus private:
46*dd98ed8dSStephan Aßmus uint32 fTracking;
47*dd98ed8dSStephan Aßmus
48*dd98ed8dSStephan Aßmus BPoint fLastMousePos;
49*dd98ed8dSStephan Aßmus };
50*dd98ed8dSStephan Aßmus
51*dd98ed8dSStephan Aßmus // Draw
52*dd98ed8dSStephan Aßmus void
Draw(BRect updateRect)53*dd98ed8dSStephan Aßmus TestView::Draw(BRect updateRect)
54*dd98ed8dSStephan Aßmus {
55*dd98ed8dSStephan Aßmus // text
56*dd98ed8dSStephan Aßmus SetHighColor(0, 0, 0, 255);
57*dd98ed8dSStephan Aßmus const char* message = "Click and drag to move this view!";
58*dd98ed8dSStephan Aßmus DrawString(message, BPoint(20.0, 30.0));
59*dd98ed8dSStephan Aßmus
60*dd98ed8dSStephan Aßmus BRect r(Bounds());
61*dd98ed8dSStephan Aßmus r.right -= 15.0;
62*dd98ed8dSStephan Aßmus r.bottom -= 15.0;
63*dd98ed8dSStephan Aßmus StrokeLine(r.RightTop(), BPoint(r.right, Bounds().bottom));
64*dd98ed8dSStephan Aßmus StrokeLine(r.LeftBottom(), BPoint(Bounds().right, r.bottom));
65*dd98ed8dSStephan Aßmus }
66*dd98ed8dSStephan Aßmus
67*dd98ed8dSStephan Aßmus // MouseDown
68*dd98ed8dSStephan Aßmus void
MouseDown(BPoint where)69*dd98ed8dSStephan Aßmus TestView::MouseDown(BPoint where)
70*dd98ed8dSStephan Aßmus {
71*dd98ed8dSStephan Aßmus BRect r(Bounds());
72*dd98ed8dSStephan Aßmus r.right -= 15.0;
73*dd98ed8dSStephan Aßmus r.bottom -= 15.0;
74*dd98ed8dSStephan Aßmus if (r.Contains(where))
75*dd98ed8dSStephan Aßmus fTracking = TRACKING_ALL;
76*dd98ed8dSStephan Aßmus else if (r.bottom < where.y && r.right < where.x)
77*dd98ed8dSStephan Aßmus fTracking = TRACKING_RIGHT_BOTTOM;
78*dd98ed8dSStephan Aßmus else if (r.bottom < where.y)
79*dd98ed8dSStephan Aßmus fTracking = TRACKING_BOTTOM;
80*dd98ed8dSStephan Aßmus else if (r.right < where.x)
81*dd98ed8dSStephan Aßmus fTracking = TRACKING_RIGHT;
82*dd98ed8dSStephan Aßmus
83*dd98ed8dSStephan Aßmus fLastMousePos = where;
84*dd98ed8dSStephan Aßmus SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
85*dd98ed8dSStephan Aßmus }
86*dd98ed8dSStephan Aßmus
87*dd98ed8dSStephan Aßmus // MouseUp
88*dd98ed8dSStephan Aßmus void
MouseUp(BPoint where)89*dd98ed8dSStephan Aßmus TestView::MouseUp(BPoint where)
90*dd98ed8dSStephan Aßmus {
91*dd98ed8dSStephan Aßmus fTracking = TRACKING_NONE;
92*dd98ed8dSStephan Aßmus }
93*dd98ed8dSStephan Aßmus
94*dd98ed8dSStephan Aßmus // MouseMoved
95*dd98ed8dSStephan Aßmus void
MouseMoved(BPoint where,uint32 transit,const BMessage * dragMessage)96*dd98ed8dSStephan Aßmus TestView::MouseMoved(BPoint where, uint32 transit,
97*dd98ed8dSStephan Aßmus const BMessage* dragMessage)
98*dd98ed8dSStephan Aßmus {
99*dd98ed8dSStephan Aßmus BPoint offset = where - fLastMousePos;
100*dd98ed8dSStephan Aßmus switch (fTracking) {
101*dd98ed8dSStephan Aßmus case TRACKING_ALL:
102*dd98ed8dSStephan Aßmus MoveBy(offset.x, offset.y);
103*dd98ed8dSStephan Aßmus // fLastMousePos stays fixed
104*dd98ed8dSStephan Aßmus break;
105*dd98ed8dSStephan Aßmus case TRACKING_RIGHT:
106*dd98ed8dSStephan Aßmus ResizeBy(offset.x, 0.0);
107*dd98ed8dSStephan Aßmus fLastMousePos = where;
108*dd98ed8dSStephan Aßmus break;
109*dd98ed8dSStephan Aßmus case TRACKING_BOTTOM:
110*dd98ed8dSStephan Aßmus ResizeBy(0.0, offset.y);
111*dd98ed8dSStephan Aßmus fLastMousePos = where;
112*dd98ed8dSStephan Aßmus break;
113*dd98ed8dSStephan Aßmus case TRACKING_RIGHT_BOTTOM:
114*dd98ed8dSStephan Aßmus ResizeBy(offset.x, offset.y);
115*dd98ed8dSStephan Aßmus fLastMousePos = where;
116*dd98ed8dSStephan Aßmus break;
117*dd98ed8dSStephan Aßmus }
118*dd98ed8dSStephan Aßmus }
119*dd98ed8dSStephan Aßmus
120*dd98ed8dSStephan Aßmus
121*dd98ed8dSStephan Aßmus
122*dd98ed8dSStephan Aßmus // show_window
123*dd98ed8dSStephan Aßmus void
show_window(BRect frame,const char * name)124*dd98ed8dSStephan Aßmus show_window(BRect frame, const char* name)
125*dd98ed8dSStephan Aßmus {
126*dd98ed8dSStephan Aßmus BWindow* window = new BWindow(frame, name,
127*dd98ed8dSStephan Aßmus B_TITLED_WINDOW,
128*dd98ed8dSStephan Aßmus B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE);
129*dd98ed8dSStephan Aßmus
130*dd98ed8dSStephan Aßmus BView* view = new TestView(window->Bounds(), "test 1", B_FOLLOW_ALL,
131*dd98ed8dSStephan Aßmus B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
132*dd98ed8dSStephan Aßmus
133*dd98ed8dSStephan Aßmus window->AddChild(view);
134*dd98ed8dSStephan Aßmus
135*dd98ed8dSStephan Aßmus BRect bounds = view->Bounds();
136*dd98ed8dSStephan Aßmus bounds.InsetBy(20, 20);
137*dd98ed8dSStephan Aßmus BView* view1 = new TestView(bounds, "test 2", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM,
138*dd98ed8dSStephan Aßmus B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
139*dd98ed8dSStephan Aßmus view->AddChild(view1);
140*dd98ed8dSStephan Aßmus
141*dd98ed8dSStephan Aßmus bounds = view1->Bounds();
142*dd98ed8dSStephan Aßmus bounds.InsetBy(20, 20);
143*dd98ed8dSStephan Aßmus BView* view2 = new TestView(bounds, "test 3", B_FOLLOW_NONE,
144*dd98ed8dSStephan Aßmus B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE);
145*dd98ed8dSStephan Aßmus view1->AddChild(view2);
146*dd98ed8dSStephan Aßmus
147*dd98ed8dSStephan Aßmus
148*dd98ed8dSStephan Aßmus window->Show();
149*dd98ed8dSStephan Aßmus }
150*dd98ed8dSStephan Aßmus
151*dd98ed8dSStephan Aßmus // main
152*dd98ed8dSStephan Aßmus int
main(int argc,char ** argv)153*dd98ed8dSStephan Aßmus main(int argc, char** argv)
154*dd98ed8dSStephan Aßmus {
155*dd98ed8dSStephan Aßmus BApplication* app = new BApplication("application/x.vnd-Haiku.Following");
156*dd98ed8dSStephan Aßmus
157*dd98ed8dSStephan Aßmus BRect frame(50.0, 50.0, 300.0, 250.0);
158*dd98ed8dSStephan Aßmus show_window(frame, "Following Test");
159*dd98ed8dSStephan Aßmus
160*dd98ed8dSStephan Aßmus app->Run();
161*dd98ed8dSStephan Aßmus
162*dd98ed8dSStephan Aßmus delete app;
163*dd98ed8dSStephan Aßmus return 0;
164*dd98ed8dSStephan Aßmus }
165