#include "wx/settings.h"
#include "wx/dialog.h"
#include "wx/msgdlg.h"
+ #include "wx/statusbr.h"
#endif //WX_PRECOMP
#if wxUSE_CONSTRAINTS
m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT);
// GRG, changed Mar/2000
-#if 0 // !defined(__WXMAC__) && !defined(__WXGTK__)
- m_font = *wxSWISS_FONT; // and this?
-#else
m_font = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
-#endif
// no style bits
m_exStyle =
m_windowStyle = 0;
// 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 )
}
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;
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);
node = node->GetNext() )
{
wxWindow *win = node->GetData();
- if ( win->IsTopLevel() )
+ if ( win->IsTopLevel() || wxDynamicCast(win, wxStatusBar) )
{
// dialogs and frames lie in different top level windows -
- // don't deal with them here
+ // don't deal with them here; as for the status bars, they
+ // don't lie in the client area at all
continue;
}
{
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);
}
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,