Subversion Repositories Kolibri OS

Rev

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

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