Subversion Repositories Kolibri OS

Rev

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

Rev 9180 Rev 9181
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, Tabs, Timer;
28
    RW, Ini, box_lib, Icons, Tabs, Timer;
29
 
29
 
30
CONST
30
CONST
31
    header = "CEdit (06-sep-2021)";
31
    header = "CEdit (07-sep-2021)";
32
 
32
 
33
    ShellFilter = "";
33
    ShellFilter = "";
34
    EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI|JSON";
34
    EditFilter = "SH|ASM|TXT|INC|OB07|C|CPP|H|PAS|PP|LUA|INI|JSON";
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
 
51
 
52
    btnYes = 40;
52
    btnYes = 40;
53
    btnNo = 41;
53
    btnNo = 41;
54
    btnFindNext = 60;
54
    btnFindNext = 60;
55
    btnReplace = 61;
55
    btnReplace = 61;
56
    btnReplaceAll = 62;
56
    btnReplaceAll = 62;
57
    btnGoto = 63;
57
    btnGoto = 63;
58
    btnCloseFind = 64;
58
    btnCloseFind = 64;
59
    btnHideFind = 65;
59
    btnHideFind = 65;
60
 
60
 
61
    btnFile = 70;
61
    btnFile = 70;
62
    btnEdit = 71;
62
    btnEdit = 71;
63
    btnMenuSearch = 72;
63
    btnMenuSearch = 72;
64
    btnEncoding = 73;
64
    btnEncoding = 73;
65
    btnEOL = 74;
65
    btnEOL = 74;
66
    btnView = 75;
66
    btnView = 75;
67
    btnSyntax = 76;
67
    btnSyntax = 76;
68
    btnProgram = 77;
68
    btnProgram = 77;
69
    btnTools = 78;
69
    btnTools = 78;
70
 
70
 
71
    MainMenuHeight = fontHeight + 7;
71
    MainMenuHeight = fontHeight + 7;
72
 
72
 
73
    btnHeight = 25;
73
    btnHeight = 25;
74
    btnWidth = 75;
74
    btnWidth = 75;
75
    btnTop = MainMenuHeight + 3;
75
    btnTop = MainMenuHeight + 3;
76
    toolBtnSize = 24;
76
    toolBtnSize = 24;
77
    toolbarDelim = 7;
77
    toolbarDelim = 7;
78
    iconPad = (toolBtnSize - Icons.SIZE) DIV 2;
78
    iconPad = (toolBtnSize - Icons.SIZE) DIV 2;
79
 
79
 
80
    TOP = btnTop + toolBtnSize + 10 + Tabs.tabHeight;
80
    TOP = btnTop + toolBtnSize + 10 + Tabs.tabHeight;
81
    RIGHT = scrollWidth - 2;
81
    RIGHT = scrollWidth - 2;
82
    BOTTOM = scrollWidth + 18;
82
    BOTTOM = scrollWidth + 18;
83
 
83
 
84
    minWinWidth = 635; minWinHeight = 538;
84
    minWinWidth = 635; minWinHeight = 550;
85
 
85
 
86
    SEARCH_PADDING = 10;
86
    SEARCH_PADDING = 10;
87
    searchLeft = 0;
87
    searchLeft = 0;
88
    EditBox_Width = 180;
88
    EditBox_Width = 180;
89
    EDITBOX_MAXCHARS = 500;
89
    EDITBOX_MAXCHARS = 500;
90
 
90
 
91
    menuFileX = searchLeft;
91
    menuFileX = searchLeft;
92
    menuEditX = menuFileX + 4*fontWidth + 2 + 7;
92
    menuEditX = menuFileX + 4*fontWidth + 2 + 7;
93
    menuSearchX = menuEditX + 4*fontWidth + 2 + 7;
93
    menuSearchX = menuEditX + 4*fontWidth + 2 + 7;
94
    menuEncodingX = menuSearchX + 6*fontWidth + 2 + 7;
94
    menuEncodingX = menuSearchX + 6*fontWidth + 2 + 7;
95
    menuEOLX = menuEncodingX + 8*fontWidth + 2 + 7;
95
    menuEOLX = menuEncodingX + 8*fontWidth + 2 + 7;
96
    menuViewX = menuEOLX + 3*fontWidth + 2 + 7;
96
    menuViewX = menuEOLX + 3*fontWidth + 2 + 7;
97
    menuSyntaxX = menuViewX + 4*fontWidth + 2 + 7;
97
    menuSyntaxX = menuViewX + 4*fontWidth + 2 + 7;
98
    menuProgramX = menuSyntaxX + 6*fontWidth + 2 + 7;
98
    menuProgramX = menuSyntaxX + 6*fontWidth + 2 + 7;
99
    menuToolsX = menuProgramX + 7*fontWidth + 2 + 7;
99
    menuToolsX = menuProgramX + 7*fontWidth + 2 + 7;
100
 
100
 
101
    menuCut = 1;
101
    menuCut = 1;
102
    menuCopy = 2;
102
    menuCopy = 2;
103
    menuPaste = 3;
103
    menuPaste = 3;
104
    menuDelete = 4;
104
    menuDelete = 4;
105
    menuSelectAll = 5;
105
    menuSelectAll = 5;
106
 
106
 
107
    menuUndo = 6;
107
    menuUndo = 6;
108
    menuRedo = 7;
108
    menuRedo = 7;
109
 
109
 
110
    menuCurLine = 100;
110
    menuCurLine = 100;
111
    menuIndent = 110;
111
    menuIndent = 110;
112
    menuCase = 120;
112
    menuCase = 120;
113
 
113
 
114
    menuNew = 10;
114
    menuNew = 10;
115
    menuOpen = 11;
115
    menuOpen = 11;
116
    menuSave = 12;
116
    menuSave = 12;
117
    menuSaveAs = 13;
117
    menuSaveAs = 13;
118
    menuSaveAll = 14;
118
    menuSaveAll = 14;
119
    menuFolder = 15;
119
    menuFolder = 15;
120
    menuClose = 16;
120
    menuClose = 16;
121
    menuExit = 17;
121
    menuExit = 17;
122
 
122
 
123
    menuNumbers = 20;
123
    menuNumbers = 20;
124
    menuFontSize = 21;
124
    menuFontSize = 21;
125
    menuColors = 1000;
125
    menuColors = 1000;
126
    menuMaxColors = menuColors + Ini.MAX_SECTIONS - 1;
126
    menuMaxColors = menuColors + Ini.MAX_SECTIONS - 1;
127
 
127
 
128
    menuNone = 30;
128
    menuNone = 30;
129
    menuC = 31;
129
    menuC = 31;
130
    menuFasm = 32;
130
    menuFasm = 32;
131
    menuIni = 33;
131
    menuIni = 33;
132
    menuJSON = 34;
132
    menuJSON = 34;
133
    menuLua = 35;
133
    menuLua = 35;
134
    menuOberon = 36;
134
    menuOberon = 36;
135
    menuPascal = 37;
135
    menuPascal = 37;
136
 
136
 
137
    menuBuild = 50;
137
    menuBuild = 50;
138
    menuBuildScript = 51;
138
    menuBuildScript = 51;
139
    menuRun = 52;
139
    menuRun = 52;
140
    menuRunScript = 53;
140
    menuRunScript = 53;
141
    menuDebug = 54;
141
    menuDebug = 54;
142
    menuDebugScript = 55;
142
    menuDebugScript = 55;
143
 
143
 
144
    menuUTF8BOM = 60;
144
    menuUTF8BOM = 60;
145
    menuUTF8 = 61;
145
    menuUTF8 = 61;
146
    menuCP866 = 62;
146
    menuCP866 = 62;
147
    menuWin1251 = 63;
147
    menuWin1251 = 63;
148
 
148
 
149
    menuPipet = 70;
149
    menuPipet = 70;
150
    menuBoard = 71;
150
    menuBoard = 71;
151
    menuSysFunc = 72;
151
    menuSysFunc = 72;
152
 
152
 
153
    menuFind = 80;
153
    menuFind = 80;
154
    menuFindNext = 81;
154
    menuFindNext = 81;
155
    menuFindPrev = 82;
155
    menuFindPrev = 82;
156
    menuGoto = 83;
156
    menuGoto = 83;
157
    menuBookmark = 130;
157
    menuBookmark = 130;
158
 
158
 
159
    menuMoveUp = 101;
159
    menuMoveUp = 101;
160
    menuMoveDown = 102;
160
    menuMoveDown = 102;
161
    menuDuplicate = 103;
161
    menuDuplicate = 103;
162
    menuRemove = 104;
162
    menuRemove = 104;
163
 
163
 
164
    menuIncInd = 111;
164
    menuIncInd = 111;
165
    menuDecInd = 112;
165
    menuDecInd = 112;
166
 
166
 
167
    menuUpper = 121;
167
    menuUpper = 121;
168
    menuLower = 122;
168
    menuLower = 122;
169
 
169
 
170
    menuToggleBookmark = 131;
170
    menuToggleBookmark = 131;
171
    menuNextBookmark = 132;
171
    menuNextBookmark = 132;
172
    menuPrevBookmark = 133;
172
    menuPrevBookmark = 133;
173
 
173
 
174
    menuLF = 140;
174
    menuLF = 140;
175
    menuCRLF = 141;
175
    menuCRLF = 141;
176
    menuCR = 142;
176
    menuCR = 142;
177
 
177
 
178
    maxTexts = 32;
178
    maxTexts = 32;
179
    scrollDelay = 40;
179
    scrollDelay = 40;
180
 
180
 
181
 
181
 
182
VAR
182
VAR
183
    canvas: G.tCanvas;
183
    canvas: G.tCanvas;
184
    font, font1, font2: G.tFont;
184
    font, font1, font2: G.tFont;
185
 
185
 
186
    tabs: Tabs.tTabs;
186
    tabs: Tabs.tTabs;
187
    text: T.tText;
187
    text: T.tText;
188
    texts: ARRAY maxTexts OF T.tText;
188
    texts: ARRAY maxTexts OF T.tText;
189
    textsCount, curText: INTEGER;
189
    textsCount, curText: INTEGER;
190
 
190
 
191
    winWidth, winHeight: INTEGER;
191
    winWidth, winHeight: INTEGER;
192
    AppPath, runScript, buildScript, debugScript: RW.tFileName;
192
    AppPath, runScript, buildScript, debugScript: RW.tFileName;
193
    OD: OpenDlg.Dialog;
193
    OD: OpenDlg.Dialog;
194
    confirm, notFound, menuFindClicked, search, searchOpened, modified: BOOLEAN;
194
    confirm, notFound, menuFindClicked, search, searchOpened, modified: BOOLEAN;
195
 
195
 
196
    switch, closing: BOOLEAN;
196
    switch, closing: BOOLEAN;
197
    leftButton: BOOLEAN;
197
    leftButton: BOOLEAN;
198
    hScroll, vScroll: Scroll.tScroll;
198
    hScroll, vScroll: Scroll.tScroll;
199
    LEFT: INTEGER;
199
    LEFT: INTEGER;
200
 
200
 
201
    FindEdit, ReplaceEdit, GotoEdit: box_lib.edit_box;
201
    FindEdit, ReplaceEdit, GotoEdit: box_lib.edit_box;
202
    CS, WH, BKW: box_lib.checkbox;
202
    CS, WH, BKW: box_lib.checkbox;
203
 
203
 
204
    new_searchText, searchText, replaceText, gotoText: T.tString;
204
    new_searchText, searchText, replaceText, gotoText: T.tString;
205
    cs, whole: BOOLEAN;
205
    cs, whole: BOOLEAN;
206
 
206
 
207
    replaced: INTEGER;
207
    replaced: INTEGER;
208
 
208
 
209
    mainTID, delay: INTEGER;
209
    mainTID, delay: INTEGER;
210
 
210
 
211
    context, menuFile, menuEdit, menuSearch, menuEncoding,
211
    context, menuFile, menuEdit, menuSearch, menuEncoding,
212
    menuEOL, menuView, menuSyntax, menuProgram, menuTools,
212
    menuEOL, menuView, menuSyntax, menuProgram, menuTools,
213
    subCurLine, subIndent, subCase, subBookmark: Menu.tMenu;
213
    subCurLine, subIndent, subCase, subBookmark: Menu.tMenu;
214
 
214
 
215
    menuActive: BOOLEAN;
215
    menuActive: BOOLEAN;
216
 
216
 
217
    icons: INTEGER;
217
    icons: INTEGER;
218
    grayIcons: INTEGER;
218
    grayIcons: INTEGER;
219
 
219
 
220
    IPC: ARRAY 64 OF INTEGER;
220
    IPC: ARRAY 64 OF INTEGER;
221
 
221
 
222
 
222
 
223
PROCEDURE WritePos (y: INTEGER);
223
PROCEDURE WritePos (y: INTEGER);
224
VAR
224
VAR
225
    s1, s2: ARRAY 32 OF WCHAR;
225
    s1, s2: ARRAY 32 OF WCHAR;
226
    line, col: INTEGER;
226
    line, col: INTEGER;
227
BEGIN
227
BEGIN
228
    T.getPos(text, col, line);
228
    T.getPos(text, col, line);
229
    U.int2str(line, s1);
229
    U.int2str(line, s1);
230
    U.int2str(col, s2);
230
    U.int2str(col, s2);
231
    U.append(s1, ": ");
231
    U.append(s1, ": ");
232
    U.append(s1, s2);
232
    U.append(s1, s2);
233
    K.DrawText(LEFT, y, K.textColor, s1)
233
    K.DrawText(LEFT, y, K.textColor, s1)
234
END WritePos;
234
END WritePos;
235
 
235
 
236
 
236
 
237
PROCEDURE EditBox_Focus (edit: box_lib.edit_box): BOOLEAN;
237
PROCEDURE EditBox_Focus (edit: box_lib.edit_box): BOOLEAN;
238
VAR
238
VAR
239
	res: BOOLEAN;
239
	res: BOOLEAN;
240
BEGIN
240
BEGIN
241
	res := FALSE;
241
	res := FALSE;
242
	IF edit # NIL THEN
242
	IF edit # NIL THEN
243
	    res := 1 IN BITS(edit.flags)
243
	    res := 1 IN BITS(edit.flags)
244
	END
244
	END
245
	RETURN res
245
	RETURN res
246
END EditBox_Focus;
246
END EditBox_Focus;
247
 
247
 
248
 
248
 
249
PROCEDURE resetTimer;
249
PROCEDURE resetTimer;
250
BEGIN
250
BEGIN
251
	IF EditBox_Focus(FindEdit) OR EditBox_Focus(ReplaceEdit) OR EditBox_Focus(GotoEdit) THEN
251
	IF EditBox_Focus(FindEdit) OR EditBox_Focus(ReplaceEdit) OR EditBox_Focus(GotoEdit) THEN
252
		T.hideCursor;
252
		T.hideCursor;
253
		Timer.stop
253
		Timer.kill
254
	ELSE
254
	ELSE
255
		T.showCursor;
255
		T.showCursor;
256
		Timer.reset
256
		Timer.create(mainTID)
257
	END
257
	END
258
END resetTimer;
258
END resetTimer;
259
 
259
 
260
 
260
 
261
PROCEDURE EditBox_SetFocus (edit: box_lib.edit_box; value: BOOLEAN);
261
PROCEDURE EditBox_SetFocus (edit: box_lib.edit_box; value: BOOLEAN);
262
BEGIN
262
BEGIN
263
    IF value THEN
263
    IF value THEN
264
        edit.flags := ORD(BITS(edit.flags) + {1})
264
        edit.flags := ORD(BITS(edit.flags) + {1})
265
    ELSE
265
    ELSE
266
        edit.flags := ORD(BITS(edit.flags) - {1})
266
        edit.flags := ORD(BITS(edit.flags) - {1})
267
    END;
267
    END;
268
    IF search & searchOpened THEN
268
    IF search & searchOpened THEN
269
        box_lib.edit_box_draw(edit)
269
        box_lib.edit_box_draw(edit)
270
    END
270
    END
271
END EditBox_SetFocus;
271
END EditBox_SetFocus;
272
 
272
 
273
 
273
 
274
PROCEDURE SetFocus (edit: box_lib.edit_box; value: BOOLEAN);
274
PROCEDURE SetFocus (edit: box_lib.edit_box; value: BOOLEAN);
275
BEGIN
275
BEGIN
276
    EditBox_SetFocus(FindEdit, FALSE);
276
    EditBox_SetFocus(FindEdit, FALSE);
277
    EditBox_SetFocus(ReplaceEdit, FALSE);
277
    EditBox_SetFocus(ReplaceEdit, FALSE);
278
    EditBox_SetFocus(GotoEdit, FALSE);
278
    EditBox_SetFocus(GotoEdit, FALSE);
279
    EditBox_SetFocus(edit, value);
279
    EditBox_SetFocus(edit, value);
280
  	resetTimer
280
  	resetTimer
281
END SetFocus;
281
END SetFocus;
282
 
282
 
283
 
283
 
284
PROCEDURE Rect (left, top, right, bottom, color: INTEGER);
284
PROCEDURE Rect (left, top, right, bottom, color: INTEGER);
285
BEGIN
285
BEGIN
286
    K.DrawLine(left, top, right, top, color);
286
    K.DrawLine(left, top, right, top, color);
287
    K.DrawLine(left, bottom, right, bottom, color);
287
    K.DrawLine(left, bottom, right, bottom, color);
288
    K.DrawLine(left, top, left, bottom, color);
288
    K.DrawLine(left, top, left, bottom, color);
289
    K.DrawLine(right, top, right, bottom, color);
289
    K.DrawLine(right, top, right, bottom, color);
290
END Rect;
290
END Rect;
291
 
291
 
292
 
292
 
293
PROCEDURE Message (s: ARRAY OF WCHAR);
293
PROCEDURE Message (s: ARRAY OF WCHAR);
294
CONST
294
CONST
295
    minWidth = 30;
295
    minWidth = 30;
296
    height = 40;
296
    height = 40;
297
    borderColor = 808080H;
297
    borderColor = 808080H;
298
VAR
298
VAR
299
    top, left, right, bottom, x, y, width: INTEGER;
299
    top, left, right, bottom, x, y, width: INTEGER;
300
BEGIN
300
BEGIN
301
	Timer.stop;
301
	Timer.kill;
302
    width := minWidth + LENGTH(s)*fontWidth;
302
    width := minWidth + LENGTH(s)*fontWidth;
303
    left := (canvas.width - width) DIV 2 + LEFT;
303
    left := (canvas.width - width) DIV 2 + LEFT;
304
    top := (canvas.height - height) DIV 2 + TOP;
304
    top := (canvas.height - height) DIV 2 + TOP;
305
    bottom := top + height - 1;
305
    bottom := top + height - 1;
306
    right := left + width - 1;
306
    right := left + width - 1;
307
    x := minWidth DIV 2 + left;
307
    x := minWidth DIV 2 + left;
308
    y := (height - fontHeight) DIV 2 + top;
308
    y := (height - fontHeight) DIV 2 + top;
309
    K.DrawRect(left, top, width, height, K.winColor);
309
    K.DrawRect(left, top, width, height, K.winColor);
310
    Rect(left, top, right, bottom, borderColor);
310
    Rect(left, top, right, bottom, borderColor);
311
    K.DrawText(x, y, K.textColor, s);
311
    K.DrawText(x, y, K.textColor, s);
312
END Message;
312
END Message;
313
 
313
 
314
 
314
 
315
PROCEDURE NotFound;
315
PROCEDURE NotFound;
316
BEGIN
316
BEGIN
317
    IF notFound THEN
317
    IF notFound THEN
318
        Message("not found");
318
        Message("not found");
319
        IF menuFindClicked THEN
319
        IF menuFindClicked THEN
320
        	menuFindClicked := FALSE
320
        	menuFindClicked := FALSE
321
        ELSE
321
        ELSE
322
        	notFound := FALSE
322
        	notFound := FALSE
323
        END;
323
        END;
324
        SetFocus(FindEdit, TRUE)
324
        SetFocus(FindEdit, TRUE)
325
    END
325
    END
326
END NotFound;
326
END NotFound;
327
 
327
 
328
 
328
 
329
PROCEDURE Replaced;
329
PROCEDURE Replaced;
330
VAR
330
VAR
331
    s, s1: ARRAY 32 OF WCHAR;
331
    s, s1: ARRAY 32 OF WCHAR;
332
BEGIN
332
BEGIN
333
    IF replaced # 0 THEN
333
    IF replaced # 0 THEN
334
        s := "replaced: ";
334
        s := "replaced: ";
335
        U.int2str(replaced, s1);
335
        U.int2str(replaced, s1);
336
        U.append(s, s1);
336
        U.append(s, s1);
337
        Message(s);
337
        Message(s);
338
        replaced := 0;
338
        replaced := 0;
339
        SetFocus(FindEdit, TRUE)
339
        SetFocus(FindEdit, TRUE)
340
    END
340
    END
341
END Replaced;
341
END Replaced;
342
 
342
 
343
 
343
 
344
PROCEDURE drawIcon (icons, idx, x: INTEGER);
344
PROCEDURE drawIcon (icons, idx, x: INTEGER);
345
BEGIN
345
BEGIN
346
	Icons.draw(icons, idx, x + iconPad, btnTop + iconPad)
