FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Scrolls en Icon Group ( SOLUCIONADO )
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Scrolls en Icon Group ( SOLUCIONADO )
Posted: Wed Jul 31, 2013 09:58 PM
Saludos a foro y Buenas tardes:

Estoy trabajando con la clase ICON GROUP para visualizar iconos, hasta ahora estoy avanzado bien, puedo mostrar un array de iconos, borrarlos, seleccionarlos, pero... cuando son muchos iconos y no se pueden ver todos dentro del control no se puede avanzar hacia abajo con el scroll, ni con el mouse, ni con flechas de movimineto, el icono seleccionado avanza pero de forma invisible, es posible poder refrescar de modo que automaticamente muestre los iconos siguientes: he probado con Arrange, Adjust, Mousmove, pero no doy, ya batalle medio dia y no doy como

}

Code (fw): Select all Collapse
#include "FiveWin.ch" 
#include "IGroup.ch"

STATIC oDlg,nSelIco

FUNCTION Main()
LOCAL cIco
LOCAL oIcon, oImageList, oBtn1, oBtn2, oBtn3, oGet, oSay, oIGroup
LOCAL cDir:= ""
LOCAL lSalida:= .F.

聽 聽 聽 DEFINE DIALOG 聽 聽 oDlg 聽RESOURCE 聽 聽"BUSCAR" 聽 聽 聽 聽TITLE "Cambiar Icono"
聽 聽 REDEFINE SAY 聽 聽 聽 聽oSay 聽 聽 聽 聽 聽 聽 聽ID 101 聽 聽 聽 聽 聽OF oDlg
聽 聽 REDEFINE GET 聽 聽 聽 聽oGet 聽VAR cDir 聽 聽ID 102 聽 聽 聽 聽 聽OF oDlg 聽READONLY 聽COLOR RGB(000,000,000), RGB(255,255,206)
聽 聽 REDEFINE BUTTON 聽 聽 oBtn1 聽 聽 聽 聽 聽 聽 ID 103 聽 聽 聽 聽 聽OF oDlg 聽ACTION (BorraIco(oIGroup),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽CargArch(oGet,oIGroup,oDlg),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oIGroup:SetFocus())
聽 聽 REDEFINE SAY 聽 聽 聽 聽oSay 聽 聽 聽 聽 聽 聽 聽ID 104 聽 聽 聽 聽 聽OF oDlg
聽 聽 REDEFINE ICON GROUP oIGroup 聽 聽 聽 聽 聽 ID 105 聽 聽 聽 聽 聽OF oDlg 聽ON CHANGE (nSelIco:= oIGroup:aPrompts[ oIGroup:nFocused ] ) COLORS nRGB(021,066,139), nRGB(199,216,237)
聽 聽 REDEFINE BUTTON 聽 聽 oBtn2 聽 聽 聽 聽 聽 聽 ID 106 聽 聽 聽 聽 聽OF oDlg 聽ACTION (MSGInfo(nSelIco,"Icono Seleccionado"), lSalida:= .T., oDlg:END())
聽 聽 REDEFINE BUTTON 聽 聽 oBtn3 聽 聽 聽 聽 聽 聽 ID 107 聽 聽 聽 聽 聽OF oDlg 聽ACTION (lSalida:= .T., oDlg:END()) CANCEL
聽 聽 聽oIGroup:Arrange()
聽 聽 聽oIGroup:lStatic := .T.
聽 聽 ACTIVATE DIALOG 聽 聽 oDlg 聽CENTERED 聽 聽VALID (lSalida)

聽 聽
RETURN Nil



//--------------------------------------------------------------------------------------------------------------------
STATIC FUNCTION CargArch(oGet,oIGroup,oDlg)

LOCAL N:= 0
LOCAL nIconos:= 0
LOCAL cDirFile:= ""
LOCAL cName, hIcon

cDirFile:= cGetFile32("Archivo Ejecutable (*.EXE)|*.EXE|"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Libreria de Iconos (*.DLL)|*.DLL|"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Archivo de Icono 聽 (*.ICO)|*.ICO|",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Seleccione Ejecutable",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 0,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ".\",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 .F.,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 0,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "*.EXE") 聽 聽 聽 聽 聽 聽 聽 聽
nIconos:= nIcons(cDirFile) 

聽 聽 IF nIconos == 0
聽 聽 聽 聽MSGStop("No hay Iconos en el Archivo","Alto")
聽 聽 聽 聽RETURN Nil
ELSEIF nIconos >= 1
聽 聽 聽 聽oGet:VarPut(cDirFile)
聽 聽 聽 聽oGet:Refresh()
聽 聽 聽 聽oDlg:cTitle("Iconos Encontrados: "+LTRIM(STR(nIconos)))

聽 聽 FOR N:= 1 TO nIconos
聽 聽 聽nSelIco:= STRZERO(1,2)
聽 聽 聽hIcon := ExtractIcon( cDirFile, N-1 )
聽 聽 聽oIGroup:Add( hIcon, ALLTRIM(STRZERO(N,2)) )
聽 聽 NEXT 
聽 聽 聽
聽 聽 聽 聽
ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽
RETURN Nil


//--------------------------------------------------------------------------------------------------------------------
STATIC FUNCTION BorraIco(oGrp)

LOCAL nIcons:= LEN(oGrp:aIcons)
LOCAL N

FOR N:= 1 TO nIcons
聽 聽oGrp:Del(1)
聽 聽oGrp:Refresh()
聽 聽oGrp:Arrange()
聽 聽SysRefresh()
NEXT

RETURN Nil



Ojala y alguien de los gur煤s me de una orientada de por donde van los tiros...
Saludos y Gracias..
Soluciones y Dise帽o de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Dise帽ador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Scrolls en Icon Group
Posted: Fri Aug 02, 2013 11:57 AM

Saludos al foro:

Nadie usa Icon Group? :oops: :oops:

Soluciones y Dise帽o de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Dise帽ador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Scrolls en Icon Group
Posted: Fri Aug 02, 2013 01:11 PM

Victor,

Comprueba que est茅s usando los estilos WS_VSCROLL y WS_HSCROLL en el control TICONGROUP en el recurso

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Scrolls en Icon Group
Posted: Sat Aug 03, 2013 02:17 AM
Maestro Gracias por revisar mi post:

Lo habia pensado pero no tiene esos estilos, lo estoy editando en Pelles C y lo muestra como "Control Personalizado"
he intentado cambiar el valor en estilo de ventana, pero no funciona.



dejo el exe, el res y el prg para que lo pueda revisar, algo ha de faltar: :-) :-) :-)

https://hotfile.com/dl/237394183/32b2689/IconGroup.rar.html

Gracias..
Soluciones y Dise帽o de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Dise帽ador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Scrolls en Icon Group
Posted: Sat Aug 03, 2013 06:31 AM

Victor,

Prueba a ponerle este valor en el estilo del control:

0x50310000

Es equivalente a:

MsgInfo( DecToHex( nOr( WS_CHILD, WS_VISIBLE, WS_TABSTOP, WS_VSCROLL, WS_HSCROLL ) ) )

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Scrolls en Icon Group
Posted: Sat Aug 03, 2013 06:39 AM
Otra opci贸n es que lo salves como RC y ahi especifiques los estilos:

BUSCAR DIALOG DISCARDABLE 95, 86, 194, 202
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "Select a project type"
FONT 8, "Verdana"
{
CONTROL "&Cancelar", 107, "Button", WS_TABSTOP, 132, 184, 50, 14
CONTROL "Buscar Iconos de 茅ste Archivo", 101, "Static", WS_GROUP, 8, 8, 106, 8
CONTROL "", 102, "Edit", ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 8, 18, 130, 12
CONTROL "&Examinar...", 103, "Button", WS_TABSTOP, 140, 16, 50, 14
CONTROL "Seleccione un Icono de la Siguiente Lista", 104, "Static", WS_GROUP, 16, 44, 138, 8
CONTROL "&Aceptar", 106, "Button", WS_TABSTOP, 78, 184, 50, 14
CONTROL "", 105, "TIconGroup", WS_TABSTOP| WS_VSCROLL | WS_HSCROLL, 16, 52, 160, 120
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Scrolls en Icon Group
Posted: Sat Aug 03, 2013 12:07 PM

Maestro buenos dias:

Probe con sus sugerencias pero tampoco funciona, las barras del scroll vertical y horizontal si aparecen, se puede desplazar con ellas para ver los iconos de abajo o arriba pero solo si engancho la barrita con el mouse, el detalle es que no lo hace de forma automatica al presionar las teclas de moviento, pienso que el problema radica en los metodos de la clase IGroup.prg, si prueba el ejemplo que le mande al seleccionar un exe con muchos iconos y presionar las flechas de movimiento arriba y abajo el icono seleccionado se posiciona al icono anterior o siguiente,las teclas de avanze o retroceso de p谩gina no funcionan, mi idea es que deberia funcionar como el mismo explorador de windows: que se puede desplazar con el scroll del mouse.

Soluciones y Dise帽o de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Dise帽ador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Scrolls en Icon Group
Posted: Sat Aug 03, 2013 01:50 PM
Victor,

la Clase TIConGroup la desarroll贸 Ram贸n Avenda帽o y es una clase que ya est谩 superada en la Clase TListView propia de Windows. Tienes un ejemplo en:

FWH\samples\listvie1.prg y testlvw.prg

Si deseas continuar usando la Clase TIconGroup, con estos peque帽os cambios se comporta mejor, aunque a煤n no bien del todo:
en FWH\source\classes\igroup.prg:
Code (fw): Select all Collapse
METHOD KeyDown( nKey, nFlags ) CLASS TIconGroup

   local nAt := ::nFocused
   local nLen := Len( ::aIcons )

   local cPrompt := ::aPrompts[ nAt ]

   do case
      case nKey == VK_UP .or. nKey == VK_LEFT
           if --nAT < 1
              nAt = nLen
           endif   
           ::ChangeFocus( nAt )
           Eval( ::oVScroll:bGoUp )  // nuevo
           return 0

      case nKey == VK_DOWN .or. nKey == VK_RIGHT
           if ++nAT > nLen
              nAt = 1
           endif   
           ::ChangeFocus( nAt )
           Eval( ::oVScroll:bGoDown )  // nuevo
           return 0

   ...
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Scrolls en Icon Group
Posted: Mon Aug 12, 2013 12:43 PM
Maestro Antonio:

He avanzado con el tema y he agregado un Method a la clase TIconGroup para que funcione el mouse, trabaja de 2 manenas: recorriendo linea por linea con solo subir y bajar el scroll del mouse y tambien lo recorre icono por icono simulando al scroll vertical de Word, estoy probando y mejorando, aqui un avance:

Code (fw): Select all Collapse
METHOD MouseWheel( nKeys, nDelta, nXPos, nYPos )

----


METHOD MouseWheel( nKeys, nDelta, nXPos, nYPos ) CLASS TIconGroup

LOCAL nAt := ::nFocused
LOCAL nLen := LEN( ::aIcons )
   

      IF lAnd( nKeys, MK_MBUTTON )
         IF nDelta > 0
           IF --nAT < 1
              nAt = nLen
           ENDIF   
           ::ChangeFocus( nAt )
           ::oVScroll:SETPOS(nAt)
           
         ELSE
           IF ++nAT > nLen
              nAt = 1
           ENDIF  
           ::ChangeFocus( nAt )
           ::oVScroll:SETPOS(nAt)
         ENDIF
      ELSE
         IF nDelta > 0
           ::_VScroll( -STEP_VSCROLL)
         ELSE
           ::_VScroll( STEP_VSCROLL)
         ENDIF
      ENDIF

RETURN Nil



Voy a retocar un poco tambien el Method KeyDown() con los cambios que me sugirio para que se comorte mejor...

Espero dejarla funcional para dejar m谩s funcional este control y poder explotarla al m谩ximo.. :-) :-) :-)

Saludos..
Soluciones y Dise帽o de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Dise帽ador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Scrolls en Icon Group
Posted: Mon Aug 12, 2013 03:15 PM

Victor,

Muy bien, muchas gracias :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Scrolls en Icon Group
Posted: Tue Sep 03, 2013 03:43 PM
Maestro Antonio:

Dejo mi granito de arena, despu茅s de revisar y hacer unas mejoras comprato con todos ustedes la Clase TIconGroup con las modificaciones que realize para usar con el mouse, si as铆 lo considera ser铆a bueno que se integre a futuras versiones de Fivewin.

MOUSE:
-------
Ahora soporta el scroll Vertical del mouse.
Ejecuta Codeblock a doble Click izquierdo.


TECLADO:
--------
Podemos navegar por el contro con las teclas:

Arriba: Sube una columna y toma el foco.
Abajo: Baja una columna y toma el foco.
Derecha: Seleciona el icono siguiente.
Izquierda: Selecciona el Icono anterior.
Inicio: Al primer Icono.
Fin: Al 煤ltimo Icono.
Enter: Ejecuta el Codeblock asignado, trabaja como doble Click del Mouse
F2: Para Editar el Prompt del Icono Seleccionado ( Generalmente No lo Uso )

Avance de P谩gina: En Contrucci贸n
Retroceso de P谩gina: En Contrucci贸n

En el siguiente enlace esta el ejemplo comparatico contruido con la versi贸n modificada y con la versi贸n Nativa de Fivewin

http://www.mediafire.com/?wz68p9mwce29yjm

Y el c贸digo fuente de la Clase:

Code (fw): Select all Collapse
// IconGroup control by Ram贸n Avenda帽o
// 15-08-98

#include "FiveWin.ch"
#include "Constant.ch"

#define GWL_STYLE 聽 聽 聽 聽 聽 聽 聽 -16

