Subversion Repositories Kolibri OS

Rev

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

Rev 8772 Rev 8848
1
(*
1
(*
2
    Copyright 2021 Anton Krotov
2
    Copyright 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 CEdit;
20
MODULE CEdit;
21
 
21
 
22
IMPORT
22
IMPORT
23
    OpenDlg, K := KolibriOS,
23
    OpenDlg, K := KolibriOS,
24
    U := Utils, Lines, Menu, List,
24
    U := Utils, Lines, Menu, List,
25
    G := Graph, T := Text, E := Encodings,
25
    G := Graph, T := Text, E := Encodings,
26
    CB := Clipboard, Languages,
26
    CB := Clipboard, Languages,
27
    ChangeLog, Scroll,
27
    ChangeLog, Scroll,
28
    RW, Ini, box_lib, Icons;
28
    RW, Ini, box_lib, Icons;
29
 
29
 
30
CONST
30
CONST
31
    header = "CEdit (06-jun-2021)";
31
    header = "CEdit (14-jun-2021)";
32
 
32
 
33
    ShellFilter = "";
33
    ShellFilter = "";
34
    EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI";
34
    EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI";
35
 
35
 
36
    fontWidth = K.fontWidth;
36
    fontWidth = K.fontWidth;
37
    fontHeight = K.fontHeight;
37
    fontHeight = K.fontHeight;
38
    scrollWidth = 22;
38
    scrollWidth = 22;
39
 
39
 
40
    btnClose = 1;
40
    btnClose = 1;
41
    btnNew = 20;
41
    btnNew = 20;
42
    btnOpen = 21;
42
    btnOpen = 21;
43
    btnSave = 22;
43
    btnSave = 22;
44
    btnSearch = 23;
44
    btnSearch = 23;
45
    btnUndo = 24;
45
    btnUndo = 24;
46
    btnRedo = 25;
46
    btnRedo = 25;
47
    btnUpper = 26;
47
    btnUpper = 26;
48
    btnLower = 27;
48
    btnLower = 27;
49
    btnBuild = 28;
49
    btnBuild = 28;
50
    btnRun = 29;
50
    btnRun = 29;
51
    btnUp = 30;
51
    btnUp = 30;
52
    btnDown = 31;
52
    btnDown = 31;
53
    btnLeft = 32;
53
    btnLeft = 32;
54
    btnRight = 33;
54
    btnRight = 33;
55
    btnYes = 40;
55
    btnYes = 40;
56
    btnNo = 41;
56
    btnNo = 41;
57
    btnFindEdit = 50;
57
    btnFindEdit = 50;
58
    btnReplaceEdit = 51;
58
    btnReplaceEdit = 51;
59
    btnGotoEdit = 52;
59
    btnGotoEdit = 52;
60
    btnFindNext = 60;
60
    btnFindNext = 60;
61
    btnReplace = 61;
61
    btnReplace = 61;
62
    btnReplaceAll = 62;
62
    btnReplaceAll = 62;
63
    btnGoto = 63;
63
    btnGoto = 63;
64
    btnCloseFind = 64;
64
    btnCloseFind = 64;
65
 
65
 
66
    btnFile = 70;
66
    btnFile = 70;
67
    btnEdit = 71;
67
    btnEdit = 71;
68
    btnEncoding = 72;
68
    btnEncoding = 72;
69
    btnView = 73;
69
    btnView = 73;
70
    btnSyntax = 74;
70
    btnSyntax = 74;
71
    btnProgram = 75;
71
    btnProgram = 75;
72
    btnTools = 76;
72
    btnTools = 76;
73
 
73
 
74
    MainMenuHeight = fontHeight + 7;
74
    MainMenuHeight = fontHeight + 7;
75
 
75
 
76
    btnHeight = 25;
76
    btnHeight = 25;
77
    btnWidth = 75;
77
    btnWidth = 75;
78
    btnTop = MainMenuHeight + 3;
78
    btnTop = MainMenuHeight + 3;
79
    toolBtnSize = 24;
79
    toolBtnSize = 24;
80
    toolbarDelim = 7;
80
    toolbarDelim = 7;
81
 
81
 
82
    TOP = btnTop + toolBtnSize + 7;
82
    TOP = btnTop + toolBtnSize + 7;
83
    RIGHT = scrollWidth - 2;
83
    RIGHT = scrollWidth - 2;
84
    BOTTOM = scrollWidth + 25;
84
    BOTTOM = scrollWidth + 25;
85
 
85
 
86
    minWinWidth = 635; minWinHeight = 542;
86
    minWinWidth = 635; minWinHeight = 542;
87
 
87
 
88
    SEARCH_PADDING = 10;
88
    SEARCH_PADDING = 10;
89
    searchLeft = 10;
89
    searchLeft = 10;
90
    EditBox_Width = 180;
90
    EditBox_Width = 180;
91
    EDITBOX_MAXCHARS = 500;
91
    EDITBOX_MAXCHARS = 500;
92
 
92
 
93
    menuFileX = searchLeft;
93
    menuFileX = searchLeft;
94
    menuEditX = menuFileX + 4*fontWidth + 2 + 7;
94
    menuEditX = menuFileX + 4*fontWidth + 2 + 7;
95
    menuEncodingX = menuEditX + 4*fontWidth + 2 + 7;
95
    menuEncodingX = menuEditX + 4*fontWidth + 2 + 7;
96
    menuViewX = menuEncodingX + 8*fontWidth + 2 + 7;
96
    menuViewX = menuEncodingX + 8*fontWidth + 2 + 7;
97
    menuSyntaxX = menuViewX + 4*fontWidth + 2 + 7;
97
    menuSyntaxX = menuViewX + 4*fontWidth + 2 + 7;
98
    menuProgramX = menuSyntaxX + 6*fontWidth + 2 + 7;
98
    menuProgramX = menuSyntaxX + 6*fontWidth + 2 + 7;
99
    menuToolsX = menuProgramX + 7*fontWidth + 2 + 7;
99
    menuToolsX = menuProgramX + 7*fontWidth + 2 + 7;
100
 
100
 
101
    menuCut = 1;
101
    menuCut = 1;
102
    menuCopy = 2;
102
    menuCopy = 2;
103
    menuPaste = 3;
103
    menuPaste = 3;
104
    menuDelete = 4;
104
    menuDelete = 4;
105
    menuSelectAll = 5;
105
    menuSelectAll = 5;
106
 
106
 
107
    menuUndo = 6;
107
    menuUndo = 6;
108
    menuRedo = 7;
108
    menuRedo = 7;
109
 
109
 
110
    menuSearch = 8;
110
    menuSearch = 8;
111
    menuGoto = 9;
111
    menuGoto = 9;
112
 
112
 
113
    menuNew = 10;
113
    menuNew = 10;
114
    menuOpen = 11;
114
    menuOpen = 11;
115
    menuSave = 12;
115
    menuSave = 12;
116
    menuSaveAs = 13;
116
    menuSaveAs = 13;
117
    menuFolder = 14;
117
    menuFolder = 14;
118
    menuExit = 15;
118
    menuExit = 15;
119
 
119
 
120
    menuNumbers = 20;
120
    menuNumbers = 20;
121
    menuFontSize = 21;
121
    menuFontSize = 21;
122
    menuColors = 1000;
122
    menuColors = 1000;
123
    menuMaxColors = menuColors + Ini.MAX_SECTIONS - 1;
123
    menuMaxColors = menuColors + Ini.MAX_SECTIONS - 1;
124
 
124
 
125
    menuNone = 30;
125
    menuNone = 30;
126
    menuC = 31;
126
    menuC = 31;
127
    menuFasm = 32;
127
    menuFasm = 32;
128
    menuIni = 33;
128
    menuIni = 33;
129
    menuLua = 34;
129
    menuLua = 34;
130
    menuOberon = 35;
130
    menuOberon = 35;
131
    menuPascal = 36;
131
    menuPascal = 36;
132
 
132
 
133
    menuBuild = 50;
133
    menuBuild = 50;
134
    menuBuildScript = 51;
134
    menuBuildScript = 51;
135
    menuRun = 52;
135
    menuRun = 52;
136
    menuRunScript = 53;
136
    menuRunScript = 53;
137
    menuDebug = 54;
137
    menuDebug = 54;
138
    menuDebugScript = 55;
138
    menuDebugScript = 55;
139
 
139
 
140
    menuUTF8BOM = 60;
140
    menuUTF8BOM = 60;
141
    menuUTF8 = 61;
141
    menuUTF8 = 61;
142
    menuCP866 = 62;
142
    menuCP866 = 62;
143
    menuWin1251 = 63;
143
    menuWin1251 = 63;
144
 
144
 
145
    menuPipet = 70;
145
    menuPipet = 70;
146
    menuSysFunc = 71;
146
    menuSysFunc = 71;
147
 
147
 
148
 
148
 
149
VAR
149
VAR
150
    canvas: G.tCanvas;
150
    canvas: G.tCanvas;
151
    font, font1, font2: G.tFont;
151
    font, font1, font2: G.tFont;
152
    text: T.tText;
152
    text: T.tText;
153
    winWidth, winHeight: INTEGER;
153
    winWidth, winHeight: INTEGER;
154
    shift: SET;
154
    shift: SET;
155
    AppPath, runScript, buildScript, debugScript: RW.tFileName;
155
    AppPath, runScript, buildScript, debugScript: RW.tFileName;
156
    OD: OpenDlg.Dialog;
156
    OD: OpenDlg.Dialog;
157
    confirm, notFound, search, modified: BOOLEAN;
157
    confirm, notFound, search, modified: BOOLEAN;
158
 
158
 
159
    leftButton, VScroll, HScroll: BOOLEAN;
159
    leftButton, VScroll, HScroll: BOOLEAN;
160
    vScroll, hScroll: Scroll.tScroll;
160
    vScroll, hScroll: Scroll.tScroll;
161
    LEFT: INTEGER;
161
    LEFT: INTEGER;
162
 
162
 
163
    FindEdit, ReplaceEdit, GotoEdit: box_lib.edit_box;
163
    FindEdit, ReplaceEdit, GotoEdit: box_lib.edit_box;
164
    CS, WH, BKW: box_lib.checkbox;
164
    CS, WH, BKW: box_lib.checkbox;
165
 
165
 
166
    new_searchText, searchText, replaceText, gotoText: T.tString;
166
    new_searchText, searchText, replaceText, gotoText: T.tString;
167
    cs, whole: BOOLEAN;
167
    cs, whole: BOOLEAN;
168
 
168
 
169
    replaced: INTEGER;
169
    replaced: INTEGER;
170
 
170
 
171
    mainTID: INTEGER;
171
    mainTID: INTEGER;
172
 
172
 
173
    context, menuFile, menuEdit, menuEncoding, menuView, menuSyntax, menuProgram, menuTools: Menu.tMenu;
173
    context, menuFile, menuEdit, menuEncoding, menuView, menuSyntax, menuProgram, menuTools: Menu.tMenu;
174
 
174
 
175
    icons: INTEGER;
175
    icons: INTEGER;
176
    grayIcons: INTEGER;
176
    grayIcons: INTEGER;
177
 
177
 
178
    IPC: ARRAY 64 OF INTEGER;
178
    IPC: ARRAY 64 OF INTEGER;
179
 
179
 
180
 
180
 
181
PROCEDURE WritePos (y: INTEGER);
181
PROCEDURE WritePos (y: INTEGER);
182
VAR
182
VAR
183
    s1, s2: ARRAY 32 OF WCHAR;
183
    s1, s2: ARRAY 32 OF WCHAR;
184
    line, col: INTEGER;
184
    line, col: INTEGER;
185
BEGIN
185
BEGIN
186
    T.getPos(text, col, line);
186
    T.getPos(text, col, line);
187
    U.int2str(line, s1);
187
    U.int2str(line, s1);
188
    U.int2str(col, s2);
188
    U.int2str(col, s2);
189
    U.append(s1, ": ");
189
    U.append(s1, ": ");
190
    U.append(s1, s2);
190
    U.append(s1, s2);
191
    K.DrawText(LEFT, y, K.textColor, s1)
191
    K.DrawText(LEFT, y, K.textColor, s1)
192
END WritePos;
192
END WritePos;
193
 
193
 
194
 
194
 
195
PROCEDURE EditBox_Focus (edit: box_lib.edit_box): BOOLEAN;
195
PROCEDURE EditBox_Focus (edit: box_lib.edit_box): BOOLEAN;
196
    RETURN 1 IN BITS(edit.flags)
196
    RETURN 1 IN BITS(edit.flags)
197
END EditBox_Focus;
197
END EditBox_Focus;
198
 
198
 
199
 
199
 
200
PROCEDURE EditBox_SetFocus (edit: box_lib.edit_box; value: BOOLEAN);
200
PROCEDURE EditBox_SetFocus (edit: box_lib.edit_box; value: BOOLEAN);
201
BEGIN
201
BEGIN
202
    IF value THEN
202
    IF value THEN
203
        edit.flags := ORD(BITS(edit.flags) + {1})
203
        edit.flags := ORD(BITS(edit.flags) + {1})
204
    ELSE
204
    ELSE
205
        edit.flags := ORD(BITS(edit.flags) - {1})
205
        edit.flags := ORD(BITS(edit.flags) - {1})
206
    END;
206
    END;
207
    IF search THEN
207
    IF search THEN
208
        box_lib.edit_box_draw(edit)
208
        box_lib.edit_box_draw(edit)
209
    END
209
    END
210
END EditBox_SetFocus;
210
END EditBox_SetFocus;
211
 
211
 
212
 
212
 
213
PROCEDURE Rect (left, top, right, bottom, color: INTEGER);
213
PROCEDURE Rect (left, top, right, bottom, color: INTEGER);
214
BEGIN
214
BEGIN
215
    K.DrawLine(left, top, right, top, color);
215
    K.DrawLine(left, top, right, top, color);
216
    K.DrawLine(left, bottom, right, bottom, color);
216
    K.DrawLine(left, bottom, right, bottom, color);
217
    K.DrawLine(left, top, left, bottom, color);
217
    K.DrawLine(left, top, left, bottom, color);
218
    K.DrawLine(right, top, right, bottom, color);
218
    K.DrawLine(right, top, right, bottom, color);
219
END Rect;
219
END Rect;
220
 
220
 
221
 
221
 
222
PROCEDURE Message (s: ARRAY OF WCHAR);
222
PROCEDURE Message (s: ARRAY OF WCHAR);
223
CONST
223
CONST
224
    minWidth = 30;
224
    minWidth = 30;
225
    height = 40;
225
    height = 40;
226
    borderColor = 808080H;
226
    borderColor = 808080H;
227
VAR
227
VAR
228
    top, left, right, bottom, x, y, width: INTEGER;
228
    top, left, right, bottom, x, y, width: INTEGER;
229
BEGIN
229
BEGIN
230
    width := minWidth + LENGTH(s)*fontWidth;
230
    width := minWidth + LENGTH(s)*fontWidth;
231
    left := (canvas.width - width) DIV 2 + LEFT;
231
    left := (canvas.width - width) DIV 2 + LEFT;
232
    top := (canvas.height - height) DIV 2 + TOP;
232
    top := (canvas.height - height) DIV 2 + TOP;
233
    bottom := top + height - 1;
233
    bottom := top + height - 1;
234
    right := left + width - 1;
234
    right := left + width - 1;
235
    x := minWidth DIV 2 + left;
235
    x := minWidth DIV 2 + left;
236
    y := (height - fontHeight) DIV 2 + top;
236
    y := (height - fontHeight) DIV 2 + top;
237
    K.DrawRect(left, top, width, height, K.winColor);
237
    K.DrawRect(left, top, width, height, K.winColor);
238
    Rect(left, top, right, bottom, borderColor);
238
    Rect(left, top, right, bottom, borderColor);
239
    K.DrawText(x, y, K.textColor, s);
239
    K.DrawText(x, y, K.textColor, s);
240
END Message;
240
END Message;
241
 
241
 
242
 
242
 
243
PROCEDURE NotFound;
243
PROCEDURE NotFound;
244
BEGIN
244
BEGIN
245
    IF notFound THEN
245
    IF notFound THEN
246
        Message("not found");
246
        Message("not found");
247
        notFound := FALSE;
247
        notFound := FALSE;
248
        EditBox_SetFocus(FindEdit, TRUE);
248
        EditBox_SetFocus(FindEdit, TRUE);
249
        EditBox_SetFocus(ReplaceEdit, FALSE);
249
        EditBox_SetFocus(ReplaceEdit, FALSE);
250
        EditBox_SetFocus(GotoEdit, FALSE)
250
        EditBox_SetFocus(GotoEdit, FALSE)
251
    END
251
    END
252
END NotFound;
252
END NotFound;
253
 
253
 
254
 
254
 
255
PROCEDURE Replaced;
255
PROCEDURE Replaced;
256
VAR
256
VAR
257
    s, s1: ARRAY 32 OF WCHAR;
257
    s, s1: ARRAY 32 OF WCHAR;
258
BEGIN
258
BEGIN
259
    IF replaced # 0 THEN
259
    IF replaced # 0 THEN
260
        s := "replaced: ";
260
        s := "replaced: ";
261
        U.int2str(replaced, s1);
261
        U.int2str(replaced, s1);
262
        U.append(s, s1);
262
        U.append(s, s1);
263
        Message(s);
263
        Message(s);
264
        replaced := 0;
264
        replaced := 0;
265
        EditBox_SetFocus(FindEdit, TRUE);
265
        EditBox_SetFocus(FindEdit, TRUE);
266
        EditBox_SetFocus(ReplaceEdit, FALSE);
266
        EditBox_SetFocus(ReplaceEdit, FALSE);
267
        EditBox_SetFocus(GotoEdit, FALSE)
267
        EditBox_SetFocus(GotoEdit, FALSE)
268
    END
268
    END
269
END Replaced;
269
END Replaced;
270
 
270
 
271
 
271
 
272
PROCEDURE toolbarIcons;
272
PROCEDURE toolbarIcons;
273
CONST
273
CONST
274
    iconPad = (toolBtnSize - 16) DIV 2;
274
    iconPad = (toolBtnSize - Icons.SIZE) DIV 2;
275
VAR
275
VAR
276
    x, color: INTEGER;
276
    x, color: INTEGER;
277
BEGIN
277
BEGIN
278
    x := searchLeft + (toolBtnSize + 5)*2;
278
    x := searchLeft + (toolBtnSize + 5)*2;
279
    IF text.modified THEN
279
    IF text.modified THEN
280
        Icons.draw(icons, 5, x + iconPad, btnTop + iconPad)
280
        Icons.draw(icons, 5, x + iconPad, btnTop + iconPad)
281
    ELSE
281
    ELSE
282
        Icons.draw(grayIcons, 5, x + iconPad, btnTop + iconPad)
282
        Icons.draw(grayIcons, 5, x + iconPad, btnTop + iconPad)
283
    END;
283
    END;
284
 
284
 
285
    IF text.edition # NIL THEN
285
    IF text.edition # NIL THEN
286
        x := searchLeft + (toolBtnSize + 5)*4 + toolbarDelim*2;
286
        x := searchLeft + (toolBtnSize + 5)*4 + toolbarDelim*2;
287
        IF ChangeLog.isFirstGuard(text.edition) THEN
287
        IF ChangeLog.isFirstGuard(text.edition) THEN
288
            Icons.draw(grayIcons, 37, x + iconPad, btnTop + iconPad)
288
            Icons.draw(grayIcons, 37, x + iconPad, btnTop + iconPad)
289
        ELSE
289
        ELSE
290
            Icons.draw(icons, 37, x + iconPad, btnTop + iconPad)
290
            Icons.draw(icons, 37, x + iconPad, btnTop + iconPad)
291
        END;
291
        END;
292
 
292
 
293
        x := searchLeft + (toolBtnSize + 5)*5 + toolbarDelim*2;
293
        x := searchLeft + (toolBtnSize + 5)*5 + toolbarDelim*2;
294
        IF ChangeLog.isLastGuard(text.edition) THEN
294
        IF ChangeLog.isLastGuard(text.edition) THEN
295
            Icons.draw(grayIcons, 36, x + iconPad, btnTop + iconPad)
295
            Icons.draw(grayIcons, 36, x + iconPad, btnTop + iconPad)
296
        ELSE
296
        ELSE
297
            Icons.draw(icons, 36, x + iconPad, btnTop + iconPad)
297
            Icons.draw(icons, 36, x + iconPad, btnTop + iconPad)
298
        END
298
        END
299
    END;
299
    END;
300
 
300
 
301
    IF T.selected(text) THEN
301
    IF T.selected(text) THEN
302
        color := K.caseColor
302
        color := K.caseColor
303
    ELSE
303
    ELSE
304
        color := K.disCaseColor
304
        color := K.disCaseColor
305
    END;
305
    END;
306
 
306
 
307
    x := searchLeft + (toolBtnSize + 5)*6 + toolbarDelim*3;
307
    x := searchLeft + (toolBtnSize + 5)*6 + toolbarDelim*3;
308
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
308
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
309
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "AB");
309
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "AB");
310
    INC(x, toolBtnSize + 5);
