Subversion Repositories Kolibri OS

Rev

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