);
wxWindow* wxFindWinFromHandle(WXHWND hWnd);
-//
-// This magical function is used to translate VK_APPS key presses to right
-// mouse clicks
-//
-// Unused?
-#if 0
-static void TranslateKbdEventToMouse( wxWindow* pWin
- ,int* pX
- ,int* pY
- ,MPARAM* pFlags
- );
-#endif
//
// get the current state of SHIFT/CTRL keys
//
m_bDoubleClickAllowed = 0;
m_bWinCaptured = FALSE;
- m_isBeingDeleted = FALSE;
- m_fnOldWndProc = 0;
- m_bUseCtl3D = FALSE;
- m_bMouseInWindow = FALSE;
+ m_isBeingDeleted = FALSE;
+ m_fnOldWndProc = 0;
+ m_bUseCtl3D = FALSE;
+ m_bMouseInWindow = FALSE;
+ m_bLastKeydownProcessed = FALSE;
//
// wxWnd
wxCHECK_MSG(pParent, FALSE, wxT("can't create wxWindow without parent"));
+#if wxUSE_STATBOX
+ //
+ // wxGTK doesn't allow to create controls with static box as the parent so
+ // this will result in a crash when the program is ported to wxGTK - warn
+ // about it
+ //
+ // the correct solution is to create the controls as siblings of the
+ // static box
+ //
+ wxASSERT_MSG( !wxDynamicCast(pParent, wxStaticBox),
+ _T("wxStaticBox can't be used as a window parent!") );
+#endif // wxUSE_STATBOX
+
if ( !CreateBase( pParent
,vId
,rPos
// set in those class create procs. PM's basic windows styles are
// very limited.
//
- ulCreateFlags |= WS_VISIBLE;
+ ulCreateFlags |= WS_VISIBLE | OS2GetCreateWindowFlags(&dwExStyle);
#ifdef __WXUNIVERSAL__
// no 3d effects, we draw them ourselves
WXDWORD exStyle = 0;
-#else // !wxUniversal
- if (lStyle & wxCLIP_SIBLINGS)
- ulCreateFlags |= WS_CLIPSIBLINGS;
-
- if (lStyle & wxCLIP_CHILDREN )
- ulCreateFlags |= WS_CLIPCHILDREN;
-
- //
- //
- //
- bool bWant3D;
- dwExStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &bWant3D);
-
-#endif
-
- //
- // Add the simple border style as we'll use this to draw borders
- //
- if (lStyle & wxSIMPLE_BORDER)
- dwExStyle |= wxSIMPLE_BORDER;
-
+#endif // !wxUniversal
if (lStyle & wxPOPUP_WINDOW)
{
// a popup window floats on top of everything
-//TODO: fix this...
-// exStyle |= WS_EX_TOPMOST | WS_EX_TOOLWINDOW;
-
// it is also created hidden as other top level windows
ulCreateFlags &= ~WS_VISIBLE;
m_isShown = FALSE;
// owner in terms of the parent frame.
// The horz bar is the same width as the owner and 20 pels high.
//
- ::WinSetWindowPos( m_hWndScrollBarHorz
- ,HWND_TOP
- ,vSwp.x + vSwpOwner.x
- ,(vSwp.y + vSwpOwner.y) - 20
- ,vSwpOwner.cx
- ,20
- ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
- );
- ::WinSendMsg( m_hWndScrollBarHorz
- ,SBM_SETSCROLLBAR
- ,(MPARAM)nPos
- ,MPFROM2SHORT(0, (SHORT)nRange1)
- );
- ::WinSendMsg( m_hWndScrollBarHorz
- ,SBM_SETTHUMBSIZE
- ,MPFROM2SHORT( (SHORT)nThumbVisible
- ,(SHORT)nRange1
- )
- ,(MPARAM)0
- );
+ if (nRange1 >= nThumbVisible)
+ {
+ ::WinSetWindowPos( m_hWndScrollBarHorz
+ ,HWND_TOP
+ ,vSwp.x + vSwpOwner.x
+ ,(vSwp.y + vSwpOwner.y) - 20
+ ,vSwpOwner.cx
+ ,20
+ ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
+ );
+ ::WinSendMsg( m_hWndScrollBarHorz
+ ,SBM_SETSCROLLBAR
+ ,(MPARAM)nPos
+ ,MPFROM2SHORT(0, (SHORT)nRange1)
+ );
+ ::WinSendMsg( m_hWndScrollBarHorz
+ ,SBM_SETTHUMBSIZE
+ ,MPFROM2SHORT( (SHORT)nThumbVisible
+ ,(SHORT)nRange1
+ )
+ ,(MPARAM)0
+ );
+ }
+ else
+ ::WinShowWindow(m_hWndScrollBarHorz, FALSE);
}
}
else
// owner window).
// It is 20 pels wide and the same height as the owner.
//
- ::WinSetWindowPos( m_hWndScrollBarVert
- ,HWND_TOP
- ,vSwp.x + vSwpOwner.x + vSwpOwner.cx
- ,vSwp.y + vSwpOwner.y
- ,20
- ,vSwpOwner.cy
- ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
- );
- ::WinSendMsg( m_hWndScrollBarVert
- ,SBM_SETSCROLLBAR
- ,(MPARAM)nPos
- ,MPFROM2SHORT(0, (SHORT)nRange1)
- );
- ::WinSendMsg( m_hWndScrollBarVert
- ,SBM_SETTHUMBSIZE
- ,MPFROM2SHORT( (SHORT)nThumbVisible
- ,(SHORT)nRange1
- )
- ,(MPARAM)0
- );
+ if (nRange1 >= nThumbVisible)
+ {
+ ::WinSetWindowPos( m_hWndScrollBarVert
+ ,HWND_TOP
+ ,vSwp.x + vSwpOwner.x + vSwpOwner.cx
+ ,vSwp.y + vSwpOwner.y
+ ,20
+ ,vSwpOwner.cy
+ ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
+ );
+ ::WinSendMsg( m_hWndScrollBarVert
+ ,SBM_SETSCROLLBAR
+ ,(MPARAM)nPos
+ ,MPFROM2SHORT(0, (SHORT)nRange1)
+ );
+ ::WinSendMsg( m_hWndScrollBarVert
+ ,SBM_SETTHUMBSIZE
+ ,MPFROM2SHORT( (SHORT)nThumbVisible
+ ,(SHORT)nRange1
+ )
+ ,(MPARAM)0
+ );
+ }
+ else
+ ::WinShowWindow(m_hWndScrollBarVert, FALSE);
}
m_nYThumbSize = nThumbVisible;
}
return(fnWndProc == (WXFARPROC)vCls.pfnWindowProc);
} // end of WinGuiBase_CheckWindowWndProc
+void wxWindowOS2::SetWindowStyleFlag(
+ long lFlags
+)
+{
+ long lFlagsOld = GetWindowStyleFlag();
+
+ if (lFlags == lFlagsOld)
+ return;
+
+ //
+ // Update the internal variable
+ //
+ wxWindowBase::SetWindowStyleFlag(lFlags);
+
+ //
+ // Now update the Windows style as well if needed - and if the window had
+ // been already created
+ //
+ if (!GetHwnd())
+ return;
+
+ WXDWORD dwExstyle;
+ WXDWORD dwExstyleOld;
+ long lStyle = OS2GetStyle( lFlags
+ ,&dwExstyle
+ );
+ long lStyleOld = OS2GetStyle( lFlagsOld
+ ,&dwExstyleOld
+ );
+
+ if (lStyle != lStyleOld)
+ {
+ //
+ // Some flags (e.g. WS_VISIBLE or WS_DISABLED) should not be changed by
+ // this function so instead of simply setting the style to the new
+ // value we clear the bits which were set in styleOld but are set in
+ // the new one and set the ones which were not set before
+ //
+ long lStyleReal = ::WinQueryWindowULong(GetHwnd(), QWL_STYLE);
+
+ lStyleReal &= ~lStyleOld;
+ lStyleReal |= lStyle;
+
+ ::WinSetWindowULong(GetHwnd(), QWL_STYLE, lStyleReal);
+ }
+} // end of wxWindowOS2::SetWindowStyleFlag
+
+WXDWORD wxWindowOS2::OS2GetStyle(
+ long lFlags
+, WXDWORD* pdwExstyle
+) const
+{
+ WXDWORD dwStyle = 0L;
+
+ if (lFlags & wxCLIP_CHILDREN )
+ dwStyle |= WS_CLIPCHILDREN;
+
+ if (lFlags & wxCLIP_SIBLINGS )
+ dwStyle |= WS_CLIPSIBLINGS;
+
+ return dwStyle;
+} // end of wxWindowMSW::MSWGetStyle
+
//
// Make a Windows extended style from the given wxWindows window style
//
int nAdjustHeight = 0;
SWP vSwpScroll;
- if (GetScrollBarHorz() != NULLHANDLE)
+ if (GetScrollBarHorz() == NULLHANDLE ||
+ !WinIsWindowShowing(GetScrollBarHorz()))
+ nAdjustHeight = 0L;
+ else
nAdjustHeight = 20L;
- if (GetScrollBarVert() != NULLHANDLE)
+ if (GetScrollBarVert() == NULLHANDLE ||
+ !WinIsWindowShowing(GetScrollBarVert()))
+ nAdjustWidth = 0L;
+ else
nAdjustWidth = 20L;
::WinQueryWindowPos(GetHWND(), &vSwpScroll);
::WinSetWindowPos( GetHWND()
,vSwpScroll.cy - nAdjustHeight
,SWP_MOVE | SWP_SIZE
);
- nYDiff += 20;
+ nYDiff += nAdjustHeight;
}
MoveChildren(nYDiff);
::WinQueryWindowPos(GetHwnd(), &m_vWinSwp);
}
else // keydown event
{
+ m_bLastKeydownProcessed = FALSE;
//
// If this has been processed by an event handler,
// return 0 now (we've handled it). DON't RETURN
// we still need to process further
//
HandleKeyDown((WXDWORD)wParam, lParam);
+ m_bLastKeydownProcessed = TRUE;
if (uKeyFlags & KC_VIRTUALKEY)
{
USHORT uVk = SHORT2FROMMP((MPARAM)lParam);
vEvent.SetEventObject(this);
bProcessed = GetEventHandler()->ProcessEvent(vEvent);
- return GetEventHandler()->ProcessEvent(vEvent); //bProcessed;
+ if (!bProcessed &&
+ IsKindOf(CLASSINFO(wxPanel)) &&
+ GetChildren().GetCount() == 0
+ )
+ {
+ //
+ // OS/2 needs to process this right here, not by the default proc
+ // Window's default proc correctly paints everything, OS/2 does not!
+ //
+ HPS hPS;
+ RECTL vRect;
+ wxFrame* pFrame;
+ wxWindow* pParent;
+
+ hPS = ::WinBeginPaint( GetHwnd()
+ ,NULLHANDLE
+ ,&vRect
+ );
+ if(hPS)
+ {
+ ::GpiCreateLogColorTable( hPS
+ ,0L
+ ,LCOLF_CONSECRGB
+ ,0L
+ ,(LONG)wxTheColourDatabase->m_nSize
+ ,(PLONG)wxTheColourDatabase->m_palTable
+ );
+ ::GpiCreateLogColorTable( hPS
+ ,0L
+ ,LCOLF_RGB
+ ,0L
+ ,0L
+ ,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);
+ }
+ bProcessed = TRUE;
+ }
+
+ return bProcessed;
} // end of wxWindowOS2::HandlePaint
bool wxWindowOS2::HandleEraseBkgnd(
bool bCtrlDown = FALSE;
int vId;
+ if (m_bLastKeydownProcessed)
+ {
+ //
+ // The key was handled in the EVT_KEY_DOWN. Handling a key in an
+ // EVT_KEY_DOWN handler is meant, by design, to prevent EVT_CHARs
+ // from happening, so just bail out at this point.
+ //
+ m_bLastKeydownProcessed = FALSE;
+ return TRUE;
+ }
if (isASCII)
{
//