]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxWindow::AlwaysShowScrollbars() and its wxMac implementation
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 3 Nov 2007 22:14:29 +0000 (22:14 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 3 Nov 2007 22:14:29 +0000 (22:14 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49611 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/window.tex
include/wx/mac/carbon/window.h
include/wx/scrolbar.h
include/wx/window.h
src/mac/carbon/window.cpp

index 0b8bdb5e674b8fc02e902e423fae7c703d7bcea7..79c2c314d5917203e7c605a3e9b2e0bee90ec659 100644 (file)
@@ -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)
index ef908b33d00f69433fd6c7899fbe61e6a2a645a1..619125987af2e6a2ec8a934802e3ee64a081be6c 100644 (file)
@@ -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}
index 95039401e2ff010b7d7dcf146574f7690f824677..53b40f6f5fdec4ba9ca72f15740ffeecca441066 100644 (file)
@@ -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)
index 6cdf392a2697300440e5b1137bc2ac28b435831f..be108b18f979220faa88c32094859f124e29aeb9 100644 (file)
@@ -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)
 };
index 62396ddcac870e20a19b7c17475147a22b288668..d09acb8c5b792d169f34379989d4812df19ffb1f 100644 (file)
@@ -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();
index bd25da73e0c7b0279acddf8c678de461a1dd648d..87a9efbcc7113bbfa5cf31fb80ffa9b05ef1ab43 100644 (file)
@@ -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)
 {