I can't vouch for the latest version of TextPad because I haven't tried it. However Textpad v5.4.2 has a persistent folder/file tree. View > explorer.
Notepad++ has a plugin called Light Explorer that does Tree View with files. To Install:
- Download Notepad++
- Plugins > Plugin Manager > Show Plugin Manager > Available > Light Explorer
- After this it will add a folder looking shortcut in the top toolbar
You can also run Light Explorer in its own instance separate from another notepad++ install. It will take a separate space in the taskbar which is nice. See Below:
- Download notepad++ v5.7: https://notepad-plus-plus.org/download/v5.7.html (.zip file)
- Download LightExplorer.dll (UNICODE) {I used v2.0Unicode}: https://sourceforge.net/projects/npp-plugins/files/LightExplorer/
- copy/paste into plugins directory.
- Open notepad++ Plugins > Light Explorer > Light Explorer
- Full screen Light Explorer
- Create Shortcut from notepad++.exe
- Change icon of shortcut to a Folder Icon in order to show up differently in the taskbar. There are folder icons in: C:\Windows\System32\shell32.dll
Here is an Autoit snippet from Yashied: https://www.autoitscript.com/forum/topic/124430-display-on-the-fly-a-directory-tree-in-a-treeview/
#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUITreeView.au3>
#Include <TreeViewConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global $hForm, $hTreeView, $hImageList, $hItem, $hNext, $hSelect = 0, $hInput, $Input, $Dummy1, $Dummy2
Global $X, $Y, $sPath, $sRoot = @HomeDrive
$hForm = GUICreate('MyGUI', 600, 600)
$Input = GUICtrlCreateInput('', 20, 20, 560, 19)
$hInput = GUICtrlGetHandle(-1)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateTreeView(20, 50, 560, 530, -1, $WS_EX_CLIENTEDGE)
$hTreeView = GUICtrlGetHandle(-1)
$Dummy1 = GUICtrlCreateDummy()
$Dummy2 = GUICtrlCreateDummy()
If _WinAPI_GetVersion() >= '6.0' Then
_WinAPI_SetWindowTheme($hTreeView, 'Explorer')
EndIf
$hImageList = _GUIImageList_Create(16, 16, 5, 1)
_GUIImageList_AddIcon($hImageList, @SystemDir & '\shell32.dll', 3)
_GUIImageList_AddIcon($hImageList, @SystemDir & '\shell32.dll', 4)
_GUICtrlTreeView_SetNormalImageList($hTreeView, $hImageList)
$sRoot = StringRegExpReplace($sRoot, '\\+\Z', '')
$sPath = StringRegExpReplace($sRoot, '^.*\\', '')
If StringInStr($sPath, ':') Then
$sRoot &= '\'
$sPath &= '\'
EndIf
;_GUICtrlTreeView_BeginUpdate($hTreeView)
_TVUpdate($hTreeView, _GUICtrlTreeView_AddChild($hTreeView, 0, $sPath, 0, 0))
;_GUICtrlTreeView_EndUpdate($hTreeView)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()
_GUICtrlTreeView_Expand($hTreeView, _GUICtrlTreeView_GetFirstItem($hTreeView))
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Dummy1 ; Update
GUISetCursor(1, 1)
$hItem = _GUICtrlTreeView_GetFirstChild($hTreeView, GUICtrlRead($Dummy1))
If $hItem Then
While $hItem
$hNext = _GUICtrlTreeView_GetNextSibling($hTreeView, $hItem)
If Not _TVUpdate($hTreeView, $hItem) Then
_GUICtrlTreeView_Delete($hTreeView, $hItem)
EndIf
$hItem = $hNext
WEnd
_WinAPI_RedrawWindow($hTreeView)
EndIf
GUISetCursor(2, 0)
Case $Dummy2 ; Menu
$hItem = GUICtrlRead($Dummy2)
$sPath = _TVGetPath($hTreeView, $hItem, $sRoot)
ConsoleWrite('-------------------------------' & @CR)
ConsoleWrite('Handle: ' & $hItem & @CR)
ConsoleWrite('Path: ' & $sPath & @CR)
If _WinAPI_PathIsDirectory($sPath) Then
ConsoleWrite('Type: ' & 'Directory' & @CR)
Else
ConsoleWrite('Type: ' & 'File' & @CR)
EndIf
ConsoleWrite('X: ' & MouseGetPos(0) & @CR)
ConsoleWrite('Y: ' & MouseGetPos(1) & @CR)
ConsoleWrite('-------------------------------' & @CR)
EndSwitch
WEnd
Func _TVGetPath($hTV, $hItem, $sRoot)
Local $Path = StringRegExpReplace(_GUICtrlTreeView_GetTree($hTV, $hItem), '([|]+)|(\\[|])', '\\')
If Not $Path Then
Return ''
EndIf
If Not StringInStr($Path, ':') Then
Return StringRegExpReplace($sRoot, '(\\[^\\]*(\\|)+)\Z', '\\') & $Path
EndIf
Return $Path
EndFunc ;==>_TVGetPath
Func _TVSetPath($hTV, $hItem, $sRoot)
GUICtrlSetData($Input, _WinAPI_PathCompactPath($hInput, _TVGetPath($hTV, $hItem, $sRoot), 554))
$hSelect = $hItem
EndFunc ;==>_TVSetPath
Func _TVUpdate($hTV, $hItem)
Local $hImageList = _SendMessage($hTV, $TVM_GETIMAGELIST)
Local $Path = StringRegExpReplace(_TVGetPath($hTV, $hItem, $sRoot), '\\+\Z', '')
Local $hSearch, $hIcon, $Index, $File
$hSearch = FileFindFirstFile($Path & '\*')
If $hSearch = -1 Then
If Not @error Then
If FileExists($Path) Then
; If _WinAPI_PathIsDirectory($Path) Then
; ; Access denied
; EndIf
Else
Return 0
EndIf
EndIf
Else
While 1
$File = FileFindNextFile($hSearch)
If @error Then
ExitLoop
EndIf
If @extended Then
_GUICtrlTreeView_AddChild($hTV, $hItem, $File, 0, 0)
EndIf
WEnd
FileClose($hSearch)
EndIf
$hSearch = FileFindFirstFile($Path & '\*')
If $hSearch = -1 Then
Else
While 1
$File = FileFindNextFile($hSearch)
If @error Then
ExitLoop
EndIf
If Not @extended Then
$hIcon = _WinAPI_ShellExtractAssociatedIcon($Path & '\' & $File, 1)
$Index = _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon)
_GUICtrlTreeView_AddChild($hTV, $hItem, $File, $Index, $Index)
_WinAPI_DestroyIcon($hIcon)
EndIf
WEnd
FileClose($hSearch)
EndIf
Return 1
EndFunc ;==>_TVUpdate
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW, $lParam)
Local $hItem = DllStructGetData($tNMTREEVIEW, 'NewhItem')
Local $iState = DllStructGetData($tNMTREEVIEW, 'NewState')
Local $hTV = DllStructGetData($tNMTREEVIEW, 'hWndFrom')
Local $ID = DllStructGetData($tNMTREEVIEW, 'Code')
Local $tTVHTI, $tPoint
Switch $hTV
Case $hTreeView
Switch $ID
Case $TVN_ITEMEXPANDEDW
If Not FileExists(_TVGetPath($hTV, $hItem, $sRoot)) Then
_GUICtrlTreeView_Delete($hTV, $hItem)
If BitAND($iState, $TVIS_SELECTED) Then
_TVSetPath($hTV, _GUICtrlTreeView_GetSelection($hTV), $sRoot)
EndIf
Else
If Not BitAND($iState, $TVIS_EXPANDED) Then
_GUICtrlTreeView_SetSelectedImageIndex($hTV, $hItem, 0)
_GUICtrlTreeView_SetImageIndex($hTV, $hItem, 0)
Else
_GUICtrlTreeView_SetSelectedImageIndex($hTV, $hItem, 1)
_GUICtrlTreeView_SetImageIndex($hTV, $hItem, 1)
If Not _GUICtrlTreeView_GetItemParam($hTV, $hItem) Then
_GUICtrlTreeView_SetItemParam($hTV, $hItem, 0x7FFFFFFF)
GUICtrlSendToDummy($Dummy1, $hItem)
EndIf
EndIf
EndIf
Case $TVN_SELCHANGEDW
If BitAND($iState, $TVIS_SELECTED) Then
If Not FileExists(_TVGetPath($hTV, $hItem, $sRoot)) Then
_GUICtrlTreeView_Delete($hTV, $hItem)
$hItem = _GUICtrlTreeView_GetSelection($hTV)
EndIf
If $hItem <> $hSelect Then
_TVSetPath($hTV, $hItem, $sRoot)
EndIf
EndIf
Case $NM_RCLICK
$tPoint = _WinAPI_GetMousePos(1, $hTV)
$tTVHTI = _GUICtrlTreeView_HitTestEx($hTV, DllStructGetData($tPoint, 1), DllStructGetData($tPoint, 2))
$hItem = DllStructGetData($tTVHTI, 'Item')
If BitAND(DllStructGetData($tTVHTI, 'Flags'), $TVHT_ONITEM) Then
_GUICtrlTreeView_SelectItem($hTreeView, $hItem)
If Not FileExists(_TVGetPath($hTV, $hItem, $sRoot)) Then
_GUICtrlTreeView_Delete($hTV, $hItem)
$hItem = _GUICtrlTreeView_GetSelection($hTV)
Else
GUICtrlSendToDummy($Dummy2, $hItem)
EndIf
If $hItem <> $hSelect Then
_TVSetPath($hTV, $hItem, $sRoot)
EndIf
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
The above snippet has the correct icons for each file. It isnt as fast as the snippet below. No drag N drop features. But they could definitely be added.
Heres another Autoit snippet from spudw2k: https://www.autoitscript.com/forum/topic/80327-filebrowser-with-treeview/?do=findComment&comment=580714
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiTreeView.au3>
#Include <File.au3>
$gui = GUICreate("File Browser", 362, 378, -1, -1)
$tree = GUICtrlCreateTreeView(0, 0, 361, 377)
GUICtrlSetFont(-1,10)
GUICtrlSetColor($tree, 0x00FF00)
GUICtrlSetBkColor($tree,0x000000)
$hImage = _GUIImageList_Create(16, 16, 5, 2)
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 4)
_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 54)
_GUICtrlTreeView_SetNormalImageList($tree, $hImage)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
$root = _GUICtrlTreeView_AddChild($tree,"","C:",0)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
If $msg= -3 Then ExitLoop
WEnd
Func _SearchFolder($folder,$parent,$level=0)
If $level >= 1 Then Return
$files = _FileListToArray($folder,"*",1)
$folders = _FileListToArray($folder,"*",2)
_FolderFunc($folders,$folder,$parent,$level)
_FileFunc($files,$parent)
EndFunc
Func _FileFunc($files,$parent)
For $i = 1 To UBound($files)-1
_GUICtrlTreeView_AddChild($tree,$parent,$files[$i],1,1)
Next
EndFunc
Func _FolderFunc($folders,$folder,$parent,$level)
For $i = 1 To UBound($folders)-1
$parentitem = _GUICtrlTreeView_AddChild($tree,$parent,$folders[$i],0)
_SearchFolder($folder & "\" & $folders[$i],$parentitem,$level+1)
Next
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
$hWndTreeView = GUICtrlGetHandle($tree)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndTreeView
Switch $iCode
Case -451
$item = _GUICtrlTreeView_GetSelection($hWndTreeView)
$root = $item
If _GUICtrlTreeView_GetChildCount($hWndTreeView,$item) <= 0 Then
$txt = _GUICtrlTreeView_GetText($hWndTreeView,$item)
Do
$parent = _GUICtrlTreeView_GetParentHandle($hWndTreeView,$item)
If $parent <> 0 Then
$txt = _GUICtrlTreeView_GetText($hWndTreeView,$parent) & "\" & $txt
$item = $parent
EndIf
Until $parent = 0
_SearchFolder($txt,$root)
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
The above snippet doesn't have the correct icons for each file, but is surprisingly fast. No Drag N drop.
Here is .NET source code that does exactly what your asking. All you would have to do is modify to suite your needs:
https://code.msdn.microsoft.com/windowsapps/File-System-Tree-View-3a28325c
For those who don't have the ability to modify the source, I have taken the above source code, made slight modifications, and compiled the executable. Here it is:
https://www.dropbox.com/s/xb4f3skrcs20om4/ExplorerTreee.zip?dl=1
Alternatively, there is a program called QTTabBar that can do this in the form of context menus:
There are two version of this program though. 1038 has a sorry
install package, but is feature packed and awesome. 1.5.0.0 Beta 2 has an awesome install package but is not as awesome and doesn't have as many features.
Awesome version 1038
Awesome version 1038 plugins
Awesome version 1038 plugins source
Good installer version 1.5.0.0 Beta 2
Good installer version 1.5.0.0 Beta 2 all files
Good installer version 1.5.0.0 Beta 2 source code
You could probably make a plugin for the awesome version 1038 that would have a persistent Tree View w/files.
You could modify the source code of the Good installer version 1.5.0.0 Beta 2 to get the persistent Tree View w/files.
Sometimes the awesome version installs on some PCs just fine. I have had trouble installing the awesome version in the past, and what I have done to fix it is install the version that has the awesome installer.
Best Answer
The preview pane of Explorer should have been already at the bottom, and it's unclear why it is showing on the right, so I hope that we are discussing the same subject.
If you want to change its placement, see this article:
How to Move / Show Details Pane At Top in Windows Vista and 7 Explorer?
This uses Resource Hacker to edit the system file "%windir%\System32\shell32.dll". This is a crucial system file required for the correct functioning of Windows, so make sure you have some means of recovering from a disastrous error, such as a recovery boot CD, and ensure that your backups are up to date.
As regarding the Preview Pane (or Reading Pane), I did find in shell32.dll two occurences of text that contained both the words
ReadingPane
andlayoutpos="right"
. I changed "right" to "bottom", but haven't managed to replace shell32.dll. Maybe you can try it in Safe Mode.