Subversion Repositories Kolibri OS

Rev

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

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