Subversion Repositories Kolibri OS

Rev

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

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