Subversion Repositories Kolibri OS

Rev

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

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