X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ea1ad04b434f92c1269e6dde222a77698d6f873c..db4c39a9e87953142471077d6d26e509b2b05b6c:/src/common/popupcmn.cpp diff --git a/src/common/popupcmn.cpp b/src/common/popupcmn.cpp index 7da199a713..62b1a21c3a 100644 --- a/src/common/popupcmn.cpp +++ b/src/common/popupcmn.cpp @@ -6,7 +6,7 @@ // Created: 06.01.01 // RCS-ID: $Id$ // Copyright: (c) 2001 Vadim Zeitlin -// License: wxWindows license +// License: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "popupwinbase.h" #endif @@ -28,21 +28,24 @@ #pragma hdrstop #endif -#if wxUSE_POPUPWIN && !defined(__WXMOTIF__) +#if wxUSE_POPUPWIN #include "wx/popupwin.h" #ifndef WX_PRECOMP #include "wx/combobox.h" // wxComboControl + #include "wx/app.h" // wxPostEvent + #include "wx/log.h" + #include "wx/app.h" #endif //WX_PRECOMP #ifdef __WXUNIVERSAL__ #include "wx/univ/renderer.h" #endif // __WXUNIVERSAL__ -// there is no src/{msw,mgl}/popupwin.cpp to put this in, so we do it here - BTW we +// there is no src/mgl/popupwin.cpp to put this in, so we do it here - BTW we // probably could do it for all ports here just as well -#if defined(__WXMSW__) || defined(__WXMGL__) +#if defined(__WXMGL__) IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow, wxWindow) #endif // __WXMSW__ @@ -71,6 +74,7 @@ private: wxPopupTransientWindow *m_popup; DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPopupWindowHandler) }; class wxPopupFocusHandler : public wxEvtHandler @@ -101,6 +105,7 @@ private: #endif // __WXGTK__ DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxPopupFocusHandler) }; // ---------------------------------------------------------------------------- @@ -193,8 +198,9 @@ wxPopupTransientWindow::wxPopupTransientWindow(wxWindow *parent, int style) wxPopupTransientWindow::~wxPopupTransientWindow() { PopHandlers(); - +#ifndef __WXX11__ delete m_handlerFocus; +#endif delete m_handlerPopup; } @@ -215,12 +221,13 @@ void wxPopupTransientWindow::PopHandlers() if ( m_focus ) { +#ifndef __WXX11__ if ( !m_focus->RemoveEventHandler(m_handlerFocus) ) { // see above m_handlerFocus = NULL; } - +#endif m_focus = NULL; } } @@ -250,6 +257,8 @@ void wxPopupTransientWindow::Popup(wxWindow *winFocus) m_focus = winFocus ? winFocus : this; m_focus->SetFocus(); +#ifndef __WXX11__ + #ifdef __WXMSW__ // MSW doesn't allow to set focus to the popup window, but we need to // subclass the window which has the focus, and not winFocus passed in or @@ -263,6 +272,8 @@ void wxPopupTransientWindow::Popup(wxWindow *winFocus) m_focus->PushEventHandler(m_handlerFocus); } + +#endif // !__WXX11__ } void wxPopupTransientWindow::Dismiss() @@ -296,6 +307,10 @@ bool wxPopupTransientWindow::ProcessLeftDown(wxMouseEvent& WXUNUSED(event)) // wxPopupComboWindow // ---------------------------------------------------------------------------- +BEGIN_EVENT_TABLE(wxPopupComboWindow, wxPopupTransientWindow) + EVT_KEY_DOWN(wxPopupComboWindow::OnKeyDown) +END_EVENT_TABLE() + wxPopupComboWindow::wxPopupComboWindow(wxComboControl *parent) : wxPopupTransientWindow(parent) { @@ -333,6 +348,11 @@ void wxPopupComboWindow::OnDismiss() m_combo->OnDismiss(); } +void wxPopupComboWindow::OnKeyDown(wxKeyEvent& event) +{ + m_combo->ProcessEvent(event); +} + #endif // wxUSE_COMBOBOX && defined(__WXUNIVERSAL__) // ---------------------------------------------------------------------------- @@ -354,12 +374,34 @@ void wxPopupWindowHandler::OnLeftDown(wxMouseEvent& event) wxWindow *sbar = NULL; wxWindow *win = (wxWindow *)event.GetEventObject(); - + switch ( win->HitTest(pos.x, pos.y) ) { case wxHT_WINDOW_OUTSIDE: - // clicking outside a popup dismisses it - m_popup->DismissAndNotify(); + { + // do the coords translation now as after DismissAndNotify() + // m_popup may be destroyed + wxMouseEvent event2(event); + + m_popup->ClientToScreen(&event2.m_x, &event2.m_y); + + // clicking outside a popup dismisses it + m_popup->DismissAndNotify(); + + // dismissing a tooltip shouldn't waste a click, i.e. you + // should be able to dismiss it and press the button with the + // same click, so repost this event to the window beneath us + wxWindow *win = wxFindWindowAtPoint(event2.GetPosition()); + if ( win ) + { + // translate the event coords to the ones of the window + // which is going to get the event + win->ScreenToClient(&event2.m_x, &event2.m_y); + + event2.SetEventObject(win); + wxPostEvent(win, event2); + } + } break; #ifdef __WXUNIVERSAL__ @@ -426,7 +468,7 @@ void wxPopupFocusHandler::OnKillFocus(wxFocusEvent& event) return; win = win->GetParent(); } - + m_popup->DismissAndNotify(); }