/********************************************************************************************************/ 
/*                                                                                                      */ 
/*          Fichier listtab.c                                                                           */ 
/*                                                                                                      */ 
/*          Ce fichier comprend le code pour les objet list views                                       */ 
/*                                                                                                      */ 
/********************************************************************************************************/ 

#include "x/Version.h"
#include "x/scolplugin.h"


#include <stdio.h>
#include <string.h>

#include "objstr.h"



WNDPROC ListTabProc = NULL ;
LRESULT CALLBACK ListTabBis( HWND hwnd, unsigned msg,UINT wParam, LONG lParam );


/*********************************************************************************************/ 
/*                                                                                           */ 
/*  LRESULT CALLBACK ListTabBis ( HWND hwnd,unsigned msgn UINT wParam,LONG lParam);          */ 
/*  WinProc pour les list tab                                                                */ 
/*                                                                                           */ 
/*********************************************************************************************/ 
/*
LRESULT CALLBACK ListTabProcBis ( HWND hwnd,unsigned msg,UINT wParam,LONG lParam)
{
    extern WNDPROC ListTabProc ;

    return CallWindowProc ( ListTabProc,hwnd,msg,wParam,lParam);
}
*/


/********************************************************************************/
/*                                                                              */
/*  HWND NewListView ( PtrObjListTab L , HWND Parent ) ;                        */
/*  cree un nouveau control list view                                           */
/*                                                                              */
/********************************************************************************/

HWND NewListView ( PtrObjListTab L , HWND Parent )
{
    int Flag , FlagEx  ;

    Flag = WS_CHILD| LVS_NOSORTHEADER ;
    FlagEx = 0 ;
    if ( L->Flags & LV_BORDER ) Flag |= WS_BORDER ;
    if ( L->Flags & LV_SINGLESEL ) Flag |= LVS_SINGLESEL ;
    if ( L->Flags & LV_DOWN ) FlagEx |= WS_EX_CLIENTEDGE ;
    if ( L->Flags & LV_ICON ) Flag |= LVS_SMALLICON ;
    else if ( L->Flags & LV_LIST ) Flag |= LVS_LIST ;
    else Flag |= LVS_REPORT ;

    return CreateWindowEx ( FlagEx , WC_LISTVIEW , "" , Flag ,
        L->PosX , L->PosY , L->TailleW , L->TailleH , Parent , ( HMENU ) 0 ,
        (HINSTANCE)SCgetExtra("this_inst") , NULL ) ;   
}




/********************************************************************************************************/ 
/*                                                                                                      */ 
/*      int GRCreateListTab ( mmachine m ) ;                                                            */ 
/*      correspond a la fonction ObjListTab _CRlistTab ( Chn,ObjWindow,I I I I I) ;                     */ 
/*      laquelle cree un objet listtab                                                                  */ 
/*                                                                                                      */ 
/********************************************************************************************************/ 

