// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
+//
// For compilers that support precompilation, includes "wx.h".
+//
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include <string.h>
-// place compiler, OS specific includes here
-
+//
+// Place compiler, OS specific includes here
+//
-// standard macros -- these are for OS/2 PM, but most GUI's have something similar
+//
+// Standard macros -- these are for OS/2 PM, but most GUI's have something similar
+//
#ifndef GET_X_LPARAM
+//
// SHORT1FROMMP -- LOWORD
+//
#define GET_X_LPARAM(mp) ((unsigned short)(unsigned long)(mp))
+//
// SHORT2FROMMP -- HIWORD
+//
#define GET_Y_LPARAM(mp) ((unsigned short)(unsigned long)(mp >> 16))
#endif // GET_X_LPARAM
// global variables
// ---------------------------------------------------------------------------
-// the last Windows message we got (MT-UNSAFE)
-extern WXMSGID s_currentMsg;
-extern wxList WXDLLEXPORT wxPendingDelete;
-extern wxChar wxCanvasClassName[];
+//
+// The last Windows message we got (MT-UNSAFE)
+//
+extern WXMSGID s_currentMsg;
-wxMenu *wxCurrentPopupMenu = NULL;
-wxList *wxWinHandleList = NULL;
+wxMenu* wxCurrentPopupMenu = NULL;
+extern wxList WXDLLEXPORT wxPendingDelete;
+extern wxChar* wxCanvasClassName;
+wxList* wxWinHandleList = NULL;
// ---------------------------------------------------------------------------
// private functions
// ---------------------------------------------------------------------------
+
+//
// the window proc for all our windows; most gui's have something similar
+//
MRESULT wxWndProc( HWND hWnd
,ULONG message
,MPARAM mp1
const char *wxGetMessageName(int message);
#endif //__WXDEBUG__
-void wxRemoveHandleAssociation(wxWindow *win);
-void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win);
-wxWindow *wxFindWinFromHandle(WXHWND hWnd);
+void wxRemoveHandleAssociation(wxWindow* pWin);
+void wxAssociateWinWithHandle( HWND hWnd
+ ,wxWindow* pWin
+ );
+wxWindow* wxFindWinFromHandle(WXHWND hWnd);
+
+//
+// This magical function is used to translate VK_APPS key presses to right
+// mouse clicks
+//
+static void TranslateKbdEventToMouse( wxWindow* pWin
+ ,int* pX
+ ,int* pY
+ ,MPARAM* pFlags
+ );
+//
+// get the current state of SHIFT/CTRL keys
+//
+static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000) != 0; }
+static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000) != 0; }
// ---------------------------------------------------------------------------
// event tables
// ---------------------------------------------------------------------------
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
-#endif
BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground)
// implementation
// ===========================================================================
+//
// Find an item given the PM Window id
+//
wxWindow* wxWindow::FindItem(
- long ulId
+ long lId
) const
{
+ wxControl* pItem = wxDynamicCast( this
+ ,wxControl
+ );
+
+ if (pItem)
+ {
+ //
+ // I it we or one of our "internal" children?
+ //
+ if (pItem->GetId() == lId ||
+ (pItem->GetSubcontrols().Index(lId) != wxNOT_FOUND))
+ {
+ return pItem;
+ }
+ }
+
wxWindowList::Node* pCurrent = GetChildren().GetFirst();
while (pCurrent)
{
wxWindow* pChildWin = pCurrent->GetData();
- wxWindow* pWnd = pChildWin->FindItem(ulId);
+ wxWindow* pWnd = pChildWin->FindItem(lId);
if (pWnd)
return pWnd;
- if (pChildWin->IsKindOf(CLASSINFO(wxControl)))
- {
- wxControl* pItem = (wxControl *)pChildWin;
-
- if (pItem->GetId() == ulId)
- return(pItem);
- else
- {
- // In case it's a 'virtual' control (e.g. radiobox)
- if (pItem->GetSubcontrols().Member((wxObject *)ulId))
- return(pItem);
- }
- }
pCurrent = pCurrent->GetNext();
}
return(NULL);
-}
+} // end of wxWindow::FindItem
+//
// Find an item given the PM Window handle
+//
wxWindow* wxWindow::FindItemByHWND(
WXHWND hWnd
, bool bControlOnly
{
wxWindow* pParent = pCurrent->GetData();
+ //
// Do a recursive search.
+ //
wxWindow* pWnd = pParent->FindItemByHWND(hWnd);
if (pWnd)
pCurrent = pCurrent->GetNext();
}
return(NULL);
-}
+} // end of wxWindow::FindItemByHWND
+//
// Default command handler
+//
bool wxWindow::OS2Command(
WXUINT WXUNUSED(uParam)
, WXWORD WXUNUSED(uId)
void wxWindow::Init()
{
- // generic
+ //
+ // Generic
+ //
InitBase();
+ //
// PM specific
+ //
m_bDoubleClickAllowed = 0;
m_bWinCaptured = FALSE;
m_bUseCtl3D = FALSE;
m_bMouseInWindow = FALSE;
+ //
// wxWnd
+ //
m_hMenu = 0;
-
m_hWnd = 0;
- // pass WM_GETDLGCODE to DefWindowProc()
+ //
+ // Pass WM_GETDLGCODE to DefWindowProc()
m_lDlgCode = 0;
m_nXThumbSize = 0;
m_nYThumbSize = 0;
m_bBackgroundTransparent = FALSE;
- // as all windows are created with WS_VISIBLE style...
+ //
+ // As all windows are created with WS_VISIBLE style...
+ //
m_isShown = TRUE;
#if wxUSE_MOUSEEVENT_HACK
m_lLastMouseY = -1;
m_nLastMouseEvent = -1;
#endif // wxUSE_MOUSEEVENT_HACK
-}
+} // wxWindow::Init
+//
// Destructor
+//
wxWindow::~wxWindow()
{
m_isBeingDeleted = TRUE;
OS2DetachWindowMenu();
- // delete handlers?
if (m_parent)
m_parent->RemoveChild(this);
DestroyChildren();
if (m_hWnd)
{
- if(!WinDestroyWindow(GetHWND()))
+ if(!::WinDestroyWindow(GetHWND()))
wxLogLastError(wxT("DestroyWindow"));
+ //
// remove hWnd <-> wxWindow association
+ //
wxRemoveHandleAssociation(this);
}
-}
+} // end of wxWindow::~wxWindow
bool wxWindow::Create(
wxWindow* pParent
pParent->AddChild(this);
+ ULONG ulFlags = 0L;
+
+ //
+ // Frame windows and their derivatives only
+ //
+ if (lStyle & wxBORDER)
+ ulFlags |= FCF_BORDER;
+ if (lStyle & wxTHICK_FRAME )
+ ulFlags |= FCF_SIZEBORDER;
+
+ //
+ // Some generic window styles
+ //
+ ulFlags |= WS_VISIBLE;
+ if (lStyle & wxCLIP_CHILDREN )
+ ulFlags |= WS_CLIPCHILDREN;
+
bool bWant3D;
WXDWORD dwExStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &bWant3D);
- DWORD ulFlags = 0L;
+ //
+ // OS/2 PM doesn't have "extended" styles but if the library specifies
+ // them and we are creating a frame window then at least give it a border
+ //
+ if ( bWant3D ||
+ (m_windowStyle & wxSIMPLE_BORDER) ||
+ (m_windowStyle & wxRAISED_BORDER ) ||
+ (m_windowStyle & wxSUNKEN_BORDER) ||
+ (m_windowStyle & wxDOUBLE_BORDER)
+ )
+ {
+ ulFlags |= FCF_BORDER;
+ }
OS2Create( m_windowId
,pParent
,wxCanvasClassName
,dwExStyle
);
return(TRUE);
-}
+} // end of wxWindow::Create
// ---------------------------------------------------------------------------
// basic operations
void wxWindow::SetFocus()
{
- // TODO:
-}
+ HWND hWnd = GetHwnd();
+
+ if (hWnd)
+ ::WinSetFocus(HWND_DESKTOP, hWnd);
+} // end of wxWindow::SetFocus
wxWindow* wxWindowBase::FindFocus()
{
- wxWindow* window = NULL;
- // TODO:
- return(window);
-}
+ HWND hWnd = ::WinQueryFocus(HWND_DESKTOP);
+
+ if (hWnd)
+ {
+ return wxFindWinFromHandle((WXHWND)hWnd);
+ }
+ return NULL;
+} // wxWindowBase::FindFocus
-bool wxWindow::Enable(bool enable) // check if base implementation is OK
+bool wxWindow::Enable(
+ bool bEnable
+)
{
- // TODO:
+ if (!wxWindowBase::Enable(bEnable))
+ return(FALSE);
+
+ HWND hWnd = GetHwnd();
+
+ if ( hWnd )
+ ::WinEnableWindow(hWnd, (BOOL)bEnable);
+
+ wxWindowList::Node* pNode = GetChildren().GetFirst();
+
+ while (pNode)
+ {
+ wxWindow* pChild = pNode->GetData();
+
+ pChild->Enable(bEnable);
+ pNode = pNode->GetNext();
+ }
return(TRUE);
-}
+} // end of wxWindow::Enable
-bool wxWindow::Show(bool show) // check if base implementation is OK
+bool wxWindow::Show(
+ bool bShow
+)
{
- // TODO:
+ if (!wxWindowBase::Show(bShow))
+ return(FALSE);
+
+ HWND hWnd = GetHwnd();
+
+ ::WinShowWindow(hWnd, bShow);
+
+ if (bShow)
+ {
+ ::WinSetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE | SWP_ZORDER);
+ }
return(TRUE);
-}
+} // end of wxWindow::Show
void wxWindow::Raise()
{
- // TODO:
-}
+ ::WinSetWindowPos(GetHwnd(), HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_ACTIVATE);
+} // end of wxWindow::Raise
void wxWindow::Lower()
{
- // TODO:
-}
+ ::WinSetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER | SWP_DEACTIVATE);
+} // end of wxWindow::Lower
-void wxWindow::SetTitle( const wxString& title)
+void wxWindow::SetTitle(
+ const wxString& rTitle
+)
{
-// TODO: SetWindowText(GetHwnd(), title.c_str());
-}
+ ::WinSetWindowText(GetHwnd(), rTitle.c_str());
+} // end of wxWindow::SetTitle
wxString wxWindow::GetTitle() const
{
return wxGetWindowText(GetHWND());
-}
+} // end of wxWindow::GetTitle
void wxWindow::CaptureMouse()
{
- // TODO:
-}
+ HWND hWnd = GetHwnd();
+
+ if (hWnd && !m_bWinCaptured)
+ {
+ ::WinSetCapture(HWND_DESKTOP, hWnd);
+ m_bWinCaptured = TRUE;
+ }
+} // end of wxWindow::GetTitle
void wxWindow::ReleaseMouse()
{
- // TODO:
-}
+ if (m_bWinCaptured)
+ {
+ ::WinSetCapture(HWND_DESKTOP, NULLHANDLE);
+ m_bWinCaptured = FALSE;
+ }
+} // end of wxWindow::ReleaseMouse
-bool wxWindow::SetFont(const wxFont& f)
+bool wxWindow::SetFont(
+ const wxFont& rFont
+)
{
- // TODO:
+ if (!wxWindowBase::SetFont(rFont))
+ {
+ // nothing to do
+ return(FALSE);
+ }
+
+ HWND hWnd = GetHwnd();
+
+ if (hWnd != 0)
+ {
+ wxChar zFont[128];
+
+ sprintf(zFont, "%d.%s", rFont.GetPointSize(), rFont.GetFaceName().c_str());
+ return(::WinSetPresParam(hWnd, PP_FONTNAMESIZE, strlen(zFont), (PVOID)zFont));
+ }
return(TRUE);
}
-bool wxWindow::SetCursor(const wxCursor& cursor) // check if base implementation is OK
+bool wxWindow::SetCursor(
+ const wxCursor& rCursor
+) // check if base implementation is OK
{
- // TODO:
- return(TRUE);
-}
+ if ( !wxWindowBase::SetCursor(rCursor))
+ {
+ // no change
+ return FALSE;
+ }
+
+ wxASSERT_MSG( m_cursor.Ok(),
+ wxT("cursor must be valid after call to the base version"));
+
+ HWND hWnd = GetHwnd();
+ POINTL vPoint;
+ RECTL vRect;
+ HPS hPS;
+ HRGN hRGN;
+
+ hPS = ::WinGetPS(hWnd);
+
+ ::WinQueryPointerPos(HWND_DESKTOP, &vPoint);
+ ::WinQueryWindowRect(hWnd, &vRect);
+
+ hRGN = ::GpiCreateRegion(hPS, 1L, &vRect);
-void wxWindow::WarpPointer(int x_pos, int y_pos)
+ if ((::GpiPtInRegion(hPS, hRGN, &vPoint) == PRGN_INSIDE) && !wxIsBusy())
+ {
+ ::WinSetPointer(HWND_DESKTOP, (HPOINTER)m_cursor.GetHCURSOR());
+ }
+ return TRUE;
+} // end of wxWindow::SetCursor
+
+void wxWindow::WarpPointer(
+ int nXPos
+, int nYPos
+)
{
- // TODO:
-}
+ int nX = nXPos;
+ int nY = nYPos;
+ RECTL vRect;
+
+ ::WinQueryWindowRect(GetHwnd(), &vRect);
+ nX += vRect.xLeft;
+ nY += vRect.yBottom;
+
+ ::WinSetPointerPos(HWND_DESKTOP, (LONG)nX, (LONG)(nY));
+} // end of wxWindow::WarpPointer
#if WXWIN_COMPATIBILITY
void wxWindow::OS2DeviceToLogical (float *x, float *y) const
// ---------------------------------------------------------------------------
#if WXWIN_COMPATIBILITY
-void wxWindow::SetScrollRange(int orient, int range, bool refresh)
+void wxWindow::SetScrollRange(
+ int nOrient
+, int nRange
+, bool bRefresh
+)
{
- // TODO:
-}
+ ::WinSendMsg(GetHwnd(), SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, nRange));
+} // end of wxWindow::SetScrollRange
-void wxWindow::SetScrollPage(int orient, int page, bool refresh)
+void wxWindow::SetScrollPage(
+ int nOrient
+, int nPage
+, bool bRefresh
+)
{
- // TODO:
+ if ( orient == wxHORIZONTAL )
+ m_xThumbSize = page;
+ else
+ m_yThumbSize = page;
}
-int wxWindow::OldGetScrollRange(int orient) const
+int wxWindow::OldGetScrollRange(
+ int nOrient
+) const
{
- // TODO:
- return 0;
-}
+ MRESULT mRc;
+ HWND hWnd = GetHwnd();
-int wxWindow::GetScrollPage(int orient) const
+ if (hWnd)
+ {
+ mRc = WinSendMsg(hWnd, SBM_QUERYRANGE, (MPARAM)0L, (MPARAM)0L);
+ return(SHORT2FROMMR(mRc));
+ }
+ return 0;
+} // end of wxWindow::OldGetScrollRange
+
+int wxWindow::GetScrollPage(
+ int nOrient
+) const
{
- // TODO:
- return(1);
-}
+ if (nOrient == wxHORIZONTAL)
+ return m_xThumbSize;
+ else
+ return m_yThumbSize;
+} // end of wxWindow::GetScrollPage
#endif // WXWIN_COMPATIBILITY
int wxWindow::GetScrollPos(int orient) const
WXDWORD wxWindow::Determine3DEffects(WXDWORD defaultBorderStyle,
bool *want3D) const
{
- DWORD exStyle; // remove after implementation doe
+ DWORD exStyle = 0L; // remove after implementation doe
/* TODO: this ought to be fun
*
// If matches certain criteria, then assume no 3D effects
// TODO:
}
-// for a generic window there is no natural best size - just use the current one
-wxSize wxWindow::DoGetBestSize()
-{
- return GetSize();
-}
-
void wxWindow::DoSetClientSize(int width, int height)
{
// TODO:
// pre/post message processing
// ===========================================================================
-MRESULT wxWindow::OS2DefWindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+MRESULT wxWindow::OS2DefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
// TODO:
return (MRESULT)0;
wxWindow *wxWndHook = NULL;
// Main window proc
-MRESULT wxWndProc(HWND hWnd, UINT message, MPARAM wParam, MPARAM lParam)
+MRESULT wxWndProc(HWND hWnd, ULONG message, MPARAM wParam, MPARAM lParam)
{
// trace all messages - useful for the debugging
#ifdef __WXDEBUG__
{
// FIXME: why do we do this?
wnd->SetHWND((WXHWND) hWnd);
- rc = wnd->OS2DefWindowProc(hWnd, message, wParam, lParam );
+ rc = wnd->OS2DefWindowProc(message, wParam, lParam );
wnd->SetHWND(0);
}
else
{
if ( wnd )
- rc = wnd->OS2WindowProc(hWnd, message, wParam, lParam);
+ rc = wnd->OS2WindowProc(message, wParam, lParam);
else
rc = 0; //TODO: DefWindowProc( hWnd, message, wParam, lParam );
}
return rc;
}
-MRESULT wxWindow::OS2WindowProc(HWND hWnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
+MRESULT wxWindow::OS2WindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
{
// did we process the message?
bool processed = FALSE;