310
    INC(x, toolBtnSize + 5);
311
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
311
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
312
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "ab");
312
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "ab");
313
 
313
 
314
    x := searchLeft + (toolBtnSize + 5)*8 + toolbarDelim*4;
314
    x := searchLeft + (toolBtnSize + 5)*8 + toolbarDelim*4;
315
    IF buildScript # "" THEN
315
    IF buildScript # "" THEN
316
        Icons.draw(icons, 54, x + iconPad, btnTop + iconPad)
316
        Icons.draw(icons, 54, x + iconPad, btnTop + iconPad)
317
    ELSE
317
    ELSE
318
        Icons.draw(grayIcons, 54, x + iconPad, btnTop + iconPad)
318
        Icons.draw(grayIcons, 54, x + iconPad, btnTop + iconPad)
319
    END;
319
    END;
320
    INC(x, toolBtnSize + 5);
320
    INC(x, toolBtnSize + 5);
321
    IF runScript # "" THEN
321
    IF runScript # "" THEN
322
        Icons.draw(icons, 53, x + iconPad, btnTop + iconPad)
322
        Icons.draw(icons, 53, x + iconPad, btnTop + iconPad)
323
    ELSE
323
    ELSE
324
        Icons.draw(grayIcons, 53, x + iconPad, btnTop + iconPad)
324
        Icons.draw(grayIcons, 53, x + iconPad, btnTop + iconPad)
325
    END
325
    END
326
END toolbarIcons;
326
END toolbarIcons;
327
 
327
 
328
 
328
 
329
PROCEDURE WriteModified (x, y: INTEGER);
329
PROCEDURE WriteModified (x, y: INTEGER);
330
BEGIN
330
BEGIN
331
    modified := text.modified;
331
    modified := text.modified;
332
    K.DrawRect(x, TOP + canvas.height + scrollWidth - 1, 9*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
332
    K.DrawRect(x, TOP + canvas.height + scrollWidth - 1, 9*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
333
    IF modified THEN
333
    IF modified THEN
334
        K.DrawText866(x, y, K.textColor, "modified")
334
        K.DrawText866(x, y, K.textColor, "modified")
335
    END
335
    END
336
END WriteModified;
336
END WriteModified;
337
 
337
 
338
 
338
 
339
PROCEDURE repaint;
339
PROCEDURE repaint;
340
VAR
340
VAR
341
    width, height, scrollX, scrollY, y: INTEGER;
341
    width, height, scrollX, scrollY, y: INTEGER;
342
BEGIN
342
BEGIN
343
    IF text # NIL THEN
343
    IF text # NIL THEN
344
        IF confirm THEN
344
        IF confirm THEN
345
            K.DeleteButton(btnYes);
345
            K.DeleteButton(btnYes);
346
            K.DeleteButton(btnNo);
346
            K.DeleteButton(btnNo);
347
            confirm := FALSE
347
            confirm := FALSE
348
        END;
348
        END;
349
        T.draw(text);
349
        T.draw(text);
350
        K.ClientSize(width, height);
350
        K.ClientSize(width, height);
351
        y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
351
        y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
352
        K.DrawRect(LEFT, TOP + canvas.height + scrollWidth - 1, 16*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
352
        K.DrawRect(LEFT, TOP + canvas.height + scrollWidth - 1, 16*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
353
        WritePos(y);
353
        WritePos(y);
354
 
354
 
355
        IF modified # text.modified THEN
355
        IF modified # text.modified THEN
356
            WriteModified(width - 9*fontWidth, y)
356
            WriteModified(width - 9*fontWidth, y)
357
        END;
357
        END;
358
 
358
 
359
        T.getScroll(text, scrollX, scrollY);
359
        T.getScroll(text, scrollX, scrollY);
360
        vScroll.value := scrollY; vScroll.maxVal := text.count - 1;
360
        vScroll.value := scrollY; vScroll.maxVal := text.count - 1;
361
        hScroll.value := scrollX; hScroll.maxVal := Lines.maxLength;
361
        hScroll.value := scrollX; hScroll.maxVal := Lines.maxLength;
362
        Scroll.draw(vScroll, LEFT + canvas.width - 1, TOP + scrollWidth - 1);
362
        Scroll.draw(vScroll, LEFT + canvas.width - 1, TOP + scrollWidth - 1);
363
        Scroll.draw(hScroll, LEFT + scrollWidth, TOP + canvas.height - 1);
363
        Scroll.draw(hScroll, LEFT + scrollWidth, TOP + canvas.height - 1);
364
 
364
 
365
        G.DrawCanvas(canvas, LEFT, TOP);
365
        G.DrawCanvas(canvas, LEFT, TOP);
366
        NotFound;
366
        NotFound;
367
        Replaced;
367
        Replaced;
368
        toolbarIcons
368
        toolbarIcons
369
    END
369
    END
370
END repaint;
370
END repaint;
371
 
371
 
372
 
372
 
373
PROCEDURE resize;
373
PROCEDURE resize;
374
VAR
374
VAR
375
    cliWidth, cliHeight: INTEGER;
375
    cliWidth, cliHeight: INTEGER;
376
BEGIN
376
BEGIN
377
    K.WinSize(winWidth, winHeight);
377
    K.WinSize(winWidth, winHeight);
378
    IF winWidth < minWinWidth THEN
378
    IF winWidth < minWinWidth THEN
379
        winWidth := minWinWidth
379
        winWidth := minWinWidth
380
    END;
380
    END;
381
    IF winHeight < minWinHeight THEN
381
    IF winHeight < minWinHeight THEN
382
        winHeight := minWinHeight
382
        winHeight := minWinHeight
383
    END;
383
    END;
384
    K.SetWinSize(winWidth, winHeight);
384
    K.SetWinSize(winWidth, winHeight);
385
    K.WinSize(winWidth, winHeight);
385
    K.WinSize(winWidth, winHeight);
386
    K.ClientSize(cliWidth, cliHeight);
386
    K.ClientSize(cliWidth, cliHeight);
387
    G.destroy(canvas);
387
    G.destroy(canvas);
388
    canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 1), cliHeight - (TOP + BOTTOM));
388
    canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 1), cliHeight - (TOP + BOTTOM));
389
    G.SetFont(canvas, font);
389
    G.SetFont(canvas, font);
390
    T.setCanvas(canvas);
390
    T.setCanvas(canvas);
391
    T.resize(canvas.width, canvas.height);
391
    T.resize(canvas.width, canvas.height);
392
    Scroll.resize(vScroll, vScroll.xSize, canvas.height - scrollWidth*2 + 1);
392
    Scroll.resize(vScroll, vScroll.xSize, canvas.height - scrollWidth*2 + 1);
393
    Scroll.resize(hScroll, canvas.width - scrollWidth*2, hScroll.ySize);
393
    Scroll.resize(hScroll, canvas.width - scrollWidth*2, hScroll.ySize);
394
END resize;
394
END resize;
395
 
395
 
396
 
396
 
397
PROCEDURE SearchPanel (left, top: INTEGER);
397
PROCEDURE SearchPanel (left, top: INTEGER);
398
VAR
398
VAR
399
    y, right, bottom, color: INTEGER;
399
    y, right, bottom, color: INTEGER;
400
BEGIN
400
BEGIN
401
    right := left + EditBox_Width + SEARCH_PADDING*2;
401
    right := left + EditBox_Width + SEARCH_PADDING*2;
402
    bottom := top + 395 + btnHeight + SEARCH_PADDING;
402
    bottom := top + 395 + btnHeight + SEARCH_PADDING;
403
    color := K.borderColor;
403
    color := K.borderColor;
404
    Rect(left, top, right, bottom, color);
404
    Rect(left, top, right, bottom, color);
405
    K.CreateButton(btnCloseFind, right - 20, top, 20, 20, 0EF999FH, "");
405
    K.CreateButton(btnCloseFind, right - 20, top, 20, 20, 0EF999FH, "");
406
    K.DrawLine(right - 14, top + 5, right - 5, top + 14, 0FFFFFFH);
406
    K.DrawLine(right - 14, top + 5, right - 5, top + 14, 0FFFFFFH);
407
    K.DrawLine(right - 15, top + 5, right - 5, top + 15, 0FFFFFFH);
407
    K.DrawLine(right - 15, top + 5, right - 5, top + 15, 0FFFFFFH);
408
    K.DrawLine(right - 15, top + 6, right - 6, top + 15, 0FFFFFFH);
408
    K.DrawLine(right - 15, top + 6, right - 6, top + 15, 0FFFFFFH);
409
    K.DrawLine(right - 15, top + 14, right - 6, top + 5, 0FFFFFFH);
409
    K.DrawLine(right - 15, top + 14, right - 6, top + 5, 0FFFFFFH);
410
    K.DrawLine(right - 15, top + 15, right - 5, top + 5, 0FFFFFFH);
410
    K.DrawLine(right - 15, top + 15, right - 5, top + 5, 0FFFFFFH);
411
    K.DrawLine(right - 14, top + 15, right - 5, top + 6, 0FFFFFFH);
411
    K.DrawLine(right - 14, top + 15, right - 5, top + 6, 0FFFFFFH);
412
 
412
 
413
    INC(top, 15);
413
    INC(top, 15);
414
    INC(left, SEARCH_PADDING);
414
    INC(left, SEARCH_PADDING);
415
    K.DrawText866(left, top, K.textColor, "find");
415
    K.DrawText866(left, top, K.textColor, "find");
416
    K.DrawText866(left, top + 55, K.textColor, "replace with");
416
    K.DrawText866(left, top + 55, K.textColor, "replace with");
417
    K.CreateButton(btnFindEdit + ORD({30}), left, top + 20, EditBox_Width, fontHeight + 5, 0, "");
417
    K.CreateButton(btnFindEdit + ORD({30}), left, top + 20, EditBox_Width, fontHeight + 5, 0, "");
418
    K.CreateButton(btnReplaceEdit + ORD({30}), left, top + 75, EditBox_Width, fontHeight + 5, 0, "");
418
    K.CreateButton(btnReplaceEdit + ORD({30}), left, top + 75, EditBox_Width, fontHeight + 5, 0, "");
419
    K.DrawText866(left, top + 330, K.textColor, "go to line");
419
    K.DrawText866(left, top + 330, K.textColor, "go to line");
420
    K.CreateButton(btnGotoEdit + ORD({30}), left, top + 350, EditBox_Width, fontHeight + 5, 0, "");
420
    K.CreateButton(btnGotoEdit + ORD({30}), left, top + 350, EditBox_Width, fontHeight + 5, 0, "");
421
    BKW.top_s := BKW.top_s MOD 65536 + (top + 110) * 65536;
421
    BKW.top_s := BKW.top_s MOD 65536 + (top + 110) * 65536;
422
    CS.top_s := CS.top_s MOD 65536 + (top + 140) * 65536;
422
    CS.top_s := CS.top_s MOD 65536 + (top + 140) * 65536;
423
    WH.top_s := WH.top_s MOD 65536 + (top + 170) * 65536;
423
    WH.top_s := WH.top_s MOD 65536 + (top + 170) * 65536;
424
    BKW.left_s := BKW.left_s MOD 65536 + left * 65536;
424
    BKW.left_s := BKW.left_s MOD 65536 + left * 65536;
425
    CS.left_s := CS.left_s MOD 65536 + left * 65536;
425
    CS.left_s := CS.left_s MOD 65536 + left * 65536;
426
    WH.left_s := WH.left_s MOD 65536 + left * 65536;
426
    WH.left_s := WH.left_s MOD 65536 + left * 65536;
427
    FindEdit.top := top + 20;
427
    FindEdit.top := top + 20;
428
    ReplaceEdit.top := top + 75;
428
    ReplaceEdit.top := top + 75;
429
    GotoEdit.top := top + 350;
429
    GotoEdit.top := top + 350;
430
    FindEdit.left := left;
430
    FindEdit.left := left;
431
    ReplaceEdit.left := left;
