]>
Commit | Line | Data |
---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | |
2 | // Name: os2/popupwin.cpp | |
3 | // Purpose: implements wxPopupWindow for OS2 | |
4 | // Author: Dave Webster | |
5 | // Modified by: | |
6 | // Created: 13.05.02 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) 2002 Dave Webster <dwebster@bhmi.com> | |
9 | // License: wxWindows license | |
10 | /////////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | // ============================================================================ | |
13 | // declarations | |
14 | // ============================================================================ | |
15 | ||
16 | // ---------------------------------------------------------------------------- | |
17 | // headers | |
18 | // ---------------------------------------------------------------------------- | |
19 | ||
20 | #ifdef __GNUG__ | |
21 | #pragma implementation "popup.h" | |
22 | #endif | |
23 | ||
24 | // For compilers that support precompilation, includes "wx.h". | |
25 | #include "wx/wxprec.h" | |
26 | ||
27 | ||
28 | #ifndef WX_PRECOMP | |
29 | #endif //WX_PRECOMP | |
30 | ||
31 | #include "wx/popupwin.h" | |
32 | ||
33 | wxWindowList wxPopupWindow::m_svShownPopups; | |
34 | ||
35 | // ============================================================================ | |
36 | // implementation | |
37 | // ============================================================================ | |
38 | ||
39 | bool wxPopupWindow::Create( | |
40 | wxWindow* pParent | |
41 | , int nFlags | |
42 | ) | |
43 | { | |
44 | return wxPopupWindowBase::Create(pParent) && | |
45 | wxWindow::Create( pParent | |
46 | ,-1 | |
47 | ,wxDefaultPosition | |
48 | ,wxDefaultSize | |
49 | ,nFlags | wxPOPUP_WINDOW | |
50 | ); | |
51 | } // end of wxPopupWindow::Create | |
52 | ||
53 | void wxPopupWindow::DoGetPosition( | |
54 | int* pnX | |
55 | , int* pnY | |
56 | ) const | |
57 | { | |
58 | // | |
59 | // The position of a "top level" window such as this should be in | |
60 | // screen coordinates, not in the client ones which MSW gives us | |
61 | // (because we are a child window) | |
62 | // | |
63 | wxPopupWindowBase::DoGetPosition(pnX, pnY); | |
64 | GetParent()->ClientToScreen(pnX, pnY); | |
65 | } // end of wxPopupWindow::DoGetPosition | |
66 | ||
67 | WXDWORD wxPopupWindow::OS2GetStyle( | |
68 | long lFlags | |
69 | , WXDWORD* dwExstyle | |
70 | ) const | |
71 | { | |
72 | WXDWORD dwStyle = wxWindow::OS2GetStyle( lFlags & wxBORDER_MASK | |
73 | ,dwExstyle | |
74 | ); | |
75 | ||
76 | return dwStyle; | |
77 | } // end of wxPopupWindow::OS2GetStyle | |
78 | ||
79 | bool wxPopupWindow::Show( | |
80 | bool bShow | |
81 | ) | |
82 | { | |
83 | SWP vSwp; | |
84 | // | |
85 | // Skip wxWindow::Show() which calls wxBringWindowToTop(): this results in | |
86 | // activating the popup window and stealing the atcivation from our parent | |
87 | // which means that the parent frame becomes deactivated when opening a | |
88 | // combobox, for example -- definitely not what we want | |
89 | // | |
90 | if (!wxWindowBase::Show(bShow)) | |
91 | return FALSE; | |
92 | ||
93 | if (bShow) | |
94 | { | |
95 | m_svShownPopups.Append(this); | |
96 | } | |
97 | else // remove from the shown list | |
98 | { | |
99 | m_svShownPopups.DeleteObject(this); | |
100 | } | |
101 | ::WinQueryWindowPos(GetHwnd(), &vSwp); | |
102 | ||
103 | if (bShow) | |
104 | { | |
105 | ::WinSetWindowPos( GetHwnd() | |
106 | ,HWND_TOP | |
107 | ,vSwp.x | |
108 | ,vSwp.y | |
109 | ,vSwp.cx | |
110 | ,vSwp.cy | |
111 | ,SWP_DEACTIVATE | SWP_SHOW | SWP_ZORDER | |
112 | ); | |
113 | } | |
114 | else | |
115 | { | |
116 | ::WinSetWindowPos( GetHwnd() | |
117 | ,HWND_BOTTOM | |
118 | ,vSwp.x | |
119 | ,vSwp.y | |
120 | ,vSwp.cx | |
121 | ,vSwp.cy | |
122 | ,SWP_HIDE | SWP_ZORDER | |
123 | ); | |
124 | } | |
125 | return TRUE; | |
126 | } // end of wxPopupWindow::Show | |
127 | ||
128 | /* static */ | |
129 | wxPopupWindow* wxPopupWindow::FindPopupFor( | |
130 | wxWindow* pWinParent | |
131 | ) | |
132 | { | |
133 | // | |
134 | // Find a popup with the given parent in the linked list of all shown | |
135 | // popups | |
136 | // | |
137 | for ( wxWindowList::Node *node = m_svShownPopups.GetFirst(); | |
138 | node; | |
139 | node = node->GetNext() ) | |
140 | { | |
141 | wxWindow* pWin = node->GetData(); | |
142 | ||
143 | if (pWin->GetParent() == pWinParent ) | |
144 | return (wxPopupWindow *)pWin; | |
145 | } | |
146 | return NULL; | |
147 | } // end of wxPopupWindow::FindPopupFor | |
148 |