xref: /haiku/src/apps/icon-o-matic/generic/gui/scrollview/ScrollView.h (revision 7f96d6194d55608301bccbf2e8c99a1bc4e796f4)
1*7f96d619SStephan Aßmus /*
2*7f96d619SStephan Aßmus  * Copyright 2006-2009, Haiku.
3*7f96d619SStephan Aßmus  * Distributed under the terms of the MIT License.
4*7f96d619SStephan Aßmus  *
5*7f96d619SStephan Aßmus  * Authors:
6*7f96d619SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7*7f96d619SStephan Aßmus  *		Ingo Weinhold <bonefish@cs.tu-berlin.de>
8*7f96d619SStephan 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,
26007ea587SStephan Aßmus 	SCROLL_VISIBLE_RECT_IS_CHILD_BOUNDS		= 0x10,
27007ea587SStephan Aßmus 	SCROLL_NO_FRAME							= 0x20,
28007ea587SStephan Aßmus 	SCROLL_LIST_FRAME						= 0x40,
29128277c9SStephan Aßmus };
30128277c9SStephan Aßmus 
31c4ce9e76SStephan Aßmus enum {
32c4ce9e76SStephan Aßmus 	BORDER_LEFT		= 0x01,
33c4ce9e76SStephan Aßmus 	BORDER_TOP		= 0x02,
34c4ce9e76SStephan Aßmus 	BORDER_RIGHT	= 0x04,
35c4ce9e76SStephan Aßmus 	BORDER_BOTTOM	= 0x08,
36c4ce9e76SStephan Aßmus 	BORDER_ALL		= BORDER_LEFT | BORDER_TOP | BORDER_RIGHT | BORDER_BOTTOM
37c4ce9e76SStephan Aßmus };
38c4ce9e76SStephan Aßmus 
39c4ce9e76SStephan Aßmus 
40128277c9SStephan Aßmus class ScrollView : public BView, public Scroller {
41128277c9SStephan Aßmus public:
42c4ce9e76SStephan Aßmus 								ScrollView(BView* child, uint32 scrollingFlags,
43c4ce9e76SStephan Aßmus 									BRect frame, const char *name,
44c4ce9e76SStephan Aßmus 									uint32 resizingMode, uint32 viewFlags,
45c4ce9e76SStephan Aßmus 									uint32 borderStyle = B_FANCY_BORDER,
46c4ce9e76SStephan Aßmus 									uint32 borderFlags = BORDER_ALL);
47007ea587SStephan Aßmus #ifdef __HAIKU__
48007ea587SStephan Aßmus 								ScrollView(BView* child, uint32 scrollingFlags,
49007ea587SStephan Aßmus 									const char *name, uint32 viewFlags,
50007ea587SStephan Aßmus 									uint32 borderStyle = B_FANCY_BORDER,
51007ea587SStephan Aßmus 									uint32 borderFlags = BORDER_ALL);
52007ea587SStephan Aßmus #endif // __HAIKU__
53128277c9SStephan Aßmus 	virtual						~ScrollView();
54128277c9SStephan Aßmus 
55128277c9SStephan Aßmus 	virtual	void				AllAttached();
56128277c9SStephan Aßmus 	virtual	void				Draw(BRect updateRect);
57128277c9SStephan Aßmus 	virtual	void				FrameResized(float width, float height);
58128277c9SStephan Aßmus 	virtual	void				WindowActivated(bool activated);
59128277c9SStephan Aßmus 
60f10474fcSStephan Aßmus #ifdef __HAIKU__
61007ea587SStephan Aßmus 
62f10474fcSStephan Aßmus 	virtual	BSize				MinSize();
63f10474fcSStephan Aßmus 	virtual	BSize				PreferredSize();
64f10474fcSStephan Aßmus 
65007ea587SStephan Aßmus #endif // __HAIKU__
66f10474fcSStephan Aßmus 
67128277c9SStephan Aßmus 			uint32				ScrollingFlags() const;
68128277c9SStephan Aßmus 			void				SetVisibleRectIsChildBounds(bool flag);
69128277c9SStephan Aßmus 			bool				VisibleRectIsChildBounds() const;
70128277c9SStephan Aßmus 
71128277c9SStephan Aßmus 			BView*				Child() const;
72128277c9SStephan Aßmus 			void				ChildFocusChanged(bool focused);
73128277c9SStephan Aßmus 
74128277c9SStephan Aßmus 			BScrollBar*			HScrollBar() const;
75128277c9SStephan Aßmus 			BScrollBar*			VScrollBar() const;
76128277c9SStephan Aßmus 			BView*				HVScrollCorner() const;
77128277c9SStephan Aßmus 
78128277c9SStephan Aßmus 			void				SetHSmallStep(float hStep);
79128277c9SStephan Aßmus 			void				SetVSmallStep(float vStep);
80128277c9SStephan Aßmus 			void				SetSmallSteps(float hStep, float vStep);
81128277c9SStephan Aßmus 			void				GetSmallSteps(float* hStep,
82128277c9SStephan Aßmus 											  float* vStep) const;
83128277c9SStephan Aßmus 			float				HSmallStep() const;
84128277c9SStephan Aßmus 			float				VSmallStep() const;
85128277c9SStephan Aßmus 
86007ea587SStephan Aßmus 	virtual	bool				IsScrolling() const;
87007ea587SStephan Aßmus 	virtual	void				SetScrollingEnabled(bool enabled);
88007ea587SStephan Aßmus 
89128277c9SStephan Aßmus  protected:
90128277c9SStephan Aßmus 	virtual	void				DataRectChanged(BRect oldDataRect,
91128277c9SStephan Aßmus 												BRect newDataRect);
92128277c9SStephan Aßmus 	virtual	void				ScrollOffsetChanged(BPoint oldOffset,
93128277c9SStephan Aßmus 													BPoint newOffset);
94128277c9SStephan Aßmus 	virtual	void				VisibleSizeChanged(float oldWidth,
95128277c9SStephan Aßmus 												   float oldHeight,
96128277c9SStephan Aßmus 												   float newWidth,
97128277c9SStephan Aßmus 												   float newHeight);
98128277c9SStephan Aßmus 	virtual	void				ScrollTargetChanged(Scrollable* oldTarget,
99128277c9SStephan Aßmus 													Scrollable* newTarget);
100128277c9SStephan Aßmus 
101128277c9SStephan Aßmus  private:
102128277c9SStephan Aßmus 			BView*				fChild;			// child view
103128277c9SStephan Aßmus 			uint32				fScrollingFlags;
104128277c9SStephan Aßmus 			InternalScrollBar*	fHScrollBar;	// horizontal scroll bar
105128277c9SStephan Aßmus 			InternalScrollBar*	fVScrollBar;	// vertical scroll bar
106128277c9SStephan Aßmus 			ScrollCorner*		fScrollCorner;	// scroll corner
107128277c9SStephan Aßmus 			bool				fHVisible;		// horizontal/vertical scroll
108128277c9SStephan Aßmus 			bool				fVVisible;		// bar visible flag
109128277c9SStephan Aßmus 			bool				fCornerVisible;	// scroll corner visible flag
110128277c9SStephan Aßmus 			bool				fWindowActive;
111128277c9SStephan Aßmus 			bool				fChildFocused;
112007ea587SStephan Aßmus 			bool				fScrolling;
113128277c9SStephan Aßmus 			float				fHSmallStep;
114128277c9SStephan Aßmus 			float				fVSmallStep;
115128277c9SStephan Aßmus 
116c4ce9e76SStephan Aßmus 			uint32				fBorderStyle;
117c4ce9e76SStephan Aßmus 			uint32				fBorderFlags;
118c4ce9e76SStephan Aßmus 
119007ea587SStephan Aßmus 			void				_Init(BView* child, uint32 scrollingFlags,
120007ea587SStephan Aßmus 									uint32 borderStyle, uint32 borderFlags);
121007ea587SStephan Aßmus 
122128277c9SStephan Aßmus 			void				_ScrollValueChanged(
123128277c9SStephan Aßmus 										InternalScrollBar* scrollBar,
124128277c9SStephan Aßmus 										float value);
125128277c9SStephan Aßmus 			void				_ScrollCornerValueChanged(BPoint offset);
126128277c9SStephan Aßmus 
127128277c9SStephan Aßmus protected:
128128277c9SStephan Aßmus 	virtual	void				_Layout(uint32 flags);
129128277c9SStephan Aßmus 
130128277c9SStephan Aßmus private:
131128277c9SStephan Aßmus 			void				_UpdateScrollBars();
132128277c9SStephan Aßmus 			uint32				_UpdateScrollBarVisibility();
133128277c9SStephan Aßmus 
134128277c9SStephan Aßmus 			BRect				_InnerRect() const;
135128277c9SStephan Aßmus 			BRect				_ChildRect() const;
136128277c9SStephan Aßmus 			BRect				_ChildRect(bool hbar, bool vbar) const;
137128277c9SStephan Aßmus 			BRect				_GuessVisibleRect(bool hbar, bool vbar) const;
138128277c9SStephan Aßmus 			BRect				_MaxVisibleRect() const;
139c4ce9e76SStephan Aßmus #ifdef __HAIKU__
140c4ce9e76SStephan Aßmus 	virtual	BSize				_Size(BSize childSize);
141c4ce9e76SStephan Aßmus #endif
142128277c9SStephan Aßmus 
143007ea587SStephan Aßmus 			void				_SetScrolling(bool scrolling);
144007ea587SStephan Aßmus 
145128277c9SStephan Aßmus 	friend class InternalScrollBar;
146128277c9SStephan Aßmus 	friend class ScrollCorner;
147128277c9SStephan Aßmus };
148128277c9SStephan Aßmus 
149128277c9SStephan Aßmus 
150128277c9SStephan Aßmus 
151128277c9SStephan Aßmus #endif	// SCROLL_VIEW_H
152