431
    ReplaceEdit.left := left;
432
    GotoEdit.left := left;
432
    GotoEdit.left := left;
433
    box_lib.edit_box_draw(FindEdit);
433
    box_lib.edit_box_draw(FindEdit);
434
    box_lib.edit_box_draw(ReplaceEdit);
434
    box_lib.edit_box_draw(ReplaceEdit);
435
    box_lib.edit_box_draw(GotoEdit);
435
    box_lib.edit_box_draw(GotoEdit);
436
    box_lib.check_box_draw2(BKW); K.DrawText866(left + 20, top + 110, K.textColor, "backward");
436
    box_lib.check_box_draw2(BKW); K.DrawText866(left + 20, top + 110, K.textColor, "backward");
437
    box_lib.check_box_draw2(CS); K.DrawText866(left + 20, top + 140, K.textColor, "match case");
437
    box_lib.check_box_draw2(CS); K.DrawText866(left + 20, top + 140, K.textColor, "match case");
438
    box_lib.check_box_draw2(WH); K.DrawText866(left + 20, top + 170, K.textColor, "whole word");
438
    box_lib.check_box_draw2(WH); K.DrawText866(left + 20, top + 170, K.textColor, "whole word");
439
    y := top + 200;
439
    y := top + 200;
440
    K.CreateButton(btnFindNext, left, y, btnWidth, btnHeight, K.btnColor, "next"); INC(y, btnHeight + 10);
440
    K.CreateButton(btnFindNext, left, y, btnWidth, btnHeight, K.btnColor, "next"); INC(y, btnHeight + 10);
441
    K.CreateButton(btnReplace, left, y, btnWidth, btnHeight, K.btnColor, "replace"); INC(y, btnHeight + 10);
441
    K.CreateButton(btnReplace, left, y, btnWidth, btnHeight, K.btnColor, "replace"); INC(y, btnHeight + 10);
442
    K.CreateButton(btnReplaceAll, left, y, btnWidth + 5*fontWidth - 2, btnHeight, K.btnColor, "replace all");
442
    K.CreateButton(btnReplaceAll, left, y, btnWidth + 5*fontWidth - 2, btnHeight, K.btnColor, "replace all");
443
    K.CreateButton(btnGoto, left, top + 380, btnWidth, btnHeight, K.btnColor, "go");
443
    K.CreateButton(btnGoto, left, top + 380, btnWidth, btnHeight, K.btnColor, "go");
444
END SearchPanel;
444
END SearchPanel;
445
 
445
 
446
 
446
 
447
PROCEDURE draw_window;
447
PROCEDURE draw_window;
448
CONST
448
CONST
449
    iconPad = (toolBtnSize - 16) DIV 2;
449
    iconPad = (toolBtnSize - Icons.SIZE) DIV 2;
450
VAR
450
VAR
451
    width, height, x, y: INTEGER;
451
    width, height, x, y: INTEGER;
452
 
452
 
453
 
453
 
454
    PROCEDURE drawToolbarBtn (id, x: INTEGER);
454
    PROCEDURE drawToolbarBtn (id, x: INTEGER);
455
    BEGIN
455
    BEGIN
456
        K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
456
        K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