#define COLOR_ACTIVECAPTION 聽 聽 聽 2
#define COLOR_WINDOW 聽 聽 聽 聽 聽 聽 聽5
#define COLOR_WINDOWTEXT 聽 聽 聽 聽 聽8
#define COLOR_CAPTIONTEXT 聽 聽 聽 聽 9

#define SOURCE_VCOORS 聽 聽 聽 聽 聽 聽 5
#define SOURCE_HCOORS 聽 聽 聽 聽 聽 聽35
#define STEP_VCOORS 聽 聽 聽 聽 聽 聽 聽85
#define STEP_HCOORS 聽 聽 聽 聽 聽 聽 聽75
#define LAPSTEP_HCOORS 聽 聽 聽 聽 聽 STEP_HCOORS - 32

#define STEP_VSCROLL 聽 聽 聽 聽 聽 聽 16
#define STEP_HSCROLL 聽 聽 聽 聽 聽 聽 16

#define MK_MBUTTON 聽 聽 聽 聽 聽0x0010

#ifdef __XPP__
聽 聽#define Super ::TControl
聽 聽#define New 聽 _New
#endif


STATIC 聽nFirst:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
STATIC 聽nLast := 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
STATIC nScrPos:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 02/Sep/2013
STATIC 聽 nDown:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 03/Sep/2013
//----------------------------------------------------------------------------//

CLASS TIconGroup FROM TControl

聽 聽CLASSDATA lRegistered AS LOGICAL

聽 聽DATA 聽 aIcons, aPrompts, aActions
聽 聽DATA 聽 aCoors, aOrder

聽 聽DATA 聽 nVScroll AS NUMERIC INIT 0
聽 聽DATA 聽 nHScroll AS NUMERIC INIT 0
聽 聽DATA 聽 nIcoCol 聽AS NUMERIC INIT 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽DATA 聽 nIcoRow 聽AS NUMERIC INIT 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽
聽 聽DATA 聽 nFocused

聽 聽DATA 聽 lStatic 

聽 聽DATA 聽 lEdit, lAutoEdit
聽 聽DATA 聽 oGet

聽 聽METHOD New( nRow, nCol, aIcons, aPrompts, aActions, ;
聽 聽 聽 聽 聽 聽 聽 聽oWnd, nHelpId, lNoBorder, bChange, nWidth, nHeight, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽lPixel, lVScroll, lHScroll, nClrFore, nClrBack, ;
聽 聽 聽 聽 聽 聽 聽 聽oFont, oCursor, lDesign, LUPDATE ) CONSTRUCTOR

聽 聽METHOD REDEFINE( nId, aIcons, aPrompts, aActions, oWnd, nHelpId, bChange, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 nClrFore, nClrBack, oFont, oCursor, LUPDATE ) CONSTRUCTOR

聽 聽METHOD Initiate( hDlg ) INLINE Super:Initiate( hDlg ), ::DEFAULT()

聽 聽METHOD DISPLAY() INLINE ::BeginPaint(), ::PAINT(), ::EndPaint()

聽 聽METHOD SetVScroll()
聽 聽METHOD SetHScroll()
聽 聽METHOD SetScrollRange()

聽 聽METHOD DEFAULT()

聽 聽METHOD GetDlgCode( nLastKey )

聽 聽METHOD CoorsUpdate()

聽 聽METHOD PAINT()

聽 聽METHOD END() INLINE AEVAL( ::aIcons, {| hIcon | IF( hIcon != 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 DestroyIcon( hIcon ), Nil ) } ),Super:END()
聽 
聽 聽METHOD _VScroll( nMove )
聽 聽METHOD _HScroll( nMove )

聽 聽METHOD ShowFocus( lFocused )
聽 聽METHOD ChangeFocus( nFocused )

聽 聽METHOD GotFocus( hCtlLost ) INLINE ::ShowFocus( .t. ), Super:GotFocus( hCtlLost )
聽 聽METHOD LostFocus( hWndGetFocus ) INLINE ::ShowFocus( .f. ), Super:LostFocus( hWndGetFocus )

