X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e587e144c87b9a26adc3b3b5bfa416b15d12aa6e..5e0d7b6bce53ad3ceb3c832925c25d2e614a0d62:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 4b96081219..383c61e8fa 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -6,7 +6,7 @@ // Created: 13/07/98 // RCS-ID: $Id$ // Copyright: (c) wxWindows team -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -149,15 +149,13 @@ void wxWindowBase::InitBase() m_hasBgCol = m_hasFgCol = m_hasFont = FALSE; + + m_isBeingDeleted = FALSE; // no style bits m_exStyle = m_windowStyle = 0; - // an optimization for the event processing: checking this flag is much - // faster than using IsKindOf(CLASSINFO(wxWindow)) - m_isWindow = TRUE; - #if wxUSE_CONSTRAINTS // no constraints whatsoever m_constraints = (wxLayoutConstraints *) NULL; @@ -208,11 +206,6 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, const wxValidator& validator, const wxString& name) { - // m_isWindow is set to TRUE in wxWindowBase::Init() as well as many other - // member variables - check that it has been called (will catch the case - // when a new ctor is added which doesn't call InitWindow) - wxASSERT_MSG( m_isWindow, wxT("Init() must have been called before!") ); - #if wxUSE_STATBOX // wxGTK doesn't allow to create controls with static box as the parent so // this will result in a crash when the program is ported to wxGTK so warn @@ -224,8 +217,14 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, _T("wxStaticBox can't be used as a window parent!") ); #endif // wxUSE_STATBOX + // ids are limited to 16 bits under MSW so if you care about portability, + // it's not a good idea to use ids out of this range (and negative ids are + // reserved for wxWindows own usage) + wxASSERT_MSG( id == wxID_ANY || (id >= 0 && id < 32767), + _T("invalid id value") ); + // generate a new id if the user doesn't care about it - m_windowId = id == -1 ? NewControlId() : id; + m_windowId = id == wxID_ANY ? NewControlId() : id; SetName(name); SetWindowStyleFlag(style); @@ -618,7 +617,7 @@ void wxWindowBase::SetSizeHints(int minW, int minH, // setting min width greater than max width leads to infinite loops under // X11 and generally doesn't make any sense, so don't allow it wxCHECK_RET( (minW == -1 || maxW == -1 || minW <= maxW) && - (minH == -1 || maxH == -1 || minH < maxH), + (minH == -1 || maxH == -1 || minH <= maxH), _T("min width/height must be less than max width/height!") ); m_minWidth = minW; @@ -1959,7 +1958,7 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event ) #if wxUSE_ACCESSIBILITY void wxWindowBase::SetAccessible(wxAccessible* accessible) { - if (m_accessible) + if (m_accessible && (accessible != m_accessible)) delete m_accessible; m_accessible = accessible; if (m_accessible) @@ -2093,6 +2092,52 @@ void wxWindowBase::SendDestroyEvent() GetEventHandler()->ProcessEvent(event); } +// ---------------------------------------------------------------------------- +// event processing +// ---------------------------------------------------------------------------- + +#if wxUSE_VALIDATORS + +bool wxWindowBase::TryValidator(wxEvent& event) +{ + // Can only use the validator of the window which + // is receiving the event + if ( event.GetEventObject() == this ) + { + wxValidator *validator = GetValidator(); + if ( validator && validator->ProcessEvent(event) ) + { + return TRUE; + } + } + + 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() ) + { + // honour the requests to stop propagation at this window: this is + // used by the dialogs, for example, to prevent processing the events + // from the dialog controls in the parent frame which rarely, if ever, + // makes sense + if ( !(GetExtraStyle() & wxWS_EX_BLOCK_EVENTS) ) + { + wxWindow *parent = GetParent(); + if ( parent && !parent->IsBeingDeleted() ) + return parent->GetEventHandler()->ProcessEvent(event); + } + } + + return wxEvtHandler::TryParent(event); +} + // ---------------------------------------------------------------------------- // global functions // ---------------------------------------------------------------------------- @@ -2251,7 +2296,21 @@ wxAccStatus wxWindowAccessible::GetName(int childId, wxString* name) if (!GetWindow()) return wxACC_FAIL; - wxString title(GetWindow()->GetTitle()); + wxString title; + + // If a child, leave wxWindows to call the function on the actual + // child object. + if (childId > 0) + return wxACC_NOT_IMPLEMENTED; + + // This will eventually be replaced by specialised + // accessible classes, one for each kind of wxWindows + // control or window. + if (GetWindow()->IsKindOf(CLASSINFO(wxButton))) + title = ((wxButton*) GetWindow())->GetLabel(); + else + title = GetWindow()->GetName(); + if (!title.IsEmpty()) { *name = title; @@ -2357,6 +2416,12 @@ wxAccStatus wxWindowAccessible::GetDescription(int childId, wxString* descriptio if (!GetWindow()) return wxACC_FAIL; + wxString ht(GetWindow()->GetHelpText()); + if (!ht.IsEmpty()) + { + *description = ht; + return wxACC_OK; + } return wxACC_NOT_IMPLEMENTED; } @@ -2394,6 +2459,26 @@ wxAccStatus wxWindowAccessible::GetRole(int childId, wxAccRole* role) if (!GetWindow()) return wxACC_FAIL; + // If a child, leave wxWindows to call the function on the actual + // child object. + if (childId > 0) + return wxACC_NOT_IMPLEMENTED; + + if (GetWindow()->IsKindOf(CLASSINFO(wxControl))) + return wxACC_NOT_IMPLEMENTED; +#if wxUSE_STATUSBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxStatusBar))) + return wxACC_NOT_IMPLEMENTED; +#endif +#if wxUSE_TOOLBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxToolBar))) + return wxACC_NOT_IMPLEMENTED; +#endif + + //*role = wxROLE_SYSTEM_CLIENT; + *role = wxROLE_SYSTEM_CLIENT; + return wxACC_OK; + return wxACC_NOT_IMPLEMENTED; } @@ -2404,6 +2489,26 @@ wxAccStatus wxWindowAccessible::GetState(int childId, long* state) if (!GetWindow()) return wxACC_FAIL; + // If a child, leave wxWindows to call the function on the actual + // child object. + if (childId > 0) + return wxACC_NOT_IMPLEMENTED; + + if (GetWindow()->IsKindOf(CLASSINFO(wxControl))) + return wxACC_NOT_IMPLEMENTED; + +#if wxUSE_STATUSBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxStatusBar))) + return wxACC_NOT_IMPLEMENTED; +#endif +#if wxUSE_TOOLBAR + if (GetWindow()->IsKindOf(CLASSINFO(wxToolBar))) + return wxACC_NOT_IMPLEMENTED; +#endif + + *state = 0; + return wxACC_OK; + return wxACC_NOT_IMPLEMENTED; }