346
	Icons.draw(icons, idx, x + iconPad, btnTop + iconPad)
347
END drawIcon;
347
END drawIcon;
348
 
348
 
349
 
349
 
350
PROCEDURE toolbarIcons;
350
PROCEDURE toolbarIcons;
351
VAR
351
VAR
352
    x, color, ico: INTEGER;
352
    x, color, ico: INTEGER;
353
BEGIN
353
BEGIN
354
    x := searchLeft + (toolBtnSize + 5)*2;
354
    x := searchLeft + (toolBtnSize + 5)*2;
355
    IF text.modified THEN
355
    IF text.modified THEN
356
    	ico := icons
356
    	ico := icons
357
    ELSE
357
    ELSE
358
    	ico := grayIcons
358
    	ico := grayIcons
359
    END;
359
    END;
360
    drawIcon(ico, 5, x);
360
    drawIcon(ico, 5, x);
361
 
361
 
362
    IF text.edition # NIL THEN
362
    IF text.edition # NIL THEN
363
        x := searchLeft + (toolBtnSize + 5)*4 + toolbarDelim*2;
363
        x := searchLeft + (toolBtnSize + 5)*4 + toolbarDelim*2;
364
        IF ChangeLog.isFirstGuard(text.edition) THEN
364
        IF ChangeLog.isFirstGuard(text.edition) THEN
365
        	ico := grayIcons
365
        	ico := grayIcons
366
        ELSE
366
        ELSE
367
        	ico := icons
367
        	ico := icons
368
        END;
368
        END;
369
        drawIcon(ico, 37, x);
369
        drawIcon(ico, 37, x);
370
 
370
 
371
        x := searchLeft + (toolBtnSize + 5)*5 + toolbarDelim*2;
371
        x := searchLeft + (toolBtnSize + 5)*5 + toolbarDelim*2;
372
        IF ChangeLog.isLastGuard(text.edition) THEN
372
        IF ChangeLog.isLastGuard(text.edition) THEN
373
        	ico := grayIcons
373
        	ico := grayIcons
374
        ELSE
374
        ELSE
375
        	ico := icons
375
        	ico := icons
376
        END;
376
        END;
377
        drawIcon(ico, 36, x)
377
        drawIcon(ico, 36, x)
378
    END;
378
    END;
379
 
379
 
380
    IF T.selected(text) THEN
380
    IF T.selected(text) THEN
381
        color := K.caseColor
381
        color := K.caseColor
382
    ELSE
382
    ELSE
383
        color := K.disCaseColor
383
        color := K.disCaseColor
384
    END;
384
    END;
385
 
385
 
386
    x := searchLeft + (toolBtnSize + 5)*6 + toolbarDelim*3;
386
    x := searchLeft + (toolBtnSize + 5)*6 + toolbarDelim*3;
387
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
387
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
388
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "AB");
388
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "AB");
389
    INC(x, toolBtnSize + 5);
389
    INC(x, toolBtnSize + 5);
390
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
390
    K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
391
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "ab");
391
    K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "ab");
392
 
392
 
393
    x := searchLeft + (toolBtnSize + 5)*8 + toolbarDelim*4;
393
    x := searchLeft + (toolBtnSize + 5)*8 + toolbarDelim*4;
394
    IF buildScript # "" THEN
394
    IF buildScript # "" THEN
395
    	ico := icons
395
    	ico := icons
396
    ELSE
396
    ELSE
397
    	ico := grayIcons
397
    	ico := grayIcons
398
    END;
398
    END;
399
	drawIcon(ico, 54, x);
399
	drawIcon(ico, 54, x);
400
 
400
 
401
    INC(x, toolBtnSize + 5);
401
    INC(x, toolBtnSize + 5);
402
    IF runScript # "" THEN
402
    IF runScript # "" THEN
403
    	ico := icons
403
    	ico := icons
404
    ELSE
404
    ELSE
405
    	ico := grayIcons
405
    	ico := grayIcons
406
    END;
406
    END;
407
    drawIcon(ico, 53, x)
407
    drawIcon(ico, 53, x)
408
END toolbarIcons;
408
END toolbarIcons;
409
 
409
 
410
 
410
 
411
PROCEDURE WriteModified (x, y: INTEGER);
411
PROCEDURE WriteModified (x, y: INTEGER);
412
BEGIN
412
BEGIN
413
    modified := text.modified;
413
    modified := text.modified;
414
    K.DrawRect(x, TOP + canvas.height + scrollWidth - 1, 8*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
414
    K.DrawRect(x, TOP + canvas.height + scrollWidth, 8*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
415
    IF modified THEN
415
    IF modified THEN
416
        K.DrawText866(x, y, K.textColor, "modified")
416
        K.DrawText866(x, y, K.textColor, "modified")
417
    END
417
    END
418
END WriteModified;
418
END WriteModified;
419
 
419
 
420
 
420
 
421
PROCEDURE DrawState (text: T.tText; width, height: INTEGER);
421
PROCEDURE DrawState (text: T.tText; width, height: INTEGER);
422
VAR
422
VAR
423
    y, w, x: INTEGER;
423
    y, w, x: INTEGER;
424
BEGIN
424
BEGIN
425
    y := (btnHeight - fontHeight) DIV 2 + btnTop;
425
    y := (btnHeight - fontHeight) DIV 2 + btnTop;
426
    K.DrawRect(width - 32*fontWidth, y, 32*fontWidth, fontHeight, K.winColor);
426
    K.DrawRect(width - 32*fontWidth, y, 32*fontWidth, fontHeight, K.winColor);
427
    w := LENGTH(E.names[text.enc])*fontWidth;
427
    w := LENGTH(E.names[text.enc])*fontWidth;
428
    x := width - w;
428
    x := width - w;
429
    K.DrawText(x, y, K.textColor, E.names[text.enc]);
429
    K.DrawText(x, y, K.textColor, E.names[text.enc]);
430
    w := LENGTH(RW.eolNames[text.eol])*fontWidth;
430
    w := LENGTH(RW.eolNames[text.eol])*fontWidth;
431
    DEC(x, w + 10);
431
    DEC(x, w + 10);
432
    K.DrawText(x, y, K.textColor, RW.eolNames[text.eol]);
432
    K.DrawText(x, y, K.textColor, RW.eolNames[text.eol]);
433
    y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
433
    y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
434
    K.DrawRect(LEFT + 16*fontWidth, TOP + canvas.height + scrollWidth - 1, width - LEFT - 24*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
434
    K.DrawRect(LEFT + 16*fontWidth, TOP + canvas.height + scrollWidth, width - LEFT - 24*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
435
    K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName);
435
    K.DrawText866(LEFT + 16*fontWidth, y, K.textColor, text.fileName);
436
    WriteModified(width - 8*fontWidth, y)
436
    WriteModified(width - 8*fontWidth, y)
437
END DrawState;
437
END DrawState;
438
 
438
 
439
 
439
 
440
PROCEDURE DrawScroll (VAR scroll: Scroll.tScroll; left, top, value, maxVal: INTEGER);
440
PROCEDURE DrawScroll (VAR scroll: Scroll.tScroll; left, top, value, maxVal: INTEGER);
441
BEGIN
441
BEGIN
442
	scroll.maxVal := maxVal;
442
	scroll.maxVal := maxVal;
443
    scroll.left := left;
443
    scroll.left := left;
444
    scroll.top := top;
444
    scroll.top := top;
445
    Scroll.setValue(scroll, value);
445
    Scroll.setValue(scroll, value);
446
    Scroll.paint(scroll)
446
    Scroll.paint(scroll)
447
END DrawScroll;
447
END DrawScroll;
448
 
448
 
449
 
449
 
450
PROCEDURE repaint;
450
PROCEDURE repaint;
451
VAR
451
VAR
452
    width, height, scrollX, scrollY, y: INTEGER;
452
    width, height, scrollX, scrollY, y: INTEGER;
453
BEGIN
453
BEGIN
454
    IF text # NIL THEN
454
    IF text # NIL THEN
455
        IF confirm THEN
455
        IF confirm THEN
456
            K.DeleteButton(btnYes);
456
            K.DeleteButton(btnYes);
457
            K.DeleteButton(btnNo);
457
            K.DeleteButton(btnNo);
458
            confirm := FALSE;
458
            confirm := FALSE;
459
            resetTimer;
459
            resetTimer;
460
            closing := FALSE
460
            closing := FALSE
461
        END;
461
        END;
462
        IF ~search OR (searchText = "") THEN
462
        IF ~search OR (searchText = "") THEN
463
            T.wordSel(text)
463
            T.wordSel(text)
464
        END;
464
        END;
465
        K.ClientSize(width, height);
465
        K.ClientSize(width, height);
466
        IF switch THEN
466
        IF switch THEN
467
            DrawState(text, width, height);
467
            DrawState(text, width, height);
468
            Tabs.draw(tabs);
468
            Tabs.draw(tabs);
469
            IF search & T.search(text, searchText, cs, whole) THEN END;
469
            IF search & T.search(text, searchText, cs, whole) THEN END;
470
            switch := FALSE
470
            switch := FALSE
471
        END;
471
        END;
472
        T.draw(text);
472
        T.draw(text);
473
        y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
473
        y := height - (BOTTOM - scrollWidth) + (BOTTOM - scrollWidth - 16) DIV 2;
474
        K.DrawRect(LEFT, TOP + canvas.height + scrollWidth - 1, 16*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
474
        K.DrawRect(LEFT, TOP + canvas.height + scrollWidth, 16*fontWidth, BOTTOM - scrollWidth + 1, K.winColor);
475
        WritePos(y);
475
        WritePos(y);
476
 
476
 
477
        IF modified # text.modified THEN
477
        IF modified # text.modified THEN
478
            WriteModified(width - 8*fontWidth, y)
478
            WriteModified(width - 8*fontWidth, y)
479
        END;
479
        END;
480
 
480
 
481
        T.getScroll(text, scrollX, scrollY);
481
        T.getScroll(text, scrollX, scrollY);
482
        DrawScroll(vScroll, LEFT + canvas.width - 1, TOP - 1, scrollY, text.count - 1);
482
        DrawScroll(vScroll, LEFT + canvas.width, TOP - 1, scrollY, text.count - 1);
483
        DrawScroll(hScroll, LEFT, TOP + canvas.height - 1, scrollX, text.maxLength);
483
        DrawScroll(hScroll, LEFT, TOP + canvas.height, scrollX, text.maxLength);
484
 
484
 
485
        G.DrawCanvas(canvas, LEFT, TOP);
485
        G.DrawCanvas(canvas, LEFT, TOP);
486
        NotFound;
486
        NotFound;
487
        Replaced;
487
        Replaced;
488
        toolbarIcons
488
        toolbarIcons
489
    END
489
    END
490
END repaint;
490
END repaint;
491
 
491
 
492
 
492
 
493
PROCEDURE resize;
493
PROCEDURE resize;
494
VAR
494
VAR
495
    cliWidth, cliHeight: INTEGER;
495
    cliWidth, cliHeight: INTEGER;
496
BEGIN
496
BEGIN
497
    K.WinSize(winWidth, winHeight);
497
    K.WinSize(winWidth, winHeight);
498
    IF winWidth < minWinWidth THEN
498
    IF winWidth < minWinWidth THEN
499
        winWidth := minWinWidth
499
        winWidth := minWinWidth
500
    END;
500
    END;
501
    IF winHeight < minWinHeight THEN
501
    IF winHeight < minWinHeight THEN
502
        winHeight := minWinHeight
502
        winHeight := minWinHeight
503
    END;
503
    END;
504
    K.SetWinSize(winWidth, winHeight);
504
    K.SetWinSize(winWidth, winHeight);
505
    K.WinSize(winWidth, winHeight);
505
    K.WinSize(winWidth, winHeight);
506
    K.ClientSize(cliWidth, cliHeight);
506
    K.ClientSize(cliWidth, cliHeight);
507
    G.destroy(canvas);
507
    G.destroy(canvas);
508
    canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 1), cliHeight - (TOP + BOTTOM));
508
    canvas := G.CreateCanvas(cliWidth - (LEFT + RIGHT + 2), cliHeight - (TOP + BOTTOM + 1));
509
    Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, cliWidth - (LEFT + RIGHT + 1), Tabs.tabHeight);
509
    Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, cliWidth - (LEFT + RIGHT + 2), Tabs.tabHeight);
510
    G.SetFont(canvas, font);
510
    G.SetFont(canvas, font);
511
    T.setCanvas(canvas);
511
    T.setCanvas(canvas);
512
    T.resize(canvas.width, canvas.height);
512
    T.resize(canvas.width, canvas.height);
513
    Scroll.resize(vScroll, vScroll.width, canvas.height + 1);
513
    Scroll.resize(vScroll, vScroll.width, canvas.height + 2);
514
    Scroll.resize(hScroll, canvas.width, hScroll.height);
514
    Scroll.resize(hScroll, canvas.width + 1, hScroll.height);
515
END resize;
515
END resize;
516
 
516
 
517
 
517
 
518
PROCEDURE SearchPanel (left, top: INTEGER);
518
PROCEDURE SearchPanel (left, top: INTEGER);
519
VAR
519
VAR
520
    y, right, bottom, color: INTEGER;
520
    y, right, bottom, color: INTEGER;
521
BEGIN
521
BEGIN
522
    DEC(top, Tabs.tabHeight);
522
    DEC(top, Tabs.tabHeight);
523
    right := left + EditBox_Width + SEARCH_PADDING*2;
523
    right := left + EditBox_Width + SEARCH_PADDING*2;
524
    bottom := top + 395 + btnHeight + SEARCH_PADDING;
524
    bottom := top + 395 + btnHeight + SEARCH_PADDING;
525
    color := K.borderColor;
525
    color := K.borderColor;
526
    Rect(left, top, right, bottom, color);
526
    Rect(left, top, right, bottom, color);
527
    K.CreateButton(btnCloseFind, right - 20, top, 20, 20, 0EF999FH, "");
527
    K.CreateButton(btnCloseFind, right - 20, top, 20, 20, 0EF999FH, "");
528
    K.DrawLine(right - 14, top + 5, right - 5, top + 14, 0FFFFFFH);
528
    K.DrawLine(right - 14, top + 5, right - 5, top + 14, 0FFFFFFH);
529
    K.DrawLine(right - 15, top + 5, right - 5, top + 15, 0FFFFFFH);
529
    K.DrawLine(right - 15, top + 5, right - 5, top + 15, 0FFFFFFH);
530
    K.DrawLine(right - 15, top + 6, right - 6, top + 15, 0FFFFFFH);
530
    K.DrawLine(right - 15, top + 6, right - 6, top + 15, 0FFFFFFH);
531
    K.DrawLine(right - 15, top + 14, right - 6, top + 5, 0FFFFFFH);
531
    K.DrawLine(right - 15, top + 14, right - 6, top + 5, 0FFFFFFH);
532
    K.DrawLine(right - 15, top + 15, right - 5, top + 5, 0FFFFFFH);
532
    K.DrawLine(right - 15, top + 15, right - 5, top + 5, 0FFFFFFH);
533
    K.DrawLine(right - 14, top + 15, right - 5, top + 6, 0FFFFFFH);
533
    K.DrawLine(right - 14, top + 15, right - 5, top + 6, 0FFFFFFH);
534
 
534
 
535
    K.CreateButton(btnHideFind, right - 40, top, 20, 20, K.btnColor, "");
535
    K.CreateButton(btnHideFind, right - 40, top, 20, 20, K.btnColor, "");
536
    K.DrawLine(right - 34, top + 14, right - 26, top + 14, K.btnTextColor);
536
    K.DrawLine(right - 34, top + 14, right - 26, top + 14, K.btnTextColor);
537
    K.DrawLine(right - 34, top + 15, right - 26, top + 15, K.btnTextColor);
537
    K.DrawLine(right - 34, top + 15, right - 26, top + 15, K.btnTextColor);
538
 
538
 
539
    INC(top, 15);
539
    INC(top, 15);
540
    INC(left, SEARCH_PADDING);
540
    INC(left, SEARCH_PADDING);
541
    K.DrawText866(left, top, K.textColor, "find");
541
    K.DrawText866(left, top, K.textColor, "find");
542
    K.DrawText866(left, top + 55, K.textColor, "replace with");
542
    K.DrawText866(left, top + 55, K.textColor, "replace with");
543
    K.DrawText866(left, top + 330, K.textColor, "go to line");
543
    K.DrawText866(left, top + 330, K.textColor, "go to line");
544
    BKW.top_s := BKW.top_s MOD 65536 + (top + 110) * 65536;
544
    BKW.top_s := BKW.top_s MOD 65536 + (top + 110) * 65536;
545
    CS.top_s := CS.top_s MOD 65536 + (top + 140) * 65536;
545
    CS.top_s := CS.top_s MOD 65536 + (top + 140) * 65536;
546
    WH.top_s := WH.top_s MOD 65536 + (top + 170) * 65536;
546
    WH.top_s := WH.top_s MOD 65536 + (top + 170) * 65536;
547
    BKW.left_s := BKW.left_s MOD 65536 + left * 65536;
547
    BKW.left_s := BKW.left_s MOD 65536 + left * 65536;
548
    CS.left_s := CS.left_s MOD 65536 + left * 65536;
548
    CS.left_s := CS.left_s MOD 65536 + left * 65536;
549
    WH.left_s := WH.left_s MOD 65536 + left * 65536;
549
    WH.left_s := WH.left_s MOD 65536 + left * 65536;
550
    FindEdit.top := top + 20;
550
    FindEdit.top := top + 20;
551
    ReplaceEdit.top := top + 75;
551
    ReplaceEdit.top := top + 75;
552
    GotoEdit.top := top + 350;
552
    GotoEdit.top := top + 350;
553
    FindEdit.left := left;
553
    FindEdit.left := left;
554
    ReplaceEdit.left := left;
554
    ReplaceEdit.left := left;
555
    GotoEdit.left := left;
555
    GotoEdit.left := left;
556
    box_lib.edit_box_draw(FindEdit);
556
    box_lib.edit_box_draw(FindEdit);
557
    box_lib.edit_box_draw(ReplaceEdit);
557
    box_lib.edit_box_draw(ReplaceEdit);
558
    box_lib.edit_box_draw(GotoEdit);
558
    box_lib.edit_box_draw(GotoEdit);
559
    box_lib.check_box_draw2(BKW); K.DrawText866(left + 20, top + 110, K.textColor, "backward");
559
    box_lib.check_box_draw2(BKW); K.DrawText866(left + 20, top + 110, K.textColor, "backward");
560
    box_lib.check_box_draw2(CS); K.DrawText866(left + 20, top + 140, K.textColor, "match case");
560
    box_lib.check_box_draw2(CS); K.DrawText866(left + 20, top + 140, K.textColor, "match case");
561
    box_lib.check_box_draw2(WH); K.DrawText866(left + 20, top + 170, K.textColor, "whole word");
561
    box_lib.check_box_draw2(WH); K.DrawText866(left + 20, top + 170, K.textColor, "whole word");
562
    y := top + 200;
562
    y := top + 200;
563
    K.CreateButton(btnFindNext, left, y, btnWidth, btnHeight, K.btnColor, "next"); INC(y, btnHeight + 10);
563
    K.CreateButton(btnFindNext, left, y, btnWidth, btnHeight, K.btnColor, "next"); INC(y, btnHeight + 10);
564
    K.CreateButton(btnReplace, left, y, btnWidth, btnHeight, K.btnColor, "replace"); INC(y, btnHeight + 10);
564
    K.CreateButton(btnReplace, left, y, btnWidth, btnHeight, K.btnColor, "replace"); INC(y, btnHeight + 10);
565
    K.CreateButton(btnReplaceAll, left, y, btnWidth + 5*fontWidth - 2, btnHeight, K.btnColor, "replace all");
565
    K.CreateButton(btnReplaceAll, left, y, btnWidth + 5*fontWidth - 2, btnHeight, K.btnColor, "replace all");
566
    K.CreateButton(btnGoto, left, top + 380, btnWidth, btnHeight, K.btnColor, "go");
566
    K.CreateButton(btnGoto, left, top + 380, btnWidth, btnHeight, K.btnColor, "go");
567
END SearchPanel;
567
END SearchPanel;
568
 
568
 
569
 
569
 
570
PROCEDURE draw_window;
570
PROCEDURE draw_window;
571
VAR
571
VAR
572
    width, height, x: INTEGER;
572
    width, height, x: INTEGER;
573
 
573
 
574
 
574
 
575
    PROCEDURE drawToolbarBtn (id, x: INTEGER);
575
    PROCEDURE drawToolbarBtn (id, x: INTEGER);
576
    BEGIN
576
    BEGIN
577
        K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
577
        K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor);
