109997491SStephan Aßmus// main.cpp
209997491SStephan Aßmus
309997491SStephan Aßmus#include <stdio.h>
409997491SStephan Aßmus
509997491SStephan Aßmus#include "Application.h"
609997491SStephan Aßmus#include "Message.h"
709997491SStephan Aßmus#include "Button.h"
809997491SStephan Aßmus#include "View.h"
909997491SStephan Aßmus#include "Window.h"
1009997491SStephan Aßmus
1109997491SStephan Aßmus#define MSG_COPY_BITS 'cbts'
1209997491SStephan Aßmus
1309997491SStephan Aßmusclass TestView : public BView {
1409997491SStephan Aßmus
1509997491SStephan Aßmus	enum {
1609997491SStephan Aßmus		TRACKING_NONE,
1709997491SStephan Aßmus		TRACKING_SOURCE,
1809997491SStephan Aßmus		TRACKING_DEST
1909997491SStephan Aßmus	};
2009997491SStephan Aßmus
2109997491SStephan Aßmus public:
2209997491SStephan Aßmus					TestView(BRect frame, const char* name,
2309997491SStephan Aßmus							  uint32 resizeFlags, uint32 flags)
2409997491SStephan Aßmus						: BView(frame, name, resizeFlags, flags),
2509997491SStephan Aßmus						  fTracking(TRACKING_NONE),
2609997491SStephan Aßmus						  fCopyBitsJustCalled(false)
2709997491SStephan Aßmus					{
2809997491SStephan Aßmus						fSourceRect.Set(frame.left, frame.top,
2909997491SStephan Aßmus									    (frame.left + frame.right) / 2,
3009997491SStephan Aßmus									    frame.bottom);
3109997491SStephan Aßmus						fDestRect.Set((frame.left + frame.right) / 2,
3209997491SStephan Aßmus									  frame.top,
3309997491SStephan Aßmus									  frame.right, frame.bottom);
3409997491SStephan Aßmus						fSourceRect.InsetBy(10.0, 10.0);
3509997491SStephan Aßmus						fDestRect.InsetBy(10.0, 10.0);
36dd556785SStephan Aßmus
37d231c2a7Slooncraz						SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
38d231c2a7Slooncraz						SetLowUIColor(ViewUIColor());
3909997491SStephan Aßmus					}
4009997491SStephan Aßmus
4109997491SStephan Aßmus	virtual	void	MessageReceived(BMessage* message);
4209997491SStephan Aßmus
4309997491SStephan Aßmus	virtual	void	Draw(BRect updateRect);
4409997491SStephan Aßmus
4509997491SStephan Aßmus	virtual	void	MouseDown(BPoint where);
4609997491SStephan Aßmus	virtual	void	MouseUp(BPoint where);
4709997491SStephan Aßmus	virtual	void	MouseMoved(BPoint where, uint32 transit,
4809997491SStephan Aßmus							   const BMessage* dragMessage);
4909997491SStephan Aßmus
5009997491SStephan Aßmus private:
5109997491SStephan Aßmus			void	_TrackMouse(BPoint where);
5209997491SStephan Aßmus
5309997491SStephan Aßmus			BRect	fSourceRect;
5409997491SStephan Aßmus			BRect	fDestRect;
5509997491SStephan Aßmus
5609997491SStephan Aßmus			uint32	fTracking;
5709997491SStephan Aßmus
5809997491SStephan Aßmus			bool	fCopyBitsJustCalled;
5909997491SStephan Aßmus};
6009997491SStephan Aßmus
6109997491SStephan Aßmus// MessageReceived
6209997491SStephan Aßmusvoid
6309997491SStephan AßmusTestView::MessageReceived(BMessage* message)
6409997491SStephan Aßmus{
6509997491SStephan Aßmus	if (message->what == MSG_COPY_BITS) {
6609997491SStephan Aßmus		printf("MSG_COPY_BITS\n");
6709997491SStephan Aßmus		fSourceRect.PrintToStream();
6809997491SStephan Aßmus		fDestRect.PrintToStream();
6909997491SStephan Aßmus		CopyBits(fSourceRect, fDestRect);
7009997491SStephan Aßmus		fCopyBitsJustCalled = true;
7109997491SStephan Aßmus	} else
7209997491SStephan Aßmus		BView::MessageReceived(message);
7309997491SStephan Aßmus}
7409997491SStephan Aßmus
7509997491SStephan Aßmus// Draw
7609997491SStephan Aßmusvoid
7709997491SStephan AßmusTestView::Draw(BRect updateRect)
7809997491SStephan Aßmus{
7909997491SStephan Aßmus	if (fCopyBitsJustCalled) {
8009997491SStephan Aßmus		printf("TestView::Draw(%.1f, %.1f, %.1f, %.1f) after CopyBits()\n",
8109997491SStephan Aßmus			   updateRect.left, updateRect.top, updateRect.right, updateRect.bottom);
8209997491SStephan Aßmus		fCopyBitsJustCalled = false;
8309997491SStephan Aßmus	}
8409997491SStephan Aßmus
85dd556785SStephan Aßmus	// background
86dd556785SStephan Aßmus//	SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR));
87dd556785SStephan Aßmus//	FillRect(updateRect);
8809997491SStephan Aßmus
8909997491SStephan Aßmus	BRect r(Bounds());
9009997491SStephan Aßmus
9109997491SStephan Aßmus	// draw some pattern with lines
9209997491SStephan Aßmus	float width = r.Width();
9309997491SStephan Aßmus	float height = r.Height();
9409997491SStephan Aßmus	int32 lineCount = 20;
95dd556785SStephan Aßmus	SetPenSize(2.0);
9609997491SStephan Aßmus	for (int32 i = 0; i < lineCount; i++) {
9709997491SStephan Aßmus		SetHighColor(255, (255 / lineCount) * i, 255 - (255 / lineCount) * i);
9809997491SStephan Aßmus		StrokeLine(BPoint(r.left + (width / lineCount) * i, r.top),
9909997491SStephan Aßmus				   BPoint(r.left, r.top + (height / lineCount) * i));
10009997491SStephan Aßmus		StrokeLine(BPoint(r.right - (width / lineCount) * i, r.bottom),
10109997491SStephan Aßmus				   BPoint(r.right, r.bottom - (height / lineCount) * i));
10209997491SStephan Aßmus	}
103dd556785SStephan Aßmus	StrokeLine(BPoint(r.left, r.bottom), BPoint(r.right, r.top));
104dd556785SStephan Aßmus
105dd556785SStephan Aßmus	// source and dest rect
106dd556785SStephan Aßmus	SetPenSize(1.0);
10709997491SStephan Aßmus
108dd556785SStephan Aßmus	SetHighColor(0, 255, 0, 255);
109dd556785SStephan Aßmus	StrokeRect(fSourceRect);
110dd556785SStephan Aßmus
111dd556785SStephan Aßmus	SetHighColor(0, 0, 255, 255);
112dd556785SStephan Aßmus	StrokeRect(fDestRect);
113dd556785SStephan Aßmus
114dd556785SStephan Aßmus	// text
115dd556785SStephan Aßmus	SetHighColor(128, 0, 50, 255);
11609997491SStephan Aßmus
11709997491SStephan Aßmus	const char* message = "Left-Click and drag";
11809997491SStephan Aßmus	width = StringWidth(message);
11909997491SStephan Aßmus	BPoint p(r.left + r.Width() / 2.0 - width / 2.0,
120dd556785SStephan Aßmus			 r.top + r.Height() / 2.0 - 50.0);
12109997491SStephan Aßmus
12209997491SStephan Aßmus	DrawString(message, p);
12309997491SStephan Aßmus
124dd556785SStephan Aßmus	message = "to set source rect!";
12509997491SStephan Aßmus	width = StringWidth(message);
12609997491SStephan Aßmus	p.x = r.left + r.Width() / 2.0 - width / 2.0;
12709997491SStephan Aßmus	p.y += 20;
12809997491SStephan Aßmus
12909997491SStephan Aßmus	DrawString(message, p);
13009997491SStephan Aßmus
131dd556785SStephan Aßmus	message = "Right-Click and drag";
132dd556785SStephan Aßmus	width = StringWidth(message);
133dd556785SStephan Aßmus	p.x = r.left + r.Width() / 2.0 - width / 2.0;
134dd556785SStephan Aßmus	p.y += 30.0;
13509997491SStephan Aßmus
136dd556785SStephan Aßmus	DrawString(message, p);
137dd556785SStephan Aßmus
138dd556785SStephan Aßmus	message = "to set destination rect!";
139dd556785SStephan Aßmus	width = StringWidth(message);
140dd556785SStephan Aßmus	p.x = r.left + r.Width() / 2.0 - width / 2.0;
141dd556785SStephan Aßmus	p.y += 20;
142dd556785SStephan Aßmus
143dd556785SStephan Aßmus	DrawString(message, p);
14409997491SStephan Aßmus}
14509997491SStephan Aßmus
14609997491SStephan Aßmus// MouseDown
14709997491SStephan Aßmusvoid
14809997491SStephan AßmusTestView::MouseDown(BPoint where)
14909997491SStephan Aßmus{
15009997491SStephan Aßmus	BMessage* message = Window()->CurrentMessage();
15109997491SStephan Aßmus	uint32 buttons;
15209997491SStephan Aßmus	if (message && message->FindInt32("buttons", (int32*)&buttons) >= B_OK) {
15309997491SStephan Aßmus		if (buttons & B_PRIMARY_MOUSE_BUTTON) {
15409997491SStephan Aßmus			fTracking = TRACKING_SOURCE;
15509997491SStephan Aßmus			fSourceRect.left = where.x;
15609997491SStephan Aßmus			fSourceRect.top = where.y;
15709997491SStephan Aßmus		}
15809997491SStephan Aßmus		if (buttons & B_SECONDARY_MOUSE_BUTTON) {
15909997491SStephan Aßmus			fTracking = TRACKING_DEST;
16009997491SStephan Aßmus			fDestRect.left = where.x;
16109997491SStephan Aßmus			fDestRect.top = where.y;
16209997491SStephan Aßmus		}
16309997491SStephan Aßmus		Invalidate();
16409997491SStephan Aßmus		_TrackMouse(where);
16509997491SStephan Aßmus	}
16609997491SStephan Aßmus}
16709997491SStephan Aßmus
16809997491SStephan Aßmus// MouseUp
16909997491SStephan Aßmusvoid
17009997491SStephan AßmusTestView::MouseUp(BPoint where)
17109997491SStephan Aßmus{
17209997491SStephan Aßmus	fTracking = TRACKING_NONE;
17309997491SStephan Aßmus}
17409997491SStephan Aßmus
17509997491SStephan Aßmus// MouseMoved
17609997491SStephan Aßmusvoid
17709997491SStephan AßmusTestView::MouseMoved(BPoint where, uint32 transit,
17809997491SStephan Aßmus					 const BMessage* dragMessage)
17909997491SStephan Aßmus{
18009997491SStephan Aßmus	if (fTracking > TRACKING_NONE) {
18109997491SStephan Aßmus		_TrackMouse(where);
18209997491SStephan Aßmus	}
18309997491SStephan Aßmus}
18409997491SStephan Aßmus
18509997491SStephan Aßmusfloat
18609997491SStephan Aßmusmin4(float a, float b, float c, float d)
18709997491SStephan Aßmus{
18809997491SStephan Aßmus	return min_c(a, min_c(b, min_c(c, d)));
18909997491SStephan Aßmus}
19009997491SStephan Aßmus
19109997491SStephan Aßmusfloat
19209997491SStephan Aßmusmax4(float a, float b, float c, float d)
19309997491SStephan Aßmus{
19409997491SStephan Aßmus	return max_c(a, max_c(b, max_c(c, d)));
19509997491SStephan Aßmus}
19609997491SStephan Aßmus
19709997491SStephan Aßmus// _TrackMouse
19809997491SStephan Aßmusvoid
19909997491SStephan AßmusTestView::_TrackMouse(BPoint where)
20009997491SStephan Aßmus{
20109997491SStephan Aßmus	BRect before;
20209997491SStephan Aßmus	BRect after;
20309997491SStephan Aßmus	bool invalidate = false;
20409997491SStephan Aßmus	switch (fTracking) {
20509997491SStephan Aßmus		case TRACKING_SOURCE:
20609997491SStephan Aßmus			before = fSourceRect;
20709997491SStephan Aßmus			fSourceRect.right = where.x;
20809997491SStephan Aßmus			fSourceRect.bottom = where.y;
20909997491SStephan Aßmus			after = fSourceRect;
21009997491SStephan Aßmus			invalidate = true;
21109997491SStephan Aßmus			break;
21209997491SStephan Aßmus		case TRACKING_DEST:
21309997491SStephan Aßmus			before = fDestRect;
21409997491SStephan Aßmus			fDestRect.right = where.x;
21509997491SStephan Aßmus			fDestRect.bottom = where.y;
21609997491SStephan Aßmus			after = fDestRect;
21709997491SStephan Aßmus			invalidate = true;
21809997491SStephan Aßmus			break;
21909997491SStephan Aßmus	}
22009997491SStephan Aßmus	if (invalidate) {
22109997491SStephan Aßmus		BRect dirty(min4(before.left, before.right, after.left, after.right),
22209997491SStephan Aßmus					min4(before.top, before.bottom, after.top, after.bottom),
22309997491SStephan Aßmus					max4(before.left, before.right, after.left, after.right),
22409997491SStephan Aßmus					max4(before.top, before.bottom, after.top, after.bottom));
22509997491SStephan Aßmus		Invalidate(dirty);
22609997491SStephan Aßmus	}
22709997491SStephan Aßmus}
22809997491SStephan Aßmus
22909997491SStephan Aßmus
23009997491SStephan Aßmus// show_window
23109997491SStephan Aßmusvoid
23209997491SStephan Aßmusshow_window(BRect frame, const char* name)
23309997491SStephan Aßmus{
23409997491SStephan Aßmus	BWindow* window = new BWindow(frame, name,
23509997491SStephan Aßmus								  B_TITLED_WINDOW,
23609997491SStephan Aßmus								  B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE);
23709997491SStephan Aßmus
23809997491SStephan Aßmus	BView* view = new TestView(window->Bounds(), "test", B_FOLLOW_ALL,
23909997491SStephan Aßmus							   B_WILL_DRAW/* | B_FULL_UPDATE_ON_RESIZE*/);
24009997491SStephan Aßmus
24109997491SStephan Aßmus	window->AddChild(view);
24209997491SStephan Aßmus	BRect b(0.0, 0.0, 50.0, 15.0);
24309997491SStephan Aßmus	b.OffsetTo(5.0, view->Bounds().bottom - (b.Height() + 15.0));
24409997491SStephan Aßmus	BButton* control = new BButton(b, "button", "Copy", new BMessage(MSG_COPY_BITS));
24509997491SStephan Aßmus	view->AddChild(control);
24609997491SStephan Aßmus	control->SetTarget(view);
24709997491SStephan Aßmus
248d4962719SStephan Aßmus	// test CopyBits() on top of children
249d4962719SStephan Aßmus	b = BRect(80, 130, 130, 160);
250d4962719SStephan Aßmus	BView* child = new BView(b, "some child", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, 0);
251d4962719SStephan Aßmus	child->SetViewColor(255, 0, 0);
252d4962719SStephan Aßmus	view->AddChild(child);
253d4962719SStephan Aßmus
254d4962719SStephan Aßmus	b = BRect(136, 127, 158, 140);
255d4962719SStephan Aßmus	child = new BView(b, "some other child", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, 0);
256d4962719SStephan Aßmus	child->SetViewColor(255, 255, 0);
257d4962719SStephan Aßmus	view->AddChild(child);
258d4962719SStephan Aßmus
25909997491SStephan Aßmus	window->Show();
26009997491SStephan Aßmus}
26109997491SStephan Aßmus
26209997491SStephan Aßmus// main
26309997491SStephan Aßmusint
26409997491SStephan Aßmusmain(int argc, char** argv)
26509997491SStephan Aßmus{
26609997491SStephan Aßmus	BApplication* app = new BApplication("application/x.vnd-Haiku.CopyBits");
26709997491SStephan Aßmus
26809997491SStephan Aßmus	BRect frame(50.0, 50.0, 300.0, 250.0);
26909997491SStephan Aßmus	show_window(frame, "CopyBits Test");
27009997491SStephan Aßmus
27109997491SStephan Aßmus	app->Run();
27209997491SStephan Aßmus
27309997491SStephan Aßmus	delete app;
27409997491SStephan Aßmus	return 0;
27509997491SStephan Aßmus}
276