; --------------------------------------------------------------------------------------------; 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.; --------------------------------------------------------------------------------------------;; We add/remove only the changed files from the Panel, this way the; selection, scroll position and open nodes stay consistent;; For this, we store the ProjectFiles() pointer in the GadgetItemData; Special values for the GadgetItemData:;#ProjectPanel_Directory = 0#ProjectPanel_InternalBase = -1#ProjectPanel_ExternalBase = -2Global ProjectPanelVisibleGlobal ProjectPanelMenuGadget; Delete a file entry and all its parents if empty (recursive);Procedure ProjectPanel_RemoveFile(Index)Sublevel = GetGadgetItemAttribute(#GADGET_ProjectPanel, Index, #PB_Tree_SubLevel); Only empty Items can be removed;Last = CountGadgetItems(#GADGET_ProjectPanel)-1For i = Index+1 To LastLevel = GetGadgetItemAttribute(#GADGET_ProjectPanel, i, #PB_Tree_SubLevel)If Level <= SublevelBreakElseIf Level > Sublevel; found a subitem, so abortProcedureReturnEndIfNext i; This item is empty, so remove it; Do not remove the InternalBase item, so the gadget is only full empty when no project is open;If GetGadgetItemData(#GADGET_ProjectPanel, Index) <> #ProjectPanel_InternalBaseRemoveGadgetItem(#GADGET_ProjectPanel, Index); Find the parent and recurseIf Sublevel > 0For ParentIndex = Index-1 To 0 Step -1If GetGadgetItemAttribute(#GADGET_ProjectPanel, ParentIndex, #PB_Tree_SubLevel) < SublevelProjectPanel_RemoveFile(ParentIndex)ProcedureReturnEndIfNext ParentIndexEndIfEndIfEndProcedure; Add all directories for a file, and the file entry itself (recursive);Procedure ProjectPanel_AddFile(Filename,ドル ParentIndex, *File.ProjectFile)NewLevel = GetGadgetItemAttribute(#GADGET_ProjectPanel, ParentIndex, #PB_Tree_SubLevel)+1Count = CountGadgetItems(#GADGET_ProjectPanel)NewItem$ = StringField(Filename,ドル 1, #Separator)Separator = FindString(Filename,ドル #Separator, 1); Look if we can find the Item$ on the current sublevel, else look for a place to insert;FoundIndex = -1InsertIndex = -1For Index = ParentIndex+1 To Count-1Level = GetGadgetItemAttribute(#GADGET_ProjectPanel, Index, #PB_Tree_SubLevel)If Level = NewLevel*NewFile = GetGadgetItemData(#GADGET_ProjectPanel, Index)If Separator And *NewFile <> #ProjectPanel_Directory; directories come before filesInsertIndex = IndexBreakElseIf Separator = 0 And *NewFile = #ProjectPanel_Directory; files come after directoriesContinueElseItem$ = GetGadgetItemText(#GADGET_ProjectPanel, Index)Select CompareMemoryString(@NewItem,ドル @Item,ドル #PATH_CaseInsensitive)Case #PB_String_LowerInsertIndex = IndexBreakCase #PB_String_EqualFoundIndex = IndexBreakEndSelectEndIfElseIf Level < NewLevelInsertIndex = IndexBreakEndIfNext IndexIf FoundIndex = -1 And InsertIndex = -1InsertIndex = CountEndIfIf Separator; Its a directory;Filename$ = Right(Filename,ドル Len(Filename$)-Separator)If FoundIndex <> -1ProjectPanel_AddFile(Filename,ドル FoundIndex, *File); do not adjust the expanded state of this directory:; the stored state was used when it was first added, and if it changed since,; then the user did it, so do not alter thatElseIf InsertIndex <> -1AddGadgetItem(#GADGET_ProjectPanel, InsertIndex, NewItem,ドル OptionalImageID(#IMAGE_ProjectPanel_Directory), NewLevel)SetGadgetItemData(#GADGET_ProjectPanel, InsertIndex, #ProjectPanel_Directory)ProjectPanel_AddFile(Filename,ドル InsertIndex, *File); set the expanded state from the information for the added file.; this should match the information for all other files in this directory, so we only; need to set this on creation of the directory;If Mid(*File\PanelState,ドル NewLevel+1, 1) <> "-" ; expanded is the default if no info was foundSetGadgetItemState(#GADGET_ProjectPanel, InsertIndex, #PB_Tree_Expanded)EndIfEndIfElse; Its a file;If InsertIndex <> -1If *File\AutoScanImageID = OptionalImageID(#IMAGE_ProjectPanel_FileScanned)ElseImageID = OptionalImageID(#IMAGE_ProjectPanel_File)EndIfAddGadgetItem(#GADGET_ProjectPanel, InsertIndex, Filename,ドル ImageID, NewLevel)SetGadgetItemData(#GADGET_ProjectPanel, InsertIndex, *File)EndIfEndIfEndProcedure; Get the full path from a panel itemProcedure.s ProjectPanel_FullPath(Index)*File.ProjectFile = GetGadgetItemData(#GADGET_ProjectPanel, Index)Select *FileCase #ProjectPanel_DirectoryParentLevel = GetGadgetItemAttribute(#GADGET_ProjectPanel, Index, #PB_Tree_SubLevel)-1ParentIndex = Index-1While ParentIndex > 0 And ParentLevel < GetGadgetItemAttribute(#GADGET_ProjectPanel, ParentIndex, #PB_Tree_SubLevel)ParentIndex - 1WendProcedureReturn ProjectPanel_FullPath(ParentIndex) + GetGadgetItemText(#GADGET_ProjectPanel, Index) + #SeparatorCase #ProjectPanel_InternalBaseProcedureReturn GetPathPart(ProjectFile$)Case #ProjectPanel_ExternalBaseProcedureReturn ""Default ; its a ProjectFile structureProcedureReturn *File\Filename$EndSelectEndProcedureProcedure ProjectPanel_InBasePath(Base,ドル Filename$)If Len(Base$) < Len(Filename$) And CompareMemoryString(@Base,ドル @Filename,ドル #PATH_CaseInsensitive, Len(Base$)) = #PB_String_EqualProcedureReturn #TrueElseProcedureReturn #FalseEndIfEndProcedureProcedure ProjectPanel_IsFile(*File.ProjectFile)If *File = 0 Or *File = #ProjectPanel_Directory Or *File = #ProjectPanel_InternalBase Or *File = #ProjectPanel_ExternalBaseProcedureReturn #FalseElseProcedureReturn #TrueEndIfEndProcedureProcedure StoreProjectPanelStates()If ProjectPanelVisible; This is needed to ensures consistency (project files could have been removed) as we used raw pointers in list item user data.UpdateProjectPanel();; Each file stores the states expanded states of all its parent directories; This stores some redundant information (common directories are stored with multiple files), but; this way we can always reconstruct the visibility even if files are removed from the tree or added;State$ = ""Count = CountGadgetItems(#GADGET_ProjectPanel)Level = 0For i = 0 To Count-1NewLevel = GetGadgetItemAttribute(#GADGET_ProjectPanel, i, #PB_Tree_SubLevel)If NewLevel > Level; entered a directory (one level deeper at a time) ("i" must be > 0 now)If GetGadgetItemState(#GADGET_ProjectPanel, i-1) & #PB_Tree_ExpandedState$ + "+" ; openElseState$ + "-" ; closedEndIfElseIf NewLevel < Level; left a directory (can be many levels at a time here), cut the states of the left directoriesState$ = Left(State,ドル NewLevel)EndIfLevel = NewLevel*File.ProjectFile = GetGadgetItemData(#GADGET_ProjectPanel, i)If ProjectPanel_IsFile(*File)*File\PanelState$ = State$EndIfNext iEndIfEndProcedureProcedure UpdateProjectPanel()If ProjectPanelVisibleIf IsProjectBase$ = GetPathPart(ProjectFile$)BaseLength = Len(Base$); Find the "internal" base item;BaseIndex = -1BaseNew = 0last = CountGadgetItems(#GADGET_ProjectPanel)-1For i = 0 To lastIf GetGadgetItemData(#GADGET_ProjectPanel, i) = #ProjectPanel_InternalBaseBaseIndex = iBreakEndIfNext i; Add any "internal" files that are not displayed yet;ForEach ProjectFiles()If ProjectFiles()\ShowPanel And ProjectPanel_InBasePath(Base,ドル ProjectFiles()\FileName$)found = 0last = CountGadgetItems(#GADGET_ProjectPanel)-1For i = 0 To lastIf GetGadgetItemData(#GADGET_ProjectPanel, i) = @ProjectFiles(); update the image in case the AutoScan setting was changedIf ProjectFiles()\AutoScanIf IsImage(#IMAGE_ProjectPanel_FileScanned)SetGadgetItemImage(#GADGET_ProjectPanel, i, ImageID(#IMAGE_ProjectPanel_FileScanned))EndIfElseIf IsImage(#IMAGE_ProjectPanel_File)SetGadgetItemImage(#GADGET_ProjectPanel, i, ImageID(#IMAGE_ProjectPanel_File))EndIfEndIffound = 1BreakEndIfNext iIf found = 0; Add the base item if not present yet;If BaseIndex = -1AddGadgetItem(#GADGET_ProjectPanel, 0, Language("Project","InternalFiles"), OptionalImageID(#IMAGE_ProjectPanel_InternalFiles), 0)SetGadgetItemData(#GADGET_ProjectPanel, 0, #ProjectPanel_InternalBase)BaseIndex = 0BaseNew = 1BaseState$ = Left(ProjectFiles()\PanelState,ドル 1)EndIfProjectPanel_AddFile(Right(ProjectFiles()\Filename,ドル Len(ProjectFiles()\Filename$)-BaseLength), BaseIndex, @ProjectFiles())EndIfEndIfNext ProjectFiles()If BaseNew And BaseState$ <> "-" ; expanded is the default if no state info availableSetGadgetItemState(#GADGET_ProjectPanel, BaseIndex, #PB_Tree_Expanded)EndIf; Find the "external" base item;BaseIndex = -1BaseNew = 0last = CountGadgetItems(#GADGET_ProjectPanel)-1For i = 0 To lastIf GetGadgetItemData(#GADGET_ProjectPanel, i) = #ProjectPanel_ExternalBaseBaseIndex = iBreakEndIfNext i; Add any external items that are not displayed yet;ForEach ProjectFiles()If ProjectFiles()\ShowPanel And ProjectPanel_InBasePath(Base,ドル ProjectFiles()\FileName$) = #Falsefound = 0last = CountGadgetItems(#GADGET_ProjectPanel)-1For i = 0 To lastIf GetGadgetItemData(#GADGET_ProjectPanel, i) = @ProjectFiles(); update the image in case the AutoScan setting was changedIf ProjectFiles()\AutoScanIf IsImage(#IMAGE_ProjectPanel_FileScanned)SetGadgetItemImage(#GADGET_ProjectPanel, i, ImageID(#IMAGE_ProjectPanel_FileScanned))EndIfElseIf IsImage(#IMAGE_ProjectPanel_File)SetGadgetItemImage(#GADGET_ProjectPanel, i, ImageID(#IMAGE_ProjectPanel_File))EndIfEndIffound = 1BreakEndIfNext iIf found = 0; Now add the Base if not present yet;If BaseIndex = -1BaseIndex = CountGadgetItems(#GADGET_ProjectPanel)AddGadgetItem(#GADGET_ProjectPanel, BaseIndex, Language("Project","ExternalFiles"), OptionalImageID(#IMAGE_ProjectPanel_ExternalFiles), 0)SetGadgetItemData(#GADGET_ProjectPanel, BaseIndex, #ProjectPanel_ExternalBase)BaseNew = 1BaseState$ = Left(ProjectFiles()\PanelState,ドル 1)EndIf; Now, make sure the directory is present (as one node);Directory$ = GetPathPart(ProjectFiles()\FileName$)If Right(Directory,ドル 1) = #SeparatorDirectory$ = Left(Directory,ドル Len(Directory$)-1)EndIfFoundIndex = -1InsertIndex = -1last = CountGadgetItems(#GADGET_ProjectPanel)-1For i = BaseIndex+1 To lastIf GetGadgetItemData(#GADGET_ProjectPanel, i) = #ProjectPanel_DirectorySelect CompareDirectories(Directory,ドル GetGadgetItemText(#GADGET_ProjectPanel, i))Case #PB_String_LowerInsertIndex = iBreakCase #PB_String_EqualFoundIndex = iBreakEndSelectEndIfNext i; if no index found yet, we must append at the endIf FoundIndex = -1 And InsertIndex = -1InsertIndex = CountGadgetItems(#GADGET_ProjectPanel)EndIfIf FoundIndex = -1FoundIndex = InsertIndexAddGadgetItem(#GADGET_ProjectPanel, FoundIndex, Directory,ドル OptionalImageID(#IMAGE_ProjectPanel_Directory), 1) ; always level 1SetGadgetItemData(#GADGET_ProjectPanel, FoundIndex, #ProjectPanel_Directory); add the fileProjectPanel_AddFile(GetFilePart(ProjectFiles()\FileName$), FoundIndex, @ProjectFiles()); apply the expand state of the added directory (its always at sublevel 1 here)If Mid(ProjectFiles()\PanelState,ドル 2, 1) <> "-"SetGadgetItemState(#GADGET_ProjectPanel, FoundIndex, #PB_Tree_Expanded)EndIfElse; add the fileProjectPanel_AddFile(GetFilePart(ProjectFiles()\FileName$), FoundIndex, @ProjectFiles())EndIfEndIfEndIfNext ProjectFiles()If BaseNew And BaseState$ <> "-" ; expanded is defaultSetGadgetItemState(#GADGET_ProjectPanel, BaseIndex, #PB_Tree_Expanded)EndIf; Remove any no longer present files; Do this after the adding, so we do not remove, then re-add subdirectories if not needed; Step backwards, so removing an item does not change the indexes of other items;For i = CountGadgetItems(#GADGET_ProjectPanel)-1 To 0 Step -1*File = GetGadgetItemData(#GADGET_ProjectPanel, i)If ProjectPanel_IsFile(*File)found = 0ForEach ProjectFiles()If *File = @ProjectFiles()found = 1BreakEndIfNext ProjectFiles()If found = 0ProjectPanel_RemoveFile(i); If we remove an item, it may remove its parents too, so we must check the indexCount = CountGadgetItems(#GADGET_ProjectPanel)If i > Count ; the next loop will decrease by 1 and it will be perfect theni = CountEndIfEndIfEndIfNext iElse; project was closedClearGadgetItems(#GADGET_ProjectPanel)EndIfEndIfEndProcedureProcedure ProjectPanel_CreateFunction(*Entry.ToolsPanelEntry); Note: The ProjectPanel menu is created in CreateIDEPopupMenu() as the ProjectInfo uses it too;TreeGadget(#GADGET_ProjectPanel, 0, 0, 0, 0)ProjectPanelVisible = #TrueIf *Entry\IsSeparateWindow = 0 Or NoIndependentToolsColors = 0ToolsPanel_ApplyColors(#GADGET_ProjectPanel)EndIfUpdateProjectPanel()EndProcedureProcedure ProjectPanel_DestroyFunction(*Entry.ToolsPanelEntry)StoreProjectPanelStates() ; store expanded statesFreeGadget(#GADGET_ProjectPanel)ProjectPanelVisible = #FalseEndProcedureProcedure ProjectPanel_ResizeHandler(*Entry.ToolsPanelEntry, PanelWidth, PanelHeight)If *Entry\IsSeparateWindowResizeGadget(#GADGET_ProjectPanel, 5, 5, PanelWidth-10, PanelHeight-10)ElseResizeGadget(#GADGET_ProjectPanel, 0, 0, PanelWidth, PanelHeight)EndIfEndProcedure; The Menu is re-used by the ProjectInfo file list; *Entry is 0 in this case;Procedure DisplayProjectPanelMenu(*Entry.ToolsPanelEntry, SourceGadget)ProjectPanelMenuGadget = SourceGadgetIndex = GetGadgetState(SourceGadget); The Add entry is always onIf Index = -1DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Open, #True)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_OpenViewer, #True)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_OpenExplorer, #True)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Rescan, #True)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Remove, #True)Else*File.ProjectFile = GetGadgetItemData(SourceGadget, Index)If ProjectPanel_IsFile(*File)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Open, #False)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_OpenViewer, #False)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_OpenExplorer, #False)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Remove, #False); In ProjectInfo mode, there is multiselect, so do not disable this item thenIf *Entry = 0 Or *File\AutoScanDisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Rescan, #False)ElseDisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Rescan, #True)EndIfElseDisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Open, #False)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_OpenViewer, #False)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Remove, #True)DisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_Rescan, #False) ; can re-scan a full directoryIf *File = #ProjectPanel_ExternalBaseDisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_OpenExplorer, #True)ElseDisableMenuItem(#POPUPMENU_ProjectPanel, #MENU_ProjectPanel_OpenExplorer, #False)EndIfEndIfEndIfIf *Entry And *Entry\IsSeparateWindowDisplayPopupMenu(#POPUPMENU_ProjectPanel, WindowID(*Entry\ToolWindowID))ElseDisplayPopupMenu(#POPUPMENU_ProjectPanel, WindowID(#WINDOW_Main))EndIfEndProcedureProcedure ProjectPanelMenuEvent(MenuItemID); Make a list of all files that are selected with this entry (subitems); This handler is only called with real menu events, so there is no slowdown here; (unlike the ProjectPanel_EventHandler() which gets called with other gadget events);Protected NewList *Files.ProjectFile()SelectedFolder$ = ""Index = GetGadgetState(ProjectPanelMenuGadget)If Index <> -1If ProjectPanelMenuGadget = #GADGET_ProjectPanel; ProjectPanel mode (its a tree gadget)*File.ProjectFile = GetGadgetItemData(ProjectPanelMenuGadget, Index)If ProjectPanel_IsFile(*File)AddElement(*Files())*Files() = *FileSelectedFolder$ = GetPathPart(*File\FileName$)ElseSelectedFolder$ = ProjectPanel_FullPath(Index)Sublevel = GetGadgetItemAttribute(ProjectPanelMenuGadget, Index, #PB_Tree_SubLevel)Count = CountGadgetItems(ProjectPanelMenuGadget)Index + 1While Index < Count And GetGadgetItemAttribute(ProjectPanelMenuGadget, Index, #PB_Tree_SubLevel) > Sublevel*File = GetGadgetItemData(ProjectPanelMenuGadget, Index)If ProjectPanel_IsFile(*File)AddElement(*Files())*Files() = *FileEndIfIndex + 1WendEndIfElse; ProjectInfo mode (its a multiselect ListIcon)Last = CountGadgetItems(ProjectPanelMenuGadget) - 1For i = 0 To LastIf GetGadgetItemState(ProjectPanelMenuGadget, i) & #PB_ListIcon_SelectedAddElement(*Files())*Files() = GetGadgetItemData(ProjectPanelMenuGadget, i) ; stores the ProjectFile pointer; The option applies only to the first file hereIf SelectedFolder$ = ""SelectedFolder$ = GetPathPart(*Files()\Filename$)EndIfEndIfNext iEndIfEndIfSelect MenuItemIDCase #MENU_ProjectPanel_OpenForEach *Files()LoadSourceFile(*Files()\FileName$)Next *Files()Case #MENU_ProjectPanel_OpenViewerForEach *Files()FileViewer_OpenFile(*Files()\FileName$)Next *Files()Case #MENU_ProjectPanel_OpenExplorerIf SelectedFolder$ShowExplorerDirectory(SelectedFolder$)EndIfCase #MENU_ProjectPanel_RescanForEach *Files()If *Files()\AutoScan And *Files()\Source = 0 ; no need to re-scan if currently openScanFile(*Files()\Filename,ドル @*Files()\Parser)EndIfNext *Files()Case #MENU_ProjectPanel_AddFileName$ = OpenFileRequester(Language("FileStuff","OpenFileTitle"), GetPathPart(ProjectFile$), Language("FileStuff","Pattern"), SelectedFilePattern, #PB_Requester_MultiSelection)If FileName$ <> ""SelectedFilePattern = SelectedFilePattern()While FileName$ <> ""found = 0ForEach ProjectFiles()If IsEqualFile(ProjectFiles()\FileName,ドル FileName$)found = 1BreakEndIfNext ProjectFiles()If found = 0Debug FileName$; If the file doesn't exist, ask to create it, to ease the integration; https://www.purebasic.fr/english/viewtopic.php?f=4&t=47521;If FileSize(FileName$) < 0If MessageRequester(Language("FileStuff","AddNewFileTitle"), LanguagePattern("FileStuff","AddNewFileQuestion", "%filename%", Filename$), #PB_MessageRequester_YesNo | #FLAG_Question) = #PB_MessageRequester_YesNewFile = CreateFile(#PB_Any, FileName$)If NewFileCloseFile(NewFile)ElseMessageRequester(Language("FileStuff","AddNewFileTitle"), LanguagePattern("FileStuff","AddNewFileError", "%filename%", Filename$), #PB_MessageRequester_Ok | #FLAG_Error)EndIfEndIfEndIfLastElement(ProjectFiles())AddElement(ProjectFiles())ProjectFiles()\FileName$ = FileName$ProjectFiles()\AutoLoad = 0ProjectFiles()\AutoScan = IsCodeFile(Filename$)ProjectFiles()\ShowPanel = 1ProjectFiles()\ShowWarning = 1UpdateProjectFile(@ProjectFiles())EndIfFileName$ = NextSelectedFileName()WendUpdateMenuStates()UpdateProjectInfo()UpdateProjectPanel()EndIfCase #MENU_ProjectPanel_RemoveIf ListSize(*Files()) <= 1 Or MessageRequester(#ProductName,ドル LanguagePattern("Project","RemoveMany", "%count%", Str(ListSize(*Files()))), #PB_MessageRequester_YesNo|#FLAG_Question) = #PB_MessageRequester_YesForEach *Files()If *Files()\SourceUnlinkSourceFromProject(*Files()\Source, #False)EndIfClearProjectFile(*Files())ChangeCurrentElement(ProjectFiles(), *Files())DeleteElement(ProjectFiles())Next *Files()UpdateMenuStates() ; reflect the changed settingsUpdateProjectInfo()UpdateProjectPanel()EndIfEndSelectEndProcedureProcedure ProjectPanel_EventHandler(*Entry.ToolsPanelEntry, EventGadgetID)If EventGadgetID = #GADGET_ProjectPanelIndex = GetGadgetState(#GADGET_ProjectPanel)Select EventType()Case #PB_EventType_DragStartIf Index <> -1*File.ProjectFile = GetGadgetItemData(#GADGET_ProjectPanel, Index)If ProjectPanel_IsFile(*File); its a single fileDragFiles(*File\FileName$)ElseIf *File = #ProjectPanel_Directory; its a directoryFiles$ = ""Sublevel = GetGadgetItemAttribute(#GADGET_ProjectPanel, Index, #PB_Tree_SubLevel)Count = CountGadgetItems(#GADGET_ProjectPanel)Index + 1While Index < Count And GetGadgetItemAttribute(#GADGET_ProjectPanel, Index, #PB_Tree_SubLevel) > Sublevel*File = GetGadgetItemData(#GADGET_ProjectPanel, Index)If ProjectPanel_IsFile(*File)Files$ + *File\FileName$ + Chr(10)EndIfIndex + 1WendIf Files$ <> ""DragFiles(Left(Files,ドル Len(Files$)-1)) ; cut the last Chr(10)EndIfEndIfEndIfCase #PB_EventType_LeftDoubleClickIf Index <> -1*File.ProjectFile = GetGadgetItemData(#GADGET_ProjectPanel, Index)If ProjectPanel_IsFile(*File)LoadSourceFile(*File\FileName$) ; will just switch if openEndIfEndIfCase #PB_EventType_RightClickDisplayProjectPanelMenu(*Entry, #GADGET_ProjectPanel)EndSelectEndIfEndProcedure;- Initialisation code; This will make this Tool available to the editor;ProjectPanel_VT.ToolsPanelFunctionsProjectPanel_VT\CreateFunction = @ProjectPanel_CreateFunction()ProjectPanel_VT\DestroyFunction = @ProjectPanel_DestroyFunction()ProjectPanel_VT\ResizeHandler = @ProjectPanel_ResizeHandler()ProjectPanel_VT\EventHandler = @ProjectPanel_EventHandler()AddElement(AvailablePanelTools())AvailablePanelTools()\FunctionsVT = @ProjectPanel_VTAvailablePanelTools()\NeedPreferences = 0AvailablePanelTools()\NeedConfiguration = 0AvailablePanelTools()\NeedDestroyFunction = 1AvailablePanelTools()\ToolID$ = "ProjectPanel"AvailablePanelTools()\PanelTitle$ = "ProjectPanelShort"AvailablePanelTools()\ToolName$ = "ProjectPanelLong"AvailablePanelTools()\PanelTabOrder = 2
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。