int GRCreateListTab ( mmachine m )
{
    int x,y,w,h,f,s,l,s2,res ;
    PtrObjVoid O ;
    PtrObjWindow W ;
    PtrObjListTab T ;
    HWND Parent ; 

    /************************ DEBUG 2D ******************************************************************/
    #ifdef TRACE2D
        MMechostr (1,"(DBG) _CRlistTab\n");
        FDebug2D(m);
    #endif
    /****************************************************************************************************/

    f = MMpull(m)>>1;
    h = MMpull(m)>>1;
    w = MMpull(m)>>1;
    y = MMpull(m)>>1;
    x = MMpull(m)>>1;

    s = MMpull(m) ;
    if ( s == NIL )
    {
        MMechostr (1,"(ERROR) _CRlistTab : Parent is NIL\n" );
        MMpull(m); /* depile channel */ 
        return MMpush(m,NIL);
    }
    O = ( PtrObjVoid ) MMstart(m,(s>>1)) ;
    W = ( PtrObjWindow ) MMstart(m,(O->Buffer>>1)) ;
    Parent = W->WHandler ;

    /* creation de la zone memoire de l'objet general */
    l = ( sizeof ( struct ObjVoid ) + 3 ) >> 2 ;
    s = MMmallocCLR (m,l,TYPETAB) ;
    if ( s == NIL )
    {
        MMechostr(MSKDEBUG,"(ERROR) _CRlistTab : Error in alloc MAGMA Memory\n" ) ;         
        return MERRMEM ;
    }    
    if ( MMpush(m,(s<<1)+1)) return MERRMEM ;
    /* on rempile l'addresse au cas ou il y aurait un GC par la suite */

    /* creation de la zone memoire pour les donnees relatives aux objets textes */
    l = ( sizeof ( struct ObjListTab ) + 3 ) >> 2 ;
    s2 = MMmalloc ( m,l,TYPEBUF ) ;
    if ( s2 == NIL )
    {
        MMechostr(MSKDEBUG,"(ERROR) _CRlistTab : Error in alloc MAGMA Memory\n" ) ;
        return MERRMEM ;
    }


    T = ( PtrObjListTab ) MMstart(m, s2 ) ;
    s = MMpull (m ) ; /* recupere l'addresse de l'objet de base */
    O = ( PtrObjVoid ) MMstart(m, (s>>1) ) ;

    O -> Type             = OBJ_TYPE_LISTTAB << 1  ;        
    O->Buffer = (s2<<1)+1 ;
    O->Tab = NIL ;
    T -> Flags          = f ;
    T -> TailleH        = h ;
    T -> TailleW        = w ;
    T -> PosY           = y ;
    T -> PosX           = x ;    

    T->WHandler = NewListView ( T ,  Parent ) ;
    if ( !T->WHandler )
    {

        MMechostr (1,"(ERROR) _CRlistTab : Error in creating the WIN95 Object - Check the values\n" ) ;
        MMset(m,0,NIL) ;
        return 0 ;
    }

    ShowWindow( T->WHandler, SW_SHOW) ;
    UpdateWindow(T->WHandler );
    ListView_SetCallbackMask (T->WHandler,0);
/*
    if ( ListTabProc == NULL ) ListTabProc = ( WNDPROC ) GetWindowLong ( T->WHandler , GWL_WNDPROC ) ;
    SetWindowLong ( T->WHandler , GWL_WNDPROC , ( long ) ListTabProcBis ) ;
 */
    MMpush(m,s) ;
    res = OBJcreate(m,OBJTYPLISTTAB,(int)T->WHandler,OBJTYPWINDOW,(int)Parent) ;

       

    /******************************** DEBUG 2D *********************************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(CBG) _CRlistTab Done\n");
    #endif
    /***************************************************************************************************/

    return res ;
}


/********************************************************************************************************/
/*                                                                                                      */
/*      int GRAddListTabColumn ( mmachine m )                                                           */
/*  correspond a la fonction ObjListTab _ADDlistTabColumn ( ObjListTab I I S ) ;                        */
/*  laquelle ajoute une colonne a un objet listtab                                                      */
/*                                                                                                      */
/********************************************************************************************************/

int GRAddListTabColumn ( mmachine m )
{
    int w, flag, s , i ;
    char * name ;
    PtrObjVoid O ;
    PtrObjListTab T ;
    LV_COLUMN lv ;

    /************************** DEBUG 2D ****************************************************************/
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _ADDlistTabColumn\n");
        FDebug2D(m) ;
    #endif
    /****************************************************************************************************/
        
    s = MMpull(m);
    if ( s == NIL ) name = NULL ;
    else name = ( char * ) MMstart(m,(s>>1)+1) ;
    flag = MMpull(m)>>1;
    w = MMpull(m)>>1 ;
    i = MMpull(m)>>1 ;
    s = MMpull(m) ;
    if ( s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1));
        T = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1)) ;
        lv.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT ;
        lv.cx = w ;
        lv.fmt = LVCFMT_LEFT ;
        
        if (flag & ET_ALIGN_CENTER ) lv.fmt = LVCFMT_CENTER ;
        else if ( flag & ET_ALIGN_LEFT ) lv.fmt = LVCFMT_LEFT ;
        else if ( flag & ET_ALIGN_RIGHT ) lv.fmt = LVCFMT_RIGHT ;
        
  
        lv.iSubItem = i ;
        lv.pszText = name ;
        if ( name == NULL ) lv.cchTextMax = 0 ;
        else lv.cchTextMax = strlen ( name ) ;
        i = ListView_InsertColumn ( T->WHandler , i , &lv ) ;
        UpdateWindow ( T->WHandler ) ;
    }

    s = MMpush(m,s) ;

    /************************************************** DEBUG 2D ****************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"DBG) _ADDlistTabcolumn done\n");
    #endif
    /*****************************************************************************************************/

    return s ;
}


