?login_element?

Subversion Repositories NedoOS

Rev

Rev 1168 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. MAXSEARCHFILENAME=64
  2. MAXSEARCHTEXT=64
  3.  
  4. FOUNDFILESFNSZ=80
  5. FOUNDFILESMAX=20;TODO txtscrhgt-5
  6. FOUNDFILESTABLE=0x8000
  7. FOUNDFILESTABLE_END=0x8000+(FOUNDFILESMAX*FOUNDFILESFNSZ)
  8.  
  9. editcmd_2
  10.         call ifcmdnonempty_typedigit
  11. editcmd_F2
  12.         call setdrawtablesneeded
  13.         OS_NEWPAGE
  14.         ld a,e
  15.         ld (findpg),a
  16.        ld hl,nvfind_freepg
  17.        push hl
  18.        ld hl,editcmd_reprintall_noreaddir
  19.        push hl
  20.  
  21. nvfind_redrawloop
  22.         ld a,(findpg)
  23.         ld e,a
  24.         SETPG8000
  25.         call nvfind_reprintmenu
  26.  
  27. nvfind_mainloop
  28.         call nvfind_getx
  29.         ld e,a
  30.         ld a,(nvfind_curtab)
  31.         add a,a
  32.         inc a
  33.         ld d,a
  34.         call nv_setxy ;keeps de,hl,ix
  35.       if 0
  36.         ld a,2
  37. nvfind_yieldkeep
  38.         ld (nvfind_wasnokey),a
  39.         YIELDKEEP
  40.         ld a,55+128 ;"or a"
  41.         ld (nvfind_wasyield),a
  42.       endif
  43. nvfind_mainloop_nokey
  44.       if 0
  45.       else
  46.         YIELD
  47.       endif
  48.        if PRSTDIO
  49.         GETKEY_
  50.         jr nz,nvfind_mainloop_keyq
  51.         ;GETKEY_
  52.         ;jr nz,nvfind_mainloop_keyq
  53.         ;GETKEY_
  54.         ;jr nz,nvfind_mainloop_keyq ;event бывает 3-символьный
  55.        ;ld a,(stdindatacount)
  56.        ;or a
  57.        ;jr nz,nvfind_mainloop
  58.        else
  59.         GET_KEY
  60.         ld a,c ;keynolang
  61.         ;cp NOKEY
  62.          or a
  63.         jr nz,nvfind_mainloop_keyq
  64.        endif
  65.       if 0
  66. ;если два раза подряд нет события, то делаем YIELD, иначе YIELDKEEP
  67. nvfind_wasnokey=$+1
  68.         ld a,1
  69.         dec a
  70.         jr nz,nvfind_yieldkeep
  71. ;рисовать панельку только при отсутствии события после YIELD
  72. nvfind_wasyield=$
  73.         scf
  74.         call c,nvfind_panel
  75.         YIELD
  76.         ld a,55 ;"scf"
  77.         ld (nvfind_wasyield),a
  78.       else
  79.         call nvfind_panel
  80.       endif
  81.         jr nvfind_mainloop;_nokey
  82. nvfind_mainloop_keyq
  83.         cp key_redraw
  84.         jr z,nvfind_redrawloop
  85.         cp key_esc
  86.         ret z
  87.         cp key_F3
  88.         jp z,nvfind_view
  89.         ld hl,nvfind_mainloop
  90.         push hl
  91.         cp key_enter
  92.         jp z,nvfind_enter
  93.         cp key_tab
  94.         jp z,nvfind_tab
  95.         cp key_up
  96.         jp z,nvfind_up
  97.         cp key_down
  98.         jp z,nvfind_down
  99.         cp key_left
  100.         jp z,nvfind_left
  101.         cp key_right
  102.         jp z,nvfind_right
  103.         cp key_backspace
  104.         jp z,nvfind_backspace
  105.  
  106.         cp 0x20
  107.         ret c ;прочие системные кнопки не нужны
  108. nvfind_typein
  109. ;keeps ix
  110.         ld e,a
  111.         ld a,(nvfind_curtab)
  112.         or a
  113.         jr nz,nvfind_typein_cursearchtext
  114.  
  115. nvfind_typein_cursearchfilename
  116.         call nvfind_gettext
  117.         call strlen ;hl=length
  118.         ld bc,MAXSEARCHFILENAME
  119.         or a
  120.         sbc hl,bc
  121.         ret nc ;некуда вводить
  122.         call nvfind_calctextaddr ;hl=addr, a=curx
  123.         inc a
  124.         call nvfind_setx
  125.         jp strinsch
  126.  
  127. nvfind_typein_cursearchtext
  128.         call nvfind_gettext
  129.         call strlen ;hl=length
  130.         ld bc,MAXSEARCHTEXT
  131.         or a
  132.         sbc hl,bc
  133.         ret nc ;некуда вводить
  134.         call nvfind_calctextaddr ;hl=addr, a=curx
  135.         inc a
  136.         call nvfind_setx
  137.         jp strinsch
  138.  
  139. nvfind_gettext
  140.         ld a,(nvfind_curtab)
  141.         or a
  142.         ld hl,cursearchtext
  143.         jr nz,nvfind_gettext_cursearchtext
  144.         ld hl,cursearchfilename
  145. nvfind_gettext_cursearchtext
  146.         ret
  147.  
  148. nvfind_getx
  149.         ld a,(nvfind_curtab)
  150.         or a
  151.         ld a,(nvfind_curtextx)
  152.         jr nz,nvfind_getx_cursearchtext
  153.         ld a,(nvfind_curx)
  154. nvfind_getx_cursearchtext
  155.         ret
  156.  
  157. nvfind_setx
  158.         ld c,a
  159.         ld a,(nvfind_curtab)
  160.         or a
  161.         ld a,c
  162.         jr nz,nvfind_setx_cursearchtext
  163.         ld (nvfind_curx),a
  164.         ret
  165. nvfind_setx_cursearchtext
  166.         ld (nvfind_curtextx),a
  167.         ret
  168.  
  169. nvfind_view
  170.         ld a,(nvfind_curfoundfiles)
  171.         or a
  172.         ret z
  173.         call nvfind_findselectedname
  174.         ld de,filenametext
  175.         call strcopy
  176.         call nvview
  177.         jp nvfind_redrawloop
  178.  
  179. nvfind_left
  180.         call nvfind_getx
  181.         or a
  182.         ret z
  183.         dec a
  184.         jp nvfind_setx
  185.  
  186. nvfind_right
  187.         call nvfind_gettext
  188.         call strlen ;hl=length
  189.         call nvfind_getx
  190.         cp l
  191.         ret z
  192.         inc a
  193.         jp nvfind_setx
  194.  
  195. nvfind_up
  196.         ld de,_COLOR
  197.         call nvfind_printbigcursor
  198.         ld a,(nvfind_curfoundfile)
  199.         or a
  200.         ret z
  201.         dec a
  202.         ld (nvfind_curfoundfile),a
  203.         ret
  204.  
  205. nvfind_down
  206.         ld de,_COLOR
  207.         call nvfind_printbigcursor
  208.         ld a,(nvfind_curfoundfile)
  209.         ld hl,nvfind_curfoundfiles
  210.         inc a
  211.         cp (hl)
  212.         ret z
  213.         ld (nvfind_curfoundfile),a
  214.         ret
  215.  
  216. nvfind_tab
  217.         ld hl,nvfind_curtab
  218.         ld a,(hl)
  219.         xor 1
  220.         ld (hl),a
  221.         ret
  222.  
  223. nvfind_backspace
  224.         call nvfind_calctextaddr ;hl=addr, a=curx
  225.         or a
  226.         ret z
  227.         ld a,(nvfind_curtab)
  228.         or a
  229.         jr nz,nvfind_backspace_cursearchtext
  230.         ld de,nvfind_curx
  231.         ld a,(de)
  232.         dec a
  233.         ld (de),a
  234.         jp strdelch
  235. nvfind_backspace_cursearchtext
  236.         ld de,nvfind_curtextx
  237.         ld a,(de)
  238.         dec a
  239.         ld (de),a
  240.         jp strdelch
  241.  
  242. nvfind_enter_select
  243. ;TODO select from list y=(nvfind_curfoundfile)
  244.         call nvfind_findselectedname
  245.         push hl
  246.         call findlastslash. ;de = after last slash
  247.         dec de
  248.         xor a
  249.         ld (de),a ;drop filename after path
  250.         pop de
  251.         OS_CHDIR
  252.         ld hl,(curpanel)
  253.         call editcmd_setpaneldirfromcurdir_panelhl
  254.         pop af ;loop return
  255.         pop af ;reprint return
  256.         jp editcmd_reprintall
  257.  
  258. nvfind_enter
  259.         ld a,(nvfind_curfoundfiles)
  260.         or a
  261.         jr nz,nvfind_enter_select
  262.  
  263.         ld (nvfind_sp),sp
  264.         call nvfind_reprintmenu
  265.        
  266.         xor a
  267.         ld (nvfind_curfoundfiles),a
  268.         ld (nvfind_curfoundfile),a
  269.         ld hl,FOUNDFILESTABLE
  270.         ld (nvfind_curfoundnameaddr),hl
  271.  
  272.         ld de,0x0400
  273.         call nv_setxy ;keeps de,hl,ix
  274.  
  275.         ;ld hl,emptypath
  276.         call getcurpaneldir_hl
  277.         ld de,nvfind_curpath
  278.         call strcopy_addslash
  279.  
  280.         call nvfind_loaddir
  281. nvfind_break
  282. nvfind_sp=$+1
  283.         ld sp,0
  284.         ret
  285.  
  286.         macro STRPUSH
  287. ;hl=string addr
  288.         xor a
  289.         push af
  290.          ld a,(hl)
  291.          inc hl
  292.          or a
  293.          push af
  294.         jr nz,$-4
  295.         pop af
  296. ;в стеке лежит \0, текст (без терминатора)
  297.         endm
  298.        
  299.         macro STRPOP
  300. ;hl=string addr
  301.         ld d,h
  302.         ld e,l
  303.          pop af
  304.          ld (hl),a
  305.          inc hl
  306.          or a
  307.         jr nz,$-4
  308.         ex de,hl
  309.         call strmirror
  310.         endm
  311.        
  312. strmirror
  313. ;hl=string addr
  314.         ld d,h
  315.         ld e,l
  316.         call strlen
  317.         ld b,h
  318.         ld c,l
  319.          ld a,b
  320.          or c
  321.          ret z
  322. ;de=начало, bc=hl=длина
  323.         add hl,de ;hl=конец+1
  324.         srl b
  325.         rr c ;bc=wid/2
  326. mirrorbytes0
  327.         dec hl
  328.         ld a,(de)
  329.         ldi
  330.         dec hl
  331.         ld (hl),a
  332.         jp pe,mirrorbytes0
  333.         ret      
  334.  
  335. nvfind_loaddir
  336.         ld de,emptypath;nvfind_curpath
  337.         OS_OPENDIR
  338.        
  339.         ld bc,0 ;file#
  340. nvfind_loaddir0
  341.         push bc
  342.         call loaddir_filinfo
  343.         pop bc
  344.         inc bc
  345.         jp c,nvfind_loaddirq
  346.         jr z,nvfind_loaddir0
  347.         ld hl,filinfo+FILINFO_FATTRIB
  348.         ld a,(hl)
  349.         and FATTRIB_DIR
  350.         jr z,nvfind_loaddir_ndir
  351.          ld hl,filinfo+FILINFO_FNAME
  352.          ld a,'.'
  353.          cp (hl)
  354.          jr nz,nvfind_loaddir_subdir
  355.          inc hl
  356.          cp (hl)
  357.          jr z,nvfind_loaddir0
  358. nvfind_loaddir_subdir
  359.         push bc
  360. ;open subdir
  361.         ld hl,nvfind_curpath
  362.         STRPUSH
  363.         ld hl,nvfind_curpath
  364.         call strfindeol
  365.         ex de,hl
  366.         ld hl,filinfo+FILINFO_FNAME
  367.         call strcopy ;out: hl,de after terminator
  368.         ex de,hl
  369.         dec hl
  370.         ld (hl),'/'
  371.         inc hl ;curpath = oldcurpath+dir+'/'
  372.         ld (hl),0
  373.         ;ld de,nvfind_curpath
  374.         ;OS_OPENDIR
  375.         ;jr $
  376.        
  377.         ld de,filinfo+FILINFO_FNAME
  378.         OS_CHDIR
  379.  
  380.         call nvfind_loaddir
  381.  
  382.         ld de,tdotdot
  383.         OS_CHDIR
  384.  
  385. ;reopen dir
  386.         ld hl,nvfind_curpath
  387.         STRPOP
  388.         ld de,nvfind_curpath
  389.         OS_OPENDIR
  390.         pop bc
  391.         push bc
  392. nvfind_loaddir_recreread0
  393.         push bc
  394.         call loaddir_filinfo
  395.         pop bc
  396.         dec bc
  397.         ld a,b
  398.         or c
  399.         jr nz,nvfind_loaddir_recreread0
  400.         pop bc
  401.         jr nvfind_loaddir0
  402. nvfind_loaddir_ndir
  403.         push bc
  404.         ld de,cursearchfilename
  405.         ld hl,filinfo+FILINFO_FNAME
  406.         call nvfind_compare
  407.         jr z,nvfind_loaddir_ok
  408.         ld de,cursearchfilename
  409.         ld hl,filinfo+FILINFO_LNAME
  410.         call nvfind_compare
  411.         jr nz,nvfind_loaddir_fail
  412. nvfind_loaddir_ok
  413.         call nvfind_found
  414.        
  415. nvfind_loaddir_fail
  416.         pop bc ;file#
  417.         jp nvfind_loaddir0
  418. nvfind_loaddirq
  419.         ret
  420.  
  421.  
  422. nvfind_found
  423. ;TODO generate curpath/hlname
  424.         push hl
  425.         ld hl,nvfind_curpath
  426.         call strfindeol
  427.         pop de
  428.         push hl
  429.         ;ld (hl),'/'
  430.         ;inc hl
  431.         ex de,hl
  432.         call strcopy
  433.         ld hl,nvfind_curpath
  434.         ld (nvfind_curfilename),hl
  435.         ld a,(cursearchtext)
  436.         or a
  437.         jr z,nvfind_foundnosearchinfile
  438.  
  439. ;open file with name=HL
  440.         ex de,hl
  441.         OS_OPENHANDLE
  442.         ld a,b
  443.         ld (nvfind_curhandle),a
  444.        
  445.         call nvfind_searchinfile
  446.         push af
  447. nvfind_curhandle=$+1
  448.         ld b,0
  449.         OS_CLOSEHANDLE
  450.         pop af
  451.         jr nz,nvfind_found_q
  452.        
  453. nvfind_foundnosearchinfile
  454. nvfind_curfoundnameaddr=$+1
  455.         ld de,0
  456.         ld hl,FOUNDFILESTABLE_END
  457.         or a
  458.         sbc hl,de
  459.         jp z,nvfind_break
  460.         ld hl,(nvfind_curfilename)
  461.         ld bc,FOUNDFILESFNSZ
  462.         ldir
  463.         ld (nvfind_curfoundnameaddr),de
  464.         ld hl,nvfind_curfoundfiles
  465.         inc (hl)
  466.  
  467.         call prcrlf
  468. nvfind_curfilename=$+1
  469.         ld hl,0
  470.         ld c,0 ;x
  471.         call prtext
  472.         call clearrestofline
  473.        
  474.        if PRSTDIO
  475.         GETKEY_
  476.        else
  477.         GET_KEY
  478.        endif
  479.         cp key_esc
  480.         jp z,nvfind_break
  481. nvfind_found_q
  482.         pop hl
  483.         ld (hl),0
  484.         ret
  485.  
  486. nvfind_searchinfile
  487. ;out: NZ=not found, Z=found, hl=place after
  488. ;сначала cursearchbuf=searchbuf, грузим туда два сегмента
  489.         call nvfind_loadsegment
  490. nvfind_searchinfile0
  491.         call nvfind_loadsegment ;запасной сегмент впереди
  492.         call nvfind_searchinsegment
  493.         jr c,nvfind_searchinfileq
  494.         jr nz,nvfind_searchinfile0
  495. nvfind_searchinfileq
  496.         ret
  497.  
  498. nvfind_searchinsegment
  499. ;out: CY=end of file(NZ); else NZ=not found, Z=found, hl=place after
  500. cursearchbuf=$+1
  501.         ld hl,searchbuf
  502. nvfind_cursize=$+1
  503.         ld bc,128
  504. nvfind_searchinsegment_retry
  505.         ld a,b
  506.         or c
  507.         jr z,nvfind_searchinsegment_eof
  508.         ld de,cursearchtext
  509.         ld a,(de)
  510.         cpir
  511.          scf
  512.          ccf
  513.         ret nz ;NZ,NC
  514.          ld (nvfind_searchinsegment_tempaddr),hl
  515.         dec hl ;for use inc l later
  516. nvfind_searchinsegment0
  517.         inc l
  518.         inc de
  519.         ld a,(de)
  520.         or a
  521.         ret z ;Z,NC
  522.         xor (hl)
  523.         jr z,nvfind_searchinsegment0
  524. nvfind_searchinsegment_tempaddr=$+1
  525.          ld hl,0
  526.          jr nvfind_searchinsegment_retry
  527.         ;ret ;NZ,NC
  528. nvfind_searchinsegment_eof
  529.         sub 1
  530.         ret ;CY,NZ
  531.  
  532. nvfind_loadsegment
  533. nvfind_nextsize=$+1
  534.         ld hl,0
  535.         ld (nvfind_cursize),hl
  536.         ld a,(nvfind_curhandle)
  537.         ld b,a
  538.         ld hl,SEARCHBUF_SZ
  539.         ld de,(cursearchbuf)
  540.         OS_READHANDLE
  541. ;hl=true size
  542.         ld (nvfind_nextsize),hl
  543.         ld hl,cursearchbuf
  544.         ld a,(hl)
  545.         xor 128
  546.         ld (hl),a
  547.         ret
  548.  
  549. nvfind_compare
  550. ;de=search string
  551. ;hl=test string
  552. ;out: Z=ok, NZ=fail
  553.         push hl
  554.         call nvfind_compare0
  555.         pop hl
  556.         ret
  557. nvfind_compare0
  558.         ld a,(de)
  559.         cp '*'
  560.         ret z
  561.         cp '?'
  562.         jr z,nvfind_compare_skip
  563.          or 0x20
  564.         xor (hl)
  565.         jr z,nvfind_compare_skip
  566.         cp 0x20
  567.         ret nz
  568.         ld a,(de)
  569.         or a
  570.         ret z
  571. nvfind_compare_skip
  572.         inc hl
  573.         inc de
  574.         jr nvfind_compare0
  575.  
  576. nvfind_calctextaddr
  577.         ld a,(nvfind_curtab)
  578.         or a
  579.         jr z,nvfind_calctextaddr_cursearchfilename
  580.         ld hl,cursearchtext
  581. nvfind_curtextx=$+1
  582.         ld a,0
  583.         jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
  584.        
  585. nvfind_calctextaddr_cursearchfilename
  586.         ld hl,cursearchfilename
  587. nvfind_curx=$+1
  588.         ld a,0
  589.         jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
  590.  
  591. nvfind_findselectedname
  592.         ld hl,FOUNDFILESTABLE
  593.         ld de,FOUNDFILESFNSZ
  594. nvfind_curfoundfile=$+1
  595.         ld b,0
  596.         inc b
  597.         dec b
  598.         ret z ;hl=name
  599.         add hl,de
  600.         djnz $-1
  601. ;hl=name
  602.         ret
  603.  
  604. nvfind_printbigcursor
  605. ;de=color
  606. nvfind_curfoundfiles=$+1
  607.         ld a,0
  608.         or a
  609.         ret z
  610.         call nv_setcolor
  611.         ld a,(nvfind_curfoundfile)
  612.         add a,5
  613.         ld d,a
  614.         ld e,0
  615.         call nv_setxy ;keeps de,hl,ix
  616.         call nvfind_findselectedname
  617.         ld c,0 ;x
  618.         call prtext
  619.         ld de,_COLOR
  620.         jp nv_setcolor
  621.  
  622. nvfind_panel
  623.         ld de,_CURSORCOLOR
  624.         call nvfind_printbigcursor
  625. nvfind_curtab=$+1
  626.         ld a,0
  627.         or a
  628.         ;jp z,nvfind_prcursearchfilename
  629.         jr nz,nvfind_prcursearchtext
  630. nvfind_prcursearchfilename
  631.         ld de,0x0100
  632.         ;push de
  633.         call nv_setxy ;keeps de,hl,ix
  634.         ld c,0 ;x
  635.         ld hl,cursearchfilename
  636.         call prtext
  637.         jp clearrestofline
  638.         ;call nvfind_getx
  639.         ;pop de
  640.         ;ld e,a
  641.         ;call nv_setxy ;keeps de,hl,ix
  642.         ;ret
  643. nvfind_prcursearchtext
  644.         ld de,0x0300
  645.         ;push de
  646.         call nv_setxy ;keeps de,hl,ix
  647.         ld c,0 ;x
  648.         ld hl,cursearchtext
  649.         call prtext
  650.         jp clearrestofline
  651.  
  652. nvfind_reprintmenu
  653.        if PRSTDIO
  654.         ld de,0
  655.         call nv_setxy ;keeps de,hl,ix
  656.         CLS_
  657.        else
  658.         ld de,_COLOR
  659.         OS_CLS
  660.        endif
  661.        
  662.         ld de,0x0000
  663.         call nv_setxy ;keeps de,hl,ix
  664.         ld c,0 ;x
  665.         ld hl,tsearchfilename
  666.         call prtext
  667.         call nvfind_prcursearchfilename
  668.  
  669.         ld de,0x0200
  670.         call nv_setxy ;keeps de,hl,ix
  671.         ld c,0 ;x
  672.         ld hl,tsearchtext
  673.         call prtext
  674.         call nvfind_prcursearchtext
  675.        
  676.         ld de,0x0400
  677.         call nv_setxy ;keeps de,hl,ix
  678.         ld c,0 ;x
  679.         ld hl,tresults
  680.         call prtext
  681.        
  682.         ld hl,FOUNDFILESTABLE
  683.         ld a,(nvfind_curfoundfiles)
  684. nvfind_reprintmenu_files0
  685.         or a
  686.         ret z
  687.         push af
  688.         push hl
  689.         call prcrlf
  690.         pop hl
  691.         push hl
  692.         ld c,0 ;x
  693.         call prtext
  694.         pop hl
  695.         ld bc,FOUNDFILESFNSZ
  696.         add hl,bc
  697.         pop af
  698.         dec a
  699.         jr nvfind_reprintmenu_files0
  700.  
  701. nvfind_freepg
  702. findpg=$+1
  703.         ld e,0
  704.         OS_DELPAGE
  705.         ret
  706.  
  707. strfindeol
  708.         xor a
  709.         ld b,a
  710.         ld c,a
  711.         cpir
  712.         dec hl
  713.         ret
  714.  
  715. tsearchfilename
  716.         db "Search filename:",0
  717.  
  718. cursearchfilename
  719.         ds MAXSEARCHFILENAME+1
  720.  
  721. tsearchtext
  722.         db "Search text:",0
  723.  
  724. tresults
  725.         db "Results:",0
  726.  
  727. cursearchtext
  728.         ds MAXSEARCHTEXT+1
  729.  
  730. nvfind_curpath
  731.         ds MAXPATH_sz
  732.  
  733.