#include "wx/app.h"
#include "wx/panel.h"
#include "wx/layout.h"
+ #include "wx/checkbox.h"
+ #include "wx/combobox.h"
#include "wx/dialog.h"
#include "wx/frame.h"
#include "wx/listbox.h"
#include "wx/button.h"
+ #include "wx/bmpbuttn.h"
#include "wx/msgdlg.h"
#include "wx/scrolwin.h"
#include "wx/radiobox.h"
+ #include "wx/radiobut.h"
#include "wx/slider.h"
+ #include "wx/statbox.h"
#include "wx/statusbr.h"
#include "wx/toolbar.h"
#include "wx/settings.h"
#include "wx/tooltip.h"
#endif
+#if wxUSE_NOTEBOOK
+ #include "wx/notebook.h"
+#endif
+
#if wxUSE_CARET
#include "wx/caret.h"
#endif // wxUSE_CARET
BEGIN_EVENT_TABLE(wxWindowOS2, wxWindowBase)
EVT_ERASE_BACKGROUND(wxWindowOS2::OnEraseBackground)
EVT_SYS_COLOUR_CHANGED(wxWindowOS2::OnSysColourChanged)
- EVT_INIT_DIALOG(wxWindowOS2::OnInitDialog)
EVT_IDLE(wxWindowOS2::OnIdle)
EVT_SET_FOCUS(wxWindowOS2::OnSetFocus)
END_EVENT_TABLE()
void wxWindowOS2::Init()
{
- //
- // Generic
- //
- InitBase();
-
//
// PM specific
//
m_bWinCaptured = FALSE;
- m_isBeingDeleted = FALSE;
m_fnOldWndProc = NULL;
m_bUseCtl3D = FALSE;
m_bMouseInWindow = FALSE;
m_bLastKeydownProcessed = FALSE;
+ m_pChildrenDisabled = NULL;
//
// wxWnd
DestroyChildren();
- if (m_parent)
- m_parent->RemoveChild(this);
-
if (m_hWnd)
{
if(!::WinDestroyWindow(GetHWND()))
//
wxRemoveHandleAssociation(this);
}
+ delete m_pChildrenDisabled;
} // end of wxWindowOS2::~wxWindowOS2
// real construction (Init() must have been called before!)
if (pParent)
{
- int nTempy;
-
pParent->AddChild(this);
hParent = GetWinHwnd(pParent);
// set in those class create procs. PM's basic windows styles are
// very limited.
//
- ulCreateFlags |= WS_VISIBLE | OS2GetCreateWindowFlags(&dwExStyle);
+ ulCreateFlags |= OS2GetCreateWindowFlags(&dwExStyle);
#ifdef __WXUNIVERSAL__
#endif // !wxUniversal
if (lStyle & wxPOPUP_WINDOW)
{
- // a popup window floats on top of everything
- // it is also created hidden as other top level windows
ulCreateFlags &= ~WS_VISIBLE;
m_isShown = FALSE;
}
+ else
+ {
+ ulCreateFlags |= WS_VISIBLE;
+ }
//
// Generic OS/2 Windows have no Control Data but other classes
// that call OS2Create may have some.
//
- bool bRetVal = OS2Create( (PSZ)wxCanvasClassName
- ,rName.c_str()
- ,ulCreateFlags
- ,rPos
- ,rSize
- ,NULL // Control Data
- ,dwExStyle
- ,TRUE // Child
- );
-
- if (bRetVal)
- ::WinSubclassWindow(m_hWnd, (PFNWP)wxWndProc);
- return(bRetVal);
+ return(OS2Create( (PSZ)wxCanvasClassName
+ ,rName.c_str()
+ ,ulCreateFlags
+ ,rPos
+ ,rSize
+ ,NULL // Control Data
+ ,dwExStyle
+ ,TRUE // Child
+ ));
} // end of wxWindowOS2::Create
// ---------------------------------------------------------------------------
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::Node* pNode = GetChildren().GetFirst();
while (pNode)
{
wxWindow* pChild = pNode->GetData();
- pChild->Enable(bEnable);
+ 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);
+ }
+ }
pNode = pNode->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
::WinSetPointerPos(HWND_DESKTOP, (LONG)nX, (LONG)(nY));
} // end of wxWindowOS2::WarpPointer
-#if WXWIN_COMPATIBILITY
-void wxWindowOS2::OS2DeviceToLogical (float *x, float *y) const
-{
-}
-#endif // WXWIN_COMPATIBILITY
// ---------------------------------------------------------------------------
// scrolling stuff
// ---------------------------------------------------------------------------
-#if WXWIN_COMPATIBILITY
-void wxWindowOS2::SetScrollRange(
- int nOrient
-, int nRange
-, bool bRefresh
-)
-{
- int nRange1 = nRange;
- int nPageSize = GetScrollPage(nOrient);
-
- if (nPpageSize > 1 && nRange > 0)
- {
- nRange1 += (nPageSize - 1);
- }
-
- if (nOrient == wxHORIZONTAL)
- {
- ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
- ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
- }
- else
- {
- ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
- ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
- }
-} // end of wxWindowOS2::SetScrollRange
-
-void wxWindowOS2::SetScrollPage(
- int nOrient
-, int nPage
-, bool bRefresh
-)
-{
- if (nOrient == wxHORIZONTAL )
- m_nXThumbSize = nPage;
- else
- m_nYThumbSize = nPage;
-} // end of wxWindowOS2::SetScrollPage
-
-int wxWindowOS2::OldGetScrollRange(
- int nOrient
-) const
-{
- MRESULT mRc;
- HWND hWnd = GetHwnd();
-
- if (hWnd)
- {
- mRc = WinSendMsg(hWnd, SBM_QUERYRANGE, (MPARAM)0L, (MPARAM)0L);
- return(SHORT2FROMMR(mRc));
- }
- return 0;
-} // end of wxWindowOS2::OldGetScrollRange
-
-int wxWindowOS2::GetScrollPage(
- int nOrient
-) const
-{
- if (nOrient == wxHORIZONTAL)
- return m_nXThumbSize;
- else
- return m_nYThumbSize;
-} // end of wxWindowOS2::GetScrollPage
-#endif // WXWIN_COMPATIBILITY
-
int wxWindowOS2::GetScrollPos(
int nOrient
) const
ULONG ulStyle = WS_VISIBLE | WS_SYNCPAINT;
SWP vSwp;
SWP vSwpOwner;
- RECTL vRect;
HWND hWndParent;
HWND hWndClient;
wxWindow* pParent = GetParent();
)
{
RECTL vRect;
- RECTL vRectHorz;
- RECTL vRectVert;
- RECTL vRectChild;
if (pRect)
{
} // end of wxWindowMSW::MSWGetStyle
//
-// Make a Windows extended style from the given wxWindows window style
+// Make a Windows extended style from the given wxWidgets window style
//
WXDWORD wxWindowOS2::MakeExtendedStyle(
long lStyle
return dwStyle;
} // end of wxWindowOS2::MakeExtendedStyle
-//
-// 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 OS2Create.
-//
-WXDWORD wxWindowOS2::Determine3DEffects(
- WXDWORD dwDefaultBorderStyle
-, bool* pbWant3D
-) const
-{
- WXDWORD dwStyle = 0L;
-
- //
- // 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)
- //
- 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 wxWindowOS2::Determine3DEffects
-
-#if WXWIN_COMPATIBILITY
-void wxWindowOS2::OnCommand(
- wxWindow& rWin
-, wxCommandEvent& rEvent
-)
-{
- if (GetEventHandler()->ProcessEvent(rEvent))
- return;
- if (m_parent)
- m_parent->GetEventHandler()->OnCommand( rWin
- ,rEvent
- );
-} // end of wxWindowOS2::OnCommand
-
-wxObject* wxWindowOS2::GetChild(
- int nNumber
-) const
-{
- //
- // Return a pointer to the Nth object in the Panel
- //
- wxNode* pNode = GetChildren().First();
- int n = nNumber;
-
- while (pNode && n--)
- pNode = pNode->Next();
- if (pNode)
- {
- wxObject* pObj = (wxObject*)pNode->Data();
- return(pObj);
- }
- else
- return NULL;
-} // end of wxWindowOS2::GetChild
-
-#endif // WXWIN_COMPATIBILITY
-
//
// Setup background and foreground colours correctly
//
//
int nState = 0;
- if (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) != 0)
- nState |= VK_SHIFT;
- if (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) != 0);
- nState |= VK_CTRL;
+ if (IsShiftDown())
+ nState |= KC_SHIFT;
+ if (IsCtrlDown())
+ nState |= KC_CTRL;
wxMouseEvent rEvent(wxEVT_LEAVE_WINDOW);
(void)GetEventHandler()->ProcessEvent(rEvent);
}
}
- UpdateWindowUI();
+ if (wxUpdateUIEvent::CanUpdate(this))
+ UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
} // end of wxWindowOS2::OnIdle
//
return TRUE;
} // end of wxWindowOS2::Reparent
-void wxWindowOS2::Clear()
-{
- wxClientDC vDc((wxWindow*)this);
- wxBrush vBrush( GetBackgroundColour()
- ,wxSOLID
- );
-
- vDc.SetBackground(vBrush);
- vDc.Clear();
-} // end of wxWindowOS2::Clear
-
void wxWindowOS2::Update()
{
::WinUpdateWindow(GetHwnd());
RECTL vOs2Rect;
vOs2Rect.xLeft = pRect->x;
- vOs2Rect.yTop = pRect->y;
+ vOs2Rect.yBottom = pRect->y;
vOs2Rect.xRight = pRect->x + pRect->width;
- vOs2Rect.yBottom = pRect->y + pRect->height;
+ vOs2Rect.yTop = pRect->y + pRect->height;
::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
}
wxDropTarget* pDropTarget
)
{
- if (m_dropTarget != 0)
- {
- m_dropTarget->Revoke(m_hWnd);
- delete m_dropTarget;
- }
m_dropTarget = pDropTarget;
- if (m_dropTarget != 0)
- m_dropTarget->Register(m_hWnd);
} // end of wxWindowOS2::SetDropTarget
#endif
)
{
RECTL vRect;
- HWND hParent;
wxWindow* pParent = GetParent();
if (pParent && !IsKindOf(CLASSINFO(wxDialog)))
::WinQueryWindowRect(HWND_DESKTOP, &vRect);
nY = vRect.yTop - (nY + nHeight);
}
+
+ //
+ // In the case of a frame whose client is sized, the client cannot be
+ // large than its parent frame minus its borders! This usually happens
+ // when using an autosizer to size a frame to precisely hold client
+ // controls as in the notebook sample.
+ //
+ // In this case, we may need to resize both a frame and its client so we
+ // need a quick calc of the frame border size, then if the frame
+ // (less its borders) is smaller than the client, size the frame to
+ // encompass the client with the appropriate border size.
+ //
+ if (IsKindOf(CLASSINFO(wxFrame)))
+ {
+ RECTL vFRect;
+ HWND hWndFrame;
+ int nWidthFrameDelta = 0;
+ int nHeightFrameDelta = 0;
+ int nHeightFrame = 0;
+ int nWidthFrame = 0;
+ wxFrame* pFrame;
+
+ pFrame = wxDynamicCast(this, wxFrame);
+ hWndFrame = pFrame->GetFrame();
+ ::WinQueryWindowRect(hWndFrame, &vRect);
+ ::WinMapWindowPoints(hWndFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2);
+ vFRect = vRect;
+ ::WinCalcFrameRect(hWndFrame, &vRect, TRUE);
+ nWidthFrameDelta = ((vRect.xLeft - vFRect.xLeft) + (vFRect.xRight - vRect.xRight));
+ nHeightFrameDelta = ((vRect.yBottom - vFRect.yBottom) + (vFRect.yTop - vRect.yTop));
+ nWidthFrame = vFRect.xRight - vFRect.xLeft;
+ nHeightFrame = vFRect.yTop - vFRect.yBottom;
+
+ if (nWidth == vFRect.xRight - vFRect.xLeft &&
+ nHeight == vFRect.yTop - vFRect.yBottom)
+ {
+ //
+ // In this case the caller is not aware of OS/2's need to size both
+ // the frame and it's client and is really only moving the window,
+ // not resizeing it. So move the frame, and back off the sizes
+ // for a proper client fit.
+ //
+ ::WinSetWindowPos( hWndFrame
+ ,HWND_TOP
+ ,(LONG)nX - (vRect.xLeft - vFRect.xLeft)
+ ,(LONG)nY - (vRect.yBottom - vFRect.yBottom)
+ ,(LONG)0
+ ,(LONG)0
+ ,SWP_MOVE
+ );
+ nX += (vRect.xLeft - vFRect.xLeft);
+ nY += (vRect.yBottom - vFRect.yBottom);
+ nWidth -= nWidthFrameDelta;
+ nHeight -= nHeightFrameDelta;
+ }
+ else
+ {
+ if (nWidth > nWidthFrame - nHeightFrameDelta ||
+ nHeight > nHeightFrame - nHeightFrameDelta)
+ {
+ ::WinSetWindowPos( hWndFrame
+ ,HWND_TOP
+ ,(LONG)nX - (vRect.xLeft - vFRect.xLeft)
+ ,(LONG)nY - (vRect.yBottom - vFRect.yBottom)
+ ,(LONG)nWidth + nWidthFrameDelta
+ ,(LONG)nHeight + nHeightFrameDelta
+ ,SWP_MOVE | SWP_SIZE
+ );
+ }
+ }
+ }
+
::WinSetWindowPos( GetHwnd()
,HWND_TOP
,(LONG)nX
,(LONG)nY
,(LONG)nWidth
,(LONG)nHeight
- ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
+ ,SWP_SIZE | SWP_MOVE
);
if (m_vWinSwp.cx == 0 && m_vWinSwp.cy == 0 && m_vWinSwp.fl == 0)
//
// Must convert Y coords to test for equality under OS/2
//
int nY2 = nY;
- wxWindow* pParent = (wxWindow*)GetParent();
if (nX == nCurrentX && nY2 == nCurrentY &&
nWidth == nCurrentWidth && nHeight == nCurrentHeight)
int i;
int l;
FONTMETRICS vFM; // metrics structure
- BOOL bRc;
+ BOOL bRc = FALSE;
char* pStr;
- ERRORID vErrorCode; // last error id code
HPS hPS;
return hWnd != NULL;
} // end of wxWindowOS2::IsMouseInWindow
-#if wxUSE_CARET && WXWIN_COMPATIBILITY
-// ---------------------------------------------------------------------------
-// Caret manipulation
-// ---------------------------------------------------------------------------
-
-void wxWindowOS2::CreateCaret(
- int nWidth
-, int nHeight
-)
-{
- SetCaret(new wxCaret( this
- ,nWidth
- ,nHeight
- ));
-} // end of wxWindowOS2::CreateCaret
-
-void wxWindowOS2::CreateCaret(
- const wxBitmap* pBitmap
-)
-{
- wxFAIL_MSG("not implemented");
-} // end of wxWindowOS2::CreateCaret
-
-void wxWindowOS2::ShowCaret(
- bool bShow
-)
-{
- wxCHECK_RET( m_caret, "no caret to show" );
-
- m_caret->Show(bShow);
-} // end of wxWindowOS2::ShowCaret
-
-void wxWindowOS2::DestroyCaret()
-{
- SetCaret(NULL);
-} // end of wxWindowOS2::DestroyCaret
-
-void wxWindowOS2::SetCaretPos(
- int nX
-, int nY)
-{
- wxCHECK_RET( m_caret, "no caret to move" );
-
- m_caret->Move( nX
- ,nY
- );
-} // end of wxWindowOS2::SetCaretPos
-
-void wxWindowOS2::GetCaretPos(
- int* pX
-, int* pY
-) const
-{
- wxCHECK_RET( m_caret, "no caret to get position of" );
-
- m_caret->GetPosition( pX
- ,pY
- );
-} // end of wxWindowOS2::GetCaretPos
-
-#endif //wxUSE_CARET
// ---------------------------------------------------------------------------
// popup menu
// ---------------------------------------------------------------------------
//
-#if wxUSE_MENUS_NATIVE
-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);
- }
-}
-#endif // wxUSE_MENUS_NATIVE
-
#if wxUSE_MENUS_NATIVE
bool wxWindowOS2::DoPopupMenu(
wxMenu* pMenu
pMenu->SetInvokingWindow(this);
pMenu->UpdateUI();
-
- DoClientToScreen( &nX
- ,&nY
- );
+
+ if ( x == -1 && y == -1 )
+ {
+ wxPoint mouse = wxGetMousePosition();
+ nX = mouse.x; nY = mouse.y;
+ }
+ else
+ {
+ DoClientToScreen( &nX
+ ,&nY
+ );
+ }
wxCurrentPopupMenu = pMenu;
::WinPopupMenu( hWndParent
while(bIsWaiting)
{
QMSG vMsg;
- BOOL bRc = ::WinGetMsg(vHabmain, &vMsg, HWND(NULL), 0, 0);
if (vMsg.msg == WM_MENUEND || vMsg.msg == WM_COMMAND)
{
pBtn->OS2Command(BN_CLICKED, 0 /* unused */);
return TRUE;
}
+ else if (!IsTopLevel())
+ {
+ //
+ // if not a top level window, let parent
+ // handle it
+ //
+ return FALSE;
+ }
// else: but if it does not it makes sense to make
// it work like a TAB - and that's what we do.
// Note that Ctrl-Enter always works this way.
} // end of wxWindowOS2::UnpackMenuSelect
// ---------------------------------------------------------------------------
-// Main wxWindows window proc and the window proc for wxWindow
+// Main wxWidgets window proc and the window proc for wxWindow
// ---------------------------------------------------------------------------
//
, MPARAM lParam
)
{
- //
- // Trace all ulMsgs - useful for the debugging
- //
-#ifdef __WXDEBUG__
- wxLogTrace(wxTraceMessages, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"),
- wxGetMessageName(ulMsg), wParam, lParam);
-#endif // __WXDEBUG__
-
wxWindowOS2* pWnd = wxFindWinFromHandle((WXHWND)hWnd);
//
bProcessed = HandleMouseEvent( uMsg
,nX
,nY
- ,(WXUINT)SHORT1FROMMP(wParam)
+ ,(WXUINT)SHORT2FROMMP(lParam)
);
}
else
,&nX
,&nY
);
+ if (!pWin->IsOfStandardClass())
+ {
+ if (uMsg == WM_BUTTON1DOWN && pWin->AcceptsFocus() )
+ pWin->SetFocus();
+ }
bProcessed = pWin->HandleMouseEvent( uMsg
,nX
,nY
- ,(WXUINT)SHORT1FROMMP(wParam)
+ ,(WXUINT)SHORT2FROMMP(lParam)
);
}
}
}
else
{
- bProcessed = OS2OnMeasureItem(nIdCtrl,
- (WXMEASUREITEMSTRUCT *)lParam);
+ return MRFROMLONG(OS2OnMeasureItem( nIdCtrl
+ ,(WXMEASUREITEMSTRUCT *)lParam
+ ));
}
if ( bProcessed )
// Avoid duplicate messages to OnChar for these ASCII keys: they
// will be translated by TranslateMessage() and received in WM_CHAR
case VK_ESC:
- case VK_SPACE:
case VK_ENTER:
case VK_BACKSPACE:
case VK_TAB:
case WM_CONTROL:
switch(SHORT2FROMMP(wParam))
{
+ case BN_PAINT:
+ {
+ HWND hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam));
+ wxWindowOS2* pWin = wxFindWinFromHandle(hWnd);
+
+ if (!pWin)
+ {
+ bProcessed = FALSE;
+ break;
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxBitmapButton)))
+ {
+ wxBitmapButton* pBitmapButton = wxDynamicCast(pWin, wxBitmapButton);
+
+ pBitmapButton->OS2OnDraw((WXDRAWITEMSTRUCT *)lParam);
+ }
+ return 0;
+ }
+ break;
+
+ case BKN_PAGESELECTEDPENDING:
+ {
+ PPAGESELECTNOTIFY pPage = (PPAGESELECTNOTIFY)lParam;
+
+ if ((pPage->ulPageIdNew != pPage->ulPageIdCur) &&
+ (pPage->ulPageIdNew > 0L && pPage->ulPageIdCur > 0L))
+ {
+ wxWindowOS2* pWin = wxFindWinFromHandle(pPage->hwndBook);
+ wxNotebookEvent vEvent( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
+ ,(int)SHORT1FROMMP(wParam)
+ ,(int)pPage->ulPageIdNew
+ ,(int)pPage->ulPageIdCur
+ );
+ if (!pWin)
+ {
+ bProcessed = FALSE;
+ break;
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxNotebook)))
+ {
+ wxNotebook* pNotebook = wxDynamicCast(pWin, wxNotebook);
+
+ vEvent.SetEventObject(pWin);
+ pNotebook->OnSelChange(vEvent);
+ bProcessed = TRUE;
+ }
+ else
+ bProcessed = FALSE;
+ }
+ else
+ bProcessed = FALSE;
+ }
+ break;
+
+ case BN_CLICKED: // Dups as LN_SELECT and CBN_LBSELECT
+ {
+ HWND hWnd = ::WinWindowFromID((HWND)GetHwnd(), SHORT1FROMMP(wParam));
+ wxWindowOS2* pWin = wxFindWinFromHandle(hWnd);
+
+ if (!pWin)
+ {
+ bProcessed = FALSE;
+ break;
+ }
+ //
+ // Simulate a WM_COMMAND here, as wxWidgets expects all control
+ // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
+ //
+ if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
+ {
+ wxRadioBox* pRadioBox = wxDynamicCast(pWin, wxRadioBox);
+
+ pRadioBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXUINT)SHORT1FROMMP(wParam)
+ );
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxRadioButton)))
+ {
+ wxRadioButton* pRadioButton = wxDynamicCast(pWin, wxRadioButton);
+
+ pRadioButton->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXUINT)SHORT1FROMMP(wParam)
+ );
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxCheckBox)))
+ {
+ wxCheckBox* pCheckBox = wxDynamicCast(pWin, wxCheckBox);
+
+ pCheckBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXUINT)SHORT1FROMMP(wParam)
+ );
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxListBox)))
+ {
+ wxListBox* pListBox = wxDynamicCast(pWin, wxListBox);
+
+ pListBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXUINT)SHORT1FROMMP(wParam)
+ );
+ if (pListBox->GetWindowStyle() & wxLB_OWNERDRAW)
+ Refresh();
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxComboBox)))
+ {
+ wxComboBox* pComboBox = wxDynamicCast(pWin, wxComboBox);
+
+ pComboBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXUINT)SHORT1FROMMP(wParam)
+ );
+ }
+ return 0;
+ }
+ break;
+
+ case LN_ENTER: /* dups as CBN_EFCHANGE */
+ {
+ HWND hWnd = HWNDFROMMP(lParam);
+ wxWindowOS2* pWin = wxFindWinFromHandle(hWnd);
+
+ if (!pWin)
+ {
+ bProcessed = FALSE;
+ break;
+ }
+ //
+ // Simulate a WM_COMMAND here, as wxWidgets expects all control
+ // button clicks to generate WM_COMMAND msgs, not WM_CONTROL
+ //
+ if (pWin->IsKindOf(CLASSINFO(wxListBox)))
+ {
+ wxListBox* pListBox = wxDynamicCast(pWin, wxListBox);
+
+ pListBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXUINT)SHORT1FROMMP(wParam)
+ );
+ if (pListBox->GetWindowStyle() & wxLB_OWNERDRAW)
+ Refresh();
+
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxComboBox)))
+ {
+ wxComboBox* pComboBox = wxDynamicCast(pWin, wxComboBox);
+
+ pComboBox->OS2Command( (WXUINT)SHORT2FROMMP(wParam)
+ ,(WXUINT)SHORT1FROMMP(wParam)
+ );
+ }
+ return 0;
+ }
+ break;
+
case SPBN_UPARROW:
case SPBN_DOWNARROW:
case SPBN_CHANGE:
if ( bProcessed )
{
// we never set focus from here
- mResult = FALSE;
+ mResult = (MRESULT)FALSE;
}
break;
return mResult;
} // end of wxWindowOS2::OS2WindowProc
-#ifndef __EMX__
-// clashes with wxDlgProc in toplevel.cpp?
-//
-// Dialog window proc
-//
-MRESULT wxDlgProc(
- HWND WXUNUSED(hWnd)
-, UINT uMsg
-, MPARAM WXUNUSED(wParam)
-, MPARAM WXUNUSED(lParam))
-{
- if (uMsg == WM_INITDLG)
- {
- //
- // For this message, returning TRUE tells system to set focus to the
- // first control in the dialog box
- //
- return (MRESULT)TRUE;
- }
- else
- {
- //
- // For all the other ones, FALSE means that we didn't process the
- // message
- //
- return (MRESULT)0;
- }
-} // end of wxDlgProc
-#endif
-
wxWindow* wxFindWinFromHandle(
WXHWND hWnd
)
if (!pNode)
return NULL;
- return (wxWindow *)pNode->Data();
+ return (wxWindow *)pNode->GetData();
} // end of wxFindWinFromHandle
void wxAssociateWinWithHandle(
int nY = 0L;
int nWidth = 0L;
int nHeight = 0L;
- wxWindow* pParent = GetParent();
- HWND hWnd = NULLHANDLE;
- HWND hParent;
long lControlId = 0L;
wxWindowCreationHook vHook(this);
wxString sClassName((wxChar*)zClass);
// which is the same but without CS_[HV]REDRAW class styles so using it
// ensures that the window is not fully repainted on each resize
//
- if (GetWindowStyleFlag() & wxNO_FULL_REPAINT_ON_RESIZE)
+ if (!HasFlag(wxFULL_REPAINT_ON_RESIZE))
{
sClassName += wxT("NR");
}
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
- wxLogError("Error creating frame. Error: %s\n", sError);
+ wxLogError("Error creating frame. Error: %s\n", sError.c_str());
return FALSE;
}
SetSize( nX
bool wxWindowOS2::HandleDestroy()
{
wxWindowDestroyEvent vEvent((wxWindow*)this);
-
+ vEvent.SetId(GetId());
(void)GetEventHandler()->ProcessEvent(vEvent);
//
#if wxUSE_DRAG_AND_DROP
if (m_dropTarget != NULL)
{
- m_dropTarget->Revoke(m_hWnd);
delete m_dropTarget;
m_dropTarget = NULL;
}
} // end of wxWindowOS2::HandleSetFocus
bool wxWindowOS2::HandleKillFocus(
- WXHWND WXUNUSED(hWnd)
+ WXHWND hWnd
)
{
#if wxUSE_CARET
}
#endif // wxUSE_CARET
+#if wxUSE_TEXTCTRL
+ //
+ // If it's a wxTextCtrl don't send the event as it will be done
+ // after the control gets to process it.
+ //
+ wxTextCtrl* pCtrl = wxDynamicCastThis(wxTextCtrl);
+
+ if (pCtrl)
+ {
+ return FALSE;
+ }
+#endif
+
+ //
+ // Don't send the event when in the process of being deleted. This can
+ // only cause problems if the event handler tries to access the object.
+ //
+ if ( m_isBeingDeleted )
+ {
+ return FALSE;
+ }
+
wxFocusEvent vEvent( wxEVT_KILL_FOCUS
,m_windowId
);
vEvent.SetEventObject(this);
+
+ //
+ // wxFindWinFromHandle() may return NULL, it is ok
+ //
+ vEvent.SetWindow(wxFindWinFromHandle(hWnd));
return GetEventHandler()->ProcessEvent(vEvent);
} // end of wxWindowOS2::HandleKillFocus
);
vDc.SetHPS(pMeasureStruct->hps);
//
- // Load the wxWindows Pallete and set to RGB mode
+ // Load the wxWidgets Pallete and set to RGB mode
//
if (!::GpiCreateLogColorTable( pMeasureStruct->hps
,0L
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
- wxLogError("Unable to set current color table. Error: %s\n", sError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError.c_str());
}
//
// Set the color table to RGB mode
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
- wxLogError("Unable to set current color table. Error: %s\n", sError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError.c_str());
}
wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
return FALSE;
} // end of wxWindowOS2::OS2OnDrawItem
-bool wxWindowOS2::OS2OnMeasureItem(
+long wxWindowOS2::OS2OnMeasureItem(
int lId
, WXMEASUREITEMSTRUCT* pItemStruct
)
,&nHeight
))
{
+ MRESULT mRc;
+
pMeasureStruct->rclItem.xRight = nWidth;
pMeasureStruct->rclItem.xLeft = 0L;
pMeasureStruct->rclItem.yTop = nHeight;
pMeasureStruct->rclItem.yBottom = 0L;
- return TRUE;
+ mRc = MRFROM2SHORT(nHeight, nWidth);
+ return LONGFROMMR(mRc);
}
- return FALSE;
+ return 0L;
}
}
wxWindow* pItem = FindItem(lId);
if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
{
- return ((wxControl *)pItem)->OS2OnMeasure(pItemStruct);
+ OWNERITEM vItem;
+
+ vItem.idItem = (LONG)pItemStruct;
+ return ((wxControl *)pItem)->OS2OnMeasure((WXMEASUREITEMSTRUCT*)&vItem);
}
#else
lId = lId;
wxSysColourChangedEvent& rEvent
)
{
- wxNode* pNode = GetChildren().First();
+ wxWindowListNode* pNode = GetChildren().GetFirst();
while (pNode)
{
//
// Only propagate to non-top-level windows
//
- wxWindow* pWin = (wxWindow *)pNode->Data();
+ wxWindow* pWin = (wxWindow *)pNode->GetData();
if (pWin->GetParent())
{
rEvent.m_eventObject = pWin;
pWin->GetEventHandler()->ProcessEvent(vEvent);
}
- pNode = pNode->Next();
+ pNode = pNode->GetNext();
}
} // end of wxWindowOS2::OnSysColourChanged
// painting
// ---------------------------------------------------------------------------
+void wxWindow::OnPaint (
+ wxPaintEvent& rEvent
+)
+{
+ HDC hDC = (HDC)wxPaintDC::FindDCInCache((wxWindow*) rEvent.GetEventObject());
+
+ if (hDC != 0)
+ {
+ OS2DefWindowProc( (WXUINT)WM_PAINT
+ ,(WXWPARAM)hDC
+ ,(WXLPARAM)0
+ );
+ }
+} // end of wxWindow::OnPaint
+
bool wxWindowOS2::HandlePaint()
{
HRGN hRgn;
wxPaintEvent vEvent(m_windowId);
HPS hPS;
- RECTL vRect;
bool bProcessed;
// Create empty region
{
//
// OS/2 needs to process this right here, not by the default proc
- // Window's default proc correctly paints everything, OS/2 does not!
+ // Window's default proc correctly paints everything, OS/2 does not.
+ // For decorative panels that typically have no children, we draw
+ // borders.
//
HPS hPS;
RECTL vRect;
- wxFrame* pFrame;
- wxWindow* pParent;
hPS = ::WinBeginPaint( GetHwnd()
,NULLHANDLE
,0L
,NULL
);
-
- ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel());
+ if (::WinIsWindowVisible(GetHWND()))
+ ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel());
if (m_dwExStyle)
{
- LINEBUNDLE vLineBundle;
+ LINEBUNDLE vLineBundle;
vLineBundle.lColor = 0x00000000; // Black
vLineBundle.usMixMode = FM_OVERPAINT;
,m_dwExStyle
);
}
- ::WinEndPaint(hPS);
}
+ ::WinEndPaint(hPS);
bProcessed = TRUE;
}
+ else if (!bProcessed &&
+ IsKindOf(CLASSINFO(wxPanel))
+ )
+ {
+ //
+ // Panel with children, usually fills a frame client so no borders.
+ //
+ HPS hPS;
+ RECTL vRect;
+
+ 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
+ );
+ if (::WinIsWindowVisible(GetHWND()))
+ ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel());
+ }
+ ::WinEndPaint(hPS);
+ bProcessed = TRUE;
+ }
return bProcessed;
} // end of wxWindowOS2::HandlePaint
PSWP pSwp
)
{
- bool bRc = FALSE;
POINTL vPoint;
switch(pSwp->fl)
, WXUINT uFlags
)
{
+ int nHeight;
+ DoGetSize(0, &nHeight);
rEvent.m_x = nX;
- rEvent.m_y = nY;
- rEvent.m_shiftDown = ((uFlags & VK_SHIFT) != 0);
- rEvent.m_controlDown = ((uFlags & VK_CTRL) != 0);
- rEvent.m_leftDown = ((uFlags & VK_BUTTON1) != 0);
- rEvent.m_middleDown = ((uFlags & VK_BUTTON3) != 0);
- rEvent.m_rightDown = ((uFlags & VK_BUTTON2) != 0);
+ // Convert to wxWidgets standard coordinate system!
+ rEvent.m_y = nHeight - nY;
+ 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.SetTimestamp(s_currentMsg.time);
rEvent.m_eventObject = this;
rEvent.SetId(GetId());
bProcessed = GetEventHandler()->ProcessEvent(vEvent);
if (!bProcessed)
{
- HPOINTER hPtr = ::WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE);
HPOINTER hCursor = (HPOINTER)GetCursor().GetHCURSOR();
if (hCursor != NULLHANDLE)
if (isASCII)
{
//
- // If 1 -> 26, translate to CTRL plus a letter.
+ // If 1 -> 26, translate to either special keycode or just set
+ // ctrlDown. IOW, Ctrl-C should result in keycode == 3 and
+ // ControlDown() == TRUE.
//
- vId = (int)wParam;
+ vId = SHORT1FROMMP(lParam);
if ((vId > 0) && (vId < 27))
{
switch (vId)
default:
bCtrlDown = TRUE;
- vId = vId + 'a' - 1;
+ break;
}
}
}
else // we're called from WM_KEYDOWN
{
- vId = wxCharCodeOS2ToWX((int)wParam);
+ vId = wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam));
if (vId == 0)
return FALSE;
}
, WXLPARAM lParam
)
{
- int nId = wxCharCodeOS2ToWX((int)wParam);
+ int nId = wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam));
if (!nId)
{
//
// Normal ASCII char
//
- nId = (int)wParam;
+ nId = SHORT1FROMMP(lParam);
}
if (nId != -1)
, WXLPARAM lParam
)
{
- int nId = wxCharCodeOS2ToWX((int)wParam);
+ int nId = wxCharCodeOS2ToWX((int)SHORT2FROMMP(lParam));
if (!nId)
{
int nDiff
)
{
- SWP vSwp;
-
- for (wxWindowList::Node* pNode = GetChildren().GetFirst();
- pNode;
- pNode = pNode->GetNext())
+ //
+ // We want to handle top levels ourself, manually
+ //
+ if (!IsTopLevel() && GetAutoLayout())
{
- wxWindow* pWin = pNode->GetData();
+ Layout();
+ }
+ else
+ {
+ SWP vSwp;
- ::WinQueryWindowPos( GetHwndOf(pWin)
- ,&vSwp
- );
- if (pWin->IsKindOf(CLASSINFO(wxControl)))
+ for (wxWindowList::Node* pNode = GetChildren().GetFirst();
+ pNode;
+ pNode = pNode->GetNext())
{
- wxControl* pCtrl;
+ wxWindow* pWin = pNode->GetData();
- //
- // 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(pWin, wxControl);
- vSwp.y -= pCtrl->GetYComp();
- vSwp.x -= pCtrl->GetXComp();
- }
- ::WinSetWindowPos( GetHwndOf(pWin)
- ,HWND_TOP
- ,vSwp.x
- ,vSwp.y - nDiff
- ,vSwp.cx
- ,vSwp.cy
- ,SWP_MOVE | SWP_SHOW | SWP_ZORDER
- );
- ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp());
- if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
- {
- wxRadioBox* pRadioBox;
-
- pRadioBox = wxDynamicCast(pWin, wxRadioBox);
- pRadioBox->AdjustButtons( (int)vSwp.x
- ,(int)vSwp.y - nDiff
- ,(int)vSwp.cx
- ,(int)vSwp.cy
- ,pRadioBox->GetSizeFlags()
- );
- }
- if (pWin->IsKindOf(CLASSINFO(wxSlider)))
- {
- wxSlider* pSlider;
-
- pSlider = wxDynamicCast(pWin, wxSlider);
- pSlider->AdjustSubControls( (int)vSwp.x
- ,(int)vSwp.y - nDiff
- ,(int)vSwp.cx
- ,(int)vSwp.cy
- ,(int)pSlider->GetSizeFlags()
- );
+ ::WinQueryWindowPos( GetHwndOf(pWin)
+ ,&vSwp
+ );
+ if (pWin->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(pWin, wxControl);
+ vSwp.y -= pCtrl->GetYComp();
+ vSwp.x -= pCtrl->GetXComp();
+ }
+ ::WinSetWindowPos( GetHwndOf(pWin)
+ ,HWND_TOP
+ ,vSwp.x
+ ,vSwp.y - nDiff
+ ,vSwp.cx
+ ,vSwp.cy
+ ,SWP_MOVE | SWP_SHOW | SWP_ZORDER
+ );
+ ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp());
+ if (pWin->IsKindOf(CLASSINFO(wxRadioBox)))
+ {
+ wxRadioBox* pRadioBox;
+
+ pRadioBox = wxDynamicCast(pWin, wxRadioBox);
+ pRadioBox->AdjustButtons( (int)vSwp.x
+ ,(int)vSwp.y - nDiff
+ ,(int)vSwp.cx
+ ,(int)vSwp.cy
+ ,pRadioBox->GetSizeFlags()
+ );
+ }
+ if (pWin->IsKindOf(CLASSINFO(wxSlider)))
+ {
+ wxSlider* pSlider;
+
+ pSlider = wxDynamicCast(pWin, wxSlider);
+ pSlider->AdjustSubControls( (int)vSwp.x
+ ,(int)vSwp.y - nDiff
+ ,(int)vSwp.cx
+ ,(int)vSwp.cy
+ ,(int)pSlider->GetSizeFlags()
+ );
+ }
}
}
Refresh();
//
// Getting the Y position for a window, like a control, is a real
// pain. There are three sitatuions we must deal with in determining
-// the OS2 to wxWindows Y coordinate.
+// the OS2 to wxWidgets Y coordinate.
//
// 1) The controls are created in a dialog.
// This is the easiest since a dialog is created with its original
wxWindowOS2* pParent
)
{
- wxWindowOS2* pGrandParent = NULL;
-
//
// Case 1
//
// Beginning of user defined messages
case 0x1000: return "WM_USER";
- // wxWindows user defined types
+ // wxWidgets user defined types
// listview
// case 0x1000 + 0: return "LVM_GETBKCOLOR";
POINTL vPoint;
BOOL rcEnabled = FALSE;
BOOL rcVisible = FALSE;
- HWND hWndDesktop = HWND_DESKTOP;
::WinQueryPointerPos(HWND_DESKTOP, &vPoint);
hWndUnderMouse = ::WinWindowFromPoint(HWND_DESKTOP, &vPoint, TRUE);
if (pWinUnderMouse)
{
wxWindowList::Node* pCurrent = pWinUnderMouse->GetChildren().GetFirst();
- wxWindow* pChild = NULL;
wxWindow* pGrandChild = NULL;
RECTL vRect;
POINTL vPoint2;