2007-02-14 00:15 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/contrib/libct/ctwfunc.c
  * harbour/contrib/libct/ctwin.c
  * harbour/contrib/libct/ctwin.h
    + added CTWIN compatible ALERT - it works in differ way then the
      standard Clipper one. In the moment when CTWIN is activated
      (it's enough to call any CTWIN function like WOPEN()/WBOARD(),...
      or CTWINIT()) standard ALERT() is replaced by CTWIN one build
      in inside CTWIN GT driver. It allocates separate window for ALERT
      box and makes differ formatting of passed text.
      TODO: add support for SET KEY blocks
This commit is contained in:
Przemyslaw Czerpak
2007-02-13 23:18:20 +00:00
parent 98d97eb695
commit 4aec3b34ad
4 changed files with 235 additions and 15 deletions

View File

@@ -8,6 +8,18 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2007-02-14 00:15 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/libct/ctwfunc.c
* harbour/contrib/libct/ctwin.c
* harbour/contrib/libct/ctwin.h
+ added CTWIN compatible ALERT - it works in differ way then the
standard Clipper one. In the moment when CTWIN is activated
(it's enough to call any CTWIN function like WOPEN()/WBOARD(),...
or CTWINIT()) standard ALERT() is replaced by CTWIN one build
in inside CTWIN GT driver. It allocates separate window for ALERT
box and makes differ formatting of passed text.
TODO: add support for SET KEY blocks
2007-02-13 21:00 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/bin/hb-func.sh
* do not pass linking parameters to GCC/G++ when is used for

View File

@@ -130,11 +130,12 @@ HB_FUNC( WBOARD )
HB_FUNC( WOPEN )
{
int iResult;
int iResult, iColor;
iColor = ISCHAR( 6 ) ? hb_gtColorToN( hb_parc( 6 ) ) : hb_parni( 6 );
iResult = hb_ctw_CreateWindow( hb_parni( 1 ), hb_parni( 2 ),
hb_parni( 3 ), hb_parni( 4 ),
hb_parl( 5 ) );
hb_parl( 5 ), iColor );
hb_gt_Flush();
hb_retni( iResult );
}
@@ -198,7 +199,7 @@ HB_FUNC( WBOX )
"ÛÛÛÛÛÛÛÛ" }; /* 15 WB_FULL */
BYTE * szBox, szBoxBuf[ 10 ];
int iResult;
int iResult, iColor;
if( ISCHAR( 1 ) )
{
@@ -219,7 +220,8 @@ HB_FUNC( WBOX )
szBox = szBoxBuf;
}
iResult = hb_ctw_AddWindowBox( hb_ctw_CurrentWindow(), szBox );
iColor = ISCHAR( 2 ) ? hb_gtColorToN( hb_parc( 2 ) ) : hb_parni( 2 );
iResult = hb_ctw_AddWindowBox( hb_ctw_CurrentWindow(), szBox, iColor );
hb_gt_Flush();
hb_retni( iResult );
}

View File

