X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2b5f62a0b2db198609b45dec622a018dae37008e..cb0b7b7d811356f729315fc14c7e0d311f43384d:/src/univ/winuniv.cpp?ds=sidebyside diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index afc1a6efbd..4892f9d8eb 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -6,7 +6,7 @@ // Created: 06.08.00 // RCS-ID: $Id$ // Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // =========================================================================== @@ -17,10 +17,6 @@ // headers // --------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "univwindow.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -106,12 +102,12 @@ void wxWindow::Init() m_scrollbarVert = m_scrollbarHorz = (wxScrollBar *)NULL; - m_isCurrent = FALSE; + m_isCurrent = false; m_renderer = wxTheme::Get()->GetRenderer(); - m_oldSize.x = -1; - m_oldSize.y = -1; + m_oldSize.x = wxDefaultCoord; + m_oldSize.y = wxDefaultCoord; } bool wxWindow::Create(wxWindow *parent, @@ -121,33 +117,74 @@ bool wxWindow::Create(wxWindow *parent, long style, const wxString& name) { + long actualStyle = style; + + // FIXME: may need this on other platforms +#ifdef __WXMSW__ + actualStyle &= ~wxVSCROLL; + actualStyle &= ~wxHSCROLL; +#endif + // we add wxCLIP_CHILDREN to get the same ("natural") behaviour under MSW // as under the other platforms if ( !wxWindowNative::Create(parent, id, pos, size, - style | wxCLIP_CHILDREN, + actualStyle | wxCLIP_CHILDREN, name) ) { - return FALSE; + return false; } - // if we should always have the scrollbar, do show it - if ( GetWindowStyle() & wxALWAYS_SHOW_SB ) + // Set full style again, including those we didn't want present + // when calling the base window Create(). + wxWindowBase::SetWindowStyleFlag(style); + + // if we allow or should always have a vertical scrollbar, make it + if ( style & wxVSCROLL || style & wxALWAYS_SHOW_SB ) { #if wxUSE_TWO_WINDOWS - SetInsertIntoMain( TRUE ); + SetInsertIntoMain( true ); #endif - m_scrollbarVert = new wxScrollBar(this, -1, + m_scrollbarVert = new wxScrollBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL); #if wxUSE_TWO_WINDOWS - SetInsertIntoMain( FALSE ); + SetInsertIntoMain( false ); #endif + } - // and position it + // if we should allow a horizontal scrollbar, make it + if ( style & wxHSCROLL ) + { +#if wxUSE_TWO_WINDOWS + SetInsertIntoMain( true ); +#endif + m_scrollbarHorz = new wxScrollBar(this, wxID_ANY, + wxDefaultPosition, wxDefaultSize, + wxSB_HORIZONTAL); +#if wxUSE_TWO_WINDOWS + SetInsertIntoMain( false ); +#endif + } + + if (m_scrollbarHorz || m_scrollbarVert) + { + // position it/them PositionScrollbars(); } - return TRUE; + return true; +} + +wxWindow::~wxWindow() +{ + m_isBeingDeleted = true; + + // we have to destroy our children before we're destroyed because our + // children suppose that we're of type wxWindow, not just wxWindowNative, + // and so bad things may happen if they're deleted from the base class dtor + // as by then we're not a wxWindow any longer and wxUniv-specific virtual + // functions can't be called + DestroyChildren(); } // ---------------------------------------------------------------------------- @@ -182,7 +219,7 @@ const wxBitmap& wxWindow::GetBackgroundBitmap(int *alignment, // ---------------------------------------------------------------------------- // the event handlers executed when the window must be repainted -void wxWindow::OnNcPaint(wxPaintEvent& event) +void wxWindow::OnNcPaint(wxNcPaintEvent& WXUNUSED(event)) { if ( m_renderer ) { @@ -275,7 +312,7 @@ bool wxWindow::DoDrawBackground(wxDC& dc) rect.height = size.y; wxWindow * const parent = GetParent(); - if ( HasTransparentBackground() && parent && parent->ProvidesBackground() ) + if ( HasTransparentBackground() && parent ) { wxASSERT( !IsTopLevel() ); @@ -284,10 +321,10 @@ bool wxWindow::DoDrawBackground(wxDC& dc) AdjustForParentClientOrigin( pos.x, pos.y, 0 ); // Adjust DC logical origin - wxCoord x,y; - dc.GetLogicalOrigin( &x, &y ); - x += pos.x; - y += pos.y; + wxCoord org_x, org_y, x, y; + dc.GetLogicalOrigin( &org_x, &org_y ); + x = org_x + pos.x; + y = org_y + pos.y; dc.SetLogicalOrigin( x, y ); // Adjust draw rect @@ -296,14 +333,17 @@ bool wxWindow::DoDrawBackground(wxDC& dc) // Let parent draw the background parent->EraseBackground( dc, rect ); + + // Restore DC logical origin + dc.SetLogicalOrigin( org_x, org_y ); } else { - // Draw background ouselves + // Draw background ourselves EraseBackground( dc, rect ); } - return TRUE; + return true; } void wxWindow::EraseBackground(wxDC& dc, const wxRect& rect) @@ -337,7 +377,7 @@ void wxWindow::DoDrawBorder(wxDC& dc, const wxRect& rect) } } -void wxWindow::DoDraw(wxControlRenderer *renderer) +void wxWindow::DoDraw(wxControlRenderer * WXUNUSED(renderer)) { } @@ -371,7 +411,7 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient) // debugging helper #ifdef WXDEBUG_REFRESH - static bool s_refreshDebug = FALSE; + static bool s_refreshDebug = false; if ( s_refreshDebug ) { wxWindowDC dc(this); @@ -388,6 +428,19 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient) #endif // WXDEBUG_REFRESH wxWindowNative::Refresh(eraseBackground, &rectWin); + + // Refresh all sub controls if any. + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + wxWindow *win = node->GetData(); + // Only refresh sub controls when it is visible + // and when it is in the update region. + if(!win->IsKindOf(CLASSINFO(wxTopLevelWindow)) && win->IsShown() && wxRegion(rectWin).Contains(win->GetRect()) != wxOutRegion) + win->Refresh(eraseBackground, &rectWin); + + node = node->GetNext(); + } } // ---------------------------------------------------------------------------- @@ -397,7 +450,7 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient) bool wxWindow::Enable(bool enable) { if ( !wxWindowNative::Enable(enable) ) - return FALSE; + return false; // disabled window can't keep focus if ( FindFocus() == this && GetParent() != NULL ) @@ -412,7 +465,7 @@ bool wxWindow::Enable(bool enable) Refresh(); } - return TRUE; + return true; } bool wxWindow::IsFocused() const @@ -423,12 +476,12 @@ bool wxWindow::IsFocused() const bool wxWindow::IsPressed() const { - return FALSE; + return false; } bool wxWindow::IsDefault() const { - return FALSE; + return false; } bool wxWindow::IsCurrent() const @@ -439,14 +492,14 @@ bool wxWindow::IsCurrent() const bool wxWindow::SetCurrent(bool doit) { if ( doit == m_isCurrent ) - return FALSE; + return false; m_isCurrent = doit; if ( CanBeHighlighted() ) Refresh(); - return TRUE; + return true; } int wxWindow::GetStateFlags() const @@ -488,14 +541,14 @@ void wxWindow::OnSize(wxSizeEvent& event) #if 0 // ndef __WXMSW__ // Refresh the area (strip) previously occupied by the border - if (HasFlag( wxNO_FULL_REPAINT_ON_RESIZE ) && IsShown()) + if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) && IsShown() ) { // This code assumes that wxSizeEvent.GetSize() returns // the area of the entire window, not just the client // area. wxSize newSize = event.GetSize(); - if (m_oldSize.x == -1 && m_oldSize.y == -1) + if (m_oldSize.x == wxDefaultCoord && m_oldSize.y == wxDefaultCoord) { m_oldSize = newSize; return; @@ -510,7 +563,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.width = m_oldSize.x; rect.y = m_oldSize.y-2; rect.height = 1; - Refresh( TRUE, &rect ); + Refresh( true, &rect ); } else if (newSize.y < m_oldSize.y) { @@ -519,7 +572,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.x = 0; rect.height = 1; rect.width = newSize.x; - wxWindowNative::Refresh( TRUE, &rect ); + wxWindowNative::Refresh( true, &rect ); } if (newSize.x > m_oldSize.x) @@ -529,7 +582,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.height = m_oldSize.y; rect.x = m_oldSize.x-2; rect.width = 1; - Refresh( TRUE, &rect ); + Refresh( true, &rect ); } else if (newSize.x < m_oldSize.x) { @@ -538,7 +591,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.y = 0; rect.width = 1; rect.height = newSize.y; - wxWindowNative::Refresh( TRUE, &rect ); + wxWindowNative::Refresh( true, &rect ); } } else @@ -551,7 +604,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.width = m_oldSize.x; rect.y = m_oldSize.y-4; rect.height = 2; - Refresh( TRUE, &rect ); + Refresh( true, &rect ); } else if (newSize.y < m_oldSize.y) { @@ -560,7 +613,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.x = 0; rect.height = 2; rect.width = newSize.x; - wxWindowNative::Refresh( TRUE, &rect ); + wxWindowNative::Refresh( true, &rect ); } if (newSize.x > m_oldSize.x) @@ -570,7 +623,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.height = m_oldSize.y; rect.x = m_oldSize.x-4; rect.width = 2; - Refresh( TRUE, &rect ); + Refresh( true, &rect ); } else if (newSize.x < m_oldSize.x) { @@ -579,7 +632,7 @@ void wxWindow::OnSize(wxSizeEvent& event) rect.y = 0; rect.width = 2; rect.height = newSize.y; - wxWindowNative::Refresh( TRUE, &rect ); + wxWindowNative::Refresh( true, &rect ); } } @@ -796,7 +849,7 @@ void wxWindow::SetScrollbar(int orient, wxASSERT_MSG( pageSize <= range, _T("page size can't be greater than range") ); - bool hasClientSizeChanged = FALSE; + bool hasClientSizeChanged = false; wxScrollBar *scrollbar = GetScrollbar(orient); if ( range && (pageSize < range) ) { @@ -804,14 +857,14 @@ void wxWindow::SetScrollbar(int orient, { // create it #if wxUSE_TWO_WINDOWS - SetInsertIntoMain( TRUE ); + SetInsertIntoMain( true ); #endif - scrollbar = new wxScrollBar(this, -1, + scrollbar = new wxScrollBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, orient & wxVERTICAL ? wxSB_VERTICAL : wxSB_HORIZONTAL); #if wxUSE_TWO_WINDOWS - SetInsertIntoMain( FALSE ); + SetInsertIntoMain( false ); #endif if ( orient & wxVERTICAL ) m_scrollbarVert = scrollbar; @@ -819,7 +872,7 @@ void wxWindow::SetScrollbar(int orient, m_scrollbarHorz = scrollbar; // the client area diminished as we created a scrollbar - hasClientSizeChanged = TRUE; + hasClientSizeChanged = true; PositionScrollbars(); } @@ -852,7 +905,7 @@ void wxWindow::SetScrollbar(int orient, m_scrollbarHorz = NULL; // the client area increased as we removed a scrollbar - hasClientSizeChanged = TRUE; + hasClientSizeChanged = true; // the size of the remaining scrollbar must be adjusted if ( m_scrollbarHorz || m_scrollbarVert ) @@ -875,7 +928,7 @@ void wxWindow::SetScrollbar(int orient, } } -void wxWindow::SetScrollPos(int orient, int pos, bool refresh) +void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh)) { wxScrollBar *scrollbar = GetScrollbar(orient); wxCHECK_RET( scrollbar, _T("no scrollbar to set position for") ); @@ -926,19 +979,19 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) if ( dx ) { r = ScrollNoRefresh(dx, 0, rect); - Refresh(TRUE /* erase bkgnd */, &r); + Refresh(true /* erase bkgnd */, &r); } if ( dy ) { r = ScrollNoRefresh(0, dy, rect); - Refresh(TRUE /* erase bkgnd */, &r); + Refresh(true /* erase bkgnd */, &r); } // scroll children accordingly: wxPoint offset(dx, dy); - for (wxWindowList::Node *node = GetChildren().GetFirst(); + for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext()) { wxWindow *child = node->GetData(); @@ -1055,12 +1108,12 @@ wxRect wxWindow::ScrollNoRefresh(int dx, int dy, const wxRect *rectTotal) wxMemoryDC dcMem; dcMem.SelectObject(bmp); - dcMem.Blit(wxPoint(0, 0), size, &dc, ptSource + dcMem.Blit(wxPoint(0,0), size, &dc, ptSource #if defined(__WXGTK__) && !defined(wxHAS_WORKING_GTK_DC_BLIT) + GetClientAreaOrigin() #endif // broken wxGTK wxDC::Blit ); - dc.Blit(ptDest, size, &dcMem, wxPoint(0, 0)); + dc.Blit(ptDest, size, &dcMem, wxPoint(0,0)); wxLogTrace(_T("scroll"), _T("Blit: (%d, %d) of size %dx%d -> (%d, %d)"), @@ -1144,7 +1197,7 @@ void wxWindow::OnKeyDown(wxKeyEvent& event) { #if wxUSE_MENUS int key = event.GetKeyCode(); - if ( !event.ControlDown() && (key == WXK_MENU || key == WXK_F10) ) + if ( !event.ControlDown() && (key == WXK_ALT || key == WXK_F10) ) { ms_winLastAltPress = this; @@ -1261,7 +1314,7 @@ void wxWindow::OnChar(wxKeyEvent& event) void wxWindow::OnKeyUp(wxKeyEvent& event) { int key = event.GetKeyCode(); - if ( !event.HasModifiers() && (key == WXK_MENU || key == WXK_F10) ) + if ( !event.HasModifiers() && (key == WXK_ALT || key == WXK_F10) ) { // only process Alt release specially if there were no other key // presses since Alt had been pressed and if both events happened in @@ -1294,7 +1347,7 @@ void wxWindow::OnKeyUp(wxKeyEvent& event) #include "wx/msw/private.h" -long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) +WXLRESULT wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { if ( message == WM_NCHITTEST ) {