Subversion Repositories Kolibri OS

Rev

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