Subversion Repositories Kolibri OS

Rev

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