/********************************************************************************************************/
/*                                                                                                      */
/*      int GRRemoveListTabColumn ( mmachine m ) ;                                                      */
/*      correspond a la fonction ObjListTab _DELlistTabColumn ( ObjListTab I ) ;                        */
/*      laquelle supprime une colonne a un objet listtab                                                */
/*                                                                                                      */
/********************************************************************************************************/

int GRRemoveListTabColumn ( mmachine m ) 
{
    return 0 ;
}

/********************************************************************************************************/
/*                                                                                                      */
/*      int GRAddListTabItem ( mmachine m ) ;                                                           */
/*  correspond a la fonction ObjListTab _ADDlistTabItem ( ObjListTab I S ) ;                            */
/*                                                                                                      */
/********************************************************************************************************/

int GRAddListTabItem ( mmachine m )
{
    int i,s,res,p ;
    char * label ;
    PtrObjVoid O ;
    PtrObjListTab L ;
    LV_ITEM lv ;
 
    /*************************** DEBUG 2D **************************************************************/ 
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _ADDlistTabItem\n");
        FDebug2D(m);
    #endif
    /***************************************************************************************************/ 
    
    s = MMpull(m);
    if ( s == NIL ) label = NULL ;
    else label = ( char * )MMstart(m,(s>>1)+1) ;
    p = MMpull(m)>>1;
    i = MMpull(m) >> 1 ;
    s = MMpull(m);
    if ( s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1));
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1)) ;

        lv.mask = LVIF_TEXT + LVIF_PARAM;
        lv.iItem = i ;
        lv.iSubItem = 0;
        lv.pszText = label ;
        lv.lParam=p;


        lv.cchTextMax = (label==NULL?0:strlen (label));
        res = ListView_InsertItem ( L->WHandler , &lv ) ;
        if ( res == -1 )
        {
            MMechostr(MSKDEBUG,"(ERROR) _ADDlistTabITem failed\n");
            res = NIL ;
        } else res = res = res << 1 ;
        UpdateWindow ( L->WHandler ) ;
    } else res = NIL ;

    s = MMpush(m,s) ;

    /************************************* DEBUG 2D ****************************************************/ 
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _ADDlistTabItem done\n");
    #endif
    /****************************************************************************************************/ 

    return s ;
}


/********************************************************************************************************/ 
/*                                                                                                      */ 
/*      int GRSetListTabItem ( mmachine m ) ;                                                           */ 
/*      correspond ala fonction ObjListTab _SETlistTabItem (ObjListTab I I S )                          */ 
/*                                                                                                      */ 
/********************************************************************************************************/ 

int GRSetListTabItem ( mmachine m )
{
    char * label ;
    int s , i , c ;
    PtrObjVoid O ;
    PtrObjListTab L ;
    LV_ITEM lv ;

    /****************************** DEBUG 2D ***********************************************************/ 
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabItem\n");
        FDebug2D(m);
    #endif
    /***************************************************************************************************/ 

    s = MMpull(m);
    label = (s==NIL?NULL:( char * )MMstart(m,(s>>1)+1));

    c = MMpull(m)>>1;
    i = MMpull(m)>>1;
    s = MMpull(m) ;
    if ( s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1)) ;
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1)) ;
        lv.mask = LVIF_TEXT  ;
        lv.iItem = i ;
        lv.iSubItem = c ;
        lv.pszText = label ;
        lv.cchTextMax = (label==NULL?0:strlen(label));

        ListView_SetItem (L->WHandler,&lv);

    }

    s = MMpush(m,s) ;
    
    /************************************* DEBUG 2D ****************************************************/ 
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabItem done\n");
    #endif
    /***************************************************************************************************/ 

    return s ;
    
}


