Subversion Repositories Kolibri OS

Rev

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

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