From 74f4c26714430be2aedc34fd8ac304de849e960c Mon Sep 17 00:00:00 2001 From: Armando Rivera Date: Fri, 13 Jan 2023 01:26:52 -0500 Subject: [PATCH] Initial Commit --- Aide.bas | 285 +++ Aide.rc | 15 + lib/RAEdit.h | 319 +++ raedit.h | 11 + raedit.inc | 188 ++ resource/Bookmark.bmp | Bin 0 -> 690 bytes resource/Button.bmp | Bin 0 -> 1478 bytes resource/Collapse.bmp | Bin 0 -> 206 bytes resource/Expand.bmp | Bin 0 -> 206 bytes resource/Linenumber.bmp | Bin 0 -> 206 bytes resource/Lock.bmp | Bin 0 -> 206 bytes resource/Select.cur | Bin 0 -> 326 bytes resource/SplitH.cur | Bin 0 -> 326 bytes resource/SplitV.cur | Bin 0 -> 326 bytes resource/demo.ico | Bin 0 -> 15406 bytes resource/keywords.txt | 604 +++++ resource/winapi.txt | 5269 +++++++++++++++++++++++++++++++++++++++ 17 files changed, 6691 insertions(+) create mode 100644 Aide.bas create mode 100644 Aide.rc create mode 100644 lib/RAEdit.h create mode 100644 raedit.h create mode 100644 raedit.inc create mode 100644 resource/Bookmark.bmp create mode 100644 resource/Button.bmp create mode 100644 resource/Collapse.bmp create mode 100644 resource/Expand.bmp create mode 100644 resource/Linenumber.bmp create mode 100644 resource/Lock.bmp create mode 100644 resource/Select.cur create mode 100644 resource/SplitH.cur create mode 100644 resource/SplitV.cur create mode 100644 resource/demo.ico create mode 100644 resource/keywords.txt create mode 100644 resource/winapi.txt diff --git a/Aide.bas b/Aide.bas new file mode 100644 index 0000000..a79c037 --- /dev/null +++ b/Aide.bas @@ -0,0 +1,285 @@ +$ACCELERATOR ghAccTable +GUI "Color_Tab", PIXELS, ICON, 6666 + +$include "raedit.inc" + +CONST fWidth = 900 +CONST fHeight = 600 +CONST nTabs = 20 + +GLOBAL ghMainFrm AS CONTROL +GLOBAL ghMainTab AS CONTROL +GLOBAL ghStatus AS CONTROL + +GLOBAL ghTab[nTabs] AS HWND +GLOBAL ghEdit[nTabs] AS HWND + +SET gTabPage$[nTabs] + "" +END SET + + + +ENUM + mnuNew = 9000 + mnuOpen + mnuSave + mnuCut + mnuCopy + mnuPaste + mnuUNDO + mnuREDO + mnuSELECTALL + mnuAbout + mnuEXIT + ID_TAB + ID_EDIT1 +END ENUM + + '================================================================ + SUB FORMLOAD() + IF FINDFIRSTINSTANCE(BCX_CLASSNAME$) THEN PostQuitMessage(0) + SET sAccel[] AS ACCEL + FCONTROL OR FVIRTKEY, ASC("N"), mnuNew, + FCONTROL OR FVIRTKEY, ASC("O"), mnuOpen, + FCONTROL OR FVIRTKEY, ASC("S"), mnuSave, + FCONTROL OR FVIRTKEY, ASC("Q"), mnuEXIT + END SET + + GLOBAL AS HACCEL ghAccTable + ghAccTable = CreateAcceleratorTable(sAccel, 4) + + InstallRAEdit(BCX_hInstance, FALSE) + + ghMainFrm = BCX_FORM("AIDE Demo", 0, 0, fWidth, fHeight) + + + + DIM rc AS RECT + GetClientRect (ghMainFrm, &rc) + AdjustWindowRect (&rc, 0, 0) + + ghMainTab = BCX_TAB(ghMainFrm, ID_TAB, 1, ghTab, gTabPage$, 0, 0, fWidth, fHeight-26,NULL) + BCX_SET_FONT(ghMainTab, "Verdana", 9) + + ghEdit[0] = BCX_CONTROL("RAEdit", ghTab[0], "This is Page ", 6000, rc.left,rc.top,rc.right-rc.left-8,rc.bottom-rc.top-46, _ + WS_CHILD OR WS_VISIBLE OR WS_BORDER OR ES_LEFT OR ES_MULTILINE OR STYLE_AUTOSIZELINENUM OR STYLE_NOLINENUMBER OR STYLE_DRAGDROP) + + RaConfigEditor(ghEdit[0]) + + SetupMenu(ghMainFrm) + + ghStatus = BCX_STATUS("Ready", ghMainFrm) + + 'Generate a WM_SIZE message + MoveWindow(ghMainFrm, 0, 0, fWidth, fHeight, TRUE) 'Force a WM_SIZE + + CENTER(ghMainFrm) + SHOW(ghMainFrm) + + ' SetFocus(ghEdit[0]) + + END SUB + + +SUB SetupMenu(parent as HWND) + GLOBAL AS HMENU MainMenu, FileMenu, EditMenu, HelpMenu + MainMenu = CreateMenu() + FileMenu = CreateMenu() + EditMenu = CreateMenu() + HelpMenu = CreateMenu() + + InsertMenu(MainMenu, 0, MF_POPUP, FileMenu, "&File") + AppendMenu(FileMenu, MF_STRING, mnuNew, E"New\tCtrl-N") + AppendMenu(FileMenu, MF_STRING, mnuOpen, E"Open\tCtrl-O") + AppendMenu(FileMenu, MF_STRING, mnuSave, E"Save\tCtrl-S") + AppendMenu(FileMenu, MF_SEPARATOR, 0, NULL) + AppendMenu(FileMenu, MF_STRING, mnuEXIT, E"Exit\tAlt-F4") + + Insertmenu(MainMenu, 1, MF_POPUP, EditMenu, "&Edit") + AppendMenu(EditMenu, MF_STRING, mnuCut, E"Cut\tCtrl-X") + AppendMenu(EditMenu, MF_STRING, mnuCopy, E"Copy\tCtrl-C") + AppendMenu(EditMenu, MF_STRING, mnuPaste, E"Paste\tCtrl-V") + AppendMenu(EditMenu, MF_SEPARATOR, 0, NULL) + AppendMenu(EditMenu, MF_STRING, mnuSELECTALL, E"Select All\tCtrl-A") + AppendMenu(EditMenu, MF_SEPARATOR, 0, NULL) + AppendMenu(EditMenu, MF_STRING, mnuUNDO, E"Undo\tCtrl-Z") + AppendMenu(EditMenu, MF_STRING, mnuREDO, E"Redo\tCtrl-Y") + + Insertmenu(MainMenu, 2, MF_POPUP, HelpMenu, "Help") + AppendMenu(HelpMenu, MF_STRING, mnuAbout, "About") + + SetMenu(parent, MainMenu) + +END SUB + +FUNCTION GetTabLabelText$(index AS INTEGER) + DIM AS TCITEM tabItem + DIM tabLabel$ + + tabItem.mask = TCIF_TEXT + tabItem.pszText = tabLabel + tabItem.cchTextMax = sizeof(tabLabel) + + TabCtrl_GetItem(ghMainTab, index, &tabItem) + + FUNCTION = TRIM$(tabLabel) +END FUNCTION + +SUB SetTabLabelText(fname$, index AS INTEGER) + DIM AS TCITEM tabItem + + tabItem.mask=TCIF_TEXT + tabItem.pszText = BCXSPLITPATH$(fname$,FNAME OR FEXT) + tabItem.cchTextMax = BCXSTRSIZE + + TabCtrl_SetItem(ghMainTab, index, &tabItem) +END SUB + '================================================================ + +BEGIN EVENTS + SELECT CASE CBMSG + + CASE WM_SHOWWINDOW + ' RaNewEdit() + + CASE WM_COMMAND + SELECT CASE CBCTL + CASE mnuOpen + dim fname$ + + IF TRIM$(GetTabLabelText(TabCtrl_GetCurSel(ghMainTab))) <> "" THEN + RaNewEdit() + END IF + + fname$ = RaLoadFile(ghEdit[TabCtrl_GetCurSel(ghMainTab)]) + + IF *fname$ THEN + SetTabLabelText(fname$, TabCtrl_GetCurSel(ghMainTab)) + END IF + + CASE mnuNew + RaNewEdit() + + CASE mnuCut + RaCut(ghEdit[TabCtrl_GetCurSel(ghMainTab)]) + + CASE mnuCopy + RaCopy(ghEdit[TabCtrl_GetCurSel(ghMainTab)]) + + CASE mnuPaste + RaPaste(ghEdit[TabCtrl_GetCurSel(ghMainTab)]) + + CASE mnuSELECTALL + RaSelectAll(ghEdit[TabCtrl_GetCurSel(ghMainTab)]) + + CASE mnuUNDO + RaUndo(ghEdit[TabCtrl_GetCurSel(ghMainTab)]) + + CASE mnuREDO + RaRedo(ghEdit[TabCtrl_GetCurSel(ghMainTab)]) + + CASE mnuEXIT + PostMessage(hWnd, WM_CLOSE, 0, 0) + + END SELECT + + CASE WM_SIZE + DIM cxClient% + DIM cyClient% + DIM rc AS RECT + + cxClient=LOWORD(lParam) + cyClient=HIWORD(lParam) + + MoveWindow(ghMainTab, 0, 2, cxClient+1, cyClient-22, TRUE) + + + + GetClientRect (ghMainTab, &rc) + AdjustWindowRect (&rc, 0, 0) + FOR INTEGER i = 0 to sizeof(ghEdit)/sizeof(ghEdit[0]) + IF ghEdit[i] THEN + SetWindowPos(ghEdit[i], NULL, rc.left, rc.top+2, (rc.right - rc.left)-8, (rc.bottom - rc.top)-24, SWP_NOZORDER OR SWP_NOMOVE ) + END IF + NEXT + + SendMessage(ghStatus, WM_SIZE, 0, 0) + + CASE WM_NOTIFY + DIM LPNMHDR AS NMHDR* + DIM PageNo AS LONG + DIM bm, buff$ + DIM AS RASELCHANGE PTR lpRASELCHANGE = (RASELCHANGE PTR)lParam + + LPNMHDR = (NMHDR*)lParam + + IF LPNMHDR->code >= TCN_LAST && LPNMHDR->code <= TCN_FIRST THEN + SELECT CASE LPNMHDR->code + CASE TCN_SELCHANGE + PageNo = TabCtrl_GetCurSel(ghMainTab) + SetFocus(ghEdit[PageNo]) + END SELECT + END IF + + IF LPNMHDR->hwndFrom = ghEdit[TabCtrl_GetCurSel(ghMainTab)] THEN + + IF LPNMHDR->code = EN_SELCHANGE THEN + ' Update statusbar + SPRINT buff,"Line:", lpRASELCHANGE->line+1, ", Column:", lpRASELCHANGE->chrg.cpMin - lpRASELCHANGE->cpLine+1 + SetWindowText(ghStatus, buff) + END IF + + IF lpRASELCHANGE->seltyp = SEL_OBJECT THEN + ' Bookmark clicked + bm=SendMessage(ghEdit[TabCtrl_GetCurSel(ghMainTab)],REM_GETBOOKMARK, lpRASELCHANGE->line,0) + SELECT CASE bm + CASE 1 + ' Collapse + SendMessage(ghEdit[TabCtrl_GetCurSel(ghMainTab)],REM_COLLAPSE, lpRASELCHANGE->line,0) + CASE 2 + ' Expand + SendMessage(ghEdit[TabCtrl_GetCurSel(ghMainTab)],REM_EXPAND, lpRASELCHANGE->line,0) + END SELECT + ELSE + ' Selection changed + IF lpRASELCHANGE->fchanged THEN + ' Update block bookmarks + SendMessage(ghEdit[TabCtrl_GetCurSel(ghMainTab)],REM_SETBLOCKS,0,0) + END IF + END IF + END IF + + + + CASE WM_CLOSE + DestroyWindow(hWnd) + + + CASE WM_DESTROY + PostQuitMessage(0) + + + Case WM_CONTEXTMENU + DIM AS POINT pt + If wParam=(WPARAM)ghTab[TabCtrl_GetCurSel(ghMainTab)] Then + pt.x = LOWORD(lParam) + pt.y = HIWORD(lParam) + TrackPopupMenu( GetSubMenu( GetMenu(hWnd), 1 ), TPM_LEFTALIGN or TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, 0 ) + EndIf + + + CASE WM_GETMINMAXINFO + DIM AS LPMINMAXINFO mm = cast(LPMINMAXINFO,lParam) + DIM AS UINT wDpi = GetDpiForWindow(hWnd) + DIM AS DOUBLE scalingFactor = (double)wDpi / 96 + DIM AS POINT defDims + + defDims.x = fWidth + wDpi + scalingFactor '+ (fWidth * scalingFactor) + defDims.y = fHeight + wDpi + scalingFactor '+ (fHeight * scalingFactor) + + mm->ptMinTrackSize = defDims + + END SELECT +END EVENTS + diff --git a/Aide.rc b/Aide.rc new file mode 100644 index 0000000..06f0621 --- /dev/null +++ b/Aide.rc @@ -0,0 +1,15 @@ +#include +#include "raedit.h" + +IDI_ICON ICON DISCARDABLE "resource/demo.ico" +IDB_RAEDITBUTTON BITMAP DISCARDABLE "resource/Button.bmp" +IDC_HSPLITTCUR CURSOR DISCARDABLE "resource/SplitH.cur" +IDB_BOOKMARK BITMAP DISCARDABLE "resource/Bookmark.bmp" +IDC_SELECTCUR CURSOR DISCARDABLE "resource/Select.cur" +IDB_LINENUMBER BITMAP DISCARDABLE "resource/Linenumber.bmp" +IDB_EXPAND BITMAP DISCARDABLE "resource/Expand.bmp" +IDB_COLLAPSE BITMAP DISCARDABLE "resource/Collapse.bmp" +IDB_LOCK BITMAP DISCARDABLE "resource/Lock.bmp" +RC_KEYWORDS RCDATA DISCARDABLE "resource/keywords.txt" +RC_WINAPI RCDATA DISCARDABLE "resource/winapi.txt" + diff --git a/lib/RAEdit.h b/lib/RAEdit.h new file mode 100644 index 0000000..b5fbcc8 --- /dev/null +++ b/lib/RAEdit.h @@ -0,0 +1,319 @@ +#pragma once + +#ifdef __cplusplus + extern "C" { +#endif + +#include +#include +#include + +#pragma pack(push, 1) + +// Default colors +#define BCKCLR 0x00C0F0F0 +#define TXTCLR 0x00000000 +#define SELBCKCLR 0x00800000 +#define SELTXTCLR 0x00FFFFFF +#define CMNTCLR 0x02008000 +#define STRCLR 0x00A00000 +#define OPRCLR 0x000000A0 +#define HILITE1 0x00F0C0C0 +#define HILITE2 0x00C0F0C0 +#define HILITE3 0x00C0C0F0 +#define SELBARCLR 0x00C0C0C0 +#define SELBARPEN 0x00808080 +#define LNRCLR 0x00800000 +#define NUMCLR 0x00808080 +#define CMNTBCK 0x00C0F0F0 +#define STRBCK 0x00C0F0F0 +#define NUMBCK 0x00C0F0F0 +#define OPRBCK 0x00C0F0F0 +#define CHANGEDCLR 0x0000F0F0 +#define CHANGESAVEDCLR 0x0000F000 + +// Window styles +#define STYLE_NOSPLITT 0x0001 // No splitt button +#define STYLE_NOLINENUMBER 0x0002 // No linenumber button +#define STYLE_NOCOLLAPSE 0x0004 // No expand/collapse buttons +#define STYLE_NOHSCROLL 0x0008 // No horizontal scrollbar +#define STYLE_NOVSCROLL 0x0010 // No vertical scrollbar +#define STYLE_NOHILITE 0x0020 // No color hiliting +#define STYLE_NOSIZEGRIP 0x0040 // No size grip +#define STYLE_NODBLCLICK 0x0080 // No action on double clicks +#define STYLE_READONLY 0x0100 // Text is locked +#define STYLE_NODIVIDERLINE 0x0200 // Blocks are not divided by line +#define STYLE_NOBACKBUFFER 0x0400 // Drawing directly to screen DC +#define STYLE_NOSTATE 0x0800 // No state indicator +#define STYLE_DRAGDROP 0x1000 // Drag & Drop support, app must load ole +#define STYLE_SCROLLTIP 0x2000 // Scrollbar tooltip +#define STYLE_HILITECOMMENT 0x4000 // Comments are hilited +#define STYLE_AUTOSIZELINENUM 0x8000 // Line number column autosizes + +// Styles used with REM_SETSTYLEEX message +#define STYLEEX_LOCK 0x0001 // Show lock button +#define STYLEEX_BLOCKGUIDE 0x0002 // Show block guiders +#define STILEEX_LINECHANGED 0x0004 // Show line changed state +#define STILEEX_STRINGMODEFB 0x0008 // FreeBasic +#define STILEEX_STRINGMODEC 0x0010 // C/C++ + +// Edit modes +#define MODE_NORMAL 0 // Normal +#define MODE_BLOCK 1 // Block select +#define MODE_OVERWRITE 2 // Overwrite + +// REM_COMMAND commands +#define CMD_LEFT 1 +#define CMD_RIGHT 2 +#define CMD_LINE_UP 3 +#define CMD_LINE_DOWN 4 +#define CMD_PAGE_UP 5 +#define CMD_PAGE_DOWN 6 +#define CMD_HOME 7 +#define CMD_END 8 +#define CMD_INSERT 9 +#define CMD_DELETE 10 +#define CMD_BACKSPACE 11 +// REM_COMMAND modifyers +#define CMD_ALT 256 +#define CMD_CTRL 512 +#define CMD_SHIFT 1024 + +// Private edit messages +#define REM_RAINIT (WM_USER+9999) // wParam=0, lParam=pointer to controls DIALOG struct +#define REM_BASE (WM_USER+1000) +#define REM_SETHILITEWORDS (REM_BASE+0) // wParam=Color, lParam=lpszWords +#define REM_SETFONT (REM_BASE+1) // wParam=nLineSpacing, lParam=lpRAFONT +#define REM_GETFONT (REM_BASE+2) // wParam=0, lParam=lpRAFONT +#define REM_SETCOLOR (REM_BASE+3) // wParam=0, lParam=lpRACOLOR +#define REM_GETCOLOR (REM_BASE+4) // wParam=0, lParam=lpRACOLOR +#define REM_SETHILITELINE (REM_BASE+5) // wParam=Line, lParam=Color +#define REM_GETHILITELINE (REM_BASE+6) // wParam=Line, lParam=0 +#define REM_SETBOOKMARK (REM_BASE+7) // wParam=Line, lParam=Type +#define REM_GETBOOKMARK (REM_BASE+8) // wParam=Line, lParam=0 +#define REM_CLRBOOKMARKS (REM_BASE+9) // wParam=0, lParam=Type +#define REM_NXTBOOKMARK (REM_BASE+10) // wParam=Line, lParam=Type +#define REM_PRVBOOKMARK (REM_BASE+11) // wParam=Line, lParam=Type +#define REM_FINDBOOKMARK (REM_BASE+12) // wParam=BmID, lParam=0 +#define REM_SETBLOCKS (REM_BASE+13) // wParam=[lpLINERANGE], lParam=0 +#define REM_ISLINE (REM_BASE+14) // wParam=Line, lParam=lpszDef +#define REM_GETWORD (REM_BASE+15) // wParam=BuffSize, lParam=lpBuff +#define REM_COLLAPSE (REM_BASE+16) // wParam=Line, lParam=0 +#define REM_COLLAPSEALL (REM_BASE+17) // wParam=0, lParam=0 +#define REM_EXPAND (REM_BASE+18) // wParam=Line, lParam=0 +#define REM_EXPANDALL (REM_BASE+19) // wParam=0, lParam=0 +#define REM_LOCKLINE (REM_BASE+20) // wParam=Line, lParam=TRUE/FALSE +#define REM_ISLINELOCKED (REM_BASE+21) // wParam=Line, lParam=0 +#define REM_HIDELINE (REM_BASE+22) // wParam=Line, lParam=TRUE/FALSE +#define REM_ISLINEHIDDEN (REM_BASE+23) // wParam=Line, lParam=0 +#define REM_AUTOINDENT (REM_BASE+24) // wParam=0, lParam=TRUE/FALSE +#define REM_TABWIDTH (REM_BASE+25) // wParam=nChars, lParam=TRUE/FALSE (Expand tabs) +#define REM_SELBARWIDTH (REM_BASE+26) // wParam=nWidth, lParam=0 +#define REM_LINENUMBERWIDTH (REM_BASE+27) // wParam=nWidth, lParam=0 +#define REM_MOUSEWHEEL (REM_BASE+28) // wParam=nLines, lParam=0 +#define REM_SUBCLASS (REM_BASE+29) // wParam=0, lParam=lpWndProc +#define REM_SETSPLIT (REM_BASE+30) // wParam=nSplit, lParam=0 +#define REM_GETSPLIT (REM_BASE+31) // wParam=0, lParam=0 +#define REM_VCENTER (REM_BASE+32) // wParam=0, lParam=0 +#define REM_REPAINT (REM_BASE+33) // wParam=0, lParam=TRUE/FALSE (Paint Now) +#define REM_BMCALLBACK (REM_BASE+34) // wParam=0, lParam=lpBmProc +#define REM_READONLY (REM_BASE+35) // wParam=0, lParam=TRUE/FALSE +#define REM_INVALIDATELINE (REM_BASE+36) // wParam=Line, lParam=0 +#define REM_SETPAGESIZE (REM_BASE+37) // wParam=nLines, lParam=0 +#define REM_GETPAGESIZE (REM_BASE+38) // wParam=0, lParam=0 +#define REM_GETCHARTAB (REM_BASE+39) // wParam=nChar, lParam=0 +#define REM_SETCHARTAB (REM_BASE+40) // wParam=nChar, lParam=nValue +#define REM_SETCOMMENTBLOCKS (REM_BASE+41) // wParam=lpStart, lParam=lpEnd +#define REM_SETWORDGROUP (REM_BASE+42) // wParam=0, lParam=nGroup (0-15) +#define REM_GETWORDGROUP (REM_BASE+43) // wParam=0, lParam=0 +#define REM_SETBMID (REM_BASE+44) // wParam=nLine, lParam=nBmID +#define REM_GETBMID (REM_BASE+45) // wParam=nLine, lParam=0 +#define REM_ISCHARPOS (REM_BASE+46) // wParam=CP, lParam=0, returns 1 if comment block, 2 if comment, 3 if string +#define REM_HIDELINES (REM_BASE+47) // wParam=nLine, lParam=nLines +#define REM_SETDIVIDERLINE (REM_BASE+48) // wParam=nLine, lParam=TRUE/FALSE +#define REM_ISINBLOCK (REM_BASE+49) // wParam=nLine, lParam=lpRABLOCKDEF +#define REM_TRIMSPACE (REM_BASE+50) // wParam=nLine, lParam=fLeft +#define REM_SAVESEL (REM_BASE+51) // wParam=0, lParam=0 +#define REM_RESTORESEL (REM_BASE+52) // wParam=0, lParam=0 +#define REM_GETCURSORWORD (REM_BASE+53) // wParam=BuffSize, lParam=lpBuff, Returns line number +#define REM_SETSEGMENTBLOCK (REM_BASE+54) // wParam=nLine, lParam=TRUE/FALSE +#define REM_GETMODE (REM_BASE+55) // wParam=0, lParam=0 +#define REM_SETMODE (REM_BASE+56) // wParam=nMode, lParam=0 +#define REM_GETBLOCK (REM_BASE+57) // wParam=0, lParam=lpBLOCKRANGE +#define REM_SETBLOCK (REM_BASE+58) // wParam=0, lParam=lpBLOCKRANGE +#define REM_BLOCKINSERT (REM_BASE+59) // wParam=0, lParam=lpText +#define REM_LOCKUNDOID (REM_BASE+60) // wParam=TRUE/FALSE, lParam=0 +#define REM_ADDBLOCKDEF (REM_BASE+61) // wParam=0, lParam=lpRABLOCKDEF +#define REM_CONVERT (REM_BASE+62) // wParam=nType, lParam=0 +#define REM_BRACKETMATCH (REM_BASE+63) // wParam=0, lParam=lpDef {[(,}]),_ +#define REM_COMMAND (REM_BASE+64) // wParam=nCommand, lParam=0 +#define REM_CASEWORD (REM_BASE+65) // wParam=cp, lParam=lpWord +#define REM_GETBLOCKEND (REM_BASE+66) // wParam=Line, lParam=0 +#define REM_SETLOCK (REM_BASE+67) // wParam=TRUE/FALSE, lParam=0 +#define REM_GETLOCK (REM_BASE+68) // wParam=0, lParam=0 +#define REM_GETWORDFROMPOS (REM_BASE+69) // wParam=cp, lParam=lpBuff +#define REM_SETNOBLOCKLINE (REM_BASE+70) // wParam=Line, lParam=TRUE/FALSE +#define REM_ISLINENOBLOCK (REM_BASE+71) // wParam=Line, lParam=0 +#define REM_SETALTHILITELINE (REM_BASE+72) // wParam=Line, lParam=TRUE/FALSE +#define REM_ISLINEALTHILITE (REM_BASE+73) // wParam=Line, lParam=0 +#define REM_SETCURSORWORDTYPE (REM_BASE+74) // wParam=nType, lParam=0 +#define REM_SETBREAKPOINT (REM_BASE+75) // wParam=nLine, lParam=TRUE/FALSE +#define REM_NEXTBREAKPOINT (REM_BASE+76) // wParam=nLine, lParam=0 +#define REM_GETLINESTATE (REM_BASE+77) // wParam=nLine, lParam=0 +#define REM_SETERROR (REM_BASE+78) // wParam=nLine, lParam=nErrID +#define REM_GETERROR (REM_BASE+79) // wParam=nLine, lParam=0 +#define REM_NEXTERROR (REM_BASE+80) // wParam=nLine, lParam=0 +#define REM_CHARTABINIT (REM_BASE+81) // wParam=0, lParam=0 +#define REM_LINEREDTEXT (REM_BASE+82) // wParam=nLine, lParam=TRUE/FALSE +#define REM_SETSTYLEEX (REM_BASE+83) // wParam=nStyleEx, lParam=0 +#define REM_GETUNICODE (REM_BASE+84) // wParam=0, lParam=0 +#define REM_SETUNICODE (REM_BASE+85) // wParam=TRUE/FALSE, lParam=0 +#define REM_SETCHANGEDSTATE (REM_BASE+86) // wParam=TRUE/FALSE, lParam=0 +#define REM_SETTOOLTIP (REM_BASE+87) // wParam=n (1-6), lParam=lpText +#define REM_HILITEACTIVELINE (REM_BASE+88) // wParam=0, lParam=nColor +#define REM_GETUNDO (REM_BASE+89) // wParam=nSize, lParam=lpMem +#define REM_SETUNDO (REM_BASE+90) // wParam=nSize, lParam=lpMem +#define REM_GETLINEBEGIN (REM_BASE+91) // wParam=nLine, lParam=0 + +// Convert types +#define CONVERT_TABTOSPACE 0 +#define CONVERT_SPACETOTAB 1 +#define CONVERT_UPPERCASE 2 +#define CONVERT_LOWERCASE 3 + +// Line hiliting +#define STATE_HILITEOFF 0 +#define STATE_HILITE1 1 +#define STATE_HILITE2 2 +#define STATE_HILITE3 3 +#define STATE_HILITEMASK 3 + +// Bookmarks +#define STATE_BMOFF 0x00 +#define STATE_BM1 0x10 +#define STATE_BM2 0x20 +#define STATE_BM3 0x30 +#define STATE_BM4 0x40 +#define STATE_BM5 0x50 +#define STATE_BM6 0x60 +#define STATE_BM7 0x70 +#define STATE_BM8 0x80 +#define STATE_BMMASK 0x0F0 + +// Line states +#define STATE_LOCKED 0x00000100 +#define STATE_HIDDEN 0x00000200 +#define STATE_COMMENT 0x00000400 +#define STATE_DIVIDERLINE 0x00000800 +#define STATE_SEGMENTBLOCK 0x00001000 +#define STATE_NOBLOCK 0x00002000 +#define STATE_ALTHILITE 0x00004000 +#define STATE_BREAKPOINT 0x00008000 +#define STATE_BLOCKSTART 0x00010000 +#define STATE_BLOCK 0x00020000 +#define STATE_BLOCKEND 0x00040000 +#define STATE_REDTEXT 0x00080000 +#define STATE_COMMENTNEST 0x00100000 +#define STATE_CHANGED 0x00200000 +#define STATE_CHANGESAVED 0x00400000 +#define STATE_GARBAGE 0x80000000 + +// Character table types +#define CT_NONE 0 +#define CT_CHAR 1 +#define CT_OPER 2 +#define CT_HICHAR 3 +#define CT_CMNTCHAR 4 +#define CT_STRING 5 +#define CT_CMNTDBLCHAR 6 +#define CT_CMNTINITCHAR 7 + +// Find +#define FR_IGNOREWHITESPACE 0x8000000 + +struct tagRAFONT { + HFONT hFont; // Code edit normal + HFONT hIFont; // Code edit italics + HFONT hLnrFont; // Line numbers +}; +typedef struct tagRAFONT RAFONT; + +struct tagRACOLOR { + COLORREF bckcol; // Back color + COLORREF txtcol; // Text color + COLORREF selbckcol; // Sel back color + COLORREF seltxtcol; // Sel text color + COLORREF cmntcol; // Comment color + COLORREF strcol; // String color + COLORREF oprcol; // Operator color + COLORREF hicol1; // Line hilite 1 + COLORREF hicol2; // Line hilite 2 + COLORREF hicol3; // Line hilite 3 + COLORREF selbarbck; // Selection bar + COLORREF selbarpen; // Selection bar pen + COLORREF lnrcol; // Line numbers color + COLORREF numcol; // Numbers & hex color + COLORREF cmntback; // Comment back color + COLORREF strback; // String back color + COLORREF numback; // Numbers & hex back color + COLORREF oprback; // Operator back color + COLORREF changed; // Line changed indicator + COLORREF changesaved; // Line saved chane indicator +}; +typedef struct tagRACOLOR RACOLOR; + +struct tagRASELCHANGE { + NMHDR nmhdr; + CHARRANGE chrg; // Current selection + WORD seltyp; // SEL_TEXT or SEL_OBJECT + DWORD line; // Line number + DWORD cpLine; // Character position of first character + HANDLE lpLine; // Pointer to line + DWORD nlines; // Total number of lines + DWORD nhidden; // Total number of hidden lines + BOOL fchanged; // TRUE if changed since last + DWORD npage; // Page number + DWORD nWordGroup; // Hilite word group(0-15) +}; +typedef struct tagRASELCHANGE RASELCHANGE; + +#define BD_NONESTING 0x01 // Set to true for non nested blocks +#define BD_DIVIDERLINE 0x02 // Draws a divider line +#define BD_INCLUDELAST 0x04 // lpszEnd line is also collapsed +#define BD_LOOKAHEAD 0x08 // Look 500 lines ahead for the ending +#define BD_SEGMENTBLOCK 0x10 // Segment block, collapse till next segmentblock +#define BD_COMMENTBLOCK 0x20 // Comment block +#define BD_NOBLOCK 0x40 // +#define BD_ALTHILITE 0x80 // Adds 1 to the current word group for syntax coloring. + +struct tagRABLOCKDEF { + LPTSTR lpszStart; // Block start + LPTSTR lpszEnd; // Block end + LPTSTR lpszNot1; // Dont hide line containing this or set to NULL + LPTSTR lpszNot2; // Dont hide line containing this or set to NULL + DWORD flag; // High word is WordGroup(0-15) +}; +typedef struct tagRABLOCKDEF RABLOCKDEF; + +struct tagLINERANGE { + DWORD lnMin; // Starting line + DWORD lnMax; // Ending line +}; +typedef struct tagLINERANGE LINERANGE; + +struct tagBLOCKRANGE { + DWORD lnMin; // Starting line + DWORD clMin; // Starting column + DWORD lnMax; // Ending line + DWORD clMax; // Ending column +}; +typedef struct tagBLOCKRANGE BLOCKRANGE; + +void WINAPI InstallRAEdit(HINSTANCE hInst, BOOL fGlobal); +void WINAPI UnInstallRAEdit(void); + + +#ifdef __cplusplus +} +#endif +#pragma pack(pop) diff --git a/raedit.h b/raedit.h new file mode 100644 index 0000000..79da3e3 --- /dev/null +++ b/raedit.h @@ -0,0 +1,11 @@ +#define IDI_ICON 6666 +#define IDB_RAEDITBUTTON 100 +#define IDC_HSPLITTCUR 101 +#define IDB_BOOKMARK 102 +#define IDC_SELECTCUR 103 +#define IDB_LINENUMBER 104 +#define IDB_EXPAND 105 +#define IDB_COLLAPSE 106 +#define IDB_LOCK 107 +#define RC_KEYWORDS 108 +#define RC_WINAPI 109 diff --git a/raedit.inc b/raedit.inc new file mode 100644 index 0000000..a4e15cb --- /dev/null +++ b/raedit.inc @@ -0,0 +1,188 @@ +#include "lib/RAEdit.h" +#include "raEdit.h" +$PRAGMA lib "lib/libRAEditC.a" + +SUB RaNewEdit() + DIM pn + DIM AS RECT rc + + pn = TabCtrl_GetItemCount(ghMainTab) + + GetClientRect (ghMainTab, &rc) + AdjustWindowRect (&rc, 0, 0) + + IF pn THEN + BCX_ADDTAB(ghMainTab, pn, "") + ghEdit[pn] = BCX_CONTROL("RAEdit", ghTab[pn], "This is Page ", pn+6000, rc.left,rc.top,rc.right-rc.left-8,rc.bottom-rc.top-46, _ + WS_CHILD OR WS_VISIBLE OR WS_BORDER OR ES_LEFT OR ES_MULTILINE OR STYLE_AUTOSIZELINENUM OR STYLE_NOLINENUMBER OR STYLE_DRAGDROP) + END IF + + RaConfigEditor(ghEdit[pn]) + +END SUB + +SUB RaConfigEditor(hEDT as HWND) + + ' Set Editor Font + BCX_SET_FONT(hEDT, "Consolas", 12) + + ' Enable Line Numbers + CheckDlgButton(hEDT,-2,TRUE) + SendMessage(hEDT, WM_COMMAND, -2, 0) + + ' Highlite Active Line in Editor + SendMessage(hEDT, REM_HILITEACTIVELINE, 0, 2) + + ' Set the comment character + SendMessage(hEDT, REM_SETCHARTAB, ASC(";"), CT_OPER) + SendMessage(hEDT, REM_SETCHARTAB, ASC("'"), CT_CMNTCHAR) + + + ' Enable Block Guides + SendMessage(hEDT, REM_SETSTYLEEX, STYLEEX_BLOCKGUIDE,0) + + ' Set up tabbing; 4 spaces, also convert to spaces on load? + SendMessage(hEDT, CONVERT_TABTOSPACE, 0, 0) + SendMessage(hEDT, REM_TABWIDTH, 4, TRUE) + + ' SendMEssage(RAEdit, REM_CONVERT, CONVERT_UPPERCASE, 0) + + SendMessage(hEDT, REM_SETSTYLEEX, STILEEX_STRINGMODEFB, 0) + + ' Set Colors and Keywords + RaSetColors(hEDT) + RaLoadKeyWords(hEDT) + + ' Set Folding Words, minimal list + ' [$] is a placeholder, [!] disable folding if following word is at eol? + ' Optional Number or define at end of function call specifies the type of styling + RaSetBlocks(hEDT,"begin events", "end events",0) + RaSetBlocks(hEDT,"begin dialog", "end dialog",0) + RaSetBlocks(hEDT,"begin modal dialog", "end dialog",0) + RaSetBlocks(hEDT,"%private %public Function $","end Function") + RaSetBlocks(hEDT,"if $! then", "EndIf|End If") + RaSetBlocks(hEDT,"with $", "end with") + RaSetBlocks(hEDT,"select case !end select","End Select") + RaSetBlocks(hEDT,"%private %public sub $","end sub") + RaSetBlocks(hEDT,"enum", "end enum",0) + RaSetBlocks(hEDT,"while $ !wend", "wend",0) + RaSetBlocks(hEDT,"type!as","End Type",0) + RaSetBlocks(hEDT,"do!loop","Loop",0) + RaSetBlocks(hEDT,"while $ !wend","wend",0) + RaSetBlocks(hEDT,"for $ !next","next",0) + + SetFocus(hEDT) +END SUB +' Sets keyword blocks for folding +Function RaSetBlocks OPTIONAL (hEDT as HWND, start_block AS STRING, end_block AS STRING, flag AS INTEGER = 0) AS INTEGER + DIM AS RABLOCKDEF blockdef + SendMessage(hEDT, REM_SETBLOCKS,0,0) + WITH blockdef + .lpszStart = start_block + .lpszEnd = end_block + .lpszNot1 = 0 + .lpszNot2 = 0 + .flag = flag + END WITH + + FUNCTION = SendMessage(hEDT, REM_ADDBLOCKDEF, 0, &blockdef) +END FUNCTION + +Function RaLoadKeyWords(hEDT AS HWND) As INTEGER + DIM AS INTEGER r + DIM AS DWORD rcSize + + r = SendMessage(hEDT, REM_SETHILITEWORDS, 0xc48a4c, (LPCSTR)GetResource(RC_KEYWORDS, RT_RCDATA, &rcSize)) + r = SendMessage(hEDT, REM_SETHILITEWORDS, 0x5f5fce, (LPCSTR)GetResource(RC_WINAPI, RT_RCDATA, &rcSize)) + + FUNCTION = r +End Function + +' Configure color scheme for RAEdit object +SUB RaSetColors(hEDT as HWND) + DIM AS RACOLOR colors + + WITH colors + .bckcol = QBCOLOR(0) ' Back color + .txtcol = QBCOLOR(11) ' Text color + .selbckcol = 0xd89f62 ' Sel back color + .seltxtcol = SELTXTCLR ' Sel text color + .cmntcol = QBCOLOR(24) ' Comment color + .strcol = RGB(0,193,0) ' String color + .oprcol = 0x5f5fce ' Operator color + .hicol1 = HILITE1 ' Line hilite 1 [ current line color option 1 ] + .hicol2 = 0x303030 ' Line hilite 2 [ current line color option 2 ] + .hicol3 = HILITE3 ' Line hilite 3 [ current line color option 3 ] + .selbarbck = RGB(20,20,20) ' Line numbers panel background + .selbarpen = SELBARPEN ' Selection bar pen + .lnrcol = 0xffffff ' Line numbers color + .numcol = 0x5f5fce ' Numbers & hex color + .cmntback = QBCOLOR(0) ' Comment back color + .strback = QBCOLOR(0) ' String back color + .numback = QBCOLOR(0) ' Numbers & hex back color + .oprback = QBCOLOR(0) ' Operator back color + .changed = CHANGEDCLR ' Line changed indicator + .changesaved = CHANGESAVEDCLR ' Line saved chane indicator + END WITH + + SendMessage(hEDT, REM_SETCOLOR, 0, &colors) +END SUB + +' Loads file into RAEdit object +FUNCTION RaLoadFile(edt AS HWND) AS STRING + DIM RetStr$ + DIM AS CHARRANGE chrg + RetStr$ = GetFileName$("Open File...", "BCX Files|*.BAS;*.INC;*.bi;*.bci") + IF Len(RetStr$) THEN + EDITLOADFILE(edt, RetStr$) + chrg.cpMin = 0 + chrg.cpMax = 0 + SendMessage(edt, EM_EXSETSEL, 0, &chrg) + SendMessage(edt, EM_SCROLLCARET, 0, 0) + SendMessage(edt, REM_HILITEACTIVELINE, 0, 2) + SetFocus(edt) + END IF + FUNCTION = RetStr$ +END FUNCTION + +SUB RaGotoLine(hEDT as HWND, Line AS INTEGER) + Dim chrg As CHARRANGE + DIM GotoLine + + GotoLine = SendMessage(hEDT, EM_LINEINDEX, Line, 0) + chrg.cpMin = GotoLine + chrg.cpMax = GotoLine + + SendMessage(hEDT, EM_EXSETSEL, 0, &chrg) + SendMessage(hEDT, EM_SCROLLCARET, 0, 0) +END SUB + +SUB RaCut(hEDT as HWND) + SendMessage(hEDT, WM_CUT, 0, 0) + SetFocus(hEDT) +END SUB + +SUB RaCopy(hEDT as HWND) + SendMessage(hEDT, WM_COPY, 0, 0) + SetFocus(hEDT) +END SUB + +SUB RaPaste(hEDT as HWND) + SendMessage(hEDT, WM_PASTE, 0, 0) + SetFocus(hEDT) +END SUB + +SUB RaSelectAll(hEDT as HWND) + SendMessage(hEDT, EM_SETSEL, 0, -1) + SetFocus(hEDT) +END SUB + +SUB RaUndo(hEDT as HWND) + SendMessage(hEDT, EM_UNDO, 0, 0) + SetFocus(hEDT) +END SUB + +SUB RaRedo(hEDT as HWND) + SendMessage(hEDT, EM_REDO, 0, 0) + SetFocus(hEDT) +END SUB diff --git a/resource/Bookmark.bmp b/resource/Bookmark.bmp new file mode 100644 index 0000000000000000000000000000000000000000..80062d2fa65e6e987473b6b93c5f8ece31910d07 GIT binary patch literal 690 zcmb7CF%p6>5L_G!W^~N(3m;)+?<@R+^_3}UQ}G91Kw-%vd;yb|D()pJ>I4Ul>~UPO zmt>FQ>AFI+3;mur6C0wynjScC{KUDrKBEnSLM{@@sXl5Czb-#7dkv5d`;^2!K0jR34iF*UG_RAfM_y=@hTVHW)8RNWL(mH{Sj3 z?)lTRU%ozE)_Ht>x7H`0K0diy@6Y_(-CEy2JUWA?%l0=&ie{~Sp5dAl&5Yd4nH0^; zo{^KzSv0fa%$|{x&e_aeX2qF3BPX3xxHdsjG!t%uq-fUGhaf4Mwe=xLie_zn2$G^% zTOWd?Xy(yoxgaST1LgXV6wM6W1WD1X(1#!?nicvGBt^4AAA+Q4W=rQWW@=J2O3U>j zDH@aI`j8aOOx^@Z(X7;mASs%a`Vb^VGp};CZz|8QqOpN;eMpMNgUIzEDH;pP^&u&m zS#T31MYBpDf~089pU}Lv*{Z2G5niTOtPe@i*i^YbBt_%lYWZ#a%W9M{|Rj_Z0o@czs$m&?KBIF|Fwe3lu0hJVjy9>0w{XFaBtdo|ZTpR?zA eQ|f0nU*^6qx}4vBU8dj7aa?bY<8}-FJ^2A4xj5zk literal 0 HcmV?d00001 diff --git a/resource/Collapse.bmp b/resource/Collapse.bmp new file mode 100644 index 0000000000000000000000000000000000000000..adfc6b34b5dd87ffa132d63cb5ef5609d43d2b95 GIT binary patch literal 206 zcmZ?rJ;wk6Wk5;;h&h3n8;BVhSb!u0Lj;(_Ml>)m01-n&1B3#SKqe43FdR5=04VVv jj2Qm^2eE({2th(Xq5}wkN-<~#hMqIX;voJ364U_zeqb=+ literal 0 HcmV?d00001 diff --git a/resource/Expand.bmp b/resource/Expand.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f12b8b0dbeb7a490fa678e6669738ed388a974e6 GIT binary patch literal 206 zcmZvVu?>JQ3mQBK~K*l)GjF)$^#%)3THQArkJ=b@hf8Ot7pR?}*uu&}W literal 0 HcmV?d00001 diff --git a/resource/Linenumber.bmp b/resource/Linenumber.bmp new file mode 100644 index 0000000000000000000000000000000000000000..192bb2395dfa90f5774bbea427ea450b835c07f1 GIT binary patch literal 206 zcmZ{bu?>JQ30LTVmiToZ0=ULksBLie2$iCZn7fj!~0j9&N-@OCzL!*+ULG)+MWyT=&|NZ~x PgXxK1{K53klVI}zgH}Xj literal 0 HcmV?d00001 diff --git a/resource/Select.cur b/resource/Select.cur new file mode 100644 index 0000000000000000000000000000000000000000..9e0e79066182455e5a01b60145f4c8b99ac4595c GIT binary patch literal 326 zcmZ|JJqiLb5QgC|27ihLE5&k4OG``dvPZD7_Yxk(Qt%>*7YNt{6vubmz!s7TPrghN zLZp#`+E!XIJjvNXpO5#Gxku*C}8 nuM~f%*OQ}rk;wEi%X@TY@7TMLHzee;_aV(4am54v*nfQi*MWc% literal 0 HcmV?d00001 diff --git a/resource/SplitH.cur b/resource/SplitH.cur new file mode 100644 index 0000000000000000000000000000000000000000..e973e4d0c63e3ff66f6205cb8c7c6ae68d4f123c GIT binary patch literal 326 zcmaKmF%rTs5Chi^eW=pLB_%%~PvIx_vnd#aE@mc;iEiXOd33TNlPD!KyY2}V;AR$c zGm~q_uXS;pk`6JPnnO0o1uj>Zo?X}K2OL_xAKYi(g*QCmjh)am^FRED6IAK*klw5G PntKo37<1&6GfwaYgVA~M literal 0 HcmV?d00001 diff --git a/resource/SplitV.cur b/resource/SplitV.cur new file mode 100644 index 0000000000000000000000000000000000000000..744ce4c7eadad3c77597cfc522934f20927903d6 GIT binary patch literal 326 zcmZQzU}9ioP*7lE;0HnjMg|5k1_lNVAXWfk2OwqyLNI_*5DtR;|NlRNgOA1jfPsN^ z0RpQoVPFVd#lSFkCj%p6Lj#Bg^FiXs>ewGJ5CT9q5C%Ww|NlqEH>Cgn?+^sJ{{KG) RhI$YU=7YqM)q&Uq006N7ehL5p literal 0 HcmV?d00001 diff --git a/resource/demo.ico b/resource/demo.ico new file mode 100644 index 0000000000000000000000000000000000000000..262fd96f3dae17ce8ae2917760f02bc2e1f33af0 GIT binary patch literal 15406 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