578
        K.DrawLine(x, btnTop + toolBtnSize, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
578
        K.DrawLine(x, btnTop + toolBtnSize, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
579
        K.DrawLine(x + toolBtnSize, btnTop, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
579
        K.DrawLine(x + toolBtnSize, btnTop, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor);
580
        K.CreateButton(id + ORD({30}), x, btnTop, toolBtnSize, toolBtnSize, K.btnColor, "");
580
        K.CreateButton(id + ORD({30}), x, btnTop, toolBtnSize, toolBtnSize, K.btnColor, "");
581
    END drawToolbarBtn;
581
    END drawToolbarBtn;
582
 
582
 
583
 
583
 
584
    PROCEDURE drawMainMenu (menu: Menu.tMenu; x: INTEGER; btn: INTEGER; caption: ARRAY OF WCHAR);
584
    PROCEDURE drawMainMenu (menu: Menu.tMenu; x: INTEGER; btn: INTEGER; caption: ARRAY OF WCHAR);
585
    VAR
585
    VAR
586
        menuColor, textColor, n: INTEGER;
586
        menuColor, textColor, n: INTEGER;
587
    BEGIN
587
    BEGIN
588
        IF menu.tid # 0 THEN
588
        IF menu.tid # 0 THEN
589
            menuColor := K.textColor;
589
            menuColor := K.textColor;
590
            textColor := K.winColor
590
            textColor := K.winColor
591
        ELSE
591
        ELSE
592
            menuColor := K.winColor;
592
            menuColor := K.winColor;
593
            textColor := K.textColor
593
            textColor := K.textColor
594
        END;
594
        END;
595
        n := LENGTH(caption);
595
        n := LENGTH(caption);
596
        K.DrawRect(x, 0, n*fontWidth + 2, MainMenuHeight, menuColor);
596
        K.DrawRect(x, 0, n*fontWidth + 2, MainMenuHeight, menuColor);
597
        K.CreateButton(btn + ORD({30}), x, 0, n*fontWidth + 2, MainMenuHeight, K.btnColor, "");
597
        K.CreateButton(btn + ORD({30}), x, 0, n*fontWidth + 2, MainMenuHeight, K.btnColor, "");
598
        K.DrawText(x + 1, (MainMenuHeight - fontHeight) DIV 2 + 1, textColor, caption)
598
        K.DrawText(x + 1, (MainMenuHeight - fontHeight) DIV 2 + 1, textColor, caption)
599
    END drawMainMenu;
599
    END drawMainMenu;
600
 
600
 
601
 
601
 
602
BEGIN
602
BEGIN
603
    K.BeginDraw;
603
    K.BeginDraw;
604
    K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
604
    K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
605
    IF (text # NIL) & ~K.RolledUp() THEN
605
    IF (text # NIL) & ~K.RolledUp() THEN
606
    	IF confirm THEN
606
    	IF confirm THEN
607
    		resetTimer
607
    		resetTimer
608
    	END;
608
    	END;
609
        confirm := FALSE;
609
        confirm := FALSE;
610
        K.ClientSize(width, height);
610
        K.ClientSize(width, height);
611
 
611
 
612
        K.DrawRect(0, 0, width, TOP, K.winColor);
612
        K.DrawRect(0, 0, width, TOP, K.winColor);
613
        K.DrawRect(0, 0, LEFT, height, K.winColor);
613
        K.DrawRect(0, 0, LEFT, height, K.winColor);
614
        K.DrawRect(LEFT + canvas.width - 1, TOP + canvas.height - 1, scrollWidth, scrollWidth, K.winColor);
614
        K.DrawRect(LEFT + canvas.width + 1, TOP + canvas.height, scrollWidth - 1, scrollWidth, K.winColor);
615
 
615
 
616
        drawMainMenu(menuFile, menuFileX, btnFile, "file");
616
        drawMainMenu(menuFile, menuFileX, btnFile, "file");
617
        drawMainMenu(menuEdit, menuEditX, btnEdit, "edit");
617
        drawMainMenu(menuEdit, menuEditX, btnEdit, "edit");
618
        drawMainMenu(menuSearch, menuSearchX, btnMenuSearch, "search");
618
        drawMainMenu(menuSearch, menuSearchX, btnMenuSearch, "search");
619
        drawMainMenu(menuEncoding, menuEncodingX, btnEncoding, "encoding");
619
        drawMainMenu(menuEncoding, menuEncodingX, btnEncoding, "encoding");
620
        drawMainMenu(menuEOL, menuEOLX, btnEOL, "eol");
620
        drawMainMenu(menuEOL, menuEOLX, btnEOL, "eol");
621
        drawMainMenu(menuView, menuViewX, btnView, "view");
621
        drawMainMenu(menuView, menuViewX, btnView, "view");
622
        drawMainMenu(menuSyntax, menuSyntaxX, btnSyntax, "syntax");
622
        drawMainMenu(menuSyntax, menuSyntaxX, btnSyntax, "syntax");
623
        drawMainMenu(menuProgram, menuProgramX, btnProgram, "program");
623
        drawMainMenu(menuProgram, menuProgramX, btnProgram, "program");
624
        drawMainMenu(menuTools, menuToolsX, btnTools, "tools");
624
        drawMainMenu(menuTools, menuToolsX, btnTools, "tools");
625
 
625
 
626
        x := searchLeft;
626
        x := searchLeft;
627
 
627
 
628
        drawToolbarBtn(btnNew, x);
628
        drawToolbarBtn(btnNew, x);
629
        drawIcon(icons, 2, x);
629
        drawIcon(icons, 2, x);
630
        INC(x, toolBtnSize + 5);
630
        INC(x, toolBtnSize + 5);
631
 
631
 
632
        drawToolbarBtn(btnOpen, x);
632
        drawToolbarBtn(btnOpen, x);
633
        drawIcon(icons, 0, x);
633
        drawIcon(icons, 0, x);
634
        INC(x, toolBtnSize + 5);
634
        INC(x, toolBtnSize + 5);
635
 
635
 
636
        drawToolbarBtn(btnSave, x);
636
        drawToolbarBtn(btnSave, x);
637
        INC(x, toolBtnSize + 5 + toolbarDelim);
637
        INC(x, toolBtnSize + 5 + toolbarDelim);
638
 
638
 
639
        drawToolbarBtn(btnSearch, x);
639
        drawToolbarBtn(btnSearch, x);
640
        drawIcon(icons, 49, x);
640
        drawIcon(icons, 49, x);
641
        INC(x, toolBtnSize + 5 + toolbarDelim);
641
        INC(x, toolBtnSize + 5 + toolbarDelim);
642
 
642
 
643
        drawToolbarBtn(btnUndo, x);
643
        drawToolbarBtn(btnUndo, x);
644
        INC(x, toolBtnSize + 5);
644
        INC(x, toolBtnSize + 5);
645
 
645
 
646
        drawToolbarBtn(btnRedo, x);
646
        drawToolbarBtn(btnRedo, x);
647
        INC(x, toolBtnSize + 5 + toolbarDelim);
647
        INC(x, toolBtnSize + 5 + toolbarDelim);
648
 
648
 
649
        drawToolbarBtn(btnUpper, x);
649
        drawToolbarBtn(btnUpper, x);
650
        INC(x, toolBtnSize + 5);
650
        INC(x, toolBtnSize + 5);
651
 
651
 
652
        drawToolbarBtn(btnLower, x);
652
        drawToolbarBtn(btnLower, x);
653
        INC(x, toolBtnSize + 5 + toolbarDelim);
653
        INC(x, toolBtnSize + 5 + toolbarDelim);
654
 
654
 
655
        drawToolbarBtn(btnBuild, x);
655
        drawToolbarBtn(btnBuild, x);
656
        INC(x, toolBtnSize + 5);
656
        INC(x, toolBtnSize + 5);
657
 
657
 
658
        drawToolbarBtn(btnRun, x);
658
        drawToolbarBtn(btnRun, x);
659
        INC(x, toolBtnSize + 5);
659
        INC(x, toolBtnSize + 5);
660
 
660
 
661
        toolbarIcons;
661
        toolbarIcons;
662
 
662
 
663
        DrawState(text, width, height);
663
        DrawState(text, width, height);
664
        IF search & searchOpened THEN
664
        IF search & searchOpened THEN
665
            SearchPanel(searchLeft, TOP)
665
            SearchPanel(searchLeft, TOP)
666
        END;
666
        END;
667
        Tabs.draw(tabs);
667
        Tabs.draw(tabs);
668
        repaint
668
        repaint
669
    END;
669
    END;
670
    K.EndDraw
670
    K.EndDraw
671
END draw_window;
671
END draw_window;
672
 
672
 
673
 
673
 
674
PROCEDURE mouse (VAR x, y: INTEGER);
674
PROCEDURE mouse (VAR x, y: INTEGER);
675
VAR
675
VAR
676
    mouseX, mouseY,
676
    mouseX, mouseY,
677
    cliX, cliY,
677
    cliX, cliY,
678
    winX, winY: INTEGER;
678
    winX, winY: INTEGER;
679
BEGIN
679
BEGIN
680
    K.MousePos(mouseX, mouseY);
680
    K.MousePos(mouseX, mouseY);
681
    K.WinPos(winX, winY);
681
    K.WinPos(winX, winY);
682
    K.ClientPos(cliX, cliY);
682
    K.ClientPos(cliX, cliY);
683
    x := mouseX - winX - cliX - LEFT;
683
    x := mouseX - winX - cliX - LEFT;
684
    y := mouseY - winY - cliY - TOP;
684
    y := mouseY - winY - cliY - TOP;
685
END mouse;
685
END mouse;
686
 
686
 
687
 
687
 
688
PROCEDURE getKBState (VAR shift, ctrl: BOOLEAN);
688
PROCEDURE getKBState (VAR shift, ctrl: BOOLEAN);
689
VAR
689
VAR
690
    kbState: SET;
690
    kbState: SET;
691
BEGIN
691
BEGIN
692
    kbState := K.GetControlKeys();
692
    kbState := K.GetControlKeys();
693
    shift := {0, 1} * kbState # {};
693
    shift := {0, 1} * kbState # {};
694
    ctrl := {2, 3} * kbState # {};
694
    ctrl := {2, 3} * kbState # {};
695
END getKBState;
695
END getKBState;
696
 
696
 
697
 
697
 
698
PROCEDURE stopTimer;
698
PROCEDURE stopTimer;
699
BEGIN
699
BEGIN
700
	T.hideCursor;
700
	T.hideCursor;
701
    Timer.stop;
701
    Timer.kill;
702
    repaint;
702
    repaint
703
    Timer.stop
-
 
704
END stopTimer;
703
END stopTimer;
705
 
704
 
706
 
705
 
707
PROCEDURE OpenFile (VAR FileName: RW.tFileName; filter: ARRAY OF CHAR);
706
PROCEDURE OpenFile (VAR FileName: RW.tFileName; filter: ARRAY OF CHAR);
708
BEGIN
707
BEGIN
709
    stopTimer;
708
    stopTimer;
710
    OpenDlg.SetFilter(OD, filter);
709
    OpenDlg.SetFilter(OD, filter);
711
    OpenDlg.Show(OD, 500, 400);
710
    OpenDlg.Show(OD, 500, 400);
712
    WHILE OD.status = 2 DO
711
    WHILE OD.status = 2 DO
713
        K.Pause(30)
712
        K.Pause(30)
714
    END;
713
    END;
715
    IF OD.status = 1 THEN
714
    IF OD.status = 1 THEN
716
        COPY(OD.FilePath, FileName)
715
        COPY(OD.FilePath, FileName)
717
    ELSE
716
    ELSE
718
        FileName := ""
717
        FileName := ""
719
    END;
718
    END;
720
    resetTimer
719
    resetTimer
721
END OpenFile;
720
END OpenFile;
722
 
721
 
723
 
722
 
724
PROCEDURE error (s: RW.tFileName);
723
PROCEDURE error (s: RW.tFileName);
725
BEGIN
724
BEGIN
726
    K.Run("/rd/1/@notify", s)
725
    K.Run("/rd/1/@notify", s)
727
END error;
726
END error;
728
 
727
 
729
 
728
 
730
PROCEDURE saveError (name: RW.tFileName);
729
PROCEDURE saveError (name: RW.tFileName);
731
VAR
730
VAR
732
    s: RW.tFileName;
731
    s: RW.tFileName;
733
BEGIN
732
BEGIN
734
    s := "'cedit: error saving file ";
733
    s := "'cedit: error saving file ";
735
    U.append8(s, name);
734
    U.append8(s, name);
736
    U.append8(s, "' -E");
735
    U.append8(s, "' -E");
737
    error(s)
736
    error(s)
738
END saveError;
737
END saveError;
739
 
738
 
740
 
739
 
741
PROCEDURE saveAs (text: T.tText);
740
PROCEDURE saveAs (text: T.tText);
742
VAR
741
VAR
743
    fileName, name: RW.tFileName;
742
    fileName, name: RW.tFileName;
744
    ext: ARRAY 8 OF CHAR;
743
    ext: ARRAY 8 OF CHAR;
745
BEGIN
744
BEGIN
746
    OD._type := OpenDlg.tsave;
745
    OD._type := OpenDlg.tsave;
747
    U.getFileName(text.fileName, OD.FileName, U.SLASH);
746
    U.getFileName(text.fileName, OD.FileName, U.SLASH);
748
    IF OD.FileName = "" THEN
747
    IF OD.FileName = "" THEN
749
        OD.FileName := "NewFile.";
748
        OD.FileName := "NewFile.";
750
        CASE text.lang OF
749
        CASE text.lang OF
751
        |Languages.langNone:   ext := "txt"
750
        |Languages.langNone:   ext := "txt"
752
        |Languages.langC:      ext := "c"
751
        |Languages.langC:      ext := "c"
753
        |Languages.langFasm:   ext := "asm"
752
        |Languages.langFasm:   ext := "asm"
754
        |Languages.langIni:    ext := "ini"
753
        |Languages.langIni:    ext := "ini"
755
        |Languages.langJSON:   ext := "json"
754
        |Languages.langJSON:   ext := "json"
756
        |Languages.langLua:    ext := "lua"
755
        |Languages.langLua:    ext := "lua"
757
        |Languages.langOberon: ext := "ob07"
756
        |Languages.langOberon: ext := "ob07"
758
        |Languages.langPascal: ext := "pas"
757
        |Languages.langPascal: ext := "pas"
759
        END;
758
        END;
760
        U.append8(OD.FileName, ext)
759
        U.append8(OD.FileName, ext)
761
    END;
760
    END;
762
    OpenFile(fileName, EditFilter);
761
    OpenFile(fileName, EditFilter);
763
    IF fileName # "" THEN
762
    IF fileName # "" THEN
764
        IF T.save(text, fileName) THEN
763
        IF T.save(text, fileName) THEN
765
            T.setName(text, fileName);
764
            T.setName(text, fileName);
766
            U.getFileName(fileName, name, U.SLASH);
765
            U.getFileName(fileName, name, U.SLASH);
767
            Tabs.rename(tabs, curText, name)
766
            Tabs.rename(tabs, curText, name)
768
        ELSE
767
        ELSE
769
            saveError(fileName)
768
            saveError(fileName)
770
        END
769
        END
771
    END
770
    END
772
END saveAs;
771
END saveAs;
773
 
772
 
774
 
773
 
775
PROCEDURE getIdx (text: T.tText): INTEGER;
774
PROCEDURE getIdx (text: T.tText): INTEGER;
776
VAR
775
VAR
777
    i: INTEGER;
776
    i: INTEGER;
778
BEGIN
777
BEGIN
779
    i := 0;
778
    i := 0;
780
    WHILE texts[i] # text DO
779
    WHILE texts[i] # text DO
781
        INC(i)
780
        INC(i)
782
    END
781
    END
783
    RETURN i
782
    RETURN i
784
END getIdx;
783
END getIdx;
785
 
784
 
786
 
785
 
787
PROCEDURE Switch (txt: T.tText);
786
PROCEDURE Switch (txt: T.tText);
788
BEGIN
787
BEGIN
789
    Tabs.switch(tabs, curText);
788
    Tabs.switch(tabs, curText);
790
    text := txt;
789
    text := txt;
791
    T.switch(txt);
790
    T.switch(txt);
792
    switch := TRUE
791
    switch := TRUE
793
END Switch;
792
END Switch;
794
 
793
 
795
 
794
 
796
PROCEDURE save (text: T.tText);
795
PROCEDURE save (text: T.tText);
797
BEGIN
796
BEGIN
798
    IF text.modified THEN
797
    IF text.modified THEN
799
        IF text.fileName # "" THEN
798
        IF text.fileName # "" THEN
800
            IF ~T.save(text, text.fileName) THEN
799
            IF ~T.save(text, text.fileName) THEN
801
                saveError(text.fileName)
800
                saveError(text.fileName)
802
            END
801
            END
803
        ELSE
802
        ELSE
804
            curText := getIdx(text);
803
            curText := getIdx(text);
805
            Switch(text);
804
            Switch(text);
806
            saveAs(text)
805
            saveAs(text)
807
        END
806
        END
808
    END
807
    END
809
END save;
808
END save;
810
 
809
 
811
 
810
 
812
PROCEDURE saveAll;
811
PROCEDURE saveAll;
813
VAR
812
VAR
814
    i: INTEGER;
813
    i: INTEGER;
815
BEGIN
814
BEGIN
816
    i := textsCount - 1;
815
    i := textsCount - 1;
817
    WHILE i >= 0 DO
816
    WHILE i >= 0 DO
818
        IF texts[i].modified THEN
817
        IF texts[i].modified THEN
819
            save(texts[i])
818
            save(texts[i])
820
        END;
819
        END;
821
        DEC(i)
820
        DEC(i)
822
    END;
821
    END;
823
END saveAll;
822
END saveAll;
824
 
823
 
825
 
824
 
826
PROCEDURE insert (pos: INTEGER; txt: T.tText);
825
PROCEDURE insert (pos: INTEGER; txt: T.tText);
827
VAR
826
VAR
828
    i: INTEGER;
827
    i: INTEGER;
829
    name: RW.tFileName;
828
    name: RW.tFileName;
830
BEGIN
829
BEGIN
831
    FOR i := textsCount - 1 TO pos BY -1 DO
830
    FOR i := textsCount - 1 TO pos BY -1 DO
832
        texts[i + 1] := texts[i]
831
        texts[i + 1] := texts[i]
833
    END;
832
    END;
834
    texts[pos] := txt;
833
    texts[pos] := txt;
835
    INC(textsCount);
834
    INC(textsCount);
836
    curText := pos;
835
    curText := pos;
837
    IF txt.fileName = "" THEN
836
    IF txt.fileName = "" THEN
838
        name := "new"
837
        name := "new"
839
    ELSE
838
    ELSE
840
        U.getFileName(txt.fileName, name, U.SLASH)
839
        U.getFileName(txt.fileName, name, U.SLASH)
841
    END;
840
    END;
842
    Tabs.add(tabs, name);
841
    Tabs.add(tabs, name);
843
    Switch(txt)
842
    Switch(txt)
844
END insert;
843
END insert;
845
 
844
 
846
 
845
 
847
PROCEDURE Confirm;
846
PROCEDURE Confirm;
848
CONST
847
CONST
849
    width  = btnWidth*2 + 30;
848
    width  = btnWidth*2 + 30;
850
    height = btnHeight*2 + 20;
849
    height = btnHeight*2 + 20;
851
    lineColor = 808080H;
850
    lineColor = 808080H;
852
VAR
851
VAR
853
    left, top, right, bottom: INTEGER;
852
    left, top, right, bottom: INTEGER;
854
BEGIN
853
BEGIN
855
	stopTimer;
854
	stopTimer;
856
    draw_window;
855
    draw_window;
857
    confirm := TRUE;
856
    confirm := TRUE;
858
    left := (canvas.width - width) DIV 2 + LEFT;
857
    left := (canvas.width - width) DIV 2 + LEFT;
859
    top := (canvas.height - height) DIV 2 + TOP;
858
    top := (canvas.height - height) DIV 2 + TOP;
860
    right := left + width - 1;
859
    right := left + width - 1;
861
    bottom := top + height - 1;
860
    bottom := top + height - 1;
862
    K.DrawRect(left, top, width, height, K.winColor);
861
    K.DrawRect(left, top, width, height, K.winColor);
863
    Rect(left, top, right, bottom, lineColor);
862
    Rect(left, top, right, bottom, lineColor);
864
    K.DrawText866(left + (width - 10*fontWidth) DIV 2, top + 10, K.textColor, "save file?");
863
    K.DrawText866(left + (width - 10*fontWidth) DIV 2, top + 10, K.textColor, "save file?");
865
    K.CreateButton(btnYes, left + 10, top + 35, btnWidth, btnHeight, K.btnColor, "yes");
864
    K.CreateButton(btnYes, left + 10, top + 35, btnWidth, btnHeight, K.btnColor, "yes");
866
    K.CreateButton(btnNo, left + 20 + btnWidth, top + 35, btnWidth, btnHeight, K.btnColor, "no");
865
    K.CreateButton(btnNo, left + 20 + btnWidth, top + 35, btnWidth, btnHeight, K.btnColor, "no");
867
END Confirm;
866
END Confirm;
868
 
867
 
869
 
-
 
870
PROCEDURE Exit;
-
 
871
BEGIN
-
 
872
	Timer.kill;
-
 
873
	K.Exit
-
 
874
END Exit;
-
 
875
 
-
 
876
 
868
 
877
PROCEDURE closeFile (conf: BOOLEAN; n: INTEGER);
869
PROCEDURE closeFile (conf: BOOLEAN; n: INTEGER);
878
VAR
870
VAR
879
    i: INTEGER;
871
    i: INTEGER;
880
BEGIN
872
BEGIN
881
    IF texts[n].modified & conf THEN
873
    IF texts[n].modified & conf THEN
882
        Confirm
874
        Confirm
883
    ELSE
875
    ELSE
884
        Tabs.delete(tabs, n);
876
        Tabs.delete(tabs, n);
885
        FOR i := n + 1 TO textsCount - 1 DO
877
        FOR i := n + 1 TO textsCount - 1 DO
886
            texts[i - 1] := texts[i]
878
            texts[i - 1] := texts[i]
887
        END;
879
        END;
888
        DEC(textsCount);
880
        DEC(textsCount);
889
        IF (curText = textsCount) OR (n < curText) THEN
881
        IF (curText = textsCount) OR (n < curText) THEN
890
            DEC(curText)
882
            DEC(curText)
891
        END;
883
        END;
892
        IF curText >= 0 THEN
884
        IF curText >= 0 THEN
893
            Switch(texts[curText])
885
            Switch(texts[curText])
894
        ELSE
886
        ELSE
895
            Exit
887
            K.Exit
896
        END;
888
        END;
897
        draw_window
889
        draw_window
898
    END
890
    END
899
END closeFile;
891
END closeFile;
900
 
892
 
901
 
893
 
902
PROCEDURE NewFile;
894
PROCEDURE NewFile;
903
VAR
895
VAR
904
    nov: T.tText;
896
    nov: T.tText;
905
BEGIN
897
BEGIN
906
    IF textsCount < maxTexts THEN
898
    IF textsCount < maxTexts THEN
907
        nov := T.New();
899
        nov := T.New();
908
        T.SetPos(nov, 0, 0);
900
        T.SetPos(nov, 0, 0);
909
        insert(textsCount, nov)
901
        insert(textsCount, nov)
910
    ELSE
902
    ELSE
911
        error("'cedit: too many files' -E")
903
        error("'cedit: too many files' -E")
912
    END
904
    END
913
END NewFile;
905
END NewFile;
914
 
906
 
915
 
907
 
916
PROCEDURE getFileNum (fileName: RW.tFileName): INTEGER;
908
PROCEDURE getFileNum (fileName: RW.tFileName): INTEGER;
917
VAR
909
VAR
918
    i: INTEGER;
910
    i: INTEGER;
919
 
911
 
920
    PROCEDURE nameEq (name1, name2: RW.tFileName): BOOLEAN;
912
    PROCEDURE nameEq (name1, name2: RW.tFileName): BOOLEAN;
921
    VAR
913
    VAR
922
        n1, n2: RW.tFileName;
914
        n1, n2: RW.tFileName;
923
    BEGIN
915
    BEGIN
924
        n1 := name1;
916
        n1 := name1;
925
        n2 := name2;
917
        n2 := name2;
926
        U.upcase(n1);
918
        U.upcase(n1);
927
        U.upcase(n2)
919
        U.upcase(n2)
928
        RETURN n1 = n2
920
        RETURN n1 = n2
929
    END nameEq;
921
    END nameEq;
930
 
922
 
931
BEGIN
923
BEGIN
932
    i := 0;
924
    i := 0;
933
    WHILE (i < textsCount) & ~nameEq(texts[i].fileName, fileName) DO
925
    WHILE (i < textsCount) & ~nameEq(texts[i].fileName, fileName) DO
934
        INC(i)
926
        INC(i)
935
    END;
927
    END;
936
    IF i = textsCount THEN
928
    IF i = textsCount THEN
937
        i := -1
929
        i := -1
938
    END
930
    END
939
    RETURN i
931
    RETURN i
940
END getFileNum;
932
END getFileNum;
941
 
933
 
942
 
934
 
943
PROCEDURE SwitchTab (n: INTEGER);
935
PROCEDURE SwitchTab (n: INTEGER);
944
BEGIN
936
BEGIN
945
    curText := n;
937
    curText := n;
946
    Tabs.switch(tabs, n);
938
    Tabs.switch(tabs, n);
947
    Switch(texts[n]);
939
    Switch(texts[n]);
948
    resetTimer;
940
    resetTimer;
949
    draw_window
941
    draw_window
950
END SwitchTab;
942
END SwitchTab;
951
 
943
 
952
 
944
 
953
PROCEDURE open;
945
PROCEDURE open;
954
VAR
946
VAR
955
    fileName: RW.tFileName;
947
    fileName: RW.tFileName;
956
    nov: T.tText;
948
    nov: T.tText;
957
    err, n: INTEGER;
949
    err, n: INTEGER;
958
BEGIN
950
BEGIN
959
    IF textsCount < maxTexts THEN
951
    IF textsCount < maxTexts THEN
960
        OD._type := OpenDlg.topen;
952
        OD._type := OpenDlg.topen;
961
        OpenFile(fileName, EditFilter);
953
        OpenFile(fileName, EditFilter);
962
        IF fileName # "" THEN
954
        IF fileName # "" THEN
963
            n := getFileNum(fileName);
955
            n := getFileNum(fileName);
964
            IF n = -1 THEN
956
            IF n = -1 THEN
965
                nov := T.open(fileName, err);
957
                nov := T.open(fileName, err);
966
                IF nov = NIL THEN
958
                IF nov = NIL THEN
967
                    error("'cedit: error opening file' -E")
959
                    error("'cedit: error opening file' -E")
968
                ELSE
960
                ELSE
969
                    insert(textsCount, nov);
961
                    insert(textsCount, nov);
970
                    T.SetPos(nov, 0, 0)
962
                    T.SetPos(nov, 0, 0)
971
                END
963
                END
972
            ELSE
964
            ELSE
973
                SwitchTab(n)
965
                SwitchTab(n)
974
            END
966
            END
975
        END
967
        END
976
    ELSE
968
    ELSE
977
        error("'cedit: too many files' -E")
969
        error("'cedit: too many files' -E")
978
    END
970
    END
979
END open;
971
END open;
980
 
972
 
981
 
973
 
982
PROCEDURE createEdit (left, top: INTEGER): box_lib.edit_box;
974
PROCEDURE createEdit (left, top: INTEGER): box_lib.edit_box;
983
VAR
975
VAR
984
    edit, EditBox0: box_lib.edit_box;
976
    edit, EditBox0: box_lib.edit_box;
985
BEGIN
977
BEGIN
986
    NEW(EditBox0);
978
    NEW(EditBox0);
987
    EditBox0.text := K.malloc(EDITBOX_MAXCHARS + 2);
979
    EditBox0.text := K.malloc(EDITBOX_MAXCHARS + 2);
988
    ASSERT(EditBox0.text # 0);
980
    ASSERT(EditBox0.text # 0);
989
    edit := box_lib.kolibri_new_edit_box(left, top, EditBox_Width, EDITBOX_MAXCHARS, EditBox0);
981
    edit := box_lib.kolibri_new_edit_box(left, top, EditBox_Width, EDITBOX_MAXCHARS, EditBox0);
990
    edit.flags := 4002H;
982
    edit.flags := 4002H;
991
    edit.text_color := 30000000H;
983
    edit.text_color := 30000000H;
992
    EditBox_SetFocus(edit, FALSE)
984
    EditBox_SetFocus(edit, FALSE)
993
    RETURN edit
985
    RETURN edit
994
END createEdit;
986
END createEdit;
995
 
987
 
996
 
988
 
997
PROCEDURE createSearchForm;
989
PROCEDURE createSearchForm;
998
BEGIN
990
BEGIN
999
    FindEdit := createEdit(searchLeft, TOP + 20);
991
    FindEdit := createEdit(searchLeft, TOP + 20);
1000
    ReplaceEdit := createEdit(searchLeft, TOP + 20 + 55);
992
    ReplaceEdit := createEdit(searchLeft, TOP + 20 + 55);
1001
    GotoEdit := createEdit(searchLeft, TOP + 20 + 330);
993
    GotoEdit := createEdit(searchLeft, TOP + 20 + 330);
1002
    GotoEdit.flags := ORD(BITS(GotoEdit.flags) + BITS(8000H));
994
    GotoEdit.flags := ORD(BITS(GotoEdit.flags) + BITS(8000H));
1003
    BKW := box_lib.kolibri_new_check_box(searchLeft, TOP + 90 + 20, 16, 16, "", 8*fontWidth + 4);
995
    BKW := box_lib.kolibri_new_check_box(searchLeft, TOP + 90 + 20, 16, 16, "", 8*fontWidth + 4);
1004
    CS := box_lib.kolibri_new_check_box(searchLeft, TOP + 120 + 20, 16, 16, "", 10*fontWidth + 4);
996
    CS := box_lib.kolibri_new_check_box(searchLeft, TOP + 120 + 20, 16, 16, "", 10*fontWidth + 4);
1005
    WH := box_lib.kolibri_new_check_box(searchLeft, TOP + 150 + 20, 16, 16, "", 10*fontWidth + 4);
997
    WH := box_lib.kolibri_new_check_box(searchLeft, TOP + 150 + 20, 16, 16, "", 10*fontWidth + 4);
1006
END createSearchForm;
998
END createSearchForm;
1007
 
999
 
1008
 
1000
 
1009
PROCEDURE EditBox_GetValue (edit: box_lib.edit_box; VAR s: ARRAY OF WCHAR);
1001
PROCEDURE EditBox_GetValue (edit: box_lib.edit_box; VAR s: ARRAY OF WCHAR);
1010
VAR
1002
VAR
1011
    str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR;
1003
    str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR;
1012
    i: INTEGER;
1004
    i: INTEGER;
1013
BEGIN
1005
BEGIN
1014
    box_lib.edit_box_get_value(edit, str);
1006
    box_lib.edit_box_get_value(edit, str);
1015
    i := 0;
1007
    i := 0;
1016
    WHILE str[i] # 0X DO
1008
    WHILE str[i] # 0X DO
1017
        s[i] := WCHR(E.cp866[ORD(str[i])]);
1009
        s[i] := WCHR(E.cp866[ORD(str[i])]);
1018
        INC(i)
1010
        INC(i)
1019
    END;
1011
    END;
1020
    s[i] := 0X
1012
    s[i] := 0X
1021
END EditBox_GetValue;
1013
END EditBox_GetValue;
1022
 
1014
 
1023
 
1015
 
1024
PROCEDURE Search;
1016
PROCEDURE Search;
1025
BEGIN
1017
BEGIN
1026
    search := ~search;
1018
    search := ~search;
1027
    LEFT := searchLeft;
1019
    LEFT := searchLeft;
1028
    IF search THEN
1020
    IF search THEN
1029
        searchOpened := TRUE;
1021
        searchOpened := TRUE;
1030
        INC(LEFT, EditBox_Width + SEARCH_PADDING*2 + 5);
1022
        INC(LEFT, EditBox_Width + SEARCH_PADDING*2 + 5);
1031
        IF T.search(text, searchText, cs, whole) THEN END
1023
        IF T.search(text, searchText, cs, whole) THEN END
1032
    ELSE
1024
    ELSE
1033
        IF T.search(text, "", FALSE, FALSE) THEN END
1025
        IF T.search(text, "", FALSE, FALSE) THEN END
1034
    END;
1026
    END;
1035
    SetFocus(FindEdit, search);
1027
    SetFocus(FindEdit, search);
1036
    resize;
1028
    resize;
1037
    draw_window
1029
    draw_window
1038
END Search;
1030
END Search;
1039
 
1031
 
1040
 
1032
 
1041
PROCEDURE click (x, y: INTEGER): INTEGER;
1033
PROCEDURE click (x, y: INTEGER): INTEGER;
1042
VAR
1034
VAR
1043
    scrollX, scrollY: INTEGER;
1035
    scrollX, scrollY: INTEGER;
1044
    shift, ctrl: BOOLEAN;
1036
    shift, ctrl: BOOLEAN;
1045
BEGIN
1037
BEGIN
1046
    getKBState(shift, ctrl);
1038
    getKBState(shift, ctrl);
1047
    IF ~hScroll.mouse THEN
1039
    IF ~hScroll.mouse THEN
1048
    	Scroll.MouseDown(hScroll, x + LEFT, y + TOP);
1040
    	Scroll.MouseDown(hScroll, x + LEFT, y + TOP);
1049
        T.getScroll(text, scrollX, scrollY);
1041
        T.getScroll(text, scrollX, scrollY);
1050
        T.scroll(text, hScroll.value - scrollX, 0);
1042
        T.scroll(text, hScroll.value - scrollX, 0);
1051
        repaint
1043
        repaint
1052
    END;
1044
    END;
1053
    IF ~vScroll.mouse THEN
1045
    IF ~vScroll.mouse THEN
1054
    	Scroll.MouseDown(vScroll, x + LEFT, y + TOP);
1046
    	Scroll.MouseDown(vScroll, x + LEFT, y + TOP);
1055
        T.getScroll(text, scrollX, scrollY);
1047
        T.getScroll(text, scrollX, scrollY);
1056
        T.scroll(text, 0, vScroll.value - scrollY);
1048
        T.scroll(text, 0, vScroll.value - scrollY);
1057
        repaint
1049
        repaint
1058
    END;
1050
    END;
1059
    IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
1051
    IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
1060
        leftButton := TRUE;
1052
        leftButton := TRUE;
1061
        SetFocus(FindEdit, FALSE);
1053
        SetFocus(FindEdit, FALSE);
1062
        IF ~shift THEN
1054
        IF ~shift THEN
1063
            T.resetSelect(text)
1055
            T.resetSelect(text)
1064
        END;
1056
        END;
1065
        T.mouse(text, x, y);
1057
        T.mouse(text, x, y);
1066
        repaint
1058
        repaint
1067
    END
1059
    END
1068
    RETURN K.GetTickCount()
1060
    RETURN K.GetTickCount()
1069
END click;
1061
END click;
1070
 
1062
 
1071
 
1063
 
1072
PROCEDURE LeftButtonUp;
1064
PROCEDURE LeftButtonUp;
1073
BEGIN
1065
BEGIN
1074
    leftButton := FALSE;
1066
    leftButton := FALSE;
1075
    Scroll.MouseUp(hScroll);
1067
    Scroll.MouseUp(hScroll);
1076
    Scroll.MouseUp(vScroll)
1068
    Scroll.MouseUp(vScroll)
1077
END LeftButtonUp;
1069
END LeftButtonUp;
1078
 
1070
 
1079
 
1071
 
1080
PROCEDURE Close;
1072
PROCEDURE Close;
1081
VAR
1073
VAR
1082
    cont: BOOLEAN;
1074
    cont: BOOLEAN;
1083
BEGIN
1075
BEGIN
1084
    closing := TRUE;
1076
    closing := TRUE;
1085
    cont := TRUE;
1077
    cont := TRUE;
1086
    WHILE (textsCount > 0) & cont DO
1078
    WHILE (textsCount > 0) & cont DO
1087
        IF text.modified THEN
1079
        IF text.modified THEN
1088
            Confirm;
1080
            Confirm;
1089
            cont := FALSE
1081
            cont := FALSE
1090
        ELSE
1082
        ELSE
1091
            closeFile(FALSE, curText);
1083
            closeFile(FALSE, curText);
1092
            repaint
1084
            repaint
1093
        END
1085
        END
1094
    END
1086
    END
1095
END Close;
1087
END Close;
1096
 
1088
 
1097
 
1089
 
1098
PROCEDURE CloseMenu;
1090
PROCEDURE CloseMenu;
1099
BEGIN
1091
BEGIN
1100
    Menu.close(menuFile);
1092
    Menu.close(menuFile);
1101
    Menu.close(menuEdit);
1093
    Menu.close(menuEdit);
1102
    Menu.close(menuSearch);
1094
    Menu.close(menuSearch);
1103
    Menu.close(menuEncoding);
1095
    Menu.close(menuEncoding);
1104
    Menu.close(menuEOL);
1096
    Menu.close(menuEOL);
1105
    Menu.close(menuView);
1097
    Menu.close(menuView);
1106
    Menu.close(menuSyntax);
1098
    Menu.close(menuSyntax);
1107
    Menu.close(menuProgram);
1099
    Menu.close(menuProgram);
1108
    Menu.close(menuTools);
1100
    Menu.close(menuTools);
1109
    Menu.close(subCurLine);
1101
    Menu.close(subCurLine);
1110
    Menu.close(subIndent);
1102
    Menu.close(subIndent);
1111
    Menu.close(subCase);
1103
    Menu.close(subCase);
1112
    Menu.close(subBookmark);
1104
    Menu.close(subBookmark);
1113
    Menu.close(context);
1105
    Menu.close(context);
1114
END CloseMenu;
1106
END CloseMenu;
1115
 
1107
 
1116
 
1108
 
1117
PROCEDURE MenuItemClick (menu: Menu.tMenu; id: INTEGER);
1109
PROCEDURE MenuItemClick (menu: Menu.tMenu; id: INTEGER);
1118
BEGIN
1110
BEGIN
1119
    K.SendIPC(mainTID, id)
1111
    K.SendIPC(mainTID, id)
1120
END MenuItemClick;
1112
END MenuItemClick;
1121
 
1113
 
1122
 
1114
 
1123
PROCEDURE goto;
1115
PROCEDURE goto;
1124
VAR
1116
VAR
1125
    gotoVal: INTEGER;
1117
    gotoVal: INTEGER;
1126
BEGIN
1118
BEGIN
1127
    EditBox_GetValue(GotoEdit, gotoText);
1119
    EditBox_GetValue(GotoEdit, gotoText);
1128
    IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN
1120
    IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN
1129
    	SetFocus(GotoEdit, FALSE)
1121
    	SetFocus(GotoEdit, FALSE)
1130
    END
1122
    END
1131
END goto;
1123
END goto;
1132
 
1124
 
1133
 
1125
 
1134
PROCEDURE Script (script: ARRAY OF CHAR);
1126
PROCEDURE Script (script: ARRAY OF CHAR);
1135
BEGIN
1127
BEGIN
1136
    IF script # "" THEN
1128
    IF script # "" THEN
1137
        K.Run("/rd/1/@open", script)
1129
        K.Run("/rd/1/@open", script)
1138
    END
1130
    END
1139
END Script;
1131
END Script;
1140
 
1132
 
1141
 
1133
 
1142
PROCEDURE ShowSearchPanel;
1134
PROCEDURE ShowSearchPanel;
1143
BEGIN
1135
BEGIN
1144
    IF ~search THEN
1136
    IF ~search THEN
1145
        Search
1137
        Search
1146
    ELSIF ~searchOpened THEN
1138
    ELSIF ~searchOpened THEN
1147
        search := FALSE;
1139
        search := FALSE;
1148
        Search
1140
        Search
1149
    END
1141
    END
1150
END ShowSearchPanel;
1142
END ShowSearchPanel;
1151
 
1143
 
1152
 
1144
 
1153
PROCEDURE CanvasToScreen (VAR x, y: INTEGER);
1145
PROCEDURE CanvasToScreen (VAR x, y: INTEGER);
1154
VAR
1146
VAR
1155
    cliX, cliY,
1147
    cliX, cliY,
1156
    winX, winY: INTEGER;
1148
    winX, winY: INTEGER;
1157
BEGIN
1149
BEGIN
1158
    K.WinPos(winX, winY);
1150
    K.WinPos(winX, winY);
1159
    K.ClientPos(cliX, cliY);
1151
    K.ClientPos(cliX, cliY);
1160
    x := x + winX + cliX + LEFT;
1152
    x := x + winX + cliX + LEFT;
1161
    y := y + winY + cliY + TOP;
1153
    y := y + winY + cliY + TOP;
1162
END CanvasToScreen;
1154
END CanvasToScreen;
1163
 
1155
 
1164
 
1156
 
1165
PROCEDURE ShowMenu (menu: Menu.tMenu);
1157
PROCEDURE ShowMenu (menu: Menu.tMenu);
1166
VAR
1158
VAR
1167
    winX, winY, cliX, cliY, x, y, i: INTEGER;
1159
    winX, winY, cliX, cliY, x, y, i: INTEGER;
1168
    selected, enabled: BOOLEAN;
1160
    selected, enabled: BOOLEAN;
1169
BEGIN
1161
BEGIN
1170
    IF menu = context THEN
1162
    IF menu = context THEN
1171
        mouse(x, y);
1163
        mouse(x, y);
1172
        IF ~((0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height)) THEN
1164
        IF ~((0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height)) THEN
1173
            menu := NIL
1165
            menu := NIL
1174
        END
1166
        END
1175
    ELSE
1167
    ELSE
1176
        K.WinPos(winX, winY);
1168
        K.WinPos(winX, winY);
1177
        K.ClientPos(cliX, cliY);
1169
        K.ClientPos(cliX, cliY);
1178
        x := winX + cliX;
1170
        x := winX + cliX;
1179
        y := MainMenuHeight + winY + cliY
1171
        y := MainMenuHeight + winY + cliY
1180
    END;
1172
    END;
1181
 
1173
 
1182
    selected := T.selected(text);
1174
    selected := T.selected(text);
1183
 
1175
 
1184
    IF menu = menuFile THEN
1176
    IF menu = menuFile THEN
1185
        Menu.setEnabled(menu, menuSave, text.modified);
1177
        Menu.setEnabled(menu, menuSave, text.modified);
1186
        Menu.setEnabled(menu, menuFolder, text.fileName # "");
1178
        Menu.setEnabled(menu, menuFolder, text.fileName # "");
1187
        i := 0;
1179
        i := 0;
1188
        WHILE (i < textsCount) & ~texts[i].modified DO
1180
        WHILE (i < textsCount) & ~texts[i].modified DO
1189
            INC(i)
1181
            INC(i)
1190
        END;
1182
        END;
1191
        Menu.setEnabled(menu, menuSaveAll, i < textsCount);
1183
        Menu.setEnabled(menu, menuSaveAll, i < textsCount);
1192
        INC(x, menuFileX)
1184
        INC(x, menuFileX)
1193
    ELSIF (menu = menuEdit) OR (menu = context) THEN
1185
    ELSIF (menu = menuEdit) OR (menu = context) THEN
1194
        Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition));
1186
        Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition));
1195
        Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition));
1187
        Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition));
1196
        Menu.setEnabled(menu, menuCut, selected);
1188
        Menu.setEnabled(menu, menuCut, selected);
1197
        Menu.setEnabled(menu, menuCopy, selected);
1189
        Menu.setEnabled(menu, menuCopy, selected);
1198
        Menu.setEnabled(menu, menuDelete, selected);
1190
        Menu.setEnabled(menu, menuDelete, selected);
1199
        Menu.setEnabled(menu, menuPaste, CB.available());
1191
        Menu.setEnabled(menu, menuPaste, CB.available());
1200
        IF menu = menuEdit THEN
1192
        IF menu = menuEdit THEN
1201
            INC(x, menuEditX)
1193
            INC(x, menuEditX)
1202
        ELSE
1194
        ELSE
1203
            IF y + menu.height >= canvas.height THEN
1195
            IF y + menu.height >= canvas.height THEN
1204
                DEC(y, menu.height)
1196
                DEC(y, menu.height)
1205
            END;
1197
            END;
1206
            IF x + menu.width >= canvas.width THEN
1198
            IF x + menu.width >= canvas.width THEN
1207
                DEC(x, menu.width)
1199
                DEC(x, menu.width)
1208
            END;
1200
            END;
1209
            CanvasToScreen(x, y)
1201
            CanvasToScreen(x, y)
1210
        END
1202
        END
1211
    ELSIF menu = menuEncoding THEN
1203
    ELSIF menu = menuEncoding THEN
1212
        Menu.setCheck(menu, menuUTF8BOM, ORD(text.enc = E.UTF8BOM)*2);
1204
        Menu.setCheck(menu, menuUTF8BOM, ORD(text.enc = E.UTF8BOM)*2);
1213
        Menu.setCheck(menu, menuUTF8,    ORD(text.enc = E.UTF8)*2);
1205
        Menu.setCheck(menu, menuUTF8,    ORD(text.enc = E.UTF8)*2);
1214
        Menu.setCheck(menu, menuCP866,   ORD(text.enc = E.CP866)*2);
1206
        Menu.setCheck(menu, menuCP866,   ORD(text.enc = E.CP866)*2);
1215
        Menu.setCheck(menu, menuWin1251, ORD(text.enc = E.W1251)*2);
1207
        Menu.setCheck(menu, menuWin1251, ORD(text.enc = E.W1251)*2);
1216
        INC(x, menuEncodingX)
1208
        INC(x, menuEncodingX)
1217
    ELSIF menu = menuEOL THEN
1209
    ELSIF menu = menuEOL THEN
1218
		Menu.setCheck(menu, menuCRLF, ORD(text.eol = RW.EOL_CRLF)*2);
1210
		Menu.setCheck(menu, menuCRLF, ORD(text.eol = RW.EOL_CRLF)*2);
1219
		Menu.setCheck(menu, menuLF,   ORD(text.eol = RW.EOL_LF)*2);
1211
		Menu.setCheck(menu, menuLF,   ORD(text.eol = RW.EOL_LF)*2);
1220
		Menu.setCheck(menu, menuCR,   ORD(text.eol = RW.EOL_CR)*2);
1212
		Menu.setCheck(menu, menuCR,   ORD(text.eol = RW.EOL_CR)*2);
1221
		INC(x, menuEOLX)
1213
		INC(x, menuEOLX)
1222
    ELSIF menu = menuView THEN
1214
    ELSIF menu = menuView THEN
1223
        Menu.setCheck(menu, menuNumbers,  ORD(text.numbers));
1215
        Menu.setCheck(menu, menuNumbers,  ORD(text.numbers));
1224
        Menu.setCheck(menu, menuFontSize, ORD(font = font2));
1216
        Menu.setCheck(menu, menuFontSize, ORD(font = font2));
1225
        FOR i := 0 TO Ini.sections.count - 1 DO
1217
        FOR i := 0 TO Ini.sections.count - 1 DO
1226
            Menu.setCheck(menu, menuColors + i, ORD(Ini.curSectionNum = i)*2)
1218
            Menu.setCheck(menu, menuColors + i, ORD(Ini.curSectionNum = i)*2)
1227
        END;
1219
        END;
1228
        INC(x, menuViewX)
1220
        INC(x, menuViewX)
1229
    ELSIF menu = menuSyntax THEN
1221
    ELSIF menu = menuSyntax THEN
1230
        Menu.setCheck(menu, menuNone,   ORD(text.lang = Languages.langNone)*2);
1222
        Menu.setCheck(menu, menuNone,   ORD(text.lang = Languages.langNone)*2);
1231
        Menu.setCheck(menu, menuC,      ORD(text.lang = Languages.langC)*2);
1223
        Menu.setCheck(menu, menuC,      ORD(text.lang = Languages.langC)*2);
1232
        Menu.setCheck(menu, menuFasm,   ORD(text.lang = Languages.langFasm)*2);
1224
        Menu.setCheck(menu, menuFasm,   ORD(text.lang = Languages.langFasm)*2);
1233
        Menu.setCheck(menu, menuIni,    ORD(text.lang = Languages.langIni)*2);
1225
        Menu.setCheck(menu, menuIni,    ORD(text.lang = Languages.langIni)*2);
1234
        Menu.setCheck(menu, menuJSON,   ORD(text.lang = Languages.langJSON)*2);
1226
        Menu.setCheck(menu, menuJSON,   ORD(text.lang = Languages.langJSON)*2);
1235
        Menu.setCheck(menu, menuLua,    ORD(text.lang = Languages.langLua)*2);
1227
        Menu.setCheck(menu, menuLua,    ORD(text.lang = Languages.langLua)*2);
1236
        Menu.setCheck(menu, menuOberon, ORD(text.lang = Languages.langOberon)*2);
1228
        Menu.setCheck(menu, menuOberon, ORD(text.lang = Languages.langOberon)*2);
1237
        Menu.setCheck(menu, menuPascal, ORD(text.lang = Languages.langPascal)*2);
1229
        Menu.setCheck(menu, menuPascal, ORD(text.lang = Languages.langPascal)*2);
1238
        INC(x, menuSyntaxX)
1230
        INC(x, menuSyntaxX)
1239
    ELSIF menu = menuProgram THEN
1231
    ELSIF menu = menuProgram THEN
1240
        Menu.setEnabled(menu, menuBuild, buildScript # "");
1232
        Menu.setEnabled(menu, menuBuild, buildScript # "");
1241
        Menu.setEnabled(menu, menuDebug, debugScript # "");
1233
        Menu.setEnabled(menu, menuDebug, debugScript # "");
1242
        Menu.setEnabled(menu, menuRun, runScript # "");
1234
        Menu.setEnabled(menu, menuRun, runScript # "");
1243
        INC(x, menuProgramX)
1235
        INC(x, menuProgramX)
1244
    ELSIF menu = menuTools THEN
1236
    ELSIF menu = menuTools THEN
1245
        INC(x, menuToolsX)
1237
        INC(x, menuToolsX)
1246
    ELSIF menu = menuSearch THEN
1238
    ELSIF menu = menuSearch THEN
1247
        INC(x, menuSearchX)
1239
        INC(x, menuSearchX)
1248
    END;
1240
    END;
1249
 
1241
 
1250
    enabled := search & (searchText # "");
1242
    enabled := search & (searchText # "");
1251
    Menu.setEnabled(menuSearch, menuFindNext, enabled);
1243
    Menu.setEnabled(menuSearch, menuFindNext, enabled);
1252
    Menu.setEnabled(menuSearch, menuFindPrev, enabled);
1244
    Menu.setEnabled(menuSearch, menuFindPrev, enabled);
1253
 
1245
 
1254
    Menu.setEnabled(subIndent, menuIncInd, selected);
1246
    Menu.setEnabled(subIndent, menuIncInd, selected);
1255
    Menu.setEnabled(subIndent, menuDecInd, selected);
1247
    Menu.setEnabled(subIndent, menuDecInd, selected);
1256
 
1248
 
1257
    Menu.setEnabled(subCase, menuUpper, selected);
1249
    Menu.setEnabled(subCase, menuUpper, selected);
1258
    Menu.setEnabled(subCase, menuLower, selected);
1250
    Menu.setEnabled(subCase, menuLower, selected);
1259
 
1251
 
1260
    IF menu # NIL THEN
1252
    IF menu # NIL THEN
1261
    	Timer.stop;
1253
    	Timer.kill;
1262
        IF Menu.opened(menu) THEN
1254
        IF Menu.opened(menu) THEN
1263
            Menu.close(menu)
1255
            Menu.close(menu)
1264
        END;
1256
        END;
1265
        Menu.open(menu, x, y);
1257
        Menu.open(menu, x, y);
1266
        menuActive := TRUE
1258
        menuActive := TRUE
1267
    END
1259
    END
1268
END ShowMenu;
1260
END ShowMenu;
1269
 
1261
 
1270
 
1262
 
1271
PROCEDURE receiveIPC;
1263
PROCEDURE receiveIPC;
1272
VAR
1264
VAR
1273
	scrollIPC: BOOLEAN;
1265
	scrollIPC: BOOLEAN;
1274
BEGIN
1266
BEGIN
1275
	scrollIPC := FALSE;
1267
	scrollIPC := FALSE;
1276
 
-
 
1277
    IF IPC[0] = Timer.ID THEN
1268
    IF IPC[0] = Timer.ID THEN
-
 
1269
    	IF IPC[4] = Timer.n THEN
1278
		T.toggleCursor;
1270
			T.toggleCursor;
1279
		repaint;
1271
			repaint
-
 
1272
		END;
1280
    	IPC[2] := 0
1273
    	IPC[2] := 0
1281
    ELSIF IPC[0] = mainTID THEN
1274
    ELSIF IPC[0] = mainTID THEN
1282
    	IF IPC[2] = Scroll.ScrollIPC THEN
1275
    	IF IPC[2] = Scroll.ScrollIPC THEN
1283
	    	Scroll.change(hScroll);
1276
	    	Scroll.change(hScroll);
1284
	    	IF hScroll.Dec THEN
1277
	    	IF hScroll.Dec THEN
1285
	    		T.scroll(text, -1, 0)
1278
	    		T.scroll(text, -1, 0)
1286
	    	ELSIF hScroll.Inc THEN
1279
	    	ELSIF hScroll.Inc THEN
1287
				T.scroll(text, 1, 0)
1280
				T.scroll(text, 1, 0)
1288
	    	END;
1281
	    	END;
1289
	    	Scroll.change(vScroll);
1282
	    	Scroll.change(vScroll);
1290
	    	IF vScroll.Dec THEN
1283
	    	IF vScroll.Dec THEN
1291
	    		T.scroll(text, 0, -1)
1284
	    		T.scroll(text, 0, -1)
1292
	    	ELSIF vScroll.Inc THEN
1285
	    	ELSIF vScroll.Inc THEN
1293
				T.scroll(text, 0, 1)
1286
				T.scroll(text, 0, 1)
1294
	    	END;
1287
	    	END;
1295
 
1288
 
1296
    		IF menuActive THEN
1289
    		IF menuActive THEN
1297
    			draw_window;
1290
    			draw_window;
1298
    			menuActive := FALSE
1291
    			menuActive := FALSE
1299
    		ELSE
1292
    		ELSE
1300
    			repaint
1293
    			repaint
1301
    		END;
1294
    		END;
1302
 
1295
 
1303
    		IF (0 IN K.MouseState()) THEN
1296
    		IF (0 IN K.MouseState()) THEN
1304
    			WHILE (0 IN K.MouseState()) & (delay > 0) DO
1297
    			WHILE (0 IN K.MouseState()) & (delay > 0) DO
1305
        			K.Pause(1);
1298
        			K.Pause(1);
1306
    	    		DEC(delay)
1299
    	    		DEC(delay)
1307
        		END;
1300
        		END;
1308
        		IF delay = 0 THEN
1301
        		IF delay = 0 THEN
1309
    				IPC[0] := 0;
1302
    				IPC[0] := 0;
1310
					IPC[1] := 0;
1303
					IPC[1] := 0;
1311
					scrollIPC := TRUE;
1304
					scrollIPC := TRUE;
1312
	        		Scroll.SendIPC;
1305
	        		Scroll.SendIPC;
1313
    	    		delay := 2
1306
    	    		delay := 2
1314
        		ELSE
1307
        		ELSE
1315
        			delay := scrollDelay
1308
        			delay := scrollDelay
1316
        		END
1309
        		END
1317
        	ELSE
1310
        	ELSE
1318
        		delay := scrollDelay
1311
        		delay := scrollDelay
1319
			END
1312
			END
1320
    	END;
1313
    	END;
1321
    	IPC[2] := 0
1314
    	IPC[2] := 0
1322
    ELSIF ~Menu.isSender(IPC[0]) THEN
1315
    ELSIF ~Menu.isSender(IPC[0]) THEN
1323
   		IPC[2] := 0
1316
   		IPC[2] := 0
1324
    END;
1317
    END;
1325
    CASE IPC[2] OF
1318
    CASE IPC[2] OF
1326
    |0:
1319
    |0:
1327
    |menuCut:       T.key(text, ORD("X"), FALSE, TRUE)
1320
    |menuCut:       T.key(text, ORD("X"), FALSE, TRUE)
1328
    |menuCopy:      T.key(text, ORD("C"), FALSE, TRUE)
1321
    |menuCopy:      T.key(text, ORD("C"), FALSE, TRUE)
1329
    |menuPaste:     T.key(text, ORD("V"), FALSE, TRUE)
1322
    |menuPaste:     T.key(text, ORD("V"), FALSE, TRUE)
1330
    |menuDelete:    T.key(text,       46, FALSE, FALSE)
1323
    |menuDelete:    T.key(text,       46, FALSE, FALSE)
1331
    |menuSelectAll: T.key(text, ORD("A"), FALSE, TRUE)
1324
    |menuSelectAll: T.key(text, ORD("A"), FALSE, TRUE)
1332
 
1325
 
1333
    |menuNew:
1326
    |menuNew:
1334
        NewFile
1327
        NewFile
1335
    |menuOpen:
1328
    |menuOpen:
1336
        open
1329
        open
1337
    |menuSave:
1330
    |menuSave:
1338
        save(text);
1331
        save(text);
1339
        repaint
1332
        repaint
1340
    |menuSaveAs:
1333
    |menuSaveAs:
1341
        saveAs(text);
1334
        saveAs(text);
1342
        repaint
1335
        repaint
1343
    |menuSaveAll:
1336
    |menuSaveAll:
1344
        saveAll;
1337
        saveAll;
1345
        repaint
1338
        repaint
1346
    |menuClose:
1339
    |menuClose:
1347
        closeFile(TRUE, curText)
1340
        closeFile(TRUE, curText)
1348
    |menuFolder:
1341
    |menuFolder:
1349
        K.Run("/rd/1/File Managers/Eolite", text.fileName)
1342
        K.Run("/rd/1/File Managers/Eolite", text.fileName)
1350
    |menuExit:
1343
    |menuExit:
1351
        Close
1344
        Close
1352
    |menuUndo:
1345
    |menuUndo:
1353
        T.undo(text);
1346
        T.undo(text);
1354
        repaint
1347
        repaint
1355
    |menuRedo:
1348
    |menuRedo:
1356
        T.redo(text);
1349
        T.redo(text);
1357
        repaint
1350
        repaint
1358
    |menuFind:
1351
    |menuFind:
1359
        ShowSearchPanel;
1352
        ShowSearchPanel;
1360
        SetFocus(FindEdit, TRUE)
1353
        SetFocus(FindEdit, TRUE)
1361
    |menuFindNext:
1354
    |menuFindNext:
1362
        notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW));
1355
        notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW));
1363
        menuFindClicked := TRUE
1356
        menuFindClicked := TRUE
1364
    |menuFindPrev:
1357
    |menuFindPrev:
1365
        notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW));
1358
        notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW));
1366
        menuFindClicked := TRUE
1359
        menuFindClicked := TRUE
1367
    |menuGoto:
1360
    |menuGoto:
1368
        ShowSearchPanel;
1361
        ShowSearchPanel;
1369
        SetFocus(GotoEdit, TRUE)
1362
        SetFocus(GotoEdit, TRUE)
1370
    |menuToggleBookmark:
1363
    |menuToggleBookmark:
1371
    	T.toggleLabel(text)
1364
    	T.toggleLabel(text)
1372
    |menuNextBookmark:
1365
    |menuNextBookmark:
1373
    	T.gotoLabel(text, TRUE)
1366
    	T.gotoLabel(text, TRUE)
1374
    |menuPrevBookmark:
1367
    |menuPrevBookmark:
1375
    	T.gotoLabel(text, FALSE)
1368
    	T.gotoLabel(text, FALSE)
1376
    |menuNumbers:
1369
    |menuNumbers:
1377
        T.toggleNumbers(text)
1370
        T.toggleNumbers(text)
1378
    |menuFontSize:
1371
    |menuFontSize:
1379
        IF font = font1 THEN
1372
        IF font = font1 THEN
1380
            font := font2
1373
            font := font2
1381
        ELSE
1374
        ELSE
1382
            font := font1
1375
            font := font1
1383
        END;
1376
        END;
1384
        resize
1377
        resize
1385
    |menuNone:
1378
    |menuNone:
1386
        T.setLang(text, Languages.langNone)
1379
        T.setLang(text, Languages.langNone)
1387
    |menuC:
1380
    |menuC:
1388
        T.setLang(text, Languages.langC)
1381
        T.setLang(text, Languages.langC)
1389
    |menuFasm:
1382
    |menuFasm:
1390
        T.setLang(text, Languages.langFasm)
1383
        T.setLang(text, Languages.langFasm)
1391
    |menuIni:
1384
    |menuIni:
1392
        T.setLang(text, Languages.langIni)
1385
        T.setLang(text, Languages.langIni)
1393
    |menuJSON:
1386
    |menuJSON:
1394
        T.setLang(text, Languages.langJSON)
1387
        T.setLang(text, Languages.langJSON)
1395
    |menuLua:
1388
    |menuLua:
1396
        T.setLang(text, Languages.langLua)
1389
        T.setLang(text, Languages.langLua)
1397
    |menuOberon:
1390
    |menuOberon:
1398
        T.setLang(text, Languages.langOberon)
1391
        T.setLang(text, Languages.langOberon)
1399
    |menuPascal:
1392
    |menuPascal:
1400
        T.setLang(text, Languages.langPascal)
1393
        T.setLang(text, Languages.langPascal)
1401
    |menuBuild:
1394
    |menuBuild:
1402
        Script(buildScript)
1395
        Script(buildScript)
1403
    |menuBuildScript:
1396
    |menuBuildScript:
1404
        OpenFile(buildScript, ShellFilter)
1397
        OpenFile(buildScript, ShellFilter)
1405
    |menuRun:
1398
    |menuRun:
1406
        Script(runScript)
1399
        Script(runScript)
1407
    |menuRunScript:
1400
    |menuRunScript:
1408
        OpenFile(runScript, ShellFilter)
1401
        OpenFile(runScript, ShellFilter)
1409
    |menuDebug:
1402
    |menuDebug:
1410
        Script(debugScript)
1403
        Script(debugScript)
1411
    |menuDebugScript:
1404
    |menuDebugScript:
1412
        OpenFile(debugScript, ShellFilter)
1405
        OpenFile(debugScript, ShellFilter)
1413
    |menuUTF8BOM:
1406
    |menuUTF8BOM:
1414
        text.enc := E.UTF8BOM
1407
        text.enc := E.UTF8BOM
1415
    |menuUTF8:
1408
    |menuUTF8:
1416
        text.enc := E.UTF8
1409
        text.enc := E.UTF8
1417
    |menuCP866:
1410
    |menuCP866:
1418
        text.enc := E.CP866
1411
        text.enc := E.CP866
1419
    |menuWin1251:
1412
    |menuWin1251:
1420
        text.enc := E.W1251
1413
        text.enc := E.W1251
1421
    |menuLF:
1414
    |menuLF:
1422
        text.eol := RW.EOL_LF
1415
        text.eol := RW.EOL_LF
1423
    |menuCRLF:
1416
    |menuCRLF:
1424
        text.eol := RW.EOL_CRLF
1417
        text.eol := RW.EOL_CRLF
1425
    |menuCR:
1418
    |menuCR:
1426
        text.eol := RW.EOL_CR
1419
        text.eol := RW.EOL_CR
1427
    |menuPipet:
1420
    |menuPipet:
1428
        K.Run("/rd/1/develop/pipet", "")
1421
        K.Run("/rd/1/develop/pipet", "")
1429
    |menuBoard:
1422
    |menuBoard:
1430
        K.Run("/rd/1/develop/board", "")
1423
        K.Run("/rd/1/develop/board", "")
1431
    |menuSysFunc:
1424
    |menuSysFunc:
1432
        K.Run("/rd/1/docpack", "f")
1425
        K.Run("/rd/1/docpack", "f")
1433
    |menuColors..menuMaxColors:
1426
    |menuColors..menuMaxColors:
1434
        Ini.selectSection(IPC[2] - menuColors)
1427
        Ini.selectSection(IPC[2] - menuColors)
1435
    |menuMoveUp:
1428
    |menuMoveUp:
1436
    	T.upLine(text)
1429
    	T.upLine(text)
1437
    |menuMoveDown:
1430
    |menuMoveDown:
1438
    	T.downLine(text)
1431
    	T.downLine(text)
1439
    |menuDuplicate:
1432
    |menuDuplicate:
1440
    	T.dupLine(text)
1433
    	T.dupLine(text)
1441
    |menuRemove:
1434
    |menuRemove:
1442
    	T.delLine(text)
1435
    	T.delLine(text)
1443
    |menuIncInd:
1436
    |menuIncInd:
1444
    	T.Indent(text, TRUE)
1437
    	T.Indent(text, TRUE)
1445
	|menuDecInd:
1438
	|menuDecInd:
1446
		T.Indent(text, FALSE)
1439
		T.Indent(text, FALSE)
1447
	|menuUpper:
1440
	|menuUpper:
1448
		T.chCase(text, TRUE)
1441
		T.chCase(text, TRUE)
1449
	|menuLower:
1442
	|menuLower:
1450
		T.chCase(text, FALSE)
1443
		T.chCase(text, FALSE)
1451
    END;
1444
    END;
1452
    IF ~scrollIPC THEN
1445
    IF ~scrollIPC THEN
1453
    	IPC[0] := 0;
1446
    	IPC[0] := 0;
1454
    	IPC[1] := 0
1447
    	IPC[1] := 0
1455
    END
1448
    END
1456
END receiveIPC;
1449
END receiveIPC;
1457
 
1450
 
1458
 
1451
 
1459
PROCEDURE MenuKeyDown (menu: Menu.tMenu; key: INTEGER): BOOLEAN;
1452
PROCEDURE MenuKeyDown (menu: Menu.tMenu; key: INTEGER): BOOLEAN;
1460
VAR
1453
VAR
1461
    menuItem: INTEGER;
1454
    menuItem: INTEGER;
1462
    shift, ctrl: BOOLEAN;
1455
    shift, ctrl: BOOLEAN;
1463
BEGIN
1456
BEGIN
1464
    menuItem := -1;
1457
    menuItem := -1;
1465
    getKBState(shift, ctrl);
1458
    getKBState(shift, ctrl);
1466
    IF ctrl THEN
1459
    IF ctrl THEN
1467
        CASE key DIV 65536 OF
1460
        CASE key DIV 65536 OF
1468
        |17: menuItem := menuClose
1461
        |17: menuItem := menuClose
1469
        |21: menuItem := menuRedo
1462
        |21: menuItem := menuRedo
1470
        |30: menuItem := menuSelectAll
1463
        |30: menuItem := menuSelectAll
1471
        |33: menuItem := menuFind
1464
        |33: menuItem := menuFind
1472
        |34: menuItem := menuGoto
1465
        |34: menuItem := menuGoto
1473
        |44: menuItem := menuUndo
1466
        |44: menuItem := menuUndo
1474
        |45: menuItem := menuCut
1467
        |45: menuItem := menuCut
1475
        |46: menuItem := menuCopy
1468
        |46: menuItem := menuCopy
1476
        |47: menuItem := menuPaste
1469
        |47: menuItem := menuPaste
1477
        |24: menuItem := menuOpen
1470
        |24: menuItem := menuOpen
1478
        |31: menuItem := menuSave
1471
        |31: menuItem := menuSave
1479
        |49: menuItem := menuNew
1472
        |49: menuItem := menuNew
1480
        |67: menuItem := menuBuild
1473
        |67: menuItem := menuBuild
1481
        ELSE
1474
        ELSE
1482
        END
1475
        END
1483
    ELSE
1476
    ELSE
1484
        IF key DIV 65536 = 83 THEN
1477
        IF key DIV 65536 = 83 THEN
1485
            menuItem := menuDelete
1478
            menuItem := menuDelete
1486
        ELSIF key DIV 65536 = 67 THEN
1479
        ELSIF key DIV 65536 = 67 THEN
1487
            menuItem := menuRun
1480
            menuItem := menuRun
1488
        END
1481
        END
1489
    END;
1482
    END;
1490
    IF menuItem # -1 THEN
1483
    IF menuItem # -1 THEN
1491
        IF Menu.isEnabled(menu, menuItem) THEN
1484
        IF Menu.isEnabled(menu, menuItem) THEN
1492
            MenuItemClick(menu, menuItem)
1485
            MenuItemClick(menu, menuItem)
1493
        ELSE
1486
        ELSE
1494
            menuItem := -1
1487
            menuItem := -1
1495
        END
1488
        END
1496
    END
1489
    END
1497
    RETURN menuItem # -1
1490
    RETURN menuItem # -1
1498
END MenuKeyDown;
1491
END MenuKeyDown;
1499
 
1492
 
1500
 
1493
 
1501
PROCEDURE CreateContextMenu (): Menu.tMenu;
1494
PROCEDURE CreateContextMenu (): Menu.tMenu;
1502
VAR
1495
VAR
1503
    menu: List.tList;
1496
    menu: List.tList;
1504
BEGIN
1497
BEGIN
1505
    menu := List.create(NIL);
1498
    menu := List.create(NIL);
1506
    Menu.AddMenuItem(menu, menuUndo,      "undo         ctrl-Z");
1499
    Menu.AddMenuItem(menu, menuUndo,      "undo         ctrl-Z");
1507
    Menu.AddMenuItem(menu, menuRedo,      "redo         ctrl-Y");
1500
    Menu.AddMenuItem(menu, menuRedo,      "redo         ctrl-Y");
1508
    Menu.delimiter(menu);
1501
    Menu.delimiter(menu);
1509
    Menu.AddMenuItem(menu, menuCut,       "cut          ctrl-X");
1502
    Menu.AddMenuItem(menu, menuCut,       "cut          ctrl-X");
1510
    Menu.AddMenuItem(menu, menuCopy,      "copy         ctrl-C");
1503
    Menu.AddMenuItem(menu, menuCopy,      "copy         ctrl-C");
1511
    Menu.AddMenuItem(menu, menuPaste,     "paste        ctrl-V");
1504
    Menu.AddMenuItem(menu, menuPaste,     "paste        ctrl-V");
1512
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1505
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1513
    Menu.delimiter(menu);
1506
    Menu.delimiter(menu);
1514
    Menu.AddMenuItem(menu, menuSelectAll, "select all   ctrl-A");
1507
    Menu.AddMenuItem(menu, menuSelectAll, "select all   ctrl-A");
1515
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1508
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1516
END CreateContextMenu;
1509
END CreateContextMenu;
1517
 
1510
 
1518
 
1511
 
1519
PROCEDURE CreateMenuFile (): Menu.tMenu;
1512
PROCEDURE CreateMenuFile (): Menu.tMenu;
1520
VAR
1513
VAR
1521
    menu: List.tList;
1514
    menu: List.tList;
1522
BEGIN
1515
BEGIN
1523
    menu := List.create(NIL);
1516
    menu := List.create(NIL);
1524
    Menu.AddMenuItem(menu, menuNew,     "new         ctrl-N");
1517
    Menu.AddMenuItem(menu, menuNew,     "new         ctrl-N");
1525
    Menu.AddMenuItem(menu, menuOpen,    "open        ctrl-O");
1518
    Menu.AddMenuItem(menu, menuOpen,    "open        ctrl-O");
1526
    Menu.AddMenuItem(menu, menuSave,    "save        ctrl-S");
1519
    Menu.AddMenuItem(menu, menuSave,    "save        ctrl-S");
1527
    Menu.AddMenuItem(menu, menuSaveAs,  "save as");
1520
    Menu.AddMenuItem(menu, menuSaveAs,  "save as");
1528
    Menu.AddMenuItem(menu, menuSaveAll, "save all");
1521
    Menu.AddMenuItem(menu, menuSaveAll, "save all");
1529
    Menu.AddMenuItem(menu, menuFolder,  "folder");
1522
    Menu.AddMenuItem(menu, menuFolder,  "folder");
1530
    Menu.delimiter(menu);
1523
    Menu.delimiter(menu);
1531
    Menu.AddMenuItem(menu, menuClose,   "close       ctrl-W");
1524
    Menu.AddMenuItem(menu, menuClose,   "close       ctrl-W");
1532
    Menu.delimiter(menu);
1525
    Menu.delimiter(menu);
1533
    Menu.AddMenuItem(menu, menuExit,    "exit");
1526
    Menu.AddMenuItem(menu, menuExit,    "exit");
1534
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1527
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1535
END CreateMenuFile;
1528
END CreateMenuFile;
1536
 
1529
 
1537
 
1530
 
1538
PROCEDURE CreateMenuEdit (): Menu.tMenu;
1531
PROCEDURE CreateMenuEdit (): Menu.tMenu;
1539
VAR
1532
VAR
1540
    menu: List.tList;
1533
    menu: List.tList;
1541
BEGIN
1534
BEGIN
1542
    menu := List.create(NIL);
1535
    menu := List.create(NIL);
1543
    Menu.AddMenuItem(menu, menuUndo,      "undo            ctrl-Z");
1536
    Menu.AddMenuItem(menu, menuUndo,      "undo            ctrl-Z");
1544
    Menu.AddMenuItem(menu, menuRedo,      "redo            ctrl-Y");
1537
    Menu.AddMenuItem(menu, menuRedo,      "redo            ctrl-Y");
1545
    Menu.delimiter(menu);
1538
    Menu.delimiter(menu);
1546
    Menu.AddMenuItem(menu, menuCut,       "cut             ctrl-X");
1539
    Menu.AddMenuItem(menu, menuCut,       "cut             ctrl-X");
1547
    Menu.AddMenuItem(menu, menuCopy,      "copy            ctrl-C");
1540
    Menu.AddMenuItem(menu, menuCopy,      "copy            ctrl-C");
1548
    Menu.AddMenuItem(menu, menuPaste,     "paste           ctrl-V");
1541
    Menu.AddMenuItem(menu, menuPaste,     "paste           ctrl-V");
1549
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1542
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1550
    Menu.delimiter(menu);
1543
    Menu.delimiter(menu);
1551
    Menu.AddMenuItem(menu, menuSelectAll, "select all      ctrl-A");
1544
    Menu.AddMenuItem(menu, menuSelectAll, "select all      ctrl-A");
1552
    Menu.delimiter(menu);
1545
    Menu.delimiter(menu);
1553
    Menu.AddMenuItem(menu, menuCurLine,   "current line");
1546
    Menu.AddMenuItem(menu, menuCurLine,   "current line");
1554
    Menu.child(menu, subCurLine);
1547
    Menu.child(menu, subCurLine);
1555
    Menu.AddMenuItem(menu, menuIndent,    "indent");
1548
    Menu.AddMenuItem(menu, menuIndent,    "indent");
1556
    Menu.child(menu, subIndent);
1549
    Menu.child(menu, subIndent);
1557
    Menu.AddMenuItem(menu, menuCase,      "case");
1550
    Menu.AddMenuItem(menu, menuCase,      "case");
1558
    Menu.child(menu, subCase);
1551
    Menu.child(menu, subCase);
1559
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1552
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1560
END CreateMenuEdit;
1553
END CreateMenuEdit;
1561
 
1554
 
1562
 
1555
 
1563
PROCEDURE CreateMenuSearch (): Menu.tMenu;
1556
PROCEDURE CreateMenuSearch (): Menu.tMenu;
1564
VAR
1557
VAR
1565
    menu: List.tList;
1558
    menu: List.tList;
1566
BEGIN
1559
BEGIN
1567
    menu := List.create(NIL);
1560
    menu := List.create(NIL);
1568
    Menu.AddMenuItem(menu, menuFind,     "search           ctrl-F");
1561
    Menu.AddMenuItem(menu, menuFind,     "search           ctrl-F");
1569
    Menu.AddMenuItem(menu, menuFindNext, "find next        F3");
1562
    Menu.AddMenuItem(menu, menuFindNext, "find next        F3");
1570
    Menu.AddMenuItem(menu, menuFindPrev, "find previous    shift-F3");
1563
    Menu.AddMenuItem(menu, menuFindPrev, "find previous    shift-F3");
1571
    Menu.AddMenuItem(menu, menuGoto,     "go to line       ctrl-G");
1564
    Menu.AddMenuItem(menu, menuGoto,     "go to line       ctrl-G");
1572
    Menu.delimiter(menu);
1565
    Menu.delimiter(menu);
1573
    Menu.AddMenuItem(menu, menuBookmark, "bookmark");
1566
    Menu.AddMenuItem(menu, menuBookmark, "bookmark");
1574
    Menu.child(menu, subBookmark);
1567
    Menu.child(menu, subBookmark);
1575
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1568
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1576
END CreateMenuSearch;
1569
END CreateMenuSearch;
1577
 
1570
 
1578
 
1571
 
1579
PROCEDURE CreateMenuEncoding (): Menu.tMenu;
1572
PROCEDURE CreateMenuEncoding (): Menu.tMenu;
1580
VAR
1573
VAR
1581
    menu: List.tList;
1574
    menu: List.tList;
1582
BEGIN
1575
BEGIN
1583
    menu := List.create(NIL);
1576
    menu := List.create(NIL);
1584
    Menu.AddMenuItem(menu, menuUTF8BOM, E.names[E.UTF8BOM]);
1577
    Menu.AddMenuItem(menu, menuUTF8BOM, E.names[E.UTF8BOM]);
1585
    Menu.AddMenuItem(menu, menuUTF8,    E.names[E.UTF8]);
1578
    Menu.AddMenuItem(menu, menuUTF8,    E.names[E.UTF8]);
1586
    Menu.AddMenuItem(menu, menuCP866,   E.names[E.CP866]);
1579
    Menu.AddMenuItem(menu, menuCP866,   E.names[E.CP866]);
1587
    Menu.AddMenuItem(menu, menuWin1251, E.names[E.W1251]);
1580
    Menu.AddMenuItem(menu, menuWin1251, E.names[E.W1251]);
1588
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1581
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1589
END CreateMenuEncoding;
1582
END CreateMenuEncoding;
1590
 
1583
 
1591
 
1584
 
1592
PROCEDURE CreateMenuEOL (): Menu.tMenu;
1585
PROCEDURE CreateMenuEOL (): Menu.tMenu;
1593
VAR
1586
VAR
1594
    menu: List.tList;
1587
    menu: List.tList;
1595
BEGIN
1588
BEGIN
1596
    menu := List.create(NIL);
1589
    menu := List.create(NIL);
1597
    Menu.AddMenuItem(menu, menuCRLF, RW.eolNames[RW.EOL_CRLF]);
1590
    Menu.AddMenuItem(menu, menuCRLF, RW.eolNames[RW.EOL_CRLF]);
1598
    Menu.AddMenuItem(menu, menuLF,   RW.eolNames[RW.EOL_LF]);
1591
    Menu.AddMenuItem(menu, menuLF,   RW.eolNames[RW.EOL_LF]);
1599
    Menu.AddMenuItem(menu, menuCR,   RW.eolNames[RW.EOL_CR]);
1592
    Menu.AddMenuItem(menu, menuCR,   RW.eolNames[RW.EOL_CR]);
1600
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1593
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1601
END CreateMenuEOL;
1594
END CreateMenuEOL;
1602
 
1595
 
1603
 
1596
 
1604
PROCEDURE CreateMenuView (): Menu.tMenu;
1597
PROCEDURE CreateMenuView (): Menu.tMenu;
1605
VAR
1598
VAR
1606
    menu: List.tList;
1599
    menu: List.tList;
1607
    colors: Ini.tSection;
1600
    colors: Ini.tSection;
1608
    idx: INTEGER;
1601
    idx: INTEGER;
1609
BEGIN
1602
BEGIN
1610
    menu := List.create(NIL);
1603
    menu := List.create(NIL);
1611
    Menu.AddMenuItem(menu, menuNumbers, "line numbers");
1604
    Menu.AddMenuItem(menu, menuNumbers, "line numbers");
1612
    Menu.AddMenuItem(menu, menuFontSize, "x2");
1605
    Menu.AddMenuItem(menu, menuFontSize, "x2");
1613
    Menu.delimiter(menu);
1606
    Menu.delimiter(menu);
1614
 
1607
 
1615
    colors := Ini.sections.first(Ini.tSection);
1608
    colors := Ini.sections.first(Ini.tSection);
1616
    idx := menuColors;
1609
    idx := menuColors;
1617
    WHILE colors # NIL DO
1610
    WHILE colors # NIL DO
1618
        Menu.AddMenuItem(menu, idx, colors.name);
1611
        Menu.AddMenuItem(menu, idx, colors.name);
1619
        INC(idx);
1612
        INC(idx);
1620
        colors := colors.next(Ini.tSection)
1613
        colors := colors.next(Ini.tSection)
1621
    END;
1614
    END;
1622
 
1615
 
1623
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1616
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1624
END CreateMenuView;
1617
END CreateMenuView;
1625
 
1618
 
1626
 
1619
 
1627
PROCEDURE CreateMenuSyntax (): Menu.tMenu;
1620
PROCEDURE CreateMenuSyntax (): Menu.tMenu;
1628
VAR
1621
VAR
1629
    menu: List.tList;
1622
    menu: List.tList;
1630
BEGIN
1623
BEGIN
1631
    menu := List.create(NIL);
1624
    menu := List.create(NIL);
1632
    Menu.AddMenuItem(menu, menuC,      "C");
1625
    Menu.AddMenuItem(menu, menuC,      "C");
1633
    Menu.AddMenuItem(menu, menuFasm,   "Fasm");
1626
    Menu.AddMenuItem(menu, menuFasm,   "Fasm");
1634
    Menu.AddMenuItem(menu, menuIni,    "Ini");
1627
    Menu.AddMenuItem(menu, menuIni,    "Ini");
1635
    Menu.AddMenuItem(menu, menuJSON,   "JSON");
1628
    Menu.AddMenuItem(menu, menuJSON,   "JSON");
1636
    Menu.AddMenuItem(menu, menuLua,    "Lua");
1629
    Menu.AddMenuItem(menu, menuLua,    "Lua");
1637
    Menu.AddMenuItem(menu, menuOberon, "Oberon");
1630
    Menu.AddMenuItem(menu, menuOberon, "Oberon");
1638
    Menu.AddMenuItem(menu, menuPascal, "Pascal");
1631
    Menu.AddMenuItem(menu, menuPascal, "Pascal");
1639
    Menu.delimiter(menu);
1632
    Menu.delimiter(menu);
1640
    Menu.AddMenuItem(menu, menuNone,   "none");
1633
    Menu.AddMenuItem(menu, menuNone,   "none");
1641
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1634
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1642
END CreateMenuSyntax;
1635
END CreateMenuSyntax;
1643
 
1636
 
1644
 
1637
 
1645
PROCEDURE CreateMenuProgram (): Menu.tMenu;
1638
PROCEDURE CreateMenuProgram (): Menu.tMenu;
1646
VAR
1639
VAR
1647
    menu: List.tList;
1640
    menu: List.tList;
1648
BEGIN
1641
BEGIN
1649
    menu := List.create(NIL);
1642
    menu := List.create(NIL);
1650
    Menu.AddMenuItem(menu, menuBuild,       "build    ctrl-F9");
1643
    Menu.AddMenuItem(menu, menuBuild,       "build    ctrl-F9");
1651
    Menu.AddMenuItem(menu, menuBuildScript, "script");
1644
    Menu.AddMenuItem(menu, menuBuildScript, "script");
1652
    Menu.delimiter(menu);
1645
    Menu.delimiter(menu);
1653
    Menu.AddMenuItem(menu, menuRun,         "run           F9");
1646
    Menu.AddMenuItem(menu, menuRun,         "run           F9");
1654
    Menu.AddMenuItem(menu, menuRunScript,   "script");
1647
    Menu.AddMenuItem(menu, menuRunScript,   "script");
1655
    Menu.delimiter(menu);
1648
    Menu.delimiter(menu);
1656
    Menu.AddMenuItem(menu, menuDebug,       "debug");
1649
    Menu.AddMenuItem(menu, menuDebug,       "debug");
1657
    Menu.AddMenuItem(menu, menuDebugScript, "script");
1650
    Menu.AddMenuItem(menu, menuDebugScript, "script");
1658
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1651
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1659
END CreateMenuProgram;
1652
END CreateMenuProgram;
1660
 
1653
 
1661
 
1654
 
1662
PROCEDURE CreateMenuTools (): Menu.tMenu;
1655
PROCEDURE CreateMenuTools (): Menu.tMenu;
1663
VAR
1656
VAR
1664
    menu: List.tList;
1657
    menu: List.tList;
1665
BEGIN
1658
BEGIN
1666
    menu := List.create(NIL);
1659
    menu := List.create(NIL);
1667
    Menu.AddMenuItem(menu, menuPipet,   "pipet");
1660
    Menu.AddMenuItem(menu, menuPipet,   "pipet");
1668
    Menu.AddMenuItem(menu, menuBoard,   "board");
1661
    Menu.AddMenuItem(menu, menuBoard,   "board");
1669
    Menu.AddMenuItem(menu, menuSysFunc, "system functions");
1662
    Menu.AddMenuItem(menu, menuSysFunc, "system functions");
1670
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1663
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1671
END CreateMenuTools;
1664
END CreateMenuTools;
1672
 
1665
 
1673
 
1666
 
1674
PROCEDURE CreateMenuCurLine(): Menu.tMenu;
1667
PROCEDURE CreateMenuCurLine(): Menu.tMenu;
1675
VAR
1668
VAR
1676
    menu: List.tList;
1669
    menu: List.tList;
1677
BEGIN
1670
BEGIN
1678
    menu := List.create(NIL);
1671
    menu := List.create(NIL);
1679
    Menu.AddMenuItem(menu, menuMoveUp,    "move up     ctrl-Up");
1672
    Menu.AddMenuItem(menu, menuMoveUp,    "move up     ctrl-Up");
1680
    Menu.AddMenuItem(menu, menuMoveDown,  "move down   ctrl-Down");
1673
    Menu.AddMenuItem(menu, menuMoveDown,  "move down   ctrl-Down");
1681
    Menu.AddMenuItem(menu, menuDuplicate, "duplicate   ctrl-D");
1674
    Menu.AddMenuItem(menu, menuDuplicate, "duplicate   ctrl-D");
1682
    Menu.AddMenuItem(menu, menuRemove,    "remove      ctrl-Del");
1675
    Menu.AddMenuItem(menu, menuRemove,    "remove      ctrl-Del");
1683
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1676
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1684
END CreateMenuCurLine;
1677
END CreateMenuCurLine;
1685
 
1678
 
1686
 
1679
 
1687
PROCEDURE CreateMenuIndent(): Menu.tMenu;
1680
PROCEDURE CreateMenuIndent(): Menu.tMenu;
1688
VAR
1681
VAR
1689
    menu: List.tList;
1682
    menu: List.tList;
1690
BEGIN
1683
BEGIN
1691
    menu := List.create(NIL);
1684
    menu := List.create(NIL);
1692
    Menu.AddMenuItem(menu, menuIncInd, "increase    Tab");
1685
    Menu.AddMenuItem(menu, menuIncInd, "increase    Tab");
1693
    Menu.AddMenuItem(menu, menuDecInd, "decrease    shift-Bksp");
1686
    Menu.AddMenuItem(menu, menuDecInd, "decrease    shift-Bksp");
1694
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1687
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1695
END CreateMenuIndent;
1688
END CreateMenuIndent;
1696
 
1689
 
1697
 
1690
 
1698
PROCEDURE CreateMenuCase(): Menu.tMenu;
1691
PROCEDURE CreateMenuCase(): Menu.tMenu;
1699
VAR
1692
VAR
1700
    menu: List.tList;
1693
    menu: List.tList;
1701
BEGIN
1694
BEGIN
1702
    menu := List.create(NIL);
1695
    menu := List.create(NIL);
1703
    Menu.AddMenuItem(menu, menuUpper, "UPPER    ctrl-U");
1696
    Menu.AddMenuItem(menu, menuUpper, "UPPER    ctrl-U");
1704
    Menu.AddMenuItem(menu, menuLower, "lower    ctrl-L");
1697
    Menu.AddMenuItem(menu, menuLower, "lower    ctrl-L");
1705
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1698
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1706
END CreateMenuCase;
1699
END CreateMenuCase;
1707
 
1700
 
1708
 
1701
 
1709
PROCEDURE CreateMenuBookmark(): Menu.tMenu;
1702
PROCEDURE CreateMenuBookmark(): Menu.tMenu;
1710
VAR
1703
VAR
1711
    menu: List.tList;
1704
    menu: List.tList;
1712
BEGIN
1705
BEGIN
1713
    menu := List.create(NIL);
1706
    menu := List.create(NIL);
1714
    Menu.AddMenuItem(menu, menuToggleBookmark, "toggle      ctrl-F2");
1707
    Menu.AddMenuItem(menu, menuToggleBookmark, "toggle      ctrl-F2");
1715
    Menu.AddMenuItem(menu, menuNextBookmark,   "next        F2");
1708
    Menu.AddMenuItem(menu, menuNextBookmark,   "next        F2");
1716
    Menu.AddMenuItem(menu, menuPrevBookmark,   "previous    shift-F2");
1709
    Menu.AddMenuItem(menu, menuPrevBookmark,   "previous    shift-F2");
1717
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1710
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1718
END CreateMenuBookmark;
1711
END CreateMenuBookmark;
1719
 
1712
 
1720
 
1713
 
1721
PROCEDURE KeyDown (key: INTEGER);
1714
PROCEDURE KeyDown (key: INTEGER);
1722
VAR
1715
VAR
1723
    keyCode: INTEGER;
1716
    keyCode: INTEGER;
1724
    shift, ctrl: BOOLEAN;
1717
    shift, ctrl: BOOLEAN;
1725
BEGIN
1718
BEGIN
1726
    keyCode := key DIV 65536;
1719
    keyCode := key DIV 65536;
1727
    getKBState(shift, ctrl);
1720
    getKBState(shift, ctrl);
1728
    IF confirm THEN
1721
    IF confirm THEN
1729
        IF keyCode = 28 THEN (* Enter *)
1722
        IF keyCode = 28 THEN (* Enter *)
1730
            save(text);
1723
            save(text);
1731
            IF ~text.modified THEN
1724
            IF ~text.modified THEN
1732
                closeFile(FALSE, curText)
1725
                closeFile(FALSE, curText)
1733
            END
1726
            END
1734
        END;
1727
        END;
1735
        key := -1
1728
        key := -1
1736
    ELSE
1729
    ELSE
1737
        IF keyCode = 61 THEN (* F3 *)
1730
        IF keyCode = 61 THEN (* F3 *)
1738
            key := -1;
1731
            key := -1;
1739
            IF search & (searchText # "") THEN
1732
            IF search & (searchText # "") THEN
1740
                IF shift THEN
1733
                IF shift THEN
1741
                    notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW))
1734
                    notFound := ~T.findNext(text, ~box_lib.check_box_get_value(BKW))
1742
                ELSE
1735
                ELSE
1743
                    notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW))
