Subversion Repositories Kolibri OS

Rev

Rev 9073 | Rev 9175 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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