//
#include "wx/wxprec.h"
+#include "wx/window.h"
+
#ifndef WX_PRECOMP
#define INCL_DOS
#define INCL_PM
#include <os2.h>
- #include "wx/window.h"
#include "wx/accel.h"
#include "wx/menu.h"
#include "wx/dc.h"
#include "wx/statusbr.h"
#include "wx/toolbar.h"
#include "wx/settings.h"
+ #include "wx/intl.h"
+ #include "wx/log.h"
+ #include "wx/textctrl.h"
+ #include "wx/menuitem.h"
#include <stdio.h>
#endif
#include "wx/dnd.h"
#endif
-#include "wx/menuitem.h"
-#include "wx/log.h"
-
#include "wx/os2/private.h"
#if wxUSE_TOOLTIPS
#include "wx/caret.h"
#endif // wxUSE_CARET
-#include "wx/intl.h"
-#include "wx/log.h"
-
-
-#include "wx/textctrl.h"
-
#include <string.h>
//
//
// 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; }
+static inline bool IsKeyDown(LONG key) {return (::WinGetKeyState(HWND_DESKTOP, key) & 0x8000) != 0; }
+static inline bool IsShiftDown() { return IsKeyDown(VK_SHIFT); }
+static inline bool IsCtrlDown() { return IsKeyDown(VK_CTRL); }
static wxWindow* gpWinBeingCreated = NULL;
m_bUseCtl3D = false;
m_bMouseInWindow = false;
m_bLastKeydownProcessed = false;
- m_pChildrenDisabled = NULL;
//
// wxWnd
//
wxRemoveHandleAssociation(this);
}
- delete m_pChildrenDisabled;
} // end of wxWindowOS2::~wxWindowOS2
// real construction (Init() must have been called before!)
return NULL;
} // wxWindowBase::DoFindFocus
-bool wxWindowOS2::Enable( bool bEnable )
+void wxWindowOS2::DoEnable( bool bEnable )
{
- if (!wxWindowBase::Enable(bEnable))
- return false;
-
HWND hWnd = GetHwnd();
-
if ( hWnd )
::WinEnableWindow(hWnd, (BOOL)bEnable);
-
- //
- // The logic below doesn't apply to the top level windows -- otherwise
- // showing a modal dialog would result in total greying out (and ungreying
- // out later) of everything which would be really ugly
- //
- if (IsTopLevel())
- return true;
-
- wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
-
- while (node)
- {
- wxWindow* pChild = node->GetData();
-
- if (bEnable)
- {
- //
- // Enable the child back unless it had been disabled before us
- //
- if (!m_pChildrenDisabled || !m_pChildrenDisabled->Find(pChild))
- pChild->Enable();
- }
- else // we're being disabled
- {
- if (pChild->IsEnabled())
- {
- //
- // Disable it as children shouldn't stay enabled while the
- // parent is not
- //
- pChild->Disable();
- }
- else // child already disabled, remember it
- {
- //
- // Have we created the list of disabled children already?
- //
- if (!m_pChildrenDisabled)
- m_pChildrenDisabled = new wxWindowList;
- m_pChildrenDisabled->Append(pChild);
- }
- }
- node = node->GetNext();
- }
- if (bEnable && m_pChildrenDisabled)
- {
- //
- // We don't need this list any more, don't keep unused memory
- //
- delete m_pChildrenDisabled;
- m_pChildrenDisabled = NULL;
- }
- return true;
-} // end of wxWindowOS2::Enable
+}
bool wxWindowOS2::Show( bool bShow )
{
void wxWindowOS2::SetLabel( const wxString& label )
{
- ::WinSetWindowText(GetHwnd(), (PSZ)label.c_str());
+ ::WinSetWindowText(GetHwnd(), label.c_str());
} // end of wxWindowOS2::SetLabel
wxString wxWindowOS2::GetLabel() const
int l;
FONTMETRICS vFM; // metrics structure
BOOL bRc = FALSE;
- char* pStr;
HPS hPS;
hPS = ::WinGetPS(GetHwnd());
l = rString.length();
if (l > 0L)
{
- pStr = (PCH)rString.c_str();
-
//
// In world coordinates.
//
bRc = ::GpiQueryTextBox( hPS,
l,
- pStr,
+ (char*) rString.wx_str(),
TXTBOX_COUNT,// return maximum information
avPoint // array of coordinates points
);
}
else
{
- wxButton* pBtn = wxDynamicCast( GetDefaultItem()
- ,wxButton
- );
+ wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
+ wxButton* pBtn = NULL;
+
+ if (tlw)
+ {
+ pBtn = wxDynamicCast(tlw->GetDefaultItem(), wxButton);
+ }
if (pBtn && pBtn->IsEnabled())
{
case WM_BUTTON3MOTIONEND:
case WM_BUTTON3MOTIONSTART:
{
- if (uMsg == WM_BUTTON1DOWN && AcceptsFocus())
- SetFocus();
-
short nX = LOWORD(wParam);
short nY = HIWORD(wParam);
);
if (!pWin->IsOfStandardClass())
{
- if (uMsg == WM_BUTTON1DOWN && pWin->AcceptsFocus() )
+ if (uMsg == WM_BUTTON1DOWN && pWin->CanAcceptFocus() )
pWin->SetFocus();
}
bProcessed = pWin->HandleMouseEvent( uMsg
}
break;
+ case CBN_LBSELECT:
case BN_CLICKED: // Dups as LN_SELECT and CBN_LBSELECT
{
HWND hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam));
,(WXWORD)SHORT1FROMMP(wParam)
);
}
+ if (pWin->IsKindOf(CLASSINFO(wxChoice)))
+ {
+ wxChoice* pChoice = wxDynamicCast(pWin, wxChoice);
+
+ pChoice->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXWORD)SHORT1FROMMP(wParam)
+ );
+ }
return 0;
}
// break;
- case LN_ENTER: /* dups as CBN_EFCHANGE */
+ case LN_ENTER:
{
HWND hWnd = HWNDFROMMP(lParam);
wxWindowOS2* pWin = wxFindWinFromHandle(hWnd);
sClassName += wxT("NR");
}
m_hWnd = (WXHWND)::WinCreateWindow( (HWND)OS2GetParent()
- ,(PSZ)sClassName.c_str()
- ,(PSZ)(zTitle ? zTitle : wxEmptyString)
+ ,sClassName.c_str()
+ ,(zTitle ? zTitle : wxEmptyString)
,(ULONG)dwStyle
,(LONG)0L
,(LONG)0L
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
- wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str());
+ wxLogError(_T("Unable to set current color table (1). Error: %s\n"), sError.c_str());
}
//
// Set the color table to RGB mode
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
- wxLogError(_T("Unable to set current color table. Error: %s\n"), sError.c_str());
+ wxLogError(_T("Unable to set current color table (2). Error: %s\n"), sError.c_str());
}
wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
wxLogLastError(wxT("CreateRectRgn"));
return false;
}
-
// Get all the rectangles from the region, convert the individual
// rectangles to "the other" coordinate system and reassemble a
// region from the rectangles, to be feed into m_updateRegion.
//
- // FIXME: This is a bad hack since OS/2 API specifies that rectangles
- // passed into GpiSetRegion must not have Bottom > Top,
- // however, at first sight, it _seems_ to work nonetheless.
- //
RGNRECT vRgnData;
PRECTL pUpdateRects = NULL;
vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
{
int rectHeight;
rectHeight = pUpdateRects[i].yTop - pUpdateRects[i].yBottom;
- pUpdateRects[i].yTop = height - pUpdateRects[i].yTop;
- pUpdateRects[i].yBottom = pUpdateRects[i].yTop + rectHeight;
+ pUpdateRects[i].yBottom = height - pUpdateRects[i].yTop;
+ pUpdateRects[i].yTop = pUpdateRects[i].yBottom + rectHeight;
}
::GpiSetRegion(hPS, hRgn, vRgnData.crc, pUpdateRects);
delete [] pUpdateRects;
}
}
-
m_updateRegion = wxRegion(hRgn, hPS);
vEvent.SetEventObject(this);
vDC.m_hPS = (HPS)hDC; // this is really a PS
vDC.SetWindow((wxWindow*)this);
- vDC.BeginDrawing();
wxEraseEvent vEvent(m_windowId, &vDC);
rc = GetEventHandler()->ProcessEvent(vEvent);
- vDC.EndDrawing();
vDC.m_hPS = NULLHANDLE;
return true;
} // end of wxWindowOS2::HandleEraseBkgnd
rEvent.m_shiftDown = ((uFlags & KC_SHIFT) != 0);
rEvent.m_controlDown = ((uFlags & KC_CTRL) != 0);
rEvent.m_altDown = ((uFlags & KC_ALT) != 0);
- rEvent.m_leftDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) &
- 0x8000) != 0;
- rEvent.m_middleDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) &
- 0x8000) != 0;
- rEvent.m_rightDown = (::WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) &
- 0x8000) != 0;
+ rEvent.m_leftDown = IsKeyDown(VK_BUTTON1);
+ rEvent.m_middleDown = IsKeyDown(VK_BUTTON3);
+ rEvent.m_rightDown = IsKeyDown(VK_BUTTON2);
rEvent.SetTimestamp(s_currentMsg.time);
rEvent.SetEventObject(this);
rEvent.SetId(GetId());
case VK_CTRL: nId = WXK_CONTROL; break;
case VK_PAUSE: nId = WXK_PAUSE; break;
case VK_SPACE: nId = WXK_SPACE; break;
- case VK_PAGEUP: nId = WXK_PRIOR; break;
- case VK_PAGEDOWN: nId = WXK_NEXT; break;
+ case VK_PAGEUP: nId = WXK_PAGEUP; break;
+ case VK_PAGEDOWN: nId = WXK_PAGEDOWN; break;
case VK_ESC: nId = WXK_ESCAPE; break;
case VK_END: nId = WXK_END; break;
case VK_HOME : nId = WXK_HOME; break;
{
int nKeySym = 0;
- *bIsVirtual = true;
+ if ( bIsVirtual )
+ *bIsVirtual = true;
switch (nId)
{
case WXK_CLEAR: nKeySym = VK_CLEAR; break;
case WXK_SHIFT: nKeySym = VK_SHIFT; break;
case WXK_CONTROL: nKeySym = VK_CTRL; break;
case WXK_PAUSE: nKeySym = VK_PAUSE; break;
- case WXK_PRIOR: nKeySym = VK_PAGEUP; break;
- case WXK_NEXT : nKeySym = VK_PAGEDOWN; break;
+ case WXK_PAGEUP: nKeySym = VK_PAGEUP; break;
+ case WXK_PAGEDOWN: nKeySym = VK_PAGEDOWN; break;
case WXK_END: nKeySym = VK_END; break;
case WXK_HOME : nKeySym = VK_HOME; break;
case WXK_LEFT : nKeySym = VK_LEFT; break;
case WXK_SCROLL: nKeySym = VK_SCRLLOCK; break;
default:
{
- *bIsVirtual = false;
+ if ( bIsVirtual )
+ *bIsVirtual = false;
nKeySym = nId;
break;
}
return nKeySym;
} // end of wxCharCodeWXToOS2
+
+bool wxGetKeyState(wxKeyCode key)
+{
+ wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key !=
+ WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons"));
+
+ const LONG vk = wxCharCodeWXToOS2(key);
+ // if the requested key is a LED key, return true if the led is pressed
+ if ( key == WXK_NUMLOCK || key == WXK_CAPITAL || key == WXK_SCROLL )
+ {
+ // low order bit means LED is highlighted and high order one means the
+ // key is down; for compatibility with the other ports return true if
+ // either one is set
+ return ::WinGetKeyState(HWND_DESKTOP, vk) != 0;
+
+ }
+ else // normal key
+ {
+ return IsKeyDown(vk);
+ }
+}
+
+
wxWindow* wxGetActiveWindow()
{
HWND hWnd = ::WinQueryActiveWindow(HWND_DESKTOP);
// Get the current mouse position.
wxPoint wxGetMousePosition()
{
- POINTL vPt;
+ POINTL vPt;
::WinQueryPointerPos(HWND_DESKTOP, &vPt);
return wxPoint(vPt.x, vPt.y);
}
+wxMouseState wxGetMouseState()
+{
+ wxMouseState ms;
+ wxPoint pt = wxGetMousePosition();
+ ms.SetX(pt.x);
+ ms.SetY(pt.y);
+ ms.SetLeftDown(IsKeyDown(VK_BUTTON1));
+ ms.SetMiddleDown(IsKeyDown(VK_BUTTON3));
+ ms.SetRightDown(IsKeyDown(VK_BUTTON2));
+ ms.SetControlDown(IsCtrlDown());
+ ms.SetShiftDown(IsShiftDown());
+ ms.SetAltDown(IsKeyDown(VK_ALT)|IsKeyDown(VK_ALTGRAF));
+ ms.SetMetaDown(IsKeyDown(VK_ALTGRAF));
+ return ms;
+}
+
+
wxWindowOS2* FindWindowForMouseEvent( wxWindow* pWin,
short* WXUNUSED(pnX),
short* WXUNUSED(pnY) )