m_isBeingDeleted = TRUE;
OS2DetachWindowMenu();
+ for (wxWindow* pWin = GetParent(); pWin; pWin = pWin->GetParent())
+ {
+ wxFrame* pFrame = wxDynamicCast(pWin, wxFrame);
+
+ if (pFrame)
+ {
+ if (pFrame->GetLastFocus() == this)
+ pFrame->SetLastFocus((wxWindow*)NULL);
+ }
+ }
if (m_parent)
m_parent->RemoveChild(this);
DestroyChildren();
}
else
nTempy = pParent->GetSize().y - (vPos.y + rSize.y);
-#if 0
- if (nTempy < 0)
- {
- nTempy = pParent->GetSize().y + (vPos.y + rSize.y);
- pParent->SetSize(0, 0, pParent->GetSize().x, nTempy);
- nTempy = pParent->GetSize().y - (vPos.y + rSize.y);
- }
-#endif
vPos.y = nTempy;
if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
ulCreateFlags |= WS_CLIPCHILDREN;
//
- // Empty stuff for now since PM has no custome 3D effects
- // Doesn't mean someone cannot make some up though
+ //
//
bool bWant3D;
- WXDWORD dwExStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &bWant3D);
+ WXDWORD dwExStyle = Determine3DEffects( WS_EX_CLIENTEDGE
+ ,&bWant3D
+ );
+
+ //
+ // Add the simple border style as we'll use this to draw borders
+ //
+ if (lStyle & wxSIMPLE_BORDER)
+ dwExStyle |= wxSIMPLE_BORDER;
//
// Generic OS/2 Windows are created with no owner, no Z Order, no Control data,
,NULLHANDLE
,NULLHANDLE
,m_windowId
+ ,NULL
+ ,NULL
+ ,dwExStyle
);
return(TRUE);
)
{
//
- // PM does not support extended style
+ // Simply fill out with wxWindow extended styles. We'll conjure
+ // something up in OS2Create and all window redrawing pieces later
//
- WXDWORD exStyle = 0;
- return exStyle;
+ WXDWORD dwStyle = 0;
+
+ if (lStyle & wxTRANSPARENT_WINDOW )
+ dwStyle |= wxTRANSPARENT_WINDOW;
+
+ if (!bEliminateBorders)
+ {
+ if (lStyle & wxSUNKEN_BORDER)
+ dwStyle |= wxSUNKEN_BORDER;
+ if (lStyle & wxDOUBLE_BORDER)
+ dwStyle |= wxDOUBLE_BORDER;
+ if (lStyle & wxRAISED_BORDER )
+ dwStyle |= wxRAISED_BORDER;
+ if (lStyle & wxSTATIC_BORDER)
+ dwStyle |= wxSTATIC_BORDER;
+ }
+ return dwStyle;
} // end of wxWindow::MakeExtendedStyle
//
-// Determines whether native 3D effects or CTL3D should be used,
+// Determines whether simulated 3D effects or CTL3D should be used,
// applying a default border style if required, and returning an extended
-// style to pass to CreateWindowEx.
+// style to pass to OS2Create.
//
WXDWORD wxWindow::Determine3DEffects(
WXDWORD dwDefaultBorderStyle
WXDWORD dwStyle = 0L;
//
- // Native PM does not have any specialize 3D effects like WIN32 does
+ // Native PM does not have any specialize 3D effects like WIN32 does,
+ // so we have to try and invent them.
+ //
+
+ //
+ // If matches certain criteria, then assume no 3D effects
+ // unless specifically requested (dealt with in MakeExtendedStyle)
//
- *pbWant3D = FALSE;
+ if (!GetParent() ||
+ !IsKindOf(CLASSINFO(wxControl)) ||
+ (m_windowStyle & wxNO_BORDER)
+ )
+ {
+ *pbWant3D = FALSE;
+ return MakeExtendedStyle(m_windowStyle, FALSE);
+ }
+
+ //
+ // 1) App can specify global 3D effects
+ //
+ *pbWant3D = wxTheApp->GetAuto3D();
+
+ //
+ // 2) If the parent is being drawn with user colours, or simple border
+ // specified, switch effects off.
+ //
+ if (GetParent() &&
+ (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS) ||
+ (m_windowStyle & wxSIMPLE_BORDER)
+ )
+ *pbWant3D = FALSE;
+
+ //
+ // 3) Control can override this global setting by defining
+ // a border style, e.g. wxSUNKEN_BORDER
+ //
+ if ((m_windowStyle & wxDOUBLE_BORDER) ||
+ (m_windowStyle & wxRAISED_BORDER) ||
+ (m_windowStyle & wxSTATIC_BORDER) ||
+ (m_windowStyle & wxSUNKEN_BORDER)
+ )
+ *pbWant3D = TRUE;
+
+ dwStyle = MakeExtendedStyle( m_windowStyle
+ ,FALSE
+ );
+
+ //
+ // If we want 3D, but haven't specified a border here,
+ // apply the default border style specified.
+ //
+ if (dwDefaultBorderStyle && (*pbWant3D) &&
+ !((m_windowStyle & wxDOUBLE_BORDER) ||
+ (m_windowStyle & wxRAISED_BORDER) ||
+ (m_windowStyle & wxSTATIC_BORDER) ||
+ (m_windowStyle & wxSIMPLE_BORDER)
+ )
+ )
+ dwStyle |= dwDefaultBorderStyle;
return dwStyle;
} // end of wxWindow::Determine3DEffects
, int nHeight
)
{
+ RECTL vRect;
+ HWND hParent;
+ wxWindow* pParent = GetParent();
+
+ if (pParent)
+ hParent = GetWinHwnd(pParent);
+ else
+ hParent = HWND_DESKTOP;
+ ::WinQueryWindowRect(hParent, &vRect);
+ nY = vRect.yTop - (nY + nHeight);
+
if ( !::WinSetWindowPos( GetHwnd()
,HWND_TOP
,(LONG)nX
// popup menu
// ---------------------------------------------------------------------------
+static void wxYieldForCommandsOnly()
+{
+ //
+ // Peek all WM_COMMANDs (it will always return WM_QUIT too but we don't
+ // want to process it here)
+ //
+ QMSG vMsg;
+
+ while (::WinPeekMsg( vHabmain
+ ,&vMsg
+ ,(HWND)0
+ ,WM_COMMAND
+ ,WM_COMMAND
+ ,PM_REMOVE
+ ) && vMsg.msg != WM_QUIT)
+ {
+ wxTheApp->DoMessage((WXMSG*)&vMsg);
+ }
+}
+
bool wxWindow::DoPopupMenu(
wxMenu* pMenu
, int nX
,0L
,PU_MOUSEBUTTON2DOWN | PU_MOUSEBUTTON2 | PU_KEYBOARD
);
- wxYield();
+ // we need to do it righ now as otherwise the events are never going to be
+ // sent to wxCurrentPopupMenu from HandleCommand()
+ //
+ // note that even eliminating (ugly) wxCurrentPopupMenu global wouldn't
+ // help and we'd still need wxYieldForCommandsOnly() as the menu may be
+ // destroyed as soon as we return (it can be a local variable in the caller
+ // for example) and so we do need to process the event immediately
+ wxYieldForCommandsOnly();
wxCurrentPopupMenu = NULL;
pMenu->SetInvokingWindow(NULL);
, unsigned long ulId
, void* pCtlData
, void* pPresParams
+, WXDWORD dwExStyle
)
{
ERRORID vError;
wxLogError("Can't create window of class %s!. Error: %s\n", zClass, sError);
return FALSE;
}
+ m_dwExStyle = dwExStyle;
::WinSetWindowULong(m_hWnd, QWL_USER, (ULONG) this);
wxWndHook = NULL;
);
::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel());
+
+ if (m_dwExStyle)
+ {
+ LINEBUNDLE vLineBundle;
+
+ vLineBundle.lColor = 0x00000000; // Black
+ vLineBundle.usMixMode = FM_OVERPAINT;
+ vLineBundle.fxWidth = 1;
+ vLineBundle.lGeomWidth = 1;
+ vLineBundle.usType = LINETYPE_SOLID;
+ vLineBundle.usEnd = 0;
+ vLineBundle.usJoin = 0;
+ ::GpiSetAttrs( hPS
+ ,PRIM_LINE
+ ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE
+ ,0L
+ ,&vLineBundle
+ );
+ ::WinQueryWindowRect(GetHwnd(), &vRect);
+ wxDrawBorder( hPS
+ ,vRect
+ ,m_dwExStyle
+ );
+ }
::WinEndPaint(hPS);
}
}