/************************************************************************************************/
/*                                                                                              */
/*      int GRDestroyListTab ( mmachine m ) ;                                                   */
/*      correspond a la fonction I _DSlistTab ( ObjListTab ) ;                                  */
/*                                                                                              */
/************************************************************************************************/

int GRDestroyListTab ( mmachine m )
{
    int s ;
    PtrObjVoid O ;
    PtrObjListTab L ;


    /************************** DEBUG 2D **********************************************/
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _DSlistTab\n");
        FDebug2D(m);
    #endif
    /**********************************************************************************/

    s = MMget(m,0);
    if ( s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1)) ;
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1));
        OBJdelTH(m,OBJTYPLISTTAB,(int)L->WHandler) ;
    }


   
    /*********************** DEBUG 2D **************************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _DSlistTab Done\n");
    #endif
    /************************************************************************************/

    MMset(m,0,0);
    return 0 ;
}


/****************************************************************************************/
/*                                                                                      */
/*      int GRDeleteListTabItem ( mmachine m ) ;                                        */
/*      corespond a la fonction ObjListTab _DELlistTabItem ( ObjListTab , I )           */
/*                                                                                      */
/****************************************************************************************/

int GRDeleteListTabItem ( mmachine m )
{
    int s , i ;
    PtrObjVoid O ;
    PtrObjListTab L ;

    /**************************** DEBUG 2D *********************************************/
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _DELlistTabItem\n");
        FDebug2D(m);
    #endif
    /**********************************************************************************/

    i = MMpull(m);
    s = MMpull(m);

    if ( s!= NIL && i!= NIL)
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1));
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1));
        ListView_DeleteItem ( L->WHandler , i>>1) ;
    }

    s = MMpush(m,s);

    /**************************** DEBUG 2D ********************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _DELlistTabItem done\n");
    #endif
    /**********************************************************************************/

    return s ;

}

/****************************************************************************************/
/*                                                                                      */
/*      int GRSetListTabBitmaps ( mmachine m );                                         */
/*      correspond a la fonction ObjListTab _SETlitTabBitmaps ( mmachine m ) ;          */
/*                                                                                      */
/****************************************************************************************/

int GRSetListTabBitmaps ( mmachine m )
{
    int slb , slt ;
    PtrObjVoid O ;
    PtrObjListBitmap BL ; 
    PtrObjListTab L ;

    /*********************** DEBUG 2D ************************************************/
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabBitmaps\n");
        FDebug2D(m);
    #endif
    /*********************************************************************************/

    slb = MMpull(m);
    slt = MMpull(m);

    if ( slb != NIL && slt != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(slb>>1)) ;
        BL = ( PtrObjListBitmap ) MMstart(m,(O->Buffer>>1));

        O = ( PtrObjVoid ) MMstart(m,(slt>>1));
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1));
        ListView_SetImageList (L->WHandler, BL->WHandler, LVSIL_SMALL ) ;
    }

    slt = MMpush(m,slt);

    /********************** DEBUG 2D ************************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabBitmaps\n");
    #endif
    /********************************************************************************/

    return slt ;

}

/****************************************************************************************/
/*                                                                                      */
/*  int GRSetListTabBitmap ( mmachine m ) ;                                             */
/*  correspond a ObjListTab _SETlistTabBitmap ( ObjListTab I BitmapIndex ) ,            */
/*                                                                                      */
/****************************************************************************************/

