Subversion Repositories Kolibri OS

Rev

Rev 9208 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016, 2017, 2020, 2021 Anton Krotov
  3.  
  4.     This file is part of CEdit.
  5.  
  6.     CEdit is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation, either version 3 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     CEdit is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with CEdit. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE EditBox;
  21.  
  22. IMPORT sys := SYSTEM, KOSAPI;
  23.  
  24.  
  25. TYPE
  26.  
  27.         tEditBox* = POINTER TO RECORD
  28.                 width*,
  29.                 left*,
  30.                 top*,
  31.                 color*,
  32.                 shift_color,
  33.                 focus_border_color,
  34.                 blur_border_color,
  35.                 text_color*,
  36.                 max: INTEGER;
  37.                 text*: INTEGER;
  38.                 mouse_variable: tEditBox;
  39.                 flags*,
  40.  
  41.                 size,
  42.                 pos: INTEGER;
  43.                 (* The following struct members are not used by the users of API *)
  44.                 offset, cl_curs_x, cl_curs_y, shift, shift_old, height, char_width: INTEGER
  45.         END;
  46.  
  47.         EditBoxKey = PROCEDURE (eb: tEditBox);
  48.  
  49.  
  50. VAR
  51.  
  52.         key_proc: EditBoxKey;
  53.         paint    *: PROCEDURE (eb: tEditBox);
  54.         mouse    *: PROCEDURE (eb: tEditBox);
  55.         setValue *: PROCEDURE (eb: tEditBox; text: INTEGER);
  56.  
  57.  
  58. PROCEDURE _key (key: INTEGER; key_proc: EditBoxKey; text: tEditBox);
  59. BEGIN
  60.     sys.CODE(
  61.     08BH, 045H, 008H,   (*  mov     eax, dword [ebp +  8]  *)
  62.     08BH, 055H, 00CH,   (*  mov     edx, dword [ebp + 12]  *)
  63.     08BH, 04DH, 010H,   (*  mov     ecx, dword [ebp + 16]  *)
  64.     051H,               (*  push    ecx                    *)
  65.     0FFH, 0D2H          (*  call    edx                    *)
  66.     )
  67. END _key;
  68.  
  69.  
  70. PROCEDURE key* (text: tEditBox; key: INTEGER);
  71. BEGIN
  72.     _key(key, key_proc, text)
  73. END key;
  74.  
  75.  
  76. PROCEDURE getValue* (text: tEditBox; VAR str: ARRAY OF CHAR);
  77. VAR
  78.     ptr, max, i: INTEGER;
  79.  
  80. BEGIN
  81.     ptr := text.text;
  82.     max := text.max;
  83.     ASSERT(max < LEN(str));
  84.     i := 0;
  85.     REPEAT
  86.         sys.GET(ptr, str[i]);
  87.         INC(i);
  88.         INC(ptr)
  89.     UNTIL (str[i - 1] = 0X) OR (i = max);
  90.     str[i] := 0X
  91. END getValue;
  92.  
  93.  
  94. PROCEDURE create* (tlx, tly, width, max_chars: INTEGER; editbox_interlock: tEditBox): tEditBox;
  95. VAR
  96.     new_textbox: tEditBox;
  97.  
  98. BEGIN
  99.     NEW(new_textbox);
  100.  
  101.     new_textbox.width := width;
  102.     new_textbox.left := tlx;
  103.     new_textbox.top := tly;
  104.     new_textbox.color := 0FFFFFFH;
  105.     new_textbox.shift_color := 06A9480H;
  106.     new_textbox.focus_border_color := 0;
  107.     new_textbox.blur_border_color := 06A9480H;
  108.     new_textbox.text_color := 0;
  109.     new_textbox.max := max_chars;
  110.     new_textbox.text := KOSAPI.malloc(max_chars + 2);
  111.     ASSERT(new_textbox.text # 0);
  112.     new_textbox.mouse_variable := editbox_interlock;
  113.     new_textbox.flags := 0
  114.  
  115.     RETURN new_textbox
  116. END create;
  117.  
  118.  
  119. PROCEDURE GetProc (Lib, v: INTEGER; name: ARRAY OF CHAR);
  120. VAR
  121.         a: INTEGER;
  122. BEGIN
  123.         a := KOSAPI.GetProcAdr(name, Lib);
  124.         ASSERT(a # 0);
  125.         sys.PUT(v, a)
  126. END GetProc;
  127.  
  128.  
  129. PROCEDURE main;
  130. VAR
  131.         Lib: INTEGER;
  132. BEGIN
  133.         Lib := KOSAPI.LoadLib("/rd/1/lib/box_lib.obj");
  134.         ASSERT(Lib # 0);
  135.         GetProc(Lib, sys.ADR(paint),    "edit_box");
  136.         GetProc(Lib, sys.ADR(key_proc), "edit_box_key");
  137.         GetProc(Lib, sys.ADR(mouse),    "edit_box_mouse");
  138.         GetProc(Lib, sys.ADR(setValue), "edit_box_set_text");
  139. END main;
  140.  
  141.  
  142. BEGIN
  143.   main
  144. END EditBox.