聽 聽METHOD ReSize( nType, nWidth, nHeight ) INLINE Super:ReSize( nType, nWidth, nHeight ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::SetScrollRange()
聽 聽METHOD nGetDown( nRow, nCol )

聽 聽METHOD LButtonDown( nRow, nCol, nFlags )
聽 聽METHOD LButtonUp( nRow, nCol, nFlags )

聽 聽METHOD MouseMove( nRow, nCol, nKeyFlags )

聽 聽METHOD LDblClick( nRow, nCol, nKeyFlags )

聽 聽METHOD EditPrompt( nAt, uVar, bValid, nClrFore, nClrBack )

聽 聽METHOD aGetAway()
聽 聽METHOD nGetTail()

聽 聽METHOD DrawIcon( nAt )

聽 聽METHOD Add( hIcon, cPrompt, bAction )
聽 聽METHOD Modify( hIcon, cPrompt, bAction, nAt )
聽 聽METHOD Del( nAt )

聽 聽METHOD Arrange() INLINE ::Adjust(), ::Refresh(), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::nVScroll := 0, ::nHScroll := 0, ::SetScrollRange()
聽 聽METHOD Invert( nRow, nCol, nRowInit, nColInit )

聽 聽METHOD Adjust()
聽 聽
聽 聽
聽 聽METHOD KeyDown( nKey, nFlags ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
聽 聽METHOD MouseWheel( nKeys, nDelta ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
聽 聽METHOD Reset() INLINE ::nIcoCol:= 0, ::nIcoRow:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( nRow, nCol, aIcons, aPrompts, aActions, ;
聽 聽 聽 聽 聽 聽 oWnd, nHelpId, lNoBorder, bChange, nWidth, nHeight, cMsg, ;
聽 聽 聽 聽 聽 聽 lPixel, lVScroll, lHScroll, nClrFore, nClrBack, ;
聽 聽 聽 聽 聽 聽 oFont, oCursor, lDesign, LUPDATE ) CLASS TIconGroup

聽 聽#ifdef __XPP__
聽 聽 聽 #undef New
聽 聽#endif

聽 聽DEFAULT aIcons := {}, aPrompts := {}, aActions := {}
聽 聽DEFAULT nHelpId:= 0
聽 聽DEFAULT nRow := 0, nCol := 0, oWnd := GetWndDefault()
聽 聽DEFAULT lNoBorder := .f., lVScroll := .f., lHScroll := .f.

聽 聽DEFAULT nClrFore := GetSysColor( COLOR_WINDOWTEXT ),;
聽 聽 聽 聽 聽 聽nClrBack := GetSysColor( COLOR_WINDOW )

聽 聽DEFAULT nWidth 聽:= 100, nHeight := 100,;
聽 聽 聽 聽 聽 聽LUPDATE := .f., lDesign := .f.

聽 聽::aIcons 聽 聽= aIcons
聽 聽::aPrompts 聽= aPrompts
聽 聽::aActions 聽= aActions

聽 聽::nTop 聽 聽 聽= IF( lPixel, nRow, nRow * WIN_CHARPIX_H ) //16
聽 聽::nLeft 聽 聽 = IF( lPixel, nCol, nCol * WIN_CHARPIX_W ) //8
聽 聽::nBottom 聽 = ::nTop 聽+ nHeight
聽 聽::nRight 聽 聽= ::nLeft + nWidth
聽 聽::bChange 聽 = bChange
聽 聽::oWnd 聽 聽 聽= oWnd
聽 聽::nStyle 聽 聽= nOR( IF( lNoBorder, 0, WS_BORDER ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lVScroll, WS_VSCROLL, 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lHScroll, WS_HSCROLL, 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 WS_CHILD, WS_VISIBLE, WS_GROUP, WS_TABSTOP,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lDesign, WS_CLIPSIBLINGS, 0 ) )
聽 聽::nId 聽 聽 聽 = ::GetNewId()
聽 聽::lStatic 聽 = .f.
聽 聽::lDrag 聽 聽 = lDesign
聽 聽::lCaptured = .f.
聽 聽::lEdit 聽 聽 = .f.
聽 聽::oFont 聽 聽 = oFont
聽 聽::oCursor 聽 = oCursor
聽 聽::cMsg 聽 聽 聽= cMsg
聽 聽::LUPDATE 聽 = LUPDATE

聽 聽::lAutoEdit := .f.

聽 聽#ifdef __XPP__
聽 聽 聽 ::nVScroll = 0
聽 聽 聽 ::nHScroll = 0
聽 聽#endif

聽 聽::SETCOLOR( nClrFore, nClrBack )

聽 聽::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )

聽 聽IF ! EMPTY( oWnd:hWnd )
聽 聽 聽 ::CREATE()
聽 聽 聽 ::DEFAULT()
聽 聽 聽 聽oWnd:AddControl( Self )
聽 聽ELSE
聽 聽 聽 oWnd:DefControl( Self )
聽 聽ENDIF

聽 聽IF lDesign
聽 聽 聽 ::CheckDots()
聽 聽ENDIF

RETURN Self

//----------------------------------------------------------------------------//

METHOD REDEFINE( nId, aIcons, aPrompts, aActions, oWnd, nHelpId, bChange, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽nClrFore, nClrBack, oFont, oCursor, LUPDATE ) CLASS TIconGroup

聽 聽DEFAULT aIcons := {}, aPrompts := {}, aActions := {}

聽 聽DEFAULT nClrFore := GetSysColor( COLOR_WINDOWTEXT ),;
聽 聽 聽 聽 聽 聽nClrBack := GetSysColor( COLOR_WINDOW )

聽 聽DEFAULT LUPDATE := .f., oWnd := GetWndDefault()
聽 聽DEFAULT nHelpId := 0
聽 聽
聽 聽::aIcons 聽 聽= aIcons
聽 聽::aPrompts 聽= aPrompts
聽 聽::aActions 聽= aActions

聽 聽::nId 聽 聽 聽 = nId
聽 聽::bChange 聽 = bChange
聽 聽::oWnd 聽 聽 聽= oWnd
聽 聽::lStatic 聽 = .f.
聽 聽::lDrag 聽 聽 = .f.
聽 聽::lCaptured = .f.
聽 聽::lEdit 聽 聽 = .f.
聽 聽::oFont 聽 聽 = oFont
聽 聽::oCursor 聽 = oCursor
聽 聽::cMsg 聽 聽 聽= cMsg
聽 聽::LUPDATE 聽 = LUPDATE

聽 聽::lAutoEdit := .f.

聽 聽#ifdef __XPP__
聽 聽 聽 ::nVScroll = 0
聽 聽 聽 ::nHScroll = 0
聽 聽#endif

聽 聽::SETCOLOR( nClrFore, nClrBack )

聽 聽::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )

聽 聽IF oWnd != Nil
聽 聽 聽 oWnd:DefControl( Self )
聽 聽ENDIF

RETURN Self

//----------------------------------------------------------------------------//

METHOD SetVScroll() CLASS TIconGroup

聽 DEFINE SCROLLBAR ::oVScroll OF Self ;
聽 聽 聽 聽VERTICAL ;
聽 聽 聽 聽RANGE 0, 1 ;
聽 聽 聽 聽PAGESTEP 1 ;
聽 聽 聽 聽ON UP ::_VScroll( -STEP_VSCROLL ) ;
聽 聽 聽 聽ON DOWN ::_VScroll( STEP_VSCROLL ) /*;
聽 聽 聽 聽ON PAGEUP ::_VScroll( 1 * -STEP_VSCROLL) ;
聽 聽 聽 聽ON PAGEDOWN ::_VScroll( 1 * STEP_VSCROLL )*/


聽 ::oVSCroll:bPos := {| nPos | ::_VScroll( ( nPos - ::oVScroll:GetPos() ) * STEP_VSCROLL ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nPos) }

聽 ::oVSCroll:bTrack := ::oVSCroll:bPos

RETURN Nil

//----------------------------------------------------------------------------//

METHOD SetHScroll() CLASS TIconGroup

聽 聽DEFINE SCROLLBAR ::oHScroll OF Self ;
聽 聽 聽 聽HORIZONTAL ;
聽 聽 聽 聽RANGE 0, 0 ;
聽 聽 聽 聽PAGESTEP 1 ;
聽 聽 聽 聽ON UP ::_HScroll( -STEP_HSCROLL ) ;
聽 聽 聽 聽ON DOWN ::_HScroll( STEP_HSCROLL ) ;
聽 聽 聽 聽ON PAGEUP ::_HScroll( 1 * -STEP_HSCROLL) ;
聽 聽 聽 聽ON PAGEDOWN ::_HScroll( 1 * STEP_HSCROLL )

聽 ::oHSCroll:bPos := {| nPos | ::_HSCroll( ( nPos - ::oHSCroll:GetPos() ) * STEP_HSCROLL ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oHSCroll:SETPOS(nPos) }

聽 ::oHSCroll:bTrack := ::oHSCroll:bPos

RETURN Nil

//----------------------------------------------------------------------------//

METHOD SetScrollRange() CLASS TIconGroup

聽 LOCAL nVMax, nHMax
聽 LOCAL aAway := ::aGetAway()
聽 LOCAL nAlto := ::nBottom - ::nTop
聽 
聽 IF LEN( ::aIcons ) = 0

聽 聽 聽nVMax := 0
聽 聽 聽nHMax := 0

聽 ELSE

聽 聽 聽nVMax := aAway[ 1 ]
聽 聽 聽nHMax := aAway[ 2 ]


IF nVMax <> nFirst .AND. nFirst > 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoRow:= ::nIcoRow + 1
ENDIF

IF nHMax <> nLast 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoCol:= ::nIcoCol + 1
ENDIF


nFirst:= nVMax 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽nLast:= nHMax 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽

IF LEN(::aIcons) > (::nIcoRow * ::nIcoCol) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoRow:= ::nIcoRow + 1
ENDIF 



聽 nVMax := IF( nVMax < nAlto .AND. ::nVScroll = 0, ; 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 02/Sep/2013
聽 聽 聽 聽 聽 聽 聽 (0), (((nVMax - nAlto) + STEP_VCOORS) / STEP_VSCROLL))
聽 聽 
聽 聽 
聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 nHMax := IF( nHMax < ( (::nRight - ::nLeft) - STEP_HCOORS ) .AND. ::nHScroll = 0, ;
聽 聽 聽 聽 聽 聽 聽 (0), ( nHMax - SOURCE_HCOORS ) / STEP_HSCROLL )

聽 ENDIF

聽 IF ::oVScroll != Nil
聽 聽 聽::oVScroll:SetRange( 0, nVMax)
聽 聽 聽::oVScroll:SETPOS( ::nVScroll )
聽 ENDIF
聽 IF ::oHScroll != Nil
聽 聽 聽::oHScroll:SetRange( 0, nHMax )
聽 聽 聽::oHScroll:SETPOS( ::nHScroll )
聽 ENDIF


nScrPos:= (nVMax / ::nIcoRow)
聽 nDown:= nScrPos

RETURN Nil

//----------------------------------------------------------------------------//

METHOD DEFAULT() CLASS TIconGroup

聽 聽LOCAL nLen

聽 聽LOCAL aRect := GetCoors( ::hWnd )

聽 聽LOCAL nIcons 聽 := LEN( ::aIcons )
聽 聽LOCAL nPrompts := LEN( ::aPrompts )
聽 聽LOCAL nActions := LEN( ::aActions )

聽 聽IF ::oFont != Nil
聽 聽 聽 ::SetFont( ::oFont )
聽 聽ELSE
聽 聽 聽 ::SetFont( ::oWnd:oFont )
聽 聽ENDIF

聽 聽IF lAnd( GetWindowLong( ::hWnd, GWL_STYLE ), WS_VSCROLL )
聽 聽 聽 ::SetVScroll()
聽 聽ENDIF
聽 聽IF lAnd( GetWindowLong( ::hWnd, GWL_STYLE ), WS_HSCROLL )
聽 聽 聽 ::SetHScroll()
聽 聽ENDIF

聽 聽::nTop 聽 聽= aRect[1]
聽 聽::nLeft 聽 = aRect[2]
聽 聽::nBottom = aRect[3]
聽 聽::nRight 聽= aRect[4]

聽 聽nLen = MAX( nIcons, nPrompts )

聽 聽IF nLen == 0

聽 聽 聽 ::aIcons := {}
聽 聽 聽 ::aPrompts := {}
聽 聽 聽 ::aActions := {}
聽 聽 聽 ::aCoors := {}
聽 聽 聽 ::aOrder := {}

聽 聽 聽 ::nFocused 聽= 0

聽 聽ELSE

聽 聽 聽 ASIZE( ::aIcons, nLen ); 聽 AFILL( ::aIcons, "", nIcons + 1 )
聽 聽 聽 AEVAL( ::aIcons, {| cIcon, nAt | ::aIcons[ nAt ] := IF( FILE( cIcon ), ;
聽 聽 聽 聽 聽 聽 聽ExtractIcon( cIcon ), LoadIcon( GetResources(), cIcon ) ) } )

聽 聽 聽 // AEval( ::aPrompts, {| cPrompt, nPrompt | ::aPrompts[ nPrompt ] += Chr(0) } )
聽 聽 聽 ASIZE( ::aPrompts, nLen ); AFILL( ::aPrompts, "", nPrompts + 1 )
聽 聽 聽 ASIZE( ::aActions, nLen ); AFILL( ::aActions, {|| Nil }, nActions + 1 )

聽 聽 聽 ::aCoors = ARRAY( nLen, 8 )
聽 聽 聽 ::aOrder = ARRAY( nLen )

聽 聽 聽 ::nFocused 聽= 1

聽 聽ENDIF

聽 聽::Adjust(); ::DISPLAY(); ::SetScrollRange()


RETURN Nil

//----------------------------------------------------------------------------//

METHOD GetDlgCode( nLastKey ) CLASS TIconGroup

聽 聽IF .not. ::oWnd:lValidating
聽 聽 聽 IF nLastKey == VK_RETURN .OR. nLastKey == VK_TAB
聽 聽 聽 聽 聽::oWnd:nLastKey = nLastKey
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN DLGC_WANTALLKEYS

//----------------------------------------------------------------------------//

METHOD PAINT() CLASS TIconGroup

聽 聽LOCAL n, nAt
聽 聽LOCAL hDC, hFont

聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 聽FOR n := 1 TO LEN( ::aOrder )

聽 聽 聽 nAt := ::aOrder[ n ]
聽 聽 聽 ::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, .f., .f., ::lEdit )
聽 聽NEXT

聽 聽ReleaseDC( ::hWnd, hDC )

聽 聽::ShowFocus( ::lFocused )

RETURN Super:PAINT()

//----------------------------------------------------------------------------//

METHOD _VScroll( nMove ) CLASS TIconGroup

聽 LOCAL aRect := GetClientRect( ::hWnd )

聽 IF ( ::nVScroll + nMove ) < 0
聽 聽 聽nMove := -::nVScroll
聽 ENDIF

聽 IF ( ::nVScroll + nMove ) > ( ::oVScroll:nMax * STEP_VSCROLL )
聽 聽 聽nMove := ( ::oVScroll:nMax * STEP_VSCROLL ) - ::nVScroll
聽 ENDIF

聽 AEVAL( ::aCoors, {| aCoor | aCoor[ 1 ] -= nMove } )
聽 ScrollWindow( ::hWnd, 0, -nMove, aRect, aRect )

聽 ::nVScroll += nMove

RETURN Nil

//----------------------------------------------------------------------------//

METHOD _HScroll( nMove ) CLASS TIconGroup

聽 LOCAL aRect := GetClientRect( ::hWnd )

聽 IF ( ::nHScroll + nMove ) < 0
聽 聽 聽nMove := -::nHScroll
聽 ENDIF

聽 IF ( ::nHScroll + nMove ) > ( ::oHScroll:nMax * STEP_HSCROLL )
聽 聽 聽nMove := ( ::oHScroll:nMax * STEP_HSCROLL ) - ::nHScroll
聽 ENDIF

聽 AEVAL( ::aCoors, {| aCoor | aCoor[ 2 ] -= nMove } )
聽 ScrollWindow( ::hWnd, -nMove, 0, aRect, aRect )

聽 ::nHScroll += nMove

RETURN Nil

//----------------------------------------------------------------------------//

METHOD ShowFocus( lFocused ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nFocused
聽 聽LOCAL hDC, hFont

聽 聽IF nAt == 0
聽 聽 聽 RETURN Nil
聽 聽ENDIF

聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 聽::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, lFocused, .t., ::lEdit )

聽 聽ReleaseDC( ::hWnd, hDC )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD ChangeFocus( nFocused ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nFocused
聽 聽LOCAL hDC, hFont

聽 聽IF nAt == 0 .OR. nAt == nFocused
聽 聽 聽 RETURN Nil
聽 聽ENDIF

聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 聽ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, .f., .f., .f. )

聽 聽ExtDrawIcon( hDC, ::aCoors[ nFocused, 1 ], ::aCoors[ nFocused, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nFocused ], ::aPrompts[ nFocused ], hFont,;
聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, ::lFocused, .t., .f. )

聽 聽ReleaseDC( ::hWnd, hDC )

聽 聽::nFocused = nFocused

聽 聽ADEL( ::aOrder, ASCAN( ::aOrder, ::nFocused ) )
聽 聽::aOrder[ LEN( ::aIcons ) ] := ::nFocused

聽 聽::lEdit := .f.

聽 聽IF ::bChange != Nil
聽 聽 聽 EVAL( ::bChange )
聽 聽ENDIF

RETURN Nil

//----------------------------------------------------------------------------//

METHOD nGetDown( nRow, nCol ) CLASS TIconGroup

聽 LOCAL n, nAt, nDown := 0

聽 聽 聽FOR n := LEN( ::aOrder ) TO 1 step -1

聽 聽 聽 nAt := ::aOrder[ n ]

聽 聽 聽 IF nRow >= ::aCoors[ nAt, 1 ] .AND. nRow <= ::aCoors[ nAt, 3 ] .AND. ;
聽 聽 聽 聽 聽nCol >= ::aCoors[ nAt, 2 ] .AND. nCol <= ::aCoors[ nAt, 4 ]

聽 聽 聽 聽 聽nDown := nAt
聽 聽 聽 聽 聽EXIT

聽 聽 聽 ENDIF

聽 聽 聽 IF nRow >= ::aCoors[ nAt, 5 ] .AND. nRow <= ::aCoors[ nAt, 7 ] .AND. ;
聽 聽 聽 聽 聽nCol >= ::aCoors[ nAt, 6 ] .AND. nCol <= ::aCoors[ nAt, 8 ]

聽 聽 聽 聽 聽::lEdit := .t.

聽 聽 聽 聽 聽nDown := nAt
聽 聽 聽 聽 聽EXIT

聽 聽 聽 ENDIF

聽 NEXT

RETURN nDown

//----------------------------------------------------------------------------//

METHOD LButtonDown( nRow, nCol, nFlags ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nGetDown( nRow, nCol )

聽 聽IF !::lFocused
聽 聽 聽 ::SetFocus()
聽 聽ENDIF

聽 聽IF nAt = 0
聽 聽 聽 ::lEdit := .f.
聽 聽ELSE
聽 聽 聽 ::ChangeFocus( nAt )
聽 聽ENDIF

聽 聽IF nAt = 0 .OR. ::lStatic .OR. ::lDrag
聽 聽 聽 RETURN Super:LButtonDown( nRow, nCol, nFlags )
聽 聽ENDIF

聽 聽IF ! ::lCaptured

聽 聽 聽 ::lCaptured = .t.
聽 聽 聽 ::Capture()
聽 聽 聽 ::Invert( , , nRow, nCol )

聽 聽ENDIF

聽 聽Super:LButtonDown( nRow, nCol, nFlags )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD LButtonUp( nRow, nCol, nFlags ) CLASS TIconGroup

聽 聽LOCAL nAt

聽 聽IF ( ::lStatic .AND. !::lEdit ) .OR. ::lDrag
聽 聽 聽 RETURN Super:LButtonUp( nRow, nCol, nFlags )
聽 聽ENDIF

聽 聽IF ::lCaptured

聽 聽 聽 ::lCaptured = .f.
聽 聽 聽 ReleaseCapture()
聽 聽 聽 ::Invert()

聽 聽 聽 ::PAINT(); ::SetScrollRange()

聽 聽ENDIF

聽 聽IF ::lEdit
聽 聽 聽 IF ::lAutoEdit
聽 聽 聽 聽 聽nAt := ::nFocused
聽 聽 聽 聽 聽::EditPrompt( nAt, ::aPrompts[ nAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{|uVar| IF( uVar != Nil, ::aPrompts[ nAt ] := uVar, ), ::DrawIcon( nAt ) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽GetSysColor( COLOR_WINDOWTEXT ), GetSysColor( COLOR_CAPTIONTEXT ) ) // ::nClrText, ::nClrPane
聽 聽 聽 ELSE
聽 聽 聽 聽 聽::lEdit := .f.
聽 聽 聽 聽 聽::PAINT(); ::SetScrollRange()
聽 聽 聽 ENDIF
聽 聽ELSE
聽 聽 聽 ::lEdit := .f.
聽 聽ENDIF

聽 聽Super:LButtonUp( nRow, nCol, nFlags )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TIconGroup

聽 聽IF ::lStatic .OR. ::lDrag
聽 聽 聽 RETURN Super:MouseMove( nRow, nCol, nKeyFlags )
聽 聽ENDIF

聽 聽IF ::lCaptured
聽 聽 聽 ::Invert( nRow, nCol )
聽 聽 聽 ::lEdit := .f.
聽 聽 聽 RETURN 0
聽 聽ELSE
聽 聽 聽 ::oWnd:SetMsg( ::cMsg )
聽 聽ENDIF

聽 聽IF ::oCursor != Nil
聽 聽 聽 SETCURSOR( ::oCursor:hCursor )
聽 聽ELSE
聽 聽 聽 CursorArrow()
聽 聽ENDIF

RETURN 0

//----------------------------------------------------------------------------//

METHOD LDblClick( nRow, nCol, nKeyFlags ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nGetDown( nRow, nCol )

聽 聽IF nAt == 0
聽 聽 聽 RETURN Super:LDblClick( nRow, nCol, nKeyFlags )
聽 聽ENDIF

聽 聽::lEdit:= .f.

聽 聽EVAL( ::aActions[ nAt ], Self )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD EditPrompt( nAt, uVar, bValid, nClrFore, nClrBack ) CLASS TIconGroup

聽 聽LOCAL oFont
聽 聽LOCAL nWidth, nHeight
聽 聽LOCAL aDim, aPos

聽 聽uVar := STRTRAN( uVar, CHR(10), CRLF )

聽 聽aDim 聽 := ::aCoors[ nAt ]

聽 聽aPos := { aDim[5] - 1, aDim[6] - 1 }

聽 聽nWidth 聽:= MAX( aDim[8] - aDim[6] + 1, 26 )
聽 聽nHeight := aDim[7] - aDim[5] + 2

聽 聽// ScreenToClient( Self:hWnd, aPos )

聽 聽DEFAULT nClrFore := ::nClrText ,;
聽 聽 聽 聽 聽 聽nClrBack := ::nClrPane ,;
聽 聽 聽 聽 聽 聽bValid 聽 := {|| Nil }

聽 聽IF ::oGet != Nil .AND. ! EMPTY( ::oGet:hWnd )
聽 聽 聽 ::oGet:END()
聽 聽ENDIF

聽 聽IF ::oFont != Nil
聽 聽 聽 oFont = TFont():New( ::oFont:cFaceName, ::oFont:nWidth,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oFont:nHeight, .f., ::oFont:lBold )
聽 聽ENDIF

聽 聽::oGet:=TIconGet():New( aPos[ 1 ], aPos[ 2 ], bSETGET( uVar ), Self,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nWidth, nHeight, oFont,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nClrFore, nClrBack )

聽 聽::nLastKey := 0
聽 聽// ::Set3dLook()
聽 聽::oGet:SetFocus()

聽 聽::oGet:SelectAll()

聽 聽::oGet:bLostFocus := {|| uVar := STRTRAN( ::oGet:cText(), CRLF, " " ),;
聽 聽 聽 IF( Self:nLastKey != VK_ESCAPE,;
聽 聽 聽 EVAL( bValid, uVar, Self:nLastKey ),;
聽 聽 聽 EVAL( bValid, Nil, Self:nLastKey ) ),;
聽 聽 聽 ::oGet:END(), ::lEdit:= .f. }

聽 聽::oGet:bKeyDown := { | nKey | IF( nKey == VK_RETURN .OR. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nKey == VK_ESCAPE, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 (Self:nLastKey := nKey, ::oGet:END(), ::lEdit := .f. ),) }

RETURN .f.

//----------------------------------------------------------------------------//

METHOD aGetAway() CLASS TIconGroup

聽 LOCAL nRow := 0, nCol := 0

聽 IF !EMPTY( ::aCoors )

聽 聽 聽AEVAL( ::aCoors, { | aCoor | nRow := MAX( nRow, aCoor[ 1 ] ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 nCol := MAX( nCol, aCoor[ 2 ] ) } )
聽 ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
RETURN({ nRow + ::nVScroll, nCol + ::nHScroll })
聽 聽
聽 聽
//----------------------------------------------------------------------------//

METHOD nGetTail() CLASS TIconGroup
聽 
聽 LOCAL nRow, nCol
聽 LOCAL nTail := LEN( ::aIcons )

聽 IF nTail > 0
聽 
聽 聽 聽nRow := ::aCoors[ nTail, 1 ]
聽 聽 聽AEVAL( ::aCoors, { | aCoor, nCoor | IF( aCoor[ 1 ] > nRow, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( nRow := aCoor[ 1 ], nTail := nCoor ), Nil ) } )

聽 聽 聽nCol := ::aCoors[ nTail, 1 ]
聽 聽 聽AEVAL( ::aCoors, { | aCoor, nCoor | IF( aCoor[ 1 ] = nRow .AND. aCoor[ 2 ] > nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( nCol := aCoor[ 2 ], nTail := nCoor ), Nil ) } )
聽 ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽

RETURN( nTail )
聽 聽 聽 
//----------------------------------------------------------------------------//

METHOD DrawIcon( nAt ) CLASS TIconGroup

聽 LOCAL hDC, hFont
聽 
聽 hDC 聽 := GetDC( ::hWnd )
聽 hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 ::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::nClrText, ::nClrPane, .f., .f., ::lEdit )

聽 ReleaseDC( ::hWnd, hDC )
聽 聽
RETURN Nil
聽 聽 聽 
//----------------------------------------------------------------------------//

METHOD Add( hIcon, cPrompt, bAction ) CLASS TIconGroup

聽 LOCAL nAt := LEN( ::aIcons ) + 1
聽 
聽 LOCAL nTail := ::nGetTail() 
聽 LOCAL nX := SOURCE_HCOORS, nY := SOURCE_VCOORS
聽 
聽 LOCAL aRect := GetClientRect( ::hWnd ) 

聽 DEFAULT hIcon := 0, cPrompt := "", bAction := {|| Nil }
聽 
聽 IF hIcon == 0 .AND. cPrompt == ""
聽 聽 聽RETURN Nil
聽 ENDIF

聽 IF nAt > 1
聽 聽 聽nY := ::aCoors[ nTail, 1 ] 聽
聽 聽 聽nX := ::aCoors[ nTail, 2 ]
聽 聽 聽
聽 聽 聽nX += STEP_HCOORS
聽 聽 聽IF nX + LAPSTEP_HCOORS > aRect[4]
聽 聽 聽 聽 nX := SOURCE_HCOORS
聽 聽 聽 聽 nY += STEP_VCOORS
聽 聽 聽END 
聽 ELSE 聽 
聽 聽 聽::nFocused := 1
聽 ENDIF 聽 

聽 AADD( ::aIcons, hIcon )
聽 AADD( ::aPrompts, cPrompt )
聽 AADD( ::aActions, bAction )
聽 
聽 AADD( ::aCoors, { nY, nX, 0, 0, 0, 0, 0, 0 } ) 聽
聽 AADD( ::aOrder, nAt )

聽 ::DrawIcon( nAt ); ::SetScrollRange()
聽 
聽 ::Refresh( .f. )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD Modify( hIcon, cPrompt, bAction, nAt ) CLASS TIconGroup

聽 DEFAULT hIcon := 0, cPrompt := "", bAction := {|| Nil }
聽 
聽 IF ( hIcon == 0 .AND. cPrompt == "" ) .OR. ;
聽 聽 聽nAt > LEN( ::aIcons)
聽 聽 聽RETURN Nil
聽 ENDIF

聽 IF ::aIcons[ nAt ] != 0
聽 聽 聽DestroyIcon( ::aIcons[ nAt ] )
聽 ENDIF 聽 
聽 
聽 ::aIcons[ nAt ] := hIcon
聽 ::aPrompts[ nAt ] := cPrompt
聽 ::aActions[ nAt ] := bAction

聽 ::DrawIcon( nAt ); ::SetScrollRange() 
聽 
聽 ::Refresh( .t. )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD Del( nAt ) CLASS TIconGroup

聽 LOCAL nLen := LEN( ::aIcons ) - 1

聽 IF nAt > nLen + 1 .OR. nAt = 0 .OR. nLen < 0
聽 聽 聽RETURN Nil
聽 ENDIF
聽 
聽 ADEL( ::aIcons, nAt ); 聽 ASIZE( ::aIcons, nLen )
聽 ADEL( ::aPrompts, nAt ); ASIZE( ::aPrompts, nLen )
聽 ADEL( ::aActions, nAt ); ASIZE( ::aActions, nLen )

聽 ADEL( ::aCoors, nAt ); 聽 ASIZE( ::aCoors, nLen )
聽 ADEL( ::aOrder, ASCAN( ::aOrder, nAt ) ); ASIZE( ::aOrder, nLen )
聽 AEVAL( ::aOrder, {|u,n| IF( u > nAt, ::aOrder[ n ] := u - 1, ) } )

聽 IF nAt < ::nFocused
聽 聽 聽::nFocused--
聽 ELSEIF nAt == ::nFocused
聽 聽 聽::nFocused := IF( nLen == 0, 0, 1 )
聽 ENDIF 聽
聽 
聽 ::SetScrollRange() 
聽 
聽 ::Refresh()
聽 
聽 IF nLen == 0
聽 ::Reset() 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 ENDIF
聽 
RETURN Nil

//----------------------------------------------------------------------------//

METHOD KeyDown( nKey, nFlags ) CLASS TIconGroup 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013

聽 聽LOCAL cPrompt
聽 聽LOCAL 聽 聽 nAt:= ::nFocused
聽 聽LOCAL 聽 聽nLen:= LEN(::aIcons)
聽 聽LOCAL 聽nSteep:= ::nIcoCol

聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽DO CASE
聽 聽 聽 CASE nKey == VK_UP
聽 聽 聽 聽 聽 聽 IF nAT <= nLen .AND. nAt - nSteep >= 1
聽 聽 聽 聽 聽 聽 nDown:= nDown - nScrPos
聽 聽 聽 聽 聽 聽 聽 聽 nAt:= nAt - nSteep
聽 聽 聽 聽 聽 聽ENDIF 聽

聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nDown)
聽 聽 聽 聽 聽 聽::_VScroll((-STEP_VSCROLL * 4.5))
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt) 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_DOWN
聽 聽 聽 聽 聽 聽IF nAT >= 1 .AND. nAt + nSteep <= nLen
聽 聽 聽 聽 聽 聽nDown:= nDown + nScrPos
聽 聽 聽 聽 聽 聽 聽 聽nAt:= nAt + nSteep
聽 聽 聽 聽 聽 聽ELSEIF nAT > nLen
聽 聽 聽 聽 聽 聽 聽 聽nAt:= nLen 
聽 聽 聽 聽 聽 聽ENDIF
聽 
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nDown)
聽 聽 聽 聽 聽 聽::_VScroll((STEP_VSCROLL * 4.5))
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt) 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_LEFT
聽 聽 聽 聽 聽 聽IF nAT > 1
聽 聽 聽 聽 聽 聽 聽 nAt:= nAt - 1
聽 聽 聽 聽 聽 聽ENDIF 聽 
聽 聽 聽 聽 聽 聽::ChangeFocus( nAt )
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_RIGHT
聽 聽 聽 聽 聽 聽IF nAT < nLen
聽 聽 聽 聽 聽 聽 聽 nAt:= nAt + 1
聽 聽 聽 聽 聽 聽ENDIF 聽 
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt)
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 
聽 聽 聽 CASE nKey == VK_HOME
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(1)
聽 聽 聽 聽 聽 聽::_VScroll((-STEP_VSCROLL * (nLen+::nIcoRow)))
聽 聽 聽 聽 聽 聽::ChangeFocus(1)
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_END
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nLen)
聽 聽 聽 聽 聽 聽::_VScroll((STEP_VSCROLL * (nLen +::nIcoRow)))
聽 聽 聽 聽 聽 聽::ChangeFocus(nLen)
聽 聽 聽 聽 聽 聽::Refresh() 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_PRIOR
聽 聽 聽 聽 聽 聽MSGInfo("Regresar","Pendiente")
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_NEXT
聽 聽 聽 聽 聽 聽MSGInfo("Avanzar","Pendiente")
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_F2 
聽 聽 聽 聽 聽 聽IF ::lAutoEdit
聽 聽 聽 聽 聽 聽 聽 ::lEdit := .t.
聽 聽 聽 聽 聽 聽 聽 MSGInfo(cPrompt)
聽 聽 聽 聽 聽 聽 聽 cPrompt := ::aPrompts[nAt]
聽 聽 聽 聽 聽 聽 聽 ::EditPrompt( nAt, cPrompt,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{|uVar| IF( uVar != Nil, ::aPrompts[ nAt ] := uVar, ), ::DrawIcon( nAt ) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽GetSysColor( COLOR_WINDOWTEXT ), GetSysColor( COLOR_CAPTIONTEXT ) ) // ::nClrText, ::nClrPane 
聽 聽 聽 聽 聽 聽 聽 RETURN 0
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽
聽 聽ENDCASE

RETURN Super:KeyDown( nKey, nFlags )

//----------------------------------------------------------------------------//

METHOD Invert( nRow, nCol, nRowInit, nColInit ) CLASS TIconGroup

聽 聽STATIC nInitRow, nInitCol, nOldRow, nOldCol
聽 聽
聽 聽LOCAL nAt := ::nFocused 
聽 聽LOCAL lErase := .f.

聽 聽::GetDC()
聽 聽
聽 聽IF nRow = Nil .AND. nCol = Nil
聽 聽
聽 聽 聽 IF nRowInit = Nil .AND. nColInit = Nil
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽lErase = .t. 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽::aCoors[ nAt ] = { ::aCoors[ nAt, 1 ] + nOldRow, ::aCoors[ nAt, 2 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nOldRow, ::aCoors[ nAt, 4 ] + nOldCol, ; 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 5 ] + nOldRow, ::aCoors[ nAt, 6 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nOldRow, ::aCoors[ nAt, 8 ] + nOldCol }

聽 聽 聽 ELSE

聽 聽 聽 聽 聽nInitRow = nRowInit
聽 聽 聽 聽 聽nInitCol = nColInit

聽 聽 聽 ENDIF
聽 聽 聽 
聽 聽 聽 nRow = 0
聽 聽 聽 nCol = 0
聽 聽
聽 聽ELSE

聽 聽 聽IF nRow < 0 .OR. ( nRow + ::nTop > ::nBottom ) .OR. ;
聽 聽 聽 聽 nCol < 0 .OR. ( nCol + ::nLeft > ::nRight ) 
聽 聽 聽 聽 ::ReleaseDC()
聽 聽 聽 聽 RETURN Nil
聽 聽 聽ENDIF 聽 
聽 
聽 聽 聽nRow = nRow - nInitRow
聽 聽 聽nCol = nCol - nInitCol

聽 聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 1 ] + nOldRow, ::aCoors[ nAt, 2 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nOldRow, ::aCoors[ nAt, 4 ] + nOldCol )
聽 聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 5 ] + nOldRow, ::aCoors[ nAt, 6 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nOldRow, ::aCoors[ nAt, 8 ] + nOldCol )
聽 聽
聽 聽ENDIF

聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 1 ] + nRow, ::aCoors[ nAt, 2 ] + nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nRow, ::aCoors[ nAt, 4 ] + nCol )
聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 5 ] + nRow, ::aCoors[ nAt, 6 ] + nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nRow, ::aCoors[ nAt, 8 ] + nCol )
聽 聽
聽 聽IF lErase
聽 聽 聽 FillRect( ::hDC, { ::aCoors[ nAt, 1 ] - nOldRow, ::aCoors[ nAt, 2 ] - nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] - nOldRow, ::aCoors[ nAt, 4 ] - nOldCol }, ::oBrush:hBrush )
聽 聽 聽 FillRect( ::hDC, { ::aCoors[ nAt, 5 ] - nOldRow, ::aCoors[ nAt, 6 ] - nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] - nOldRow, ::aCoors[ nAt, 8 ] - nOldCol }, ::oBrush:hBrush ) 聽 聽 
聽 聽ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽nOldRow = nRow
聽 聽nOldCol = nCol
聽 聽 聽 聽
聽 聽::ReleaseDC()

RETURN Nil

//----------------------------------------------------------------------------//

METHOD Adjust() CLASS TIconGroup

聽 LOCAL nAt
聽 LOCAL nX := SOURCE_HCOORS, nY := SOURCE_VCOORS
聽 聽 
聽 LOCAL aRect := GetClientRect( ::hWnd ) 

