;
;
;  This is example using GUI component Bookmark from libGUI.
;
;

include 'macros.inc'
use32
        db      'MENUET01'
        dd      1
        dd      start
        dd      i_end
        dd      126*1024
        dd      126*1024
        dd      0
        dd      path

start:
        ;init hepe of memory
        mcall   68,11

        ;set current dir as ./
        call GetPath

        ;load dll
        mcall   68,19,path

        test    eax,eax
        jnz    libGUI_loaded

        mcall 68,19,sys_libGUI_path

           test eax,eax
           jnz libGUI_loaded

             mcall -1

        libGUI_loaded:

        mov [myexport],eax

        ;load dll functions

        push fnDestroyControl
        push [myexport]
        call _ksys_cofflib_getproc
        mov [destroy_control],eax

        push fnSendMessage
        push [myexport]
        call _ksys_cofflib_getproc
        mov [send_message],eax

        push fnResizeComponent
        push [myexport]
        call _ksys_cofflib_getproc
        mov [resize_component],eax

        push fnMoveComponent
        push [myexport]
        call _ksys_cofflib_getproc
        mov [move_component],eax

        push fnCraeteButton
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_button],eax

        push fnCraeteScroller
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_scroller],eax

        push fnCraeteBookmark
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_bookmark],eax

        push fnCraeteImage
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_image],eax

        push fnCraeteText
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_text],eax

        push fnCraeteNumber
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_number],eax

        push fnCraeteCheckbox
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_check_box],eax

        push fnCraeteEditbox
        push [myexport]
        call _ksys_cofflib_getproc
        mov [craete_edit_box],eax

        ;set events mask
        mcall   40,1100111b

        ;get standart colors table
        mcall   48,3,ColorsTable,40

        ;*********************************************
        ;****************Init Butttons****************
        ;*********************************************

        mov ecx,[ColorsTable+8]
        and ecx,0xffffff

        mov [Button1.type],byte 10010001b
        mov [Button1.x],120
        mov [Button1.y],120
        mov [Button1.width],word 70
        mov [Button1.height],word 20
        mov [Button1.color1],dword ecx
        mov [Button1.color2],dword 0xffffff
        mov [Button1.text],text1



        mov [Button3.type],byte 10010001b
        mov [Button3.x],165
        mov [Button3.y],320
        mov [Button3.width],word 70
        mov [Button3.height],word 20
        mov [Button3.color1],dword ecx
        mov [Button3.color2],dword 0xffffff
        mov [Button3.text],text3


        push Button3
        push Parend
        call [craete_button]
        mov [PointerToControlForButtonExit],eax

         mov ecx,[ColorsTable+8]
         and ecx,0xffffff

        ;********************************************
        ;***************Init scrollers****************
        ;********************************************

        ;init vertical scroller
        mov ecx,[ColorsTable+8]
        mov [VerticalScroller.type],byte 11110001b
        mov [VerticalScroller.x],150
        mov [VerticalScroller.y],10
        mov [VerticalScroller.pos],0.2
        mov [VerticalScroller.length],200
        mov [VerticalScroller.size],0.3
        mov [VerticalScroller.color1],ecx

        ;********************************************
        ;******************Init Image****************
        ;********************************************

        mov [Image.type],byte 10000000b
        mov [Image.x],30
        mov [Image.y],10
        mov [Image.sizex],200
        mov [Image.sizey],200
        mov [Image.pointer],Picture

        ;********************************************
        ;******************Init Text*****************
        ;********************************************

        mov [Text.type],byte 10000000b
        mov [Text.color],0xffffff
        mov [Text.x],100
        mov [Text.y],100
        mov [Text.length],25
        mov [Text.pointer],text_for_text

        ;********************************************
        ;*****************Init Number****************
        ;********************************************

        mov [Number.type],byte 10000010b
        mov [Number.color],0xffffff
        mov [Number.x],150
        mov [Number.y],100
        mov [Number.parameters],5*65536+4
        mov [Number.number],-1234.5678

        ;********************************************
        ;***************Init CheckBox****************
        ;********************************************

        mov ecx,[ColorsTable+8]
        and ecx,0xffffff

        ;mov [CheckBox.ch_flags],word 10b
        mov [CheckBox.ch_left],150
        mov [CheckBox.ch_top],330
        mov [CheckBox.ch_text_margin],4
        mov [CheckBox.ch_size],11
        mov [CheckBox.ch_color],0xffffff
        mov [CheckBox.ch_border_color],ecx
        mov [CheckBox.ch_text_color],0
        mov [CheckBox.ch_text_ptr],check_box_text
        mov [CheckBox.ch_text_length],9

        ;********************************************
        ;***************Init EditBox*****************
        ;********************************************

        mov ecx,[ColorsTable+8]
        mov [EditBox.ed_flags],0b;1000000000000000b
        mov [EditBox.ed_left],100   ;x
        mov [EditBox.ed_top],100   ;y
        mov [EditBox.ed_width],150
        mov [EditBox.ed_height],14
        mov [EditBox.ed_max],100
        mov [EditBox.ed_text],buffer_for_text
        mov [EditBox.ed_color],dword 0xffffff
        mov [EditBox.shift_color],dword 0xaabbcc
        mov [EditBox.ed_focus_border_color],0
        mov [EditBox.ed_blur_border_color],ecx
        mov [EditBox.ed_text_color],0



        ;********************************************
        ;***************Init bookmark****************
        ;********************************************


        ;init bookmark
        mov ecx,[ColorsTable+8]
        mov [Bookmark.type],byte 10100001b
        mov [Bookmark.x],10
        mov [Bookmark.y],10
        mov [Bookmark.sizex],350
        mov [Bookmark.sizey],270
        mov [Bookmark.color_1],dword ecx
        mov [Bookmark.color2],dword 0xffffff

        mov [Bookmark.number_bookmarks],3
        mov [Bookmark.number_zak_in_1],2
        mov [Bookmark.number_zak_in_2],3
        mov [Bookmark.number_zak_in_3],1

        mov [Bookmark.text_for_1],text4
        mov [Bookmark.number_contrl_1],1
        mov [Bookmark.type_control_1],1
        mov [Bookmark.info_1_control],dword Button1

        mov [Bookmark.text_for_2],text5
        mov [Bookmark.number_contrl_2],1
        mov [Bookmark.type_control_2],6
        mov [Bookmark.info_2_control],dword Number

        mov [Bookmark.text_for_3],text6
        mov [Bookmark.number_contrl_3],1
        mov [Bookmark.type_control_3],8
        mov [Bookmark.info_3_control],dword EditBox

        mov [Bookmark.text_for_4],text7
        mov [Bookmark.number_contrl_4],1
        mov [Bookmark.type_control_4],4
        mov [Bookmark.info_4_control],dword Image

        mov [Bookmark.text_for_5],text8
        mov [Bookmark.number_contrl_5],1
        mov [Bookmark.type_control_5],2
        mov [Bookmark.info_5_control],dword VerticalScroller

        mov [Bookmark.text_for_6],text9
        mov [Bookmark.number_contrl_6],1
        mov [Bookmark.type_control_6],5
        mov [Bookmark.info_6_control],dword Text


        push Bookmark
        push Parend
        call [craete_bookmark]
        mov [PointerToControlForBookmark],eax

        call draw_window

        ;*****************************************************
        ;**********Example of resize component****************
        ;*****************************************************
        mov ebx,[PointerToControlForButtonExit]
        push 30;270
        push 150;250
        push ebx
        call [resize_component]

        ;*****************************************************
        ;**********Example of remove component****************
        ;*****************************************************
        mov ebx,[PointerToControlForButtonExit]
        push 340;270
        push 120;250
        push ebx
        call [move_component]

        ;send message 1 for redrawing ALL controls
        mov [Message],dword 1

        push Message
        push Parend
        call [send_message]