457
        K.DrawLine(x, btnTop + toolBtnSize, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
457
        K.DrawLine(x, btnTop + toolBtnSize, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
458
        K.DrawLine(x + toolBtnSize, btnTop, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
458
        K.DrawLine(x + toolBtnSize, btnTop, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
459
        K.CreateButton(id + ORD({30}), x, btnTop, toolBtnSize, toolBtnSize, K.btnColor, "");
459
        K.CreateButton(id + ORD({30}), x, btnTop, toolBtnSize, toolBtnSize, K.btnColor, "");
460
    END drawToolbarBtn;
460
    END drawToolbarBtn;
461
 
461
 
462
 
462
 
463
    PROCEDURE drawMainMenu (menu: Menu.tMenu; x: INTEGER; btn: INTEGER; caption: ARRAY OF WCHAR);
463
    PROCEDURE drawMainMenu (menu: Menu.tMenu; x: INTEGER; btn: INTEGER; caption: ARRAY OF WCHAR);
464
    VAR
464
    VAR
465
        menuColor, textColor, n: INTEGER;
465
        menuColor, textColor, n: INTEGER;
466
    BEGIN
466
    BEGIN
467
        IF menu.tid # 0 THEN
467
        IF menu.tid # 0 THEN
468
            menuColor := K.textColor;
468
            menuColor := K.textColor;
469
            textColor := K.winColor
469
            textColor := K.winColor
470
        ELSE
470
        ELSE
471
            menuColor := K.winColor;
471
            menuColor := K.winColor;
472
            textColor := K.textColor
472
            textColor := K.textColor
473
        END;
473
        END;
474
        n := LENGTH(caption);
474
        n := LENGTH(caption);
475
        K.DrawRect(x, 0, n*fontWidth + 2, MainMenuHeight, menuColor);
475
        K.DrawRect(x, 0, n*fontWidth + 2, MainMenuHeight, menuColor);
476
        K.CreateButton(btn + ORD({30}), x, 0, n*fontWidth + 2, MainMenuHeight, K.btnColor, "");
476
        K.CreateButton(btn + ORD({30}), x, 0, n*fontWidth + 2, MainMenuHeight, K.btnColor, "");
477
        K.DrawText(x + 1, (MainMenuHeight - fontHeight) DIV 2 + 1, textColor, caption)
477
        K.DrawText(x + 1, (MainMenuHeight - fontHeight) DIV 2 + 1, textColor, caption)
478
    END drawMainMenu;
478
    END drawMainMenu;
479
 
479
 
480
 
480
 
481
BEGIN
481
BEGIN
482
    K.BeginDraw;
482
    K.BeginDraw;
483
    K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
483
    K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
484
    IF (text # NIL) & ~K.RolledUp() THEN
484
    IF (text # NIL) & ~K.RolledUp() THEN
485
        confirm := FALSE;
485
        confirm := FALSE;
486
        K.ClientSize(width, height);
486
        K.ClientSize(width, height);
487
 
487
 
488
        K.DrawRect(0, 0, width, TOP, K.winColor);
488
        K.DrawRect(0, 0, width, TOP, K.winColor);
489
        K.DrawRect(0, 0, LEFT, height, K.winColor);
489
        K.DrawRect(0, 0, LEFT, height, K.winColor);
490
        K.DrawRect(LEFT + canvas.width - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth, K.winColor);
490
        K.DrawRect(LEFT + canvas.width - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth, K.winColor);
491
 
491
 
492
        drawMainMenu(menuFile, menuFileX, btnFile, "file");
492
        drawMainMenu(menuFile, menuFileX, btnFile, "file");
493
        drawMainMenu(menuEdit, menuEditX, btnEdit, "edit");
493
        drawMainMenu(menuEdit, menuEditX, btnEdit, "edit");
494
        drawMainMenu(menuEncoding, menuEncodingX, btnEncoding, "encoding");
494
        drawMainMenu(menuEncoding, menuEncodingX, btnEncoding, "encoding");
495
        drawMainMenu(menuView, menuViewX, btnView, "view");
495
        drawMainMenu(menuView, menuViewX, btnView, "view");
496
        drawMainMenu(menuSyntax, menuSyntaxX, btnSyntax, "syntax");
496
        drawMainMenu(menuSyntax, menuSyntaxX, btnSyntax, "syntax");
497
        drawMainMenu(menuProgram, menuProgramX, btnProgram, "program");
497
        drawMainMenu(menuProgram, menuProgramX, btnProgram, "program");
498
        drawMainMenu(menuTools, menuToolsX, btnTools, "tools");
498
        drawMainMenu(menuTools, menuToolsX, btnTools, "tools");
499
 
499
 
500
        x := searchLeft;
500
        x := searchLeft;
501
 
501
 
502
        drawToolbarBtn(btnNew, x);
502
        drawToolbarBtn(btnNew, x);
503
        Icons.draw(icons, 2, x + iconPad, btnTop + iconPad);
503
        Icons.draw(icons, 2, x + iconPad, btnTop + iconPad);
504
        INC(x, toolBtnSize + 5);
504
        INC(x, toolBtnSize + 5);
505
 
505
 
506
        drawToolbarBtn(btnOpen, x);
506
        drawToolbarBtn(btnOpen, x);
507
        Icons.draw(icons, 0, x + iconPad, btnTop + iconPad);
507
        Icons.draw(icons, 0, x + iconPad, btnTop + iconPad);
508
        INC(x, toolBtnSize + 5);
508
        INC(x, toolBtnSize + 5);
509
 
509
 
510
        drawToolbarBtn(btnSave, x);
510
        drawToolbarBtn(btnSave, x);
511
        INC(x, toolBtnSize + 5 + toolbarDelim);
511
        INC(x, toolBtnSize + 5 + toolbarDelim);
512
 
512
 
513
        drawToolbarBtn(btnSearch, x);
513
        drawToolbarBtn(btnSearch, x);
514
        Icons.draw(icons, 49, x + iconPad, btnTop + iconPad);
514
        Icons.draw(icons, 49, x + iconPad, btnTop + iconPad);
515
        INC(x, toolBtnSize + 5 + toolbarDelim);
515
        INC(x, toolBtnSize + 5 + toolbarDelim);
516
 
516
 
517
        drawToolbarBtn(btnUndo, x);
517
        drawToolbarBtn(btnUndo, x);
518
        INC(x, toolBtnSize + 5);
518
        INC(x, toolBtnSize + 5);
519
 
519
 
520
        drawToolbarBtn(btnRedo, x);
520
        drawToolbarBtn(btnRedo, x);
521
        INC(x, toolBtnSize + 5 + toolbarDelim);
521
        INC(x, toolBtnSize + 5 + toolbarDelim);
522
 
522
 
523
        drawToolbarBtn(btnUpper, x);
523
        drawToolbarBtn(btnUpper, x);
524
        INC(x, toolBtnSize + 5);
524
        INC(x, toolBtnSize + 5);
525
 
525
 
526
        drawToolbarBtn(btnLower, x);
526
        drawToolbarBtn(btnLower, x);
527
        INC(x, toolBtnSize + 5 + toolbarDelim);
527
        INC(x, toolBtnSize + 5 + toolbarDelim);
528
 
528
 
529
        drawToolbarBtn(btnBuild, x);
529
        drawToolbarBtn(btnBuild, x);
530
        Icons.draw(icons, 54, x + iconPad, btnTop + iconPad);
530
        Icons.draw(icons, 54, x + iconPad, btnTop + iconPad);
531
        INC(x, toolBtnSize + 5);
531
        INC(x, toolBtnSize + 5);
532
 
532
 
533
        drawToolbarBtn(btnRun, x);
533
        drawToolbarBtn(btnRun, x);
534
        Icons.draw(icons, 53, x + iconPad, btnTop + iconPad);
534
        Icons.draw(icons, 53, x + iconPad, btnTop + iconPad);
535
        INC(x, toolBtnSize + 5);
535
        INC(x, toolBtnSize + 5);
536
 
536
 
537
        K.CreateButton(btnUp, LEFT + canvas.width - 1, TOP, scrollWidth - 1, scrollWidth, K.btnColor, 0X);
537
        K.CreateButton(btnUp, LEFT + canvas.width - 1, TOP, scrollWidth - 1, scrollWidth, K.btnColor, 0X);
538
        K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + (scrollWidth - 9) DIV 2, K.btnTextColor, 18X);
538
        K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + (scrollWidth - 9) DIV 2, K.btnTextColor, 18X);
539
        K.CreateButton(btnDown, LEFT + canvas.width - 1, TOP + canvas.height - scrollWidth - 1, scrollWidth - 1, scrollWidth, K.btnColor, 0X);
539
        K.CreateButton(btnDown, LEFT + canvas.width - 1, TOP + canvas.height - scrollWidth - 1, scrollWidth - 1, scrollWidth, K.btnColor, 0X);
540
        K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - scrollWidth + (scrollWidth - 9) DIV 2, K.btnTextColor, 19X);
540
        K.DrawText69(LEFT + canvas.width - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - scrollWidth + (scrollWidth - 9) DIV 2, K.btnTextColor, 19X);
541
 
541
 
542
        K.CreateButton(btnLeft, LEFT, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X);
542
        K.CreateButton(btnLeft, LEFT, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X);
543
        K.DrawText69(LEFT + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1BX);
543
        K.DrawText69(LEFT + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1BX);
544
        K.CreateButton(btnRight, LEFT + canvas.width - scrollWidth - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X);
544
        K.CreateButton(btnRight, LEFT + canvas.width - scrollWidth - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth - 1, K.btnColor, 0X);
545
        K.DrawText69(LEFT + canvas.width - scrollWidth - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1AX);
545
        K.DrawText69(LEFT + canvas.width - scrollWidth - 1 + (scrollWidth - 6) DIV 2, TOP + canvas.height - 1 + (scrollWidth - 9) DIV 2 + 1, K.btnTextColor, 1AX);
546
 
546
 
547
        K.PutPixel(LEFT + canvas.width + scrollWidth - 2, TOP, K.winColor);
547
        K.PutPixel(LEFT + canvas.width + scrollWidth - 2, TOP, K.winColor);
548
        K.PutPixel(LEFT, TOP + canvas.height + scrollWidth - 2, K.winColor);
548
        K.PutPixel(LEFT, TOP + canvas.height + scrollWidth - 2, K.winColor);
549
 
549
 
550
        y := (btnHeight - fontHeight) DIV 2 + btnTop;
550
        y := (btnHeight - fontHeight) DIV 2 + btnTop;
551
        CASE text.enc OF
551
        CASE text.enc OF
552
        |E.UTF8:    K.DrawText866(width -  6*fontWidth, y, K.textColor, "UTF-8")
552
        |E.UTF8:    K.DrawText866(width -  6*fontWidth, y, K.textColor, "UTF-8")
553
        |E.UTF8BOM: K.DrawText866(width - 10*fontWidth, y, K.textColor, "UTF-8-BOM")
553
        |E.UTF8BOM: K.DrawText866(width - 10*fontWidth, y, K.textColor, "UTF-8-BOM")
554
        |E.CP866:   K.DrawText866(width -  6*fontWidth, y, K.textColor, "CP866")
554
        |E.CP866:   K.DrawText866(width -  6*fontWidth, y, K.textColor, "CP866")
555
        |E.W1251:   K.DrawText866(width - 13*fontWidth, y, K.textColor, "Windows-1251")
555
        |E.W1251:   K.DrawText866(width - 13*fontWidth, y, K.textColor, "Windows-1251")
556
        END;
556
        END;
557
        IF search THEN
557
        IF search THEN
558
            SearchPanel(searchLeft, TOP)
558
            SearchPanel(searchLeft, TOP)
559
        END;
559
        END;
560
 
560
 
561
        y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
561
        y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
562
        K.DrawRect(LEFT + 16*fontWidth, TOP + canvas.height + scrollWidth - 1, width - LEFT - 25*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
562
        K.DrawRect(LEFT + 16*fontWidth, TOP + canvas.height + scrollWidth - 1, width - LEFT - 25*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
563
        K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName);
563
        K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName);
564
        WriteModified(width - 9*fontWidth, y);
564
        WriteModified(width - 9*fontWidth, y);
565
        repaint
565
        repaint
566
    END;
566
    END;
567
    K.EndDraw
567
    K.EndDraw
568
END draw_window;
568
END draw_window;
569
 
569
 
570
 
570
 
571
PROCEDURE mouse (VAR x, y: INTEGER);
571
PROCEDURE mouse (VAR x, y: INTEGER);
572
VAR
572
VAR
573
    mouseX, mouseY,
573
    mouseX, mouseY,
574
    cliX, cliY,
574
    cliX, cliY,
575
    winX, winY: INTEGER;
575
    winX, winY: INTEGER;
576
BEGIN
576
BEGIN
577
    K.MousePos(mouseX, mouseY);
577
    K.MousePos(mouseX, mouseY);
578
    K.WinPos(winX, winY);
578
    K.WinPos(winX, winY);
579
    K.ClientPos(cliX, cliY);
579
    K.ClientPos(cliX, cliY);
580
    x := mouseX - winX - cliX - LEFT;
580
    x := mouseX - winX - cliX - LEFT;
581
    y := mouseY - winY - cliY - TOP;
581
    y := mouseY - winY - cliY - TOP;
582
END mouse;
582
END mouse;
583
 
583
 
584
 
584
 
585
PROCEDURE getKBState;
585
PROCEDURE getKBState;
586
VAR
586
VAR
587
    kbState: SET;
587
    kbState: SET;
588
BEGIN
588
BEGIN
589
    kbState := K.GetControlKeys();
589
    kbState := K.GetControlKeys();
590
    IF {0, 1} * kbState # {} THEN
590
    IF {0, 1} * kbState # {} THEN
591
        INCL(shift, T.SHIFT)
591
        INCL(shift, T.SHIFT)
592
    ELSE
592
    ELSE
593
        EXCL(shift, T.SHIFT)
593
        EXCL(shift, T.SHIFT)
594
    END;
594
    END;
595
 
595
 
596
    IF {2, 3} * kbState # {} THEN
596
    IF {2, 3} * kbState # {} THEN
597
        INCL(shift, T.CTRL)
597
        INCL(shift, T.CTRL)
598
    ELSE
598
    ELSE
599
        EXCL(shift, T.CTRL)
599
        EXCL(shift, T.CTRL)
600
    END
600
    END
601
END getKBState;
601
END getKBState;
602
 
602
 
603
 
603
 
604
PROCEDURE OpenFile (VAR FileName: RW.tFileName; filter: ARRAY OF CHAR);
604
PROCEDURE OpenFile (VAR FileName: RW.tFileName; filter: ARRAY OF CHAR);
605
BEGIN
605
BEGIN
606
    OpenDlg.SetFilter(OD, filter);
606
    OpenDlg.SetFilter(OD, filter);
607
    OpenDlg.Show(OD, 500, 400);
607
    OpenDlg.Show(OD, 500, 400);
608
    WHILE OD.status = 2 DO
608
    WHILE OD.status = 2 DO
609
        K.Pause(30)
609
        K.Pause(30)
610
    END;
610
    END;
611
    IF OD.status = 1 THEN
611
    IF OD.status = 1 THEN
612
        COPY(OD.FilePath, FileName)
612
        COPY(OD.FilePath, FileName)
613
    ELSE
613
    ELSE
614
        FileName := ""
614
        FileName := ""
615
    END
615
    END
616
END OpenFile;
616
END OpenFile;
617
 
617
 
618
 
618
 
619
PROCEDURE error (s: RW.tFileName);
619
PROCEDURE error (s: RW.tFileName);
620
BEGIN
620
BEGIN
621
    K.Run("/rd/1/@notify", s)
621
    K.Run("/rd/1/@notify", s)
622
END error;
622
END error;
623
 
623
 
624
 
624
 
625
PROCEDURE saveAs;
625
PROCEDURE saveAs;
626
VAR
626
VAR
627
    fileName: RW.tFileName;
627
    fileName: RW.tFileName;
628
    ext: ARRAY 8 OF CHAR;
628
    ext: ARRAY 8 OF CHAR;
629
BEGIN
629
BEGIN
630
    OD._type := OpenDlg.tsave;
630
    OD._type := OpenDlg.tsave;
631
    U.getFileName(text.fileName, OD.FileName, U.SLASH);
631
    U.getFileName(text.fileName, OD.FileName, U.SLASH);
632
    IF OD.FileName = "" THEN
632
    IF OD.FileName = "" THEN
633
        OD.FileName := "NewFile.";
633
        OD.FileName := "NewFile.";
634
        CASE text.lang OF
634
        CASE text.lang OF
635
        |Languages.langNone:   ext := "txt"
635
        |Languages.langNone:   ext := "txt"
636
        |Languages.langC:      ext := "c"
636
        |Languages.langC:      ext := "c"
637
        |Languages.langFasm:   ext := "asm"
637
        |Languages.langFasm:   ext := "asm"
638
        |Languages.langIni:    ext := "ini"
638
        |Languages.langIni:    ext := "ini"
639
        |Languages.langLua:    ext := "lua"
639
        |Languages.langLua:    ext := "lua"
640
        |Languages.langOberon: ext := "ob07"
640
        |Languages.langOberon: ext := "ob07"
641
        |Languages.langPascal: ext := "pas"
641
        |Languages.langPascal: ext := "pas"
642
        END;
642
        END;
643
        U.append8(OD.FileName, ext)
643
        U.append8(OD.FileName, ext)
644
    END;
644
    END;
645
    OpenFile(fileName, EditFilter);
645
    OpenFile(fileName, EditFilter);
646
    IF fileName # "" THEN
646
    IF fileName # "" THEN
647
        IF T.save(text, fileName, text.enc, RW.EOL_CRLF) THEN
647
        IF T.save(text, fileName, text.enc, RW.EOL_CRLF) THEN
648
            T.setName(text, fileName)
648
            T.setName(text, fileName)
649
        ELSE
649
        ELSE
650
            error("'cedit: error saving file' -E")
650
            error("'cedit: error saving file' -E")
651
        END
651
        END
652
    END
652
    END
653
END saveAs;
653
END saveAs;
654
 
654
 
655
 
655
 
656
PROCEDURE save;
656
PROCEDURE save;
657
BEGIN
657
BEGIN
658
    IF text.modified THEN
658
    IF text.modified THEN
659
        IF text.fileName # "" THEN
659
        IF text.fileName # "" THEN
660
            IF ~T.save(text, text.fileName, text.enc, RW.EOL_CRLF) THEN
660
            IF ~T.save(text, text.fileName, text.enc, RW.EOL_CRLF) THEN
661
                error("'cedit: error saving file' -E")
661
                error("'cedit: error saving file' -E")
662
            END
662
            END
663
        ELSE
663
        ELSE
664
            saveAs
664
            saveAs
665
        END
665
        END
666
    END
666
    END
667
END save;
667
END save;
668
 
668
 
669
 
669
 
670
PROCEDURE SelfRun (file: ARRAY OF CHAR);
670
PROCEDURE SelfRun (file: ARRAY OF CHAR);
671
BEGIN
671
BEGIN
672
    K.Run(AppPath, file)
672
    K.Run(AppPath, file)
673
END SelfRun;
673
END SelfRun;
674
 
674
 
675
 
675
 
676
PROCEDURE open;
676
PROCEDURE open;
677
VAR
677
VAR
678
    fileName: RW.tFileName;
678
    fileName: RW.tFileName;
679
BEGIN
679
BEGIN
680
    OD._type := OpenDlg.topen;
680
    OD._type := OpenDlg.topen;
681
    OpenFile(fileName, EditFilter);
681
    OpenFile(fileName, EditFilter);
682
    IF fileName # "" THEN
682
    IF fileName # "" THEN
683
        SelfRun(fileName)
683
        SelfRun(fileName)
684
    END
684
    END
685
END open;
685
END open;
686
 
686
 
687
 
687
 
688
PROCEDURE Confirm;
688
PROCEDURE Confirm;
689
CONST
689
CONST
690
    width  = btnWidth*2 + 30;
690
    width  = btnWidth*2 + 30;
691
    height = btnHeight*2 + 20;
691
    height = btnHeight*2 + 20;
692
    lineColor = 808080H;
692
    lineColor = 808080H;
693
VAR
693
VAR
694
    left, top, right, bottom: INTEGER;
694
    left, top, right, bottom: INTEGER;
695
BEGIN
695
BEGIN
696
    draw_window;
696
    draw_window;
697
    confirm := TRUE;
697
    confirm := TRUE;
698
    left := (canvas.width - width) DIV 2 + LEFT;
698
    left := (canvas.width - width) DIV 2 + LEFT;
699
    top := (canvas.height - height) DIV 2 + TOP;
699
    top := (canvas.height - height) DIV 2 + TOP;
700
    right := left + width - 1;
700
    right := left + width - 1;
701
    bottom := top + height - 1;
701
    bottom := top + height - 1;
702
    K.DrawRect(left, top, width, height, K.winColor);
702
    K.DrawRect(left, top, width, height, K.winColor);
703
    Rect(left, top, right, bottom, lineColor);
703
    Rect(left, top, right, bottom, lineColor);
704
    K.DrawText866(left + (width - 10*fontWidth) DIV 2, top + 10, K.textColor, "save file?");
704
    K.DrawText866(left + (width - 10*fontWidth) DIV 2, top + 10, K.textColor, "save file?");
705
    K.CreateButton(btnYes, left + 10, top + 35, btnWidth, btnHeight, K.btnColor, "yes");
705
    K.CreateButton(btnYes, left + 10, top + 35, btnWidth, btnHeight, K.btnColor, "yes");
706
    K.CreateButton(btnNo, left + 20 + btnWidth, top + 35, btnWidth, btnHeight, K.btnColor, "no");
706
    K.CreateButton(btnNo, left + 20 + btnWidth, top + 35, btnWidth, btnHeight, K.btnColor, "no");
707
END Confirm;
707
END Confirm;
708
 
708
 
709
 
709
 
710
PROCEDURE createEdit (left, top: INTEGER): box_lib.edit_box;
710
PROCEDURE createEdit (left, top: INTEGER): box_lib.edit_box;
711
VAR
711
VAR
712
    edit, EditBox0: box_lib.edit_box;
712
    edit, EditBox0: box_lib.edit_box;
713
BEGIN
713
BEGIN
714
    NEW(EditBox0);
714
    NEW(EditBox0);
715
    EditBox0.text := K.malloc(EDITBOX_MAXCHARS + 2);
715
    EditBox0.text := K.malloc(EDITBOX_MAXCHARS + 2);
716
    ASSERT(EditBox0.text # 0);
716
    ASSERT(EditBox0.text # 0);
717
    edit := box_lib.kolibri_new_edit_box(left, top, EditBox_Width, EDITBOX_MAXCHARS, EditBox0);
717
    edit := box_lib.kolibri_new_edit_box(left, top, EditBox_Width, EDITBOX_MAXCHARS, EditBox0);
718
    edit.flags := 4002H;
718
    edit.flags := 4002H;
719
    edit.text_color := 30000000H;
719
    edit.text_color := 30000000H;
720
    EditBox_SetFocus(edit, FALSE)
720
    EditBox_SetFocus(edit, FALSE)
721
    RETURN edit
721
    RETURN edit
722
END createEdit;
722
END createEdit;
723
 
723
 
724
 
724
 
725
PROCEDURE createSearchForm;
725
PROCEDURE createSearchForm;
726
BEGIN
726
BEGIN
727
    FindEdit := createEdit(searchLeft, TOP + 20);
727
    FindEdit := createEdit(searchLeft, TOP + 20);
728
    ReplaceEdit := createEdit(searchLeft, TOP + 20 + 55);
728
    ReplaceEdit := createEdit(searchLeft, TOP + 20 + 55);
729
    GotoEdit := createEdit(searchLeft, TOP + 20 + 330);
729
    GotoEdit := createEdit(searchLeft, TOP + 20 + 330);
730
    GotoEdit.flags := ORD(BITS(GotoEdit.flags) + BITS(8000H));
730
    GotoEdit.flags := ORD(BITS(GotoEdit.flags) + BITS(8000H));
731
    BKW := box_lib.kolibri_new_check_box(searchLeft, TOP + 90 + 20, 16, 16, "", 8*fontWidth + 4);
731
    BKW := box_lib.kolibri_new_check_box(searchLeft, TOP + 90 + 20, 16, 16, "", 8*fontWidth + 4);
732
    CS := box_lib.kolibri_new_check_box(searchLeft, TOP + 120 + 20, 16, 16, "", 10*fontWidth + 4);
732
    CS := box_lib.kolibri_new_check_box(searchLeft, TOP + 120 + 20, 16, 16, "", 10*fontWidth + 4);
733
    WH := box_lib.kolibri_new_check_box(searchLeft, TOP + 150 + 20, 16, 16, "", 10*fontWidth + 4);
733
    WH := box_lib.kolibri_new_check_box(searchLeft, TOP + 150 + 20, 16, 16, "", 10*fontWidth + 4);
734
END createSearchForm;
734
END createSearchForm;
735
 
735
 
736
 
736
 
737
PROCEDURE EditBox_GetValue (edit: box_lib.edit_box; VAR s: ARRAY OF WCHAR);
737
PROCEDURE EditBox_GetValue (edit: box_lib.edit_box; VAR s: ARRAY OF WCHAR);
738
VAR
738
VAR
739
    str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR;
739
    str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR;
740
    i: INTEGER;
740
    i: INTEGER;
741
BEGIN
741
BEGIN
742
    box_lib.edit_box_get_value(edit, str);
742
    box_lib.edit_box_get_value(edit, str);
743
    i := 0;
743
    i := 0;
744
    WHILE str[i] # 0X DO
744
    WHILE str[i] # 0X DO
745
        s[i] := WCHR(E.cp866[ORD(str[i])]);
745
        s[i] := WCHR(E.cp866[ORD(str[i])]);
746
        INC(i)
746
        INC(i)
747
    END;
747
    END;
748
    s[i] := 0X
748
    s[i] := 0X
749
END EditBox_GetValue;
749
END EditBox_GetValue;
750
 
750
 
751
 
751
 
752
PROCEDURE Search;
752
PROCEDURE Search;
753
BEGIN
753
BEGIN
754
    search := ~search;
754
    search := ~search;
755
    IF search THEN
755
    IF search THEN
756
        LEFT := searchLeft + EditBox_Width + SEARCH_PADDING*3;
756
        LEFT := searchLeft + EditBox_Width + SEARCH_PADDING*3;
757
        IF T.search(text, searchText, cs, whole) THEN END
757
        IF T.search(text, searchText, cs, whole) THEN END
758
    ELSE
758
    ELSE
759
        LEFT := searchLeft;
759
        LEFT := searchLeft;
760
        IF T.search(text, "", FALSE, FALSE) THEN END
760
        IF T.search(text, "", FALSE, FALSE) THEN END
761
    END;
761
    END;
762
    EditBox_SetFocus(FindEdit, search);
762
    EditBox_SetFocus(FindEdit, search);
763
    EditBox_SetFocus(ReplaceEdit, FALSE);
763
    EditBox_SetFocus(ReplaceEdit, FALSE);
764
    EditBox_SetFocus(GotoEdit, FALSE);
764
    EditBox_SetFocus(GotoEdit, FALSE);
765
    resize;
765
    resize;
766
    draw_window
766
    draw_window
767
END Search;
767
END Search;
768
 
768
 
769
 
769
 
770
PROCEDURE click (x, y: INTEGER): INTEGER;
770
PROCEDURE click (x, y: INTEGER): INTEGER;
771
VAR
771
VAR
772
    scrollX, scrollY: INTEGER;
772
    scrollX, scrollY: INTEGER;
773
BEGIN
773
BEGIN
774
    IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
774
    IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
775
        leftButton := TRUE;
775
        leftButton := TRUE;
776
        EditBox_SetFocus(FindEdit, FALSE);
776
        EditBox_SetFocus(FindEdit, FALSE);
777
        EditBox_SetFocus(ReplaceEdit, FALSE);
777
        EditBox_SetFocus(ReplaceEdit, FALSE);
778
        EditBox_SetFocus(GotoEdit, FALSE);
778
        EditBox_SetFocus(GotoEdit, FALSE);
779
        IF ~(T.SHIFT IN shift) THEN
779
        IF ~(T.SHIFT IN shift) THEN
780
            T.resetSelect(text)
780
            T.resetSelect(text)
781
        END;
781
        END;
782
        T.mouse(text, x, y);
782
        T.mouse(text, x, y);
783
        repaint
783
        repaint
784
    ELSIF (canvas.width < x) & (x < canvas.width + scrollWidth) & (scrollWidth < y) & (y < canvas.height - scrollWidth) THEN
784
    ELSIF (canvas.width < x) & (x < canvas.width + scrollWidth) & (scrollWidth < y) & (y < canvas.height - scrollWidth) THEN
785
        VScroll := TRUE;
785
        VScroll := TRUE;
786
        DEC(x, canvas.width);
786
        DEC(x, canvas.width);
787
        DEC(y, scrollWidth);
787
        DEC(y, scrollWidth);
788
        Scroll.mouse(vScroll, x, y);
788
        Scroll.mouse(vScroll, x, y);
789
        T.getScroll(text, scrollX, scrollY);
789
        T.getScroll(text, scrollX, scrollY);
790
        T.scroll(text, 0, vScroll.value - scrollY);
790
        T.scroll(text, 0, vScroll.value - scrollY);
791
        repaint
791
        repaint
792
    ELSIF (scrollWidth < x) & (x < canvas.width - scrollWidth) & (canvas.height < y) & (y < canvas.height + scrollWidth) THEN
792
    ELSIF (scrollWidth < x) & (x < canvas.width - scrollWidth) & (canvas.height < y) & (y < canvas.height + scrollWidth) THEN
793
        HScroll := TRUE;
793
        HScroll := TRUE;
794
        DEC(x, scrollWidth);
794
        DEC(x, scrollWidth);
795
        DEC(y, canvas.height);
795
        DEC(y, canvas.height);
796
        Scroll.mouse(hScroll, x, y);
796
        Scroll.mouse(hScroll, x, y);
797
        T.getScroll(text, scrollX, scrollY);
797
        T.getScroll(text, scrollX, scrollY);
798
        T.scroll(text, hScroll.value - scrollX, 0);
798
        T.scroll(text, hScroll.value - scrollX, 0);
799
        repaint
799
        repaint
800
    END
800
    END
801
    RETURN K.GetTickCount()
801
    RETURN K.GetTickCount()
802
END click;
802
END click;
803
 
803
 
804
 
804
 
805
PROCEDURE LeftButtonUp;
805
PROCEDURE LeftButtonUp;
806
BEGIN
806
BEGIN
807
    leftButton := FALSE;
807
    leftButton := FALSE;
808
    VScroll := FALSE;
808
    VScroll := FALSE;
809
    HScroll := FALSE;
809
    HScroll := FALSE;
810
    Scroll.MouseUp(vScroll);
810
    Scroll.MouseUp(vScroll);
811
    Scroll.MouseUp(hScroll);
811
    Scroll.MouseUp(hScroll);
812
END LeftButtonUp;
812
END LeftButtonUp;
813
 
813
 
814
 
814
 
815
PROCEDURE close;
815
PROCEDURE close;
816
BEGIN
816
BEGIN
817
    IF text.modified THEN
817
    IF text.modified THEN
818
        Confirm
818
        Confirm
819
    ELSE
819
    ELSE
820
        K.Exit
820
        K.Exit
821
    END
821
    END
822
END close;
822
END close;
823
 
823
 
824
 
824
 
825
PROCEDURE MenuItemClick (menu: Menu.tMenu; id: INTEGER);
825
PROCEDURE MenuItemClick (menu: Menu.tMenu; id: INTEGER);
826
BEGIN
826
BEGIN
827
    K.SendIPC(mainTID, id)
827
    K.SendIPC(mainTID, id)
828
END MenuItemClick;
828
END MenuItemClick;
829
 
829
 
830
 
830
 
831
PROCEDURE goto;
831
PROCEDURE goto;
832
VAR
832
VAR
833
    gotoVal: INTEGER;
833
    gotoVal: INTEGER;
834
BEGIN
834
BEGIN
835
    EditBox_GetValue(GotoEdit, gotoText);
835
    EditBox_GetValue(GotoEdit, gotoText);
836
    IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN END
836
    IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN END
837
END goto;
837
END goto;
838
 
838
 
839
 
839
 
840
PROCEDURE Script (script: ARRAY OF CHAR);
840
PROCEDURE Script (script: ARRAY OF CHAR);
841
BEGIN
841
BEGIN
842
    IF script # "" THEN
842
    IF script # "" THEN
843
        K.Run("/rd/1/@open", script)
843
        K.Run("/rd/1/@open", script)
844
    END
844
    END
845
END Script;
845
END Script;
846
 
846
 
847
 
847
 
848
PROCEDURE receiveIPC;
848
PROCEDURE receiveIPC;
849
BEGIN
849
BEGIN
850
    IF IPC[0] # Menu.lastTID THEN
850
    IF IPC[0] # Menu.lastTID THEN
851
        IPC[2] := 0
851
        IPC[2] := 0
852
    END;
852
    END;
853
    CASE IPC[2] OF
853
    CASE IPC[2] OF
854
    |0:
854
    |0:
855
    |menuCut:       T.key(text, ORD("X"), {T.CTRL})
855
    |menuCut:       T.key(text, ORD("X"), {T.CTRL})
856
    |menuCopy:      T.key(text, ORD("C"), {T.CTRL})
856
    |menuCopy:      T.key(text, ORD("C"), {T.CTRL})
857
    |menuPaste:     T.key(text, ORD("V"), {T.CTRL})
857
    |menuPaste:     T.key(text, ORD("V"), {T.CTRL})
858
    |menuDelete:    T.key(text, 46, {})
858
    |menuDelete:    T.key(text, 46, {})
859
    |menuSelectAll: T.key(text, ORD("A"), {T.CTRL})
859
    |menuSelectAll: T.key(text, ORD("A"), {T.CTRL})
860
 
860
 
861
    |menuNew:
861
    |menuNew:
862
        SelfRun("")
862
        SelfRun("")
863
    |menuOpen:
863
    |menuOpen:
864
        open
864
        open
865
    |menuSave:
865
    |menuSave:
866
        save;
866
        save;
867
        repaint
867
        repaint
868
    |menuSaveAs:
868
    |menuSaveAs:
869
        saveAs;
869
        saveAs;
870
        repaint
870
        repaint
871
    |menuFolder:
871
    |menuFolder:
872
        K.Run("/rd/1/File Managers/Eolite", text.fileName)
872
        K.Run("/rd/1/File Managers/Eolite", text.fileName)
873
    |menuExit:
873
    |menuExit:
874
        close
874
        close
875
    |menuUndo:
875
    |menuUndo:
876
        T.undo(text);
876
        T.undo(text);
877
        repaint
877
        repaint
878
    |menuRedo:
878
    |menuRedo:
879
        T.redo(text);
879
        T.redo(text);
880
        repaint
880
        repaint
881
    |menuSearch:
881
    |menuSearch:
882
        IF ~search THEN
882
        IF ~search THEN
883
            Search
883
            Search
884
        END;
884
        END;
885
        EditBox_SetFocus(FindEdit, TRUE);
885
        EditBox_SetFocus(FindEdit, TRUE);
886
        EditBox_SetFocus(ReplaceEdit, FALSE);
886
        EditBox_SetFocus(ReplaceEdit, FALSE);
887
        EditBox_SetFocus(GotoEdit, FALSE)
887
        EditBox_SetFocus(GotoEdit, FALSE)
888
    |menuGoto:
888
    |menuGoto:
889
        IF ~search THEN
889
        IF ~search THEN
890
            Search
890
            Search
891
        END;
891
        END;
892
        EditBox_SetFocus(GotoEdit, TRUE);
892
        EditBox_SetFocus(GotoEdit, TRUE);
893
        EditBox_SetFocus(FindEdit, FALSE);
893
        EditBox_SetFocus(FindEdit, FALSE);
894
        EditBox_SetFocus(ReplaceEdit, FALSE)
894
        EditBox_SetFocus(ReplaceEdit, FALSE)
895
    |menuNumbers:
895
    |menuNumbers:
896
        T.toggleNumbers(text)
896
        T.toggleNumbers(text)
897
    |menuFontSize:
897
    |menuFontSize:
898
        IF font = font1 THEN
898
        IF font = font1 THEN
899
            font := font2
899
            font := font2
900
        ELSE
900
        ELSE
901
            font := font1
901
            font := font1
902
        END;
902
        END;
903
        resize
903
        resize
904
    |menuNone:
904
    |menuNone:
905
        T.setLang(text, Languages.langNone)
905
        T.setLang(text, Languages.langNone)
906
    |menuC:
906
    |menuC:
907
        T.setLang(text, Languages.langC)
907
        T.setLang(text, Languages.langC)
908
    |menuFasm:
908
    |menuFasm:
909
        T.setLang(text, Languages.langFasm)
909
        T.setLang(text, Languages.langFasm)
910
    |menuIni:
910
    |menuIni:
911
        T.setLang(text, Languages.langIni)
911
        T.setLang(text, Languages.langIni)
912
    |menuLua:
912
    |menuLua:
913
        T.setLang(text, Languages.langLua)
913
        T.setLang(text, Languages.langLua)
914
    |menuOberon:
914
    |menuOberon:
915
        T.setLang(text, Languages.langOberon)
915
        T.setLang(text, Languages.langOberon)
916
    |menuPascal:
916
    |menuPascal:
917
        T.setLang(text, Languages.langPascal)
917
        T.setLang(text, Languages.langPascal)
918
    |menuBuild:
918
    |menuBuild:
919
        Script(buildScript)
919
        Script(buildScript)
920
    |menuBuildScript:
920
    |menuBuildScript:
921
        OpenFile(buildScript, ShellFilter)
921
        OpenFile(buildScript, ShellFilter)
922
    |menuRun:
922
    |menuRun:
923
        Script(runScript)
923
        Script(runScript)
924
    |menuRunScript:
924
    |menuRunScript:
925
        OpenFile(runScript, ShellFilter)
925
        OpenFile(runScript, ShellFilter)
926
    |menuDebug:
926
    |menuDebug:
927
        Script(debugScript)
927
        Script(debugScript)
928
    |menuDebugScript:
928
    |menuDebugScript:
929
        OpenFile(debugScript, ShellFilter)
929
        OpenFile(debugScript, ShellFilter)
930
    |menuUTF8BOM:
930
    |menuUTF8BOM:
931
        text.enc := E.UTF8BOM
931
        text.enc := E.UTF8BOM
932
    |menuUTF8:
932
    |menuUTF8:
933
        text.enc := E.UTF8
933
        text.enc := E.UTF8
934
    |menuCP866:
934
    |menuCP866:
935
        text.enc := E.CP866
935
        text.enc := E.CP866
936
    |menuWin1251:
936
    |menuWin1251:
937
        text.enc := E.W1251
937
        text.enc := E.W1251
938
    |menuPipet:
938
    |menuPipet:
939
        K.Run("/rd/1/develop/pipet", "")
939
        K.Run("/rd/1/develop/pipet", "")
940
    |menuSysFunc:
940
    |menuSysFunc:
941
        K.Run("/rd/1/docpack", "f")
941
        K.Run("/rd/1/docpack", "f")
942
    |menuColors..menuMaxColors:
942
    |menuColors..menuMaxColors:
943
        Ini.selectSection(IPC[2] - menuColors)
943
        Ini.selectSection(IPC[2] - menuColors)
944
    END;
944
    END;
945
    IPC[0] := 0;
945
    IPC[0] := 0;
946
    IPC[1] := 0
946
    IPC[1] := 0
947
END receiveIPC;
947
END receiveIPC;
948
 
948
 
949
 
949
 
950
PROCEDURE MenuKeyDown (menu: Menu.tMenu; key: INTEGER): BOOLEAN;
950
PROCEDURE MenuKeyDown (menu: Menu.tMenu; key: INTEGER): BOOLEAN;
951
VAR
951
VAR
952
    menuItem: INTEGER;
952
    menuItem: INTEGER;
953
BEGIN
953
BEGIN
954
    menuItem := -1;
954
    menuItem := -1;
955
    getKBState;
955
    getKBState;
956
    IF (T.CTRL IN shift) THEN
956
    IF (T.CTRL IN shift) THEN
957
        CASE key DIV 65536 OF
957
        CASE key DIV 65536 OF
958
        |21: menuItem := menuRedo
958
        |21: menuItem := menuRedo
959
        |30: menuItem := menuSelectAll
959
        |30: menuItem := menuSelectAll
960
        |33: menuItem := menuSearch
960
        |33: menuItem := menuSearch
961
        |34: menuItem := menuGoto
961
        |34: menuItem := menuGoto
962
        |44: menuItem := menuUndo
962
        |44: menuItem := menuUndo
963
        |45: menuItem := menuCut
963
        |45: menuItem := menuCut
964
        |46: menuItem := menuCopy
964
        |46: menuItem := menuCopy
965
        |47: menuItem := menuPaste
965
        |47: menuItem := menuPaste
966
        |24: menuItem := menuOpen
966
        |24: menuItem := menuOpen
967
        |31: menuItem := menuSave
967
        |31: menuItem := menuSave
968
        |49: menuItem := menuNew
968
        |49: menuItem := menuNew
969
        |67: menuItem := menuBuild
969
        |67: menuItem := menuBuild
970
        ELSE
970
        ELSE
971
        END
971
        END
972
    ELSE
972
    ELSE
973
        IF key DIV 65536 = 83 THEN
973
        IF key DIV 65536 = 83 THEN
974
            menuItem := menuDelete
974
            menuItem := menuDelete
975
        ELSIF key DIV 65536 = 67 THEN
975
        ELSIF key DIV 65536 = 67 THEN
976
            menuItem := menuRun
976
            menuItem := menuRun
977
        END
977
        END
978
    END;
978
    END;
979
    IF menuItem # -1 THEN
979
    IF menuItem # -1 THEN
980
        IF Menu.isEnabled(menu, menuItem) THEN
980
        IF Menu.isEnabled(menu, menuItem) THEN
981
            MenuItemClick(menu, menuItem)
981
            MenuItemClick(menu, menuItem)
982
        ELSE
982
        ELSE
983
            menuItem := -1
983
            menuItem := -1
984
        END
984
        END
985
    END
985
    END
986
    RETURN menuItem # -1
986
    RETURN menuItem # -1
987
END MenuKeyDown;
987
END MenuKeyDown;
988
 
988
 
989
 
989
 
990
PROCEDURE CreateContextMenu (): Menu.tMenu;
990
PROCEDURE CreateContextMenu (): Menu.tMenu;
991
VAR
991
VAR
992
    menu: List.tList;
992
    menu: List.tList;
993
BEGIN
993
BEGIN
994
    menu := List.create(NIL);
994
    menu := List.create(NIL);
995
    Menu.AddMenuItem(menu, menuUndo,      "undo         ctrl-Z");
995
    Menu.AddMenuItem(menu, menuUndo,      "undo         ctrl-Z");
996
    Menu.AddMenuItem(menu, menuRedo,      "redo         ctrl-Y");
996
    Menu.AddMenuItem(menu, menuRedo,      "redo         ctrl-Y");
997
    Menu.delimiter(menu);
997
    Menu.delimiter(menu);
998
    Menu.AddMenuItem(menu, menuCut,       "cut          ctrl-X");
998
    Menu.AddMenuItem(menu, menuCut,       "cut          ctrl-X");
999
    Menu.AddMenuItem(menu, menuCopy,      "copy         ctrl-C");
999
    Menu.AddMenuItem(menu, menuCopy,      "copy         ctrl-C");
1000
    Menu.AddMenuItem(menu, menuPaste,     "paste        ctrl-V");
1000
    Menu.AddMenuItem(menu, menuPaste,     "paste        ctrl-V");
1001
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1001
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1002
    Menu.delimiter(menu);
1002
    Menu.delimiter(menu);
1003
    Menu.AddMenuItem(menu, menuSelectAll, "select all   ctrl-A");
1003
    Menu.AddMenuItem(menu, menuSelectAll, "select all   ctrl-A");
1004
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1004
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1005
END CreateContextMenu;
1005
END CreateContextMenu;
1006
 
1006
 
1007
 
1007
 
1008
PROCEDURE CreateMenuFile (): Menu.tMenu;
1008
PROCEDURE CreateMenuFile (): Menu.tMenu;
1009
VAR
1009
VAR
1010
    menu: List.tList;
1010
    menu: List.tList;
1011
BEGIN
1011
BEGIN
1012
    menu := List.create(NIL);
1012
    menu := List.create(NIL);
1013
    Menu.AddMenuItem(menu, menuNew,    "new       ctrl-N");
1013
    Menu.AddMenuItem(menu, menuNew,    "new       ctrl-N");
1014
    Menu.AddMenuItem(menu, menuOpen,   "open      ctrl-O");
1014
    Menu.AddMenuItem(menu, menuOpen,   "open      ctrl-O");
1015
    Menu.AddMenuItem(menu, menuSave,   "save      ctrl-S");
1015
    Menu.AddMenuItem(menu, menuSave,   "save      ctrl-S");
1016
    Menu.AddMenuItem(menu, menuSaveAs, "save as");
1016
    Menu.AddMenuItem(menu, menuSaveAs, "save as");
1017
    Menu.AddMenuItem(menu, menuFolder, "folder");
1017
    Menu.AddMenuItem(menu, menuFolder, "folder");
1018
    Menu.delimiter(menu);
1018
    Menu.delimiter(menu);
1019
    Menu.AddMenuItem(menu, menuExit,   "exit");
1019
    Menu.AddMenuItem(menu, menuExit,   "exit");
1020
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1020
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1021
END CreateMenuFile;
1021
END CreateMenuFile;
1022
 
1022
 
1023
 
1023
 
1024
PROCEDURE CreateMenuEdit (): Menu.tMenu;
1024
PROCEDURE CreateMenuEdit (): Menu.tMenu;
1025
VAR
1025
VAR
1026
    menu: List.tList;
1026
    menu: List.tList;
1027
BEGIN
1027
BEGIN
1028
    menu := List.create(NIL);
1028
    menu := List.create(NIL);
1029
    Menu.AddMenuItem(menu, menuUndo,      "undo          ctrl-Z");
1029
    Menu.AddMenuItem(menu, menuUndo,      "undo          ctrl-Z");
1030
    Menu.AddMenuItem(menu, menuRedo,      "redo          ctrl-Y");
1030
    Menu.AddMenuItem(menu, menuRedo,      "redo          ctrl-Y");
1031
    Menu.delimiter(menu);
1031
    Menu.delimiter(menu);
1032
    Menu.AddMenuItem(menu, menuSearch,    "search        ctrl-F");
1032
    Menu.AddMenuItem(menu, menuSearch,    "search        ctrl-F");
1033
    Menu.AddMenuItem(menu, menuGoto,      "go to line    ctrl-G");
1033
    Menu.AddMenuItem(menu, menuGoto,      "go to line    ctrl-G");
1034
    Menu.delimiter(menu);
1034
    Menu.delimiter(menu);
1035
    Menu.AddMenuItem(menu, menuCut,       "cut           ctrl-X");
1035
    Menu.AddMenuItem(menu, menuCut,       "cut           ctrl-X");
1036
    Menu.AddMenuItem(menu, menuCopy,      "copy          ctrl-C");
1036
    Menu.AddMenuItem(menu, menuCopy,      "copy          ctrl-C");
1037
    Menu.AddMenuItem(menu, menuPaste,     "paste         ctrl-V");
1037
    Menu.AddMenuItem(menu, menuPaste,     "paste         ctrl-V");
1038
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1038
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1039
    Menu.delimiter(menu);
1039
    Menu.delimiter(menu);
1040
    Menu.AddMenuItem(menu, menuSelectAll, "select all    ctrl-A");
1040
    Menu.AddMenuItem(menu, menuSelectAll, "select all    ctrl-A");
1041
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1041
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1042
END CreateMenuEdit;
1042
END CreateMenuEdit;
1043
 
1043
 
1044
 
1044
 
1045
PROCEDURE CreateMenuEncoding (): Menu.tMenu;
1045
PROCEDURE CreateMenuEncoding (): Menu.tMenu;
1046
VAR
1046
VAR
1047
    menu: List.tList;
1047
    menu: List.tList;
1048
BEGIN
1048
BEGIN
1049
    menu := List.create(NIL);
1049
    menu := List.create(NIL);
1050
    Menu.AddMenuItem(menu, menuUTF8BOM, "UTF-8-BOM");
1050
    Menu.AddMenuItem(menu, menuUTF8BOM, "UTF-8-BOM");
1051
    Menu.AddMenuItem(menu, menuUTF8,    "UTF-8");
1051
    Menu.AddMenuItem(menu, menuUTF8,    "UTF-8");
1052
    Menu.AddMenuItem(menu, menuCP866,   "CP866");
1052
    Menu.AddMenuItem(menu, menuCP866,   "CP866");
1053
    Menu.AddMenuItem(menu, menuWin1251, "Windows-1251");
1053
    Menu.AddMenuItem(menu, menuWin1251, "Windows-1251");
1054
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1054
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1055
END CreateMenuEncoding;
1055
END CreateMenuEncoding;
1056
 
1056
 
1057
 
1057
 
1058
PROCEDURE CreateMenuView (): Menu.tMenu;
1058
PROCEDURE CreateMenuView (): Menu.tMenu;
1059
VAR
1059
VAR
1060
    menu: List.tList;
1060
    menu: List.tList;
1061
    colors: Ini.tSection;
1061
    colors: Ini.tSection;
1062
    idx: INTEGER;
1062
    idx: INTEGER;
1063
BEGIN
1063
BEGIN
1064
    menu := List.create(NIL);
1064
    menu := List.create(NIL);
1065
    Menu.AddMenuItem(menu, menuNumbers, "line numbers");
1065
    Menu.AddMenuItem(menu, menuNumbers, "line numbers");
1066
    Menu.AddMenuItem(menu, menuFontSize, "x2");
1066
    Menu.AddMenuItem(menu, menuFontSize, "x2");
1067
    Menu.delimiter(menu);
1067
    Menu.delimiter(menu);
1068
 
1068
 
1069
    colors := Ini.sections.first(Ini.tSection);
1069
    colors := Ini.sections.first(Ini.tSection);
1070
    idx := menuColors;
1070
    idx := menuColors;
1071
    WHILE colors # NIL DO
1071
    WHILE colors # NIL DO
1072
        Menu.AddMenuItem(menu, idx, colors.name);
1072
        Menu.AddMenuItem(menu, idx, colors.name);
1073
        INC(idx);
1073
        INC(idx);
1074
        colors := colors.next(Ini.tSection)
1074
        colors := colors.next(Ini.tSection)
1075
    END;
1075
    END;
1076
 
1076
 
1077
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1077
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1078
END CreateMenuView;
1078
END CreateMenuView;
1079
 
1079
 
1080
 
1080
 
1081
PROCEDURE CreateMenuSyntax (): Menu.tMenu;
1081
PROCEDURE CreateMenuSyntax (): Menu.tMenu;
1082
VAR
1082
VAR
1083
    menu: List.tList;
1083
    menu: List.tList;
1084
BEGIN
1084
BEGIN
1085
    menu := List.create(NIL);
1085
    menu := List.create(NIL);
1086
    Menu.AddMenuItem(menu, menuC,      "C");
1086
    Menu.AddMenuItem(menu, menuC,      "C");
1087
    Menu.AddMenuItem(menu, menuFasm,   "Fasm");
1087
    Menu.AddMenuItem(menu, menuFasm,   "Fasm");
1088
    Menu.AddMenuItem(menu, menuIni,    "Ini");
1088
    Menu.AddMenuItem(menu, menuIni,    "Ini");
1089
    Menu.AddMenuItem(menu, menuLua,    "Lua");
1089
    Menu.AddMenuItem(menu, menuLua,    "Lua");
1090
    Menu.AddMenuItem(menu, menuOberon, "Oberon");
1090
    Menu.AddMenuItem(menu, menuOberon, "Oberon");
1091
    Menu.AddMenuItem(menu, menuPascal, "Pascal");
1091
    Menu.AddMenuItem(menu, menuPascal, "Pascal");
1092
    Menu.delimiter(menu);
1092
    Menu.delimiter(menu);
1093
    Menu.AddMenuItem(menu, menuNone,   "none");
1093
    Menu.AddMenuItem(menu, menuNone,   "none");
1094
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1094
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1095
END CreateMenuSyntax;
1095
END CreateMenuSyntax;
1096
 
1096
 
1097
 
1097
 
1098
PROCEDURE CreateMenuProgram (): Menu.tMenu;
1098
PROCEDURE CreateMenuProgram (): Menu.tMenu;
1099
VAR
1099
VAR
1100
    menu: List.tList;
1100
    menu: List.tList;
1101
BEGIN
1101
BEGIN
1102
    menu := List.create(NIL);
1102
    menu := List.create(NIL);
1103
    Menu.AddMenuItem(menu, menuBuild,       "build    ctrl+F9");
1103
    Menu.AddMenuItem(menu, menuBuild,       "build    ctrl+F9");
1104
    Menu.AddMenuItem(menu, menuBuildScript, "script");
1104
    Menu.AddMenuItem(menu, menuBuildScript, "script");
1105
    Menu.delimiter(menu);
1105
    Menu.delimiter(menu);
1106
    Menu.AddMenuItem(menu, menuRun,         "run           F9");
1106
    Menu.AddMenuItem(menu, menuRun,         "run           F9");
1107
    Menu.AddMenuItem(menu, menuRunScript,   "script");
1107
    Menu.AddMenuItem(menu, menuRunScript,   "script");
1108
    Menu.delimiter(menu);
1108
    Menu.delimiter(menu);
1109
    Menu.AddMenuItem(menu, menuDebug,       "debug");
1109
    Menu.AddMenuItem(menu, menuDebug,       "debug");
1110
    Menu.AddMenuItem(menu, menuDebugScript, "script");
1110
    Menu.AddMenuItem(menu, menuDebugScript, "script");
1111
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1111
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1112
END CreateMenuProgram;
1112
END CreateMenuProgram;
1113
 
1113
 
1114
 
1114
 
1115
PROCEDURE CreateMenuTools (): Menu.tMenu;
1115
PROCEDURE CreateMenuTools (): Menu.tMenu;
1116
VAR
1116
VAR
1117
    menu: List.tList;
1117
    menu: List.tList;
1118
BEGIN
1118
BEGIN
1119
    menu := List.create(NIL);
1119
    menu := List.create(NIL);
1120
    Menu.AddMenuItem(menu, menuPipet,   "pipet");
1120
    Menu.AddMenuItem(menu, menuPipet,   "pipet");
1121
    Menu.AddMenuItem(menu, menuSysFunc, "system functions");
1121
    Menu.AddMenuItem(menu, menuSysFunc, "system functions");
1122
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1122
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1123
END CreateMenuTools;
1123
END CreateMenuTools;
1124
 
1124
 
1125
 
1125
 
1126
PROCEDURE CanvasToScreen (VAR x, y: INTEGER);
1126
PROCEDURE CanvasToScreen (VAR x, y: INTEGER);
1127
VAR
1127
VAR
1128
    cliX, cliY,
1128
    cliX, cliY,
1129
    winX, winY: INTEGER;
1129
    winX, winY: INTEGER;
1130
BEGIN
1130
BEGIN
1131
    K.WinPos(winX, winY);
1131
    K.WinPos(winX, winY);
1132
    K.ClientPos(cliX, cliY);
1132
    K.ClientPos(cliX, cliY);
1133
    x := x + winX + cliX + LEFT;
1133
    x := x + winX + cliX + LEFT;
1134
    y := y + winY + cliY + TOP;
1134
    y := y + winY + cliY + TOP;
1135
END CanvasToScreen;
1135
END CanvasToScreen;
1136
 
1136
 
1137
 
1137
 
1138
PROCEDURE ShowMenu (menu: Menu.tMenu);
1138
PROCEDURE ShowMenu (menu: Menu.tMenu);
1139
VAR
1139
VAR
1140
    winX, winY, cliX, cliY, x, y, i: INTEGER;
1140
    winX, winY, cliX, cliY, x, y, i: INTEGER;
1141
    selected: BOOLEAN;
1141
    selected: BOOLEAN;
1142
BEGIN
1142
BEGIN
1143
    IF menu # context THEN
1143
    IF menu # context THEN
1144
        K.WinPos(winX, winY);
1144
        K.WinPos(winX, winY);
1145
        K.ClientPos(cliX, cliY);
1145
        K.ClientPos(cliX, cliY);
1146
        x := winX + cliX;
1146
        x := winX + cliX;
1147
        y := MainMenuHeight + winY + cliY
1147
        y := MainMenuHeight + winY + cliY
1148
    ELSE
1148
    ELSE
1149
        mouse(x, y);
1149
        mouse(x, y);
1150
        IF ~((0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height)) THEN
1150
        IF ~((0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height)) THEN
1151
            menu := NIL
1151
            menu := NIL
1152
        END
1152
        END
1153
    END;
1153
    END;
1154
 
1154
 
1155
    IF menu = menuFile THEN
1155
    IF menu = menuFile THEN
1156
        Menu.setEnabled(menu, menuSave, text.modified);
1156
        Menu.setEnabled(menu, menuSave, text.modified);
1157
        Menu.setEnabled(menu, menuFolder, text.fileName # "");
1157
        Menu.setEnabled(menu, menuFolder, text.fileName # "");
1158
        INC(x, menuFileX)
1158
        INC(x, menuFileX)
1159
    ELSIF (menu = menuEdit) OR (menu = context) THEN
1159
    ELSIF (menu = menuEdit) OR (menu = context) THEN
1160
        Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition));
1160
        Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition));
1161
        Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition));
1161
        Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition));
