1/*
2	Copyright 2007, Francois Revol.   All Rights Reserved.
3	This file may be used under the terms of the Be Sample Code License.
4*/
5
6#include <OS.h>
7#include <Debug.h>
8#include <View.h>
9
10#if DEBUG
11//#include <File.h>
12#include <Alert.h>
13#include <Button.h>
14#include <TextView.h>
15#include <StringIO.h>
16#include "DumpMessage.h"
17#endif
18
19#include "PenInputInkWindow.h"
20#include "PenInputLooper.h"
21#include "PenInputStrings.h"
22
23const rgb_color kInkColor = { 100, 100, 255, 0 };
24
25class PenInputInkView : public BView {
26public:
27	PenInputInkView(BRect frame, PenInputInkWindow *window);
28	virtual ~PenInputInkView();
29	virtual void Draw(BRect udpateRect);
30private:
31	PenInputInkWindow *fWindow;
32};
33
34PenInputInkView::PenInputInkView(BRect frame, PenInputInkWindow *window)
35	: BView(frame, "PenInkView", B_FOLLOW_ALL, B_WILL_DRAW),
36	  fWindow(window)
37{
38
39}
40
41PenInputInkView::~PenInputInkView()
42{
43}
44void PenInputInkView::Draw(BRect udpateRect)
45{
46	/* ugh ? */
47	if (!fWindow)
48		return;
49
50	StrokeShape(&fWindow->fStrokes);
51	//DEBUG:StrokeRect(fWindow->fStrokes.Bounds());
52}
53
54
55
56PenInputInkWindow::PenInputInkWindow(BRect frame)
57	: BWindow(frame, "PenInputInkWindow",
58			  B_NO_BORDER_WINDOW_LOOK,
59			  B_FLOATING_ALL_WINDOW_FEEL,
60			  B_NOT_MOVABLE | B_NOT_CLOSABLE | B_NOT_ZOOMABLE |
61			  B_NOT_MINIMIZABLE | B_NOT_RESIZABLE | B_AVOID_FOCUS,
62			  B_ALL_WORKSPACES),
63	  fStrokeCount(0)
64{
65	PRINT(("%s\n", __FUNCTION__));
66	fInkView = new PenInputInkView(Bounds(), this);
67	fInkView->SetViewColor(B_TRANSPARENT_32_BIT);
68	fInkView->SetLowColor(B_TRANSPARENT_32_BIT);
69	//fInkView->SetHighColor(0,255,0);
70	fInkView->SetHighColor(kInkColor);
71	fInkView->SetPenSize(2.0);
72	AddChild(fInkView);
73}
74
75PenInputInkWindow::~PenInputInkWindow()
76{
77	PRINT(("%s\n", __FUNCTION__));
78}
79
80void PenInputInkWindow::MessageReceived(BMessage *message)
81{
82	BPoint where;
83	switch (message->what) {
84	case MSG_BEGIN_INK:
85		fStrokeCount = 0;
86		fStrokes.Clear();
87		// fall through
88	case MSG_SHOW_WIN:
89		if (IsHidden())
90			Show();
91		break;
92	case MSG_END_INK:
93	case MSG_HIDE_WIN:
94		if (!IsHidden())
95			Hide();
96		break;
97	case B_MOUSE_MOVED:
98		if (message->FindPoint("where", &where) == B_OK) {
99			fStrokes.LineTo(where);
100			fStrokeCount++;
101			//fInkView->Invalidate(fStrokes.Bounds()); // XXX
102			fInkView->Invalidate(Bounds()); // XXX
103		}
104		break;
105	case B_MOUSE_UP:
106		if (message->FindPoint("where", &where) == B_OK) {
107			fStrokes.LineTo(where);
108			fStrokeCount++;
109			//fInkView->Invalidate(fStrokes.Bounds()); // XXX
110			fInkView->Invalidate(Bounds()); // XXX
111		}
112		break;
113	case B_MOUSE_DOWN:
114		if (message->FindPoint("where", &where) == B_OK) {
115			fStrokes.MoveTo(where);
116			//fStrokeCount++;
117			//fInkView->Invalidate(fStrokes.Bounds()); // XXX
118			fInkView->Invalidate(Bounds()); // XXX
119		}
120		break;
121	default:
122		BWindow::MessageReceived(message);
123		return;
124	}
125}
126
127