int GRSetListTabBitmap ( mmachine m )
{
    int index , i , s ;
    PtrObjVoid O ;
    PtrObjListTab L ;
    LV_ITEM lv ;

    /********************* DEBUG 2D *****************************************************/
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabBitmap\n");
        FDebug2D(m);
    #endif
    /************************************************************************************/

    index = MMpull(m);
    i = MMpull(m);
    s = MMpull(m) ;

    if ( index == NIL ) index = 0 ;
    if ( s != NIL && i != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1));
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1)) ;
        lv.mask = LVIF_IMAGE ;
        lv.iItem = i>>1 ;
        lv.iSubItem = 0 ;
        lv.iImage = index >> 1 ;
        ListView_SetItem (L->WHandler,&lv);

    }

    s = MMpush(m,s);

    /*********************************** DEBUG 2D ***************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabBitmap done\n");
    #endif
    /************************************************************************************/

    return s;
}

/***************************************************************************************/
/*                                                                                     */
/*  int GRReflexListTabSort ( mmachine m );                                            */
/*  correspond a la fonction ObjListTab _CBlistTabSort ( ObjListTab ,                  */
/*      fun [ObjListTab u0 I I] I i0 ) qui definit le reflexe de tri                   */
/*                                                                                     */
/***************************************************************************************/

int GRReflexListTabSort ( mmachine m )
{
    int r ;
        MMechostr (1,"REGISTER REFLEX\n");
        r = OBJaddreflex (m,OBJTYPLISTTAB,RFLLISTTAB_SORT ) ;
        MMechostr(MSKDEBUG,"res = %d\n",r);
        return r ;
}

int GRReflexListTabColumn ( mmachine m)
{
    return OBJaddreflex(m,OBJTYPLISTTAB,RFLLISTTAB_COLUMN);
}


int GRReflexListTabDClick ( mmachine m )
{
    return OBJaddreflex(m,OBJTYPLISTTAB,RFLLISTTAB_DCLICK ) ;
}


/***************************************************************************************/
/*                                                                                     */
/*  int GRSortListTab ( mmachine m ) ;                                                 */
/*  correspond a la fonction ObjListTab _SORTlistTab ( ObjListTab )                    */
/*                                                                                     */
/***************************************************************************************/

int CALLBACK CompareListTab(LPARAM lParam1, LPARAM lParam2, 
	LPARAM lParamSort)
{
   
    int k ;
    MMechostr(MSKDEBUG,"lparamsort %d\n",lParamSort);
    k=OBJbeginreflex(mm,OBJTYPLISTTAB,(int)lParamSort,RFLLISTTAB_SORT);
    if (k==0) 
    {
         MMechostr(MSKDEBUG,"reflexe trouve\n");
         if (MMpush(mm,lParam1<<1))           return MERRMEM ;
         if (MMpush(mm,lParam2<<1))           return MERRMEM ;
         OBJcallreflex(mm,2);
         k = (MMget(mm,-2)>>1) ;
         if (k) return TRUE ; 
         return FALSE ;
    }        
    MMechostr(MSKDEBUG,"reflexe pas trouve\n");
    if (lParam1 <= lParam2 ) return TRUE ;
    return FALSE ;

}

int GRSortListTab ( mmachine m)
{
    int s ;
    PtrObjVoid O ;
    PtrObjListTab L ;

    /*********************************** DEBUG 2D **************************************/
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _SORTlistTab");
        FDebug2D(m);
    #endif
    /***********************************************************************************/ 


    s = MMpull(m);
    if ( s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1));
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1));
        MMechostr(MSKDEBUG,"HANDLER = %d\n",L->WHandler);
        ListView_SortItems ( L->WHandler , CompareListTab , L->WHandler ) ;

    }

    s = MMpush(m,s) ;

    /********************************** DEBUG 2D ***************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _SORTlistTab done\n");
    #endif
    /***********************************************************************************/

    return s ;
}


/***************************************************************************************/
/*                                                                                     */
/*      int GRSetListTabSortParam ( mmachine m ) ;                                     */
/*      correspond a _SETlistTabSortParam ( mmachine m ) ;                             */
/*                                                                                     */
/***************************************************************************************/

