Subversion Repositories Kolibri OS

Rev

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