stig
New Member
Posts: 40
|
Post by stig on Feb 19, 2022 11:01:40 GMT -5
;-program notes ; 20080105 ;tools menu: ;tools subfolder, runprogram contents + surcefile as parameter
;file menu: ;backup/restore this file ;recent files list
;setup menu: ;start menu/desktop shortcuts, ;copy/move program
;help menu: ;help subfolder, runprogram contents
;'Save To' must not save to the end of itself ;maintain separate default folders for: ; file\open, file\insert, and file\save To
;- ;-initialise ;- Enumeration #WIN1 #MENU #POP_UP #PANEL1 #EDIT1 #STAT1 #WEB1 #FILE_OPEN #FILE_INSERT #FILE_NEW #FILE_RECENT1 #FILE_RECENT2 #FILE_RECENT3 #FILE_RECENT4 #FILE_RECENT5 #FILE_RECENT6 #FILE_RECENT7 #FILE_RECENT8 #FILE_OPENCOPY #FILE_SAVE #FILE_SAVEAS #FILE_SAVETO #FILE_SAVECOPY #FILE_PRINT #FILE_HOME #FILE_EXPLORE #FILE_FIND #FILE_QUIT #EDIT_UNDO #EDIT_CUT #EDIT_COPY #EDIT_PASTE #EDIT_ERASE #EDIT_SELECTALL #EDIT_FINDREPL #TOOLS_SEARCH1 #TOOLS_SEARCH2 #TOOLS_NOTEPAD #TOOLS_SYSMON #TOOLS_MAGNIFY #SETUP_TOPMOST #SETUP_SIZ1 #SETUP_SIZ2 #SETUP_SIZ3 #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 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 findReplace(id)
Declare setupFont() Declare helpAbout() Declare about(parent, text.s, html.s)
Declare reLoad(id, name.s, rtf) Declare reSave(id, name.s, rtf) Declare reLoadSaveCallback(lenF, *pbBuff, cb, *pcb.LONG)
;linenumber callback and procedure Declare editCallback(hWnd, uMsg, wParam, lParam) Declare drawLinenumbers()
Declare insertFile(id, path.s) Declare saveModifiedFile() Declare isModified() Declare resetModified() Declare savePreview() Declare loadPreview() Declare processCmdLine() Declare getLinenumber(id) Declare.s getprogramName(exeName.s) Declare readPreferences(inFolder.s, name.s) Declare writePreferences(inFolder.s, name.s) Declare setPreviewSize(wdt, hgt) Declare createShortcut(file, res.s, url.s, icon.s, index) Declare.s getSpecialFolder(id)
Global appName.s, appFolder.s, preferences.s, snapshot.s appName = GetFilePart(ProgramFilename()) ;strip out the extension and version info appName = getProgramName(appName)
appName = "Html Editor" appFolder = GetPathPart(ProgramFilename())
;preferences file Global inFolder.s, name.s inFolder = appName name = appName
Global maximized, windowW, windowH Global untitled.s = "untitled.html" Global fileName.s = untitled ;separate default folders Global fileOpenFolder.s, fileInsertFolder.s, 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
;for linenumber callback and functions Global editProc, leftM = 48
;used by getSpecialFolder() ;..user\start menu\programs #CSIDL_PROGRAMS = $2 ;..user\desktop #CSIDL_DESKTOPDIRECTORY = $10
;-program entry readPreferences(inFolder, name) openMainWindow() processCmdLine()
;-program event handler Repeat event = WaitWindowEvent() Select event Case #PB_Event_Gadget Select EventGadget() Case #PANEL1 Select GetGadgetState(#PANEL1) Case 0 ;html file disablemenuItems(#MENU, #FILE_OPEN, #HELP_ABOUT, #False) ;unload the preview SetGadgetText(#WEB1, "about:") SetActiveGadget(#EDIT1) StatusBarText(#STAT1, 0, " Licenced To: UNLICENCED") Case 1 ;html preview If savePreview() disablemenuItems(#MENU, #FILE_OPEN, #FILE_EXPLORE, #True) disablemenuItems(#MENU, #EDIT_UNDO, #EDIT_FINDREPL, #True) loadPreview() SetActiveGadget(#WEB1) wdt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemWidth) hgt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemHeight) StatusBarText(#STAT1, 0, " Preview Size: " + Str(wdt) + " / " + Str(hgt)) Else disableMenuItems(#MENU, #FILE_OPEN, #HELP_ABOUT, #False) SetGadgetState(#PANEL1, 0) SetActiveGadget(#EDIT1) EndIf EndSelect EndSelect
;-\menu events Case #PB_Event_Menu Select EventMenu() Case #ESCAPE ;switch between tabs Select GetGadgetState(#PANEL1) Case 0 ;switch to html preview If savePreview() disablemenuItems(#MENU, #FILE_OPEN, #FILE_EXPLORE, #True) disablemenuItems(#MENU, #EDIT_UNDO, #EDIT_FINDREPL, #True) loadPreview() ;open tab 1 SetGadgetState(#PANEL1, 1) SetActiveGadget(#WEB1) wdt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemWidth) hgt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemHeight) StatusBarText(#STAT1, 0, " PREVIEW SIZE: : " + Str(wdt) + " / " + Str(hgt), #PB_StatusBar_BorderLess) Else disableMenuItems(#MENU, #FILE_OPEN, #HELP_ABOUT, #False) SetGadgetState(#PANEL1, 0) StatusBarText(#STAT1, 0, " LINE NUMBER: " + Str(line), #PB_StatusBar_BorderLess) StatusBarText(#STAT1, 0, " Licenced To: UNLICENCED") SetActiveGadget(#EDIT1) EndIf Case 1 ;switch to html file disablemenuItems(#MENU, #FILE_OPEN, #HELP_ABOUT, #False) ;unload the preview SetGadgetText(#WEB1, "about:") ;open tab 0 SetGadgetState(#PANEL1, 0) SetActiveGadget(#EDIT1) EndSelect ;-\menu file 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) 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) 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) 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) 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) 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) 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) 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) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) EndIf EndIf SetActiveGadget(#EDIT1)
Case #FILE_OPENCOPY If FileSize(snapshot) <> -1 flags = #MB_ICONWARNING | #MB_OKCANCEL msg.s = "This will load the contents last saved to the Snapshot" + #CRLF$ msg + "file and replace the current text." + #CRLF$ msg + "Click OK to load the Snapshot, or Cancel to quit." If MessageRequester("Open Snapshot", msg, flags) = #IDOK reLoad(#EDIT1, snapshot, 0) EndIf Else flags = #MB_ICONINFORMATION | #MB_OK msg.s = "There is no current Snapshot file." MessageRequester("Open Snapshot", msg, flags) EndIf
Case #FILE_SAVE fileSave() SetActiveGadget(#EDIT1)
Case #FILE_SAVEAS fileSaveAs() SetActiveGadget(#EDIT1)
Case #FILE_SAVETO fileSaveTo() SetActiveGadget(#EDIT1)
Case #FILE_SAVECOPY reSave(#EDIT1, snapshot, 0) SetActiveGadget(#EDIT1)
Case #FILE_PRINT If fileSave() RunProgram("notepad.exe", "/p " + fileOpenFolder + fileName, "") EndIf 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_QUIT If saveModifiedFile() <> #IDCANCEL Break EndIf
;-\menu edit Case #EDIT_UNDO SendMessage_(GadgetID(#EDIT1), #WM_UNDO, 0, 0)
Case #EDIT_SELECTALL SendMessage_(GadgetID(#EDIT1), #EM_SETSEL, 0, -1)
Case #EDIT_CUT SendMessage_(GadgetID(#EDIT1), #WM_CUT, 0, 0)
Case #EDIT_COPY SendMessage_(GadgetID(#EDIT1), #WM_COPY, 0, 0)
Case #EDIT_PASTE ;sendMessage_(gadgetId(#EDIT1), #WM_PASTE, 0, 0) SendMessage_(GadgetID(#EDIT1), #EM_PASTESPECIAL, #CF_TEXT, 0) Case #EDIT_ERASE SendMessage_(GadgetID(#EDIT1), #WM_CLEAR, 0, 0)
Case #EDIT_FINDREPL findReplace(#EDIT1)
;-\menu tools Case #TOOLS_SEARCH1 ;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_SEARCH2 ;reset topmost if opening another program SetMenuItemState(#MENU, #SETUP_TOPMOST, 0) StickyWindow(#WIN1, 0) ;open site ;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?sitesearch=www.w3schools.com&as_q=" + PeekS(*txt)) FreeMemory(*txt) EndIf Else ;no selected text, open the site RunProgram("http://www.w3schools.com") EndIf
Case #TOOLS_NOTEPAD ;reset topmost if opening another program SetMenuItemState(#MENU, #SETUP_TOPMOST, 0) StickyWindow(#WIN1, 0) ;open notepad RunProgram("notepad.exe")
Case #TOOLS_SYSMON ;reset topmost if opening another program SetMenuItemState(#MENU, #SETUP_TOPMOST, 0) StickyWindow(#WIN1, 0) ;open system monitor RunProgram("perfmon.exe")
Case #TOOLS_MAGNIFY RunProgram("magnify.exe") ;-\menu setup 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_FONT setupFont() SetActiveGadget(#EDIT1)
Case #SETUP_SIZ1 setPreviewSize(800, 0)
Case #SETUP_SIZ2 setPreviewSize(1024, 0)
Case #SETUP_SIZ3 setPreviewSize(1280, 0)
Case #SETUP_WDT1 setPreviewSize(GetSystemMetrics_(#SM_CXSCREEN) * 0.9, 0)
Case #SETUP_WDT2 setPreviewSize(GetSystemMetrics_(#SM_CXSCREEN) * 0.5, 0)
Case #SETUP_WDT3 setPreviewSize(GetSystemMetrics_(#SM_CXSCREEN) * 0.25, 0)
Case #SETUP_HGT1 setPreviewSize(0, GetSystemMetrics_(#SM_CYSCREEN) * 0.8)
Case #SETUP_HGT2 setPreviewSize(0, GetSystemMetrics_(#SM_CYSCREEN) * 0.5)
Case #SETUP_HGT3 setPreviewSize(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
;-\popup menu Case #WM_RBUTTONDOWN Select EventWindow() Case #WIN1 If GetGadgetState(#PANEL1) = 0 DisplayPopupMenu(#POP_UP, WindowID(#WIN1)) EndIf EndSelect
;-\resize Case #PB_Event_SizeWindow If GetWindowState(#WIN1) = #PB_Window_Maximize maximized = 1 Else maximized = 0 windowW = WindowWidth(#WIN1) windowH = WindowHeight(#WIN1) EndIf ResizeGadget(#PANEL1, 0, 0, WindowWidth(#WIN1), WindowHeight(#WIN1) - MenuHeight() - StatusBarHeight(#STAT1)) wdt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemWidth) hgt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemHeight) ResizeGadget(#EDIT1, 0, 0, wdt, hgt) ResizeGadget(#WEB1, 0, 0, wdt, hgt) Select GetGadgetState(#PANEL1) Case 0 SetActiveGadget(#EDIT1) Case 1 SetActiveGadget(#WEB1) StatusBarText(#STAT1, 0, " PREVIEW SIZE: " + Str(wdt) + " X " + Str(hgt)) EndSelect
Case #PB_Event_CloseWindow If saveModifiedFile() <> #IDCANCEL Break EndIf EndSelect ForEver
;-program exit CloseWindow(#WIN1) writePreferences(inFolder, name) DeleteFile(snapshot) 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) SetWindowColor(#WIN1, RGB(192, 224, 255)) 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 ;-\main menu 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..." + 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)
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_OPENCOPY, "Open Last Snapshot") 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...") MenuItem(#FILE_SAVECOPY, "Save As Snapshot") 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_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) 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_SEARCH1, "&Google" + Chr(9) + "Ctrl + G") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_G, #TOOLS_SEARCH1)
MenuItem(#TOOLS_SEARCH2, "&W3schools" + Chr(9) + "Ctrl + W") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_W, #TOOLS_SEARCH2) MenuBar()
MenuItem(#TOOLS_NOTEPAD, "Notepad") MenuItem(#TOOLS_SYSMON, "System &Monitor" + Chr(9) + "Ctrl + M") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_M, #TOOLS_SYSMON) MenuItem(#TOOLS_MAGNIFY, "Magnifier")
;setup menuitem MenuTitle("&Setup") MenuItem(#SETUP_TOPMOST, "Always On &Top" + Chr(9) + "Ctrl + T") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_T, #SETUP_TOPMOST) MenuBar()
MenuItem(#SETUP_SIZ1, "Width 800px") MenuItem(#SETUP_SIZ2, "Width 1024px") MenuItem(#SETUP_SIZ3, "Width 1280px") MenuBar()
MenuItem(#SETUP_WDT1, "Width 90%") MenuItem(#SETUP_WDT2, "Width 50%") MenuItem(#SETUP_WDT3, "Width 25%") MenuBar()
MenuItem(#SETUP_HGT1, "Height 80%") 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
;-\popupmenu 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_SAVECOPY, "Save As Snapshot") 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_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_QUIT, "&Quit" + Chr(9) + "Ctrl + Q") AddKeyboardShortcut(#WIN1, #PB_Shortcut_Control | #PB_Shortcut_Q, #FILE_QUIT) Else ;error ProcedureReturn 0 EndIf ;-\statusbar If CreateStatusBar(#STAT1, WindowID(#WIN1)) AddStatusBarField(400) StatusBarText(#STAT1, 0, " Licenced To: UNLICENCED") EndIf ;-\gadgets If createGadgetList(WindowID(#WIN1)) PanelGadget(#PANEL1, 0, 0, WindowWidth(#WIN1), WindowHeight(#WIN1) - MenuHeight() - StatusBarHeight(#STAT1))
;tab 0, html file AddGadgetItem(#PANEL1, 0, "Html Source File") wdt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemWidth) hgt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemHeight) 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 hFont = LoadFont(0, fontName, fontSize) SetGadgetFont(#EDIT1, hFont) ;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)
;set up margins to allow for linenumbers GetClientRect_(GadgetID(#EDIT1), rc.RECT) rc\left = leftM SendMessage_(GadgetID(#EDIT1), #EM_SETRECT, 0, rc)
;subclass the editorgadget to handle linenumbers editProc = SetWindowLong_(GadgetID(#EDIT1), #GWL_WNDPROC, @editCallback())
;tab 1, html preview AddGadgetItem(#PANEL1, 1, "Save/Page Preview") wdt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemWidth) hgt = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemHeight) WebGadget(#WEB1, 0, 0, wdt, hgt, "about:") CloseGadgetList()
;open tab 0 SetGadgetState(#PANEL1, 0) SetActiveGadget(#EDIT1) EndIf EndIf ;escape shortcut to switch between tabs AddKeyboardShortcut(#WIN1, #PB_Shortcut_Escape, #ESCAPE) ;linenumber callback resetModified() ProcedureReturn 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 = "Html Source (*.htm *.html *.css *.txt)|*.htm;*.html;*.css;*.txt|All files (*.*)|*.*" path.s = OpenFileRequester("", GetHomeDirectory(), ext, 0) If path If saveModifiedFile() <> #IDCANCEL reLoad(#EDIT1, path, 0) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) SetActiveGadget(#EDIT1) EndIf EndIf EndProcedure
Procedure fileOpen() If saveModifiedFile() <> #IDCANCEL ext.s = "Html Source (*.htm *.html *.css *.txt)|*.htm;*.html;*.css;*.txt|All files (*.*)|*.*" path.s = OpenFileRequester("Open File", fileOpenFolder, ext, 0) If path reLoad(#EDIT1, path, 0) 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 = "Html Source (*.htm *.html *.css *.txt)|*.htm;*.html;*.css;*.txt|All files (*.*)|*.*" path.s = OpenFileRequester("Insert 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) EndIf ProcedureReturn #True EndProcedure
Procedure fileSaveAs() ext.s = "Html Source (*.htm *.html *.css *.txt)|*.htm;*.html;*.css;*.txt|All files (*.*)|*.*" path.s = SaveFileRequester("Save File As", fileOpenFolder + fileName, ext, 0) If path If GetExtensionPart(path) = "" path + ".html" EndIf reSave(#EDIT1, path, 0) fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) SetWindowTitle(#WIN1, appName + " - " + path) Else ProcedureReturn #False EndIf ProcedureReturn #True EndProcedure
Procedure fileSaveTo() ext.s = "Html Source (*.htm *.html *.css *.txt)|*.htm;*.html;*.css;*.txt|All files (*.*)|*.*" path.s = SaveFileRequester("Save to the end of file", fileSavetoFolder + fileName, ext, 0) If path If OpenFile(0, path) ;gote 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 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 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() ;text field1 txt.s = "About" + #TAB$ ;text field2 txt + "Html Editor" + #TAB$ ;text field3 txt + "www.utopiomania.com" + #TAB$ ;text field4 txt + "Copyright (C) 2008 Stig Henning Johansen" + #TAB$ ;text field5 txt + "WARNING: This program is protected by copyright law and international treaties."+ #TAB$
;about html html.s = "<html><body 'onclick = return(false)'>" html.s = "<html><body" html + " bgcolor = 'white' text = 'gray' link = 'blue' vlink = 'blue' alink = 'blue'" html + " onContextMenu = 'return false';>" html + "<center>" html + "Html Editor Beta 20080105" html + "<p><a href = 'http://www.utopiomania.com'>Check for a new version</a>" html + "<p>Principal programmer and developer" html + "<p><a href = 'http://www.company.com'>Stig H Johansen/utopiomania</a>" html + "<p>This version is Beta and UNLICENCED" html + "</body></html>" about(0, txt, html) EndProcedure
Procedure about(parent, text.s, html.s) ;fields about.s = StringField(text, 1, #TAB$) name.s = StringField(text, 2, #TAB$) corp.s = StringField(text, 3, #TAB$) txt1.s = StringField(text, 4, #TAB$) txt2.s = StringField(text, 5, #TAB$) link.s = StringField(text, 6, #TAB$) http.s = StringField(text, 7, #TAB$)
flags = #PB_Window_ScreenCentered | #PB_Window_SystemMenu win = OpenWindow(#PB_Any, 0, 0, 512, 400, name, flags) If win EnableWindow_(WindowID(parent), #False) ResizeWindow(win, #PB_Ignore, WindowY(win) - 50, #PB_Ignore, #PB_Ignore) StickyWindow(win, #True)
If createGadgetList(WindowID(win)) ;graphics image gadget img1 = CreateImage(#PB_Any, 512, 50) 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 511 LineXY(x, 0, x, 45, RGB(x / 2.5, x / 2.5, 255)) LineXY(x, 45, x, 50, RGB(225- x / 5, 225 - x / 5, 255)) Next x
res.s = "shell32.dll" ndx = 130 ;res.s = programFileName() ;ndx = 0 ExtractIconEx_(res, ndx, 0, @icon, 1) If icon DrawImage(icon, 10, 5, 36, 36) DestroyIcon_(icon) EndIf
;header about field If fnt1 DrawingFont(FontID(fnt1)) EndIf DrawText(60, 4, about, RGB(255, 255, 255))
;header program name field If fnt2 DrawingFont(FontID(fnt2)) EndIf DrawText(60, 18, name, RGB(255, 255, 255))
;header company name field If fnt1 DrawingFont(FontID(fnt1)) EndIf DrawText(500 - TextWidth(corp), 25, corp, RGB(255, 255, 255)) StopDrawing() EndIf ImageGadget(#PB_Any, 0, 0, 512, 75, ImageID(img1)) ;upper text TextGadget(#PB_Any, 10, 66, 492, 35, txt1) ;about html web1 = WebGadget(#PB_Any, 10, 100, 490, 200, "") SetGadgetItemText(web1, #PB_Web_HtmlCode, html) ;draw a frame aroud the webgadget Frame3DGadget(#PB_Any, 9, 99, 492, 202, "", #PB_Frame3D_Single) ;lower text TextGadget(#PB_Any, 10, 315, 492, 25, txt2)
;divider line Frame3DGadget(#PB_Any, 0, 340, 512, 2, "", #PB_Frame3D_Single) ;link/url If Len(link) lnk1 = HyperLinkGadget(#PB_Any, 20, 360, 200, 24, link, RGB(0, 0, 255), #PB_HyperLink_Underline) SetGadgetColor(lnk1, #PB_Gadget_FrontColor, RGB(0, 0, 255)) EndIf
;ok button btn1 = ButtonGadget(#PB_Any, 422, 360, 80, 24, "Ok", #PB_Button_Default) AddKeyboardShortcut(win, #PB_Shortcut_Return, btn1) EndIf
Repeat event = WaitWindowEvent() Select event Case #PB_Event_Gadget Select EventGadget() Case lnk1 RunProgram(http) 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
;- 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 editCallback(hWnd, uMsg, wParam, lParam) Select uMsg Case #WM_PAINT CallWindowProc_(editProc, hWnd, uMsg, wParam, lParam) drawLineNumbers() ProcedureReturn 0 EndSelect ProcedureReturn CallWindowProc_(editProc, hWnd, uMsg, wParam, lParam) EndProcedure
Procedure drawLinenumbers() id = GadgetID(#EDIT1) hdc = GetDCEx_(id, 0, #DCX_CACHE) hFont = FontID(GetGadgetFont(#EDIT1)) prevObj = SelectObject_(hDC, hFont)
GetTextMetrics_(hDC, @tm.TEXTMETRIC) fontH = tm\tmHeight GetClientRect_(id, rc.RECT) rc\right = leftM - 8 FillRect_(hDC, rc, GetStockObject_(#WHITE_BRUSH)) SetBkMode_(hDC, #TRANSPARENT) SetTextColor_(hDC, $C0C0C0)
;get the first line first = SendMessage_(id, #EM_GETFIRSTVISIBLELINE, 0, 0)
;get the last character/line pt.POINT\x = rc\left pt\y = rc\bottom lastChar = SendMessage_(id, #EM_CHARFROMPOS, 0, pt) last = SendMessage_(id, #EM_LINEFROMCHAR, lastChar, 0) ; get the first character pt\y = rc\top firstChar = SendMessage_(id, #EM_CHARFROMPOS, 0, pt)
;get the client coordinates fo the first character SendMessage_(id, #EM_POSFROMCHAR, @tChar.POINT, firstChar) ;adjust linenumber RECT rc\top = tChar\y
For line = first To last DrawText_(hDc, Str(line + 1), -1, rc, #DT_RIGHT) rc\top + fontH Next SelectObject_(hDC, prevObj) ReleaseDC_(id, hDC) 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, 0, 0) ProcedureReturn result EndProcedure
Procedure resetModified() ;reset editorgadget modify flag SendMessage_(GadgetID(#EDIT1), #EM_SETMODIFY, #False, 0) EndProcedure
;- Procedure savePreview() If CountGadgetItems(#EDIT1) If fileName = untitled If fileSave() ProcedureReturn #True Else ProcedureReturn #False EndIf Else If LCase(GetExtensionPart(fileName)) <> "css" reSave(#EDIT1, fileOpenFolder + fileName, 0) EndIf EndIf ProcedureReturn #True EndIf ProcedureReturn #False EndProcedure
Procedure loadPreview() If LCase(GetExtensionPart(fileName)) <> "css" SetGadgetText(#WEB1, "file://" + fileOpenFolder + fileName) Else SetGadgetText(#WEB1, "about:" + appName + " - No preview available") EndIf EndProcedure
;- Procedure processCmdLine() ;process command line parameters If CountProgramParameters() ;open a doubleclicked file path.s = ProgramParameter() reLoad(#EDIT1, path, 0) ;process dot commands: fileName = GetFilePart(path) fileOpenFolder = GetPathPart(path) saveRecentFiles(fileOpenFolder + fileName) SetWindowTitle(#WIN1, appName + " - " + path) EndIf 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 readPreferences(inFolder.s, name.s) #CSIDL_APPDATA = $1A ; XP: C:\Documents and Settings\username\Application Data* ; Vista: C:\Users\username\AppData\Roaming If Len(inFolder) inFolder + "\" EndIf path.s = GetPathPart(ProgramFilename()) type = GetDriveType_(Left(path, 2)) If type = 2 ;removable path = path + inFolder + name Else path = getSpecialFolder(#CSIDL_APPDATA) + inFolder + name EndIf OpenPreferences(path) 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", "courier new") 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 writePreferences(inFolder.s, name.s) #CSIDL_APPDATA = $1A ; XP: C:\Documents and Settings\username\Application Data* ; Vista: C:\Users\username\AppData\Roaming If Len(inFolder) inFolder + "\" EndIf path.s = GetPathPart(ProgramFilename()) type = GetDriveType_(Left(path, 2)) If type = 2 ;removable path = path + inFolder Else path = getSpecialFolder(#CSIDL_APPDATA) + inFolder EndIf CreateDirectory(path) If CreatePreferences(path + name) 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() ProcedureReturn 1 EndIf ProcedureReturn 0 EndProcedure
;- Procedure setPreviewSize(wdt, hgt) ;sets active panelgadget attached edit/webgadget or window ;size to w, h. used to check web page looks at different res 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 ;set preview size, the width (most imporant) will be correct edtW = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemWidth) ResizeWindow(#win1, #PB_Ignore, #PB_Ignore, winW - edtW + wdt, #PB_Ignore) EndIf If hgt ;height edtH = GetGadgetAttribute(#PANEL1, #PB_Panel_ItemHeight) ResizeWindow(#WIN1, #PB_Ignore, #PB_Ignore, #PB_Ignore, winH - edtH + 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) SHGetSpecialFolderLocation_(0, id, @pidl) path.s = Space(#MAX_PATH) SHGetPathFromIDList_(pidl, @path) If Right(path, 1) <> "\" path + "\" EndIf If pidl CoTaskMemFree_(pidl) EndIf ProcedureReturn path endProcedure
|
|