+// ----------------------------------------------------------------------------
+// mouse capture
+// ----------------------------------------------------------------------------
+
+struct WXDLLEXPORT wxWindowNext
+{
+ wxWindow *win;
+ wxWindowNext *next;
+} *wxWindowBase::ms_winCaptureNext = NULL;
+
+void wxWindowBase::CaptureMouse()
+{
+ wxLogTrace(_T("mousecapture"), _T("CaptureMouse(%p)"), this);
+
+ wxWindow *winOld = GetCapture();
+ if ( winOld )
+ {
+ ((wxWindowBase*) winOld)->DoReleaseMouse();
+
+ // save it on stack
+ wxWindowNext *item = new wxWindowNext;
+ item->win = winOld;
+ item->next = ms_winCaptureNext;
+ ms_winCaptureNext = item;
+ }
+ //else: no mouse capture to save
+
+ DoCaptureMouse();
+}
+
+void wxWindowBase::ReleaseMouse()
+{
+ wxLogTrace(_T("mousecapture"), _T("ReleaseMouse(%p)"), this);
+
+ wxASSERT_MSG( GetCapture() == this, wxT("attempt to release mouse, but this window hasn't captured it") );
+
+ DoReleaseMouse();
+
+ if ( ms_winCaptureNext )
+ {
+ ((wxWindowBase*)ms_winCaptureNext->win)->DoCaptureMouse();
+
+ wxWindowNext *item = ms_winCaptureNext;
+ ms_winCaptureNext = item->next;
+ delete item;
+ }
+ //else: stack is empty, no previous capture
+
+ wxLogTrace(_T("mousecapture"),
+ (const wxChar *) _T("After ReleaseMouse() mouse is captured by %p"),
+ GetCapture());
+}
+
+#if wxUSE_HOTKEY
+
+bool
+wxWindowBase::RegisterHotKey(int WXUNUSED(hotkeyId),
+ int WXUNUSED(modifiers),
+ int WXUNUSED(keycode))
+{
+ // not implemented
+ return false;
+}
+
+bool wxWindowBase::UnregisterHotKey(int WXUNUSED(hotkeyId))
+{
+ // not implemented
+ return false;
+}
+
+#endif // wxUSE_HOTKEY
+
+void wxWindowBase::SendDestroyEvent()
+{
+ wxWindowDestroyEvent event;
+ event.SetEventObject(this);
+ event.SetId(GetId());
+ GetEventHandler()->ProcessEvent(event);
+}
+
+// ----------------------------------------------------------------------------
+// event processing
+// ----------------------------------------------------------------------------
+
+bool wxWindowBase::TryValidator(wxEvent& wxVALIDATOR_PARAM(event))
+{
+#if wxUSE_VALIDATORS
+ // 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;
+ }
+ }
+#endif // wxUSE_VALIDATORS
+
+ return false;
+}
+
+bool wxWindowBase::TryParent(wxEvent& event)
+{
+ // 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
+ // 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() )
+ {
+ wxPropagateOnce propagateOnce(event);
+
+ return parent->GetEventHandler()->ProcessEvent(event);
+ }
+ }
+ }
+
+ return wxEvtHandler::TryParent(event);
+}
+
+// ----------------------------------------------------------------------------
+// keyboard navigation
+// ----------------------------------------------------------------------------
+
+// Navigates in the specified direction.
+bool wxWindowBase::Navigate(int flags)
+{
+ wxNavigationKeyEvent eventNav;
+ eventNav.SetFlags(flags);
+ eventNav.SetEventObject(this);
+ if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
+ {
+ return true;
+ }
+ return false;
+}
+
+void wxWindowBase::DoMoveInTabOrder(wxWindow *win, MoveKind move)
+{
+ // check that we're not a top level window
+ wxCHECK_RET( GetParent(),
+ _T("MoveBefore/AfterInTabOrder() don't work for TLWs!") );
+
+ // detect the special case when we have nothing to do anyhow and when the
+ // code below wouldn't work
+ if ( win == this )
+ return;
+
+ // find the target window in the siblings list
+ wxWindowList& siblings = GetParent()->GetChildren();
+ wxWindowList::compatibility_iterator i = siblings.Find(win);
+ wxCHECK_RET( i, _T("MoveBefore/AfterInTabOrder(): win is not a sibling") );
+
+ // unfortunately, when wxUSE_STL == 1 DetachNode() is not implemented so we
+ // can't just move the node around
+ wxWindow *self = (wxWindow *)this;
+ siblings.DeleteObject(self);
+ if ( move == MoveAfter )
+ {
+ i = i->GetNext();
+ }
+
+ if ( i )
+ {
+ siblings.Insert(i, self);
+ }
+ else // MoveAfter and win was the last sibling
+ {
+ siblings.Append(self);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// focus handling
+// ----------------------------------------------------------------------------
+
+/*static*/ wxWindow* wxWindowBase::FindFocus()
+{
+ wxWindowBase *win = DoFindFocus();
+ return win ? win->GetMainWindowOfCompositeControl() : NULL;
+}
+
+// ----------------------------------------------------------------------------
+// global functions
+// ----------------------------------------------------------------------------
+
+wxWindow* wxGetTopLevelParent(wxWindow *win)
+{
+ while ( win && !win->IsTopLevel() )
+ win = win->GetParent();
+
+ return win;
+}
+
+#if wxUSE_ACCESSIBILITY
+// ----------------------------------------------------------------------------
+// accessible object for windows
+// ----------------------------------------------------------------------------
+
+// Can return either a child object, or an integer
+// representing the child element, starting from 1.
+wxAccStatus wxWindowAccessible::HitTest(const wxPoint& WXUNUSED(pt), int* WXUNUSED(childId), wxAccessible** WXUNUSED(childObject))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Returns the rectangle for this object (id = 0) or a child element (id > 0).
+wxAccStatus wxWindowAccessible::GetLocation(wxRect& rect, int elementId)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ wxWindow* win = NULL;
+ if (elementId == 0)
+ {
+ win = GetWindow();
+ }
+ else
+ {
+ if (elementId <= (int) GetWindow()->GetChildren().GetCount())
+ {
+ win = GetWindow()->GetChildren().Item(elementId-1)->GetData();
+ }
+ else
+ return wxACC_FAIL;
+ }
+ if (win)
+ {
+ rect = win->GetRect();
+ if (win->GetParent() && !win->IsKindOf(CLASSINFO(wxTopLevelWindow)))
+ rect.SetPosition(win->GetParent()->ClientToScreen(rect.GetPosition()));
+ return wxACC_OK;
+ }
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Navigates from fromId to toId/toObject.
+wxAccStatus wxWindowAccessible::Navigate(wxNavDir navDir, int fromId,
+ int* WXUNUSED(toId), wxAccessible** toObject)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ switch (navDir)
+ {
+ case wxNAVDIR_FIRSTCHILD:
+ {
+ if (GetWindow()->GetChildren().GetCount() == 0)
+ return wxACC_FALSE;
+ wxWindow* childWindow = (wxWindow*) GetWindow()->GetChildren().GetFirst()->GetData();
+ *toObject = childWindow->GetOrCreateAccessible();
+
+ return wxACC_OK;
+ }
+ case wxNAVDIR_LASTCHILD:
+ {
+ if (GetWindow()->GetChildren().GetCount() == 0)
+ return wxACC_FALSE;
+ wxWindow* childWindow = (wxWindow*) GetWindow()->GetChildren().GetLast()->GetData();
+ *toObject = childWindow->GetOrCreateAccessible();
+
+ return wxACC_OK;
+ }
+ case wxNAVDIR_RIGHT:
+ case wxNAVDIR_DOWN:
+ case wxNAVDIR_NEXT:
+ {
+ wxWindowList::compatibility_iterator node =
+ wxWindowList::compatibility_iterator();
+ if (fromId == 0)
+ {
+ // Can't navigate to sibling of this window
+ // if we're a top-level window.
+ if (!GetWindow()->GetParent())
+ return wxACC_NOT_IMPLEMENTED;
+
+ node = GetWindow()->GetParent()->GetChildren().Find(GetWindow());
+ }
+ else
+ {
+ if (fromId <= (int) GetWindow()->GetChildren().GetCount())
+ node = GetWindow()->GetChildren().Item(fromId-1);
+ }
+
+ if (node && node->GetNext())
+ {
+ wxWindow* nextWindow = node->GetNext()->GetData();
+ *toObject = nextWindow->GetOrCreateAccessible();
+ return wxACC_OK;
+ }
+ else
+ return wxACC_FALSE;
+ }
+ case wxNAVDIR_LEFT:
+ case wxNAVDIR_UP:
+ case wxNAVDIR_PREVIOUS:
+ {
+ wxWindowList::compatibility_iterator node =
+ wxWindowList::compatibility_iterator();
+ if (fromId == 0)
+ {
+ // Can't navigate to sibling of this window
+ // if we're a top-level window.
+ if (!GetWindow()->GetParent())
+ return wxACC_NOT_IMPLEMENTED;
+
+ node = GetWindow()->GetParent()->GetChildren().Find(GetWindow());
+ }
+ else
+ {
+ if (fromId <= (int) GetWindow()->GetChildren().GetCount())
+ node = GetWindow()->GetChildren().Item(fromId-1);
+ }
+
+ if (node && node->GetPrevious())
+ {
+ wxWindow* previousWindow = node->GetPrevious()->GetData();
+ *toObject = previousWindow->GetOrCreateAccessible();
+ return wxACC_OK;
+ }
+ else
+ return wxACC_FALSE;
+ }
+ }
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Gets the name of the specified object.
+wxAccStatus wxWindowAccessible::GetName(int childId, wxString* name)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ wxString title;
+
+ // If a child, leave wxWidgets 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 wxWidgets
+ // control or window.
+#if wxUSE_BUTTON
+ if (GetWindow()->IsKindOf(CLASSINFO(wxButton)))
+ title = ((wxButton*) GetWindow())->GetLabel();
+ else
+#endif
+ title = GetWindow()->GetName();
+
+ if (!title.empty())
+ {
+ *name = title;
+ return wxACC_OK;
+ }
+ else
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Gets the number of children.
+wxAccStatus wxWindowAccessible::GetChildCount(int* childId)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ *childId = (int) GetWindow()->GetChildren().GetCount();
+ return wxACC_OK;
+}
+
+// Gets the specified child (starting from 1).
+// If *child is NULL and return value is wxACC_OK,
+// this means that the child is a simple element and
+// not an accessible object.
+wxAccStatus wxWindowAccessible::GetChild(int childId, wxAccessible** child)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ if (childId == 0)
+ {
+ *child = this;
+ return wxACC_OK;
+ }
+
+ if (childId > (int) GetWindow()->GetChildren().GetCount())
+ return wxACC_FAIL;
+
+ wxWindow* childWindow = GetWindow()->GetChildren().Item(childId-1)->GetData();
+ *child = childWindow->GetOrCreateAccessible();
+ if (*child)
+ return wxACC_OK;
+ else
+ return wxACC_FAIL;
+}
+
+// Gets the parent, or NULL.
+wxAccStatus wxWindowAccessible::GetParent(wxAccessible** parent)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ wxWindow* parentWindow = GetWindow()->GetParent();
+ if (!parentWindow)
+ {
+ *parent = NULL;
+ return wxACC_OK;
+ }
+ else
+ {
+ *parent = parentWindow->GetOrCreateAccessible();
+ if (*parent)
+ return wxACC_OK;
+ else
+ return wxACC_FAIL;
+ }
+}
+
+// Performs the default action. childId is 0 (the action for this object)
+// or > 0 (the action for a child).
+// Return wxACC_NOT_SUPPORTED if there is no default action for this
+// window (e.g. an edit control).
+wxAccStatus wxWindowAccessible::DoDefaultAction(int WXUNUSED(childId))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Gets the default action for this object (0) or > 0 (the action for a child).
+// Return wxACC_OK even if there is no action. actionName is the action, or the empty
+// string if there is no action.
+// The retrieved string describes the action that is performed on an object,
+// not what the object does as a result. For example, a toolbar button that prints
+// a document has a default action of "Press" rather than "Prints the current document."
+wxAccStatus wxWindowAccessible::GetDefaultAction(int WXUNUSED(childId), wxString* WXUNUSED(actionName))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Returns the description for this object or a child.
+wxAccStatus wxWindowAccessible::GetDescription(int WXUNUSED(childId), wxString* description)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ wxString ht(GetWindow()->GetHelpText());
+ if (!ht.empty())
+ {
+ *description = ht;
+ return wxACC_OK;
+ }
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Returns help text for this object or a child, similar to tooltip text.
+wxAccStatus wxWindowAccessible::GetHelpText(int WXUNUSED(childId), wxString* helpText)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ wxString ht(GetWindow()->GetHelpText());
+ if (!ht.empty())
+ {
+ *helpText = ht;
+ return wxACC_OK;
+ }
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Returns the keyboard shortcut for this object or child.
+// Return e.g. ALT+K
+wxAccStatus wxWindowAccessible::GetKeyboardShortcut(int WXUNUSED(childId), wxString* WXUNUSED(shortcut))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Returns a role constant.
+wxAccStatus wxWindowAccessible::GetRole(int childId, wxAccRole* role)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ // If a child, leave wxWidgets 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;
+
+ #if 0
+ return wxACC_NOT_IMPLEMENTED;
+ #endif
+}
+
+// Returns a state constant.
+wxAccStatus wxWindowAccessible::GetState(int childId, long* state)
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ // If a child, leave wxWidgets 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;
+
+ #if 0
+ return wxACC_NOT_IMPLEMENTED;
+ #endif
+}
+
+// Returns a localized string representing the value for the object
+// or child.
+wxAccStatus wxWindowAccessible::GetValue(int WXUNUSED(childId), wxString* WXUNUSED(strValue))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Selects the object or child.
+wxAccStatus wxWindowAccessible::Select(int WXUNUSED(childId), wxAccSelectionFlags WXUNUSED(selectFlags))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Gets the window with the keyboard focus.
+// If childId is 0 and child is NULL, no object in
+// this subhierarchy has the focus.
+// If this object has the focus, child should be 'this'.
+wxAccStatus wxWindowAccessible::GetFocus(int* WXUNUSED(childId), wxAccessible** WXUNUSED(child))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+// Gets a variant representing the selected children
+// of this object.
+// Acceptable values:
+// - a null variant (IsNull() returns true)
+// - a list variant (GetType() == wxT("list")
+// - an integer representing the selected child element,
+// or 0 if this object is selected (GetType() == wxT("long")
+// - a "void*" pointer to a wxAccessible child object
+wxAccStatus wxWindowAccessible::GetSelections(wxVariant* WXUNUSED(selections))
+{
+ wxASSERT( GetWindow() != NULL );
+ if (!GetWindow())
+ return wxACC_FAIL;
+
+ return wxACC_NOT_IMPLEMENTED;
+}
+
+#endif // wxUSE_ACCESSIBILITY