; <--- description --->
; compiler:     FASM
; name:         Clipboard test with GUI.
; version:      0.1
; author:       barsuk
; comments: 	uses edit_box by Maxxxx32,<Lrz> (old static version)


; <--- include all MeOS stuff --->
include "lang.inc"
include "..\..\..\MACROS.INC"

; <--- start of MenuetOS application --->
MEOS_APP_START

SEND_DELAY = 10
RECV_DELAY = 100
ATTEMPT = 5


define DEBUG TRUE
include "bdebug.inc"

include "editbox.inc"

include "clip.inc"

use_edit_box

; <--- start of code --->
CODE

    call    clipboard_init

    call    draw_window            ; at first create and draw the window

wait_event:                      ; main cycle

	mov	edi, input_box
	call	edit_box.mouse

    mov     eax, 10
    int     0x40

    cmp     eax, 1                 ;   if event == 1
    je      redraw                 ;     jump to redraw handler
    cmp     eax, 2                 ;   else if event == 2
    je      key                    ;     jump to key handler
    cmp     eax, 3                 ;   else if event == 3
    je      button                 ;     jump to button handler

    jmp     wait_event             ;   else return to the start of main cycle


redraw:                          ; redraw event handler
    call    draw_window
    jmp     wait_event


key:                             ; key event handler
	mov     eax, 2                 ;   get key code
	int     0x40

	cmp	ah, '0'
	jb	no_digit
	cmp	ah, '9'
	ja	no_digit
	sub	ah, '0'
	mov	byte [format_id], ah
	call	draw_window
	jmp	wait_event
no_digit:
	
	mov	edi, input_box
	call	edit_box.key

	jmp     wait_event


  button:                          ; button event handler
    mov     eax, 17                ;   get button identifier
    int     0x40

    cmp     ah, 1
    jz      exit

	cmp	ah, 5
	jz	copy
	cmp	ah, 6
	jz	paste
	jmp	wait_event
copy:
	mov	esi, input_text
	mov	edi, buffer.data
	mov	ecx, [buffer.size]
	rep	movsb			; copy text to buffer

	mov	edi, input_box
	mov	edx, [edi + 38]		; ed_size
	xchg	edx, [buffer.size]
	movzx	eax, byte [format_id]
	mov	esi, buffer
	call	clipboard_write
	xchg	edx, [buffer.size]
	jmp	wait_event

paste:
	mov	esi, buffer
	movzx	eax, byte [format_id]
	mov	edx, 7
	call	clipboard_read
	
	or	eax, eax
	jz	wait_event

	cmp	eax, -1
	jz	wait_event

	or	edx, edx
	jz	wait_event		; это все ошибки

	mov	eax, input_box
;print "input box"
;dph1	[eax]
;dph1	[eax+4]
;dph1	[eax+8]
;dph1	[eax+12]
;dph1	[eax+16]
;dph1	[eax+20]
;dph1	[eax+24]

;;;;jmp	wait_event

	mov	word [input_box + 36], ed_focus	; flags

	mov	ecx, [input_box + 38]	; size
print "paste read ecx=size"
	jecxz	.noloop
	mov	edi, input_box
	mov	ah, 8		; backspace
.loop:
	call	edit_box.key
	dec	ecx
	jnz	.loop
.noloop:
	mov	esi, buffer.data
	mov	ecx, edx
pregs
.loop2:
	mov	ah, [esi]
	cmp	ah, 0
	jz	.done
	call	edit_box.key	; я бы себе руки отрезал за такое
				; но что делать, если иначе не получается?
	inc	esi
	dec	ecx
	jnz	.loop2

.done:
print "rest of data ecx"
pregs
	call	draw_window
	jmp	wait_event

exit:
    or      eax, -1                ;   exit application
    int     0x40


  draw_window:
    mov     eax, 12                ; start drawing
    mov     ebx, 1
    int     0x40

    mov     eax, 0                 ; create and draw the window
    mov     ebx, 100*65536+400     ;   (window_cx)*65536+(window_sx)
    mov     ecx, 100*65536+250     ;   (window_cy)*65536+(window_sy)
    mov     edx, 0x33ffffff        ;   work area color & window type 3
    mov	    edi, head
    int     0x40

	mov	eax, 4
	mov	ebx, 10 shl 16 + 10
	mov	ecx, 0x80000000
	mov	edx, text1
	int	0x40
	mov	eax, 4
	mov	ebx, 10 shl 16 + 20
	mov	edx, text2
	int	0x40
	mov	eax, 47
	mov	ebx, 0x00020000
	movzx	ecx, byte [format_id]
	mov	edx, 200 shl 16 + 20
	mov	esi, 0
	int	0x40

	mov	eax, 8
	mov	ebx, 10 shl 16 + 60
	mov	ecx, 40 shl 16 + 15
	mov	edx, 5
	mov	esi, 0xd72189
	int	0x40
	mov	eax, 4
	mov	ebx, 12 shl 16 + 42
	mov	ecx, 0x80000000
	mov	edx, button1
	int	0x40

	mov	eax, 8
	mov	ebx, 80 shl 16 + 60
	mov	ecx, 40 shl 16 + 15
	mov	edx, 6
	mov	esi, 0xd72189
	int	0x40
	mov	eax, 4
	mov	ebx, 82 shl 16 + 42
	mov	ecx, 0x80000000
	mov	edx, button2
	int	0x40

	mov	edi, input_box
	call	edit_box.draw

;	mov	eax, 4
;	mov	ebx, 10 shl 16 + 90
;	mov	ecx, 0
;	mov	edx, input_text
;	mov	esi, [input_box + 38]
;	int	0x40
;	mov	eax, esi
;print "eax = edit etxt len"
;pregs



    mov     eax, 12                ; finish drawing
    mov     ebx, 2
    int     0x40    	

  ret



; <--- initialised data --->
DATA

	format_id	db	1

;	buffer		db	256 dup(0)

	CLIP_BUFFER	buffer, 256

	input_text	db	256 dup(0)
	input_box	edit_box 100,10,70,0xffffff,0,0x00aaaaaa,0,255,input_text

;	input_box	edit_box 100,10,70,0xffffff,0,0xaaaaaa,0,\
;			0xaaaaaa,0,255,input_text,ed_always_focus

	head	db	"Пример работы с буфером обмена",0
	text1	db	"Нажимайте цифры 0-9 для смены id формата данных",0
	text2	db	"Сейчас выбран id формата данных: ",0

	button1	db	"Копировать",0
	button2	db	"Вставить",0

; <--- uninitialised data --->
UDATA


MEOS_APP_END
; <--- end of MenuetOS application --->