; part of the GUI for BGE


Spisok_gui
        LD IX,WFiler
        CALL SNewS
        CALL SpIni
        CALL Win_gui
      ;  CALL spexit
      ;  RET
       jp spexit

SNewS   RET C
        XOR A
        LD (SCROLLF+5),A
        RET

; SCF   - не устанавливать на начало ползунок
; XOR A - устанавливать на начало ползунок

Filer__gui
        CALL SNewS
        CALL LOAD_CAT_gui
        JR filer
Filer_gui
        CALL SNewS
filer
         ld a,(#5D19)
         ld (COLB),a

        CALL SORT_gui
        LD IX,WFiler
        ld a,#FF
        ld (BUFF),a
        LD HL,16
        LD (SpLen),HL
        LD HL,8
        LD (SpLenW),HL
        LD HL,8+4+4
        LD (SpLenD),HL
        LD HL,DopExt
        LD (SpDop),HL
        LD A,10
        LD (SpBar),A
        LD HL,NEWCAT
        LD (SpAdr),HL
        LD (SpAdrT),HL
        LD HL,FilDsk
        LD (SpDop2),HL

        LD HL,FSpisok
        CALL SpIni
        CALL NOKEY_gui
        CALL Window_gui
fcont   CALL Arrow
        LD A,(But)
        CP #FF
        JR NZ,rer
        CALL spexit
        RET C
        PUSH HL
        LD DE,23773
        LD BC,16
        LDIR
        POP HL
   ;     SCF     ; - обнулим флаг проще /DA
   ;     CCF
         or a
        RET

;Mark   LD A,#C9
;       LD (bar),A
;       CALL Select
;       LD A,#3E
;       LD (bar),A
;       LD A,(Numb)
;       INC A
;       JR Z,fcont
;       CALL FSetSel
;       CALL FPosition
;       LD (HL),"*"
;       LD HL,SCROLLF+5
;       INC (HL)
;       LD IX,WFiler
;       CALL DrwScroll
;       HALT
;       HALT
;       HALT
;       JP fcont

spexit  CALL FSetSel
        RET C
        CALL FPosition
     ;   SCF        ; - обнулим флаг проще /DA
     ;   CCF
         or a
        RET

; Вычисляет, какой действительный номер в списке
;
; A -> номер в списке

FSetSel LD HL,(ScrAdr)
        LD BC,5
        ADD HL,BC
        LD A,(HL)
        LD C,A
        LD A,(Numb)
        CP #FF
        JP Z,scf_gui
        ADD A,C
        LD (SelSp),A
     ;   SCF        ; - обнулим флаг проще /DA
     ;   CCF
         or a
        RET

rer ;   CP 7
    ;   JR Z,Mark
        CP 5
        CALL NZ,SEL_DRV
        CALL LOAD_CAT_gui
        LD IX,WFiler
rerr    RES 1,(IX+6)
        XOR A
        JP Filer_gui

; HL - список параметров для визуализации файлера

SpIni   DEFHL1
        LD (WFiler+2),DE
        DEFHL1
        LD (buttonf),DE
        DEFHL1
        LD (imf),DE
        DEFHL1
        LD (SCROLLF),DE
        LD A,(HL)
        INC HL
        LD (SCROLLF+2),A
        LD A,(HL)
        INC HL
        LD (SCROLLF+4),A
        DEFHL1
        LD (SpXY),DE
        DEFHL
        LD (textf),DE
        RET

FSpisok DB 13,17         ; X,Y окна
        DW BUTTONF       ; обработка кнопок
        DW IMF           ; обработка прерываний
        DB 11,5          ; X,Y скроллинга
        DB 10            ; сколько всего в окне
        DB 8             ; высота ползунка
        DW #0104         ; X,Y списка в окне
        DW TEXTF         ; адрес текста

WFiler  DEFB 9,1,13,17,7*8,7,%00001111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - WIN LIMITS

        DEFB 0
textf   DEFW TEXTF        ; объект-текст
        DEFW BUFF  ; SELECTF ; объект-подсветка (выборка) -Теперь BUFF для экономии памяти   /DA v 4.0
        DEFW HOTKEYF      ; событие-горячая клавиша
buttonf DEFW BUTTONF      ; объект-кнопки (выборка)
     ;   DEFW Nil          ; объект-флажки
     ;   DEFW Nil          ; объект-радио кнопки
        DW 2           ; пропуск 2-x адресов
        DEFW SCROLLF      ; ползунок
        DEFW CREATEF      ; событие-создания окна
imf     DEFW IMF          ; событие-прерывание
        DW #FFFF          ; заглушка /DA


;TEXTF   DB " Менеджер файлов",13
TEXTF   MSG_Filer_FMan : DB 13
        DB 0

;SELECTF DS 15*5             ; Теперь используем BUFF для экономии памяти   /DA v 4.0
;        DEFB #FF

;BUTTONF DEFB 1,3,2,1,7*8,%11  ; перенёс в 'Add.asm', т.к. теперь здесь не читаются кнопки /DA
;COLB    EQU $-2
;         DW DSK_AS                 ; DEFW BUT
;        DEFB 3,3,2,1,7*8,%11
;         DW DSK_BS                 ; DEFW BUT+16
;        DEFB 5,3,2,1,7*8,%11
;         DW DSK_CS                 ; DEFW BUT+32
;        DEFB 7,3,2,1,7*8,%11
;         DW DSK_DS                 ; DEFW BUT+48
;        DEFB 9,3,2,1,7*8,%11
;         DW DSK_ES                 ; DEFW BUT+64
;        DEFB #FF

;SpDrive         ; Для совместимости с остальным // DA
;BUT     DEFB #A0,#01,"A",#C1
;        DEFB #A2,"C",#02,"A"
;        DEFB #82,#CB,#02,"E"
;        DEFB #00,#0B,#FF,#FF
;        DEFB #A0,#01,"A",#C1
;        DEFB #A2,"C",#02,#81
;        DEFB #82,"K",#03,#85
;        DEFB #00,#0B,#FF,#FF
;        DEFB #A0,#01,"A",#C1
;        DEFB #A0,"C",#02,#01
;        DEFB #82,"K",#03,#85
;        DEFB #00,#0B,#FF,#FF
;        DEFB #A0,#01,"C",#81
;        DEFB #A0,"C",#02,"A"
;        DEFB #82,"K",#03,#85
;        DEFB #00,#0B,#FF,#FF
;        DEFB #A0,#01,"C",#81
;        DEFB #A2,#03,#03,#81
;        DEFB #82,#0B,#01,#C5
;        DEFB #00,#0B,#FF,#FF

; +18
; x, y, за раз эл-ов, всего эл-ов, высота, позиция
; адрес обработки OnCreate
; адрес обработки OnChange

SCROLLF DB 11,5,10,20,8,0
        DW Nil
        DW DrwFiler
;...............................................................
CREATEF PUSH IX
        LD HL,(ScrAdr)
        CPHL0
        JR Z,PopIX4
        PUSH HL
        POP IX

        LD A,(IX+2)
        LD (FOnn),A
        LD C,0
        LD HL,(SpAdr)
        LD DE,(SpLen)
alllen  LD A,(HL)
        AND A
        JR Z,allLen
        RET Z
        ADD HL,DE
        INC C
        JR alllen
allLen  LD (IX+3),C
PopIX4  POP IX
        LD A,(FOnn)
        CP C
        JR C,okk1
        LD A,C
okk1    LD B,A
kal     LD H,(IX+11)
        LD L,(IX+10)
        AND A
        JR Z,zen

        LD A,(SpBar)
        LD C,A
        LD DE,(SpXY)
tip__   LD A,1

enlp    LD (HL),D
        INC HL
        LD (HL),E
        INC HL
        LD (HL),C
        INC HL
        LD (HL),A
        INC HL
        LD (HL),%11
        INC HL
        INC E
        DJNZ enlp

zen     LD (HL),#FF
        LD BC,(SpDop)
        LD (jphl+1),BC
        RET

; A  - номер элемента
; HL - адрес элемента в списке
FPosition
        LD B,A
        LD HL,(SpAdr)
        LD DE,(SpLen)
        AND A
        RET Z
Zap     ADD HL,DE
        DJNZ Zap
        RET

DrwFiler
        LD A,(IX+5)
        LD (FPos),A
        LD IX,(Ix)

        LD A,0
FPos    EQU $-1
        CALL FPosition
        LD (SpAdrT),HL
        LD DE,(SpXY)
        CALL realwin
        CALL RASCH
        LD (xyprn),HL

PrtName LD A,0
FOnn    EQU $-1
prtname JR Z,DOPSPACE_
        EX AF,AF'
        LD HL,(SpAdrT)
        LD A,(HL)
        AND A
        JR Z,DOPSPACE

        LD A,(SpLenW)
        LD B,A
        LD DE,SPACE
copynam LD A,(HL)
        CP 32
        JR NC,copok
        LD A,"?"
copok   LD (DE),A
        INC HL
        INC DE
        DJNZ copynam

        EX AF,AF'
        PUSH AF
jphl    CALL 0
        POP AF
        EX AF,AF'

        LD HL,(SpAdrT)
        LD BC,(SpLen)
        ADD HL,BC
        LD (SpAdrT),HL
        CALL PR_ST
        EX AF,AF'
        DEC A
        JR prtname

PR_ST   LD A,(SpLenD)
        LD C,A
pr_st   CALL PR_51
        LD HL,(xyprn)
        CALL INC_YY
        LD (xyprn),HL
        RET

DOPSPACE
        EX AF,AF'
DOPSPACE_
MZ      AND A
;       RET Z
        JR Z,oops
        EX AF,AF'
        LD HL,SPACE
        LD DE,SPACE+1
        LD A,(SpLenD)
        DEC A
        LD B,0
        LD C,A
        LD (HL)," "
        LDIR
        EX AF,AF'
        LD B,A
zaz     PUSH BC
        CALL PR_ST
        POP BC
        DJNZ zaz

oops    LD HL,(SpDop2)
        CPHL0
        RET Z
        JP (HL)

FilDsk  LD HL,(xyprn)
        CALL Dline
        CALL INC_YY
        LD (xyprn),HL
        LD HL,(CAT+#800+Free_Sec)
        LD DE,TxtDsk+4
        LD C,1
        CALL GET_NUM_gui
        LD A,(CAT+#800+All_File)
        LD DE,TxtDsk+14
        LD C,0
        CALL GET_NUM_gui
        LD HL,TxtDsk
        LD DE,SPACE
        LD BC,lndsk
        LDIR
        LD A,(SpLenD)
        LD C,A
        INC C
        JP pr_st

TxtDsk  DB "Sec:00000 All:000"
lndsk   EQU $-TxtDsk

FormExt_gui
        LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        PUSH DE
        PUSH HL
        LD A,(HL)
        CP 33
        JR C,RESP
        CP #7B
        JR NC,RESP
        INC HL
        INC DE
        LD A,(HL)
        CP 33
        JR C,RESP
        CP #7B
        JR NC,RESP
        POP HL
        POP DE
        LD B,2
EXLP    LD A,(HL)
        LD (DE),A
        CP 33
        JR C,OK_EXT
        CP #7B
        JR NC,OK_EXT
        INC DE
        INC HL
        DJNZ EXLP
        RET

RESP    POP HL
        POP DE
        LD A," "
        LD (DE),A
        INC HL
        INC DE
        LD (DE),A
        INC HL
        INC DE
        RET

OK_EXT  PUSH AF
        LD A," "
        LD (DE),A
        POP AF
        RET

DopExt  LD A,"."
        LD (DE),A
        INC DE
        CALL FormExt_gui
        LD A," "
        LD (DE),A
        INC HL
        INC DE

        LD HL,(SpAdrT)
        LD BC,13
        ADD HL,BC
        LD A,(HL)
    ;    LD (WHERE_N),DE
        JP PDEC

; +22
HOTKEYF DB CS
        DB "7"
         DW SUPP
        DB CS
        DB "6"
         DW SDNN
        DB CS
        DB "8"
         DW SDN_
        DB CS
        DB "5"
         DW SUP_
        DB CS
        DB "4"
         DW SDN_
        DB CS
        DB "3"
         DW SUP_
        DB #FF

SUP_    PUSH IX
        LD IX,(ScrAdr)
        LD A,(IX+5)
        SUB (IX+2)
      ;  CALL C,nom__
       jr nc,1F
        xor a
1       LD (IX+5),A
        JR Nom

;nom__   XOR A
;        RET

SDN_    PUSH IX
        LD IX,(ScrAdr)
        LD A,(IX+3)
        SUB (IX+2)
        LD C,A
        LD A,(IX+2)
        ADD A,(IX+5)
        CP C
      ;  CALL NC,nom_
       jr c,1F
        ld a,(ix+3)
        sub (ix+2)
1       LD (IX+5),A
Nom     HALT
        HALT
        HALT
        JR nom

;nom_    LD A,(IX+3)
;        SUB (IX+2)
;        RET

SDNN    PUSH IX
        LD IX,(ScrAdr)
        LD A,(IX+3)
        AND A
        JR Z,nom
        CP (IX+2)
        JR C,nom
        JR Z,nom
        SUB (IX+2)
        DEC A
        CP (IX+5)
        JR C,nom
        INC (IX+5)
        JR nom

SUPP    PUSH IX
        LD IX,(ScrAdr)
        LD A,(IX+3)
        AND A
        JR Z,nom
        LD A,(IX+5)
        AND A
        JR Z,nom
        DEC (IX+5)
nom     POP IX
        HALT
        CALL BarOff
        CALL DrwScroll
        JP Arrow

HotF    DB "R"
        DB "R"
         DW 5
        DB 0
        DB "1"
         DW 0
        DB 0
        DB "2"
         DW 1
        DB 0
        DB "3"
         DW 2
        DB 0
        DB "4"
         DW 3
        DB 0
        DB "5"
         DW 4
        DB #FF

IMF     LD HL,HotF
        CALL hotkey
        CP #FF
        RET Z
        POP BC
        LD (But),A
        JP arrex

