Subversion Repositories Kolibri OS

Rev

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