Subversion Repositories Kolibri OS

Rev

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

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