@@ -404,15 +404,15 @@ int hb_ctw_MaxWindow( void )
return iMaxHandle;
}
int hb_ctw_CreateWindow( int iTop, int iLeft, int iBottom, int iRight, BOOL fClear )
int hb_ctw_CreateWindow( int iTop, int iLeft, int iBottom, int iRight, BOOL fClear, int iColor )
{
PHB_CT_WND pWnd;
BYTE bColor, bAttr;
BYTE bAttr, bColor;
USHORT usChar;
int iRow, iCol, iHeight, iWidth, iTmp;
long lIndex;
HB_TRACE(HB_TR_DEBUG, ( "hb_ctw_CreateWindow(%d,%d,%d,%d,%d)", iTop, iLeft, iBottom, iRight, (int) fClear));
HB_TRACE(HB_TR_DEBUG, ( "hb_ctw_CreateWindow(%d,%d,%d,%d,%d,%d)", iTop, iLeft, iBottom, iRight, (int) fClear, iColor));
if( s_iOpenWindows == s_iMaxWindow )
{
@@ -503,9 +503,9 @@ int hb_ctw_CreateWindow( int iTop, int iLeft, int iBottom, int iRight, BOOL fCle
if( pWnd->iShadowAttr >= 0 )
fClear = TRUE;
usChar = ( USHORT ) hb_gt_GetClearChar();
bColor = ( BYTE ) hb_gt_GetColor();
bAttr = 0;
bColor = iColor ? iColor : hb_gt_GetColor();
usChar = ( USHORT ) hb_gt_GetClearChar();
lIndex = 0;
for( iRow = pWnd->iFirstRow; iRow < pWnd->iFirstRow + pWnd->iHeight; ++iRow )
@@ -796,16 +796,20 @@ int hb_ctw_GetFormatCords( int iWindow, BOOL fRelative, int * piTop, int * piLef
/* ********************************************************************** */
int hb_ctw_AddWindowBox( int iWindow, BYTE * szBox )
int hb_ctw_AddWindowBox( int iWindow, BYTE * szBox, int iColor )
{
int iMaxRow, iMaxCol;
HB_TRACE(HB_TR_DEBUG, ( "hb_ctw_AddWindowBox(%d,%p,%d)", iWindow, szBox, iColor));
iMaxRow = hb_gt_MaxRow();
iMaxCol = hb_gtMaxCol();
if( iMaxRow > 1 && iMaxCol > 1 )
{
hb_gt_Box( 0, 0, iMaxRow, iMaxCol, szBox, ( BYTE ) hb_gt_GetColor() );
if( iColor == 0 )
iColor = hb_gt_GetColor();
hb_gt_Box( 0, 0, iMaxRow, iMaxCol, szBox, iColor );
if( iWindow > 0 && iWindow <= s_iOpenWindows &&
s_windows[ iWindow ] != NULL )
{
@@ -864,7 +868,8 @@ static int hb_ctw_MouseRow( void )
iRow = HB_GTSUPER_MOUSEROW();
if( s_iCurrWindow > 0 )
iRow -= s_windows[ s_iCurrWindow ]->iFirstRow;
iRow -= s_windows[ s_iCurrWindow ]->iFirstRow +
s_windows[ s_iCurrWindow ]->iTopMargin;
return iRow;
}
@@ -878,7 +883,8 @@ static int hb_ctw_MouseCol( void )
iCol = HB_GTSUPER_MOUSECOL();
if( s_iCurrWindow > 0 )
iCol -= s_windows[ s_iCurrWindow ]->iFirstCol;
iCol -= s_windows[ s_iCurrWindow ]->iFirstCol +
s_windows[ s_iCurrWindow ]->iLeftMargin;
return iCol;
}
@@ -1367,6 +1373,205 @@ static BOOL hb_ctw_gt_Info( int iType, PHB_GT_INFO pInfo )
return TRUE;
}
static int hb_ctw_gt_Alert( PHB_ITEM pMessage, PHB_ITEM pOptions,
int iClrNorm, int iClrHigh, double dDelay )
{
int iOptions, iRet = 0;
HB_TRACE( HB_TR_DEBUG, ( "hb_ctw_gt_Alert(%p,%p,%d,%d,%f)", pMessage, pOptions, iClrNorm, iClrHigh, dDelay ) );
iOptions = ( int ) hb_arrayLen( pOptions );
if( HB_IS_STRING( pMessage ) && iOptions > 0 )
{
int iRows, iCols;
BOOL fScreen;
hb_gt_GetSize( &iRows, &iCols );
if( iCols <= 4 || iRows <= 4 )
fScreen = FALSE;
else
{
HB_GT_INFO gtInfo;
gtInfo.pNewVal = gtInfo.pResult = NULL;
hb_gt_Info( GTI_FULLSCREEN, &gtInfo );
fScreen = gtInfo.pResult && hb_itemGetL( gtInfo.pResult );
hb_gt_Info( GTI_KBDSUPPORT, &gtInfo );
if( gtInfo.pResult )
{
if( !hb_itemGetL( gtInfo.pResult ) )
fScreen = FALSE;
hb_itemRelease( gtInfo.pResult );
}
}
if( fScreen )
{
ULONG ulWidth = 0, ulCurrWidth = 0, ul = 0, ul2, ulMaxWidth, ulLast;
int iKey, iDspCount, iLines = 0, iTop, iLeft, iBottom, iRight,
iMnuCol, iPos, iClr, iWnd, i;
char * szMessage = hb_itemGetCPtr( pMessage );
ULONG ulLen = hb_itemGetCLen( pMessage );
ulMaxWidth = iCols - 4;
while( ul < ulLen )
{
if( szMessage[ ul ] == '\n' )
{
++iLines;
if( ulCurrWidth > ulWidth )
ulWidth = ulCurrWidth;
ulCurrWidth = 0;
}
else
++ulCurrWidth;
++ul;
}
if( ulCurrWidth )
++iLines;
if( ulCurrWidth > ulWidth )
ulWidth = ulCurrWidth;
ulCurrWidth = 0;
for( i = 1; i <= iOptions; ++i )
{
ulCurrWidth += hb_arrayGetCLen( pOptions, i ) + ( i > 1 ? 3 : 0 );
}
if( ulCurrWidth > ulWidth )
ulWidth = ulCurrWidth;
if( ulWidth > ulMaxWidth )
ulWidth = ulMaxWidth;
if( iRows < iLines + 4 )
iLines = iRows - 4;
iTop = ( iRows - iLines - 4 ) >> 1;
iLeft = ( iCols - ulWidth - 4 ) >> 1;
iBottom = iTop + iLines + 3;
iRight = iLeft + ulWidth + 3;
if( iClrNorm == 0 )
iClrNorm = 79;
if( iClrHigh == 0 )
iClrHigh = 31;
iDspCount = hb_gt_DispCount();
if( iDspCount == 0 )
hb_gt_DispBegin();
iWnd = hb_ctw_CreateWindow( iTop, iLeft, iBottom, iRight, TRUE, iClrNorm );
hb_ctw_AddWindowBox( iWnd, ( BYTE * ) _B_SINGLE, iClrNorm );
hb_gt_SetCursorStyle( SC_NONE );
ulLast = 0;
i = 0;
for( ul = 0; ul < ulLen; ++ul )
{
if( szMessage[ ul ] == '\n' )
{
if( ul > ulLast )
{
ul2 = ul - ulLast;
if( ul2 > ulWidth )
ul2 = ulWidth;
hb_gt_PutText( i, ( ( ulWidth - ul2 + 1 ) >> 1 ) + 1, iClrNorm,
( BYTE * ) szMessage + ulLast, ul2 );
}
ulLast = ul + 1;
if( ++i >= iLines )
break;
}
}
if( ul > ulLast && i < iLines )
{
ul2 = ul - ulLast;
if( ul2 > ulWidth )
ul2 = ulWidth;
hb_gt_PutText( i, ( ( ulWidth - ul2 + 1 ) >> 1 ) + 1, iClrNorm,
( BYTE * ) szMessage + ulLast, ul2 );
}
iPos = 1;
while( iRet == 0 )
{
hb_gt_DispBegin();
iMnuCol = ( ( ulWidth - ulCurrWidth ) >> 1 ) + 1;
for( i = 1; i <= iOptions; ++i )
{
iClr = i == iPos ? iClrHigh : iClrNorm;
ulLen = hb_arrayGetCLen( pOptions, i );
hb_gt_PutText( iLines + 1, iMnuCol, iClr,
( BYTE * ) hb_arrayGetCPtr( pOptions, i ), ulLen );
iMnuCol += ulLen + 3;
}
while( hb_gt_DispCount() )
hb_gt_DispEnd();
hb_gt_Refresh();
iKey = hb_inkey( TRUE, dDelay, INKEY_ALL );
/* TODO: add support for SET KEY blocks */
if( iKey == K_ESC )
break;
else if( iKey == K_ENTER || iKey == K_SPACE || iKey == 0 )
{
iRet = iPos;
}
else if( iKey == K_LEFT || iKey == K_SH_TAB )
{
if( --iPos == 0 )
iPos = iOptions;
dDelay = 0.0;
}
else if( iKey == K_RIGHT || iKey == K_TAB )
{
if( ++iPos > iOptions )
iPos = 1;
dDelay = 0.0;
}
#ifdef HB_COMPAT_C53
else if( iKey == K_LBUTTONDOWN )
{
int iMRow = hb_mouse_Row(), iMCol = hb_mouse_Col();
if( iMRow == iLines + 1 )
{
iMnuCol = ( ( ulWidth - ulCurrWidth ) >> 1 ) + 1;
for( i = 1; i <= iOptions; ++i )
{
ulLen = hb_arrayGetCLen( pOptions, i );
if( iMCol >= iMnuCol && iMCol < iMnuCol + ( int ) ulLen )
{
iRet = i;
break;
}
iMnuCol += ulLen + 3;
}
}
}
#endif
else if( iKey >= 32 && iKey <= 255 )
{
int iUp = hb_charUpper( iKey );
for( i = 1; i <= iOptions; ++i )
{
char *szValue = hb_arrayGetCPtr( pOptions, i );
if( szValue && iUp == hb_charUpper( *szValue ) )
{
iRet = i;
break;
}
}
}
}
hb_ctw_CloseWindow( iWnd );
hb_gt_Refresh();
while( hb_gt_DispCount() < iDspCount )
hb_gt_DispBegin();
return iRet;
}
}
return HB_GTSUPER_ALERT( pMessage, pOptions, iClrNorm, iClrHigh, dDelay );
}
static BOOL hb_gt_FuncInit( PHB_GT_FUNCS pFuncTable )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_FuncInit(%p)", pFuncTable));
@@ -1393,6 +1598,7 @@ static BOOL hb_gt_FuncInit( PHB_GT_FUNCS pFuncTable )
pFuncTable->PutChar = hb_ctw_gt_PutChar;
pFuncTable->Resize = hb_ctw_gt_Resize;
pFuncTable->Info = hb_ctw_gt_Info;
pFuncTable->Alert = hb_ctw_gt_Alert;
return TRUE;
}

View File

@@ -61,7 +61,7 @@ extern int hb_ctw_SetMoveMode( int iMode );
extern int hb_ctw_SetMoveStep( int iVertical, int iHorizontal );
extern int hb_ctw_SetWindowBoard( int iTop, int iLeft, int iBottom, int iRight );
extern int hb_ctw_SetBorderMode( int iTop, int iLeft, int iBottom, int iRight );
extern int hb_ctw_CreateWindow( int iTop, int iLeft, int iBottom, int iRight, BOOL fClear );
extern int hb_ctw_CreateWindow( int iTop, int iLeft, int iBottom, int iRight, BOOL fClear, int iColor );
extern int hb_ctw_CloseAllWindows( void );
extern int hb_ctw_CloseWindow( int iWindow );
extern int hb_ctw_CurrentWindow( void );
@@ -72,7 +72,7 @@ extern int hb_ctw_GetWindowCords( int iWindow, BOOL fCenter, int * piTop, int *
extern int hb_ctw_GetFormatCords( int iWindow, BOOL fRelative, int * piTop, int * piLeft, int * piBottom, int * piRight );
extern int hb_ctw_MoveWindow( int iWindow, int iRow, int iCol );
extern int hb_ctw_CenterWindow( int iWindow, BOOL fCenter );
extern int hb_ctw_AddWindowBox( int iWindow, BYTE * szBox );
extern int hb_ctw_AddWindowBox( int iWindow, BYTE * szBox, int iColor );
HB_EXTERN_END