MAXSEARCHFILENAME=64
MAXSEARCHTEXT=64
FOUNDFILESFNSZ=80
FOUNDFILESMAX=20;TODO txtscrhgt-5
FOUNDFILESTABLE=0x8000
FOUNDFILESTABLE_END=0x8000+(FOUNDFILESMAX*FOUNDFILESFNSZ)
editcmd_2
call ifcmdnonempty_typedigit
editcmd_F2
call setdrawtablesneeded
OS_NEWPAGE
ld a,e
ld (findpg),a
ld hl,nvfind_freepg
push hl
ld hl,editcmd_reprintall_noreaddir
push hl
nvfind_redrawloop
ld a,(findpg)
ld e,a
SETPG8000
call nvfind_reprintmenu
nvfind_mainloop
call nvfind_getx
ld e,a
ld a,(nvfind_curtab)
add a,a
inc a
ld d,a
call nv_setxy ;keeps de,hl,ix
if 0
ld a,2
nvfind_yieldkeep
ld (nvfind_wasnokey),a
YIELDKEEP
ld a,55+128 ;"or a"
ld (nvfind_wasyield),a
endif
nvfind_mainloop_nokey
if 0
else
YIELD
endif
if PRSTDIO
GETKEY_
jr nz,nvfind_mainloop_keyq
;GETKEY_
;jr nz,nvfind_mainloop_keyq
;GETKEY_
;jr nz,nvfind_mainloop_keyq ;event бывает 3-символьный
;ld a,(stdindatacount)
;or a
;jr nz,nvfind_mainloop
else
GET_KEY
ld a,c ;keynolang
;cp NOKEY
or a
jr nz,nvfind_mainloop_keyq
endif
if 0
;если два раза подряд нет события, то делаем YIELD, иначе YIELDKEEP
nvfind_wasnokey=$+1
ld a,1
dec a
jr nz,nvfind_yieldkeep
;рисовать панельку только при отсутствии события после YIELD
nvfind_wasyield=$
scf
call c,nvfind_panel
YIELD
ld a,55 ;"scf"
ld (nvfind_wasyield),a
else
call nvfind_panel
endif
jr nvfind_mainloop;_nokey
nvfind_mainloop_keyq
cp key_redraw
jr z,nvfind_redrawloop
cp key_esc
ret z
cp key_F3
jp z,nvfind_view
ld hl,nvfind_mainloop
push hl
cp key_enter
jp z,nvfind_enter
cp key_tab
jp z,nvfind_tab
cp key_up
jp z,nvfind_up
cp key_down
jp z,nvfind_down
cp key_left
jp z,nvfind_left
cp key_right
jp z,nvfind_right
cp key_backspace
jp z,nvfind_backspace
cp 0x20
ret c ;прочие системные кнопки не нужны
nvfind_typein
;keeps ix
ld e,a
ld a,(nvfind_curtab)
or a
jr nz,nvfind_typein_cursearchtext
nvfind_typein_cursearchfilename
call nvfind_gettext
call strlen ;hl=length
ld bc,MAXSEARCHFILENAME
or a
sbc hl,bc
ret nc ;некуда вводить
call nvfind_calctextaddr ;hl=addr, a=curx
inc a
call nvfind_setx
jp strinsch
nvfind_typein_cursearchtext
call nvfind_gettext
call strlen ;hl=length
ld bc,MAXSEARCHTEXT
or a
sbc hl,bc
ret nc ;некуда вводить
call nvfind_calctextaddr ;hl=addr, a=curx
inc a
call nvfind_setx
jp strinsch
nvfind_gettext
ld a,(nvfind_curtab)
or a
ld hl,cursearchtext
jr nz,nvfind_gettext_cursearchtext
ld hl,cursearchfilename
nvfind_gettext_cursearchtext
ret
nvfind_getx
ld a,(nvfind_curtab)
or a
ld a,(nvfind_curtextx)
jr nz,nvfind_getx_cursearchtext
ld a,(nvfind_curx)
nvfind_getx_cursearchtext
ret
nvfind_setx
ld c,a
ld a,(nvfind_curtab)
or a
ld a,c
jr nz,nvfind_setx_cursearchtext
ld (nvfind_curx),a
ret
nvfind_setx_cursearchtext
ld (nvfind_curtextx),a
ret
nvfind_view
ld a,(nvfind_curfoundfiles)
or a
ret z
call nvfind_findselectedname
ld de,filenametext
call strcopy
call nvview
jp nvfind_redrawloop
nvfind_left
call nvfind_getx
or a
ret z
dec a
jp nvfind_setx
nvfind_right
call nvfind_gettext
call strlen ;hl=length
call nvfind_getx
cp l
ret z
inc a
jp nvfind_setx
nvfind_up
ld de,_COLOR
call nvfind_printbigcursor
ld a,(nvfind_curfoundfile)
or a
ret z
dec a
ld (nvfind_curfoundfile),a
ret
nvfind_down
ld de,_COLOR
call nvfind_printbigcursor
ld a,(nvfind_curfoundfile)
ld hl,nvfind_curfoundfiles
inc a
cp (hl)
ret z
ld (nvfind_curfoundfile),a
ret
nvfind_tab
ld hl,nvfind_curtab
ld a,(hl)
xor 1
ld (hl),a
ret
nvfind_backspace
call nvfind_calctextaddr ;hl=addr, a=curx
or a
ret z
ld a,(nvfind_curtab)
or a
jr nz,nvfind_backspace_cursearchtext
ld de,nvfind_curx
ld a,(de)
dec a
ld (de),a
jp strdelch
nvfind_backspace_cursearchtext
ld de,nvfind_curtextx
ld a,(de)
dec a
ld (de),a
jp strdelch
nvfind_enter_select
;TODO select from list y=(nvfind_curfoundfile)
call nvfind_findselectedname
push hl
call findlastslash. ;de = after last slash
dec de
xor a
ld (de),a ;drop filename after path
pop de
OS_CHDIR
ld hl,(curpanel)
call editcmd_setpaneldirfromcurdir_panelhl
pop af ;loop return
pop af ;reprint return
jp editcmd_reprintall
nvfind_enter
ld a,(nvfind_curfoundfiles)
or a
jr nz,nvfind_enter_select
ld (nvfind_sp),sp
call nvfind_reprintmenu
xor a
ld (nvfind_curfoundfiles),a
ld (nvfind_curfoundfile),a
ld hl,FOUNDFILESTABLE
ld (nvfind_curfoundnameaddr),hl
ld de,0x0400
call nv_setxy ;keeps de,hl,ix
;ld hl,emptypath
call getcurpaneldir_hl
ld de,nvfind_curpath
call strcopy_addslash
call nvfind_loaddir
nvfind_break
nvfind_sp=$+1
ld sp,0
ret
macro STRPUSH
;hl=string addr
xor a
push af
ld a,(hl)
inc hl
or a
push af
jr nz,$-4
pop af
;в стеке лежит \0, текст (без терминатора)
endm
macro STRPOP
;hl=string addr
ld d,h
ld e,l
pop af
ld (hl),a
inc hl
or a
jr nz,$-4
ex de,hl
call strmirror
endm
strmirror
;hl=string addr
ld d,h
ld e,l
call strlen
ld b,h
ld c,l
ld a,b
or c
ret z
;de=начало, bc=hl=длина
add hl,de ;hl=конец+1
srl b
rr c ;bc=wid/2
mirrorbytes0
dec hl
ld a,(de)
ldi
dec hl
ld (hl),a
jp pe,mirrorbytes0
ret
nvfind_loaddir
ld de,emptypath;nvfind_curpath
OS_OPENDIR
ld bc,0 ;file#
nvfind_loaddir0
push bc
call loaddir_filinfo
pop bc
inc bc
jp c,nvfind_loaddirq
jr z,nvfind_loaddir0
ld hl,filinfo+FILINFO_FATTRIB
ld a,(hl)
and FATTRIB_DIR
jr z,nvfind_loaddir_ndir
ld hl,filinfo+FILINFO_FNAME
ld a,'.'
cp (hl)
jr nz,nvfind_loaddir_subdir
inc hl
cp (hl)
jr z,nvfind_loaddir0
nvfind_loaddir_subdir
push bc
;open subdir
ld hl,nvfind_curpath
STRPUSH
ld hl,nvfind_curpath
call strfindeol
ex de,hl
ld hl,filinfo+FILINFO_FNAME
call strcopy ;out: hl,de after terminator
ex de,hl
dec hl
ld (hl),'/'
inc hl ;curpath = oldcurpath+dir+'/'
ld (hl),0
;ld de,nvfind_curpath
;OS_OPENDIR
;jr $
ld de,filinfo+FILINFO_FNAME
OS_CHDIR
call nvfind_loaddir
ld de,tdotdot
OS_CHDIR
;reopen dir
ld hl,nvfind_curpath
STRPOP
ld de,nvfind_curpath
OS_OPENDIR
pop bc
push bc
nvfind_loaddir_recreread0
push bc
call loaddir_filinfo
pop bc
dec bc
ld a,b
or c
jr nz,nvfind_loaddir_recreread0
pop bc
jr nvfind_loaddir0
nvfind_loaddir_ndir
push bc
ld de,cursearchfilename
ld hl,filinfo+FILINFO_FNAME
call nvfind_compare
jr z,nvfind_loaddir_ok
ld de,cursearchfilename
ld hl,filinfo+FILINFO_LNAME
call nvfind_compare
jr nz,nvfind_loaddir_fail
nvfind_loaddir_ok
call nvfind_found
nvfind_loaddir_fail
pop bc ;file#
jp nvfind_loaddir0
nvfind_loaddirq
ret
nvfind_found
;TODO generate curpath/hlname
push hl
ld hl,nvfind_curpath
call strfindeol
pop de
push hl
;ld (hl),'/'
;inc hl
ex de,hl
call strcopy
ld hl,nvfind_curpath
ld (nvfind_curfilename),hl
ld a,(cursearchtext)
or a
jr z,nvfind_foundnosearchinfile
;open file with name=HL
ex de,hl
OS_OPENHANDLE
ld a,b
ld (nvfind_curhandle),a
call nvfind_searchinfile
push af
nvfind_curhandle=$+1
ld b,0
OS_CLOSEHANDLE
pop af
jr nz,nvfind_found_q
nvfind_foundnosearchinfile
nvfind_curfoundnameaddr=$+1
ld de,0
ld hl,FOUNDFILESTABLE_END
or a
sbc hl,de
jp z,nvfind_break
ld hl,(nvfind_curfilename)
ld bc,FOUNDFILESFNSZ
ldir
ld (nvfind_curfoundnameaddr),de
ld hl,nvfind_curfoundfiles
inc (hl)
call prcrlf
nvfind_curfilename=$+1
ld hl,0
ld c,0 ;x
call prtext
call clearrestofline
if PRSTDIO
GETKEY_
else
GET_KEY
endif
cp key_esc
jp z,nvfind_break
nvfind_found_q
pop hl
ld (hl),0
ret
nvfind_searchinfile
;out: NZ=not found, Z=found, hl=place after
;сначала cursearchbuf=searchbuf, грузим туда два сегмента
call nvfind_loadsegment
nvfind_searchinfile0
call nvfind_loadsegment ;запасной сегмент впереди
call nvfind_searchinsegment
jr c,nvfind_searchinfileq
jr nz,nvfind_searchinfile0
nvfind_searchinfileq
ret
nvfind_searchinsegment
;out: CY=end of file(NZ); else NZ=not found, Z=found, hl=place after
cursearchbuf=$+1
ld hl,searchbuf
nvfind_cursize=$+1
ld bc,128
nvfind_searchinsegment_retry
ld a,b
or c
jr z,nvfind_searchinsegment_eof
ld de,cursearchtext
ld a,(de)
cpir
scf
ccf
ret nz ;NZ,NC
ld (nvfind_searchinsegment_tempaddr),hl
dec hl ;for use inc l later
nvfind_searchinsegment0
inc l
inc de
ld a,(de)
or a
ret z ;Z,NC
xor (hl)
jr z,nvfind_searchinsegment0
nvfind_searchinsegment_tempaddr=$+1
ld hl,0
jr nvfind_searchinsegment_retry
;ret ;NZ,NC
nvfind_searchinsegment_eof
sub 1
ret ;CY,NZ
nvfind_loadsegment
nvfind_nextsize=$+1
ld hl,0
ld (nvfind_cursize),hl
ld a,(nvfind_curhandle)
ld b,a
ld hl,SEARCHBUF_SZ
ld de,(cursearchbuf)
OS_READHANDLE
;hl=true size
ld (nvfind_nextsize),hl
ld hl,cursearchbuf
ld a,(hl)
xor 128
ld (hl),a
ret
nvfind_compare
;de=search string
;hl=test string
;out: Z=ok, NZ=fail
push hl
call nvfind_compare0
pop hl
ret
nvfind_compare0
ld a,(de)
cp '*'
ret z
cp '?'
jr z,nvfind_compare_skip
or 0x20
xor (hl)
jr z,nvfind_compare_skip
cp 0x20
ret nz
ld a,(de)
or a
ret z
nvfind_compare_skip
inc hl
inc de
jr nvfind_compare0
nvfind_calctextaddr
ld a,(nvfind_curtab)
or a
jr z,nvfind_calctextaddr_cursearchfilename
ld hl,cursearchtext
nvfind_curtextx=$+1
ld a,0
jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
nvfind_calctextaddr_cursearchfilename
ld hl,cursearchfilename
nvfind_curx=$+1
ld a,0
jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
nvfind_findselectedname
ld hl,FOUNDFILESTABLE
ld de,FOUNDFILESFNSZ
nvfind_curfoundfile=$+1
ld b,0
inc b
dec b
ret z ;hl=name
add hl,de
djnz $-1
;hl=name
ret
nvfind_printbigcursor
;de=color
nvfind_curfoundfiles=$+1
ld a,0
or a
ret z
call nv_setcolor
ld a,(nvfind_curfoundfile)
add a,5
ld d,a
ld e,0
call nv_setxy ;keeps de,hl,ix
call nvfind_findselectedname
ld c,0 ;x
call prtext
ld de,_COLOR
jp nv_setcolor
nvfind_panel
ld de,_CURSORCOLOR
call nvfind_printbigcursor
nvfind_curtab=$+1
ld a,0
or a
;jp z,nvfind_prcursearchfilename
jr nz,nvfind_prcursearchtext
nvfind_prcursearchfilename
ld de,0x0100
;push de
call nv_setxy ;keeps de,hl,ix
ld c,0 ;x
ld hl,cursearchfilename
call prtext
jp clearrestofline
;call nvfind_getx
;pop de
;ld e,a
;call nv_setxy ;keeps de,hl,ix
;ret
nvfind_prcursearchtext
ld de,0x0300
;push de
call nv_setxy ;keeps de,hl,ix
ld c,0 ;x
ld hl,cursearchtext
call prtext
jp clearrestofline
nvfind_reprintmenu
if PRSTDIO
ld de,0
call nv_setxy ;keeps de,hl,ix
CLS_
else
ld de,_COLOR
OS_CLS
endif
ld de,0x0000
call nv_setxy ;keeps de,hl,ix
ld c,0 ;x
ld hl,tsearchfilename
call prtext
call nvfind_prcursearchfilename
ld de,0x0200
call nv_setxy ;keeps de,hl,ix
ld c,0 ;x
ld hl,tsearchtext
call prtext
call nvfind_prcursearchtext
ld de,0x0400
call nv_setxy ;keeps de,hl,ix
ld c,0 ;x
ld hl,tresults
call prtext
ld hl,FOUNDFILESTABLE
ld a,(nvfind_curfoundfiles)
nvfind_reprintmenu_files0
or a
ret z
push af
push hl
call prcrlf
pop hl
push hl
ld c,0 ;x
call prtext
pop hl
ld bc,FOUNDFILESFNSZ
add hl,bc
pop af
dec a
jr nvfind_reprintmenu_files0
nvfind_freepg
findpg=$+1
ld e,0
OS_DELPAGE
ret
strfindeol
xor a
ld b,a
ld c,a
cpir
dec hl
ret
tsearchfilename
db "Search filename:",0
cursearchfilename
ds MAXSEARCHFILENAME+1
tsearchtext
db "Search text:",0
tresults
db "Results:",0
cursearchtext
ds MAXSEARCHTEXT+1
nvfind_curpath
ds MAXPATH_sz