Subversion Repositories Kolibri OS

Rev

Rev 9599 | Rev 9630 | 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
9628 akron1 31
    HEADER = "CEdit (13-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;
8728 leency 185
    AppPath, runScript, buildScript, debugScript: RW.tFileName;
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
9187 akron1 246
        EB.paint(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);
370
    Scroll.paint(scroll)
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
403
	        CheckBox.paint(BKW);
404
	        CheckBox.paint(CS);
405
	        CheckBox.paint(WH);
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;
9187 akron1 488
    EB.paint(FindEdit);
489
    EB.paint(ReplaceEdit);
490
    EB.paint(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
9577 akron1 951
        K.Run("/sys/@open", script)
8728 leency 952
    END
953
END Script;
954
 
955
 
9197 akron1 956
PROCEDURE ShowSearchPanel (goto: BOOLEAN);
957
VAR
958
	i: INTEGER;
9073 leency 959
BEGIN
9197 akron1 960
	IF T.selected(text) & ~goto THEN
961
		T.getSelectedText(text, new_searchText);
962
		IF new_searchText # "" THEN
963
			i := 0;
964
			WHILE (new_searchText[i] # 0X) & (new_searchText[i] # Lines.TAB) DO
965
				INC(i)
966
			END;
967
			IF new_searchText[i] = 0X THEN
968
				searchText := new_searchText;
969
				EB.setValue(FindEdit, searchText);
970
				notFound := ~T.search(text, searchText, cs, whole);
971
			END
972
		END
973
	END;
9073 leency 974
    IF ~search THEN
975
        Search
976
    ELSIF ~searchOpened THEN
977
        search := FALSE;
978
        Search
9197 akron1 979
    END;
9410 akron1 980
    IF goto THEN
981
    	SetFocus(GotoEdit, TRUE)
9197 akron1 982
    ELSE
9448 akron1 983
    	SetFocus(FindEdit, TRUE)
9073 leency 984
    END
985
END ShowSearchPanel;
986
 
987
 
9174 akron1 988
PROCEDURE CanvasToScreen (VAR x, y: INTEGER);
989
VAR
990
    cliX, cliY,
991
    winX, winY: INTEGER;
992
BEGIN
993
    K.WinPos(winX, winY);
994
    K.ClientPos(cliX, cliY);
995
    x := x + winX + cliX + LEFT;
996
    y := y + winY + cliY + TOP;
997
END CanvasToScreen;
998
 
999
 
1000
PROCEDURE ShowMenu (menu: Menu.tMenu);
1001
VAR
1002
    winX, winY, cliX, cliY, x, y, i: INTEGER;
1003
    selected, enabled: BOOLEAN;
1004
BEGIN
1005
    IF menu = context THEN
1006
        mouse(x, y);
9208 akron1 1007
        IF ~(U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1)) THEN
9174 akron1 1008
            menu := NIL
1009
        END
1010
    ELSE
1011
        K.WinPos(winX, winY);
1012
        K.ClientPos(cliX, cliY);
1013
        x := winX + cliX;
9187 akron1 1014
        y := Menu.MainMenuHeight + winY + cliY
9174 akron1 1015
    END;
1016
    selected := T.selected(text);
1017
 
1018
    IF menu = menuFile THEN
1019
        Menu.setEnabled(menu, menuSave, text.modified);
1020
        Menu.setEnabled(menu, menuFolder, text.fileName # "");
1021
        i := 0;
1022
        WHILE (i < textsCount) & ~texts[i].modified DO
1023
            INC(i)
1024
        END;
1025
        Menu.setEnabled(menu, menuSaveAll, i < textsCount);
1026
        INC(x, menuFileX)
1027
    ELSIF (menu = menuEdit) OR (menu = context) THEN
1028
        Menu.setEnabled(menu, menuUndo, ~ChangeLog.isFirstGuard(text.edition));
1029
        Menu.setEnabled(menu, menuRedo, ~ChangeLog.isLastGuard(text.edition));
1030
        Menu.setEnabled(menu, menuCut, selected);
1031
        Menu.setEnabled(menu, menuCopy, selected);
1032
        Menu.setEnabled(menu, menuDelete, selected);
1033
        Menu.setEnabled(menu, menuPaste, CB.available());
1034
        IF menu = menuEdit THEN
1035
            INC(x, menuEditX)
1036
        ELSE
1037
            IF y + menu.height >= canvas.height THEN
1038
                DEC(y, menu.height)
1039
            END;
1040
            IF x + menu.width >= canvas.width THEN
1041
                DEC(x, menu.width)
1042
            END;
1043
            CanvasToScreen(x, y)
1044
        END
1045
    ELSIF menu = menuEncoding THEN
9336 akron1 1046
        Menu.option(menu, menuUTF8BOM, T.getEnc(text) = E.UTF8BOM);
1047
        Menu.option(menu, menuUTF8,    T.getEnc(text) = E.UTF8);
1048
        Menu.option(menu, menuCP866,   T.getEnc(text) = E.CP866);
1049
        Menu.option(menu, menuWin1251, T.getEnc(text) = E.W1251);
9174 akron1 1050
        INC(x, menuEncodingX)
1051
    ELSIF menu = menuView THEN
9182 akron1 1052
        Menu.check(menu, menuNumbers,  text.numbers);
1053
        Menu.check(menu, menuFontSize, font = font2);
9174 akron1 1054
        FOR i := 0 TO Ini.sections.count - 1 DO
9182 akron1 1055
            Menu.option(menu, menuColors + i, Ini.curSectionNum = i)
9174 akron1 1056
        END;
1057
        INC(x, menuViewX)
9190 akron1 1058
    ELSIF menu = menuLanguage THEN
1059
        Menu.option(menu, menuText,   text.lang = Languages.langText);
9182 akron1 1060
        Menu.option(menu, menuC,      text.lang = Languages.langC);
1061
        Menu.option(menu, menuFasm,   text.lang = Languages.langFasm);
1062
        Menu.option(menu, menuIni,    text.lang = Languages.langIni);
1063
        Menu.option(menu, menuJSON,   text.lang = Languages.langJSON);
1064
        Menu.option(menu, menuLua,    text.lang = Languages.langLua);
1065
        Menu.option(menu, menuOberon, text.lang = Languages.langOberon);
1066
        Menu.option(menu, menuPascal, text.lang = Languages.langPascal);
9190 akron1 1067
        INC(x, menuLanguageX)
9174 akron1 1068
    ELSIF menu = menuProgram THEN
1069
        Menu.setEnabled(menu, menuBuild, buildScript # "");
1070
        Menu.setEnabled(menu, menuDebug, debugScript # "");
1071
        Menu.setEnabled(menu, menuRun, runScript # "");
1072
        INC(x, menuProgramX)
1073
    ELSIF menu = menuTools THEN
1074
        INC(x, menuToolsX)
1075
    ELSIF menu = menuSearch THEN
1076
        INC(x, menuSearchX)
1077
    END;
1078
 
1079
    enabled := search & (searchText # "");
1080
    Menu.setEnabled(menuSearch, menuFindNext, enabled);
1081
    Menu.setEnabled(menuSearch, menuFindPrev, enabled);
1082
 
1083
    Menu.setEnabled(subIndent, menuIncInd, selected);
1084
    Menu.setEnabled(subIndent, menuDecInd, selected);
1085
 
1086
    Menu.setEnabled(subCase, menuUpper, selected);
1087
    Menu.setEnabled(subCase, menuLower, selected);
1088
 
9336 akron1 1089
	Menu.option(subEOL, menuCRLF, T.getEol(text) = RW.EOL_CRLF);
1090
	Menu.option(subEOL, menuLF,   T.getEol(text) = RW.EOL_LF);
1091
	Menu.option(subEOL, menuCR,   T.getEol(text) = RW.EOL_CR);
9190 akron1 1092
 
9174 akron1 1093
    IF menu # NIL THEN
9448 akron1 1094
    	timerEnabled := FALSE;
9174 akron1 1095
        IF Menu.opened(menu) THEN
1096
            Menu.close(menu)
1097
        END;
9175 akron1 1098
        Menu.open(menu, x, y);
1099
        menuActive := TRUE
1100
    END
9174 akron1 1101
END ShowMenu;
1102
 
1103
 
9208 akron1 1104
PROCEDURE setScript (VAR script: RW.tFileName);
1105
VAR
1106
	temp: RW.tFileName;
1107
BEGIN
1108
	OpenFile(temp, ShellFilter);
1109
	IF temp # "" THEN
1110
		script := temp
1111
	END
1112
END setScript;
1113
 
1114
 
8728 leency 1115
PROCEDURE receiveIPC;
9174 akron1 1116
VAR
1117
	scrollIPC: BOOLEAN;
9187 akron1 1118
	item: List.tItem;
8728 leency 1119
BEGIN
9174 akron1 1120
	scrollIPC := FALSE;
9448 akron1 1121
    IF IPC[0] = mainTID THEN
9174 akron1 1122
    	IF IPC[2] = Scroll.ScrollIPC THEN
9208 akron1 1123
    		Scroll.receiveIPC(IPC, scrollIPC)
9174 akron1 1124
    	END;
9208 akron1 1125
    	IF ~scrollIPC THEN
1126
    		IPC[2] := 0
1127
    	END
9187 akron1 1128
    ELSE
1129
    	IF ~Menu.isSender(IPC[0]) THEN
1130
   			IPC[2] := 0
1131
    	ELSE
1132
    		IF IPC[2] < 0 THEN
1133
    			item := List.getItem(mainMenu, (-IPC[2] - mainMenuBtn) MOD mainMenu.count);
1134
    			IF item # NIL THEN
1135
    				ShowMenu(item(Menu.tMainItem).menu)
1136
    			END;
1137
    			IPC[2] := 0
1138
    		END
1139
    	END
8728 leency 1140
    END;
9208 akron1 1141
    IF ~scrollIPC THEN
1142
	    CASE IPC[2] OF
1143
	    |0:
1144
	    |menuCut:       T.key(text, ORD("X"), FALSE, TRUE)
1145
	    |menuCopy:      T.key(text, ORD("C"), FALSE, TRUE)
1146
	    |menuPaste:     T.key(text, ORD("V"), FALSE, TRUE)
1147
	    |menuDelete:    T.key(text,       46, FALSE, FALSE)
1148
	    |menuSelectAll: T.key(text, ORD("A"), FALSE, TRUE)
8728 leency 1149
 
9208 akron1 1150
	    |menuNew:
1151
	        NewFile
1152
	    |menuOpen:
9628 akron1 1153
	        OpenDial
9208 akron1 1154
	    |menuSave:
1155
	        save(text);
1156
	        repaint
1157
	    |menuSaveAs:
1158
	        saveAs(text);
1159
	        repaint
1160
	    |menuSaveAll:
1161
	        saveAll;
1162
	        repaint
1163
	    |menuClose:
1164
	        closeFile(TRUE, curText)
1165
	    |menuFolder:
9577 akron1 1166
	        K.Run("/sys/File Managers/Eolite", text.fileName)
9208 akron1 1167
	    |menuExit:
1168
	        Close
1169
	    |menuUndo:
1170
	        T.undo(text);
1171
	        repaint
1172
	    |menuRedo:
1173
	        T.redo(text);
1174
	        repaint
1175
	    |menuFind:
1176
	        ShowSearchPanel(FALSE)
1177
	    |menuFindNext:
1178
	        notFound := ~T.findNext(text, BKW.value);
1179
	        menuFindClicked := TRUE
1180
	    |menuFindPrev:
1181
	        notFound := ~T.findNext(text, ~BKW.value);
1182
	        menuFindClicked := TRUE
1183
	    |menuGoto:
1184
	        ShowSearchPanel(TRUE)
1185
	    |menuToggleBookmark:
1186
	    	T.toggleLabel(text)
1187
	    |menuNextBookmark:
1188
	    	T.gotoLabel(text, TRUE)
1189
	    |menuPrevBookmark:
1190
	    	T.gotoLabel(text, FALSE)
1191
	    |menuNumbers:
1192
	        T.toggleNumbers(text)
1193
	    |menuFontSize:
1194
	        IF font = font1 THEN
1195
	            font := font2
1196
	        ELSE
1197
	            font := font1
1198
	        END;
1199
	        resize
1200
	    |menuText:
1201
	        T.setLang(text, Languages.langText)
1202
	    |menuC:
1203
	        T.setLang(text, Languages.langC)
1204
	    |menuFasm:
1205
	        T.setLang(text, Languages.langFasm)
1206
	    |menuIni:
1207
	        T.setLang(text, Languages.langIni)
1208
	    |menuJSON:
1209
	        T.setLang(text, Languages.langJSON)
1210
	    |menuLua:
1211
	        T.setLang(text, Languages.langLua)
1212
	    |menuOberon:
1213
	        T.setLang(text, Languages.langOberon)
1214
	    |menuPascal:
1215
	        T.setLang(text, Languages.langPascal)
1216
	    |menuBuild:
1217
	        Script(buildScript)
1218
	    |menuBuildScript:
1219
	    	setScript(buildScript)
1220
	    |menuRun:
1221
	        Script(runScript)
1222
	    |menuRunScript:
1223
	    	setScript(runScript)
1224
	    |menuDebug:
1225
	        Script(debugScript)
1226
	    |menuDebugScript:
1227
	    	setScript(debugScript)
1228
	    |menuUTF8BOM:
9336 akron1 1229
	    	T.setEnc(text, E.UTF8BOM)
9208 akron1 1230
	    |menuUTF8:
9336 akron1 1231
	    	T.setEnc(text, E.UTF8)
9208 akron1 1232
	    |menuCP866:
9336 akron1 1233
	    	T.setEnc(text, E.CP866)
9208 akron1 1234
	    |menuWin1251:
9336 akron1 1235
	    	T.setEnc(text, E.W1251)
9208 akron1 1236
	    |menuLF:
9336 akron1 1237
	    	T.setEol(text, RW.EOL_LF)
9208 akron1 1238
	    |menuCRLF:
9336 akron1 1239
	    	T.setEol(text, RW.EOL_CRLF)
9208 akron1 1240
	    |menuCR:
9336 akron1 1241
	    	T.setEol(text, RW.EOL_CR)
9208 akron1 1242
	    |menuPipet:
9577 akron1 1243
	        K.Run("/sys/develop/pipet", "")
9457 akron1 1244
	    |menuMagnify:
9577 akron1 1245
	        K.Run("/sys/magnify", "")
9208 akron1 1246
	    |menuBoard:
9577 akron1 1247
	        K.Run("/sys/develop/board", "")
9208 akron1 1248
	    |menuSysFunc:
9577 akron1 1249
	        K.Run("/sys/docpack", "f")
9208 akron1 1250
	    |menuColors..menuMaxColors:
1251
	        Ini.selectSection(IPC[2] - menuColors)
1252
	    |menuMoveUp:
9413 akron1 1253
	    	T.MoveLines(text, FALSE)
9208 akron1 1254
	    |menuMoveDown:
9413 akron1 1255
			T.MoveLines(text, TRUE)
9208 akron1 1256
	    |menuDuplicate:
1257
	    	T.dupLine(text)
1258
	    |menuRemove:
1259
	    	T.delLine(text)
1260
	    |menuIncInd:
1261
	    	T.Indent(text, TRUE)
1262
		|menuDecInd:
1263
			T.Indent(text, FALSE)
1264
		|menuUpper:
1265
			T.chCase(text, TRUE)
1266
		|menuLower:
1267
			T.chCase(text, FALSE)
1268
	    END;
9174 akron1 1269
    	IPC[0] := 0;
1270
    	IPC[1] := 0
1271
    END
8728 leency 1272
END receiveIPC;
1273
 
1274
 
1275
PROCEDURE MenuKeyDown (menu: Menu.tMenu; key: INTEGER): BOOLEAN;
1276
VAR
1277
    menuItem: INTEGER;
9073 leency 1278
    shift, ctrl: BOOLEAN;
8728 leency 1279
BEGIN
1280
    menuItem := -1;
9187 akron1 1281
    K.getKBState(shift, ctrl);
9073 leency 1282
    IF ctrl THEN
8728 leency 1283
        CASE key DIV 65536 OF
9060 leency 1284
        |17: menuItem := menuClose
8728 leency 1285
        |21: menuItem := menuRedo
1286
        |30: menuItem := menuSelectAll
9187 akron1 1287
        |32: menuItem := menuDuplicate
9336 akron1 1288
        |33,
1289
         35: menuItem := menuFind
8728 leency 1290
        |34: menuItem := menuGoto
1291
        |44: menuItem := menuUndo
1292
        |45: menuItem := menuCut
1293
        |46: menuItem := menuCopy
1294
        |47: menuItem := menuPaste
1295
        |24: menuItem := menuOpen
1296
        |31: menuItem := menuSave
1297
        |49: menuItem := menuNew
1298
        |67: menuItem := menuBuild
9187 akron1 1299
        |83: menuItem := menuRemove
1300
        |22: menuItem := menuUpper
1301
        |38: menuItem := menuLower
1302
        |60: menuItem := menuToggleBookmark
1303
        |72: menuItem := menuMoveUp
1304
        |80: menuItem := menuMoveDown
8728 leency 1305
        ELSE
1306
        END
1307
    ELSE
1308
        IF key DIV 65536 = 83 THEN
1309
            menuItem := menuDelete
1310
        ELSIF key DIV 65536 = 67 THEN
1311
            menuItem := menuRun
9187 akron1 1312
        ELSIF key DIV 65536 = 15 THEN
1313
            menuItem := menuIncInd
1314
        ELSIF (key DIV 65536 = 14) & shift THEN
1315
            menuItem := menuDecInd
1316
        ELSIF key DIV 65536 = 60 THEN
1317
        	IF shift THEN
1318
        		menuItem := menuPrevBookmark
1319
        	ELSE
1320
        		menuItem := menuNextBookmark
1321
        	END
8728 leency 1322
        END
1323
    END;
1324
    IF menuItem # -1 THEN
1325
        IF Menu.isEnabled(menu, menuItem) THEN
1326
            MenuItemClick(menu, menuItem)
1327
        ELSE
1328
            menuItem := -1
1329
        END
1330
    END
1331
    RETURN menuItem # -1
1332
END MenuKeyDown;
1333
 
1334
 
1335
PROCEDURE CreateContextMenu (): Menu.tMenu;
1336
VAR
1337
    menu: List.tList;
1338
BEGIN
1339
    menu := List.create(NIL);
1340
    Menu.AddMenuItem(menu, menuUndo,      "undo         ctrl-Z");
1341
    Menu.AddMenuItem(menu, menuRedo,      "redo         ctrl-Y");
1342
    Menu.delimiter(menu);
1343
    Menu.AddMenuItem(menu, menuCut,       "cut          ctrl-X");
1344
    Menu.AddMenuItem(menu, menuCopy,      "copy         ctrl-C");
1345
    Menu.AddMenuItem(menu, menuPaste,     "paste        ctrl-V");
1346
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1347
    Menu.delimiter(menu);
1348
    Menu.AddMenuItem(menu, menuSelectAll, "select all   ctrl-A");
1349
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1350
END CreateContextMenu;
1351
 
1352
 
1353
PROCEDURE CreateMenuFile (): Menu.tMenu;
1354
VAR
1355
    menu: List.tList;
1356
BEGIN
1357
    menu := List.create(NIL);
9050 leency 1358
    Menu.AddMenuItem(menu, menuNew,     "new         ctrl-N");
1359
    Menu.AddMenuItem(menu, menuOpen,    "open        ctrl-O");
1360
    Menu.AddMenuItem(menu, menuSave,    "save        ctrl-S");
1361
    Menu.AddMenuItem(menu, menuSaveAs,  "save as");
1362
    Menu.AddMenuItem(menu, menuSaveAll, "save all");
1363
    Menu.AddMenuItem(menu, menuFolder,  "folder");
8728 leency 1364
    Menu.delimiter(menu);
9060 leency 1365
    Menu.AddMenuItem(menu, menuClose,   "close       ctrl-W");
9050 leency 1366
    Menu.delimiter(menu);
1367
    Menu.AddMenuItem(menu, menuExit,    "exit");
8728 leency 1368
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1369
END CreateMenuFile;
1370
 
1371
 
1372
PROCEDURE CreateMenuEdit (): Menu.tMenu;
1373
VAR
1374
    menu: List.tList;
1375
BEGIN
1376
    menu := List.create(NIL);
9174 akron1 1377
    Menu.AddMenuItem(menu, menuUndo,      "undo            ctrl-Z");
1378
    Menu.AddMenuItem(menu, menuRedo,      "redo            ctrl-Y");
8728 leency 1379
    Menu.delimiter(menu);
9174 akron1 1380
    Menu.AddMenuItem(menu, menuCut,       "cut             ctrl-X");
1381
    Menu.AddMenuItem(menu, menuCopy,      "copy            ctrl-C");
1382
    Menu.AddMenuItem(menu, menuPaste,     "paste           ctrl-V");
8728 leency 1383
    Menu.AddMenuItem(menu, menuDelete,    "delete");
1384
    Menu.delimiter(menu);
9174 akron1 1385
    Menu.AddMenuItem(menu, menuSelectAll, "select all      ctrl-A");
1386
    Menu.delimiter(menu);
1387
    Menu.AddMenuItem(menu, menuCurLine,   "current line");
1388
    Menu.child(menu, subCurLine);
1389
    Menu.AddMenuItem(menu, menuIndent,    "indent");
1390
    Menu.child(menu, subIndent);
1391
    Menu.AddMenuItem(menu, menuCase,      "case");
1392
    Menu.child(menu, subCase);
8728 leency 1393
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1394
END CreateMenuEdit;
1395
 
1396
 
9174 akron1 1397
PROCEDURE CreateMenuSearch (): Menu.tMenu;
1398
VAR
1399
    menu: List.tList;
1400
BEGIN
1401
    menu := List.create(NIL);
1402
    Menu.AddMenuItem(menu, menuFind,     "search           ctrl-F");
1403
    Menu.AddMenuItem(menu, menuFindNext, "find next        F3");
1404
    Menu.AddMenuItem(menu, menuFindPrev, "find previous    shift-F3");
1405
    Menu.AddMenuItem(menu, menuGoto,     "go to line       ctrl-G");
1406
    Menu.delimiter(menu);
1407
    Menu.AddMenuItem(menu, menuBookmark, "bookmark");
1408
    Menu.child(menu, subBookmark);
1409
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1410
END CreateMenuSearch;
1411
 
1412
 
8728 leency 1413
PROCEDURE CreateMenuEncoding (): Menu.tMenu;
1414
VAR
1415
    menu: List.tList;
1416
BEGIN
1417
    menu := List.create(NIL);
9073 leency 1418
    Menu.AddMenuItem(menu, menuUTF8BOM, E.names[E.UTF8BOM]);
1419
    Menu.AddMenuItem(menu, menuUTF8,    E.names[E.UTF8]);
1420
    Menu.AddMenuItem(menu, menuCP866,   E.names[E.CP866]);
1421
    Menu.AddMenuItem(menu, menuWin1251, E.names[E.W1251]);
9190 akron1 1422
    Menu.delimiter(menu);
1423
    Menu.AddMenuItem(menu, menuEOL,     "EOL");
1424
    Menu.child(menu, subEOL);
8728 leency 1425
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1426
END CreateMenuEncoding;
1427
 
1428
 
9180 akron1 1429
PROCEDURE CreateMenuEOL (): Menu.tMenu;
1430
VAR
1431
    menu: List.tList;
1432
BEGIN
1433
    menu := List.create(NIL);
1434
    Menu.AddMenuItem(menu, menuCRLF, RW.eolNames[RW.EOL_CRLF]);
1435
    Menu.AddMenuItem(menu, menuLF,   RW.eolNames[RW.EOL_LF]);
1436
    Menu.AddMenuItem(menu, menuCR,   RW.eolNames[RW.EOL_CR]);
1437
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1438
END CreateMenuEOL;
1439
 
1440
 
8728 leency 1441
PROCEDURE CreateMenuView (): Menu.tMenu;
1442
VAR
1443
    menu: List.tList;
1444
    colors: Ini.tSection;
1445
    idx: INTEGER;
1446
BEGIN
1447
    menu := List.create(NIL);
9210 akron1 1448
    Menu.AddMenuItem(menu, menuNumbers,  "line numbers");
8772 leency 1449
    Menu.AddMenuItem(menu, menuFontSize, "x2");
8728 leency 1450
    Menu.delimiter(menu);
1451
 
1452
    colors := Ini.sections.first(Ini.tSection);
1453
    idx := menuColors;
1454
    WHILE colors # NIL DO
1455
        Menu.AddMenuItem(menu, idx, colors.name);
1456
        INC(idx);
1457
        colors := colors.next(Ini.tSection)
1458
    END;
1459
 
1460
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1461
END CreateMenuView;
1462
 
1463
 
9190 akron1 1464
PROCEDURE CreateMenuLanguage (): Menu.tMenu;
8728 leency 1465
VAR
1466
    menu: List.tList;
1467
BEGIN
1468
    menu := List.create(NIL);
1469
    Menu.AddMenuItem(menu, menuC,      "C");
1470
    Menu.AddMenuItem(menu, menuFasm,   "Fasm");
1471
    Menu.AddMenuItem(menu, menuIni,    "Ini");
9174 akron1 1472
    Menu.AddMenuItem(menu, menuJSON,   "JSON");
8728 leency 1473
    Menu.AddMenuItem(menu, menuLua,    "Lua");
1474
    Menu.AddMenuItem(menu, menuOberon, "Oberon");
1475
    Menu.AddMenuItem(menu, menuPascal, "Pascal");
1476
    Menu.delimiter(menu);
9190 akron1 1477
    Menu.AddMenuItem(menu, menuText,   "Text");
8728 leency 1478
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
9190 akron1 1479
END CreateMenuLanguage;
8728 leency 1480
 
1481
 
1482
PROCEDURE CreateMenuProgram (): Menu.tMenu;
1483
VAR
1484
    menu: List.tList;
1485
BEGIN
1486
    menu := List.create(NIL);
9174 akron1 1487
    Menu.AddMenuItem(menu, menuBuild,       "build    ctrl-F9");
8728 leency 1488
    Menu.AddMenuItem(menu, menuBuildScript, "script");
1489
    Menu.delimiter(menu);
1490
    Menu.AddMenuItem(menu, menuRun,         "run           F9");
1491
    Menu.AddMenuItem(menu, menuRunScript,   "script");
1492
    Menu.delimiter(menu);
1493
    Menu.AddMenuItem(menu, menuDebug,       "debug");
1494
    Menu.AddMenuItem(menu, menuDebugScript, "script");
1495
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1496
END CreateMenuProgram;
1497
 
1498
 
1499
PROCEDURE CreateMenuTools (): Menu.tMenu;
1500
VAR
1501
    menu: List.tList;
1502
BEGIN
1503
    menu := List.create(NIL);
1504
    Menu.AddMenuItem(menu, menuPipet,   "pipet");
9457 akron1 1505
    Menu.AddMenuItem(menu, menuMagnify, "magnify");
9073 leency 1506
    Menu.AddMenuItem(menu, menuBoard,   "board");
8728 leency 1507
    Menu.AddMenuItem(menu, menuSysFunc, "system functions");
1508
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1509
END CreateMenuTools;
1510
 
1511
 
9174 akron1 1512
PROCEDURE CreateMenuCurLine(): Menu.tMenu;
8728 leency 1513
VAR
9174 akron1 1514
    menu: List.tList;
8728 leency 1515
BEGIN
9174 akron1 1516
    menu := List.create(NIL);
1517
    Menu.AddMenuItem(menu, menuMoveUp,    "move up     ctrl-Up");
1518
    Menu.AddMenuItem(menu, menuMoveDown,  "move down   ctrl-Down");
1519
    Menu.AddMenuItem(menu, menuDuplicate, "duplicate   ctrl-D");
1520
    Menu.AddMenuItem(menu, menuRemove,    "remove      ctrl-Del");
1521
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1522
END CreateMenuCurLine;
8728 leency 1523
 
1524
 
9174 akron1 1525
PROCEDURE CreateMenuIndent(): Menu.tMenu;
8728 leency 1526
VAR
9174 akron1 1527
    menu: List.tList;
8728 leency 1528
BEGIN
9174 akron1 1529
    menu := List.create(NIL);
1530
    Menu.AddMenuItem(menu, menuIncInd, "increase    Tab");
1531
    Menu.AddMenuItem(menu, menuDecInd, "decrease    shift-Bksp");
1532
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1533
END CreateMenuIndent;
8728 leency 1534
 
1535
 
9174 akron1 1536
PROCEDURE CreateMenuCase(): Menu.tMenu;
1537
VAR
1538
    menu: List.tList;
1539
BEGIN
1540
    menu := List.create(NIL);
1541
    Menu.AddMenuItem(menu, menuUpper, "UPPER    ctrl-U");
1542
    Menu.AddMenuItem(menu, menuLower, "lower    ctrl-L");
1543
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1544
END CreateMenuCase;
8728 leency 1545
 
1546
 
9174 akron1 1547
PROCEDURE CreateMenuBookmark(): Menu.tMenu;
1548
VAR
1549
    menu: List.tList;
1550
BEGIN
1551
    menu := List.create(NIL);
1552
    Menu.AddMenuItem(menu, menuToggleBookmark, "toggle      ctrl-F2");
1553
    Menu.AddMenuItem(menu, menuNextBookmark,   "next        F2");
1554
    Menu.AddMenuItem(menu, menuPrevBookmark,   "previous    shift-F2");
1555
    RETURN Menu.create(menu, MenuItemClick, MenuKeyDown)
1556
END CreateMenuBookmark;
1557
 
1558
 
9190 akron1 1559
PROCEDURE HideSearch;
1560
BEGIN
1561
    SetFocus(FindEdit, FALSE);
1562
    searchOpened := FALSE;
9457 akron1 1563
    LEFT := LEFT_PADDING;
9190 akron1 1564
    resize;
1565
    draw_window
1566
END HideSearch;
1567
 
1568
 
9073 leency 1569
PROCEDURE KeyDown (key: INTEGER);
1570
VAR
1571
    keyCode: INTEGER;
1572
    shift, ctrl: BOOLEAN;
1573
BEGIN
9187 akron1 1574
	K.getKBState(shift, ctrl);
9073 leency 1575
    keyCode := key DIV 65536;
1576
    IF confirm THEN
1577
        IF keyCode = 28 THEN (* Enter *)
1578
            save(text);
1579
            IF ~text.modified THEN
1580
                closeFile(FALSE, curText)
1581
            END
1582
        END;
1583
        key := -1
1584
    ELSE
1585
        IF keyCode = 61 THEN (* F3 *)
1586
            key := -1;
1587
            IF search & (searchText # "") THEN
1588
                IF shift THEN
9182 akron1 1589
                    notFound := ~T.findNext(text, ~BKW.value)
9073 leency 1590
                ELSE
9182 akron1 1591
                    notFound := ~T.findNext(text, BKW.value)
9073 leency 1592
                END
1593
            END
1594
        ELSIF keyCode = 60 THEN (* F2 *)
1595
            key := -1;
1596
            IF ctrl THEN
1597
                T.toggleLabel(text)
1598
            ELSE
1599
                T.gotoLabel(text, ~shift)
1600
            END
1601
        ELSIF keyCode = 67 THEN (* F9 *)
1602
            key := -1;
1603
            IF ctrl THEN
1604
                Script(buildScript)
1605
            ELSE
1606
                Script(runScript)
1607
            END
9187 akron1 1608
        ELSIF keyCode = 68 THEN (* F10 *)
9190 akron1 1609
        	IF shift THEN
1610
        		ShowMenu(context)
1611
        	ELSE
1612
        		ShowMenu(menuFile)
1613
        	END;
1614
            key := -1
9073 leency 1615
        ELSIF keyCode = 1 THEN (* Esc *)
1616
            IF search THEN
9190 akron1 1617
            	IF shift THEN
1618
            		HideSearch
1619
            	ELSE
1620
                	Search
1621
                END
1622
            END;
1623
            key := -1
9073 leency 1624
        ELSIF (keyCode = 55) & (key DIV 256 MOD 256 = 52) THEN (* PrtScn *)
1625
            key := -1
9174 akron1 1626
        ELSIF (keyCode = 14) & shift THEN (* shift+Backspace *)
1627
            key := -1;
1628
            T.input(text, -8)
9073 leency 1629
        ELSIF (keyCode = 15) & ctrl THEN (* ctrl+Tab *)
1630
            key := -1;
1631
            SwitchTab((curText + 1) MOD textsCount)
9336 akron1 1632
        ELSIF ((keyCode = 33) OR (keyCode = 35)) & ctrl THEN (* ctrl+F, ctrl+H*)
9073 leency 1633
            key := -1;
9197 akron1 1634
            ShowSearchPanel(FALSE)
9336 akron1 1635
        ELSIF (keyCode = 34) & ctrl THEN (* ctrl+G *)
9073 leency 1636
            key := -1;
9197 akron1 1637
            ShowSearchPanel(TRUE)
9410 akron1 1638
        ELSIF (keyCode = 18) & ctrl THEN (* ctrl+E *)
1639
            key := -1;
1640
            T.selectWord(text)
9073 leency 1641
        ELSE
1642
            IF EditBox_Focus(FindEdit) THEN
9336 akron1 1643
            	IF keyCode = 15 THEN (* Tab *)
1644
            		SetFocus(ReplaceEdit, TRUE)
1645
            	ELSE
1646
	                EB.key(FindEdit, key);
1647
	                EditBox_GetValue(FindEdit, new_searchText);
1648
	                IF new_searchText # searchText THEN
1649
	                    searchText := new_searchText;
1650
	                    notFound := ~T.search(text, searchText, cs, whole)
1651
	                END
9073 leency 1652
                END
1653
            ELSIF EditBox_Focus(ReplaceEdit) THEN
9336 akron1 1654
            	IF keyCode = 15 THEN (* Tab *)
1655
            		SetFocus(GotoEdit, TRUE)
1656
            	ELSE
1657
                	EB.key(ReplaceEdit, key);
1658
                	EditBox_GetValue(ReplaceEdit, replaceText)
1659
                END
9073 leency 1660
            ELSIF EditBox_Focus(GotoEdit) THEN
9336 akron1 1661
            	IF keyCode = 15 THEN (* Tab *)
1662
            		SetFocus(FindEdit, TRUE)
1663
            	ELSE
1664
	                IF (key DIV 256) MOD 256 = 13 THEN
1665
	                    goto
1666
	                ELSE
1667
	                    EB.key(GotoEdit, key)
1668
	                END
9073 leency 1669
                END
1670
            ELSE
1671
                CASE keyCode OF
1672
                |73: key := 33
1673
                |81: key := 34
1674
                |71: key := 36
1675
                |79: key := 35
1676
                |72: key := 38
1677
                |80: key := 40
1678
                |75: key := 37
1679
                |77: key := 39
9174 akron1 1680
                |82, 91, 219, 92, 220: key := -1 (* insert, windows *)
1681
                |93: ShowMenu(context); key := -1
9073 leency 1682
                |83: key := 46
9208 akron1 1683
                |59, 62..66, 87, 88: key := -1 (* F1, F4..F8, F11, F12 *)
9073 leency 1684
                ELSE
1685
                    IF ctrl THEN
1686
                        CASE keyCode OF
1687
                        |17: closeFile(TRUE, curText);
1688
                             key := -2
1689
                        |21: T.redo(text);
1690
                             key := -1
1691
                        |22: key := ORD("U")
1692
                        |24: key := -1;
9628 akron1 1693
                             OpenDial
9073 leency 1694
                        |30: key := ORD("A")
1695
                        |31: key := -1;
1696
                             save(text)
1697
                        |32: key := ORD("D")
1698
                        |38: key := ORD("L")
1699
                        |44: T.undo(text);
1700
                             key := -1
1701
                        |45: key := ORD("X")
1702
                        |46: key := ORD("C")
1703
                        |47: key := ORD("V")
9431 akron1 1704
                        |49,
1705
                         20: key := -1;
9073 leency 1706
                             NewFile
1707
                        ELSE
1708
                            key := -1
1709
                        END
1710
                    ELSE
1711
                        T.input(text, E.cp866[key DIV 256 MOD 256]);
1712
                        key := -1
1713
                    END
1714
                END;
1715
                IF key >= 0 THEN
1716
                    T.key(text, key, shift, ctrl)
1717
                END
1718
            END
1719
        END
1720
    END;
1721
    IF key # -2 THEN
1722
        repaint
1723
    END
1724
END KeyDown;
1725
 
1726
 
1727
PROCEDURE BtnClick;
1728
VAR
1729
    btn: INTEGER;
1730
    middle, exit: BOOLEAN;
9187 akron1 1731
    menu: Menu.tMenu;
9073 leency 1732
BEGIN
1733
    btn := K.ButtonCode(middle);
9187 akron1 1734
    IF U.between(Tabs.btnID, btn, Tabs.btnID + maxTexts - 1) THEN
9073 leency 1735
        DEC(btn, Tabs.btnID);
1736
        IF middle THEN
1737
            IF texts[btn].modified THEN
1738
                SwitchTab(btn)
1739
            END;
1740
            closeFile(TRUE, btn)
1741
        ELSE
1742
            SwitchTab(btn)
1743
        END;
1744
        btn := 0
1745
    ELSE
1746
        IF middle THEN
1747
            btn := 0
1748
        END
1749
    END;
9187 akron1 1750
    IF btn # 0 THEN
1751
    	menu := Menu.ClickMain(mainMenu, btn);
1752
    	IF menu # NIL THEN
1753
    		ShowMenu(menu);
1754
    		btn := 0
1755
    	END
1756
    END;
9073 leency 1757
    CASE btn OF
9448 akron1 1758
    |Tabs.btnLeft:  Tabs.scroll(tabs, -1); switch := TRUE; repaint
1759
    |Tabs.btnRight: Tabs.scroll(tabs, +1); switch := TRUE; repaint
9073 leency 1760
 
1761
    |0:
1762
 
1763
    |btnNo:
1764
        exit := closing;
1765
        closeFile(FALSE, curText);
1766
        repaint;
1767
        IF exit THEN
1768
            Close
1769
        END
1770
    |btnYes:
1771
        exit := closing;
1772
        save(text);
1773
        IF ~text.modified THEN
1774
            closeFile(FALSE, curText)
1775
        END;
1776
        repaint;
1777
        IF exit THEN
1778
            Close
1779
        END
1780
    |btnClose:
1781
        Close
1782
    |btnNew:
1783
        NewFile;
1784
        repaint
1785
    |btnOpen:
9628 akron1 1786
        OpenDial
9073 leency 1787
    |btnSave:
1788
        save(text);
1789
        repaint
1790
    |btnSearch:
9197 akron1 1791
        ShowSearchPanel(FALSE);
1792
        repaint
9190 akron1 1793
    |btnCloseSearch:
9073 leency 1794
        Search
9190 akron1 1795
    |btnHideSearch:
1796
        HideSearch
9073 leency 1797
    |btnUndo:
1798
        T.undo(text);
1799
        repaint
1800
    |btnRedo:
1801
        T.redo(text);
1802
        repaint
1803
    |btnUpper:
1804
        T.chCase(text, TRUE);
1805
        repaint
1806
    |btnLower:
1807
        T.chCase(text, FALSE);
1808
        repaint
1809
    |btnBuild:
1810
        Script(buildScript)
1811
    |btnRun:
1812
        Script(runScript)
1813
    |btnFindNext:
1814
        IF searchText # "" THEN
9182 akron1 1815
            notFound := ~T.findNext(text, BKW.value);
9560 akron1 1816
            SetFocus(FindEdit, FALSE);
9073 leency 1817
            repaint
1818
        END
1819
    |btnReplace:
1820
        T.replace(text, replaceText, LENGTH(searchText));
9560 akron1 1821
        SetFocus(FindEdit, FALSE);
9073 leency 1822
        repaint
1823
    |btnReplaceAll:
1824
        notFound := ~T.search(text, searchText, cs, whole);
1825
        IF ~notFound THEN
1826
            replaced := T.replaceAll(text, replaceText, LENGTH(searchText));
1827
        END;
9560 akron1 1828
        SetFocus(FindEdit, FALSE);
9073 leency 1829
        repaint
1830
    |btnGoto:
1831
        goto;
1832
        repaint
1833
    END
1834
END BtnClick;
1835
 
1836
 
1837
PROCEDURE MouseEvent (VAR resized: BOOLEAN; VAR firstClickX, firstClickY, time: INTEGER);
1838
CONST
1839
    DELAY = 10;
1840
VAR
1841
    msState: SET;
1842
    scroll, x, y, scrollX, scrollY: INTEGER;
9210 akron1 1843
    pos1, pos2: T.tPoint;
9073 leency 1844
 
1845
 
9210 akron1 1846
    PROCEDURE EditBox (VAR eb: EB.tEditBox);
9073 leency 1847
    VAR
1848
        focus: BOOLEAN;
1849
    BEGIN
1850
        focus := EditBox_Focus(eb);
9187 akron1 1851
        EB.mouse(eb);
9073 leency 1852
        IF focus # EditBox_Focus(eb) THEN
9174 akron1 1853
            SetFocus(eb, TRUE);
1854
            repaint
9073 leency 1855
        END
1856
    END EditBox;
1857
 
1858
 
1859
BEGIN
9174 akron1 1860
	CloseMenu;
9073 leency 1861
    IF ~resized THEN
1862
        msState := K.MouseState();
1863
        IF ~(0 IN msState) OR (16 IN msState) THEN
9208 akron1 1864
        	leftButton := FALSE
9073 leency 1865
        END;
1866
        scroll := K.Scroll();
1867
        IF scroll # 0 THEN
1868
            T.scroll(text, 0, scroll*3);
1869
            repaint
1870
        END;
1871
        IF leftButton THEN
1872
            IF K.GetTickCount() - time >= DELAY THEN
9210 akron1 1873
            	T.getPos(text, pos1.Y, pos1.X);
9073 leency 1874
                mouse(x, y);
1875
                T.mouse(text, x, y);
9210 akron1 1876
                T.getPos(text, pos2.Y, pos2.X);
1877
                IF (pos1.X # pos2.X) OR (pos1.Y # pos2.Y) THEN
1878
                	repaint
1879
                END
9073 leency 1880
            END
1881
        END;
9208 akron1 1882
 
1883
		Scroll.mouse(hScroll);
1884
		Scroll.mouse(vScroll);
1885
        T.getScroll(text, scrollX, scrollY);
1886
        IF (hScroll.value # scrollX) OR (vScroll.value # scrollY) THEN
1887
			T.scroll(text, hScroll.value - scrollX, vScroll.value - scrollY);
1888
        	repaint
1889
        END;
1890
 
9073 leency 1891
        IF (8 IN msState) & ~(24 IN msState) THEN
1892
            mouse(firstClickX, firstClickY);
1893
            time := click(firstClickX, firstClickY)
1894
        END;
1895
        IF 9 IN msState THEN
1896
            ShowMenu(context)
1897
        END;
1898
        IF 24 IN msState THEN
1899
            mouse(x, y);
9208 akron1 1900
            IF U.between(-4, x - firstClickX, 4) & U.between(-4, y - firstClickY, 4) THEN
1901
                IF U.between(0, x, canvas.width - 1) & U.between(0, y, canvas.height - 1) THEN
9073 leency 1902
                    leftButton := FALSE;
1903
                    T.selectWord(text);
1904
                    repaint
9431 akron1 1905
                ELSIF Tabs.DblClicked(tabs, x + LEFT, y + TOP) THEN
1906
                	leftButton := FALSE;
1907
                	NewFile;
1908
                	repaint
9073 leency 1909
                END
1910
            ELSE
1911
                firstClickX := x;
1912
                firstClickY := y;
1913
                time := click(firstClickX, firstClickY)
1914
            END
1915
        END
1916
    END;
1917
    IF search & searchOpened THEN
9208 akron1 1918
	    CheckBox.mouse(BKW);
1919
    	CheckBox.mouse(CS);
1920
    	CheckBox.mouse(WH);
9073 leency 1921
        EditBox(FindEdit);
1922
        EditBox(ReplaceEdit);
1923
        EditBox(GotoEdit);
9208 akron1 1924
        IF (CS.value # cs) OR (WH.value # whole) THEN
1925
            cs := CS.value;
1926
            whole := WH.value;
9073 leency 1927
            notFound := ~T.search(text, searchText, cs, whole);
1928
            repaint
1929
        END
1930
    END;
1931
    resized := FALSE
1932
END MouseEvent;
1933
 
1934
 
1935
PROCEDURE Redraw (VAR resized: BOOLEAN; VAR width, height, cliWidth, cliHeight: INTEGER);
1936
BEGIN
9628 akron1 1937
	K.GetSystemColors;
1938
	IF ~K.RolledUp() THEN
1939
		K.ClientSize(width, height);
1940
		IF (width # cliWidth) OR (height # cliHeight) THEN
1941
			cliWidth := width;
1942
			cliHeight := height;
1943
			resize;
1944
			resized := TRUE
1945
		END;
1946
		K.SetEventsMask({0, 1, 2, 5, 6, 31})
1947
	ELSE
1948
		SetCaption(text.fileName);
1949
		K.SetEventsMask({0, 30, 31})
1950
	END;
1951
	draw_window;
1952
	IF SkinHeight # K.SkinHeight() THEN
1953
		SkinHeight := K.SkinHeight();
1954
		Redraw(resized, width, height, cliWidth, cliHeight)
1955
	END
9073 leency 1956
END Redraw;
1957
 
1958
 
9208 akron1 1959
PROCEDURE ScrollChange;
1960
BEGIN
1961
	Scroll.change(hScroll);
1962
	Scroll.change(vScroll);
1963
	T.scroll(text, ORD(hScroll.Inc) - ORD(hScroll.Dec), ORD(vScroll.Inc) - ORD(vScroll.Dec));
1964
	IF menuActive THEN
1965
		draw_window;
1966
		menuActive := FALSE
1967
	ELSE
1968
		repaint
1969
	END
1970
END ScrollChange;
1971
 
1972
 
8728 leency 1973
PROCEDURE main;
1974
VAR
1975
    fileName, filePath: RW.tFileName;
9073 leency 1976
    width, height, cliWidth, cliHeight: INTEGER;
1977
    resized: BOOLEAN;
9628 akron1 1978
    firstClickX, firstClickY, time, blink, i: INTEGER;
8728 leency 1979
BEGIN
9526 akron1 1980
	header := "";
8762 leency 1981
    K.GetSystemColors;
9050 leency 1982
    switch := FALSE;
9073 leency 1983
    closing := FALSE;
9050 leency 1984
    textsCount := 0;
1985
    curText := 0;
8728 leency 1986
    mainTID := K.ThreadID();
1987
    K.SetIPC(IPC);
9628 akron1 1988
    Args.GetArg(0, AppPath);
8728 leency 1989
    Ini.load(AppPath);
9208 akron1 1990
    leftButton := FALSE;
8728 leency 1991
    resized := FALSE;
8772 leency 1992
    K.ScreenSize(winWidth, winHeight);
9050 leency 1993
    winWidth := (winWidth*80) DIV 100 - (128 + 30);
8772 leency 1994
    winHeight := winHeight - (128 + 30);
1995
    winWidth := MAX(winWidth, minWinWidth);
1996
    winHeight := MAX(winHeight, minWinHeight);
8762 leency 1997
    cliWidth := winWidth;
1998
    cliHeight := winHeight;
9457 akron1 1999
    LEFT := LEFT_PADDING;
9628 akron1 2000
    SkinHeight := K.SkinHeight();
2001
    canvas := G.CreateCanvas(winWidth - (LEFT + RIGHT + 11 + RIGHT_PADDING), winHeight - (TOP + BOTTOM + 5) - SkinHeight);
9050 leency 2002
    tabs := Tabs.create();
2003
    Tabs.setArea(tabs, LEFT, TOP - Tabs.tabHeight, canvas.width, Tabs.tabHeight);
8772 leency 2004
    font1 := G.CreateFont(1, "", {});
2005
    font2 := G.CreateFont(2, "", {});
2006
    font := font1;
8728 leency 2007
    G.SetFont(canvas, font);
9174 akron1 2008
    T.init(resetTimer);
8728 leency 2009
    T.setCanvas(canvas);
9180 akron1 2010
 
8728 leency 2011
    context := CreateContextMenu();
2012
    menuFile := CreateMenuFile();
9174 akron1 2013
    subCurLine := CreateMenuCurLine();
2014
    subIndent := CreateMenuIndent();
2015
    subCase := CreateMenuCase();
8728 leency 2016
    menuEdit := CreateMenuEdit();
9174 akron1 2017
    subCurLine.parent := menuEdit;
2018
    subIndent.parent := menuEdit;
2019
    subCase.parent := menuEdit;
2020
    subBookmark := CreateMenuBookmark();
2021
    menuSearch := CreateMenuSearch();
2022
    subBookmark.parent := menuSearch;
9190 akron1 2023
    subEOL := CreateMenuEOL();
8728 leency 2024
    menuEncoding := CreateMenuEncoding();
9190 akron1 2025
    subEOL.parent := menuEncoding;
8728 leency 2026
    menuView := CreateMenuView();
9190 akron1 2027
    menuLanguage := CreateMenuLanguage();
8728 leency 2028
    menuProgram := CreateMenuProgram();
2029
    menuTools := CreateMenuTools();
9174 akron1 2030
 
9187 akron1 2031
    mainMenu := Menu.CreateMain(mainMenuBtn);
2032
    Menu.AddMainItem(mainMenu, "file", menuFile);
2033
    Menu.AddMainItem(mainMenu, "edit", menuEdit);
2034
    Menu.AddMainItem(mainMenu, "search", menuSearch);
2035
    Menu.AddMainItem(mainMenu, "encoding", menuEncoding);
2036
    Menu.AddMainItem(mainMenu, "view", menuView);
9190 akron1 2037
    Menu.AddMainItem(mainMenu, "language", menuLanguage);
9187 akron1 2038
    Menu.AddMainItem(mainMenu, "program", menuProgram);
2039
    Menu.AddMainItem(mainMenu, "tools", menuTools);
2040
 
9522 akron1 2041
    Toolbar.create(toolbar, LEFT_PADDING + 5, toolbarTop);
9448 akron1 2042
    Toolbar.add(toolbar, btnNew,     2, "");
2043
    Toolbar.add(toolbar, btnOpen,    0, "");
2044
    Toolbar.add(toolbar, btnSave,    5, "");
2045
    Toolbar.delimiter(toolbar);
2046
    Toolbar.add(toolbar, btnSearch, 49, "");
2047
    Toolbar.delimiter(toolbar);
2048
    Toolbar.add(toolbar, btnUndo,   37, "");
2049
    Toolbar.add(toolbar, btnRedo,   36, "");
2050
    Toolbar.delimiter(toolbar);
2051
    Toolbar.add(toolbar, btnUpper,  -1, "AB");
2052
    Toolbar.add(toolbar, btnLower,  -1, "ab");
2053
    Toolbar.delimiter(toolbar);
2054
    Toolbar.add(toolbar, btnBuild,  54, "");
2055
    Toolbar.add(toolbar, btnRun,    53, "");
2056
 
9174 akron1 2057
    Ini.getSettings(buildScript, runScript, debugScript);
9628 akron1 2058
 
2059
    filePath := "/sys";
2060
    IF Args.argc = 1 THEN
8728 leency 2061
        text := T.New();
9628 akron1 2062
        insert(0, text);
2063
        T.SetPos(text, 0, 0)
8728 leency 2064
    END;
9628 akron1 2065
	FOR i := 1 TO Args.argc - 1 DO
2066
		Args.GetArg(i, fileName);
2067
		IF open(fileName) THEN
2068
			U.getPath(fileName, filePath)
2069
		END
2070
	END;
2071
	IF textsCount = 0 THEN
2072
		K.Exit
2073
	END;
2074
	SwitchTab(textsCount - 1);
2075
 
9208 akron1 2076
    Scroll.init(ScrollChange);
9336 akron1 2077
    Scroll.create(FALSE, canvas.width + 1, scrollWidth, scrollWidth, scrollWidth*3 DIV 2, hScroll);
9526 akron1 2078
    Scroll.create(TRUE, scrollWidth, canvas.height + 2, scrollWidth, scrollWidth*3 DIV 2, vScroll);
8728 leency 2079
    T.resize(canvas.width, canvas.height);
2080
    confirm := FALSE;
2081
    notFound := FALSE;
9175 akron1 2082
    menuFindClicked := FALSE;
2083
    menuActive := FALSE;
8728 leency 2084
    search := FALSE;
9073 leency 2085
    searchOpened := FALSE;
8728 leency 2086
    createSearchForm;
2087
    new_searchText := "";
2088
    searchText := "";
2089
    cs := FALSE;
2090
    whole := FALSE;
2091
    replaced := 0;
9628 akron1 2092
 
2093
	OD := OpenDlg.Create(draw_window, OpenDlg.topen, filePath, "");
2094
 
9073 leency 2095
    K.SetEventsMask({0, 1, 2, 5, 6, 31});
9174 akron1 2096
    Menu.init(resetTimer);
8728 leency 2097
    draw_window;
9599 akron1 2098
    blink := Ini.blink;
2099
	IF blink <= 0 THEN
2100
		blink := 0
2101
	ELSIF blink < 30 THEN
2102
		blink := 30
2103
	END;
9448 akron1 2104
    timerEnabled := TRUE;
2105
    CursorTime := K.GetTickCount();
8728 leency 2106
    WHILE TRUE DO
9448 akron1 2107
    	CurrentTime := K.GetTickCount();
9599 akron1 2108
    	IF (CurrentTime - CursorTime > blink) & (blink > 0) & timerEnabled THEN
9448 akron1 2109
    		CursorTime := CurrentTime;
2110
    		T.toggleCursor;
2111
    		repaint
2112
    	END;
2113
        CASE K.EventTimeout(10) OF
2114
        |0:
9190 akron1 2115
        |1:	Redraw(resized, width, height, cliWidth, cliHeight)
9073 leency 2116
        |2: KeyDown(K.GetKey())
2117
        |3: BtnClick
2118
        |6: MouseEvent(resized, firstClickX, firstClickY, time)
8728 leency 2119
        |7: receiveIPC
2120
        END
2121
    END
2122
END main;
2123
 
2124
 
2125
BEGIN
2126
    main
2127
END CEdit.