;-program notes ; oneText text editor 20070304 ; stream io removed ;-initialise ;- Enumeration #WIN1 #MENU #POP_UP #STAT1 #EDIT1 #DATE1 #FILE_OPEN #FILE_INSERT #FILE_NEW #FILE_RECENT1 #FILE_RECENT2 #FILE_RECENT3 #FILE_RECENT4 #FILE_RECENT5 #FILE_RECENT6 #FILE_RECENT7 #FILE_RECENT8 #FILE_SAVE #FILE_SAVEAS #FILE_SAVECOPY #FILE_SAVETO #FILE_PRINT #FILE_HOME #FILE_EXPLORE #FILE_FIND #FILE_SHUTDOWN #FILE_LOGOFF #FILE_QUIT #EDIT_UNDO #EDIT_CUT #EDIT_COPY #EDIT_PASTE #EDIT_ERASE #EDIT_SELECTALL #EDIT_CLIPBOARD #EDIT_FINDREPL #EDIT_DATE #EDIT_TIME #TOOLS_SEARCH #TOOLS_CHARMAP #TOOLS_CLIPBOARD #TOOLS_DATEPICKER #TOOLS_CALCULATOR #TOOLS_ADDRESS #TOOLS_COMMAND #SETUP_TOPMOST #SETUP_WORDWRAP #SETUP_WDT1 #SETUP_WDT2 #SETUP_WDT3 #SETUP_HGT1 #SETUP_HGT2 #SETUP_HGT3 #SETUP_CUSTOM #SETUP_FONT #SETUP_COLOR #SETUP_DESKTOP #SETUP_STARTMENU #HELP_HTM #HELP_PDF #HELP_ABOUT #ESCAPE EndEnumeration Declare openMainWindow() Declare windowCallback(hWnd, uMsg, wParam, lParam) Declare disableMenuItems(id, first, last, true) Declare fileHome() Declare fileOpen() Declare saveRecentFiles(path.s) Declare fileInsert() Declare fileSave() Declare fileSaveAs() Declare fileSaveTo() Declare fileNew() Declare fileShutdown() Declare fileLogoff() Declare fileExit() Declare.s dateStr() Declare.s timeStr() Declare findReplace(id) Declare.s toolsDatePicker(parent) Declare setupFont() Declare helpAbout() Declare about(parent, text.s) ;- reLoad or Load declare Declare reLoad(id, name.s, rtf) Declare reSave(id, name.s, rtf) Declare reLoadSaveCallback(lenF, *pbBuff, cb, *pcb.LONG) ;Declare save(id, name.s) ;Declare load(id, name.s) Declare insertFile(id, path.s) Declare saveModifiedFile() Declare isModified() Declare resetModified() Declare getLinenumber(id) Declare.s getprogramName(exeName.s) Declare loadPreferences() Declare savePreferences() Declare setInnerSize(wdt, hgt) Declare createShortcut(file, res.s, url.s, icon.s, index) Declare.s getSpecialFolder(id) Declare processCmdLine() Declare processDotCommands() Global appName.s = GetFilePart(ProgramFilename()) Global appFolder.s = GetPathPart(ProgramFilename()) ;strip out the extension and version info appName = getProgramName(appName) Global preferences.s = appFolder + appName + ".ini1.ini" Global maximized, windowW, windowH Global untitled.s = "untitled.txt" Global fileName.s = untitled ;separate default folders Global fileOpenFolder.s, fileInsertFolder.s Global fileSavetoFolder.s Global fontName.s, fontSize Global fontColor, backColor ;recent files menu items Global recent1.s, recent2.s, recent3.s, recent4.s Global recent5.s, recent6.s, recent7.s, recent8.s ;- used by reLoad/reSave/reLoadSaveCallback() Global lenF, fileH ;used by tools/internet Global internetUrl.s = "http://www.google.com" ;used by getSpecialFolder(),..user\start menu\programs #CSIDL_PROGRAMS = $2 ;used by getSpecialFolder(),..user\desktop #CSIDL_DESKTOPDIRECTORY = $10 ;-program entry loadPreferences() openMainWindow() processCmdLine() ;-program event handler Repeat event = WaitWindowEvent() Select event Case #PB_Event_Menu Select EventMenu() Case #FILE_OPEN fileOpen() SetActiveGadget(#EDIT1) Case #FILE_INSERT fileInsert() SetActiveGadget(#EDIT1) Case #FILE_NEW fileNew() SetActiveGadget(#EDIT1) Case #FILE_RECENT1 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent1 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_RECENT2 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent2 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_RECENT3 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent3 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_RECENT4 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent4 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_RECENT5 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent5 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_RECENT6 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent6 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_RECENT7 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent7 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_RECENT8 If recent1 <> "[No file]" If saveModifiedFile() <> #IDCANCEL path.s = recent8 reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1) Case #FILE_SAVE fileSave() SetActiveGadget(#EDIT1) Case #FILE_SAVEAS fileSaveAs() SetActiveGadget(#EDIT1) Case #FILE_SAVETO fileSaveTo() SetActiveGadget(#EDIT1) Case #FILE_PRINT If fileSave() RunProgram("notepad.exe", "/p " + fileOpenFolder + fileName, "") EndIf SetActiveGadget(#EDIT1) Case #FILE_HOME fileHome() Case #FILE_EXPLORE ShellExecute_(0, "explore", fileOpenFolder, 0, 0, #SW_SHOWNORMAL) Case #FILE_FIND ShellExecute_(0, "find", fileOpenFolder, 0, 0, #SW_SHOWNORMAL) Case #FILE_SHUTDOWN fileShutdown() Case #FILE_LOGOFF fileLogoff() Case #FILE_QUIT If saveModifiedFile() <> #IDCANCEL Break EndIf Case #EDIT_UNDO SendMessage_(GadgetID(#EDIT1), #WM_UNDO, #Null, #Null) Case #EDIT_SELECTALL SendMessage_(GadgetID(#EDIT1), #EM_SETSEL, 0, -1) Case #EDIT_CUT SendMessage_(GadgetID(#EDIT1), #WM_CUT, #Null, #Null) Case #EDIT_COPY SendMessage_(GadgetID(#EDIT1), #WM_COPY, #Null, #Null) Case #EDIT_PASTE SendMessage_(GadgetID(#EDIT1), #WM_PASTE, #Null, #Null) Case #EDIT_ERASE SendMessage_(GadgetID(#EDIT1), #WM_CLEAR, #Null, #Null) Case #EDIT_DATE ;insert date date.s = dateStr() SetActiveGadget(#EDIT1) ;replace selected text, or insert at the caret position SendMessage_(GadgetID(#EDIT1), #EM_REPLACESEL, 1, @date) Case #EDIT_TIME ;insert time time.s = timeStr() SetActiveGadget(#EDIT1) ;replace selected text, or insert at the caret position SendMessage_(GadgetID(#EDIT1), #EM_REPLACESEL, 1, @time) Case #EDIT_CLIPBOARD ;open clipboard viewer RunProgram("clipbrd.exe") Case #EDIT_FINDREPL findReplace(#EDIT1) Case #TOOLS_SEARCH ;reset topmost if opening another program SetMenuItemState(#MENU, #SETUP_TOPMOST, 0) StickyWindow(#WIN1, 0) ;get any selected text in the richedit SendMessage_(GadgetID(#EDIT1), #EM_EXGETSEL, 0, @text.FINDTEXT\chrg) If (text\chrg\cpMin <> text\chrg\cpMax) ;selected text range found, check it's length len = text\chrg\cpMax - text\chrg\cpMin If len < 128 char.c *txt = AllocateMemory((len + 1) * SizeOf(char)) ;get the selected text SendMessage_(GadgetID(#EDIT1), #EM_GETSELTEXT, 0, *txt) ;open the site and search for the selected text RunProgram("http://www.google.com/search?q=" + PeekS(*txt) + "&btnG") FreeMemory(*txt) EndIf Else ;no selected text, open the site RunProgram("http://www.google.com") EndIf Case #TOOLS_CHARMAP ;open windows charactermap RunProgram("charmap.exe") Case #TOOLS_CLIPBOARD ;open clipboard viewer RunProgram("clipbrd.exe") Case #TOOLS_DATEPICKER ;open calendar date.s = toolsDatePicker(#WIN1) SetActiveGadget(#EDIT1) If Len(date) ;replace selected text, or insert at the caret position SendMessage_(GadgetID(#EDIT1), #EM_REPLACESEL, 1, @date) EndIf Case #TOOLS_CALCULATOR ;open windows calculator RunProgram("calc.exe") Case #TOOLS_ADDRESS ;open windows addressbook RunProgram("wab.exe") Case #TOOLS_COMMAND RunProgram("cmd.exe", "/T:F0", fileOpenFolder) Case #SETUP_TOPMOST If GetMenuItemState(#MENU, #SETUP_TOPMOST) SetMenuItemState(#MENU, #SETUP_TOPMOST, 0) StickyWindow(#WIN1, 0) Else SetMenuItemState(#MENU, #SETUP_TOPMOST, 1) StickyWindow(#WIN1, 1) EndIf Case #SETUP_WORDWRAP If GetMenuItemState(#MENU, #SETUP_WORDWRAP) SetMenuItemState(#MENU, #SETUP_WORDWRAP, 0) ;disable wordwrap SendMessage_(GadgetID(#EDIT1), #EM_SETTARGETDEVICE, #Null, $FFFFFF) Else SetMenuItemState(#MENU, #SETUP_WORDWRAP, 1) ;enable wordwrap SendMessage_(GadgetID(#EDIT1), #EM_SETTARGETDEVICE, #Null, 0) EndIf Case #SETUP_FONT setupFont() SetActiveGadget(#EDIT1) Case #SETUP_WDT1 setInnerSize(GetSystemMetrics_(#SM_CXSCREEN) * 0.9, 0) Case #SETUP_WDT2 setInnerSize(GetSystemMetrics_(#SM_CXSCREEN) * 0.5, 0) Case #SETUP_WDT3 setInnerSize(GetSystemMetrics_(#SM_CXSCREEN) * 0.25, 0) Case #SETUP_HGT1 setInnerSize(0, GetSystemMetrics_(#SM_CYSCREEN) * 0.9) Case #SETUP_HGT2 setInnerSize(0, GetSystemMetrics_(#SM_CYSCREEN) * 0.5) Case #SETUP_HGT3 setInnerSize(0, GetSystemMetrics_(#SM_CYSCREEN) * 0.25) Case #SETUP_COLOR color = ColorRequester(RGB(216, 234, 255)) If color <> -1 backColor = color SetGadgetColor(#EDIT1, #PB_Gadget_BackColor, backColor) EndIf SetActiveGadget(#EDIT1) Case #SETUP_DESKTOP ;create a shortcut to this program on the desktop res.s = ProgramFilename() url.s = getSpecialFolder(#CSIDL_DESKTOPDIRECTORY) + appName If createShortcut(#True, res, url, res, 0) MessageRequester(appName, "Shortcut created", #MB_ICONINFORMATION) EndIf SetActiveGadget(#EDIT1) Case #SETUP_STARTMENU ;create a shortcut to this program in the startmenu res.s = ProgramFilename() url.s = getSpecialFolder(#CSIDL_PROGRAMS) + appName If createShortcut(#True, res, url, res, 0) MessageRequester(appName, "Shortcut created", #MB_ICONINFORMATION) EndIf SetActiveGadget(#EDIT1) Case #HELP_HTM RunProgram(appname + ".htm1.html") SetActiveGadget(#EDIT1) Case #HELP_PDF RunProgram(appName + ".pdf1.pdf") SetActiveGadget(#EDIT1) Case #HELP_ABOUT helpAbout() SetActiveGadget(#EDIT1) EndSelect Case #WM_RBUTTONDOWN Select EventWindow() Case #WIN1 DisplayPopupMenu(#POP_UP, WindowID(#WIN1)) EndSelect Case #PB_Event_SizeWindow If GetWindowState(#WIN1) = #PB_Window_Maximize maximized = 1 Else maximized = 0 windowW = WindowWidth(#WIN1) windowH = WindowHeight(#WIN1) EndIf ResizeGadget(#EDIT1, 0, 0, WindowWidth(#WIN1), WindowHeight(#WIN1) - MenuHeight() - StatusBarHeight(#STAT1)) SetActiveGadget(#EDIT1) Case #PB_Event_CloseWindow If saveModifiedFile() <> #IDCANCEL Break EndIf EndSelect ForEver ;-program exit CloseWindow(#WIN1) savePreferences() End ;- Procedure openMainWindow() flags = #PB_Window_SystemMenu | #PB_Window_SizeGadget flags | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget text.s = appName + " - " + fileOpenFolder + fileName If OpenWindow(#WIN1, 0, 0, windowW, windowH, text, flags) If maximized SetWindowState(#WIN1, #PB_Window_Maximize) Else ;center at top l = (GetSystemMetrics_(#SM_CXSCREEN) - WindowWidth(#WIN1)) / 2 ResizeWindow(#WIN1, l, 0, #PB_Ignore, #PB_Ignore) EndIf hMnu = CreateMenu(#MENU, WindowID(#WIN1)) If hMnu MenuTitle("&File") ;for the menu icons procedure hMnu0 = GetSubMenu_(hMnu, 0) MenuItem(#FILE_OPEN, "&Open..." + Chr(9) + "Ctrl + O") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_O, #FILE_OPEN) MenuItem(#FILE_INSERT, "Insert...") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_I, #FILE_INSERT) MenuItem(#FILE_NEW, "&New" + Chr(9) + "Ctrl + N") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_N, #FILE_NEW) OpenSubMenu("Recent Files...") MenuItem(#FILE_RECENT1, recent1) MenuItem(#FILE_RECENT2, recent2) MenuItem(#FILE_RECENT3, recent3) MenuItem(#FILE_RECENT4, recent4) MenuItem(#FILE_RECENT5, recent5) MenuItem(#FILE_RECENT6, recent6) MenuItem(#FILE_RECENT7, recent7) MenuItem(#FILE_RECENT8, recent8) CloseSubMenu() MenuBar() MenuItem(#FILE_SAVE, "&Save" + Chr(9) + "Ctrl + S") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_S, #FILE_SAVE) MenuItem(#FILE_SAVEAS, "Save As...") MenuItem(#FILE_SAVETO, "Save To...") MenuBar() MenuItem(#FILE_PRINT, "&Print" + Chr(9) + "Ctrl + P") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_P, #FILE_PRINT) MenuBar() MenuItem(#FILE_HOME, "User Home...") MenuItem(#FILE_EXPLORE, "&Explore" + Chr(9) + "Ctrl + E") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_E, #FILE_EXPLORE) MenuItem(#FILE_FIND, "Find...") MenuBar() MenuItem(#FILE_SHUTDOWN, "Shut Down...") MenuItem(#FILE_LOGOFF, "Log Off...") MenuBar() MenuItem(#FILE_QUIT, "&Quit" + Chr(9) + "Ctrl + Q") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_Q, #FILE_QUIT) ;edit menuitem MenuTitle("&Edit") MenuItem(#EDIT_UNDO, "Undo" + Chr(9) + "Ctrl + Z") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_Z, #EDIT_UNDO) MenuBar() MenuItem(#EDIT_CUT, "Cut" + Chr(9) + "Ctrl + X") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_X, #EDIT_CUT) MenuItem(#EDIT_COPY, "&Copy" + Chr(9) + "Ctrl + C") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_C, #EDIT_COPY) MenuItem(#EDIT_PASTE, "Paste" + Chr(9) + "Ctrl + V") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_V, #EDIT_PASTE) MenuItem(#EDIT_ERASE, "&Erase" + Chr(9) + "Ctrl + E") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_E, #EDIT_ERASE) MenuBar() MenuItem(#EDIT_SELECTALL, "Select &All" + Chr(9) + "Ctrl + A") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_A, #EDIT_SELECTALL) MenuItem(#EDIT_CLIPBOARD, "C&lipboard" + Chr(9) + "Ctrl + L") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_L, #EDIT_CLIPBOARD) MenuBar() MenuItem(#EDIT_DATE, "&Date" + Chr(9) + "Ctrl + D") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_D, #EDIT_DATE) MenuItem(#EDIT_TIME, "&Time" + Chr(9) + "Ctrl + T") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_T, #EDIT_TIME) MenuBar() MenuItem(#EDIT_FINDREPL, "&Find/Replace..." + Chr(9) + "Ctrl + F") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_F, #EDIT_FINDREPL) ;tools menuitem MenuTitle("&Tools") MenuItem(#TOOLS_SEARCH, "Google" + Chr(9) + "Ctrl + G") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_G, #TOOLS_SEARCH) MenuBar() MenuItem(#TOOLS_DATEPICKER, "Date Picker") MenuItem(#TOOLS_CHARMAP, "Character Map") MenuItem(#TOOLS_CLIPBOARD, "C&lipboard" + Chr(9) + "Ctrl + L") MenuBar() OpenSubMenu("More Tools...") MenuItem(#TOOLS_CALCULATOR, "Calculator") MenuItem(#TOOLS_COMMAND, "Command Line") MenuItem(#TOOLS_ADDRESS, "Address Book") CloseSubMenu() ;setup menuitem MenuTitle("&Setup") MenuItem(#SETUP_TOPMOST, "Always On Top") MenuItem(#SETUP_WORDWRAP, "Wordwrap") MenuBar() MenuItem(#SETUP_WDT1, "Width 90%") MenuItem(#SETUP_WDT2, "Width 50%") MenuItem(#SETUP_WDT3, "Width 25%") MenuBar() MenuItem(#SETUP_HGT1, "Height 90%") MenuItem(#SETUP_HGT2, "Height 50%") MenuItem(#SETUP_HGT3, "Height 25%") MenuBar() MenuItem(#SETUP_FONT, "Editor Font/Font Color...") MenuItem(#SETUP_COLOR, "Editor Background Color...") MenuBar() MenuItem(#SETUP_DESKTOP, "Create Desktop Shortcut") MenuItem(#SETUP_STARTMENU, "Create Startmenu Shortcut") ;help menuitem MenuTitle("&Help") If FileSize(appFolder + appName + ".htm1.html") <> -1 ;a html help file exists, add a shortcut to it MenuItem(#HELP_HTM, "&Help" + Chr(9) + "Ctrl + H") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_H, #HELP_HTM) EndIf If FileSize(appFolder + appName + ".pdf1.pdf") <> -1 ;a manual file exists, add a shortcut to it MenuItem(#HELP_PDF, "Manual") EndIf MenuItem(#HELP_ABOUT, "About '" + appName + "'") Else ;error ProcedureReturn 0 EndIf hMnu = CreatePopupMenu(#POP_UP) If hMnu ;edit main menu items MenuItem(#FILE_OPEN, "&Open..." + Chr(9) + "Ctrl + O") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_O, #FILE_OPEN) MenuBar() MenuItem(#FILE_INSERT, "&Insert..." + Chr(9) + "Ctrl + I") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_I, #FILE_INSERT) MenuItem(#FILE_NEW, "&New" + Chr(9) + "Ctrl + N") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_N, #FILE_NEW) MenuBar() MenuItem(#FILE_SAVE, "&Save" + Chr(9) + "Ctrl + S") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_S, #FILE_SAVE) MenuItem(#FILE_SAVEAS, "Save As...") MenuItem(#FILE_SAVETO, "Save To...") MenuBar() MenuItem(#EDIT_UNDO, "Undo" + Chr(9) + "Ctrl + Z") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_Z, #EDIT_UNDO) MenuBar() MenuItem(#EDIT_CUT, "Cut" + Chr(9) + "Ctrl + X") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_X, #EDIT_CUT) MenuItem(#EDIT_COPY, "&Copy" + Chr(9) + "Ctrl + C") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_C, #EDIT_COPY) MenuItem(#EDIT_PASTE, "Paste" + Chr(9) + "Ctrl + V") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_V, #EDIT_PASTE) MenuItem(#EDIT_ERASE, "&Erase" + Chr(9) + "Ctrl + E") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_E, #EDIT_ERASE) MenuBar() MenuItem(#EDIT_SELECTALL, "Select &All" + Chr(9) + "Ctrl + A") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_A, #EDIT_SELECTALL) MenuItem(#EDIT_CLIPBOARD, "C&lipboard" + Chr(9) + "Ctrl + L") MenuBar() MenuItem(#EDIT_DATE, "&Date" + Chr(9) + "Ctrl + D") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_D, #EDIT_DATE) MenuItem(#EDIT_TIME, "&Time" + Chr(9) + "Ctrl + T") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_T, #EDIT_TIME) MenuBar() MenuItem(#EDIT_FINDREPL, "&Find/Replace..." + Chr(9) + "Ctrl + F") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_F, #EDIT_FINDREPL) MenuBar() MenuItem(#FILE_PRINT, "&Print" + Chr(9) + "Ctrl + P") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_P, #FILE_PRINT) MenuBar() MenuItem(#FILE_EXPLORE, "&Explore" + Chr(9) + "Ctrl + E") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_E, #FILE_EXPLORE) MenuItem(#FILE_FIND, "Find...") MenuBar() MenuItem(#FILE_SHUTDOWN, "Shut Down...") MenuItem(#FILE_LOGOFF, "Log Off...") MenuBar() MenuItem(#FILE_QUIT, "&Quit" + Chr(9) + "Ctrl + Q") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_Q, #FILE_QUIT) Else ;error ProcedureReturn 0 EndIf If CreateStatusBar(#STAT1, WindowID(#WIN1)) AddStatusBarField(150) StatusBarText(#STAT1, 0, " Line: 1") AddStatusBarField(400) StatusBarText(#STAT1, 1, "") EndIf If CreateGadgetList(WindowID(#WIN1)) wdt = WindowWidth(#WIN1) hgt = WindowHeight(#WIN1) EditorGadget(#EDIT1, 0, 0, wdt, hgt) ;set up the editorgadget to send caret notifications to get line number: evMask = SendMessage_(GadgetID(#EDIT1), #EM_GETEVENTMASK, 0, 0) SendMessage_(GadgetID(#EDIT1), #EM_SETEVENTMASK, 0, evMask | #ENM_KEYEVENTS | #ENM_MOUSEEVENTS) ;remove the editorgadget border style = GetWindowLong_(GadgetID(#EDIT1), #GWL_EXSTYLE) newstyle = style & (~#WS_EX_CLIENTEDGE) SetWindowLong_(GadgetID(#EDIT1), #GWL_EXSTYLE, newstyle) SetWindowPos_(GadgetID(#EDIT1), 0, 0, 0, 0, 0, #SWP_SHOWWINDOW|#SWP_NOSIZE|#SWP_NOMOVE|#SWP_FRAMECHANGED) ;editorgadget font id = LoadFont(#PB_Any, fontName, fontSize) If id SetGadgetFont(#EDIT1, FontID(id)) EndIf ;set text size limit (bytes) and colors SendMessage_(GadgetID(#EDIT1), #EM_EXLIMITTEXT, 0, 1024 * 1024 * 1024) SetGadgetColor(#EDIT1, #PB_Gadget_FrontColor, fontColor) SetGadgetColor(#EDIT1, #PB_Gadget_BackColor, backColor) SetActiveGadget(#EDIT1) EndIf EndIf ;linenumber callback SetWindowCallback(@windowCallback()) resetModified() ProcedureReturn EndProcedure Procedure.l windowCallback(winId, message.l, wParam.l, lParam.l) Protected result, *msgf.MSGFILTER result = #PB_ProcessPureBasicEvents Select message Case #WM_NOTIFY *msgf = lParam Select *msgf\NMHDR\code Case #EN_MSGFILTER ;handle statusbar line number field Select *msgf\msg Case #WM_LBUTTONUP, #WM_KEYUP line = getLineNumber(#EDIT1) + 1 StatusBarText(#STAT1, 0, " Line: " + Str(line), #PB_StatusBar_BorderLess) EndSelect EndSelect EndSelect ProcedureReturn result EndProcedure ;- Procedure disableMenuItems(id, first, last, true) For item = first To last DisableMenuItem(id, item, true) Next item EndProcedure ;- Procedure fileNew() If saveModifiedFile() <> #IDCANCEL ClearGadgetItemList(#EDIT1) fileName = untitled SetWindowTitle(#WIN1, appName + " - " + fileName) EndIf EndProcedure Procedure fileHome() ext.s = "Text files (*.txt)|*.txt|All files (*.*)|*.*" path.s = OpenFileRequester("", GetHomeDirectory(), ext, 0) If path If saveModifiedFile() <> #IDCANCEL reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf EndProcedure Procedure fileOpen() If saveModifiedFile() <> #IDCANCEL ext.s = "Text files (*.txt)|*.txt|All files (*.*)|*.*" path.s = OpenFileRequester("Open File", fileOpenFolder, ext, 0) If path reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) ;process dot commands: processDotCommands() fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) saveRecentFiles(fileOpenFolder + fileName) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf EndProcedure Procedure saveRecentFiles(path.s) recent8 = GetMenuItemText(#MENU, #FILE_RECENT7) SetMenuItemText(#MENU, #FILE_RECENT8, recent8) recent7 = GetMenuItemText(#MENU, #FILE_RECENT6) SetMenuItemText(#MENU, #FILE_RECENT7, recent7) recent6 = GetMenuItemText(#MENU, #FILE_RECENT5) SetMenuItemText(#MENU, #FILE_RECENT6, recent6) recent5 = GetMenuItemText(#MENU, #FILE_RECENT4) SetMenuItemText(#MENU, #FILE_RECENT5, recent5) recent4 = GetMenuItemText(#MENU, #FILE_RECENT3) SetMenuItemText(#MENU, #FILE_RECENT4, recent4) recent3 = GetMenuItemText(#MENU, #FILE_RECENT2) SetMenuItemText(#MENU, #FILE_RECENT3, recent3) recent2 = GetMenuItemText(#MENU, #FILE_RECENT1) SetMenuItemText(#MENU, #FILE_RECENT2, recent2) recent1 = path SetMenuItemText(#MENU, #FILE_RECENT1, recent1) EndProcedure Procedure fileInsert() ext.s = "Text files (*.txt)|*.txt|All files (*.*)|*.*" path.s = OpenFileRequester("Insert into open file", fileInsertFolder, ext, 0) If path insertFile(#EDIT1, path) fileInsertFolder = GetPathPart(path) EndIf EndProcedure Procedure fileSave() If fileName = untitled If fileSaveAs() = #False ProcedureReturn #False EndIf Else reSave(#EDIT1, fileOpenFolder + fileName, 0) ; save(#EDIT1, fileOpenFolder + fileName) EndIf ProcedureReturn #True EndProcedure Procedure fileSaveAs() ext.s = "Text files (*.txt)|*.txt|All files (*.*)|*.*" path.s = SaveFileRequester("Save File As", fileOpenFolder + fileName, ext, 0) If path If GetExtensionPart(path) = "" path + ".txt" EndIf reSave(#EDIT1, path, 0) ; save(#EDIT1, path) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) Else ProcedureReturn #False EndIf ProcedureReturn #True EndProcedure Procedure fileSaveTo() ext.s = "Text files (*.txt)|*.txt|All files (*.*)|*.*" path.s = SaveFileRequester("Save to the end of file", fileSavetoFolder, ext, 0) If path = fileSavetoFolder + fileName txt.s = "Can not save to the end of an open file" MessageRequester("Warning", txt, #MB_ICONWARNING) EndIf If path If OpenFile(0, path) ;goto end of the file FileSeek(0, Lof(0)) ;write a newline WriteString(0, "") For line = 0 To CountGadgetItems(#EDIT1) WriteStringN(0, GetGadgetItemText(#EDIT1, line, 0)) Next line CloseFile(0) fileSavetoFolder = GetPathPart(path) EndIf Else ProcedureReturn #False EndIf ProcedureReturn #True EndProcedure Procedure fileLogoff() #TASKBAR_LOGOFF_SCREEN = $192 hWnd = FindWindow_("Shell_TrayWnd", "") If hWnd SendMessage_(hWnd, #WM_COMMAND, #TASKBAR_LOGOFF_SCREEN, 0) EndIf EndProcedure Procedure fileShutdown() #TASKBAR_TURN_OFF_DIALOG = $1FA hWnd = FindWindow_("Shell_TrayWnd", "") If hWnd SendMessage_(hWnd, #WM_COMMAND, #TASKBAR_TURN_OFF_DIALOG, 0) EndIf EndProcedure ;- Procedure.s dateStr() date.s = Space(12) GetDateFormat_(#LOCALE_USER_DEFAULT, 0, 0, 0, date, 12) ProcedureReturn date EndProcedure Procedure.s timeStr() date.s = Space(12) GetTimeFormat_(#LOCALE_USER_DEFAULT, 0, 0, 0, date, 12) ProcedureReturn date EndProcedure Procedure findReplace(id) flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered win = OpenWindow(#PB_Any, 0, 0, 400, 145, "Find/Replace", flags) If win StickyWindow(win, #True) If CreateGadgetList(WindowID(win)) ;draw the find icon img1 = CreateImage(#PB_Any, 22, 22) If StartDrawing(ImageOutput(img1)) Box(0, 0, 24, 24, GetSysColor_(15)) ;icon index 176, 55 ExtractIconEx_("shell32.dll", 176, 0, @icon, 1) If icon DrawImage(icon, 0, 0, 21, 21) DestroyIcon_(icon) EndIf StopDrawing() EndIf If 1 ImageGadget(#PB_Any, 10, 15, 0, 0, ImageID(img1)) TextGadget(#PB_Any, 40, 20, 75, 22, "Find:") Else TextGadget(#PB_Any, 10, 20, 75, 22, "Find What:") EndIf str1 = StringGadget(#PB_Any, 100, 15, 200, 21, "") TextGadget(#PB_Any, 10, 50, 75, 22, "Replace With:") str2 = StringGadget(#PB_Any, 100, 45, 200, 21, "") btn1 = ButtonGadget(#PB_Any, 310, 15, 80, 22, "Find Next", #PB_Button_Default) DisableGadget(btn1, #True) btn2 = ButtonGadget(#PB_Any, 310, 45, 80, 22, "Replace") DisableGadget(btn2, #True) btn3 = ButtonGadget(#PB_Any, 310, 80, 80, 22, "Replace all") DisableGadget(btn3, #True) btn4 = ButtonGadget(#PB_Any, 310, 110, 80, 22, "Cancel") chk1 = CheckBoxGadget(#PB_Any, 10, 80, 120, 22, "Match Case") chk2 = CheckBoxGadget(#PB_Any, 10, 112, 120, 22, "Whole Words only") chk3 = CheckBoxGadget(#PB_Any, 140, 112, 160, 22, "Search From Top") ;get any selected text in the richedit SendMessage_(GadgetID(id), #EM_EXGETSEL, 0, @text.FINDTEXT\chrg) If (text\chrg\cpMin <> text\chrg\cpMax) ;selected text range found, check it's length len = text\chrg\cpMax - text\chrg\cpMin If len < 128 Debug len char.c *txt = AllocateMemory((len + 1) * SizeOf(char)) ;get the selected text SendMessage_(GadgetID(id), #EM_GETSELTEXT, 0, *txt) SetGadgetText(str1, PeekS(*txt)) FreeMemory(*txt) ;focus the replace input field SetActiveGadget(str2) ;enable the buttons DisableGadget(btn1, #False) DisableGadget(btn2, #False) DisableGadget(btn3, #False) EndIf Else ;focus the findstring input field SetActiveGadget(str1) EndIf ;no text found yet: pos = -1 ;default search flag flg | #FR_DOWN Repeat event = WaitWindowEvent() If EventWindow() = win Select event Case #PB_Event_Gadget Select EventGadget() Case str1 ;find string GadgetToolTip(str1, GetGadgetText(str1)) If Len(GetGadgetText(str1)) DisableGadget(btn1, #False) DisableGadget(btn2, #False) DisableGadget(btn3, #False) Else DisableGadget(btn1, #True) DisableGadget(btn2, #True) DisableGadget(btn3, #True) EndIf Case str2 ;replace string GadgetToolTip(str2, GetGadgetText(str2)) Case btn1 ;find button find.s = GetGadgetText(str1) text.FINDTEXT\lpstrText = @find ;get current position or selected range in the text SendMessage_(GadgetID(id), #EM_EXGETSEL, 0, @text\chrg) If (text\chrg\cpMin <> text\chrg\cpMax) ;selected text range found, search from the end of it text\chrg\cpMin = text\chrg\cpMax EndIf If GetGadgetState(chk3) ;reset, search from the top SetGadgetState(chk3, 0) text\chrg\cpMin = 0 EndIf ;search to the end of the text: text\chrg\cpMax = -1 ;set the search flags flg = 0 flg | #FR_DOWN If GetGadgetState(chk1) flg | #FR_MATCHCASE EndIf If GetGadgetState(chk2) flg | #FR_WHOLEWORD EndIf pos = SendMessage_(GadgetID(id), #EM_FINDTEXT, flg, @text) If pos <> -1 ;found, select the text range SendMessage_(GadgetID(id), #EM_SETSEL, pos, pos + Len(find)) Else msg.s = "Cannot find " + find + Chr(13) + Chr(10) msg + "Search again from the top ?" flags = #MB_ICONQUESTION | #MB_YESNOCANCEL Select MessageRequester("Find/Replace", msg, flags) Case #IDYES ;first position in the text SendMessage_(GadgetID(id), #EM_SETSEL, 0, 0) text\chrg\cpMin = 0 ;search to the end of the text: text\chrg\cpMax = -1 pos = SendMessage_(GadgetID(id), #EM_FINDTEXT, flg, @text) If pos <> -1 ;found, select the text range SendMessage_(GadgetID(id), #EM_SETSEL, pos, pos + Len(find)) Else msg.s = "Cannot find " + find flags = #MB_ICONINFORMATION | #MB_OKCANCEL Select MessageRequester("Find/Replace", msg, flags) Case #IDCANCEL Break EndSelect EndIf SetActiveGadget(id) Case #IDCANCEL Break EndSelect EndIf Case btn2 ;replace button ;get selected range in the text SendMessage_(GadgetID(id), #EM_EXGETSEL, 0, @text\chrg) If (text\chrg\cpMin <> text\chrg\cpMax) ;found selected text range repl.s = GetGadgetText(str2) If text\chrg\cpMax - text\chrg\cpMin = Len(GetGadgetText(str1)) ;same length as the find string, replace it SendMessage_(GadgetID(id), #EM_REPLACESEL, 1, @repl) ;advance the current position text\chrg\cpMin + Len(repl) EndIf Else ;no selection made yet, search from the current position text\chrg\cpMin = text\chrg\cpMax EndIf If GetGadgetState(chk3) ;reset, search from the top SetGadgetState(chk3, 0) text\chrg\cpMin = 0 EndIf ;search to the end of the text: text\chrg\cpMax = -1 find.s = GetGadgetText(str1) text\lpstrText = @find ;set the search flags flg = 0 flg | #FR_DOWN If GetGadgetState(chk1) flg | #FR_MATCHCASE EndIf If GetGadgetState(chk2) flg | #FR_WHOLEWORD EndIf pos = SendMessage_(GadgetID(id), #EM_FINDTEXT, flg, @text) If pos <> -1 ;found, select the text range SendMessage_(GadgetID(id), #EM_SETSEL, pos, pos + Len(find)) Else msg.s = "Cannot find " + find + Chr(13) + Chr(10) msg + "Search again from the top ?" flags = #MB_ICONQUESTION | #MB_YESNOCANCEL Select MessageRequester("Find/Replace", msg, flags) Case #IDYES ;first position in the text SendMessage_(GadgetID(id), #EM_SETSEL, 0, 0) text\chrg\cpMin = 0 ;search to the end of the text: text\chrg\cpMax = -1 pos = SendMessage_(GadgetID(id), #EM_FINDTEXT, flg, @text) If pos <> -1 ;found, select the text range SendMessage_(GadgetID(id), #EM_SETSEL, pos, pos + Len(find)) Else msg.s = "Cannot find " + find flags = #MB_ICONINFORMATION | #MB_OKCANCEL Select MessageRequester("Find/Replace", msg, flags) Case #IDCANCEL Break EndSelect EndIf Case #IDCANCEL Break EndSelect EndIf Case btn3 ;replace all button Repeat ;get selected range in the text SendMessage_(GadgetID(id), #EM_EXGETSEL, 0, @text\chrg) If (text\chrg\cpMin <> text\chrg\cpMax) ;found selected text range repl.s = GetGadgetText(str2) If text\chrg\cpMax - text\chrg\cpMin = Len(GetGadgetText(str1)) ;same length as the find string, replace it SendMessage_(GadgetID(id), #EM_REPLACESEL, 1, @repl) ;advance the current position text\chrg\cpMin + Len(repl) EndIf Else ;no selection made yet, search from the current position text\chrg\cpMin = text\chrg\cpMax EndIf If GetGadgetState(chk3) ;reset, search from the top SetGadgetState(chk3, 0) text\chrg\cpMin = 0 EndIf ;search to the end of the text: text\chrg\cpMax = -1 find.s = GetGadgetText(str1) text\lpstrText = @find ;set the search flags flg = 0 flg | #FR_DOWN If GetGadgetState(chk1) flg | #FR_MATCHCASE EndIf If GetGadgetState(chk2) flg | #FR_WHOLEWORD EndIf pos = SendMessage_(GadgetID(id), #EM_FINDTEXT, flg, @text) If pos <> -1 ;found, select the text range SendMessage_(GadgetID(id), #EM_SETSEL, pos, pos + Len(find)) EndIf Until pos = -1 msg.s = "Cannot find " + find + Chr(13) + Chr(10) msg + "Search again from the top ?" flags = #MB_ICONQUESTION | #MB_YESNOCANCEL Select MessageRequester("Find/Replace", msg, flags) Case #IDYES ;first position in the text SendMessage_(GadgetID(id), #EM_SETSEL, 0, 0) text\chrg\cpMin = 0 ;search to the end of the text: text\chrg\cpMax = -1 pos = SendMessage_(GadgetID(id), #EM_FINDTEXT, flg, @text) If pos <> -1 ;found, select the text range SendMessage_(GadgetID(id), #EM_SETSEL, pos, pos + Len(find)) Else msg.s = "Cannot find " + find flags = #MB_ICONINFORMATION | #MB_OKCANCEL Select MessageRequester("Find/Replace", msg, flags) Case #IDCANCEL Break EndSelect EndIf Case #IDCANCEL Break EndSelect Case btn4 ;cancel button Break EndSelect Case #PB_Event_CloseWindow Break EndSelect EndIf ForEver EndIf CloseWindow(win) EndIf EndProcedure ;- Procedure.s toolsDatePicker(parent) flags = #PB_Window_ScreenCentered | #PB_Window_SystemMenu win = OpenWindow(#PB_Any, 0, 0, 300, 220, "Date Picker", flags) If win EnableWindow_(WindowID(parent), #False) StickyWindow(win, #True) ResizeWindow(win, #PB_Ignore, WindowY(win) - 50, #PB_Ignore, #PB_Ignore) CreateGadgetList(WindowID(win)) DateGadget(#DATE1, 0, 0, 300, 24) btn1 = ButtonGadget(#PB_Any, 120, 185, 80, 24, "Insert") btn2 = ButtonGadget(#PB_Any, 210, 185, 80, 24, "Cancel" ) Repeat event = WaitWindowEvent() Select event Case #PB_Event_Gadget Select EventGadget() Case btn1 date.s = GetGadgetText(#DATE1) exit = #True Case btn2 date.s = "" exit = #True EndSelect Case #PB_Event_CloseWindow exit = #True EndSelect Until exit CloseWindow(win) EndIf EnableWindow_(WindowID(parent), #True) SetActiveWindow(parent) ProcedureReturn date EndProcedure ;- Procedure setupFont() If FontRequester(fontName, fontSize, #PB_FontRequester_Effects) fontName = SelectedFontName() fontSize = SelectedFontSize() fontColor = SelectedFontColor() SetGadgetColor(#EDIT1, #PB_Gadget_FrontColor, fontColor) LoadFont(0, fontName, fontSize, #PB_Font_HighQuality) SetGadgetFont(#EDIT1, FontID(0)) SetGadgetFont(#EDIT1, FontID(0)) EndIf EndProcedure ;- Procedure helpAbout() ;next field nf.s = Chr(8) ;next line nl.s = Chr(13) + Chr(10) ;about field txt.s = "About " + nf ;program name field txt + "'" + appname + "'" + nf ;company field txt + "www.utopiomania.com" + nf ;main text field txt + "'" + appName + "', a simple text editor" + nl + nl txt + "Ver. 1.0, date 20070302" + nl txt + "" + nl + nl txt + nl + "Copyright (c)2007, Stig h. Johansen and Utopiomania.com" + nl + nl + nl txt + "WARNING: This PROGRAM is protected by copyright law and international treaties."+ nf ;online link field txt + "Visit '" + appName + "' online" + nf txt + "http://www.utopiomania.com" about(#WIN1, txt) EndProcedure Procedure about(parent, text.s) ;field delimiter nf.s = Chr(8) ;fields about.s = StringField(text, 1, nf) name.s = StringField(text, 2, nf) corp.s = StringField(text, 3, nf) txt.s = StringField(text, 4, nf) url.s = StringField(text, 5, nf) lnk.s = StringField(text, 6, nf) flags = #PB_Window_ScreenCentered | #PB_Window_SystemMenu win = OpenWindow(#PB_Any, 0, 0, 420, 325, name, flags) If win EnableWindow_(WindowID(parent), #False) StickyWindow(win, #True) ResizeWindow(win, #PB_Ignore, WindowY(win) - 50, #PB_Ignore, #PB_Ignore) If CreateGadgetList(WindowID(win)) img1 = CreateImage(#PB_Any, 420, 70) fnt1 = LoadFont(#PB_Any, "", 10) fnt2 = LoadFont(#PB_Any, "", 16) If StartDrawing(ImageOutput(img1)) DrawingMode(#PB_2DDrawing_Transparent) ;header background gradient For x = 0 To 419 LineXY(x, 0, x, 60, RGB(x / 2.5, x / 2.5, 255)) LineXY(x, 60, x, 70, RGB(225- x / 5, 225 - x / 5, 255)) Next x ;header icon res.s = "shell32.dll" ndx = 130 ;res.s = programFileName() ;ndx = 0 ExtractIconEx_(res, ndx, 0, @icon, 1) If icon DrawImage(icon, 10, 5, 48, 48) DestroyIcon_(icon) EndIf ;header about field If fnt1 DrawingFont(FontID(fnt1)) EndIf DrawText(70, 10, about, RGB(255, 255, 255)) ;header program name field If fnt2 DrawingFont(FontID(fnt2)) EndIf DrawText(70, 28, name, RGB(255, 255, 255)) ;header company name field If fnt1 DrawingFont(FontID(fnt1)) EndIf DrawText(400 - TextWidth(corp), 35, corp, RGB(255, 255, 255)) StopDrawing() EndIf ImageGadget(#PB_Any, 0, 0, 0, 0, ImageID(img1)) ;text icon img2 = CreateImage(#PB_Any, 32, 32) If StartDrawing(ImageOutput(img2)) Box(0, 0, 32, 32, GetSysColor_(15)) res.s = "shell32.dll" ;ndx = 166 ndx = 55 ;res.s = programFileName() ;ndx = 0 ExtractIconEx_(res, ndx, 0, @icon, 1) If icon DrawImage(icon, 0, 0, 32, 32) DestroyIcon_(icon) EndIf StopDrawing() EndIf ImageGadget(#PB_Any, 20, 100, 0, 0, ImageID(img2)) ;text TextGadget(#PB_Any, 70, 100, 330, 145, txt) ;divider line img3 = CreateImage(#PB_Any, 410, 2) If StartDrawing(ImageOutput(img3)) Line(0, 0, 420, 0, RGB(160, 160, 160)) Line(0, 1, 420, 0, RGB(255, 255, 255)) StopDrawing() EndIf ImageGadget(#PB_Any, 10, 260, 0, 0, ImageID(img3)) ;online link If Len(url) lnk1 = HyperLinkGadget(#PB_Any, 20, 275, 200, 24, url, RGB(0, 0, 255), #PB_HyperLink_Underline) SetGadgetColor(lnk1, #PB_Gadget_FrontColor, RGB(0, 0, 255)) EndIf ;ok button btn1 = ButtonGadget(#PB_Any, 330, 288, 80, 24, "OK", #PB_Button_Default) SetActiveGadget(btn1) EndIf Repeat event = WaitWindowEvent() Select event Case #PB_Event_Gadget Select EventGadget() Case lnk1 RunProgram(lnk) exit = #True Case btn1 exit = #True EndSelect Case #PB_Event_CloseWindow exit = #True EndSelect Until exit CloseWindow(win) EndIf EnableWindow_(WindowID(parent), #True) SetActiveWindow(parent) EndProcedure ;- save load stuff ;Procedure save(id, name.s) ; fileH = CreateFile(#PB_Any, name) ; If fileH ; For line = 0 To CountGadgetItems(id) ; WriteStringN(fileH, GetGadgetItemText(id, line, 0)) ; Next line ; CloseFile(fileH) ; EndIf ;EndProcedure ;Procedure load(id, name.s) ; fileH = ReadFile(#PB_Any, name) ; If fileH ; ;clear the text ; ClearGadgetItemList(id) ; While Eof(fileH) = 0 ; AddGadgetItem(id, -1, ReadString(fileH)) ; Wend ; CloseFile(fileH) ; ;move to top of file ; SendMessage_(GadgetID(id), #EM_SETSEL, 0, 0) ; EndIf ;EndProcedure Procedure reLoad(id, name.s, rtf) ;richedit streamin lenF = FileSize(name) If lenF fileH = ReadFile(#PB_Any, name) If lenF And fileH stream.EDITSTREAM stream\dwCookie = lenF stream\pfnCallback = @reLoadSaveCallback() If rtf ;rich text format SendMessage_(GadgetID(id), #EM_STREAMIN, #SF_RTF, @stream) Else ;text format SendMessage_(GadgetID(id), #EM_STREAMIN, #SF_TEXT, @stream) EndIf CloseFile(fileH) resetModified() ;go to top of document SendMessage_(GadgetID(id), #EM_SETSEL, 0, 0) EndIf EndIf EndProcedure Procedure reSave(id, name.s, rtf) ;richedit streamout fileH = CreateFile(#PB_Any, name) If fileH stream.EDITSTREAM stream\dwCookie = 0 stream\pfnCallback = @reLoadSaveCallback() If rtf ;rich text format SendMessage_(GadgetID(id), #EM_STREAMOUT, #SF_RTF, @stream) Else ;text format SendMessage_(GadgetID(id), #EM_STREAMOUT, #SF_TEXT, @stream) EndIf CloseFile(fileH) resetModified() EndIf EndProcedure Procedure reLoadSaveCallback(lenF, *pbBuff, cb, *pcb.LONG) ;stream io callback If lenF = 0 ;save WriteData(fileH, *pbBuff, cb) *pcb\l = cb Else ;load If lenF > cb *pcb\l = ReadData(fileH, *pbBuff, cb) Else *pcb\l = ReadData(fileH, *pbBuff, lenF) EndIf EndIf ProcedureReturn 0 EndProcedure ;- Procedure insertFile(id, path.s) If ReadFile(0, path) line = getLinenumber(id) While Eof(0) = 0 AddGadgetItem(id, line, ReadString(0)) line + 1 Wend CloseFile(0) Else ProcedureReturn #False EndIf ProcedureReturn #True EndProcedure Procedure saveModifiedFile() If isModified() Select MessageRequester("Save modified file?", fileName, #MB_YESNOCANCEL | #MB_ICONQUESTION) Case #IDYES If fileSave() = #False ProcedureReturn #IDCANCEL EndIf Case #IDCANCEL ProcedureReturn #IDCANCEL EndSelect EndIf ProcedureReturn #True EndProcedure Procedure isModified() ;query the editorgadget for modified text since last reset result = SendMessage_(GadgetID(#EDIT1), #EM_GETMODIFY, #Null, #Null) ProcedureReturn result EndProcedure Procedure resetModified() ;reset editorgadget modify flag SendMessage_(GadgetID(#EDIT1), #EM_SETMODIFY, #False, #Null) EndProcedure ;- Procedure getLinenumber(id) ;gets the linenumber in an editorgadget from the caret position SetActiveGadget(id) GetCaretPos_(@pos.point) char = SendMessage_(GadgetID(id), #EM_CHARFROMPOS, 0, @pos) line = SendMessage_(GadgetID(id), #EM_LINEFROMCHAR, char, 0) ProcedureReturn line EndProcedure Procedure.s getProgramName(exeName.s) ;extracts an application name from an exe name on the form 'c..n...exe' ;where c.. are letters and n.. version numbers exeName = Left(exeName, FindString(exeName, ".", 1) - 1) For i = 1 To Len(exeName) C.s = Mid(exeName, i, 1) If c < "0" Or c > "9" name.s + c EndIf Next i ProcedureReturn RTrim(name) EndProcedure ;- Procedure loadPreferences() OpenPreferences(preferences) PreferenceGroup("metrics") maximized = ReadPreferenceLong("maximized", 0) w = GetSystemMetrics_(#SM_CXSCREEN) - 100 h = GetSystemMetrics_(#SM_CYSCREEN) - 100 windowW = ReadPreferenceLong("windowW", w) windowH = ReadPreferenceLong("windowH", h) PreferenceGroup("files") fileOpenFolder = ReadPreferenceString("fileOpenFolder", GetPathPart(GetHomeDirectory())) fileInsertFolder = ReadPreferenceString("fileInsertFolder", GetPathPart(GetHomeDirectory())) fileSavetoFolder = ReadPreferenceString("fileSavetoFolder", GetPathPart(GetHomeDirectory())) PreferenceGroup("editor") fontName = ReadPreferenceString("fontName", "tahoma") fontSize = ReadPreferenceLong("fontSize", 11) fontColor = ReadPreferenceLong("fontColor", #Black) backColor = ReadPreferenceLong("backColor", RGB(216, 234, 255)) ; backColor = readPreferenceLong("backColor", rgb(255, 255, 255)) PreferenceGroup("recent files") recent1 = ReadPreferenceString("recent1", "[No file]") recent2 = ReadPreferenceString("recent2", "[No file]") recent3 = ReadPreferenceString("recent3", "[No file]") recent4 = ReadPreferenceString("recent4", "[No file]") recent5 = ReadPreferenceString("recent5", "[No file]") recent6 = ReadPreferenceString("recent6", "[No file]") recent7 = ReadPreferenceString("recent7", "[No file]") recent8 = ReadPreferenceString("recent8", "[No File]") ClosePreferences() EndProcedure Procedure savePreferences() If CreatePreferences(preferences) PreferenceGroup("metrics") WritePreferenceLong("maximized", maximized) WritePreferenceLong("windowW", windowW) WritePreferenceLong("windowH", windowH) PreferenceGroup("files") WritePreferenceString("fileOpenFolder", fileOpenFolder) WritePreferenceString("fileInsertFolder", fileInsertFolder) WritePreferenceString("fileSavetoFolder", fileSavetoFolder) PreferenceGroup("editor") WritePreferenceString("fontName", fontName) WritePreferenceLong("fontSize", fontSize) WritePreferenceLong("fontColor", fontColor) WritePreferenceLong("backColor", backColor) PreferenceGroup("recent files") WritePreferenceString("recent1", recent1) WritePreferenceString("recent2", recent2) WritePreferenceString("recent3", recent3) WritePreferenceString("recent4", recent4) WritePreferenceString("recent5", recent5) WritePreferenceString("recent6", recent6) WritePreferenceString("recent7", recent7) WritePreferenceString("recent8", recent8) ClosePreferences() EndIf EndProcedure ;- Procedure setInnerSize(wdt, hgt) ;sets editorgadget size to w, h. winW = WindowWidth(#WIN1) winH = WindowHeight(#WIN1) If GetWindowState(#WIN1) = #PB_Window_Maximize SetWindowState(#WIN1, #PB_Window_Normal) ;or the size gadget disappears!? EndIf If wdt ResizeWindow(#win1, #PB_Ignore, #PB_Ignore, wdt, #PB_Ignore) EndIf If hgt ResizeWindow(#WIN1, #PB_Ignore, #PB_Ignore, #PB_Ignore, hgt) EndIf ;center at top l = (GetSystemMetrics_(#SM_CXSCREEN) - WindowWidth(#WIN1)) / 2 ResizeWindow(#WIN1, l, 0, #PB_Ignore, #PB_Ignore) EndProcedure ;- Procedure createShortcut(file, res.s, url.s, icon.s, index) ;creates internet shortcuts. res: linked to, url: shortcut path ;icon: the path of the icon library file, .ico, .dll or .exe ;index: the icon index within the icon library file dq.s = Chr(34) If file ;links to a file res = "file://" + res Else ;links to a web resource res = "http://" + res EndIf If LCase(Right(url, 4)) <> ".url" url = url + ".url" EndIf ;try to create folders from the top down For i = 1 To Len(url) If Mid(url, i, 1) = "\" ;create folder: CreateDirectory(Left(url, i)) EndIf Next If CreateFile(0, url) WriteStringN(0, "[InternetShortcut]") WriteStringN(0, "URL = " + dq + res + dq) If file If Len(icon) WriteStringN(0, "IconFile = " + dq + icon + dq) WriteStringN(0, "IconIndex = " + dq + Str(index) + dq) EndIf EndIf CloseFile(0) ProcedureReturn 1 EndIf ProcedureReturn 0 EndProcedure Procedure.s getSpecialFolder(id) Protected path.s, *ItemId.ITEMIDLIST *itemId = #Null If SHGetSpecialFolderLocation_(0, id, @*ItemId) = #NOERROR path = Space(#MAX_PATH) If SHGetPathFromIDList_(*itemId, @path) If Right(path, 1) <> "\" path + "\" EndIf ProcedureReturn path EndIf EndIf ProcedureReturn "" EndProcedure Procedure processCmdLine() ;process command line parameters If CountProgramParameters() ;open a doubleclicked file path.s = ProgramParameter() MessageRequester("", path) reLoad(#EDIT1, path, 0) ; load(#EDIT1, path) ;process dot commands: processDotCommands() fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) saveRecentFiles(fileOpenFolder + fileName) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndProcedure Procedure processDotCommands() ;process dot commands: cmd.s = UCase(GetGadgetItemText(#EDIT1, 0, 0)) Select cmd Case ".LOG" ;append a date/time entry dt.s = #CR$ + dateStr() + ", " + timeStr() + #CR$ SendMessage_(GadgetID(#EDIT1), #EM_SETSEL, -1, -1) SendMessage_(GadgetID(#EDIT1), #EM_REPLACESEL, 1, @dt) EndSelect EndProcedure ; IDE Options = PureBasic v4.02 (Windows - x86) ; CursorPosition = 1761 ; FirstLine = 1745 ; Folding = -------