; --------------------------------------------------------------------------------------------; Copyright (c) Fantaisie Software. All rights reserved.; Dual licensed under the GPL and Fantaisie Software licenses.; See LICENSE and LICENSE-FANTAISIE in the project root for license information.; --------------------------------------------------------------------------------------------Structure FileViewerFileName$; to compare to newly opened files..Gadget.i ; scrollarea or editor.. this value is only needed for resizingImage.i ; loaded image if anyEndStructureGlobal NewList FileViewer.FileViewer()UseJPEGImageDecoder()UsePNGImageDecoder()UseTGAImageDecoder()Global FileViewerOpenProcedure FileViewer_UpdateButtonStates()count = ListSize(FileViewer())If count = 0DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Close, 1)DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Previous, 1)DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Next, 1)ElseDisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Close, 0)index = ListIndex(FileViewer())If count = 1DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Previous, 1)DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Next, 1)ElseIf index = 0DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Previous, 1)DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Next, 0)ElseIf index = count-1DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Previous, 0)DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Next, 1)ElseDisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Previous, 0)DisableToolBarButton(#TOOLBAR_FileViewer, #MENU_FileViewer_Next, 0)EndIfEndIfEndProcedureProcedure ResizeFileViewer()ResizeGadget(#GADGET_FileViewer_Panel, 0, ToolbarTopOffset, WindowWidth(#WINDOW_FileViewer), WindowHeight(#WINDOW_FileViewer)-ToolbarHeight-StatusBarHeight)PanelWidth = GetPanelWidth(#GADGET_FileViewer_Panel)PanelHeight = GetPanelHeight(#GADGET_FileViewer_Panel)ForEach FileViewer()If FileViewer()\GadgetResizeGadget(FileViewer()\Gadget, 0, 0, PanelWidth, PanelHeight)EndIfNext FileViewer()EndProcedureProcedure OpenFileViewerWindow()If IsWindow(#WINDOW_FileViewer) = 0; TODO: Something is wrong here with the PB_OpenWindow3_DEBUG call because it; complains about the ParentID not being valid when it clearly is.; This happened only with AllocationPreference set to high addresses first (Windows x64);DisableDebuggerIf OpenWindow(#WINDOW_FileViewer, FileViewerX, FileViewerY, FileViewerWidth, FileViewerHeight, Language("FileViewer","Title"), #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_Invisible, WindowID(#WINDOW_Main))EnableDebuggerCompilerIf #CompileMacIf OSVersion() >= #PB_OS_MacOSX_10_14; Fix Toolbar style from titlebar to expanded (Top Left)#NSWindowToolbarStyleExpanded = 1CocoaMessage(0, WindowID(#WINDOW_FileViewer), "setToolbarStyle:", #NSWindowToolbarStyleExpanded)EndIfCompilerEndIfSmartWindowRefresh(#WINDOW_FileViewer, 1)CompilerIf #CompileMacflags = #PB_ToolBar_LargeCompilerElseflags = 0CompilerEndIfIf CreateToolBar(#TOOLBAR_FileViewer, WindowID(#WINDOW_FileViewer), flags)ToolBarImageButton(#MENU_FileViewer_Open, ImageID(#IMAGE_FileViewer_Open))ToolBarImageButton(#MENU_FileViewer_Close, ImageID(#IMAGE_FileViewer_Close))ToolBarSeparator()ToolBarImageButton(#MENU_FileViewer_Previous, ImageID(#IMAGE_FileViewer_Left))ToolBarImageButton(#MENU_FileViewer_Next, ImageID(#IMAGE_FileViewer_Right))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Open, Language("FileViewer","Open"))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Close, Language("FileViewer","Close"))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Previous, Language("FileViewer","Previous"))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Next, Language("FileViewer","Next"))EndIfIf CreateStatusBar(#STATUSBAR_FileViewer, WindowID(#WINDOW_FileViewer))AddStatusBarField(#PB_Ignore)EndIfPanelGadget(#GADGET_FileViewer_Panel, 0, ToolbarTopOffset, FileViewerWidth, FileViewerHeight-ToolbarHeight-StatusBarHeight)CloseGadgetList()EnableGadgetDrop(#GADGET_FileViewer_Panel, #PB_Drop_Files, #PB_Drag_Copy)EnableWindowDrop(#WINDOW_FileViewer, #PB_Drop_Files, #PB_Drag_Copy)EnsureWindowOnDesktop(#WINDOW_FileViewer)If FileViewerMaximizeShowWindowMaximized(#WINDOW_FileViewer)ElseHideWindow(#WINDOW_FileViewer, 0)EndIfResizeFileViewer()FileViewer_UpdateButtonStates()EndIfElseSetWindowForeground(#WINDOW_FileViewer)EndIfEndProcedureProcedure IsBinaryFile(*Buffer, Length); Check if the Data is text only or binary (search for bytes <= 30, except cr,lf,tab); Note: we use a binary count as old PB file used a zero char to separate the bottom options from the real code; Also JaPBe uses some similar trick.;BinaryCount = 0IsBinary = 0*Pointer.Ascii = *BufferWhile *Pointer < *Buffer+LengthIf *Pointer\a < 32 And *Pointer\a <> 10 And *Pointer\a <> 13 And *Pointer\a <> 9BinaryCount + 1If BinaryCount > 10IsBinary = 1BreakEndIfEndIf*Pointer + 1WendProcedureReturn IsBinaryEndProcedureProcedure FileViewer_OpenFile(Filename$)AddTools_RunFileViewer = 1 ; to tell if some tool has been executedAddTools_File$ = FileName$Ext$ = LCase(GetExtensionPart(FileName$))AddTools_Execute(#TRIGGER_FileViewer_Special, 0) ; special file tools have highest priorityIf AddTools_RunFileViewerAddTools_Execute(#TRIGGER_FileViewer_All, 0)EndIfIf AddTools_RunFileViewerIf Ext$ <> "bmp" And Ext$ <> "png" And Ext$ <> "jpg" And Ext$ <> "jpeg" And Ext$ <> "tga" And Ext$ <> "ico" And Ext$ <> "txt"AddTools_Execute(#TRIGGER_FileViewer_Unknown, 0)EndIfEndIfIf AddTools_RunFileViewer = 0 ; stop if a tool has been runProcedureReturnEndIfSizeMB.f = FileSize(FileName$)/(1024*1024)If SizeMB > 10 ; = 10 mb is the max size handled by file viewer, or it will take forever to display in our EditorGadget() based hex viewerMessageRequester(#ProductName,ドル Language("FileViewer","SizeError"), #FLAG_Error|#PB_MessageRequester_Ok)ProcedureReturnElseIf SizeMB > 4 ; = 4 mb check for large files which might take long to loadIf MessageRequester(#ProductName,ドル Language("FileViewer","SizeWarning")+" ("+StrF(SizeMB, 1)+" MB)"+#NewLine+Language("FileViewer","SizeQuestion"), #FLAG_Warning|#PB_MessageRequester_YesNo) = #PB_MessageRequester_NoProcedureReturnEndIfEndIf; check if window is open;If IsWindow(#WINDOW_FileViewer) = 0OpenFileViewerWindow()ElseSetWindowForeground(#WINDOW_FileViewer)EndIf; check if this file was already loaded;Found = 0ForEach FileViewer()If LCase(FileViewer()\FileName$) = LCase(FileName$)Found = 1BreakEndIfNext FileViewer()If Found = 1SetGadgetState(#GADGET_FileViewer_Panel, ListIndex(FileViewer()))StatusBarText(#STATUSBAR_FileViewer, 0, FileName$)Else; find out if it is an image file..If Ext$ = "bmp" Or Ext$ = "png" Or Ext$ = "jpg" Or Ext$ = "jpeg" Or Ext$ = "tga" Or Ext$ = "ico"Image = LoadImage(#PB_Any, FileName$)If ImageLastElement(FileViewer())AddElement(FileViewer())FileViewer()\FileName$ = FileName$FileViewer()\Image = ImageOpenGadgetList(#GADGET_FileViewer_Panel)AddGadgetItem(#GADGET_FileViewer_Panel, -1, GetFilePart(FileName$))FileViewer()\Gadget = ScrollAreaGadget(#PB_Any, 0, 0, GetPanelWidth(#GADGET_FileViewer_Panel), GetPanelHeight(#GADGET_FileViewer_Panel), ImageWidth(Image), ImageHeight(Image), 10, #PB_ScrollArea_Center)ImageGadget = ImageGadget(#PB_Any, 0, 0, ImageWidth(Image), ImageHeight(Image), ImageID(Image))EnableGadgetDrop(ImageGadget, #PB_Drop_Files, #PB_Drag_Copy)CloseGadgetList()CloseGadgetList()ElseMessageRequester(#ProductName,ドル Language("FileStuff","MiscLoadError"), #FLAG_Error)EndIfCompilerIf #CompileWindows ; the gtk2 is not working well enough on all machinesElseIf Ext$ = "html" Or Ext$ = "htm"LastElement(FileViewer())AddElement(FileViewer())FileViewer()\FileName$ = FileName$OpenGadgetList(#GADGET_FileViewer_Panel)AddGadgetItem(#GADGET_FileViewer_Panel, -1, GetFilePart(FileName$))FileViewer()\Gadget = WebGadget(#PB_Any, 0, 0, GetPanelWidth(#GADGET_FileViewer_Panel), GetPanelHeight(#GADGET_FileViewer_Panel), "file://" + FileName$)CloseGadgetList()CompilerEndIfElseIf ReadFile(#FILE_FileViewer, FileName$)Length = Lof(#FILE_FileViewer)If Length > 0*Buffer = AllocateMemory(Length)EndIfIf *Buffer Or Length = 0; add the editorgadget and prepare it;LastElement(FileViewer())AddElement(FileViewer())FileViewer()\FileName$ = FileName$OpenGadgetList(#GADGET_FileViewer_Panel)AddGadgetItem(#GADGET_FileViewer_Panel, -1, GetFilePart(FileName$))FileViewer()\Gadget = ScintillaGadget(#PB_Any, 0, 0, GetPanelWidth(#GADGET_FileViewer_Panel), GetPanelHeight(#GADGET_FileViewer_Panel), #Null)CloseGadgetList()ScintillaSendMessage(FileViewer()\Gadget, #SCI_USEPOPUP, 1, 0) ; use the scintilla popupScintillaSendMessage(FileViewer()\Gadget, #SCI_SETMARGINWIDTHN, 0, 0)ScintillaSendMessage(FileViewer()\Gadget, #SCI_SETMARGINWIDTHN, 1, 0)ScintillaSendMessage(FileViewer()\Gadget, #SCI_STYLESETFONT, #STYLE_DEFAULT, ToAscii(EditorFontName$))ScintillaSendMessage(FileViewer()\Gadget, #SCI_STYLESETSIZE, #STYLE_DEFAULT, EditorFontSize)ScintillaSendMessage(FileViewer()\Gadget, #SCI_STYLECLEARALL, 0, 0)ScintillaSendMessage(FileViewer()\Gadget, #SCI_SETCODEPAGE, 0, 0)EnableGadgetDrop(FileViewer()\Gadget, #PB_Drop_Files, #PB_Drag_Copy)If Length > 0; ok, now read the file;ReadData(#FILE_FileViewer, *Buffer, Length)If IsBinaryFile(*Buffer, Length) = #FalseChangeNewLineType(@*Buffer, @Length, #DEFAULT_NewLineType)Text$ = PeekS(*Buffer, Length, #PB_Ascii)ScintillaSendMessage(FileViewer()\Gadget, #SCI_SETTEXT, 0, ToAscii(Text$))Else*Buffer2 = AllocateMemory(((Length + 16) * 78) / 8) ; Add 16 as the last 16 char block line can be only one character length*Pointer2 = *Buffer2CopyMemoryString(@"", @*Pointer2); display a nice hex view;*Pointer.Ascii = *BufferRepeatHexData$ = RSet(Hex(*Pointer-*Buffer), 8, "0") + " "String$ = " "For i = 0 To $FIf *Pointer > *Buffer+LengthHexData$ = LSet(HexData,ドル 58, " ")BreakEndIfHexData$ + RSet(Hex(*Pointer\a, #PB_Byte), 2, "0") + " "If *Pointer\a < 32String$ + "."ElseString$ + Chr(*Pointer\a)EndIf*Pointer + 1Next iCopyMemoryString(HexData$)CopyMemoryString(String$)CopyMemoryString(#NewLine)Until *Pointer > *Buffer+LengthText$ = PeekS(*Buffer2, (*Pointer2-*Buffer2) / #CharSize)ScintillaSendMessage(FileViewer()\Gadget, #SCI_SETTEXT, 0, ToAscii(Text$))FreeMemory(*Buffer2)EndIfFreeMemory(*Buffer)EndIfSetGadgetAttribute(FileViewer()\Gadget, #PB_Editor_ReadOnly, 1)ElseMessageRequester(#ProductName,ドル Language("FileStuff","MiscLoadError"), #FLAG_Error)EndIfCloseFile(#FILE_FileViewer)ElseMessageRequester(#ProductName,ドル Language("FileStuff","MiscLoadError"), #FLAG_Error)EndIfEndIfSetGadgetState(#GADGET_FileViewer_Panel, CountGadgetItems(#GADGET_FileViewer_Panel)-1)If LastElement(FileViewer())StatusBarText(#STATUSBAR_FileViewer, 0, FileViewer()\FileName$)EndIfEndIfResizeFileViewer()FileViewer_UpdateButtonStates()EndProcedureProcedure FileViewerWindowEvents(EventID)If EventID = #PB_Event_GadgetDrop Or EventID = #PB_Event_WindowDropFiles$ = EventDropFiles()Count = CountString(Files,ドル Chr(10))+1For i = 1 To CountFile$ = StringField(Files,ドル i, Chr(10))If File$ <> "" And FileSize(File$) <> -2 ; no directories!FileViewer_OpenFile(File$)EndIfNext iElseIf EventID = #PB_Event_MenuSelect EventMenu()Case #MENU_FileViewer_OpenPattern$ = Language("FileViewer","Pattern")CompilerIf #CompileWindows = 0; have to remove the .ico pattern...Pattern$ = RemoveString(Pattern,ドル ", *.ico")Pattern$ = RemoveString(Pattern,ドル ",*.ico")Pattern$ = RemoveString(Pattern,ドル ";*.ico")CompilerEndIfFileName$ = OpenFileRequester(Language("FileStuff","OpenFileTitle"), FileViewerPath,ドル AddTools_PatternStrings$ + Pattern,ドル FileViewerPattern, #PB_Requester_MultiSelection)If FileName$FileViewerPattern = SelectedFilePattern()FileViewerPath$ = GetPathPart(FileName$)While FileName$FileViewer_OpenFile(FileName$)FileName$ = NextSelectedFileName()WendEndIfCase #MENU_FileViewer_CloseIf CountGadgetItems(#GADGET_FileViewer_Panel) > 0SelectElement(FileViewer(), GetGadgetState(#GADGET_FileViewer_Panel))If FileViewer()\ImageFreeImage(FileViewer()\Image)EndIfIf ListIndex(FileViewer()) = 0DeleteElement(FileViewer())FirstElement(FileViewer())ElseDeleteElement(FileViewer())EndIfRemoveGadgetItem(#GADGET_FileViewer_Panel, GetGadgetState(#GADGET_FileViewer_Panel))If ListSize(FileViewer()) > 0StatusBarText(#STATUSBAR_FileViewer, 0, FileViewer()\FileName$)ElseStatusBarText(#STATUSBAR_FileViewer, 0, "")EndIfEndIfFileViewer_UpdateButtonStates()Case #MENU_FileViewer_PreviousIf ListSize(FileViewer()) > 0index = GetGadgetState(#GADGET_FileViewer_Panel)If index = 0SetGadgetState(#GADGET_FileViewer_Panel, CountGadgetItems(#GADGET_FileViewer_Panel)-1)LastElement(FileViewer())ElseSetGadgetState(#GADGET_FileViewer_Panel, index-1)SelectElement(FileViewer(), index-1)EndIfStatusBarText(#STATUSBAR_FileViewer, 0, FileViewer()\FileName$)EndIfFileViewer_UpdateButtonStates()Case #MENU_FileViewer_NextIf ListSize(FileViewer()) > 0index = GetGadgetState(#GADGET_FileViewer_Panel)If index = CountGadgetItems(#GADGET_FileViewer_Panel)-1SetGadgetState(#GADGET_FileViewer_Panel, 0)FirstElement(FileViewer())ElseSetGadgetState(#GADGET_FileViewer_Panel, index+1)SelectElement(FileViewer(), index+1)EndIfStatusBarText(#STATUSBAR_FileViewer, 0, FileViewer()\FileName$)EndIfFileViewer_UpdateButtonStates()EndSelectElseIf EventID = #PB_Event_GadgetIf EventGadget() = #GADGET_FileViewer_PanelIf SelectElement(FileViewer(), GetGadgetState(#GADGET_FileViewer_Panel))StatusBarText(#STATUSBAR_FileViewer, 0, FileViewer()\FileName$)EndIfFileViewer_UpdateButtonStates()EndIfElseIf EventID = #PB_Event_SizeWindowResizeFileViewer()ElseIf EventID = #PB_Event_CloseWindowIf MemorizeWindow And IsWindowMinimized(#WINDOW_FileViewer) = 0FileViewerMaximize = IsWindowMaximized(#WINDOW_FileViewer)If FileViewerMaximize = 0FileViewerX = WindowX(#WINDOW_FileViewer)FileViewerY = WindowY(#WINDOW_FileViewer)FileViewerWidth = WindowWidth(#WINDOW_FileViewer)FileViewerHeight = WindowHeight(#WINDOW_FileViewer)EndIfEndIfForEach FileViewer()If FileViewer()\ImageFreeImage(FileViewer()\Image)EndIfNext FileViewer()ClearList(FileViewer())CloseWindow(#WINDOW_FileViewer)EndIfEndProcedureProcedure UpdateFileViewerWindow()SetWindowTitle(#WINDOW_FileViewer, Language("FileViewer","Title")); re-create the toolbar to apply theme changesFreeToolBar(#TOOLBAR_FileViewer)If CreateToolBar(#TOOLBAR_FileViewer, WindowID(#WINDOW_FileViewer))ToolBarImageButton(#MENU_FileViewer_Open, ImageID(#IMAGE_FileViewer_Open))ToolBarImageButton(#MENU_FileViewer_Close, ImageID(#IMAGE_FileViewer_Close))ToolBarSeparator()ToolBarImageButton(#MENU_FileViewer_Previous, ImageID(#IMAGE_FileViewer_Left))ToolBarImageButton(#MENU_FileViewer_Next, ImageID(#IMAGE_FileViewer_Right))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Open, Language("FileViewer","Open"))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Close, Language("FileViewer","Close"))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Previous, Language("FileViewer","Previous"))ToolBarToolTip(#TOOLBAR_FileViewer, #MENU_FileViewer_Next, Language("FileViewer","Next"))EndIfFileViewer_UpdateButtonStates()EndProcedure
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。