From d1c8aaa3ee8e2051ebd20042b7e59a511c276ca2 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Tue, 26 Sep 2000 15:36:12 +0000 Subject: [PATCH] Fiddled with wxFindWindowAtPoint to make it work with notebooks and static boxes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8422 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/cshelp.cpp | 9 +++++++ src/common/utilscmn.cpp | 57 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/common/cshelp.cpp b/src/common/cshelp.cpp index f1e8b26f4e..805ada8bff 100644 --- a/src/common/cshelp.cpp +++ b/src/common/cshelp.cpp @@ -119,6 +119,15 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win) { wxPoint pt; wxWindow* winAtPtr = wxFindWindowAtPointer(pt); + /* + if (winAtPtr) + { + wxString msg; + msg.Printf("Picked %s (%d)", (const char*) winAtPtr->GetName(), winAtPtr->GetId()); + cout << msg << '\n'; + } + */ + if (winAtPtr) DispatchEvent(winAtPtr, pt); } diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index e556674f85..796e131cf0 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -66,6 +66,10 @@ #if wxUSE_GUI #include "wx/colordlg.h" + #include "wx/notebook.h" + #include "wx/frame.h" + #include "wx/statusbr.h" + #include "wx/toolbar.h" #endif // wxUSE_GUI #include @@ -667,17 +671,62 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i return menuBar->FindMenuItem (menuString, itemString); } -// Try to find the deepest child that contains 'pt' +// Try to find the deepest child that contains 'pt'. +// We go backwards, to try to allow for controls that are spacially +// within other controls, but are still siblings (e.g. buttons within +// static boxes). Static boxes are likely to be created _before_ controls +// that sit inside them. wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt) { - wxNode* node = win->GetChildren().First(); + if (!win->IsShown()) + return NULL; + + // Hack for wxNotebook case: at least in wxGTK, all pages + // claim to be shown, so we must only deal with the selected one. + if (win->IsKindOf(CLASSINFO(wxNotebook))) + { + wxNotebook* nb = (wxNotebook*) win; + int sel = nb->GetSelection(); + if (sel >= 0) + { + wxWindow* child = nb->GetPage(sel); + wxWindow* foundWin = wxFindWindowAtPoint(child, pt); + if (foundWin) + return foundWin; + } + } + /* Doesn't work + // Frame case + else if (win->IsKindOf(CLASSINFO(wxFrame))) + { + // Pseudo-children that may not be mentioned in the child list + wxWindowList extraChildren; + wxFrame* frame = (wxFrame*) win; + if (frame->GetStatusBar()) + extraChildren.Append(frame->GetStatusBar()); + if (frame->GetToolBar()) + extraChildren.Append(frame->GetToolBar()); + + wxNode* node = extraChildren.First(); + while (node) + { + wxWindow* child = (wxWindow*) node->Data(); + wxWindow* foundWin = wxFindWindowAtPoint(child, pt); + if (foundWin) + return foundWin; + node = node->Next(); + } + } + */ + + wxNode* node = win->GetChildren().Last(); while (node) { wxWindow* child = (wxWindow*) node->Data(); wxWindow* foundWin = wxFindWindowAtPoint(child, pt); if (foundWin) - return foundWin; - node = node->Next(); + return foundWin; + node = node->Previous(); } wxPoint pos = win->GetPosition(); -- 2.45.2