Subversion Repositories Kolibri OS

Rev

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