1162
        selected := T.selected(text);
1162
        selected := T.selected(text);
1163
        Menu.setEnabled(menu, menuCut, selected);
1163
        Menu.setEnabled(menu, menuCut, selected);
1164
        Menu.setEnabled(menu, menuCopy, selected);
1164
        Menu.setEnabled(menu, menuCopy, selected);
1165
        Menu.setEnabled(menu, menuDelete, selected);
1165
        Menu.setEnabled(menu, menuDelete, selected);
1166
        Menu.setEnabled(menu, menuPaste, CB.available());
1166
        Menu.setEnabled(menu, menuPaste, CB.available());
1167
        IF menu = menuEdit THEN
1167
        IF menu = menuEdit THEN
1168
            INC(x, menuEditX)
1168
            INC(x, menuEditX)
1169
        ELSE
1169
        ELSE
1170
            IF y + menu.height >= canvas.height THEN
1170
            IF y + menu.height >= canvas.height THEN
1171
                DEC(y, menu.height)
1171
                DEC(y, menu.height)
1172
            END;
1172
            END;
1173
            IF x + menu.width >= canvas.width THEN
1173
            IF x + menu.width >= canvas.width THEN
1174
                DEC(x, menu.width)
1174
                DEC(x, menu.width)
1175
            END;
1175
            END;