still:
        mcall   10

        ;check for redraw window
        cmp eax,1
        jne no_window

          call draw_window

          mov eax,[PointerToControlForBookmark]
          mov ebx,[Window_SizeX]
          mov ecx,[Window_SizeY]
          sub ebx,50
          sub ecx,130
          ;or [eax+44],byte 1000000b
          mov [eax+32],ebx
          mov [eax+36],ecx

          mov [Message],dword 1
          push Message
          push Parend
          call [send_message]

        jmp still
        no_window:

        ;check for keys events
        cmp eax,2
        jne no_keys

          mcall   2
          shr eax,8

          mov [Message],dword 2
          mov [Message+4],eax

          push Message
          push Parend
          call [send_message]

          mov eax,[Message+4]

          cmp al,27
          je exit

        jmp still
        no_keys:

        ;check for pressed butons
        cmp eax,3
        jne no_buttons

          mcall   17
          shr eax,8

        jmp still
        no_buttons:

        ;check for mouse events
        cmp eax,6
        jne no_mouse

         mov [Message],dword 6

         mcall   37,1
         mov ebx,eax
         shr eax,16 ;x
         and ebx,0xffff ;y

         mov [Message+4],eax
         mov [Message+8],ebx

         mcall   37,2
         mov [Message+12],eax

         ;send system events to control
         push Message
         push Parend
         call [send_message]

         mov eax,[PointerToControlForButtonExit]

         xor ebx,ebx
         mov bl,byte[eax+45]
         cmp bl,11b
         jne no_crossing_pressing_button

           mov [button_pressed],1

         no_crossing_pressing_button:

         xor ebx,ebx
         mov bl,byte[eax+45]
         cmp bl,1b
         jne no_crossing_button

           cmp [button_pressed],1
           jne no_crossing_button

              jmp exit

         no_crossing_button:

         jmp still
         no_mouse:

        jmp still

