X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/248d771ce4cb955541f411734ac461a6d15a40e4..2d956b58023a4955313a1c1531bc70a0deb0b831:/src/generic/scrlwing.cpp diff --git a/src/generic/scrlwing.cpp b/src/generic/scrlwing.cpp index 00af196417..904104e371 100644 --- a/src/generic/scrlwing.cpp +++ b/src/generic/scrlwing.cpp @@ -40,6 +40,7 @@ #include "wx/scrolwin.h" #include "wx/panel.h" #include "wx/timer.h" +#include "wx/sizer.h" #ifdef __WXMSW__ #include // for DLGC_WANTARROWS @@ -392,34 +393,14 @@ void wxScrollHelper::DeleteEvtHandler() // search for m_handler in the handler list if ( m_win && m_handler ) { - wxEvtHandler *handlerPrev = NULL, - *handler = m_win->GetEventHandler(); - while ( handler ) + if ( m_win->RemoveEventHandler(m_handler) ) { - if ( handler == m_handler ) - { - wxEvtHandler *handlerNext = handler->GetNextHandler(); - if ( handlerPrev ) - { - handlerPrev->SetNextHandler(handlerNext); - } - else - { - m_win->SetEventHandler(handlerNext); - } - - handler->SetNextHandler(NULL); - delete handler; - m_handler = NULL; - - return; - } - - handlerPrev = handler; - handler = handler->GetNextHandler(); + delete m_handler; } + //else: something is very wrong, so better [maybe] leak memory than + // risk a crash because of double deletion - wxFAIL_MSG( _T("where has our event handler gone?") ); + m_handler = NULL; } } @@ -818,10 +799,24 @@ void wxScrollHelper::EnableScrolling (bool x_scroll, bool y_scroll) void wxScrollHelper::GetVirtualSize (int *x, int *y) const { + wxSize sz(0, 0); + if (m_targetWindow) + sz = m_targetWindow->GetClientSize(); + if ( x ) - *x = m_xScrollPixelsPerLine * m_xScrollLines; + { + if (m_xScrollPixelsPerLine == 0) + *x = sz.x; + else + *x = m_xScrollPixelsPerLine * m_xScrollLines; + } if ( y ) - *y = m_yScrollPixelsPerLine * m_yScrollLines; + { + if (m_yScrollPixelsPerLine == 0) + *y = sz.y; + else + *y = m_yScrollPixelsPerLine * m_yScrollLines; + } } // Where the current view starts from @@ -833,7 +828,7 @@ void wxScrollHelper::GetViewStart (int *x, int *y) const *y = m_yScrollPosition; } -void wxScrollHelper::CalcScrolledPosition(int x, int y, int *xx, int *yy) const +void wxScrollHelper::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const { if ( xx ) *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine; @@ -841,7 +836,7 @@ void wxScrollHelper::CalcScrolledPosition(int x, int y, int *xx, int *yy) const *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine; } -void wxScrollHelper::CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const +void wxScrollHelper::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const { if ( xx ) *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine; @@ -856,11 +851,6 @@ void wxScrollHelper::CalcUnscrolledPosition(int x, int y, int *xx, int *yy) cons // Default OnSize resets scrollbars, if any void wxScrollHelper::HandleOnSize(wxSizeEvent& WXUNUSED(event)) { -#if wxUSE_CONSTRAINTS - if ( m_win->GetAutoLayout() ) - m_win->Layout(); -#endif - AdjustScrollbars(); } @@ -1122,11 +1112,6 @@ bool wxGenericScrolledWindow::Create(wxWindow *parent, bool ok = wxPanel::Create(parent, id, pos, size, style, name); -#ifdef __WXMSW__ - // we need to process arrows ourselves for scrolling - m_lDlgCode |= DLGC_WANTARROWS; -#endif // __WXMSW__ - return ok; } @@ -1134,6 +1119,22 @@ wxGenericScrolledWindow::~wxGenericScrolledWindow() { } +bool wxGenericScrolledWindow::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; + } + + // fall back to default for LayoutConstraints + return wxPanel::Layout(); +} + void wxGenericScrolledWindow::OnPaint(wxPaintEvent& event) { // the user code didn't really draw the window if we got here, so set this @@ -1143,6 +1144,25 @@ void wxGenericScrolledWindow::OnPaint(wxPaintEvent& event) event.Skip(); } +#ifdef __WXMSW__ +long +wxGenericScrolledWindow::MSWWindowProc(WXUINT nMsg, + WXWPARAM wParam, + WXLPARAM lParam) +{ + long rc = wxPanel::MSWWindowProc(nMsg, wParam, lParam); + + // we need to process arrows ourselves for scrolling + if ( nMsg == WM_GETDLGCODE ) + { + rc |= DLGC_WANTARROWS; + } + + return rc; +} + +#endif // __WXMSW__ + #if WXWIN_COMPATIBILITY void wxGenericScrolledWindow::GetScrollUnitsPerPage (int *x_page, int *y_page) const