//
// wxWnd
//
- m_hMenu = 0;
- m_hWnd = 0;
+ m_hMenu = 0L;
+ m_hWnd = 0L;
+ m_hWndScrollBarHorz = 0L;
+ m_hWndScrollBarVert = 0L;
//
// Pass WM_GETDLGCODE to DefWindowProc()
)
{
HWND hParent = NULLHANDLE;
+ wxPoint vPos = rPos; // The OS/2 position
wxCHECK_MSG(pParent, FALSE, wxT("can't create wxWindow without parent"));
{
pParent->AddChild(this);
hParent = GetWinHwnd(pParent);
+ //
+ // OS2 uses normal coordinates, no bassackwards Windows ones
+ //
+ vPos.y = pParent->GetSize().y - (vPos.y + rSize.y);
}
else
- hParent = HWND_DESKTOP;
+ {
+ RECTL vRect;
+
+ ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
+ hParent = HWND_DESKTOP;
+ vPos.y = vRect.yTop - (vPos.y + rSize.y);
+ }
ULONG ulCreateFlags = 0L;
,(PSZ)wxCanvasClassName
,rName.c_str()
,ulCreateFlags
- ,rPos.x
- ,rPos.y
+ ,vPos.x
+ ,vPos.y
,WidthDefault(rSize.x)
,HeightDefault(rSize.y)
,NULLHANDLE
, bool bRefresh
)
{
- ::WinSendMsg(GetHwnd(), SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, nRange));
- if (nOrient == wxHORIZONTAL)
+ int nOldRange = nRange - nThumbVisible;
+ int nRange1 = nOldRange;
+ int nPageSize = nThumbVisible;
+ SBCDATA vInfo;
+ HWND hWnd = GetHwnd();
+ ULONG ulStyle = WS_VISIBLE;
+ RECTL vRect;
+
+ ::WinQueryWindowRect(hWnd, &vRect);
+ if (nPageSize > 1 && nRange > 0)
{
- m_nXThumbSize = nThumbVisible;
+ nRange1 += (nPageSize - 1);
+ }
+
+ vInfo.cb = sizeof(SBCDATA);
+ vInfo.posFirst = 0;
+ vInfo.posLast = (SHORT)nRange1;
+ vInfo.posThumb = nPos;
+
+ if (nOrient == wxHORIZONTAL )
+ {
+ ulStyle |= SBS_HORZ;
+ if (m_hWndScrollBarHorz == 0L)
+ {
+ m_hWndScrollBarHorz = ::WinCreateWindow( hWnd
+ ,WC_SCROLLBAR
+ ,(PSZ)NULL
+ ,ulStyle
+ ,vRect.xLeft
+ ,vRect.yBottom
+ ,vRect.xRight - vRect.xLeft
+ ,20
+ ,hWnd
+ ,HWND_TOP
+ ,-1
+ ,&vInfo
+ ,NULL
+ );
+ }
+ 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.
+ //
+ ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect2);
+ if (!(vRect2.xLeft == vRect.xLeft &&
+ vRect2.xRight == vRect.xRight &&
+ vRect2.yBottom == vRect.yBottom &&
+ vRect2.yTop == vRect.yTop
+ ) )
+ {
+ ::WinSetWindowPos( m_hWndScrollBarHorz
+ ,HWND_TOP
+ ,vRect.xLeft
+ ,vRect.yBottom
+ ,vRect.xRight - vRect.xLeft
+ ,20
+ ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
+ );
+ }
+ ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1));
+ ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
+ }
}
else
{
+ ulStyle |= SBS_VERT;
+ if (m_hWndScrollBarVert == 0L)
+ {
+ m_hWndScrollBarVert = ::WinCreateWindow( hWnd
+ ,WC_SCROLLBAR
+ ,(PSZ)NULL
+ ,ulStyle
+ ,vRect.xRight - 20
+ ,vRect.yBottom
+ ,20
+ ,vRect.yTop - vRect.yBottom
+ ,hWnd
+ ,HWND_TOP
+ ,-1
+ ,&vInfo
+ ,NULL
+ );
+ }
+ 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.
+ //
+ ::WinQueryWindowRect(m_hWndScrollBarVert, &vRect2);
+ if (!(vRect2.xLeft == vRect.xLeft &&
+ vRect2.xRight == vRect.xRight &&
+ vRect2.yBottom == vRect.yBottom &&
+ vRect2.yTop == vRect.yTop
+ ) )
+ {
+ ::WinSetWindowPos( m_hWndScrollBarVert
+ ,HWND_TOP
+ ,vRect.xRight - 20
+ ,vRect.yBottom
+ ,20
+ ,vRect.yTop - vRect.yBottom
+ ,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);
+ }
m_nYThumbSize = nThumbVisible;
}
} // end of wxWindow::SetScrollbar
case WM_DRAWITEM:
case WM_MEASUREITEM:
{
- int idCtrl = (UINT)wParam;
+ int nIdCtrl = (UINT)wParam;
+
if ( uMsg == WM_DRAWITEM )
{
- bProcessed = OS2OnDrawItem(idCtrl,
+ bProcessed = OS2OnDrawItem(nIdCtrl,
(WXDRAWITEMSTRUCT *)lParam);
}
else
{
- bProcessed = OS2OnMeasureItem(idCtrl,
+ bProcessed = OS2OnMeasureItem(nIdCtrl,
(WXMEASUREITEMSTRUCT *)lParam);
}
{
wxDC vDc;
+#if wxUSE_OWNER_DRAWN
//
// Is it a menu item?
//
if (vId == 0)
{
-
-#if wxUSE_OWNER_DRAWN
+ ERRORID vError;
+ wxString sError;
POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
- wxMenuItem vMenuItem;
+ wxFrame* pFrame = (wxFrame*)this;
+ wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
HDC hDC = ::GpiQueryDevice(pMeasureStruct->hps);
-
+ wxRect vRect( pMeasureStruct->rclItem.xLeft
+ ,pMeasureStruct->rclItem.yBottom
+ ,pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft
+ ,pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom
+ );
vDc.SetHDC( hDC
,FALSE
);
vDc.SetHPS(pMeasureStruct->hps);
-
//
- // We stored the CMenuItem itself into the menuitem text field so now
- // we need to extract it.
+ // Load the wxWindows Pallete and set to RGB mode
//
- ::WinSendMsg( pMeasureStruct->hItem
- ,MM_QUERYITEMTEXT
- ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem
- ,(SHORT)(sizeof(wxMenuItem))
- )
- ,(PSZ)&vMenuItem
- );
+ if (!::GpiCreateLogColorTable( pMeasureStruct->hps
+ ,0L
+ ,LCOLF_CONSECRGB
+ ,0L
+ ,(LONG)wxTheColourDatabase->m_nSize
+ ,(PLONG)wxTheColourDatabase->m_palTable
+ ))
+ {
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError);
+ }
+ //
+ // Set the color table to RGB mode
+ //
+ if (!::GpiCreateLogColorTable( pMeasureStruct->hps
+ ,0L
+ ,LCOLF_RGB
+ ,0L
+ ,0L
+ ,NULL
+ ))
+ {
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError);
+ }
- wxRect vRect( pMeasureStruct->rclItem.xLeft
- ,pMeasureStruct->rclItem.yTop
- ,pMeasureStruct->rclItem.xRight
- ,pMeasureStruct->rclItem.yBottom
- );
+ wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
- wxOwnerDrawn::wxODAction eAction;
- //
- // Attribute applies to menuitems, fsState to listbox and other controls
- //
+ int eAction = 0;
+ int eStatus = 0;
+
if (pMeasureStruct->fsAttribute == pMeasureStruct->fsAttributeOld)
+ {
+ //
+ // Entire Item needs to be redrawn (either it has reappeared from
+ // behind another window or is being displayed for the first time
+ //
eAction = wxOwnerDrawn::wxODDrawAll;
- else
- eAction = wxOwnerDrawn::wxODSelectChanged;
- return(vMenuItem.OnDrawItem( vDc
- ,vRect
- ,eAction
- ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute
- ));
+ if (pMeasureStruct->fsAttribute & MIA_HILITED)
+ {
+ //
+ // If it is currently selected we let the system handle it
+ //
+ eStatus |= wxOwnerDrawn::wxODSelected;
+ }
+ if (pMeasureStruct->fsAttribute & MIA_CHECKED)
+ {
+ //
+ // If it is currently checked we draw our own
+ //
+ eStatus |= wxOwnerDrawn::wxODChecked;
+ pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_CHECKED;
+ }
+ if (pMeasureStruct->fsAttribute & MIA_DISABLED)
+ {
+ //
+ // If it is currently disabled we let the system handle it
+ //
+ eStatus |= wxOwnerDrawn::wxODDisabled;
+ }
+ //
+ // Don't really care about framed (indicationg focus) or NoDismiss
+ //
+ }
+ else
+ {
+ if (pMeasureStruct->fsAttribute & MIA_HILITED)
+ {
+ eAction = wxOwnerDrawn::wxODDrawAll;
+ eStatus |= wxOwnerDrawn::wxODSelected;
+ //
+ // Keep the system from trying to highlight with its bogus colors
+ //
+ pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_HILITED;
+ }
+ else if (!(pMeasureStruct->fsAttribute & MIA_HILITED))
+ {
+ eAction = wxOwnerDrawn::wxODDrawAll;
+ eStatus = 0;
+ //
+ // Keep the system from trying to highlight with its bogus colors
+ //
+ pMeasureStruct->fsAttribute = pMeasureStruct->fsAttributeOld &= ~MIA_HILITED;
+ }
+ else
+ {
+ //
+ // For now we don't care about anything else
+ // just ignore the entire message!
+ //
+ return TRUE;
+ }
+ }
+ //
+ // Now redraw the item
+ //
+ return(pMenuItem->OnDrawItem( vDc
+ ,vRect
+ ,(wxOwnerDrawn::wxODAction)eAction
+ ,(wxOwnerDrawn::wxODStatus)eStatus
+ ));
//
// leave the fsAttribute and fsOldAttribute unchanged. If different,
// the system will do the highlight or fraeming or disabling for us,
//
// Is it a menu item?
//
- if (lId == 0)
+ if (lId == 65536) // I really don't like this...has to be a better indicator
{
- POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
- wxMenuItem vMenuItem;
-
- //
- // We stored the CMenuItem itself into the menuitem text field so now
- // we need to extract it.
- //
- ::WinSendMsg( pMeasureStruct->hItem
- ,MM_QUERYITEMTEXT
- ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem
- ,(SHORT)(sizeof(wxMenuItem))
- )
- ,(PSZ)&vMenuItem
- );
- wxCHECK(vMenuItem.IsKindOf(CLASSINFO(wxMenuItem)), FALSE);
-
- size_t lWidth = (size_t)(pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft);
- size_t lHeight = (size_t)(pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom);
-
- return(vMenuItem.OnMeasureItem( &lWidth
- ,&lHeight
- ));
+ if (IsKindOf(CLASSINFO(wxFrame))) // we'll assume if Frame then a menu
+ {
+ size_t nWidth;
+ size_t nHeight;
+ POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct;
+ wxFrame* pFrame = (wxFrame*)this;
+ wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
+
+ wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+ nWidth = 0L;
+ nHeight = 0L;
+ if (pMenuItem->OnMeasureItem( &nWidth
+ ,&nHeight
+ ))
+ {
+ pMeasureStruct->rclItem.xRight = nWidth;
+ pMeasureStruct->rclItem.xLeft = 0L;
+ pMeasureStruct->rclItem.yTop = nHeight;
+ pMeasureStruct->rclItem.yBottom = 0L;
+ return TRUE;
+ }
+ return FALSE;
+ }
}
- wxWindow* pItem = FindItem(id);
+ wxWindow* pItem = FindItem(lId);
if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
{