X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/844adaa47ae9928450affcaaee0209cb36b9c30a..4b2322641a8c15b849c7221438ad9f1a7366afa6:/src/gtk/scrolwin.cpp diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index 484aa18183..80ba00f515 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "scrolwin.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -33,6 +29,7 @@ #include "wx/dcclient.h" #include "wx/panel.h" #include "wx/sizer.h" +#include "wx/math.h" #include "wx/gtk/private.h" #include "wx/gtk/win_gtk.h" @@ -72,6 +69,7 @@ extern bool g_isIdle; // "value_changed" from m_vAdjust //----------------------------------------------------------------------------- +extern "C" { static void gtk_scrolled_window_vscroll_callback( GtkAdjustment *adjust, SCROLLBAR_CBACK_ARG wxScrolledWindow *win ) @@ -82,15 +80,17 @@ static void gtk_scrolled_window_vscroll_callback( GtkAdjustment *adjust, if (g_blockEventsOnDrag) return; if (!win->m_hasVMT) return; - + win->GtkVScroll( adjust->value, GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->vscrollbar) ); } +} //----------------------------------------------------------------------------- // "value_changed" from m_hAdjust //----------------------------------------------------------------------------- +extern "C" { static void gtk_scrolled_window_hscroll_callback( GtkAdjustment *adjust, SCROLLBAR_CBACK_ARG wxScrolledWindow *win ) @@ -104,11 +104,13 @@ static void gtk_scrolled_window_hscroll_callback( GtkAdjustment *adjust, win->GtkHScroll( adjust->value, GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->hscrollbar) ); } +} //----------------------------------------------------------------------------- // "button_press_event" from scrollbar //----------------------------------------------------------------------------- +extern "C" { static gint gtk_scrollbar_button_press_callback( GtkRange *widget, GdkEventButton *gdk_event, wxWindowGTK *win) @@ -125,11 +127,13 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *widget, return FALSE; } +} //----------------------------------------------------------------------------- // "button_release_event" from scrollbar //----------------------------------------------------------------------------- +extern "C" { static gint gtk_scrollbar_button_release_callback( GtkRange *widget, GdkEventButton *WXUNUSED(gdk_event), wxWindowGTK *win) @@ -168,6 +172,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget, return FALSE; } +} //----------------------------------------------------------------------------- // InsertChild for wxScrolledWindow @@ -312,7 +317,7 @@ bool wxScrolledWindow::Create(wxWindow *parent, PostCreation(); Show( TRUE ); - + return TRUE; } @@ -393,7 +398,7 @@ void wxScrolledWindow::SetScrollbars( int pixelsPerUnitX, int pixelsPerUnitY, { int xs, ys; GetViewStart (& xs, & ys); - + int old_x = m_xScrollPixelsPerLine * xs; int old_y = m_yScrollPixelsPerLine * ys; @@ -407,7 +412,10 @@ void wxScrolledWindow::SetScrollbars( int pixelsPerUnitX, int pixelsPerUnitY, // a sizer might override this manual scrollbar setting in old code. // m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY ); - m_targetWindow->SetVirtualSize( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY ); + int w = noUnitsX * pixelsPerUnitX; + int h = noUnitsY * pixelsPerUnitY; + m_targetWindow->SetVirtualSize( w ? w : wxDefaultCoord, + h ? h : wxDefaultCoord); if (!noRefresh) { @@ -425,7 +433,7 @@ void wxScrolledWindow::AdjustScrollbars() m_targetWindow->GetClientSize( &w, &h ); m_targetWindow->GetVirtualSize( &vw, &vh ); - + if (m_xScrollPixelsPerLine == 0) { m_hAdjust->upper = 1.0; @@ -440,19 +448,20 @@ void wxScrolledWindow::AdjustScrollbars() // Special case. When client and virtual size are very close but // the client is big enough, kill scrollbar. - - if ((m_hAdjust->page_size < m_hAdjust->upper) && (w >= vw)) + + if ((m_hAdjust->page_size < m_hAdjust->upper) && (w >= vw)) m_hAdjust->page_size += 1.0; - + // If the scrollbar hits the right side, move the window // right to keep it from over extending. - if ((m_hAdjust->value != 0.0) && (m_hAdjust->value + m_hAdjust->page_size > m_hAdjust->upper)) + if ( !wxIsNullDouble(m_hAdjust->value) && + (m_hAdjust->value + m_hAdjust->page_size > m_hAdjust->upper) ) { m_hAdjust->value = m_hAdjust->upper - m_hAdjust->page_size; if (m_hAdjust->value < 0.0) m_hAdjust->value = 0.0; - + if (GetChildren().GetCount() == 0) m_xScrollPosition = (int)m_hAdjust->value; // This is enough without child windows else @@ -471,18 +480,19 @@ void wxScrolledWindow::AdjustScrollbars() m_vAdjust->upper = (vh+m_yScrollPixelsPerLine-1) / m_yScrollPixelsPerLine; m_vAdjust->page_size = h / m_yScrollPixelsPerLine; m_vAdjust->page_increment = h / m_yScrollPixelsPerLine; - - if ((m_vAdjust->page_size < m_vAdjust->upper) && (h >= vh)) + + if ((m_vAdjust->page_size < m_vAdjust->upper) && (h >= vh)) m_vAdjust->page_size += 1.0; - if ((m_vAdjust->value != 0.0) && (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper)) + if ( !wxIsNullDouble(m_vAdjust->value) && + (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper) ) { m_vAdjust->value = m_vAdjust->upper - m_vAdjust->page_size; if (m_vAdjust->value < 0.0) m_vAdjust->value = 0.0; - + if (GetChildren().GetCount() == 0) - m_yScrollPosition = (int)m_vAdjust->value; + m_yScrollPosition = (int)m_vAdjust->value; else gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" ); } @@ -707,7 +717,7 @@ void wxScrolledWindow::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) co { int xs, ys; GetViewStart (& xs, & ys); - + if ( xx ) *xx = x - xs * m_xScrollPixelsPerLine; if ( yy ) @@ -718,7 +728,7 @@ void wxScrolledWindow::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) { int xs, ys; GetViewStart (& xs, & ys); - + if ( xx ) *xx = x + xs * m_xScrollPixelsPerLine; if ( yy ) @@ -909,7 +919,7 @@ void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)) if ( m_targetWindow->GetAutoLayout() ) { wxSize size = m_targetWindow->GetBestVirtualSize(); - + // This will call ::Layout() and ::AdjustScrollbars() SetVirtualSize( size ); } @@ -1014,19 +1024,19 @@ void wxScrolledWindow::OnChar(wxKeyEvent& event) int xScroll = GetScrollPos(wxHORIZONTAL); if ( xScroll != xScrollOld ) { - wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, xScroll, - wxHORIZONTAL); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + wxScrollWinEvent eventS(wxEVT_SCROLLWIN_THUMBTRACK, xScroll, + wxHORIZONTAL); + eventS.SetEventObject(this); + GetEventHandler()->ProcessEvent(eventS); } int yScroll = GetScrollPos(wxVERTICAL); if ( yScroll != yScrollOld ) { - wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, yScroll, - wxVERTICAL); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + wxScrollWinEvent eventS(wxEVT_SCROLLWIN_THUMBTRACK, yScroll, + wxVERTICAL); + eventS.SetEventObject(this); + GetEventHandler()->ProcessEvent(eventS); } }