Subversion Repositories Kolibri OS

Rev

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

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