- wxWindow *child = (wxWindow *)node->Data();
- if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ !child->GetValidator()->Validate(this) )
- {
- return FALSE;
- }
-
- node = node->Next();
- }
- return TRUE;
-}
-
-// Get the window with the focus
-wxWindow *wxWindow::FindFocus()
-{
- return gFocusWindow ;
-}
-
-// ----------------------------------------------------------------------------
-// RTTI
-// ----------------------------------------------------------------------------
-
-bool wxWindow::IsTopLevel() const
-{
- return wxDynamicCast(this, wxFrame) || wxDynamicCast(this, wxDialog);
-}
-
-void wxWindow::AddChild(wxWindow *child)
-{
- GetChildren().Append(child);
- child->m_windowParent = this;
-}
-
-void wxWindow::RemoveChild(wxWindow *child)
-{
- GetChildren().DeleteObject(child);
- child->m_windowParent = NULL;
-}
-
-void wxWindow::DestroyChildren()
-{
- wxNode *node;
- while ((node = GetChildren().First()) != (wxNode *)NULL) {
- wxWindow *child;
- if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) {
- delete child;
- if ( GetChildren().Find(child) )
- delete node;
- }
- } /* while */
-}
-
-void wxWindow::MakeModal(bool modal)
-{
- // Disable all other windows
- if (this->IsKindOf(CLASSINFO(wxDialog)) || this->IsKindOf(CLASSINFO(wxFrame)))
- {
- wxNode *node = wxTopLevelWindows.First();
- while (node)
- {
- wxWindow *win = (wxWindow *)node->Data();
- if (win != this)
- win->Enable(!modal);
-
- node = node->Next();
- }
- }
-}
-
-// If nothing defined for this, try the parent.
-// E.g. we may be a button loaded from a resource, with no callback function
-// defined.
-void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event)
-{
- if (GetEventHandler()->ProcessEvent(event) )
- return;
- if (m_windowParent)
- m_windowParent->GetEventHandler()->OnCommand(win, event);
-}
-
-// ----------------------------------------------------------------------------
-// constraints and sizers
-// ----------------------------------------------------------------------------
-
-#if wxUSE_CONSTRAINTS
-
-void wxWindow::SetConstraints( wxLayoutConstraints *constraints )
-{
- if ( m_constraints )
- {
- UnsetConstraints(m_constraints);
- delete m_constraints;
- }
- m_constraints = constraints;
- if ( m_constraints )
- {
- // Make sure other windows know they're part of a 'meaningful relationship'
- if ( m_constraints->left.GetOtherWindow() && (m_constraints->left.GetOtherWindow() != this) )
- m_constraints->left.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->top.GetOtherWindow() && (m_constraints->top.GetOtherWindow() != this) )
- m_constraints->top.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->right.GetOtherWindow() && (m_constraints->right.GetOtherWindow() != this) )
- m_constraints->right.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->bottom.GetOtherWindow() && (m_constraints->bottom.GetOtherWindow() != this) )
- m_constraints->bottom.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->width.GetOtherWindow() && (m_constraints->width.GetOtherWindow() != this) )
- m_constraints->width.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->height.GetOtherWindow() && (m_constraints->height.GetOtherWindow() != this) )
- m_constraints->height.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->centreX.GetOtherWindow() && (m_constraints->centreX.GetOtherWindow() != this) )
- m_constraints->centreX.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->centreY.GetOtherWindow() && (m_constraints->centreY.GetOtherWindow() != this) )
- m_constraints->centreY.GetOtherWindow()->AddConstraintReference(this);
- }
-}
-
-// This removes any dangling pointers to this window in other windows'
-// constraintsInvolvedIn lists.
-void wxWindow::UnsetConstraints(wxLayoutConstraints *c)
-{
- if ( c )
- {
- if ( c->left.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
- c->left.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->top.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
- c->top.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->right.GetOtherWindow() && (c->right.GetOtherWindow() != this) )
- c->right.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->bottom.GetOtherWindow() && (c->bottom.GetOtherWindow() != this) )
- c->bottom.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->width.GetOtherWindow() && (c->width.GetOtherWindow() != this) )
- c->width.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->height.GetOtherWindow() && (c->height.GetOtherWindow() != this) )
- c->height.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->centreX.GetOtherWindow() && (c->centreX.GetOtherWindow() != this) )
- c->centreX.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->centreY.GetOtherWindow() && (c->centreY.GetOtherWindow() != this) )
- c->centreY.GetOtherWindow()->RemoveConstraintReference(this);
- }
-}
-
-// Back-pointer to other windows we're involved with, so if we delete this
-// window, we must delete any constraints we're involved with.
-void wxWindow::AddConstraintReference(wxWindow *otherWin)
-{
- if ( !m_constraintsInvolvedIn )
- m_constraintsInvolvedIn = new wxWindowList;
- if ( !m_constraintsInvolvedIn->Find(otherWin) )
- m_constraintsInvolvedIn->Append(otherWin);
-}
-
-// REMOVE back-pointer to other windows we're involved with.
-void wxWindow::RemoveConstraintReference(wxWindow *otherWin)
-{
- if ( m_constraintsInvolvedIn )
- m_constraintsInvolvedIn->DeleteObject(otherWin);
-}
-
-// Reset any constraints that mention this window
-void wxWindow::DeleteRelatedConstraints()
-{
- if ( m_constraintsInvolvedIn )
- {
- wxWindowList::Node *node = m_constraintsInvolvedIn->GetFirst();
- while (node)
- {
- wxWindow *win = node->GetData();
- wxLayoutConstraints *constr = win->GetConstraints();
-
- // Reset any constraints involving this window
- if ( constr )
- {
- constr->left.ResetIfWin(this);
- constr->top.ResetIfWin(this);
- constr->right.ResetIfWin(this);
- constr->bottom.ResetIfWin(this);
- constr->width.ResetIfWin(this);
- constr->height.ResetIfWin(this);
- constr->centreX.ResetIfWin(this);
- constr->centreY.ResetIfWin(this);
- }
-
- wxWindowList::Node *next = node->GetNext();
- delete node;
- node = next;
- }
-
- delete m_constraintsInvolvedIn;
- m_constraintsInvolvedIn = (wxWindowList *) NULL;
- }
-}
-
-void wxWindow::SetSizer(wxSizer *sizer)
-{
- if (m_windowSizer) delete m_windowSizer;
-
- m_windowSizer = sizer;
-}
-
-bool wxWindow::Layout()
-{
- int w, h;
- GetClientSize(&w, &h);
-
- // If there is a sizer, use it instead of the constraints
- if ( GetSizer() )
- {
- GetSizer()->SetDimension( 0, 0, w, h );
- return TRUE;
- }
-
- if ( GetConstraints() )
- {
- GetConstraints()->width.SetValue(w);
- GetConstraints()->height.SetValue(h);
- }