PUBLIC ofrm
ofrm=CREATEOBJECT("MyForm")
ofrm.show()
DEFINE CLASS MyForm as Form
ADD OBJECT lst as MyList
PROCEDURE init
CREATE CURSOR table1(country_id n(3),country c(12),city_id n(3),city c(12),contact_id n(3),contact c(12))
INSERT INTO table1 values(25,'IRAN',44,'TEHRAN',6,'ALI')
INSERT INTO table1 values(25,'IRAN',44,'TEHRAN',9,'ZAHID')
INSERT INTO table1 values(25,'IRAN',444,'QUM',1,'AKBAR')
INSERT INTO table1 values(184,'TURKEY',6,'ANKARA',3,'CETIN')
INSERT INTO table1 values(184,'TURKEY',6,'ANKARA',46,'BORIS')
INSERT INTO table1 values(184,'TURKEY',6,'ANKARA',8,'TAYYAB')
INSERT INTO table1 values(184,'TURKEY',7,'ISTANBUL',6,'MARYAM')
INSERT INTO table1 values(184,'TURKEY',7,'ISTANBUL',730,'JOSEPH')
INSERT INTO table1 values(184,'TURKEY',7,'ISTANBUL',9,'AHMED')
This.lst.recordsource='table1'
This.lst.Initlst
ENDPROC
ENDDEFINE
DEFINE CLASS MyList as Listbox
RowSourceType=3 && sql expression
RowSource=''
width=200
recordsource=Null && initial cursor (test1)
allcursor=SYS(2015) && cursor with all columns
visiblecursor=SYS(2015) && cursor with visible columns
PROCEDURE Initlst
LOCAL lcS
CREATE CURSOR l1 (country_id n(3),country c(12),city_id n(3),city c(12),contact_id n(3),contact c(12),cky C(10) DEFAULT SYS(2015),pky C(10) Null,nlvl I DEFAULT 1)
SELECT l1
INDEX on country TAG country
INSERT INTO l1 (country_id,country) SELECT distinct country_id,country FROM (This.recordsource) table1
CREATE CURSOR l2 (country_id n(3),country c(12),city_id n(3),city c(12),contact_id n(3),contact c(12),cky C(10) DEFAULT SYS(2015),pky C(10) Null,nlvl I DEFAULT 2)
SELECT l2
INDEX on country TAG country
INDEX on city TAG city
INSERT INTO l2 (country_id,country,city_id,city,pky) SELECT distinct t.country_id,t.country,t.city_id,t.city,l1.cky as pky FROM (This.recordsource) t,l1 WHERE t.country_id=l1.country_id
CREATE CURSOR (This.allcursor) (nIdNo I AUTOINC,country_id n(3),country c(12),city_id n(3),city c(12),contact_id n(3),contact c(12),cky C(10) DEFAULT SYS(2015),pky C(10) Null,nlvl I DEFAULT 3,lVis L,lExp L)
INSERT INTO (This.allcursor) (country_id,country,city_id,city,contact_id,contact,cky,pky,nlvl,lVis,lExp) ;
SELECT l1.*,.T. as lVis,.T. as lExp FROM l1 UNION ALL ;
SELECT l2.*,.T. as lVis,.T. as lExp FROM l2 UNION ALL ;
SELECT table1.*,SYS(2015) as cky,l2.cky as pky,3 as nlvl,.T. as lVis,.T. as lExp FROM (This.recordsource) table1,l2 ;
WHERE table1.country_id=l2.country_id AND table1.city_id=l2.city_id ORDER BY 2,4
lcS="SELECT SPACE(nlvl*4)+IIF(lExp,'[-] ','[+] ')+EVL(contact,EVL(city,country)),cky,nlvl,lExp FROM "+(This.allcursor)+" WHERE lVis ORDER BY country_id into cursor "+This.visiblecursor+" READWRITE"
This.ColumnCount=1
This.RowSource=lcS
ENDPROC
* Expand / collapse feature
PROCEDURE click
SELECT (This.visiblecursor)
LOCAL lcS,lnR,ccky
lnR=RECNO()
ccky=cky
IF lexp && collapse
This.collapse(m.ccky)
UPDATE (This.allcursor) SET lexp=.F.,lVis=.T. WHERE cky=m.ccky
ELSE
This.expand(m.ccky)
ENDIF
This.requery
SELECT (This.visiblecursor)
GO MIN(lnR,RECCOUNT(This.visiblecursor))
ENDPROC
PROCEDURE expand
LPARAMETERS cky
LOCAL lnRec
SELECT (This.allcursor)
lnRec=RECNO()
UPDATE (This.allcursor) SET lvis=.T.,lexp=.F. WHERE pky=m.cky
UPDATE (This.allcursor) SET lvis=.T.,lexp=.T. WHERE cky=m.cky
GO lnRec
replace lexp WITH .T.
ENDPROC
PROCEDURE collapse
LPARAMETERS cky
LOCAL c1
c1=SYS(2015)
UPDATE (This.allcursor) SET lexp=.F.,lVis=.F. WHERE pky=m.cky
SELECT * FROM (This.allcursor) WHERE pky=m.cky INTO CURSOR (c1)
IF RECCOUNT(c1)>0 AND !ISNULL(&c1..cky)
SELECT (c1)
SCAN
This.collapse(&c1..cky)
SELECT (c1)
ENDSCAN
ENDIF
ENDDEFINE