?login_element?

Subversion Repositories NedoOS

Rev

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

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