Subversion Repositories Kolibri OS

Rev

Rev 9915 | Details | Compare with Previous | Last modification | View Log | RSS feed

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