聽 FOR nAt:= 1 TO LEN( ::aIcons )

聽 聽 聽 ::aCoors[ nAt, 1 ] := nY
聽 聽 聽 ::aCoors[ nAt, 2 ] := nX

聽 聽 聽 ::aOrder[ nAt ] := nAt
聽 聽 聽 聽 聽 聽 
聽 聽 聽 nX += STEP_HCOORS
聽 聽 聽 IF nX + LAPSTEP_HCOORS > aRect[4]
聽 聽 聽 聽 聽nX := SOURCE_HCOORS
聽 聽 聽 聽 聽nY += STEP_VCOORS
聽 聽 聽 END 聽 
聽 
聽 NEXT

RETURN Nil

//----------------------------------------------------------------------------//

METHOD CoorsUpdate() CLASS TIconGroup

聽 聽LOCAL aRect := GetCoors( ::hWnd )

聽 聽::nTop 聽 聽= aRect[ 1 ]
聽 聽::nLeft 聽 = aRect[ 2 ]
聽 聽::nBottom = aRect[ 3 ]
聽 聽::nRight 聽= aRect[ 4 ]

RETURN Nil

//----------------------------------------------------------------------------//
// R.Avenda帽o. 1998

//----------------------------------------------------------------------------//

METHOD MouseWheel( nKeys, nDelta ) CLASS TIconGroup 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013

LOCAL 聽 nAt := ::nFocused
LOCAL 聽nLen := LEN( ::aIcons )

聽 聽 聽 IF lAnd( nKeys, MK_MBUTTON )
聽 聽 聽 聽 聽IF nDelta > 0
聽 聽 聽 聽 聽 聽IF ++nAT > nLen
聽 聽 聽 聽 聽 聽 聽 nAt = 1
聽 聽 聽 聽 聽 聽ENDIF 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽ELSE
聽 聽 聽 聽 聽 聽IF --nAT < 1
聽 聽 聽 聽 聽 聽 聽 nAt = nLen
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽::ChangeFocus( nAt )
聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 ELSE
聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽IF nDelta > 0
聽 聽 聽 聽 聽 聽::_VScroll( -STEP_VSCROLL)
聽 聽 聽 聽 聽 聽::oVScroll:PageUp()
聽 聽 聽 聽 聽ELSE
聽 聽 聽 聽 聽 聽::_VScroll( STEP_VSCROLL)
聽 聽 聽 聽 聽 聽::oVScroll:PageDown()
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽 聽
聽 聽 ENDIF

RETURN Nil


Espero les sea de utilidad.
Cualquier duda o sugerencia

V铆ctor Daniel Cuatecatl Le贸n
danyleon82@hotmail.com
http://www.facebook.com/victordaniel.cuatecatlleon

Saludos.. :-) :-) :-)
Soluciones y Dise帽o de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Dise帽ador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon
Posts: 842
Joined: Mon Oct 10, 2005 01:29 PM
Re: Scrolls en Icon Group ( SOLUCIONADO )
Posted: Wed Sep 04, 2013 08:31 AM

Antonio ,

this breaks the compatibility

  Eval( ::oVScroll:bGoUp )  // nuevo

ERROR.LOG
Application
===========
Path and name: D:\PRGWIN\MAST_NW\MASTRO.exe (32 bits)
Size: 5,962,240 bytes
Compiler version: Harbour 3.2.0dev (Rev. 18881)
FiveWin Version: FWH 13.07
Windows version: 5.1, Build 2600 Service Pack 3

Time from start: 0 hours 0 mins 2 secs
Error occurred at: 04-09-2013, 10:18:22
Error description: Error BASE/1004 Message not found: NIL:BGODOWN
Args:
[ 1] = U

Stack Calls

Called from: => __ERRRT_SBASE( 0 )
Called from: ../../../tobject.prg => NIL:ERROR( 0 )
Called from: ../../../tobject.prg => (b)HBOBJECT( 0 )
Called from: ../../../tobject.prg => NIL:MSGNOTFOUND( 0 )
Called from: ../../../tobject.prg => NIL:BGODOWN( 0 )
Called from: C:\FWH_07\my_fw\igroup.prg => TICONGROUP:KEYDOWN( 879 )
Called from: => TWINDOW:HANDLEEVENT( 0 )
Called from: .\source\classes\CONTROL.PRG => TICONGROUP:HANDLEEVENT( 1729 )
Called from: .\source\classes\WINDOW.PRG => _FWH( 3183 )
Called from: => WINRUN( 0 )
Called from: .\source\classes\WINDOW.PRG => TWINDOW:ACTIVATE( 996 )
Called from: ..\mastro\Mastro.prg => MASTRO( 940 )

System

Posts: 625
Joined: Wed Mar 14, 2007 06:49 PM
Re: Scrolls en Icon Group ( SOLUCIONADO )
Posted: Thu Sep 05, 2013 03:40 PM
Nueva Revisi贸n:

Ahora ya funcionan las Teclas Avence y Retroceso de P谩gina:

Code (fw): Select all Collapse
// IconGroup control by Ram贸n Avenda帽o
// 15-08-98

#include "FiveWin.ch"
#include "Constant.ch"

#define GWL_STYLE 聽 聽 聽 聽 聽 聽 聽 -16

#define COLOR_ACTIVECAPTION 聽 聽 聽 2
#define COLOR_WINDOW 聽 聽 聽 聽 聽 聽 聽5
#define COLOR_WINDOWTEXT 聽 聽 聽 聽 聽8
#define COLOR_CAPTIONTEXT 聽 聽 聽 聽 9

#define SOURCE_VCOORS 聽 聽 聽 聽 聽 聽 5
#define SOURCE_HCOORS 聽 聽 聽 聽 聽 聽35
#define STEP_VCOORS 聽 聽 聽 聽 聽 聽 聽85
#define STEP_HCOORS 聽 聽 聽 聽 聽 聽 聽75
#define LAPSTEP_HCOORS 聽 聽 聽 聽 聽 STEP_HCOORS - 32

#define STEP_VSCROLL 聽 聽 聽 聽 聽 聽 16
#define STEP_HSCROLL 聽 聽 聽 聽 聽 聽 16

#define MK_MBUTTON 聽 聽 聽 聽 聽0x0010

#ifdef __XPP__
聽 聽#define Super ::TControl
聽 聽#define New 聽 _New
#endif


STATIC 聽nFirst:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
STATIC 聽nLast := 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
STATIC nScrPos:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 02/Sep/2013
STATIC 聽 nDown:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 03/Sep/2013
STATIC 聽 nView:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 03/Sep/2013
STATIC 聽 nPage:= 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 05/Sep/2013
//----------------------------------------------------------------------------//

CLASS TIconGroup FROM TControl

聽 聽CLASSDATA lRegistered AS LOGICAL

聽 聽DATA 聽 aIcons, aPrompts, aActions
聽 聽DATA 聽 aCoors, aOrder

聽 聽DATA 聽 nVScroll AS NUMERIC INIT 0
聽 聽DATA 聽 nHScroll AS NUMERIC INIT 0
聽 聽DATA 聽 nIcoCol 聽AS NUMERIC INIT 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽DATA 聽 nIcoRow 聽AS NUMERIC INIT 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽
聽 聽DATA 聽 nFocused

聽 聽DATA 聽 lStatic 

聽 聽DATA 聽 lEdit, lAutoEdit
聽 聽DATA 聽 oGet

聽 聽METHOD New( nRow, nCol, aIcons, aPrompts, aActions, ;
聽 聽 聽 聽 聽 聽 聽 聽oWnd, nHelpId, lNoBorder, bChange, nWidth, nHeight, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽lPixel, lVScroll, lHScroll, nClrFore, nClrBack, ;
聽 聽 聽 聽 聽 聽 聽 聽oFont, oCursor, lDesign, LUPDATE ) CONSTRUCTOR

聽 聽METHOD REDEFINE( nId, aIcons, aPrompts, aActions, oWnd, nHelpId, bChange, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 nClrFore, nClrBack, oFont, oCursor, LUPDATE ) CONSTRUCTOR

聽 聽METHOD Initiate( hDlg ) INLINE Super:Initiate( hDlg ), ::DEFAULT()

聽 聽METHOD DISPLAY() INLINE ::BeginPaint(), ::PAINT(), ::EndPaint()

聽 聽METHOD SetVScroll()
聽 聽METHOD SetHScroll()
聽 聽METHOD SetScrollRange()

聽 聽METHOD DEFAULT()

聽 聽METHOD GetDlgCode( nLastKey )

聽 聽METHOD CoorsUpdate()

聽 聽METHOD PAINT()

聽 聽METHOD END() INLINE AEVAL( ::aIcons, {| hIcon | IF( hIcon != 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 DestroyIcon( hIcon ), Nil ) } ),Super:END()
聽 
聽 聽METHOD _VScroll( nMove )
聽 聽METHOD _HScroll( nMove )

聽 聽METHOD ShowFocus( lFocused )
聽 聽METHOD ChangeFocus( nFocused )

聽 聽METHOD GotFocus( hCtlLost ) INLINE ::ShowFocus( .t. ), Super:GotFocus( hCtlLost )
聽 聽METHOD LostFocus( hWndGetFocus ) INLINE ::ShowFocus( .f. ), Super:LostFocus( hWndGetFocus )