1176
            CanvasToScreen(x, y)
1176
            CanvasToScreen(x, y)
1177
        END
1177
        END
1178
    ELSIF menu = menuEncoding THEN
1178
    ELSIF menu = menuEncoding THEN
1179
        Menu.setCheck(menu, menuUTF8BOM, ORD(text.enc = E.UTF8BOM)*2);
1179
        Menu.setCheck(menu, menuUTF8BOM, ORD(text.enc = E.UTF8BOM)*2);
1180
        Menu.setCheck(menu, menuUTF8,    ORD(text.enc = E.UTF8)*2);
1180
        Menu.setCheck(menu, menuUTF8,    ORD(text.enc = E.UTF8)*2);
1181
        Menu.setCheck(menu, menuCP866,   ORD(text.enc = E.CP866)*2);
1181
        Menu.setCheck(menu, menuCP866,   ORD(text.enc = E.CP866)*2);
1182
        Menu.setCheck(menu, menuWin1251, ORD(text.enc = E.W1251)*2);
1182
        Menu.setCheck(menu, menuWin1251, ORD(text.enc = E.W1251)*2);
1183
        INC(x, menuEncodingX)
1183
        INC(x, menuEncodingX)
1184
    ELSIF menu = menuView THEN
1184
    ELSIF menu = menuView THEN
1185
        Menu.setCheck(menu, menuNumbers,  ORD(text.numbers));
1185
        Menu.setCheck(menu, menuNumbers,  ORD(text.numbers));
1186
        Menu.setCheck(menu, menuFontSize, ORD(font = font2));
1186
        Menu.setCheck(menu, menuFontSize, ORD(font = font2));
1187
        FOR i := 0 TO Ini.sections.count - 1 DO
1187
        FOR i := 0 TO Ini.sections.count - 1 DO
1188
            Menu.setCheck(menu, menuColors + i, ORD(Ini.curSectionNum = i)*2)
1188
            Menu.setCheck(menu, menuColors + i, ORD(Ini.curSectionNum = i)*2)
1189
        END;
1189
        END;
1190
        INC(x, menuViewX)
1190
        INC(x, menuViewX)
1191
    ELSIF menu = menuSyntax THEN
1191
    ELSIF menu = menuSyntax THEN
1192
        Menu.setCheck(menu, menuNone,   ORD(text.lang = Languages.langNone)*2);
1192
        Menu.setCheck(menu, menuNone,   ORD(text.lang = Languages.langNone)*2);
1193
        Menu.setCheck(menu, menuC,      ORD(text.lang = Languages.langC)*2);
1193
        Menu.setCheck(menu, menuC,      ORD(text.lang = Languages.langC)*2);
1194
        Menu.setCheck(menu, menuFasm,   ORD(text.lang = Languages.langFasm)*2);
1194
        Menu.setCheck(menu, menuFasm,   ORD(text.lang = Languages.langFasm)*2);
1195
        Menu.setCheck(menu, menuIni,    ORD(text.lang = Languages.langIni)*2);
1195
        Menu.setCheck(menu, menuIni,    ORD(text.lang = Languages.langIni)*2);
1196
        Menu.setCheck(menu, menuLua,    ORD(text.lang = Languages.langLua)*2);
1196
        Menu.setCheck(menu, menuLua,    ORD(text.lang = Languages.langLua)*2);
1197
        Menu.setCheck(menu, menuOberon, ORD(text.lang = Languages.langOberon)*2);
