X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f47ae6e7e93db278822870ea41c35475d7d3d198..4e5a4c69c540b430fba8efe5dae1bc1ffd5caeca:/src/gtk/scrolwin.cpp diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index d16768c30c..175fb3494d 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -31,10 +31,11 @@ #include "wx/utils.h" #include "wx/dcclient.h" -#include "wx/gtk/scrolwin.h" +#include "wx/scrolwin.h" #include "wx/panel.h" +#include "wx/sizer.h" -#include +#include "wx/gtk/private.h" #include "wx/gtk/win_gtk.h" // ---------------------------------------------------------------------------- @@ -72,7 +73,9 @@ extern bool g_isIdle; // "value_changed" from m_vAdjust //----------------------------------------------------------------------------- -static void gtk_scrolled_window_vscroll_callback( GtkAdjustment *adjust, wxScrolledWindow *win ) +static void gtk_scrolled_window_vscroll_callback( GtkAdjustment *adjust, + SCROLLBAR_CBACK_ARG + wxScrolledWindow *win ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -81,14 +84,17 @@ static void gtk_scrolled_window_vscroll_callback( GtkAdjustment *adjust, wxScrol if (!win->m_hasVMT) return; - win->GtkVScroll( adjust->value ); + win->GtkVScroll( adjust->value, + GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->vscrollbar) ); } //----------------------------------------------------------------------------- // "value_changed" from m_hAdjust //----------------------------------------------------------------------------- -static void gtk_scrolled_window_hscroll_callback( GtkAdjustment *adjust, wxScrolledWindow *win ) +static void gtk_scrolled_window_hscroll_callback( GtkAdjustment *adjust, + SCROLLBAR_CBACK_ARG + wxScrolledWindow *win ) { if (g_isIdle) wxapp_install_idle_handler(); @@ -96,7 +102,8 @@ static void gtk_scrolled_window_hscroll_callback( GtkAdjustment *adjust, wxScrol if (g_blockEventsOnDrag) return; if (!win->m_hasVMT) return; - win->GtkHScroll( adjust->value ); + win->GtkHScroll( adjust->value, + GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->hscrollbar) ); } //----------------------------------------------------------------------------- @@ -111,7 +118,11 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *widget, wxapp_install_idle_handler(); g_blockEventsOnScroll = TRUE; + + // FIXME: there is no slider field any more, what was meant here? +#ifndef __WXGTK20__ win->m_isScrolling = (gdk_event->window == widget->slider); +#endif return FALSE; } @@ -298,7 +309,7 @@ bool wxScrolledWindow::Create(wxWindow *parent, if (m_parent) m_parent->DoAddChild( this ); - + m_focusWidget = m_wxwindow; PostCreation(); @@ -320,12 +331,9 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY, int noUnitsX, int noUnitsY, int xPos, int yPos, bool noRefresh ) { - // Update any invalidates areas before the get moved/scrolled. - Update(); - int old_x = m_xScrollPixelsPerLine * m_xScrollPosition; int old_y = m_yScrollPixelsPerLine * m_yScrollPosition; - + m_xScrollPixelsPerLine = pixelsPerUnitX; m_yScrollPixelsPerLine = pixelsPerUnitY; m_xScrollLines = noUnitsX; @@ -344,23 +352,20 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY, m_vAdjust->value = yPos; m_vAdjust->step_increment = 1.0; m_vAdjust->page_increment = 2.0; - + AdjustScrollbars(); - + if (!noRefresh) { int new_x = m_xScrollPixelsPerLine * m_xScrollPosition; int new_y = m_yScrollPixelsPerLine * m_yScrollPosition; - + m_targetWindow->ScrollWindow( old_x-new_x, old_y-new_y ); } } void wxScrolledWindow::AdjustScrollbars() { - // Update any invalidates areas before the get moved/scrolled. - Update(); - int w, h; m_targetWindow->GetClientSize( &w, &h ); @@ -435,9 +440,6 @@ void wxScrolledWindow::OnScroll(wxScrollWinEvent& event) int nScrollInc = CalcScrollInc(event); if (nScrollInc == 0) return; - // Update any invalidates areas before the get moved/scrolled. - Update(); - if (orient == wxHORIZONTAL) { int newPos = m_xScrollPosition + nScrollInc; @@ -482,9 +484,6 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos ) if (((x_pos == -1) || (x_pos == m_xScrollPosition)) && ((y_pos == -1) || (y_pos == m_yScrollPosition))) return; - // Update any invalidates areas before the get moved/scrolled. - Update(); - if ((x_pos != -1) && (m_xScrollPixelsPerLine)) { int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5); @@ -524,7 +523,9 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos ) } } -void wxScrolledWindow::GtkVScroll( float value ) +// TODO: [VH]Scroll functions should be combined + +void wxScrolledWindow::GtkVScroll( float value, unsigned int scroll_type ) { if (!m_targetWindow) return; @@ -537,24 +538,14 @@ void wxScrolledWindow::GtkVScroll( float value ) if (y_pos == m_yScrollPosition) return; - // Update any invalidates areas before the get moved/scrolled. - Update(); - - GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); - GtkRange *range = GTK_RANGE(scrolledWindow->vscrollbar); - - wxEventType command = wxEVT_SCROLLWIN_THUMBTRACK; - if (range->scroll_type == GTK_SCROLL_STEP_BACKWARD) command = wxEVT_SCROLLWIN_LINEUP; - else if (range->scroll_type == GTK_SCROLL_STEP_FORWARD) command = wxEVT_SCROLLWIN_LINEDOWN; - else if (range->scroll_type == GTK_SCROLL_PAGE_BACKWARD) command = wxEVT_SCROLLWIN_PAGEUP; - else if (range->scroll_type == GTK_SCROLL_PAGE_FORWARD) command = wxEVT_SCROLLWIN_PAGEDOWN; + wxEventType command = GtkScrollWinTypeToWx(scroll_type); wxScrollWinEvent event( command, y_pos, wxVERTICAL ); event.SetEventObject( this ); GetEventHandler()->ProcessEvent( event ); } -void wxScrolledWindow::GtkHScroll( float value ) +void wxScrolledWindow::GtkHScroll( float value, unsigned int scroll_type ) { if (!m_targetWindow) return; @@ -567,17 +558,7 @@ void wxScrolledWindow::GtkHScroll( float value ) if (x_pos == m_xScrollPosition) return; - // Update any invalidates areas before the get moved/scrolled. - Update(); - - GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); - GtkRange *range = GTK_RANGE(scrolledWindow->hscrollbar); - - wxEventType command = wxEVT_SCROLLWIN_THUMBTRACK; - if (range->scroll_type == GTK_SCROLL_STEP_BACKWARD) command = wxEVT_SCROLLWIN_LINEUP; - else if (range->scroll_type == GTK_SCROLL_STEP_FORWARD) command = wxEVT_SCROLLWIN_LINEDOWN; - else if (range->scroll_type == GTK_SCROLL_PAGE_BACKWARD) command = wxEVT_SCROLLWIN_PAGEUP; - else if (range->scroll_type == GTK_SCROLL_PAGE_FORWARD) command = wxEVT_SCROLLWIN_PAGEDOWN; + wxEventType command = GtkScrollWinTypeToWx(scroll_type); wxScrollWinEvent event( command, x_pos, wxHORIZONTAL ); event.SetEventObject( this ); @@ -607,7 +588,7 @@ void wxScrolledWindow::GetViewStart (int *x, int *y) const *y = m_yScrollPosition; } -void wxScrolledWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) const +void wxScrolledWindow::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const { if ( xx ) *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine; @@ -615,7 +596,7 @@ void wxScrolledWindow::CalcScrolledPosition(int x, int y, int *xx, int *yy) cons *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine; } -void wxScrolledWindow::CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const +void wxScrolledWindow::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const { if ( xx ) *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine; @@ -714,11 +695,6 @@ void wxScrolledWindow::SetScrollPos( int orient, int pos, bool refresh ) wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") ); - // Update any invalidates areas before the get moved/scrolled. - // We ignore the refresh parameter here because it is meant - // to control the behaviour AFTER scrolling happens. - Update(); - if (orient == wxHORIZONTAL) { int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5); @@ -785,6 +761,22 @@ void wxScrolledWindow::GtkVDisconnectEvent() (GtkSignalFunc) gtk_scrolled_window_vscroll_callback, (gpointer) this ); } + +bool wxScrolledWindow::Layout() +{ + if (GetSizer()) + { + // Take into account the virtual size and scrolled position of the window + int x, y, w, h; + CalcScrolledPosition(0,0, &x,&y); + GetVirtualSize(&w, &h); + GetSizer()->SetDimension(x, y, w, h); + return TRUE; + } + else + return wxPanel::Layout(); // fall back to default for LayoutConstraints +} + // ---------------------------------------------------------------------------- // event handlers // ----------------------------------------------------------------------------