1736
                    notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW))
1744
                END
1737
                END
1745
            END
1738
            END
1746
        ELSIF keyCode = 60 THEN (* F2 *)
1739
        ELSIF keyCode = 60 THEN (* F2 *)
1747
            key := -1;
1740
            key := -1;
1748
            IF ctrl THEN
1741
            IF ctrl THEN
1749
                T.toggleLabel(text)
1742
                T.toggleLabel(text)
1750
            ELSE
1743
            ELSE
1751
                T.gotoLabel(text, ~shift)
1744
                T.gotoLabel(text, ~shift)
1752
            END
1745
            END
1753
        ELSIF keyCode = 67 THEN (* F9 *)
1746
        ELSIF keyCode = 67 THEN (* F9 *)
1754
            key := -1;
1747
            key := -1;
1755
            IF ctrl THEN
1748
            IF ctrl THEN
1756
                Script(buildScript)
1749
                Script(buildScript)
1757
            ELSE
1750
            ELSE
1758
                Script(runScript)
1751
                Script(runScript)
1759
            END
1752
            END
1760
        ELSIF keyCode = 1 THEN (* Esc *)
1753
        ELSIF keyCode = 1 THEN (* Esc *)
1761
            key := -1;
1754
            key := -1;
1762
            IF search THEN
