?login_element?

Subversion Repositories NedoOS

Rev

Rev 1410 | 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.         ret nz;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.         ret nz;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_curtab)
  260.         or a
  261.         jr z,nvfind_enter_research ;Enter on filename - new search
  262.         ld a,(nvfind_curfoundfiles)
  263.         or a
  264.         jr nz,nvfind_enter_select ;Enter on search text - go to result
  265. nvfind_enter_research
  266.         ld (nvfind_sp),sp
  267.        
  268.         xor a
  269.         ld (nvfind_curfoundfiles),a
  270.         ld (nvfind_curfoundfile),a
  271.         ld hl,FOUNDFILESTABLE
  272.         ld (nvfind_curfoundnameaddr),hl
  273.  
  274.         call nvfind_reprintmenu
  275.  
  276.         ld de,0x0400
  277.         call nv_setxy ;keeps de,hl,ix
  278.  
  279.         ;ld hl,emptypath
  280.         call getcurpaneldir_hl
  281.         ld de,nvfind_curpath
  282.         call strcopy_addslash
  283.  
  284.         call nvfind_loaddir
  285. nvfind_break
  286. nvfind_sp=$+1
  287.         ld sp,0
  288.         ret
  289.  
  290.         macro STRPUSH
  291. ;hl=string addr
  292.         xor a
  293.         push af
  294.          ld a,(hl)
  295.          inc hl
  296.          or a
  297.          push af
  298.         jr nz,$-4
  299.         pop af
  300. ;в стеке лежит \0, текст (без терминатора)
  301.         endm
  302.        
  303.         macro STRPOP
  304. ;hl=string addr
  305.         ld d,h
  306.         ld e,l
  307.          pop af
  308.          ld (hl),a
  309.          inc hl
  310.          or a
  311.         jr nz,$-4
  312.         ex de,hl
  313.         call strmirror
  314.         endm
  315.        
  316. strmirror
  317. ;hl=string addr
  318.         ld d,h
  319.         ld e,l
  320.         call strlen
  321.         ld b,h
  322.         ld c,l
  323.          ld a,b
  324.          or c
  325.          ret z
  326. ;de=начало, bc=hl=длина
  327.         add hl,de ;hl=конец+1
  328.         srl b
  329.         rr c ;bc=wid/2
  330. mirrorbytes0
  331.         dec hl
  332.         ld a,(de)
  333.         ldi
  334.         dec hl
  335.         ld (hl),a
  336.         jp pe,mirrorbytes0
  337.         ret      
  338.  
  339. nvfind_loaddir
  340.         ld de,nvfind_curpath
  341.         OS_CHDIR
  342.         ld de,emptypath;nvfind_curpath
  343.         OS_OPENDIR ;не понимает путь!!!
  344.        
  345.         ld bc,0 ;file#
  346. nvfind_loaddir0
  347.         ;push bc
  348.         call loaddir_filinfo
  349.         ;pop bc
  350.         inc bc
  351.         jp c,nvfind_loaddirq
  352.         jr z,nvfind_loaddir0
  353.         ld hl,filinfo+FILINFO_FATTRIB
  354.         ld a,(hl)
  355.         and FATTRIB_DIR
  356.         jr z,nvfind_loaddir_ndir
  357.          ld hl,filinfo+FILINFO_FNAME
  358.          ld a,'.'
  359.          cp (hl)
  360.          jr nz,nvfind_loaddir_subdir
  361.          inc hl
  362.          cp (hl)
  363.          jr z,nvfind_loaddir0
  364. nvfind_loaddir_subdir
  365.         push bc
  366. ;open subdir
  367.         ld hl,nvfind_curpath
  368.         STRPUSH
  369.         ld hl,nvfind_curpath
  370.         call strfindeol
  371.         ex de,hl
  372.         ld hl,filinfo+FILINFO_FNAME
  373.         call strcopy ;out: hl,de after terminator
  374.         ex de,hl
  375.         dec hl
  376.         ld (hl),'/'
  377.         inc hl ;curpath = oldcurpath+dir+'/'
  378.         ld (hl),0
  379.         ;ld de,nvfind_curpath
  380.         ;OS_OPENDIR
  381.         ;jr $
  382.        
  383.         ld de,filinfo+FILINFO_FNAME
  384.         OS_CHDIR
  385.  
  386.         call nvfind_loaddir
  387.  
  388.         ld de,tdotdot
  389.         OS_CHDIR
  390.  
  391. ;reopen dir
  392.         ld hl,nvfind_curpath
  393.         STRPOP
  394.         ld de,nvfind_curpath
  395.         OS_CHDIR
  396.         ld de,emptypath;nvfind_curpath
  397.         OS_OPENDIR ;не понимает путь!!!
  398.         pop bc
  399.         push bc
  400. nvfind_loaddir_recreread0
  401.         ;push bc
  402.         call loaddir_filinfo
  403.         ;pop bc
  404.         dec bc
  405.         ld a,b
  406.         or c
  407.         jr nz,nvfind_loaddir_recreread0
  408.         pop bc
  409.         jr nvfind_loaddir0
  410. nvfind_loaddir_ndir
  411.         push bc
  412.         ld de,cursearchfilename
  413.         ld hl,filinfo+FILINFO_FNAME
  414.         call nvfind_compare
  415.         jr z,nvfind_loaddir_ok
  416.         ld de,cursearchfilename
  417.         ld hl,filinfo+FILINFO_LNAME
  418.         call nvfind_compare
  419.         jr nz,nvfind_loaddir_fail
  420. nvfind_loaddir_ok
  421.         call nvfind_found
  422.        
  423. nvfind_loaddir_fail
  424.         pop bc ;file#
  425.         jp nvfind_loaddir0
  426. nvfind_loaddirq
  427.         ret
  428.  
  429.  
  430. nvfind_found
  431. ;TODO generate curpath/hlname
  432.         push hl
  433.         ld hl,nvfind_curpath
  434.         call strfindeol
  435.         pop de
  436.         push hl
  437.         ;ld (hl),'/'
  438.         ;inc hl
  439.         ex de,hl
  440.         call strcopy
  441.         ld hl,nvfind_curpath
  442.         ld (nvfind_curfilename),hl
  443.         ld a,(cursearchtext)
  444.         or a
  445.         jr z,nvfind_foundnosearchinfile
  446.  
  447. ;open file with name=HL
  448.         ex de,hl
  449.         OS_OPENHANDLE
  450.         ld a,b
  451.         ld (nvfind_curhandle),a
  452.        
  453.         call nvfind_searchinfile
  454.         push af
  455. nvfind_curhandle=$+1
  456.         ld b,0
  457.         OS_CLOSEHANDLE
  458.         pop af
  459.         jr nz,nvfind_found_q
  460.        
  461. nvfind_foundnosearchinfile
  462. nvfind_curfoundnameaddr=$+1
  463.         ld de,0
  464.         ld hl,FOUNDFILESTABLE_END
  465.         or a
  466.         sbc hl,de
  467.         jp z,nvfind_break
  468.         ld hl,(nvfind_curfilename)
  469.         ld bc,FOUNDFILESFNSZ
  470.         ldir
  471.         ld (nvfind_curfoundnameaddr),de
  472.         ld hl,nvfind_curfoundfiles
  473.         inc (hl)
  474.  
  475.         call prcrlf
  476. nvfind_curfilename=$+1
  477.         ld hl,0
  478.         ld c,0 ;x
  479.         call prtext
  480.         call clearrestofline
  481.        
  482.        if PRSTDIO
  483.         GETKEY_
  484.        else
  485.         GET_KEY
  486.        endif
  487.         cp key_esc
  488.         jp z,nvfind_break
  489. nvfind_found_q
  490.         pop hl
  491.         ld (hl),0
  492.         ret
  493.  
  494. nvfind_searchinfile
  495. ;out: NZ=not found, Z=found, hl=place after
  496. ;сначала cursearchbuf=searchbuf, грузим туда два сегмента
  497.         call nvfind_loadsegment
  498. nvfind_searchinfile0
  499.         call nvfind_loadsegment ;запасной сегмент впереди
  500.         call nvfind_searchinsegment
  501.         jr c,nvfind_searchinfileq
  502.         jr nz,nvfind_searchinfile0
  503. nvfind_searchinfileq
  504.         ret
  505.  
  506. nvfind_searchinsegment
  507. ;out: CY=end of file(NZ); else NZ=not found, Z=found, hl=place after
  508. cursearchbuf=$+1
  509.         ld hl,searchbuf
  510. nvfind_cursize=$+1
  511.         ld bc,128
  512. nvfind_searchinsegment_retry
  513.         ld a,b
  514.         or c
  515.         jr z,nvfind_searchinsegment_eof
  516.         ld de,cursearchtext
  517.         ld a,(de)
  518.         cpir
  519.          scf
  520.          ccf
  521.         ret nz ;NZ,NC
  522.          ld (nvfind_searchinsegment_tempaddr),hl
  523.         dec hl ;for use inc l later
  524. nvfind_searchinsegment0
  525.         inc l
  526.         inc de
  527.         ld a,(de)
  528.         or a
  529.         ret z ;Z,NC
  530.         xor (hl)
  531.         jr z,nvfind_searchinsegment0
  532. nvfind_searchinsegment_tempaddr=$+1
  533.          ld hl,0
  534.          jr nvfind_searchinsegment_retry
  535.         ;ret ;NZ,NC
  536. nvfind_searchinsegment_eof
  537.         sub 1
  538.         ret ;CY,NZ
  539.  
  540. nvfind_loadsegment
  541. nvfind_nextsize=$+1
  542.         ld hl,0
  543.         ld (nvfind_cursize),hl
  544.         ld a,(nvfind_curhandle)
  545.         ld b,a
  546.         ld hl,SEARCHBUF_SZ
  547.         ld de,(cursearchbuf)
  548.         OS_READHANDLE
  549. ;hl=true size
  550.         ld (nvfind_nextsize),hl
  551.         ld hl,cursearchbuf
  552.         ld a,(hl)
  553.         xor 128
  554.         ld (hl),a
  555.         ret
  556.  
  557. nvfind_compare
  558. ;de=search string
  559. ;hl=test string
  560. ;out: Z=ok, NZ=fail
  561.         push hl
  562.         call nvfind_compare0
  563.         pop hl
  564.         ret
  565. nvfind_compare0
  566.         ld a,(de)
  567.         cp '*'
  568.         ret z
  569.         cp '?'
  570.         jr z,nvfind_compare_skip
  571.          or 0x20
  572.         xor (hl)
  573.         jr z,nvfind_compare_skip
  574.         cp 0x20
  575.         ret nz
  576.         ld a,(de)
  577.         or a
  578.         ret z
  579. nvfind_compare_skip
  580.         inc hl
  581.         inc de
  582.         jr nvfind_compare0
  583.  
  584. nvfind_calctextaddr
  585.         ld a,(nvfind_curtab)
  586.         or a
  587.         jr z,nvfind_calctextaddr_cursearchfilename
  588.         ld hl,cursearchtext
  589. nvfind_curtextx=$+1
  590.         ld a,0
  591.         jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
  592.        
  593. nvfind_calctextaddr_cursearchfilename
  594.         ld hl,cursearchfilename
  595. nvfind_curx=$+1
  596.         ld a,0
  597.         jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
  598.  
  599. nvfind_findselectedname
  600.         ld hl,FOUNDFILESTABLE
  601.         ld de,FOUNDFILESFNSZ
  602. nvfind_curfoundfile=$+1
  603.         ld b,0
  604.         inc b
  605.         dec b
  606.         ret z ;hl=name
  607.         add hl,de
  608.         djnz $-1
  609. ;hl=name
  610.         ret
  611.  
  612. nvfind_printbigcursor
  613. ;de=color
  614. nvfind_curfoundfiles=$+1
  615.         ld a,0
  616.         or a
  617.         ret z
  618.         call nv_setcolor
  619.         ld a,(nvfind_curfoundfile)
  620.         add a,5
  621.         ld d,a
  622.         ld e,0
  623.         call nv_setxy ;keeps de,hl,ix
  624.         call nvfind_findselectedname
  625.         ld c,0 ;x
  626.         call prtext
  627.         ld de,_COLOR
  628.         jp nv_setcolor
  629.  
  630. nvfind_panel
  631.         ld de,_CURSORCOLOR
  632.         call nvfind_printbigcursor
  633. nvfind_curtab=$+1
  634.         ld a,0
  635.         or a
  636.         ;jp z,nvfind_prcursearchfilename
  637.         jr nz,nvfind_prcursearchtext
  638. nvfind_prcursearchfilename
  639.         ld de,0x0100
  640.         ;push de
  641.         call nv_setxy ;keeps de,hl,ix
  642.         ld c,0 ;x
  643.         ld hl,cursearchfilename
  644.         call prtext
  645.         jp clearrestofline
  646.         ;call nvfind_getx
  647.         ;pop de
  648.         ;ld e,a
  649.         ;call nv_setxy ;keeps de,hl,ix
  650.         ;ret
  651. nvfind_prcursearchtext
  652.         ld de,0x0300
  653.         ;push de
  654.         call nv_setxy ;keeps de,hl,ix
  655.         ld c,0 ;x
  656.         ld hl,cursearchtext
  657.         call prtext
  658.         jp clearrestofline
  659.  
  660. nvfind_reprintmenu
  661.        if PRSTDIO
  662.         ld de,0
  663.         call nv_setxy ;keeps de,hl,ix
  664.         CLS_
  665.        else
  666.         ld de,_COLOR
  667.         OS_CLS
  668.        endif
  669.        
  670.         ld de,0x0000
  671.         call nv_setxy ;keeps de,hl,ix
  672.         ld c,0 ;x
  673.         ld hl,tsearchfilename
  674.         call prtext
  675.         call nvfind_prcursearchfilename
  676.  
  677.         ld de,0x0200
  678.         call nv_setxy ;keeps de,hl,ix
  679.         ld c,0 ;x
  680.         ld hl,tsearchtext
  681.         call prtext
  682.         call nvfind_prcursearchtext
  683.        
  684.         ld de,0x0400
  685.         call nv_setxy ;keeps de,hl,ix
  686.         ld c,0 ;x
  687.         ld hl,tresults
  688.         call prtext
  689.        
  690.         ld hl,FOUNDFILESTABLE
  691.         ld a,(nvfind_curfoundfiles)
  692. nvfind_reprintmenu_files0
  693.         or a
  694.         ret z
  695.         push af
  696.         push hl
  697.         call prcrlf
  698.         pop hl
  699.         push hl
  700.         ld c,0 ;x
  701.         call prtext
  702.         pop hl
  703.         ld bc,FOUNDFILESFNSZ
  704.         add hl,bc
  705.         pop af
  706.         dec a
  707.         jr nvfind_reprintmenu_files0
  708.  
  709. nvfind_freepg
  710. findpg=$+1
  711.         ld e,0
  712.         OS_DELPAGE
  713.         ret
  714.  
  715. strfindeol
  716.         xor a
  717.         ld b,a
  718.         ld c,a
  719.         cpir
  720.         dec hl
  721.         ret
  722.  
  723. tsearchfilename
  724.         db "Search filename:",0
  725.  
  726. cursearchfilename
  727.         ds MAXSEARCHFILENAME+1
  728.  
  729. tsearchtext
  730.         db "Search text:",0
  731.  
  732. tresults
  733.         db "Results:",0
  734.  
  735. cursearchtext
  736.         ds MAXSEARCHTEXT+1
  737.  
  738. nvfind_curpath
  739.         ds MAXPATH_sz
  740.  
  741.