1197
        Menu.setCheck(menu, menuOberon, ORD(text.lang = Languages.langOberon)*2);
1198
        Menu.setCheck(menu, menuPascal, ORD(text.lang = Languages.langPascal)*2);
1198
        Menu.setCheck(menu, menuPascal, ORD(text.lang = Languages.langPascal)*2);
1199
        INC(x, menuSyntaxX)
1199
        INC(x, menuSyntaxX)
1200
    ELSIF menu = menuProgram THEN
1200
    ELSIF menu = menuProgram THEN
1201
        Menu.setEnabled(menu, menuBuild, buildScript # "");
1201
        Menu.setEnabled(menu, menuBuild, buildScript # "");
1202
        Menu.setEnabled(menu, menuDebug, debugScript # "");
1202
        Menu.setEnabled(menu, menuDebug, debugScript # "");
1203
        Menu.setEnabled(menu, menuRun, runScript # "");
1203
        Menu.setEnabled(menu, menuRun, runScript # "");
1204
        INC(x, menuProgramX)
1204
        INC(x, menuProgramX)
1205
    ELSIF menu = menuTools THEN
1205
    ELSIF menu = menuTools THEN
1206
        INC(x, menuToolsX)
1206
        INC(x, menuToolsX)
1207
    END;
1207
    END;
1208
 
1208
 
1209
    IF menu # NIL THEN
1209
    IF menu # NIL THEN
1210
        IF Menu.opened(menu) THEN
1210
        IF Menu.opened(menu) THEN
1211
            Menu.close(menu)
1211
            Menu.close(menu)
1212
        END;
1212
        END;
1213
        Menu.open(menu, x, y)
1213
        Menu.open(menu, x, y)
1214
    END
1214
    END
1215
END ShowMenu;
1215
END ShowMenu;
1216
 
1216
 
1217
 
1217
 
1218
PROCEDURE main;
1218
PROCEDURE main;
1219
VAR
1219
VAR
1220
    width, height, x, y, scrollX, scrollY, i: INTEGER;
1220
    width, height, x, y, scrollX, scrollY, i: INTEGER;
1221
    key: INTEGER;
1221
    key: INTEGER;
1222
    msState: SET;
1222
    msState: SET;
1223
    scroll: INTEGER;
1223
    scroll: INTEGER;
1224
    err: INTEGER;
1224
    err: INTEGER;
1225
    fileName, filePath: RW.tFileName;
1225
    fileName, filePath: RW.tFileName;
1226
    cliWidth, cliHeight: INTEGER;
1226
    cliWidth, cliHeight: INTEGER;
1227
    resized: BOOLEAN;
1227
    resized: BOOLEAN;
1228
    firstClickX, firstClickY, time: INTEGER;
1228
    firstClickX, firstClickY, time: INTEGER;
1229
BEGIN
1229
BEGIN
1230
    K.GetSystemColors;
1230
    K.GetSystemColors;
1231
    Icons.get(icons, grayIcons);
1231
    Icons.get(icons, grayIcons);
1232
    modified := FALSE;
1232
    modified := FALSE;
1233
    mainTID := K.ThreadID();
1233
    mainTID := K.ThreadID();
1234
    K.SetIPC(IPC);
1234
    K.SetIPC(IPC);
1235
    U.ptr2str(K.GetName(), AppPath);
1235
    U.ptr2str(K.GetName(), AppPath);
1236
    Ini.load(AppPath);
1236
    Ini.load(AppPath);
1237
    K.SetEventsMask({0, 1, 2, 5, 6, 31});
1237
    K.SetEventsMask({0, 1, 2, 5, 6, 31});
1238
    LeftButtonUp;
1238
    LeftButtonUp;
1239
    resized := FALSE;
1239
    resized := FALSE;
1240
    shift := {};
1240
    shift := {};
1241
    K.ScreenSize(winWidth, winHeight);
1241
    K.ScreenSize(winWidth, winHeight);
1242
    winWidth := (winWidth * 80) DIV 100 - (128 + 30);
1242
    winWidth := (winWidth * 80) DIV 100 - (128 + 30);
1243
    winHeight := winHeight - (128 + 30);
1243
    winHeight := winHeight - (128 + 30);
1244
    winWidth := MAX(winWidth, minWinWidth);
1244
    winWidth := MAX(winWidth, minWinWidth);
1245
    winHeight := MAX(winHeight, minWinHeight);
1245
    winHeight := MAX(winHeight, minWinHeight);
1246
    cliWidth := winWidth;
1246
    cliWidth := winWidth;
1247
    cliHeight := winHeight;
1247
    cliHeight := winHeight;
1248
    LEFT := 10;
1248
    LEFT := 10;
1249
    canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 10), winHeight - (TOP + BOTTOM + 4) - K.SkinHeight());
1249
    canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 10), winHeight - (TOP + BOTTOM + 4) - K.SkinHeight());
1250
    font1 := G.CreateFont(1, "", {});
1250
    font1 := G.CreateFont(1, "", {});
1251
    font2 := G.CreateFont(2, "", {});
1251
    font2 := G.CreateFont(2, "", {});
1252
    font := font1;
1252
    font := font1;
1253
    G.SetFont(canvas, font);
1253
    G.SetFont(canvas, font);
1254
    T.init(NIL);
1254
    T.init(NIL);
1255
    T.setCanvas(canvas);
1255
    T.setCanvas(canvas);
1256
    U.ptr2str(K.GetCommandLine(), fileName);
1256
    U.ptr2str(K.GetCommandLine(), fileName);
1257
    context := CreateContextMenu();
1257
    context := CreateContextMenu();
1258
    menuFile := CreateMenuFile();
1258
    menuFile := CreateMenuFile();
1259
    menuEdit := CreateMenuEdit();
1259
    menuEdit := CreateMenuEdit();
1260
    menuEncoding := CreateMenuEncoding();
1260
    menuEncoding := CreateMenuEncoding();
1261
    menuView := CreateMenuView();
1261
    menuView := CreateMenuView();
1262
    menuSyntax := CreateMenuSyntax();
1262
    menuSyntax := CreateMenuSyntax();
1263
    menuProgram := CreateMenuProgram();
1263
    menuProgram := CreateMenuProgram();
1264
    menuTools := CreateMenuTools();
1264
    menuTools := CreateMenuTools();
1265
    IF fileName = "" THEN
1265
    IF fileName = "" THEN
1266
        text := T.New();
1266
        text := T.New();
1267
        filePath := "/rd/1"
1267
        filePath := "/rd/1"
1268
    ELSE
1268
    ELSE
1269
        text := T.open(fileName, err);
1269
        text := T.open(fileName, err);
1270
        IF text = NIL THEN
1270
        IF text = NIL THEN
1271
            error("'cedit: error opening file' -E");
1271
            error("'cedit: error opening file' -E");
1272
            K.Exit
1272
            K.Exit
1273
        ELSE
1273
        ELSE
1274
            U.getPath(fileName, filePath)
1274
            U.getPath(fileName, filePath)
1275
        END
1275
        END
1276
    END;
1276
    END;
1277
    OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, "");
1277
    OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, "");
1278
 
1278
 
1279
    vScroll := Scroll.create(scrollWidth, canvas.height - scrollWidth*2 + 1);
1279
    vScroll := Scroll.create(scrollWidth, canvas.height - scrollWidth*2 + 1);
1280
    hScroll := Scroll.create(canvas.width - scrollWidth*2, scrollWidth);
1280
    hScroll := Scroll.create(canvas.width - scrollWidth*2, scrollWidth);
1281
    T.resize(canvas.width, canvas.height);
1281
    T.resize(canvas.width, canvas.height);
1282
    T.SetPos(text, 0, 0);
1282
    T.SetPos(text, 0, 0);
1283
    confirm := FALSE;
1283
    confirm := FALSE;
1284
    notFound := FALSE;
1284
    notFound := FALSE;
1285
    search := FALSE;
1285
    search := FALSE;
1286
    createSearchForm;
1286
    createSearchForm;
1287
    new_searchText := "";
1287
    new_searchText := "";
1288
    searchText := "";
1288
    searchText := "";
1289
    cs := FALSE;
1289
    cs := FALSE;
1290
    whole := FALSE;
1290
    whole := FALSE;
1291
    replaced := 0;
1291
    replaced := 0;
1292
    draw_window;
1292
    draw_window;
1293
    repaint;
1293
    repaint;
1294
    buildScript := "";
1294
    buildScript := "";
1295
    runScript := "";
1295
    runScript := "";
1296
    debugScript := "";
1296
    debugScript := "";
1297
    WHILE TRUE DO
1297
    WHILE TRUE DO
1298
        CASE K.WaitForEvent() OF
1298
        CASE K.WaitForEvent() OF
1299
        |1:
1299
        |1:
1300
            FOR i := 0 TO 1 DO
1300
            FOR i := 0 TO 1 DO
1301
                K.GetSystemColors;
1301
                K.GetSystemColors;
1302
                Icons.get(icons, grayIcons);
1302
                Icons.get(icons, grayIcons);
1303
                IF ~K.RolledUp() THEN
1303
                IF ~K.RolledUp() THEN
1304
                    K.ClientSize(width, height);
1304
                    K.ClientSize(width, height);
1305
                    IF (width # cliWidth) OR (height # cliHeight) THEN
1305
                    IF (width # cliWidth) OR (height # cliHeight) THEN
1306
                        cliWidth := width;
1306
                        cliWidth := width;
1307
                        cliHeight := height;
1307
                        cliHeight := height;
1308
                        resize;
1308
                        resize;
1309
                        resized := TRUE;
1309
                        resized := TRUE;
1310
                    END;
1310
                    END;
1311
                    K.SetEventsMask({0, 1, 2, 5, 6, 31})
1311
                    K.SetEventsMask({0, 1, 2, 5, 6, 31})
1312
                ELSE
1312
                ELSE
1313
                    K.SetEventsMask({0, 30, 31})
1313
                    K.SetEventsMask({0, 30, 31})
1314
                END;
1314
                END;
1315
                draw_window
1315
                draw_window
1316
            END
1316
            END
1317
 
1317
 
1318
        |2:
1318
        |2:
1319
            key := K.GetKey();
1319
            key := K.GetKey();
1320
            getKBState;
1320
            getKBState;
-
 
1321
            IF confirm THEN
-
 
1322
                IF key DIV 65536 = 28 THEN (* Enter *)
-
 
1323
                    save;
-
 
1324
                    IF ~text.modified THEN
-
 
1325
                        K.Exit
-
 
1326
                    END;
-
 
1327
                    repaint
-
 
1328
                END;
-
 
1329
                key := -1
-
 
1330
            END;
1321
            IF key DIV 65536 = 61 THEN (* F3 *)
1331
            IF key DIV 65536 = 61 THEN (* F3 *)
1322
                key := -1;
1332
                key := -1;
1323
                IF search & (searchText # "") THEN
1333
                IF search & (searchText # "") THEN
1324
                    IF T.SHIFT IN shift THEN
1334
                    IF T.SHIFT IN shift THEN
1325
                        notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW))
1335
                        notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW))
1326
                    ELSE
1336
                    ELSE
1327
                        notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW))
1337
                        notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW))
1328
                    END
1338
                    END
1329
                END
1339
                END
1330
            ELSIF key DIV 65536 = 67 THEN (* F9 *)
1340
            ELSIF key DIV 65536 = 67 THEN (* F9 *)
1331
                key := -1;
1341
                key := -1;
1332
                IF T.CTRL IN shift THEN
1342
                IF T.CTRL IN shift THEN
1333
                    Script(buildScript)
1343
                    Script(buildScript)
1334
                ELSE
1344
                ELSE
1335
                    Script(runScript)
1345
                    Script(runScript)
1336
                END
1346
                END
1337
            ELSIF key DIV 65536 = 1 THEN
1347
            ELSIF key DIV 65536 = 1 THEN (* Esc *)
1338
                key := -1; (* Esc *)
1348
                key := -1;
1339
                IF search THEN
1349
                IF search THEN
1340
                    Search
1350
                    Search
1341
                END
1351
                END
1342
            ELSIF (key DIV 65536 = 55) & (key DIV 256 MOD 256 = 52) THEN
1352
            ELSIF (key DIV 65536 = 55) & (key DIV 256 MOD 256 = 52) THEN
1343
                key := -1 (* PrtScn *)
1353
                key := -1 (* PrtScn *)
1344
            ELSIF (T.CTRL IN shift) & (key DIV 65536 = 33) THEN
1354
            ELSIF (T.CTRL IN shift) & (key DIV 65536 = 33) THEN
1345
                key := -1;
1355
                key := -1;
1346
                IF ~search THEN
1356
                IF ~search THEN
1347
                    Search
1357
                    Search
1348
                END;
1358
                END;
1349
                EditBox_SetFocus(FindEdit, TRUE);
1359
                EditBox_SetFocus(FindEdit, TRUE);
1350
                EditBox_SetFocus(ReplaceEdit, FALSE);
1360
                EditBox_SetFocus(ReplaceEdit, FALSE);
1351
                EditBox_SetFocus(GotoEdit, FALSE);
1361
                EditBox_SetFocus(GotoEdit, FALSE);
1352
            ELSIF (T.CTRL IN shift) & (key DIV 65536 = 34) THEN
1362
            ELSIF (T.CTRL IN shift) & (key DIV 65536 = 34) THEN
1353
                key := -1;
1363
                key := -1;
1354
                IF ~search THEN
1364
                IF ~search THEN
1355
                    Search
1365
                    Search
1356
                END;
1366
                END;
1357
                EditBox_SetFocus(GotoEdit, TRUE);
1367
                EditBox_SetFocus(GotoEdit, TRUE);
1358
                EditBox_SetFocus(FindEdit, FALSE);
1368
                EditBox_SetFocus(FindEdit, FALSE);
1359
                EditBox_SetFocus(ReplaceEdit, FALSE)
1369
                EditBox_SetFocus(ReplaceEdit, FALSE)
1360
            END;
1370
            END;
