Subversion Repositories Kolibri OS

Rev

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