1755
            IF search THEN
1763
                Search
1756
                Search
1764
            END
1757
            END
1765
        ELSIF (keyCode = 55) & (key DIV 256 MOD 256 = 52) THEN (* PrtScn *)
1758
        ELSIF (keyCode = 55) & (key DIV 256 MOD 256 = 52) THEN (* PrtScn *)
1766
            key := -1
1759
            key := -1
1767
        ELSIF (keyCode = 14) & shift THEN (* shift+Backspace *)
1760
        ELSIF (keyCode = 14) & shift THEN (* shift+Backspace *)
1768
            key := -1;
1761
            key := -1;
1769
            T.input(text, -8)
1762
            T.input(text, -8)
1770
        ELSIF (keyCode = 15) & ctrl THEN (* ctrl+Tab *)
1763
        ELSIF (keyCode = 15) & ctrl THEN (* ctrl+Tab *)
1771
            key := -1;
1764
            key := -1;
1772
            SwitchTab((curText + 1) MOD textsCount)
1765
            SwitchTab((curText + 1) MOD textsCount)
1773
        ELSIF (keyCode = 33) & ctrl THEN
1766
        ELSIF (keyCode = 33) & ctrl THEN
1774
            key := -1;
1767
            key := -1;
1775
            ShowSearchPanel;
