Subversion Repositories Kolibri OS

Rev

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

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