1#include <Application.h>
2#include <Bitmap.h>
3#include <Region.h>
4#include <View.h>
5#include <Window.h>
6#include <stdio.h>
7
8
9class ClippingView : public BView {
10public:
11							ClippingView(BRect frame);
12
13virtual	void				Draw(BRect updateRect);
14virtual	void				MouseDown(BPoint where);
15virtual	void				KeyDown(const char *bytes, int32 numBytes);
16
17private:
18		BWindow *			fFloatingWindow;
19};
20
21
22class ClippingWindow : public BWindow {
23public:
24							ClippingWindow(BRect frame);
25
26private:
27		ClippingView *		fView;
28};
29
30
31class ClippingApp : public BApplication {
32public:
33							ClippingApp();
34
35private:
36		ClippingWindow *	fWindow;
37};
38
39
40ClippingApp::ClippingApp()
41	:	BApplication("application/x.vnd-Haiku.ClippingPlusRedraw")
42{
43	fWindow = new ClippingWindow(BRect(200, 200, 500, 400));
44	fWindow->Show();
45}
46
47
48ClippingWindow::ClippingWindow(BRect frame)
49	:	BWindow(frame, "Window", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE)
50{
51	fView = new ClippingView(frame.OffsetToSelf(0, 0));
52	AddChild(fView);
53	fView->MakeFocus();
54}
55
56
57ClippingView::ClippingView(BRect frame)
58	:	BView(frame, "View", B_FOLLOW_ALL, B_WILL_DRAW),
59		fFloatingWindow(NULL)
60{
61}
62
63
64void
65ClippingView::Draw(BRect updateRect)
66{
67	printf("got draw with update rect: %f, %f, %f, %f\n",
68		updateRect.left, updateRect.top, updateRect.right, updateRect.bottom);
69
70	SetHighColor(0, 255, 0);
71	FillRect(Bounds(), B_SOLID_HIGH);
72}
73
74
75void
76ClippingView::MouseDown(BPoint where)
77{
78	if (fFloatingWindow == NULL) {
79		BPoint leftTop = ConvertToScreen(BPoint(50, 50));
80		fFloatingWindow = new BWindow(BRect(leftTop, leftTop + BPoint(100, 50)),
81			"Floating", B_FLOATING_WINDOW, B_AVOID_FOCUS);
82		fFloatingWindow->Show();
83	} else {
84		fFloatingWindow->Lock();
85		fFloatingWindow->Quit();
86		fFloatingWindow = NULL;
87	}
88}
89
90
91void
92ClippingView::KeyDown(const char *bytes, int32 numBytes)
93{
94	SetHighColor(0, 0, 255);
95	FillRect(Bounds(), B_SOLID_HIGH);
96
97	BRegion region(BRect(200, 100, 250, 150));
98	ConstrainClippingRegion(&region);
99
100	SetHighColor(255, 0, 0);
101	FillRect(Bounds(), B_SOLID_HIGH);
102}
103
104
105int
106main(int argc, const char *argv[])
107{
108	ClippingApp *app = new ClippingApp();
109	app->Run();
110	delete app;
111	return 0;
112}
113