X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cdb7bf66716a4f5c5d0e8b203e52826defdf5906..11a23db53128bf244a089123b7fd27deb577a889:/src/gtk/scrolwin.cpp diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index f36296fe94..9b39077a3d 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -1,23 +1,14 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: gtk/scrolwin.cpp +// Name: src/gtk/scrolwin.cpp // Purpose: wxScrolledWindow implementation // Author: Robert Roebling // Modified by: Ron Lee // Vadim Zeitlin: removed 90% of duplicated common code // Created: 01/02/97 -// RCS-ID: $Id$ // Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -// ============================================================================ -// declarations -// ============================================================================ - -// ---------------------------------------------------------------------------- -// headers -// ---------------------------------------------------------------------------- - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -26,11 +17,9 @@ #endif #include "wx/scrolwin.h" -#include "wx/gtk/private.h" -// ============================================================================ -// implementation -// ============================================================================ +#include +#include "wx/gtk/private/gtk2-compat.h" // ---------------------------------------------------------------------------- // wxScrollHelper implementation @@ -41,47 +30,12 @@ void wxScrollHelper::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, int xPos, int yPos, bool noRefresh) { - int old_x = m_xScrollPosition * m_xScrollPixelsPerLine; - int old_y = m_yScrollPosition * m_yScrollPixelsPerLine; - - m_xScrollPixelsPerLine = pixelsPerUnitX; - m_yScrollPixelsPerLine = pixelsPerUnitY; - - m_win->m_scrollBar[wxWindow::ScrollDir_Horz]->adjustment->value = - m_xScrollPosition = xPos; - m_win->m_scrollBar[wxWindow::ScrollDir_Vert]->adjustment->value = - m_yScrollPosition = yPos; - - // To get everything right, have to call ScrollWindow() - // both before and after calling SetVirtualSize() - int new_x = m_xScrollPosition * m_xScrollPixelsPerLine; - int new_y = m_yScrollPosition * m_yScrollPixelsPerLine; - if (!noRefresh) - { - m_targetWindow->ScrollWindow(old_x - new_x, old_y - new_y); - old_x = new_x; - old_y = new_y; - } - - int w = noUnitsX * pixelsPerUnitX; - int h = noUnitsY * pixelsPerUnitY; - m_targetWindow->SetVirtualSize( w ? w : wxDefaultCoord, - h ? h : wxDefaultCoord); + // prevent programmatic position changes from causing scroll events + m_win->SetScrollPos(wxHORIZONTAL, xPos); + m_win->SetScrollPos(wxVERTICAL, yPos); - if (!noRefresh) - { - new_x = m_xScrollPosition * m_xScrollPixelsPerLine; - new_y = m_yScrollPosition * m_yScrollPixelsPerLine; - m_targetWindow->ScrollWindow(old_x - new_x, old_y - new_y); - } - - // If the target is not the same as the window with the scrollbars, - // then we need to update the scrollbars here, since they won't have - // been updated by SetVirtualSize(). - if (m_targetWindow != m_win) - { - AdjustScrollbars(); - } + base_type::SetScrollbars( + pixelsPerUnitX, pixelsPerUnitY, noUnitsX, noUnitsY, xPos, yPos, noRefresh); } void wxScrollHelper::DoAdjustScrollbar(GtkRange* range, @@ -92,6 +46,9 @@ void wxScrollHelper::DoAdjustScrollbar(GtkRange* range, int *lines, int *linesPerPage) { + if (!range) + return; + int upper; int page_size; if (pixelsPerLine > 0 && winSize > 0 && winSize < virtSize) @@ -111,10 +68,8 @@ void wxScrollHelper::DoAdjustScrollbar(GtkRange* range, *linesPerPage = 0; } - GtkAdjustment* adj = range->adjustment; - adj->step_increment = 1; - adj->page_increment = - adj->page_size = page_size; + gtk_range_set_increments(range, 1, page_size); + gtk_adjustment_set_page_size(gtk_range_get_adjustment(range), page_size); gtk_range_set_range(range, 0, upper); // ensure that the scroll position is always in valid range @@ -186,7 +141,7 @@ void wxScrollHelper::DoScrollOneDir(int orient, void wxScrollHelper::DoScroll( int x_pos, int y_pos ) { - wxCHECK_RET( m_targetWindow != 0, _T("No target window") ); + wxCHECK_RET( m_targetWindow != 0, wxT("No target window") ); DoScrollOneDir(wxHORIZONTAL, x_pos, m_xScrollPixelsPerLine, &m_xScrollPosition); DoScrollOneDir(wxVERTICAL, y_pos, m_yScrollPixelsPerLine, &m_yScrollPosition); @@ -212,6 +167,10 @@ GtkPolicyType GtkPolicyFromWX(wxScrollbarVisibility visibility) policy = GTK_POLICY_AUTOMATIC; break; + default: + wxFAIL_MSG( wxS("unknown scrollbar visibility") ); + // fall through + case wxSHOW_SB_ALWAYS: policy = GTK_POLICY_ALWAYS; break; @@ -222,6 +181,23 @@ GtkPolicyType GtkPolicyFromWX(wxScrollbarVisibility visibility) } // 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, wxScrollbarVisibility vert) { @@ -232,4 +208,3 @@ void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility horz, GtkPolicyFromWX(horz), GtkPolicyFromWX(vert)); } -