int GRSetListTabSortParam ( mmachine m )
{
    int p,i,s ;
    PtrObjVoid O ;
    PtrObjListTab L ;
    LV_ITEM lv ;

    /************************* DEBUG 2D ************************************************/
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabSortParam\n");
        FDebug2D(m);
    #endif
    /***********************************************************************************/

    p = MMpull(m);
    i = MMpull(m);
    s = MMpull(m);

    if ( i != NIL && s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1));
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1));
        lv.mask = LVIF_PARAM ;
        lv.iItem = i>>1 ;
        lv.iSubItem = 0 ;
        lv.lParam = p >> 1 ;
        ListView_SetItem (L->WHandler,&lv);
    }

    s = MMpush(m,s) ;

    /******************************* DEBUG 2D *****************************************/
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _SETlistTabSortParam done\n");
    #endif
    /**********************************************************************************/

    return s; 
}

/****************************************************************************/ 
/*                                                                          */ 
/*  int GRReflexListTabSelect ( mmachine m ) ;                              */ 
/*                                                                          */ 
/*  correspond a la fonction scol _CBlistTabSelect(ObjListTab,fun,u0)       */ 
/*                                                                          */ 
/****************************************************************************/ 

int GRReflexListTabSelect ( mmachine m )
{
    return OBJaddreflex(m,OBJTYPLISTTAB,RFLLISTTAB_SELECT );

}


int GRReflexListTabRSelect ( mmachine m )
{
    return OBJaddreflex(m,OBJTYPLISTTAB,RFLLISTTAB_RSELECT );

}

/****************************************************************************/ 
/*                                                                          */ 
/*      int GRResetListTab ( mmachine m ) ;                                 */ 
/*                                                                          */ 
/*      correspond la a fonction ObjListTab _RSTlistTab ( ObjListTab )      */ 
/*      laquelle efface toute les lignes d'un objets list tab               */ 
/*                                                                          */ 
/****************************************************************************/ 

int GRResetListTab ( mmachine m )
{
    PtrObjVoid O ;
    PtrObjListTab L ;
    int s ;

    /************************ DEBUG 2D **************************************/ 
    #ifdef TRACE2D
        MMechostr(MSKDEBUG,"(DBG) _RSTlistTab\n") ;
        FDebug2D(m);
    #endif
    /************************************************************************/ 

    s = MMpull(m) ;
    if ( s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1)) ;
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1)) ;
        SendMessage ( L->WHandler , LVM_DELETEALLITEMS  , 0 , 0 ) ;
    }

    s = MMpush(m,s) ;

    /*************************** DEBUG 2D ***********************************/ 
    #ifdef TRACE2D
        FDebug2D(m);
        MMechostr(MSKDEBUG,"(DBG) _RSTlistTab done\n");
    #endif
    /************************************************************************/ 

    return s ;
}

/****************************************************************************/ 
/*                                                                          */ 
/*      int GRGetCountListTab ( mmachine m ) ;                              */ 
/*                                                                          */ 
/*      correspond a la fonction scol I _GETcountListTab(ObjListTab)        */ 
/*      laquelle retourne le nombre d'element d'une list view               */ 
/*                                                                          */ 
/****************************************************************************/ 

int GRGetCountListTab ( mmachine m )
{
    PtrObjVoid O ;
    PtrObjListTab L ;
    int s ;

    /********************* DEBUG 2D *****************************************/ 
    #ifdef TRACE2D
        MMechostr( 1,"(DBG) _GETcountListTab.\n" ) ;
        FDebug2D(m);
    #endif
    /************************************************************************/ 

    s = MMpull(m) ;

    if ( s != NIL )
    {
        O = ( PtrObjVoid ) MMstart(m,(s>>1)) ;
        L = ( PtrObjListTab ) MMstart(m,(O->Buffer>>1)) ;

        s = SendMessage ( L->WHandler ,  LVM_GETITEMCOUNT , 0 , 0 ) ;
        s = MMpush(m,s<<1);

    }
    else s = MMpush(m,0);

    /************************ DEBUG 2D **************************************/ 
    #ifdef TRACE2D
        FDebug2D(m) ;
        MMechostr( 1 , "(DBG) _GETcountListTab done.\n" );
    #endif
    /************************************************************************/ 

    return s ;
}

