Subversion Repositories Kolibri OS

Rev

Rev 9208 | Rev 9295 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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