Subversion Repositories Kolibri OS

Rev

Rev 9060 | Rev 9174 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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