1bef1ed93SStephan Aßmus
2bef1ed93SStephan Aßmus#ifndef	VIEW_LAYER_H
3bef1ed93SStephan Aßmus#define VIEW_LAYER_H
4bef1ed93SStephan Aßmus
5ff89d51eSStephan Aßmus#include <GraphicsDefs.h>
6bef1ed93SStephan Aßmus#include <Region.h>
7bef1ed93SStephan Aßmus#include <String.h>
8bef1ed93SStephan Aßmus
9ff89d51eSStephan Aßmusclass BList;
10bef1ed93SStephan Aßmusclass DrawingEngine;
11bef1ed93SStephan Aßmusclass WindowLayer;
12bef1ed93SStephan Aßmus
13bef1ed93SStephan Aßmusclass ViewLayer {
14bef1ed93SStephan Aßmus public:
15bef1ed93SStephan Aßmus							ViewLayer(BRect frame,
16bef1ed93SStephan Aßmus									  const char* name,
17bef1ed93SStephan Aßmus									  uint32 reizeMode,
18bef1ed93SStephan Aßmus									  uint32 flags,
19bef1ed93SStephan Aßmus									  rgb_color viewColor);
20bef1ed93SStephan Aßmus
21bef1ed93SStephan Aßmus	virtual					~ViewLayer();
22bef1ed93SStephan Aßmus
23bef1ed93SStephan Aßmus	inline	BRect			Frame() const
24bef1ed93SStephan Aßmus								{ return fFrame; }
25bef1ed93SStephan Aßmus			BRect			Bounds() const;
26748533bbSStephan Aßmus			// converts the given frame up the view hirarchy and
27748533bbSStephan Aßmus			// clips to each views bounds
28748533bbSStephan Aßmus			void			ConvertToVisibleInTopView(BRect* bounds) const;
29bef1ed93SStephan Aßmus
30bef1ed93SStephan Aßmus	inline	rgb_color		ViewColor() const
31bef1ed93SStephan Aßmus								{ return fViewColor; }
32bef1ed93SStephan Aßmus
33748533bbSStephan Aßmus			void			AttachedToWindow(WindowLayer* window);
34bef1ed93SStephan Aßmus			void			DetachedFromWindow();
35bef1ed93SStephan Aßmus
36bef1ed93SStephan Aßmus			// tree stuff
37bef1ed93SStephan Aßmus			void			AddChild(ViewLayer* layer);
38bef1ed93SStephan Aßmus			bool			RemoveChild(ViewLayer* layer);
39bef1ed93SStephan Aßmus
40bef1ed93SStephan Aßmus	inline	ViewLayer*		Parent() const
41bef1ed93SStephan Aßmus								{ return fParent; }
42bef1ed93SStephan Aßmus
43bef1ed93SStephan Aßmus			ViewLayer*		FirstChild() const;
44bef1ed93SStephan Aßmus			ViewLayer*		PreviousChild() const;
45bef1ed93SStephan Aßmus			ViewLayer*		NextChild() const;
46bef1ed93SStephan Aßmus			ViewLayer*		LastChild() const;
47bef1ed93SStephan Aßmus
48bef1ed93SStephan Aßmus			ViewLayer*		TopLayer();
49bef1ed93SStephan Aßmus
50ff89d51eSStephan Aßmus			uint32			CountChildren(bool deep = false) const;
51ff89d51eSStephan Aßmus			void			CollectTokensForChildren(BList* tokenMap) const;
52bef1ed93SStephan Aßmus
537943e1a8SStephan Aßmus			ViewLayer*		ViewAt(const BPoint& where,
547943e1a8SStephan Aßmus								   BRegion* windowContentClipping);
557943e1a8SStephan Aßmus
56bef1ed93SStephan Aßmus			// coordinate conversion
570b78f37eSStephan Aßmus			void			ConvertToParent(BPoint* point) const;
580b78f37eSStephan Aßmus			void			ConvertToParent(BRect* rect) const;
590b78f37eSStephan Aßmus			void			ConvertToParent(BRegion* region) const;
600b78f37eSStephan Aßmus
617241178eSStephan Aßmus			void			ConvertFromParent(BPoint* point) const;
627241178eSStephan Aßmus			void			ConvertFromParent(BRect* rect) const;
637241178eSStephan Aßmus			void			ConvertFromParent(BRegion* region) const;
647241178eSStephan Aßmus
65bef1ed93SStephan Aßmus			void			ConvertToTop(BPoint* point) const;
66bef1ed93SStephan Aßmus			void			ConvertToTop(BRect* rect) const;
67bef1ed93SStephan Aßmus			void			ConvertToTop(BRegion* region) const;
68bef1ed93SStephan Aßmus
69748533bbSStephan Aßmus			void			ConvertFromTop(BPoint* point) const;
70748533bbSStephan Aßmus			void			ConvertFromTop(BRect* rect) const;
71748533bbSStephan Aßmus			void			ConvertFromTop(BRegion* region) const;
72748533bbSStephan Aßmus
73bef1ed93SStephan Aßmus			// settings
74bef1ed93SStephan Aßmus			void			SetName(const char* string);
75bef1ed93SStephan Aßmus	inline	const char*		Name() const
76bef1ed93SStephan Aßmus								{ return fName.String(); }
77bef1ed93SStephan Aßmus
787f705589SStephan Aßmus			void			MoveBy(			int32 dx, int32 dy,
797f705589SStephan Aßmus											BRegion* dirtyRegion);
80bef1ed93SStephan Aßmus
817f705589SStephan Aßmus			void			ResizeBy(		int32 dx, int32 dy,
827f705589SStephan Aßmus											BRegion* dirtyRegion);
837f705589SStephan Aßmus
847f705589SStephan Aßmus			void			ScrollBy(		int32 dx, int32 dy,
857f705589SStephan Aßmus											BRegion* dirtyRegion);
867f705589SStephan Aßmus
877f705589SStephan Aßmus			void			ParentResized(	int32 dx, int32 dy,
887f705589SStephan Aßmus											BRegion* dirtyRegion);
890b78f37eSStephan Aßmus
90ff89d51eSStephan Aßmus			// for background clearing
917f705589SStephan Aßmus			void			Draw(			DrawingEngine* drawingEngine,
927f705589SStephan Aßmus											BRegion* effectiveClipping,
937f705589SStephan Aßmus											BRegion* windowContentClipping,
947f705589SStephan Aßmus											bool deep = false);
95bef1ed93SStephan Aßmus
967f705589SStephan Aßmus			// to simulate drawing triggered from client side
977f705589SStephan Aßmus			void			ClientDraw(		DrawingEngine* drawingEngine,
987f705589SStephan Aßmus											BRegion* effectiveClipping);
99ff89d51eSStephan Aßmus
1008c8275c2SStephan Aßmus			void			SetHidden(bool hidden);
101bef1ed93SStephan Aßmus			bool			IsHidden() const;
1028c8275c2SStephan Aßmus
1038c8275c2SStephan Aßmus			// takes into account parent views hidden status
1048c8275c2SStephan Aßmus			bool			IsVisible() const
1058c8275c2SStephan Aßmus								{ return fVisible; }
1068c8275c2SStephan Aßmus			// update visible status for this view and all children
1078c8275c2SStephan Aßmus			// according to the parents visibility
1088c8275c2SStephan Aßmus			void			UpdateVisibleDeep(bool parentVisible);
109bef1ed93SStephan Aßmus
110bef1ed93SStephan Aßmus			// clipping
111ff89d51eSStephan Aßmus			void			RebuildClipping(bool deep);
1127f705589SStephan Aßmus			BRegion&		ScreenClipping(BRegion* windowContentClipping,
1137f705589SStephan Aßmus										   bool force = false) const;
1148c8275c2SStephan Aßmus			void			InvalidateScreenClipping(bool deep);
115bef1ed93SStephan Aßmus
116bef1ed93SStephan Aßmus			// debugging
117bef1ed93SStephan Aßmus			void			PrintToStream() const;
118bef1ed93SStephan Aßmus
119bef1ed93SStephan Aßmusprivate:
120ff89d51eSStephan Aßmus			void			_MoveScreenClipping(int32 x, int32 y,
121ff89d51eSStephan Aßmus												bool deep);
122bef1ed93SStephan Aßmus
123bef1ed93SStephan Aßmus			BString			fName;
124bef1ed93SStephan Aßmus			// area within parent coordinate space
125bef1ed93SStephan Aßmus			BRect			fFrame;
126bef1ed93SStephan Aßmus			// scrolling offset
127bef1ed93SStephan Aßmus			BPoint			fScrollingOffset;
128bef1ed93SStephan Aßmus
129bef1ed93SStephan Aßmus			rgb_color		fViewColor;
130bef1ed93SStephan Aßmus
131bef1ed93SStephan Aßmus			uint32			fResizeMode;
132bef1ed93SStephan Aßmus			uint32			fFlags;
13312aa597dSAdi Oanca			bool			fHidden;
1348c8275c2SStephan Aßmus			bool			fVisible;
135bef1ed93SStephan Aßmus
136bef1ed93SStephan Aßmus			WindowLayer*	fWindow;
137bef1ed93SStephan Aßmus			ViewLayer*		fParent;
138bef1ed93SStephan Aßmus
139bef1ed93SStephan Aßmus			ViewLayer*		fFirstChild;
140bef1ed93SStephan Aßmus			ViewLayer*		fPreviousSibling;
141bef1ed93SStephan Aßmus			ViewLayer*		fNextSibling;
142bef1ed93SStephan Aßmus			ViewLayer*		fLastChild;
143bef1ed93SStephan Aßmus
144bef1ed93SStephan Aßmus			// used for traversing the childs
145bef1ed93SStephan Aßmus	mutable	ViewLayer*		fCurrentChild;
146bef1ed93SStephan Aßmus
147bef1ed93SStephan Aßmus			// clipping
148bef1ed93SStephan Aßmus			BRegion			fLocalClipping;
149bef1ed93SStephan Aßmus
150bef1ed93SStephan Aßmus	mutable	BRegion			fScreenClipping;
151bef1ed93SStephan Aßmus	mutable	bool			fScreenClippingValid;
152bef1ed93SStephan Aßmus
153bef1ed93SStephan Aßmus};
154bef1ed93SStephan Aßmus
155bef1ed93SStephan Aßmus#endif // LAYER_H