1768
            ShowSearchPanel;
1776
            SetFocus(FindEdit, TRUE)
1769
            SetFocus(FindEdit, TRUE)
1777
        ELSIF (keyCode = 34) & ctrl THEN
1770
        ELSIF (keyCode = 34) & ctrl THEN
1778
            key := -1;
1771
            key := -1;
1779
            ShowSearchPanel;
1772
            ShowSearchPanel;
1780
            SetFocus(GotoEdit, TRUE)
1773
            SetFocus(GotoEdit, TRUE)
1781
        ELSE
1774
        ELSE
1782
            IF EditBox_Focus(FindEdit) THEN
1775
            IF EditBox_Focus(FindEdit) THEN
1783
                box_lib.edit_box_key(FindEdit, key);
1776
                box_lib.edit_box_key(FindEdit, key);
1784
                EditBox_GetValue(FindEdit, new_searchText);
1777
                EditBox_GetValue(FindEdit, new_searchText);
1785
                IF new_searchText # searchText THEN
1778
                IF new_searchText # searchText THEN
1786
                    searchText := new_searchText;
1779
                    searchText := new_searchText;
1787
                    notFound := ~T.search(text, searchText, cs, whole)
1780
                    notFound := ~T.search(text, searchText, cs, whole)
1788
                END