exit:

        push [PointerToControlForButtonExit]
        call [destroy_control]

        push [PointerToControlForBookmark]
        call [destroy_control]

        mcall   -1



;**********************************************
;*******************Draw window****************
;**********************************************

draw_window:
        mcall   9,IPC_table,-1
        mcall   12,1

        mov eax,[IPC_table+34]
        mov ebx,[IPC_table+38]
        mov ecx,[IPC_table+42]
        mov edx,[IPC_table+46]
        mov [Window_CordinatX],eax
        mov [Window_CordinatY],ebx
        mov [Window_SizeX],ecx
        mov [Window_SizeY],edx

        cmp [Window_SizeX],400
        jae no_minimum_size_x

        mov [Window_SizeX],400
        mov ecx,[Window_SizeX]

        no_minimum_size_x:

        cmp [Window_SizeY],400
        jae no_minimum_size_y

        mov [Window_SizeY],400
        mov edx,[Window_SizeY]

        no_minimum_size_y:

        xor eax,eax
        mov ebx,[Window_CordinatX]
        mov ecx,[Window_CordinatY]
        shl ebx,16
        shl ecx,16
        add ebx,[Window_SizeX]
        add ecx,[Window_SizeY]
        mov edx,0x03aabbcc
        mov esi,0x805080d0
        mov edi,0x005080d0
        mcall

        ;call print_controls_information

        mcall   12,2
        ret


GetPath:

        mov ebx,255
        mov ecx,path

        next_symvol:
        mov edx,ecx
        add edx,ebx

        xor eax,eax
        mov al,[edx]
        cmp eax,'/'
        je exit_path

        dec ebx
        jnz next_symvol

        exit_path:

        inc edx
        mov esi,dll_name
        mov edi,edx
        mov ecx,10
        rep movsb

        ret


include 'getproc.asm'

;************************************************************
;***************************DATA*****************************
;************************************************************

align 4

dll_name        db 'libGUI.obj',0
sys_libGUI_path db '/sys/lib/libGUI.obj',0

check_box_text db 'Check box',0

text1    db 'text',0
text3    db 'Exit',0

text4    db 'Bookmark_1',0
text5    db 'Bookmark_2',0
text6    db 'Bookmark_3',0
text7    db 'Bookmark_4',0

text8    db 'Bookmark_5',0
text9    db 'Bookmark_6',0

text_for_text db 'Hello world from bookmark',0

fnDestroyControl                     db 'DestroyControl',0
fnSendMessage                        db 'SendMessage',0
fnResizeComponent                    db 'ResizeComponent',0
fnMoveComponent                    db 'MoveComponent',0
fnCraeteButton                       db 'CraeteButton',0
fnCraeteScroller                     db 'CraeteScroller',0
fnCraeteBookmark                     db 'CraeteBookmark',0
fnCraeteImage                        db 'CraeteImage',0
fnCraeteText                         db 'CraeteText',0
fnCraeteNumber                       db 'CraeteNumber',0
fnCraeteCheckbox                     db 'CraeteCheckbox',0
fnCraeteEditbox                      db 'CraeteEditbox',0
fnCraeteProgressbar                  db 'CraeteProgressbar',0

myexport                             dd 0

destroy_control                       dd 0
send_message                          dd 0
resize_component                      dd 0
move_component                        dd 0
craete_button                         dd 0
craete_scroller                       dd 0
craete_bookmark                       dd 0
craete_image                          dd 0
craete_text                           dd 0
craete_number                         dd 0
craete_check_box                      dd 0
craete_edit_box                       dd 0
craete_progres_bar                    dd 0

PointerToControlForButton1           dd 0
PointerToControlForButtonExit        dd 0

PointerToControlForHorizontalScroller dd 0
PointerToControlForVerticalScroller   dd 0

PointerToControlForBookmark          dd 0

PointerToControlForImage             dd 0

PointerToControlForText              dd 0

PointerToControlForCheckBox          dd 0

PointerToControlForEditBox           dd 0


Window_CordinatX                     dd 0
Window_CordinatY                     dd 0

Window_SizeX                         dd 0
Window_SizeY                         dd 0

button_pressed                       dd 0

IPC_table                            rd 256
path                                 rb 256

Parend:        dd 0,0,0,0,0,0,0,0,0,0,0,0   ;44 bytes
Message                               rd 4

ColorsTable  rd 10
buffer_for_text rb 100+2

