Subversion Repositories Kolibri OS

Rev

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

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