diff --git a/harbour/ChangeLog b/harbour/ChangeLog index f4900a53a7..31214d29c0 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,15 @@ past entries belonging to these authors: Viktor Szakats. */ +2009-05-04 17:52 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + * harbour/contrib/gtwvg/gtwvg.h + * harbour/contrib/gtwvg/hbgtwvg.ch + * harbour/contrib/gtwvg/gtwvg.c + * harbour/contrib/gtwvg/wvgcore.c + * harbour/contrib/gtwvg/wvgcuig.c + * harbour/contrib/gtwvg/wvgcrt.prg + ! Fixed many artifacts. Probbaly it is difficult to jot down all. + 2009-05-05 03:10 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * utils/hbmk2/hbmk2.prg ! Minor fixes to texts. diff --git a/harbour/contrib/gtwvg/gtwvg.c b/harbour/contrib/gtwvg/gtwvg.c index 99623d8901..1cc7dd646d 100644 --- a/harbour/contrib/gtwvg/gtwvg.c +++ b/harbour/contrib/gtwvg/gtwvg.c @@ -222,9 +222,7 @@ static void hb_gt_wvt_Free( PHB_GTWVT pWVT ) int iIndex; HB_WVT_LOCK - s_wvtWindows[ pWVT->iHandle ] = NULL; - if( --s_wvtCount == 0 ) { hb_wvt_gtReleaseGuiData(); @@ -233,7 +231,6 @@ static void hb_gt_wvt_Free( PHB_GTWVT pWVT ) if( pWVT->hInstance ) UnregisterClass( s_szClassName, pWVT->hInstance ); } - HB_WVT_UNLOCK if( pWVT->pszSelectCopy ) @@ -298,6 +295,8 @@ static void hb_gt_wvt_Free( PHB_GTWVT pWVT ) if( pWVT->gObjs->hBrush ) if( pWVT->gObjs->bDestroyBrush ) DeleteObject( pWVT->gObjs->hBrush ); + if( pWVT->gObjs->bBlock ) + hb_itemRelease( pWVT->gObjs->bBlock ); #if ! defined( HB_OS_WIN_CE ) if( pWVT->gObjs->iPicture ) if( pWVT->gObjs->bDestroyPicture ) @@ -1043,9 +1042,11 @@ static void hb_gt_wvt_ResetWindowSize( PHB_GTWVT pWVT ) } } - SetWindowPos( pWVT->hWnd, NULL, wi.left, wi.top, width, height, SWP_NOZORDER ); - HB_GTSELF_EXPOSEAREA( pWVT->pGT, 0, 0, pWVT->ROWS, pWVT->COLS ); + { + int iAttr = SWP_DRAWFRAME | SWP_NOZORDER | SWP_DEFERERASE; + SetWindowPos( pWVT->hWnd, NULL, wi.left, wi.top, width, height, iAttr ); + } if( pWVT->CaretExist && !pWVT->CaretHidden ) hb_gt_wvt_UpdateCaret( pWVT ); @@ -1874,7 +1875,14 @@ static void hb_gt_wvt_PaintText( PHB_GTWVT pWVT, RECT updateRect ) static LRESULT CALLBACK hb_gt_wvt_WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { + #if 1 PHB_GTWVT pWVT = hb_gt_wvt_Find( hWnd ); + #else + /* + * The protocl below generates RT error somehwo at some other part of the code + */ + PHB_GTWVT pWVT = ( PHB_GTWVT ) GetWindowLongPtr( hWnd, GWL_USERDATA ); + #endif if( pWVT ) switch( message ) { @@ -2309,6 +2317,34 @@ static BOOL hb_gt_wvt_ValidWindowSize( HWND hWnd, int rows, int cols, HFONT hFon return ( width <= maxWidth ) && ( height <= maxHeight ); } +static void hb_gt_wvt_ShowWindow( PHB_GTWVT pWVT ) +{ + int iCmdShow; + + if( pWVT->pPP->bConfigured ) + { + iCmdShow = pWVT->pPP->bVisible ? SW_SHOWNORMAL : SW_HIDE; + } + else + { + /* + * If you wish to show window the way you want, put somewhere in your application + * ANNOUNCE HB_NOSTARTUPWINDOW + * If so compiled, then you need to issue Wvt_ShowWindow( SW_RESTORE ) + * at the point you desire in your code. + */ + if( hb_dynsymFind( "HB_NOSTARTUPWINDOW" ) != NULL ) + { + iCmdShow = SW_HIDE; + } + else + { + iCmdShow = SW_SHOWNORMAL; + } + } + ShowWindow( pWVT->hWnd, iCmdShow ); +} + static HWND hb_gt_wvt_CreateWindow( PHB_GTWVT pWVT, BOOL bResizable ) { HWND hWnd, hWndParent; @@ -2448,13 +2484,17 @@ static HWND hb_gt_wvt_CreateWindow( PHB_GTWVT pWVT, BOOL bResizable ) static BOOL hb_gt_wvt_CreateConsoleWindow( PHB_GTWVT pWVT ) { - int iCmdShow; - if( !pWVT->hWnd ) { pWVT->hWnd = hb_gt_wvt_CreateWindow( pWVT, pWVT->bResizable ); if( !pWVT->hWnd ) hb_errInternal( 10001, "Failed to create WVT window", NULL, NULL ); + + /* An experimental call - processed at WndProc to recognize pWVT off hWnd */ + #if 0 + SetWindowLongPtr( pWVT->hWnd, GWL_USERDATA, ( LONG_PTR ) pWVT ); + #endif + #if 0 if( ! GetSystemMetrics( SM_REMOTESESSION ) ) { @@ -2515,37 +2555,12 @@ static BOOL hb_gt_wvt_CreateConsoleWindow( PHB_GTWVT pWVT ) } } - /* Manage Windows Open Mode */ - { - if( pWVT->pPP->bConfigured ) - { - iCmdShow = pWVT->pPP->bVisible ? SW_SHOWNORMAL : SW_HIDE; - } - else - { - /* - * If you wish to show window the way you want, put somewhere in your application - * ANNOUNCE HB_NOSTARTUPWINDOW - * If so compiled, then you need to issue Wvt_ShowWindow( SW_RESTORE ) - * at the point you desire in your code. - */ - if( hb_dynsymFind( "HB_NOSTARTUPWINDOW" ) != NULL ) - { - iCmdShow = SW_HIDE; - } - else - { - iCmdShow = SW_SHOWNORMAL; - } - } - ShowWindow( pWVT->hWnd, iCmdShow ); - UpdateWindow( pWVT->hWnd ); - } + /* Show | Update Window */ + hb_gt_wvt_ShowWindow( pWVT ); /* Initialize GUI base */ { pWVT->hdc = GetDC( pWVT->hWnd ); - pWVT->hCompDC = CreateCompatibleDC( pWVT->hdc ); hb_wvt_gtInitGui( pWVT ); if( b_MouseEnable ) @@ -2582,6 +2597,7 @@ static void hb_gt_wvt_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_RESIZE( pGT, pWVT->ROWS, pWVT->COLS ); HB_GTSELF_SEMICOLD( pGT ); + /* hb_gt_wvt_CreateConsoleWindow( pWVT ); */ } @@ -3039,23 +3055,25 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) { if( ( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) ) { - /* HICON hIconToFree = ( pWVT->hIcon && pWVT->bIconToFree ) ? pWVT->hIcon : NULL; */ - HICON hIconToFree = pWVT->hIcon; LPTSTR lpImage; + HICON hIcon; lpImage = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) ); - pWVT->bIconToFree = TRUE; - pWVT->hIcon = ( HICON ) LoadImage( ( HINSTANCE ) NULL, lpImage, + hIcon = ( HICON ) LoadImage( ( HINSTANCE ) NULL, lpImage, IMAGE_ICON, 0, 0, LR_LOADFROMFILE ); HB_TCHAR_FREE( lpImage ); + if( hIcon ) + { + if( pWVT->hIcon ) + DestroyIcon( pWVT->hIcon ); + + pWVT->hIcon = hIcon; + } if( pWVT->hWnd ) { SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */ SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */ } - - if( hIconToFree ) - DestroyIcon( hIconToFree ); } pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) pWVT->hIcon ); break; @@ -3065,41 +3083,47 @@ static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) { if( hb_itemType( pInfo->pNewVal ) & HB_IT_STRING ) { - /* HICON hIconToFree = ( pWVT->hIcon && pWVT->bIconToFree ) ? pWVT->hIcon : NULL; */ - HICON hIconToFree = pWVT->hIcon; - LPTSTR lpIcon; + LPTSTR lpImage; + HICON hIcon; - lpIcon = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) ); - pWVT->bIconToFree = FALSE; - pWVT->hIcon = LoadIcon( pWVT->hInstance, lpIcon ); - HB_TCHAR_FREE( lpIcon ); + lpImage = HB_TCHAR_CONVTO( hb_itemGetCPtr( pInfo->pNewVal ) ); + hIcon = LoadIcon( pWVT->hInstance, lpImage ); + HB_TCHAR_FREE( lpImage ); + if( hIcon ) + { + if( pWVT->hIcon ) + DestroyIcon( pWVT->hIcon ); + + pWVT->hIcon = hIcon; + } if( pWVT->hWnd ) { SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */ SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */ } - - if( hIconToFree ) - DestroyIcon( hIconToFree ); } else if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) { - HICON hIconToFree = ( pWVT->hIcon && pWVT->bIconToFree ) ? pWVT->hIcon : NULL; - - pWVT->bIconToFree = FALSE; - pWVT->hIcon = LoadIcon( pWVT->hInstance, - MAKEINTRESOURCE( ( HB_LONG ) - hb_itemGetNInt( pInfo->pNewVal ) ) ); - - if( pWVT->hWnd ) + if( hb_itemGetNInt( pInfo->pNewVal ) != 0 ) { - SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */ - SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */ - } + HICON hIcon = LoadIcon( pWVT->hInstance, + MAKEINTRESOURCE( ( HB_LONG ) + hb_itemGetNInt( pInfo->pNewVal ) ) ); + if( hIcon ) + { + if( pWVT->hIcon ) + DestroyIcon( pWVT->hIcon ); - if( hIconToFree ) - DestroyIcon( hIconToFree ); + pWVT->hIcon = hIcon; + } + + if( pWVT->hWnd ) + { + SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_SMALL, ( LPARAM ) pWVT->hIcon ); /* Set Title Bar Icon */ + SendNotifyMessage( pWVT->hWnd, WM_SETICON, ICON_BIG , ( LPARAM ) pWVT->hIcon ); /* Set Task List Icon */ + } + } } pInfo->pResult = hb_itemPutNInt( pInfo->pResult, ( HB_PTRDIFF ) pWVT->hIcon ); break; @@ -3915,6 +3939,7 @@ static void hb_gt_wvt_Refresh( PHB_GT pGT ) pWVT = HB_GTWVT_GET( pGT ); if( pWVT ) { + #if 1 if( !pWVT->hWnd && pWVT->fInit ) hb_gt_wvt_CreateConsoleWindow( pWVT ); @@ -3923,6 +3948,18 @@ static void hb_gt_wvt_Refresh( PHB_GT pGT ) SendNotifyMessage( pWVT->hWnd, WM_MY_UPDATE_CARET, 0, 0 ); hb_gt_wvt_ProcessMessages( pWVT ); } + #else + if( pWVT->hWnd ) + { + if( !pWVT->fInit ) + { + pWVT->fInit = TRUE; + hb_gt_wvt_ShowWindow( pWVT ); + } + SendNotifyMessage( pWVT->hWnd, WM_MY_UPDATE_CARET, 0, 0 ); + hb_gt_wvt_ProcessMessages( pWVT ); + } + #endif } } @@ -4317,11 +4354,6 @@ static void hb_wvt_gtExitGui( PHB_GTWVT pWVT ) { DestroyWindow( pWVT->hWndTT ); } - if( pWVT->hCompDC ) - { - DeleteDC( pWVT->hCompDC ); - pWVT->hCompDC = NULL; - } if( pWVT->hGuiDC ) { DeleteDC( pWVT->hGuiDC ); diff --git a/harbour/contrib/gtwvg/gtwvg.h b/harbour/contrib/gtwvg/gtwvg.h index 9865ba5ebd..939ebafa18 100644 --- a/harbour/contrib/gtwvg/gtwvg.h +++ b/harbour/contrib/gtwvg/gtwvg.h @@ -79,6 +79,7 @@ #include #include #if ! defined( HB_OS_WIN_CE ) +#include #include #endif #include @@ -255,24 +256,6 @@ typedef struct int iRight ; } HB_GOBJ_OFFSET ; -#define GOBJ_OBJTYPE_BOXRAISED 1 -#define GOBJ_OBJTYPE_BOXRECESSED 2 -#define GOBJ_OBJTYPE_BOXGET 3 -#define GOBJ_OBJTYPE_BOXGROUP 4 -#define GOBJ_OBJTYPE_BOXGROUPRAISED 5 -#define GOBJ_OBJTYPE_PICTURE 6 -#define GOBJ_OBJTYPE_LINE 7 -#define GOBJ_OBJTYPE_LINEEX 8 -#define GOBJ_OBJTYPE_LABEL 9 -#define GOBJ_OBJTYPE_LABELEX 10 -#define GOBJ_OBJTYPE_OUTLINE 11 -#define GOBJ_OBJTYPE_ELLIPSE 12 -#define GOBJ_OBJTYPE_RECTANGLE 13 -#define GOBJ_OBJTYPE_ROUNDRECT 14 -#define GOBJ_OBJTYPE_COLORRECT 15 -#define GOBJ_OBJTYPE_SHADEDRECT 16 -#define GOBJ_OBJTYPE_TEXTBOX 17 -#define GOBJ_OBJTYPE_OUTLINEEX 18 typedef struct _tag_GOBJS { @@ -307,6 +290,7 @@ typedef struct _tag_GOBJS BOOL bDestroyPicture ; TRIVERTEX vert[ 2 ] ; LPTSTR lpText ; + PHB_ITEM bBlock ; struct _tag_GOBJS * gObjNext ; } HB_GOBJS, * PHB_GOBJS ; @@ -438,8 +422,6 @@ typedef struct int iFactor; /* Transparency factor 0~255 */ HDC hdc; /* Handle to Windows Device Context */ - HDC hCompDC; /* Compatible DC to _s.hdc */ - HDC hWndDC; int LastMenuEvent; /* Last menu item selected */ int MenuKeyEvent; /* User definable event number for windows menu command */ diff --git a/harbour/contrib/gtwvg/hbgtwvg.ch b/harbour/contrib/gtwvg/hbgtwvg.ch index 143780d8d8..0c2bc7f21b 100644 --- a/harbour/contrib/gtwvg/hbgtwvg.ch +++ b/harbour/contrib/gtwvg/hbgtwvg.ch @@ -161,6 +161,31 @@ #define GOBJ_IMAGESOURCE_RESOURCE 2 #define GOBJ_IMAGESOURCE_FILE 3 + +/* CUI-GUI Draw Objects */ +#define GOBJ_OBJTYPE_BOXRAISED 1 +#define GOBJ_OBJTYPE_BOXRECESSED 2 +#define GOBJ_OBJTYPE_BOXGET 3 +#define GOBJ_OBJTYPE_BOXGROUP 4 +#define GOBJ_OBJTYPE_BOXGROUPRAISED 5 +#define GOBJ_OBJTYPE_PICTURE 6 +#define GOBJ_OBJTYPE_LINE 7 +#define GOBJ_OBJTYPE_LINEEX 8 +#define GOBJ_OBJTYPE_LABEL 9 +#define GOBJ_OBJTYPE_LABELEX 10 +#define GOBJ_OBJTYPE_OUTLINE 11 +#define GOBJ_OBJTYPE_ELLIPSE 12 +#define GOBJ_OBJTYPE_RECTANGLE 13 +#define GOBJ_OBJTYPE_ROUNDRECT 14 +#define GOBJ_OBJTYPE_COLORRECT 15 +#define GOBJ_OBJTYPE_SHADEDRECT 16 +#define GOBJ_OBJTYPE_TEXTBOX 17 +#define GOBJ_OBJTYPE_OUTLINEEX 18 +#define GOBJ_OBJTYPE_GRIDVERT 19 +#define GOBJ_OBJTYPE_GRIDHORZ 20 + +#define GOBJ_OBJTYPE_OBJECT 25 /* One of the above objects */ + /*----------------------------------------------------------------------*/ #endif /* _HBGTWVG_CH */ diff --git a/harbour/contrib/gtwvg/wvgcore.c b/harbour/contrib/gtwvg/wvgcore.c index 2351f9f425..3a1b0ee78d 100644 --- a/harbour/contrib/gtwvg/wvgcore.c +++ b/harbour/contrib/gtwvg/wvgcore.c @@ -3124,17 +3124,12 @@ HB_FUNC( WVT_SAVESCREEN ) hBmp = CreateCompatibleBitmap( _s->hdc, iWidth, iHeight ) ; - #if 0 - oldBmp = (HBITMAP) SelectObject( _s->hCompDC, hBmp ); - BitBlt( _s->hCompDC, 0, 0, iWidth, iHeight, _s->hdc, iLeft, iTop, SRCCOPY ); - SelectObject( _s->hCompDC, oldBmp ); - #else hCompDC = CreateCompatibleDC( _s->hdc ); oldBmp = (HBITMAP) SelectObject( hCompDC, hBmp ); BitBlt( hCompDC, 0, 0, iWidth, iHeight, _s->hdc, iLeft, iTop, SRCCOPY ); SelectObject( hCompDC, oldBmp ); DeleteDC( hCompDC ); - #endif + hb_arraySetNI( info, 1, iWidth ); hb_arraySetNI( info, 2, iHeight ); hb_arraySetNInt( info, 3, ( HB_PTRDIFF ) hBmp ); @@ -3169,7 +3164,6 @@ HB_FUNC( WVT_RESTSCREEN ) iWidth = iRight - iLeft + 1 ; iHeight = iBottom - iTop + 1 ; - #if 1 hCompDC = CreateCompatibleDC( _s->hdc ); hBmp = (HBITMAP) SelectObject( hCompDC, ( HBITMAP ) ( HB_PTRDIFF ) hb_parnint( 5,3 ) ); if ( hBmp ) @@ -3200,52 +3194,12 @@ HB_FUNC( WVT_RESTSCREEN ) } } DeleteDC( hCompDC ); - #else - hBmp = (HBITMAP) SelectObject( _s->hCompDC, ( HBITMAP ) ( HB_PTRDIFF ) hb_parnint( 5,3 ) ); - if ( hBmp ) - { - if ( ( iWidth == hb_parni( 5,1 ) ) && ( iHeight == hb_parni( 5,2 ) ) ) - { - if ( BitBlt( _s->hdc, - iLeft, - iTop, - iWidth, - iHeight, - _s->hCompDC, - 0, - 0, - SRCCOPY ) ) - { - bResult = TRUE; - } - } - else - { - if ( StretchBlt( _s->hdc, - iLeft, - iTop, - iWidth, - iHeight, - _s->hCompDC, - 0, - 0, - hb_parni( 5,1 ), - hb_parni( 5,2 ), - SRCCOPY ) ) - { - bResult = TRUE; - } - } - } - #endif - - SelectObject( _s->hCompDC, hBmp ); if ( ! bDoNotDestroyBMP ) { + SelectObject( hCompDC, hBmp ); DeleteObject( ( HBITMAP ) ( HB_PTRDIFF ) hb_parnint( 5,3 ) ); } - hb_retl( bResult ); } diff --git a/harbour/contrib/gtwvg/wvgcrt.prg b/harbour/contrib/gtwvg/wvgcrt.prg index a3a2222c92..e8f6b2a855 100644 --- a/harbour/contrib/gtwvg/wvgcrt.prg +++ b/harbour/contrib/gtwvg/wvgcrt.prg @@ -406,11 +406,10 @@ METHOD destroy() CLASS WvgCrt ENDIF if ::lModal - ::pGT := NIL - hb_gtSelect( ::pGTp ) hb_gtInfo( HB_GTI_ENABLE , ::pGTp ) + hb_gtSelect( ::pGTp ) hb_gtInfo( HB_GTI_SETFOCUS, ::pGTp ) - endif + ENDIF ::pGT := NIL ::pGTp := NIL diff --git a/harbour/contrib/gtwvg/wvgcuig.c b/harbour/contrib/gtwvg/wvgcuig.c index 33bf4eaaf3..ea1802f87b 100644 --- a/harbour/contrib/gtwvg/wvgcuig.c +++ b/harbour/contrib/gtwvg/wvgcuig.c @@ -97,6 +97,7 @@ static PHB_GOBJS hb_wvg_ObjectNew( PHB_GTWVT pWVT ) gObj->iHandle = iHandle; gObj->iState = GOBJ_OBJSTATE_ENABLED; gObj->lpText = NULL; + gObj->bBlock = NULL; hb_retni( iHandle ); @@ -153,6 +154,8 @@ HB_FUNC( WVG_CLEARGUIOBJECTS ) if( pWVT->gObjs->hBrush ) if( pWVT->gObjs->bDestroyBrush ) DeleteObject( pWVT->gObjs->hBrush ); + if( pWVT->gObjs->bBlock ) + hb_itemRelease( pWVT->gObjs->bBlock ); #if ! defined( HB_OS_WIN_CE ) if( pWVT->gObjs->iPicture ) if( pWVT->gObjs->bDestroyPicture ) @@ -1434,23 +1437,191 @@ static void hb_wvg_RenderPicture( PHB_GTWVT pWVT, PHB_GOBJS gObj, int iLeft, int #endif } /*----------------------------------------------------------------------*/ +/* + Wvg_Object( nObj, bBlock ) + nObj == one of the objects == GOBJ_OBJTYPE_ROUNDRECT | GOBJ_OBJTYPE_IMAGE | etc + bBlock == Block returning the array conataining as many elements as necessary for the given object + Also it will return those array elements in the same order expected by the object to draw + + This protocol is necessary for dyanamic coordinates which might have been changed by the + applications, like TBrowse dimensions. + + Wvg_Object( GOBJ_OBJTYPE_BOXRAISED, {|| oBrw:nTop, oBrw:nLeft, oBrw:nBottom, oBrw:nRight, {-2,-2,2,2} } ) +*/ +HB_FUNC( WVG_OBJECT ) +{ + PHB_GTWVT pWVT = hb_wvt_gtGetWVT(); + HB_GOBJS *gObj = hb_wvg_ObjectNew( pWVT ); + + gObj->iObjType = GOBJ_OBJTYPE_OBJECT; + + gObj->iData = hb_parni( 1 ); /* Object to be executed */ + gObj->bBlock = hb_itemNew( hb_param( 2, HB_IT_BLOCK ) ); + + gObj->gObjNext = pWVT->gObjs; + pWVT->gObjs = gObj; +} +/*----------------------------------------------------------------------*/ +/* + * Wvg_Object( GOBJ_OBJTYPE_GRIDVERT, {|| { nTop, nBottom, aCols, nCols, aPxlOff } } ) + * aPxlOff[ 1 ] and aPxlOff[ 3 ] used + */ +static void hb_wvg_GridVert( PHB_GTWVT pWVT, PHB_ITEM pArray, RECT *uRect ) +{ + PHB_ITEM pCols = hb_arrayGetItemPtr( pArray, 3 ); + int iTabs = hb_arrayLen( pCols ); + + if( iTabs > 0 ) + { + int x, i, iTop, iBottom; + + iTop = ( hb_arrayGetNI( pArray, 1 ) * ( int ) pWVT->PTEXTSIZE.y ); + iBottom = ( ( hb_arrayGetNI( pArray, 2 ) + 1 ) * ( int ) pWVT->PTEXTSIZE.y ) - 1; + + if( ( iTop >= uRect->top && iTop <= uRect->bottom ) || + ( iBottom >= uRect->top && iBottom <= uRect->bottom ) ) + { + HDC hdc = pWVT->hGuiDC; + SelectObject( hdc, pWVT->currentPen ); + for ( i = 1; i <= iTabs; i++ ) + { + x = ( hb_arrayGetNI( pCols, i ) * pWVT->PTEXTSIZE.x ); + MoveToEx( hdc, x, iTop, NULL ); + LineTo( hdc, x, iBottom ); + } + + /* Play it on screen too directly as this area is not going to be revalidated + * we are not to invalidate this region as it is redrawn many many times. + * perhaps we can avoid drawing on the image ??? + */ + hdc = pWVT->hdc; + SelectObject( hdc, pWVT->currentPen ); + for ( i = 1; i <= iTabs; i++ ) + { + x = ( hb_arrayGetNI( pCols, i ) * pWVT->PTEXTSIZE.x ); + MoveToEx( hdc, x, iTop, NULL ); + LineTo( hdc, x, iBottom ); + } + } + } +} +/*----------------------------------------------------------------------*/ + +static void hb_wvg_GridHorz( PHB_GTWVT pWVT, PHB_ITEM pArray, RECT *uRect ) +{ + int iAtRow = hb_arrayGetNI( pArray, 1 ); + int iRows = hb_arrayGetNI( pArray, 4 ); + int i, y, iLeft, iRight, iTop, iBottom; + HDC hdc; + + iLeft = ( hb_arrayGetNI( pArray, 2 ) * pWVT->PTEXTSIZE.x ); + iRight = ( ( ( hb_arrayGetNI( pArray, 3 ) + 1 ) * pWVT->PTEXTSIZE.x ) - 1 ); + iTop = iAtRow * pWVT->PTEXTSIZE.y; + iBottom = ( iAtRow + iRows ) * pWVT->PTEXTSIZE.y; // do not add 1 + + if( ( uRect->left > iRight ) || ( uRect->top > iBottom ) || + ( uRect->bottom < iTop ) || ( uRect->right < iLeft ) ) + { + return; + } + + hdc = pWVT->hdc; + SelectObject( hdc, pWVT->currentPen ); + for ( i = 0; i < iRows; i++ ) + { + y = ( ( iAtRow ) * pWVT->PTEXTSIZE.y ); + MoveToEx( hdc, iLeft, y, NULL ); + LineTo( hdc, iRight, y ); + iAtRow++; + } + + hdc = pWVT->hGuiDC; + SelectObject( hdc, pWVT->currentPen ); + for ( i = 0; i < iRows; i++ ) + { + y = ( ( iAtRow ) * pWVT->PTEXTSIZE.y ); + MoveToEx( hdc, iLeft, y, NULL ); + LineTo( hdc, iRight, y ); + iAtRow++; + } +} +/*----------------------------------------------------------------------*/ /* Owner Draw Implementation */ /*----------------------------------------------------------------------*/ void hb_gt_wvt_PaintGObjects( PHB_GTWVT pWVT, RECT *uRect ) { PHB_GOBJS gObj = pWVT->gObjs; int iTop, iLeft, iBottom, iRight; + int iObjType; while( gObj ) { + iObjType = 0; + if( gObj->iState == GOBJ_OBJSTATE_ENABLED ) { - iTop = ( pWVT->PTEXTSIZE.y * gObj->iTop ) + gObj->aOffset.iTop; - iLeft = ( pWVT->PTEXTSIZE.x * gObj->iLeft ) + gObj->aOffset.iLeft; - iBottom = ( pWVT->PTEXTSIZE.y * ( gObj->iBottom + 1 ) ) - 1 + gObj->aOffset.iBottom; - iRight = ( pWVT->PTEXTSIZE.x * ( gObj->iRight + 1 ) ) - 1 + gObj->aOffset.iRight; + if( gObj->iObjType == GOBJ_OBJTYPE_OBJECT ) + { + if( hb_vmRequestReenter() ) + { + PHB_ITEM pArray; - switch( gObj->iObjType ) + hb_vmPushEvalSym(); + hb_vmPush( gObj->bBlock ); + hb_vmSend( 0 ); + + pArray = hb_param( -1, HB_IT_ARRAY ); + + if( pArray && hb_arrayLen( pArray ) >= 3 ) + { + iObjType = gObj->iData; + + if( iObjType == GOBJ_OBJTYPE_GRIDVERT ) + { + if( hb_arrayGetNI( pArray, 4 ) > 0 ) + { + hb_wvg_GridVert( pWVT, pArray, uRect ); + } + } + else if( iObjType == GOBJ_OBJTYPE_GRIDHORZ ) + { + hb_wvg_GridHorz( pWVT, pArray, uRect ); + } + else + { + /* Take care of offsets 5th element */ + iTop = ( pWVT->PTEXTSIZE.y * hb_arrayGetNI( pArray,1 ) ); + iLeft = ( pWVT->PTEXTSIZE.x * hb_arrayGetNI( pArray,2 ) ); + iBottom = ( pWVT->PTEXTSIZE.y * ( hb_arrayGetNI( pArray,3 ) + 1 ) ) - 1; + iRight = ( pWVT->PTEXTSIZE.x * ( hb_arrayGetNI( pArray,4 ) + 1 ) ) - 1; + } + } + else + { + iObjType = 0; + } + /* C A R E F U L */ + #if 0 + if( pArray ) + { + //hb_itemRelease( pArray ); + //pArray = NULL; + } + #endif + hb_vmRequestRestore(); + } + } + else + { + iObjType = gObj->iObjType; + + iTop = ( pWVT->PTEXTSIZE.y * gObj->iTop ) + gObj->aOffset.iTop; + iLeft = ( pWVT->PTEXTSIZE.x * gObj->iLeft ) + gObj->aOffset.iLeft; + iBottom = ( pWVT->PTEXTSIZE.y * ( gObj->iBottom + 1 ) ) - 1 + gObj->aOffset.iBottom; + iRight = ( pWVT->PTEXTSIZE.x * ( gObj->iRight + 1 ) ) - 1 + gObj->aOffset.iRight; + } + + switch( iObjType ) { case GOBJ_OBJTYPE_BOXRAISED: case GOBJ_OBJTYPE_BOXRECESSED: @@ -1472,7 +1643,7 @@ void hb_gt_wvt_PaintGObjects( PHB_GTWVT pWVT, RECT *uRect ) } else { - switch( gObj->iObjType ) + switch( iObjType ) { case GOBJ_OBJTYPE_BOXRAISED: hb_wvg_BoxRaised( pWVT, iLeft-1, iTop-1, iRight+1, iBottom+1 ); @@ -1511,7 +1682,7 @@ void hb_gt_wvt_PaintGObjects( PHB_GTWVT pWVT, RECT *uRect ) } else { - switch( gObj->iObjType ) + switch( iObjType ) { case GOBJ_OBJTYPE_LINE: