Subversion Repositories Kolibri OS

Rev

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