├── .editorconfig ├── .github └── workflows │ └── codeql-analysis.yml ├── .gitignore ├── Debug ├── TE32.exe ├── TE64.exe ├── addons │ ├── aboutblank │ │ ├── config.xml │ │ ├── script.js │ │ └── sync.js │ ├── addressbar │ │ ├── config.xml │ │ ├── options.html │ │ ├── script.js │ │ └── sync.js │ ├── back │ │ ├── config.xml │ │ └── script.js │ ├── download │ │ ├── config.xml │ │ ├── options.html │ │ ├── script.js │ │ └── sync.js │ ├── extract │ │ ├── config.xml │ │ ├── options.html │ │ ├── options.js │ │ ├── script.js │ │ └── sync.js │ ├── filterbar │ │ ├── config.xml │ │ └── script.js │ ├── forward │ │ ├── config.xml │ │ └── script.js │ ├── key │ │ ├── config.xml │ │ ├── options.html │ │ ├── options.js │ │ ├── script.js │ │ └── sync.js │ ├── mainmenu │ │ ├── config.xml │ │ ├── script.js │ │ └── sync.js │ ├── mouse │ │ ├── config.xml │ │ ├── options.html │ │ ├── options.js │ │ ├── script.js │ │ └── sync.js │ ├── multiprocess │ │ ├── config.xml │ │ ├── options.html │ │ ├── script.js │ │ ├── sync.js │ │ └── worker.js │ ├── remember │ │ ├── config.xml │ │ ├── options.html │ │ ├── script.js │ │ └── sync.js │ ├── segoeicons │ │ ├── config.xml │ │ ├── script.js │ │ └── sync.js │ ├── tabplus │ │ ├── config.xml │ │ ├── options.html │ │ ├── options.js │ │ ├── script.js │ │ └── sync.js │ ├── titlebar │ │ ├── config.xml │ │ └── script.js │ ├── toolbar │ │ ├── config.xml │ │ ├── options.html │ │ ├── options.js │ │ ├── script.js │ │ └── sync.js │ ├── treeview │ │ ├── config.xml │ │ ├── options.html │ │ ├── script.js │ │ └── sync.js │ ├── undoclosetab │ │ ├── config.xml │ │ ├── lang │ │ │ ├── ja.xml │ │ │ ├── zh.xml │ │ │ └── zh_cn.xml │ │ ├── script.js │ │ └── sync.js │ └── up │ │ ├── config.xml │ │ └── script.js ├── init │ ├── addons.xml │ ├── key.xml │ ├── menus.xml │ └── mouse.xml ├── lang │ ├── cs.xml │ ├── de.xml │ ├── el.xml │ ├── en.xml │ ├── es.xml │ ├── es_la.xml │ ├── fr.xml │ ├── it.xml │ ├── ja.xml │ ├── ko.xml │ ├── nl.xml │ ├── pl.xml │ ├── pt.xml │ ├── ru.xml │ ├── sr_lat.xml │ ├── tr.xml │ ├── uk.xml │ ├── zh.xml │ └── zh_cn.xml ├── layout │ ├── 1tab.xml │ ├── 4tabs.xml │ ├── bottom_tab.xml │ ├── h2tabs.xml │ ├── left_tab.xml │ ├── right_tab.xml │ ├── tree_1tab.xml │ ├── tree_2tabs.xml │ ├── v2tabs.xml │ └── vertical_tab.xml ├── lib │ ├── te32.dll │ ├── te64.dll │ ├── tewv32.dll │ └── tewv64.dll ├── readme.txt ├── readme_jp.txt ├── readme_ko.txt └── script │ ├── background.js │ ├── common.js │ ├── consts.js │ ├── dialog.html │ ├── index.css │ ├── index.html │ ├── index.js │ ├── location.html │ ├── options.css │ ├── options.html │ ├── options.js │ ├── sync.js │ ├── sync1.js │ ├── syncb.js │ ├── threads.js │ ├── ui.js │ └── update.js ├── LICENSE.TXT ├── TE.sln ├── TE ├── Resource.h ├── TE.cpp ├── TE.h ├── TE.manifest ├── TE.rc ├── TE.vcproj ├── TE.vcxproj ├── TE.vcxproj.filters ├── api.cpp ├── api.h ├── common.cpp ├── common.h ├── darkmode.cpp ├── darkmode.h ├── exe.cpp ├── objects.cpp ├── objects.h ├── stdafx.cpp ├── stdafx.h ├── targetver.h ├── te.ico ├── te16.png ├── te32.png └── te48.png ├── TE_VC2008.sln ├── TE_VC2010.sln ├── del.bat └── readme.txt /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{cpp,h,js,vbs}] 2 | indent_style = tab 3 | end_of_line = crlf 4 | charset = utf-8 5 | trim_trailing_whitespace = true 6 | insert_final_newline = true 7 | indent_size = 4 8 | 9 | [*.{html,css,xml}] 10 | indent_style = space 11 | end_of_line = crlf 12 | charset = utf-8 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '24 12 * * 0' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'cpp', 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v2 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v1 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 52 | 53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 54 | # If this step fails, then you should remove it and run the build manually (see below) 55 | - name: Autobuild 56 | uses: github/codeql-action/autobuild@v1 57 | 58 | # ℹ️ Command-line programs to run using the OS shell. 59 | # 📚 https://git.io/JvXDl 60 | 61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 62 | # and modify them (or add more) to build your code if your project 63 | # uses a compiled language 64 | 65 | #- run: | 66 | # make bootstrap 67 | # make release 68 | 69 | - name: Perform CodeQL Analysis 70 | uses: github/codeql-action/analyze@v1 71 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | 46 | [Rr]elease/ 47 | x64/ 48 | build/ 49 | [Bb]in/ 50 | [Oo]bj/ 51 | 52 | # Debug folder 53 | [Dd]ebug/config/ 54 | #*.exe 55 | 56 | # MSTest test Results 57 | [Tt]est[Rr]esult*/ 58 | [Bb]uild[Ll]og.* 59 | 60 | *_i.c 61 | *_p.c 62 | *.ilk 63 | *.meta 64 | *.obj 65 | *.pch 66 | *.pdb 67 | *.pgc 68 | *.pgd 69 | *.rsp 70 | *.sbr 71 | *.tlb 72 | *.tli 73 | *.tlh 74 | *.tmp 75 | *.tmp_proj 76 | *.log 77 | *.vspscc 78 | *.vssscc 79 | .builds 80 | *.pidb 81 | *.log 82 | *.scc 83 | 84 | # Visual C++ cache files 85 | ipch/ 86 | *.aps 87 | *.ncb 88 | *.opensdf 89 | *.sdf 90 | *.cachefile 91 | 92 | # Visual Studio profiler 93 | *.psess 94 | *.vsp 95 | *.vspx 96 | 97 | # Guidance Automation Toolkit 98 | *.gpState 99 | 100 | # ReSharper is a .NET coding add-in 101 | _ReSharper*/ 102 | *.[Rr]e[Ss]harper 103 | 104 | # TeamCity is a build add-in 105 | _TeamCity* 106 | 107 | # DotCover is a Code Coverage Tool 108 | *.dotCover 109 | 110 | # NCrunch 111 | *.ncrunch* 112 | .*crunch*.local.xml 113 | 114 | # Installshield output folder 115 | [Ee]xpress/ 116 | 117 | # DocProject is a documentation generator add-in 118 | DocProject/buildhelp/ 119 | DocProject/Help/*.HxT 120 | DocProject/Help/*.HxC 121 | DocProject/Help/*.hhc 122 | DocProject/Help/*.hhk 123 | DocProject/Help/*.hhp 124 | DocProject/Help/Html2 125 | DocProject/Help/html 126 | 127 | # Click-Once directory 128 | publish/ 129 | 130 | # Publish Web Output 131 | *.Publish.xml 132 | *.pubxml 133 | 134 | # NuGet Packages Directory 135 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 136 | #packages/ 137 | 138 | # Windows Azure Build Output 139 | csx 140 | *.build.csdef 141 | 142 | # Windows Store app package directory 143 | AppPackages/ 144 | 145 | # Others 146 | sql/ 147 | *.Cache 148 | ClientBin/ 149 | [Ss]tyle[Cc]op.* 150 | ~$* 151 | *~ 152 | *.dbmdl 153 | *.[Pp]ublish.xml 154 | *.pfx 155 | *.publishsettings 156 | 157 | # RIA/Silverlight projects 158 | Generated_Code/ 159 | 160 | # Backup & report files from converting an old project file to a newer 161 | # Visual Studio version. Backup files are not needed, because we have git ;-) 162 | _UpgradeReport_Files/ 163 | Backup*/ 164 | UpgradeLog*.XML 165 | UpgradeLog*.htm 166 | 167 | # SQL Server files 168 | App_Data/*.mdf 169 | App_Data/*.ldf 170 | 171 | ############# 172 | ## Windows detritus 173 | ############# 174 | 175 | # Windows image file caches 176 | Thumbs.db 177 | ehthumbs.db 178 | 179 | # Folder config file 180 | Desktop.ini 181 | 182 | # Recycle Bin used on file shares 183 | $RECYCLE.BIN/ 184 | 185 | # Mac crap 186 | .DS_Store 187 | 188 | 189 | ############# 190 | ## Python 191 | ############# 192 | 193 | *.py[co] 194 | 195 | # Packages 196 | *.egg 197 | *.egg-info 198 | dist/ 199 | build/ 200 | eggs/ 201 | parts/ 202 | var/ 203 | sdist/ 204 | develop-eggs/ 205 | .installed.cfg 206 | 207 | # Installer logs 208 | pip-log.txt 209 | 210 | # Unit test / coverage reports 211 | .coverage 212 | .tox 213 | 214 | #Translations 215 | *.mo 216 | 217 | #Mr Developer 218 | .mr.developer.cfg 219 | -------------------------------------------------------------------------------- /Debug/TE32.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/Debug/TE32.exe -------------------------------------------------------------------------------- /Debug/TE64.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/Debug/TE64.exe -------------------------------------------------------------------------------- /Debug/addons/aboutblank/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1.04 4 | 2022.1.25 5 | Thu, 27 Jan 2022 00:00:00 GMT 6 | 2 7 | Gaku 8 | https://tablacus.github.io/TablacusExplorerAddons/ 9 | MIT License 10 | 11 | 12 | Blank page 13 | Blank page 14 | 15 | 16 | Page blanche 17 | 18 | 19 | 空白ページ 20 | 21 | 22 | 起始分頁 23 | 24 | 25 | -------------------------------------------------------------------------------- /Debug/addons/aboutblank/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "aboutblank"; 2 | if (window.Addon == 1) { 3 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 4 | } 5 | -------------------------------------------------------------------------------- /Debug/addons/aboutblank/sync.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "aboutblank"; 2 | 3 | Sync.AboutBlank = { 4 | dir: [ssfDRIVES, "shell:downloads", ssfPERSONAL, "shell:my music", "shell:my pictures", "shell:my video"], 5 | 6 | IsHandle: function (Ctrl) { 7 | return SameText("string" === typeof Ctrl ? Ctrl : api.GetDisplayNameOf(Ctrl, SHGDN_FORADDRESSBAR | SHGDN_FORPARSING), "about:blank"); 8 | }, 9 | 10 | ProcessMenu: function (Ctrl, hMenu, nPos, Selected, item, ContextMenu) { 11 | const FV = GetFolderView(Ctrl); 12 | if (Sync.AboutBlank.IsHandle(FV)) { 13 | RemoveCommand(hMenu, ContextMenu, "delete;rename"); 14 | } 15 | return nPos; 16 | } 17 | } 18 | 19 | AddEvent("TranslatePath", function (Ctrl, Path) { 20 | if (Sync.AboutBlank.IsHandle(Path)) { 21 | Ctrl.Enum = function (pid, Ctrl, fncb) { 22 | const Items = api.CreateObject("FolderItems"); 23 | for (let i = 0; i < Sync.AboutBlank.dir.length; ++i) { 24 | Items.AddItem(Sync.AboutBlank.dir[i]); 25 | } 26 | for (const e = api.CreateObject("Enum", fso.Drives); !e.atEnd(); e.moveNext()) { 27 | Items.AddItem(e.item().Path); 28 | } 29 | return Items; 30 | }; 31 | return ssfRESULTSFOLDER; 32 | } 33 | }, true); 34 | 35 | AddEvent("GetTabName", function (Ctrl) { 36 | if (Sync.AboutBlank.IsHandle(Ctrl)) { 37 | return GetText("New tab"); 38 | } 39 | }, true); 40 | 41 | AddEvent("GetIconImage", function (Ctrl, clBk, bSimple) { 42 | if (Sync.AboutBlank.IsHandle(Ctrl)) { 43 | return MakeImgDataEx("folder:closed", bSimple, 16, clBk); 44 | } 45 | }); 46 | 47 | AddEvent("Context", Sync.AboutBlank.ProcessMenu); 48 | 49 | AddEvent("File", Sync.AboutBlank.ProcessMenu); 50 | 51 | AddEvent("Command", function (Ctrl, hwnd, msg, wParam, lParam) { 52 | if (Ctrl.Type == CTRL_SB || Ctrl.Type == CTRL_EB) { 53 | if (Sync.AboutBlank.IsHandle(Ctrl)) { 54 | if ((wParam & 0xfff) == CommandID_DELETE - 1) { 55 | return S_OK; 56 | } 57 | } 58 | } 59 | }, true); 60 | 61 | AddEvent("InvokeCommand", function (ContextMenu, fMask, hwnd, Verb, Parameters, Directory, nShow, dwHotKey, hIcon) { 62 | if (Verb == CommandID_DELETE - 1) { 63 | const FV = ContextMenu.FolderView; 64 | if (FV && Sync.AboutBlank.IsHandle(FV)) { 65 | return S_OK; 66 | } 67 | } 68 | }, true); 69 | 70 | AddEvent("BeginLabelEdit", function (Ctrl, Name) { 71 | if (Ctrl.Type <= CTRL_EB) { 72 | if (Sync.AboutBlank.IsHandle(Ctrl)) { 73 | return 1; 74 | } 75 | } 76 | }); 77 | 78 | -------------------------------------------------------------------------------- /Debug/addons/addressbar/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1.79 4 | 2025.5.9 5 | Fri, 09 May 2025 00:00:00 GMT 6 | Common:0,6,7,8,9:0 7 | 2 8 | Gaku 9 | https://tablacus.github.io/TablacusExplorerAddons/ 10 | MIT License 11 | 12 | 13 | Address bar 14 | Breadcrumbs and XP style is available. 15 | 16 | 17 | Barre d'adresse 18 | Les styles "XP" et "Fil d'Ariane" sont disponibles. 19 | 20 | 21 | アドレスバー 22 | パンくずリスト、XPスタイルが選べます。 23 | 24 | 25 | 位址列 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/addressbar/options.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 | 7 | -------------------------------------------------------------------------------- /Debug/addons/addressbar/sync.js: -------------------------------------------------------------------------------- 1 | Sync.AddressBar = { 2 | GetPath: function (n) { 3 | let FolderItem = 0; 4 | const FV = te.Ctrl(CTRL_FV); 5 | if (FV) { 6 | for (FolderItem = FV.FolderItem; n > 0; n--) { 7 | FolderItem = api.ILGetParent(FolderItem); 8 | } 9 | } 10 | return FolderItem; 11 | }, 12 | 13 | SplitPath: function (FolderItem) { 14 | const Items = []; 15 | let n = 0; 16 | do { 17 | Items.push({ 18 | next: n || api.GetAttributesOf(FolderItem, SFGAO_HASSUBFOLDER), 19 | name: GetFolderItemName(FolderItem) 20 | }); 21 | FolderItem = api.ILGetParent(FolderItem); 22 | n++; 23 | } while (!api.ILIsEmpty(FolderItem) && n < 99); 24 | return JSON.stringify(Items); 25 | } 26 | }; 27 | 28 | AddEvent("MouseMessage", function (Ctrl, hwnd, msg, mouseData, pt, wHitTestCode, dwExtraInfo) { 29 | if (msg == WM_MOUSEMOVE && Ctrl.Type == CTRL_TE && Common.AddressBar.rcItem) { 30 | const Ctrl2 = te.CtrlFromPoint(pt); 31 | if (Ctrl2 && Ctrl2.Type == CTRL_WB) { 32 | const ptc = pt.Clone(); 33 | api.ScreenToClient(WebBrowser.hwnd, ptc); 34 | for (let i = Common.AddressBar.rcItem.length; i-- > 0;) { 35 | if (PtInRect(Common.AddressBar.rcItem[i], ptc)) { 36 | api.PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); 37 | InvokeUI("Addons.AddressBar.ChangeMenu", i); 38 | break; 39 | } 40 | } 41 | } 42 | } 43 | }); 44 | 45 | AddEvent("DragEnter", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 46 | if (Ctrl.Type == CTRL_WB) { 47 | InvokeUI("Addons.AddressBar.SetRects"); 48 | return S_OK; 49 | } 50 | }); 51 | 52 | AddEvent("DragOver", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 53 | if (Ctrl.Type == CTRL_WB && dataObj.Count && Common.AddressBar.rcDrop) { 54 | const ptc = pt.Clone(); 55 | api.ScreenToClient(WebBrowser.hwnd, ptc); 56 | for (let i = Common.AddressBar.rcDrop.length; i-- > 0;) { 57 | if (PtInRect(Common.AddressBar.rcDrop[i], ptc)) { 58 | const Target = Sync.AddressBar.GetPath(i); 59 | if (!api.ILIsEqual(dataObj.Item(-1), Target)) { 60 | const DropTarget = api.DropTarget(Target); 61 | if (DropTarget) { 62 | MouseOver("addressbar" + i + "_"); 63 | return DropTarget.DragOver(dataObj, grfKeyState, pt, pdwEffect); 64 | } 65 | } 66 | pdwEffect[0] = DROPEFFECT_NONE; 67 | return S_OK; 68 | } 69 | } 70 | } 71 | }); 72 | 73 | AddEvent("Drop", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 74 | if (Ctrl.Type == CTRL_WB && dataObj.Count && Common.AddressBar.rcDrop) { 75 | const ptc = pt.Clone(); 76 | api.ScreenToClient(WebBrowser.hwnd, ptc); 77 | for (let i = Common.AddressBar.rcDrop.length; i-- > 0;) { 78 | if (PtInRect(Common.AddressBar.rcDrop[i], ptc)) { 79 | let hr = S_FALSE; 80 | const Target = Sync.AddressBar.GetPath(i); 81 | if (!api.ILIsEqual(dataObj.Item(-1), Target)) { 82 | const DropTarget = api.DropTarget(Target); 83 | if (DropTarget) { 84 | hr = DropTarget.Drop(dataObj, grfKeyState, pt, pdwEffect); 85 | } 86 | } 87 | return hr; 88 | } 89 | } 90 | } 91 | }); 92 | 93 | AddEvent("DragLeave", function (Ctrl) { 94 | MouseOut("addressbar"); 95 | return S_OK; 96 | }); 97 | -------------------------------------------------------------------------------- /Debug/addons/back/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.18 5 | 2021.3.26 6 | Tue, 17 Aug 2021 00:00:00 GMT 7 | Common:5,6:5 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Back 15 | Back 16 | 17 | 18 | Reculer - global 19 | Place le bouton "Reculer" dans la barre d'outils principale 20 | 21 | 22 | 戻る 23 | 24 | 25 | 上一頁 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/back/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "back"; 2 | const Default = "ToolBar2Left"; 3 | if (window.Addon == 1) { 4 | Addons.Back = { 5 | Exec: function (Ctrl, pt) { 6 | Exec(Ctrl, "Back", "Tabs", 0, pt); 7 | }, 8 | 9 | ExecEx: async function (el) { 10 | Exec(await GetFolderView(el), "Back", "Tabs", 0); 11 | }, 12 | 13 | Popup: async function (el) { 14 | const FV = await te.Ctrl(CTRL_FV); 15 | if (FV) { 16 | const Log = await FV.History; 17 | const hMenu = await api.CreatePopupMenu(); 18 | const mii = await api.Memory("MENUITEMINFO"); 19 | mii.fMask = MIIM_ID | MIIM_STRING | MIIM_BITMAP; 20 | const nCount = await Log.Count; 21 | for (let i = await Log.Index + 1; i < nCount; i++) { 22 | const FolderItem = await Log[i]; 23 | AddMenuIconFolderItem(mii, FolderItem); 24 | mii.dwTypeData = await FolderItem.Name; 25 | mii.wID = i; 26 | await api.InsertMenuItem(hMenu, MAXINT, false, mii); 27 | } 28 | const pt = GetPos(el, 9); 29 | const nVerb = await api.TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, ui_.hwnd, null, null); 30 | api.DestroyMenu(hMenu); 31 | if (nVerb) { 32 | var wFlags = await GetNavigateFlags(FV); 33 | if (wFlags & SBSP_NEWBROWSER) { 34 | FV.Navigate(await Log[nVerb], wFlags); 35 | } else { 36 | Log.Index = nVerb; 37 | FV.History = Log; 38 | } 39 | } 40 | } 41 | } 42 | }; 43 | 44 | AddEvent("Layout", async function () { 45 | const item = await GetAddonElement(Addon_Id); 46 | const h = GetIconSize(item.getAttribute("IconSize")); 47 | SetAddon(Addon_Id, Default, ['', await GetImgTag({ id: "ImgBack", 48 | title: await GetText("Back"), 49 | src: item.getAttribute("Icon") || "icon:general,0" 50 | }, h), '']); 51 | }); 52 | 53 | AddEvent("ChangeView1", async function (Ctrl) { 54 | const Log = await Ctrl.History; 55 | DisableImage(document.getElementById("ImgBack"), Log && await Log.Index >= await Log.Count - 1); 56 | }); 57 | } 58 | -------------------------------------------------------------------------------- /Debug/addons/download/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1.08 4 | 2022.3.7 5 | Wed, 09 Mar 2022 00:00:00 GMT 6 | Common:0:0 7 | 2 8 | Gaku 9 | https://tablacus.github.io/TablacusExplorerAddons/ 10 | MIT License 11 | 12 | 13 | Download 14 | Download 15 | 16 | 17 | Télécharger 18 | 19 | 20 | ダウンロード 21 | 22 | 23 | 下載 24 | 25 | 26 | -------------------------------------------------------------------------------- /Debug/addons/download/options.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 8 | 11 | 14 | 17 | 21 | 24 | 27 | 30 | 31 |
6 | 7 | 9 | 10 | 12 |   13 | 15 | 16 | 18 | 20 | 22 | 23 | 25 | 26 | 28 | 29 |
32 | 33 |
34 | 35 | 36 | -------------------------------------------------------------------------------- /Debug/addons/download/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = 'download'; 2 | if (window.Addon == 1) { 3 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 4 | } else { 5 | SetTabContents(0, "", await ReadTextFile("addons\\" + Addon_Id + "\\options.html")); 6 | const el = document.getElementById("_curl"); 7 | if (await fso.FileExists(BuildPath(system32, "curl.exe"))) { 8 | el.style.display = "none"; 9 | } 10 | SetDL = function (el) { 11 | ConfirmThenExec(el.innerText || GetText("Select"), function () { 12 | document.F.Path.value = el.title; 13 | }); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Debug/addons/download/sync.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "download"; 2 | const item = GetAddonElement(Addon_Id); 3 | 4 | Common.Download = { 5 | Path: item.getAttribute("Path"), 6 | Show: GetNum(item.getAttribute("Visible")) ? SW_SHOWNORMAL : SW_HIDE 7 | } 8 | if (Common.Download.Path) { 9 | AddEvent("createHttpRequest", function () { 10 | const o = api.CreateObject("Object"); 11 | 12 | o.open = function (method, url) { 13 | o.URL = url; 14 | } 15 | 16 | o.send = function () { 17 | o.fn = GetTempPath(3); 18 | wsh.Run(ExtractMacro(te, Common.Download.Path.replace(/%url%/ig, o.URL).replace(/%file%/ig, o.fn)), Common.Download.Show, true); 19 | o.readyState = 4; 20 | const wfd = api.Memory("WIN32_FIND_DATA"); 21 | const hFind = api.FindFirstFile(o.fn, wfd); 22 | api.FindClose(hFind); 23 | o.status = (hFind != INVALID_HANDLE_VALUE) ? wfd.nFileSizeLow ? 200 : 403 : 404; 24 | if (o.status != 200) { 25 | DeleteItem(o.fn); 26 | } 27 | InvokeFunc(o.onload || o.onreadystatechange, [o]); 28 | } 29 | 30 | o.get_responseText = function () { 31 | return ReadTextFile(o.fn); 32 | } 33 | 34 | return o; 35 | }); 36 | 37 | AddEvent("DownloadFile", function (url, fn) { 38 | if (url.fn) { 39 | DeleteItem(fn); 40 | fso.MoveFile(url.fn, fn); 41 | return 0; 42 | } 43 | return api.URLDownloadToFile(null, url, fn); 44 | }); 45 | } 46 | -------------------------------------------------------------------------------- /Debug/addons/extract/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.15 5 | 2021.3.7 6 | Fri, 11 Mar 2022 00:00:00 GMT 7 | Common:0:0 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Extract 15 | Extract the compressed files. 16 | 17 | 18 | Extraire 19 | Extraire le contenu de fichiers compressés. 20 | 21 | 22 | 展開 23 | 圧縮ファイルの展開 24 | 25 | 26 | 解壓縮 27 | 28 | 29 | -------------------------------------------------------------------------------- /Debug/addons/extract/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 10 | 13 | 16 | 17 |
5 | 6 | 8 | 9 | 11 | 12 | 14 | 15 |
18 |
19 | 20 | -------------------------------------------------------------------------------- /Debug/addons/extract/options.js: -------------------------------------------------------------------------------- 1 | SetTabContents(0, "", await ReadTextFile("addons\\" + Addon_Id + "\\options.html")); 2 | 3 | SetExe = async function (o) { 4 | ConfirmThenExec(o.innerText, async function () { 5 | const ar = o.title.split(" ") 6 | const path = 'C:\\Program Files\\' + ar[0]; 7 | const path2 = 'C:\\Program Files (x86)\\' + ar[0]; 8 | ar[0] = PathQuoteSpaces(!await fso.FileExists(path) && await fso.FileExists(path2) ? path2 : path); 9 | document.F.Path.value = ar.join(" "); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /Debug/addons/extract/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = 'extract'; 2 | if (window.Addon == 1) { 3 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 4 | } else { 5 | importScript("addons\\" + Addon_Id + "\\options.js"); 6 | } 7 | -------------------------------------------------------------------------------- /Debug/addons/extract/sync.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = 'extract'; 2 | const item = GetAddonElement(Addon_Id); 3 | 4 | if (Sync.Extract = item.getAttribute("Path")) { 5 | AddEvent("Extract", function (Src, Dest) { 6 | const r = api.CreateProcess(ExtractMacro(te, Sync.Extract.replace(/%src%/i, PathQuoteSpaces(Src)).replace(/%dest%|%dist%/i, PathQuoteSpaces(Dest))), PathUnquoteSpaces(Dest), 0, 0, 0, true); 7 | if ("number" === typeof r) { 8 | return r; 9 | } 10 | let bWait; 11 | do { 12 | bWait = false; 13 | WmiProcess("WHERE ProcessId=" + r.ProcessId, function (item) { 14 | bWait = true; 15 | api.Sleep(500); 16 | }); 17 | } while (bWait); 18 | return S_OK; 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /Debug/addons/filterbar/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1.40 4 | 2025.5.8 5 | Fri, 09 May 2025 00:00:00 GMT 6 | Common:0,5,6,7,8,9:0 7 | 2 8 | Gaku 9 | https://tablacus.github.io/TablacusExplorerAddons/ 10 | MIT License 11 | 12 | 13 | Filter bar 14 | Filter bar 15 | 16 | 17 | Barre de filtre 18 | Champ d'entrée de filtre - global. 19 | 20 | 21 | フィルターバー 22 | 23 | 24 | 篩選列 25 | 26 | 27 | -------------------------------------------------------------------------------- /Debug/addons/filterbar/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "filterbar"; 2 | const Default = "ToolBar2Right"; 3 | let item = GetAddonElement(Addon_Id); 4 | if (!item.getAttribute("Set")) { 5 | item.setAttribute("MenuPos", -1); 6 | 7 | item.setAttribute("KeyExec", 1); 8 | item.setAttribute("KeyOn", "All"); 9 | item.setAttribute("Key", "Ctrl+E"); 10 | } 11 | 12 | if (window.Addon == 1) { 13 | Addons.FilterBar = { 14 | tid: null, 15 | filter: null, 16 | iCaret: -1, 17 | RE: item.getAttribute("RE"), 18 | 19 | KeyDown: function (ev, o) { 20 | const k = ev.keyCode; 21 | if (k != VK_PROCESSKEY) { 22 | this.filter = o.value; 23 | clearTimeout(this.tid); 24 | if (k == VK_RETURN) { 25 | this.Change(ev.ctrlKey); 26 | return false; 27 | } else { 28 | this.tid = setTimeout(this.Change, 500); 29 | } 30 | } 31 | }, 32 | 33 | KeyUp: function (ev) { 34 | const k = ev.keyCode; 35 | if (k == VK_UP || k == VK_DOWN) { 36 | (async function () { 37 | const FV = await GetFolderView(); 38 | if (FV) { 39 | FV.Focus(); 40 | } 41 | })(); 42 | return false; 43 | } 44 | }, 45 | 46 | Change: async function (bSearch) { 47 | Addons.FilterBar.ShowButton(); 48 | const FV = await GetFolderView(); 49 | let s = document.F.filter.value; 50 | const res = await IsSearchPath(FV, true); 51 | if (res || bSearch) { 52 | if (!res || unescape(await res[1]) != s) { 53 | if (s) { 54 | FV.Search(s); 55 | } else { 56 | CancelFilterView(FV); 57 | } 58 | setTimeout(function (el) { 59 | if (el == document.activeElement) { 60 | WebBrowser.Focus(); 61 | el.focus(); 62 | } 63 | }, 999, document.F.filter); 64 | } 65 | return; 66 | } 67 | if (s) { 68 | if (Addons.FilterBar.RE && !/^\*|\//.test(s)) { 69 | s = "/" + s + "/i"; 70 | } else { 71 | if (!/^\//.test(s)) { 72 | const ar = s.split(/;/); 73 | for (let i in ar) { 74 | const res = /^([^\*\?]+)$/.exec(ar[i]); 75 | if (res) { 76 | ar[i] = "*" + res[1] + "*"; 77 | } 78 | } 79 | s = ar.join(";"); 80 | } 81 | } 82 | } 83 | SetFilterView(FV, s); 84 | }, 85 | 86 | Focus: async function (o) { 87 | if (!await IsSearchPath(await GetFolderView())) { 88 | o.select(); 89 | } 90 | if (this.iCaret >= 0) { 91 | const range = o.createTextRange(); 92 | range.move("character", this.iCaret); 93 | range.select(); 94 | this.iCaret = -1; 95 | } 96 | this.ShowButton(); 97 | }, 98 | 99 | Clear: async function (flag) { 100 | document.F.filter.value = ""; 101 | this.ShowButton(); 102 | if (flag) { 103 | SetFilterView(await GetFolderView()); 104 | } 105 | document.F.filter.focus(); 106 | }, 107 | 108 | ShowButton: function () { 109 | if (WINVER < 0x602 || window.chrome) { 110 | document.getElementById("ButtonFilterClear").style.display = document.F.filter.value.length ? "" : "none"; 111 | } 112 | }, 113 | 114 | Exec: function () { 115 | WebBrowser.Focus(); 116 | document.F.filter.focus(); 117 | return S_OK; 118 | }, 119 | 120 | GetFilter: async function (Ctrl) { 121 | if (await Ctrl.Type <= CTRL_EB && await Ctrl.Id == await Ctrl.Parent.Selected.Id && await Ctrl.Parent.Id == await te.Ctrl(CTRL_TC).Id) { 122 | clearTimeout(Addons.FilterBar.tid); 123 | const bSearch = await IsSearchPath(Ctrl, true); 124 | const s = Addons.FilterBar.GetString(bSearch ? unescape(await bSearch[1]) : await Ctrl.FilterView, bSearch); 125 | if (s != Addons.FilterBar.GetString(document.F.filter.value, bSearch)) { 126 | document.F.filter.value = s; 127 | Addons.FilterBar.ShowButton(); 128 | } 129 | } 130 | }, 131 | 132 | GetString: function (s, bSearch) { 133 | if (bSearch) { 134 | return s; 135 | } 136 | if (Addons.FilterBar.RE) { 137 | const res = /^\/(.*)\/i/.exec(s); 138 | if (res) { 139 | s = res[1]; 140 | } 141 | return s; 142 | } 143 | if (s && !/^\//.test(s)) { 144 | const ar = s.split(/;/); 145 | for (let i in ar) { 146 | const res = /^\*([^/?/*]+)\*$/.exec(ar[i]); 147 | if (res) { 148 | ar[i] = res[1]; 149 | } 150 | } 151 | return ar.join(";"); 152 | } 153 | return s; 154 | }, 155 | 156 | FilterList: function (ev, o, chk) { 157 | if (chk) { 158 | const x = ev.screenX * ui_.Zoom; 159 | const y = ev.screenY * ui_.Zoom; 160 | const p = GetPos(o, 1); 161 | if (x < p.x || x >= p.x + o.offsetWidth || y < p.y || y >= p.y + o.offsetHeight) { 162 | return; 163 | } 164 | } 165 | if (Addons.FilterList) { 166 | Addons.FilterList.Exec(o); 167 | } 168 | return false; 169 | } 170 | 171 | }; 172 | 173 | //Menu 174 | if (item.getAttribute("MenuExec")) { 175 | SetMenuExec("FilterBar", item.getAttribute("MenuName") || await GetAddonInfo(Addon_Id).Name, item.getAttribute("Menu"), item.getAttribute("MenuPos")); 176 | } 177 | //Key 178 | if (item.getAttribute("KeyExec")) { 179 | SetKeyExec(item.getAttribute("KeyOn"), item.getAttribute("Key"), Addons.FilterBar.Exec, "Async"); 180 | } 181 | //Mouse 182 | if (item.getAttribute("MouseExec")) { 183 | SetGestureExec(item.getAttribute("MouseOn"), item.getAttribute("Mouse"), Addons.FilterBar.Exec, "Async"); 184 | } 185 | 186 | AddEvent("Layout", async function () { 187 | const z = screen.deviceYDPI / 96; 188 | const s = item.getAttribute("Width") || 176; 189 | const width = GetNum(s) == s ? ((s * z) + "px") : s; 190 | const nSize = item.getAttribute("Icon") ? 16 : 13; 191 | SetAddon(Addon_Id, Default, ['', await GetImgTag({ 192 | id: "ButtonFilter", 193 | hidefocus: "true", 194 | style: ['position: absolute; left:', -(nSize + 2) * z, 'px; top:', (18 - nSize) / 2 * z, 'px; width:', nSize * z, 'px; height:', nSize * z, 'px'].join(""), 195 | onclick: "return Addons.FilterBar.FilterList(event, this, 1)", 196 | oncontextmenu: "return Addons.FilterBar.FilterList(event, this)", 197 | src: item.getAttribute("Icon") || (WINVER >= 0xa00 ? "font:Segoe MDL2 Assets,0xe71c" : "bitmap:comctl32.dll,140,13,0") 198 | }, nSize * z), ''], "middle"); 199 | delete item; 200 | }); 201 | 202 | AddEvent("ChangeView1", Addons.FilterBar.GetFilter); 203 | 204 | AddEvent("Command", Addons.FilterBar.GetFilter); 205 | 206 | AddTypeEx("Add-ons", "Filter Bar", Addons.FilterBar.Exec); 207 | } else { 208 | SetTabContents(0, "General", '
/
'); 209 | ChangeForm([["__IconSize", "style/display", "none"]]); 210 | } 211 | -------------------------------------------------------------------------------- /Debug/addons/forward/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.18 5 | 2021.3.26 6 | Tue, 17 Aug 2021 00:00:00 GMT 7 | Common:5,6:5 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Forward 15 | Forward 16 | 17 | 18 | Avancer - global 19 | Place le bouton "Avancer" dans la barre d'outil principale 20 | 21 | 22 | 進む 23 | 24 | 25 | 下一頁 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/forward/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "forward"; 2 | const Default = "ToolBar2Left"; 3 | if (window.Addon == 1) { 4 | Addons.Forward = { 5 | Exec: function (Ctrl, pt) { 6 | Exec(Ctrl, "Forward", "Tabs", 0, pt); 7 | }, 8 | 9 | ExecEx: async function (el) { 10 | Exec(await GetFolderView(el), "Forward", "Tabs", 0); 11 | }, 12 | 13 | Popup: async function (el) { 14 | const FV = await te.Ctrl(CTRL_FV); 15 | if (FV) { 16 | const Log = await FV.History; 17 | const hMenu = await api.CreatePopupMenu(); 18 | const mii = await api.Memory("MENUITEMINFO"); 19 | mii.fMask = MIIM_ID | MIIM_STRING | MIIM_BITMAP; 20 | for (let i = await Log.Index; i-- > 0;) { 21 | const FolderItem = await Log[i]; 22 | AddMenuIconFolderItem(mii, FolderItem); 23 | mii.dwTypeData = await FolderItem.Name; 24 | mii.wID = i + 1; 25 | await api.InsertMenuItem(hMenu, MAXINT, false, mii); 26 | } 27 | const pt = GetPos(el, 9); 28 | const nVerb = await api.TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, ui_.hwnd, null, null); 29 | api.DestroyMenu(hMenu); 30 | if (nVerb) { 31 | const wFlags = await GetNavigateFlags(FV); 32 | if (wFlags & SBSP_NEWBROWSER) { 33 | FV.Navigate(await Log[nVerb - 1], wFlags); 34 | } else { 35 | Log.Index = nVerb - 1; 36 | FV.History = Log; 37 | } 38 | } 39 | } 40 | } 41 | }; 42 | 43 | AddEvent("Layout", async function () { 44 | const item = await GetAddonElement(Addon_Id); 45 | const h = GetIconSize(item.getAttribute("IconSize")); 46 | SetAddon(Addon_Id, Default, ['', await GetImgTag({ 47 | id: "ImgForward", 48 | title: await GetText("Forward"), 49 | src: item.getAttribute("Icon") || "icon:general,1" 50 | }, h), '']); 51 | }); 52 | 53 | AddEvent("ChangeView1", async function (Ctrl) { 54 | const Log = await Ctrl.History; 55 | DisableImage(document.getElementById("ImgForward"), Log && await Log.Index < 1); 56 | }); 57 | } 58 | -------------------------------------------------------------------------------- /Debug/addons/key/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.26 5 | 2021.11.1 6 | Sat, 04 Dec 2021 00:00:00 GMT 7 | Common:4:4 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Key 15 | Definition of keyboard shortcuts 16 | 17 | 18 | Raccourci clavier 19 | Définition de raccourci(s) clavier 20 | 21 | 22 | キー 23 | 24 | 25 | 按鍵 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/key/options.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 21 | 47 | 48 |
5 | 7 |
8 | 10 | 12 | 14 | 16 | 18 | 20 |
22 | 23 | 24 |
25 | 26 | 27 |
28 | 29 |
30 | 32 | 33 | 34 | 37 | 40 | 43 | 44 |
35 | 36 | 38 | 39 | 41 | 42 |
45 | 46 |
49 | 50 | 51 | 54 | 57 | 60 | 63 | 66 | 69 | 70 |
52 | 53 | 55 | 56 | 58 | 59 | 61 | 62 | 64 | 65 | 67 | 68 |
71 |
72 | -------------------------------------------------------------------------------- /Debug/addons/key/options.js: -------------------------------------------------------------------------------- 1 | g_Types = { Key: ["All", "List", "Tree", "Edit", "Menus"] }; 2 | 3 | await SetTabContents(4, "", await ReadTextFile("addons\\" + Addon_Id + "\\options.html")); 4 | 5 | SaveLocation = async function () { 6 | SetChanged(null, document.E); 7 | await SaveX("Key", document.E); 8 | } 9 | 10 | LoadX("Key", null, document.E); 11 | setTimeout(MakeKeySelect, 99); 12 | -------------------------------------------------------------------------------- /Debug/addons/key/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "key"; 2 | if (window.Addon == 1) { 3 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 4 | } else { 5 | importScript("addons\\" + Addon_Id + "\\options.js"); 6 | } 7 | -------------------------------------------------------------------------------- /Debug/addons/key/sync.js: -------------------------------------------------------------------------------- 1 | Sync.Key = { 2 | Menus: [], 3 | 4 | OpenMenu: function (Ctrl, pt, nIndex) { 5 | const ar = this.Menus[nIndex]; 6 | const items = ar[0]; 7 | if (items) { 8 | const arMenu = ar[1]; 9 | const hMenu = api.CreatePopupMenu(); 10 | MakeMenus(hMenu, null, arMenu, items, Ctrl, pt); 11 | AdjustMenuBreak(hMenu); 12 | window.g_menu_click = 2; 13 | const nVerb = api.TrackPopupMenuEx(hMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, te.hwnd, null); 14 | api.DestroyMenu(hMenu); 15 | if (nVerb == 0) { 16 | return S_OK; 17 | } 18 | const item = items[nVerb - 1]; 19 | const s = item.getAttribute("Type"); 20 | Exec(Ctrl, item.text, window.g_menu_button == 3 && Sametext(s, "Open") ? "Open in new tab" : s, Ctrl.hwnd, pt); 21 | } 22 | return S_OK; 23 | } 24 | } 25 | 26 | const xml = OpenXml("key.xml", false, true); 27 | for (let mode in eventTE.Key) { 28 | const items = xml.getElementsByTagName(mode); 29 | for (let i = 0; i < items.length; i++) { 30 | let item = items[i]; 31 | const strKey = item.getAttribute("Key"); 32 | let strType = item.getAttribute("Type"); 33 | let strOpt = item.text; 34 | if (SameText(strType, "menus") && SameText(strOpt, "open")) { 35 | const arMenu = []; 36 | let nLevel = 0; 37 | while (++i < items.length) { 38 | item = items[i]; 39 | if (SameText(item.getAttribute("Type"), "menus")) { 40 | if (SameText(item.text, "open")) { 41 | nLevel++; 42 | } 43 | if (SameText(item.text, "close")) { 44 | if (--nLevel < 0) { 45 | break; 46 | } 47 | } 48 | } 49 | arMenu.push(i); 50 | } 51 | strType = "JScript"; 52 | strOpt = ["Sync.Key.OpenMenu(Ctrl, pt,", Sync.Key.Menus.length, ");"].join(""); 53 | Sync.Key.Menus.push([items, arMenu]); 54 | } 55 | SetKeyExec(mode, strKey, strOpt, strType); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Debug/addons/mainmenu/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.16 5 | 2021.3.25 6 | Tue, 17 Aug 2021 00:00:00 GMT 7 | Common:6:6 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Main menu 15 | Main menu 16 | 17 | 18 | Menu principal 19 | Définition du menu principal 20 | 21 | 22 | メインメニュー 23 | 24 | 25 | 主選單 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/mainmenu/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "mainmenu"; 2 | const Default = "ToolBar1Left"; 3 | if (window.Addon == 1) { 4 | Addons.MainMenu = { 5 | Menu: [], 6 | strMenus: ["&File", "&Edit", "&View", "F&avorites", "&Tools", "&Help"], 7 | 8 | Popup: async function (o) { 9 | if (!await Common.MainMenu.bClose) { 10 | Addons.MainMenu.Item = o; 11 | Common.MainMenu.Item = await GetRect(o, 1); 12 | for (let i = await GetLength(await Common.MainMenu.Menu); i--;) { 13 | Common.MainMenu.Items[i] = await GetRect(document.getElementById(await Common.MainMenu.Menu[i]), 1); 14 | } 15 | clearTimeout(Addons.MainMenu.tid); 16 | Addons.MainMenu.tid = setTimeout(async function () { 17 | delete Addons.MainMenu.tid; 18 | const o = Addons.MainMenu.Item; 19 | const p = GetPos(o, 9); 20 | MouseOver(o); 21 | $.Ctrl = await te; 22 | Common.MainMenu.bLoop = true; 23 | await Common.MainMenu.bLoop; 24 | AddEvent("ExitMenuLoop", async function () { 25 | Common.MainMenu.bLoop = false; 26 | Common.MainMenu.bClose = true; 27 | clearTimeout(Addons.MainMenu.tid2); 28 | Addons.MainMenu.tid2 = setTimeout("Common.MainMenu.bClose = false;", 500); 29 | }) 30 | ExecMenu2(o.id.replace(/^Menu/, ""), p.x, p.y); 31 | MouseOut(); 32 | }, 99); 33 | } 34 | } 35 | } 36 | Common.MainMenu = await api.CreateObject("Object"); 37 | Common.MainMenu.Menu = await api.CreateObject("Array"); 38 | Common.MainMenu.Items = await api.CreateObject("Array"); 39 | Common.MainMenu.Popup = function (s) { 40 | Addons.MainMenu.Popup(document.getElementById(s)); 41 | } 42 | 43 | AddEvent("Layout", async function () { 44 | const used = {}; 45 | const strMenus = Addons.MainMenu.strMenus; 46 | const s = []; 47 | for (let i = 0; i < strMenus.length; i++) { 48 | const s1 = strMenus[i].replace("&", ""); 49 | const strMenu = await GetText(strMenus[i]); 50 | const res = /&(.)/.exec(strMenu); 51 | if (res) { 52 | const c = res[1]; 53 | if (!used[c]) { 54 | used[c] = true; 55 | SetKeyExec("All", "Alt+" + c, 'Common.MainMenu.Popup("Menu' + s1 + '");', "JScript"); 56 | } 57 | } 58 | s.push(''); 59 | } 60 | SetAddon(Addon_Id, Default, s); 61 | }); 62 | 63 | const strMenus = Addons.MainMenu.strMenus; 64 | for (let i = strMenus.length; i--;) { 65 | const s1 = strMenus[i].replace("&", ""); 66 | Addons.MainMenu.Menu[i] = document.getElementById('Menu' + s1); 67 | Common.MainMenu.Menu[i] = 'Menu' + s1; 68 | } 69 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 70 | } 71 | -------------------------------------------------------------------------------- /Debug/addons/mainmenu/sync.js: -------------------------------------------------------------------------------- 1 | AddEvent("MouseMessage", function (Ctrl, hwnd, msg, mouseData, pt, wHitTestCode, dwExtraInfo) { 2 | if (msg == WM_MOUSEMOVE) { 3 | if (Common.MainMenu.bLoop && Ctrl.Type == CTRL_TE) { 4 | const Ctrl2 = te.CtrlFromPoint(pt); 5 | if (Ctrl2 && Ctrl2.Type == CTRL_WB) { 6 | if (!PtInRect(Common.MainMenu.Item, pt)) { 7 | for (let i = Common.MainMenu.Items.length; i--;) { 8 | if (PtInRect(Common.MainMenu.Items[i], pt)) { 9 | Common.MainMenu.bClose = false; 10 | api.PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); 11 | Common.MainMenu.Popup(Common.MainMenu.Menu[i]); 12 | break; 13 | } 14 | } 15 | } 16 | } 17 | } 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /Debug/addons/mouse/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.33 5 | 2021.11.1 6 | Mon, 13 Dec 2021 00:00:00 GMT 7 | Common:4:4 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Mouse 15 | Mouse button and gestures 16 | 17 | 18 | Souris 19 | Définition des boutons et manipulations de la souris. 20 | 21 | 22 | マウス 23 | マウスボタンとジェスチャー 24 | 25 | 26 | 滑鼠 27 | 28 | 29 | -------------------------------------------------------------------------------- /Debug/addons/mouse/options.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 23 | 103 | 104 |
5 | 7 |
8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 |
24 | 25 | 26 | 40 | 43 | 46 | 49 | 50 | 51 | 54 | 57 | 60 | 63 | 68 | 71 | 72 | 73 | 78 | 81 | 84 | 85 |
27 | 28 | 29 | 32 | 35 | 37 | 38 |
30 | 31 | 33 | 34 | %s 36 |
39 |
41 | 42 | 44 | 45 | 47 | 48 |
52 | 53 | 55 | 56 | 58 | 59 | 61 | 62 | 64 | 65 |
66 | 67 |
69 | 70 |
74 | 75 | 76 | 77 | 79 | 80 | 82 | 83 |
86 | 88 | 89 | 90 | 93 | 96 | 99 | 100 |
91 | 92 | 94 | 95 | 97 | 98 |
101 | 102 |
105 | 106 | 107 | 110 | 113 | 116 | 119 | 122 | 125 | 126 | 127 |
108 | 109 | 111 | 112 | 114 | 115 | 117 | 118 | 120 | 121 | 123 | 124 |
128 |
129 | -------------------------------------------------------------------------------- /Debug/addons/mouse/options.js: -------------------------------------------------------------------------------- 1 | g_Types = { Mouse: ["All", "List", "List_Background", "Tree", "Tabs", "Tabs_Background"] }; 2 | 3 | const src = await ReadTextFile("addons\\" + Addon_Id + "\\options.html"); 4 | const ar = []; 5 | const s = "CSA"; 6 | for (let i = s.length; i--;) { 7 | ar.unshift(''); 8 | } 9 | await SetTabContents(4, "", src.replace("%s", ar.join(""))); 10 | 11 | AddMouse = function (o) { 12 | document.E.MouseMouse.value += o.title; 13 | ChangeX("Mouse"); 14 | } 15 | 16 | SaveLocation = async function () { 17 | SetChanged(null, document.E); 18 | await SaveX("Mouse", document.E); 19 | } 20 | 21 | LoadX("Mouse", null, document.E); 22 | -------------------------------------------------------------------------------- /Debug/addons/mouse/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "mouse"; 2 | if (window.Addon == 1) { 3 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 4 | } else { 5 | importScript("addons\\" + Addon_Id + "\\options.js"); 6 | } 7 | -------------------------------------------------------------------------------- /Debug/addons/mouse/sync.js: -------------------------------------------------------------------------------- 1 | Sync.Mouse = { 2 | Menus: [], 3 | 4 | OpenMenu: function (Ctrl, pt, nIndex) { 5 | const ar = this.Menus[nIndex]; 6 | const items = ar[0]; 7 | if (items) { 8 | setTimeout(function () { 9 | const arMenu = ar[1]; 10 | const hMenu = api.CreatePopupMenu(); 11 | MakeMenus(hMenu, null, arMenu, items, Ctrl, pt); 12 | AdjustMenuBreak(hMenu); 13 | window.g_menu_click = 2; 14 | const nVerb = api.TrackPopupMenuEx(hMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, te.hwnd, null); 15 | api.DestroyMenu(hMenu); 16 | if (nVerb == 0) { 17 | return; 18 | } 19 | const item = items[nVerb - 1]; 20 | const s = item.getAttribute("Type"); 21 | Exec(Ctrl, item.text, window.g_menu_button == 3 && s == "Open" ? "Open in New Tab" : s, Ctrl.hwnd, pt); 22 | }, 99); 23 | } 24 | return S_OK; 25 | } 26 | } 27 | 28 | const xml = OpenXml("mouse.xml", false, true); 29 | for (let mode in eventTE.Mouse) { 30 | const items = xml.getElementsByTagName(mode); 31 | for (let i = 0; i < items.length; ++i) { 32 | let item = items[i]; 33 | const strMouse = item.getAttribute("Mouse"); 34 | let strType = item.getAttribute("Type"); 35 | let strOpt = item.text; 36 | if (SameText(strType, "menus") && SameText(strOpt, "open")) { 37 | const arMenu = []; 38 | let nLevel = 0; 39 | while (++i < items.length) { 40 | item = items[i]; 41 | if (SameText(item.getAttribute("Type"), "menus")) { 42 | if (SameText(item.text, "open")) { 43 | nLevel++; 44 | } 45 | if (SameText(item.text, "close")) { 46 | if (--nLevel < 0) { 47 | break; 48 | } 49 | } 50 | } 51 | arMenu.push(i); 52 | } 53 | strType = "JScript"; 54 | strOpt = ["Sync.Mouse.OpenMenu(Ctrl, pt,", Sync.Mouse.Menus.length, ");"].join(""); 55 | Sync.Mouse.Menus.push([items, arMenu]); 56 | } 57 | SetGestureExec(mode, strMouse, strOpt, strType, false, item.getAttribute("Name")); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Debug/addons/multiprocess/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1.40 4 | 2025.5.24 5 | Sun, 25 May 2025 00:00:00 GMT 6 | Common:0:0 7 | 2 8 | Gaku 9 | https://tablacus.github.io/TablacusExplorerAddons/ 10 | MIT License 11 | 12 | 13 | Multi process 14 | Multi-process file operations. 15 | 16 | 17 | Multitâches 18 | Opérations sur fichier en multitâches. 19 | 20 | 21 | マルチプロセス 22 | マルチプロセスでファイル操作 23 | 24 | 25 | 多程序檔案操作 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/multiprocess/options.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
12 |

23 |
24 |
25 | -------------------------------------------------------------------------------- /Debug/addons/multiprocess/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "multiprocess"; 2 | const item = GetAddonElement(Addon_Id); 3 | 4 | Addons.MultiProcess = { 5 | File: item.getAttribute("File"), 6 | 7 | Player: async function (autoplay) { 8 | if (Addons.MultiProcess.tid) { 9 | clearTimeout(Addons.MultiProcess.tid); 10 | delete Addons.MultiProcess.tid; 11 | } 12 | const src = await ExtractPath(te, (autoplay === true) ? Addons.MultiProcess.File : document.F.File.value); 13 | if (window.g_nInit) { 14 | if (src) { 15 | g_nInit = 0; 16 | } else { 17 | --g_nInit; 18 | Addons.MultiProcess.tid = setTimeout(Addons.MultiProcess.Player, 500); 19 | return; 20 | } 21 | } 22 | let el; 23 | if (ui_.IEVer >= 11 && (window.chrome ? /\.mp3$|\.m4a$|\.webm$|\.mp4$|\.wav$|\.ogg$/i : /\.mp3$|\.m4a$|\.mp4$/i).test(src)) { 24 | el = document.createElement('audio'); 25 | if (autoplay === true) { 26 | el.setAttribute("autoplay", "true"); 27 | } else { 28 | el.setAttribute("controls", "true"); 29 | } 30 | } else if (/\.wav$/i.test(src)) { 31 | if (autoplay === true) { 32 | api.PlaySound(src, null, 1); 33 | return; 34 | } 35 | el = document.createElement('button'); 36 | el.innerHTML = "▶"; 37 | el.title = await GetText("Play"); 38 | el.onclick = function () { 39 | Addons.MultiProcess.File = src; 40 | Addons.MultiProcess.Player(true); 41 | } 42 | } else { 43 | el = document.createElement('embed'); 44 | el.setAttribute("volume", "0"); 45 | el.setAttribute("autoplay", autoplay === true); 46 | } 47 | el.src = src; 48 | el.setAttribute("style", "width: 100%; height: 3.5em"); 49 | const o = document.getElementById('multiprocess_player'); 50 | while (o.firstChild) { 51 | o.removeChild(o.firstChild); 52 | } 53 | if (src) { 54 | o.appendChild(el); 55 | } 56 | } 57 | }; 58 | 59 | if (window.Addon == 1) { 60 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 61 | document.getElementById('None').insertAdjacentHTML("BeforeEnd", '
'); 62 | } else { 63 | SetTabContents(0, "", await ReadTextFile("addons\\" + Addon_Id + "\\options.html")); 64 | g_nInit = 5; 65 | Addons.MultiProcess.tid = setTimeout(Addons.MultiProcess.Player, 9); 66 | } 67 | -------------------------------------------------------------------------------- /Debug/addons/multiprocess/sync.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "multiprocess"; 2 | let item = GetAddonElement(Addon_Id); 3 | 4 | Sync.MultiProcess = { 5 | NoDelete: item.getAttribute("NoDelete"), 6 | NoPaste: item.getAttribute("NoPaste"), 7 | NoDrop: item.getAttribute("NoDrop"), 8 | NoRDrop: item.getAttribute("NoRDrop"), 9 | NoTemp: item.getAttribute("NoTemp"), 10 | NoFront: item.getAttribute("NoFront"), 11 | TimeOver: item.getAttribute("TimeOver"), 12 | Sec: item.getAttribute("Sec"), 13 | 14 | pids: {}, 15 | 16 | FO: function (Ctrl, Items, Dest, grfKeyState, pt, pdwEffect, nMode) { 17 | if (Items.Count == 0) { 18 | return false; 19 | } 20 | const dwEffect = pdwEffect[0]; 21 | if (Dest !== null) { 22 | const path = api.GetDisplayNameOf(Dest, SHGDN_FORPARSING); 23 | if (/^::{/.test(path) || (/^[A-Z]:\\|^\\/i.test(path) && !fso.FolderExists(path))) { 24 | return false; 25 | } 26 | if (nMode == 0) { 27 | if (!(grfKeyState & (MK_CONTROL | MK_RBUTTON)) && api.ILIsEqual(Dest, Items.Item(-1))) { 28 | return false; 29 | } 30 | const DropTarget = api.DropTarget(Dest); 31 | DropTarget.DragOver(Items, grfKeyState, pt, pdwEffect); 32 | } 33 | } 34 | if (nMode == 0) { 35 | if (grfKeyState & MK_RBUTTON) { 36 | if (Sync.MultiProcess.NoRDrop) { 37 | return false; 38 | } 39 | } else { 40 | if (Sync.MultiProcess.NoDrop) { 41 | return false; 42 | } 43 | } 44 | } else if (nMode == 1) { 45 | if (Sync.MultiProcess.NoDelete) { 46 | return false; 47 | } 48 | } else if (nMode == 2) { 49 | if (Sync.MultiProcess.NoPaste) { 50 | return false; 51 | } 52 | } 53 | if (Dest !== null) { 54 | const wfd = api.Memory("WIN32_FIND_DATA"); 55 | const strTemp = GetTempPath(4); 56 | if (Items.Count == 1 && api.PathMatchSpec(Items.Item(0).Path, strTemp + "*.bmp")) { 57 | return false; 58 | } 59 | let strTemp2; 60 | const Items2 = api.CreateObject("FolderItems"); 61 | for (let i = 0; i < Items.Count; ++i) { 62 | let path1 = Items.Item(i).Path; 63 | const hFind = api.FindFirstFile(path1, wfd); 64 | if (hFind != INVALID_HANDLE_VALUE) { 65 | api.FindClose(hFind); 66 | if (!api.StrCmpNI(path1, strTemp, strTemp.length)) { 67 | if (!strTemp2) { 68 | if (Sync.MultiProcess.NoTemp) { 69 | return false; 70 | } 71 | strTemp2 = GetTempPath(7); 72 | CreateFolder(strTemp2); 73 | } 74 | if (!api.StrCmpNI(path1, strTemp, strTemp.length)) { 75 | if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 76 | fso.MoveFolder(path1, strTemp2); 77 | } else { 78 | fso.MoveFile(path1, strTemp2); 79 | } 80 | } 81 | path1 = strTemp2 + GetFileName(path1); 82 | } 83 | Items2.AddItem(path1); 84 | } else { 85 | delete strTemp2; 86 | break; 87 | } 88 | } 89 | if (strTemp2) { 90 | Items = Items2; 91 | } 92 | } 93 | if (!Sync.MultiProcess.NoFront) { 94 | setTimeout(function () { 95 | let hwnd = null; 96 | while (hwnd = api.FindWindowEx(null, hwnd, null, null)) { 97 | if (api.GetClassName(hwnd) == "OperationStatusWindow") { 98 | if (!(api.GetWindowLongPtr(hwnd, GWL_EXSTYLE) & 8)) { 99 | api.SetForegroundWindow(hwnd); 100 | api.SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 101 | } 102 | } 103 | } 104 | }, 5000); 105 | } 106 | 107 | const State = [VK_SHIFT, VK_CONTROL, VK_MENU]; 108 | for (let i = State.length; i--;) { 109 | if (api.GetKeyState(State[i]) >= 0) { 110 | State.splice(i, 1); 111 | } 112 | } 113 | OpenNewProcess("addons\\multiprocess\\worker.js", { 114 | Items: Items, 115 | Dest: Dest, 116 | Mode: nMode, 117 | grfKeyState: grfKeyState, 118 | pt: pt, 119 | dwEffect: dwEffect, 120 | TimeOver: Sync.MultiProcess.TimeOver, 121 | Sec: Sync.MultiProcess.Sec, 122 | NoFront: Sync.MultiProcess.NoFront, 123 | State: State, 124 | pids: Sync.MultiProcess.pids, 125 | Callback: Sync.MultiProcess.Player 126 | }); 127 | return true; 128 | }, 129 | 130 | Player: function (autoplay) { 131 | InvokeUI("Addons.MultiProcess.Player", autoplay); 132 | } 133 | }; 134 | delete item; 135 | 136 | AddEvent("Drop", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 137 | switch (Ctrl.Type) { 138 | case CTRL_SB: 139 | case CTRL_EB: 140 | case CTRL_TV: 141 | const Dest = GetDropTargetItem(Ctrl, Ctrl.hwndList, pt); 142 | if (Dest && Sync.MultiProcess.FO(Ctrl, dataObj, Dest, grfKeyState, pt, pdwEffect, 0)) { 143 | return S_OK 144 | } 145 | break; 146 | case CTRL_DT: 147 | if (Sync.MultiProcess.FO(null, dataObj, Ctrl.FolderItem, grfKeyState, pt, pdwEffect, 0)) { 148 | return S_OK 149 | } 150 | break; 151 | } 152 | }); 153 | 154 | AddEvent("Command", function (Ctrl, hwnd, msg, wParam, lParam) { 155 | if (Ctrl.Type == CTRL_SB || Ctrl.Type == CTRL_EB) { 156 | switch ((wParam & 0xfff) + 1) { 157 | case CommandID_PASTE: 158 | let Items = api.OleGetClipboard(); 159 | if (!api.ILIsEmpty(Items.Item(-1)) && Sync.MultiProcess.FO(null, Items, Ctrl.FolderItem, MK_LBUTTON, null, Items.pdwEffect, 2)) { 160 | return S_OK; 161 | } 162 | break; 163 | case CommandID_DELETE: 164 | Items = Ctrl.SelectedItems(); 165 | if (Sync.MultiProcess.FO(null, Items, null, MK_LBUTTON, null, Items.pdwEffect, 1)) { 166 | return S_OK; 167 | } 168 | break; 169 | } 170 | } 171 | }); 172 | 173 | AddEvent("InvokeCommand", function (ContextMenu, fMask, hwnd, Verb, Parameters, Directory, nShow, dwHotKey, hIcon) { 174 | const sVerb = ContextMenu.GetCommandString(Verb, GCS_VERB); 175 | if (SameText(sVerb, "paste")) { 176 | const Target = ContextMenu.Items(); 177 | if (Target.Count) { 178 | const Items = api.OleGetClipboard() 179 | if (Sync.MultiProcess.FO(null, Items, Target.Item(0), MK_LBUTTON, null, Items.pdwEffect, 2)) { 180 | return S_OK; 181 | } 182 | } 183 | } else if (SameText(sVerb, "delete")) { 184 | const Items = ContextMenu.Items(); 185 | if (Sync.MultiProcess.FO(null, Items, null, MK_LBUTTON, null, Items.pdwEffect, 1)) { 186 | return S_OK; 187 | } 188 | } 189 | }); 190 | 191 | AddEvent("CanClose", function (Ctrl) { 192 | if (Ctrl.Type == CTRL_TE) { 193 | let hwnd1 = null; 194 | const pid = api.Memory("DWORD"); 195 | while (hwnd1 = api.FindWindowEx(null, hwnd1, null, null)) { 196 | if (!/tablacus|_hidden/i.test(api.GetClassName(hwnd1)) && api.IsWindowVisible(hwnd1)) { 197 | api.GetWindowThreadProcessId(hwnd1, pid); 198 | for (let pid0 in Sync.MultiProcess.pids) { 199 | if (pid[0] == pid0) { 200 | return S_FALSE; 201 | } 202 | } 203 | } 204 | } 205 | } 206 | }); 207 | -------------------------------------------------------------------------------- /Debug/addons/multiprocess/worker.js: -------------------------------------------------------------------------------- 1 | importScripts("..\\..\\script\\consts.js"); 2 | ex = {}; 3 | 4 | if (MainWindow.Exchange) { 5 | te.OnSystemMessage = function (Ctrl, hwnd, msg, wParam, lParam) { 6 | try { 7 | if (msg == WM_TIMER && wParam == 1) { 8 | let bClose = ex.bClose;; 9 | let hwnd1 = null; 10 | const pid = api.Memory("DWORD"); 11 | api.GetWindowThreadProcessId(hwnd, pid); 12 | const pid0 = pid[0]; 13 | while (hwnd1 = api.FindWindowEx(null, hwnd1, null, null)) { 14 | const sClass = api.GetClassName(hwnd1); 15 | if (hwnd1 != hwnd && api.IsWindowVisible(hwnd1) && sClass != "Internet Explorer_Hidden") { 16 | api.GetWindowThreadProcessId(hwnd1, pid); 17 | if (pid[0] == pid0) { 18 | if (sClass == "#32770") { 19 | if (!(api.GetWindowLongPtr(hwnd1, GWL_EXSTYLE) & 8)) { 20 | if (ex) { 21 | if (!ex.NoFront) { 22 | api.SetForegroundWindow(hwnd1); 23 | api.SetWindowPos(hwnd1, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 24 | } 25 | if (!ex.bClose) { 26 | api.SetTimer(te.hwnd, 1, 99999, null); 27 | } 28 | } 29 | } 30 | } 31 | bClose = false; 32 | break; 33 | } 34 | //Dialog(UAC) 35 | if (api.GetWindowLongPtr(hwnd1, GWL_EXSTYLE) & 8) { 36 | if (sClass == "#32770") { 37 | if (ex) { 38 | ex.time = new Date().getTime(); 39 | } 40 | bClose = false; 41 | break; 42 | } 43 | } 44 | } 45 | } 46 | if (bClose) { 47 | api.KillTimer(hwnd, wParam); 48 | try { 49 | if (ex && ex.TimeOver && new Date().getTime() - ex.time > ex.Sec * 1000 + 500) { 50 | ex.TimeOver = 0; 51 | ex.Callback(true); 52 | } 53 | } catch (e) { } 54 | delete ex.pids[pid0]; 55 | api.PostMessage(hwnd, WM_CLOSE, 0, 0); 56 | } 57 | } 58 | } catch (e) { 59 | api.PostMessage(hwnd, WM_CLOSE, 0, 0); 60 | } 61 | return 0; 62 | } 63 | const pid = api.Memory("DWORD"); 64 | api.GetWindowThreadProcessId(te.hwnd, pid); 65 | pid0 = pid[0]; 66 | api.GetWindowThreadProcessId(api.GetForegroundWindow(), pid); 67 | 68 | ex.bClose = false; 69 | api.SetTimer(te.hwnd, 1, 999, null); 70 | const ex0 = MainWindow.Exchange[arg[3]]; 71 | if (ex0) { 72 | for (let s in ex0) { 73 | ex[s] = ex0[s]; 74 | } 75 | ex.State = []; 76 | for (let i = ex.State.length; i-- > 0;) { 77 | ex.State[i] = ex0.State[i]; 78 | } 79 | delete MainWindow.Exchange[arg[3]]; 80 | const KeyState0 = api.Memory("KEYSTATE"); 81 | api.GetKeyboardState(KeyState0); 82 | if (ex.State.length) { 83 | const KeyState = api.Memory("KEYSTATE"); 84 | api.GetKeyboardState(KeyState); 85 | for (let i = ex.State.length; i--;) { 86 | KeyState.Write(ex.State[i], VT_UI1, 0x80); 87 | } 88 | api.SetKeyboardState(KeyState); 89 | } 90 | ex.time = new Date().getTime(); 91 | ex.pids[pid0] = 1; 92 | switch (ex.Mode) { 93 | case 0: 94 | api.DropTarget(ex.Dest).Drop(ex.Items, ex.grfKeyState, ex.pt, ex.dwEffect); 95 | break; 96 | case 1: 97 | InvokeCommandMP("delete", ex.Items); 98 | break; 99 | case 2: 100 | InvokeCommandMP("paste", ex.Dest); 101 | break; 102 | } 103 | if (ex.State.length) { 104 | api.SetKeyboardState(KeyState0); 105 | } 106 | } 107 | ex.bClose = true; 108 | api.SetTimer(te.hwnd, 1, 999, null); 109 | return "wait"; 110 | } 111 | 112 | function InvokeCommandMP(sCommand, Items) { 113 | const ContextMenu = api.ContextMenu(Items); 114 | if (ContextMenu) { 115 | const hMenu = api.CreatePopupMenu(); 116 | ContextMenu.QueryContextMenu(hMenu, 0, 1, 0x7FFF, CMF_DEFAULTONLY); 117 | ContextMenu.InvokeCommand(0, te.hwnd, sCommand, null, null, SW_SHOWNORMAL, null, null); 118 | api.DestroyMenu(hMenu); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /Debug/addons/remember/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.42 5 | 2021.12.18 6 | Thu, 23 Dec 2021 00:00:00 GMT 7 | Common:0:0 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Remember folder view settings 15 | Automatically remember folder view settings. 16 | 17 | 18 | Mémoriser la configuration d'affichage de dossier 19 | Enregistre automatiquement les paramètres d'affichage des dossiers. 20 | 21 | 22 | フォルダの表示設定を覚える 23 | 自動的にフォルダの表示設定を覚えます。 24 | 25 | 26 | 記住每個資料夾檢視 27 | 28 | 29 | -------------------------------------------------------------------------------- /Debug/addons/remember/options.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Debug/addons/remember/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "remember"; 2 | const item = await GetAddonElement(Addon_Id); 3 | if (!item.getAttribute("Set")) { 4 | item.setAttribute("Format", "1"); 5 | } 6 | if (window.Addon == 1) { 7 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 8 | } else { 9 | SetTabContents(0, "", await ReadTextFile("addons\\" + Addon_Id + "\\options.html")); 10 | } 11 | -------------------------------------------------------------------------------- /Debug/addons/remember/sync.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "remember"; 2 | let item = GetAddonElement(Addon_Id); 3 | 4 | Common.Remember = api.CreateObject("Object"); 5 | Common.Remember.db = api.CreateObject("Object"); 6 | 7 | Sync.Remember = { 8 | ID: ["Time", "ViewMode", "IconSize", "Columns", "SortColumn", "Group", "SortColumns", "Path"], 9 | nFormat: api.LowPart(GetAddonOption(Addon_Id, "Format")), 10 | Filter: ExtractFilter(GetAddonOption(Addon_Id, "Filter") || "*"), 11 | Disable: ExtractFilter(GetAddonOption(Addon_Id, "Disable") || "-"), 12 | nIcon: api.GetSystemMetrics(SM_CYICON) * 96 / screen.deviceYDPI, 13 | nSM: api.GetSystemMetrics(SM_CYSMICON) * 96 / screen.deviceYDPI, 14 | nSave: item.getAttribute("Save") || 1000, 15 | 16 | RememberFolder: function (FV) { 17 | if (FV && FV.FolderItem && !FV.FolderItem.Unavailable && FV.Data && FV.Data.Remember) { 18 | const path = Sync.Remember.GetPath(FV); 19 | if (path == FV.Data.Remember && PathMatchEx(path, Sync.Remember.Filter) && !PathMatchEx(path, Sync.Remember.Disable)) { 20 | const col = FV.Columns(Sync.Remember.nFormat); 21 | if (col) { 22 | const ar = api.CreateObject("Array"); 23 | ar.push(new Date().getTime(), FV.CurrentViewMode, FV.IconSize, col, FV.GetSortColumn(Sync.Remember.nFormat), FV.GroupBy, FV.SortColumns); 24 | Common.Remember.db[path] = ar; 25 | } 26 | } 27 | } 28 | }, 29 | 30 | GetPath: function (pid) { 31 | const path = ("string" === typeof pid ? pid : String(api.GetDisplayNameOf(pid, SHGDN_FORADDRESSBAR | SHGDN_FORPARSING | SHGDN_FORPARSINGEX))).toLowerCase(); 32 | if (!/^ftp:|^https?:/i.test(path)) { 33 | const res = /^([a-z][a-z\-_]+:).*/i.exec(path); 34 | if (res) { 35 | return res[1]; 36 | } 37 | } 38 | return path; 39 | } 40 | }; 41 | 42 | let xml = OpenXml("remember.xml", true, false); 43 | if (xml) { 44 | const items = xml.getElementsByTagName('Item'); 45 | for (let i = items.length; i-- > 0;) { 46 | const item = items[i]; 47 | const ar = api.CreateObject("Array"); 48 | for (let j = Sync.Remember.ID.length; j--;) { 49 | ar[j] = item.getAttribute(Sync.Remember.ID[j]); 50 | } 51 | if (ar[1]) { 52 | const path = Sync.Remember.GetPath(String(ar.pop())); 53 | if (PathMatchEx(path, Sync.Remember.Filter) && !PathMatchEx(path, Sync.Remember.Disable)) { 54 | Common.Remember.db[path] = ar; 55 | } 56 | } 57 | } 58 | xml = null; 59 | } 60 | 61 | AddEvent("BeforeNavigate", function (Ctrl, fs, wFlags, Prev) { 62 | if (Ctrl.Data && !Ctrl.Data.Setting) { 63 | if (Prev && !Prev.Unavailable) { 64 | const path = Sync.Remember.GetPath(Prev); 65 | const col = Ctrl.Columns(Sync.Remember.nFormat); 66 | if (col && PathMatchEx(path, Sync.Remember.Filter) && !PathMatchEx(path, Sync.Remember.Disable)) { 67 | const ar = api.CreateObject("Array"); 68 | ar.push(new Date().getTime(), Ctrl.CurrentViewMode, Ctrl.IconSize, col, Ctrl.GetSortColumn(Sync.Remember.nFormat), Ctrl.GroupBy, Ctrl.SortColumns); 69 | Common.Remember.db[path] = ar; 70 | } 71 | } 72 | const path = Sync.Remember.GetPath(Ctrl); 73 | const ar = Common.Remember.db[path]; 74 | if (ar) { 75 | if (PathMatchEx(path, Sync.Remember.Filter) && !PathMatchEx(path, Sync.Remember.Disable)) { 76 | fs.ViewMode = ar[1]; 77 | if (ar[2] > Sync.Remember.nIcon && (ar[1] > FVM_ICON && ar[1] <= FVM_DETAILS)) { 78 | ar[2] = Sync.Remember.nSM; 79 | } 80 | fs.ImageSize = ar[2]; 81 | Ctrl.Data.Setting = 'Remember'; 82 | } else { 83 | delete Common.Remember.db[path]; 84 | } 85 | } 86 | Ctrl.Data.Remember = ""; 87 | } 88 | }); 89 | 90 | AddEvent("NavigateComplete", function (Ctrl) { 91 | const path = Sync.Remember.GetPath(Ctrl); 92 | if (path && PathMatchEx(path, Sync.Remember.Filter) && !PathMatchEx(path, Sync.Remember.Disable)) { 93 | Ctrl.Data.Remember = path; 94 | if (Ctrl.Data && Ctrl.Data.Setting == 'Remember') { 95 | const ar = Common.Remember.db[Ctrl.Data.Remember]; 96 | if (ar) { 97 | if (ar[2] > Sync.Remember.nIcon && (ar[1] > FVM_ICON && ar[1] <= FVM_DETAILS)) { 98 | ar[2] = Sync.Remember.nSM; 99 | } 100 | Ctrl.SetViewMode(ar[1], ar[2]); 101 | Ctrl.Columns = ar[3]; 102 | if (Ctrl.GroupBy && ar[5]) { 103 | Ctrl.GroupBy = ar[5]; 104 | } 105 | if ((ar[6] || "").split(/;/).length > 2 && Ctrl.SortColumns) { 106 | try { 107 | Ctrl.SortColumns = ar[6]; 108 | } catch (e) { 109 | Ctrl.SortColumn = ar[4]; 110 | } 111 | } else { 112 | Ctrl.SortColumn = ar[4]; 113 | } 114 | ar[0] = new Date().getTime(); 115 | } 116 | } 117 | } 118 | }); 119 | 120 | AddEvent("ChangeView", Sync.Remember.RememberFolder); 121 | AddEvent("CloseView", Sync.Remember.RememberFolder); 122 | AddEvent("Command", Sync.Remember.RememberFolder); 123 | AddEvent("ViewModeChanged", Sync.Remember.RememberFolder); 124 | AddEvent("ColumnsChanged", Sync.Remember.RememberFolder); 125 | 126 | AddEvent("InvokeCommand", function (ContextMenu, fMask, hwnd, Verb, Parameters, Directory, nShow, dwHotKey, hIcon) { 127 | const Ctrl = te.Ctrl(CTRL_FV); 128 | if (Ctrl) { 129 | Sync.Remember.RememberFolder(Ctrl); 130 | } 131 | }); 132 | 133 | AddEvent("SaveConfig", function () { 134 | Sync.Remember.RememberFolder(te.Ctrl(CTRL_FV)); 135 | 136 | const arFV = []; 137 | for (let path in Common.Remember.db) { 138 | if (path && PathMatchEx(path, Sync.Remember.Filter) && !PathMatchEx(path, Sync.Remember.Disable)) { 139 | const ar = Common.Remember.db[path]; 140 | if (ar) { 141 | ar.push(path); 142 | arFV.push(ar); 143 | } 144 | } 145 | } 146 | 147 | arFV.sort( 148 | function (a, b) { 149 | return b[0] - a[0]; 150 | } 151 | ); 152 | arFV.splice(Sync.Remember.nSave, arFV.length); 153 | const xml = CreateXml(); 154 | const root = xml.createElement("TablacusExplorer"); 155 | 156 | while (arFV.length) { 157 | const ar = arFV.shift(); 158 | const item = xml.createElement("Item"); 159 | for (let j in Sync.Remember.ID) { 160 | item.setAttribute(Sync.Remember.ID[j], ar[j] || ""); 161 | } 162 | root.appendChild(item); 163 | } 164 | xml.appendChild(root); 165 | SaveXmlEx("remember.xml", xml, true); 166 | }); 167 | -------------------------------------------------------------------------------- /Debug/addons/segoeicons/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1.04 4 | 2022.2.9 5 | Wed, 09 Feb 2022 00:00:00 GMT 6 | 2 7 | Gaku 8 | https://tablacus.github.io/TablacusExplorerAddons/ 9 | MIT License 10 | 11 | 12 | Segoe Fluent Icons 13 | Replace the standard icon with Segoe Fluent Icons or Segoe UI MDL2 Assets. *Windows 10 or higher is required 14 | 15 | 16 | Segoe Fluent Icons 17 | Remplace les icônes standards par les icônes fluides Segoe ou les disponibilités Segoe UI MDL2. *Windows 10 ou plus requis !! 18 | 19 | 20 | Segoe Fluent Icons 21 | 標準アイコンをSegoe Fluent Icons / Segoe UI MDL2 Assets に置き換えます。※Windows 10 以降が必要 22 | 23 | 24 | Segoe 圖示集 25 | 26 | 27 | -------------------------------------------------------------------------------- /Debug/addons/segoeicons/script.js: -------------------------------------------------------------------------------- 1 | if (window.Addon == 1) { 2 | const Addon_Id = "segoeicons"; 3 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 4 | } 5 | -------------------------------------------------------------------------------- /Debug/addons/segoeicons/sync.js: -------------------------------------------------------------------------------- 1 | Sync.SegoeIcons = { 2 | general: { 3 | 0: "0xe72b", 4 | 1: "0xe72a", 5 | 2: "0xe728", 6 | 3: "0xe734", 7 | 4: "0xe90c", 8 | 5: "0xe8c6", 9 | 6: "0xe8c8", 10 | 7: "0xe77f", 11 | 8: "0xe7a7", 12 | 9: "0xe7a6", 13 | 10: "0xe74d", 14 | 11: "0xed0e", 15 | 12: "0xe8dA", 16 | 13: "0xe74e", 17 | 14: "0xe7c5", 18 | 15: "0xe771", 19 | 16: "0xe897", 20 | 17: "0xe721", 21 | 19: "0xe749", 22 | 20: "0xf0e2", 23 | 21: "0xea37", 24 | 22: "0xe71d", 25 | 23: "0xe8fd", 26 | 24: "0xe8cb", 27 | 25: "0xe8cb", 28 | 26: "0xe8cb", 29 | 27: "0xe8cb", 30 | 28: "0xe74a", 31 | 29: "0xe8ce", 32 | 30: "0xe8cd", 33 | 31: "0xe8f4", 34 | 32: "0xe71d", 35 | 35: "0xe780", 36 | 36: "0xec75", 37 | 37: "0xf0e2", 38 | 38: "0xea37", 39 | 39: "0xe71d", 40 | 40: "0xe8fd", 41 | 43: "0xed43", 42 | 44: "0xe8de", 43 | 45: "0xf413" 44 | }, 45 | browser: { 46 | 0: "0xe72b", 47 | 1: "0xe72a", 48 | 2: "0xe711", 49 | 3: "0xe72c", 50 | 4: "0xe80f", 51 | 5: "0xe721", 52 | 6: "0xe728", 53 | 7: "0xe749", 54 | 8: "0xe8d2", 55 | 9: "0xe929", 56 | 10: "0xec7a", 57 | 11: "0xe8d6", 58 | 12: "0xe81c", 59 | 13: "0xe8c3", 60 | 14: "0xe8a7", 61 | 15: "0xef6b", 62 | 16: "0xe97a", 63 | 18: "0xed1e", 64 | 22: "0xe710" 65 | }, 66 | shell32: { 67 | 0: "0xe7c3", 68 | 1: "0xf000", 69 | 2: "0xe737", 70 | 3: "0xe8b7", 71 | 4: "0xe838", 72 | 8: "0xeda2", 73 | 9: "0xe8ce", 74 | 10: "0xe8cd", 75 | 24: "0xe75a", 76 | 42: "0xe977", 77 | 289: "0xe8ec" 78 | } 79 | } 80 | 81 | const fontDir = api.ILCreateFromPath(ssfFONTS).Path; 82 | if (g_.IconExt) { 83 | for (let n in Sync.SegoeIcons) { 84 | for (let i in Sync.SegoeIcons[n]) { 85 | if (fso.FileExists(BuildPath(te.Data.DataFolder, "icons", n, i + g_.IconExt))) { 86 | delete Sync.SegoeIcons[n][i]; 87 | } 88 | } 89 | } 90 | } 91 | if (fso.FileExists(BuildPath(fontDir, "SegoeIcons.ttf")) || fso.FileExists(ExtractMacro(te, "%AppData%\\..\\Local\\Microsoft\\Windows\\Fonts\\Segoe Fluent Icons.ttf"))) { 92 | g_.IconFont = "Segoe Fluent Icons"; 93 | } else if (fso.FileExists(BuildPath(fontDir, "segmdl2.ttf"))) { 94 | g_.IconFont = "Segoe MDL2 Assets"; 95 | } else { 96 | return; 97 | } 98 | Sync.SegoeIcons.Name = "font:" + g_.IconFont + ","; 99 | 100 | AddEvent("ReplaceIcon", function (s) { 101 | let res = /^icon:general,(\d+)|^bitmap:ieframe.dll,214,24,(\d+)|^bitmap:ieframe.dll,216,16,(\d+)/.exec(s); 102 | if (res) { 103 | if (s = Sync.SegoeIcons.general[res[1] || res[2] || res[3]]) { 104 | return Sync.SegoeIcons.Name + s; 105 | } 106 | } 107 | res = /^icon:browser,(\d+)|^bitmap:ieframe.dll,204,24,(\d+)|^bitmap:ieframe.dll,206,16,(\d+)/.exec(s); 108 | if (res) { 109 | if (s = Sync.SegoeIcons.browser[res[1] || res[2] || res[3]]) { 110 | return Sync.SegoeIcons.Name + s; 111 | } 112 | } 113 | res = /^icon:shell32.dll,(\d+)/.exec(s); 114 | if (res) { 115 | if (s = Sync.SegoeIcons.shell32[res[1]]) { 116 | return Sync.SegoeIcons.Name + s; 117 | } 118 | } 119 | }); 120 | -------------------------------------------------------------------------------- /Debug/addons/tabplus/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1.97 4 | 2024.2.16 5 | Fri, 16 Feb 2024 00:00:00 GMT 6 | Common:0:0 7 | 2 8 | Gaku 9 | https://tablacus.github.io/TablacusExplorerAddons/ 10 | MIT License 11 | 12 | 13 | Tab plus 14 | Tab plus 15 | 16 | 17 | Tab+ 18 | 19 | 20 | タブプラス 21 | 22 | 23 | 進階頁籤 24 | 25 | 26 | -------------------------------------------------------------------------------- /Debug/addons/tabplus/options.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | 14 | 15 | 16 |
17 |   18 | 24 |
25 |
26 |
27 | 28 |
29 | 30 | 31 |
32 | 33 | 34 | 37 | 40 | 43 | 44 | 45 | 48 | 49 | 50 | 53 | 56 | 59 | 60 | 61 | 64 | 65 | 66 | 69 | 72 | 75 | 76 | 77 | 80 | 81 |
35 | 36 | 38 | 39 | 41 | 42 |
46 | 47 |
51 | 52 | 54 | 55 | 57 | 58 |
62 | 63 |
67 | 68 | 70 | 71 | 73 | 74 |
78 | 79 |
82 |
83 |
84 | 85 |
86 |
87 |
88 | 89 |
90 | -------------------------------------------------------------------------------- /Debug/addons/tabplus/options.js: -------------------------------------------------------------------------------- 1 | const Icon = document.F.Icon; 2 | if (Icon) { 3 | Icon.name = "Icon_0"; 4 | } 5 | await SetTabContents(0, "", await ReadTextFile("addons\\" + Addon_Id + "\\options.html")); 6 | document.getElementById("_Drive").innerHTML = (await api.LoadString(hShell32, 4122)).replace(/ %c:?/, ""); 7 | document.getElementById("_DropTo").innerHTML = (await GetTextR("@SRH.dll,-8110[Drop to %1]")).replace(/%1/, await GetText("Folder")); 8 | -------------------------------------------------------------------------------- /Debug/addons/tabplus/sync.js: -------------------------------------------------------------------------------- 1 | Common.TabPlus.rc = api.CreateObject("Object"); 2 | Common.TabPlus.rcItem = api.CreateObject("Object"); 3 | 4 | Sync.TabPlus = { 5 | DropTo: !GetAddonOption("tabplus", "NoDropTo"), 6 | 7 | FromPt: function (Id, pt) { 8 | const ptc = pt.Clone(); 9 | api.ScreenToClient(WebBrowser.hwnd, ptc); 10 | const Items = Common.TabPlus.rcItem[Id]; 11 | const TC = te.Ctrl(CTRL_TC, Id); 12 | if (TC) { 13 | for (let i = Math.min(Items.length, TC.Count); i-- > 0;) { 14 | if (PtInRect(Items[i], ptc)) { 15 | return i; 16 | } 17 | } 18 | } 19 | return -1; 20 | }, 21 | 22 | TCFromPt: function (pt) { 23 | const ptc = pt.Clone(); 24 | api.ScreenToClient(WebBrowser.hwnd, ptc); 25 | for (let Id in Common.TabPlus.rc) { 26 | const TC = te.Ctrl(CTRL_TC, Id); 27 | if (TC.Visible && PtInRect(Common.TabPlus.rc[Id], ptc)) { 28 | return TC; 29 | } 30 | } 31 | }, 32 | 33 | DropTab: function (FV, hwnd, pt) { 34 | const sw = sha.Windows(); 35 | for (let i = 0; i < sw.Count; ++i) { 36 | const x = sw.item(i); 37 | if (x) { 38 | const w = x.Document.parentWindow; 39 | if (w && w.te && w.te.hwnd) { 40 | if (w.te.hwnd || hwnd, api.IsChild(w.te.hwnd, hwnd)) { 41 | const ptc = pt.Clone(); 42 | api.ScreenToClient(w.WebBrowser.hwnd, ptc); 43 | const rc = api.Memory("RECT"); 44 | api.GetClientRect(w.te.hwnd, rc); 45 | rc.left += w.te.offsetLeft; 46 | rc.top += w.te.offsetTop; 47 | rc.right -= w.te.offsetRight; 48 | rc.bottom -= w.te.offsetBottom; 49 | const cTC = w.te.Ctrls(CTRL_TC, true); 50 | let destFV; 51 | for (let i = 0; i < cTC.length; ++i) { 52 | const TC = cTC[i]; 53 | const left = Sync.TabPlus.GetData(rc, TC.Left); 54 | const top = Sync.TabPlus.GetData(rc, TC.Top); 55 | const right = left + Sync.TabPlus.GetData(rc, TC.Width); 56 | const bottom = top + Sync.TabPlus.GetData(rc, TC.Height); 57 | if (ptc.x >= left && ptc.x < right && ptc.y >= top && ptc.y < bottom) { 58 | destFV = TC.Selected; 59 | break; 60 | } 61 | } 62 | w.NavigateFV(destFV || te.Ctrl(CTRL_FV), FV.FolderItem.Path, SBSP_NEWBROWSER); 63 | if (api.GetKeyState(VK_CONTROL) >= 0) { 64 | FV.Close(); 65 | } 66 | return; 67 | } 68 | } 69 | } 70 | } 71 | ($.OpenInNewWindow || OpenInExplorer)(FV); 72 | if (api.GetKeyState(VK_CONTROL) >= 0) { 73 | FV.Close(); 74 | } 75 | }, 76 | 77 | GetData: function (rc, i) { 78 | const res = /^([\d\.]+)%$/.exec(i); 79 | if (res) { 80 | i = (rc.right - rc.left) * res[1] / 100; 81 | } 82 | return i; 83 | } 84 | } 85 | 86 | AddEvent("HitTest", function (Ctrl, pt, flags) { 87 | if (Ctrl.Type == CTRL_TC) { 88 | return Sync.TabPlus.FromPt(Ctrl.Id, pt); 89 | } 90 | }); 91 | 92 | AddEvent("DragEnter", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 93 | if (Ctrl.Type == CTRL_WB) { 94 | InvokeUI("Addons.TabPlus.SetRects"); 95 | pdwEffect[0] = DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK; 96 | return S_OK; 97 | } 98 | }); 99 | 100 | AddEvent("DragOver", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 101 | if (Ctrl.Type == CTRL_WB) { 102 | const TC = Sync.TabPlus.TCFromPt(pt); 103 | if (TC) { 104 | if (Common.TabPlus.Drag5 || /\ntabplus_\d+_\d+$/.test(dataObj.GetData())) { 105 | pdwEffect[0] = DROPEFFECT_MOVE; 106 | return S_OK; 107 | } 108 | const nIndex = Sync.TabPlus.FromPt(TC.Id, pt); 109 | if (nIndex >= 0) { 110 | const FV = TC[nIndex]; 111 | if (FV) { 112 | if (!g_.ptDrag || IsDrag(pt, g_.ptDrag)) { 113 | if (!Common.TabPlus.opt.NoDragOpen || (!FV.hwndView && FV.FolderItem.Enum)) { 114 | g_.ptDrag = pt.Clone(); 115 | InvokeUI("Addons.TabPlus.DragOver", TC.Id); 116 | } 117 | } 118 | if (dataObj.Count && Sync.TabPlus.DropTo) { 119 | const Target = FV.FolderItem; 120 | if (!api.ILIsEqual(dataObj.Item(-1), Target)) { 121 | let DropTarget = api.DropTarget(Target); 122 | if (DropTarget) { 123 | return DropTarget.DragOver(dataObj, grfKeyState, pt, pdwEffect); 124 | } 125 | } 126 | } 127 | } 128 | if (Sync.TabPlus.DropTo) { 129 | pdwEffect[0] = DROPEFFECT_NONE; 130 | return S_OK; 131 | } 132 | } 133 | if (dataObj.Count && dataObj.Item(0).IsFolder) { 134 | pdwEffect[0] = DROPEFFECT_LINK; 135 | return S_OK; 136 | } 137 | } 138 | } 139 | }); 140 | 141 | AddEvent("Drop", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 142 | if (Ctrl.Type == CTRL_WB) { 143 | const TC = Sync.TabPlus.TCFromPt(pt); 144 | if (TC) { 145 | let nIndex = Sync.TabPlus.FromPt(TC.Id, pt); 146 | if (Common.TabPlus.Drag5) { 147 | const res = /^tabplus_(\d+)_(\d+)/.exec(Common.TabPlus.Drag5); 148 | if (res) { 149 | if (nIndex < 0) { 150 | nIndex = TC.Count; 151 | } 152 | if (res[1] != TC.Id || res[2] != nIndex) { 153 | const TC1 = te.Ctrl(CTRL_TC, res[1]); 154 | TC1.Move(res[2], nIndex, TC); 155 | TC1.SelectedIndex = nIndex; 156 | } 157 | } 158 | Common.TabPlus.Drag5 = void 0; 159 | return S_OK; 160 | } 161 | if (nIndex >= 0 && Sync.TabPlus.DropTo) { 162 | let hr = S_FALSE; 163 | const DropTarget = TC[nIndex].DropTarget; 164 | if (DropTarget) { 165 | InvokeUI("Addons.TabPlus.DragLeave"); 166 | Common.TabPlus.bDropping = true; 167 | hr = DropTarget.Drop(dataObj, grfKeyState, pt, pdwEffect); 168 | Common.TabPlus.bDropping = false; 169 | } 170 | return hr; 171 | } 172 | if (dataObj.Count) { 173 | for (let i = 0; i < dataObj.Count; ++i) { 174 | const FV = TC.Selected.Navigate(dataObj.Item(i), SBSP_NEWBROWSER); 175 | TC.Move(FV.Index, nIndex >= 0 ? nIndex : TC.Count - 1); 176 | } 177 | return S_OK; 178 | } 179 | } 180 | } 181 | }); 182 | 183 | AddEvent("DragLeave", function (Ctrl) { 184 | InvokeUI("Addons.TabPlus.DragLeave"); 185 | return S_OK; 186 | }); 187 | 188 | AddEvent("SystemMessage", function (Ctrl, hwnd, msg, wParam, lParam) { 189 | if (Ctrl.Type == CTRL_TE && (msg == WM_ACTIVATE || msg == WM_ACTIVATEAPP)) { 190 | InvokeUI("Addons.TabPlus.SetRects"); 191 | } 192 | }); 193 | -------------------------------------------------------------------------------- /Debug/addons/titlebar/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.09 5 | 2021.3.27 6 | Tue, 17 Aug 2021 00:00:00 GMT 7 | 2 8 | Gaku 9 | https://tablacus.github.io/TablacusExplorerAddons/ 10 | MIT License 11 | 12 | 13 | Title bar 14 | Title bar 15 | 16 | 17 | Barre de titre 18 | Affichage de la barre de titre 19 | 20 | 21 | タイトルバー 22 | 23 | 24 | 標題列 25 | 26 | 27 | -------------------------------------------------------------------------------- /Debug/addons/titlebar/script.js: -------------------------------------------------------------------------------- 1 | if (window.Addon == 1) { 2 | AddEvent("ChangeView1", async function (Ctrl) { 3 | document.title = await Ctrl.Title + ' - ' + TITLE; 4 | }); 5 | } 6 | -------------------------------------------------------------------------------- /Debug/addons/toolbar/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.44 5 | 2022.3.27 6 | Thu, 31 Mar 2022 00:00:00 GMT 7 | Common:4,6:4 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Tool bar 15 | Tool bar 16 | 17 | 18 | Barre d'outils 19 | Définition de la barre d'outils 20 | 21 | 22 | ツールバー 23 | 24 | 25 | 工具列 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/toolbar/options.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 6 | 12 | 60 | 61 |
7 | 11 | 13 | 14 |
15 | 16 | 17 |
18 | 20 | 21 | 22 | 25 | 28 | 31 | 32 |
23 | 24 | 26 | 27 | 29 | 30 |
33 | 35 | 36 | 37 | 40 | 43 | 46 | 49 | 52 | 56 | 57 |
38 | 39 | 41 |
42 |
44 | 45 | 47 | 48 | 50 | 51 | 53 | 55 |
58 | 59 |
62 | 63 | 64 | 71 | 74 | 77 | 78 |
65 | 66 | 67 | 68 |   69 | 70 | 72 | 73 | 75 | 76 |
79 | 80 |
81 | -------------------------------------------------------------------------------- /Debug/addons/toolbar/options.js: -------------------------------------------------------------------------------- 1 | const ar = (await ReadTextFile("addons\\" + Addon_Id + "\\options.html")).split(""); 2 | SetTabContents(0, "View", ar[0]); 3 | SetTabContents(4, "General", ar[1]); 4 | 5 | SaveLocation = async function () { 6 | if (g_bChanged && document.E.Name.value) { 7 | await ReplaceTB('List'); 8 | } 9 | if (g_Chg["List"]) { 10 | const xml = await CreateXml(); 11 | const root = await xml.createElement("TablacusExplorer"); 12 | const o = document.E.List; 13 | for (let i = 0; i < o.length; i++) { 14 | const item = await xml.createElement("Item"); 15 | const a = o[i].value.split(g_sep); 16 | item.text = a[1]; 17 | await Promise.all([item.setAttribute("Name", a[0]), item.setAttribute("Type", a[2]), item.setAttribute("Icon", a[3]), item.setAttribute("Height", a[4])]); 18 | await root.appendChild(item); 19 | } 20 | await xml.appendChild(root); 21 | await SaveXmlEx(Addon_Id + ".xml", xml); 22 | te.Data["xml" + AddonName] = xml; 23 | } 24 | } 25 | 26 | EditTB = async function () { 27 | if (g_x.List.selectedIndex < 0) { 28 | return; 29 | } 30 | ClearX("List"); 31 | const a = g_x.List[g_x.List.selectedIndex].value.split(g_sep); 32 | SetType(document.E.Type, a[2]); 33 | const ix = ["Name", "Path", "Type", "Icon", "Height"]; 34 | for (let i = ix.length - 1; i >= 0; i--) { 35 | if (i != 2) { 36 | document.E.elements[ix[i]].value = a[i]; 37 | } 38 | } 39 | const p = await api.CreateObject("Object"); 40 | p.s = a[1]; 41 | await MainWindow.OptionDecode(a[2], p); 42 | document.E.Path.value = await p.s; 43 | SetImage(document.E, "_IconE"); 44 | } 45 | 46 | ReplaceTB = async function (mode) { 47 | ClearX(); 48 | if (g_x.List.selectedIndex < 0) { 49 | g_x.List.selectedIndex = ++g_x.List.length - 1; 50 | EnableSelectTag(g_x.List); 51 | } 52 | const sel = g_x.List[g_x.List.selectedIndex]; 53 | const o = document.E.Type; 54 | const p = await api.CreateObject("Object"); 55 | p.s = document.E.Path.value; 56 | await MainWindow.OptionEncode(o[o.selectedIndex].value, p); 57 | SetData(sel, [document.E.Name.value, await p.s, o[o.selectedIndex].value, document.E.Icon.value, document.E.Height.value]); 58 | g_Chg[mode] = true; 59 | } 60 | 61 | LoadX("List", await dialogArguments.Data.nEdit ? async function () { 62 | g_x.List.selectedIndex = await dialogArguments.Data.nEdit - 1; 63 | EditTB(); 64 | } : null, document.E); 65 | -------------------------------------------------------------------------------- /Debug/addons/toolbar/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "toolbar"; 2 | const Default = "ToolBar2Left"; 3 | if (window.Addon == 1) { 4 | Addons.ToolBar = { 5 | Click: async function (i, bNew) { 6 | const items = await GetXmlItems(await te.Data.xmlToolBar.getElementsByTagName("Item")); 7 | const item = items[i]; 8 | if (item) { 9 | Exec(te, item.text, (bNew && /^Open$|^Open in background$/i.test(item.type)) ? "Open in new tab" : item.Type, ui_.hwnd, null); 10 | } 11 | return false; 12 | }, 13 | 14 | Down: function (ev, i) { 15 | if ((ev.buttons != null ? ev.buttons : ev.button) == 4) { 16 | return this.Click(i, true); 17 | } 18 | }, 19 | 20 | Open: async function (ev, i) { 21 | if (Addons.ToolBar.bClose) { 22 | return S_OK; 23 | } 24 | if ((ev.buttons != null ? ev.buttons : ev.button) == 1) { 25 | const items = await te.Data.xmlToolBar.getElementsByTagName("Item"); 26 | let item = await items[i]; 27 | const hMenu = await api.CreatePopupMenu(); 28 | const arMenu = await api.CreateObject("Array"); 29 | for (let j = await GetLength(items); --j > i;) { 30 | await arMenu.unshift(j); 31 | } 32 | const o = document.getElementById("_toolbar" + i); 33 | const pt = await GetPosEx(o, 9); 34 | await MakeMenus(hMenu, null, arMenu, items, te, pt); 35 | await AdjustMenuBreak(hMenu); 36 | AddEvent("ExitMenuLoop", function () { 37 | Addons.ToolBar.bClose = true; 38 | setTimeout(function () { 39 | Addons.ToolBar.bClose = false; 40 | }, 99); 41 | }); 42 | const nVerb = await api.TrackPopupMenuEx(hMenu, TPM_RIGHTBUTTON | TPM_RETURNCMD, await pt.x, await pt.y, ui_.hwnd, null); 43 | api.DestroyMenu(hMenu); 44 | if (nVerb > 0) { 45 | item = await items[nVerb - 1]; 46 | Exec(te, await item.text, await item.getAttribute("Type"), ui_.hwnd, null); 47 | } 48 | return S_OK; 49 | } 50 | }, 51 | 52 | Popup: async function (ev, i) { 53 | if (i >= 0) { 54 | const hMenu = await api.CreatePopupMenu(); 55 | await api.InsertMenu(hMenu, MAXINT, MF_BYPOSITION | MF_STRING, 1, await GetText("&Edit")); 56 | await api.InsertMenu(hMenu, MAXINT, MF_BYPOSITION | MF_STRING, 2, await GetText("Add")); 57 | const nVerb = await api.TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, ev.screenX * ui_.Zoom, ev.screenY * ui_.Zoom, ui_.hwnd, null, null); 58 | if (nVerb == 1) { 59 | this.ShowOptions(i + 1); 60 | } 61 | if (nVerb == 2) { 62 | this.ShowOptions(); 63 | } 64 | api.DestroyMenu(hMenu); 65 | } 66 | }, 67 | 68 | ShowOptions: async function (nEdit) { 69 | const opt = await api.CreateObject("Object"); 70 | opt.nEdit = nEdit; 71 | AddonOptions("toolbar", "Addons.ToolBar.Changed", opt); 72 | }, 73 | 74 | Changed: function () { 75 | Addons.ToolBar.Arrange(); 76 | ApplyLang(document); 77 | }, 78 | 79 | FromPt: function (n, pt) { 80 | while (--n >= 0) { 81 | if (HitTest(document.getElementById("_toolbar" + n), pt)) { 82 | return n; 83 | } 84 | } 85 | return -1; 86 | }, 87 | 88 | Arrange: async function () { 89 | const s = []; 90 | const items = await GetXmlItems(await te.Data.xmlToolBar.getElementsByTagName("Item")); 91 | let menus = 0; 92 | const nLen = items.length; 93 | for (let i = 0; i < nLen; ++i) { 94 | const item = items[i]; 95 | const strType = item.Type; 96 | const strFlag = SameText(strType, "Menus") ? item.text : ""; 97 | if (SameText(strFlag, "close") && menus) { 98 | menus--; 99 | continue; 100 | } 101 | if (SameText(strFlag, "open")) { 102 | if (menus++) { 103 | continue; 104 | } 105 | } else if (menus) { 106 | continue; 107 | } 108 | let img = EncodeSC(await ExtractMacro(te, item.Name)); 109 | if (img == "/" || SameText(strFlag, "break")) { 110 | s.push('
'); 111 | } else if (img == "//" || SameText(strFlag, "barbreak")) { 112 | s.push('
'); 113 | } else if (img == "-" || SameText(strFlag, "separator")) { 114 | s.push('|'); 115 | } else { 116 | let icon = item.Icon; 117 | if (icon) { 118 | let h = (item.Height * screen.deviceYDPI / 96); 119 | let sh = { 120 | src: await ExtractPath(te, icon) 121 | }; 122 | if (h && isFinite(h)) { 123 | sh.style = 'width:' + h + 'px; height:' + h + 'px'; 124 | } 125 | img = await GetImgTag(sh, h); 126 | } 127 | s.push('', img, ''); 129 | } 130 | } 131 | if (nLen == 0) { 132 | s.push(''); 133 | } 134 | document.getElementById('_toolbar').innerHTML = s.join(""); 135 | Resize(); 136 | }, 137 | 138 | Changed: function () { 139 | Addons.ToolBar.Arrange(); 140 | ApplyLang(document.getElementById("_toolbar")); 141 | }, 142 | 143 | SetRects: async function () { 144 | const items = await GetXmlItems(await te.Data.xmlToolBar.getElementsByTagName("Item")); 145 | Common.ToolBar.Count = items.length; 146 | for (let i = 0; i < items.length; ++i) { 147 | const el = document.getElementById("_toolbar" + i); 148 | if (el) { 149 | Common.ToolBar.Items[i] = await GetRect(el); 150 | } 151 | } 152 | Common.ToolBar.Append = await GetRect(document.getElementById('_toolbar')); 153 | } 154 | } 155 | 156 | AddEvent("Layout", async function () { 157 | await SetAddon(Addon_Id, Default, ''); 158 | await Addons.ToolBar.Arrange(); 159 | }); 160 | 161 | te.Data.xmlToolBar = await OpenXml("toolbar.xml", false, true); 162 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 163 | } else { 164 | AddonName = "ToolBar"; 165 | importScript("addons\\" + Addon_Id + "\\options.js"); 166 | } 167 | -------------------------------------------------------------------------------- /Debug/addons/toolbar/sync.js: -------------------------------------------------------------------------------- 1 | Common.ToolBar = api.CreateObject("Object"); 2 | Common.ToolBar.Items = api.CreateObject("Array"); 3 | 4 | Sync.ToolBar = { 5 | FromPt: function (ptc) { 6 | for (let i = Common.ToolBar.Count; --i >= 0;) { 7 | if (PtInRect(Common.ToolBar.Items[i], ptc)) { 8 | return i; 9 | } 10 | } 11 | return -1; 12 | }, 13 | 14 | Append: function (dataObj) { 15 | const xml = te.Data.xmlToolBar; 16 | let root = xml.documentElement; 17 | if (!root) { 18 | xml.appendChild(xml.createProcessingInstruction("xml", 'version="1.0" encoding="UTF-8"')); 19 | root = xml.createElement("TablacusExplorer"); 20 | xml.appendChild(root); 21 | } 22 | if (root) { 23 | for (let i = 0; i < dataObj.Count; i++) { 24 | const FolderItem = dataObj.Item(i); 25 | const item = xml.createElement("Item"); 26 | item.setAttribute("Name", api.GetDisplayNameOf(FolderItem, SHGDN_INFOLDER)); 27 | item.text = api.GetDisplayNameOf(FolderItem, SHGDN_FORPARSINGEX | SHGDN_FORPARSING); 28 | if (fso.FileExists(item.text)) { 29 | item.text = PathQuoteSpaces(item.text); 30 | item.setAttribute("Type", "Exec"); 31 | } else { 32 | item.setAttribute("Type", "Open"); 33 | } 34 | root.appendChild(item); 35 | } 36 | SaveXmlEx("toolbar.xml", xml); 37 | InvokeUI("Addons.ToolBar.Changed"); 38 | } 39 | } 40 | } 41 | 42 | AddEvent("DragEnter", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 43 | if (Ctrl.Type == CTRL_WB) { 44 | InvokeUI("Addons.ToolBar.SetRects"); 45 | return S_OK; 46 | } 47 | }); 48 | 49 | AddEvent("DragOver", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 50 | if (Ctrl.Type == CTRL_WB) { 51 | const ptc = pt.Clone(); 52 | api.ScreenToClient(WebBrowser.hwnd, ptc); 53 | const items = te.Data.xmlToolBar.getElementsByTagName("Item"); 54 | const i = Sync.ToolBar.FromPt(ptc); 55 | if (i >= 0) { 56 | const hr = Exec(te, items[i].text, items[i].getAttribute("Type"), te.hwnd, pt, dataObj, grfKeyState, pdwEffect); 57 | if (hr == S_OK && pdwEffect[0]) { 58 | MouseOver("_toolbar" + i); 59 | } 60 | return S_OK; 61 | } else if (dataObj.Count && PtInRect(Common.ToolBar.Append, ptc)) { 62 | MouseOver("_toolbar+"); 63 | pdwEffect[0] = DROPEFFECT_LINK; 64 | return S_OK; 65 | } 66 | } 67 | MouseOut("_toolbar"); 68 | }); 69 | 70 | AddEvent("Drop", function (Ctrl, dataObj, grfKeyState, pt, pdwEffect) { 71 | MouseOut(); 72 | if (Ctrl.Type == CTRL_WB) { 73 | const ptc = pt.Clone(); 74 | api.ScreenToClient(WebBrowser.hwnd, ptc); 75 | const items = te.Data.xmlToolBar.getElementsByTagName("Item"); 76 | const i = Sync.ToolBar.FromPt(ptc); 77 | if (i >= 0) { 78 | return Exec(te, items[i].text, items[i].getAttribute("Type"), te.hwnd, pt, dataObj, grfKeyState, pdwEffect, true); 79 | } else if (dataObj.Count && PtInRect(Common.ToolBar.Append, ptc)) { 80 | Sync.ToolBar.Append(dataObj); 81 | return S_OK; 82 | } 83 | } 84 | }); 85 | 86 | AddEvent("DragLeave", function (Ctrl) { 87 | MouseOut(); 88 | return S_OK; 89 | }); 90 | 91 | -------------------------------------------------------------------------------- /Debug/addons/treeview/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.48 5 | 2024.10.11 6 | Fri, 22 Nov 2024 00:00:00 GMT 7 | Common:0,5,6,7,8,9:0 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Tree view 15 | Tree view 16 | 17 | 18 | Arborescence 19 | Définition de la vue arborescente 20 | 21 | 22 | ツリー 23 | 24 | 25 | 樹狀目錄 26 | 27 | 28 | -------------------------------------------------------------------------------- /Debug/addons/treeview/options.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | -------------------------------------------------------------------------------- /Debug/addons/treeview/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "treeview"; 2 | const Default = "ToolBar2Left"; 3 | const item = await GetAddonElement(Addon_Id); 4 | if (!item.getAttribute("Set")) { 5 | item.setAttribute("MenuPos", -1); 6 | item.setAttribute("List", 1); 7 | } 8 | if (window.Addon == 1) { 9 | Addons.TreeView = { 10 | Popup: async function (o) { 11 | const FV = await GetFolderView(o); 12 | if (FV) { 13 | FV.Focus(); 14 | const TV = await FV.TreeView; 15 | if (TV) { 16 | InputDialog(await GetText("Width"), await TV.Width, function (n) { 17 | if (n) { 18 | TV.Width = n; 19 | TV.Align = true; 20 | } 21 | }); 22 | } 23 | } 24 | return false; 25 | } 26 | }; 27 | 28 | AddEvent("Layout", async function () { 29 | const h = GetIconSizeEx(item); 30 | SetAddon(Addon_Id, Default, ['', await GetImgTag({ 31 | title: await GetText("Tree"), 32 | src: item.getAttribute("Icon") || "bitmap:ieframe.dll,214,24,43" 33 | }, h), '']); 34 | }); 35 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 36 | } else { 37 | EnableInner(); 38 | SetTabContents(0, "General", await ReadTextFile("addons\\" + Addon_Id + "\\options.html")); 39 | } 40 | -------------------------------------------------------------------------------- /Debug/addons/treeview/sync.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "treeview"; 2 | const item = GetAddonElement(Addon_Id); 3 | 4 | Sync.TreeView = { 5 | strName: "Tree", 6 | List: item.getAttribute("List"), 7 | nPos: 0, 8 | Depth: GetNum(item.getAttribute("Depth")), 9 | Collapse: GetNum(item.getAttribute("Collapse")), 10 | 11 | Exec: function (Ctrl, pt) { 12 | const FV = GetFolderView(Ctrl, pt); 13 | if (FV) { 14 | FV.Focus(); 15 | const TV = FV.TreeView; 16 | if (TV) { 17 | TV.Visible = !TV.Visible; 18 | if (TV.Visible) { 19 | if (!TV.Width) { 20 | TV.Width = 200; 21 | } 22 | Sync.TreeView.Expand(FV); 23 | } 24 | } 25 | } 26 | return S_OK; 27 | }, 28 | 29 | Expand: function (Ctrl) { 30 | if (Sync.TreeView.List && Ctrl.FolderItem && IsWitness(Ctrl.FolderItem)) { 31 | const TV = Ctrl.TreeView; 32 | if (TV) { 33 | if (Sync.TreeView.Collapse) { 34 | const hwnd = TV.hwndTree; 35 | let hItem = api.SendMessage(hwnd, TVM_GETNEXTITEM, 9, null); 36 | let Now = TV.SelectedItem; 37 | let New = Ctrl.FolderItem; 38 | let nUp = Sync.TreeView.Depth ? 0 : 1; 39 | while (api.ILGetCount(New) > api.ILGetCount(Now)) { 40 | New = api.ILRemoveLastID(New); 41 | } 42 | while (api.ILGetCount(Now) > api.ILGetCount(New)) { 43 | Now = api.ILRemoveLastID(Now); 44 | ++nUp; 45 | } 46 | while (!api.ILIsEqual(Now, New) && api.ILGetCount(Now) > 1) { 47 | New = api.ILRemoveLastID(New); 48 | Now = api.ILRemoveLastID(Now); 49 | ++nUp; 50 | } 51 | while (--nUp > 0) { 52 | hItem = api.SendMessage(hwnd, TVM_GETNEXTITEM, 3, hItem); 53 | } 54 | do { 55 | api.PostMessage(hwnd, TVM_EXPAND, 0x8001, hItem); 56 | } while (hItem = api.SendMessage(hwnd, TVM_GETNEXTITEM, 1, hItem)); 57 | } 58 | TV.Expand(Ctrl.FolderItem, Sync.TreeView.Depth); 59 | } 60 | } 61 | }, 62 | 63 | Refresh: function (Ctrl, pt) { 64 | const FV = GetFolderView(Ctrl, pt); 65 | FV.TreeView.Refresh(); 66 | Sync.TreeView.Expand(FV); 67 | } 68 | }; 69 | 70 | if (GetNum(item.getAttribute("Refresh"))) { 71 | AddEvent("Refresh", Sync.TreeView.Refresh); 72 | if (WINVER >= 0x600) { 73 | Sync.TreeView.WM = TWM_APP++; 74 | AddEvent("AppMessage", function (Ctrl, hwnd, msg, wParam, lParam) { 75 | if (msg == Sync.TreeView.WM) { 76 | const pidls = {}; 77 | const hLock = api.SHChangeNotification_Lock(wParam, lParam, pidls); 78 | if (hLock) { 79 | api.SHChangeNotification_Unlock(hLock); 80 | if (pidls[0] && /^[A-Z]:\\|^\\\\\w/i.test(pidls[0].Path) && IsWitness(pidls[0])) { 81 | const cFV = te.Ctrls(CTRL_FV); 82 | for (let i in cFV) { 83 | cFV[i].TreeView.Notify(pidls.lEvent, pidls[0], pidls[1], wParam, lParam); 84 | } 85 | } 86 | } 87 | return S_OK; 88 | } 89 | }); 90 | 91 | AddEvent("Finalize", function () { 92 | api.SHChangeNotifyDeregister(Sync.TreeView.uRegisterId); 93 | }); 94 | 95 | Sync.TreeView.uRegisterId = api.SHChangeNotifyRegister(te.hwnd, SHCNRF_InterruptLevel | SHCNRF_NewDelivery, SHCNE_MKDIR | SHCNE_MEDIAINSERTED | SHCNE_DRIVEADD | SHCNE_NETSHARE | SHCNE_DRIVEREMOVED | SHCNE_MEDIAREMOVED | SHCNE_NETUNSHARE | SHCNE_RENAMEFOLDER | SHCNE_RMDIR | SHCNE_SERVERDISCONNECT | SHCNE_UPDATEDIR, Sync.TreeView.WM, ssfDESKTOP, true); 96 | } 97 | } else { 98 | SetKeyExec("Tree", "$3f,Ctrl+R", function (Ctrl, pt) { 99 | Sync.TreeView.Refresh(Ctrl, pt); 100 | return S_OK; 101 | }, "Func", true); 102 | } 103 | 104 | if (Sync.TreeView.List) { 105 | AddEvent("ChangeView", Sync.TreeView.Expand); 106 | } 107 | 108 | //Menu 109 | if (item.getAttribute("MenuExec")) { 110 | Sync.TreeView.nPos = api.LowPart(item.getAttribute("MenuPos")); 111 | Sync.TreeView.strName = item.getAttribute("MenuName") || Sync.TreeView.strName; 112 | AddEvent(item.getAttribute("Menu"), function (Ctrl, hMenu, nPos) { 113 | api.InsertMenu(hMenu, Sync.TreeView.nPos, MF_BYPOSITION | MF_STRING, ++nPos, GetText(Sync.TreeView.strName)); 114 | ExtraMenuCommand[nPos] = Sync.TreeView.Exec; 115 | return nPos; 116 | }); 117 | } 118 | //Key 119 | if (item.getAttribute("KeyExec")) { 120 | SetKeyExec(item.getAttribute("KeyOn"), item.getAttribute("Key"), Sync.TreeView.Exec, "Func"); 121 | } 122 | //Mouse 123 | if (item.getAttribute("MouseExec")) { 124 | SetGestureExec(item.getAttribute("MouseOn"), item.getAttribute("Mouse"), Sync.TreeView.Exec, "Func"); 125 | } 126 | 127 | if (Sync.TreeView.List) { 128 | SetGestureExec("Tree", "1", function (Ctrl, pt) { 129 | const Item = Ctrl.HitTest(pt); 130 | if (Item) { 131 | const FV = Ctrl.FolderView; 132 | if (!api.ILIsEqual(FV.FolderItem, Item) && Item.IsFolder) { 133 | setTimeout(function () { 134 | FV.Navigate(Item, GetNavigateFlags(FV)); 135 | }, 99); 136 | } 137 | } 138 | return S_OK; 139 | }, "Func", true); 140 | } 141 | 142 | SetGestureExec("Tree", "11", function (Ctrl, pt) { 143 | const Item = Ctrl.HitTest(pt); 144 | if (Item) { 145 | const FV = Ctrl.FolderView; 146 | if (!api.ILIsEqual(FV.FolderItem, Item)) { 147 | setTimeout(function () { 148 | FolderMenu.Invoke(Item, void 0, FV); 149 | }, 99); 150 | } 151 | } 152 | return S_OK; 153 | }, "Func", true); 154 | 155 | SetGestureExec("Tree", "3", function (Ctrl, pt) { 156 | const Item = Ctrl.SelectedItem; 157 | if (Item) { 158 | setTimeout(function () { 159 | Ctrl.FolderView.Navigate(Item, SBSP_NEWBROWSER); 160 | }, 99); 161 | } 162 | return S_OK; 163 | }, "Func", true); 164 | 165 | //Tab 166 | SetKeyExec("Tree", "$f", function (Ctrl, pt) { 167 | const FV = GetFolderView(Ctrl, pt); 168 | FV.focus(); 169 | return S_OK; 170 | }, "Func", true); 171 | 172 | //Enter 173 | SetKeyExec("Tree", "$1c", function (Ctrl, pt) { 174 | const FV = GetFolderView(Ctrl, pt); 175 | FV.Navigate(Ctrl.SelectedItem, GetNavigateFlags(FV)); 176 | return S_OK; 177 | }, "Func", true); 178 | 179 | AddTypeEx("Add-ons", "Tree", Sync.TreeView.Exec); 180 | -------------------------------------------------------------------------------- /Debug/addons/undoclosetab/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.18 5 | 2024.8.6 6 | Mon, 23 Sep 2024 00:00:00 GMT 7 | Common:0,5,6,7,8,9:0 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Undo close tab 15 | Undo close tab. 16 | 17 | 18 | Défaire la fermeture d'onglet 19 | Annule la dernière fermeture d'onglet. 20 | 21 | 22 | 閉じたタブを元に戻す 23 | 24 | 25 | 復原已關閉分頁 26 | 27 | 28 | 恢复已关闭的选项卡 29 | 30 | 31 | -------------------------------------------------------------------------------- /Debug/addons/undoclosetab/lang/ja.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 閉じたタブを元に戻す(&U) 4 | 5 | -------------------------------------------------------------------------------- /Debug/addons/undoclosetab/lang/zh.xml: -------------------------------------------------------------------------------- 1 | 2 | 重新打开关闭的选项卡 3 | 4 | -------------------------------------------------------------------------------- /Debug/addons/undoclosetab/lang/zh_cn.xml: -------------------------------------------------------------------------------- 1 | 2 | 重新打开关闭的选项卡 3 | 4 | -------------------------------------------------------------------------------- /Debug/addons/undoclosetab/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "undoclosetab"; 2 | const Default = "None"; 3 | const item = await GetAddonElement(Addon_Id); 4 | if (!item.getAttribute("Set")) { 5 | item.setAttribute("MenuExec", 1); 6 | item.setAttribute("Menu", "Tabs"); 7 | item.setAttribute("MenuPos", 0); 8 | 9 | item.setAttribute("KeyExec", 1); 10 | item.setAttribute("Key", "Shift+Ctrl+T"); 11 | item.setAttribute("KeyOn", "All"); 12 | 13 | item.setAttribute("MouseExec", 1); 14 | item.setAttribute("Mouse", "3"); 15 | item.setAttribute("MouseOn", "Tabs_Background"); 16 | } 17 | if (window.Addon == 1) { 18 | Addons.UndoCloseTab = { 19 | Popup: async function (Ctrl, pt) { 20 | if (Addons.RecentlyClosedTabs) { 21 | Addons.RecentlyClosedTabs.Exec(Ctrl, pt); 22 | } 23 | }, 24 | 25 | KillTimer: function () { 26 | if (Addons.UndoCloseTab.tid) { 27 | clearTimeout(Addons.UndoCloseTab.tid); 28 | delete Addons.UndoCloseTab.tid; 29 | } 30 | }, 31 | 32 | Save: function () { 33 | Addons.UndoCloseTab.KillTimer(); 34 | Common.UndoCloseTab.bSave = true; 35 | Addons.UndoCloseTab.tid = setTimeout(function () { 36 | Sync.UndoCloseTab.SaveEx() 37 | }, 999); 38 | } 39 | } 40 | 41 | AddEvent("Layout", async function () { 42 | SetAddon(Addon_Id, Default, ['', await GetImgTag({ 43 | title: item.getAttribute("MenuName") || await GetAddonInfo(Addon_Id).Name, 44 | src: item.getAttribute("Icon") || "icon:browser,16" 45 | }, GetIconSizeEx(item)), '']); 46 | }); 47 | 48 | $.importScript("addons\\" + Addon_Id + "\\sync.js"); 49 | } else { 50 | EnableInner(); 51 | SetTabContents(0, "General", '
'); 52 | } 53 | -------------------------------------------------------------------------------- /Debug/addons/undoclosetab/sync.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "undoclosetab"; 2 | const item = GetAddonElement(Addon_Id); 3 | 4 | Common.UndoCloseTab = api.CreateObject("Object"); 5 | Sync.UndoCloseTab = { 6 | Items: item.getAttribute("Save") || 30, 7 | strName: item.getAttribute("MenuName") || GetAddonInfo(Addon_Id).Name, 8 | nPos: GetNum(item.getAttribute("MenuPos")), 9 | CONFIG: fso.BuildPath(te.Data.DataFolder, "config\\closedtabs.xml"), 10 | 11 | Exec: function (Ctrl, pt) { 12 | const FV = GetFolderView(Ctrl, pt); 13 | if (FV) { 14 | Sync.UndoCloseTab.bLock = true; 15 | const db = (Common.UndoCloseTab.db || []); 16 | while (db.length) { 17 | Sync.UndoCloseTab.bFail = false; 18 | Sync.UndoCloseTab.Open(FV, 0); 19 | if (!Sync.UndoCloseTab.bFail) { 20 | break; 21 | } 22 | } 23 | Sync.UndoCloseTab.bLock = false; 24 | } 25 | return S_OK; 26 | }, 27 | 28 | Open: function (FV, i) { 29 | if (FV) { 30 | const Items = Sync.UndoCloseTab.Get(i); 31 | const db = (Common.UndoCloseTab.db || []); 32 | db.splice(i, 1); 33 | FV.Navigate(Items, SBSP_NEWBROWSER); 34 | InvokeUI("Addons.UndoCloseTab.Save"); 35 | } 36 | }, 37 | 38 | Get: function (nIndex) { 39 | const db = (Common.UndoCloseTab.db || []); 40 | db.splice(Sync.UndoCloseTab.Items, MAXINT); 41 | let s = db[nIndex]; 42 | if ("string" === typeof s) { 43 | const a = s.split(/\n/); 44 | s = api.CreateObject("FolderItems"); 45 | s.Index = a.pop(); 46 | for (let i in a) { 47 | s.AddItem(a[i]); 48 | } 49 | db[nIndex] = s; 50 | } 51 | return s; 52 | }, 53 | 54 | Load: function () { 55 | const db = api.CreateObject("Array"); 56 | const xml = OpenXml("closedtabs.xml", true, false); 57 | if (xml) { 58 | const items = xml.getElementsByTagName('Item'); 59 | for (let i = items.length; i--;) { 60 | db.unshift(items[i].text); 61 | } 62 | } 63 | Common.UndoCloseTab.db = db; 64 | Sync.UndoCloseTab.ModifyDate = api.ILCreateFromPath(Sync.UndoCloseTab.CONFIG).ModifyDate; 65 | }, 66 | 67 | SaveEx: function () { 68 | if (Common.UndoCloseTab.bSave) { 69 | Common.UndoCloseTab.bSave = false; 70 | InvokeUI("Addons.UndoCloseTab.KillTimer"); 71 | const xml = CreateXml(); 72 | const root = xml.createElement("TablacusExplorer"); 73 | 74 | const db = (Common.UndoCloseTab.db || []); 75 | for (let i = 0; i < db.length; i++) { 76 | const item = xml.createElement("Item"); 77 | let s = db[i]; 78 | if (s) { 79 | if ("string" !== typeof s) { 80 | const a = []; 81 | for (let j in s) { 82 | a.push(api.GetDisplayNameOf(s[j], SHGDN_FORPARSING | SHGDN_FORPARSINGEX)); 83 | } 84 | a.push(s.Index); 85 | s = a.join("\n"); 86 | } 87 | item.text = s; 88 | root.appendChild(item); 89 | } 90 | } 91 | xml.appendChild(root); 92 | SaveXmlEx("closedtabs.xml", xml, true); 93 | Sync.UndoCloseTab.ModifyDate = api.ILCreateFromPath(Sync.UndoCloseTab.CONFIG).ModifyDate; 94 | } 95 | } 96 | } 97 | Sync.UndoCloseTab.Load(); 98 | 99 | AddEvent("CloseView", function (Ctrl) { 100 | if (Ctrl.FolderItem) { 101 | if (Sync.UndoCloseTab.bLock) { 102 | Sync.UndoCloseTab.bFail = true; 103 | } else if (Ctrl.History.Count) { 104 | const db = (Common.UndoCloseTab.db || []); 105 | db.unshift(Ctrl.History); 106 | db.splice(Sync.UndoCloseTab.Items, MAXINT); 107 | InvokeUI("Addons.UndoCloseTab.Save"); 108 | } 109 | } 110 | return S_OK; 111 | }); 112 | 113 | AddEvent("SaveConfig", Sync.UndoCloseTab.SaveEx); 114 | 115 | AddEvent("ChangeNotifyItem:" + Sync.UndoCloseTab.CONFIG, function (pid) { 116 | if (pid.ModifyDate - Sync.UndoCloseTab.ModifyDate) { 117 | Sync.UndoCloseTab.Load(); 118 | } 119 | }); 120 | 121 | //Menu 122 | if (item.getAttribute("MenuExec")) { 123 | AddEvent(item.getAttribute("Menu"), function (Ctrl, hMenu, nPos) { 124 | const db = (Common.UndoCloseTab.db || []); 125 | api.InsertMenu(hMenu, Sync.UndoCloseTab.nPos, MF_BYPOSITION | MF_STRING | (db.length ? MF_ENABLED : MF_DISABLED), ++nPos, GetText(Sync.UndoCloseTab.strName)); 126 | ExtraMenuCommand[nPos] = Sync.UndoCloseTab.Exec; 127 | return nPos; 128 | }); 129 | } 130 | //Key 131 | if (item.getAttribute("KeyExec")) { 132 | SetKeyExec(item.getAttribute("KeyOn"), item.getAttribute("Key"), Sync.UndoCloseTab.Exec, "Func"); 133 | } 134 | //Mouse 135 | if (item.getAttribute("MouseExec")) { 136 | SetGestureExec(item.getAttribute("MouseOn"), item.getAttribute("Mouse"), Sync.UndoCloseTab.Exec, "Func"); 137 | } 138 | 139 | AddTypeEx("Add-ons", "Undo close tab", Sync.UndoCloseTab.Exec); 140 | -------------------------------------------------------------------------------- /Debug/addons/up/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1.20 5 | 2021.7.23 6 | Tue, 17 Aug 2021 00:00:00 GMT 7 | Common:5,6,7,8,9:5 8 | 2 9 | Gaku 10 | https://tablacus.github.io/TablacusExplorerAddons/ 11 | MIT License 12 | 13 | 14 | Up 15 | Up 16 | 17 | 18 | Remonter - global 19 | Place ce bouton dans la barre d'outil principale 20 | 21 | 22 | 上へ 23 | 24 | 25 | -------------------------------------------------------------------------------- /Debug/addons/up/script.js: -------------------------------------------------------------------------------- 1 | const Addon_Id = "up"; 2 | const Default = "ToolBar2Left"; 3 | let item = await GetAddonElement(Addon_Id); 4 | if (!item.getAttribute("Set")) { 5 | item.setAttribute("Menu", "View"); 6 | item.setAttribute("MenuPos", -1); 7 | 8 | item.setAttribute("KeyOn", "List"); 9 | item.setAttribute("Key", "$e"); 10 | 11 | item.setAttribute("MouseOn", "List"); 12 | item.setAttribute("Mouse", "2U"); 13 | } 14 | if (window.Addon == 1) { 15 | Addons.Up = { 16 | Exec: async function (Ctrl, pt) { 17 | const FV = await GetFolderView(Ctrl, pt); 18 | FV.Focus(); 19 | Exec(FV, "Up", "Tabs", 0, pt); 20 | }, 21 | 22 | Popup: async function (el) { 23 | const FV = await GetFolderView(el); 24 | if (FV) { 25 | FV.Focus(); 26 | await FolderMenu.Clear(); 27 | const hMenu = await api.CreatePopupMenu(); 28 | let FolderItem = await FV.FolderItem; 29 | if (await api.ILIsEmpty(FolderItem)) { 30 | FolderItem = ssfDRIVES; 31 | } 32 | while (!await api.ILIsEmpty(FolderItem)) { 33 | FolderItem = await api.ILRemoveLastID(FolderItem); 34 | FolderMenu.AddMenuItem(hMenu, FolderItem); 35 | } 36 | const pt = GetPos(el, 9); 37 | const nVerb = await FolderMenu.TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y); 38 | api.DestroyMenu(hMenu); 39 | if (nVerb) { 40 | await FolderMenu.Invoke(await FolderMenu.Items[nVerb - 1]); 41 | } 42 | FolderMenu.Clear(); 43 | } 44 | return false; 45 | } 46 | }; 47 | //Menu 48 | const strName = item.getAttribute("MenuName") || await GetText("&Up One Level"); 49 | if (item.getAttribute("MenuExec")) { 50 | SetMenuExec("Up", strName, item.getAttribute("Menu"), item.getAttribute("MenuPos")); 51 | } 52 | //Key 53 | if (item.getAttribute("KeyExec")) { 54 | SetKeyExec(item.getAttribute("KeyOn"), item.getAttribute("Key"), Addons.Up.Exec, "Async", true); 55 | } 56 | //Mouse 57 | if (item.getAttribute("MouseExec")) { 58 | SetGestureExec(item.getAttribute("MouseOn"), item.getAttribute("Mouse"), Addons.Up.Exec, "Async", true); 59 | } 60 | 61 | if (item.getAttribute("Location") == "Inner") { 62 | AddEvent("ChangeView2", async function (Ctrl) { 63 | DisableImage(document.getElementById("ImgUp_" + await Ctrl.Parent.Id), await api.ILIsEmpty(Ctrl)); 64 | }); 65 | } else { 66 | AddEvent("ChangeView1", async function (Ctrl) { 67 | DisableImage(document.getElementById("ImgUp_$"), await api.ILIsEmpty(Ctrl)); 68 | }); 69 | } 70 | 71 | AddEvent("Layout", async function () { 72 | SetAddon(Addon_Id, Default, ['', await GetImgTag({ 73 | id: "ImgUp_$", 74 | title: strName, 75 | src: item.getAttribute("Icon") || "icon:general,28" 76 | }, GetIconSizeEx(item)), '']); 77 | delete item; 78 | }); 79 | } else { 80 | EnableInner(); 81 | } 82 | -------------------------------------------------------------------------------- /Debug/init/addons.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Debug/init/key.xml: -------------------------------------------------------------------------------- 1 | RefreshToggleFullscreen();Next TabPrevious Tabvar TC = te.Ctrl(CTRL_TC); 2 | if (TC) { 3 | if (TC.Selected.CurrentViewMode == FVM_DETAILS) { 4 | ChangeTab(TC, -1); 5 | return S_OK; 6 | } 7 | } 8 | return S_FALSE;var TC = te.Ctrl(CTRL_TC); 9 | if (TC) { 10 | if (TC.Selected.CurrentViewMode == FVM_DETAILS) { 11 | ChangeTab(TC, 1); 12 | return S_OK; 13 | } 14 | } 15 | return S_FALSE;01234567-1SearchBackForwardUpUpCtrl.SelectItem(null, SVSI_DESELECTOTHERS);\New folderCopy full pathRun dialogAdd to favoritesNew folderClose tabNew fileNew tabNotepad.exe0A:\10C:\D:\E:\F:\G:\H:\I:\NewFolder -------------------------------------------------------------------------------- /Debug/init/menus.xml: -------------------------------------------------------------------------------- 1 | OpenOpen in New TabOpen in BackgroundClose TabClose Other TabsClose Tabs on LeftClose Tabs on RightSeparatorRefreshNew TabSeparatorLockShow framesOpen in ExplorerSeparatorClose ApplicationCopy Full PathSeparatorUpRefreshReload CustomizeSeparatorLoad LayoutSave LayoutSeparatorAdd-onsGeneralGeneralSeparatorGeneralAdd-ons 2 | -------------------------------------------------------------------------------- /Debug/init/mouse.xml: -------------------------------------------------------------------------------- 1 | Previous TabNext TabBackForwardUpRefreshNew TabClose TabForwardBackOpen in BackgroundForwardUpNew TabLockClose TabPrevious TabNext TabNew Tab 2 | -------------------------------------------------------------------------------- /Debug/lang/zh.xml: -------------------------------------------------------------------------------- 1 | 2 | 正體中文 3 | 檔案(&F) 4 | 編輯(&E) 5 | 檢視(&V) 6 | 我的最愛(&A) 7 | 工具(&T) 8 | 協助(&H) 9 | 上一頁 10 | 下一頁 11 | 上移 12 | 下移 13 | 移至 14 | 關閉應用程式(&C) 15 | 上移一層(&U) 16 | 重新整理(&R) 17 | 重新載入自訂內容(&R) 18 | 載入佈局(&L)... 19 | 儲存佈局(&S)... 20 | 選項(&O)... 21 | 關閉頁籤(&C) 22 | 關閉其它頁籤(&O) 23 | 關閉所有頁籤 24 | 關閉左側頁籤 25 | 關閉右側頁籤 26 | 新增頁籤(&N) 27 | 切換檔案總管引擎(&E) 28 | 在檔案總管中開啟(&X) 29 | 一般 30 | 頁籤 31 | 樹狀檢視 32 | 清單 33 | 瀏覽器 34 | 預設 35 | 按鍵 36 | 滑鼠 37 | 初始化 38 | 確定 39 | 取消 40 | 樣式 41 | 類型 42 | 對齊 43 | 大小 44 | 位置 45 | 根節點 46 | 47 | 48 | 49 | 50 | 51 | 寬度 52 | 高度 53 | 54 | 自動 55 | 56 | 動作 57 | 在新頁籤中開啟(&T) 58 | 在背景中開啟 59 | 開啟方式... 60 | 傳送到... 61 | 62 | 取得目前資料夾檢視 63 | 64 | 初始化組態資料夾 65 | 如果您將 Tablacus Explorer 安裝在 Program Files 目錄內,請按下此按鈕。 66 | 請輸入寬度。 67 | 請輸入高度。 68 | 請稍候。 69 | 已完成。 70 | 設定預設值 71 | 選擇 72 | 瀏覽... 73 | 選擇項目 74 | 預設 LanguageID 75 | 新增資料夾 76 | 新增檔案 77 | 名稱 78 | 路徑 79 | 過濾器 80 | 資料夾 81 | 移除 82 | 加入 83 | 取代 84 | 全部 85 | 開啟 86 | 執行 87 | 基本 88 | 標準 89 | 連結 90 | 您確定嗎? 91 | 您想要取代嗎? 92 | 選單 93 | 上下文 94 | 系統 95 | 加入到我的最愛(&A)... 96 | 加入我的最愛 97 | 鎖定(&L) 98 | 別名 99 | 附加元件(&A)... 100 | 取得附加元件... 101 | 已啟用 102 | 啟用 103 | 訪問網站 104 | 訊息... 105 | 標題列 106 | 工具列 107 | 左側列 108 | 右側列 109 | 按鈕列 110 | 中央 111 | 背景 112 | 進階 113 | 114 | 顯示線條 115 | 停用標籤編輯 116 | 停用拖曳 117 | 停用訊息提示 118 | 單點一下展開 119 | 彈開 120 | 整行選擇 121 | 總是顯示選擇部份 122 | 邊框 123 | 水平捲動 124 | 125 | 枚舉旗標 126 | 非資料夾項目 127 | 包含隱藏項目 128 | 129 | 顯示 130 | 隱藏 131 | 展開 132 | 133 | 按鈕 134 | 平面 135 | 對立面捲動 136 | 複數行 137 | 固定寬度 138 | 不齊右 139 | 右/下 140 | 垂直 141 | 熱點追蹤 142 | 工具提示 143 | 強制圖示靠左 144 | 強制標籤靠左 145 | 146 | 殼層瀏覽器 147 | 檔案總管瀏覽器 148 | 149 | 自動排列 150 | 單選 151 | 無客戶區邊界 152 | 單點一下啟動 153 | 154 | 顯示框架 155 | 156 | 檢視旗標 157 | 顯示所有檔案 158 | 159 | 圖示 160 | 小圖示 161 | 清單 162 | 詳細資料 163 | 縮圖 164 | 並排 165 | 條狀縮圖 166 | 內容 167 | 或更高版本。 168 | 檢查有無更新 169 | %s 是最新版本。 170 | 有更新可用 171 | 您想要立即安裝嗎? 172 | 搜尋 173 | 安裝 174 | 已安裝 175 | %s 為必要的。 176 | 檔案正被操作。 177 | 手勢 178 | 軌跡 179 | 色彩 180 | 優先權 181 | 滾輪 182 | 在前加入 183 | 在後加入 184 | 工作列 185 | 下一個頁籤 186 | 上一個頁籤 187 | 執行對話框 188 | 複製完整路徑 189 | 測試 190 | 關閉 191 | 分隔線 192 | 斷開 193 | 斷開並分列 194 | 195 | 移動 196 | 複製 197 | 刪除 198 | 重新命名 199 | 解壓縮 200 | 儲存 201 | 載入 202 | 取得 %s... 203 | 結果 204 | 項目數 205 | 關於 %s 206 | 取得 207 | 拖放 208 | 交换 209 | 停用 210 | 211 | 資料夾項目 212 | 逾時 213 | 214 | -------------------------------------------------------------------------------- /Debug/lang/zh_cn.xml: -------------------------------------------------------------------------------- 1 | 2 | 简体中文 3 | 文件(&F) 4 | 编辑(&E) 5 | 查看(&V) 6 | 收藏(&A) 7 | 工具(&T) 8 | 帮助(&H) 9 | 返回 10 | 前进 11 | 上一个 12 | 下一个 13 | 转至 14 | 关闭程序(&C) 15 | 返回上级(&U) 16 | 刷新(&R) 17 | 重新加载自定义(&R) 18 | 加载布局...(&L) 19 | 保存布局...(&S) 20 | 选项...(&O) 21 | 关闭选项卡(&C) 22 | 关闭其他选项卡(&O) 23 | 关闭所有选项卡 24 | 关闭左边选项卡 25 | 关闭右边选项卡 26 | 新建选项卡(&T) 27 | 切换资源管理器引擎(&E) 28 | 在文件资源管理器中打开(&X) 29 | 常规 30 | 选项卡 31 | 树状结构 32 | 列表 33 | 浏览器 34 | 默认 35 | 键值 36 | 鼠标 37 | 初始化 38 | 确定 39 | 取消 40 | 样式 41 | 类型 42 | 对齐 43 | 大小 44 | 位置 45 | 根目录 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 自动 55 | 56 | 动作 57 | 在新建选项卡中打开(&T) 58 | 在后台选项卡在打开 59 | 打开方式... 60 | 发送到... 61 | 62 | 获取当前文件夹视图 63 | 64 | 初始化配置文件 65 | 如果你把 Tablacus Explorer 安装到 Program Files 目录,请点击此按钮。 66 | 请输入宽度 67 | 请输入高度 68 | 请稍后 69 | 完成 70 | 设为默认 71 | 选择 72 | 浏览... 73 | 选择项目 74 | 默认语言值 75 | 新建文件夹 76 | 新建文件 77 | 名称 78 | 路径 79 | 过滤 80 | 文件夹 81 | 移除 82 | 添加 83 | 替换 84 | 全部 85 | 打开 86 | 执行 87 | 基础 88 | 常规  89 | 链接 90 | 你确定吗? 91 | 确认替换? 92 | 菜单 93 | 右键菜单 94 | 系统 95 | 添加到收藏...(&A)... 96 | 添加收藏 97 | 锁定(&L) 98 | 别名 99 | 附加组件(&A)... 100 | 获取附加组件... 101 | 已启用 102 | 启用 103 | 查看网站 104 | 信息... 105 | 标题栏 106 | 工具栏 107 | 左栏 108 | 右栏 109 | 按钮栏 110 | 居中 111 | 背景 112 | 高级 113 | 114 | 显示网格线 115 | 无标记编辑 116 | 禁用拖放 117 | 无信息提示 118 | 点击展开 119 | 弹性展开 120 | 整行选择 121 | 总是显示选择器 122 | 加粗 123 | 水平滚动条 124 | 125 | 列举 126 | 非文件夹 127 | 包含隐藏项目 128 | 129 | 可见 130 | 隐藏 131 | 展开 132 | 133 | 按钮 134 | 扁平 135 | 反向滚动 136 | 复数行 137 | 固定宽度 138 | 非右对齐 139 | 右/下 140 | 垂直 141 | 热点追踪 142 | 工具提示 143 | 强制图标靠左 144 | 强制标记靠左 145 | 146 | 壳浏览器 147 | 资源管理器 148 | 149 | 自动整理 150 | 单个选区 151 | 无客户端边界 152 | 单击激活 153 | 154 | 显示框架 155 | 156 | 查看标识 157 | 显示所有文件 158 | 159 | 图标 160 | 小图标 161 | 列表 162 | 详细信息 163 | 缩略图 164 | 平铺 165 | 单个预览 166 | 内容 167 | 或更高版本。 168 | 检查更新 169 | %s 是最新版本。 170 | 有可用更新 171 | 你想要立即安装? 172 | 搜索 173 | 安装 174 | 已安装 175 | %s 是必须的。 176 | 文件被占用。 177 | 手势 178 | 轨迹 179 | 颜色 180 | 优先 181 | 滚轮 182 | 添加上一个 183 | 添加下一个 184 | 系统托盘 185 | 下一个选项卡 186 | 上一个选项卡 187 | 运行对话框 188 | 复制全部路径 189 | 测试 190 | 关闭 191 | 分隔符 192 | 断开 193 | 换行 194 | 195 | 移动 196 | 复制 197 | 删除 198 | 重命名 199 | 解压缩 200 | 保存 201 | 加载 202 | 获取 %s... 203 | 结果 204 | 项目数 205 | 关于 %s 206 | 获取 207 | 拖放 208 | 交换 209 | 禁用 210 | 211 | 文件夹  212 | 超时 213 | 214 | -------------------------------------------------------------------------------- /Debug/layout/1tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Debug/layout/4tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Debug/layout/bottom_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Debug/layout/h2tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Debug/layout/left_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Debug/layout/right_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Debug/layout/tree_1tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Debug/layout/tree_2tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Debug/layout/v2tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Debug/layout/vertical_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Debug/lib/te32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/Debug/lib/te32.dll -------------------------------------------------------------------------------- /Debug/lib/te64.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/Debug/lib/te64.dll -------------------------------------------------------------------------------- /Debug/lib/tewv32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/Debug/lib/tewv32.dll -------------------------------------------------------------------------------- /Debug/lib/tewv64.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/Debug/lib/tewv64.dll -------------------------------------------------------------------------------- /Debug/readme.txt: -------------------------------------------------------------------------------- 1 | A tabbed file manager with Add-on support. 2 | Tablacus Explorer 3 | 4 | Author: Gaku 5 | 6 | 7 | Features in Tablacus Explorer: 8 | 9 | * Tabbed interface 10 | * Add-on support 11 | * Completely Portable, No installation required 12 | * Multiple language and Unicode support 13 | * Customizable association, menus, keys, mouse gestures, alias 14 | * Open source 15 | * 64-bit(TE64.exe/x64 Edition) and 32-bit(TE32.exe/x86 Edition) versions are available 16 | 17 | 18 | Set up: 19 | 20 | * Extract the ZIP file to any folder 21 | * Run Tablacus Explorer (te64.exe/te32.exe) 22 | 23 | - In case you installed Tablacus Explorer to the Program Files directory: 24 | 25 | * Settings are saved in "%AppData%\tablacus\explorer\config". 26 | * Open Options 27 | * Press "Initialize config folder" 28 | 29 | 30 | Uninstall: 31 | 32 | * Delete the tablacus folder. 33 | 34 | - In case you installed Tablacus Explorer to the Program Files directory: 35 | 36 | * Delete the folder "%AppData%\tablacus" too. 37 | 38 | 39 | Multilingual: 40 | 41 | * Español / Spanish 42 | Translator : Patricio M. Ros 43 | 44 | * 正體中文 / Traditional Chinese 45 | Translator : 風逸蘭 46 | 47 | * Deutsch / German 48 | Translator : LightTempler 49 | 50 | * Português / Portuguese 51 | Sérgio Nova 52 | 53 | * Italiano / Italian 54 | Michele Pezza 55 | 56 | * 简体中文 / Simplified Chinese 57 | 秋寥 58 | 59 | * French / Français 60 | Olivier Wuillemin / bufferUnderrun 61 | 62 | * Russian / русский 63 | Hunter User 64 | 65 | * Turkish / Türkçe 66 | Ferhat Aydin 67 | 68 | Español latino / Spanish la 69 | DasinFlameS 70 | 71 | українська / Ukrainian 72 | Henaro aka Ironwool 73 | 74 | Nederlands / Nederlands 75 | mlohnen 76 | 77 | 78 | License: 79 | 80 | * MIT License 81 | http://www.opensource.org/licenses/mit-license.php 82 | 83 | 84 | URL 85 | https://tablacus.github.io/explorer_en.html 86 | 87 | 88 | Documents 89 | https://github.com/tablacus/TablacusExplorer/wiki 90 | 91 | 92 | Source 93 | https://github.com/tablacus/TablacusExplorer 94 | -------------------------------------------------------------------------------- /Debug/readme_jp.txt: -------------------------------------------------------------------------------- 1 | アドオンで拡張できるエクスプローラ互換のタブファイラー 2 | Tablacus Explorer 3 | 4 | 作者: Gaku 5 | 6 | 7 | Tablacus Explorerの特徴 8 | 9 | * タブ型ファイラー 10 | * アドオンで拡張可能 11 | * ポータブルアプリで設定の保存にレジストリを使用しません。 12 | * 多言語、ユニコード対応 13 | * 関連付け、メニュー、キー、マウスジェスチャ、エイリアスを自由に設定可能 14 | * オープンソース 15 | * 64ビット(TE64.exe/x64 Edition)および32ビット(TE32.exe/x86 Edition)バージョンが利用可能 16 | * Visial Basic、Visual C++や.NET Framework等のランタイムのインストールが不要で圧縮ファイルのファイルを解凍するだけで動作します。 17 | * USBにカスタマイズしたエクスプローラを入れて持ち歩きたい等、レジストリを変更せずにエクスプローラをカスタマイズしたい方に 18 | 19 | 20 | セットアップ 21 | 22 | * ZIPファイルをインストールしたいフォルダに展開してください。 23 | * Tablacus Explorer(te64.exe/te32.exe)を実行 24 | 25 | 26 | (Tablacus ExplorerをProgram Filesにインストールした場合) 27 | 28 | * 「%AppData%\tablacus\explorer\config」に設定ファイルが保存されます。 29 | * オプションを開く 30 | * 「設定フォルダの初期化」を押してください。 31 | 32 | 33 | アンインストール 34 | 35 | * インストールしたフォルダから削除してください。 36 | 37 | 38 | (Tablacus ExplorerをProgram Filesにインストールした場合) 39 | 40 | * 「%AppData%\tablacus」も削除してください。 41 | 42 | 43 | 言語ファイル 44 | 45 | * スペイン語 46 | 翻訳者 : Patricio M. Ros 47 | 48 | * 中国語(繁体字) 49 | 翻訳者 : 風逸蘭 50 | 51 | * ドイツ語 52 | 翻訳者 : LightTempler 53 | 54 | * ポルトガル語 55 | 翻訳者 : Sérgio Nova 56 | 57 | * イタリア語 58 | 翻訳者 : Michele Pezza 59 | 60 | * 中国語(簡体字) 61 | 翻訳者 : 秋寥 62 | 63 | * フランス語 64 | 翻訳者 : Olivier Wuillemin / bufferUnderrun 65 | 66 | * ロシア語 67 | 翻訳者 : Hunter User 68 | 69 | * トルコ語 70 | 翻訳者 : Ferhat Aydin 71 | 72 | * スペイン語(ラテンアメリカ) 73 | 翻訳者 : DasinFlameS 74 | 75 | * ウクライナ語 76 | 翻訳者 : Henaro aka Ironwool 77 | 78 | * オランダ語 79 | 翻訳者 : mlohnen 80 | 81 | 82 | ライセンス 83 | 84 | * MIT License 85 | http://www.opensource.org/licenses/mit-license.php 86 | 87 | 88 | URL 89 | https://tablacus.github.io/explorer.html 90 | 91 | 92 | Documents 93 | https://github.com/tablacus/TablacusExplorer/wiki 94 | 95 | 96 | ソース 97 | https://github.com/tablacus/TablacusExplorer 98 | -------------------------------------------------------------------------------- /Debug/readme_ko.txt: -------------------------------------------------------------------------------- 1 | 추가 기능이 지원되는 탭 형식의 파일 관리자입니다. 2 | Tablacus Explorer 3 | 4 | 저자: Gaku 5 | 6 | 7 | Tablacus Explorer의 기능: 8 | 9 | * 탭 인터페이스 10 | * 추가 지원 11 | * 완전히 휴대 가능하며 설치 필요 없음 12 | * 다중 언어 및 유니코드 지원 13 | * 사용자 정의 가능한 연결, 메뉴, 키, 마우스 제스처, 별칭 14 | * 오픈소스 15 | * 64비트 (TE64.exe/x64 Edition) 및 32비트 (TE32.exe/x86 Edition) 버전 사용 가능 16 | 17 | 18 | 설치: 19 | 20 | * ZIP 파일을 임의의 폴더로 압축 풀기 21 | * Tablacus Explorer (te64.exe/te32.exe) 22 | 23 | - Program Files 디렉터리에 Tablacus Explorer를 설치한 경우: 24 | 25 | * 설정은 "%AppData%\tablacus\explorer\config"에 저장됩니다. 26 | * 옵션 열기 27 | * "구성 폴더 초기화"를 누릅니다 28 | 29 | 30 | 제거: 31 | 32 | * tablacus 폴더를 삭제합니다. 33 | 34 | - Program Files 디렉터리에 Tablacus Explorer를 설치한 경우: 35 | 36 | * "%AppData%\tablacus" 폴더도 삭제합니다. 37 | 38 | 39 | 다국어: 40 | 41 | * 한국어 / Korean 42 | 번역가 : VenusGirl (비너스걸) 43 | 44 | * Español / Spanish 45 | 번역가 : Patricio M. Ros 46 | 47 | * 正體中文 / Traditional Chinese 48 | 번역가 : 風逸蘭 49 | 50 | * Deutsch / German 51 | 번역가 : LightTempler 52 | 53 | * Português / Portuguese 54 | 번역가 : Sérgio Nova 55 | 56 | * Italiano / Italian 57 | 번역가 : Michele Pezza 58 | 59 | * 简体中文 / Simplified Chinese 60 | 번역가 : 秋寥 61 | 62 | * French / Français 63 | 번역가 : Olivier Wuillemin / bufferUnderrun 64 | 65 | * Russian / русский 66 | 번역가 : Hunter User 67 | 68 | * Turkish / Türkçe 69 | 번역가 : Ferhat Aydin 70 | 71 | Español latino / Spanish la 72 | 번역가 : DasinFlameS 73 | 74 | українська / Ukrainian 75 | 번역가 : Henaro aka Ironwool 76 | 77 | Nederlands / Nederlands 78 | 번역가 : mlohnen 79 | 80 | 81 | 라이선스: 82 | 83 | * MIT 라이선스 84 | http://www.opensource.org/licenses/mit-license.php 85 | 86 | 87 | URL 88 | https://tablacus.github.io/explorer_en.html 89 | 90 | 91 | 문서 92 | https://github.com/tablacus/TablacusExplorer/wiki 93 | 94 | 95 | 소스 96 | https://github.com/tablacus/TablacusExplorer 97 | -------------------------------------------------------------------------------- /Debug/script/background.js: -------------------------------------------------------------------------------- 1 | //Tablacus Explorer 2 | 3 | function _s() { 4 | try { 5 | window.te = external; 6 | api = te.WindowsAPI; 7 | fso = api.CreateObject("fso"); 8 | sha = api.CreateObject("sha"); 9 | wsh = api.CreateObject("wsh"); 10 | arg = api.CommandLineToArgv(api.GetCommandLine()); 11 | if (/rundll32\.?(exe)?"?$/i.test(arg[0])) { 12 | arg.shift(); 13 | } 14 | location = { href: arg[2], hash: '' }; 15 | var parent = fso.GetParentFolderName(api.GetModuleFileName(null)); 16 | if (!/^[A-Z]:\\|^\\\\/i.test(location.href)) { 17 | location.href = fso.BuildPath(parent, location.href); 18 | } 19 | var sw = sha.Windows(); 20 | for (var i = 0; i < sw.Count; ++i) { 21 | var x = sw.item(i); 22 | if (x && x.Document) { 23 | var w = x.Document.parentWindow; 24 | if (w && w.Exchange && w.Exchange[arg[3]]) { 25 | window.MainWindow = w; 26 | var rc = api.Memory('RECT'); 27 | api.GetWindowRect(w.te.hwnd, rc); 28 | api.MoveWindow(te.hwnd, (rc.Left + rc.Right) / 2, (rc.Top + rc.Bottom) / 2, 0, 0, false); 29 | } 30 | } 31 | } 32 | api.AllowSetForegroundWindow(-1); 33 | return _es(location.href); 34 | } catch (e) { 35 | wsh.Popup((e.stack || e.description || e.toString()), 0, 'Tablacus Explorer', 0x10); 36 | } 37 | } 38 | 39 | function _es(fn) { 40 | if (!/^[A-Z]:\\|^\\\\/i.test(fn)) { 41 | fn = fso.BuildPath(/^\\/.test(fn) ? fso.GetParentFolderName(api.GetModuleFileName(null)) : fso.GetParentFolderName(location.href), fn); 42 | } 43 | var s; 44 | try { 45 | var ado = api.CreateObject("ads"); 46 | ado.CharSet = 'utf-8'; 47 | ado.Open(); 48 | ado.LoadFromFile(fn); 49 | s = ado.ReadText(); 50 | ado.Close(); 51 | } catch (e) { 52 | if (window.MainWindow && MainWindow.Exchange) { 53 | MainWindow.Exchange[arg[3]] = void 0; 54 | } 55 | wsh.Popup((e.description || e.toString()) + '\n' + fn, 0, 'Tablacus Explorer', 0x10); 56 | } 57 | if (s) { 58 | if (!/consts\.js$/i.test(fn)) { 59 | s = FixScript(s); 60 | } 61 | try { 62 | return new Function(s)(); 63 | } catch (e) { 64 | wsh.Popup((e.stack || e.description || e.toString()) + '\n' + fn, 0, 'Tablacus Explorer', 0x10); 65 | } 66 | } 67 | } 68 | 69 | function importScripts() { 70 | for (var i = 0; i < arguments.length; ++i) { 71 | _es(arguments[i]); 72 | } 73 | } 74 | 75 | function FixScript(s) { 76 | s = s.replace(/([^\.\w])(async |await )/g, "$1"); 77 | if ("undefined" == typeof ScriptEngineMajorVersion) { 78 | return s; 79 | } 80 | s = s.replace(/(\([^\(\)]*\))\s*=>\s*\{/g, "function $1 {"); 81 | return ScriptEngineMajorVersion() > 10 ? s : s.replace(/([^\.\w])(const |let )/g, "$1var ").replace(/^const |^let /, "var "); 82 | } 83 | -------------------------------------------------------------------------------- /Debug/script/dialog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Tablacus Explorer 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 | 16 |
17 | 18 | 19 | 20 | 23 | 24 | 25 | 28 | 31 | 32 | 33 |
34 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /Debug/script/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | font-size: 12px; 4 | font-size: inherit; 5 | font: inherit; 6 | } 7 | 8 | html { 9 | height: 100%; 10 | } 11 | 12 | body { 13 | overflow: hidden; 14 | margin: 0; 15 | padding: 0; 16 | border: none; 17 | color: #000; 18 | background-color: #f0f0f0; 19 | height: 100%; 20 | } 21 | 22 | table { 23 | border-collapse: collapse; 24 | border-spacing: 0; 25 | border: none; 26 | padding: 0; 27 | margin: 0; 28 | } 29 | 30 | td, tr { 31 | vertical-align: top; 32 | border: none; 33 | padding: 0; 34 | margin: 0; 35 | } 36 | 37 | img { 38 | vertical-align: middle; 39 | border: none; 40 | } 41 | 42 | img.button, img.button1, img.hoverbutton, img.activebutton { 43 | box-sizing: content-box; 44 | } 45 | 46 | svg { 47 | fill: currentColor; 48 | } 49 | 50 | form { 51 | display: inline; 52 | margin: 0; 53 | } 54 | 55 | button { 56 | white-space: nowrap; 57 | } 58 | 59 | .button, .button1 { 60 | display: inline-block; *display: inline; *zoom: 1; 61 | padding: 1px 1px; 62 | text-decoration: none; 63 | cursor: default; 64 | outline: 0; 65 | white-space: nowrap; 66 | vertical-align: middle; 67 | } 68 | 69 | .hoverbutton, .activebutton { 70 | display: inline-block; *display: inline; *zoom: 1; 71 | text-decoration: none; 72 | color: #000; 73 | cursor: default; 74 | background-color: #e3e3e3; 75 | border: 1px solid #a0a0a0; 76 | padding: 0; 77 | outline: 0; 78 | white-space: nowrap; 79 | vertical-align: middle; 80 | } 81 | 82 | .menu { 83 | display: inline-block; *display: inline; *zoom: 1; 84 | margin: 1px 5px; 85 | text-decoration: none; 86 | color: #000; 87 | cursor: default; 88 | white-space: nowrap; 89 | } 90 | 91 | .hovermenu, .activemenu { 92 | display: inline-block; *display: inline; *zoom: 1; 93 | cursor: default; 94 | text-decoration: none; 95 | white-space: nowrap; 96 | color: #000; 97 | background-color: #e3e3e3; 98 | border: 1px solid #a0a0a0; 99 | padding: 0 4px; 100 | margin: 0; 101 | } 102 | 103 | .toolbar1, .toolbar2, .toolbar3 { 104 | display: none; 105 | margin: 1px 1px 1px 0; 106 | padding: 1px 1px 1px 0; 107 | vertical-align: middle; 108 | } 109 | 110 | .toolbar1 { 111 | white-space: nowrap; 112 | } 113 | 114 | .toolbar2 { 115 | width: 100% 116 | } 117 | 118 | .toolbar3 { 119 | text-align: right; 120 | white-space: nowrap; 121 | } 122 | 123 | .layout { 124 | width: 100%; 125 | padding: 0; 126 | margin: 0; 127 | border: none; 128 | border-collapse: collapse; 129 | overflow: hidden; 130 | } 131 | .sidebar { 132 | margin: 0; 133 | padding: 0; 134 | border: none; 135 | height: 100%; 136 | overflow: hidden; 137 | } 138 | 139 | .sidebar1, .sidebar2, .sidebar3 { 140 | display: none; 141 | word-break: break-all; 142 | word-wrap: break-word; 143 | overflow: hidden; 144 | margin: 0; 145 | padding: 0; 146 | } 147 | 148 | .sidebar2 { 149 | min-height: 5.5em; 150 | } 151 | 152 | .sidebar3 { 153 | vertical-align: bottom; 154 | } 155 | 156 | .tab0, .button0, .menu0 { 157 | list-style: none; 158 | margin: 0; 159 | padding: 0 1px; 160 | cursor: default; 161 | position: relative; 162 | } 163 | 164 | .tab0 li { 165 | display: inline-block; *display: inline; *zoom: 1; 166 | line-height: 2em; 167 | position: relative; 168 | white-space: nowrap; 169 | } 170 | 171 | .tab, .tab2, .tab3 { 172 | border: 1px solid #a0a0a0; 173 | margin: 0; 174 | padding: 0 8px; 175 | color: #000; 176 | height: 2em; 177 | outline: 0; 178 | background: #eee; 179 | vertical-align: bottom; 180 | opacity: 0.85; 181 | } 182 | 183 | .tab div, .tab2 div, .tab3 div, .activetab div { 184 | text-overflow: ellipsis; 185 | } 186 | 187 | .tab:hover, .tab2:hover, .tab3:hover { 188 | box-shadow: 0 0 0 9em rgba(51,204,255,0.2) inset; 189 | opacity: 1; 190 | filter: alpha(style=0,opacity=100); 191 | } 192 | 193 | .activetab { 194 | border: 1px solid #a0a0a0; 195 | border-bottom: 0; 196 | margin: 0 -1px; 197 | padding: 0 9px; 198 | color: #000; 199 | background-color: #fff; 200 | height: 2.167em; 201 | outline: 0; 202 | z-index: 9999; 203 | vertical-align: bottom; 204 | } 205 | 206 | .treebutton, .treespace { 207 | color: dimgray; 208 | font-family: monospace; 209 | margin: 0 2px 0 1px; 210 | text-decoration: none; 211 | cursor: default; 212 | vertical-align: middle; 213 | } 214 | 215 | .treespace { 216 | visibility: hidden; 217 | } 218 | 219 | a.treebutton:hover { 220 | color: #0078d7; 221 | text-shadow: 0 0 2px #0078d7; 222 | } 223 | 224 | .ok, .apply, .cancel { 225 | min-width: 8em; 226 | } 227 | 228 | .buttons { 229 | padding-right: 3px; 230 | white-space: nowrap; 231 | } 232 | 233 | .breadcrumb { 234 | color: #000; 235 | background-color: #fff; 236 | white-space: nowrap; 237 | } 238 | 239 | .separator { 240 | border-left: 1px solid #888; 241 | margin: 0 2px; 242 | display: inline-block; 243 | vertical-align: middle; 244 | color: transparent !important; 245 | height: 100%; 246 | opacity: .7; 247 | filter: alpha(style=0,opacity=70); 248 | } 249 | 250 | .splitter { 251 | padding: 1px; 252 | margin: 0; 253 | border: none; 254 | width: 0; 255 | height: 100%; 256 | cursor: e-resize; 257 | } 258 | 259 | .favicon { 260 | height: 12pt; 261 | font-size: 12pt !important; 262 | } 263 | 264 | .fonticon { 265 | cursor: default; 266 | vertical-align: middle; 267 | } 268 | 269 | .fonticonbutton, .svgiconbutton { 270 | font-size: 150%; 271 | } 272 | 273 | .addonbutton { 274 | padding: 1px 275 | } 276 | 277 | .drive { 278 | position: absolute; 279 | color: #000; 280 | font-weight: bold; 281 | font-size: 75%; 282 | text-shadow: 1px 1px 0 #fff, -1px 1px 0 #fff, 1px -1px 0 #fff, -1px -1px 0 #fff; 283 | filter: glow(color=#fff,strength=1); 284 | } 285 | 286 | .pane { 287 | width: 100%; 288 | color: #000; 289 | background-color: #fff; 290 | border: 1px solid #646464; 291 | } 292 | 293 | .danger { 294 | color: red; 295 | } 296 | 297 | .panel { 298 | border: 1px solid #a0a0a0; 299 | padding: 4px; 300 | width: 100%; 301 | line-height: 1.5em; 302 | overflow-y: auto; 303 | clear: both; 304 | } 305 | 306 | .color { 307 | border: 1px solid #a0a0a0; 308 | width: 2em; 309 | } 310 | 311 | .block { 312 | padding: 8px; 313 | border: 1px solid #a0a0a0; 314 | margin-bottom: 8px; 315 | display: block; 316 | } 317 | 318 | .hide { 319 | display: none; 320 | } 321 | 322 | .full, .groupbutton { 323 | width: 100%; 324 | } 325 | 326 | .group { 327 | padding: 8px; 328 | border-left: 1px solid #a0a0a0; 329 | border-right: 1px solid #a0a0a0; 330 | border-bottom: 1px solid #a0a0a0; 331 | margin-bottom: 8px; 332 | display: none; 333 | } 334 | 335 | .disabled { 336 | color: gray; 337 | } 338 | 339 | .activecaption { 340 | color: #000; 341 | background-color: #99b4d1; 342 | } 343 | 344 | .fixed { 345 | table-layout: fixed; 346 | } 347 | 348 | .top { 349 | vertical-align: top; 350 | } 351 | 352 | .middle { 353 | vertical-align: middle; 354 | } 355 | 356 | .bottom { 357 | vertical-align: bottom; 358 | } 359 | 360 | .nowrap { 361 | white-space: nowrap; 362 | } 363 | 364 | .center { 365 | text-align: center; 366 | } 367 | 368 | .right { 369 | text-align: right; 370 | } 371 | 372 | .number { 373 | width: 6em; text-align: right 374 | } 375 | 376 | .lightbg { 377 | color: #000 378 | } 379 | 380 | .darkbg { 381 | color: #fff 382 | } 383 | -------------------------------------------------------------------------------- /Debug/script/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Tablacus Explorer 8 | 9 | 10 | 11 | 12 | 15 |
16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | 46 | 47 | 48 | 49 | 50 | 51 |
52 |
53 |
54 | 55 | 56 | 63 | 64 | 65 | 66 | 73 | 74 |


75 |
76 |
77 | 78 | 79 | 80 | 81 | 82 | 83 |
84 | 85 | 86 | 87 | 88 | 89 | 90 |
91 | 92 | 93 | 94 | 95 | 96 | 97 |
98 |
99 |
100 |
101 |
102 | 103 |
104 | 105 |
106 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /Debug/script/options.css: -------------------------------------------------------------------------------- 1 | @import url("index.css"); 2 | 3 | select { 4 | min-height: 1.7em; 5 | } 6 | 7 | input[type="text"], input[type="number"], input[type="search"] { 8 | min-height: 1.4em; 9 | } 10 | 11 | input[type="button"], button { 12 | vertical-align: top; 13 | } 14 | 15 | textarea { 16 | min-height: 2em 17 | } 18 | 19 | .oddline { 20 | color: #000; 21 | background-color: #ffffe1; 22 | } 23 | 24 | .box { 25 | border-top: 1px solid #888; 26 | } 27 | 28 | .color { 29 | border-radius: 2px; 30 | } 31 | 32 | .window { 33 | border: 1px solid #a0a0a0; 34 | } 35 | 36 | .window td { 37 | border: 1px solid #a0a0a0; 38 | } 39 | 40 | .footer { 41 | width: 100%; 42 | line-height: 1.5em 43 | } 44 | 45 | .text1 { 46 | color: #000; 47 | background-color: #fff; 48 | border: 1px solid #a0a0a0; 49 | white-space: nowrap; 50 | } 51 | 52 | .location { 53 | width: calc(100vh / 3); 54 | } 55 | 56 | -------------------------------------------------------------------------------- /Debug/script/syncb.js: -------------------------------------------------------------------------------- 1 | // Tablacus Explorer 2 | 3 | InvokeUI = function () { 4 | if (arguments.length == 2 && arguments[1].unshift) { 5 | const args = Array.apply(null, arguments[1]); 6 | args.unshift(arguments[0]); 7 | InvokeFunc(UI.Invoke, args); 8 | return S_OK; 9 | } 10 | InvokeFunc(UI.Invoke, Array.apply(null, arguments)); 11 | return S_OK; 12 | } 13 | 14 | BlurId = function () { 15 | InvokeUI("BlurId", Array.apply(null, arguments)); 16 | } 17 | 18 | clearTimeout = function () { 19 | InvokeUI("clearTimeout", Array.apply(null, arguments)); 20 | } 21 | 22 | clipboardData = { 23 | setData: function (format, data) { 24 | api.SetClipboardData(data); 25 | return true; 26 | }, 27 | getData: api.GetClipboardData 28 | } 29 | 30 | CloseWindow = function () { 31 | InvokeUI("CloseWindow"); 32 | } 33 | 34 | ExitFullscreen = function () { 35 | FullscreenChanged(false); 36 | InvokeUI("ExitFullscreen"); 37 | } 38 | 39 | FocusFV = function () { 40 | InvokeUI("FocusFV"); 41 | } 42 | 43 | GetFolderView = function (Ctrl, pt, bStrict) { 44 | if (!Ctrl) { 45 | return te.Ctrl(CTRL_FV); 46 | } 47 | const nType = Ctrl.Type; 48 | if (nType <= CTRL_EB) { 49 | return Ctrl; 50 | } 51 | if (nType == CTRL_TV) { 52 | return Ctrl.FolderView; 53 | } 54 | if (nType != CTRL_TC) { 55 | return te.Ctrl(CTRL_FV); 56 | } 57 | if (pt) { 58 | const FV = pt.Target || Ctrl.HitTest(pt); 59 | if (FV) { 60 | return FV; 61 | } 62 | } 63 | if (!bStrict || !pt) { 64 | return Ctrl.Selected; 65 | } 66 | }; 67 | 68 | ImgBase64 = function (el, index, h) { 69 | return MakeImgSrc(ExtractMacro(te, el.src), index, false, h || el.height); 70 | } 71 | 72 | MouseOut = function () { 73 | InvokeUI("MouseOut", Array.apply(null, arguments)); 74 | } 75 | 76 | MouseOver = function () { 77 | InvokeUI("MouseOver", Array.apply(null, arguments)); 78 | } 79 | 80 | OpenHttpRequest = function () { 81 | InvokeUI("OpenHttpRequest", Array.apply(null, arguments)); 82 | } 83 | 84 | ReloadCustomize = function () { 85 | InvokeUI("ReloadCustomize"); 86 | return S_OK; 87 | } 88 | 89 | Resize = function () { 90 | InvokeUI("Resize"); 91 | } 92 | 93 | SelectItem = function () { 94 | InvokeUI("SelectItem", Array.apply(null, arguments)); 95 | } 96 | 97 | SetDisplay = function () { 98 | InvokeUI("SetDisplay", Array.apply(null, arguments)); 99 | } 100 | 101 | setTimeout = function () { 102 | InvokeUI("setTimeout", Array.apply(null, arguments)); 103 | } 104 | 105 | ShowStatusTextEx = function () { 106 | InvokeUI("ShowStatusTextEx", Array.apply(null, arguments)); 107 | } 108 | 109 | WebBrowser = te.Ctrl(CTRL_WB); 110 | -------------------------------------------------------------------------------- /Debug/script/threads.js: -------------------------------------------------------------------------------- 1 | try { 2 | while (Threads.Images.length) { 3 | var o = Threads.Images.pop(); 4 | var image = api.CreateObject("WICBitmap"); 5 | image.OnGetAlt = o.OnGetAlt; 6 | if (image.FromFile(o.path, o.cx)) { 7 | if (o.cx) { 8 | if (!o.anime || image.GetFrameCount() < 2) { 9 | image = GetThumbnail(image, o.cx, o.f); 10 | } 11 | } 12 | if (o.mix) { 13 | image.AlphaBlend(o.rc, o.mix, o.max || 100); 14 | } 15 | if ("string" === typeof o.type) { 16 | o.out = image.DataURI(o.type, o.anime && o.quality != -2 && image.GetFrameCount() > 1 ? -2 : o.quality); 17 | } else if ("number" === typeof o.type) { 18 | o.out = image.GetHBITMAP(o.type); 19 | } else if (MainWindow.WINVER > 0x601) { 20 | o.out = MainWindow.api.CreateObject("WICBitmap").FromStream(image.GetStream("", -2)); 21 | } else { 22 | o.out = MainWindow.api.CreateObject("WICBitmap").FromFile(image.DataURI()); 23 | } 24 | api.Invoke(o.onload || o.callback, o); 25 | } else if (o.onerror) { 26 | api.Invoke(o.onerror, o); 27 | } 28 | } 29 | } catch (e) { } 30 | try { 31 | Threads.End(Id); 32 | } catch (e) { } 33 | 34 | function GetThumbnail (image, m, f) { 35 | var w = image.GetWidth(), h = image.GetHeight(), z = m / Math.max(w, h); 36 | if (z == 1 || (f && z > 1)) { 37 | return image; 38 | } 39 | return image.GetThumbnailImage(w * z, h * z); 40 | } 41 | -------------------------------------------------------------------------------- /Debug/script/update.js: -------------------------------------------------------------------------------- 1 | TITLE = "Tablacus Explorer"; 2 | fso = new ActiveXObject("Scripting.FileSystemObject"); 3 | sha = new ActiveXObject('Shell.Application'); 4 | wsh = new ActiveXObject('WScript.Shell'); 5 | args = WScript.Arguments; 6 | 7 | var server = GetObject("winmgmts:\\\\.\\root\\cimv2"); 8 | var t = new Date().getTime(); 9 | if (server) { 10 | for (;;) { 11 | var df = new Date().getTime() - t; 12 | var cols = server.ExecQuery('SELECT * FROM Win32_Process WHERE ExecutablePath="' + (args(0).split("\\").join("\\\\")) + '"'); 13 | if (!cols.Count) { 14 | break; 15 | } 16 | if (df > 30000) { 17 | for (var list = new Enumerator(cols); !list.atEnd(); list.moveNext()) { 18 | if (list.item().Terminate() == 0) { 19 | continue; 20 | } 21 | } 22 | } 23 | if (df < 6000) { 24 | WScript.Sleep(500); 25 | } else if (wsh.Popup(args(2), 5, TITLE, 1) == 2) { 26 | WScript.Quit(); 27 | } 28 | } 29 | } else { 30 | wsh.Popup(args(2), 9, TITLE, 0); 31 | } 32 | if (args.length > 5 && args(5)) { 33 | var f = args.length > 6 ? parseInt(args(6)) : 0x0210; 34 | if (/^Move$/i.test(args(5))) { 35 | sha.NameSpace(args(4)).MoveHere(args(1), f); 36 | } else if (/^Copy$/i.test(args(5))) { 37 | sha.NameSpace(args(4)).CopyHere(args(1), f); 38 | } else if (/^MoveItems$/i.test(args(5))) { 39 | sha.NameSpace(args(4)).MoveHere(sha.NameSpace(args(1)).Items(), f); 40 | } else if (/^CopyItems$/i.test(args(5))) { 41 | sha.NameSpace(args(4)).CopyHere(sha.NameSpace(args(1)).Items(), f); 42 | } 43 | } else if (args.length > 4 && args(4)) { 44 | sha.NameSpace(args(4)).CopyHere(sha.NameSpace(args(1)).Items(), 0x0210); 45 | } else { 46 | sha.NameSpace(fso.GetParentFolderName(args(0))).MoveHere(sha.NameSpace(args(1)).Items(), 0x0210); 47 | } 48 | if (!args(3) || sha.NameSpace(args(1)).Items().Count == 0 || wsh.Popup(args(3), 0, TITLE, 0x21) == 1) { 49 | wsh.Run('"' + args(0) + '"'); 50 | } 51 | -------------------------------------------------------------------------------- /LICENSE.TXT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2011 Gaku 3 | 4 | 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 26 | THE SOFTWARE. 27 | -------------------------------------------------------------------------------- /TE.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Express 15 for Windows Desktop 4 | VisualStudioVersion = 15.0.28307.168 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TE", "TE\TE.vcxproj", "{6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Debug|x64 = Debug|x64 12 | Release|Win32 = Release|Win32 13 | Release|x64 = Release|x64 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|Win32.ActiveCfg = Debug|Win32 17 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|Win32.Build.0 = Debug|Win32 18 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|x64.ActiveCfg = Debug|x64 19 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|x64.Build.0 = Debug|x64 20 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|Win32.ActiveCfg = Release|Win32 21 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|Win32.Build.0 = Release|Win32 22 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|x64.ActiveCfg = Release|x64 23 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|x64.Build.0 = Release|x64 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {B5A7955C-CF93-4A88-A002-6013D67EA8F0} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /TE/Resource.h: -------------------------------------------------------------------------------- 1 | #define PRODUCTNAME "Tablacus Explorer" 2 | 3 | #ifndef IDC_STATIC 4 | #define IDC_STATIC (-1) 5 | #endif 6 | 7 | //Version 8 | #define STRING(str) STRING2(str) 9 | #define STRING2(str) #str 10 | #ifdef _EXE 11 | //Version(EXE) 12 | #define VER_Y 25 13 | #define VER_M 4 14 | #define VER_D 8 15 | #else 16 | //Version(DLL) 17 | #define VER_Y 25 18 | #define VER_M 5 19 | #define VER_D 15 20 | #endif 21 | 22 | //Icon 23 | #define IDI_TE 1 24 | 25 | //Define 26 | //#define USE_TEOBJ 27 | //#define USE_SHELLBROWSER 28 | //#define USE_OBJECTAPI 29 | //#define USE_APIHOOK 30 | //#define USE_HTMLDOC 31 | //#define USE_TESTOBJECT 32 | //#define USE_TESTPATHMATCHSPEC 33 | //#define CHECK_HANDLELEAK 34 | //#define USE_LOG 35 | #define EMULATE_XP //FALSE && 36 | #ifndef _WIN64 37 | #define _2000XP 38 | //#define _W2000 39 | #endif 40 | #ifdef _DEBUG 41 | #define _EXEONLY 42 | #endif 43 | -------------------------------------------------------------------------------- /TE/TE.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | true 20 | system 21 | 22 | 23 | -------------------------------------------------------------------------------- /TE/TE.rc: -------------------------------------------------------------------------------- 1 | // Generated by ResEdit 1.5.11 2 | // Copyright (C) 2006-2012 3 | // http://www.resedit.net 4 | 5 | #include 6 | #include 7 | #include 8 | #include "resource.h" 9 | 10 | // 11 | // Icon resources 12 | // 13 | LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 14 | IDI_TE ICON "te.ico" 15 | 16 | // 17 | // Version Information resources 18 | // 19 | LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 20 | 1 VERSIONINFO 21 | FILEVERSION VER_Y,VER_M,VER_D,0 22 | PRODUCTVERSION VER_Y,VER_M,VER_D,0 23 | FILEOS VOS_NT_WINDOWS32 24 | #ifdef _WINDLL 25 | FILETYPE VFT_DLL 26 | #else 27 | FILETYPE VFT_APP 28 | #endif 29 | FILESUBTYPE VFT2_UNKNOWN 30 | FILEFLAGSMASK 0x00000000 31 | FILEFLAGS 0x00000000 32 | { 33 | BLOCK "StringFileInfo" 34 | { 35 | BLOCK "0400FDE9" 36 | { 37 | VALUE "CompanyName", "Tablacus\0" 38 | VALUE "FileDescription", PRODUCTNAME "\0" 39 | VALUE "FileVersion", STRING(VER_Y) "." STRING(VER_M) "." STRING(VER_D) "\0" 40 | VALUE "InternalName", "TE\0" 41 | VALUE "LegalCopyright", "(C) Gaku\0" 42 | #ifdef _WINDLL 43 | #ifdef _WIN64 44 | VALUE "OriginalFilename", "te64.dll\0" 45 | #else 46 | VALUE "OriginalFilename", "te32.dll\0" 47 | #endif 48 | #else 49 | #ifdef _WIN64 50 | VALUE "OriginalFilename", "TE64.exe\0" 51 | #else 52 | VALUE "OriginalFilename", "TE32.exe\0" 53 | #endif 54 | #endif 55 | VALUE "ProductName", PRODUCTNAME "\0" 56 | VALUE "ProductVersion", STRING(VER_Y) "." STRING(VER_M) "." STRING(VER_D) "\0" 57 | } 58 | } 59 | BLOCK "VarFileInfo" 60 | { 61 | VALUE "Translation", 0x0400, 0xFDE9 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /TE/TE.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | Source Files 26 | 27 | 28 | Source Files 29 | 30 | 31 | Source Files 32 | 33 | 34 | Source Files 35 | 36 | 37 | Source Files 38 | 39 | 40 | 41 | 42 | Header Files 43 | 44 | 45 | Header Files 46 | 47 | 48 | Header Files 49 | 50 | 51 | Header Files 52 | 53 | 54 | Header Files 55 | 56 | 57 | Header Files 58 | 59 | 60 | Header Files 61 | 62 | 63 | Header Files 64 | 65 | 66 | 67 | 68 | Resource Files 69 | 70 | 71 | 72 | 73 | Resource Files 74 | 75 | 76 | 77 | 78 | Resource Files 79 | 80 | 81 | -------------------------------------------------------------------------------- /TE/api.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class CteWindowsAPI : public IDispatch 4 | { 5 | public: 6 | STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject); 7 | STDMETHODIMP_(ULONG) AddRef(); 8 | STDMETHODIMP_(ULONG) Release(); 9 | //IDispatch 10 | STDMETHODIMP GetTypeInfoCount(UINT *pctinfo); 11 | STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); 12 | STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); 13 | STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); 14 | 15 | CteWindowsAPI(TEDispatchApi *pApi); 16 | ~CteWindowsAPI(); 17 | private: 18 | TEDispatchApi *m_pApi; 19 | LONG m_cRef; 20 | }; 21 | 22 | #ifdef USE_OBJECTAPI 23 | class CteAPI : public IDispatch 24 | { 25 | public: 26 | STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject); 27 | STDMETHODIMP_(ULONG) AddRef(); 28 | STDMETHODIMP_(ULONG) Release(); 29 | //IDispatch 30 | STDMETHODIMP GetTypeInfoCount(UINT *pctinfo); 31 | STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); 32 | STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); 33 | STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); 34 | 35 | CteAPI(TEDispatchApi *pApi); 36 | ~CteAPI(); 37 | private: 38 | TEDispatchApi *m_pApi; 39 | LONG m_cRef; 40 | }; 41 | #endif 42 | 43 | -------------------------------------------------------------------------------- /TE/darkmode.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | VOID teSetDarkMode(HWND hwnd); 4 | VOID teGetDarkMode(); 5 | VOID teSetTreeTheme(HWND hwnd, COLORREF cl); 6 | BOOL teIsDarkColor(COLORREF cl); 7 | VOID teFixGroup(LPNMLVCUSTOMDRAW lplvcd, COLORREF clrBk); 8 | LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam); 9 | 10 | -------------------------------------------------------------------------------- /TE/exe.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "common.h" 3 | #if !defined(_WINDLL) && !defined(_EXEONLY) 4 | 5 | int APIENTRY _tWinMain(HINSTANCE hInstance, 6 | HINSTANCE hPrevInstance, 7 | LPTSTR lpCmdLine, 8 | int nCmdShow) 9 | { 10 | __security_init_cookie(); 11 | HINSTANCE hDll = ::GetModuleHandleA("kernel32.dll"); 12 | LPFNSetDefaultDllDirectories _SetDefaultDllDirectories = (LPFNSetDefaultDllDirectories)::GetProcAddress(hDll, "SetDefaultDllDirectories"); 13 | if (_SetDefaultDllDirectories) { 14 | _SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); 15 | } 16 | lpCmdLine = ::GetCommandLine(); 17 | if (lpCmdLine = ::StrChr(&lpCmdLine[1], lpCmdLine[0] == '"' ? '"' : 0x20)) { 18 | do { 19 | ++lpCmdLine; 20 | } while (*lpCmdLine == 0x20); 21 | } 22 | WCHAR pszPath[MAX_PATHEX]; 23 | ::GetModuleFileName(NULL, pszPath, MAX_PATHEX); 24 | ::PathRemoveFileSpec(pszPath); 25 | #ifdef _WIN64 26 | #ifdef _DEBUG 27 | ::PathAppend(pszPath, L"lib\\TEd64.dll"); 28 | #else 29 | ::PathAppend(pszPath, L"lib\\TE64.dll"); 30 | #endif 31 | #else 32 | #ifdef _DEBUG 33 | ::PathAppend(pszPath, L"lib\\TEd32.dll"); 34 | #else 35 | ::PathAppend(pszPath, L"lib\\TE32.dll"); 36 | #endif 37 | #endif 38 | LPWSTR pszError = L"404 File Not Found"; 39 | hDll = ::LoadLibrary(pszPath); 40 | if (hDll) { 41 | pszError = L"501 Not Implemented"; 42 | LPFNEntryPointW _RunDLLW = (LPFNEntryPointW)::GetProcAddress(hDll, "RunDLLW"); 43 | if (_RunDLLW) { 44 | STARTUPINFO si; 45 | ::GetStartupInfo(&si); 46 | _RunDLLW(NULL, hDll, lpCmdLine, (si.dwFlags & STARTF_USESHOWWINDOW) ? si.wShowWindow : SW_SHOWDEFAULT); 47 | pszError = NULL; 48 | } 49 | ::FreeLibrary(hDll); 50 | } 51 | if (pszError) { 52 | hDll = LoadLibrary(L"user32.dll"); 53 | LPFNMessageBoxW _MessageBoxW = (LPFNMessageBoxW)::GetProcAddress(hDll, "MessageBoxW"); 54 | if (_MessageBoxW) { 55 | _MessageBoxW(NULL, pszPath, pszError, MB_OK | MB_ICONERROR); 56 | } 57 | ::FreeLibrary(hDll); 58 | ::ExitProcess(-1); 59 | } 60 | ::ExitProcess(0); 61 | } 62 | #endif 63 | -------------------------------------------------------------------------------- /TE/stdafx.cpp: -------------------------------------------------------------------------------- 1 | // stdafx.cpp : source file that includes just the standard includes 2 | // TE.pch will be the pre-compiled header 3 | // stdafx.obj will contain the pre-compiled type information 4 | 5 | #include "stdafx.h" 6 | 7 | // TODO: reference any additional headers you need in STDAFX.H 8 | // and not in this file 9 | -------------------------------------------------------------------------------- /TE/stdafx.h: -------------------------------------------------------------------------------- 1 | // stdafx.h : include file for standard system include files, 2 | // or project specific include files that are used frequently, but 3 | // are changed infrequently 4 | // 5 | 6 | #pragma once 7 | 8 | #include "targetver.h" 9 | 10 | #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 11 | // Windows Header Files: 12 | #include 13 | 14 | // C RunTime Header Files 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | // TODO: reference additional headers your program requires here 21 | -------------------------------------------------------------------------------- /TE/targetver.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // The following macros define the minimum required platform. The minimum required platform 4 | // is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run 5 | // your application. The macros work by enabling all features available on platform versions up to and 6 | // including the version specified. 7 | 8 | // Modify the following defines if you have to target a platform prior to the ones specified below. 9 | // Refer to MSDN for the latest info on corresponding values for different platforms. 10 | #ifndef WINVER // Specifies that the minimum required platform is Windows Vista. 11 | #define WINVER 0x0601 // Change this to the appropriate value to target other versions of Windows. 12 | #endif 13 | 14 | #ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista. 15 | #define _WIN32_WINNT 0x0601 // Change this to the appropriate value to target other versions of Windows. 16 | #endif 17 | 18 | #ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98. 19 | #define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. 20 | #endif 21 | 22 | #ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0. 23 | #define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE. 24 | #endif 25 | -------------------------------------------------------------------------------- /TE/te.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/TE/te.ico -------------------------------------------------------------------------------- /TE/te16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/TE/te16.png -------------------------------------------------------------------------------- /TE/te32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/TE/te32.png -------------------------------------------------------------------------------- /TE/te48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tablacus/TablacusExplorer/2490a70aad3c513ab5b6c4cb9ef87bf50a2b9b83/TE/te48.png -------------------------------------------------------------------------------- /TE_VC2008.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 10.00 3 | # Visual C++ Express 2008 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TE", "TE\TE.vcproj", "{6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Win32 = Debug|Win32 9 | Debug|x64 = Debug|x64 10 | Release|Win32 = Release|Win32 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|Win32.ActiveCfg = Debug|Win32 15 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|Win32.Build.0 = Debug|Win32 16 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|x64.ActiveCfg = Debug|x64 17 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|x64.Build.0 = Debug|x64 18 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|Win32.ActiveCfg = Release|Win32 19 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|Win32.Build.0 = Release|Win32 20 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|x64.ActiveCfg = Release|x64 21 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|x64.Build.0 = Release|x64 22 | EndGlobalSection 23 | GlobalSection(SolutionProperties) = preSolution 24 | HideSolutionNode = FALSE 25 | EndGlobalSection 26 | EndGlobal 27 | -------------------------------------------------------------------------------- /TE_VC2010.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual C++ Express 2010 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TE", "TE\TE.vcxproj", "{6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Win32 = Debug|Win32 9 | Debug|x64 = Debug|x64 10 | Release|Win32 = Release|Win32 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|Win32.ActiveCfg = Debug|Win32 15 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|Win32.Build.0 = Debug|Win32 16 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|x64.ActiveCfg = Debug|x64 17 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Debug|x64.Build.0 = Debug|x64 18 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|Win32.ActiveCfg = Release|Win32 19 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|Win32.Build.0 = Release|Win32 20 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|x64.ActiveCfg = Release|x64 21 | {6FB32DEE-7AB5-4BFE-B84C-287CA38A0AC9}.Release|x64.Build.0 = Release|x64 22 | EndGlobalSection 23 | GlobalSection(SolutionProperties) = preSolution 24 | HideSolutionNode = FALSE 25 | EndGlobalSection 26 | EndGlobal 27 | -------------------------------------------------------------------------------- /del.bat: -------------------------------------------------------------------------------- 1 | del TE2008.ncb 2 | attrib -h TE2008.suo 3 | attrib -h TE*.suo 4 | del TE*.suo 5 | del TE*.sdf 6 | del /q TE\TE.vcproj.*.user 7 | del /q Debug\TEd32.* 8 | del /q Debug\TEd64.* 9 | del /q Debug\TE32.* 10 | del /q Debug\TE64.* 11 | rmdir /s /q TE\Debug 12 | rmdir /s /q TE\Release 13 | rmdir /s /q TE\x64 14 | rmdir /s /q ipch 15 | rmdir /s /q .vs 16 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | Tablacus Explorer 2 | 3 | Copyright (c) 2011 Gaku 4 | Licensed under the MIT License: 5 | http://www.opensource.org/licenses/mit-license.php 6 | 7 | //Language file 8 | https://tablacus.github.io/TablacusExplorerAddons/language.html 9 | 10 | //Icon packs 11 | https://tablacus.github.io/TablacusExplorerAddons/iconpacks.html 12 | 13 | //Wiki 14 | https://github.com/tablacus/TablacusExplorer/wiki 15 | 16 | //Build 17 | Visual Studio Express 2017 for Windows Desktop 18 | Windows SDK v7.1 - x64 exe 19 | Visual Studio 2017 (v141) - x64 dll 20 | Visual Studio 2015 - Windows XP (v140_xp) - x86 exe dll 21 | 22 | https://tablacus.github.io/ 23 | --------------------------------------------------------------------------------