聽 聽METHOD ReSize( nType, nWidth, nHeight ) INLINE Super:ReSize( nType, nWidth, nHeight ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::SetScrollRange()
聽 聽METHOD nGetDown( nRow, nCol )

聽 聽METHOD LButtonDown( nRow, nCol, nFlags )
聽 聽METHOD LButtonUp( nRow, nCol, nFlags )

聽 聽METHOD MouseMove( nRow, nCol, nKeyFlags )

聽 聽METHOD LDblClick( nRow, nCol, nKeyFlags )

聽 聽METHOD EditPrompt( nAt, uVar, bValid, nClrFore, nClrBack )

聽 聽METHOD aGetAway()
聽 聽METHOD nGetTail()

聽 聽METHOD DrawIcon( nAt )

聽 聽METHOD Add( hIcon, cPrompt, bAction )
聽 聽METHOD Modify( hIcon, cPrompt, bAction, nAt )
聽 聽METHOD Del( nAt )

聽 聽METHOD Arrange() INLINE ::Adjust(), ::Refresh(), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::nVScroll := 0, ::nHScroll := 0, ::SetScrollRange()
聽 聽METHOD Invert( nRow, nCol, nRowInit, nColInit )

聽 聽METHOD Adjust()
聽 聽
聽 聽
聽 聽METHOD KeyDown( nKey, nFlags ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
聽 聽METHOD MouseWheel( nKeys, nDelta ) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013
聽 聽METHOD Reset() INLINE nPage:= 0,nView:= 0,::nIcoCol:= 0,::nIcoRow:= 0 // Victor Daniel Cuatecatl Le贸n 12/Ago/2013

ENDCLASS

//----------------------------------------------------------------------------//

METHOD New( nRow, nCol, aIcons, aPrompts, aActions, ;
聽 聽 聽 聽 聽 聽 oWnd, nHelpId, lNoBorder, bChange, nWidth, nHeight, cMsg, ;
聽 聽 聽 聽 聽 聽 lPixel, lVScroll, lHScroll, nClrFore, nClrBack, ;
聽 聽 聽 聽 聽 聽 oFont, oCursor, lDesign, LUPDATE ) CLASS TIconGroup

聽 聽#ifdef __XPP__
聽 聽 聽 #undef New
聽 聽#endif

聽 聽DEFAULT aIcons := {}, aPrompts := {}, aActions := {}
聽 聽DEFAULT nHelpId:= 0
聽 聽DEFAULT nRow := 0, nCol := 0, oWnd := GetWndDefault()
聽 聽DEFAULT lNoBorder := .f., lVScroll := .f., lHScroll := .f.

聽 聽DEFAULT nClrFore := GetSysColor( COLOR_WINDOWTEXT ),;
聽 聽 聽 聽 聽 聽nClrBack := GetSysColor( COLOR_WINDOW )

聽 聽DEFAULT nWidth 聽:= 100, nHeight := 100,;
聽 聽 聽 聽 聽 聽LUPDATE := .f., lDesign := .f.

聽 聽::aIcons 聽 聽= aIcons
聽 聽::aPrompts 聽= aPrompts
聽 聽::aActions 聽= aActions

聽 聽::nTop 聽 聽 聽= IF( lPixel, nRow, nRow * WIN_CHARPIX_H ) //16
聽 聽::nLeft 聽 聽 = IF( lPixel, nCol, nCol * WIN_CHARPIX_W ) //8
聽 聽::nBottom 聽 = ::nTop 聽+ nHeight
聽 聽::nRight 聽 聽= ::nLeft + nWidth
聽 聽::bChange 聽 = bChange
聽 聽::oWnd 聽 聽 聽= oWnd
聽 聽::nStyle 聽 聽= nOR( IF( lNoBorder, 0, WS_BORDER ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lVScroll, WS_VSCROLL, 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lHScroll, WS_HSCROLL, 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 WS_CHILD, WS_VISIBLE, WS_GROUP, WS_TABSTOP,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 IF( lDesign, WS_CLIPSIBLINGS, 0 ) )
聽 聽::nId 聽 聽 聽 = ::GetNewId()
聽 聽::lStatic 聽 = .f.
聽 聽::lDrag 聽 聽 = lDesign
聽 聽::lCaptured = .f.
聽 聽::lEdit 聽 聽 = .f.
聽 聽::oFont 聽 聽 = oFont
聽 聽::oCursor 聽 = oCursor
聽 聽::cMsg 聽 聽 聽= cMsg
聽 聽::LUPDATE 聽 = LUPDATE

聽 聽::lAutoEdit := .f.

聽 聽#ifdef __XPP__
聽 聽 聽 ::nVScroll = 0
聽 聽 聽 ::nHScroll = 0
聽 聽#endif

聽 聽::SETCOLOR( nClrFore, nClrBack )

聽 聽::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )

聽 聽IF ! EMPTY( oWnd:hWnd )
聽 聽 聽 ::CREATE()
聽 聽 聽 ::DEFAULT()
聽 聽 聽 聽oWnd:AddControl( Self )
聽 聽ELSE
聽 聽 聽 oWnd:DefControl( Self )
聽 聽ENDIF

聽 聽IF lDesign
聽 聽 聽 ::CheckDots()
聽 聽ENDIF

RETURN Self

//----------------------------------------------------------------------------//

METHOD REDEFINE( nId, aIcons, aPrompts, aActions, oWnd, nHelpId, bChange, cMsg, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽nClrFore, nClrBack, oFont, oCursor, LUPDATE ) CLASS TIconGroup

聽 聽DEFAULT aIcons := {}, aPrompts := {}, aActions := {}

聽 聽DEFAULT nClrFore := GetSysColor( COLOR_WINDOWTEXT ),;
聽 聽 聽 聽 聽 聽nClrBack := GetSysColor( COLOR_WINDOW )

聽 聽DEFAULT LUPDATE := .f., oWnd := GetWndDefault()
聽 聽DEFAULT nHelpId := 0
聽 聽
聽 聽::aIcons 聽 聽= aIcons
聽 聽::aPrompts 聽= aPrompts
聽 聽::aActions 聽= aActions

聽 聽::nId 聽 聽 聽 = nId
聽 聽::bChange 聽 = bChange
聽 聽::oWnd 聽 聽 聽= oWnd
聽 聽::lStatic 聽 = .f.
聽 聽::lDrag 聽 聽 = .f.
聽 聽::lCaptured = .f.
聽 聽::lEdit 聽 聽 = .f.
聽 聽::oFont 聽 聽 = oFont
聽 聽::oCursor 聽 = oCursor
聽 聽::cMsg 聽 聽 聽= cMsg
聽 聽::LUPDATE 聽 = LUPDATE

聽 聽::lAutoEdit := .f.

聽 聽#ifdef __XPP__
聽 聽 聽 ::nVScroll = 0
聽 聽 聽 ::nHScroll = 0
聽 聽#endif

聽 聽::SETCOLOR( nClrFore, nClrBack )

聽 聽::Register( nOR( CS_VREDRAW, CS_HREDRAW ) )

聽 聽IF oWnd != Nil
聽 聽 聽 oWnd:DefControl( Self )
聽 聽ENDIF

RETURN Self

//----------------------------------------------------------------------------//

METHOD SetVScroll() CLASS TIconGroup

聽 DEFINE SCROLLBAR ::oVScroll OF Self ;
聽 聽 聽 聽VERTICAL ;
聽 聽 聽 聽RANGE 0, 1 ;
聽 聽 聽 聽PAGESTEP 1 ;
聽 聽 聽 聽ON UP ::_VScroll( -STEP_VSCROLL ) ;
聽 聽 聽 聽ON DOWN ::_VScroll( STEP_VSCROLL ) /*;
聽 聽 聽 聽ON PAGEUP ::_VScroll( 1 * -STEP_VSCROLL) ;
聽 聽 聽 聽ON PAGEDOWN ::_VScroll( 1 * STEP_VSCROLL )*/


聽 ::oVSCroll:bPos := {| nPos | ::_VScroll( ( nPos - ::oVScroll:GetPos() ) * STEP_VSCROLL ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nPos) }

聽 ::oVSCroll:bTrack := ::oVSCroll:bPos

RETURN Nil

//----------------------------------------------------------------------------//

METHOD SetHScroll() CLASS TIconGroup

聽 聽DEFINE SCROLLBAR ::oHScroll OF Self ;
聽 聽 聽 聽HORIZONTAL ;
聽 聽 聽 聽RANGE 0, 0 ;
聽 聽 聽 聽PAGESTEP 1 ;
聽 聽 聽 聽ON UP ::_HScroll( -STEP_HSCROLL ) ;
聽 聽 聽 聽ON DOWN ::_HScroll( STEP_HSCROLL ) ;
聽 聽 聽 聽ON PAGEUP ::_HScroll( 1 * -STEP_HSCROLL) ;
聽 聽 聽 聽ON PAGEDOWN ::_HScroll( 1 * STEP_HSCROLL )

聽 ::oHSCroll:bPos := {| nPos | ::_HSCroll( ( nPos - ::oHSCroll:GetPos() ) * STEP_HSCROLL ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oHSCroll:SETPOS(nPos) }

聽 ::oHSCroll:bTrack := ::oHSCroll:bPos

RETURN Nil

//----------------------------------------------------------------------------//

METHOD SetScrollRange() CLASS TIconGroup

LOCAL nVMax, nHMax
LOCAL aAway := ::aGetAway()
LOCAL nAlto := ::nBottom - ::nTop
聽
聽 IF LEN( ::aIcons ) = 0

聽 聽 聽nVMax := 0
聽 聽 聽nHMax := 0

聽 ELSE

聽 聽 聽nVMax := aAway[ 1 ]
聽 聽 聽nHMax := aAway[ 2 ]


IF nVMax <> nFirst .AND. nFirst > 0 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoRow:= ::nIcoRow + 1
ENDIF

IF nHMax <> nLast 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoCol:= ::nIcoCol + 1
ENDIF


nFirst:= nVMax 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽nLast:= nHMax 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽

IF LEN(::aIcons) > (::nIcoRow * ::nIcoCol) 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 聽 ::nIcoRow:= ::nIcoRow + 1
ENDIF 



聽 nVMax := IF( nVMax < nAlto .AND. ::nVScroll = 0, ; 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 // Victor Daniel Cuatecatl Le贸n 02/Sep/2013
聽 聽 聽 聽 聽 聽 聽 (0), (nView:= nView + 1,(((nVMax - nAlto) + STEP_VCOORS) / STEP_VSCROLL)))
聽 聽 
聽 聽 
聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 nHMax := IF( nHMax < ( (::nRight - ::nLeft) - STEP_HCOORS ) .AND. ::nHScroll = 0, ;
聽 聽 聽 聽 聽 聽 聽 (0), ( nHMax - SOURCE_HCOORS ) / STEP_HSCROLL )

聽 ENDIF

聽 IF ::oVScroll != Nil
聽 聽 聽::oVScroll:SetRange( 0, nVMax)
聽 聽 聽::oVScroll:SETPOS( ::nVScroll )
聽 ENDIF
聽 IF ::oHScroll != Nil
聽 聽 聽::oHScroll:SetRange( 0, nHMax )
聽 聽 聽::oHScroll:SETPOS( ::nHScroll )
聽 ENDIF


nScrPos:= (nVMax / ::nIcoRow)
聽 nDown:= nScrPos

RETURN Nil

//----------------------------------------------------------------------------//

METHOD DEFAULT() CLASS TIconGroup

聽 聽LOCAL nLen

聽 聽LOCAL aRect := GetCoors( ::hWnd )

聽 聽LOCAL nIcons 聽 := LEN( ::aIcons )
聽 聽LOCAL nPrompts := LEN( ::aPrompts )
聽 聽LOCAL nActions := LEN( ::aActions )

聽 聽IF ::oFont != Nil
聽 聽 聽 ::SetFont( ::oFont )
聽 聽ELSE
聽 聽 聽 ::SetFont( ::oWnd:oFont )
聽 聽ENDIF

聽 聽IF lAnd( GetWindowLong( ::hWnd, GWL_STYLE ), WS_VSCROLL )
聽 聽 聽 ::SetVScroll()
聽 聽ENDIF
聽 聽IF lAnd( GetWindowLong( ::hWnd, GWL_STYLE ), WS_HSCROLL )
聽 聽 聽 ::SetHScroll()
聽 聽ENDIF

聽 聽::nTop 聽 聽= aRect[1]
聽 聽::nLeft 聽 = aRect[2]
聽 聽::nBottom = aRect[3]
聽 聽::nRight 聽= aRect[4]

聽 聽nLen = MAX( nIcons, nPrompts )

聽 聽IF nLen == 0

聽 聽 聽 ::aIcons := {}
聽 聽 聽 ::aPrompts := {}
聽 聽 聽 ::aActions := {}
聽 聽 聽 ::aCoors := {}
聽 聽 聽 ::aOrder := {}

聽 聽 聽 ::nFocused 聽= 0

聽 聽ELSE

聽 聽 聽 ASIZE( ::aIcons, nLen ); 聽 AFILL( ::aIcons, "", nIcons + 1 )
聽 聽 聽 AEVAL( ::aIcons, {| cIcon, nAt | ::aIcons[ nAt ] := IF( FILE( cIcon ), ;
聽 聽 聽 聽 聽 聽 聽ExtractIcon( cIcon ), LoadIcon( GetResources(), cIcon ) ) } )

聽 聽 聽 // AEval( ::aPrompts, {| cPrompt, nPrompt | ::aPrompts[ nPrompt ] += Chr(0) } )
聽 聽 聽 ASIZE( ::aPrompts, nLen ); AFILL( ::aPrompts, "", nPrompts + 1 )
聽 聽 聽 ASIZE( ::aActions, nLen ); AFILL( ::aActions, {|| Nil }, nActions + 1 )

聽 聽 聽 ::aCoors = ARRAY( nLen, 8 )
聽 聽 聽 ::aOrder = ARRAY( nLen )

聽 聽 聽 ::nFocused 聽= 1

聽 聽ENDIF

聽 聽::Adjust(); ::DISPLAY(); ::SetScrollRange()


RETURN Nil

//----------------------------------------------------------------------------//

METHOD GetDlgCode( nLastKey ) CLASS TIconGroup

聽 聽IF .not. ::oWnd:lValidating
聽 聽 聽 IF nLastKey == VK_RETURN .OR. nLastKey == VK_TAB
聽 聽 聽 聽 聽::oWnd:nLastKey = nLastKey
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN DLGC_WANTALLKEYS

//----------------------------------------------------------------------------//

METHOD PAINT() CLASS TIconGroup

聽 聽LOCAL n, nAt
聽 聽LOCAL hDC, hFont

聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 聽FOR n := 1 TO LEN( ::aOrder )

聽 聽 聽 nAt := ::aOrder[ n ]
聽 聽 聽 ::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, .f., .f., ::lEdit )
聽 聽NEXT

聽 聽ReleaseDC( ::hWnd, hDC )

聽 聽::ShowFocus( ::lFocused )

RETURN Super:PAINT()

//----------------------------------------------------------------------------//

METHOD _VScroll( nMove ) CLASS TIconGroup

聽 LOCAL aRect := GetClientRect( ::hWnd )

聽 IF ( ::nVScroll + nMove ) < 0
聽 聽 聽nMove := -::nVScroll
聽 ENDIF

聽 IF ( ::nVScroll + nMove ) > ( ::oVScroll:nMax * STEP_VSCROLL )
聽 聽 聽nMove := ( ::oVScroll:nMax * STEP_VSCROLL ) - ::nVScroll
聽 ENDIF

聽 AEVAL( ::aCoors, {| aCoor | aCoor[ 1 ] -= nMove } )
聽 ScrollWindow( ::hWnd, 0, -nMove, aRect, aRect )

聽 ::nVScroll += nMove

RETURN Nil

//----------------------------------------------------------------------------//

METHOD _HScroll( nMove ) CLASS TIconGroup

聽 LOCAL aRect := GetClientRect( ::hWnd )

聽 IF ( ::nHScroll + nMove ) < 0
聽 聽 聽nMove := -::nHScroll
聽 ENDIF

聽 IF ( ::nHScroll + nMove ) > ( ::oHScroll:nMax * STEP_HSCROLL )
聽 聽 聽nMove := ( ::oHScroll:nMax * STEP_HSCROLL ) - ::nHScroll
聽 ENDIF

聽 AEVAL( ::aCoors, {| aCoor | aCoor[ 2 ] -= nMove } )
聽 ScrollWindow( ::hWnd, -nMove, 0, aRect, aRect )

聽 ::nHScroll += nMove

RETURN Nil

//----------------------------------------------------------------------------//

METHOD ShowFocus( lFocused ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nFocused
聽 聽LOCAL hDC, hFont

聽 聽IF nAt == 0
聽 聽 聽 RETURN Nil
聽 聽ENDIF

聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 聽::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, lFocused, .t., ::lEdit )

聽 聽ReleaseDC( ::hWnd, hDC )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD ChangeFocus( nFocused ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nFocused
聽 聽LOCAL hDC, hFont

聽 聽IF nAt == 0 .OR. nAt == nFocused
聽 聽 聽 RETURN Nil
聽 聽ENDIF

聽 聽hDC 聽 := GetDC( ::hWnd )
聽 聽hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 聽ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, .f., .f., .f. )

聽 聽ExtDrawIcon( hDC, ::aCoors[ nFocused, 1 ], ::aCoors[ nFocused, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 ::aIcons[ nFocused ], ::aPrompts[ nFocused ], hFont,;
聽 聽 聽 聽 聽 聽 聽 聽 ::nClrText, ::nClrPane, ::lFocused, .t., .f. )

聽 聽ReleaseDC( ::hWnd, hDC )

聽 聽::nFocused = nFocused

聽 聽ADEL( ::aOrder, ASCAN( ::aOrder, ::nFocused ) )
聽 聽::aOrder[ LEN( ::aIcons ) ] := ::nFocused

聽 聽::lEdit := .f.

聽 聽IF ::bChange != Nil
聽 聽 聽 EVAL( ::bChange )
聽 聽ENDIF

RETURN Nil

//----------------------------------------------------------------------------//

METHOD nGetDown( nRow, nCol ) CLASS TIconGroup

聽 LOCAL n, nAt, nDown := 0

聽 聽 聽FOR n := LEN( ::aOrder ) TO 1 step -1

聽 聽 聽 nAt := ::aOrder[ n ]

聽 聽 聽 IF nRow >= ::aCoors[ nAt, 1 ] .AND. nRow <= ::aCoors[ nAt, 3 ] .AND. ;
聽 聽 聽 聽 聽nCol >= ::aCoors[ nAt, 2 ] .AND. nCol <= ::aCoors[ nAt, 4 ]

聽 聽 聽 聽 聽nDown := nAt
聽 聽 聽 聽 聽EXIT

聽 聽 聽 ENDIF

聽 聽 聽 IF nRow >= ::aCoors[ nAt, 5 ] .AND. nRow <= ::aCoors[ nAt, 7 ] .AND. ;
聽 聽 聽 聽 聽nCol >= ::aCoors[ nAt, 6 ] .AND. nCol <= ::aCoors[ nAt, 8 ]

聽 聽 聽 聽 聽::lEdit := .t.

聽 聽 聽 聽 聽nDown := nAt
聽 聽 聽 聽 聽EXIT

聽 聽 聽 ENDIF

聽 NEXT

RETURN nDown

//----------------------------------------------------------------------------//

METHOD LButtonDown( nRow, nCol, nFlags ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nGetDown( nRow, nCol )

聽 聽IF !::lFocused
聽 聽 聽 ::SetFocus()
聽 聽ENDIF

聽 聽IF nAt = 0
聽 聽 聽 ::lEdit := .f.
聽 聽ELSE
聽 聽 聽 ::ChangeFocus( nAt )
聽 聽ENDIF

聽 聽IF nAt = 0 .OR. ::lStatic .OR. ::lDrag
聽 聽 聽 RETURN Super:LButtonDown( nRow, nCol, nFlags )
聽 聽ENDIF

聽 聽IF ! ::lCaptured

聽 聽 聽 ::lCaptured = .t.
聽 聽 聽 ::Capture()
聽 聽 聽 ::Invert( , , nRow, nCol )

聽 聽ENDIF

聽 聽Super:LButtonDown( nRow, nCol, nFlags )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD LButtonUp( nRow, nCol, nFlags ) CLASS TIconGroup

聽 聽LOCAL nAt

聽 聽IF ( ::lStatic .AND. !::lEdit ) .OR. ::lDrag
聽 聽 聽 RETURN Super:LButtonUp( nRow, nCol, nFlags )
聽 聽ENDIF

聽 聽IF ::lCaptured

聽 聽 聽 ::lCaptured = .f.
聽 聽 聽 ReleaseCapture()
聽 聽 聽 ::Invert()

聽 聽 聽 ::PAINT(); ::SetScrollRange()

聽 聽ENDIF

聽 聽IF ::lEdit
聽 聽 聽 IF ::lAutoEdit
聽 聽 聽 聽 聽nAt := ::nFocused
聽 聽 聽 聽 聽::EditPrompt( nAt, ::aPrompts[ nAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{|uVar| IF( uVar != Nil, ::aPrompts[ nAt ] := uVar, ), ::DrawIcon( nAt ) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽GetSysColor( COLOR_WINDOWTEXT ), GetSysColor( COLOR_CAPTIONTEXT ) ) // ::nClrText, ::nClrPane
聽 聽 聽 ELSE
聽 聽 聽 聽 聽::lEdit := .f.
聽 聽 聽 聽 聽::PAINT(); ::SetScrollRange()
聽 聽 聽 ENDIF
聽 聽ELSE
聽 聽 聽 ::lEdit := .f.
聽 聽ENDIF

聽 聽Super:LButtonUp( nRow, nCol, nFlags )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD MouseMove( nRow, nCol, nKeyFlags ) CLASS TIconGroup

聽 聽IF ::lStatic .OR. ::lDrag
聽 聽 聽 RETURN Super:MouseMove( nRow, nCol, nKeyFlags )
聽 聽ENDIF

聽 聽IF ::lCaptured
聽 聽 聽 ::Invert( nRow, nCol )
聽 聽 聽 ::lEdit := .f.
聽 聽 聽 RETURN 0
聽 聽ELSE
聽 聽 聽 ::oWnd:SetMsg( ::cMsg )
聽 聽ENDIF

聽 聽IF ::oCursor != Nil
聽 聽 聽 SETCURSOR( ::oCursor:hCursor )
聽 聽ELSE
聽 聽 聽 CursorArrow()
聽 聽ENDIF

RETURN 0

//----------------------------------------------------------------------------//

METHOD LDblClick( nRow, nCol, nKeyFlags ) CLASS TIconGroup

聽 聽LOCAL nAt := ::nGetDown( nRow, nCol )

聽 聽IF nAt == 0
聽 聽 聽 RETURN Super:LDblClick( nRow, nCol, nKeyFlags )
聽 聽ENDIF

聽 聽::lEdit:= .f.

聽 聽EVAL( ::aActions[ nAt ], Self )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD EditPrompt( nAt, uVar, bValid, nClrFore, nClrBack ) CLASS TIconGroup

聽 聽LOCAL oFont
聽 聽LOCAL nWidth, nHeight
聽 聽LOCAL aDim, aPos

聽 聽uVar := STRTRAN( uVar, CHR(10), CRLF )

聽 聽aDim 聽 := ::aCoors[ nAt ]

聽 聽aPos := { aDim[5] - 1, aDim[6] - 1 }

聽 聽nWidth 聽:= MAX( aDim[8] - aDim[6] + 1, 26 )
聽 聽nHeight := aDim[7] - aDim[5] + 2

聽 聽// ScreenToClient( Self:hWnd, aPos )

聽 聽DEFAULT nClrFore := ::nClrText ,;
聽 聽 聽 聽 聽 聽nClrBack := ::nClrPane ,;
聽 聽 聽 聽 聽 聽bValid 聽 := {|| Nil }

聽 聽IF ::oGet != Nil .AND. ! EMPTY( ::oGet:hWnd )
聽 聽 聽 ::oGet:END()
聽 聽ENDIF

聽 聽IF ::oFont != Nil
聽 聽 聽 oFont = TFont():New( ::oFont:cFaceName, ::oFont:nWidth,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::oFont:nHeight, .f., ::oFont:lBold )
聽 聽ENDIF

聽 聽::oGet:=TIconGet():New( aPos[ 1 ], aPos[ 2 ], bSETGET( uVar ), Self,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nWidth, nHeight, oFont,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nClrFore, nClrBack )

聽 聽::nLastKey := 0
聽 聽// ::Set3dLook()
聽 聽::oGet:SetFocus()

聽 聽::oGet:SelectAll()

聽 聽::oGet:bLostFocus := {|| uVar := STRTRAN( ::oGet:cText(), CRLF, " " ),;
聽 聽 聽 IF( Self:nLastKey != VK_ESCAPE,;
聽 聽 聽 EVAL( bValid, uVar, Self:nLastKey ),;
聽 聽 聽 EVAL( bValid, Nil, Self:nLastKey ) ),;
聽 聽 聽 ::oGet:END(), ::lEdit:= .f. }

聽 聽::oGet:bKeyDown := { | nKey | IF( nKey == VK_RETURN .OR. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽nKey == VK_ESCAPE, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 (Self:nLastKey := nKey, ::oGet:END(), ::lEdit := .f. ),) }

RETURN .f.

//----------------------------------------------------------------------------//

METHOD aGetAway() CLASS TIconGroup

聽 LOCAL nRow := 0, nCol := 0

聽 IF !EMPTY( ::aCoors )

聽 聽 聽AEVAL( ::aCoors, { | aCoor | nRow := MAX( nRow, aCoor[ 1 ] ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 nCol := MAX( nCol, aCoor[ 2 ] ) } )
聽 ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
RETURN({ nRow + ::nVScroll, nCol + ::nHScroll })
聽 聽
聽 聽
//----------------------------------------------------------------------------//

METHOD nGetTail() CLASS TIconGroup
聽 
聽 LOCAL nRow, nCol
聽 LOCAL nTail := LEN( ::aIcons )

聽 IF nTail > 0
聽 
聽 聽 聽nRow := ::aCoors[ nTail, 1 ]
聽 聽 聽AEVAL( ::aCoors, { | aCoor, nCoor | IF( aCoor[ 1 ] > nRow, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( nRow := aCoor[ 1 ], nTail := nCoor ), Nil ) } )

聽 聽 聽nCol := ::aCoors[ nTail, 1 ]
聽 聽 聽AEVAL( ::aCoors, { | aCoor, nCoor | IF( aCoor[ 1 ] = nRow .AND. aCoor[ 2 ] > nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( nCol := aCoor[ 2 ], nTail := nCoor ), Nil ) } )
聽 ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽

RETURN( nTail )
聽 聽 聽 
//----------------------------------------------------------------------------//

METHOD DrawIcon( nAt ) CLASS TIconGroup

聽 LOCAL hDC, hFont
聽 
聽 hDC 聽 := GetDC( ::hWnd )
聽 hFont := IF( ::oFont != Nil, ::oFont:hFont, 0 )

聽 ::aCoors[ nAt ] = ExtDrawIcon( hDC, ::aCoors[ nAt, 1 ], ::aCoors[ nAt, 2 ], ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aIcons[ nAt ], ::aPrompts[ nAt ], hFont, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::nClrText, ::nClrPane, .f., .f., ::lEdit )

聽 ReleaseDC( ::hWnd, hDC )
聽 聽
RETURN Nil
聽 聽 聽 
//----------------------------------------------------------------------------//

METHOD Add( hIcon, cPrompt, bAction ) CLASS TIconGroup

聽 LOCAL nAt := LEN( ::aIcons ) + 1
聽 
聽 LOCAL nTail := ::nGetTail() 
聽 LOCAL nX := SOURCE_HCOORS, nY := SOURCE_VCOORS
聽 
聽 LOCAL aRect := GetClientRect( ::hWnd ) 

聽 DEFAULT hIcon := 0, cPrompt := "", bAction := {|| Nil }
聽 
聽 IF hIcon == 0 .AND. cPrompt == ""
聽 聽 聽RETURN Nil
聽 ENDIF

聽 IF nAt > 1
聽 聽 聽nY := ::aCoors[ nTail, 1 ] 聽
聽 聽 聽nX := ::aCoors[ nTail, 2 ]
聽 聽 聽
聽 聽 聽nX += STEP_HCOORS
聽 聽 聽IF nX + LAPSTEP_HCOORS > aRect[4]
聽 聽 聽 聽 nX := SOURCE_HCOORS
聽 聽 聽 聽 nY += STEP_VCOORS
聽 聽 聽END 
聽 ELSE 聽 
聽 聽 聽::nFocused := 1
聽 ENDIF 聽 

聽 AADD( ::aIcons, hIcon )
聽 AADD( ::aPrompts, cPrompt )
聽 AADD( ::aActions, bAction )
聽 
聽 AADD( ::aCoors, { nY, nX, 0, 0, 0, 0, 0, 0 } ) 聽
聽 AADD( ::aOrder, nAt )

聽 ::DrawIcon( nAt ); ::SetScrollRange()
聽 
聽 ::Refresh( .f. )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD Modify( hIcon, cPrompt, bAction, nAt ) CLASS TIconGroup

聽 DEFAULT hIcon := 0, cPrompt := "", bAction := {|| Nil }
聽 
聽 IF ( hIcon == 0 .AND. cPrompt == "" ) .OR. ;
聽 聽 聽nAt > LEN( ::aIcons)
聽 聽 聽RETURN Nil
聽 ENDIF

聽 IF ::aIcons[ nAt ] != 0
聽 聽 聽DestroyIcon( ::aIcons[ nAt ] )
聽 ENDIF 聽 
聽 
聽 ::aIcons[ nAt ] := hIcon
聽 ::aPrompts[ nAt ] := cPrompt
聽 ::aActions[ nAt ] := bAction

聽 ::DrawIcon( nAt ); ::SetScrollRange() 
聽 
聽 ::Refresh( .t. )

RETURN Nil

//----------------------------------------------------------------------------//

METHOD Del( nAt ) CLASS TIconGroup

聽 LOCAL nLen := LEN( ::aIcons ) - 1

聽 IF nAt > nLen + 1 .OR. nAt = 0 .OR. nLen < 0
聽 聽 聽RETURN Nil
聽 ENDIF
聽 
聽 ADEL( ::aIcons, nAt ); 聽 ASIZE( ::aIcons, nLen )
聽 ADEL( ::aPrompts, nAt ); ASIZE( ::aPrompts, nLen )
聽 ADEL( ::aActions, nAt ); ASIZE( ::aActions, nLen )

聽 ADEL( ::aCoors, nAt ); 聽 ASIZE( ::aCoors, nLen )
聽 ADEL( ::aOrder, ASCAN( ::aOrder, nAt ) ); ASIZE( ::aOrder, nLen )
聽 AEVAL( ::aOrder, {|u,n| IF( u > nAt, ::aOrder[ n ] := u - 1, ) } )

聽 IF nAt < ::nFocused
聽 聽 聽::nFocused--
聽 ELSEIF nAt == ::nFocused
聽 聽 聽::nFocused := IF( nLen == 0, 0, 1 )
聽 ENDIF 聽
聽 
聽 ::SetScrollRange() 
聽 
聽 ::Refresh()
聽 
聽 IF nLen == 0
聽 ::Reset() 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 01/Sep/2013
聽 ENDIF
聽 
RETURN Nil

//----------------------------------------------------------------------------//

METHOD KeyDown( nKey, nFlags ) CLASS TIconGroup 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013

LOCAL cPrompt, nNewPos
LOCAL 聽 聽 nAt:= ::nFocused
LOCAL 聽nSteep:= ::nIcoCol
LOCAL 聽 聽nLen:= LEN(::aIcons)
LOCAL nVisibl:= nLen - nView
LOCAL 聽 聽XPos:= STEP_VCOORS * (nVisibl / ::nIcoCol)
LOCAL 聽nRango:= (::oVScroll:GetRange()[2] / ::nIcoRow) * (nVisibl / ::nIcoCol)

聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽DO CASE
聽 聽 聽 CASE nKey == VK_UP
聽 聽 聽 聽 聽 聽 IF nAT <= nLen .AND. nAt - nSteep >= 1
聽 聽 聽 聽 聽 聽 nDown:= nDown - nScrPos
聽 聽 聽 聽 聽 聽 聽 聽 nAt:= nAt - nSteep
聽 聽 聽 聽 聽 聽ENDIF 聽

聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nDown)
聽 聽 聽 聽 聽 聽::_VScroll((-STEP_VSCROLL * 4.5))
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt) 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_DOWN
聽 聽 聽 聽 聽 聽IF nAT >= 1 .AND. nAt + nSteep <= nLen
聽 聽 聽 聽 聽 聽nDown:= nDown + nScrPos
聽 聽 聽 聽 聽 聽 聽 聽nAt:= nAt + nSteep
聽 聽 聽 聽 聽 聽ELSEIF nAT > nLen
聽 聽 聽 聽 聽 聽 聽 聽nAt:= nLen 
聽 聽 聽 聽 聽 聽ENDIF
聽 
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nDown)
聽 聽 聽 聽 聽 聽::_VScroll((STEP_VSCROLL * 4.5))
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt) 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_LEFT
聽 聽 聽 聽 聽 聽IF nAT > 1
聽 聽 聽 聽 聽 聽 聽 nAt:= nAt - 1
聽 聽 聽 聽 聽 聽ENDIF 聽 
聽 聽 聽 聽 聽 聽::ChangeFocus( nAt )
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_RIGHT
聽 聽 聽 聽 聽 聽IF nAT < nLen
聽 聽 聽 聽 聽 聽 聽 nAt:= nAt + 1
聽 聽 聽 聽 聽 聽ENDIF 聽 
聽 聽 聽 聽 聽 聽::ChangeFocus(nAt)
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 
聽 聽 聽 CASE nKey == VK_HOME
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(1)
聽 聽 聽 聽 聽 聽::_VScroll((-STEP_VSCROLL * (nLen+::nIcoRow)))
聽 聽 聽 聽 聽 聽::ChangeFocus(1)
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_END
聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nLen)
聽 聽 聽 聽 聽 聽::_VScroll((STEP_VSCROLL * (nLen +::nIcoRow)))
聽 聽 聽 聽 聽 聽::ChangeFocus(nLen)
聽 聽 聽 聽 聽 聽::Refresh() 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_PRIOR
聽 聽 聽 聽 聽 聽 nAt:= nAt - nVisibl
聽 聽 聽 聽 聽 聽 IF nAt < 1
聽 聽 聽 聽 聽 聽 聽 ::ChangeFocus(1)
聽 聽 聽 聽 聽 聽 ELSE
聽 聽 聽 聽 聽 聽 聽 ::ChangeFocus(nAt)
聽 聽 聽 聽 聽 聽 聽 nPage:= nPage - nRango
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 nNewPos:= ::oVScroll:GetPos()

聽 聽 聽 聽 聽 聽 IF nNewPos >= 0
聽 聽 聽 聽 聽 聽 聽 聽::_VScroll(-XPos)
聽 聽 聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nPage)
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 CASE nKey == VK_NEXT
聽 聽 聽 聽 聽 聽 nAt:= nAt + nVisibl
聽 聽 聽 聽 聽 聽 IF nAt > nLen
聽 聽 聽 聽 聽 聽 聽 ::ChangeFocus(nLen)
聽 聽 聽 聽 聽 聽 聽 //nPage:= nPage + nRango
聽 聽 聽 聽 聽 聽 ELSE
聽 聽 聽 聽 聽 聽 聽 聽::ChangeFocus(nAt)
聽 聽 聽 聽 聽 聽 聽 聽nPage:= nPage + nRango
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 nNewPos:= ::oVScroll:GetPos()
聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 IF nNewPos < ::oVScroll:GetRange()[2] 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 聽 聽::_VScroll(XPos)
聽 聽 聽 聽 聽 聽 聽 聽::oVScroll:SETPOS(nPage)
聽 聽 聽 聽 聽 聽 ENDIF
聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽RETURN 0

聽 聽 聽 CASE nKey == VK_F2 
聽 聽 聽 聽 聽 聽IF ::lAutoEdit
聽 聽 聽 聽 聽 聽 聽 ::lEdit := .t.
聽 聽 聽 聽 聽 聽 聽 MSGInfo(cPrompt)
聽 聽 聽 聽 聽 聽 聽 cPrompt := ::aPrompts[nAt]
聽 聽 聽 聽 聽 聽 聽 ::EditPrompt( nAt, cPrompt,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{|uVar| IF( uVar != Nil, ::aPrompts[ nAt ] := uVar, ), ::DrawIcon( nAt ) },;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽GetSysColor( COLOR_WINDOWTEXT ), GetSysColor( COLOR_CAPTIONTEXT ) ) // ::nClrText, ::nClrPane 
聽 聽 聽 聽 聽 聽 聽 RETURN 0
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽
聽 聽ENDCASE


RETURN Super:KeyDown( nKey, nFlags )

//----------------------------------------------------------------------------//

METHOD Invert( nRow, nCol, nRowInit, nColInit ) CLASS TIconGroup

聽 聽STATIC nInitRow, nInitCol, nOldRow, nOldCol
聽 聽
聽 聽LOCAL nAt := ::nFocused 
聽 聽LOCAL lErase := .f.

聽 聽::GetDC()
聽 聽
聽 聽IF nRow = Nil .AND. nCol = Nil
聽 聽
聽 聽 聽 IF nRowInit = Nil .AND. nColInit = Nil
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽lErase = .t. 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽::aCoors[ nAt ] = { ::aCoors[ nAt, 1 ] + nOldRow, ::aCoors[ nAt, 2 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nOldRow, ::aCoors[ nAt, 4 ] + nOldCol, ; 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 5 ] + nOldRow, ::aCoors[ nAt, 6 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nOldRow, ::aCoors[ nAt, 8 ] + nOldCol }

聽 聽 聽 ELSE

聽 聽 聽 聽 聽nInitRow = nRowInit
聽 聽 聽 聽 聽nInitCol = nColInit

聽 聽 聽 ENDIF
聽 聽 聽 
聽 聽 聽 nRow = 0
聽 聽 聽 nCol = 0
聽 聽
聽 聽ELSE

聽 聽 聽IF nRow < 0 .OR. ( nRow + ::nTop > ::nBottom ) .OR. ;
聽 聽 聽 聽 nCol < 0 .OR. ( nCol + ::nLeft > ::nRight ) 
聽 聽 聽 聽 ::ReleaseDC()
聽 聽 聽 聽 RETURN Nil
聽 聽 聽ENDIF 聽 
聽 
聽 聽 聽nRow = nRow - nInitRow
聽 聽 聽nCol = nCol - nInitCol

聽 聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 1 ] + nOldRow, ::aCoors[ nAt, 2 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nOldRow, ::aCoors[ nAt, 4 ] + nOldCol )
聽 聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 5 ] + nOldRow, ::aCoors[ nAt, 6 ] + nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nOldRow, ::aCoors[ nAt, 8 ] + nOldCol )
聽 聽
聽 聽ENDIF

聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 1 ] + nRow, ::aCoors[ nAt, 2 ] + nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] + nRow, ::aCoors[ nAt, 4 ] + nCol )
聽 聽DrawFocusRect( ::hDC, ::aCoors[ nAt, 5 ] + nRow, ::aCoors[ nAt, 6 ] + nCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] + nRow, ::aCoors[ nAt, 8 ] + nCol )
聽 聽
聽 聽IF lErase
聽 聽 聽 FillRect( ::hDC, { ::aCoors[ nAt, 1 ] - nOldRow, ::aCoors[ nAt, 2 ] - nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 3 ] - nOldRow, ::aCoors[ nAt, 4 ] - nOldCol }, ::oBrush:hBrush )
聽 聽 聽 FillRect( ::hDC, { ::aCoors[ nAt, 5 ] - nOldRow, ::aCoors[ nAt, 6 ] - nOldCol, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::aCoors[ nAt, 7 ] - nOldRow, ::aCoors[ nAt, 8 ] - nOldCol }, ::oBrush:hBrush ) 聽 聽 
聽 聽ENDIF 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽nOldRow = nRow
聽 聽nOldCol = nCol
聽 聽 聽 聽
聽 聽::ReleaseDC()

RETURN Nil

//----------------------------------------------------------------------------//

