Make wxWindow::HasScrollbar() respect wxScrolled::ShowScrollbars().

Override CanScroll() in wxScrolled to return the real state of the scrollbar
instead of just relying on the wx[HV]SCROLL styles.

Closes #15440.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74714 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-08-27 13:12:38 +00:00
parent 3d777efedc
commit 029a401d74
7 changed files with 39 additions and 0 deletions

View File

@@ -21,6 +21,7 @@ public:
// implement base class pure virtuals // implement base class pure virtuals
virtual void AdjustScrollbars(); virtual void AdjustScrollbars();
virtual bool IsScrollbarShown(int orient) const;
protected: protected:
virtual void DoScroll(int x, int y); virtual void DoScroll(int x, int y);

View File

@@ -29,6 +29,8 @@ public:
bool noRefresh = false); bool noRefresh = false);
virtual void AdjustScrollbars(); virtual void AdjustScrollbars();
virtual bool IsScrollbarShown(int orient) const;
protected: protected:
virtual void DoScroll(int x, int y); virtual void DoScroll(int x, int y);
virtual void DoShowScrollbars(wxScrollbarVisibility horz, virtual void DoShowScrollbars(wxScrollbarVisibility horz,

View File

@@ -25,6 +25,7 @@ public:
int noUnitsX, int noUnitsY, int noUnitsX, int noUnitsY,
int xPos = 0, int yPos = 0, int xPos = 0, int yPos = 0,
bool noRefresh = false); bool noRefresh = false);
virtual bool IsScrollbarShown(int orient) const;
virtual void AdjustScrollbars(); virtual void AdjustScrollbars();
protected: protected:

View File

@@ -100,6 +100,9 @@ public:
DoShowScrollbars(horz, vert); DoShowScrollbars(horz, vert);
} }
// Test whether the specified scrollbar is shown.
virtual bool IsScrollbarShown(int orient) const = 0;
// Enable/disable Windows scrolling in either direction. If true, wxWidgets // Enable/disable Windows scrolling in either direction. If true, wxWidgets
// scrolls the canvas and only a bit of the canvas is invalidated; no // scrolls the canvas and only a bit of the canvas is invalidated; no
// Clear() is necessary. If false, the whole canvas is invalidated and a // Clear() is necessary. If false, the whole canvas is invalidated and a
@@ -315,6 +318,8 @@ protected:
public: \ public: \
virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \ virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \
virtual bool Layout() { return ScrollLayout(); } \ virtual bool Layout() { return ScrollLayout(); } \
virtual bool CanScroll(int orient) const \
{ return IsScrollbarShown(orient); } \
virtual void DoSetVirtualSize(int x, int y) \ virtual void DoSetVirtualSize(int x, int y) \
{ ScrollDoSetVirtualSize(x, y); } \ { ScrollDoSetVirtualSize(x, y); } \
virtual wxSize GetBestVirtualSize() const \ virtual wxSize GetBestVirtualSize() const \

View File

@@ -1201,6 +1201,14 @@ wxScrollHelper::wxScrollHelper(wxWindow *winToScroll)
m_yVisibility = wxSHOW_SB_DEFAULT; m_yVisibility = wxSHOW_SB_DEFAULT;
} }
bool wxScrollHelper::IsScrollbarShown(int orient) const
{
wxScrollbarVisibility visibility = orient == wxHORIZONTAL ? m_xVisibility
: m_yVisibility;
return visibility != wxSHOW_SB_NEVER;
}
void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility horz, void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility horz,
wxScrollbarVisibility vert) wxScrollbarVisibility vert)
{ {

View File

@@ -181,6 +181,23 @@ GtkPolicyType GtkPolicyFromWX(wxScrollbarVisibility visibility)
} // anonymous namespace } // anonymous namespace
bool wxScrollHelper::IsScrollbarShown(int orient) const
{
GtkScrolledWindow * const scrolled = GTK_SCROLLED_WINDOW(m_win->m_widget);
if ( !scrolled )
{
// By default, all windows are scrollable.
return true;
}
GtkPolicyType hpolicy, vpolicy;
gtk_scrolled_window_get_policy(scrolled, &hpolicy, &vpolicy);
GtkPolicyType policy = orient == wxHORIZONTAL ? hpolicy : vpolicy;
return policy != GTK_POLICY_NEVER;
}
void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility horz, void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility horz,
wxScrollbarVisibility vert) wxScrollbarVisibility vert)
{ {

View File

@@ -178,6 +178,11 @@ void wxScrollHelper::DoScroll( int x_pos, int y_pos )
&m_yScrollPosition); &m_yScrollPosition);
} }
bool wxScrollHelper::IsScrollbarShown(int WXUNUSED(orient)) const
{
return true;
}
void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility WXUNUSED(horz), void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility WXUNUSED(horz),
wxScrollbarVisibility WXUNUSED(vert)) wxScrollbarVisibility WXUNUSED(vert))
{ {