#include "\projet\lib386\lib_sys\adeline.h" #include "\projet\lib386\lib_sys\lib_sys.h" #include "\projet\lib386\lib_svga\lib_svga.h" #include "lib_menu.h" #include #include #include #include #ifndef WATCOM9 #include #endif /*──────────────────────────────────────────────────────────────────────────*/ /*──────────────────────────────────────────────────────────────────────────*/ UBYTE PalMenu[16*3] = { 0,0,0, 71,71,119, 127,127,215, 171,167,231, 115,0,0, 171,0,0, 215,0,0, 0,0,0, 87,87,87, 87,87,255, 87,255,87, 87,255,255, 255,87,87, 255,87,255, 255,255,87, 255,255,255 } ; T_CLICK_BOX *GetPtrLcb( T_MENU *ptrmenu, WORD handle ) ; WORD FlagAutoPal = FALSE ; char InputValueString[64] ; /*══════════════════════════════════════════════════════════════════════════*/ void SetMenuAutoPal( WORD flag ) { FlagAutoPal = flag ; } /*══════════════════════════════════════════════════════════════════════════*/ void InitPalMenu() { WORD n ; for( n=0; n<16; n++ ) PalOne( n, PalMenu[n*3+0], PalMenu[n*3+1], PalMenu[n*3+2] ) ; } void CopyPalMenu( UBYTE *ptrpal ) { WORD n ; for( n=0; n<16; n++ ) { *ptrpal++ = PalMenu[n*3+0] ; *ptrpal++ = PalMenu[n*3+1] ; *ptrpal++ = PalMenu[n*3+2] ; } } /*══════════════════════════════════════════════════════════════════════════*/ void DrawWindow( LONG x1, LONG y1, LONG x2, LONG y2, LONG flags ) { LONG coul, up, down ; MemoClip() ; UnSetClip() ; if( FlagAutoPal ) InitPalMenu() ; if( flags & FLAG_RED ) coul = B_ROUGE ; else coul = B_GRIS ; if( flags & FLAG_PUSHED ) { up = coul ; down = coul+2 ; } else { up = coul+2 ; down = coul ; } Line( x1 , y1 , x2 ,y1 , up ) ; Line( x1 , y1+1, x2-1,y1+1, up ) ; Line( x1 , y1+2, x1 ,y2 , up ) ; Line( x1+1, y1+2, x1+1,y2-1, up ) ; Line( x2 , y1+1, x2 ,y2 , down ) ; Line( x2-1, y1+2, x2-1,y2 , down ) ; Line( x1+2, y2-1, x2-2,y2-1, down ) ; Line( x1+1, y2 , x2-2,y2 , down ) ; Box( x1+2,y1+2,x2-2,y2-2, coul+1 ) ; Line( x1-1,y1-1,x2+1,y1-1, 0 ) ; Line( x2+1,y1-1,x2+1,y2+1, 0 ) ; Line( x1-1,y2+1,x2+1,y2+1, 0 ) ; Line( x1-1,y1-1,x1-1,y2+1, 0 ) ; RestoreClip() ; } /*══════════════════════════════════════════════════════════════════════════* █ █ █ ██▄ █ █▀▀▀▄ █▀▀▀█ █ █ ██▀▀▀ ██▀▄█ ██ ██▀██ ██ █ ██ █ ██▀▄█ ▀▀▀▀█ ▀ ▀ ▀▀ ▀▀ ▀ ▀▀▀▀ ▀▀▀▀▀ ▀ ▀ ▀▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void OpenWindow( T_WINLIST *wlist, WORD x1, WORD y1, WORD largeur, WORD hauteur ) { WORD recal, x2, y2 ; x1++ ; y1++ ; if( (x1==0) AND (y1==0) ) /* centre window */ { x1 = (Screen_X/2) - ((largeur*SizeCar-3))/2 ; y1 = (Screen_Y/2) - ((hauteur*(SizeCar+1)-3))/2 ; x2 = x1 + largeur*SizeCar+14 ; /* 3 bord 4 espace *2 */ y2 = y1 + hauteur*(SizeCar+1)+14 ; } else /* normal window */ { x2 = x1 + largeur*SizeCar+14 ; y2 = y1 + hauteur*(SizeCar+1)+14 ; } if( y2 >= 479 ) { recal = y2 - 478 ; y2 -= recal ; y1 -= recal ; } if( x2 >= 639 ) { recal = x2 - 638 ; x2 -= recal ; x1 -= recal ; } wlist->WindowX1 = x1 ; wlist->WindowY1 = y1 ; wlist->WindowX2 = x2 ; wlist->WindowY2 = y2 ; wlist->WindowLig = y1 + 7 ; wlist->WindowCol = x1 + 7 ; wlist->WindowTab = 10 ; DrawWindow( x1,y1,x2,y2, NO_FLAG ) ; CoulText( 0, -1 ) ; } /*──────────────────────────────────────────────────────────────────────────*/ void GetWindowButton( T_MENU *ptrmenu, WORD handle, T_WINLIST *wlist ) { WORD n, nblcb ; T_CLICK_BOX *ptrlcb ; wlist->WindowX1 = 1 ; wlist->WindowY1 = 1 ; wlist->WindowX2 = Screen_X-2 ; wlist->WindowY2 = Screen_Y-2 ; wlist->WindowCol = wlist->WindowX1 + 7 ; wlist->WindowLig = wlist->WindowY1 + 7 ; wlist->WindowTab = 10 ; nblcb = ptrmenu->NbBox ; ptrlcb = ptrmenu->PtrMallocList ; for( n=0; nHandle == handle ) { wlist->WindowX1 = ptrlcb->X1 ; wlist->WindowY1 = ptrlcb->Y1 ; wlist->WindowX2 = ptrlcb->X2 ; wlist->WindowY2 = ptrlcb->Y2 ; wlist->WindowCol = wlist->WindowX1 + 7 ; wlist->WindowLig = wlist->WindowY1 + 7 ; break ; } ptrlcb++ ; } DrawWindow( wlist->WindowX1,wlist->WindowY1, wlist->WindowX2,wlist->WindowY2, ptrlcb->Flags ) ; CoulText( 0, -1 ) ; } /*──────────────────────────────────────────────────────────────────────────*/ void WinText( T_WINLIST *wlist, UBYTE *string, LONG value ) { Text( wlist->WindowCol, wlist->WindowLig, "%s%l", string, value ) ; wlist->WindowLig += SizeCar+1 ; } /*──────────────────────────────────────────────────────────────────────────*/ void WinList( T_WINLIST *wlist, UBYTE **index, WORD nb, WORD size ) { WORD n ; wlist->WindowArray = index ; wlist->WindowNbIndex = nb ; wlist->WindowTab = size ; for( n=0; nWindowCol, wlist->WindowLig, "%s", *index ) ; index ++ ; wlist->WindowLig += SizeCar+1 ; if( wlist->WindowLig > wlist->WindowY2 -4 -SizeCar ) { wlist->WindowCol += size * SizeCar ; wlist->WindowLig = wlist->WindowY1 + 7 ; if( wlist->WindowCol > wlist->WindowX2-4-size*SizeCar ) { wlist->WindowNbIndex = n+1 ; break ; } } } } /*──────────────────────────────────────────────────────────────────────────*/ void WinSelect( T_WINLIST *wlist, WORD selected, WORD coul ) { WORD n ; UBYTE **index ; index = wlist->WindowArray ; wlist->WindowCol = wlist->WindowX1 + 7 ; wlist->WindowLig = wlist->WindowY1 + 7 ; for( n=0; nWindowNbIndex; n++ ) { if( n == selected ) { ShowMouse( 0 ) ; CoulText( coul, -1 ) ; Text( wlist->WindowCol, wlist->WindowLig, "%s", *index ) ; CopyBlockPhys( wlist->WindowCol, wlist->WindowLig, wlist->WindowCol+strlen(*index)*SizeCar-1, wlist->WindowLig+7 ) ; ShowMouse( 1 ) ; } index ++ ; wlist->WindowLig += SizeCar+1 ; if( wlist->WindowLig > wlist->WindowY2 -4 -SizeCar ) { wlist->WindowCol += wlist->WindowTab * SizeCar ; wlist->WindowLig = wlist->WindowY1 + 7 ; } } } /*──────────────────────────────────────────────────────────────────────────*/ void WinSepar( T_WINLIST *wlist ) { Line( wlist->WindowX1+2, wlist->WindowLig, wlist->WindowX2-2 ,wlist->WindowLig , B_GRIS ) ; Line( wlist->WindowX1+2, wlist->WindowLig+1, wlist->WindowX2-2 ,wlist->WindowLig+1 , B_GRIS+2 ) ; wlist->WindowLig += 3 ; } /*──────────────────────────────────────────────────────────────────────────*/ void FlipWindow( T_WINLIST *wlist ) { CopyBlockPhys( wlist->WindowX1-1, wlist->WindowY1-1, wlist->WindowX2+1, wlist->WindowY2+1 ) ; } /*──────────────────────────────────────────────────────────────────────────*/ WORD GetIndexWinList( T_WINLIST *wlist ) { WORD num ; LONG x, y, sizecol ; x = Mouse_X ; y = Mouse_Y ; if( (x>=wlist->WindowX1+7) AND (x<=wlist->WindowX2-7) AND (y>=wlist->WindowY1+7) AND (y<=wlist->WindowY2-4) ) { sizecol = ((wlist->WindowY2-2) - (wlist->WindowY1+7)) / (SizeCar+1) ; x -= wlist->WindowX1+7 ; y -= wlist->WindowY1+7 ; x /= wlist->WindowTab*SizeCar ; y /= (SizeCar+1) ; num = x * sizecol + y ; if( num < wlist->WindowNbIndex ) { return num ; } } return -1 ; } /*══════════════════════════════════════════════════════════════════════════* █▄ ▄█ █▀▀▀▀ ██▄ █ █ █ ██▀ █ ██▀▀ ██▀██ ██ █ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ *══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void DrawBox( T_MENU *ptrmenu, WORD numlcb, WORD pushed, WORD copyphys ) { WORD flags ; WORD nbaffcar ; WORD len, x, y ; UBYTE string[256] ; UBYTE valuestring[64] ; T_CLICK_BOX *ptrlcb ; MemoClip() ; UnSetClip() ; ptrlcb = ptrmenu->PtrMallocList + numlcb ; if( ptrlcb->Type == TYPE_SWITCH ) { ptrlcb->Flags &= ~FLAG_PUSHED ; if( *(ptrlcb->PtrVar) & ptrlcb->Mask ) ptrlcb->Flags |= FLAG_PUSHED ; } flags = ptrlcb->Flags ; /* dessin de la boite */ if( ptrlcb->Handle != -1 ) { flags |= pushed ; DrawWindow( ptrlcb->X1,ptrlcb->Y1, ptrlcb->X2,ptrlcb->Y2, flags ) ; } /* aff du text */ strcpy( string, ptrlcb->PtrString ) ; if( ptrlcb->Type == TYPE_CHANGE_VALUE ) { strcat( string, itoa( *(ptrlcb->PtrVar), valuestring, 10 ) ) ; } nbaffcar = ((ptrlcb->X2-3)-(ptrlcb->X1+3))/SizeCar ; len = strlen( string ) ; if( (len > nbaffcar) AND (len!=1) ) { if( ptrlcb->Flags & FLAG_FILENAME ) /* perd le debut */ { memmove(string, string+(len-nbaffcar), nbaffcar +1 ) ; /* perd le debut */ } else /* perd la fin */ { string[nbaffcar] = 0 ; } } if( ptrlcb->Flags & FLAG_CENTRE ) { len = (len*SizeCar) /2 ; x = (ptrlcb->X1+ptrlcb->X2)/2 - len ; y = (ptrlcb->Y1+ptrlcb->Y2)/2 - (SizeCar/2) + 1 ; } else { x = ptrlcb->X1 + 3 ; y = ptrlcb->Y1 + 3 ; } if( flags & FLAG_PUSHED ) x++ ; if( ptrlcb->Flags & FLAG_CONTOUR ) { CoulText( 0, -1 ) ; Text( x-1, y-1, string ) ; Text( x , y-1, string ) ; Text( x+1, y-1, string ) ; Text( x-1, y , string ) ; Text( x+1, y , string ) ; Text( x-1, y+1, string ) ; Text( x , y+1, string ) ; Text( x+1, y+1, string ) ; CoulText( JAUNE, -1 ) ; Text( x, y, string ) ; } else { CoulText( JAUNE, -1 ) ; Text( x, y, string ) ; } if( copyphys ) { ShowMouse( 0 ) ; CopyBlockPhys( ptrlcb->X1-1,ptrlcb->Y1-1,ptrlcb->X2+1,ptrlcb->Y2+1 ); ShowMouse( 1 ) ; } RestoreClip() ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ T_CLICK_BOX *AddHeaderButton( T_MENU *ptrmenu, WORD x1, WORD y1, WORD largeur, WORD hauteur ) { WORD x2, y2 ; T_CLICK_BOX *ptrlcb ; UBYTE *ptr ; ULONG newsize ; x1 = ptrmenu->X1 + 6 + x1*(SizeCar+7)-2 ; y1 = ptrmenu->Y1 + 6 + y1*(SizeCar+7)-2 ; x2 = x1 + largeur*(SizeCar+7)-2 ; y2 = y1 + hauteur*(SizeCar+7)-2 ; ptrmenu->NbBox++ ; newsize = ptrmenu->NbBox * sizeof(T_CLICK_BOX) ; if( Mshrink( ptrmenu->PtrMallocList, newsize ) == 0L ) { ptr = (UBYTE*)ptrmenu->PtrMallocList ; ptrmenu->PtrMallocList = Malloc( newsize ) ; memmove( ptrmenu->PtrMallocList, ptr, newsize-sizeof(T_CLICK_BOX) ) ; Free( ptr ) ; } ptrlcb = ptrmenu->PtrMallocList + ptrmenu->NbBox - 1 ; ptrlcb->X1 = x1 ; ptrlcb->Y1 = y1 ; ptrlcb->X2 = x2 ; ptrlcb->Y2 = y2 ; return ptrlcb ; } /*──────────────────────────────────────────────────────────────────────────*/ void GetCoorButton( T_MENU *ptrmenu, WORD handle, LONG *x0, LONG *y0, LONG *x1, LONG *y1 ) { WORD n, nblcb ; T_CLICK_BOX *ptrlcb ; *x0 = 0 ; *y0 = 0 ; *x1 = Screen_X ; *y1 = Screen_Y ; nblcb = ptrmenu->NbBox ; ptrlcb = ptrmenu->PtrMallocList ; for( n=0; nHandle == handle ) { *x0 = ptrlcb->X1 + 3 ; *y0 = ptrlcb->Y1 + 3 ; *x1 = ptrlcb->X2 - 3 ; *y1 = ptrlcb->Y2 - 3 ; break ; } ptrlcb++ ; } } /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void AddButton( T_MENU *ptrmenu, WORD handle, WORD x1, WORD y1, WORD largeur, WORD hauteur, WORD flags, UBYTE *ptrstring ) { T_CLICK_BOX *ptrlcb ; ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ; ptrlcb->Handle = handle ; ptrlcb->Flags = flags ; ptrlcb->PtrString = ptrstring ; ptrlcb->Type = TYPE_BUTTON ; } /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void AddChangeValue( T_MENU *ptrmenu, WORD handle, WORD x1, WORD y1, WORD largeur, WORD hauteur, WORD flags, UBYTE *ptrstring, WORD *ptrvar, WORD step, WORD minvar, WORD maxvar ) { T_CLICK_BOX *ptrlcborg ; T_CLICK_BOX *ptrlcb ; /* bouton valeur */ ptrlcborg = AddHeaderButton( ptrmenu, x1+hauteur,y1, largeur-2*hauteur, hauteur ) ; ptrlcborg->Handle = handle ; ptrlcborg->Flags = flags ; ptrlcborg->PtrString = ptrstring ; ptrlcborg->Type = TYPE_CHANGE_VALUE ; ptrlcborg->PtrVar = ptrvar ; ptrlcborg->Mask = step ; /* bouton - */ ptrlcb = AddHeaderButton( ptrmenu, x1,y1, hauteur, hauteur ) ; ptrlcb->Handle = handle ; ptrlcb->Flags = FLAG_CENTRE | flags ; ptrlcb->PtrString = "-" ; ptrlcb->Type = TYPE_DEC_VALUE ; ptrlcb->PtrVar = ptrvar ; ptrlcb->Mask = minvar ; /* bouton + */ ptrlcb = AddHeaderButton( ptrmenu, x1+largeur-hauteur,y1, hauteur, hauteur ) ; ptrlcb->Handle = handle ; ptrlcb->Flags = FLAG_CENTRE | flags ; ptrlcb->PtrString = "+" ; ptrlcb->Type = TYPE_INC_VALUE ; ptrlcb->PtrVar = ptrvar ; ptrlcb->Mask = maxvar ; } /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void AddSwitch( T_MENU *ptrmenu, WORD handle, WORD x1, WORD y1, WORD largeur, WORD hauteur, WORD flags, UBYTE *ptrstring, WORD *ptrvar, WORD mask ) { T_CLICK_BOX *ptrlcb ; ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ; ptrlcb->Handle = handle ; ptrlcb->Flags = flags ; ptrlcb->PtrString = ptrstring ; ptrlcb->Type = TYPE_SWITCH ; ptrlcb->PtrVar = ptrvar ; ptrlcb->Mask = mask ; } /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void AddText( T_MENU *ptrmenu, WORD x1, WORD y1, WORD largeur, WORD hauteur, WORD flags, UBYTE *ptrstring ) { T_CLICK_BOX *ptrlcb ; ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ; ptrlcb->Handle = -1 ; ptrlcb->Flags = flags ; ptrlcb->PtrString = ptrstring ; ptrlcb->Type = TYPE_TEXT ; } /*══════════════════════════════════════════════════════════════════════════*/ /*──────────────────────────────────────────────────────────────────────────*/ void AddWindow( T_MENU *ptrmenu, WORD handle, WORD x1, WORD y1, WORD largeur, WORD hauteur, WORD flags ) { T_CLICK_BOX *ptrlcb ; ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ; ptrlcb->Handle = handle ; ptrlcb->Flags = flags ; ptrlcb->PtrString = "" ; ptrlcb->Type = TYPE_WINDOW ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ WORD GetOptimalSize( WORD deltax ) { /* return ((nbcar*SizeCar) / (SizeCar+7)) + 2 ; nbcar */ return (deltax-8)/(SizeCar+7) ; } /*══════════════════════════════════════════════════════════════════════════*/ WORD OpenMenu( T_MENU *ptrmenu, WORD largeur, WORD hauteur ) { ptrmenu->LastClicked = -1 ; ptrmenu->Repeat = FALSE ; ptrmenu->NbBox = 0 ; ptrmenu->Largeur = largeur ; ptrmenu->Hauteur = hauteur ; ptrmenu->X1 = 0 ; ptrmenu->Y1 = 0 ; ptrmenu->X2 = 0 ; ptrmenu->Y2 = 0 ; ptrmenu->Flags = 0 ; /* init une fausse clickbox pour first time */ ptrmenu->PtrMallocList = (T_CLICK_BOX*)Malloc( 42*sizeof(T_CLICK_BOX) ) ; if( !ptrmenu->PtrMallocList ) return FALSE ; return TRUE ; } /*══════════════════════════════════════════════════════════════════════════*/ void CloseMenu( T_MENU *ptrmenu ) { Free( ptrmenu->PtrMallocList ) ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ WORD DrawMenu( T_MENU *ptrmenu, WORD x1, WORD y1 ) { WORD n, nb ; WORD x2,y2 ; WORD oldx1,oldy1 ; T_CLICK_BOX *ptrlcb ; /* ptrmenu->LastClicked = -1 ; */ oldx1 = ptrmenu->X1 ; oldy1 = ptrmenu->Y1 ; if( (x1==-1) AND (y1==-1) ) /* centre window */ { x1 = (Screen_X/2) - ((ptrmenu->Largeur*(SizeCar+7)-3))/2 ; y1 = (Screen_Y/2) - ((ptrmenu->Hauteur*(SizeCar+7)-3))/2 ; x2 = x1 + ptrmenu->Largeur*(SizeCar+7)+6 ; y2 = y1 + ptrmenu->Hauteur*(SizeCar+7)+6 ; } else /* normal window */ { x1++ ; y1++ ; x2 = x1 + ptrmenu->Largeur*(SizeCar+7)+6 ; y2 = y1 + ptrmenu->Hauteur*(SizeCar+7)+6 ; } ptrmenu->X1 = x1 ; ptrmenu->Y1 = y1 ; ptrmenu->X2 = x2 ; ptrmenu->Y2 = y2 ; DrawWindow( ptrmenu->X1, ptrmenu->Y1, ptrmenu->X2, ptrmenu->Y2, ptrmenu->Flags ) ; nb = ptrmenu->NbBox ; ptrlcb = ptrmenu->PtrMallocList ; for( n=0; nX1 += x1-oldx1 ; ptrlcb->Y1 += y1-oldy1 ; ptrlcb->X2 += x1-oldx1 ; ptrlcb->Y2 += y1-oldy1 ; DrawBox( ptrmenu, n, NO_FLAG, FALSE ) ; ptrlcb++ ; } CopyBlockPhys( x1-1,y1-1,x2+1,y2+1 ) ; return y2 + 1 ; } /*══════════════════════════════════════════════════════════════════════════*/ void ClearMenu( T_MENU *ptrmenu ) { ptrmenu->LastClicked = -1 ; Box( ptrmenu->X1, ptrmenu->Y1, ptrmenu->X2, ptrmenu->Y2, 0 ) ; CopyBlockPhys( ptrmenu->X1, ptrmenu->Y1, ptrmenu->X2, ptrmenu->Y2 ) ; } /*══════════════════════════════════════════════════════════════════════════*/ /*══════════════════════════════════════════════════════════════════════════*/ /* on scan TOUJOURS une list de click box en DECREMENTANT */ WORD ScanListClick( T_MENU *ptrmenu ) { WORD n ; T_CLICK_BOX *ptrlcb ; WORD x, y ; WORD nb ; nb = ptrmenu->NbBox ; if( !nb ) return -2 ; x = Mouse_X ; y = Mouse_Y ; if( (x>=ptrmenu->X1) AND (x<=ptrmenu->X2) AND (y>=ptrmenu->Y1) AND (y<=ptrmenu->Y2) ) { ptrlcb = ptrmenu->PtrMallocList + (nb-1) ; for( n=nb-1; n>=0; n-- ) { if( (x >= ptrlcb->X1) AND (y >= ptrlcb->Y1) AND (x <= ptrlcb->X2) AND (y <= ptrlcb->Y2) ) { if( ptrlcb->Handle != -1 ) return n ; else return -1 ; } ptrlcb-- ; } return -1 ; } return -2 ; } /* WORD ScanListKey( T_MENU *ptrmenu ) { WORD n ; T_CLICK_BOX *ptrlcb ; WORD x, y ; WORD nb ; nb = ptrmenu->NbBox ; if( !nb ) return -2 ; k = Key ; ptrlcb = ptrmenu->PtrMallocList ; for( n=0; nKey == k ) return ptrlcb->Handle ; ptrlcb++ ; } return -1 ; } WORD ScanListKey_prog( T_MENU *ptrmenu ) { WORD n ; T_CLICK_BOX *ptrlcb ; WORD x, y ; WORD nb ; nb = ptrmenu->NbBox ; if( !nb ) return -2 ; k = Key ; ptrlcb = ptrmenu->PtrMallocList ; for( n=0; nKey == k ) return n ; ptrlcb++ ; } return -1 ; } */ /*──────────────────────────────────────────────────────────────────────────*/ #ifdef ANCIEN LONG GereMenu( T_MENU *ptrmenu, WORD flagwaitclick ) { LONG exitflag = -1 ; WORD select ; T_CLICK_BOX *ptrlcb ; T_CLICK_BOX *ptrlcborg ; WORD value ; WORD vmin, vmax ; select = ScanListClick( ptrmenu ) ; if( select == -2 ) exitflag = -2 ; if( Click ) { if( select > -1 )/* AND (select != ptrmenu->LastClicked) )*/ { ptrlcb = ptrmenu->PtrMallocList + select ; exitflag = ptrlcb->Handle ; if( ptrmenu->LastClicked == select ) { if( flagwaitclick ) { /* methode du click/run/wait */ while( Click ) AffMouse() ; return -1 ; } return exitflag ; } switch( ptrlcb->Type ) { case TYPE_SWITCH: *(ptrlcb->PtrVar) ^= ptrlcb->Mask ; break ; case TYPE_CHANGE_VALUE: /* scroll value */ vmin = (ptrmenu->PtrMallocList + select +1 )->Mask ; vmax = (ptrmenu->PtrMallocList + select +2 )->Mask ; value = *(ptrlcb->PtrVar) ; GetMouseDep() ; while( Click ) { GetMouseDep() ; value += ((WORD)Mouse_X_Dep/4) * ptrlcb->Mask ; if( value < vmin ) value = vmin ; if( value > vmax ) value = vmax ; *(ptrlcb->PtrVar) = value ; DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ; } DrawBox( ptrmenu, select, NO_FLAG, TRUE ) ; break ; case TYPE_DEC_VALUE: ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ; value = *ptrlcb->PtrVar ; value -= ptrlcborg->Mask ; /* step */ if( value < ptrlcb->Mask ) value = ptrlcb->Mask ; /* minvar */ *ptrlcb->PtrVar = value ; /* draw value box */ DrawBox( ptrmenu, select-1, NO_FLAG, TRUE ) ; break ; case TYPE_INC_VALUE: ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ; value = *ptrlcb->PtrVar ; value += ptrlcborg->Mask ; /* step */ if( value > ptrlcb->Mask ) value = ptrlcb->Mask ; /* maxvar */ *ptrlcb->PtrVar = value ; /* draw value box */ DrawBox( ptrmenu, select-2, NO_FLAG, TRUE ) ; break ; } if( ptrlcb->Type != TYPE_WINDOW ) { DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ; ptrmenu->LastClicked = select ; } } } else /* pas de click */ { if( ptrmenu->LastClicked != -1 ) { DrawBox( ptrmenu, ptrmenu->LastClicked, NO_FLAG, TRUE ) ; ptrmenu->LastClicked = -1 ; } } return exitflag ; } #endif /*──────────────────────────────────────────────────────────────────────────*/ LONG GereMenu( T_MENU *ptrmenu ) { LONG exitflag = -1 ; WORD select ; T_CLICK_BOX *ptrlcb ; T_CLICK_BOX *ptrlcborg ; LONG value, ivalue ; WORD vmin, vmax ; WORD click ; char *memostring ; select = ScanListClick( ptrmenu ) ; if( select == -2 ) exitflag = -2 ; if( (click=Click) != 0 ) { if( select > -1 ) { ptrlcb = ptrmenu->PtrMallocList + select ; exitflag = ptrlcb->Handle ; if( ptrmenu->LastClicked == select ) { if( !ptrmenu->Repeat ) { /* methode du click/run/wait */ while( Click ) AffMouse() ; return -1 ; } else { ptrmenu->Repeat = FALSE ; } } switch( ptrlcb->Type ) { case TYPE_SWITCH: *(ptrlcb->PtrVar) ^= ptrlcb->Mask ; break ; case TYPE_CHANGE_VALUE: /* scroll value */ vmin = (ptrmenu->PtrMallocList + select +1 )->Mask ; vmax = (ptrmenu->PtrMallocList + select +2 )->Mask ; value = *(ptrlcb->PtrVar) ; if( click & 2 ) /* slide value */ { GetMouseDep() ; while( Click ) { GetMouseDep() ; value += (Mouse_X_Dep/4) * ptrlcb->Mask ; if( value < vmin ) value = vmin ; if( value > vmax ) value = vmax ; *(ptrlcb->PtrVar) = (WORD)value ; DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ; } } else /* input value */ { memostring = ptrlcb->PtrString ; itoa( value, InputValueString, 10 ) ; ptrlcb->PtrString = InputValueString ; ptrlcb->Type = TYPE_TEXT ; DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ; InputString( ptrmenu, ptrlcb->Handle , 63 ) ; ivalue = atoi( InputValueString ) ; if( ivalue < vmin ) ivalue = vmin ; if( ivalue > vmax ) ivalue = vmax ; *(ptrlcb->PtrVar) = ivalue ; ptrlcb->Type = TYPE_CHANGE_VALUE ; ptrlcb->PtrString = memostring ; } DrawBox( ptrmenu, select, NO_FLAG, TRUE ) ; break ; case TYPE_DEC_VALUE: ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ; value = *ptrlcb->PtrVar ; value -= ptrlcborg->Mask ; /* step */ if( value < ptrlcb->Mask ) value = ptrlcb->Mask ; /* minvar */ *ptrlcb->PtrVar = value ; /* draw value box */ DrawBox( ptrmenu, select-1, NO_FLAG, TRUE ) ; break ; case TYPE_INC_VALUE: ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ; value = *ptrlcb->PtrVar ; value += ptrlcborg->Mask ; /* step */ if( value > ptrlcb->Mask ) value = ptrlcb->Mask ; /* maxvar */ *ptrlcb->PtrVar = value ; /* draw value box */ DrawBox( ptrmenu, select-2, NO_FLAG, TRUE ) ; break ; } if( ptrlcb->Type != TYPE_WINDOW ) { DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ; ptrmenu->LastClicked = select ; } } } else /* pas de click */ { if( ptrmenu->LastClicked != -1 ) { DrawBox( ptrmenu, ptrmenu->LastClicked, NO_FLAG, TRUE ) ; ptrmenu->LastClicked = -1 ; } } return exitflag ; }