Subversion Repositories Kolibri OS

Rev

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