;=========================================================== ; ; Процесс удаления файла/папки ; ;=========================================================== delete: call test_show_panels ; тест на режим вкл. панелей ret z call get_fire ; защита от "залипания" бутонов ld a,(format_mode) ; тек. формат панели and form_info+form_qview ; info, qview ret nz xor a ld (show_dial_ro_all+1),a ; сбр. флаг не вывода диалога "файл r/o" ld de,(mark_files) ; число выдел. файлов ld hl,1 sbc hl,de jp c,delete_group_files ; >= 2 выдел. файлов call prep_delete_name ; имя файла в описатель окна ret c ; ".." запись call set_path_from_activ_panel ; уст. диск и путь акт. панели ret c ; очистить буфер клавы ld a,1 rst 20h ; ld a,(del_confirm) ; флаг подтверждения or a jr z,delete_ok ; вывод начального окна ld hl,dial_delete ; описатель окна call DialogW cp evCommand ; событие "команда" ret nz ld a,(hl) ;+1 what cp cmOkey ; "Ok" ret nz delete_ok: call deleting_files ret c ; ошибки или прерывание операции jp fresh_two_panels ; без ошибок, обновить панели ; УДАЛЕНИЕ ФАЙЛА/ПАПКИ ; выход: NC - Ok ; CF - прерывание операции или ошибка ; a= -1 отмена операции ; a= -2 отмена удаления тек. не пустой папки ; a=номер команды (cmCancel, cmSkip, cmSkipAll) deleting_files: ; ld a,(attr_record) ; атрибут файла (глоб. ячейка) bit 4,a ; папка ? jr nz,delete1 ; да bit 0,a ; Read-Only ? jr z,delete1 ; нет show_dial_ro_all: ld a,false ; флаг не вывода диалога "файл r/o" or a jr nz,delete_yes1 ; вывод окна "файл r/o" ld hl,delete_name ; откуда ld de,delete_name3 ; куда (буфер 12 байт) call copy_string ; (hl) -> (de) с нулем ld hl,dial_delete_ro ; "The file is read only" call DialogEr cp evCommand ; событие "команда" ld a,-1 ; код "отмена операции" scf ret nz ld a,(hl) ;+1 what cp cmOkey ; "Delete" jr z,delete_yes1 cp cmAll ; "All" scf ret nz ; Cancel, Skip, Skip all ld (show_dial_ro_all+1),a ; уст. флаг delete_yes1: ; снять "r/o" атрибут ld hl,attr_record ; атрибут файла (глоб. ячейка) res 0,(hl) ; обновить атрибут ld a,(hl) ld hl,temp_fname ; имя файла/папки ld bc,0116h ; уст. атрибут файла rst 10h delete1: ; скопир. имя файла/папки в описатель инфо-окна ld hl,delete_name ; откуда ld de,delete_name1 ; куда call copy_string delete_try: ; вывод инфо-окна имени файла/папки ld hl,dial_delete_current call WinSimple ; открыть окно ; удаление файла/папки ld c,1Ch ; удалить папку ld a,(attr_record) ; атрибут файла (глоб. ячейка) bit 4,a ; папка ? jr nz,$+4 ; да ld c,0Eh ; удалить файл ld hl,temp_fname ; имя файла/папки rst 10h ; закрыть инфо-окно push af call CloseWinSimple pop af ret nc ; файл (папка) удален без ошибок ; ошибки cp 0Bh ; не пустая папка ? jr z,folder_not_empty ; да ; вывод окна ошибки удаления ld hl,delete_name ; откуда ld de,delete_name2 ; куда (буфер 12 байт) call copy_string ; (hl) -> (de) с нулем ld hl,dial_error_delete ; "Cannot delete the file" call DialogEr cp evCommand ; событие "команда" ld a,-1 ; код "отмена операции" scf ret nz ld a,(hl) ;+1 what cp cmOkey ; "Retry" jr z,delete_try scf ret ; Cancel, Skip, Skip all ; Удаляемая папка не пустая folder_not_empty: ld a,(flag_del_non_empty) ; флаг подтверждения or a jr z,delete_full_folder ; вывод окна предупреждения ld hl,delete_name ; откуда ld de,delete_name4 ; куда call copy_string ld hl,dial_nonempty_delete_folder ; "The following folder will be deleted" call DialogEr cp evCommand ; событие "команда" ld a,-2 ; отмена удаления тек. не пустой папки scf ret nz ld a,(hl) ;+1 what cp cmOkey ; Delete ld a,-2 ; отмена удаления тек. не пустой папки scf ret nz ; Cancel ; удалить не пустую папку delete_full_folder: ld a,3 ; режим удаления del_full_fold_rec: ld hl,0 ; сохр. адрес записи (из п/п "prep_delete_name") call scan_folder_alt ; уст. путь + сканир. папки (qview.asm) jr c,delete_full_folder_err ; Нет ошибок, удалить стартовую папку ; скопир. имя файла в описатель инфо-окна ld hl,temp_fname ; откуда ld de,delete_name1 ; куда call copy_cur_fname_alt ; скопир. имя файла и отцентровать ; вывод инфо-окна ld hl,dial_delete_current call WinSimple ; открыть окно ; составить путь стартовой папки ld hl,(__buff) ; путь акт. панели ld de,work_buffer ; куда (в конец строки) call copy_string ex de,hl dec hl dec hl ld a,'\' cp (hl) jr z,$+3 inc hl ld (hl),a inc hl ex de,hl ; de=куда ld hl,temp_fname ; откуда (имя папки) call copy_string ; удалить папку ld hl,work_buffer ; куда (в конец строки) ld c,1Ch ; удалить папку rst 10h ; закрыть инфо-окно call CloseWinSimple or a ret delete_full_folder_err: ; выход из сканир. по ошибке cp EUABORT ; 37 код "операция прервана пользователем" scf ret z ; Окно ошибки удаления ; вывод имени тек. папки ;ld hl,work_buffer+33; ; откуда ;ld de,delete_name5; ; куда (буфер 12 байт) ;call copy_cur_fname_alt; ; скопир. имя файла и отцентровать ; вывод имени стартовой папки ld hl,delete_name ; откуда ld de,delete_name5 ; куда call copy_string ld hl,dial_error_delete_tiny ; "Cannot delete the file or folder" call DialogEr ld a,-1 ; код "отмена операции" scf ret ; Скопировать тек. имя удаляемого файла/папки в описатель окна. ; Обработка макс. одной выдел. записи prep_delete_name: ld de,(mark_files) ; число выдел. файлов ld a,d or e jr nz,prep_del_name1 ; есть один выдел. файл ; нет выдел. файлов call get_record ; запись в тек. положении указателя ld (attr_record),a ; атрибут файла (глоб. ячейка) ld (del_full_fold_rec+1),hl ld a,(hl) cp "." ; ".." scf ret z jr $+5 prep_del_name1: call scan_mark_records ; поиск отмеч. файла (с начала списка) prep_del_name2: ld (del_full_fold_rec+1),hl ; вход: hl=запись файла ld bc,delete_name ; куда (буфер 12 байт) jp copy_cur_fname ; скопир. имя файла и отцентровать ;======== Блок работает в составе ScanTree =============== ; Удаление текущего файла delete_file: push ix ; скопир. имя файла в описатель инфо-окна ld hl,work_buffer+33 ; откуда ld de,delete_name1 ; куда call copy_cur_fname_alt ; скопир. имя файла и отцентровать ; вывод инфо-окна ld hl,dial_delete_current call WinSimple ; открыть окно ; ld hl,work_buffer+32 ; атрибут найд. записи ld a,(hl) bit 0,a ; Read-Only ? jr z,delete_file_next ; нет ; снять "r/o" атрибут res 0,(hl) ; обновить атрибут ld a,(hl) inc hl ; +33 (имя файла) ld bc,0116h ; уст. атрибут файла push af rst 10h pop af delete_file_next: ld c,0Eh ; удалить файл delete_file_next1: ld hl,work_buffer+33 ; имя файла rst 10h push af ; закрыть инфо-окно call CloseWinSimple pop af pop ix ret ; Удаление текущей папки ; вх: hl=адрес имени тек. папки delete_folder: push ix ; скопир. имя папки в описатель инфо-окна ld de,delete_name1 ; куда call copy_cur_fname_alt ; скопир. имя файла и отцентровать ; ld hl,work_buffer+33 ld c,1Eh ; узнать путь rst 10h ; вывод инфо-окна ld hl,dial_delete_current call WinSimple ; открыть окно ld c,1Ch ; удалить папку jr delete_file_next1 ;======================================================== ;-------------------------------------------------------------- ; Групповое удаление файлов/папок ;-------------------------------------------------------------- delete_group_files: call set_path_from_activ_panel ; уст. диск и путь акт. панели ret c ; найти отмеч. файл (с начала списка) + копир. и центровка имени call prep_del_name1 ; найти отмеч. файл + центровка имени ; ld a,(del_confirm) ; флаг подтверждения or a jr z,delete_group_loop ; вывод начального окна ld hl,dial_delete ; описатель окна call DialogW cp evCommand ; событие "команда" ret nz ld a,(hl) ;+1 what cp cmOkey ; "Ok" ret nz delete_group_loop: call deleting_files ; удалить тек. файл/папку jr nc,delete_group_next ; процесс Ok ; отмена операции или ошибка cp -1 ; отмена операции ? jp z,fresh_two_panels ; да, обновить панели cp -2 ; отмена удаления тек. не пустой папки jr z,delete_group_next cp cmSkipAll ; Skip all jp z,fresh_two_panels cp cmSkip ; Skip jr z,delete_group_next cp EUABORT ; 37 код "операция прервана пользователем" jp nz,fresh_two_panels ; Cancel call set_path_from_activ_panel ; уст. стартовый путь jp c,fresh_two_panels ; ошибка, обновить панели delete_group_next: call scan_mark_loop ; поиск отмеч. файла (след. по списку) jp c,fresh_two_panels ; нет отмеч. записей, обновить панели call prep_del_name2 ; найти след. отмеч. запись + центровка имени jr delete_group_loop