xref: /haiku/src/tests/servers/app/following/main.cpp (revision dd98ed8dfcfe69c729b06f4d3deb9cbc82015552)
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