Subversion Repositories Kolibri OS

Rev

Rev 4943 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.     VERSION equ "0.5"
  2.  
  3.     use32
  4.     org     0
  5.     db      'MENUET01'
  6.     dd      1, main, dataend, memory, stacktop, 0, 0
  7.  
  8.     include "../../proc32.inc"
  9.     include "../../macros.inc"
  10.     include "../../dll.inc"
  11.     include "../../develop/libraries/box_lib/trunk/box_lib.mac"
  12.   ;  include "../../debug.inc"
  13.     include "parser.inc"
  14.  
  15.  ;===============================
  16.  
  17.     LIST_ITEM_SIZE   equ 16
  18.     LIST_ITEM_COUNT  equ 6
  19.     LIST_SIZE        equ LIST_ITEM_SIZE * LIST_ITEM_COUNT
  20.     LIST_ITEM_COLOR1 equ dword [scn.btn_face]
  21.     LIST_ITEM_COLOR2 equ dword [scn.win_face]
  22.     LIST_ITEM_TEXT1  equ dword [scn.btn_text]
  23.     LIST_ITEM_TEXT2  equ dword [scn.win_text]
  24.     LIST_ITEM_Y      equ LIST_ITEM_SIZE / 2 - 3
  25.  
  26.     KEYB_SIZE        equ 140
  27.  
  28.     sz_cont db "Keyboard ", 0x10
  29.     sz_head db "Calc+ v", VERSION, 0
  30.     btn_clr db ""
  31.     buttons db "|%^*/-+)(=7894561230"
  32.     edb1    edit_box 0, 8, 12, 0, 0, 0, 0, 0, 480, \
  33.                      exp, group, ed_always_focus + ed_focus, 0, 0
  34.  
  35.  imports:
  36.     library gui, "box_lib.obj"
  37.     import  gui, editbox.draw,  "edit_box",     \
  38.                  editbox.key,   "edit_box_key", \
  39.                  editbox.mouse, "edit_box_mouse"
  40.  
  41.  ;===============================
  42.  
  43.  main:
  44.     mov     [ans.buffer], dword "= 0"
  45.     mov     [ans.size], 3 * 6 + 9
  46.  
  47.     mcall   40, 100111b
  48.     ; mcall   48, 3, scn, 192
  49.  
  50.  
  51.     m2m     [edb1.color],              [scn.gui_face]
  52.     m2m     [edb1.shift_color],        [scn.gui_select]
  53.     m2m     [edb1.focus_border_color], [scn.gui_face]
  54.     m2m     [edb1.text_color],         [scn.gui_text]
  55.  
  56.     mcall   68, 11
  57.     stdcall dll.Load, imports
  58.  
  59.  ;----------------------
  60.  
  61.  update:
  62.     mcall   23, 5
  63.  
  64.     cmp     eax, EV_REDRAW
  65.     je      ev_redraw
  66.     cmp     eax, EV_KEY
  67.     je      ev_key
  68.     cmp     eax, EV_BUTTON
  69.     je      ev_button
  70.     cmp     eax, EV_MOUSE
  71.     je      ev_mouse
  72.  
  73.     jmp     update
  74.  
  75.  ;----------------------
  76.  
  77.  ev_redraw:
  78.     mcall   12, 1
  79.  
  80.  ; WINDOW
  81.     mov     edx, [scn.win_face]
  82.     or      edx, 0x34 shl 24
  83.     mcall   0, <100, 236 + 100 - 50 - 25>, <100, 66 + LIST_SIZE>, , , sz_head
  84.  
  85.  ; TOOLBAR
  86.     mov     ebx, 120 shl 16 + 64
  87.     mcall   8, , <-17, 12>, 2 + 1 shl 30
  88.     add     ebx, 4 shl 16 - (64 + 14)
  89.     mcall   4, , [scn.win_title], sz_cont, 10
  90.  
  91.  ; CONTENT
  92.     call    draw_textbox
  93.     call    draw_keyb
  94.     call    draw_list
  95.  
  96.     mcall   12, 2
  97.  
  98.     jmp     update
  99.  
  100.  ;----------------------
  101.  
  102.  ev_key:
  103.     mcall   2
  104.     cmp     ah, 27
  105.     je      exit
  106.     cmp     ah, 13
  107.     je      calc
  108.     invoke  editbox.key, edb1
  109.     jmp     update
  110.  
  111.  ;----------------------
  112.  
  113.  ev_button:
  114.     mcall   17
  115.  
  116.  ; EXIT
  117.     cmp     ah, 1
  118.     je      exit
  119.  
  120.  ; DELETE
  121.     cmp     ah, 4
  122.     jne     .not_del
  123.     cmp     [edb1.pos], 0
  124.     je      update
  125.     mov     eax, exp
  126.     add     eax, [edb1.pos]
  127.     dec     eax
  128.     mov     ebx, exp
  129.     add     ebx, [edb1.size]
  130.     inc     ebx
  131.   @@:
  132.     cmp     eax, ebx
  133.     je      @f
  134.     mov     cl, [eax + 1]
  135.     mov     [eax], cl
  136.     inc     eax
  137.     jmp     @b
  138.   @@:
  139.     dec     [edb1.pos]
  140.     dec     [edb1.size]
  141.     m2m     [edb1.shift], [edb1.pos]
  142.     jmp     .redraw
  143.  .not_del:
  144.  
  145.  ; SHOW/HIDE KEYBOARD
  146.     cmp     ah, 2
  147.     jne     .not_keyb
  148.  
  149.     cmp     [keyb], byte 0
  150.     je      .open
  151.  
  152.     mov     [keyb], 0
  153.     mov     [sz_cont + 9], byte 0x10
  154.     mcall   67, -1, -1, 286 - 25, -1
  155.     jmp     update
  156.  
  157.  .open:
  158.     mov     [keyb], 1
  159.     mov     [sz_cont + 9], byte 0x11
  160.     mcall   67, -1, -1, 286 - 25 + KEYB_SIZE, -1       
  161.     jmp     update
  162.  .not_keyb:
  163.  
  164.  ; CALCULATE
  165.     cmp     ah, 19
  166.     je      calc
  167.  
  168.  ; LIST
  169.     cmp     ah, 0x60
  170.     jl      .not_list
  171.  
  172.     sub     ah, 0x60
  173.     movzx   ebx, ah
  174.     imul    ebx, 512
  175.     add     ebx, history
  176.     add     ebx, 482
  177.     stdcall str_len, ebx
  178.  
  179.     mov     edx, exp
  180.     add     edx, [edb1.size]
  181.     add     edx, eax
  182.     mov     edi, exp
  183.     add     edi, [edb1.pos]
  184.   @@:
  185.     cmp     edx, edi
  186.     je      @f
  187.     mov     esi, edx
  188.     sub     esi, eax
  189.     push    eax
  190.     mov     al, [esi]
  191.     mov     [edx], al
  192.     pop     eax
  193.     dec     edx
  194.     jmp     @b
  195.   @@:
  196.     add     [edb1.size], eax
  197.  
  198.   @@:
  199.     cmp     eax, 0
  200.     je      @f
  201.     mov     cl, [ebx]
  202.     mov     [edi], cl
  203.     inc     edi
  204.     inc     ebx
  205.     dec     eax
  206.     inc     [edb1.pos]
  207.     jmp     @b
  208.   @@:
  209.  
  210.     jmp     .redraw
  211.  .not_list:
  212.  
  213.  ; KEYBOARD
  214.     cmp     ah, 10
  215.     jl      update
  216.     cmp     ah, 50
  217.     jg      update
  218.     mov     dh, ah
  219.  
  220.     mov     ebx, exp
  221.     add     ebx, [edb1.size]
  222.     mov     ecx, exp
  223.     add     ecx, [edb1.pos]
  224.     cmp     dh, 30
  225.     jl      @f
  226.     add     ebx, 2
  227.   @@:
  228.     cmp     ebx, ecx
  229.     je      @f
  230.     mov     dl, [ebx - 1]
  231.     mov     [ebx], dl
  232.     dec     ebx
  233.     jmp     @b
  234.   @@:
  235.  
  236.     movzx   eax, dh
  237.     add     eax, buttons
  238.     sub     eax, 10
  239.     mov     al, [eax]
  240.  
  241.     mov     [ebx], al
  242.     inc     [edb1.size]
  243.     inc     [edb1.pos]
  244.     cmp     dh, 30
  245.     jl      @f
  246.     add     [edb1.size], 2
  247.     add     [edb1.pos], 2
  248.   @@:
  249.  .redraw:
  250.     call    draw_textbox
  251.     jmp     update
  252.  
  253.  ;----------------------
  254.  
  255.  ev_mouse:
  256.     mcall   2
  257.  
  258.     invoke  editbox.mouse, edb1
  259.     jmp     update
  260.  
  261.  ;----------------------
  262.  
  263.  exit:
  264.     mcall   -1
  265.  
  266.  ;----------------------
  267.  
  268.  calc:
  269.     stdcall parse
  270.     cmp     [error_n], 0
  271.     jne     .error
  272.  
  273.     mov     [ans.buffer], word "= "
  274.  
  275.     stdcall convert_to_str, eax, ans.buffer + 2
  276.     add     eax, 2
  277.     mov     edi, eax
  278.     imul    eax, 6
  279.     add     eax, 9
  280.     mov     [ans.size], eax
  281.  
  282.  ; HISTORY
  283.     mov     ecx, LIST_ITEM_COUNT - 1
  284.     mov     eax, history
  285.     add     eax, (LIST_ITEM_COUNT - 1) * 512
  286.   @@:
  287.     mov     ebx, eax
  288.     sub     ebx, 512
  289.     stdcall str_cpy, ebx, eax
  290.     add     ebx, 480
  291.     add     eax, 480
  292.     stdcall str_cpy, ebx, eax
  293.     sub     ebx, 480
  294.     sub     eax, 480
  295.     mov     esi, [ebx + 508]
  296.     mov     [eax + 508], esi
  297.     sub     eax, 512
  298.     loop    @b
  299.  
  300.     stdcall str_cpy, exp, history
  301.     stdcall str_cpy, ans.buffer, history + 480
  302.     mov     esi, [ans.size]
  303.     mov     dword[history + 508], esi
  304.     not     [his_even]
  305.  
  306.  ; Check length
  307.     mov     esi, 37
  308.     sub     esi, edi
  309.     stdcall str_len, exp
  310.     sub     esi, eax
  311.     cmp     esi, 0
  312.     jg      .redraw
  313.  
  314.     mov     ebx, history
  315.     add     ebx, eax
  316.     add     ebx, esi
  317.     mov     [ebx], dword ".."
  318.  
  319.     jmp     .redraw
  320.  
  321.  ; ERRORS
  322.  
  323.  .error:
  324.     cmp     [error_n], 1
  325.     je      .err_1
  326.     cmp     [error_n], 4
  327.     je      .err_4
  328.  
  329.     mov     [ans.buffer +  0], dword "Expe"
  330.     mov     [ans.buffer +  4], dword "cted"
  331.     mov     [ans.buffer +  8], dword " ')'"
  332.     mov     [ans.buffer + 12], byte 0
  333.     mov     [ans.size], 81
  334.  
  335.     cmp     [error_n], 2
  336.     je      .redraw
  337.     cmp     [error_n], 3
  338.     je      .err_3
  339.     cmp     [error_n], 5
  340.     je      .err_5
  341.  .err_1:
  342.     mov     [ans.buffer +  0], dword "Div."
  343.     mov     [ans.buffer +  4], dword " by "
  344.     mov     [ans.buffer +  8], byte  "0"
  345.     mov     [ans.buffer +  9], byte 0
  346.     mov     [ans.size], 63
  347.     jmp     .redraw
  348.  .err_4:
  349.     mov     [ans.buffer +  0], dword "Inpu"
  350.     mov     [ans.buffer +  4], dword "t er"
  351.     mov     [ans.buffer +  8], dword "rror"
  352.     mov     [ans.buffer + 12], byte 0
  353.     mov     [ans.size], 81
  354.     jmp     .redraw
  355.  .err_3:
  356.     mov     [ans.buffer + 10], byte "("
  357.     jmp     .redraw
  358.  .err_5:
  359.     mov     [ans.buffer + 10], byte "|"
  360.     jmp     .redraw
  361.  
  362.  .redraw:
  363.     call    draw_textbox
  364.     call    draw_list
  365.     jmp     update
  366.  
  367.  ;----------------------
  368.  
  369.  proc draw_button, x, y
  370.     mcall   8, <[x], 30>, <[y], 21>, [but_id], [but_c]
  371.  
  372.     mov     ebx, [x]
  373.     mov     esi, [txt_size]
  374.     imul    esi, 3
  375.     mov     edi, 16
  376.     sub     edi, esi
  377.     add     ebx, edi
  378.     shl     ebx, 16
  379.     add     ebx, [y]
  380.     add     ebx, 7
  381.     mcall   4, , [but_tc], [txt_id], [txt_size]
  382.  
  383.     mov     eax, [txt_size]
  384.     add     [txt_id], eax
  385.     inc     dword [but_id]
  386.  
  387.     ret
  388.  endp
  389.  
  390.  ;----------------------
  391.  
  392.  proc draw_textbox
  393.     mcall   13, <4, 320 - 50 - 25>, <  8,  23>, [scn.gui_frame]
  394.     mov     edx, [scn.gui_face]
  395.     cmp     [error_n], 0
  396.     je      @f
  397.     mov     edx, 0xFFAAAA
  398.   @@:
  399.     mcall   13, <  5, 318 - 50 - 25>, <  9, 21>
  400.     mcall     , <  5, 318 - 50 - 25>, <  9,  1>, [scn.3d_face]
  401.     mcall     , <  5,   1>, < 10, 20>
  402.     mcall     , <  5, 318 - 50 - 25>, < 31,  1>, [scn.3d_light]
  403.  
  404.     mov      ebx, 328 - 16 - 50 - 25
  405.     sub      ebx, [ans.size]
  406.     shl      ebx, 16
  407.     add      ebx, 16
  408.     mov      ecx, [scn.gui_intext]
  409.     or       ecx, 1 shl 31
  410.     mcall    4, , , ans.buffer
  411.  
  412.     mov      ecx, [scn.gui_text]
  413.     mcall     , <310 - 50 - 25, 16>, , btn_clr, 1
  414.     add      ebx, 1 shl 16
  415.     mcall
  416.  
  417.     mcall    8, <305 - 50 - 25, 17>, <9, 20>, 0x40000004
  418.  
  419.     mcall    1,   4,  8, [scn.win_body]
  420.     mcall     , 323 - 50 - 25
  421.     mcall     ,    , 30, [scn.3d_light]
  422.     mcall     ,   4
  423.  
  424.     mov     ebx, 318 - 16 - 50 - 25
  425.     sub     ebx, [ans.size]
  426.     cmp     ebx, 24
  427.     jg      @f
  428.     mov     ebx, 24
  429.   @@:
  430.     mov     [edb1.width], ebx
  431.     m2m     [edb1.color],              [scn.gui_face]
  432.     m2m     [edb1.focus_border_color], [scn.gui_face]
  433.     cmp     [error_n],  0
  434.     je      @f
  435.     mov     [edb1.color],              0xFFAAAA
  436.     mov     [edb1.focus_border_color], 0xFFAAAA
  437.   @@:
  438.     invoke  editbox.draw, edb1
  439.  
  440.     ret
  441.  endp
  442.  
  443.  ;----------------------
  444.  
  445.  proc draw_keyb
  446.     cmp     [keyb], byte 0
  447.     je      @f
  448.  
  449.     mov     [txt_size], 1
  450.     mov     [but_id], 0x0000000A
  451.     mov     [txt_id], buttons
  452.  
  453.     mov     eax, [scn.win_face]
  454.     mov     [but_c], eax
  455.     mov     eax, [scn.win_text]
  456.     mov     [but_tc], eax
  457.     stdcall draw_button,   4 + 278 - 25,  42 - 25 - 8
  458.     stdcall draw_button,  37 + 278 - 25,  42 - 25 - 8
  459.     stdcall draw_button,  70 + 278 - 25,  42 - 25 - 8
  460.     stdcall draw_button, 103 + 278 - 25,  42 - 25 - 8
  461.     stdcall draw_button, 103 + 278 - 25,  66 - 25 - 8
  462.     stdcall draw_button, 103 + 278 - 25,  90 - 25 - 8
  463.     stdcall draw_button, 103 + 278 - 25, 114 - 25 - 8
  464.     stdcall draw_button,  70 + 278 - 25, 139 - 25 - 8
  465.     stdcall draw_button,  37 + 278 - 25, 139 - 25 - 8
  466.  
  467.     mov     eax, [scn.btn_inface]
  468.     mov     [but_c], eax
  469.     mov     eax, [scn.btn_intext]
  470.     mov     [but_tc], eax
  471.     stdcall draw_button, 103 + 278 - 25, 139 - 25 - 8
  472.  
  473.     mov     eax, [scn.btn_face]
  474.     mov     [but_c], eax
  475.     mov     eax, [scn.btn_text]
  476.     mov     [but_tc], eax
  477.     stdcall draw_button,   4 + 278 - 25,  66 - 25 - 8
  478.     stdcall draw_button,  37 + 278 - 25,  66 - 25 - 8
  479.     stdcall draw_button,  70 + 278 - 25,  66 - 25 - 8
  480.     stdcall draw_button,   4 + 278 - 25,  90 - 25 - 8
  481.     stdcall draw_button,  37 + 278 - 25,  90 - 25 - 8
  482.     stdcall draw_button,  70 + 278 - 25,  90 - 25 - 8
  483.     stdcall draw_button,   4 + 278 - 25, 114 - 25 - 8
  484.     stdcall draw_button,  37 + 278 - 25, 114 - 25 - 8
  485.     stdcall draw_button,  70 + 278 - 25, 114 - 25 - 8
  486.     stdcall draw_button,   4 + 278 - 25, 139 - 25 - 8
  487.  
  488.   @@:
  489.     ret
  490.  endp
  491.  
  492.  ;----------------------
  493.  
  494.  proc draw_list
  495.   ; BACKGROUND
  496.     mov     edi, LIST_ITEM_COUNT
  497.     mov     eax, 13
  498.     mov     ebx, 4 shl 16 + 320 - 50 - 25
  499.     mov     ecx, 37 shl 16 + LIST_ITEM_SIZE
  500.     mov     edx, LIST_ITEM_COLOR1
  501.     cmp     [his_even], byte 0
  502.     je      @f
  503.     mov     edx, LIST_ITEM_COLOR2
  504.   @@:
  505.     mcall
  506.     add     ecx, LIST_ITEM_SIZE shl 16
  507.     cmp     edx, LIST_ITEM_COLOR1
  508.     je      .set_color_to_2
  509.     mov     edx, LIST_ITEM_COLOR1
  510.     jmp     .next
  511.  .set_color_to_2:
  512.     mov     edx, LIST_ITEM_COLOR2
  513.  .next:
  514.     dec     edi
  515.     cmp     edi, 0
  516.     jne     @b
  517.  
  518.   ; BUTTONS
  519.     mov     edi, LIST_ITEM_COUNT
  520.     mov     eax, 8
  521.     mov     ebx, 4 shl 16 + 320 - 50 - 25
  522.     mov     ecx, 37 shl 16 + LIST_ITEM_SIZE
  523.     mov     edx, 0x40000060
  524.   @@:
  525.     mcall
  526.     add     ecx, LIST_ITEM_SIZE shl 16
  527.     inc     edx
  528.     dec     edi
  529.     cmp     edi, 0
  530.     jne     @b
  531.  
  532.   ; TEXT
  533.     mov     edi, LIST_ITEM_COUNT
  534.     mov     eax, 4
  535.     mov     ebx, 8 shl 16 + 37 + LIST_ITEM_Y
  536.     mov     ecx, LIST_ITEM_TEXT1
  537.     cmp     [his_even], byte 0
  538.     je      @f
  539.     mov     ecx, LIST_ITEM_TEXT2
  540.   @@:
  541.     or      ecx, 1 shl 31
  542.     mov     edx, history
  543.   @@:
  544.     mcall
  545.  
  546.     push    ebx
  547.     add     ebx, (320 - 50 - 25) shl 16
  548.     mov     esi, [edx + 508]
  549.     shl     esi, 16
  550.     sub     ebx, esi
  551.     add     edx, 480
  552.     mcall
  553.     pop     ebx
  554.  
  555.     add     edx, 32
  556.     add     ebx, LIST_ITEM_SIZE
  557.  
  558.     and     ecx, 0xFFFFFF
  559.     cmp     ecx, LIST_ITEM_TEXT2
  560.     je      .set_color_to_2_txt
  561.     mov     ecx, LIST_ITEM_TEXT2
  562.     jmp     .next_txt
  563.  .set_color_to_2_txt:
  564.     mov     ecx, LIST_ITEM_TEXT1
  565.  .next_txt:
  566.     or      ecx, 1 shl 31
  567.  
  568.     dec     edi
  569.     cmp     edi, 0
  570.     jne     @b
  571.  
  572.     ret
  573.  endp
  574.  
  575.  ;----------------------
  576.  
  577.  proc str_len uses ebx, str
  578.     xor     eax, eax
  579.     mov     ebx, [str]
  580.   @@:
  581.     cmp     [ebx], byte 0
  582.     je      @f
  583.     inc     eax
  584.     inc     ebx
  585.     jmp     @b
  586.   @@:
  587.  
  588.     ret
  589.  endp
  590.  
  591.  ;----------------------
  592.  
  593.  proc str_cpy uses eax ebx ecx, from, to
  594.     mov     eax, [from]
  595.     mov     ebx, [to]
  596.   @@:
  597.     cmp     [eax], byte 0
  598.     je      @f
  599.     mov     cl, [eax]
  600.     mov     [ebx], cl
  601.     inc     eax
  602.     inc     ebx
  603.     jmp     @b
  604.   @@:
  605.     mov     [ebx], byte 0
  606.     ret
  607.  endp
  608.  
  609.  ;----------------------
  610.  
  611.  dataend:
  612.  
  613.  ;===============================
  614.  
  615.             rb 2048
  616.  stacktop:
  617.  
  618.  exp        rb 480
  619.  exp_pos    rd 1
  620.  exp_lvl    rd 1
  621.  abs_lvl    rd 1
  622.  group      rd 1
  623.  
  624.  ans.buffer:rb 480
  625.  ans.size   rd 1
  626.  error_n    rd 1
  627.  
  628.  timer      rd 1
  629.  but_id     rd 1
  630.  but_c      rd 1
  631.  but_tc     rd 1
  632.  txt_id     rd 1
  633.  txt_size   rd 1
  634.  keyb       rb 1
  635.  
  636.  his_even   rb 1
  637.  history    rb 512 * LIST_ITEM_COUNT
  638.             rb 512
  639.                
  640. struc system_colors_internal {
  641.   .3d_face        dd 0xCED0D0
  642.   .3d_dark        dd 0xD7D7D7
  643.   .3d_light       dd 0xFEFEFE
  644.   .win_title      dd 0x2F2F2F
  645.   .win_body       dd 0xE4DFE1
  646.   .btn_face       dd 0xEFEBEF
  647.   .btn_text       dd 0x373C42
  648.   .win_text       dd 0x000000
  649.   .panel_frame    dd 0x94AECE
  650.   .win_face       dd 0xE1E1E1
  651.   .win_inface     dd 0xE1E1E1
  652.   .win_frame      dd 0x204962
  653.   .btn_inface     dd 0xEFEBEF
  654.   .btn_intext     dd 0xD0D9E8
  655.   .btn_fctext     dd 0x2D3135
  656.   .gui_shadow     dd 0xFFFFFF
  657.   .gui_face       dd 0xFAF8FA
  658.   .gui_inface     dd 0xF6F3F6
  659.   .gui_fcface     dd 0xFAF8FA
  660.   .gui_frame      dd 0x7698C0
  661.   .gui_text       dd 0x373C42
  662.   .gui_intext     dd 0x5F5F5F
  663.   .gui_select     dd 0xC7C9C9
  664. }
  665.  
  666.  scn system_colors_internal
  667.  
  668.  memory:
  669.