2007-04-17 20:00 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/source/rdd/dbcmd.c
    ! update NetErr() in ordListAdd()
      If you know other then dbCreate()/dbUseArea() functions which reset
      NetErr() flag in Clipper then please report them. We will have to
      update our functions (dbSetIndex() is a wrapper to ordListAdd() so
      you nay not report it ;))

  * harbour/source/rtl/gtstd/gtstd.c
    * do not stop Harbour process when controlling terminal has TOSTOP
      attribute set (as long as no direct out is done)

  * harbour/source/rtl/tclass.prg
  * harbour/source/rtl/terror.prg
  * harbour/source/rtl/tobject.prg
    * set valid class function

  * harbour/source/rtl/tmenuitm.prg
  * harbour/source/rtl/tpopup.prg
    ! I think that no one has been checking what these code does for
      very long time. Both MenuItem() and PopUp() on each call tries
      to create new _CLASSES_ called "MenuItem" and "PopUpMenu"
      instead of creating only new instance of these classes (new objects)
      Updated to use standard hbclass.ch commands. If possible try
      to not create classes manually and always use documented commands
      from hbclass.ch
This commit is contained in:
Przemyslaw Czerpak
2007-04-17 18:01:15 +00:00
parent ffcd948d35
commit 5fdd83dc27
8 changed files with 203 additions and 166 deletions

View File

@@ -8,6 +8,33 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2007-04-17 20:00 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/rdd/dbcmd.c
! update NetErr() in ordListAdd()
If you know other then dbCreate()/dbUseArea() functions which reset
NetErr() flag in Clipper then please report them. We will have to
update our functions (dbSetIndex() is a wrapper to ordListAdd() so
you nay not report it ;))
* harbour/source/rtl/gtstd/gtstd.c
* do not stop Harbour process when controlling terminal has TOSTOP
attribute set (as long as no direct out is done)
* harbour/source/rtl/tclass.prg
* harbour/source/rtl/terror.prg
* harbour/source/rtl/tobject.prg
* set valid class function
* harbour/source/rtl/tmenuitm.prg
* harbour/source/rtl/tpopup.prg
! I think that no one has been checking what these code does for
very long time. Both MenuItem() and PopUp() on each call tries
to create new _CLASSES_ called "MenuItem" and "PopUpMenu"
instead of creating only new instance of these classes (new objects)
Updated to use standard hbclass.ch commands. If possible try
to not create classes manually and always use documented commands
from hbclass.ch
2007-04-17 19:34 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* harbour/source/common/hbver.c
+ Added Vista and 2003 Windows versions.

View File

@@ -3356,6 +3356,7 @@ HB_FUNC( ORDLISTADD )
DBORDERINFO pOrderInfo;
AREAP pArea = HB_CURRENT_WA;
s_bNetError = FALSE;
if( pArea )
{
memset( &pOrderInfo, 0, sizeof( DBORDERINFO ) );
@@ -3368,13 +3369,12 @@ HB_FUNC( ORDLISTADD )
return;
}
pOrderInfo.itmResult = hb_itemNew( NULL );
SELF_ORDLSTADD( pArea, &pOrderInfo );
s_bNetError = SELF_ORDLSTADD( pArea, &pOrderInfo ) != SUCCESS;
hb_itemReturn( pOrderInfo.itmResult );
hb_itemRelease( pOrderInfo.itmResult );
}
else
hb_errRT_DBCMD( EG_NOTABLE, EDBCMD_NOTABLE, NULL, "ORDLISTADD" );
}
HB_FUNC( ORDLISTCLEAR )

View File

