├── .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 |
6 |
7 | |
8 |
9 |
10 | |
11 |
12 |
13 | |
14 |
15 |
16 | |
17 |
18 |
20 | |
21 |
22 |
23 | |
24 |
25 |
26 | |
27 |
28 |
29 | |
30 |
31 |
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 |
5 |
6 | |
7 |
8 |
9 | |
10 |
11 |
12 | |
13 |
14 |
15 | |
16 |
17 |
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), 'r'], "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 |
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 |
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 |
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 |
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 |
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-1SearchBackForwardUpUp
Ctrl.SelectItem(null, SVSI_DESELECTOTHERS);
\
New folder
Copy full path
Run dialog
Add to favorites
New folder
Close tab
New file
New tab
Notepad.exe
0
A:\
10
C:\
D:\
E:\
F:\
G:\
H:\
I:\
NewFolder
--------------------------------------------------------------------------------
/Debug/init/menus.xml:
--------------------------------------------------------------------------------
1 | - Open
- Open in New Tab
- Open in Background
- Close Tab
- Close Other Tabs
- Close Tabs on Left
- Close Tabs on Right
- Separator
- Refresh
- New Tab
- Separator
- Lock
- Show frames
- Open in Explorer
- Separator
- Close Application
- Copy Full Path
- Separator
- Up
- Refresh
- Reload Customize
- Separator
- Load Layout
- Save Layout
- Separator
- Add-ons
- General
- General
- Separator
- General
- Add-ons
2 |
--------------------------------------------------------------------------------
/Debug/init/mouse.xml:
--------------------------------------------------------------------------------
1 | Previous TabNext TabBack
Forward
Up
Refresh
New Tab
Close Tab
Forward
Back
Open in Background
Forward
UpNew 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 |
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 |
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 |
--------------------------------------------------------------------------------