From: Vadim Zeitlin Date: Sat, 3 Nov 2007 22:14:29 +0000 (+0000) Subject: added wxWindow::AlwaysShowScrollbars() and its wxMac implementation X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/c11420034872e991007a53f351fc24e49cc0519e?hp=3a5b9ee8b89dd4e634cfcfbf70c567f0b99eb231 added wxWindow::AlwaysShowScrollbars() and its wxMac implementation git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49611 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 0b8bdb5e67..79c2c314d5 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -190,6 +190,7 @@ All (GUI): - Added support for drop down toolbar buttons (Tim Kosse). - Added support for labels for toolbar controls (Vince Harron). - Added wxMessageDialog::SetMessage() and SetExtendedMessage(). +- Added wxWindow::AlwaysShowScrollbars() (Julian Scheid) - Added wxMouseEvent::GetClickCount() (Julian Scheid) - Added wxBG_STYLE_TRANSPARENT background style (Julian Scheid) - Added XRCSIZERITEM() macro for obtaining sizers from XRC (Brian Vanderburg II) diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex index ef908b33d0..619125987a 100644 --- a/docs/latex/wx/window.tex +++ b/docs/latex/wx/window.tex @@ -219,6 +219,26 @@ called by the user code. \docparam{child}{Child window to add.} +\membersection{wxWindow::AlwaysShowScrollbars}\label{wxwindowalwaysshowscrollbars} + +\func{void}{AlwaysShowScrollbars}{\param{bool}{ hflag}, \param{bool}{ vflag}} + +Call this function to force one or both scrollbars to be always shown, even if +the window is big enough to show its entire contents without scrolling. + +\newsince{2.9.0} + +\wxheading{Parameters} + +\docparam{hflag}{Whether the horizontal scroll bar should always be visible.} + +\docparam{vflag}{Whether the vertical scroll bar should always be visible.} + +\wxheading{Remarks} + +This function is currently only implemented under Mac/Carbon. + + \membersection{wxWindow::CacheBestSize}\label{wxwindowcachebestsize} \constfunc{void}{CacheBestSize}{\param{const wxSize\& }{size}} @@ -1686,6 +1706,21 @@ Returns {\tt true} if the window is retained, {\tt false} otherwise. Retained windows are only available on X platforms. +\membersection{wxWindow::IsScrollbarAlwaysShown}\label{wxwindowisscrollbaralwaysshown} + +\func{bool}{IsScrollbarAlwaysShown}{\param{int}{ orient}} + +Return whether a scrollbar is always shown. + +\wxheading{Parameters} + +\docparam{orient}{Orientation to check, either {\tt wxHORIZONTAL} or {\tt wxVERTICAL}.} + +\wxheading{See also} + +\helpref{wxWindow::AlwaysShowScrollbars}{wxwindowalwaysshowscrollbars} + + \membersection{wxWindow::IsShown}\label{wxwindowisshown} \constfunc{virtual bool}{IsShown}{\void} diff --git a/include/wx/mac/carbon/window.h b/include/wx/mac/carbon/window.h index 95039401e2..53b40f6f5f 100644 --- a/include/wx/mac/carbon/window.h +++ b/include/wx/mac/carbon/window.h @@ -65,7 +65,7 @@ public: virtual void Freeze(); virtual void Thaw(); virtual bool IsFrozen() const; - + virtual void Update() ; virtual void ClearBackground(); @@ -86,6 +86,7 @@ protected: virtual void DoEnable( bool enable ); virtual void OnEnabled( bool enabled ); virtual bool DoPopupMenu( wxMenu *menu, int x, int y ); + public: virtual void SetScrollbar( int orient, int pos, int thumbVisible, int range, bool refresh = true ); @@ -95,6 +96,13 @@ public: virtual int GetScrollRange( int orient ) const; virtual void ScrollWindow( int dx, int dy, const wxRect* rect = (wxRect *) NULL ); + virtual void AlwaysShowScrollbars(bool horz = true, bool vert = true); + virtual bool IsScrollbarAlwaysShown(int orient) const + { + return orient == wxHORIZONTAL ? m_hScrollBarAlwaysShown + : m_vScrollBarAlwaysShown; + } + virtual bool Reparent( wxWindowBase *newParent ); #if wxUSE_DRAG_AND_DROP @@ -126,7 +134,7 @@ public: virtual bool SetTransparent(wxByte alpha); virtual bool CanSetTransparent(); virtual wxByte GetTransparent() const ; - + // event handlers // -------------- void OnSetFocus( wxFocusEvent& event ); @@ -302,6 +310,8 @@ protected: wxScrollBar* m_hScrollBar ; wxScrollBar* m_vScrollBar ; + bool m_hScrollBarAlwaysShown; + bool m_vScrollBarAlwaysShown; wxString m_label ; // set to true if we do a sharp clip at the content area of this window @@ -349,6 +359,11 @@ private: // common part of all ctors void Init(); + // show/hide scrollbars as needed, common part of SetScrollbar() and + // AlwaysShowScrollbars() + void DoUpdateScrollbarVisibility(); + + WXEVENTHANDLERREF m_macControlEventHandler ; DECLARE_NO_COPY_CLASS(wxWindowMac) diff --git a/include/wx/scrolbar.h b/include/wx/scrolbar.h index 6cdf392a26..be108b18f9 100644 --- a/include/wx/scrolbar.h +++ b/include/wx/scrolbar.h @@ -52,6 +52,9 @@ public: int range, int pageSize, bool refresh = true) = 0; + // implementation-only + bool IsNeeded() const { return GetRange() > GetThumbSize(); } + private: DECLARE_NO_COPY_CLASS(wxScrollBarBase) }; diff --git a/include/wx/window.h b/include/wx/window.h index 62396ddcac..d09acb8c5b 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -1044,6 +1044,20 @@ public: bool PageUp() { return ScrollPages(-1); } bool PageDown() { return ScrollPages(1); } + // call this to always show one or both scrollbars, even if the window + // is big enough to not require them + virtual void AlwaysShowScrollbars(bool WXUNUSED(horz) = true, + bool WXUNUSED(vert) = true) + { + } + + // return true if AlwaysShowScrollbars() had been called before for the + // corresponding orientation + virtual bool IsScrollbarAlwaysShown(int WXUNUSED(orient)) const + { + return false; + } + // context-sensitive help // ---------------------- @@ -1249,7 +1263,6 @@ protected: // implementation of Navigate() and NavigateIn() virtual bool DoNavigateIn(int flags); - #if wxUSE_CONSTRAINTS // satisfy the constraints for the windows but don't set the window sizes void SatisfyConstraints(); diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index bd25da73e0..87a9efbcc7 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -980,6 +980,9 @@ void wxWindowMac::Init() m_hScrollBar = NULL ; m_vScrollBar = NULL ; + m_hScrollBarAlwaysShown = false; + m_vScrollBarAlwaysShown = false; + m_macBackgroundBrush = wxNullBrush ; m_macIsUserPane = true; @@ -2453,6 +2456,26 @@ void wxWindowMac::SetScrollPos(int orient, int pos, bool refresh) } } +void +wxWindowMac::AlwaysShowScrollbars(bool hflag, bool vflag) +{ + bool needVisibilityUpdate = false; + + if ( m_hScrollBarAlwaysShown != hflag ) + { + m_hScrollBarAlwaysShown = hflag; + needVisibilityUpdate = true; + } + + if ( m_vScrollBarAlwaysShown != vflag ) + { + m_vScrollBarAlwaysShown = vflag; + needVisibilityUpdate = true; + } + + if ( needVisibilityUpdate ) + DoUpdateScrollbarVisibility(); +} // // we draw borders and grow boxes, are already set up and clipped in the current port / cgContextRef // our own window origin is at leftOrigin/rightOrigin @@ -2555,39 +2578,29 @@ void wxWindowMac::RemoveChild( wxWindowBase *child ) wxWindowBase::RemoveChild( child ) ; } -// New function that will replace some of the above. -void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible, - int range, bool refresh) +void wxWindowMac::DoUpdateScrollbarVisibility() { - bool showScroller; bool triggerSizeEvent = false; - if ( orient == wxHORIZONTAL ) + if ( m_hScrollBar ) { - if ( m_hScrollBar ) - { - showScroller = ((range != 0) && (range > thumbVisible)); - if ( m_hScrollBar->IsShown() != showScroller ) - { - m_hScrollBar->Show( showScroller ); - triggerSizeEvent = true; - } + bool showHScrollBar = m_hScrollBarAlwaysShown || m_hScrollBar->IsNeeded(); - m_hScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; + if ( m_hScrollBar->IsShown() != showHScrollBar ) + { + m_hScrollBar->Show( showHScrollBar ); + triggerSizeEvent = true; } } - else + + if ( m_vScrollBar) { - if ( m_vScrollBar ) - { - showScroller = ((range != 0) && (range > thumbVisible)); - if ( m_vScrollBar->IsShown() != showScroller ) - { - m_vScrollBar->Show( showScroller ) ; - triggerSizeEvent = true; - } + bool showVScrollBar = m_vScrollBarAlwaysShown || m_vScrollBar->IsNeeded(); - m_vScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ; + if ( m_vScrollBar->IsShown() != showVScrollBar ) + { + m_vScrollBar->Show( showVScrollBar ) ; + triggerSizeEvent = true; } } @@ -2600,6 +2613,18 @@ void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible, } } +// New function that will replace some of the above. +void wxWindowMac::SetScrollbar(int orient, int pos, int thumb, + int range, bool refresh) +{ + if ( orient == wxHORIZONTAL && m_hScrollBar ) + m_hScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh); + else if ( orient == wxVERTICAL && m_vScrollBar ) + m_vScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh); + + DoUpdateScrollbarVisibility(); +} + // Does a physical scroll void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect) {