@@ -68,6 +68,7 @@
#include <sys/ioctl.h>
#include <signal.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#else
@@ -187,7 +188,6 @@ static void hb_gt_std_Init( FHANDLE hFilenoStdin, FHANDLE hFilenoStdout, FHANDLE
s_ulCrLf = strlen( (char *) s_szCrLf );
hb_fsSetDevMode( s_hFilenoStdout, FD_BINARY );
HB_GTSUPER_INIT( hFilenoStdin, hFilenoStdout, hFilenoStderr );
#if defined( OS_UNIX_COMPATIBLE )
@@ -199,10 +199,11 @@ static void hb_gt_std_Init( FHANDLE hFilenoStdin, FHANDLE hFilenoStdout, FHANDLE
s_fRestTTY = TRUE;
/* if( s_saved_TIO.c_lflag & TOSTOP ) != 0 */
sigaction( SIGTTOU, 0, &old );
sigaction( SIGTTOU, NULL, &old );
memcpy( &act, &old, sizeof( struct sigaction ) );
act.sa_handler = sig_handler;
act.sa_flags = SA_RESTART;
/* do not use SA_RESTART - new Linux kernels will repeat the operation */
act.sa_flags = SA_ONESHOT;
sigaction( SIGTTOU, &act, 0 );
tcgetattr( hFilenoStdin, &s_saved_TIO );
@@ -215,7 +216,7 @@ static void hb_gt_std_Init( FHANDLE hFilenoStdin, FHANDLE hFilenoStdout, FHANDLE
tcsetattr( hFilenoStdin, TCSAFLUSH, &s_curr_TIO );
act.sa_handler = SIG_DFL;
sigaction( SIGTTOU, &old, 0 );
sigaction( SIGTTOU, &old, NULL );
}
if( s_bStdoutConsole )
@@ -303,11 +304,20 @@ static int hb_gt_std_ReadKey( int iEventMask )
}
#elif defined( OS_UNIX_COMPATIBLE )
{
USHORT uiErrorOld = hb_fsError(); /* Save current user file error code */
BYTE bChar;
if( hb_fsRead( s_hFilenoStdin, &bChar, 1 ) == 1 )
ch = s_keyTransTbl[ bChar ];
hb_fsSetError( uiErrorOld ); /* Restore last user file error code */
struct timeval tv;
fd_set rfds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO( &rfds );
FD_SET( s_hFilenoStdin, &rfds);
if( select( s_hFilenoStdin + 1, &rfds, NULL, NULL, &tv ) > 0 )
{
USHORT uiErrorOld = hb_fsError(); /* Save current user file error code */
BYTE bChar;
if( hb_fsRead( s_hFilenoStdin, &bChar, 1 ) == 1 )
ch = s_keyTransTbl[ bChar ];
hb_fsSetError( uiErrorOld ); /* Restore last user file error code */
}
}
#else

View File

@@ -83,8 +83,8 @@ FUNCTION HBClass()
STATIC s_hClass /* NOTE: Automatically default to NIL */
IF s_hClass == NIL
s_hClass := __clsNew( "HBCLASS", 16)
/* s_hClass := __clsNew( "HBCLASS", 17) */
s_hClass := __clsNew( "HBCLASS", 16,, @HBClass() )
/* s_hClass := __clsNew( "HBCLASS", 17,, @HBClass()) */
__clsAddMsg( s_hClass, "New" , @New() , HB_OO_MSG_METHOD )
__clsAddMsg( s_hClass, "Create" , @Create() , HB_OO_MSG_METHOD )

View File

@@ -58,7 +58,7 @@ FUNCTION ErrorNew()
STATIC s_oClass
IF s_oClass == NIL
s_oClass := HBClass():New( "ERROR" )
s_oClass := HBClass():New( "ERROR",, @ErrorNew() )
s_oClass:AddData( "Args" , 0 )
s_oClass:AddData( "CanDefault" , .F. )

View File

@@ -50,15 +50,36 @@
*
*/
#include "hbclass.ch"
#include "common.ch"
#include "button.ch"
#ifdef HB_COMPAT_C53
//--------------------------------------------------------------------------//
function MenuItem( cCaption, boData, nShortcut, cMsg, nID )
FUNCTION MenuItem( cCaption, boData, nShortcut, cMsg, nID )
RETURN __MenuItem():New( cCaption, boData, nShortcut, cMsg, nID )
//--------------------------------------------------------------------------//
CLASS MenuItem STATIC FUNCTION __MenuItem
LOCAL oClass
DATA caption init ""
DATA cargo
DATA checked init FALSE
DATA column init 0
DATA data
DATA enabled
DATA id
DATA message
DATA row init 0
DATA shortcut
DATA style init HB_TMENUITEM_STYLE
METHOD New( cCaption, boData, nShortcut, cMsg, nID )
METHOD isPopUp()
ENDCLASS
//--------------------------------------------------------------------------//
METHOD New( cCaption, boData, nShortcut, cMsg, nID ) CLASS MenuItem
if ISBLOCK( boData ) .or. ISOBJECT( boData )
boData := iif( cCaption != MENU_SEPARATOR, boData, nil )
@@ -70,37 +91,26 @@ function MenuItem( cCaption, boData, nShortcut, cMsg, nID )
DEFAULT cMsg TO ""
DEFAULT nID TO 0
oClass := HBClass():New( "MENUITEM" )
oClass:AddData( "caption" , cCaption )
oClass:AddData( "cargo" )
oClass:AddData( "checked" , FALSE )
oClass:AddData( "column" , 0 )
oClass:AddData( "data" , boData )
oClass:AddData( "enabled" , iif( cCaption != MENU_SEPARATOR, TRUE, FALSE ) )
oClass:AddData( "id" , nID )
oClass:AddData( "message" , cMsg )
oClass:AddData( "row" , 0 )
oClass:AddData( "shortcut" , nShortcut )
oClass:AddData( "style" , HB_TMENUITEM_STYLE )
oClass:AddMethod( "isPopup", @isPopup() )
oClass:Create()
return oClass:Instance()
::caption := cCaption
::checked := FALSE
::column := 0
::data := boData
::enabled := iif( cCaption != MENU_SEPARATOR, TRUE, FALSE )
::id := nID
::message := cMsg
::row := 0
::shortcut := nShortcut
::style := HB_TMENUITEM_STYLE
return Self
//--------------------------------------------------------------------------//
static function isPopUp()
LOCAL Self := QSelf()
METHOD isPopUp() CLASS MenuItem
if ISOBJECT( ::data ) .and. ::data:ClassName() == "POPUPMENU"
return TRUE
endif
return FALSE
//--------------------------------------------------------------------------//
#endif

View File

@@ -77,82 +77,80 @@
FUNCTION HBObject()
STATIC s_oClass
LOCAL nScope := HB_OO_CLSTP_EXPORTED
Local oInstance
IF s_oClass == NIL
s_oClass := HBClass():New( "HBObject", )
s_oClass := HBClass():New( "HBObject",, @HBObject() )
/* Those Five worked fine but their C version from classes.c are probably better in term of speed */
/*s_oClass:AddInline( "CLASSNAME" , {| Self | __OBJGETCLSNAME( Self ) }, nScope ) */
/*s_oClass:AddInline( "CLASSH" , {| Self | __CLASSH( Self ) }, nScope ) */
/*s_oClass:AddInline( "CLASSSEL" , {| Self | __CLASSSEL( Self:CLASSH() ) }, nScope ) */
/*s_oClass:AddInline( "EVAL" , {| Self | __EVAL( Self ) }, nScope ) */
/*s_oClass:AddInline( "CLASSNAME" , {| Self | __OBJGETCLSNAME( Self ) }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "CLASSH" , {| Self | __CLASSH( Self ) }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "CLASSSEL" , {| Self | __CLASSSEL( Self:CLASSH() ) }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "EVAL" , {| Self | __EVAL( Self ) }, HB_OO_CLSTP_EXPORTED ) */
/* xBase++ */
s_oClass:AddInline( "ISDERIVEDFROM" , {| Self, xPar1 | __ObjDerivedFrom( Self, xPar1 ) }, nScope )
s_oClass:AddInline( "ISDERIVEDFROM" , {| Self, xPar1 | __ObjDerivedFrom( Self, xPar1 ) }, HB_OO_CLSTP_EXPORTED )
/* Class(y) */
s_oClass:AddInline( "ISKINDOF" , {| Self, xPar1 | __ObjDerivedFrom( Self, xPar1 ) }, nScope )
s_oClass:AddInline( "ISKINDOF" , {| Self, xPar1 | __ObjDerivedFrom( Self, xPar1 ) }, HB_OO_CLSTP_EXPORTED )
s_oClass:AddMethod( "NEW" , @HBObject_New() , nScope )
s_oClass:AddMethod( "INIT" , @HBObject_Init() , nScope )
s_oClass:AddMethod( "NEW" , @HBObject_New() , HB_OO_CLSTP_EXPORTED )
s_oClass:AddMethod( "INIT" , @HBObject_Init() , HB_OO_CLSTP_EXPORTED )
s_oClass:AddMethod( "ERROR", @HBObject_Error() , nScope )
s_oClass:AddMethod( "ERROR", @HBObject_Error() , HB_OO_CLSTP_EXPORTED )
s_oClass:SetOnError( @HBObject_DftonError() )
s_oClass:AddInline( "MSGNOTFOUND" , {| Self, cMsg | ::Error( "Message not found", __OBJGETCLSNAME( Self ), cMsg, iif(substr(cMsg,1,1)=="_",1005,1004) ) }, nScope )
s_oClass:AddInline( "MSGNOTFOUND" , {| Self, cMsg | ::Error( "Message not found", __OBJGETCLSNAME( Self ), cMsg, iif(substr(cMsg,1,1)=="_",1005,1004) ) }, HB_OO_CLSTP_EXPORTED )
/*s_oClass:AddMultiData(,,nScope,{"CLASS"}, .F. )*/
/*s_oClass:AddMultiData(,,HB_OO_CLSTP_EXPORTED,{"CLASS"}, .F. )*/
/*s_oClass:AddInline( "ADDMETHOD" , { | Self, cMeth, pFunc, nScopeMeth | __clsAddMsg( __CLASSH( Self ) , cMeth , pFunc ,HB_OO_MSG_METHOD , NIL, iif(nScopeMeth==NIL,1,nScopeMeth) ) }, nScope ) */
/*s_oClass:AddInline( "ADDMETHOD" , { | Self, cMeth, pFunc, nScopeMeth | __clsAddMsg( __CLASSH( Self ) , cMeth , pFunc ,HB_OO_MSG_METHOD , NIL, iif(nScopeMeth==NIL,1,nScopeMeth) ) }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "ADDVAR" , { | Self, cVAR, nScopeMeth, uiData , hClass | __clsAddMsg( hClass:=__CLASSH( Self ) , cVar , uidata := __CLS_INCDATA(hClass) , HB_OO_MSG_ACCESS, NIL , iif(nScopeMeth==NIL,1,nScopeMeth) ) , ; */
/* __clsAddMsg( hClass , "_"+cVar , uiData , HB_OO_MSG_ASSIGN, NIL , iif(nScopeMeth==NIL,1,nScopeMeth) ) }, nScope ) */
/* __clsAddMsg( hClass , "_"+cVar , uiData , HB_OO_MSG_ASSIGN, NIL , iif(nScopeMeth==NIL,1,nScopeMeth) ) }, HB_OO_CLSTP_EXPORTED ) */
/* Those one exist within Class(y), so we will probably try to implement it */
/*s_oClass:AddInline( "asString" , {| Self | ::class:name + " object" }, nScope ) */
/*s_oClass:AddInline( "asExpStr" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "basicSize" , {| Self | Len( Self ) }, nScope ) */
/*s_oClass:AddInline( "become" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "isEqual" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "isScalar" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "copy" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "deepCopy" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "asString" , {| Self | ::class:name + " object" }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "asExpStr" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "basicSize" , {| Self | Len( Self ) }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "become" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "isEqual" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "isScalar" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "copy" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "deepCopy" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "deferred" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "deferred" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "exec" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "error , {| Self | }, nScope ) */
/*s_oClass:AddInline( "hash" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "null" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "size" , {| Self | Len( Self ) }, nScope ) */
/*s_oClass:AddInline( "exec" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "error , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "hash" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "null" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "size" , {| Self | Len( Self ) }, HB_OO_CLSTP_EXPORTED ) */
/* Those three are already treated within Classes.c */
/*s_oClass:AddInline( "protectErr" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "hiddenErr" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "readOnlyErr" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "protectErr" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "hiddenErr" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "readOnlyErr" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/* No idea when those two could occur !!? */
/*s_oClass:AddInline( "wrongClass" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "badMethod" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "wrongClass" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/*s_oClass:AddInline( "badMethod" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
/* this one exist within VO and seem to be Auto Called when object ran out of scope */
/*s_oClass:AddInline( "Axit" , {| Self | }, nScope ) */
/*s_oClass:AddInline( "Axit" , {| Self | }, HB_OO_CLSTP_EXPORTED ) */
s_oClass:Create()
ENDIF
/*
oInstance := s_oClass:Instance()
/*oInstance:class := s_oClass*/
oInstance:class := s_oClass
RETURN oInstance
*/
RETURN s_oClass:Instance()
/* Currently limited to 20 param */
/* Will be re-written in C later to avoid this */
static function HBObject_New( ... )
return QSelf():Init( ... )

View File

@@ -50,6 +50,7 @@
*
*/
#include "hbclass.ch"
#include "box.ch"
#include "button.ch"
#include "color.ch"
@@ -68,9 +69,57 @@
and small functions. [jlalin]
*/
//--------------------------------------------------------------------------//
function PopUp( nTop, nLeft, nBottom, nRight )
FUNCTION PopUp( nTop, nLeft, nBottom, nRight )
RETURN PopUpMenu():New( nTop, nLeft, nBottom, nRight )
//--------------------------------------------------------------------------//
CLASS PopUpMenu STATIC FUNCTION PopUpMenu
LOCAL oClass
DATA aItems init {}
DATA border init B_SINGLE + SEPARATOR_SINGLE
DATA bottom
DATA cargo
DATA colorSpec init "N/W,W/N,W+/W,W+/N,N+/W,W/N"
DATA current init 0
DATA itemCount init 0
DATA left
DATA opened init FALSE PROTECTED
DATA right
DATA saveScr init "" PROTECTED
DATA top
DATA width init 0
#ifdef HB_EXTENSION
DATA shadowed init FALSE
#endif
METHOD New( nTop, nLeft, nBottom, nRight )
METHOD AddItem( oItem )
METHOD Close( lClose )
METHOD DelItem( nPos )
METHOD Display()
METHOD GetAccel( nKey )
METHOD GetFirst()
METHOD GetItem( nPos )
METHOD GetLast()
METHOD GetNext()
METHOD GetPrev()
METHOD GetShortct( nKey )
METHOD HitTest( nRow, nCol )
METHOD InsItem( nPos, oItem )
METHOD IsOpen()
METHOD Open()
MESSAGE Select( nPos ) METHOD _Select( nPos )
METHOD SetItem( nPos, oItem )
/* NOTE: This method is new in Harbour */
#ifdef HB_EXTENSION
METHOD SetCoors( nRow, nCol, lTop )
#endif
ENDCLASS
//--------------------------------------------------------------------------//
METHOD New( nTop, nLeft, nBottom, nRight ) CLASS PopUpMenu
/* NOTE: When a PopUp is created and attached to a TopBar object, its
coords are initialized to -1, so the TopBar can update them
@@ -81,54 +130,20 @@ function PopUp( nTop, nLeft, nBottom, nRight )
DEFAULT nBottom TO 0
DEFAULT nRight TO 0
oClass := HBClass():New( "POPUPMENU" )
oClass:AddData( "aItems" , {} )
oClass:AddData( "border" , B_SINGLE + SEPARATOR_SINGLE )
oClass:AddData( "bottom" , nBottom )
oClass:AddData( "cargo" )
oClass:AddData( "colorSpec" , "N/W,W/N,W+/W,W+/N,N+/W,W/N" )
oClass:AddData( "current" , 0 )
oClass:AddData( "itemCount" , 0 )
oClass:AddData( "left" , nLeft )
oClass:AddData( "opened" , FALSE )
oClass:AddData( "right" , nRight )
oClass:AddData( "saveScr" , "" )
oClass:AddData( "top" , nTop )
oClass:AddData( "width" , 0 )
::bottom := nBottom
::left := nLeft
::opened := FALSE
::right := nRight
::top := nTop
#ifdef HB_EXTENSION
oClass:AddData( "shadowed" , FALSE )
::shadowed := FALSE
#endif
oClass:AddMethod( "AddItem" , @AddItem() )
oClass:AddMethod( "Close" , @Close() )
oClass:AddMethod( "DelItem" , @DelItem() )
oClass:AddMethod( "Display" , @Display() )
oClass:AddMethod( "GetAccel" , @GetAccel() )
oClass:AddMethod( "GetFirst" , @GetFirst() )
oClass:AddMethod( "GetItem" , @GetItem() )
oClass:AddMethod( "GetLast" , @GetLast() )
oClass:AddMethod( "GetNext" , @GetNext() )
oClass:AddMethod( "GetPrev" , @GetPrev() )
oClass:AddMethod( "GetShortct", @GetShortct() )
oClass:AddMethod( "HitTest" , @HitTest() )
oClass:AddMethod( "InsItem" , @InsItem() )
oClass:AddMethod( "IsOpen" , @IsOpen() )
oClass:AddMethod( "Open" , @Open() )
oClass:AddMethod( "Select" , @_Select() )
oClass:AddMethod( "SetItem" , @SetItem() )
/* NOTE: This method is new in Harbour */
oClass:AddMethod( "SetCoors" , @SetCoors() )
oClass:Create()
return oClass:Instance()
return Self
//--------------------------------------------------------------------------//
static function AddItem( oItem )
METHOD AddItem( oItem ) CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL nLen
aAdd( ::aItems, oItem )
@@ -139,9 +154,7 @@ static function AddItem( oItem )
return Self
//--------------------------------------------------------------------------//
static function Close( lClose )
LOCAL Self := QSelf()
METHOD Close( lClose ) CLASS PopUpMenu
DEFAULT lClose TO TRUE
@@ -161,9 +174,7 @@ static function Close( lClose )
return Self
//--------------------------------------------------------------------------//
static function DelItem( nPos )
LOCAL Self := QSelf()
METHOD DelItem( nPos ) CLASS PopUpMenu
if nPos > 0 .and. nPos <= ::itemCount
aDel( ::aItems, nPos )
@@ -182,9 +193,8 @@ return Self
first item is disabled
2) when a menuitem is disabled it will ignore the key [jlalin]
*/
static function GetAccel( nKey )
METHOD GetAccel( nKey ) CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL nAt := 0
LOCAL cKey := Upper( Chr( nKey ) )
LOCAL n
@@ -199,9 +209,8 @@ static function GetAccel( nKey )
return 0
//--------------------------------------------------------------------------//
static function GetFirst()
METHOD GetFirst() CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL n
for n := 1 to ::itemCount
@@ -212,9 +221,8 @@ static function GetFirst()
return 0
//--------------------------------------------------------------------------//
static function GetItem( nPos )
METHOD GetItem( nPos ) CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL oItem
if nPos > 0 .and. nPos <= ::itemCount
@@ -223,9 +231,8 @@ static function GetItem( nPos )
return oItem
//--------------------------------------------------------------------------//
static function GetLast()
METHOD GetLast() CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL n
for n := ::itemCount to 1 step -1
@@ -236,9 +243,8 @@ static function GetLast()
return 0
//--------------------------------------------------------------------------//
static function GetNext()
METHOD GetNext() CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL n
if ::current < ::itemCount
@@ -251,9 +257,8 @@ static function GetNext()
return 0
//--------------------------------------------------------------------------//
static function GetPrev()
METHOD GetPrev() CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL n
if ::current > 1
@@ -269,9 +274,8 @@ return 0
/* NOTE: This method corrects a bug in Cl*pper:
1) when a menuitem is disabled it will ignore the key [jlalin]
*/
static function GetShortct( nKey )
METHOD GetShortct( nKey ) CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL n
for n := 1 to ::itemCount
@@ -287,9 +291,8 @@ return 0
is disabled
2) when a menuitem is disabled it will ignore the click [jlalin]
*/
static function HitTest( nRow, nCol )
METHOD HitTest( nRow, nCol ) CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL nHit := HTNOWHERE
do case
@@ -325,9 +328,7 @@ static function HitTest( nRow, nCol )
return nHit
//--------------------------------------------------------------------------//
static function InsItem( nPos, oItem )
LOCAL Self := QSelf()
METHOD InsItem( nPos, oItem ) CLASS PopUpMenu
if nPos > 0 .and. nPos <= ::itemCount
aSize( ::aItems, ::itemCount )
@@ -342,15 +343,11 @@ static function InsItem( nPos, oItem )
return Self
//--------------------------------------------------------------------------//
static function IsOpen()
LOCAL Self := QSelf()
METHOD IsOpen() CLASS PopUpMenu
return ::opened
//--------------------------------------------------------------------------//
static function Open()
LOCAL Self := QSelf()
METHOD Open() CLASS PopUpMenu
if !::opened
::opened := TRUE
@@ -360,9 +357,7 @@ static function Open()
return Self
//--------------------------------------------------------------------------//
static function _Select( nPos )
LOCAL Self := QSelf()
METHOD _Select( nPos ) CLASS PopUpMenu
if ( nPos > 0 .and. nPos <= ::itemCount ) .and. ;
::current != nPos .and. ::aItems[ nPos ]:enabled
@@ -378,9 +373,7 @@ static function _Select( nPos )
return Self
//--------------------------------------------------------------------------//
static function SetItem( nPos, oItem )
LOCAL Self := QSelf()
METHOD SetItem( nPos, oItem ) CLASS PopUpMenu
if nPos > 0 .and. nPos <= ::itemCount
::aItems[ nPos ] := oItem
@@ -389,9 +382,8 @@ static function SetItem( nPos, oItem )
return Self
//--------------------------------------------------------------------------//
static function Display()
METHOD Display() CLASS PopUpMenu
LOCAL Self := QSelf()
LOCAL nTop := ::top
LOCAL nAt := 0
LOCAL lPopup := FALSE
@@ -453,9 +445,8 @@ static function Display()
return Self
//--------------------------------------------------------------------------//
static function SetCoors( nItem, nRow, nCol )
LOCAL Self := QSelf()
#ifdef HB_EXTENSION
METHOD SetCoors( nItem, nRow, nCol ) CLASS PopUpMenu
if ::top == -1 .or. ::left == -1
::top := nRow
@@ -464,7 +455,7 @@ static function SetCoors( nItem, nRow, nCol )
::right := ::left + ::width - 1
/* Just to avoid the warning by now (compiling with -w2) */
nItem := nItem
HB_SYMBOL_UNUSED( nItem )
/* UNTESTED: I will wait until the bug in the classes.c module is fixed.
However it should work this way.
@@ -477,6 +468,7 @@ static function SetCoors( nItem, nRow, nCol )
endif
return Self
#endif
//--------------------------------------------------------------------------//
#endif