Subversion Repositories Kolibri OS

Rev

Rev 9197 | Rev 9210 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9187 akron1 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 .
18
*)
19
 
20
MODULE EditBox;
21
 
9197 akron1 22
IMPORT SYSTEM, KOSAPI, Encodings;
9187 akron1 23
 
9197 akron1 24
CONST
9187 akron1 25
 
9197 akron1 26
	MAX_LENGTH = 1024;
27
 
28
 
9187 akron1 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;
9208 akron1 43
		flags*: SET;
9187 akron1 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;
9197 akron1 57
	paint     *: PROCEDURE (eb: tEditBox);
58
	mouse     *: PROCEDURE (eb: tEditBox);
59
	_setValue  : PROCEDURE (eb: tEditBox; text: INTEGER);
9187 akron1 60
 
61
 
62
PROCEDURE _key (key: INTEGER; key_proc: EditBoxKey; text: tEditBox);
63
BEGIN
9197 akron1 64
    SYSTEM.CODE(
9187 akron1 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
9197 akron1 90
        SYSTEM.GET(ptr, str[i]);
9187 akron1 91
        INC(i);
92
        INC(ptr)
93
    UNTIL (str[i - 1] = 0X) OR (i = max);
94
    str[i] := 0X
95
END getValue;
96
 
97
 
9197 akron1 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
 
9187 akron1 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;
9208 akron1 132
    new_textbox.flags := {}
9187 akron1 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);
9197 akron1 144
	SYSTEM.PUT(v, a)
9187 akron1 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);
9197 akron1 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");
9187 akron1 158
END main;
159
 
160
 
161
BEGIN
9208 akron1 162
	main
9187 akron1 163
END EditBox.