1361
            IF (key # -1) & EditBox_Focus(FindEdit) THEN
1371
            IF (key # -1) & EditBox_Focus(FindEdit) THEN
1362
                box_lib.edit_box_key(FindEdit, key);
1372
                box_lib.edit_box_key(FindEdit, key);
1363
                EditBox_GetValue(FindEdit, new_searchText);
1373
                EditBox_GetValue(FindEdit, new_searchText);
1364
                IF new_searchText # searchText THEN
1374
                IF new_searchText # searchText THEN
1365
                    searchText := new_searchText;
1375
                    searchText := new_searchText;
1366
                    notFound := ~T.search(text, searchText, cs, whole)
1376
                    notFound := ~T.search(text, searchText, cs, whole)
1367
                END
1377
                END
1368
            ELSIF (key # -1) & EditBox_Focus(ReplaceEdit) THEN
1378
            ELSIF (key # -1) & EditBox_Focus(ReplaceEdit) THEN
1369
                box_lib.edit_box_key(ReplaceEdit, key);
1379
                box_lib.edit_box_key(ReplaceEdit, key);
1370
                EditBox_GetValue(ReplaceEdit, replaceText)
1380
                EditBox_GetValue(ReplaceEdit, replaceText)
1371
            ELSIF (key # -1) & EditBox_Focus(GotoEdit) THEN
1381
            ELSIF (key # -1) & EditBox_Focus(GotoEdit) THEN
1372
                IF (key DIV 256) MOD 256 = 13 THEN
1382
                IF (key DIV 256) MOD 256 = 13 THEN
1373
                    goto
1383
                    goto
1374
                ELSE
1384
                ELSE
1375
                    box_lib.edit_box_key(GotoEdit, key)
1385
                    box_lib.edit_box_key(GotoEdit, key)
1376
                END
1386
                END
1377
            ELSIF key # -1 THEN
1387
            ELSIF key # -1 THEN
1378
                CASE key DIV 65536 OF
1388
                CASE key DIV 65536 OF
1379
                |73: key := 33
1389
                |73: key := 33
1380
                |81: key := 34
1390
                |81: key := 34
1381
                |71: key := 36
1391
                |71: key := 36
1382
                |79: key := 35
1392
                |79: key := 35
1383
                |72: key := 38
1393
                |72: key := 38
1384
                |80: key := 40
1394
                |80: key := 40
1385
                |75: key := 37
1395
                |75: key := 37
1386
                |77: key := 39
1396
                |77: key := 39
1387
                |82: key := -1 (* insert *)
1397
                |82: key := -1 (* insert *)
1388
                |83: key := 46
1398
                |83: key := 46
1389
                |59, 60, 62..66, 68, 87, 88: key := -1 (* F1, F2, F4..F8, F10, F11, F12 *)
1399
                |59, 60, 62..66, 68, 87, 88: key := -1 (* F1, F2, F4..F8, F10, F11, F12 *)
1390
                ELSE
1400
                ELSE
1391
                    IF (T.CTRL IN shift) THEN
1401
                    IF (T.CTRL IN shift) THEN
1392
                        CASE key DIV 65536 OF
1402
                        CASE key DIV 65536 OF
1393
                        |21: T.redo(text);
1403
                        |21: T.redo(text);
1394
                             key := -1
1404
                             key := -1
1395
                        |22: key := ORD("U")
1405
                        |22: key := ORD("U")
1396
                        |24: key := -1;
1406
                        |24: key := -1;
1397
                             open
1407
                             open
1398
                        |30: key := ORD("A")
1408
                        |30: key := ORD("A")
1399
                        |31: key := -1;
1409
                        |31: key := -1;
1400
                             save
1410
                             save
1401
                        |38: key := ORD("L")
1411
                        |38: key := ORD("L")
1402
                        |44: T.undo(text);
1412
                        |44: T.undo(text);
1403
                             key := -1
1413
                             key := -1
1404
                        |45: key := ORD("X")
1414
                        |45: key := ORD("X")
1405
                        |46: key := ORD("C")
1415
                        |46: key := ORD("C")
1406
                        |47: key := ORD("V")
1416
                        |47: key := ORD("V")
1407
                        |49: key := -1;
1417
                        |49: key := -1;
1408
                             SelfRun("")
1418
                             SelfRun("")
1409
                        ELSE
1419
                        ELSE
1410
                            key := -1
1420
                            key := -1
1411
                        END
1421
                        END
1412
                    ELSE
1422
                    ELSE
1413
                        T.input(text, E.cp866[key DIV 256 MOD 256]);
1423
                        T.input(text, E.cp866[key DIV 256 MOD 256]);
1414
                        key := -1
1424
                        key := -1
1415
                    END
1425
                    END
1416
                END;
1426
                END;
1417
                IF key # -1 THEN
1427
                IF key # -1 THEN
1418
                    T.key(text, key, shift)
1428
                    T.key(text, key, shift)
1419
                END
1429
                END
1420
            END;
1430
            END;
1421
            repaint
1431
            repaint
1422
        |3:
1432
        |3:
1423
            CASE K.ButtonCode() OF
1433
            CASE K.ButtonCode() OF
1424
            |0:
1434
            |0:
1425
 
1435
 
1426
            |btnFile:
1436
            |btnFile:
1427
                ShowMenu(menuFile)
1437
                ShowMenu(menuFile)
1428
            |btnEdit:
1438
            |btnEdit:
1429
                ShowMenu(menuEdit)
1439
                ShowMenu(menuEdit)
1430
            |btnEncoding:
1440
            |btnEncoding:
1431
                ShowMenu(menuEncoding)
1441
                ShowMenu(menuEncoding)
1432
            |btnView:
1442
            |btnView:
1433
                ShowMenu(menuView)
1443
                ShowMenu(menuView)
1434
            |btnSyntax:
1444
            |btnSyntax:
1435
                ShowMenu(menuSyntax)
1445
                ShowMenu(menuSyntax)
1436
            |btnProgram:
1446
            |btnProgram:
1437
                ShowMenu(menuProgram)
1447
                ShowMenu(menuProgram)
1438
            |btnTools:
1448
            |btnTools:
1439
                ShowMenu(menuTools)
1449
                ShowMenu(menuTools)
1440
            |btnNo:
1450
            |btnNo:
1441
                K.Exit
1451
                K.Exit
1442
            |btnYes:
1452
            |btnYes:
1443
                save;
1453
                save;
1444
                IF ~text.modified THEN
1454
                IF ~text.modified THEN
1445
                    K.Exit
1455
                    K.Exit
1446
                END;
1456
                END;
1447
                repaint
1457
                repaint
1448
            |btnClose:
1458
            |btnClose:
1449
                close
1459
                close
1450
            |btnNew:
1460
            |btnNew:
1451
                SelfRun("")
1461
                SelfRun("")
1452
            |btnOpen:
1462
            |btnOpen:
1453
                open
1463
                open
1454
            |btnSave:
1464
            |btnSave:
1455
                save;
1465
                save;
1456
                repaint
1466
                repaint
1457
            |btnSearch:
1467
            |btnSearch:
1458
                IF ~search THEN
1468
                IF ~search THEN
1459
                    Search
1469
                    Search
1460
                END
1470
                END
1461
            |btnCloseFind:
1471
            |btnCloseFind:
1462
                Search
1472
                Search
1463
            |btnUndo:
1473
            |btnUndo:
1464
                T.undo(text);
1474
                T.undo(text);
1465
                repaint
1475
                repaint
1466
            |btnRedo:
1476
            |btnRedo:
1467
                T.redo(text);
1477
                T.redo(text);
1468
                repaint
1478
                repaint
1469
            |btnUpper:
1479
            |btnUpper:
1470
                T.chCase(text, TRUE);
1480
                T.chCase(text, TRUE);
1471
                repaint
1481
                repaint
1472
            |btnLower:
1482
            |btnLower:
1473
                T.chCase(text, FALSE);
1483
                T.chCase(text, FALSE);
1474
                repaint
1484
                repaint
1475
            |btnBuild:
1485
            |btnBuild:
1476
                Script(buildScript)
1486
                Script(buildScript)
1477
            |btnRun:
1487
            |btnRun:
1478
                Script(runScript)
1488
                Script(runScript)
1479
            |btnUp:
1489
            |btnUp:
1480
                T.scroll(text, 0, -1);
1490
                T.scroll(text, 0, -1);
1481
                repaint
1491
                repaint
1482
            |btnDown:
1492
            |btnDown:
1483
                T.scroll(text, 0, 1);
1493
                T.scroll(text, 0, 1);
1484
                repaint
1494
                repaint
1485
            |btnLeft:
1495
            |btnLeft:
1486
                T.scroll(text, -1, 0);
1496
                T.scroll(text, -1, 0);
1487
                repaint
1497
                repaint
1488
            |btnRight:
1498
            |btnRight:
1489
                T.scroll(text, 1, 0);
1499
                T.scroll(text, 1, 0);
1490
                repaint
1500
                repaint
1491
            |btnFindEdit:
1501
            |btnFindEdit:
1492
                EditBox_SetFocus(FindEdit, TRUE);
1502
                EditBox_SetFocus(FindEdit, TRUE);
1493
                EditBox_SetFocus(ReplaceEdit, FALSE);
1503
                EditBox_SetFocus(ReplaceEdit, FALSE);
1494
                EditBox_SetFocus(GotoEdit, FALSE)
1504
                EditBox_SetFocus(GotoEdit, FALSE)
1495
            |btnReplaceEdit:
1505
            |btnReplaceEdit:
1496
                EditBox_SetFocus(ReplaceEdit, TRUE);
1506
                EditBox_SetFocus(ReplaceEdit, TRUE);
1497
                EditBox_SetFocus(FindEdit, FALSE);
1507
                EditBox_SetFocus(FindEdit, FALSE);
1498
                EditBox_SetFocus(GotoEdit, FALSE)
1508
                EditBox_SetFocus(GotoEdit, FALSE)
1499
            |btnGotoEdit:
1509
            |btnGotoEdit:
1500
                EditBox_SetFocus(GotoEdit, TRUE);
1510
                EditBox_SetFocus(GotoEdit, TRUE);
1501
                EditBox_SetFocus(FindEdit, FALSE);
1511
                EditBox_SetFocus(FindEdit, FALSE);
1502
                EditBox_SetFocus(ReplaceEdit, FALSE)
1512
                EditBox_SetFocus(ReplaceEdit, FALSE)
1503
            |btnFindNext:
1513
            |btnFindNext:
1504
                IF searchText # "" THEN
1514
                IF searchText # "" THEN
1505
                    notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW));
1515
                    notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW));
1506
                    repaint
1516
                    repaint
1507
                END
1517
                END
1508
            |btnReplace:
1518
            |btnReplace:
1509
                T.replace(text, replaceText, LENGTH(searchText));
1519
                T.replace(text, replaceText, LENGTH(searchText));
1510
                repaint
1520
                repaint
1511
            |btnReplaceAll:
1521
            |btnReplaceAll:
1512
                notFound := ~T.search(text, searchText, cs, whole);
1522
                notFound := ~T.search(text, searchText, cs, whole);
1513
                IF ~notFound THEN
1523
                IF ~notFound THEN
1514
                    replaced := T.replaceAll(text, replaceText, LENGTH(searchText));
1524
                    replaced := T.replaceAll(text, replaceText, LENGTH(searchText));
1515
                END;
1525
                END;
1516
                repaint
1526
                repaint
1517
            |btnGoto:
1527
            |btnGoto:
1518
                goto;
1528
                goto;
1519
                repaint
1529
                repaint
1520
            END
1530
            END
1521
        |6:
1531
        |6:
1522
            Menu.close(menuFile);
1532
            Menu.close(menuFile);
1523
            Menu.close(menuEdit);
1533
            Menu.close(menuEdit);
1524
            Menu.close(menuEncoding);
1534
            Menu.close(menuEncoding);
1525
            Menu.close(menuView);
1535
            Menu.close(menuView);
1526
            Menu.close(menuSyntax);
1536
            Menu.close(menuSyntax);
1527
            Menu.close(menuProgram);
1537
            Menu.close(menuProgram);
1528
            Menu.close(menuTools);
1538
            Menu.close(menuTools);
1529
            Menu.close(context);
1539
            Menu.close(context);
1530
            IF ~resized THEN
1540
            IF ~resized THEN
1531
                getKBState;
1541
                getKBState;
1532
                msState := K.MouseState();
1542
                msState := K.MouseState();
1533
                IF ~(0 IN msState) OR (16 IN msState) THEN
1543
                IF ~(0 IN msState) OR (16 IN msState) THEN
1534
                    LeftButtonUp
1544
                    LeftButtonUp
1535
                END;
1545
                END;
1536
                scroll := K.Scroll();
1546
                scroll := K.Scroll();
1537
                IF scroll # 0 THEN
1547
                IF scroll # 0 THEN
1538
                    T.scroll(text, 0, scroll*3);
1548
                    T.scroll(text, 0, scroll*3);
1539
                    repaint
1549
                    repaint
1540
                END;
1550
                END;
1541
                IF leftButton THEN
1551
                IF leftButton THEN
1542
                    IF K.GetTickCount() - time > 9 THEN
1552
                    IF K.GetTickCount() - time > 9 THEN
1543
                        mouse(x, y);
1553
                        mouse(x, y);
1544
                        T.mouse(text, x, y);
1554
                        T.mouse(text, x, y);
1545
                        repaint
1555
                        repaint
1546
                    END
1556
                    END
1547
                END;
1557
                END;
1548
                IF VScroll THEN
1558
                IF VScroll THEN
1549
                    mouse(x, y);
1559
                    mouse(x, y);
1550
                    Scroll.mouse(vScroll, x, y - scrollWidth);
1560
                    Scroll.mouse(vScroll, x, y - scrollWidth);
1551
                    T.getScroll(text, scrollX, scrollY);
1561
                    T.getScroll(text, scrollX, scrollY);
1552
                    T.scroll(text, 0, vScroll.value - scrollY);
1562
                    T.scroll(text, 0, vScroll.value - scrollY);
1553
                    repaint
1563
                    repaint
1554
                END;
1564
                END;
1555
                IF HScroll THEN
1565
                IF HScroll THEN
1556
                    mouse(x, y);
1566
                    mouse(x, y);
1557
                    Scroll.mouse(hScroll, x - scrollWidth, y);
1567
                    Scroll.mouse(hScroll, x - scrollWidth, y);
1558
                    T.getScroll(text, scrollX, scrollY);
1568
                    T.getScroll(text, scrollX, scrollY);
1559
                    T.scroll(text, hScroll.value - scrollX, 0);
1569
                    T.scroll(text, hScroll.value - scrollX, 0);
1560
                    repaint
1570
                    repaint
1561
                END;
1571
                END;
1562
                IF (8 IN msState) & ~(24 IN msState) THEN
1572
                IF (8 IN msState) & ~(24 IN msState) THEN
1563
                    mouse(firstClickX, firstClickY);
1573
                    mouse(firstClickX, firstClickY);
1564
                    time := click(firstClickX, firstClickY)
1574
                    time := click(firstClickX, firstClickY)
1565
                END;
1575
                END;
1566
                IF 9 IN msState THEN
1576
                IF 9 IN msState THEN
1567
                    ShowMenu(context)
1577
                    ShowMenu(context)
1568
                END;
1578
                END;
1569
                IF 24 IN msState THEN
1579
                IF 24 IN msState THEN
1570
                    mouse(x, y);
1580
                    mouse(x, y);
1571
                    IF (ABS(x - firstClickX) < 5) & (ABS(y - firstClickY) < 5) THEN
1581
                    IF (ABS(x - firstClickX) < 5) & (ABS(y - firstClickY) < 5) THEN
1572
                        VScroll := FALSE;
1582
                        VScroll := FALSE;
1573
                        HScroll := FALSE;
1583
                        HScroll := FALSE;
1574
                        IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
1584
                        IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
1575
                            leftButton := FALSE;
1585
                            leftButton := FALSE;
1576
                            T.selectWord(text);
1586
                            T.selectWord(text);
1577
                            repaint
1587
                            repaint
1578
                        END
1588
                        END
1579
                    ELSE
1589
                    ELSE
1580
                        firstClickX := x;
1590
                        firstClickX := x;
1581
                        firstClickY := y;
1591
                        firstClickY := y;
1582
                        time := click(firstClickX, firstClickY)
1592
                        time := click(firstClickX, firstClickY)
1583
                    END
1593
                    END
1584
                END
1594
                END
1585
            END;
1595
            END;
1586
            IF search THEN
1596
            IF search THEN
1587
                IF EditBox_Focus(FindEdit) THEN
1597
                IF EditBox_Focus(FindEdit) THEN
1588
                    box_lib.edit_box_mouse(FindEdit)
1598
                    box_lib.edit_box_mouse(FindEdit)
1589
                END;
1599
                END;
1590
                IF EditBox_Focus(ReplaceEdit) THEN
1600
                IF EditBox_Focus(ReplaceEdit) THEN
1591
                    box_lib.edit_box_mouse(ReplaceEdit)
1601
                    box_lib.edit_box_mouse(ReplaceEdit)
1592
                END;
1602
                END;
1593
                IF EditBox_Focus(GotoEdit) THEN
1603
                IF EditBox_Focus(GotoEdit) THEN
1594
                    box_lib.edit_box_mouse(GotoEdit)
1604
                    box_lib.edit_box_mouse(GotoEdit)
1595
                END;
1605
                END;
1596
                box_lib.check_box_mouse2(CS);
1606
                box_lib.check_box_mouse2(CS);
1597
                box_lib.check_box_mouse2(WH);
1607
                box_lib.check_box_mouse2(WH);
1598
                box_lib.check_box_mouse2(BKW);
1608
                box_lib.check_box_mouse2(BKW);
1599
                IF box_lib.check_box_get_value(CS) # cs THEN
1609
                IF box_lib.check_box_get_value(CS) # cs THEN
1600
                    cs := ~cs;
1610
                    cs := ~cs;
1601
                    notFound := ~T.search(text, searchText, cs, whole);
1611
                    notFound := ~T.search(text, searchText, cs, whole);
1602
                    repaint
1612
                    repaint
1603
                END;
1613
                END;
1604
                IF box_lib.check_box_get_value(WH) # whole THEN
1614
                IF box_lib.check_box_get_value(WH) # whole THEN
1605
                    whole := ~whole;
1615
                    whole := ~whole;
1606
                    notFound := ~T.search(text, searchText, cs, whole);
1616
                    notFound := ~T.search(text, searchText, cs, whole);
1607
                    repaint
1617
                    repaint
1608
                END
1618
                END
1609
            END;
1619
            END;
1610
            resized := FALSE
1620
            resized := FALSE
1611
        |7: receiveIPC
1621
        |7: receiveIPC
1612
        ELSE
1622
        ELSE
1613
        END
1623
        END
1614
    END
1624
    END
1615
END main;
1625
END main;
1616
 
1626
 
1617
 
1627
 
1618
BEGIN
1628
BEGIN
1619
    main
1629
    main
1620
END CEdit.
1630
END CEdit.