-/////////////////////////////////////////////////////////////////////////////
// Name: windows.cpp
// Purpose: wxWindow
// Author: David Webster
# define CW_USEDEFAULT ((int)0x80000000)
#endif
+#ifndef VK_OEM_1
+ #define VK_OEM_1 0xBA
+ #define VK_OEM_PLUS 0xBB
+ #define VK_OEM_COMMA 0xBC
+ #define VK_OEM_MINUS 0xBD
+ #define VK_OEM_PERIOD 0xBE
+ #define VK_OEM_2 0xBF
+ #define VK_OEM_3 0xC0
+ #define VK_OEM_4 0xDB
+ #define VK_OEM_5 0xDC
+ #define VK_OEM_6 0xDD
+ #define VK_OEM_7 0xDE
+#endif
+
// ---------------------------------------------------------------------------
// global variables
// ---------------------------------------------------------------------------
);
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
m_hWndScrollBarHorz = 0L;
m_hWndScrollBarVert = 0L;
+ memset(&m_vWinSwp, '\0', sizeof (SWP));
+
//
// Pass WM_GETDLGCODE to DefWindowProc()
+ //
m_lDlgCode = 0;
m_nXThumbSize = 0;
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;
, bool WXUNUSED(bRefresh)
)
{
+ HWND hWnd = GetHwnd();
int nOldRange = nRange - nThumbVisible;
int nRange1 = nOldRange;
int nPageSize = nThumbVisible;
+
SBCDATA vInfo;
- HWND hWnd = GetHwnd();
- ULONG ulStyle = WS_VISIBLE;
+ ULONG ulStyle = WS_VISIBLE | WS_SYNCPAINT;
+ SWP vSwp;
+ SWP vSwpOwner;
RECTL vRect;
+ HWND hWndParent;
+ HWND hWndClient;
+ wxWindow* pParent = GetParent();
+
+ if (pParent && pParent->IsKindOf(CLASSINFO(wxFrame)))
+ {
+ wxFrame* pFrame;
+
+ pFrame = wxDynamicCast(pParent, wxFrame);
+ hWndParent = pFrame->GetFrame();
+ hWndClient = GetHwndOf(pParent);
+ }
+ else
+ {
+ if (pParent)
+ hWndParent = GetHwndOf(pParent);
+ else
+ hWndParent = GetHwnd();
+ hWndClient = hWndParent;
+ }
+ ::WinQueryWindowPos(hWndClient, &vSwp);
+ ::WinQueryWindowPos(hWnd, &vSwpOwner);
- ::WinQueryWindowRect(hWnd, &vRect);
if (nPageSize > 1 && nRange > 0)
{
nRange1 += (nPageSize - 1);
if (m_hWndScrollBarHorz == 0L)
{
//
- // We create the scrollbars with the desktop so that they are not
- // registered as child windows of the window in order that child
- // windows may be scrolled without scrolling the scrollbars themselves!
+ // Since the scrollbars are usually created before the owner is
+ // sized either via an OnSize event directly or via sizers or
+ // layout constraints, we will initially just use the coords of
+ // the parent window (this is usually a frame client window). But
+ // the bars themselves, are children of the parent frame (i.e
+ // siblings of the frame client. The owner, however is the actual
+ // window being scrolled (or at least the one responsible for
+ // handling the scroll events). The owner will be resized later,
+ // as it is usually a child of a top level window, and when that
+ // is done its scrollbars will be resized and repositioned as well.
//
- m_hWndScrollBarHorz = ::WinCreateWindow( hWnd
+ m_hWndScrollBarHorz = ::WinCreateWindow( hWndParent
,WC_SCROLLBAR
,(PSZ)NULL
,ulStyle
- ,vRect.xLeft
- ,vRect.yBottom
- ,vRect.xRight - vRect.xLeft
+ ,vSwp.x
+ ,vSwp.y
+ ,vSwp.cx - 20
,20
,hWnd
,HWND_TOP
}
else
{
- RECTL vRect2;
-
//
- // Only want to resize the scrollbar if it changes, otherwise
- // we'd probably end up in a recursive loop until we crash the call stack
- // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
- // generates those events.
+ // The owner (the scrolled window) is a child of the Frame's
+ // client window, usually. The scrollbars are children of the
+ // frame, itself, and thus are positioned relative to the frame's
+ // origin, not the frame's client window origin.
+ // The starting x position is the same as the starting x position
+ // of the owner, but in terms of the parent frame.
+ // The starting y position is 20 pels below the origin of the
+ // owner in terms of the parent frame.
+ // The horz bar is the same width as the owner and 20 pels high.
//
- ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect2);
- if (!(vRect2.xLeft == vRect.xLeft &&
- vRect2.xRight == vRect.xRight &&
- vRect2.yBottom == vRect.yBottom &&
- vRect2.yTop == vRect.yTop
- ) )
+ if (nRange1 >= nThumbVisible)
{
::WinSetWindowPos( m_hWndScrollBarHorz
,HWND_TOP
- ,vRect.xLeft
- ,vRect.yBottom
- ,vRect.xRight - vRect.xLeft
+ ,vSwp.x + vSwpOwner.x
+ ,(vSwp.y + vSwpOwner.y) - 20
+ ,vSwpOwner.cx
,20
- ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
+ ,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
+ );
}
- ::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
ulStyle |= SBS_VERT;
if (m_hWndScrollBarVert == 0L)
{
- m_hWndScrollBarVert = ::WinCreateWindow( hWnd
+ //
+ // Since the scrollbars are usually created before the owner is
+ // sized either via an OnSize event directly or via sizers or
+ // layout constraints, we will initially just use the coords of
+ // the parent window (this is usually a frame client window). But
+ // the bars themselves, are children of the parent frame (i.e
+ // siblings of the frame client. The owner, however is the actual
+ // window being scrolled (or at least the one responsible for
+ // handling the scroll events). The owner will be resized later,
+ // as it is usually a child of a top level window, and when that
+ // is done its scrollbars will be resized and repositioned as well.
+ //
+ m_hWndScrollBarVert = ::WinCreateWindow( hWndParent
,WC_SCROLLBAR
,(PSZ)NULL
,ulStyle
- ,vRect.xRight - 20
- ,vRect.yBottom + 20
+ ,vSwp.x + vSwp.cx - 20
+ ,vSwp.y + 20
,20
- ,vRect.yTop - (vRect.yBottom + 20)
+ ,vSwp.cy - 20
,hWnd
,HWND_TOP
,60001
}
else
{
- RECTL vRect2;
-
//
- // Only want to resize the scrollbar if it changes, otherwise
- // we'd probably end up in a recursive loop until we crash the call stack
- // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
- // generates those events.
+ // The owner (the scrolled window) is a child of the Frame's
+ // client window, usually. The scrollbars are children of the
+ // frame, itself and thus are positioned relative to the frame's
+ // origin, not the frame's client window's origin.
+ // Thus, the x position will be frame client's x (usually a few
+ // pels inside the parent frame, plus the width of the owner.
+ // Since we may be using sizers or layout constraints for multiple
+ // child scrolled windows, the y position will be the frame client's
+ // y pos plus the scrolled windows y position, yielding the y
+ // position of the scrollbar relative to the parent frame (the vert
+ // scrollbar is on the right and starts at the bottom of the
+ // owner window).
+ // It is 20 pels wide and the same height as the owner.
//
- ::WinQueryWindowRect(m_hWndScrollBarVert, &vRect2);
- if (!(vRect2.xLeft == vRect.xLeft &&
- vRect2.xRight == vRect.xRight &&
- vRect2.yBottom == vRect.yBottom &&
- vRect2.yTop == vRect.yTop
- ) )
+ if (nRange1 >= nThumbVisible)
{
::WinSetWindowPos( m_hWndScrollBarVert
,HWND_TOP
- ,vRect.xRight - 20
- ,vRect.yBottom + 20
+ ,vSwp.x + vSwpOwner.x + vSwpOwner.cx
+ ,vSwp.y + vSwpOwner.y
,20
- ,vRect.yTop - (vRect.yBottom + 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
+ );
}
- ::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;
}
, const wxRect* pRect
)
{
- nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows.
RECTL vRect;
- RECTL vRect2;
RECTL vRectHorz;
RECTL vRectVert;
RECTL vRectChild;
if (pRect)
{
- vRect2.xLeft = pRect->x;
- vRect2.yTop = pRect->y + pRect->height;
- vRect2.xRight = pRect->x + pRect->width;
- vRect2.yBottom = pRect->y;
+ vRect.xLeft = pRect->x;
+ vRect.yTop = pRect->y + pRect->height;
+ vRect.xRight = pRect->x + pRect->width;
+ vRect.yBottom = pRect->y;
}
else
{
::WinQueryWindowRect(GetHwnd(), &vRect);
- ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRectHorz);
- vRect2.yBottom += vRect.yTop - vRect.yBottom;
- ::WinQueryWindowRect(m_hWndScrollBarVert, &vRectVert);
- vRect2.xRight -= vRect.xRight - vRect.xLeft;
-
}
+ nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows.
::WinScrollWindow( GetHwnd()
,(LONG)nDx
,(LONG)nDy
,&vRect
- ,NULL
+ ,&vRect
,NULLHANDLE
,NULL
- ,SW_INVALIDATERGN
+ ,SW_SCROLLCHILDREN | SW_INVALIDATERGN
);
- ::WinInvalidateRect(m_hWndScrollBarHorz, &vRectHorz, FALSE);
- ::WinInvalidateRect(m_hWndScrollBarVert, &vRectVert, FALSE);
-
- //
- // Move the children
- //
- wxWindowList::Node* pCurrent = GetChildren().GetFirst();
- SWP vSwp;
-
- while (pCurrent)
- {
- wxWindow* pChildWin = pCurrent->GetData();
-
- if (pChildWin->GetHWND() != NULLHANDLE)
- {
- ::WinQueryWindowPos(pChildWin->GetHWND(), &vSwp);
- ::WinQueryWindowRect(pChildWin->GetHWND(), &vRectChild);
- if (pChildWin->IsKindOf(CLASSINFO(wxControl)))
- {
- wxControl* pCtrl;
-
- //
- // Must deal with controls that have margins like ENTRYFIELD. The SWP
- // struct of such a control will have and origin offset from its intended
- // position by the width of the margins.
- //
- pCtrl = wxDynamicCast(pChildWin, wxControl);
- vSwp.y -= pCtrl->GetYComp();
- vSwp.x -= pCtrl->GetXComp();
- }
- ::WinSetWindowPos( pChildWin->GetHWND()
- ,HWND_BOTTOM
- ,vSwp.x + nDx
- ,vSwp.y + nDy
- ,0
- ,0
- ,SWP_MOVE | SWP_ZORDER
- );
- if (pChildWin->IsKindOf(CLASSINFO(wxRadioBox)))
- {
- wxRadioBox* pRadioBox;
-
- pRadioBox = wxDynamicCast(pChildWin, wxRadioBox);
- pRadioBox->AdjustButtons( (int)vSwp.x + nDx
- ,(int)vSwp.y + nDy
- ,(int)vSwp.cx
- ,(int)vSwp.cy
- ,pRadioBox->GetSizeFlags()
- );
- }
- if (pChildWin->IsKindOf(CLASSINFO(wxSlider)))
- {
- wxSlider* pSlider;
-
- pSlider = wxDynamicCast(pChildWin, wxSlider);
- pSlider->AdjustSubControls( (int)vSwp.x + nDx
- ,(int)vSwp.y + nDy
- ,(int)vSwp.cx
- ,(int)vSwp.cy
- ,pSlider->GetSizeFlags()
- );
- }
- ::WinInvalidateRect(pChildWin->GetHWND(), &vRectChild, FALSE);
- }
- pCurrent = pCurrent->GetNext();
- }
+ Refresh();
} // end of wxWindowOS2::ScrollWindow
// ---------------------------------------------------------------------------
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
//
}
else
::WinInvalidateRect(hWnd, NULL, bEraseBack);
+ if (m_hWndScrollBarHorz != NULLHANDLE)
+ ::WinInvalidateRect(m_hWndScrollBarHorz, NULL, TRUE);
+ if (m_hWndScrollBarVert != NULLHANDLE)
+ ::WinInvalidateRect(m_hWndScrollBarVert, NULL, TRUE);
}
} // end of wxWindowOS2::Refresh
,(LONG)nHeight
,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
);
+ if (m_vWinSwp.cx == 0 && m_vWinSwp.cy == 0 && m_vWinSwp.fl == 0)
+ //
+ // Uninitialized
+ //
+ ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp);
+ else
+ {
+ int nYDiff = m_vWinSwp.cy - nHeight;
+
+ //
+ // Handle resizing of scrolled windows. The target or window to
+ // be scrolled is the owner (gets the scroll notificaitons). The
+ // parent is usually the parent frame of the scrolled panel window.
+ // In order to show the scrollbars the target window will be shrunk
+ // by the size of the scroll bar widths (20) and moved in the X and Y
+ // directon. That value will be computed as part of the diff for
+ // moving the children. Everytime the window is sized the
+ // toplevel OnSize is going to resize the panel to fit the client
+ // or the whole sizer and will need to me resized. This will send
+ // a WM_SIZE out which will be intercepted by the ScrollHelper
+ // which will cause the scrollbars to be displayed via the SetScrollbar
+ // call in CWindow.
+ //
+ if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
+ IsKindOf(CLASSINFO(wxScrolledWindow))
+ )
+ {
+ int nAdjustWidth = 0;
+ int nAdjustHeight = 0;
+ SWP vSwpScroll;
+
+ if (GetScrollBarHorz() == NULLHANDLE ||
+ !WinIsWindowShowing(GetScrollBarHorz()))
+ nAdjustHeight = 0L;
+ else
+ nAdjustHeight = 20L;
+ if (GetScrollBarVert() == NULLHANDLE ||
+ !WinIsWindowShowing(GetScrollBarVert()))
+ nAdjustWidth = 0L;
+ else
+ nAdjustWidth = 20L;
+ ::WinQueryWindowPos(GetHWND(), &vSwpScroll);
+ ::WinSetWindowPos( GetHWND()
+ ,HWND_TOP
+ ,vSwpScroll.x
+ ,vSwpScroll.y + nAdjustHeight
+ ,vSwpScroll.cx - nAdjustWidth
+ ,vSwpScroll.cy - nAdjustHeight
+ ,SWP_MOVE | SWP_SIZE
+ );
+ nYDiff += nAdjustHeight;
+ }
+ MoveChildren(nYDiff);
+ ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp);
+ }
} // end of wxWindowOS2::DoMoveWindow
//
else
{
if (pWnd)
+ {
rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam);
+ if ( (pWnd->GetScrollBarHorz() != NULLHANDLE ||
+ pWnd->GetScrollBarVert() != NULLHANDLE) &&
+ ulMsg == WM_PAINT)
+ {
+ if (pWnd->GetScrollBarHorz() != NULLHANDLE)
+ ::WinInvalidateRect(pWnd->GetScrollBarHorz(), NULL, TRUE);
+ if (pWnd->GetScrollBarVert() != NULLHANDLE)
+ ::WinInvalidateRect(pWnd->GetScrollBarVert(), NULL, TRUE);
+ }
+ }
else
rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam);
}
if (uKeyFlags & KC_KEYUP)
{
//TODO: check if the cast to WXWORD isn't causing trouble
- bProcessed = HandleKeyUp((WXDWORD)wParam, lParam);
+ bProcessed = HandleKeyUp(wParam, lParam);
break;
}
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 = HandleKeyDown(wParam, lParam);
if (uKeyFlags & KC_VIRTUALKEY)
{
USHORT uVk = SHORT2FROMMP((MPARAM)lParam);
//
// We consider these message "not interesting" to OnChar
//
- if (uVk == VK_SHIFT || uVk == VK_CTRL )
- {
- bProcessed = TRUE;
- break;
- }
switch(uVk)
{
- //
+ case VK_SHIFT:
+ case VK_CTRL:
+ case VK_MENU:
+ case VK_CAPSLOCK:
+ case VK_NUMLOCK:
+ case VK_SCRLLOCK:
+ bProcessed = TRUE;
+ break;
+
// Avoid duplicate messages to OnChar for these ASCII keys: they
// will be translated by TranslateMessage() and received in WM_CHAR
case VK_ESC:
bProcessed = FALSE;
break;
- case VK_LEFT:
- case VK_RIGHT:
- case VK_DOWN:
- case VK_UP:
default:
- bProcessed = HandleChar((WXDWORD)wParam, lParam);
+ if (m_bLastKeydownProcessed)
+ {
+ //
+ // The key was handled in the EVT_KEY_DOWN and handling
+ // a key in an EVT_KEY_DOWN handler is meant, by
+ // design, to prevent EVT_CHARs from happening
+ //
+ m_bLastKeydownProcessed = FALSE;
+ bProcessed = TRUE;
+ }
+ else // do generate a CHAR event
+ {
+ bProcessed = HandleChar((WXDWORD)wParam, lParam);
+ }
}
break;
}
else // WM_CHAR -- Always an ASCII character
{
- bProcessed = HandleChar((WXDWORD)wParam, lParam, TRUE);
- break;
+ if (m_bLastKeydownProcessed)
+ {
+ //
+ // The key was handled in the EVT_KEY_DOWN and handling
+ // a key in an EVT_KEY_DOWN handler is meant, by
+ // design, to prevent EVT_CHARs from happening
+ //
+ m_bLastKeydownProcessed = FALSE;
+ bProcessed = TRUE;
+ }
+ else // do generate a CHAR event
+ {
+ bProcessed = HandleChar((WXDWORD)wParam, lParam, TRUE);
+ break;
+ }
}
}
}
{
sClassName += wxT("NR");
}
-
- //
- // If the window being created is a Frame's Statusbar we need to use
- // the actual Frame's size, not its client
- //
- if (pParent)
- {
- if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
- pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
- )
- {
- if (IsKindOf(CLASSINFO(wxStatusBar)) &&
- pParent->IsKindOf(CLASSINFO(wxFrame)))
- {
- RECTL vRect;
- wxFrame* pFrame = wxDynamicCast(pParent, wxFrame);
-
- ::WinQueryWindowRect((HWND)pFrame->GetFrame(), &vRect);
- nY = vRect.yTop - (nY + nHeight);
- }
- else
- nY = pParent->GetSize().y - (nY + nHeight);
- }
- }
- else
- {
- RECTL vRect;
-
- ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
- nY = vRect.yTop - (nY + nHeight);
- }
m_hWnd = (WXHWND)::WinCreateWindow( (HWND)hParent
,(PSZ)sClassName.c_str()
,(PSZ)zTitle ? zTitle : ""
}
SubclassWin(m_hWnd);
SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+
+ m_backgroundColour.Set(wxString("GREY"));
+
+ LONG lColor = (LONG)m_backgroundColour.GetPixel();
+
+ if (!::WinSetPresParam( m_hWnd
+ ,PP_BACKGROUNDCOLOR
+ ,sizeof(LONG)
+ ,(PVOID)&lColor
+ ))
+ {
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ wxLogError("Error creating frame. Error: %s\n", sError);
+ return FALSE;
+ }
SetSize( nX
,nY
,nWidth
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(
wxEventType eType
, int nId
, WXLPARAM lParam
+, WXWPARAM wParam
) const
{
wxKeyEvent vEvent(eType);
vEvent.m_eventObject = (wxWindow *)this; // const_cast
vEvent.m_keyCode = nId;
+ vEvent.m_rawCode = (wxUint32)wParam;
+ vEvent.m_rawFlags = (wxUint32)lParam;
vEvent.SetTimestamp(s_currentMsg.time);
//
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)
{
//
default:
bCtrlDown = TRUE;
- vId = vId + 96;
+ vId = vId + 'a' - 1;
}
}
}
- else if ( (vId = wxCharCodeOS2ToWX(wParam)) == 0)
+ else // we're called from WM_KEYDOWN
{
- //
- // It's ASCII and will be processed here only when called from
- // WM_CHAR (i.e. when isASCII = TRUE), don't process it now
- //
- vId = -1;
+ vId = wxCharCodeOS2ToWX(wParam);
+ if (vId == 0)
+ return FALSE;
}
- if (vId != -1)
- {
- wxKeyEvent vEvent(CreateKeyEvent( wxEVT_CHAR
+ wxKeyEvent vEvent(CreateKeyEvent( wxEVT_CHAR
,vId
,lParam
));
- if (bCtrlDown)
- {
- vEvent.m_controlDown = TRUE;
- }
-
- if (GetEventHandler()->ProcessEvent(vEvent))
- return TRUE;
+ if (bCtrlDown)
+ {
+ vEvent.m_controlDown = TRUE;
}
- return FALSE;
+ return (GetEventHandler()->ProcessEvent(vEvent));
}
bool wxWindowOS2::HandleKeyDown(
- WXWORD wParam
+ WXWPARAM wParam
, WXLPARAM lParam
)
{
- int nId = wxCharCodeOS2ToWX(wParam);
+ int nId = wxCharCodeOS2ToWX((int)wParam);
if (!nId)
{
//
// Normal ASCII char
//
- nId = wParam;
+ nId = (int)wParam;
}
if (nId != -1)
{
wxKeyEvent vEvent(CreateKeyEvent( wxEVT_KEY_DOWN
,nId
- ,lParam
+ ,(MPARAM)lParam
+ ,(MPARAM)wParam
));
if (GetEventHandler()->ProcessEvent(vEvent))
} // end of wxWindowOS2::HandleKeyDown
bool wxWindowOS2::HandleKeyUp(
- WXDWORD wParam
+ WXWPARAM wParam
, WXLPARAM lParam
)
{
- int nId = wxCharCodeOS2ToWX(wParam);
+ int nId = wxCharCodeOS2ToWX((int)wParam);
if (!nId)
{
//
// Normal ASCII char
//
- nId = wParam;
+ nId = (int)wParam;
}
if (nId != -1)
wxKeyEvent vEvent(CreateKeyEvent( wxEVT_KEY_UP
,nId
,lParam
+ ,wParam
));
if (GetEventHandler()->ProcessEvent(vEvent))
,vSwp.y - nDiff
,vSwp.cx
,vSwp.cy
- ,SWP_MOVE
+ ,SWP_MOVE | SWP_SHOW | SWP_ZORDER
);
+ ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp());
if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
{
wxRadioBox* pRadioBox;
);
}
}
+ Refresh();
} // end of wxWindowOS2::MoveChildren
//
//
// 3) The controls are children of a panel, which in turn is a child of
// a frame.
+// The panel may be one of many, in which case the same treatment
+// as 1 applies. It may be the only child, though.
// This is the nastiest case. A panel is created as the only child of
// the frame and as such, when a frame has only one child, the child is
// expanded to fit the entire client area of the frame. Because the
else
return(pParent->GetClientSize().y);
}
-
//
- // Case 3 -- this is for any window that is the sole child of a Frame.
- // The grandparent must exist and it must be of type CFrame
- // and it's height must be different. Otherwise the standard
- // applies.
+ // Case -- this is for any window that is the sole child of a Frame.
+ // The grandparent must exist and it must be of type CFrame
+ // and it's height must be different. Otherwise the standard
+ // applies.
//
else
{
- pGrandParent = pParent->GetParent();
- if (pGrandParent &&
- pGrandParent->IsKindOf(CLASSINFO(wxFrame)) &&
- pGrandParent->GetClientSize().y != pParent->GetSize().y
- )
- {
- int nParentHeight = 0L;
- int nStatusBarHeight = 0L;
- wxFrame* pFrame = wxDynamicCast(pGrandParent, wxFrame);
- wxStatusBar* pStatbar = pFrame->GetStatusBar();
-
- nParentHeight = pGrandParent->GetClientSize().y;
- if (pStatbar)
- nStatusBarHeight = pStatbar->GetSize().y;
- nParentHeight -= nStatusBarHeight;
- return(nParentHeight);
- }
- else
- //
- // Panel is a child of some other kind of window so we'll
- // just use it's original size
- //
- return(pParent->GetClientSize().y);
+ return(pParent->GetClientSize().y);
}
return(0L);
} // end of wxWindowOS2::GetOS2ParentHeight
+//
+// OS/2 needs a lot extra manipulation to deal with layouts
+// for canvas windows, particularly scrolled ones.
+//
wxWindowCreationHook::wxWindowCreationHook(
wxWindow* pWinBeingCreated
)
case VK_PRINTSCRN: nId = WXK_PRINT; break;
case VK_INSERT: nId = WXK_INSERT; break;
case VK_DELETE: nId = WXK_DELETE; break;
+ case VK_CAPSLOCK: nId = WXK_CAPITAL; break;
case VK_F1: nId = WXK_F1; break;
case VK_F2: nId = WXK_F2; break;
case VK_F3: nId = WXK_F3; break;
case VK_F22: nId = WXK_F22; break;
case VK_F23: nId = WXK_F23; break;
case VK_F24: nId = WXK_F24; break;
+ case VK_OEM_1: nId = ';'; break;
+ case VK_OEM_PLUS: nId = '+'; break;
+ case VK_OEM_COMMA: nId = ','; break;
+ case VK_OEM_MINUS: nId = '-'; break;
+ case VK_OEM_PERIOD: nId = '.'; break;
+ case VK_OEM_2: nId = '/'; break;
+ case VK_OEM_3: nId = '~'; break;
+ case VK_OEM_4: nId = '['; break;
+ case VK_OEM_5: nId = '\\'; break;
+ case VK_OEM_6: nId = ']'; break;
+ case VK_OEM_7: nId = '\''; break;
case VK_NUMLOCK: nId = WXK_NUMLOCK; break;
case VK_SCRLLOCK: nId = WXK_SCROLL; break;
default: