1*128277c9SStephan Aßmus /* 2*128277c9SStephan Aßmus * Copyright 2006, Haiku. 3*128277c9SStephan Aßmus * Distributed under the terms of the MIT License. 4*128277c9SStephan Aßmus * 5*128277c9SStephan Aßmus * Authors: 6*128277c9SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de> 7*128277c9SStephan Aßmus * Ingo Weinhold <bonefish@cs.tu-berlin.de> 8*128277c9SStephan Aßmus */ 9*128277c9SStephan Aßmus 10*128277c9SStephan Aßmus #ifndef SCROLL_VIEW_H 11*128277c9SStephan Aßmus #define SCROLL_VIEW_H 12*128277c9SStephan Aßmus 13*128277c9SStephan Aßmus #include <View.h> 14*128277c9SStephan Aßmus 15*128277c9SStephan Aßmus #include "Scroller.h" 16*128277c9SStephan Aßmus 17*128277c9SStephan Aßmus class Scrollable; 18*128277c9SStephan Aßmus class InternalScrollBar; 19*128277c9SStephan Aßmus class ScrollCorner; 20*128277c9SStephan Aßmus 21*128277c9SStephan Aßmus enum { 22*128277c9SStephan Aßmus SCROLL_HORIZONTAL = 0x01, 23*128277c9SStephan Aßmus SCROLL_VERTICAL = 0x02, 24*128277c9SStephan Aßmus SCROLL_HORIZONTAL_MAGIC = 0x04, 25*128277c9SStephan Aßmus SCROLL_VERTICAL_MAGIC = 0x08, 26*128277c9SStephan Aßmus SCROLL_VISIBLE_RECT_IS_CHILD_BOUNDS = 0x10, 27*128277c9SStephan Aßmus SCROLL_NO_FRAME = 0x20, 28*128277c9SStephan Aßmus }; 29*128277c9SStephan Aßmus 30*128277c9SStephan Aßmus class ScrollView : public BView, public Scroller { 31*128277c9SStephan Aßmus public: 32*128277c9SStephan Aßmus ScrollView(BView* child, 33*128277c9SStephan Aßmus uint32 scrollingFlags, 34*128277c9SStephan Aßmus BRect frame, 35*128277c9SStephan Aßmus const char *name, 36*128277c9SStephan Aßmus uint32 resizingMode, uint32 flags); 37*128277c9SStephan Aßmus virtual ~ScrollView(); 38*128277c9SStephan Aßmus 39*128277c9SStephan Aßmus virtual void AllAttached(); 40*128277c9SStephan Aßmus virtual void Draw(BRect updateRect); 41*128277c9SStephan Aßmus virtual void FrameResized(float width, float height); 42*128277c9SStephan Aßmus virtual void WindowActivated(bool activated); 43*128277c9SStephan Aßmus 44*128277c9SStephan Aßmus uint32 ScrollingFlags() const; 45*128277c9SStephan Aßmus void SetVisibleRectIsChildBounds(bool flag); 46*128277c9SStephan Aßmus bool VisibleRectIsChildBounds() const; 47*128277c9SStephan Aßmus 48*128277c9SStephan Aßmus BView* Child() const; 49*128277c9SStephan Aßmus void ChildFocusChanged(bool focused); 50*128277c9SStephan Aßmus 51*128277c9SStephan Aßmus BScrollBar* HScrollBar() const; 52*128277c9SStephan Aßmus BScrollBar* VScrollBar() const; 53*128277c9SStephan Aßmus BView* HVScrollCorner() const; 54*128277c9SStephan Aßmus 55*128277c9SStephan Aßmus void SetHSmallStep(float hStep); 56*128277c9SStephan Aßmus void SetVSmallStep(float vStep); 57*128277c9SStephan Aßmus void SetSmallSteps(float hStep, float vStep); 58*128277c9SStephan Aßmus void GetSmallSteps(float* hStep, 59*128277c9SStephan Aßmus float* vStep) const; 60*128277c9SStephan Aßmus float HSmallStep() const; 61*128277c9SStephan Aßmus float VSmallStep() const; 62*128277c9SStephan Aßmus 63*128277c9SStephan Aßmus protected: 64*128277c9SStephan Aßmus virtual void DataRectChanged(BRect oldDataRect, 65*128277c9SStephan Aßmus BRect newDataRect); 66*128277c9SStephan Aßmus virtual void ScrollOffsetChanged(BPoint oldOffset, 67*128277c9SStephan Aßmus BPoint newOffset); 68*128277c9SStephan Aßmus virtual void VisibleSizeChanged(float oldWidth, 69*128277c9SStephan Aßmus float oldHeight, 70*128277c9SStephan Aßmus float newWidth, 71*128277c9SStephan Aßmus float newHeight); 72*128277c9SStephan Aßmus virtual void ScrollTargetChanged(Scrollable* oldTarget, 73*128277c9SStephan Aßmus Scrollable* newTarget); 74*128277c9SStephan Aßmus 75*128277c9SStephan Aßmus private: 76*128277c9SStephan Aßmus BView* fChild; // child view 77*128277c9SStephan Aßmus uint32 fScrollingFlags; 78*128277c9SStephan Aßmus InternalScrollBar* fHScrollBar; // horizontal scroll bar 79*128277c9SStephan Aßmus InternalScrollBar* fVScrollBar; // vertical scroll bar 80*128277c9SStephan Aßmus ScrollCorner* fScrollCorner; // scroll corner 81*128277c9SStephan Aßmus bool fHVisible; // horizontal/vertical scroll 82*128277c9SStephan Aßmus bool fVVisible; // bar visible flag 83*128277c9SStephan Aßmus bool fCornerVisible; // scroll corner visible flag 84*128277c9SStephan Aßmus bool fWindowActive; 85*128277c9SStephan Aßmus bool fChildFocused; 86*128277c9SStephan Aßmus float fHSmallStep; 87*128277c9SStephan Aßmus float fVSmallStep; 88*128277c9SStephan Aßmus 89*128277c9SStephan Aßmus void _ScrollValueChanged( 90*128277c9SStephan Aßmus InternalScrollBar* scrollBar, 91*128277c9SStephan Aßmus float value); 92*128277c9SStephan Aßmus void _ScrollCornerValueChanged(BPoint offset); 93*128277c9SStephan Aßmus 94*128277c9SStephan Aßmus protected: 95*128277c9SStephan Aßmus virtual void _Layout(uint32 flags); 96*128277c9SStephan Aßmus 97*128277c9SStephan Aßmus private: 98*128277c9SStephan Aßmus void _UpdateScrollBars(); 99*128277c9SStephan Aßmus uint32 _UpdateScrollBarVisibility(); 100*128277c9SStephan Aßmus 101*128277c9SStephan Aßmus BRect _InnerRect() const; 102*128277c9SStephan Aßmus BRect _ChildRect() const; 103*128277c9SStephan Aßmus BRect _ChildRect(bool hbar, bool vbar) const; 104*128277c9SStephan Aßmus BRect _GuessVisibleRect(bool hbar, bool vbar) const; 105*128277c9SStephan Aßmus BRect _MaxVisibleRect() const; 106*128277c9SStephan Aßmus 107*128277c9SStephan Aßmus friend class InternalScrollBar; 108*128277c9SStephan Aßmus friend class ScrollCorner; 109*128277c9SStephan Aßmus }; 110*128277c9SStephan Aßmus 111*128277c9SStephan Aßmus 112*128277c9SStephan Aßmus 113*128277c9SStephan Aßmus #endif // SCROLL_VIEW_H 114