xref: /haiku/src/apps/icon-o-matic/generic/gui/scrollview/ScrollView.h (revision c4ce9e76075d8a9b4a380cedfa790739c7d03585)
1128277c9SStephan Aßmus /*
2128277c9SStephan Aßmus  * Copyright 2006, Haiku.
3128277c9SStephan Aßmus  * Distributed under the terms of the MIT License.
4128277c9SStephan Aßmus  *
5128277c9SStephan Aßmus  * Authors:
6128277c9SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7128277c9SStephan Aßmus  *		Ingo Weinhold <bonefish@cs.tu-berlin.de>
8128277c9SStephan Aßmus  */
9128277c9SStephan Aßmus 
10128277c9SStephan Aßmus #ifndef SCROLL_VIEW_H
11128277c9SStephan Aßmus #define SCROLL_VIEW_H
12128277c9SStephan Aßmus 
13128277c9SStephan Aßmus #include <View.h>
14128277c9SStephan Aßmus 
15128277c9SStephan Aßmus #include "Scroller.h"
16128277c9SStephan Aßmus 
17128277c9SStephan Aßmus class Scrollable;
18128277c9SStephan Aßmus class InternalScrollBar;
19128277c9SStephan Aßmus class ScrollCorner;
20128277c9SStephan Aßmus 
21128277c9SStephan Aßmus enum {
22128277c9SStephan Aßmus 	SCROLL_HORIZONTAL						= 0x01,
23128277c9SStephan Aßmus 	SCROLL_VERTICAL							= 0x02,
24128277c9SStephan Aßmus 	SCROLL_HORIZONTAL_MAGIC					= 0x04,
25128277c9SStephan Aßmus 	SCROLL_VERTICAL_MAGIC					= 0x08,
26*c4ce9e76SStephan Aßmus 	SCROLL_VISIBLE_RECT_IS_CHILD_BOUNDS		= 0x10
27128277c9SStephan Aßmus };
28128277c9SStephan Aßmus 
29*c4ce9e76SStephan Aßmus enum {
30*c4ce9e76SStephan Aßmus 	BORDER_LEFT		= 0x01,
31*c4ce9e76SStephan Aßmus 	BORDER_TOP		= 0x02,
32*c4ce9e76SStephan Aßmus 	BORDER_RIGHT	= 0x04,
33*c4ce9e76SStephan Aßmus 	BORDER_BOTTOM	= 0x08,
34*c4ce9e76SStephan Aßmus 	BORDER_ALL		= BORDER_LEFT | BORDER_TOP | BORDER_RIGHT | BORDER_BOTTOM
35*c4ce9e76SStephan Aßmus };
36*c4ce9e76SStephan Aßmus 
37*c4ce9e76SStephan Aßmus 
38128277c9SStephan Aßmus class ScrollView : public BView, public Scroller {
39128277c9SStephan Aßmus  public:
40*c4ce9e76SStephan Aßmus 								ScrollView(BView* child, uint32 scrollingFlags,
41*c4ce9e76SStephan Aßmus 									BRect frame, const char *name,
42*c4ce9e76SStephan Aßmus 									uint32 resizingMode, uint32 viewFlags,
43*c4ce9e76SStephan Aßmus 									uint32 borderStyle = B_FANCY_BORDER,
44*c4ce9e76SStephan Aßmus 									uint32 borderFlags = BORDER_ALL);
45128277c9SStephan Aßmus 	virtual						~ScrollView();
46128277c9SStephan Aßmus 
47128277c9SStephan Aßmus 	virtual	void				AllAttached();
48128277c9SStephan Aßmus 	virtual	void				Draw(BRect updateRect);
49128277c9SStephan Aßmus 	virtual	void				FrameResized(float width, float height);
50128277c9SStephan Aßmus 	virtual	void				WindowActivated(bool activated);
51128277c9SStephan Aßmus 
52f10474fcSStephan Aßmus #ifdef __HAIKU__
53f10474fcSStephan Aßmus 	virtual	BSize				MinSize();
54f10474fcSStephan Aßmus 	virtual	BSize				PreferredSize();
55f10474fcSStephan Aßmus #endif
56f10474fcSStephan Aßmus 
57f10474fcSStephan Aßmus 
58128277c9SStephan Aßmus 			uint32				ScrollingFlags() const;
59128277c9SStephan Aßmus 			void				SetVisibleRectIsChildBounds(bool flag);
60128277c9SStephan Aßmus 			bool				VisibleRectIsChildBounds() const;
61128277c9SStephan Aßmus 
62128277c9SStephan Aßmus 			BView*				Child() const;
63128277c9SStephan Aßmus 			void				ChildFocusChanged(bool focused);
64128277c9SStephan Aßmus 
65128277c9SStephan Aßmus 			BScrollBar*			HScrollBar() const;
66128277c9SStephan Aßmus 			BScrollBar*			VScrollBar() const;
67128277c9SStephan Aßmus 			BView*				HVScrollCorner() const;
68128277c9SStephan Aßmus 
69128277c9SStephan Aßmus 			void				SetHSmallStep(float hStep);
70128277c9SStephan Aßmus 			void				SetVSmallStep(float vStep);
71128277c9SStephan Aßmus 			void				SetSmallSteps(float hStep, float vStep);
72128277c9SStephan Aßmus 			void				GetSmallSteps(float* hStep,
73128277c9SStephan Aßmus 											  float* vStep) const;
74128277c9SStephan Aßmus 			float				HSmallStep() const;
75128277c9SStephan Aßmus 			float				VSmallStep() const;
76128277c9SStephan Aßmus 
77128277c9SStephan Aßmus  protected:
78128277c9SStephan Aßmus 	virtual	void				DataRectChanged(BRect oldDataRect,
79128277c9SStephan Aßmus 												BRect newDataRect);
80128277c9SStephan Aßmus 	virtual	void				ScrollOffsetChanged(BPoint oldOffset,
81128277c9SStephan Aßmus 													BPoint newOffset);
82128277c9SStephan Aßmus 	virtual	void				VisibleSizeChanged(float oldWidth,
83128277c9SStephan Aßmus 												   float oldHeight,
84128277c9SStephan Aßmus 												   float newWidth,
85128277c9SStephan Aßmus 												   float newHeight);
86128277c9SStephan Aßmus 	virtual	void				ScrollTargetChanged(Scrollable* oldTarget,
87128277c9SStephan Aßmus 													Scrollable* newTarget);
88128277c9SStephan Aßmus 
89128277c9SStephan Aßmus  private:
90128277c9SStephan Aßmus 			BView*				fChild;			// child view
91128277c9SStephan Aßmus 			uint32				fScrollingFlags;
92128277c9SStephan Aßmus 			InternalScrollBar*	fHScrollBar;	// horizontal scroll bar
93128277c9SStephan Aßmus 			InternalScrollBar*	fVScrollBar;	// vertical scroll bar
94128277c9SStephan Aßmus 			ScrollCorner*		fScrollCorner;	// scroll corner
95128277c9SStephan Aßmus 			bool				fHVisible;		// horizontal/vertical scroll
96128277c9SStephan Aßmus 			bool				fVVisible;		// bar visible flag
97128277c9SStephan Aßmus 			bool				fCornerVisible;	// scroll corner visible flag
98128277c9SStephan Aßmus 			bool				fWindowActive;
99128277c9SStephan Aßmus 			bool				fChildFocused;
100128277c9SStephan Aßmus 			float				fHSmallStep;
101128277c9SStephan Aßmus 			float				fVSmallStep;
102128277c9SStephan Aßmus 
103*c4ce9e76SStephan Aßmus 			uint32				fBorderStyle;
104*c4ce9e76SStephan Aßmus 			uint32				fBorderFlags;
105*c4ce9e76SStephan Aßmus 
106128277c9SStephan Aßmus 			void				_ScrollValueChanged(
107128277c9SStephan Aßmus 										InternalScrollBar* scrollBar,
108128277c9SStephan Aßmus 										float value);
109128277c9SStephan Aßmus 			void				_ScrollCornerValueChanged(BPoint offset);
110128277c9SStephan Aßmus 
111128277c9SStephan Aßmus protected:
112128277c9SStephan Aßmus 	virtual	void				_Layout(uint32 flags);
113128277c9SStephan Aßmus 
114128277c9SStephan Aßmus private:
115128277c9SStephan Aßmus 			void				_UpdateScrollBars();
116128277c9SStephan Aßmus 			uint32				_UpdateScrollBarVisibility();
117128277c9SStephan Aßmus 
118128277c9SStephan Aßmus 			BRect				_InnerRect() const;
119128277c9SStephan Aßmus 			BRect				_ChildRect() const;
120128277c9SStephan Aßmus 			BRect				_ChildRect(bool hbar, bool vbar) const;
121128277c9SStephan Aßmus 			BRect				_GuessVisibleRect(bool hbar, bool vbar) const;
122128277c9SStephan Aßmus 			BRect				_MaxVisibleRect() const;
123*c4ce9e76SStephan Aßmus #ifdef __HAIKU__
124*c4ce9e76SStephan Aßmus 	virtual	BSize				_Size(BSize childSize);
125*c4ce9e76SStephan Aßmus #endif
126128277c9SStephan Aßmus 
127128277c9SStephan Aßmus 	friend class InternalScrollBar;
128128277c9SStephan Aßmus 	friend class ScrollCorner;
129128277c9SStephan Aßmus };
130128277c9SStephan Aßmus 
131128277c9SStephan Aßmus 
132128277c9SStephan Aßmus 
133128277c9SStephan Aßmus #endif	// SCROLL_VIEW_H
134