]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/popupwin.cpp
new wxASSERT implementation using wxAssert() helper function
[wxWidgets.git] / src / os2 / popupwin.cpp
index adc25e8f9cd7142de923794044823755e0d2629d..4c0ca2757ac9410fc93d9104ff4c630a3e53bb07 100644 (file)
@@ -30,6 +30,8 @@
 
 #include "wx/popupwin.h"
 
+wxWindowList wxPopupWindow::m_svShownPopups;
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -74,3 +76,73 @@ WXDWORD wxPopupWindow::OS2GetStyle(
     return dwStyle;
 } // end of wxPopupWindow::OS2GetStyle
 
+bool wxPopupWindow::Show(
+  bool                              bShow
+)
+{
+    SWP                             vSwp;
+    //
+    // Skip wxWindow::Show() which calls wxBringWindowToTop(): this results in
+    // activating the popup window and stealing the atcivation from our parent
+    // which means that the parent frame becomes deactivated when opening a
+    // combobox, for example -- definitely not what we want
+    //
+    if (!wxWindowBase::Show(bShow))
+        return FALSE;
+
+    if (bShow)
+    {
+        m_svShownPopups.Append(this);
+    }
+    else // remove from the shown list
+    {
+        m_svShownPopups.DeleteObject(this);
+    }
+    ::WinQueryWindowPos(GetHwnd(), &vSwp);
+
+    if (bShow)
+    {
+        ::WinSetWindowPos( GetHwnd()
+                          ,HWND_TOP
+                          ,vSwp.x
+                          ,vSwp.y
+                          ,vSwp.cx
+                          ,vSwp.cy
+                          ,SWP_DEACTIVATE | SWP_SHOW | SWP_ZORDER
+                         );
+    }
+    else
+    {
+        ::WinSetWindowPos( GetHwnd()
+                          ,HWND_BOTTOM
+                          ,vSwp.x
+                          ,vSwp.y
+                          ,vSwp.cx
+                          ,vSwp.cy
+                          ,SWP_HIDE | SWP_ZORDER
+                         );
+    }
+    return TRUE;
+} // end of wxPopupWindow::Show
+
+/* static */
+wxPopupWindow* wxPopupWindow::FindPopupFor(
+  wxWindow*                         pWinParent
+)
+{
+    //
+    // Find a popup with the given parent in the linked list of all shown
+    // popups
+    //
+    for ( wxWindowList::Node *node = m_svShownPopups.GetFirst();
+          node;
+          node = node->GetNext() )
+    {
+        wxWindow*                   pWin = node->GetData();
+
+        if (pWin->GetParent() == pWinParent )
+            return (wxPopupWindow *)pWin;
+    }
+    return NULL;
+} // end of wxPopupWindow::FindPopupFor
+