X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8c5907cea3231c246b879c586a7140b6dc12413f..6342bd1ab36c1957684c00d408d09fba65d33db6:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index b1862f8a2e..e40b8f23c4 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -125,12 +125,7 @@ void wxWindowBase::InitBase() m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT); // GRG, changed Mar/2000 -#if defined(__VISAGECPP__) && __IBMCPP__ < 0x400 - // For now VisualAge 3.0 needs it this way - m_font = *wxSWISS_FONT; // and this? -#else m_font = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT); -#endif // no style bits m_exStyle = m_windowStyle = 0; @@ -321,13 +316,32 @@ bool wxWindowBase::DestroyChildren() // centre the window with respect to its parent in either (or both) directions void wxWindowBase::Centre(int direction) { + // the position/size of the parent window or of the entire screen + wxPoint posParent; int widthParent, heightParent; - wxWindow *parent = GetParent(); - if ( !parent ) + wxWindow *parent = NULL; + + if ( !(direction & wxCENTRE_ON_SCREEN) ) { - // no other choice - direction |= wxCENTRE_ON_SCREEN; + // find the parent to centre this window on: it should be the + // immediate parent for the controls but the top level parent for the + // top level windows (like dialogs) + parent = GetParent(); + if ( IsTopLevel() ) + { + while ( parent && !parent->IsTopLevel() ) + { + parent = parent->GetParent(); + } + } + + // did we find the parent? + if ( !parent ) + { + // no other choice + direction |= wxCENTRE_ON_SCREEN; + } } if ( direction & wxCENTRE_ON_SCREEN ) @@ -337,8 +351,19 @@ void wxWindowBase::Centre(int direction) } else { - // centre inside the parents rectangle - parent->GetClientSize(&widthParent, &heightParent); + if ( IsTopLevel() ) + { + // centre on the parent + parent->GetSize(&widthParent, &heightParent); + + // adjust to the parents position + posParent = parent->GetPosition(); + } + else + { + // centre inside the parents client rectangle + parent->GetClientSize(&widthParent, &heightParent); + } } int width, height; @@ -353,20 +378,8 @@ void wxWindowBase::Centre(int direction) if ( direction & wxVERTICAL ) yNew = (heightParent - height)/2; - // controls are always centered on their parent because it doesn't make - // sense to centre them on the screen - if ( !(direction & wxCENTRE_ON_SCREEN) || !IsTopLevel() ) - { - // the only chance to get this is to have a not top level window - // without parent which shouldn't happen - wxCHECK_RET( parent, wxT("this window must have a parent") ); - - // adjust to the parents client area origin - wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0)); - - xNew += posParent.x; - yNew += posParent.y; - } + xNew += posParent.x; + yNew += posParent.y; // move the centre of this window to this position Move(xNew, yNew); @@ -491,6 +504,11 @@ void wxWindowBase::AddChild(wxWindowBase *child) { wxCHECK_RET( child, wxT("can't add a NULL child") ); + // this should never happen and it will lead to a crash later if it does + // because RemoveChild() will remove only one node from the children list + // and the other(s) one(s) will be left with dangling pointers in them + wxASSERT_MSG( !GetChildren().Find(child), _T("AddChild() called twice") ); + GetChildren().Append(child); child->SetParent(this); } @@ -1416,9 +1434,7 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event ) wxMessageBox(wxString::Format( _T( - " wxWindows Library (%s port)\n" - "Version %u.%u.%u, compiled at %s %s\n" - " Copyright (c) 1995-2000 wxWindows team" + " wxWindows Library (%s port)\nVersion %u.%u.%u, compiled at %s %s\n Copyright (c) 1995-2000 wxWindows team" ), port.c_str(), wxMAJOR_VERSION,