METHOD Adjust() CLASS TIconGroup

聽 LOCAL nAt
聽 LOCAL nX := SOURCE_HCOORS, nY := SOURCE_VCOORS
聽 聽 
聽 LOCAL aRect := GetClientRect( ::hWnd ) 

聽 FOR nAt:= 1 TO LEN( ::aIcons )

聽 聽 聽 ::aCoors[ nAt, 1 ] := nY
聽 聽 聽 ::aCoors[ nAt, 2 ] := nX

聽 聽 聽 ::aOrder[ nAt ] := nAt
聽 聽 聽 聽 聽 聽 
聽 聽 聽 nX += STEP_HCOORS
聽 聽 聽 IF nX + LAPSTEP_HCOORS > aRect[4]
聽 聽 聽 聽 聽nX := SOURCE_HCOORS
聽 聽 聽 聽 聽nY += STEP_VCOORS
聽 聽 聽 END 聽 
聽 
聽 NEXT

RETURN Nil

//----------------------------------------------------------------------------//

METHOD CoorsUpdate() CLASS TIconGroup

聽 聽LOCAL aRect := GetCoors( ::hWnd )

聽 聽::nTop 聽 聽= aRect[ 1 ]
聽 聽::nLeft 聽 = aRect[ 2 ]
聽 聽::nBottom = aRect[ 3 ]
聽 聽::nRight 聽= aRect[ 4 ]

RETURN Nil

//----------------------------------------------------------------------------//
// R.Avenda帽o. 1998

//----------------------------------------------------------------------------//

METHOD MouseWheel( nKeys, nDelta ) CLASS TIconGroup 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽// Victor Daniel Cuatecatl Le贸n 12/Ago/2013

LOCAL 聽 nAt := ::nFocused
LOCAL 聽nLen := LEN( ::aIcons )

聽 聽 聽 IF lAnd( nKeys, MK_MBUTTON )
聽 聽 聽 聽 聽IF nDelta > 0
聽 聽 聽 聽 聽 聽IF ++nAT > nLen
聽 聽 聽 聽 聽 聽 聽 nAt = 1
聽 聽 聽 聽 聽 聽ENDIF 聽 聽 聽 聽 聽 聽 聽 
聽 聽 聽 聽 聽ELSE
聽 聽 聽 聽 聽 聽IF --nAT < 1
聽 聽 聽 聽 聽 聽 聽 nAt = nLen
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽::ChangeFocus( nAt )
聽 聽 聽 聽 聽::oVScroll:SETPOS(nAt)
聽 聽 聽 ELSE
聽 聽 聽 聽 
聽 聽 聽 聽 聽 聽IF nDelta > 0
聽 聽 聽 聽 聽 聽::_VScroll( -STEP_VSCROLL)
聽 聽 聽 聽 聽 聽::oVScroll:PageUp()
聽 聽 聽 聽 聽ELSE
聽 聽 聽 聽 聽 聽::_VScroll( STEP_VSCROLL)
聽 聽 聽 聽 聽 聽::oVScroll:PageDown()
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽 聽
聽 聽 ENDIF

RETURN Nil



Maurizio:

Attempts to compile in your project file IGroup.prg before the libraries of fivewin:

Called from: C:\FWH_07\my_fw\igroup.prg => TICONGROUP:KEYDOWN( 879 )


The Method TICONGROUP:KEYDOWN( 879 ) does not correspond to the file IGroup.prg that modify.

In my File exist: ADEL( ::aPrompts, nAt ); ASIZE( ::aPrompts, nLen ) of METHOD Del( nAt ) CLASS TIconGroup.

Regards.
Soluciones y Dise帽o de Software
Damos Soluciones...

I.S.C. Victor Daniel Cuatecatl Leon
Director y Dise帽ador de Proyectos

http://www.soldisoft.unlugar.com
http://www.sisa.unlugar.com
danyleon82@hotmail.com
www.facebook.com/victordaniel.cuatecatlleon

Continue the discussion