; Copyright (c) 2009, <Lrz>
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
;       * Redistributions of source code must retain the above copyright
;       notice, this list of conditions and the following disclaimer.
;       * Redistributions in binary form must reproduce the above copyright
;       notice, this list of conditions and the following disclaimer in the
;       documentation and/or other materials provided with the distribution.
;       * Neither the name of the <organization> nor the
;       names of its contributors may be used to endorse or promote products
;       derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************

;заголовок приложения
use32                ; транслятор, использующий 32 разрядных команды
    org 0x0                ; базовый адрес кода, всегда 0x0
    db 'MENUET01'        ; идентификатор исполняемого файла (8 байт)
    dd 0x1                ; версия формата заголовка исполняемого файла
    dd start                ; адрес, на который система передаёт управление
                        ; после загрузки приложения в память
    dd mem                ; размер приложения
    dd mem                  ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
    dd mem                  ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
    dd 0x0              ; указатель на строку с параметрами.
    dd way_of_ini
include '../../../../macros.inc'
include '../../box_lib/asm/trunk/editbox_ex.mac'
include '../../box_lib/load_lib.mac'
        @use_library    ;use load lib macros
start:
;universal load library/librarys
sys_load_libraries l_libs_start,end_l_libs
;if return code =-1 then exit, else nornary work
        cmp     eax,-1
        jz      exit
        mcall   40,0x27         ;установить маску для ожидаемых событий

        mov  eax,48
        mov  ebx,3
        mov  ecx,sc
        mov  edx,sizeof.system_colors
        mcall
        mov  eax,dword [sc.work]
        mov  dword [con_colors+4],eax

;       mcall   66,1,0
       call [initialization_font]       ; инициализация списка шрифтов 
       push dword (8 shl 16 +16)        ; поиск нужного шрифта в наборе шрифтов (пока доступен только 8х16)
       call [get_font]
        test    eax,eax                 ;нашли ? 
        jnz     exit
;;;;;;;;;;;;;;;;;;;;
        mcall   40,0x27         ;установить маску для ожидаемых событий
red_win:
    call draw_window            ;первоначально необходимо нарисовать окно
align 4
still:                          ;основной обработчик
        mcall   10              ;Ожидать события
        dec  eax
        jz   red_win
        dec  eax
        jz   key
        dec  eax
        jz   button

        push    dword edit1
        call    [edit_box_mouse]

        jmp still    ;если ничего из перечисленного то снова в цикл
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
button:
        mcall   17      ;получить идентификатор нажатой клавиши
        test ah,ah      ;если в ah 0, то перейти на обработчик событий still
        jz  still
exit:   
        call    [free_fulder_info]
        call    [free_font]
        mcall   -1
key:
        mcall   2       ;загрузим значение 2 в регистор eax и получим код нажатой клавиши

        push    dword edit1
        call    [edit_box_key]
 

        mcall   13,<20,650>,<40,16>, dword[con_colors+4]


        push    dword 20 shl 16 + 40    ; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y
        push    dword con_colors        ; esp+8 = dd point to color of background and font
        push    dword text              ; esp+4 = dd point to ASCIIZ
; esp+0 = dd back
        call    [font_draw_on_string]   ; вывести по глифам строчку


        jmp still

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
align 4
draw_window:            ;рисование окна приложения
        mcall   12,1
        xor  eax,eax             ;обнулить eax
        mov  ebx,50*65536+680    ;[координата по оси x]*65536 + [размер по оси x]
        mov  ecx,30*65536+200    ;[координата по оси y]*65536 + [размер по оси y]
        mov  edx,[sc.work]       ; color of work area RRGGBB,8->color gl
        or   edx,0x34000000
        mov  edi,hed
        mcall                    ;нарисовать окно приложения
        
        push    dword edit1
        call    [edit_box_draw]
;
        push    dword 20 shl 16 + 40    ; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y
        push    dword con_colors        ; esp+8 = dd point to color of background and font
        push    dword text; esp+4 = dd point to ASCIIZ
; esp+0 = dd back
        call    [font_draw_on_string]   ; вывести по глифам строчку
        mov eax,12               ;Функция 12 - начать/закончить перерисовку окна.
        mov ebx,2                ;Подфункция 2 - закончить перерисовку окна.
        mcall
        ret
;;;;;;;;;;;;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA данные
l_libs_start:
library01 l_libs library_name, way_of_ini, library_path, system_path, err_message_found_lib, head_f_l, font_import, err_message_import, head_f_i

library02 l_libs library_name1, way_of_ini, library_path, system_path1, err_message_found_lib1, head_f_l, import_box_lib, err_message_import1, head_f_i

end_l_libs:

;
system_path      db '/sys/lib/'
library_name     db 'fonts_lib.obj',0

system_path1      db '/sys/lib/'
library_name1     db 'box_lib.obj',0

err_message_found_lib   db 'Sorry I cannot load library fonts_lib.obj',0
err_message_found_lib1  db 'Sorry I cannot load library box_lib.obj',0

head_f_i:
head_f_l        db 'System error',0
err_message_import      db 'Error on load import library fonts_lib.obj',0
err_message_import1     db 'Error on load import library box_lib.obj',0

align 4
import_box_lib:   

edit_box_draw   dd      aEdit_box_draw
edit_box_key    dd      aEdit_box_key
edit_box_mouse  dd      aEdit_box_mouse
version_ed      dd      aVersion_ed

                dd      0
                dd      0

aEdit_box_draw  db 'edit_box',0
aEdit_box_key   db 'edit_box_key',0
aEdit_box_mouse db 'edit_box_mouse',0
aVersion_ed     db 'version_ed',0

font_import:
initialization_font     dd      a_initialization_font
get_font                dd      a_get_font
free_fulder_info        dd      a_free_fulder_info
free_font               dd      a_free_font
font_draw_on_string     dd      a_font_draw_on_string
show_all_glif           dd      a_show_all_glif
Version_fn            dd      a_Version_fn
                      dd      0,0

a_initialization_font   db 'initialization_font',0
a_get_font              db 'get_font',0
a_free_fulder_info      db 'free_fulder_info',0
a_free_font             db 'free_font',0
a_font_draw_on_string   db 'font_draw_on_string',0
a_show_all_glif         db 'show_all_glif',0
a_Version_fn          db 'version_fn',0



edit1 edit_box 350,175,5,0xffffff,0x6f9480,0,0xAABBCC,0,test_leght,text,ed_focus,text_end-text-1,text_end-text-1

text db   'Пример использования библиотеки шрифтов fonts_lib.obj',0
text_end:
rb  256
test_leght = ($-text)-1

hed db   "Font's demo <Lrz>",0
align 4
con_colors      dd      0x1E1EFF, 0x96FFCF

align 4
sc     system_colors
way_of_ini      rb 4096
library_path    rb 4096

align 4
i_end:
rb 1024
mem:
                ;конец кода