X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/540b6b097f0a8056189b3f9ab5aab5c99834b9c7..f1e269209afbcbec4e46ab5df4ba43d902a6bf2f:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 61402fabf0..d38042bda3 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "windowbase.h" #endif @@ -114,7 +114,6 @@ void wxWindowBase::InitBase() // no window yet, no parent nor children m_parent = (wxWindow *)NULL; m_windowId = -1; - m_children.DeleteContents( FALSE ); // don't auto delete node data // no constraints on the minimal window size m_minWidth = @@ -263,7 +262,7 @@ wxWindowBase::~wxWindowBase() // Just in case we've loaded a top-level window via LoadNativeDialog but // we weren't a dialog class - wxTopLevelWindows.DeleteObject(this); + wxTopLevelWindows.DeleteObject((wxWindow*)this); wxASSERT_MSG( GetChildren().GetCount() == 0, wxT("children not destroyed") ); @@ -332,9 +331,6 @@ bool wxWindowBase::Close(bool force) { wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId); event.SetEventObject(this); -#if WXWIN_COMPATIBILITY - event.SetForce(force); -#endif // WXWIN_COMPATIBILITY event.SetCanVeto(!force); // return FALSE if window wasn't closed because the application vetoed the @@ -344,7 +340,7 @@ bool wxWindowBase::Close(bool force) bool wxWindowBase::DestroyChildren() { - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( ;; ) { // we iterate until the list becomes empty @@ -520,7 +516,7 @@ wxSize wxWindowBase::DoGetBestSize() const int maxX = 0, maxY = 0; - for ( wxWindowList::Node *node = GetChildren().GetFirst(); + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext() ) { @@ -554,7 +550,7 @@ wxSize wxWindowBase::DoGetBestSize() const int maxX = 0, maxY = 0; - for ( wxWindowList::Node *node = GetChildren().GetFirst(); + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext() ) { @@ -708,9 +704,9 @@ void wxWindowBase::AddChild(wxWindowBase *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") ); + wxASSERT_MSG( !GetChildren().Find((wxWindow*)child), _T("AddChild() called twice") ); - GetChildren().Append(child); + GetChildren().Append((wxWindow*)child); child->SetParent(this); } @@ -718,8 +714,8 @@ void wxWindowBase::RemoveChild(wxWindowBase *child) { wxCHECK_RET( child, wxT("can't remove a NULL child") ); - GetChildren().DeleteObject(child); - child->SetParent((wxWindow *)NULL); + GetChildren().DeleteObject((wxWindow *)child); + child->SetParent(NULL); } bool wxWindowBase::Reparent(wxWindowBase *newParent) @@ -738,7 +734,7 @@ bool wxWindowBase::Reparent(wxWindowBase *newParent) } else { - wxTopLevelWindows.DeleteObject(this); + wxTopLevelWindows.DeleteObject((wxWindow *)this); } // add it to the new one @@ -748,7 +744,7 @@ bool wxWindowBase::Reparent(wxWindowBase *newParent) } else { - wxTopLevelWindows.Append(this); + wxTopLevelWindows.Append((wxWindow *)this); } return TRUE; @@ -978,6 +974,17 @@ bool wxWindowBase::IsExposed(int x, int y, int w, int h) const return m_updateRegion.Contains(x, y, w, h) != wxOutRegion; } +void wxWindowBase::ClearBackground() +{ + // wxGTK uses its own version, no need to add never used code +#ifndef __WXGTK__ + wxClientDC dc((wxWindow *)this); + wxBrush brush(GetBackgroundColour(), wxSOLID); + dc.SetBackground(brush); + dc.Clear(); +#endif // __WXGTK__ +} + // ---------------------------------------------------------------------------- // find child window by id or name // ---------------------------------------------------------------------------- @@ -988,7 +995,7 @@ wxWindow *wxWindowBase::FindWindow( long id ) return (wxWindow *)this; wxWindowBase *res = (wxWindow *)NULL; - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = m_children.GetFirst(); node && !res; node = node->GetNext() ) { wxWindowBase *child = node->GetData(); @@ -1004,7 +1011,7 @@ wxWindow *wxWindowBase::FindWindow( const wxString& name ) return (wxWindow *)this; wxWindowBase *res = (wxWindow *)NULL; - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = m_children.GetFirst(); node && !res; node = node->GetNext() ) { wxWindow *child = node->GetData(); @@ -1060,7 +1067,7 @@ wxWindow *wxFindWindowRecursively(const wxWindow *parent, return (wxWindow *)parent; // It wasn't, so check all its children - for ( wxWindowList::Node * node = parent->GetChildren().GetFirst(); + for ( wxWindowList::compatibility_iterator node = parent->GetChildren().GetFirst(); node; node = node->GetNext() ) { @@ -1090,7 +1097,7 @@ wxWindow *wxFindWindowHelper(const wxWindow *parent, } // start at very top of wx's windows - for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst(); + for ( wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { @@ -1142,7 +1149,7 @@ void wxWindowBase::MakeModal(bool modal) // Disable all other windows if ( IsTopLevel() ) { - wxWindowList::Node *node = wxTopLevelWindows.GetFirst(); + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); while (node) { wxWindow *win = node->GetData(); @@ -1159,7 +1166,7 @@ bool wxWindowBase::Validate() #if wxUSE_VALIDATORS bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0; - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = m_children.GetFirst(); node; node = node->GetNext() ) { wxWindowBase *child = node->GetData(); @@ -1184,7 +1191,7 @@ bool wxWindowBase::TransferDataToWindow() #if wxUSE_VALIDATORS bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0; - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = m_children.GetFirst(); node; node = node->GetNext() ) { wxWindowBase *child = node->GetData(); @@ -1218,7 +1225,7 @@ bool wxWindowBase::TransferDataFromWindow() #if wxUSE_VALIDATORS bool recurse = (GetExtraStyle() & wxWS_EX_VALIDATE_RECURSIVELY) != 0; - wxWindowList::Node *node; + wxWindowList::compatibility_iterator node; for ( node = m_children.GetFirst(); node; node = node->GetNext() ) { wxWindow *child = node->GetData(); @@ -1409,15 +1416,15 @@ void wxWindowBase::AddConstraintReference(wxWindowBase *otherWin) { if ( !m_constraintsInvolvedIn ) m_constraintsInvolvedIn = new wxWindowList; - if ( !m_constraintsInvolvedIn->Find(otherWin) ) - m_constraintsInvolvedIn->Append(otherWin); + if ( !m_constraintsInvolvedIn->Find((wxWindow *)otherWin) ) + m_constraintsInvolvedIn->Append((wxWindow *)otherWin); } // REMOVE back-pointer to other windows we're involved with. void wxWindowBase::RemoveConstraintReference(wxWindowBase *otherWin) { if ( m_constraintsInvolvedIn ) - m_constraintsInvolvedIn->DeleteObject(otherWin); + m_constraintsInvolvedIn->DeleteObject((wxWindow *)otherWin); } // Reset any constraints that mention this window @@ -1425,7 +1432,7 @@ void wxWindowBase::DeleteRelatedConstraints() { if ( m_constraintsInvolvedIn ) { - wxWindowList::Node *node = m_constraintsInvolvedIn->GetFirst(); + wxWindowList::compatibility_iterator node = m_constraintsInvolvedIn->GetFirst(); while (node) { wxWindow *win = node->GetData(); @@ -1444,8 +1451,8 @@ void wxWindowBase::DeleteRelatedConstraints() constr->centreY.ResetIfWin(this); } - wxWindowList::Node *next = node->GetNext(); - delete node; + wxWindowList::compatibility_iterator next = node->GetNext(); + m_constraintsInvolvedIn->Erase(node); node = next; } @@ -1559,7 +1566,7 @@ bool wxWindowBase::DoPhase(int phase) int noChanges = 0; // loop over all children setting their constraints - for ( wxWindowList::Node *node = GetChildren().GetFirst(); + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext() ) { @@ -1612,7 +1619,7 @@ void wxWindowBase::ResetConstraints() constr->centreY.SetDone(FALSE); } - wxWindowList::Node *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while (node) { wxWindow *win = node->GetData(); @@ -1654,7 +1661,7 @@ void wxWindowBase::SetConstraintSizes(bool recurse) if ( recurse ) { - wxWindowList::Node *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while (node) { wxWindow *win = node->GetData(); @@ -1782,7 +1789,7 @@ void wxWindowBase::UpdateWindowUI(long flags) if (flags & wxUPDATE_UI_RECURSE) { - wxWindowList::Node* node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while (node) { wxWindow* child = (wxWindow*) node->GetData(); @@ -1831,12 +1838,14 @@ void wxWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) #endif } +#if 0 // call internal idle recursively +// may be obsolete (wait until OnIdle scheme stabilises) void wxWindowBase::ProcessInternalIdle() { OnInternalIdle(); - wxWindowList::Node *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while (node) { wxWindow *child = node->GetData(); @@ -1844,6 +1853,7 @@ void wxWindowBase::ProcessInternalIdle() node = node->GetNext(); } } +#endif // ---------------------------------------------------------------------------- // dialog units translations @@ -1882,7 +1892,7 @@ wxPoint wxWindowBase::ConvertDialogToPixels(const wxPoint& pt) // propagate the colour change event to the subwindows void wxWindowBase::OnSysColourChanged(wxSysColourChangedEvent& event) { - wxWindowList::Node *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while ( node ) { // Only propagate to non-top-level windows @@ -2004,6 +2014,7 @@ wxAccessible* wxWindowBase::CreateAccessible() #endif +#if !wxUSE_STL // ---------------------------------------------------------------------------- // list classes implementation // ---------------------------------------------------------------------------- @@ -2012,6 +2023,7 @@ void wxWindowListNode::DeleteData() { delete (wxWindow *)GetData(); } +#endif // ---------------------------------------------------------------------------- // borders @@ -2137,10 +2149,9 @@ void wxWindowBase::SendDestroyEvent() // event processing // ---------------------------------------------------------------------------- -#if wxUSE_VALIDATORS - bool wxWindowBase::TryValidator(wxEvent& event) { +#if wxUSE_VALIDATORS // Can only use the validator of the window which // is receiving the event if ( event.GetEventObject() == this ) @@ -2148,21 +2159,19 @@ bool wxWindowBase::TryValidator(wxEvent& event) wxValidator *validator = GetValidator(); if ( validator && validator->ProcessEvent(event) ) { - return TRUE; + return true; } } +#endif // wxUSE_VALIDATORS - return FALSE; + return false; } -#endif // wxUSE_VALIDATORS - bool wxWindowBase::TryParent(wxEvent& event) { - // Carry on up the parent-child hierarchy, but only if event is a command - // event: it wouldn't make sense for a parent to receive a child's size - // event, for example - if ( event.IsCommandEvent() ) + // carry on up the parent-child hierarchy if the propgation count hasn't + // reached zero yet + if ( event.ShouldPropagate() ) { // honour the requests to stop propagation at this window: this is // used by the dialogs, for example, to prevent processing the events @@ -2172,7 +2181,11 @@ bool wxWindowBase::TryParent(wxEvent& event) { wxWindow *parent = GetParent(); if ( parent && !parent->IsBeingDeleted() ) + { + wxPropagateOnce propagateOnce(event); + return parent->GetEventHandler()->ProcessEvent(event); + } } } @@ -2223,7 +2236,7 @@ wxAccStatus wxWindowAccessible::GetLocation(wxRect& rect, int elementId) { if (elementId <= (int) GetWindow()->GetChildren().GetCount()) { - win = (wxWindow*) GetWindow()->GetChildren().Nth(elementId-1)->GetData(); + win = GetWindow()->GetChildren().Item(elementId-1)->GetData(); } else return wxACC_FAIL; @@ -2271,7 +2284,8 @@ wxAccStatus wxWindowAccessible::Navigate(wxNavDir navDir, int fromId, case wxNAVDIR_DOWN: case wxNAVDIR_NEXT: { - wxWindowList::Node *node = NULL; + wxWindowList::compatibility_iterator node = + wxWindowList::compatibility_iterator(); if (fromId == 0) { // Can't navigate to sibling of this window @@ -2284,12 +2298,12 @@ wxAccStatus wxWindowAccessible::Navigate(wxNavDir navDir, int fromId, else { if (fromId <= (int) GetWindow()->GetChildren().GetCount()) - node = (wxWindowList::Node*) GetWindow()->GetChildren().Nth(fromId-1); + node = GetWindow()->GetChildren().Item(fromId-1); } if (node && node->GetNext()) { - wxWindow* nextWindow = (wxWindow*) node->GetNext()->Data(); + wxWindow* nextWindow = node->GetNext()->GetData(); *toObject = nextWindow->GetOrCreateAccessible(); return wxACC_OK; } @@ -2300,7 +2314,8 @@ wxAccStatus wxWindowAccessible::Navigate(wxNavDir navDir, int fromId, case wxNAVDIR_UP: case wxNAVDIR_PREVIOUS: { - wxWindowList::Node *node = NULL; + wxWindowList::compatibility_iterator node = + wxWindowList::compatibility_iterator(); if (fromId == 0) { // Can't navigate to sibling of this window @@ -2313,12 +2328,12 @@ wxAccStatus wxWindowAccessible::Navigate(wxNavDir navDir, int fromId, else { if (fromId <= (int) GetWindow()->GetChildren().GetCount()) - node = (wxWindowList::Node*) GetWindow()->GetChildren().Nth(fromId-1); + node = GetWindow()->GetChildren().Item(fromId-1); } if (node && node->GetPrevious()) { - wxWindow* previousWindow = (wxWindow*) node->GetPrevious()->Data(); + wxWindow* previousWindow = node->GetPrevious()->GetData(); *toObject = previousWindow->GetOrCreateAccessible(); return wxACC_OK; } @@ -2391,7 +2406,7 @@ wxAccStatus wxWindowAccessible::GetChild(int childId, wxAccessible** child) if (childId > (int) GetWindow()->GetChildren().GetCount()) return wxACC_FAIL; - wxWindow* childWindow = (wxWindow*) GetWindow()->GetChildren().Nth(childId-1)->GetData(); + wxWindow* childWindow = GetWindow()->GetChildren().Item(childId-1)->GetData(); *child = childWindow->GetOrCreateAccessible(); if (*child) return wxACC_OK;