Subversion Repositories Kolibri OS

Rev

Rev 9187 | Rev 9208 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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