1/*
2 * Copyright 2006-2007, 2011, Stephan A��mus <superstippi@gmx.de>
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5#ifndef CANVAS_VIEW_H
6#define CANVAS_VIEW_H
7
8
9#include "Icon.h"
10#include "Scrollable.h"
11#include "StateView.h"
12
13
14class BBitmap;
15
16_BEGIN_ICON_NAMESPACE
17	class IconRenderer;
18_END_ICON_NAMESPACE
19
20_USING_ICON_NAMESPACE
21
22
23enum {
24	SNAPPING_OFF	= 0,
25	SNAPPING_64,
26	SNAPPING_32,
27	SNAPPING_16,
28};
29
30
31class CanvasView : public StateView, public Scrollable, public IconListener {
32public:
33								CanvasView(BRect frame);
34	virtual						~CanvasView();
35
36	// StateView interface
37	virtual	void				AttachedToWindow();
38	virtual	void				FrameResized(float width, float height);
39	virtual	void				Draw(BRect updateRect);
40
41	virtual	void				MouseDown(BPoint where);
42	virtual	void				MouseUp(BPoint where);
43	virtual	void				MouseMoved(BPoint where, uint32 transit,
44									const BMessage* dragMessage);
45	virtual	void				FilterMouse(BPoint* where) const;
46
47	virtual	bool				MouseWheelChanged(BPoint where,
48									float x, float y);
49
50	// Scrollable interface
51protected:
52	virtual	void				SetScrollOffset(BPoint newOffset);
53	virtual	void				ScrollOffsetChanged(BPoint oldOffset,
54									BPoint newOffset);
55	virtual	void				VisibleSizeChanged(float oldWidth,
56									float oldHeight, float newWidth,
57									float newHeight);
58	// IconListener interface
59public:
60	virtual	void				AreaInvalidated(const BRect& area);
61
62	// CanvasView
63			void				SetIcon(Icon* icon);
64
65	inline	float				ZoomLevel() const
66									{ return fZoomLevel; }
67
68			void				SetMouseFilterMode(uint32 mode);
69			uint32				MouseFilterMode() const
70									{ return fMouseFilterMode; }
71
72			void				ConvertFromCanvas(BPoint* point) const;
73			void				ConvertToCanvas(BPoint* point) const;
74
75			void				ConvertFromCanvas(BRect* rect) const;
76			void				ConvertToCanvas(BRect* rect) const;
77
78protected:
79	// StateView interface
80	virtual	bool				_HandleKeyDown(uint32 key, uint32 modifiers);
81	virtual	bool				_HandleKeyUp(uint32 key, uint32 modifiers);
82
83	// CanvasView
84			BRect				_CanvasRect() const;
85
86			void				_AllocBackBitmap(float width,
87												 float height);
88			void				_FreeBackBitmap();
89			void				_DrawInto(BView* view,
90									BRect updateRect);
91
92			void				_MakeBackground();
93
94			void				_UpdateToolCursor();
95
96private:
97			double				_NextZoomInLevel(double zoom) const;
98			double				_NextZoomOutLevel(double zoom) const;
99			void				_SetZoom(double zoomLevel,
100									bool mouseIsAnchor = true);
101			BRect				_LayoutCanvas();
102
103private:
104			BBitmap*			fBitmap;
105			BBitmap*			fBackground;
106
107			Icon*				fIcon;
108			IconRenderer*		fRenderer;
109			BRect				fDirtyIconArea;
110
111			BPoint				fCanvasOrigin;
112			double				fZoomLevel;
113
114			bool				fSpaceHeldDown;
115			bool				fInScrollTo;
116			bool				fScrollTracking;
117			BPoint				fScrollTrackingStart;
118			BPoint				fScrollOffsetStart;
119
120			uint32				fMouseFilterMode;
121};
122
123#endif // CANVAS_VIEW_H
124