Subversion Repositories Kolibri OS

Rev

Rev 9187 | 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 SYSTEM, KOSAPI, Encodings;
  23.  
  24. CONST
  25.  
  26.         MAX_LENGTH = 1024;
  27.  
  28.  
  29. TYPE
  30.  
  31.         tEditBox* = POINTER TO RECORD
  32.                 width*,
  33.                 left*,
  34.                 top*,
  35.                 color*,
  36.                 shift_color,
  37.                 focus_border_color,
  38.                 blur_border_color,
  39.                 text_color*,
  40.                 max: INTEGER;
  41.                 text*: INTEGER;
  42.                 mouse_variable: tEditBox;
  43.                 flags*,
  44.  
  45.                 size,
  46.                 pos: INTEGER;
  47.                 (* The following struct members are not used by the users of API *)
  48.                 offset, cl_curs_x, cl_curs_y, shift, shift_old, height, char_width: INTEGER
  49.         END;
  50.  
  51.         EditBoxKey = PROCEDURE (eb: tEditBox);
  52.  
  53.  
  54. VAR
  55.  
  56.         key_proc: EditBoxKey;
  57.         paint     *: PROCEDURE (eb: tEditBox);
  58.         mouse     *: PROCEDURE (eb: tEditBox);
  59.         _setValue  : PROCEDURE (eb: tEditBox; text: INTEGER);
  60.  
  61.  
  62. PROCEDURE _key (key: INTEGER; key_proc: EditBoxKey; text: tEditBox);
  63. BEGIN
  64.     SYSTEM.CODE(
  65.     08BH, 045H, 008H,   (*  mov     eax, dword [ebp +  8]  *)
  66.     08BH, 055H, 00CH,   (*  mov     edx, dword [ebp + 12]  *)
  67.     08BH, 04DH, 010H,   (*  mov     ecx, dword [ebp + 16]  *)
  68.     051H,               (*  push    ecx                    *)
  69.     0FFH, 0D2H          (*  call    edx                    *)
  70.     )
  71. END _key;
  72.  
  73.  
  74. PROCEDURE key* (text: tEditBox; key: INTEGER);
  75. BEGIN
  76.     _key(key, key_proc, text)
  77. END key;
  78.  
  79.  
  80. PROCEDURE getValue* (text: tEditBox; VAR str: ARRAY OF CHAR);
  81. VAR
  82.     ptr, max, i: INTEGER;
  83.  
  84. BEGIN
  85.     ptr := text.text;
  86.     max := text.max;
  87.     ASSERT(max < LEN(str));
  88.     i := 0;
  89.     REPEAT
  90.         SYSTEM.GET(ptr, str[i]);
  91.         INC(i);
  92.         INC(ptr)
  93.     UNTIL (str[i - 1] = 0X) OR (i = max);
  94.     str[i] := 0X
  95. END getValue;
  96.  
  97.  
  98. PROCEDURE setValue* (text: tEditBox; str: ARRAY OF WCHAR);
  99. VAR
  100.         i: INTEGER;
  101.         temp: ARRAY MAX_LENGTH OF CHAR;
  102. BEGIN
  103.         ASSERT(LENGTH(str) < LEN(temp));
  104.         i := 0;
  105.         REPEAT
  106.                 temp[i] := CHR(Encodings.UNI[ORD(str[i]), Encodings.CP866] MOD 256);
  107.                 INC(i)
  108.         UNTIL str[i - 1] = 0X;
  109.         _setValue(text, SYSTEM.ADR(temp[0]))
  110. END setValue;
  111.  
  112.  
  113. PROCEDURE create* (tlx, tly, width, max_chars: INTEGER; editbox_interlock: tEditBox): tEditBox;
  114. VAR
  115.     new_textbox: tEditBox;
  116.  
  117. BEGIN
  118.     NEW(new_textbox);
  119.  
  120.     new_textbox.width := width;
  121.     new_textbox.left := tlx;
  122.     new_textbox.top := tly;
  123.     new_textbox.color := 0FFFFFFH;
  124.     new_textbox.shift_color := 06A9480H;
  125.     new_textbox.focus_border_color := 0;
  126.     new_textbox.blur_border_color := 06A9480H;
  127.     new_textbox.text_color := 0;
  128.     new_textbox.max := max_chars;
  129.     new_textbox.text := KOSAPI.malloc(max_chars + 2);
  130.     ASSERT(new_textbox.text # 0);
  131.     new_textbox.mouse_variable := editbox_interlock;
  132.     new_textbox.flags := 0
  133.  
  134.     RETURN new_textbox
  135. END create;
  136.  
  137.  
  138. PROCEDURE GetProc (Lib, v: INTEGER; name: ARRAY OF CHAR);
  139. VAR
  140.         a: INTEGER;
  141. BEGIN
  142.         a := KOSAPI.GetProcAdr(name, Lib);
  143.         ASSERT(a # 0);
  144.         SYSTEM.PUT(v, a)
  145. END GetProc;
  146.  
  147.  
  148. PROCEDURE main;
  149. VAR
  150.         Lib: INTEGER;
  151. BEGIN
  152.         Lib := KOSAPI.LoadLib("/rd/1/lib/box_lib.obj");
  153.         ASSERT(Lib # 0);
  154.         GetProc(Lib, SYSTEM.ADR(paint),     "edit_box");
  155.         GetProc(Lib, SYSTEM.ADR(key_proc),  "edit_box_key");
  156.         GetProc(Lib, SYSTEM.ADR(mouse),     "edit_box_mouse");
  157.         GetProc(Lib, SYSTEM.ADR(_setValue), "edit_box_set_text");
  158. END main;
  159.  
  160.  
  161. BEGIN
  162.   main
  163. END EditBox.