1781
                END
1789
            ELSIF EditBox_Focus(ReplaceEdit) THEN
1782
            ELSIF EditBox_Focus(ReplaceEdit) THEN
1790
                box_lib.edit_box_key(ReplaceEdit, key);
1783
                box_lib.edit_box_key(ReplaceEdit, key);
1791
                EditBox_GetValue(ReplaceEdit, replaceText)
1784
                EditBox_GetValue(ReplaceEdit, replaceText)
1792
            ELSIF EditBox_Focus(GotoEdit) THEN
1785
            ELSIF EditBox_Focus(GotoEdit) THEN
1793
                IF (key DIV 256) MOD 256 = 13 THEN
1786
                IF (key DIV 256) MOD 256 = 13 THEN
1794
                    goto
1787
                    goto
1795
                ELSE
1788
                ELSE
1796
                    box_lib.edit_box_key(GotoEdit, key)
1789
                    box_lib.edit_box_key(GotoEdit, key)
1797
                END
1790
                END
1798
            ELSE
1791
            ELSE
1799
                CASE keyCode OF
1792
                CASE keyCode OF
1800
                |73: key := 33
1793
                |73: key := 33
1801
                |81: key := 34
1794
                |81: key := 34
1802
                |71: key := 36
1795
                |71: key := 36
1803
                |79: key := 35
1796
                |79: key := 35
1804
                |72: key := 38
1797
                |72: key := 38
1805
                |80: key := 40
1798
                |80: key := 40
1806
                |75: key := 37
1799
                |75: key := 37
1807
                |77: key := 39
1800
                |77: key := 39
1808
                |82, 91, 219, 92, 220: key := -1 (* insert, windows *)
1801
                |82, 91, 219, 92, 220: key := -1 (* insert, windows *)
1809
                |93: ShowMenu(context); key := -1
1802
                |93: ShowMenu(context); key := -1
1810
                |83: key := 46
1803
                |83: key := 46
1811
                |59, 62..66, 68, 87, 88: key := -1 (* F1, F4..F8, F10, F11, F12 *)
1804
                |59, 62..66, 68, 87, 88: key := -1 (* F1, F4..F8, F10, F11, F12 *)
1812
                ELSE
1805
                ELSE
1813
                    IF ctrl THEN
1806
                    IF ctrl THEN
1814
                        CASE keyCode OF
1807
                        CASE keyCode OF
1815
                        |17: closeFile(TRUE, curText);
1808
                        |17: closeFile(TRUE, curText);
1816
                             key := -2
1809
                             key := -2
1817
                        |21: T.redo(text);
1810
                        |21: T.redo(text);
1818
                             key := -1
1811
                             key := -1
1819
                        |22: key := ORD("U")
1812
                        |22: key := ORD("U")
1820
                        |24: key := -1;
1813
                        |24: key := -1;
1821
                             open
1814
                             open
1822
                        |30: key := ORD("A")
1815
                        |30: key := ORD("A")
1823
                        |31: key := -1;
1816
                        |31: key := -1;
1824
                             save(text)
1817
                             save(text)
1825
                        |32: key := ORD("D")
1818
                        |32: key := ORD("D")
1826
                        |38: key := ORD("L")
1819
                        |38: key := ORD("L")
1827
                        |44: T.undo(text);
1820
                        |44: T.undo(text);
1828
                             key := -1
1821
                             key := -1
1829
                        |45: key := ORD("X")
1822
                        |45: key := ORD("X")
1830
                        |46: key := ORD("C")
1823
                        |46: key := ORD("C")
1831
                        |47: key := ORD("V")
1824
                        |47: key := ORD("V")
1832
                        |49: key := -1;
1825
                        |49: key := -1;
1833
                             NewFile
1826
                             NewFile
1834
                        ELSE
1827
                        ELSE
1835
                            key := -1
1828
                            key := -1
1836
                        END
1829
                        END
1837
                    ELSE
1830
                    ELSE
1838
                        T.input(text, E.cp866[key DIV 256 MOD 256]);
1831
                        T.input(text, E.cp866[key DIV 256 MOD 256]);
1839
                        key := -1
1832
                        key := -1
1840
                    END
1833
                    END
1841
                END;
1834
                END;
1842
                IF key >= 0 THEN
1835
                IF key >= 0 THEN
1843
                    T.key(text, key, shift, ctrl)
1836
                    T.key(text, key, shift, ctrl)
1844
                END
1837
                END
1845
            END
1838
            END
1846
        END
1839
        END
1847
    END;
1840
    END;
1848
    IF key # -2 THEN
1841
    IF key # -2 THEN
1849
        repaint
1842
        repaint
1850
    END
1843
    END
1851
END KeyDown;
1844
END KeyDown;
1852
 
1845
 
1853
 
1846
 
1854
PROCEDURE BtnClick;
1847
PROCEDURE BtnClick;
1855
VAR
1848
VAR
1856
    btn: INTEGER;
1849
    btn: INTEGER;
1857
    middle, exit: BOOLEAN;
1850
    middle, exit: BOOLEAN;
1858
BEGIN
1851
BEGIN
1859
    btn := K.ButtonCode(middle);
1852
    btn := K.ButtonCode(middle);
1860
    IF (Tabs.btnID <= btn) & (btn <= Tabs.btnID + maxTexts - 1) THEN
1853
    IF (Tabs.btnID <= btn) & (btn <= Tabs.btnID + maxTexts - 1) THEN
1861
        DEC(btn, Tabs.btnID);
1854
        DEC(btn, Tabs.btnID);
1862
        IF middle THEN
1855
        IF middle THEN
1863
            IF texts[btn].modified THEN
1856
            IF texts[btn].modified THEN
1864
                SwitchTab(btn)
1857
                SwitchTab(btn)
1865
            END;
1858
            END;
1866
            closeFile(TRUE, btn)
1859
            closeFile(TRUE, btn)
1867
        ELSE
1860
        ELSE
1868
            SwitchTab(btn)
1861
            SwitchTab(btn)
1869
        END;
1862
        END;
1870
        btn := 0
1863
        btn := 0
1871
    ELSE
1864
    ELSE
1872
        IF middle THEN
1865
        IF middle THEN
1873
            btn := 0
1866
            btn := 0
1874
        END
1867
        END
1875
    END;
1868
    END;
1876
    CASE btn OF
1869
    CASE btn OF
1877
    |Tabs.btnID - 1: Tabs.scroll(tabs, -1); switch := TRUE; repaint
1870
    |Tabs.btnID - 1: Tabs.scroll(tabs, -1); switch := TRUE; repaint
1878
    |Tabs.btnID - 2: Tabs.scroll(tabs, +1); switch := TRUE; repaint
1871
    |Tabs.btnID - 2: Tabs.scroll(tabs, +1); switch := TRUE; repaint
1879
 
1872
 
1880
    |0:
1873
    |0:
1881
 
1874
 
1882
    |btnFile:
1875
    |btnFile:
1883
        ShowMenu(menuFile)
1876
        ShowMenu(menuFile)
1884
    |btnEdit:
1877
    |btnEdit:
1885
        ShowMenu(menuEdit)
1878
        ShowMenu(menuEdit)
1886
    |btnMenuSearch:
1879
    |btnMenuSearch:
1887
        ShowMenu(menuSearch)
1880
        ShowMenu(menuSearch)
1888
    |btnEncoding:
1881
    |btnEncoding:
1889
        ShowMenu(menuEncoding)
1882
        ShowMenu(menuEncoding)
1890
    |btnEOL:
1883
    |btnEOL:
1891
        ShowMenu(menuEOL)
1884
        ShowMenu(menuEOL)
1892
    |btnView:
1885
    |btnView:
1893
        ShowMenu(menuView)
1886
        ShowMenu(menuView)
1894
    |btnSyntax:
1887
    |btnSyntax:
1895
        ShowMenu(menuSyntax)
1888
        ShowMenu(menuSyntax)
1896
    |btnProgram:
1889
    |btnProgram:
1897
        ShowMenu(menuProgram)
1890
        ShowMenu(menuProgram)
1898
    |btnTools:
1891
    |btnTools:
1899
        ShowMenu(menuTools)
1892
        ShowMenu(menuTools)
1900
    |btnNo:
1893
    |btnNo:
1901
        exit := closing;
1894
        exit := closing;
1902
        closeFile(FALSE, curText);
1895
        closeFile(FALSE, curText);
1903
        repaint;
1896
        repaint;
1904
        IF exit THEN
1897
        IF exit THEN
1905
            Close
1898
            Close
1906
        END
1899
        END
1907
    |btnYes:
1900
    |btnYes:
1908
        exit := closing;
1901
        exit := closing;
1909
        save(text);
1902
        save(text);
1910
        IF ~text.modified THEN
1903
        IF ~text.modified THEN
1911
            closeFile(FALSE, curText)
1904
            closeFile(FALSE, curText)
1912
        END;
1905
        END;
1913
        repaint;
1906
        repaint;
1914
        IF exit THEN
1907
        IF exit THEN
1915
            Close
1908
            Close
1916
        END
1909
        END
1917
    |btnClose:
1910
    |btnClose:
1918
        Close
1911
        Close
1919
    |btnNew:
1912
    |btnNew:
1920
        NewFile;
1913
        NewFile;
1921
        repaint
1914
        repaint
1922
    |btnOpen:
1915
    |btnOpen:
1923
        open
1916
        open
1924
    |btnSave:
1917
    |btnSave:
1925
        save(text);
1918
        save(text);
1926
        repaint
1919
        repaint
1927
    |btnSearch:
1920
    |btnSearch:
1928
        ShowSearchPanel
1921
        ShowSearchPanel
1929
    |btnCloseFind:
1922
    |btnCloseFind:
1930
        Search
1923
        Search
1931
    |btnHideFind:
1924
    |btnHideFind:
1932
        SetFocus(FindEdit, FALSE);
1925
        SetFocus(FindEdit, FALSE);
1933
        searchOpened := FALSE;
1926
        searchOpened := FALSE;
1934
        LEFT := searchLeft;
1927
        LEFT := searchLeft;
1935
        resize;
1928
        resize;
1936
        draw_window
1929
        draw_window
1937
    |btnUndo:
1930
    |btnUndo:
1938
        T.undo(text);
1931
        T.undo(text);
1939
        repaint
1932
        repaint
1940
    |btnRedo:
1933
    |btnRedo:
1941
        T.redo(text);
1934
        T.redo(text);
1942
        repaint
1935
        repaint
1943
    |btnUpper:
1936
    |btnUpper:
1944
        T.chCase(text, TRUE);
1937
        T.chCase(text, TRUE);
1945
        repaint
1938
        repaint
1946
    |btnLower:
1939
    |btnLower:
1947
        T.chCase(text, FALSE);
1940
        T.chCase(text, FALSE);
