Subversion Repositories Kolibri OS

Rev

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