struc BUTTON
{
 .type             db 1
 .flag             db 1
 .x                dw 1
 .y                dw 1
 .width            dw 1
 .height           dw 1
 .image            dd 1
 .imageX           dw 1
 .imageY           dw 1
 .imageSizeX       dw 1
 .imageSizeY       dw 1
 .transparentColor dd 1
 .text             dd 1
 .textX            dw 1
 .textY            dw 1
 .textcolor        dd 1
 .color1           dd 1
 .color2           dd 1
 .mouseX           dw 1
 .mouseY           dw 1
}

struc SCROLLER
{
 .type             rb 1
 .x                rw 1
 .y                rw 1
 .length           rw 1
 .color1           rd 1
 .size             rd 1
 .pos              rd 1
 .buttons_flags    rw 1
 .ChildButton1     rd 1
 .ChildButton2     rd 1
 .mouseX           rw 1
 .mouseY           rw 1
}

struc BOOKMARK
{
 .type             rb 1
 .flag             rb 1
 .x                rd 1
 .y                rd 1
 .sizex            rd 1
 .sizey            rd 1
 .color_1          rd 1
 .reserved         rd 1
 .color2           rd 1

 .number_bookmarks rd 1
 .number_zak_in_1  rd 1
 .number_zak_in_2  rd 1
 .number_zak_in_3  rd 1

 .text_for_1       rd 1
 .number_contrl_1  rd 1
 .type_control_1   rd 1
 .info_1_control   rd 1

 .text_for_2       rd 1
 .number_contrl_2  rd 1
 .type_control_2   rd 1
 .info_2_control   rd 1

 .text_for_3       rd 1
 .number_contrl_3  rd 1
 .type_control_3   rd 1
 .info_3_control   rd 1

 .text_for_4       rd 1
 .number_contrl_4  rd 1
 .type_control_4   rd 1
 .info_4_control   rd 1

 .text_for_5       rd 1
 .number_contrl_5  rd 1
 .type_control_5   rd 1
 .info_5_control   rd 1

 .text_for_6       rd 1
 .number_contrl_6  rd 1
 .type_control_6   rd 1
 .info_6_control   rd 1

}

struc IMAGE
{
 .type             rb 1
 .flag             rb 1
 .color            rd 1
 .x                rd 1
 .y                rd 1
 .sizex            rd 1
 .sizey            rd 1
 .pointer          rd 1
}

struc TEXT
{
 .type             rb 1
 .flag             rb 1
 .color            rd 1
 .x                rd 1
 .y                rd 1
 .length           rd 1
 .pointer          rd 1
}

struc NUMBER
{
 .type             rb 1
 .flag             rb 1
 .color            rd 1
 .x                rd 1
 .y                rd 1
 .number           rd 1
 .parameters       rd 1
}

struc CHECKBOX
{
 .ch_flags         rw 1
 .ch_left          rw 1
 .ch_top           rw 1
 .ch_text_margin   rd 1
 .ch_size          rd 1
 .ch_size_2        rw 1
 .ch_size_3        rw 1
 .ch_color         rd 1
 .ch_border_color  rd 1
 .ch_text_color    rd 1
 .ch_text_ptr      rd 1
 .ch_text_length   rw 1
 .mouseX           rd 1
 .mouseY           rd 1
}
struc EDITBOX
{
 .ed_width                      rd 1     ;? ?
 .ed_left                       rd 1     ;  ??
 .ed_top                        rd 1     ;  ??
 .ed_color                      rd 1     ;??? ?
 .shift_color                   rd 1     ;?????. ??
 .ed_focus_border_color         rd 1     ;??? ?
 .ed_blur_border_color          rd 1     ;?? ? ?
 .ed_text_color                 rd 1     ;????
 .ed_max                        rd 1     ;- ? ?? ?? ?
 .ed_text                       rd 1     ;??? ??
 .ed_flags                      rw 1     ;?
 .ed_size                       rd 1     ;- ?
 .ed_pos                        rd 1     ;? ??
 .ed_offset                     rd 1     ;??
 .cl_curs_x                     rd 1     ;??? ????  ?
 .cl_curs_y                     rd 1     ;??? ????  ?
 .ed_shift_pos                  rd 1     ; ??
 .ed_shift_pos_old              rd 1     ;??  ??
 .ed_height                     rd 1
 .mouseX                        rd 1
 .mouseY                        rd 1
}

struc PROGRESSBAR
{
 .type                          rb 1
 .flag                          rb 1
 .color1                        rd 1
 .color2                        rd 1
 .x                             rd 1
 .y                             rd 1
 .sizex                         rd 1
 .sizey                         rd 1
 .progres                       rd 1
 .color3                        rd 1
}

Button1             BUTTON
Button3             BUTTON
VerticalScroller    SCROLLER
Bookmark            BOOKMARK
Image               IMAGE
Text                TEXT
Number              NUMBER
CheckBox            CHECKBOX
EditBox             EDITBOX
EditBox2            EDITBOX
ProgressBar         PROGRESSBAR

antibug: rb 2000

Picture:
file 'image.raw'

i_end:
