diff --git a/programs/develop/cedit/CEDIT b/programs/develop/cedit/CEDIT index 7605ad1768..eadf88d380 100644 Binary files a/programs/develop/cedit/CEDIT and b/programs/develop/cedit/CEDIT differ diff --git a/programs/develop/cedit/SRC/CEdit.ob07 b/programs/develop/cedit/SRC/CEdit.ob07 index 3eeca6ef41..7e3cf7483f 100644 --- a/programs/develop/cedit/SRC/CEdit.ob07 +++ b/programs/develop/cedit/SRC/CEdit.ob07 @@ -25,10 +25,10 @@ IMPORT G := Graph, T := Text, E := Encodings, CB := Clipboard, Languages, ChangeLog, Scroll, CheckBox, - RW, Ini, EB := EditBox, Icons, Tabs, Timer; + RW, Ini, EB := EditBox, Tabs, Toolbar; CONST - HEADER = "CEdit (17-dec-2021)"; + HEADER = "CEdit (20-dec-2021)"; ShellFilter = ""; EditFilter = "SH|INC|TXT|ASM|OB07|C|CPP|H|PAS|PP|LUA|INI|JSON"; @@ -38,6 +38,7 @@ CONST scrollWidth = 22; btnClose = 1; + btnNew = 20; btnOpen = 21; btnSave = 22; @@ -62,12 +63,10 @@ CONST btnHeight = 25; btnWidth = 75; - btnTop = Menu.MainMenuHeight + 3; - toolBtnSize = 24; - toolbarDelim = 7; - iconPad = (toolBtnSize - Icons.SIZE) DIV 2; - TOP = btnTop + toolBtnSize + 10 + Tabs.tabHeight; + toolbarTop = Menu.MainMenuHeight + 3; + + TOP = toolbarTop + Toolbar.BtnSize + 10 + Tabs.tabHeight; RIGHT = scrollWidth - 2; BOTTOM = scrollWidth + 18; @@ -206,11 +205,13 @@ VAR menuActive: BOOLEAN; - icons: INTEGER; - grayIcons: INTEGER; + toolbar: Toolbar.tToolbar; IPC: ARRAY 64 OF INTEGER; + CursorTime, CurrentTime: INTEGER; + timerEnabled: BOOLEAN; + PROCEDURE WritePos (y: INTEGER); VAR @@ -235,11 +236,12 @@ PROCEDURE resetTimer; BEGIN IF EditBox_Focus(FindEdit) OR EditBox_Focus(ReplaceEdit) OR EditBox_Focus(GotoEdit) THEN T.hideCursor; - Timer.kill + timerEnabled := FALSE ELSE T.showCursor; - Timer.create(mainTID) - END + timerEnabled := TRUE + END; + CursorTime := CurrentTime END resetTimer; @@ -283,7 +285,8 @@ CONST VAR top, left, right, bottom, x, y, width: INTEGER; BEGIN - Timer.kill; + timerEnabled := FALSE; + CursorTime := CurrentTime; width := minWidth + LENGTH(s)*fontWidth; left := (canvas.width - width) DIV 2 + LEFT; top := (canvas.height - height) DIV 2 + TOP; @@ -326,73 +329,6 @@ BEGIN END Replaced; -PROCEDURE drawIcon (icons, idx, x: INTEGER); -BEGIN - Icons.draw(icons, idx, x + iconPad, btnTop + iconPad) -END drawIcon; - - -PROCEDURE toolbarIcons; -VAR - x, color, ico: INTEGER; -BEGIN - x := searchLeft + (toolBtnSize + 5)*2; - IF text.modified THEN - ico := icons - ELSE - ico := grayIcons - END; - drawIcon(ico, 5, x); - - IF text.edition # NIL THEN - x := searchLeft + (toolBtnSize + 5)*4 + toolbarDelim*2; - IF ChangeLog.isFirstGuard(text.edition) THEN - ico := grayIcons - ELSE - ico := icons - END; - drawIcon(ico, 37, x); - - x := searchLeft + (toolBtnSize + 5)*5 + toolbarDelim*2; - IF ChangeLog.isLastGuard(text.edition) THEN - ico := grayIcons - ELSE - ico := icons - END; - drawIcon(ico, 36, x) - END; - - IF T.selected(text) THEN - color := K.caseColor - ELSE - color := K.disCaseColor - END; - - x := searchLeft + (toolBtnSize + 5)*6 + toolbarDelim*3; - K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor); - K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "AB"); - INC(x, toolBtnSize + 5); - K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor); - K.DrawText69(x + (toolBtnSize - 12) DIV 2, btnTop + (toolBtnSize - 9) DIV 2 + 2, color, "ab"); - - x := searchLeft + (toolBtnSize + 5)*8 + toolbarDelim*4; - IF buildScript # "" THEN - ico := icons - ELSE - ico := grayIcons - END; - drawIcon(ico, 54, x); - - INC(x, toolBtnSize + 5); - IF runScript # "" THEN - ico := icons - ELSE - ico := grayIcons - END; - drawIcon(ico, 53, x) -END toolbarIcons; - - PROCEDURE getIdx (text: T.tText): INTEGER; VAR i: INTEGER; @@ -499,7 +435,14 @@ BEGIN G.DrawCanvas(canvas, LEFT, TOP); NotFound; Replaced; - toolbarIcons + Toolbar.enable(toolbar, btnSave, text.modified); + Toolbar.enable(toolbar, btnUndo, ~ChangeLog.isFirstGuard(text.edition)); + Toolbar.enable(toolbar, btnRedo, ~ChangeLog.isLastGuard(text.edition)); + Toolbar.enable(toolbar, btnUpper, T.selected(text)); + Toolbar.enable(toolbar, btnLower, T.selected(text)); + Toolbar.enable(toolbar, btnBuild, buildScript # ""); + Toolbar.enable(toolbar, btnRun, runScript # ""); + Toolbar.drawIcons(toolbar) END END repaint; @@ -580,17 +523,7 @@ END SearchPanel; PROCEDURE draw_window; VAR - width, height, x: INTEGER; - - - PROCEDURE drawToolbarBtn (id, x: INTEGER); - BEGIN - K.DrawRect(x, btnTop, toolBtnSize, toolBtnSize, K.toolbarColor); - K.DrawLine(x, btnTop + toolBtnSize, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor); - K.DrawLine(x + toolBtnSize, btnTop, x + toolBtnSize, btnTop + toolBtnSize, K.shadowColor); - K.CreateButton(id + ORD({30}), x, btnTop, toolBtnSize, toolBtnSize, K.btnColor, ""); - END drawToolbarBtn; - + width, height: INTEGER; BEGIN K.BeginDraw; @@ -607,42 +540,7 @@ BEGIN K.DrawRect(LEFT + canvas.width + 1, TOP + canvas.height, scrollWidth - 1, scrollWidth, K.winColor); Menu.DrawMain(mainMenu); - x := searchLeft; - - drawToolbarBtn(btnNew, x); - drawIcon(icons, 2, x); - INC(x, toolBtnSize + 5); - - drawToolbarBtn(btnOpen, x); - drawIcon(icons, 0, x); - INC(x, toolBtnSize + 5); - - drawToolbarBtn(btnSave, x); - INC(x, toolBtnSize + 5 + toolbarDelim); - - drawToolbarBtn(btnSearch, x); - drawIcon(icons, 49, x); - INC(x, toolBtnSize + 5 + toolbarDelim); - - drawToolbarBtn(btnUndo, x); - INC(x, toolBtnSize + 5); - - drawToolbarBtn(btnRedo, x); - INC(x, toolBtnSize + 5 + toolbarDelim); - - drawToolbarBtn(btnUpper, x); - INC(x, toolBtnSize + 5); - - drawToolbarBtn(btnLower, x); - INC(x, toolBtnSize + 5 + toolbarDelim); - - drawToolbarBtn(btnBuild, x); - INC(x, toolBtnSize + 5); - - drawToolbarBtn(btnRun, x); - INC(x, toolBtnSize + 5); - - toolbarIcons; + Toolbar.draw(toolbar); DrawState(text, width, height); IF search & searchOpened THEN @@ -668,7 +566,8 @@ END mouse; PROCEDURE stopTimer; BEGIN T.hideCursor; - Timer.kill; + timerEnabled := FALSE; + CursorTime := CurrentTime; repaint END stopTimer; @@ -832,6 +731,7 @@ BEGIN Confirm ELSE Tabs.delete(tabs, n); + T.destroy(texts[n]); FOR i := n + 1 TO textsCount - 1 DO texts[i - 1] := texts[i] END; @@ -1065,9 +965,7 @@ END Script; PROCEDURE ShowSearchPanel (goto: BOOLEAN); VAR i: INTEGER; - (*flag: BOOLEAN;*) BEGIN - (*flag := FALSE;*) IF T.selected(text) & ~goto THEN T.getSelectedText(text, new_searchText); IF new_searchText # "" THEN @@ -1079,7 +977,6 @@ BEGIN searchText := new_searchText; EB.setValue(FindEdit, searchText); notFound := ~T.search(text, searchText, cs, whole); - (*flag := TRUE*) END END END; @@ -1092,7 +989,7 @@ BEGIN IF goto THEN SetFocus(GotoEdit, TRUE) ELSE - SetFocus(FindEdit, (*~flag*)TRUE) + SetFocus(FindEdit, TRUE) END END ShowSearchPanel; @@ -1203,7 +1100,7 @@ BEGIN Menu.option(subEOL, menuCR, T.getEol(text) = RW.EOL_CR); IF menu # NIL THEN - Timer.kill; + timerEnabled := FALSE; IF Menu.opened(menu) THEN Menu.close(menu) END; @@ -1230,13 +1127,7 @@ VAR item: List.tItem; BEGIN scrollIPC := FALSE; - IF IPC[0] = Timer.ID THEN - IF IPC[4] = Timer.n THEN - T.toggleCursor; - repaint - END; - IPC[2] := 0 - ELSIF IPC[0] = mainTID THEN + IF IPC[0] = mainTID THEN IF IPC[2] = Scroll.ScrollIPC THEN Scroll.receiveIPC(IPC, scrollIPC) END; @@ -1870,8 +1761,8 @@ BEGIN END END; CASE btn OF - |Tabs.btnID - 1: Tabs.scroll(tabs, -1); switch := TRUE; repaint - |Tabs.btnID - 2: Tabs.scroll(tabs, +1); switch := TRUE; repaint + |Tabs.btnLeft: Tabs.scroll(tabs, -1); switch := TRUE; repaint + |Tabs.btnRight: Tabs.scroll(tabs, +1); switch := TRUE; repaint |0: @@ -2049,7 +1940,6 @@ VAR i: INTEGER; BEGIN K.GetSystemColors; - Icons.get(icons, grayIcons); FOR i := 0 TO 1 DO IF ~K.RolledUp() THEN K.ClientSize(width, height); @@ -2092,7 +1982,6 @@ VAR firstClickX, firstClickY, time: INTEGER; BEGIN K.GetSystemColors; - Icons.get(icons, grayIcons); modified := FALSE; switch := FALSE; closing := FALSE; @@ -2153,6 +2042,22 @@ BEGIN Menu.AddMainItem(mainMenu, "program", menuProgram); Menu.AddMainItem(mainMenu, "tools", menuTools); + Toolbar.create(toolbar, searchLeft, toolbarTop); + Toolbar.add(toolbar, btnNew, 2, ""); + Toolbar.add(toolbar, btnOpen, 0, ""); + Toolbar.add(toolbar, btnSave, 5, ""); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnSearch, 49, ""); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnUndo, 37, ""); + Toolbar.add(toolbar, btnRedo, 36, ""); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnUpper, -1, "AB"); + Toolbar.add(toolbar, btnLower, -1, "ab"); + Toolbar.delimiter(toolbar); + Toolbar.add(toolbar, btnBuild, 54, ""); + Toolbar.add(toolbar, btnRun, 53, ""); + Ini.getSettings(buildScript, runScript, debugScript); IF fileName = "" THEN text := T.New(); @@ -2188,9 +2093,17 @@ BEGIN K.SetEventsMask({0, 1, 2, 5, 6, 31}); Menu.init(resetTimer); draw_window; - Timer.create(mainTID); + timerEnabled := TRUE; + CursorTime := K.GetTickCount(); WHILE TRUE DO - CASE K.WaitForEvent() OF + CurrentTime := K.GetTickCount(); + IF (CurrentTime - CursorTime > Ini.blink) & timerEnabled THEN + CursorTime := CurrentTime; + T.toggleCursor; + repaint + END; + CASE K.EventTimeout(10) OF + |0: |1: Redraw(resized, width, height, cliWidth, cliHeight) |2: KeyDown(K.GetKey()) |3: BtnClick diff --git a/programs/develop/cedit/SRC/ChangeLog.ob07 b/programs/develop/cedit/SRC/ChangeLog.ob07 index 7d7e245407..ecfde35524 100644 --- a/programs/develop/cedit/SRC/ChangeLog.ob07 +++ b/programs/develop/cedit/SRC/ChangeLog.ob07 @@ -19,7 +19,7 @@ MODULE ChangeLog; -IMPORT List, Lines, (*API,*) SYSTEM; +IMPORT List, Lines, API, SYSTEM; TYPE tIntItem = POINTER TO RECORD (List.tItem) @@ -29,7 +29,7 @@ TYPE tBoolItem = POINTER TO RECORD (List.tItem) adr: INTEGER; val: BOOLEAN; save: BOOLEAN END; -(* + tUntypedPtr = POINTER TO RECORD (List.tItem) p: INTEGER END; @@ -37,13 +37,13 @@ TYPE tTypedPtr = POINTER TO RECORD (List.tItem) p: List.tItem END; -*) + tGuard* = POINTER TO RECORD (List.tItem) saved*: BOOLEAN END; tLog* = POINTER TO RECORD - Log*: List.tList; + Log*, Pointers*: List.tList; guard: tGuard; isLast: BOOLEAN END; @@ -104,18 +104,11 @@ END redo; PROCEDURE clear (guard: tGuard); VAR item: List.tItem; - (*res: INTEGER;*) BEGIN CL.isLast := TRUE; REPEAT item := List.pop(CL.Log); IF item # guard THEN - (* - IF item IS tUntypedPtr THEN - res := API._DISPOSE(item(tUntypedPtr).p) - ELSIF item IS tTypedPtr THEN - DISPOSE(item(tTypedPtr).p) - END;*) DISPOSE(item) END UNTIL item = guard; @@ -253,14 +246,14 @@ BEGIN changeWord(SYSTEM.ADR(v), SYSTEM.ADR(x)) END changePtr; -(* + PROCEDURE typedPtr (p: List.tItem); VAR item: tTypedPtr; BEGIN NEW(item); item.p := p; - List.append(Log, item) + List.append(CL.Pointers, item) END typedPtr; @@ -270,9 +263,9 @@ VAR BEGIN NEW(item); item.p := p; - List.append(Log, item) + List.append(CL.Pointers, item) END untypedPtr; -*) + PROCEDURE set* (_CL: tLog); BEGIN @@ -288,13 +281,44 @@ BEGIN newLog.guard := NIL; newLog.isLast := TRUE; newLog.Log := List.create(NIL); + newLog.Pointers := List.create(NIL); CL := newLog; Lines.setMaxLength(maxLength) RETURN newLog END create; +PROCEDURE destroy* (VAR log: tLog); +VAR + item: List.tItem; + res: INTEGER; +BEGIN + IF log # NIL THEN + item := List.pop(log.Log); + WHILE item # NIL DO + DISPOSE(item); + item := List.pop(log.Log) + END; + DISPOSE(log.Log); + + item := List.pop(log.Pointers); + WHILE item # NIL DO + IF item IS tUntypedPtr THEN + res := API._DISPOSE(item(tUntypedPtr).p) + ELSIF item IS tTypedPtr THEN + DISPOSE(item(tTypedPtr).p) + END; + DISPOSE(item); + item := List.pop(log.Pointers) + END; + DISPOSE(log.Pointers); + + DISPOSE(log) + END +END destroy; + + BEGIN List.init(changeInt, changePtr); - Lines.init(changeInt, changePtr, changeBool, changeBool2(*, typedPtr, untypedPtr*)) + Lines.init(changeInt, changePtr, changeBool, changeBool2, typedPtr, untypedPtr) END ChangeLog. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/CheckBox.ob07 b/programs/develop/cedit/SRC/CheckBox.ob07 index ab906e0b1d..9badb9d177 100644 --- a/programs/develop/cedit/SRC/CheckBox.ob07 +++ b/programs/develop/cedit/SRC/CheckBox.ob07 @@ -45,7 +45,6 @@ TYPE PROCEDURE paint* (chkbox: tCheckBox); VAR canvas: G.tCanvas; - (*r1, r2, g1, g2, b1, b2: BYTE;*) BEGIN canvas := chkbox.canvas; IF canvas # NIL THEN @@ -61,10 +60,6 @@ BEGIN G.DLine(canvas, 2, 6, 7, -1); G.DLine(canvas, 7, 13, 9, 1); G.DLine(canvas, 7, 13, 10, 1); - (*G.getRGB(bColor, r1, g1, b1); - G.getRGB(fColor, r2, g2, b2); - G.SetColor(canvas, (b1 + b2) DIV 2 + ((g1 + g2) DIV 2)*256 + ((r1 + r2) DIV 2)*65536); - *) G.DLine(canvas, 2, 6, 8, -1); G.DLine(canvas, 7, 13, 11, 1); G.DLine(canvas, 2, 6, 5, -1); diff --git a/programs/develop/cedit/SRC/Clipboard.ob07 b/programs/develop/cedit/SRC/Clipboard.ob07 index 936a67d19f..8fefa39684 100644 --- a/programs/develop/cedit/SRC/Clipboard.ob07 +++ b/programs/develop/cedit/SRC/Clipboard.ob07 @@ -19,7 +19,7 @@ MODULE Clipboard; -IMPORT SYSTEM, K := KOSAPI, E := Encodings, Lines; +IMPORT SYSTEM, KOSAPI, E := Encodings, Lines, K := KolibriOS; CONST TTEXT = 0; @@ -35,7 +35,7 @@ TYPE PROCEDURE free (ptr: INTEGER); BEGIN - ptr := K.free(ptr) + ptr := KOSAPI.free(ptr) END free; @@ -52,7 +52,7 @@ VAR BEGIN cnt := bufSize(buffer) DIV 2; size := cnt + 12; - a := K.malloc(size); + a := KOSAPI.malloc(size); ASSERT(a # 0); SYSTEM.PUT32(a + 4, TTEXT); SYSTEM.PUT32(a + 8, 1); @@ -70,8 +70,8 @@ BEGIN DEC(cnt) END; SYSTEM.PUT32(a, size); - K.sysfunc2(54, 3); - K.sysfunc4(54, 2, size, a) + K.CBDelSlot; + K.CBWrite(size, a) END put; @@ -80,7 +80,7 @@ VAR res: tBuffer; BEGIN NEW(res); - res.dataPtr := K.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096); + res.dataPtr := KOSAPI.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096); ASSERT(res.dataPtr # 0); res.pos := res.dataPtr RETURN res @@ -139,9 +139,9 @@ VAR res: BOOLEAN; BEGIN res := FALSE; - n := K.sysfunc2(54, 0); + n := K.CBCount(); IF n > 0 THEN - ptr := K.sysfunc3(54, 1, n - 1); + ptr := K.CBRead(n - 1); SYSTEM.GET32(ptr, size); SYSTEM.GET32(ptr + 4, typ); SYSTEM.GET(ptr + 8, x); @@ -159,7 +159,7 @@ BEGIN ptr := 0; cnt := 0; IF available() THEN - ptr := K.sysfunc3(54, 1, K.sysfunc2(54, 0) - 1); + ptr := K.CBRead(K.CBCount() - 1); SYSTEM.GET32(ptr, cnt); DEC(cnt, 12); INC(ptr, 12) diff --git a/programs/develop/cedit/SRC/Graph.ob07 b/programs/develop/cedit/SRC/Graph.ob07 index d718edd02f..a5a84bfa53 100644 --- a/programs/develop/cedit/SRC/Graph.ob07 +++ b/programs/develop/cedit/SRC/Graph.ob07 @@ -19,7 +19,7 @@ MODULE Graph; -IMPORT SYSTEM, K := KOSAPI, Lines, Languages; +IMPORT SYSTEM, KOSAPI, Lines, Languages; CONST @@ -61,7 +61,7 @@ END getRGB; PROCEDURE DrawCanvas* (canvas: tCanvas; x, y: INTEGER); BEGIN - K.sysfunc7(65, canvas.bitmap, canvas.width*65536 + canvas.height, x*65536 + y, 32, 0, 0); + KOSAPI.sysfunc7(65, canvas.bitmap, canvas.width*65536 + canvas.height, x*65536 + y, 32, 0, 0) END DrawCanvas; @@ -285,7 +285,7 @@ BEGIN ELSE color := canvas.textColor END; - K.sysfunc6(4, x*65536 + y, font + color, SYSTEM.ADR(c), 1, canvas.bitmap - 8) + KOSAPI.sysfunc6(4, x*65536 + y, font + color, SYSTEM.ADR(c), 1, canvas.bitmap - 8) END; INC(x, canvas.font.width); INC(i); @@ -307,7 +307,7 @@ VAR canvas: tCanvas; BEGIN NEW(canvas); - canvas.bitmap := K.malloc(width*height*4 + 8); + canvas.bitmap := KOSAPI.malloc(width*height*4 + 8); ASSERT(canvas.bitmap # 0); SYSTEM.PUT32(canvas.bitmap, width); SYSTEM.PUT32(canvas.bitmap + 4, height); @@ -322,7 +322,7 @@ END CreateCanvas; PROCEDURE destroy* (VAR canvas: tCanvas); BEGIN IF canvas # NIL THEN - canvas.bitmap := K.free(canvas.bitmap); + canvas.bitmap := KOSAPI.free(canvas.bitmap); DISPOSE(canvas) END END destroy; diff --git a/programs/develop/cedit/SRC/KolibriOS.ob07 b/programs/develop/cedit/SRC/KolibriOS.ob07 index 9ed015ea9f..3eab66d3c6 100644 --- a/programs/develop/cedit/SRC/KolibriOS.ob07 +++ b/programs/develop/cedit/SRC/KolibriOS.ob07 @@ -31,7 +31,7 @@ VAR winColor*, textColor*, btnColor*, btnTextColor*, toolbarColor*, scrollColor*, scrollBkColor*, borderColor*, shadowColor*, (*darkColor,*) lightColor*, - caseColor*, disCaseColor*: INTEGER; + textToolbarColor*, disTextToolbarColor*: INTEGER; PROCEDURE GetCommandLine* (): INTEGER; @@ -62,9 +62,9 @@ BEGIN END EndDraw; -PROCEDURE WaitForEvent* (): INTEGER; - RETURN KOSAPI.sysfunc1(10) -END WaitForEvent; +PROCEDURE EventTimeout* (t: INTEGER): INTEGER; + RETURN KOSAPI.sysfunc2(23, t) +END EventTimeout; PROCEDURE ThreadInfo (offsa, offsb: INTEGER; VAR a, b: INTEGER); @@ -319,11 +319,6 @@ PROCEDURE GetControlKeys* (): SET; END GetControlKeys; -PROCEDURE malloc* (size: INTEGER): INTEGER; - RETURN KOSAPI.malloc(size) -END malloc; - - PROCEDURE SetIPC* (buffer: ARRAY OF INTEGER); BEGIN KOSAPI.sysfunc4(60, 1, SYSTEM.ADR(buffer[0]), LEN(buffer)*SYSTEM.SIZE(INTEGER)) @@ -355,8 +350,8 @@ BEGIN toolbarColor := lightColor;(*0DFDFDFH;*) shadowColor := borderColor;(*0808080H;*) - caseColor := 00000FFH; - disCaseColor := borderColor;(*0808080H*) + textToolbarColor := 00000FFH; + disTextToolbarColor := borderColor;(*0808080H*) END GetSystemColors; @@ -391,4 +386,31 @@ BEGIN END SetCaption; +PROCEDURE CBCount* (): INTEGER; + RETURN KOSAPI.sysfunc2(54, 0) +END CBCount; + + +PROCEDURE CBRead* (slot: INTEGER): INTEGER; + RETURN KOSAPI.sysfunc3(54, 1, slot) +END CBRead; + + +PROCEDURE CBWrite* (size, ptr: INTEGER); +BEGIN + KOSAPI.sysfunc4(54, 2, size, ptr) +END CBWrite; + + +PROCEDURE CBDelSlot*; +BEGIN + KOSAPI.sysfunc2(54, 3) +END CBDelSlot; + + +PROCEDURE GetThreadSlot* (tid: INTEGER): INTEGER; + RETURN KOSAPI.sysfunc3(18, 21, tid) +END GetThreadSlot; + + END KolibriOS. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Lines.ob07 b/programs/develop/cedit/SRC/Lines.ob07 index 93f2e8da8d..e09877bc37 100644 --- a/programs/develop/cedit/SRC/Lines.ob07 +++ b/programs/develop/cedit/SRC/Lines.ob07 @@ -40,18 +40,18 @@ TYPE PmovInt = PROCEDURE (VAR v: INTEGER; x: INTEGER); PmovBool = PROCEDURE (VAR v: BOOLEAN; x: BOOLEAN); PmovPtr = PROCEDURE (VAR v: List.tItem; x: List.tItem); -(* + PTypedPtr = PROCEDURE (p: List.tItem); PUntypedPtr = PROCEDURE (p: INTEGER); -*) + VAR _movInt: PmovInt; _movBool, _movBool2: PmovBool; _movPtr: PmovPtr; -(* _typedPtr: PTypedPtr; - _untypedPtr: PUntypedPtr;*) + _typedPtr: PTypedPtr; + _untypedPtr: PUntypedPtr; pMaxLength, tab*: INTEGER; tabs*: BOOLEAN; @@ -83,7 +83,6 @@ END movPtr; PROCEDURE malloc (size: INTEGER): INTEGER; VAR - ptr: INTEGER; maxLength: INTEGER; BEGIN ASSERT(pMaxLength # 0); @@ -92,9 +91,8 @@ BEGIN SYSTEM.PUT(pMaxLength, size) END; size := size*WCHAR_SIZE + 4; - INC(size, (-size) MOD 32); - ptr := API._NEW(size) - RETURN ptr + INC(size, (-size) MOD 32) + RETURN API._NEW(size) END malloc; @@ -109,9 +107,9 @@ BEGIN END; IF ~line.temp THEN movInt(line.ptr, newPtr); -(* IF newPtr # 0 THEN + IF newPtr # 0 THEN _untypedPtr(newPtr) - END*) + END END; line.ptr := newPtr END free; @@ -124,9 +122,9 @@ BEGIN NEW(line); line.label := FALSE; ASSERT(line # NIL); -(* IF ~temp THEN + IF ~temp THEN _typedPtr(line) - END;*) + END; line.next := NIL; line.prev := NIL; IF ~temp THEN @@ -136,7 +134,7 @@ BEGIN line.ptr := malloc(1); ASSERT(line.ptr # 0); IF ~temp THEN - (*_untypedPtr(line.ptr);*) + _untypedPtr(line.ptr); movInt(line.ptr, line.ptr) END; SYSTEM.PUT16(line.ptr, 0); @@ -472,14 +470,14 @@ BEGIN END chCase; -PROCEDURE init* (movInt: PmovInt; movPtr: PmovPtr; movBool, movBool2: PmovBool(*; typedPtr: PTypedPtr; untypedPtr: PUntypedPtr*)); +PROCEDURE init* (movInt: PmovInt; movPtr: PmovPtr; movBool, movBool2: PmovBool; typedPtr: PTypedPtr; untypedPtr: PUntypedPtr); BEGIN _movInt := movInt; _movPtr := movPtr; _movBool := movBool; _movBool2 := movBool2; -(* _typedPtr := typedPtr; - _untypedPtr := untypedPtr;*) + _typedPtr := typedPtr; + _untypedPtr := untypedPtr; END init; diff --git a/programs/develop/cedit/SRC/Menu.ob07 b/programs/develop/cedit/SRC/Menu.ob07 index 74f87b98da..ce59d51e3d 100644 --- a/programs/develop/cedit/SRC/Menu.ob07 +++ b/programs/develop/cedit/SRC/Menu.ob07 @@ -20,7 +20,7 @@ MODULE Menu; IMPORT - SYSTEM, G := Graph, List, K := KolibriOS, KOSAPI; + SYSTEM, G := Graph, List, K := KolibriOS; CONST fontHeight = 22; @@ -259,26 +259,26 @@ BEGIN TextColor := disSelForeColor END END; + Y := y + (fontHeight - 16) DIV 2; G.SetColor(canvas, BkColor); G.FillRect(canvas, 1, y, m.width - 1, y + fontHeight - 4); G.SetTextColor(canvas, TextColor); G.SetBkColor(canvas, BkColor); - G.TextOut2(canvas, LEFT, y + (fontHeight - 16) DIV 2 - 2, item.text, LENGTH(item.text)); + G.TextOut2(canvas, LEFT, Y - 2, item.text, LENGTH(item.text)); G.SetColor(canvas, TextColor); IF item.check = 1 THEN - G.DLine(canvas, 4, 7, y + (fontHeight - 16) DIV 2 + 5, -1); - G.DLine(canvas, 4, 7, y + (fontHeight - 16) DIV 2 + 6, -1); - G.DLine(canvas, 7, 12, y + (fontHeight - 16) DIV 2 + 8, 1); - G.DLine(canvas, 7, 12, y + (fontHeight - 16) DIV 2 + 9, 1); + G.DLine(canvas, 4, 7, Y + 5, -1); + G.DLine(canvas, 4, 7, Y + 6, -1); + G.DLine(canvas, 7, 12, Y + 8, 1); + G.DLine(canvas, 7, 12, Y + 9, 1); ELSIF item.check = 2 THEN G.FillRect(canvas, 6, y + fontHeight DIV 2 - 4, 10, y + fontHeight DIV 2) END; IF item.child # NIL THEN X := m.width - 9; - Y := y + (fontHeight - 16) DIV 2 + 2; - G.Triangle(canvas, X, Y, X, Y + 8, G.triRight) + G.Triangle(canvas, X, Y + 2, X, Y + 10, G.triRight) END; INC(y, fontHeight); @@ -391,8 +391,8 @@ END submenu; PROCEDURE [stdcall] window (m: tMenu); VAR x, y: INTEGER; - key, temp: INTEGER; msState: SET; + key, temp: INTEGER; shift, ctrl: BOOLEAN; BEGIN m.selItem := ORD(m.keyboard) - 1; @@ -400,7 +400,8 @@ BEGIN m.keyboard := FALSE; K.SetEventsMask({0, 1, 5}); WHILE TRUE DO - CASE K.WaitForEvent() OF + CASE K.EventTimeout(100) OF + |0: |1: draw_window(m) |2: @@ -408,15 +409,9 @@ BEGIN key := K.GetKey(); IF ~shift & ~ ctrl THEN IF key DIV 65536 = 72 THEN - DEC(m.selItem); - IF m.selItem < 0 THEN - m.selItem := m.items.count - 1 - END + m.selItem := (m.selItem - 1) MOD m.items.count ELSIF key DIV 65536 = 80 THEN - INC(m.selItem); - IF m.selItem >= m.items.count THEN - m.selItem := 0 - END + m.selItem := (m.selItem + 1) MOD m.items.count ELSIF key DIV 65536 = 28 THEN IF m.selItem >= 0 THEN click(m, m.selItem) @@ -504,7 +499,7 @@ VAR BEGIN IF m.tid = 0 THEN L := level(m); - IF KOSAPI.sysfunc3(18, 21, TIDs[L]) = 0 THEN + IF K.GetThreadSlot(TIDs[L]) = 0 THEN m.winX := x; m.winY := y; SYSTEM.PUT(SYSTEM.ADR(stack[L][LEN(stack[0]) - 1]), m); diff --git a/programs/develop/cedit/SRC/Tabs.ob07 b/programs/develop/cedit/SRC/Tabs.ob07 index 8a2ae6cea0..b56d218903 100644 --- a/programs/develop/cedit/SRC/Tabs.ob07 +++ b/programs/develop/cedit/SRC/Tabs.ob07 @@ -24,6 +24,8 @@ IMPORT List, K := KolibriOS, RW, U := Utils; CONST btnID* = 100; + btnLeft* = btnID - 1; + btnRight* = btnID - 2; tabHeight* = 22; curTabHeight = 26; scrWidth = 15; @@ -116,10 +118,10 @@ BEGIN K.DrawRect(x, y - (curTabHeight - tabHeight), t.width + (2*scrWidth + 2), t.height + (curTabHeight - tabHeight) - 1, K.winColor); IF Width(t, 0, t.strings.count - 1) > t.width THEN INC(x, 2*scrWidth); - K.DeleteButton(btnID - 1); - K.DeleteButton(btnID - 2); - K.CreateButton(btnID - 1, t.x, y, scrWidth, t.height - 1, K.btnColor, "<"); - K.CreateButton(btnID - 2, t.x + scrWidth, y, scrWidth, t.height - 1, K.btnColor, ">"); + K.DeleteButton(btnLeft); + K.DeleteButton(btnRight); + K.CreateButton(btnLeft, t.x, y, scrWidth, t.height - 1, K.btnColor, "<"); + K.CreateButton(btnRight, t.x + scrWidth, y, scrWidth, t.height - 1, K.btnColor, ">"); scroll := TRUE ELSE t.first := 0; @@ -199,7 +201,8 @@ VAR item: List.tItem; BEGIN item := List.getItem(t.strings, n); - List.delete(t.strings, item) + List.delete(t.strings, item); + DISPOSE(item) END delete; diff --git a/programs/develop/cedit/SRC/Text.ob07 b/programs/develop/cedit/SRC/Text.ob07 index 09ef615b88..10171a8dcf 100644 --- a/programs/develop/cedit/SRC/Text.ob07 +++ b/programs/develop/cedit/SRC/Text.ob07 @@ -2398,9 +2398,7 @@ END resize; PROCEDURE destroy* (VAR text: tText); BEGIN IF search(text, "", FALSE, FALSE) THEN END; - WHILE text.last # NIL DO - DelLine(text, text.last(tLine)) - END; + ChangeLog.destroy(text.chLog); DISPOSE(text.foundList); DISPOSE(text.cursor); DISPOSE(text.select2); diff --git a/programs/develop/cedit/SRC/Timer.ob07 b/programs/develop/cedit/SRC/Timer.ob07 deleted file mode 100644 index b64b400744..0000000000 --- a/programs/develop/cedit/SRC/Timer.ob07 +++ /dev/null @@ -1,80 +0,0 @@ -(* - Copyright 2021 Anton Krotov - - This file is part of CEdit. - - CEdit is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - CEdit is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with CEdit. If not, see . -*) - -MODULE Timer; - -IMPORT SYSTEM, K := KolibriOS, KOSAPI, Ini; - -VAR - stack: ARRAY 1024*64 OF INTEGER; - ID*, n*, time, cnt: INTEGER; - enabled: BOOLEAN; - msg: ARRAY 3 OF INTEGER; - - -PROCEDURE kill*; -BEGIN - enabled := FALSE; - INC(n) -END kill; - - -PROCEDURE [stdcall] main (mainTID: INTEGER); -CONST - step = 5; -BEGIN - msg[0] := ID; - msg[1] := 12; - WHILE TRUE DO - K.Pause(step); - IF KOSAPI.sysfunc3(18, 21, mainTID) = 0 THEN - ID := 0; - K.Exit - END; - IF enabled THEN - DEC(cnt, step); - IF cnt <= 0 THEN - K.SendIPC(mainTID, msg); - cnt := time - END - END - END -END main; - - -PROCEDURE create* (mainTID: INTEGER); -BEGIN - time := Ini.blink; - cnt := time; - enabled := TRUE; - IF ID = 0 THEN - stack[LEN(stack) - 1] := mainTID; - ID := K.CreateThread(SYSTEM.ADR(main), stack) - ELSE - INC(n); - msg[2] := n - END -END create; - - -BEGIN - ID := 0; - msg[2] := 0; - n := 0; -END Timer. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Toolbar.ob07 b/programs/develop/cedit/SRC/Toolbar.ob07 new file mode 100644 index 0000000000..4f11805e7a --- /dev/null +++ b/programs/develop/cedit/SRC/Toolbar.ob07 @@ -0,0 +1,151 @@ +(* + Copyright 2021 Anton Krotov + + This file is part of CEdit. + + CEdit is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + CEdit is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with CEdit. If not, see . +*) + +MODULE Toolbar; + +IMPORT + Icons, K := KolibriOS; + +CONST + max = 14; + + BtnSize* = 24; + BtnInter = 5; + DelimSize = 7; + IconPad = (BtnSize - Icons.SIZE) DIV 2; + +TYPE + tButtonText = ARRAY 4 OF CHAR; + + tButton = RECORD + btn, icon, x: INTEGER; + text: tButtonText; + enabled: BOOLEAN + END; + + tToolbar* = RECORD + buttons: ARRAY max OF tButton; + x, y, cnt, width: INTEGER; + icons, grayIcons: INTEGER + END; + + +PROCEDURE drawIcons* (toolbar: tToolbar); +VAR + i, icons, color: INTEGER; + button: tButton; +BEGIN + i := 0; + WHILE i < toolbar.cnt DO + button := toolbar.buttons[i]; + IF button.btn # 0 THEN + IF button.enabled THEN + icons := toolbar.icons; + color := K.textToolbarColor + ELSE + icons := toolbar.grayIcons; + color := K.disTextToolbarColor + END; + IF button.icon # -1 THEN + Icons.draw(icons, button.icon, button.x + IconPad, toolbar.y + IconPad) + ELSE + K.DrawRect(button.x, toolbar.y, BtnSize, BtnSize, K.toolbarColor); + K.DrawText69(button.x + (BtnSize - LENGTH(button.text)*6) DIV 2, toolbar.y + (BtnSize - 9) DIV 2 + 2, color, button.text) + END + END; + INC(i) + END +END drawIcons; + + +PROCEDURE draw* (VAR toolbar: tToolbar); +VAR + i, x, y, btn: INTEGER; + button: tButton; +BEGIN + Icons.get(toolbar.icons, toolbar.grayIcons); + i := 0; + WHILE i < toolbar.cnt DO + button := toolbar.buttons[i]; + btn := button.btn; + IF btn # 0 THEN + x := button.x; + y := toolbar.y; + K.DrawRect(x, y, BtnSize, BtnSize, K.toolbarColor); + K.DrawLine(x, y + BtnSize, x + BtnSize, y + BtnSize, K.shadowColor); + K.DrawLine(x + BtnSize, y, x + BtnSize, y + BtnSize, K.shadowColor); + K.CreateButton(btn + ORD({30}), x, y, BtnSize, BtnSize, K.btnColor, "") + END; + INC(i) + END; + drawIcons(toolbar) +END draw; + + +PROCEDURE enable* (VAR toolbar: tToolbar; btn: INTEGER; value: BOOLEAN); +VAR + i: INTEGER; +BEGIN + i := 0; + WHILE (i < toolbar.cnt) & (toolbar.buttons[i].btn # btn) DO + INC(i) + END; + IF i < toolbar.cnt THEN + toolbar.buttons[i].enabled := value + END +END enable; + + +PROCEDURE add* (VAR toolbar: tToolbar; btn, icon: INTEGER; text: tButtonText); +VAR + button: tButton; +BEGIN + ASSERT(toolbar.cnt < max); + button.btn := btn; + button.icon := icon; + button.x := toolbar.width; + button.text := text; + button.enabled := TRUE; + toolbar.buttons[toolbar.cnt] := button; + INC(toolbar.cnt); + IF btn # 0 THEN + INC(toolbar.width, BtnSize + BtnInter) + ELSE + INC(toolbar.width, DelimSize) + END +END add; + + +PROCEDURE delimiter* (VAR toolbar: tToolbar); +BEGIN + add(toolbar, 0, 0, "") +END delimiter; + + +PROCEDURE create* (VAR toolbar: tToolbar; x, y: INTEGER); +BEGIN + toolbar.x := x; + toolbar.y := y; + toolbar.cnt := 0; + toolbar.width := x; + Icons.get(toolbar.icons, toolbar.grayIcons) +END create; + + +END Toolbar. \ No newline at end of file