1948
        repaint
1941
        repaint
1949
    |btnBuild:
1942
    |btnBuild:
1950
        Script(buildScript)
1943
        Script(buildScript)
1951
    |btnRun:
1944
    |btnRun:
1952
        Script(runScript)
1945
        Script(runScript)
1953
    |btnFindNext:
1946
    |btnFindNext:
1954
        IF searchText # "" THEN
1947
        IF searchText # "" THEN
1955
            notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW));
1948
            notFound := ~T.findNext(text, box_lib.check_box_get_value(BKW));
1956
            repaint
1949
            repaint
1957
        END
1950
        END
1958
    |btnReplace:
1951
    |btnReplace:
1959
        T.replace(text, replaceText, LENGTH(searchText));
1952
        T.replace(text, replaceText, LENGTH(searchText));
1960
        repaint
1953
        repaint
1961
    |btnReplaceAll:
1954
    |btnReplaceAll:
1962
        notFound := ~T.search(text, searchText, cs, whole);
1955
        notFound := ~T.search(text, searchText, cs, whole);
1963
        IF ~notFound THEN
1956
        IF ~notFound THEN
1964
            replaced := T.replaceAll(text, replaceText, LENGTH(searchText));
1957
            replaced := T.replaceAll(text, replaceText, LENGTH(searchText));
1965
        END;
1958
        END;
1966
        repaint
1959
        repaint
1967
    |btnGoto:
1960
    |btnGoto:
1968
        goto;
1961
        goto;
1969
        repaint
1962
        repaint
1970
    END
1963
    END
1971
END BtnClick;
1964
END BtnClick;
1972
 
1965
 
1973
 
1966
 
1974
PROCEDURE MouseEvent (VAR resized: BOOLEAN; VAR firstClickX, firstClickY, time: INTEGER);
1967
PROCEDURE MouseEvent (VAR resized: BOOLEAN; VAR firstClickX, firstClickY, time: INTEGER);
1975
CONST
1968
CONST
1976
    DELAY = 10;
1969
    DELAY = 10;
1977
VAR
1970
VAR
1978
    msState: SET;
1971
    msState: SET;
1979
    scroll, x, y, scrollX, scrollY: INTEGER;
1972
    scroll, x, y, scrollX, scrollY: INTEGER;
1980
 
1973
 
1981
 
1974
 
1982
    PROCEDURE EditBox (eb: box_lib.edit_box);
1975
    PROCEDURE EditBox (eb: box_lib.edit_box);
1983
    VAR
1976
    VAR
1984
        focus: BOOLEAN;
1977
        focus: BOOLEAN;
1985
    BEGIN
1978
    BEGIN
1986
        focus := EditBox_Focus(eb);
1979
        focus := EditBox_Focus(eb);
1987
        box_lib.edit_box_mouse(eb);
1980
        box_lib.edit_box_mouse(eb);
1988
        IF focus # EditBox_Focus(eb) THEN
1981
        IF focus # EditBox_Focus(eb) THEN
1989
            SetFocus(eb, TRUE);
1982
            SetFocus(eb, TRUE);
1990
            repaint
1983
            repaint
1991
        END
1984
        END
1992
    END EditBox;
1985
    END EditBox;
1993
 
1986
 
1994
 
1987
 
1995
BEGIN
1988
BEGIN
1996
	CloseMenu;
1989
	CloseMenu;
1997
    IF ~resized THEN
1990
    IF ~resized THEN
1998
        msState := K.MouseState();
1991
        msState := K.MouseState();
1999
        IF ~(0 IN msState) OR (16 IN msState) THEN
1992
        IF ~(0 IN msState) OR (16 IN msState) THEN
2000
            LeftButtonUp
1993
            LeftButtonUp
2001
        END;
1994
        END;
2002
        scroll := K.Scroll();
1995
        scroll := K.Scroll();
2003
        IF scroll # 0 THEN
1996
        IF scroll # 0 THEN
2004
            T.scroll(text, 0, scroll*3);
1997
            T.scroll(text, 0, scroll*3);
2005
            repaint
1998
            repaint
2006
        END;
1999
        END;
2007
        IF leftButton THEN
2000
        IF leftButton THEN
2008
            IF K.GetTickCount() - time >= DELAY THEN
2001
            IF K.GetTickCount() - time >= DELAY THEN
2009
                mouse(x, y);
2002
                mouse(x, y);
2010
                T.mouse(text, x, y);
2003
                T.mouse(text, x, y);
2011
                repaint
2004
                repaint
2012
            END
2005
            END
2013
        END;
2006
        END;
2014
		IF Scroll.isActive(hScroll) THEN
2007
		IF Scroll.isActive(hScroll) THEN
2015
			mouse(x, y);
2008
			mouse(x, y);
2016
			Scroll.MouseMove(hScroll, x + LEFT, y + TOP);
2009
			Scroll.MouseMove(hScroll, x + LEFT, y + TOP);
2017
            T.getScroll(text, scrollX, scrollY);
2010
            T.getScroll(text, scrollX, scrollY);
2018
            T.scroll(text, hScroll.value - scrollX, 0);
2011
            T.scroll(text, hScroll.value - scrollX, 0);
2019
			repaint
2012
			repaint
2020
		END;
2013
		END;
2021
		IF Scroll.isActive(vScroll) THEN
2014
		IF Scroll.isActive(vScroll) THEN
2022
			mouse(x, y);
2015
			mouse(x, y);
2023
			Scroll.MouseMove(vScroll, x + LEFT, y + TOP);
2016
			Scroll.MouseMove(vScroll, x + LEFT, y + TOP);
2024
            T.getScroll(text, scrollX, scrollY);
2017
            T.getScroll(text, scrollX, scrollY);
2025
            T.scroll(text, 0, vScroll.value - scrollY);
2018
            T.scroll(text, 0, vScroll.value - scrollY);
2026
			repaint
2019
			repaint
2027
		END;
2020
		END;
2028
        IF (8 IN msState) & ~(24 IN msState) THEN
2021
        IF (8 IN msState) & ~(24 IN msState) THEN
2029
            mouse(firstClickX, firstClickY);
2022
            mouse(firstClickX, firstClickY);
2030
            time := click(firstClickX, firstClickY)
2023
            time := click(firstClickX, firstClickY)
2031
        END;
2024
        END;
2032
        IF 9 IN msState THEN
2025
        IF 9 IN msState THEN
2033
            ShowMenu(context)
2026
            ShowMenu(context)
2034
        END;
2027
        END;
2035
        IF 24 IN msState THEN
2028
        IF 24 IN msState THEN
2036
            mouse(x, y);
2029
            mouse(x, y);
2037
    		IF ~hScroll.mouse THEN
2030
    		IF ~hScroll.mouse THEN
2038
    			Scroll.MouseDown(hScroll, x + LEFT, y + TOP)
2031
    			Scroll.MouseDown(hScroll, x + LEFT, y + TOP)
2039
    		END;
2032
    		END;
2040
    		IF ~vScroll.mouse THEN
2033
    		IF ~vScroll.mouse THEN
2041
    			Scroll.MouseDown(vScroll, x + LEFT, y + TOP)
2034
    			Scroll.MouseDown(vScroll, x + LEFT, y + TOP)
2042
    		END;
2035
    		END;
2043
            IF (ABS(x - firstClickX) < 5) & (ABS(y - firstClickY) < 5) THEN
2036
            IF (ABS(x - firstClickX) < 5) & (ABS(y - firstClickY) < 5) THEN
2044
                IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
2037
                IF (0 <= x) & (x < canvas.width) & (0 <= y) & (y < canvas.height) THEN
2045
                    leftButton := FALSE;
2038
                    leftButton := FALSE;
2046
                    T.selectWord(text);
2039
                    T.selectWord(text);
2047
                    repaint
2040
                    repaint
2048
                END
2041
                END
2049
            ELSE
2042
            ELSE
2050
                firstClickX := x;
2043
                firstClickX := x;
2051
                firstClickY := y;
2044
                firstClickY := y;
2052
                time := click(firstClickX, firstClickY)
2045
                time := click(firstClickX, firstClickY)
2053
            END
2046
            END
2054
        END
2047
        END
2055
    END;
2048
    END;
2056
    IF search & searchOpened THEN
2049
    IF search & searchOpened THEN
2057
        EditBox(FindEdit);
2050
        EditBox(FindEdit);
2058
        EditBox(ReplaceEdit);
2051
        EditBox(ReplaceEdit);
2059
        EditBox(GotoEdit);
2052
        EditBox(GotoEdit);
2060
        box_lib.check_box_mouse2(CS);
2053
        box_lib.check_box_mouse2(CS);
2061
        box_lib.check_box_mouse2(WH);
2054
        box_lib.check_box_mouse2(WH);
2062
        box_lib.check_box_mouse2(BKW);
2055
        box_lib.check_box_mouse2(BKW);
2063
        IF box_lib.check_box_get_value(CS) # cs THEN
2056
        IF box_lib.check_box_get_value(CS) # cs THEN
2064
            cs := ~cs;
2057
            cs := ~cs;
2065
            notFound := ~T.search(text, searchText, cs, whole);
2058
            notFound := ~T.search(text, searchText, cs, whole);
2066
            repaint
2059
            repaint
2067
        END;
2060
        END;
2068
        IF box_lib.check_box_get_value(WH) # whole THEN
2061
        IF box_lib.check_box_get_value(WH) # whole THEN
2069
            whole := ~whole;
2062
            whole := ~whole;
2070
            notFound := ~T.search(text, searchText, cs, whole);
2063
            notFound := ~T.search(text, searchText, cs, whole);
2071
            repaint
2064
            repaint
2072
        END
2065
        END
2073
    END;
2066
    END;
2074
    resized := FALSE
2067
    resized := FALSE
2075
END MouseEvent;
2068
END MouseEvent;
2076
 
2069
 
2077
 
2070
 
2078
PROCEDURE Redraw (VAR resized: BOOLEAN; VAR width, height, cliWidth, cliHeight: INTEGER);
2071
PROCEDURE Redraw (VAR resized: BOOLEAN; VAR width, height, cliWidth, cliHeight: INTEGER);
2079
VAR
2072
VAR
2080
    i: INTEGER;
2073
    i: INTEGER;
2081
BEGIN
2074
BEGIN
2082
    K.GetSystemColors;
2075
    K.GetSystemColors;
2083
    FOR i := 0 TO 1 DO
2076
    FOR i := 0 TO 1 DO
2084
        IF ~K.RolledUp() THEN
2077
        IF ~K.RolledUp() THEN
2085
            K.ClientSize(width, height);
2078
            K.ClientSize(width, height);
2086
            IF (width # cliWidth) OR (height # cliHeight) THEN
2079
            IF (width # cliWidth) OR (height # cliHeight) THEN
2087
                cliWidth := width;
2080
                cliWidth := width;
2088
                cliHeight := height;
2081
                cliHeight := height;
2089
                resize;
2082
                resize;
2090
                resized := TRUE
2083
                resized := TRUE
2091
            END;
2084
            END;
2092
            K.SetEventsMask({0, 1, 2, 5, 6, 31})
2085
            K.SetEventsMask({0, 1, 2, 5, 6, 31})
2093
        ELSE
2086
        ELSE
2094
            K.SetEventsMask({0, 30, 31})
2087
            K.SetEventsMask({0, 30, 31})
2095
        END;
2088
        END;
2096
        draw_window
2089
        draw_window
2097
    END
2090
    END
2098
END Redraw;
2091
END Redraw;
2099
 
2092
 
2100
 
2093
 
2101
PROCEDURE main;
2094
PROCEDURE main;
2102
VAR
2095
VAR
2103
    err: INTEGER;
2096
    err: INTEGER;
2104
    fileName, filePath: RW.tFileName;
2097
    fileName, filePath: RW.tFileName;
2105
    width, height, cliWidth, cliHeight: INTEGER;
2098
    width, height, cliWidth, cliHeight: INTEGER;
2106
    resized: BOOLEAN;
2099
    resized: BOOLEAN;
2107
    firstClickX, firstClickY, time: INTEGER;
2100
    firstClickX, firstClickY, time: INTEGER;
2108
BEGIN
2101
BEGIN
2109
	delay := scrollDelay;
2102
	delay := scrollDelay;
2110
    K.GetSystemColors;
2103
    K.GetSystemColors;
2111
    Icons.get(icons, grayIcons);
2104
    Icons.get(icons, grayIcons);
2112
    modified := FALSE;
2105
    modified := FALSE;
2113
    switch := FALSE;
2106
    switch := FALSE;
2114
    closing := FALSE;
2107
    closing := FALSE;
2115
    textsCount := 0;
2108
    textsCount := 0;
2116
    curText := 0;
2109
    curText := 0;
2117
    mainTID := K.ThreadID();
2110
    mainTID := K.ThreadID();
2118
    K.SetIPC(IPC);
2111
    K.SetIPC(IPC);
2119
    U.ptr2str(K.GetName(), AppPath);
2112
    U.ptr2str(K.GetName(), AppPath);
2120
    Ini.load(AppPath);
2113
    Ini.load(AppPath);
2121
    LeftButtonUp;
2114
    LeftButtonUp;
2122
    resized := FALSE;
2115
    resized := FALSE;
2123
    K.ScreenSize(winWidth, winHeight);
2116
    K.ScreenSize(winWidth, winHeight);
2124
    winWidth := (winWidth*80) DIV 100 - (128 + 30);
2117
    winWidth := (winWidth*80) DIV 100 - (128 + 30);
2125
    winHeight := winHeight - (128 + 30);
2118
    winHeight := winHeight - (128 + 30);
2126
    winWidth := MAX(winWidth, minWinWidth);
2119
    winWidth := MAX(winWidth, minWinWidth);
2127
    winHeight := MAX(winHeight, minWinHeight);
2120
    winHeight := MAX(winHeight, minWinHeight);
2128
    cliWidth := winWidth;
2121
    cliWidth := winWidth;
2129
    cliHeight := winHeight;
2122
    cliHeight := winHeight;
2130
    LEFT := searchLeft;
2123
    LEFT := searchLeft;
2131
    canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 10), winHeight - (TOP + BOTTOM + 4) - K.SkinHeight());
2124
    canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 11), winHeight - (TOP + BOTTOM + 5) - K.SkinHeight());
2132
    tabs := Tabs.create();
2125
    tabs := Tabs.create();
2133
    Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, canvas.width, Tabs.tabHeight);
2126
    Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, canvas.width, Tabs.tabHeight);
2134
    font1 := G.CreateFont(1, "", {});
2127
    font1 := G.CreateFont(1, "", {});
2135
    font2 := G.CreateFont(2, "", {});
2128
    font2 := G.CreateFont(2, "", {});
2136
    font := font1;
2129
    font := font1;
2137
    G.SetFont(canvas, font);
2130
    G.SetFont(canvas, font);
2138
    T.init(resetTimer);
2131
    T.init(resetTimer);
2139
    T.setCanvas(canvas);
2132
    T.setCanvas(canvas);
2140
    U.ptr2str(K.GetCommandLine(), fileName);
2133
    U.ptr2str(K.GetCommandLine(), fileName);
2141
 
2134
 
2142
    context := CreateContextMenu();
2135
    context := CreateContextMenu();
2143
    menuFile := CreateMenuFile();
2136
    menuFile := CreateMenuFile();
2144
    subCurLine := CreateMenuCurLine();
2137
    subCurLine := CreateMenuCurLine();
2145
    subIndent := CreateMenuIndent();
2138
    subIndent := CreateMenuIndent();
2146
    subCase := CreateMenuCase();
2139
    subCase := CreateMenuCase();
2147
    menuEdit := CreateMenuEdit();
2140
    menuEdit := CreateMenuEdit();
2148
    subCurLine.parent := menuEdit;
2141
    subCurLine.parent := menuEdit;
2149
    subIndent.parent := menuEdit;
2142
    subIndent.parent := menuEdit;
2150
    subCase.parent := menuEdit;
2143
    subCase.parent := menuEdit;
2151
    subBookmark := CreateMenuBookmark();
2144
    subBookmark := CreateMenuBookmark();
2152
    menuSearch := CreateMenuSearch();
2145
    menuSearch := CreateMenuSearch();
2153
    subBookmark.parent := menuSearch;
2146
    subBookmark.parent := menuSearch;
2154
    menuEncoding := CreateMenuEncoding();
2147
    menuEncoding := CreateMenuEncoding();
2155
    menuEOL := CreateMenuEOL();
2148
    menuEOL := CreateMenuEOL();
2156
    menuView := CreateMenuView();
2149
    menuView := CreateMenuView();
2157
    menuSyntax := CreateMenuSyntax();
2150
    menuSyntax := CreateMenuSyntax();
2158
    menuProgram := CreateMenuProgram();
2151
    menuProgram := CreateMenuProgram();
2159
    menuTools := CreateMenuTools();
2152
    menuTools := CreateMenuTools();
2160
 
2153
 
2161
    Ini.getSettings(buildScript, runScript, debugScript);
2154
    Ini.getSettings(buildScript, runScript, debugScript);
2162
    IF fileName = "" THEN
2155
    IF fileName = "" THEN
2163
        text := T.New();
2156
        text := T.New();
2164
        filePath := "/rd/1"
2157
        filePath := "/rd/1"
2165
    ELSE
2158
    ELSE
2166
        text := T.open(fileName, err);
2159
        text := T.open(fileName, err);
2167
        IF text = NIL THEN
2160
        IF text = NIL THEN
2168
            error("'cedit: error opening file' -E");
2161
            error("'cedit: error opening file' -E");
2169
            Exit
2162
            K.Exit
2170
        ELSE
2163
        ELSE
2171
            U.getPath(fileName, filePath)
2164
            U.getPath(fileName, filePath)
2172
        END
2165
        END
2173
    END;
2166
    END;
2174
    OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, "");
2167
    OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, "");
2175
    insert(0, text);
2168
    insert(0, text);
2176
    Scroll.create(FALSE, canvas.width, scrollWidth, scrollWidth, scrollWidth, hScroll);
2169
    Scroll.create(FALSE, canvas.width + 1, scrollWidth, scrollWidth, scrollWidth, hScroll);
2177
    Scroll.create(TRUE, scrollWidth, canvas.height, scrollWidth, scrollWidth, vScroll);
2170
    Scroll.create(TRUE, scrollWidth, canvas.height + 1, scrollWidth, scrollWidth, vScroll);
2178
    T.resize(canvas.width, canvas.height);
2171
    T.resize(canvas.width, canvas.height);
2179
    T.SetPos(text, 0, 0);
2172
    T.SetPos(text, 0, 0);
2180
    confirm := FALSE;
2173
    confirm := FALSE;
2181
    notFound := FALSE;
2174
    notFound := FALSE;
2182
    menuFindClicked := FALSE;
2175
    menuFindClicked := FALSE;
2183
    menuActive := FALSE;
2176
    menuActive := FALSE;
2184
    search := FALSE;
2177
    search := FALSE;
2185
    searchOpened := FALSE;
2178
    searchOpened := FALSE;
2186
    createSearchForm;
2179
    createSearchForm;
2187
    new_searchText := "";
2180
    new_searchText := "";
2188
    searchText := "";
2181
    searchText := "";
2189
    cs := FALSE;
2182
    cs := FALSE;
2190
    whole := FALSE;
2183
    whole := FALSE;
2191
    replaced := 0;
2184
    replaced := 0;
2192
    K.SetEventsMask({0, 1, 2, 5, 6, 31});
2185
    K.SetEventsMask({0, 1, 2, 5, 6, 31});
2193
    Menu.init(resetTimer);
2186
    Menu.init(resetTimer);
2194
    draw_window;
2187
    draw_window;
2195
    Timer.create(mainTID);
2188
    Timer.create(mainTID);
2196
    WHILE TRUE DO
2189
    WHILE TRUE DO
2197
        CASE K.WaitForEvent() OF
2190
        CASE K.WaitForEvent() OF
2198
        |1: IF Menu.redraw THEN
2191
        |1: IF Menu.redraw THEN
2199
        		Redraw(resized, width, height, cliWidth, cliHeight)
2192
        		Redraw(resized, width, height, cliWidth, cliHeight)
2200
        	ELSE
2193
        	ELSE
2201
        		Menu.Redraw;
2194
        		Menu.Redraw;
2202
        		K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
2195
        		K.CreateWindow(30 + K.GetTickCount() MOD 128, 30 + K.GetTickCount() MOD 128, winWidth, winHeight, K.winColor, 73H, 0, 0, header);
2203
        		repaint
2196
        		repaint
2204
        	END
2197
        	END
2205
        |2: KeyDown(K.GetKey())
2198
        |2: KeyDown(K.GetKey())
2206
        |3: BtnClick
2199
        |3: BtnClick
2207
        |6: MouseEvent(resized, firstClickX, firstClickY, time)
2200
        |6: MouseEvent(resized, firstClickX, firstClickY, time)
2208
        |7: receiveIPC
2201
        |7: receiveIPC
2209
        END
2202
        END
2210
    END
2203
    END
2211
END main;
2204
END main;
2212
 
2205
 
2213
 
2206
 
2214
BEGIN
2207
BEGIN
2215
    main
2208
    main
2216
END CEdit.
2209
END CEdit.