X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5713b34914d8216e1af3dce0373d10566a6d7ea3..3508c1432884472f0d24f0f98c0dc75ed35df297:/src/gtk/scrolwin.cpp diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index 20c4d1594d..ef9dfd797c 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -36,10 +36,10 @@ // wxScrollHelper implementation // ---------------------------------------------------------------------------- -void wxScrollHelperNative::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, - int noUnitsX, int noUnitsY, - int xPos, int yPos, - bool noRefresh) +void wxScrollHelper::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, + int noUnitsX, int noUnitsY, + int xPos, int yPos, + bool noRefresh) { int xs, ys; GetViewStart(& xs, & ys); @@ -81,66 +81,73 @@ void wxScrollHelperNative::SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, } } -void wxScrollHelperNative::DoAdjustScrollbar(GtkRange* range, - int pixelsPerLine, - int winSize, - int virtSize, - int *lines, - int *linesPerPage) +void wxScrollHelper::DoAdjustScrollbar(GtkRange* range, + int pixelsPerLine, + int winSize, + int virtSize, + int *pos, + int *lines, + int *linesPerPage) { + int upper; + int page_size; if (pixelsPerLine > 0 && winSize > 0 && winSize < virtSize) { - int upper = (virtSize + pixelsPerLine - 1) / pixelsPerLine; - int page_size = winSize / pixelsPerLine; - + upper = (virtSize + pixelsPerLine - 1) / pixelsPerLine; + page_size = winSize / pixelsPerLine; *lines = upper; *linesPerPage = page_size; - - GtkAdjustment* adj = range->adjustment; - adj->step_increment = 1; - adj->page_increment = - adj->page_size = page_size; - gtk_range_set_range(range, 0, upper); } else { // GtkRange won't allow upper == lower, so for disabled state use [0,1] // with a page size of 1. This will also clamp position to 0. - int upper = 1; - int page_size = 1; - + upper = 1; + page_size = 1; *lines = 0; *linesPerPage = 0; - - GtkAdjustment* adj = range->adjustment; - adj->step_increment = 1; - adj->page_increment = - adj->page_size = page_size; - gtk_range_set_range(range, 0, upper); } + + GtkAdjustment* adj = range->adjustment; + adj->step_increment = 1; + adj->page_increment = + adj->page_size = page_size; + gtk_range_set_range(range, 0, upper); + + // ensure that the scroll position is always in valid range + if (*pos > *lines) + *pos = *lines; } -void wxScrollHelperNative::AdjustScrollbars() +void wxScrollHelper::AdjustScrollbars() { - int w, h; int vw, vh; + m_targetWindow->GetVirtualSize(&vw, &vh); + + int w, h; + const wxSize availSize = GetSizeAvailableForScrollTarget( + m_win->GetSize() - m_win->GetWindowBorderSize()); + if ( availSize.x >= vw && availSize.y >= vh ) + { + w = availSize.x; + h = availSize.y; - m_targetWindow->m_hasScrolling = m_xScrollPixelsPerLine != 0 || m_yScrollPixelsPerLine != 0; + // we know that the scrollbars will be removed + DoAdjustHScrollbar(w, vw); + DoAdjustVScrollbar(h, vh); - m_targetWindow->GetVirtualSize( &vw, &vh ); + return; + } m_targetWindow->GetClientSize(&w, NULL); - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine, - w, vw, &m_xScrollLines, &m_xScrollLinesPerPage); + DoAdjustHScrollbar(w, vw); + m_targetWindow->GetClientSize(NULL, &h); - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine, - h, vh, &m_yScrollLines, &m_yScrollLinesPerPage); + DoAdjustVScrollbar(h, vh); const int w_old = w; m_targetWindow->GetClientSize(&w, NULL); - if (w != w_old) + if ( w != w_old ) { // It is necessary to repeat the calculations in this case to avoid an // observed infinite series of size events, involving alternating @@ -149,17 +156,14 @@ void wxScrollHelperNative::AdjustScrollbars() // AdjustScrollbars() to be called again. If the scrollbar visibility // is not correct before then, yet another resize will occur, possibly // leading to an unending series if the sizes are just right. - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Horz], m_xScrollPixelsPerLine, - w, vw, &m_xScrollLines, &m_xScrollLinesPerPage); + DoAdjustHScrollbar(w, vw); + m_targetWindow->GetClientSize(NULL, &h); - DoAdjustScrollbar( - m_win->m_scrollBar[wxWindow::ScrollDir_Vert], m_yScrollPixelsPerLine, - h, vh, &m_yScrollLines, &m_yScrollLinesPerPage); + DoAdjustVScrollbar(h, vh); } } -void wxScrollHelperNative::DoScroll(int orient, +void wxScrollHelper::DoScrollOneDir(int orient, int pos, int pixelsPerLine, int *posOld) @@ -177,10 +181,52 @@ void wxScrollHelperNative::DoScroll(int orient, } } -void wxScrollHelperNative::Scroll( int x_pos, int y_pos ) +void wxScrollHelper::DoScroll( int x_pos, int y_pos ) { wxCHECK_RET( m_targetWindow != 0, _T("No target window") ); - DoScroll(wxHORIZONTAL, x_pos, m_xScrollPixelsPerLine, &m_xScrollPosition); - DoScroll(wxVERTICAL, y_pos, m_yScrollPixelsPerLine, &m_yScrollPosition); + DoScrollOneDir(wxHORIZONTAL, x_pos, m_xScrollPixelsPerLine, &m_xScrollPosition); + DoScrollOneDir(wxVERTICAL, y_pos, m_yScrollPixelsPerLine, &m_yScrollPosition); } + +// ---------------------------------------------------------------------------- +// scrollbars visibility +// ---------------------------------------------------------------------------- + +namespace +{ + +GtkPolicyType GtkPolicyFromWX(wxScrollbarVisibility visibility) +{ + GtkPolicyType policy; + switch ( visibility ) + { + case wxSHOW_SB_NEVER: + policy = GTK_POLICY_NEVER; + break; + + case wxSHOW_SB_DEFAULT: + policy = GTK_POLICY_AUTOMATIC; + break; + + case wxSHOW_SB_ALWAYS: + policy = GTK_POLICY_ALWAYS; + break; + } + + return policy; +} + +} // anonymous namespace + +void wxScrollHelper::DoShowScrollbars(wxScrollbarVisibility horz, + wxScrollbarVisibility vert) +{ + GtkScrolledWindow * const scrolled = GTK_SCROLLED_WINDOW(m_win->m_widget); + wxCHECK_RET( scrolled, "window must be created" ); + + gtk_scrolled_window_set_policy(scrolled, + GtkPolicyFromWX(horz), + GtkPolicyFromWX(vert)); +} +