$typecheck on
$include "fileops.inc"

type QtreeviewEx extends Qtreeview

function getparent (i as integer) as integer
Dim startlevel as integer
startlevel = QtreeviewEx.item(i).level
if startlevel = 0 then result = -1
if i = -1 then result = i
do
if QtreeviewEx.item(i).level < startlevel then Exit do
dec(i)
loop until i = -1
result = i
end function
'_______________________________________________________________________________ 
function getindex(from as integer, itemtext as string) as integer
dim i as integer
i = From
do
if QtreeviewEx.item(i).text = itemtext then exit do
inc(i)
loop until i = QtreeviewEx.itemcount
if i = QtreeviewEx.itemcount then i = -1
result = i
end function
'_______________________________________________________________________________ 
function strgetparent(itemtext as string) as integer
dim i as integer
with QtreeviewEx
     i = .getindex(0, itemtext)
     i = .getparent(i)
     result = i
end with
end function
'_______________________________________________________________________________ 
Function getchildrenlist (i as integer) as string
if QtreeviewEx.item(i).haschildren = 0 then result = ""
dim startlevel as integer
dim templist as string
templist = ""
startlevel = QtreeviewEx.item(i).level + 1
inc(i)
do
if QtreeviewEx.item(i).level = startlevel then
templist = templist + QtreeviewEx.item(i).text + ","
elseif QtreeviewEx.item(i).level < startlevel then
exit do
end if
inc(i)
loop until i = QtreeviewEx.itemcount
result = left$(templist, len(templist) - 1)
end function
'_______________________________________________________________________________ 
sub addchildto (startfrom as integer, itemtext as string, childtext as string)
with QtreeviewEx
.addchilditems (.getindex(startfrom, itemtext), childtext)
end with
end sub
'_______________________________________________________________________________ 
function Branchlength (i as integer) as integer
defint startlevel, x, y
with qtreeviewex
if .item(i).haschildren = 0 then
    result = 1
else
    startlevel = .item(i).level
    x = i + 1
    y = .itemcount
    if x = y then result = 0

        do
        if .item(x).level <= startlevel then
            exit do
        else
            inc(x)
        end if
        loop until x = y
result = x - i
end if
end with
end function
'_______________________________________________________________________________ 
sub MoveDown (i as integer)
defint x,y, startlevel, destindex, howmany
dim sl as qstringlist

with QtreeviewEx
x = i + 1
y = .itemcount
if i = y then exit sub

startlevel = .item(i).level

do
if .item(x).level = startlevel then
    destindex = x + .branchlength(x) - 1
    exit do
elseif .item(x).level < startlevel then
    exit sub
end if
inc(x)
loop until x = y

.savetofile (homedir + "tmp_tree.tv")
end with

with sl
.loadfromfile (homedir + "tmp_tree.tv")

howmany = Qtreeviewex.branchlength(i)

x = 0
do
if destindex = y then
    .additems .item(i)
    .delitems(i)
else
    .insertitem (destindex + 1, .item(i).text)
    .delitems(i)
end if
inc(x)
loop until x = howmany

.savetofile (homedir + "tmp_tree.tv")
end with

Qtreeviewex.loadfromfile (homedir + "tmp_tree.tv")
Qtreeviewex.itemindex = i + Qtreeviewex.branchlength(i)
kill(homedir + "tmp_tree.tv")
end sub
'_______________________________________________________________________________ 
sub MoveUp (i as integer)
defint x,y, startlevel, destindex

with QtreeviewEx
if i = 0 then exit sub
startlevel = .item(i).level
x = i - 1

do
if .item(x).level = startlevel then
    destindex = x
    exit do
elseif .item(x).level < startlevel then
    exit sub
end if
dec(x)
loop until x = -1
.movedown(destindex)
.itemindex = destindex
end with
end sub
'_______________________________________________________________________________ 
sub IncLevel (i as integer)
defint x,y, startlevel
dim sl as qstringlist

startlevel = QtreeviewEx.item(i).level
x = i
if i = 0 then exit sub

with QtreeviewEx
do
if .item(x).level = startlevel then
    exit do
elseif .item(x).level > startlevel then
    exit sub
end if
dec(x)
loop until x = -1

.savetofile (homedir + "tmp_tree.tv")
end with

    with sl
    .loadfromfile (homedir + "tmp_tree.tv")

    x = 0
    y = QtreeviewEx.branchlength(i)
    do
    .item(x + i) = chr$(9) + .item(x + i)
    inc(x)
    loop until x = y

    .savetofile (homedir + "tmp_tree.tv")
    end with

QtreeviewEx.loadfromfile (homedir + "tmp_tree.tv")
QtreeviewEx.itemindex = i
kill (homedir + "tmp_tree.tv")
end sub
'_______________________________________________________________________________ 
sub DecLevel (i as integer)
defint x,y, parentindex

dim sl as qstringlist
with QtreeviewEx
if .item(i).level = 0 then exit sub
parentindex = .getparent(i)
y = .branchlength(i)

.savetofile (homedir + "tmp_tree.tv")
end with

with sl
.loadfromfile (homedir + "tmp_tree.tv")

x = 0
do
.insertitem(parentindex + x, right$(.item(i + x), len(.item(i + x)) - 1))
.delitems(i + x + 1)
inc(x)
loop until x = y

.savetofile (homedir + "tmp_tree.tv")
end with

QtreeviewEx.loadfromfile (homedir + "tmp_tree.tv")
QtreeviewEx.itemindex = parentindex - 1
kill (homedir + "tmp_tree.tv")

end sub
end type
'===============================================================================