PageRenderTime 85ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/verve patch/base/Applications/BetterExplorer/BExplorer/BetterExplorer/MainWindow.xaml.cs

https://bitbucket.org/jdm7dvmoore/msft-research-verve
C# | 4158 lines | 3239 code | 628 blank | 291 comment | 747 complexity | 4806bfa8d44f4dae5cca83557fa289ee MD5 | raw file
Possible License(s): Apache-2.0, GPL-2.0
  1. // --------------------------------------------------------------------------------------------------------------------
  2. // <copyright file="MainWindow.xaml.cs" company="Gainedge ORG">
  3. // Better Explorer (c)2016
  4. // </copyright>
  5. // <summary>
  6. // Interaction logic for MainWindow.xaml
  7. // </summary>
  8. // --------------------------------------------------------------------------------------------------------------------
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Collections.Specialized;
  12. using System.ComponentModel;
  13. using System.Diagnostics;
  14. using System.Drawing;
  15. using System.Drawing.Imaging;
  16. using System.IO;
  17. using System.Linq;
  18. using System.Net;
  19. using System.Reflection;
  20. using System.Runtime.InteropServices;
  21. using System.ServiceModel;
  22. using System.Text;
  23. using System.Threading;
  24. using System.Threading.Tasks;
  25. using System.Windows;
  26. using System.Windows.Controls;
  27. using System.Windows.Controls.Primitives;
  28. using System.Windows.Input;
  29. using System.Windows.Interop;
  30. using System.Windows.Media;
  31. using System.Windows.Media.Imaging;
  32. using System.Windows.Shell;
  33. using System.Windows.Threading;
  34. using System.Xml;
  35. using System.Xml.Linq;
  36. using BEHelper;
  37. using BetterExplorer.UsbEject;
  38. using BetterExplorerControls;
  39. using BExplorer.Shell;
  40. using BExplorer.Shell._Plugin_Interfaces;
  41. using BExplorer.Shell.CommonFileDialogs;
  42. using BExplorer.Shell.DropTargetHelper;
  43. using BExplorer.Shell.Interop;
  44. using Fluent;
  45. using LTR.IO.ImDisk;
  46. using Microsoft.Win32;
  47. using Settings;
  48. using SevenZip;
  49. using Shell32;
  50. using TaskDialogInterop;
  51. using wyDay.Controls;
  52. using Clipboards = System.Windows.Forms.Clipboard;
  53. using ContextMenu = Fluent.ContextMenu;
  54. using Image = System.Windows.Controls.Image;
  55. using MenuItem = Fluent.MenuItem;
  56. using WIN = System.Windows;
  57. namespace BetterExplorer {
  58. /// <summary>
  59. /// Interaction logic for MainWindow.xaml
  60. /// </summary>
  61. public partial class MainWindow : Fluent.RibbonWindow {
  62. #region DLLImports
  63. [DllImport("user32.dll")]
  64. [return: MarshalAs(UnmanagedType.Bool)]
  65. internal static extern bool GetCursorPos(ref BExplorer.Shell.DataObject.Win32Point pt);
  66. //[DllImport("user32.dll", SetLastError = true)]
  67. //private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
  68. //[DllImport("user32.dll", SetLastError = true)]
  69. //private static extern int UnregisterHotKey(IntPtr hwnd, int id);
  70. [DllImport("winmm.dll")]
  71. static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
  72. #endregion
  73. #region Private Members
  74. private bool _IsCalledFromLoading, isOnLoad;
  75. private MenuItem misa, misd, misag, misdg;
  76. private ShellTreeViewEx ShellTree = new ShellTreeViewEx();
  77. private ShellView _ShellListView = new ShellView();
  78. private bool IsNeedEnsureVisible;
  79. private ClipboardMonitor cbm = new ClipboardMonitor();
  80. private ContextMenu _CMHistory = new ContextMenu();
  81. private WIN.Shell.JumpList AppJL = new WIN.Shell.JumpList();
  82. //private List<string> Archives = new List<string>(new[] { ".rar", ".zip", ".7z", ".tar", ".gz", ".xz", ".bz2" });
  83. private List<string> Images = new List<string>(new[] { ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".wmf" });
  84. private string SelectedArchive = "";
  85. private bool KeepBackstageOpen = false;
  86. string sessionid = DateTime.UtcNow.ToFileTimeUtc().ToString();
  87. string logdir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BExplorer\\ActionLog\\";
  88. WIN.Forms.Timer updateCheckTimer = new WIN.Forms.Timer();
  89. Double CommandPromptWinHeight;
  90. //List<LVItemColor> LVItemsColor { get; set; }
  91. ContextMenu chcm;
  92. WIN.Forms.Timer focusTimer = new WIN.Forms.Timer() { Interval = 500 };
  93. private WIN.Forms.Timer _ProgressTimer = new WIN.Forms.Timer() { Interval = 1000, Enabled = false };
  94. private string _DBPath = Path.Combine(KnownFolders.RoamingAppData.ParsingName, @"BExplorer\Settings.sqlite");
  95. private IntPtr Handle;
  96. private ObservableCollectionEx<LVItemColor> LVItemsColorCol { get; set; }
  97. public Dictionary<String, Dictionary<IListItemEx, List<string>>> Badges { get; set; }
  98. #endregion
  99. public bool IsMultipleWindowsOpened { get; set; }
  100. #region Events
  101. private void btnAbout_Click(object sender, RoutedEventArgs e) => new fmAbout(this).ShowDialog();
  102. private void btnBugtracker_Click(object sender, RoutedEventArgs e) => Process.Start("http://bugs.gainedge.org/public/betterexplorer");
  103. private void TheRibbon_CustomizeQuickAccessToolbar(object sender, EventArgs e) => CustomizeQAT.Open(this, TheRibbon);
  104. private void btnConsolePane_Click(object sender, RoutedEventArgs e) {
  105. Settings.BESettings.IsConsoleShown = btnConsolePane.IsChecked.Value;
  106. Settings.BESettings.SaveSettings();
  107. if (btnConsolePane.IsChecked.Value) {
  108. rCommandPrompt.Height = new GridLength(this.CommandPromptWinHeight);
  109. rCommandPrompt.MinHeight = 100;
  110. spCommandPrompt.Height = GridLength.Auto;
  111. if (!ctrlConsole.IsProcessRunning)
  112. ctrlConsole.ChangeFolder(_ShellListView.CurrentFolder.ParsingName, _ShellListView.CurrentFolder.IsFileSystem);
  113. } else {
  114. rCommandPrompt.MinHeight = 0;
  115. rCommandPrompt.Height = new GridLength(0);
  116. spCommandPrompt.Height = new GridLength(0);
  117. ctrlConsole.StopProcess();
  118. }
  119. }
  120. private void backstage_IsOpenChanged(object sender, DependencyPropertyChangedEventArgs e) {
  121. if ((Boolean)e.NewValue) {
  122. this._ShellListView.IsFocusAllowed = false;
  123. this.backstage.Focus();
  124. } else {
  125. this._ShellListView.IsFocusAllowed = true;
  126. }
  127. this.autoUpdater.Visibility = Visibility.Visible;
  128. this.autoUpdater.UpdateLayout();
  129. if (this.KeepBackstageOpen) {
  130. this.backstage.IsOpen = true;
  131. this.KeepBackstageOpen = false;
  132. }
  133. }
  134. /// <summary>
  135. /// Loads initial position of the main window
  136. /// </summary>
  137. private void LoadInitialWindowPositionAndState() {
  138. this.Width = BESettings.LastWindowWidth;
  139. this.Height = BESettings.LastWindowHeight;
  140. var location = new System.Drawing.Point();
  141. try {
  142. location = new System.Drawing.Point((int)BESettings.LastWindowPosLeft, (int)BESettings.LastWindowPosTop);
  143. } catch { }
  144. this.Left = location.X;
  145. this.Top = location.Y;
  146. switch (BESettings.LastWindowState) {
  147. case 2:
  148. this.WindowState = WindowState.Maximized;
  149. break;
  150. case 1:
  151. this.WindowState = WindowState.Minimized;
  152. break;
  153. case 0:
  154. this.WindowState = WindowState.Normal;
  155. break;
  156. default:
  157. this.WindowState = WindowState.Maximized;
  158. break;
  159. }
  160. this.chkRibbonMinimizedGlass.IsChecked = BESettings.IsGlassOnRibonMinimized;
  161. this.TheRibbon.IsMinimized = BESettings.IsRibonMinimized;
  162. //CommandPrompt window size
  163. this.CommandPromptWinHeight = BESettings.CmdWinHeight;
  164. this.rCommandPrompt.Height = new GridLength(this.CommandPromptWinHeight);
  165. if (BESettings.IsConsoleShown) {
  166. this.rCommandPrompt.MinHeight = 100;
  167. this.rCommandPrompt.Height = new GridLength(this.CommandPromptWinHeight);
  168. this.spCommandPrompt.Height = GridLength.Auto;
  169. } else {
  170. this.rCommandPrompt.MinHeight = 0;
  171. this.rCommandPrompt.Height = new GridLength(0);
  172. this.spCommandPrompt.Height = new GridLength(0);
  173. }
  174. }
  175. private void LoadColorCodesFromFile() {
  176. Task.Run(() => {
  177. var itemColorSettingsLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"BExplorer\itemcolors.cfg");
  178. if (File.Exists(itemColorSettingsLocation)) {
  179. var docs = XDocument.Load(itemColorSettingsLocation);
  180. docs.Root.Elements("ItemColorRow")
  181. .Select(
  182. element =>
  183. new LVItemColor(
  184. element.Elements().ToArray()[0].Value,
  185. WIN.Media.Color.FromArgb(
  186. BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[0],
  187. BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[1],
  188. BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[2],
  189. BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[3])))
  190. .ToList().ForEach(e => this.LVItemsColorCol.Add(e));
  191. }
  192. });
  193. }
  194. private void RibbonWindow_Initialized(object sender, EventArgs e) {
  195. this.LoadInitialWindowPositionAndState();
  196. this.LoadColorCodesFromFile();
  197. AppCommands.RoutedNewTab.InputGestures.Add(new KeyGesture(Key.T, ModifierKeys.Control));
  198. AppCommands.RoutedEnterInBreadCrumbCombo.InputGestures.Add(new KeyGesture(Key.E, ModifierKeys.Alt));
  199. AppCommands.RoutedChangeTab.InputGestures.Add(new KeyGesture(Key.Tab, ModifierKeys.Control));
  200. AppCommands.RoutedCloseTab.InputGestures.Add(new KeyGesture(Key.W, ModifierKeys.Control));
  201. AppCommands.RoutedNavigateBack.InputGestures.Add(new KeyGesture(Key.Left, ModifierKeys.Alt));
  202. AppCommands.RoutedNavigateFF.InputGestures.Add(new KeyGesture(Key.Right, ModifierKeys.Alt));
  203. AppCommands.RoutedNavigateUp.InputGestures.Add(new KeyGesture(Key.Up, ModifierKeys.Alt));
  204. AppCommands.RoutedGotoSearch.InputGestures.Add(new KeyGesture(Key.F, ModifierKeys.Control));
  205. }
  206. #region ViewEnumerationComplete
  207. /// <summary>
  208. /// Sets up btnSort and btnGroup so they have the correct items after navigating
  209. /// </summary>
  210. private void SetSortingAndGroupingButtons() {
  211. btnSort.Items.Clear();
  212. btnGroup.Items.Clear();
  213. try {
  214. foreach (Collumns item in _ShellListView.Collumns.Where(x => x != null)) {
  215. var lastSortedColumn = _ShellListView.Collumns.FirstOrDefault(w => w.ID == this._ShellListView.LastSortedColumnId);
  216. if (lastSortedColumn != null) {
  217. var IsChecked1 = (item.pkey.fmtid == lastSortedColumn.pkey.fmtid) && (item.pkey.pid == lastSortedColumn.pkey.pid);
  218. btnSort.Items.Add(Utilities.Build_MenuItem(item.Name, item, checkable: true, isChecked: IsChecked1, GroupName: "GR2", onClick: mi_Click));
  219. }
  220. var IsCheckable2 = _ShellListView.LastGroupCollumn != null && (item.pkey.fmtid == _ShellListView.LastGroupCollumn.pkey.fmtid) && (item.pkey.pid == _ShellListView.LastGroupCollumn.pkey.pid);
  221. btnGroup.Items.Add(Utilities.Build_MenuItem(item.Name, item, checkable: true, isChecked: IsCheckable2, GroupName: "GR3", onClick: mig_Click));
  222. }
  223. } catch (Exception ex) {
  224. //FIXME: I disable this message because of strange null after filter
  225. MessageBox.Show("BetterExplorer had an issue loading the visible columns for the current view. You might not be able to sort or group items.", ex.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
  226. }
  227. btnSort.Items.Add(new Separator() { Focusable = false });
  228. misa = Utilities.Build_MenuItem(FindResource("miAscending"), checkable: true, GroupName: "GR1", onClick: misa_Click);
  229. misd = Utilities.Build_MenuItem(FindResource("miDescending"), checkable: true, GroupName: "GR1", onClick: misd_Click);
  230. if (this._ShellListView.LastSortOrder == WIN.Forms.SortOrder.Ascending)
  231. misa.IsChecked = true;
  232. else
  233. misd.IsChecked = true;
  234. btnSort.Items.Add(misa);
  235. btnSort.Items.Add(misd);
  236. btnGroup.Items.Add(Utilities.Build_MenuItem("(none)", GroupName: "GR3", checkable: true, isChecked: _ShellListView.LastGroupCollumn == null, onClick: misng_Click));
  237. btnGroup.Items.Add(new Separator());
  238. misag = Utilities.Build_MenuItem(FindResource("miAscending"), checkable: true, GroupName: "GR4", onClick: misag_Click);
  239. misdg = Utilities.Build_MenuItem(FindResource("miDescending"), checkable: true, GroupName: "GR4", onClick: misag_Click);
  240. if (this._ShellListView.LastGroupOrder == WIN.Forms.SortOrder.Ascending)
  241. misag.IsChecked = true;
  242. else
  243. misdg.IsChecked = true;
  244. btnGroup.Items.Add(misag);
  245. btnGroup.Items.Add(misdg);
  246. }
  247. void misag_Click(object sender, RoutedEventArgs e) {
  248. this._ShellListView.SetGroupOrder();
  249. }
  250. private void SetupColumnsButton() {
  251. var allAvailColls = this._ShellListView.AllAvailableColumns.Values.ToList();
  252. btnMoreColls.Items.Clear();
  253. chcm.Items.Clear();
  254. for (int j = 1; j < 10; j++) {
  255. //TODO: Try to remove this Try Catch!!
  256. try {
  257. var IsChecked = _ShellListView.Collumns.Any(col => col.pkey.fmtid == allAvailColls[j].pkey.fmtid && col.pkey.pid == allAvailColls[j].pkey.pid);
  258. btnMoreColls.Items.Add(Utilities.Build_MenuItem(allAvailColls[j].Name, allAvailColls[j], checkable: true, onClick: mic_Click, isChecked: IsChecked));
  259. chcm.Items.Add(Utilities.Build_MenuItem(allAvailColls[j].Name, allAvailColls[j], checkable: true, onClick: mic_Click, isChecked: IsChecked));
  260. } catch (Exception) {
  261. }
  262. }
  263. int ItemsCount = _ShellListView.Items.Count;
  264. sbiItemsCount.Visibility = ItemsCount == 0 ? Visibility.Collapsed : Visibility.Visible;
  265. sbiItemsCount.Content = ItemsCount == 1 ? "1 item" : ItemsCount + " items";
  266. sbiSelItemsCount.Visibility = _ShellListView.GetSelectedCount() == 0 ? Visibility.Collapsed : Visibility.Visible;
  267. spSelItems.Visibility = sbiSelItemsCount.Visibility;
  268. btnMoreColls.Items.Add(new Separator());
  269. btnMoreColls.Items.Add(Utilities.Build_MenuItem(FindResource("btnMoreColCP"), allAvailColls, onClick: micm_Click));
  270. btnMoreColls.Tag = allAvailColls;
  271. chcm.Items.Add(new Separator());
  272. chcm.Items.Add(Utilities.Build_MenuItem(FindResource("btnMoreColCP"), allAvailColls, onClick: micm_Click));
  273. }
  274. #endregion
  275. void misd_Click(object sender, RoutedEventArgs e) {
  276. foreach (var item in btnSort.Items.OfType<MenuItem>().Where(item => item.IsChecked && item != (sender as MenuItem))) {
  277. _ShellListView.SetSortCollumn(true, (Collumns)item.Tag, WIN.Forms.SortOrder.Descending);
  278. }
  279. }
  280. void misa_Click(object sender, RoutedEventArgs e) {
  281. foreach (var item in btnSort.Items.OfType<MenuItem>().Where(item => item.IsChecked && item != (sender as MenuItem))) {
  282. _ShellListView.SetSortCollumn(true, (Collumns)item.Tag, WIN.Forms.SortOrder.Ascending);
  283. }
  284. }
  285. void micm_Click(object sender, RoutedEventArgs e) {
  286. var fMoreCollumns = new MoreColumns();
  287. fMoreCollumns.PopulateAvailableColumns((List<Collumns>)(sender as FrameworkElement).Tag, this._ShellListView, this.PointToScreen(Mouse.GetPosition(this)));
  288. }
  289. void mic_Click(object sender, RoutedEventArgs e) {
  290. var mi = (sender as MenuItem);
  291. Collumns col = (Collumns)mi.Tag;
  292. _ShellListView.SetColInView(col, !mi.IsChecked);
  293. }
  294. void miItem_Click(object sender, RoutedEventArgs e) {
  295. MenuItem mi = sender as MenuItem;
  296. ShellItem SaveLoc = mi.Tag as ShellItem;
  297. if (_ShellListView.CurrentFolder.ParsingName.Contains(KnownFolders.Libraries.ParsingName) && _ShellListView.CurrentFolder.ParsingName.EndsWith("library-ms")) {
  298. var lib = ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.CurrentFolder.ParsingName), false);
  299. lib.DefaultSaveFolder = SaveLoc.ParsingName;
  300. lib.Close();
  301. } else if (_ShellListView.GetFirstSelectedItem().ParsingName.Contains(KnownFolders.Libraries.ParsingName)) {
  302. var lib = ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.GetFirstSelectedItem().ParsingName), false);
  303. lib.DefaultSaveFolder = SaveLoc.ParsingName;
  304. lib.Close();
  305. }
  306. }
  307. void LinksFolderWarcher_Renamed(object sender, RenamedEventArgs e) {
  308. Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(
  309. () => btnFavorites.Items.OfType<MenuItem>().First(x => (x.Tag as ShellItem).ParsingName == e.OldFullPath).Header = Path.GetFileNameWithoutExtension(e.Name)));
  310. }
  311. void LinksFolderWarcher_Deleted(object sender, FileSystemEventArgs e) {
  312. Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(
  313. () => btnFavorites.Items.Remove(btnFavorites.Items.OfType<MenuItem>().First(item => item.Header.ToString() == Path.GetFileNameWithoutExtension(e.Name)))));
  314. }
  315. void LinksFolderWarcher_Created(object sender, FileSystemEventArgs e) {
  316. Dispatcher.BeginInvoke(DispatcherPriority.Normal,
  317. (Action)(() => {
  318. if (Path.GetExtension(e.FullPath).ToLowerInvariant() == ".lnk") {
  319. var so = new ShellItem(e.FullPath);
  320. so.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly;
  321. so.Thumbnail.CurrentSize = new WIN.Size(16, 16);
  322. ImageSource icon = so.Thumbnail.BitmapSource;
  323. btnFavorites.Items.Add(Utilities.Build_MenuItem(so.DisplayName, so, icon, onClick: mif_Click));
  324. }
  325. }));
  326. }
  327. /// <summary>
  328. /// Sets up each ribbon tab after select or navigate in ShellListView
  329. /// </summary>
  330. /// <param name="selectedItemsCount">The number of items selected</param>
  331. /// <param name="selectedItem">The last selected item</param>
  332. /// <remarks>
  333. /// Only used in SetupUIOnSelectOrNavigate
  334. /// </remarks>
  335. private void SetUpRibbonTabsVisibilityOnSelectOrNavigate(int selectedItemsCount, IListItemEx selectedItem) {
  336. #region Search Contextual Tab
  337. ctgSearch.Visibility = BooleanToVisibiliy(_ShellListView.CurrentFolder.IsSearchFolder);
  338. if (ctgSearch.Visibility == Visibility.Visible && !_ShellListView.CurrentFolder.IsSearchFolder) {
  339. ctgSearch.Visibility = Visibility.Collapsed;
  340. TheRibbon.SelectedTabItem = HomeTab;
  341. }
  342. #endregion
  343. #region Folder Tools Context Tab
  344. ctgFolderTools.Visibility = BooleanToVisibiliy((selectedItemsCount == 1 && selectedItem.IsFolder && selectedItem.IsFileSystem && !selectedItem.IsDrive && !selectedItem.IsNetworkPath));
  345. if (BESettings.AutoSwitchFolderTools && ctgFolderTools.Visibility == Visibility.Visible) {
  346. TheRibbon.SelectedTabItem = ctgFolderTools.Items[0];
  347. }
  348. #endregion
  349. #region Drive Contextual Tab
  350. ctgDrive.Visibility = BooleanToVisibiliy(_ShellListView.CurrentFolder.IsDrive || (selectedItemsCount == 1 && (selectedItem.IsDrive || (selectedItem.Parent != null && selectedItem.Parent.IsDrive))));
  351. if (BESettings.AutoSwitchDriveTools && ctgDrive.Visibility == Visibility.Visible && selectedItemsCount == 1 && selectedItem.IsDrive) {
  352. TheRibbon.SelectedTabItem = ctgDrive.Items[0];
  353. }
  354. #endregion
  355. #region Library Context Tab
  356. ctgLibraries.Visibility = BooleanToVisibiliy((selectedItemsCount == 1 && _ShellListView.CurrentFolder.ParsingName.Equals(KnownFolders.Libraries.ParsingName)) || (selectedItemsCount == 1 && selectedItem.Parent != null && selectedItem.Parent.ParsingName.Equals(KnownFolders.Libraries.ParsingName)));
  357. if (ctgLibraries.Visibility == Visibility.Visible && BESettings.AutoSwitchLibraryTools) {
  358. TheRibbon.SelectedTabItem = ctgLibraries.Items[0];
  359. }
  360. /*
  361. if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.ParsingName.Equals(KnownFolders.Libraries.ParsingName)) {
  362. if (selectedItem != null && selectedItemsCount == 1)
  363. SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(selectedItem.ParsingName), false));
  364. } else if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.Parent.ParsingName.Equals(KnownFolders.Libraries.ParsingName)) {
  365. if (selectedItemsCount == 1)
  366. SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.CurrentFolder.ParsingName), false));
  367. }
  368. if (selectedItemsCount == 0) {
  369. ctgLibraries.Visibility = Visibility.Collapsed;
  370. }
  371. */
  372. if (selectedItemsCount == 0)
  373. ctgLibraries.Visibility = Visibility.Collapsed;
  374. else if (selectedItemsCount > 1) { } else if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.ParsingName.Equals(KnownFolders.Libraries.ParsingName))
  375. SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(selectedItem.ParsingName), false));
  376. else if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.Parent.ParsingName.Equals(KnownFolders.Libraries.ParsingName))
  377. SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.CurrentFolder.ParsingName), false));
  378. #endregion
  379. #region Archive Contextual Tab
  380. ctgArchive.Visibility = WIN.Visibility.Collapsed; //TODO: Restore this: BooleanToVisibiliy(selectedItemsCount == 1 && Archives.Contains(Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant()));
  381. if (BESettings.AutoSwitchArchiveTools && ctgArchive.Visibility == Visibility.Visible)
  382. TheRibbon.SelectedTabItem = ctgArchive.Items[0];
  383. #endregion
  384. #region Application Context Tab
  385. ctgExe.Visibility = BooleanToVisibiliy(selectedItemsCount == 1 && !selectedItem.IsFolder && (Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant() == ".exe" || Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant() == ".msi"));
  386. if (BESettings.AutoSwitchApplicationTools && ctgExe.Visibility == Visibility.Visible) {
  387. TheRibbon.SelectedTabItem = ctgExe.Items[0];
  388. }
  389. #endregion
  390. #region Image Context Tab
  391. ctgImage.Visibility = BooleanToVisibiliy(selectedItemsCount == 1 && !selectedItem.IsFolder && Images.Contains(Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant()));
  392. if (ctgImage.Visibility == Visibility.Visible) {
  393. try {
  394. if (new FileInfo(selectedItem.ParsingName).Length != 0) {
  395. using (var cvt = new Bitmap(selectedItem.ParsingName)) {
  396. imgSizeDisplay.WidthData = cvt.Width.ToString();
  397. imgSizeDisplay.HeightData = cvt.Height.ToString();
  398. if (BESettings.AutoSwitchImageTools) TheRibbon.SelectedTabItem = ctgImage.Items[0];
  399. }
  400. }
  401. } catch (Exception) {
  402. MessageBox.Show("Image was invalid");
  403. }
  404. }
  405. #endregion
  406. #region Virtual Disk Context Tab
  407. ctgVirtualDisk.Visibility = BooleanToVisibiliy(selectedItemsCount == 1 && !selectedItem.IsFolder && Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant() == ".iso");
  408. if (BESettings.AutoSwitchVirtualDriveTools && ctgVirtualDisk.Visibility == Visibility.Visible) {
  409. TheRibbon.SelectedTabItem = ctgVirtualDisk.Items[0];
  410. }
  411. #endregion
  412. }
  413. /// <summary>
  414. /// Sets up the status bar
  415. /// </summary>
  416. /// <param name="selectedItemsCount">The number of items currently selected</param>
  417. private void SetUpStatusBarOnSelectOrNavigate(int selectedItemsCount) {
  418. spSelItems.Visibility = BooleanToVisibiliy(selectedItemsCount > 0);
  419. sbiSelItemsCount.Visibility = BooleanToVisibiliy(selectedItemsCount > 0);
  420. if (selectedItemsCount == 1)
  421. sbiSelItemsCount.Content = "1 item selected";
  422. else if (selectedItemsCount > 1)
  423. sbiSelItemsCount.Content = selectedItemsCount.ToString() + " items selected";
  424. }
  425. private void SetUpButtonsStateOnSelectOrNavigate(int selectedItemsCount, IListItemEx selectedItem) {
  426. btnBadges.IsEnabled = selectedItemsCount > 0;
  427. btnCopy.IsEnabled = selectedItemsCount > 0;
  428. btnCopyto.IsEnabled = selectedItemsCount > 0;
  429. btnMoveto.IsEnabled = selectedItemsCount > 0;
  430. btnCut.IsEnabled = selectedItemsCount > 0;
  431. btnDelete.IsEnabled = selectedItem != null && selectedItem.IsFileSystem;
  432. btnRename.IsEnabled = selectedItem != null && (selectedItem.IsFileSystem || (selectedItem.Parent != null && selectedItem.Parent.Equals(KnownFolders.Libraries)));
  433. btnProperties3.IsEnabled = selectedItemsCount > 0;
  434. if (selectedItem != null) {
  435. var rg = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + Path.GetExtension(selectedItem.ParsingName) + @"\OpenWithProgids");
  436. if (rg == null)
  437. btnEdit.IsEnabled = false;
  438. else {
  439. string filetype = rg.GetValueNames()[0];
  440. rg.Close();
  441. using (var rgtype = Registry.ClassesRoot.OpenSubKey(filetype + @"\shell\edit\command")) {
  442. btnEdit.IsEnabled = !(rgtype == null);
  443. }
  444. }
  445. }
  446. btnSelAll.IsEnabled = selectedItemsCount != _ShellListView.Items.Count;
  447. btnSelNone.IsEnabled = selectedItemsCount > 0;
  448. btnShare.IsEnabled = selectedItemsCount == 1 && selectedItem.IsFolder;
  449. btnAdvancedSecurity.IsEnabled = selectedItemsCount == 1;
  450. btnHideSelItems.IsEnabled = _ShellListView.CurrentFolder.IsFileSystem;
  451. }
  452. private void SetupLibrariesTab(ShellLibrary lib) {
  453. IsFromSelectionOrNavigation = true;
  454. chkPinNav.IsChecked = lib.IsPinnedToNavigationPane;
  455. IsFromSelectionOrNavigation = false;
  456. foreach (ShellItem item in lib) {
  457. item.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly;
  458. item.Thumbnail.CurrentSize = new WIN.Size(16, 16);
  459. btnDefSave.Items.Add(Utilities.Build_MenuItem(item.GetDisplayName(SIGDN.NORMALDISPLAY), item, item.Thumbnail.BitmapSource, GroupName: "GRDS1", checkable: true,
  460. isChecked: item.ParsingName == lib.DefaultSaveFolder, onClick: miItem_Click));
  461. }
  462. btnDefSave.IsEnabled = lib.Count != 0;
  463. lib.Close();
  464. }
  465. /// <summary>
  466. /// Does setup required for the UI when navigation occurs to a new folder
  467. /// </summary>
  468. private void SetupUIOnSelectOrNavigate() {
  469. Dispatcher.BeginInvoke(DispatcherPriority.Background, (ThreadStart)(() => {
  470. btnDefSave.Items.Clear();
  471. var selItemsCount = _ShellListView.GetSelectedCount();
  472. var selectedItem = this._ShellListView.GetFirstSelectedItem();
  473. if (selectedItem == null) {
  474. btnOpenWith.IsEnabled = false;
  475. } else {
  476. var mnu = new ShellContextMenu(this._ShellListView, false);
  477. try {
  478. var tempPoint = btnOpenWith.PointToScreen(new WIN.Point(0, 0));
  479. var itemMenuCount = mnu.ShowContextMenu(new System.Drawing.Point((int)tempPoint.X, (int)tempPoint.Y + (int)btnOpenWith.ActualHeight), 1, false);
  480. btnOpenWith.IsEnabled = itemMenuCount > 0 && selItemsCount == 1;
  481. } catch {
  482. btnOpenWith.IsEnabled = false;
  483. }
  484. }
  485. btnNewItem.IsEnabled = this._ShellListView.CurrentFolder.IsFileSystem || this._ShellListView.CurrentFolder.ParsingName == KnownFolders.Libraries.ParsingName;
  486. if (selectedItem != null && selectedItem.IsFileSystem && BESettings.IsPreviewPaneEnabled && !selectedItem.IsFolder && selItemsCount == 1)
  487. this.Previewer.FileName = selectedItem.ParsingName;
  488. else if (!String.IsNullOrEmpty(this.Previewer.FileName))
  489. this.Previewer.FileName = null;
  490. //Set up ribbon contextual tabs on selection changed
  491. SetUpRibbonTabsVisibilityOnSelectOrNavigate(selItemsCount, selectedItem);
  492. SetUpButtonsStateOnSelectOrNavigate(selItemsCount, selectedItem);
  493. }));
  494. }
  495. bool IsFromSelectionOrNavigation = false;
  496. void cbm_ClipboardChanged(object sender, Tuple<WIN.Forms.IDataObject> e) {
  497. btnPaste.IsEnabled = e.Item1.GetDataPresent(DataFormats.FileDrop) || e.Item1.GetDataPresent("Shell IDList Array");
  498. btnPasetShC.IsEnabled = e.Item1.GetDataPresent(DataFormats.FileDrop) || e.Item1.GetDataPresent("Shell IDList Array");
  499. }
  500. #endregion
  501. #region Conditional Select
  502. private void miSelAllByType_Click(object sender, RoutedEventArgs e) {
  503. if (_ShellListView.GetSelectedCount() > 0) {
  504. var typePK = new PROPERTYKEY() { fmtid = Guid.Parse("B725F130-47EF-101A-A5F1-02608C9EEBAC"), pid = 4 };
  505. var flt = _ShellListView.SelectedItems.Select(item => item.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant());
  506. var items = _ShellListView.Items.Where(w => flt.Contains(w.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant())).ToArray();
  507. _ShellListView.SelectItems(items);
  508. btnCondSel.IsDropDownOpen = false;
  509. }
  510. }
  511. private void miSelAllByDate_Click(object sender, RoutedEventArgs e) {
  512. if (_ShellListView.GetSelectedCount() > 0) {
  513. var typePK = new PROPERTYKEY() { fmtid = Guid.Parse("b725f130-47ef-101a-a5f1-02608c9eebac"), pid = 15 };
  514. var flt = _ShellListView.SelectedItems.Select(item => DateTime.Parse(item.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant()).Date);
  515. var items = _ShellListView.Items.Where(w => flt.Contains(DateTime.Parse(w.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant()).Date)).ToArray();
  516. _ShellListView.SelectItems(items);
  517. btnCondSel.IsDropDownOpen = false;
  518. }
  519. }
  520. private void btnCondSel_Click(object sender, RoutedEventArgs e) {
  521. btnCondSel.IsDropDownOpen = false;
  522. ConditionalSelectForm.Open(_ShellListView);
  523. }
  524. #endregion
  525. #region Size Chart
  526. private void btnFSizeChart_Click(object sender, RoutedEventArgs e) {
  527. if (_ShellListView.GetSelectedCount() > 0) {
  528. if ((_ShellListView.GetFirstSelectedItem().IsFolder || _ShellListView.GetFirstSelectedItem().IsDrive) && _ShellListView.GetFirstSelectedItem().IsFileSystem) {
  529. FolderSizeWindow.Open(_ShellListView.GetFirstSelectedItem().ParsingName, this);
  530. return;
  531. }
  532. } else if ((_ShellListView.CurrentFolder.IsFolder || _ShellListView.CurrentFolder.IsDrive) && _ShellListView.CurrentFolder.IsFileSystem) {
  533. FolderSizeWindow.Open(_ShellListView.CurrentFolder.ParsingName, this);
  534. }
  535. }
  536. private void btnSizeChart_Click(object sender, RoutedEventArgs e) {
  537. FolderSizeWindow.Open(_ShellListView.CurrentFolder.ParsingName, this);
  538. }
  539. #endregion
  540. #region Home Tab
  541. private void btnctDocuments_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Documents.ParsingName, OperationType.Copy);
  542. private void btnctDesktop_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Desktop.ParsingName, OperationType.Copy);
  543. private void btnctDounloads_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Downloads.ParsingName, OperationType.Copy);
  544. private void btnmtDocuments_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Documents.ParsingName, OperationType.Move);
  545. private void btnmtDesktop_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Desktop.ParsingName, OperationType.Move);
  546. private void btnmtDounloads_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Downloads.ParsingName, OperationType.Move);
  547. private void btnCopyto_Click(object sender, RoutedEventArgs e) => btnctOther_Click(sender, e);
  548. private void btnMoveto_Click(object sender, RoutedEventArgs e) => btnmtOther_Click(sender, e);
  549. private void btnCut_Click(object sender, RoutedEventArgs e) => _ShellListView.CutSelectedFiles();
  550. private void btnOpenWith_Click(object sender, RoutedEventArgs e) => Process.Start($"\"{_ShellListView.GetFirstSelectedItem().ParsingName}\"");
  551. private void btnPaste_Click(object sender, RoutedEventArgs e) => _ShellListView.PasteAvailableFiles();
  552. private void btnDelete_Click(object sender, RoutedEventArgs e) => MenuItem_Click(sender, e);
  553. private void btnRename_Click(object sender, RoutedEventArgs e) => _ShellListView.RenameSelectedItem();
  554. private void btnSelAll_Click(object sender, RoutedEventArgs e) => _ShellListView.SelectAll();
  555. private void btnSelNone_Click(object sender, RoutedEventArgs e) => _ShellListView.DeSelectAllItems();
  556. private void MenuItem_Click(object sender, RoutedEventArgs e) => _ShellListView.DeleteSelectedFiles(true);
  557. private void MenuItem_Click_1(object sender, RoutedEventArgs e) => _ShellListView.DeleteSelectedFiles(false);
  558. private void btnProperties_Click(object sender, RoutedEventArgs e) => _ShellListView.ShowPropPage(this.Handle, _ShellListView.GetFirstSelectedItem().ParsingName, "");
  559. private void btnInvSel_Click(object sender, RoutedEventArgs e) => _ShellListView.InvertSelection();
  560. private void btnNewWindow_Click(object sender, RoutedEventArgs e) => Process.Start(Assembly.GetExecutingAssembly().Location, "/nw");
  561. void miow_Click(object sender, RoutedEventArgs e) => ((AssociationItem)(sender as MenuItem).Tag).Invoke();
  562. private void miJunctionpoint_Click(object sender, RoutedEventArgs e) {
  563. string pathForDrop = _ShellListView.CurrentFolder.ParsingName.Replace(@"\\", @"\");
  564. var files = new string[0];
  565. if (Clipboards.ContainsData("Shell IDList Array"))
  566. files = Clipboards.GetDataObject().ToShellItemArray().ToArray().Select(s => new ShellItem(s).ParsingName).ToArray();
  567. else
  568. files = Clipboards.GetFileDropList().OfType<string>().ToArray();
  569. foreach (string item in files) {
  570. var o = new ShellItem(item);
  571. JunctionPointUtils.JunctionPoint.Create($@"{pathForDrop}\{o.GetDisplayName(SIGDN.NORMALDISPLAY)}", o.ParsingName, true);
  572. AddToLog($@"Created Junction Point at {pathForDrop}\{o.GetDisplayName(SIGDN.NORMALDISPLAY)} linked to {o.ParsingName}");
  573. }
  574. }
  575. private void miCreateSymlink_Click(object sender, RoutedEventArgs e) {
  576. var items = new IListItemEx[0];
  577. items = Clipboards.ContainsData("Shell IDList Array") ? Clipboards.GetDataObject().ToShellItemArray().ToArray().Select(s => FileSystemListItem.InitializeWithIShellItem(this._ShellListView.LVHandle, s)).ToArray() : Clipboards.GetFileDropList().OfType<string>().ToArray().Select(s => FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, s)).ToArray();
  578. var pathForDrop = _ShellListView.CurrentFolder.ParsingName.Replace(@"\\", @"\");
  579. var exePath = Utilities.AppDirectoryItem("BetterExplorerOperations.exe");
  580. var linkItems = items.Select(s => new LinkItem() {
  581. IsDirectory = s.IsFolder,
  582. DestinationData = pathForDrop + @"\" + s.DisplayName,
  583. SourceData = s.ParsingName
  584. }).ToArray();
  585. Task.Run(() => {
  586. using (var proc = new Process()) {
  587. proc.StartInfo = new ProcessStartInfo {
  588. FileName = exePath,
  589. Verb = "runas",
  590. UseShellExecute = true,
  591. Arguments = $"/env /user:Administrator \"{exePath}\""
  592. };
  593. proc.Start();
  594. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
  595. var address = new EndpointAddress(new Uri("net.tcp://localhost:60000/BEComChannel"));
  596. var binding = new NetTcpBinding() { MaxReceivedMessageSize = 4000000, MaxBufferPoolSize = 4000000, MaxBufferSize = 4000000 };
  597. binding.Security = new NetTcpSecurity() { Mode = SecurityMode.Message };
  598. var factory = new ChannelFactory<IBetterExplorerCommunication>(binding, address);
  599. var beSvc = factory.CreateChannel();
  600. try {
  601. beSvc.CreateLink(new LinkData() { Items = linkItems });
  602. } finally {
  603. Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => this._ShellListView.UnvalidateDirectory()));
  604. }
  605. proc.WaitForExit();
  606. if (proc.ExitCode == 1)
  607. MessageBox.Show("Error in creating symlink", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  608. else {
  609. Thread.Sleep(1000);
  610. Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => this._ShellListView.UnvalidateDirectory()));
  611. }
  612. }
  613. });
  614. }
  615. private void btnHistory_Click(object sender, RoutedEventArgs e) {
  616. _ShellListView.ShowPropPage(this.Handle, _ShellListView.GetFirstSelectedItem().ParsingName,
  617. User32.LoadResourceString(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "twext.dll"), 1024, "Previous Versions"));
  618. }
  619. private void btnBackstageExit_Click(object sender, RoutedEventArgs e) {
  620. //! We call Shutdown() so to explicit shutdown the app regardless of windows closing cancel flag.
  621. if (this.IsMultipleWindowsOpened)
  622. this.Close();
  623. else
  624. Application.Current.Shutdown();
  625. }
  626. void mif_Click(object sender, RoutedEventArgs e) {
  627. using (var obj = (sender as MenuItem).Tag as ShellItem)
  628. using (var lnk = new ShellLink(obj.ParsingName)) {
  629. NavigationController(FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, lnk.TargetPIDL));
  630. }
  631. }
  632. private void btnCopy_Click(object sender, RoutedEventArgs e) {
  633. var sc = new StringCollection();
  634. sc.AddRange(_ShellListView.SelectedItems.Select(x => x.ParsingName).ToArray());
  635. Clipboards.SetFileDropList(sc);
  636. }
  637. private void btnPathCopy_Click(object sender, RoutedEventArgs e) {
  638. if (_ShellListView.SelectedItems.Count > 1)
  639. Clipboards.SetText(_ShellListView.SelectedItems.Select(item => "\r\n" + item.ParsingName).Aggregate((x, y) => x + y).Trim());
  640. else if (_ShellListView.SelectedItems.Count == 1)
  641. Clipboards.SetText(_ShellListView.GetFirstSelectedItem().ParsingName);
  642. else
  643. Clipboards.SetText(_ShellListView.CurrentFolder.ParsingName);
  644. }
  645. // New Folder/Library
  646. private void btnNewFolder_Library(object sender, RoutedEventArgs e) {
  647. //We should focus the ListView or on some circumstances new folder does not start renaming after folder is created
  648. this._ShellListView.Focus();
  649. _ShellListView.IsRenameNeeded = true;
  650. if (_ShellListView.CurrentFolder.ParsingName == KnownFolders.Libraries.ParsingName)
  651. _ShellListView.CreateNewLibrary(FindResource("btnNewLibraryCP").ToString());
  652. else
  653. _ShellListView.CreateNewFolder(null);
  654. }
  655. private void btnPasetShC_Click(object sender, RoutedEventArgs e) {
  656. string PathForDrop = _ShellListView.CurrentFolder.ParsingName;
  657. foreach (string item in Clipboards.GetFileDropList()) {
  658. using (var shortcut = new ShellLink()) {
  659. var o = new ShellItem(item);
  660. shortcut.Target = item;
  661. shortcut.WorkingDirectory = Path.GetDirectoryName(item);
  662. shortcut.Description = o.GetDisplayName(SIGDN.NORMALDISPLAY);
  663. shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
  664. shortcut.Save($"{PathForDrop}\\{o.GetDisplayName(SIGDN.NORMALDISPLAY)}.lnk");
  665. AddToLog($"Shortcut created at {PathForDrop}\\{o.GetDisplayName(SIGDN.NORMALDISPLAY)} from source {item}");
  666. }
  667. }
  668. }
  669. private void btnmtOther_Click(object sender, RoutedEventArgs e) {
  670. var dlg = new FolderSelectDialog();
  671. if (dlg.ShowDialog())
  672. SetFOperation(dlg.FileName, OperationType.Move);
  673. }
  674. private void SetFOperation(String fileName, OperationType opType) {
  675. var obj = FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, fileName.ToShellParsingName());
  676. if (opType == OperationType.Copy)
  677. _ShellListView.DoCopy(obj);
  678. else if (opType == OperationType.Move)
  679. _ShellListView.DoMove(obj);
  680. }
  681. private void SetFOperation(IListItemEx obj, OperationType opType) {
  682. if (opType == OperationType.Copy)
  683. _ShellListView.DoCopy(obj);
  684. else if (opType == OperationType.Move)
  685. _ShellListView.DoMove(obj);
  686. }
  687. private void btnctOther_Click(object sender, RoutedEventArgs e) {
  688. var dlg = new FolderSelectDialog();
  689. if (dlg.ShowDialog())
  690. SetFOperation(dlg.FileName, OperationType.Copy);
  691. _ShellListView.Focus();
  692. }
  693. private void btnNewItem_Click(object sender, RoutedEventArgs e) {
  694. var state = new BExplorer.Shell.Interop.Shell32.SHELLSTATE() { fShowAllObjects = 0 };
  695. BExplorer.Shell.Interop.Shell32.SHGetSetSettings(ref state, BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWALLOBJECTS, true);
  696. }
  697. private void btnEdit_Click(object sender, RoutedEventArgs e) {
  698. new Process() {
  699. StartInfo = new ProcessStartInfo {
  700. FileName = _ShellListView.GetFirstSelectedItem().ParsingName,
  701. Verb = "edit",
  702. UseShellExecute = true,
  703. }
  704. }.Start();
  705. }
  706. private void btnFavorites_Click(object sender, RoutedEventArgs e) {
  707. var selectedItems = _ShellListView.SelectedItems;
  708. if (selectedItems.Count == 1) {
  709. var link = new ShellLink();
  710. link.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
  711. link.Target = _ShellListView.GetFirstSelectedItem().ParsingName;
  712. link.Save($@"{KnownFolders.Links.ParsingName}\{_ShellListView.GetFirstSelectedItem().DisplayName}.lnk");
  713. link.Dispose();
  714. }
  715. if (selectedItems.Count == 0) {
  716. var link = new ShellLink();
  717. link.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
  718. link.Target = _ShellListView.CurrentFolder.ParsingName;
  719. link.Save($@"{KnownFolders.Links.ParsingName}\{_ShellListView.CurrentFolder.DisplayName}.lnk");
  720. link.Dispose();
  721. }
  722. }
  723. #endregion
  724. #region Drive Tools / Virtual Disk Tools
  725. private void btnDefragDrive_Click(object sender, RoutedEventArgs e) {
  726. string DriveLetter = "";
  727. if (!_ShellListView.SelectedItems.Any())
  728. DriveLetter = _ShellListView.CurrentFolder.ParsingName;
  729. else if (Directory.GetLogicalDrives().Contains(_ShellListView.SelectedItems[0].ParsingName))
  730. DriveLetter = _ShellListView.SelectedItems[0].ParsingName;
  731. else
  732. DriveLetter = _ShellListView.CurrentFolder.ParsingName;
  733. Process.Start(Path.Combine(Environment.SystemDirectory, "dfrgui.exe"), $"/u /v {DriveLetter.Replace("\\", "")}");
  734. }
  735. private char GetDriveLetterFromDrivePath(string path) => path.Substring(0, 1).ToCharArray()[0];
  736. private void btnFormatDrive_Click(object sender, RoutedEventArgs e) {
  737. if (MessageBox.Show("Are you sure you want to do this?", FindResource("btnFormatDriveCP").ToString(), MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) {
  738. var formatDriveThread = new Thread(() => {
  739. string DriveLetter =
  740. _ShellListView.SelectedItems.Any() ?
  741. DriveLetter = Directory.GetLogicalDrives().Contains(_ShellListView.SelectedItems[0].ParsingName) ? _ShellListView.SelectedItems[0].ParsingName : _ShellListView.CurrentFolder.ParsingName
  742. :
  743. DriveLetter = _ShellListView.CurrentFolder.ParsingName;
  744. BExplorer.Shell.Interop.Shell32.FormatDrive(IntPtr.Zero, DriveLetter);
  745. });
  746. formatDriveThread.Start();
  747. }
  748. }
  749. private void btnCleanDrive_Click(object sender, RoutedEventArgs e) {
  750. string DriveLetter = "";
  751. if (_ShellListView.SelectedItems.Any())
  752. DriveLetter = Directory.GetLogicalDrives().Contains(_ShellListView.SelectedItems[0].ParsingName) ? _ShellListView.SelectedItems[0].ParsingName : _ShellListView.CurrentFolder.ParsingName;
  753. else
  754. DriveLetter = _ShellListView.CurrentFolder.ParsingName;
  755. Process.Start("Cleanmgr.exe", "/d" + DriveLetter.Replace(":\\", ""));
  756. }
  757. private void OpenCDTray(char DriveLetter) {
  758. mciSendString($"open {DriveLetter}: type CDAudio alias drive{DriveLetter}", null, 0, IntPtr.Zero);
  759. mciSendString($"set drive{DriveLetter} door open", null, 0, IntPtr.Zero);
  760. }
  761. private void CloseCDTray(char DriveLetter) {
  762. mciSendString($"open {DriveLetter}: type CDAudio alias drive{DriveLetter}", null, 0, IntPtr.Zero);
  763. mciSendString($"set drive{DriveLetter} door closed", null, 0, IntPtr.Zero);
  764. }
  765. private void btnOpenTray_Click(object sender, RoutedEventArgs e) {
  766. if (_ShellListView.GetFirstSelectedItem()?.GetDriveInfo().DriveType == DriveType.CDRom)
  767. OpenCDTray(GetDriveLetterFromDrivePath(_ShellListView.GetFirstSelectedItem().ParsingName));
  768. }
  769. private void btnCloseTray_Click(object sender, RoutedEventArgs e) {
  770. if (_ShellListView.GetFirstSelectedItem()?.GetDriveInfo().DriveType == DriveType.CDRom)
  771. CloseCDTray(GetDriveLetterFromDrivePath(_ShellListView.GetFirstSelectedItem().ParsingName));
  772. }
  773. private void EjectDisk(char DriveLetter) {
  774. Thread t = new Thread(() => {
  775. Thread.Sleep(10);
  776. var vdc = new VolumeDeviceClass();
  777. foreach (Volume item in vdc.Devices) {
  778. if (GetDriveLetterFromDrivePath(item.LogicalDrive) == DriveLetter) {
  779. var veto = item.Eject(false);
  780. if (veto != Native.PNP_VETO_TYPE.TypeUnknown) {
  781. if (veto == Native.PNP_VETO_TYPE.Ok) {
  782. Dispatcher.BeginInvoke(DispatcherPriority.Normal,
  783. (Action)(() => {
  784. this.beNotifyIcon.ShowBalloonTip("Information", $"It is safe to remove {item.LogicalDrive}", Hardcodet.Wpf.TaskbarNotification.BalloonIcon.Info);
  785. var tabsForRemove = tcMain.Items.OfType<Wpf.Controls.TabItem>().Where(w => {
  786. var root = String.Empty;
  787. try {
  788. root = Path.GetPathRoot(w.ShellObject.ParsingName.ToShellParsingName());
  789. } catch { }
  790. return !String.IsNullOrEmpty(root) && (w.ShellObject.IsFileSystem &&
  791. root.ToLowerInvariant() == $"{DriveLetter}:\\".ToLowerInvariant());
  792. }).ToArray();
  793. foreach (Wpf.Controls.TabItem tab in tabsForRemove) {
  794. tcMain.RemoveTabItem(tab);
  795. }
  796. }));
  797. } else {
  798. var message = String.Empty;
  799. var obj = new ShellItem(item.LogicalDrive);
  800. switch (veto) {
  801. case Native.PNP_VETO_TYPE.Ok:
  802. break;
  803. case Native.PNP_VETO_TYPE.TypeUnknown:
  804. break;
  805. case Native.PNP_VETO_TYPE.LegacyDevice:
  806. break;
  807. case Native.PNP_VETO_TYPE.PendingClose:
  808. break;
  809. case Native.PNP_VETO_TYPE.WindowsApp:
  810. break;
  811. case Native.PNP_VETO_TYPE.WindowsService:
  812. break;
  813. case Native.PNP_VETO_TYPE.OutstandingOpen:
  814. message = $"The device {obj.GetDisplayName(SIGDN.NORMALDISPLAY)} can not be disconnected because is in use!";
  815. break;
  816. case Native.PNP_VETO_TYPE.Device:
  817. break;
  818. case Native.PNP_VETO_TYPE.Driver:
  819. break;
  820. case Native.PNP_VETO_TYPE.IllegalDeviceRequest:
  821. break;
  822. case Native.PNP_VETO_TYPE.InsufficientPower:
  823. break;
  824. case Native.PNP_VETO_TYPE.NonDisableable:
  825. message = $"The device {obj.GetDisplayName(SIGDN.NORMALDISPLAY)} does not support disconnecting!";
  826. break;
  827. case Native.PNP_VETO_TYPE.LegacyDriver:
  828. break;
  829. default:
  830. break;
  831. }
  832. Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => this.beNotifyIcon.ShowBalloonTip("Error", message, Hardcodet.Wpf.TaskbarNotification.BalloonIcon.Error)));
  833. }
  834. }
  835. break;
  836. }
  837. }
  838. });
  839. t.SetApartmentState(ApartmentState.STA);
  840. t.Start();
  841. }
  842. private void btnEjectDevice_Click(object sender, RoutedEventArgs e) {
  843. var firstSelectedItem = _ShellListView.GetFirstSelectedItem();
  844. if (firstSelectedItem?.GetDriveInfo().DriveType == DriveType.Removable || firstSelectedItem.GetDriveInfo().DriveType == DriveType.Fixed) {
  845. EjectDisk(GetDriveLetterFromDrivePath(firstSelectedItem.ParsingName));
  846. //USBEject.EjectDrive(GetDriveLetterFromDrivePath(firstSelectedItem.ParsingName));
  847. }
  848. }
  849. // Virtual Disk Tools
  850. private bool CheckImDiskInstalled() {
  851. try {
  852. ImDiskAPI.GetDeviceList();
  853. return true;
  854. } catch (DllNotFoundException) {
  855. return false;
  856. }
  857. }
  858. public void ShowInstallImDiskMessage() {
  859. if (MessageBox.Show("It appears you do not have the ImDisk Virtual Disk Driver installed. This driver is used to power Better Explorer's ISO-mounting features. \n\nWould you like to visit ImDisk's website to install the product? (http://www.ltr-data.se/opencode.html/)", "ImDisk Not Found", MessageBoxButton.YesNo, MessageBoxImage.Error) == MessageBoxResult.Yes) {
  860. Process.Start("http://www.ltr-data.se/opencode.html/#ImDisk");
  861. }
  862. }
  863. private void btnAdvMountIso_Click(object sender, RoutedEventArgs e) {
  864. if (!CheckImDiskInstalled()) {
  865. ShowInstallImDiskMessage();
  866. return;
  867. }
  868. var mi = new MountIso() { Owner = this };
  869. mi.ShowDialog();
  870. if (mi.yep) {
  871. string DriveLetter = String.Format("{0}:", mi.chkPreselect.IsChecked == true ? ImDiskAPI.FindFreeDriveLetter() : (char)mi.cbbLetter.SelectedItem);
  872. long size = mi.chkPresized.IsChecked == true ? 0 : Convert.ToInt64(mi.txtSize.Text);
  873. ImDiskFlags imflags;
  874. switch (mi.cbbType.SelectedIndex) {
  875. case 0:
  876. //Hard Drive
  877. imflags = ImDiskFlags.DeviceTypeHD;
  878. break;
  879. case 1:
  880. // CD/DVD
  881. imflags = ImDiskFlags.DeviceTypeCD;
  882. break;
  883. case 2:
  884. // Floppy Disk
  885. imflags = ImDiskFlags.DeviceTypeFD;
  886. break;
  887. case 3:
  888. // Raw Data
  889. imflags = ImDiskFlags.DeviceTypeRAW;
  890. break;
  891. default:
  892. imflags = ImDiskFlags.DeviceTypeCD;
  893. break;
  894. }
  895. switch (mi.cbbAccess.SelectedIndex) {
  896. case 0:
  897. // Access directly
  898. imflags |= ImDiskFlags.FileTypeDirect;
  899. break;
  900. case 1:
  901. // Copy to memory
  902. imflags |= ImDiskFlags.FileTypeAwe;
  903. break;
  904. default:
  905. imflags |= ImDiskFlags.FileTypeDirect;
  906. break;
  907. }
  908. if (mi.chkRemovable.IsChecked == true)
  909. imflags |= ImDiskFlags.Removable;
  910. if (mi.chkReadOnly.IsChecked == true)
  911. imflags |= ImDiskFlags.ReadOnly;
  912. ImDiskAPI.CreateDevice(size, 0, 0, 0, 0, imflags, _ShellListView.GetFirstSelectedItem().ParsingName, false, DriveLetter, IntPtr.Zero);
  913. }
  914. }
  915. private void btnMountIso_Click(object sender, RoutedEventArgs e) {
  916. try {
  917. var freeDriveLetter = $"{ImDiskAPI.FindFreeDriveLetter()}:";
  918. ImDiskAPI.CreateDevice(0, 0, 0, 0, 0, ImDiskFlags.Auto, _ShellListView.GetFirstSelectedItem().ParsingName, false, freeDriveLetter, IntPtr.Zero);
  919. } catch (DllNotFoundException) {
  920. ShowInstallImDiskMessage();
  921. } catch (Exception ex) {
  922. MessageBox.Show("An error occurred while trying to mount this file. \n\n" + ex.Message, ex.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
  923. }
  924. }
  925. private void btnWriteIso_Click(object sender, RoutedEventArgs e) {
  926. Process.Start(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "isoburn.exe"), $"\"{_ShellListView.GetFirstSelectedItem().ParsingName}\"");
  927. }
  928. private void btnUnmountDrive_Click(object sender, RoutedEventArgs e) {
  929. //SelectedDriveID was NEVER anything but 0
  930. uint SelectedDriveID = 0;
  931. try {
  932. if (!CheckImDiskInstalled())
  933. ShowInstallImDiskMessage();
  934. else if ((ImDiskAPI.QueryDevice(SelectedDriveID).Flags & ImDiskFlags.DeviceTypeCD) != 0)
  935. ImDiskAPI.ForceRemoveDevice(SelectedDriveID);
  936. else
  937. ImDiskAPI.RemoveDevice(SelectedDriveID);
  938. } catch {
  939. if (MessageBox.Show("The drive could not be removed. Would you like to try to force a removal?", "Remove Drive Failed", MessageBoxButton.YesNo, MessageBoxImage.Error) == MessageBoxResult.Yes) {
  940. ImDiskAPI.ForceRemoveDevice(SelectedDriveID);
  941. }
  942. }
  943. _ShellListView.RefreshContents();
  944. ctgDrive.Visibility = Visibility.Collapsed;
  945. }
  946. #endregion
  947. #region Application Tools
  948. private void btnPin_Click(object sender, RoutedEventArgs e) => User32.PinUnpinToTaskbar(_ShellListView.GetFirstSelectedItem().ParsingName);
  949. private void btnPinToStart_Click(object sender, RoutedEventArgs e) => User32.PinUnpinToStartMenu(_ShellListView.GetFirstSelectedItem().ParsingName);
  950. private void btnRunAs_Click(object sender, RoutedEventArgs e) => CredUI.RunProcesssAsUser(_ShellListView.GetFirstSelectedItem().ParsingName);
  951. private void btnRunAsAdmin_Click(object sender, RoutedEventArgs e) {
  952. var FileName = _ShellListView.GetFirstSelectedItem().ParsingName;
  953. Process.Start(new ProcessStartInfo {
  954. FileName = FileName,
  955. Verb = "runas",
  956. UseShellExecute = true,
  957. Arguments = $"/env /user:Administrator \"{FileName}\""
  958. });
  959. }
  960. #endregion
  961. #region Backstage - Information Tab
  962. private void Button_Click_6(object sender, RoutedEventArgs e) {
  963. backstage.IsOpen = true;
  964. autoUpdater.Visibility = WIN.Visibility.Visible;
  965. autoUpdater.UpdateLayout();
  966. switch (autoUpdater.UpdateStepOn) {
  967. case UpdateStepOn.Checking:
  968. case UpdateStepOn.DownloadingUpdate:
  969. case UpdateStepOn.ExtractingUpdate:
  970. autoUpdater.Cancel();
  971. break;
  972. case UpdateStepOn.UpdateReadyToInstall:
  973. case UpdateStepOn.UpdateAvailable:
  974. break;
  975. case UpdateStepOn.UpdateDownloaded:
  976. autoUpdater.InstallNow();
  977. break;
  978. default:
  979. autoUpdater.ForceCheckForUpdate(true);
  980. break;
  981. }
  982. }
  983. private void Button_Click_7(object sender, RoutedEventArgs e) => Process.Start("http://gainedge.org/better-explorer/");
  984. #endregion
  985. #region Path to String HelperFunctions / Other HelperFunctions
  986. private Visibility BooleanToVisibiliy(bool value) => value ? Visibility.Visible : Visibility.Collapsed;
  987. private void AddToLog(string value) {
  988. try {
  989. if (BESettings.EnableActionLog) {
  990. if (!Directory.Exists(logdir)) Directory.CreateDirectory(logdir);
  991. using (var sw = new StreamWriter($"{logdir}{sessionid}.txt", true)) {
  992. sw.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + " : " + value);
  993. }
  994. }
  995. } catch (Exception exe) {
  996. MessageBox.Show("An error occurred while writing to the log file. This error can be avoided if you disable the action logging feature. Please report this issue at http://bugs.gainedge.org/public/betterexplorer. \r\n\r\n Here is some information about the error: \r\n\r\n" + exe.Message + "\r\n\r\n" + exe.ToString(), "Error While Writing to Log", MessageBoxButton.OK, MessageBoxImage.Error);
  997. }
  998. }
  999. #endregion
  1000. #region Updater
  1001. private void CheckBox_Checked(object sender, RoutedEventArgs e) {
  1002. if (isOnLoad) return;
  1003. Settings.BESettings.IsUpdateCheck = true;
  1004. Settings.BESettings.SaveSettings();
  1005. updateCheckTimer.Start();
  1006. }
  1007. private void CheckBox_Unchecked(object sender, RoutedEventArgs e) {
  1008. if (isOnLoad) return;
  1009. Settings.BESettings.IsUpdateCheck = false;
  1010. Settings.BESettings.SaveSettings();
  1011. }
  1012. private void rbCheckInterval_Click(object sender, RoutedEventArgs e) {
  1013. if (rbDaily.IsChecked.Value)
  1014. Settings.BESettings.UpdateCheckInterval = 1;
  1015. else if (rbMonthly.IsChecked.Value)
  1016. Settings.BESettings.UpdateCheckInterval = 30;
  1017. else
  1018. Settings.BESettings.UpdateCheckInterval = 7;
  1019. Settings.BESettings.SaveSettings();
  1020. }
  1021. private void chkUpdateStartupCheck_Click(object sender, RoutedEventArgs e) {
  1022. Settings.BESettings.IsUpdateCheckStartup = chkUpdateStartupCheck.IsChecked.Value;
  1023. Settings.BESettings.SaveSettings();
  1024. }
  1025. private void UpdateTypeCheck_Click(object sender, RoutedEventArgs e) {
  1026. Settings.BESettings.UpdateCheckType = rbReleases.IsChecked.Value ? 0 : 1;
  1027. Settings.BESettings.SaveSettings();
  1028. }
  1029. #endregion
  1030. #region On Startup
  1031. /// <summary>
  1032. /// Gets the badges from the folder Badges located in the .EXE's directory and the badges from SQLite database
  1033. /// </summary>
  1034. /// <returns></returns>
  1035. private Dictionary<String, Dictionary<IListItemEx, List<string>>> LoadBadgesData() {
  1036. var result = new Dictionary<String, Dictionary<IListItemEx, List<string>>>();
  1037. var badgesDirectory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Badges");
  1038. var badgesIshellItem = FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, badgesDirectory);
  1039. foreach (var item in badgesIshellItem.Where(w => w.IsFolder)) {
  1040. var innerDict = new Dictionary<IListItemEx, List<string>>();
  1041. foreach (var badgeItem in item.Where(w => w.Extension.ToLowerInvariant() == ".ico")) {
  1042. innerDict.Add(badgeItem, new List<String>());
  1043. }
  1044. result.Add(item.DisplayName, innerDict);
  1045. }
  1046. try {
  1047. var m_dbConnection = new System.Data.SQLite.SQLiteConnection($"Data Source={this._DBPath};Version=3;");
  1048. m_dbConnection.Open();
  1049. var command1 = new System.Data.SQLite.SQLiteCommand("SELECT * FROM badges", m_dbConnection);
  1050. var Reader = command1.ExecuteReader();
  1051. while (Reader.Read()) {
  1052. var values = Reader.GetValues();
  1053. var path = values.GetValues("Path").Single();
  1054. var collectionName = values.GetValues("Collection").Single();
  1055. var badgeName = values.GetValues("Badge").Single();
  1056. var badgeDBItem = FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, Path.Combine(badgesDirectory, collectionName, badgeName));
  1057. var collectionDict = result[collectionName];
  1058. var collectionItemKey = collectionDict.Keys.SingleOrDefault(w => w.ParsingName.Equals(badgeDBItem.ParsingName));
  1059. if (collectionItemKey != null) {
  1060. result[collectionName][collectionItemKey].Add(path);
  1061. }
  1062. }
  1063. Reader.Close();
  1064. } catch (Exception) {
  1065. }
  1066. return result;
  1067. }
  1068. /// <summary>
  1069. /// Adds all default items to <see cref="btnFavorites"/>
  1070. /// </summary>
  1071. /// <remarks>
  1072. /// 1. Sets OpenFavorites's OnClick event to open <see cref="KnownFolders.Links"/>
  1073. /// 2. Adds all links from <see cref="KnownFolders.Links"/> that are not hidden
  1074. /// </remarks>
  1075. private void SetUpFavoritesMenu() {
  1076. Dispatcher.BeginInvoke(DispatcherPriority.Render, (ThreadStart)(() => {
  1077. btnFavorites.Visibility = Visibility.Visible;
  1078. var OpenFavorites = new MenuItem() { Header = "Open Favorites" };
  1079. var Path = ((ShellItem)KnownFolders.Links).FileSystemPath;
  1080. OpenFavorites.Click += (x, y) => Process.Start(Path);
  1081. btnFavorites.Items.Add(OpenFavorites);
  1082. btnFavorites.Items.Add(new Separator());
  1083. foreach (ShellItem item in KnownFolders.Links.Where(w => !w.IsHidden)) {
  1084. item.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly;
  1085. item.Thumbnail.CurrentSize = new WIN.Size(16, 16);
  1086. btnFavorites.Items.Add(Utilities.Build_MenuItem(item.GetDisplayName(SIGDN.NORMALDISPLAY), item, item.Thumbnail.BitmapSource, onClick: mif_Click));
  1087. }
  1088. }));
  1089. }
  1090. private void InitializeExplorerControl() {
  1091. this.ShellTree.NodeClick += ShellTree_NodeClick;
  1092. this._ShellListView.Navigated += ShellListView_Navigated;
  1093. this._ShellListView.ViewStyleChanged += ShellListView_ViewStyleChanged;
  1094. this._ShellListView.SelectionChanged += ShellListView_SelectionChanged;
  1095. this._ShellListView.LVItemsColorCodes = this.LVItemsColorCol;
  1096. this._ShellListView.ItemUpdated += ShellListView_ItemUpdated;
  1097. this._ShellListView.ColumnHeaderRightClick += ShellListView_ColumnHeaderRightClick;
  1098. this._ShellListView.KeyJumpKeyDown += ShellListView_KeyJumpKeyDown;
  1099. this._ShellListView.KeyJumpTimerDone += ShellListView_KeyJumpTimerDone;
  1100. //this.ShellListView.ItemDisplayed += ShellListView_ItemDisplayed;
  1101. this._ShellListView.OnListViewColumnDropDownClicked += ShellListView_OnListViewColumnDropDownClicked;
  1102. this._ShellListView.Navigating += ShellListView_Navigating;
  1103. this._ShellListView.ItemMiddleClick += (sender, e) => tcMain.NewTab(e.Folder, false);
  1104. this._ShellListView.BeginItemLabelEdit += ShellListView_BeginItemLabelEdit;
  1105. this._ShellListView.EndItemLabelEdit += ShellListView_EndItemLabelEdit;
  1106. this._ShellListView.OnListViewCollumnsChanged += _ShellListView_OnListViewCollumnsChanged;
  1107. this._ShellListView.BadgesData = this.Badges;
  1108. }
  1109. private void _ShellListView_OnListViewCollumnsChanged(object sender, CollumnsChangedArgs e) => this.SetSortingAndGroupingButtons();
  1110. void ShellListView_OnListViewColumnDropDownClicked(object sender, ListViewColumnDropDownArgs e) {
  1111. //TODO: Add Events for when an item's check has been changed
  1112. var packUri = "pack://application:,,,/BetterExplorer;component/Images/stack16.png";
  1113. var menu = new ListviewColumnDropDown() {
  1114. Placement = PlacementMode.AbsolutePoint,
  1115. HorizontalOffset = e.ActionPoint.X,
  1116. VerticalOffset = e.ActionPoint.Y,
  1117. IsOpen = true,
  1118. StaysOpen = true,
  1119. };
  1120. var Things = new List<string>();
  1121. var SelectedColumn = this._ShellListView.Collumns[e.ColumnIndex];
  1122. if (SelectedColumn.CollumnType == typeof(String)) {
  1123. Things.AddRange(new[] { "0 - 9", "A - H", "I - P", "Q - Z", "Other" });
  1124. } else if (SelectedColumn.CollumnType == typeof(DateTime)) {
  1125. var Container = new ItemsControl();
  1126. Container.Items.Add(new MenuItem() { Icon = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource, Header = "Select a date or date range:", HorizontalContentAlignment = HorizontalAlignment.Stretch, HorizontalAlignment = HorizontalAlignment.Stretch, IsCheckable = true, StaysOpenOnClick = true });
  1127. Container.Items.Add(new Calendar() { SelectionMode = CalendarSelectionMode.SingleRange, Margin = new Thickness(30, 0, 0, 0) });
  1128. menu.AddItem(Container);
  1129. Things.AddRange(new[] { "A long time ago", "Earlier this year", "Earlier this month", "Last week", "Today" });
  1130. } else if (SelectedColumn.CollumnType == typeof(long)) {
  1131. Things.AddRange(new[] { "Tiny (0 - 10 KB)", "Small (10 - 100 KB)", "Medium (100 KB - 1 MB)", "Large (1 - 16 MB)", "Huge (16 - 128 MB)", "Unspecified" });
  1132. } else if (SelectedColumn.CollumnType == typeof(Type)) {
  1133. var distictItems = this._ShellListView.Items.Select(s => s.GetPropertyValue(SelectedColumn.pkey, SelectedColumn.CollumnType).Value).Distinct().Cast<String>().ToArray().OrderBy(o => o);
  1134. Things.AddRange(distictItems);
  1135. }
  1136. foreach (var item in Things) {
  1137. var mnuItem = new MenuItem() {
  1138. Icon = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource,
  1139. IsCheckable = true,
  1140. Header = item,
  1141. HorizontalContentAlignment = HorizontalAlignment.Stretch,
  1142. HorizontalAlignment = HorizontalAlignment.Stretch,
  1143. StaysOpenOnClick = true
  1144. };
  1145. mnuItem.Click += new RoutedEventHandler(delegate (object s, RoutedEventArgs re) {
  1146. var over = Mouse.DirectlyOver;
  1147. if (!(over is Image)) {
  1148. menu.IsOpen = false;
  1149. }
  1150. });
  1151. menu.AddItem(mnuItem);
  1152. }
  1153. }
  1154. protected override void OnSourceInitialized(EventArgs e) {
  1155. base.OnSourceInitialized(e);
  1156. Handle = new WindowInteropHelper(Application.Current.MainWindow).Handle;
  1157. }
  1158. private void LoadRegistryRelatedSettings() {
  1159. BESettings.LoadSettings();
  1160. RegistryKey rk = Registry.CurrentUser;
  1161. RegistryKey rks = rk.CreateSubKey(@"Software\BExplorer");
  1162. switch (BESettings.CurrentTheme) {
  1163. case "Blue":
  1164. btnBlue.IsChecked = true;
  1165. break;
  1166. case "Silver":
  1167. btnSilver.IsChecked = true;
  1168. break;
  1169. case "Black":
  1170. btnBlack.IsChecked = true;
  1171. break;
  1172. case "Metro":
  1173. btnMetro.IsChecked = true;
  1174. break;
  1175. default:
  1176. btnBlue.IsChecked = true;
  1177. break;
  1178. }
  1179. switch (Settings.BESettings.UpdateCheckInterval) {
  1180. case 1:
  1181. rbDaily.IsChecked = true;
  1182. break;
  1183. case 7:
  1184. rbWeekly.IsChecked = true;
  1185. break;
  1186. case 30:
  1187. rbMonthly.IsChecked = true;
  1188. break;
  1189. }
  1190. switch (Settings.BESettings.UpdateCheckType) {
  1191. case 0:
  1192. rbReleases.IsChecked = true;
  1193. break;
  1194. case 1:
  1195. rbReleasTest.IsChecked = true;
  1196. break;
  1197. }
  1198. chkUpdateCheck.IsChecked = Settings.BESettings.IsUpdateCheck;
  1199. chkUpdateStartupCheck.IsChecked = Settings.BESettings.IsUpdateCheckStartup;
  1200. btnConsolePane.IsChecked = BESettings.IsConsoleShown;
  1201. chkIsFlyout.IsChecked = BESettings.HFlyoutEnabled;//
  1202. btnInfoPane.IsChecked = BESettings.IsInfoPaneEnabled;
  1203. if (BESettings.IsInfoPaneEnabled) {
  1204. rPreviewPane.Height = new GridLength(BESettings.InfoPaneHeight);
  1205. rPreviewPaneSplitter.Height = new GridLength(1);
  1206. } else {
  1207. rPreviewPane.Height = new GridLength(0);
  1208. rPreviewPaneSplitter.Height = new GridLength(0);
  1209. }
  1210. btnPreviewPane.IsChecked = BESettings.IsPreviewPaneEnabled;
  1211. if (BESettings.IsPreviewPaneEnabled) {
  1212. clPreview.Width = new GridLength(BESettings.PreviewPaneWidth);
  1213. clPreviewSplitter.Width = new GridLength(1);
  1214. } else {
  1215. clPreview.Width = new GridLength(0);
  1216. clPreviewSplitter.Width = new GridLength(0);
  1217. }
  1218. btnNavigationPane.IsChecked = BESettings.IsNavigationPaneEnabled;
  1219. this._ShellListView.ShowCheckboxes = BESettings.ShowCheckboxes;
  1220. this.chkShowCheckBoxes.IsChecked = this._ShellListView.ShowCheckboxes;
  1221. this.chkIsTerraCopyEnabled.IsChecked = BESettings.IsFileOpExEnabled;
  1222. this.chkIsCFO.IsChecked = BESettings.IsCustomFO;
  1223. this.chkIsRestoreTabs.IsChecked = BESettings.IsRestoreTabs;
  1224. this.chkTraditionalNameGrouping.IsChecked = BESettings.IsTraditionalNameGrouping;
  1225. // if this instance has the /norestore switch, do not load tabs from previous session, even if it is set in the Registry
  1226. if (App.IsStartWithStartupTab) {
  1227. BESettings.IsRestoreTabs = false;
  1228. }
  1229. //this.chkIsLastTabCloseApp.IsChecked = (int)rks.GetValue("IsLastTabCloseApp", 1) == 1;
  1230. chkLogHistory.IsChecked = BESettings.EnableActionLog;
  1231. if (BESettings.EnableActionLog) {
  1232. chkLogHistory.Visibility = Visibility.Visible;
  1233. ShowLogsBorder.Visibility = Visibility.Visible;
  1234. paddinglbl8.Visibility = Visibility.Visible;
  1235. }
  1236. chkFolder.IsChecked = BESettings.AutoSwitchFolderTools;
  1237. chkArchive.IsChecked = BESettings.AutoSwitchArchiveTools;
  1238. chkImage.IsChecked = BESettings.AutoSwitchImageTools;
  1239. chkApp.IsChecked = BESettings.AutoSwitchApplicationTools;
  1240. chkLibrary.IsChecked = BESettings.AutoSwitchLibraryTools;
  1241. chkDrive.IsChecked = BESettings.AutoSwitchDriveTools;
  1242. chkVirtualTools.IsChecked = BESettings.AutoSwitchVirtualDriveTools;
  1243. // load OverwriteOnImages setting (default is false)
  1244. chkOverwriteImages.IsChecked = BESettings.OverwriteImageWhileEditing;
  1245. // load Saved Tabs Directory location (if different from default)
  1246. txtDefSaveTabs.Text = BESettings.SavedTabsDirectory;
  1247. if (tcMain.StartUpLocation == "") {
  1248. tcMain.StartUpLocation = BESettings.StartupLocation;
  1249. }
  1250. try {
  1251. var rkbe = Registry.ClassesRoot;
  1252. var rksbe = rkbe.OpenSubKey(@"Folder\shell\open\command", RegistryKeyPermissionCheck.ReadSubTree);
  1253. chkIsDefault.IsChecked = rksbe.GetValue("DelegateExecute", "-1").ToString() == "-1";
  1254. chkIsDefault.IsEnabled = true;
  1255. rksbe.Close();
  1256. rkbe.Close();
  1257. } catch (Exception) {
  1258. chkIsDefault.IsChecked = false;
  1259. chkIsDefault.IsEnabled = false;
  1260. }
  1261. var rkfe = Registry.CurrentUser;
  1262. var rksfe = rk.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", RegistryKeyPermissionCheck.ReadSubTree);
  1263. chkTreeExpand.IsChecked = (int)rksfe.GetValue("NavPaneExpandToCurrentFolder", 0) == 1;
  1264. rksfe.Close();
  1265. rkfe.Close();
  1266. rks.Close();
  1267. rk.Close();
  1268. var sho = new ShellItem(BESettings.StartupLocation.ToShellParsingName());
  1269. btnSetCurrentasStartup.Header = sho.DisplayName;
  1270. sho.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly;
  1271. btnSetCurrentasStartup.Icon = sho.Thumbnail.SmallBitmapSource;
  1272. miTabManager.IsEnabled = Directory.Exists(BESettings.SavedTabsDirectory);
  1273. autoUpdater.DaysBetweenChecks = Settings.BESettings.UpdateCheckInterval;
  1274. try {
  1275. autoUpdater.UpdateType = Settings.BESettings.IsUpdateCheck ? UpdateType.OnlyCheck : UpdateType.DoNothing;
  1276. if (Settings.BESettings.IsUpdateCheckStartup) this.CheckForUpdate();
  1277. } catch (IOException) {
  1278. this.stiUpdate.Content = "Switch to another BetterExplorer window or restart to check for updates.";
  1279. this.btnUpdateCheck.IsEnabled = false;
  1280. }
  1281. if (App.IsStartMinimized) {
  1282. this.Visibility = Visibility.Hidden;
  1283. this.WindowState = WindowState.Minimized;
  1284. }
  1285. if (!TheRibbon.IsMinimized) {
  1286. TheRibbon.SelectedTabItem = HomeTab;
  1287. this.TheRibbon.SelectedTabIndex = 0;
  1288. }
  1289. }
  1290. private void SetsUpJumpList() {
  1291. //sets up Jump List
  1292. try {
  1293. AppJL.ShowRecentCategory = true;
  1294. AppJL.ShowFrequentCategory = true;
  1295. JumpList.SetJumpList(Application.Current, AppJL);
  1296. AppJL.JumpItems.Add(new JumpTask() {
  1297. ApplicationPath = Process.GetCurrentProcess().MainModule.FileName,
  1298. Arguments = "t",
  1299. Title = "Open Tab",
  1300. Description = "Opens new tab with default location"
  1301. });
  1302. AppJL.JumpItems.Add(new JumpTask() {
  1303. ApplicationPath = Process.GetCurrentProcess().MainModule.FileName,
  1304. Arguments = "/nw",
  1305. Title = "New Window",
  1306. Description = "Creates a new window with default location"
  1307. });
  1308. AppJL.Apply();
  1309. } catch {
  1310. }
  1311. }
  1312. private void Window_Loaded(object sender, RoutedEventArgs e) {
  1313. this._ProgressTimer.Tick += (obj, args) => {
  1314. if (this.bcbc.ProgressValue + 2 == this.bcbc.ProgressMaximum) {
  1315. this.bcbc.ProgressMaximum = this.bcbc.ProgressMaximum + 2;
  1316. this.bcbc.SetProgressValue(this.bcbc.ProgressValue + 2, TimeSpan.FromMilliseconds(0));
  1317. } else {
  1318. this.bcbc.SetProgressValue(this.bcbc.ProgressValue + 2, TimeSpan.FromMilliseconds(450));
  1319. }
  1320. };
  1321. this._ProgressTimer.Stop();
  1322. TheRibbon.UpdateLayout();
  1323. this.grdItemTextColor.ItemsSource = this.LVItemsColorCol;
  1324. _keyjumpTimer.Interval = 1000;
  1325. _keyjumpTimer.Tick += _keyjumpTimer_Tick;
  1326. ShellTreeHost.Child = ShellTree;
  1327. ShellViewHost.Child = _ShellListView;
  1328. ShellTree.ShellListView = _ShellListView;
  1329. this.ctrlConsole.ShellListView = this._ShellListView;
  1330. this.autoUpdater.UpdateAvailable += AutoUpdater_UpdateAvailable;
  1331. this.updateCheckTimer.Interval = 10000;//3600000 * 3;
  1332. this.updateCheckTimer.Tick += new EventHandler(updateCheckTimer_Tick);
  1333. this.updateCheckTimer.Enabled = false;
  1334. UpdateRecycleBinInfos();
  1335. bool exitApp = false;
  1336. try {
  1337. //Sets up FileSystemWatcher for Favorites folder
  1338. var LinksFolderWarcher = new FileSystemWatcher(KnownFolders.Links.ParsingName);
  1339. LinksFolderWarcher.Created += LinksFolderWarcher_Created;
  1340. LinksFolderWarcher.Deleted += LinksFolderWarcher_Deleted;
  1341. LinksFolderWarcher.Renamed += LinksFolderWarcher_Renamed;
  1342. LinksFolderWarcher.EnableRaisingEvents = true;
  1343. //Set up Favorites Menu
  1344. //Task.Run(() => SetUpFavoritesMenu());
  1345. SetUpFavoritesMenu();
  1346. //Load the ShellSettings
  1347. _IsCalledFromLoading = true;
  1348. var statef = new BExplorer.Shell.Interop.Shell32.SHELLSTATE();
  1349. BExplorer.Shell.Interop.Shell32.SHGetSetSettings(ref statef, BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWALLOBJECTS | BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWEXTENSIONS, false);
  1350. chkHiddenFiles.IsChecked = statef.fShowAllObjects == 1;
  1351. _ShellListView.ShowHidden = chkHiddenFiles.IsChecked.Value;
  1352. ShellTree.IsShowHiddenItems = chkHiddenFiles.IsChecked.Value;
  1353. chkExtensions.IsChecked = statef.fShowExtensions == 1;
  1354. this._ShellListView.IsFileExtensionShown = statef.fShowExtensions == 1;
  1355. _IsCalledFromLoading = false;
  1356. isOnLoad = true;
  1357. //'load from Registry
  1358. this.LoadRegistryRelatedSettings();
  1359. //'set up Explorer control
  1360. InitializeExplorerControl();
  1361. ViewGallery.SelectedIndex = 2;
  1362. if (this.chkUpdateCheck.IsChecked.Value) {
  1363. this.updateCheckTimer.Start();
  1364. }
  1365. AddToLog("Session Began");
  1366. isOnLoad = false;
  1367. SetsUpJumpList();
  1368. //Setup Clipboard monitor
  1369. cbm.ClipboardChanged += cbm_ClipboardChanged;
  1370. if (exitApp) {
  1371. Application.Current.Shutdown();
  1372. return;
  1373. }
  1374. // Set up Column Header menu
  1375. chcm = new ContextMenu() { Placement = PlacementMode.MousePoint };
  1376. //Set up Version Info
  1377. verNumber.Content = "Version " + (Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault() as AssemblyInformationalVersionAttribute).InformationalVersion;
  1378. lblArchitecture.Content = Kernel32.IsThis64bitProcess() ? "64-bit version" : "32-bit version";
  1379. tcMain_Setup(null, null);
  1380. //'set StartUp location
  1381. if (Application.Current.Properties["cmd"] != null && Application.Current.Properties["cmd"].ToString() != "-minimized") {
  1382. var cmd = Application.Current.Properties["cmd"].ToString();
  1383. if (cmd != "/nw" && cmd != "/t") {
  1384. var sho = FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, cmd.ToShellParsingName());
  1385. tcMain.NewTab(sho, true);
  1386. }
  1387. } else {
  1388. InitializeInitialTabs();
  1389. }
  1390. if (!File.Exists("Settings.xml")) return;
  1391. var Settings = XElement.Load("Settings.xml");
  1392. if (Settings.Element("DropDownItems") != null) {
  1393. foreach (var item in Settings.Element("DropDownItems").Elements()) {
  1394. bcbc.DropDownItems.Add(item.Value);
  1395. }
  1396. }
  1397. focusTimer.Tick += focusTimer_Tick;
  1398. } catch (Exception exe) {
  1399. MessageBox.Show($"An error occurred while loading the window. Please report this issue at http://bugs.gainedge.org/public/betterexplorer. \r\n\r\n Here is some information about the error: \r\n\r\n{exe.Message}\r\n\r\n{exe}", "Error While Loading", MessageBoxButton.OK, MessageBoxImage.Error);
  1400. }
  1401. }
  1402. private void AutoUpdater_UpdateAvailable(object sender, EventArgs e) {
  1403. if (this._IsCheckUpdateFromTimer && !this._IsUpdateNotificationMessageBoxShown) {
  1404. this._IsUpdateNotificationMessageBoxShown = true;
  1405. var newVersion = this.autoUpdater.Version;
  1406. var changes = this.autoUpdater.Changes;
  1407. var config = new TaskDialogOptions();
  1408. config.Owner = this;
  1409. config.Title = "Update";
  1410. config.MainInstruction = "There is new updated version " + newVersion + " available!";
  1411. config.Content = "The new version have the following changes:\r\n" + changes;
  1412. config.ExpandedInfo = "You can download and install the new version immediately by clicking \"Download & Install\" button.\r\nYou can skip this version from autoupdate check by clicking \"Skip this version\" button.";
  1413. //config.VerificationText = "Don't show me this message again";
  1414. config.CustomButtons = new string[] { "&Download & Install", "Skip this version", "&Close" };
  1415. config.MainIcon = VistaTaskDialogIcon.SecurityWarning;
  1416. if (newVersion.Contains("RC") || newVersion.Contains("Nightly") || newVersion.Contains("Beta") || newVersion.Contains("Alpha")) {
  1417. config.FooterText = "This is an experimental version and may contains bugs. Use at your own risk!";
  1418. config.FooterIcon = VistaTaskDialogIcon.Warning;
  1419. } else {
  1420. config.FooterText = "This is a final version and can be installed safely!";
  1421. config.FooterIcon = VistaTaskDialogIcon.SecuritySuccess;
  1422. }
  1423. config.AllowDialogCancellation = true;
  1424. config.Callback = taskDialog_Callback;
  1425. TaskDialogResult res = TaskDialog.Show(config);
  1426. this._IsCheckUpdateFromTimer = false;
  1427. this._IsUpdateNotificationMessageBoxShown = false;
  1428. }
  1429. }
  1430. private bool taskDialog_Callback(IActiveTaskDialog dialog, VistaTaskDialogNotificationArgs args, object callbackData) {
  1431. bool result = false;
  1432. switch (args.Notification) {
  1433. case VistaTaskDialogNotification.ButtonClicked:
  1434. if (args.ButtonId == 500) {
  1435. this.autoUpdater.ReadyToBeInstalled += AutoUpdater_ReadyToBeInstalled;
  1436. this.autoUpdater.InstallNow();
  1437. } else if (args.ButtonId == 501) {
  1438. }
  1439. break;
  1440. }
  1441. return result;
  1442. }
  1443. private void AutoUpdater_ReadyToBeInstalled(object sender, EventArgs e) {
  1444. this.autoUpdater.ReadyToBeInstalled -= AutoUpdater_ReadyToBeInstalled;
  1445. this.autoUpdater.InstallNow();
  1446. }
  1447. #endregion
  1448. #region On Closing
  1449. private void SaveSettings(String openedTabs) {
  1450. BESettings.LastWindowWidth = this.Width;
  1451. BESettings.LastWindowHeight = this.Height;
  1452. BESettings.LastWindowPosLeft = this.Left;
  1453. BESettings.LastWindowPosTop = this.Top;
  1454. if (btnBlue.IsChecked == true)
  1455. BESettings.CurrentTheme = "Blue";
  1456. else if (btnSilver.IsChecked == true)
  1457. BESettings.CurrentTheme = "Silver";
  1458. else if (btnBlack.IsChecked == true)
  1459. BESettings.CurrentTheme = "Black";
  1460. else if (btnMetro.IsChecked == true)
  1461. BESettings.CurrentTheme = "Metro";
  1462. switch (this.WindowState) {
  1463. case WIN.WindowState.Maximized:
  1464. BESettings.LastWindowState = 2;
  1465. break;
  1466. case WIN.WindowState.Minimized:
  1467. BESettings.LastWindowState = 1;
  1468. break;
  1469. case WIN.WindowState.Normal:
  1470. BESettings.LastWindowState = 0;
  1471. break;
  1472. default:
  1473. BESettings.LastWindowState = -1;
  1474. break;
  1475. }
  1476. BESettings.IsRibonMinimized = TheRibbon.IsMinimized;
  1477. BESettings.OpenedTabs = openedTabs;
  1478. BESettings.RTLMode = FlowDirection == FlowDirection.RightToLeft;
  1479. BESettings.ShowCheckboxes = this._ShellListView.ShowCheckboxes;
  1480. BESettings.TabBarAlignment = this.TabbaBottom.IsChecked == true ? "bottom" : "top";
  1481. if (BESettings.IsPreviewPaneEnabled)
  1482. BESettings.PreviewPaneWidth = clPreview.ActualWidth;
  1483. if (BESettings.IsInfoPaneEnabled)
  1484. BESettings.InfoPaneHeight = rPreviewPane.ActualHeight;
  1485. if (BESettings.IsConsoleShown)
  1486. BESettings.CmdWinHeight = rCommandPrompt.ActualHeight;
  1487. BESettings.SaveSettings();
  1488. }
  1489. private void RibbonWindow_Closing(object sender, CancelEventArgs e) {
  1490. var itemColorSettingsLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"BExplorer\itemcolors.cfg");
  1491. var doc = new XmlDocument();
  1492. XmlElement elementRoot = doc.CreateElement(string.Empty, "Root", string.Empty);
  1493. foreach (var element in this.LVItemsColorCol) {
  1494. XmlElement elementRow = doc.CreateElement(string.Empty, "ItemColorRow", string.Empty);
  1495. XmlElement elementExtension = doc.CreateElement(string.Empty, "Extensions", string.Empty);
  1496. elementExtension.InnerText = element.ExtensionList;
  1497. XmlElement elementColor = doc.CreateElement(string.Empty, "Color", string.Empty);
  1498. elementColor.InnerText = BitConverter.ToInt32(new byte[] { element.TextColor.A, element.TextColor.R, element.TextColor.G, element.TextColor.B }, 0).ToString();
  1499. elementRow.AppendChild(elementExtension);
  1500. elementRow.AppendChild(elementColor);
  1501. elementRoot.AppendChild(elementRow);
  1502. }
  1503. doc.AppendChild(elementRoot);
  1504. doc.Save(itemColorSettingsLocation);
  1505. if (this.OwnedWindows.OfType<FileOperationDialog>().Any()) {
  1506. if (MessageBox.Show("Are you sure you want to cancel all running file operation tasks?", "", MessageBoxButton.YesNo) == MessageBoxResult.No) {
  1507. e.Cancel = true;
  1508. return;
  1509. }
  1510. }
  1511. if (this.WindowState != WindowState.Minimized) {
  1512. SaveSettings(string.Concat(from item in tcMain.Items.Cast<Wpf.Controls.TabItem>() select ";" + item.ShellObject.ParsingName));
  1513. }
  1514. this._ShellListView.SaveSettingsToDatabase(this._ShellListView.CurrentFolder);
  1515. //SaveHistoryToFile(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\history.txt", this.bcbc.DropDownItems.OfType<String>().Select(s => s).ToList());
  1516. AddToLog("Session Ended");
  1517. if (!this.IsMultipleWindowsOpened) {
  1518. e.Cancel = true;
  1519. App.IsStartMinimized = true;
  1520. this.WindowState = WindowState.Minimized;
  1521. this.Visibility = Visibility.Hidden;
  1522. } else {
  1523. beNotifyIcon.Visibility = Visibility.Collapsed;
  1524. }
  1525. if (!File.Exists("Settings.xml")) new XElement("Settings").Save("Settings.xml");
  1526. //var Data = bcbc.DropDownItems;
  1527. var Settings = XElement.Load("Settings.xml");
  1528. if (Settings.Element("DropDownItems") == null)
  1529. Settings.Add(new XElement("DropDownItems"));
  1530. else
  1531. Settings.Element("DropDownItems").RemoveAll();
  1532. foreach (var item in bcbc.DropDownItems.OfType<string>().Reverse().Take(15)) {
  1533. Settings.Element("DropDownItems").Add(new XElement("Item", item));
  1534. }
  1535. //Settings.Save("Settings.xml");
  1536. }
  1537. #endregion
  1538. #region Change Ribbon Color (Theme)
  1539. public void ChangeRibbonTheme(string ThemeName, bool IsMetro = false) {
  1540. Dispatcher.BeginInvoke(IsMetro ? DispatcherPriority.ApplicationIdle : DispatcherPriority.Render, (ThreadStart)(() => {
  1541. var owner = Window.GetWindow(this);
  1542. Application.Current.Resources.BeginInit();
  1543. Application.Current.Resources.MergedDictionaries.RemoveAt(1);
  1544. if (IsMetro)
  1545. Application.Current.Resources.MergedDictionaries.Insert(1, new ResourceDictionary() { Source = new Uri("pack://application:,,,/Fluent;component/Themes/Office2013/Generic.xaml") });
  1546. else
  1547. Application.Current.Resources.MergedDictionaries.Insert(1, new ResourceDictionary() { Source = new Uri($"pack://application:,,,/Fluent;component/Themes/Office2010/{ThemeName}.xaml") });
  1548. Application.Current.Resources.EndInit();
  1549. if (owner is RibbonWindow) {
  1550. owner.Style = null;
  1551. owner.Style = owner.FindResource("RibbonWindowStyle") as Style;
  1552. owner.Style = null;
  1553. // Resize Window to work around alignment issues caused by theme change
  1554. ++owner.Width;
  1555. --owner.Width;
  1556. }
  1557. Settings.BESettings.CurrentTheme = ThemeName;
  1558. Settings.BESettings.SaveSettings();
  1559. }));
  1560. }
  1561. private void btnSilver_Click(object sender, RoutedEventArgs e) {
  1562. ChangeRibbonTheme("Silver");
  1563. KeepBackstageOpen = true;
  1564. }
  1565. private void btnBlue_Click(object sender, RoutedEventArgs e) {
  1566. ChangeRibbonTheme("Blue");
  1567. KeepBackstageOpen = true;
  1568. }
  1569. private void btnBlack_Click(object sender, RoutedEventArgs e) {
  1570. ChangeRibbonTheme("Black");
  1571. KeepBackstageOpen = true;
  1572. }
  1573. private void btnGreen_Click(object sender, RoutedEventArgs e) {
  1574. ChangeRibbonTheme("Metro", true);
  1575. KeepBackstageOpen = true;
  1576. }
  1577. #endregion
  1578. #region Archive Commands
  1579. private void btnExtractNow_Click(object sender, RoutedEventArgs e) {
  1580. if (chkUseNewFolder.IsChecked == true) {
  1581. string OutputLoc = $"{txtExtractLocation.Text}\\{Utilities.RemoveExtensionsFromFile(_ShellListView.GetFirstSelectedItem().ParsingName, new FileInfo(_ShellListView.GetFirstSelectedItem().ParsingName).Extension)}";
  1582. try {
  1583. Directory.CreateDirectory(OutputLoc);
  1584. ExtractToLocation(SelectedArchive, OutputLoc);
  1585. } catch (Exception) {
  1586. MessageBoxResult wtd = MessageBox.Show($"The directory {OutputLoc} already exists. Would you like for BetterExplorer to extract there instead?", "Folder Exists", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
  1587. switch (wtd) {
  1588. case MessageBoxResult.Cancel:
  1589. break;
  1590. case MessageBoxResult.No:
  1591. break;
  1592. case MessageBoxResult.None:
  1593. break;
  1594. case MessageBoxResult.OK:
  1595. break;
  1596. case MessageBoxResult.Yes:
  1597. ExtractToLocation(SelectedArchive, OutputLoc);
  1598. break;
  1599. default:
  1600. break;
  1601. }
  1602. }
  1603. } else {
  1604. ExtractToLocation(SelectedArchive, txtExtractLocation.Text);
  1605. }
  1606. }
  1607. private void btnChooseLocation_Click(object sender, RoutedEventArgs e) {
  1608. var dlg = new FolderSelectDialog();
  1609. if (dlg.ShowDialog())
  1610. txtExtractLocation.Text = dlg.FileName;
  1611. }
  1612. private void ExtractToLocation(string archive, string output) {
  1613. var selectedItems = new List<string>() { archive };
  1614. var archiveProcressScreen = new ArchiveProcressScreen(selectedItems, output, ArchiveAction.Extract, "");
  1615. archiveProcressScreen.ExtractionCompleted += new ArchiveProcressScreen.ExtractionCompleteEventHandler(ExtractionHasCompleted);
  1616. AddToLog($"Archive Extracted to {output} from source {archive}");
  1617. archiveProcressScreen.Show();
  1618. }
  1619. private void ExtractionHasCompleted(object sender, ArchiveEventArgs e) {
  1620. if (chkOpenResults.IsChecked == true) tcMain.NewTab(e.OutputLocation);
  1621. }
  1622. private void miExtractToLocation_Click(object sender, RoutedEventArgs e) {
  1623. var selectedItems = _ShellListView.SelectedItems.Select(item => item.ParsingName).ToList();
  1624. try {
  1625. var CAI = new CreateArchive(selectedItems, false, _ShellListView.GetFirstSelectedItem().ParsingName);
  1626. CAI.Show(this.GetWin32Window());
  1627. } catch {
  1628. }
  1629. }
  1630. private void miExtractHere_Click(object sender, RoutedEventArgs e) {
  1631. string FileName = _ShellListView.GetFirstSelectedItem().ParsingName;
  1632. var extractor = new SevenZipExtractor(FileName);
  1633. string DirectoryName = Path.GetDirectoryName(FileName);
  1634. string ArchName = Path.GetFileNameWithoutExtension(FileName);
  1635. extractor.Extracting += new EventHandler<ProgressEventArgs>(extractor_Extracting);
  1636. extractor.ExtractionFinished += new EventHandler<EventArgs>(extractor_ExtractionFinished);
  1637. extractor.FileExtractionStarted += new EventHandler<FileInfoEventArgs>(extractor_FileExtractionStarted);
  1638. extractor.FileExtractionFinished += new EventHandler<FileInfoEventArgs>(extractor_FileExtractionFinished);
  1639. extractor.PreserveDirectoryStructure = true;
  1640. string Separator = "";
  1641. if (DirectoryName[DirectoryName.Length - 1] != Char.Parse(@"\")) Separator = @"\";
  1642. AddToLog($"Extracted Archive to {DirectoryName}{Separator}{ArchName} from source {FileName}");
  1643. extractor.BeginExtractArchive(DirectoryName + Separator + ArchName);
  1644. }
  1645. void extractor_FileExtractionFinished(object sender, FileInfoEventArgs e) {
  1646. //throw new NotImplementedException();
  1647. }
  1648. void extractor_FileExtractionStarted(object sender, FileInfoEventArgs e) {
  1649. //throw new NotImplementedException();
  1650. }
  1651. void extractor_ExtractionFinished(object sender, EventArgs e) {
  1652. //throw new NotImplementedException();
  1653. (sender as SevenZipExtractor)?.Dispose();
  1654. }
  1655. void extractor_Extracting(object sender, ProgressEventArgs e) {
  1656. //throw new NotImplementedException();
  1657. }
  1658. private void btnExtract_Click(object sender, RoutedEventArgs e) => miExtractHere_Click(sender, e);
  1659. private void btnCheckArchive_Click(object sender, RoutedEventArgs e) => new Thread(new ThreadStart(DoCheck)).Start();
  1660. private void DoCheck() {
  1661. string FileName = _ShellListView.GetFirstSelectedItem().ParsingName;
  1662. var extractor = new SevenZipExtractor(FileName);
  1663. if (!extractor.Check())
  1664. MessageBox.Show("Not Pass");
  1665. else
  1666. MessageBox.Show("Pass");
  1667. extractor.Dispose();
  1668. }
  1669. private void btnViewArchive_Click(object sender, RoutedEventArgs e) {
  1670. var name = _ShellListView.SelectedItems.First().ParsingName;
  1671. string ICON_DLLPATH = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll");
  1672. var archiveDetailView = new ArchiveDetailView(ICON_DLLPATH, name);
  1673. archiveDetailView.Show(this.GetWin32Window());
  1674. //ArchiveViewWindow g = new ArchiveViewWindow( ShellListView.GetFirstSelectedItem(), IsPreviewPaneEnabled, IsInfoPaneEnabled);
  1675. //g.Show();
  1676. }
  1677. private void btnCreateArchive_Click(object sender, RoutedEventArgs e) {
  1678. //ArchiveCreateWizard acw = new ArchiveCreateWizard(ShellListView.SelectedItems, ShellListView.CurrentFolder.ParsingName);
  1679. // acw.win = this;
  1680. // acw.LoadStrings();
  1681. //acw.Show();
  1682. //AddToLog("Archive Creation Wizard begun. Current location: " + ShellListView.CurrentFolder.ParsingName);
  1683. }
  1684. #endregion
  1685. #region Library Commands
  1686. private void btnChangeLibIcon_Click(object sender, RoutedEventArgs e) => new IconView().LoadIcons(_ShellListView, true);
  1687. private void btnOLItem_Click(object sender, RoutedEventArgs e) {
  1688. //this._ShellListView.IsLibraryInModify = true;
  1689. this._ShellListView.CurrentRefreshedItemIndex = this._ShellListView.GetFirstSelectedItemIndex();
  1690. var NeededFile = _ShellListView.GetSelectedCount() == 1 ? _ShellListView.GetFirstSelectedItem() : _ShellListView.CurrentFolder;
  1691. var lib = ShellLibrary.Load(Path.GetFileNameWithoutExtension(NeededFile.ParsingName), false);
  1692. switch ((sender as MenuItem).Tag.ToString()) {
  1693. case "gu":
  1694. lib.LibraryType = LibraryFolderType.Generic;
  1695. lib.Close();
  1696. break;
  1697. case "doc":
  1698. lib.LibraryType = LibraryFolderType.Documents;
  1699. lib.Close();
  1700. break;
  1701. case "pic":
  1702. lib.LibraryType = LibraryFolderType.Pictures;
  1703. lib.Close();
  1704. break;
  1705. case "vid":
  1706. lib.LibraryType = LibraryFolderType.Videos;
  1707. lib.Close();
  1708. break;
  1709. case "mu":
  1710. lib.LibraryType = LibraryFolderType.Music;
  1711. lib.Close();
  1712. break;
  1713. default:
  1714. break;
  1715. }
  1716. }
  1717. private void chkPinNav_CheckChanged(object sender, RoutedEventArgs e) {
  1718. //this._ShellListView.IsLibraryInModify = true;
  1719. this._ShellListView.CurrentRefreshedItemIndex = this._ShellListView.GetFirstSelectedItemIndex();
  1720. var NeededFile = _ShellListView.GetSelectedCount() == 1 ? _ShellListView.GetFirstSelectedItem() : _ShellListView.CurrentFolder;
  1721. try {
  1722. var lib = ShellLibrary.Load(Path.GetFileNameWithoutExtension(NeededFile.ParsingName), false);
  1723. if (!IsFromSelectionOrNavigation)
  1724. lib.IsPinnedToNavigationPane = e.RoutedEvent.Name == "Checked";
  1725. lib.Close();
  1726. } catch (FileNotFoundException) { }
  1727. }
  1728. private void btnManageLib_Click(object sender, RoutedEventArgs e) {
  1729. this._ShellListView.CurrentRefreshedItemIndex = this._ShellListView.GetFirstSelectedItemIndex();
  1730. try {
  1731. ShellLibrary.ShowManageLibraryUI(_ShellListView.GetFirstSelectedItem().ComInterface,
  1732. this.Handle, "Choose which folders will be in this library", "A library gathers content from all of the folders listed below and puts it all in one window for you to see.", true);
  1733. } catch {
  1734. ShellLibrary.ShowManageLibraryUI(_ShellListView.CurrentFolder.ComInterface,
  1735. this.Handle, "Choose which folders will be in this library", "A library gathers content from all of the folders listed below and puts it all in one window for you to see.", true);
  1736. }
  1737. }
  1738. #endregion
  1739. #region Navigation (Back/Forward Arrows) and Up Button
  1740. private void leftNavBut_Click(object sender, RoutedEventArgs e) {
  1741. tcMain.isGoingBackOrForward = true;
  1742. NavigationController((tcMain.SelectedItem as Wpf.Controls.TabItem).log.NavigateBack());
  1743. }
  1744. private void rightNavBut_Click(object sender, RoutedEventArgs e) {
  1745. tcMain.isGoingBackOrForward = true;
  1746. NavigationController((tcMain.SelectedItem as Wpf.Controls.TabItem).log.NavigateForward());
  1747. }
  1748. private void downArrow_Click(object sender, RoutedEventArgs e) {
  1749. _CMHistory.Items.Clear();
  1750. if (tcMain.SelectedItem == null) return;
  1751. var nl = ((Wpf.Controls.TabItem)tcMain.SelectedItem).log;
  1752. var i = 0;
  1753. foreach (var item in nl.HistoryItemsList) {
  1754. if (item != null) {
  1755. var itemCopy = item.Clone();
  1756. _CMHistory.Items.Add(Utilities.Build_MenuItem(itemCopy.DisplayName, itemCopy, itemCopy.ThumbnailSource(16, ShellThumbnailFormatOption.IconOnly, ShellThumbnailRetrievalOption.Default),
  1757. checkable: true, isChecked: i == nl.CurrentLocPos, GroupName: "G1", onClick: miItems_Click));
  1758. }
  1759. i++;
  1760. }
  1761. _CMHistory.Placement = PlacementMode.Bottom;
  1762. _CMHistory.PlacementTarget = navBarGrid;
  1763. _CMHistory.IsOpen = true;
  1764. }
  1765. void miItems_Click(object sender, RoutedEventArgs e) {
  1766. var item = (IListItemEx)(sender as MenuItem).Tag;
  1767. if (item != null) {
  1768. tcMain.isGoingBackOrForward = true;
  1769. NavigationLog nl = (tcMain.Items[tcMain.SelectedIndex] as Wpf.Controls.TabItem).log;
  1770. (sender as MenuItem).IsChecked = true;
  1771. nl.CurrentLocPos = _CMHistory.Items.IndexOf(sender);
  1772. NavigationController(item);
  1773. }
  1774. }
  1775. private void btnUpLevel_Click(object sender, RoutedEventArgs e) {
  1776. if (_ShellListView.CanNavigateParent) {
  1777. this.IsNeedEnsureVisible = true;
  1778. _ShellListView.NavigateParent();
  1779. }
  1780. }
  1781. #endregion
  1782. #region View Tab/Status Bar
  1783. private void btnMoreColls_Click(object sender, RoutedEventArgs e) => micm_Click(sender, e);
  1784. private void btnAutosizeColls_Click(object sender, RoutedEventArgs e) => this._ShellListView.AutosizeAllColumns(-1);
  1785. private void zoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
  1786. if (this._IsShouldRiseViewChanged)
  1787. _ShellListView.ResizeIcons((int)e.NewValue);
  1788. }
  1789. void mig_Click(object sender, RoutedEventArgs e) {
  1790. this._ShellListView.EnableGroups();
  1791. this._ShellListView.GenerateGroupsFromColumn((sender as MenuItem).Tag as Collumns);
  1792. }
  1793. private Boolean _IsShouldRiseViewChanged = true;
  1794. private void StatusBar_Folder_Buttons(object sender, RoutedEventArgs e) {
  1795. this._IsShouldRiseViewChanged = false;
  1796. if (_ShellListView == null)
  1797. return;
  1798. else if (sender == btnSbDetails)
  1799. _ShellListView.View = ShellViewStyle.Details;
  1800. else if (sender == btnSbIcons)
  1801. _ShellListView.View = ShellViewStyle.Medium;
  1802. else if (sender == btnSbTiles)
  1803. _ShellListView.View = ShellViewStyle.Tile;
  1804. this._IsShouldRiseViewChanged = true;
  1805. }
  1806. void mi_Click(object sender, RoutedEventArgs e) {
  1807. var item = (sender as MenuItem);
  1808. var parentButton = item.Parent as DropDownButton;
  1809. var ascitem = (MenuItem)parentButton.Items[parentButton.Items.IndexOf(misa)];
  1810. var Sort = ascitem.IsChecked ? WIN.Forms.SortOrder.Ascending : WIN.Forms.SortOrder.Descending;
  1811. _ShellListView.SetSortCollumn(true, (Collumns)item.Tag, Sort);
  1812. }
  1813. void misng_Click(object sender, RoutedEventArgs e) {
  1814. (sender as MenuItem).IsChecked = true;
  1815. if (this._ShellListView.IsGroupsEnabled) this._ShellListView.DisableGroups();
  1816. }
  1817. private void inRibbonGallery1_SelectionChanged(object sender, SelectionChangedEventArgs e) {
  1818. if (!this._IsShouldRiseViewChanged || !this._ShellListView.IsViewSelectionAllowed) return;
  1819. e.Handled = true;
  1820. if (e.AddedItems.Count == 0) return;
  1821. var selectedItem = e.AddedItems[0];
  1822. var selectedItemIndex = ViewGallery.Items.IndexOf(selectedItem);
  1823. this._IsShouldRiseViewChanged = false;
  1824. switch (selectedItemIndex) {
  1825. case 0:
  1826. _ShellListView.View = ShellViewStyle.ExtraLargeIcon;
  1827. break;
  1828. case 1:
  1829. _ShellListView.View = ShellViewStyle.LargeIcon;
  1830. break;
  1831. case 2:
  1832. _ShellListView.View = ShellViewStyle.Medium;
  1833. break;
  1834. case 3:
  1835. _ShellListView.View = ShellViewStyle.SmallIcon;
  1836. break;
  1837. case 4:
  1838. _ShellListView.View = ShellViewStyle.List;
  1839. break;
  1840. case 5:
  1841. _ShellListView.View = ShellViewStyle.Details;
  1842. break;
  1843. case 6:
  1844. _ShellListView.View = ShellViewStyle.Tile;
  1845. break;
  1846. case 7:
  1847. _ShellListView.View = ShellViewStyle.Content;
  1848. break;
  1849. case 8:
  1850. _ShellListView.View = ShellViewStyle.Thumbstrip;
  1851. break;
  1852. default:
  1853. break;
  1854. }
  1855. this._IsShouldRiseViewChanged = true;
  1856. }
  1857. private void chkHiddenFiles_Checked(object sender, RoutedEventArgs e) {
  1858. if (_IsCalledFromLoading) return;
  1859. Dispatcher.BeginInvoke(new Action(
  1860. delegate () {
  1861. var state = new BExplorer.Shell.Interop.Shell32.SHELLSTATE() { fShowAllObjects = 1 };
  1862. BExplorer.Shell.Interop.Shell32.SHGetSetSettings(ref state, BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWALLOBJECTS, true);
  1863. _ShellListView.ShowHidden = true;
  1864. ShellTree.IsShowHiddenItems = true;
  1865. ShellTree.RefreshContents();
  1866. }
  1867. ));
  1868. }
  1869. private void chkHiddenFiles_Unchecked(object sender, RoutedEventArgs e) {
  1870. if (_IsCalledFromLoading) return;
  1871. Dispatcher.BeginInvoke(new Action(
  1872. delegate () {
  1873. var state = new BExplorer.Shell.Interop.Shell32.SHELLSTATE() { fShowAllObjects = 0 };
  1874. BExplorer.Shell.Interop.Shell32.SHGetSetSettings(ref state, BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWALLOBJECTS, true);
  1875. _ShellListView.ShowHidden = false;
  1876. ShellTree.IsShowHiddenItems = false;
  1877. ShellTree.RefreshContents();
  1878. }
  1879. ));
  1880. }
  1881. private void chkExtensions_Checked(object sender, RoutedEventArgs e) {
  1882. if (_IsCalledFromLoading) return;
  1883. Dispatcher.BeginInvoke(new Action(
  1884. delegate () {
  1885. var state = new BExplorer.Shell.Interop.Shell32.SHELLSTATE();
  1886. state.fShowExtensions = 1;
  1887. BExplorer.Shell.Interop.Shell32.SHGetSetSettings(ref state, BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWEXTENSIONS, true);
  1888. this._ShellListView.IsFileExtensionShown = true;
  1889. _ShellListView.RefreshContents();
  1890. }
  1891. ));
  1892. }
  1893. private void chkExtensions_Unchecked(object sender, RoutedEventArgs e) {
  1894. if (_IsCalledFromLoading) return;
  1895. Dispatcher.BeginInvoke(new Action(
  1896. delegate () {
  1897. var state = new BExplorer.Shell.Interop.Shell32.SHELLSTATE();
  1898. state.fShowExtensions = 0;
  1899. BExplorer.Shell.Interop.Shell32.SHGetSetSettings(ref state, BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWEXTENSIONS, true);
  1900. this._ShellListView.IsFileExtensionShown = false;
  1901. _ShellListView.RefreshContents();
  1902. }
  1903. ));
  1904. }
  1905. #endregion
  1906. #region Hide items
  1907. private void btnHideSelItems_Click(object sender, RoutedEventArgs e) {
  1908. foreach (var item in _ShellListView.SelectedItems.Where(x => x.IsFolder)) {
  1909. var di = new DirectoryInfo(item.ParsingName);
  1910. di.Attributes |= System.IO.FileAttributes.Hidden;
  1911. }
  1912. foreach (var item in _ShellListView.SelectedItems.Where(x => !x.IsFolder & !x.IsNetworkPath & !x.IsDrive)) {
  1913. var di = new FileInfo(item.ParsingName);
  1914. di.Attributes |= System.IO.FileAttributes.Hidden;
  1915. }
  1916. _ShellListView.RefreshContents();
  1917. }
  1918. [Obsolete("Why do we have this")]
  1919. private void miHideItems_Click(object sender, RoutedEventArgs e) {
  1920. //FIXME:
  1921. //ShellItemCollection SelItems = ShellListView.SelectedItems;
  1922. //pd = new IProgressDialog(this.Handle);
  1923. //pd.Title = "Applying attributes";
  1924. //pd.CancelMessage = "Please wait while the operation is cancelled";
  1925. //pd.Maximum = 100;
  1926. //pd.Value = 0;
  1927. //pd.Line1 = "Applying attributes to:";
  1928. //pd.Line3 = "Calculating Time Remaining...";
  1929. //pd.ShowDialog(IProgressDialog.PROGDLG.Normal, IProgressDialog.PROGDLG.AutoTime, IProgressDialog.PROGDLG.NoMinimize);
  1930. //Thread hthread = new Thread(new ParameterizedThreadStart(DoHideShowWithChilds));
  1931. //hthread.Start(SelItems);
  1932. }
  1933. #endregion
  1934. #region Share Tab Commands (excluding Archive)
  1935. private void btnDisconectDrive_Click(object sender, RoutedEventArgs e) => BExplorer.Shell.Interop.Shell32.WNetDisconnectDialog(this.Handle, 1);
  1936. private void Button_Click_4(object sender, RoutedEventArgs e) => this._ShellListView.OpenShareUI(); //TODO: Rename Button_Click_4
  1937. private void btnMapDrive_Click(object sender, RoutedEventArgs e) {
  1938. BExplorer.Shell.Interop.Shell32.MapDrive(this.Handle, this._ShellListView.SelectedItems.Count() == 1 ? this._ShellListView.GetFirstSelectedItem().ParsingName : String.Empty);
  1939. }
  1940. private void btnAdvancedSecurity_Click(object sender, RoutedEventArgs e) {
  1941. _ShellListView.ShowPropPage(this.Handle, _ShellListView.GetFirstSelectedItem().ParsingName, User32.LoadResourceString(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll"), 9046, "Security1"));
  1942. }
  1943. #endregion
  1944. #region Change Language
  1945. private void TranslationComboBox_DropDownOpened(object sender, EventArgs e) => (sender as Fluent.ComboBox).Focus();
  1946. private void TranslationHelp_Click(object sender, RoutedEventArgs e) => Process.Start(TranslationURL.Text);
  1947. private void TranslationComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {
  1948. e.Handled = true;
  1949. if (this.IsLoaded) {
  1950. BESettings.Locale = ((TranslationComboBoxItem)e.AddedItems[0]).LocaleCode;
  1951. BESettings.SaveSettings();
  1952. ((App)Application.Current).SelectCulture(((TranslationComboBoxItem)e.AddedItems[0]).LocaleCode);
  1953. if (_ShellListView.CurrentFolder.Parent.ParsingName == KnownFolders.Libraries.ParsingName) {
  1954. btnCreateFolder.Header = FindResource("btnNewLibraryCP"); //"New Library";
  1955. stNewFolder.Title = FindResource("btnNewLibraryCP").ToString(); //"New Library";
  1956. stNewFolder.Text = "Creates a new library in the current folder.";
  1957. } else {
  1958. btnCreateFolder.Header = FindResource("btnNewFolderCP"); //"New Folder";
  1959. stNewFolder.Title = FindResource("btnNewFolderCP").ToString(); //"New Folder";
  1960. stNewFolder.Text = "Creates a new folder in the current folder";
  1961. }
  1962. }
  1963. }
  1964. private void btnRemoveLangSetting_Click(object sender, RoutedEventArgs e) {
  1965. RegistryKey rk = Registry.CurrentUser;
  1966. RegistryKey rks = rk.OpenSubKey(@"Software\BExplorer", true);
  1967. rks.DeleteValue(@"Locale");
  1968. rks.Close();
  1969. rk.Close();
  1970. }
  1971. #endregion
  1972. #region Image Editing
  1973. private void btnResize_Click(object sender, RoutedEventArgs e) => ResizeImage.Open(_ShellListView.GetFirstSelectedItem());
  1974. private void Convert_Images(object sender, RoutedEventArgs e) {
  1975. ImageFormat format = null; string extension = null;
  1976. if (sender == ConvertToJPG) {
  1977. format = ImageFormat.Jpeg;
  1978. extension = ".jpg";
  1979. } else if (sender == ConvertToPNG) {
  1980. format = ImageFormat.Png;
  1981. extension = ".png";
  1982. } else if (sender == ConvertToGIF) {
  1983. format = ImageFormat.Gif;
  1984. extension = ".gif";
  1985. } else if (sender == ConvertToBMP) {
  1986. format = ImageFormat.Bmp;
  1987. extension = ".bmp";
  1988. } else if (sender == ConvertToJPG) {
  1989. format = ImageFormat.Wmf;
  1990. extension = ".wmf";
  1991. } else {
  1992. throw new Exception("Invalid Sender");
  1993. }
  1994. foreach (var item in _ShellListView.SelectedItems) {
  1995. var cvt = new Bitmap(item.ParsingName);
  1996. string namen = Utilities.RemoveExtensionsFromFile(item.ParsingName, new FileInfo(item.ParsingName).Extension);
  1997. try {
  1998. AddToLog("Converted Image from " + item.ParsingName + " to new file " + namen + extension);
  1999. var newFilePath = namen + extension;
  2000. cvt.Save(newFilePath, format);
  2001. this._ShellListView.UnvalidateDirectory();
  2002. } catch (Exception) {
  2003. MessageBox.Show("There appears to have been an issue with converting the file. Make sure the filename \"" + Utilities.RemoveExtensionsFromFile(_ShellListView.GetFirstSelectedItem().DisplayName, new System.IO.FileInfo(item.ParsingName).Extension) + extension + "\" does already not exist.", "Conversion Error", MessageBoxButton.OK, MessageBoxImage.Error);
  2004. }
  2005. cvt.Dispose();
  2006. }
  2007. }
  2008. /// <summary>
  2009. /// Sets the wallpaper based on the sender
  2010. /// </summary>
  2011. /// <param name="sender"></param>
  2012. /// <param name="e"></param>
  2013. private void Set_Wallpaper(object sender, RoutedEventArgs e) {
  2014. Wallpaper.Style ThisStyle;
  2015. if (sender == btnWallpaper)
  2016. ThisStyle = Wallpaper.Style.Stretched;
  2017. else if (sender == miWallFill)
  2018. ThisStyle = Wallpaper.Style.Fill;
  2019. else if (sender == miWallFit)
  2020. ThisStyle = Wallpaper.Style.Fit;
  2021. else if (sender == miWallStretch)
  2022. ThisStyle = Wallpaper.Style.Stretched;
  2023. else if (sender == miWallTile)
  2024. ThisStyle = Wallpaper.Style.Tiled;
  2025. else if (sender == miWallCenter)
  2026. ThisStyle = Wallpaper.Style.Centered;
  2027. else
  2028. throw new Exception("Invalid Sender");
  2029. Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => {
  2030. var TheWall = new Wallpaper();
  2031. TheWall.Set(new Uri(_ShellListView.GetFirstSelectedItem().ParsingName), ThisStyle);
  2032. }));
  2033. }
  2034. private void RotateImages(object sender, RoutedEventArgs e) {
  2035. RotateFlipType Rotation;
  2036. string DefaultName_Addon = null;
  2037. switch ((sender as Control).Name) {
  2038. case "btnRotateLeft":
  2039. Rotation = RotateFlipType.Rotate270FlipNone;
  2040. DefaultName_Addon = "_Rotated270";
  2041. break;
  2042. case "btnRotateRight":
  2043. Rotation = RotateFlipType.Rotate90FlipNone;
  2044. DefaultName_Addon = "_Rotated90";
  2045. break;
  2046. case "btnFlipX":
  2047. Rotation = RotateFlipType.RotateNoneFlipX;
  2048. DefaultName_Addon = "_FlippedX";
  2049. break;
  2050. case "btnFlipY":
  2051. Rotation = RotateFlipType.RotateNoneFlipY;
  2052. DefaultName_Addon = "_FlippedY";
  2053. break;
  2054. default:
  2055. throw new Exception("Invalid sender");
  2056. }
  2057. foreach (FileSystemListItem item in _ShellListView.SelectedItems) {
  2058. var cvt = new Bitmap(item.ParsingName);
  2059. cvt.RotateFlip(Rotation);
  2060. if (BESettings.OverwriteImageWhileEditing) {
  2061. cvt.Save(item.ParsingName);
  2062. } else {
  2063. string ext = item.ParsingName.Substring(item.ParsingName.LastIndexOf(".", StringComparison.Ordinal));
  2064. string name = item.ParsingName;
  2065. string namen = Utilities.RemoveExtensionsFromFile(name, new System.IO.FileInfo(name).Extension);
  2066. var newFilePath = namen + DefaultName_Addon + ext;
  2067. cvt.Save(newFilePath);
  2068. this._ShellListView.UnvalidateDirectory();
  2069. }
  2070. cvt.Dispose();
  2071. AddToLog("Rotated image " + item.ParsingName);
  2072. }
  2073. }
  2074. #endregion
  2075. #region Folder Tools Commands
  2076. private void btnChangeFoldericon_Click(object sender, RoutedEventArgs e) => new IconView().LoadIcons(this._ShellListView, false);
  2077. private void btnClearFoldericon_Click(object sender, RoutedEventArgs e) => _ShellListView.ClearFolderIcon(_ShellListView.GetFirstSelectedItem().ParsingName);
  2078. #endregion
  2079. #region Registry Setting Changes / BetterExplorerOperations Calls / Action Log
  2080. //private void chkIsRestoreTabs_CheckChanged(object sender, RoutedEventArgs e) => Utilities.SetRegistryValue("IsRestoreTabs", e.RoutedEvent.Name == "Checked" ? 1 : 0);
  2081. //private void gridSplitter1_DragCompleted(object sender, DragCompletedEventArgs e) => Utilities.SetRegistryValue("SearchBarWidth", SearchBarColumn.Width.Value);
  2082. //private void SearchBarReset_Click(object sender, RoutedEventArgs e) => Utilities.SetRegistryValue("SearchBarWidth", SearchBarColumn.Width.Value);
  2083. //private void chkIsCFO_Click(object sender, RoutedEventArgs e) => Utilities.SetRegistryValue("IsCustomFO", chkIsCFO.IsChecked.Value == true ? 1 : 0);
  2084. private void chkIsRestoreTabs_CheckChanged(object sender, RoutedEventArgs e) {
  2085. BESettings.IsRestoreTabs = e.RoutedEvent.Name == "Checked";
  2086. BESettings.SaveSettings();
  2087. }
  2088. private void gridSplitter1_DragCompleted(object sender, DragCompletedEventArgs e) {
  2089. BESettings.SearchBarWidth = SearchBarColumn.Width.Value;
  2090. BESettings.SaveSettings();
  2091. }
  2092. private void SearchBarReset_Click(object sender, RoutedEventArgs e) {
  2093. BESettings.SearchBarWidth = SearchBarColumn.Width.Value;
  2094. BESettings.SaveSettings();
  2095. }
  2096. private void chkIsCFO_Click(object sender, RoutedEventArgs e) {
  2097. BESettings.IsCustomFO = chkIsCFO.IsChecked.Value == true;
  2098. BESettings.SaveSettings();
  2099. }
  2100. private Process Rename_CheckChanged_Helper() {
  2101. string ExePath = Utilities.AppDirectoryItem("BetterExplorerOperations.exe");
  2102. Process proc = new Process();
  2103. proc.StartInfo = new ProcessStartInfo {
  2104. FileName = ExePath,
  2105. Verb = "runas",
  2106. UseShellExecute = true,
  2107. Arguments = $"/env /user:Administrator \"{ExePath}\""
  2108. };
  2109. proc.Start();
  2110. Thread.Sleep(1000);
  2111. return proc;
  2112. }
  2113. private void chkIsDefault_CheckChanged(object sender, RoutedEventArgs e) {
  2114. //TODO: Delete Dead Code!!
  2115. if (isOnLoad) return;
  2116. var proc = Rename_CheckChanged_Helper();
  2117. if (chkIsDefault.IsChecked == true) {
  2118. //int h = (int)WindowsAPI.getWindowId(null, "BetterExplorerOperations");
  2119. //int jj = WindowsAPI.sendWindowsStringMessage((int)WindowsAPI.getWindowId(null, "BetterExplorerOperations"), 0, "0x77654");
  2120. //proc.WaitForExit();
  2121. //if (proc.ExitCode == -1) {
  2122. // isOnLoad = true;
  2123. // (sender as Fluent.CheckBox).IsChecked = false;
  2124. // isOnLoad = false;
  2125. // MessageBox.Show("Can't set Better Explorer as default!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  2126. //}
  2127. } else {
  2128. //WindowsAPI.sendWindowsStringMessage((int)WindowsAPI.getWindowId(null, "BetterExplorerOperations"), 0, "0x77655");
  2129. //proc.WaitForExit();
  2130. //if (proc.ExitCode == -1) {
  2131. // isOnLoad = true;
  2132. // (sender as Fluent.CheckBox).IsChecked = true;
  2133. // isOnLoad = false;
  2134. // MessageBox.Show("Can't restore default filemanager!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  2135. //}
  2136. }
  2137. }
  2138. private void chkTreeExpand_CheckChanged(object sender, RoutedEventArgs e) {
  2139. //TODO: Delete Dead Code!!
  2140. if (isOnLoad) return;
  2141. var proc = Rename_CheckChanged_Helper();
  2142. if (chkTreeExpand.IsChecked == true) {
  2143. //int h = (int)WindowsAPI.getWindowId(null, "BetterExplorerOperations");
  2144. //int jj = WindowsAPI.sendWindowsStringMessage((int)WindowsAPI.getWindowId(null, "BetterExplorerOperations"), 0, "0x88775");
  2145. //proc.WaitForExit();
  2146. } else {
  2147. //int h = (int)WindowsAPI.getWindowId(null, "BetterExplorerOperations");
  2148. //int jj = WindowsAPI.sendWindowsStringMessage((int)WindowsAPI.getWindowId(null, "BetterExplorerOperations"), 0, "0x88776");
  2149. //proc.WaitForExit();
  2150. }
  2151. }
  2152. private void btnSetCurrentasStartup_Click(object sender, RoutedEventArgs e) {
  2153. backstage.IsOpen = true;
  2154. string CurrentLocString = _ShellListView.CurrentFolder.ParsingName;
  2155. tcMain.StartUpLocation = CurrentLocString;
  2156. btnSetCurrentasStartup.Header = _ShellListView.CurrentFolder.DisplayName;
  2157. //btnSetCurrentasStartup.Icon = ShellListView.CurrentFolder.Thumbnail.BitmapSource;
  2158. BESettings.StartupLocation = CurrentLocString;
  2159. BESettings.SaveSettings();
  2160. }
  2161. private void chkIsFlyout_CheckChanged(object sender, RoutedEventArgs e) {
  2162. if (!isOnLoad) {
  2163. BESettings.IsFileOpExEnabled = e.RoutedEvent.Name == "Checked";
  2164. BESettings.SaveSettings();
  2165. }
  2166. }
  2167. private void chkIsTerraCopyEnabled_CheckChanged(object sender, RoutedEventArgs e) {
  2168. if (!isOnLoad) {
  2169. BESettings.IsFileOpExEnabled = e.RoutedEvent.Name == "Checked";
  2170. BESettings.SaveSettings();
  2171. }
  2172. }
  2173. private void chkShowCheckBoxes_CheckChanged(object sender, RoutedEventArgs e) {
  2174. _ShellListView.ShowCheckboxes = e.RoutedEvent.Name == "Checked";
  2175. _ShellListView.RefreshContents();
  2176. }
  2177. private void chkOverwriteImages_Checked(object sender, RoutedEventArgs e) {
  2178. BESettings.OverwriteImageWhileEditing = e.RoutedEvent.Name == "Checked";
  2179. BESettings.SaveSettings();
  2180. }
  2181. private void chkRibbonMinimizedGlass_Click(object sender, RoutedEventArgs e) {
  2182. BESettings.IsGlassOnRibonMinimized = chkRibbonMinimizedGlass.IsChecked.Value == true;
  2183. BESettings.SaveSettings();
  2184. if (!TheRibbon.IsMinimized) {
  2185. } else if (chkRibbonMinimizedGlass.IsChecked.Value) {
  2186. var p = ShellViewHost.TransformToAncestor(this).Transform(new WIN.Point(0, 0));
  2187. this.GlassFrameThickness = new Thickness(8, p.Y, 8, 8);
  2188. } else {
  2189. var p = backstage.TransformToAncestor(this).Transform(new WIN.Point(0, 0));
  2190. this.GlassFrameThickness = new Thickness(8, p.Y + backstage.ActualHeight, 8, 8);
  2191. }
  2192. }
  2193. private void chkLogHistory_CheckChanged(object sender, RoutedEventArgs e) {
  2194. BESettings.EnableActionLog = e.RoutedEvent.Name == "Checked";
  2195. BESettings.EnableActionLog = e.RoutedEvent.Name == "Checked";
  2196. BESettings.SaveSettings();
  2197. }
  2198. private void btnShowLogs_Click(object sender, RoutedEventArgs e) {
  2199. try {
  2200. if (!Directory.Exists(logdir)) Directory.CreateDirectory(logdir);
  2201. tcMain.NewTab(logdir);
  2202. this.backstage.IsOpen = false;
  2203. } catch (Exception exe) {
  2204. MessageBox.Show("An error occurred while trying to open the logs folder. Please report this issue at http://bugs.gainedge.org/public/betterexplorer. \r\n\r\n Here is some information about the error: \r\n\r\n" + exe.Message + "\r\n\r\n" + exe.ToString(), "Error While Opening Log Folder", MessageBoxButton.OK, MessageBoxImage.Error);
  2205. }
  2206. }
  2207. #endregion
  2208. #region Change Pane Visibility
  2209. private void btnNavigationPane_CheckChanged(object sender, RoutedEventArgs e) {
  2210. if (isOnLoad) {
  2211. } else if (e.RoutedEvent.Name == "Checked") {
  2212. TreeGrid.ColumnDefinitions[0].Width = new GridLength(200);
  2213. BESettings.IsNavigationPaneEnabled = true;
  2214. BESettings.SaveSettings();
  2215. } else {
  2216. TreeGrid.ColumnDefinitions[0].Width = new GridLength(1);
  2217. BESettings.IsNavigationPaneEnabled = false;
  2218. BESettings.SaveSettings();
  2219. }
  2220. }
  2221. private void btnPreviewPane_CheckChanged(object sender, RoutedEventArgs e) {
  2222. if (isOnLoad) {
  2223. } else if (e.RoutedEvent.Name == "Checked") {
  2224. this.clPreview.Width = new GridLength(BESettings.PreviewPaneWidth);
  2225. this.clPreviewSplitter.Width = new GridLength(1);
  2226. var selectedItem = _ShellListView.SelectedItems.FirstOrDefault();
  2227. if (selectedItem != null && selectedItem.IsFileSystem && _ShellListView.GetSelectedCount() == 1 && !selectedItem.IsFolder) {
  2228. this.Previewer.FileName = selectedItem.ParsingName;
  2229. }
  2230. BESettings.IsPreviewPaneEnabled = true;
  2231. BESettings.SaveSettings();
  2232. } else {
  2233. this.clPreview.Width = new GridLength(0);
  2234. this.clPreviewSplitter.Width = new GridLength(0);
  2235. this.Previewer.FileName = null;
  2236. BESettings.IsPreviewPaneEnabled = false;
  2237. BESettings.SaveSettings();
  2238. }
  2239. }
  2240. private void btnInfoPane_CheckChanged(object sender, RoutedEventArgs e) {
  2241. if (isOnLoad) {
  2242. } else if (e.RoutedEvent.Name == "Checked") {
  2243. this.rPreviewPane.Height = new GridLength(BESettings.InfoPaneHeight);
  2244. this.rPreviewPaneSplitter.Height = new GridLength(1);
  2245. BESettings.IsInfoPaneEnabled = true;
  2246. BESettings.SaveSettings();
  2247. } else {
  2248. this.rPreviewPane.Height = new GridLength(0);
  2249. this.rPreviewPaneSplitter.Height = new GridLength(0);
  2250. BESettings.IsInfoPaneEnabled = false;
  2251. BESettings.SaveSettings();
  2252. }
  2253. }
  2254. #endregion
  2255. #region Search
  2256. private void edtSearchBox_BeginSearch(object sender, SearchRoutedEventArgs e) => DoSearch();
  2257. public void DoSearch() {
  2258. try {
  2259. if (edtSearchBox.FullSearchTerms != "") this._ShellListView.Navigate_Full(edtSearchBox.FullSearchTerms, true, true);
  2260. } catch (Exception ex) {
  2261. MessageBox.Show(ex.Message, ex.GetType().ToString(), MessageBoxButton.OK);
  2262. }
  2263. }
  2264. private void btnSearch_Click(object sender, RoutedEventArgs e) => DoSearch();
  2265. private void edtSearchBox_RequestCriteriaChange(object sender, SearchRoutedEventArgs e) {
  2266. if (e.SearchTerms.StartsWith("author:"))
  2267. AuthorToggle_Click(sender, new RoutedEventArgs(e.RoutedEvent));
  2268. else if (e.SearchTerms.StartsWith("ext:"))
  2269. ToggleButton_Click_1(sender, new RoutedEventArgs(e.RoutedEvent));
  2270. else if (e.SearchTerms.StartsWith("subject:"))
  2271. SubjectToggle_Click(sender, new RoutedEventArgs(e.RoutedEvent));
  2272. else if (e.SearchTerms.StartsWith("size:"))
  2273. miCustomSize_Click(sender, new RoutedEventArgs(e.RoutedEvent));
  2274. else if (e.SearchTerms.StartsWith("date:"))
  2275. dcCustomTime_Click(sender, new RoutedEventArgs(e.RoutedEvent));
  2276. else if (e.SearchTerms.StartsWith("modified:"))
  2277. dmCustomTime_Click(sender, new RoutedEventArgs(e.RoutedEvent));
  2278. else {
  2279. var T = "You have discovered an error in this program. Please tell us which filter you were trying to edit and any other details we should know. \r\n\r\nYour filter: ";
  2280. MessageBox.Show(T + e.SearchTerms, "Oops! Found a Bug!", MessageBoxButton.OK, MessageBoxImage.Error);
  2281. }
  2282. }
  2283. private void edtSearchBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
  2284. ctgSearch.Visibility = Visibility.Visible;
  2285. if (!TheRibbon.IsMinimized) TheRibbon.SelectedTabItem = tbSearch;
  2286. }
  2287. private void edtSearchBox_FiltersCleared(object sender, EventArgs e) {
  2288. scSize.IsChecked = false;
  2289. ExtToggle.IsChecked = false;
  2290. AuthorToggle.IsChecked = false;
  2291. SubjectToggle.IsChecked = false;
  2292. dcsplit.IsChecked = false;
  2293. dmsplit.IsChecked = false;
  2294. foreach (var item in scSize.Items.OfType<MenuItem>().Union(dcsplit.Items.OfType<MenuItem>()).Union(dmsplit.Items.OfType<MenuItem>())) {
  2295. item.IsChecked = false;
  2296. }
  2297. }
  2298. private void MenuItem_Click_3(object sender, RoutedEventArgs e) {
  2299. edtSearchBox.ModifiedCondition = (string)((FrameworkElement)sender).Tag;
  2300. dmsplit.IsChecked = true;
  2301. }
  2302. private void MenuItem_Click_4(object sender, RoutedEventArgs e) {
  2303. edtSearchBox.DateCondition = (string)((FrameworkElement)sender).Tag;
  2304. dcsplit.IsChecked = true;
  2305. }
  2306. private void ToggleButton_Click(object sender, RoutedEventArgs e) {
  2307. ((Fluent.ToggleButton)sender).IsChecked = true;
  2308. edtSearchBox.KindCondition = (string)((FrameworkElement)sender).Tag;
  2309. edtSearchBox.Focus();
  2310. }
  2311. private void MenuItem_Click_5(object sender, RoutedEventArgs e) {
  2312. edtSearchBox.SizeCondition = (string)((FrameworkElement)sender).Tag;
  2313. scSize.IsChecked = true;
  2314. }
  2315. private void ToggleButton_Click_1(object sender, RoutedEventArgs e) {
  2316. var dat = new StringSearchCriteriaDialog("ext", edtSearchBox.ExtensionCondition, FindResource("btnExtCP") as string);
  2317. dat.ShowDialog();
  2318. if (dat.Confirm) {
  2319. edtSearchBox.ExtensionCondition = "ext:" + dat.textBox1.Text;
  2320. ExtToggle.IsChecked = dat.textBox1.Text.Any();
  2321. } else {
  2322. ExtToggle.IsChecked = Utilities.GetValueOnly("ext", edtSearchBox.ExtensionCondition).Any();
  2323. }
  2324. }
  2325. private void AuthorToggle_Click(object sender, RoutedEventArgs e) {
  2326. var dat = new StringSearchCriteriaDialog("author", edtSearchBox.AuthorCondition, FindResource("btnAuthorCP") as string);
  2327. dat.ShowDialog();
  2328. if (dat.Confirm) {
  2329. edtSearchBox.AuthorCondition = "author:" + dat.textBox1.Text;
  2330. AuthorToggle.IsChecked = dat.textBox1.Text.Any();
  2331. } else {
  2332. AuthorToggle.IsChecked = Utilities.GetValueOnly("author", edtSearchBox.AuthorCondition).Any();
  2333. }
  2334. }
  2335. private void SubjectToggle_Click(object sender, RoutedEventArgs e) {
  2336. var dat = new StringSearchCriteriaDialog("subject", edtSearchBox.SubjectCondition, FindResource("btnSubjectCP") as string);
  2337. dat.ShowDialog();
  2338. if (dat.Confirm) {
  2339. edtSearchBox.SubjectCondition = "subject:" + dat.textBox1.Text;
  2340. SubjectToggle.IsChecked = dat.textBox1.Text.Any();
  2341. } else {
  2342. SubjectToggle.IsChecked = Utilities.GetValueOnly("subject", edtSearchBox.SubjectCondition).Any();
  2343. }
  2344. }
  2345. private void miCustomSize_Click(object sender, RoutedEventArgs e) {
  2346. var dat = new SizeSearchCriteriaDialog();
  2347. string sd = Utilities.GetValueOnly("size", edtSearchBox.SizeCondition);
  2348. dat.curval.Text = sd;
  2349. dat.ShowDialog();
  2350. if (dat.Confirm) {
  2351. edtSearchBox.SizeCondition = "size:" + dat.GetSizeQuery();
  2352. scSize.IsChecked = dat.GetSizeQuery().Any();
  2353. } else {
  2354. scSize.IsChecked = dat.GetSizeQuery().Length > 5;
  2355. }
  2356. }
  2357. private void dcCustomTime_Click(object sender, RoutedEventArgs e) {
  2358. var star = new SDateSearchCriteriaDialog(FindResource("btnODateCCP") as string);
  2359. star.DateCriteria = Utilities.GetValueOnly("date", edtSearchBox.DateCondition);
  2360. //star.textBlock1.Text = "Set Date Created Filter";
  2361. star.ShowDialog();
  2362. if (star.Confirm) edtSearchBox.DateCondition = "date:" + star.DateCriteria;
  2363. dcsplit.IsChecked = edtSearchBox.UseDateCondition;
  2364. }
  2365. private void dmCustomTime_Click(object sender, RoutedEventArgs e) {
  2366. var star = new SDateSearchCriteriaDialog(FindResource("btnODateModCP") as string);
  2367. star.DateCriteria = Utilities.GetValueOnly("modified", edtSearchBox.ModifiedCondition);
  2368. //star.textBlock1.Text = "Set Date Modified Filter";
  2369. star.ShowDialog();
  2370. if (star.Confirm) edtSearchBox.ModifiedCondition = "modified:" + star.DateCriteria;
  2371. dmsplit.IsChecked = edtSearchBox.UseModifiedCondition;
  2372. }
  2373. #endregion
  2374. #region AutoSwitch
  2375. private void chkFolder_CheckChanged(object sender, RoutedEventArgs e) => BESettings.AutoSwitchFolderTools = e.RoutedEvent.Name == "Checked";
  2376. private void chkDrive_CheckChanged(object sender, RoutedEventArgs e) => BESettings.AutoSwitchDriveTools = e.RoutedEvent.Name == "Checked";
  2377. private void chkArchive_CheckChanged(object sender, RoutedEventArgs e) => BESettings.AutoSwitchArchiveTools = e.RoutedEvent.Name == "Checked";
  2378. private void chkApp_CheckChanged(object sender, RoutedEventArgs e) => BESettings.AutoSwitchApplicationTools = e.RoutedEvent.Name == "Checked";
  2379. private void chkImage_CheckChanged(object sender, RoutedEventArgs e) => BESettings.AutoSwitchImageTools = e.RoutedEvent.Name == "Checked";
  2380. private void chkLibrary_CheckChanged(object sender, RoutedEventArgs e) => BESettings.AutoSwitchLibraryTools = e.RoutedEvent.Name == "Checked";
  2381. private void chkVirtualTools_CheckChanged(object sender, RoutedEventArgs e) => BESettings.AutoSwitchVirtualDriveTools = e.RoutedEvent.Name == "Checked";
  2382. #endregion
  2383. #region Tabs
  2384. private void btnNewTab_Click(object sender, RoutedEventArgs e) => tcMain.NewTab();
  2385. private void btnTabClone_Click(object sender, RoutedEventArgs e) => tcMain.CloneTabItem(tcMain.SelectedItem as Wpf.Controls.TabItem);
  2386. private void btnTabCloseC_Click(object sender, RoutedEventArgs e) => tcMain.RemoveTabItem(tcMain.SelectedItem as Wpf.Controls.TabItem);
  2387. private void RibbonWindow_SizeChanged(object sender, SizeChangedEventArgs e) => (tcMain.SelectedItem as Wpf.Controls.TabItem)?.BringIntoView();
  2388. void newt_PreviewMouseDown(object sender, MouseButtonEventArgs e) => tcMain.IsInTabDragDrop = false;
  2389. void newt_Leave(object sender, DragEventArgs e) => DropTarget.Create.DragLeave();
  2390. void mim_Click(object sender, RoutedEventArgs e) => SetFOperation(((sender as MenuItem).Tag as IListItemEx), OperationType.Move);
  2391. void mico_Click(object sender, RoutedEventArgs e) => SetFOperation(((sender as MenuItem).Tag as IListItemEx), OperationType.Copy);
  2392. private void btnUndoClose_Click(object sender, RoutedEventArgs e) {
  2393. tcMain.ReOpenTab(tcMain.ReopenableTabs[tcMain.ReopenableTabs.Count - 1]);
  2394. btnUndoClose.IsEnabled = tcMain.ReopenableTabs.Any();
  2395. }
  2396. void gli_Click(object sender, NavigationLogEventArgs e) {
  2397. tcMain.ReOpenTab(e.NavigationLog);
  2398. btnUndoClose.IsEnabled = tcMain.ReopenableTabs.Any();
  2399. }
  2400. void gli_Click(object sender, Tuple<string> e) {
  2401. var list = SaveTabs.LoadTabList($"{BESettings.SavedTabsDirectory}{e.Item1}.txt");
  2402. if (list.Count > 0) {
  2403. foreach (var tabItem in tcMain.Items.OfType<Wpf.Controls.TabItem>().ToArray()) {
  2404. tcMain.RemoveTabItem(tabItem, true, true);
  2405. }
  2406. }
  2407. for (int i = 0; i < list.Count; i++) {
  2408. var tabitem = tcMain.NewTab(list[i].ToShellParsingName());
  2409. if (i == list.Count - 1)
  2410. tcMain.SelectedItem = tabitem;
  2411. }
  2412. }
  2413. private void GoToSearchBox(object sender, ExecutedRoutedEventArgs e) {
  2414. edtSearchBox.Focus();
  2415. Keyboard.Focus(edtSearchBox);
  2416. }
  2417. void newt_PreviewMouseMove(object sender, MouseEventArgs e) {
  2418. var tabItem = e.Source as Wpf.Controls.TabItem;
  2419. if (tabItem == null)
  2420. tcMain.IsInTabDragDrop = false;
  2421. else if (Mouse.PrimaryDevice.LeftButton == MouseButtonState.Pressed)
  2422. DragDrop.DoDragDrop(tabItem, tabItem, DragDropEffects.All);
  2423. }
  2424. void newt_Drop(object sender, DragEventArgs e) {
  2425. e.Handled = true;
  2426. var tabItemTarget = e.Source as Wpf.Controls.TabItem;
  2427. var tabItemSource = e.Data.GetData(typeof(Wpf.Controls.TabItem)) as Wpf.Controls.TabItem;
  2428. if (tabItemSource == null) {
  2429. if ((sender as Wpf.Controls.TabItem).ShellObject.IsFileSystem) {
  2430. e.Effects = (e.KeyStates & DragDropKeyStates.ControlKey) == DragDropKeyStates.ControlKey ? DragDropEffects.Copy : DragDropEffects.Move;
  2431. switch (e.Effects) {
  2432. case DragDropEffects.All:
  2433. break;
  2434. case DragDropEffects.Copy:
  2435. this._ShellListView.DoCopy(e.Data, (sender as Wpf.Controls.TabItem).ShellObject);
  2436. break;
  2437. case DragDropEffects.Link:
  2438. break;
  2439. case DragDropEffects.Move:
  2440. this._ShellListView.DoMove(e.Data, (sender as Wpf.Controls.TabItem).ShellObject);
  2441. break;
  2442. case DragDropEffects.None:
  2443. break;
  2444. case DragDropEffects.Scroll:
  2445. break;
  2446. default:
  2447. break;
  2448. }
  2449. } else {
  2450. e.Effects = DragDropEffects.None;
  2451. }
  2452. WIN.Point pt = e.GetPosition(sender as IInputElement);
  2453. var wpt = new BExplorer.Shell.DataObject.Win32Point() { X = (int)pt.X, Y = (int)pt.Y };
  2454. DropTarget.Create.Drop((System.Runtime.InteropServices.ComTypes.IDataObject)e.Data, ref wpt, (int)e.Effects);
  2455. this._TabDropData = null;
  2456. } else if (!tabItemTarget.Equals(tabItemSource)) {
  2457. var tabControl = tabItemTarget.Parent as TabControl;
  2458. int targetIndex = tabControl.Items.IndexOf(tabItemTarget);
  2459. int tabState = tabItemSource == this._CurrentlySelectedItem ? 0 : 1;
  2460. tabControl.Items.Remove(tabItemSource);
  2461. tabControl.Items.Insert(targetIndex, tabItemSource);
  2462. tcMain.IsInTabDragDrop = false;
  2463. if (tabState == 1)
  2464. tabControl.SelectedItem = this._CurrentlySelectedItem;
  2465. else if (tabState == 0)
  2466. tabControl.SelectedIndex = targetIndex;
  2467. tcMain.IsInTabDragDrop = true;
  2468. }
  2469. //tcMain.IsSelectionHandled = false;
  2470. }
  2471. void newt_DragOver(object sender, DragEventArgs e) {
  2472. e.Handled = true;
  2473. var tabItemSource = e.Data.GetData(typeof(Wpf.Controls.TabItem)) as Wpf.Controls.TabItem;
  2474. if ((sender as Wpf.Controls.TabItem).ShellObject.IsFileSystem)
  2475. e.Effects = (e.KeyStates & DragDropKeyStates.ControlKey) == DragDropKeyStates.ControlKey ? DragDropEffects.Copy : DragDropEffects.Move;
  2476. else if (tabItemSource != null)
  2477. e.Effects = DragDropEffects.Move;
  2478. else
  2479. e.Effects = DragDropEffects.None;
  2480. var desc = new BExplorer.Shell.DataObject.DropDescription();
  2481. switch (e.Effects) {
  2482. case DragDropEffects.Copy:
  2483. desc.type = (int)BExplorer.Shell.DataObject.DropImageType.Copy;
  2484. desc.szMessage = "Copy To %1";
  2485. break;
  2486. case DragDropEffects.Move:
  2487. desc.type = (int)BExplorer.Shell.DataObject.DropImageType.Move;
  2488. desc.szMessage = "Move To %1";
  2489. break;
  2490. case DragDropEffects.None:
  2491. desc.type = (int)BExplorer.Shell.DataObject.DropImageType.None;
  2492. desc.szMessage = "Cant drop here!";
  2493. break;
  2494. default:
  2495. desc.type = (int)BExplorer.Shell.DataObject.DropImageType.Invalid;
  2496. desc.szMessage = "";
  2497. break;
  2498. }
  2499. desc.szInsert = (sender as Wpf.Controls.TabItem).ShellObject.DisplayName;
  2500. ((System.Runtime.InteropServices.ComTypes.IDataObject)e.Data).SetDropDescription(desc);
  2501. var ptw = new BExplorer.Shell.DataObject.Win32Point();
  2502. GetCursorPos(ref ptw);
  2503. if (e.Data.GetType() != typeof(Wpf.Controls.TabItem)) {
  2504. var wpt = new BExplorer.Shell.DataObject.Win32Point() { X = ptw.X, Y = ptw.Y };
  2505. DropTarget.Create.DragOver(ref wpt, (int)e.Effects);
  2506. }
  2507. }
  2508. System.Runtime.InteropServices.ComTypes.IDataObject _TabDropData;
  2509. void newt_DragEnter(object sender, DragEventArgs e) {
  2510. e.Handled = true;
  2511. this._CurrentlySelectedItem = tcMain.SelectedItem as Wpf.Controls.TabItem;
  2512. var tabItem = e.Source as Wpf.Controls.TabItem;
  2513. if (tabItem == null) return;
  2514. this._TabDropData = (System.Runtime.InteropServices.ComTypes.IDataObject)e.Data;
  2515. if ((sender as Wpf.Controls.TabItem).ShellObject.IsFileSystem)
  2516. e.Effects = (e.KeyStates & DragDropKeyStates.ControlKey) == DragDropKeyStates.ControlKey ? DragDropEffects.Copy : DragDropEffects.Move;
  2517. else
  2518. e.Effects = DragDropEffects.None;
  2519. var ptw = new BExplorer.Shell.DataObject.Win32Point();
  2520. GetCursorPos(ref ptw);
  2521. e.Effects = DragDropEffects.None;
  2522. var tabItemSource = e.Data.GetData(typeof(Wpf.Controls.TabItem)) as Wpf.Controls.TabItem;
  2523. if (tabItemSource == null) {
  2524. var wpt = new BExplorer.Shell.DataObject.Win32Point() { X = ptw.X, Y = ptw.Y };
  2525. DropTarget.Create.DragEnter(this.Handle, (System.Runtime.InteropServices.ComTypes.IDataObject)e.Data, ref wpt, (int)e.Effects);
  2526. } else if (e.Data.GetDataPresent(typeof(Wpf.Controls.TabItem))) {
  2527. e.Effects = DragDropEffects.Move;
  2528. }
  2529. }
  2530. #endregion
  2531. #region Tab Controls
  2532. private void FolderTabs_Placement(object sender, RoutedEventArgs e) {
  2533. if (sender == TabbaTop) {
  2534. Grid.SetRow(this.tcMain, 3);
  2535. divNav.Visibility = Visibility.Hidden;
  2536. this.rTabbarTop.Height = new GridLength(25);
  2537. this.rTabbarBot.Height = new GridLength(0);
  2538. this.tcMain.TabStripPlacement = Dock.Top;
  2539. } else {
  2540. Grid.SetRow(this.tcMain, 7);
  2541. divNav.Visibility = Visibility.Visible;
  2542. this.rTabbarTop.Height = new GridLength(0);
  2543. this.rTabbarBot.Height = new GridLength(25);
  2544. this.tcMain.TabStripPlacement = Dock.Bottom;
  2545. }
  2546. }
  2547. private void miSaveCurTabs_Click(object sender, RoutedEventArgs e) {
  2548. var objs = new List<IListItemEx>(from Wpf.Controls.TabItem x in tcMain.Items select x.ShellObject);
  2549. String str = Utilities.CombinePaths(objs, "|");
  2550. var list = SaveTabs.CreateFromString(str);
  2551. var Name = BetterExplorer.Tabs.NameTabList.Open(this);
  2552. if (Name == null) return;
  2553. if (!Directory.Exists(BESettings.SavedTabsDirectory))
  2554. Directory.CreateDirectory(BESettings.SavedTabsDirectory);
  2555. SaveTabs.SaveTabList(list, $"{BESettings.SavedTabsDirectory}{Name}.txt");
  2556. miTabManager.IsEnabled = true;
  2557. }
  2558. private void miClearUndoList_Click(object sender, RoutedEventArgs e) {
  2559. tcMain.ReopenableTabs.Clear();
  2560. btnUndoClose.IsDropDownOpen = false;
  2561. btnUndoClose.IsEnabled = false;
  2562. foreach (var item in
  2563. from Item in this.tcMain.Items.OfType<Wpf.Controls.TabItem>()
  2564. from m in Item.mnu.Items.OfType<MenuItem>()
  2565. where m.Tag?.ToString() == "UCTI"
  2566. select m) {
  2567. item.IsEnabled = false;
  2568. }
  2569. }
  2570. private void btnUndoClose_DropDownOpened(object sender, EventArgs e) {
  2571. rotGallery.Items.Clear();
  2572. foreach (NavigationLog item in tcMain.ReopenableTabs) {
  2573. var gli = new UndoCloseGalleryItem();
  2574. gli.LoadData(item);
  2575. gli.Click += gli_Click;
  2576. rotGallery.Items.Add(gli);
  2577. }
  2578. }
  2579. private void rotGallery_SelectionChanged(object sender, SelectionChangedEventArgs e) {
  2580. e.Handled = true;
  2581. var Item = (e.AddedItems[0] as UndoCloseGalleryItem);
  2582. Item?.PerformClickEvent();
  2583. }
  2584. private void btnChangeTabsFolder_Click(object sender, RoutedEventArgs e) {
  2585. var ctf = new FolderSelectDialog();
  2586. ctf.Title = "Change Tab Folder";
  2587. ctf.InitialDirectory = new DirectoryInfo(BESettings.SavedTabsDirectory).Parent.FullName;
  2588. if (ctf.ShowDialog()) {
  2589. BESettings.SavedTabsDirectory = ctf.FileName + "\\";
  2590. BESettings.SaveSettings();
  2591. txtDefSaveTabs.Text = ctf.FileName + "\\";
  2592. }
  2593. }
  2594. private void stGallery_SelectionChanged(object sender, SelectionChangedEventArgs e) {
  2595. e.Handled = true;
  2596. if (e.AddedItems.Count > 0)
  2597. (e.AddedItems[0] as SavedTabsListGalleryItem).PerformClickEvent();
  2598. }
  2599. private void btnSavedTabs_DropDownOpened(object sender, EventArgs e) {
  2600. var o = new List<string>();
  2601. if (Directory.Exists(BESettings.SavedTabsDirectory)) {
  2602. foreach (string item in Directory.GetFiles(BESettings.SavedTabsDirectory)) {
  2603. o.Add(Utilities.RemoveExtensionsFromFile(new ShellItem(item).GetDisplayName(SIGDN.NORMALDISPLAY), item.Substring(item.LastIndexOf("."))));
  2604. }
  2605. }
  2606. stGallery.Items.Clear();
  2607. foreach (string item in o) {
  2608. var gli = new SavedTabsListGalleryItem(item);
  2609. gli.Directory = BESettings.SavedTabsDirectory;
  2610. gli.Click += gli_Click;
  2611. gli.SetUpTooltip((FindResource("tabTabsCP") as string));
  2612. stGallery.Items.Add(gli);
  2613. }
  2614. }
  2615. private void miTabManager_Click(object sender, RoutedEventArgs e) {
  2616. string sstdir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\BExplorer_SavedTabs\\";
  2617. if (Directory.Exists(sstdir)) new Tabs.TabManager() { MainForm = this }.Show();
  2618. }
  2619. #endregion
  2620. #region Recycle Bin
  2621. BackgroundWorker rb = new BackgroundWorker();
  2622. public void UpdateRecycleBinInfos() {
  2623. var allDrives = Directory.GetLogicalDrives();
  2624. int count = 0;// (int)sqrbi.i64NumItems;
  2625. long size = 0;// sqrbi.i64Size;
  2626. //Task.Run(() => {
  2627. foreach (var drive in allDrives) {
  2628. var sqrbi = new BExplorer.Shell.Interop.Shell32.SHQUERYRBINFO() { cbSize = 24 };
  2629. //char[] charsToTrim = { Char.Parse(@"\") };
  2630. int hresult = BExplorer.Shell.Interop.Shell32.SHQueryRecycleBin(drive, ref sqrbi);
  2631. count += (int)sqrbi.i64NumItems;
  2632. size += (long)sqrbi.i64Size;
  2633. }
  2634. Dispatcher.Invoke(DispatcherPriority.Background,
  2635. (Action)(() => {
  2636. if (count > 0) {
  2637. miRestoreALLRB.Visibility = Visibility.Visible;
  2638. miEmptyRB.Visibility = Visibility.Visible;
  2639. btnRecycleBin.LargeIcon = @"..\Images\RecycleBinFull32.png";
  2640. btnRecycleBin.Icon = @"..\Images\RecycleBinFull16.png";
  2641. btnRecycleBin.UpdateLayout();
  2642. lblRBItems.Visibility = Visibility.Visible;
  2643. lblRBItems.Text = String.Format("{0} Items", count);
  2644. lblRBSize.Text = ShlWapi.StrFormatByteSize(size);
  2645. lblRBSize.Visibility = Visibility.Visible;
  2646. } else {
  2647. miEmptyRB.Visibility = Visibility.Collapsed;
  2648. miRestoreALLRB.Visibility = Visibility.Collapsed;
  2649. miRestoreRBItems.Visibility = Visibility.Collapsed;
  2650. btnRecycleBin.LargeIcon = @"..\Images\RecycleBinEmpty32.png";
  2651. btnRecycleBin.Icon = @"..\Images\RecycleBinEmpty16.png";
  2652. lblRBItems.Text = "0 Items";
  2653. lblRBItems.Visibility = Visibility.Collapsed;
  2654. lblRBSize.Text = "0 bytes";
  2655. lblRBSize.Visibility = Visibility.Collapsed;
  2656. }
  2657. }));
  2658. }
  2659. private void miEmptyRB_Click(object sender, RoutedEventArgs e) {
  2660. BExplorer.Shell.Interop.Shell32.SHEmptyRecycleBin(this.Handle, string.Empty, 0);
  2661. UpdateRecycleBinInfos();
  2662. }
  2663. private void miOpenRB_Click(object sender, RoutedEventArgs e) {
  2664. NavigationController(FileSystemListItem.ToFileSystemItem(IntPtr.Zero, ((ShellItem)KnownFolders.RecycleBin).Pidl));
  2665. }
  2666. private void miRestoreRBItems_Click(object sender, RoutedEventArgs e) {
  2667. foreach (var item in _ShellListView.SelectedItems.ToArray()) {
  2668. Folder Recycler = new Shell().NameSpace(10);
  2669. for (int i = 0; i < Recycler.Items().Count; i++) {
  2670. Shell32.FolderItem FI = Recycler.Items().Item(i);
  2671. string FileName = Recycler.GetDetailsOf(FI, 0);
  2672. if (Path.GetExtension(FileName) == "") FileName += Path.GetExtension(FI.Path);
  2673. //Necessary for systems with hidden file extensions.
  2674. string FilePath = Recycler.GetDetailsOf(FI, 1);
  2675. if (item.FileSystemPath == Path.Combine(FilePath, FileName)) {
  2676. DoVerb(FI, "ESTORE");
  2677. break;
  2678. }
  2679. }
  2680. }
  2681. UpdateRecycleBinInfos();
  2682. }
  2683. private bool DoVerb(FolderItem Item, string Verb) {
  2684. var Found = Item.Verbs().OfType<FolderItemVerb>().FirstOrDefault(FIVerb => FIVerb.Name.ToUpper().Contains(Verb.ToUpper()));
  2685. Found?.DoIt();
  2686. return Found != null;
  2687. }
  2688. private void miRestoreALLRB_Click(object sender, RoutedEventArgs e) {
  2689. //TODO: Fix Unreachable Code
  2690. Folder Recycler = new Shell().NameSpace(10);
  2691. for (int i = 0; i < Recycler.Items().Count; i++) {
  2692. FolderItem FI = Recycler.Items().Item(i);
  2693. DoVerb(FI, "ESTORE");
  2694. //TODO: Why do we have a break here
  2695. break;
  2696. }
  2697. UpdateRecycleBinInfos();
  2698. }
  2699. #endregion
  2700. #region Console
  2701. private void ConsoleClear_Click(object sender, RoutedEventArgs e) => this.ctrlConsole.ClearConsole();
  2702. void cmi_Click(object sender, RoutedEventArgs e) => this.ctrlConsole.EnqueleInput((sender as Fluent.MenuItem).Header.ToString());
  2703. private void ctrlConsole_OnConsoleInput(object sender, Tuple<string> args) {
  2704. if (args.Item1.Trim().ToLowerInvariant().StartsWith("cd"))
  2705. NavigationController(FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, args.Item1.ToLowerInvariant().Replace("cd", String.Empty).Replace("/d", String.Empty).Trim()));
  2706. var cmi = new MenuItem() { Header = args.Item1 };
  2707. cmi.Click += cmi_Click;
  2708. this.btnConsoleHistory.Items.Add(cmi);
  2709. }
  2710. #endregion
  2711. #region EasyAccess
  2712. private void btnEasyAccess_DropDownOpened(object sender, EventArgs e) {
  2713. if (_ShellListView.GetSelectedCount() == 1 && _ShellListView.GetFirstSelectedItem().IsFolder) {
  2714. mnuIncludeInLibrary.Items.Clear();
  2715. foreach (ShellItem lib in KnownFolders.Libraries) {
  2716. lib.Thumbnail.CurrentSize = new WIN.Size(16, 16);
  2717. mnuIncludeInLibrary.Items.Add(Utilities.Build_MenuItem(
  2718. lib.DisplayName, ShellLibrary.Load(Path.GetFileNameWithoutExtension(lib.ParsingName), true), lib.Thumbnail.BitmapSource, onClick: mli_Click)
  2719. );
  2720. }
  2721. mnuIncludeInLibrary.Items.Add(new Separator());
  2722. var mln = new MenuItem() { Header = "Create new library" };
  2723. mln.Click += mln_Click;
  2724. mnuIncludeInLibrary.Items.Add(mln);
  2725. mnuIncludeInLibrary.IsEnabled = true;
  2726. } else {
  2727. mnuIncludeInLibrary.IsEnabled = false;
  2728. }
  2729. }
  2730. void mln_Click(object sender, RoutedEventArgs e) {
  2731. var lib = _ShellListView.CreateNewLibrary(_ShellListView.GetFirstSelectedItem().DisplayName);
  2732. if (_ShellListView.GetFirstSelectedItem().IsFolder)
  2733. lib.Add(_ShellListView.GetFirstSelectedItem().ParsingName);
  2734. }
  2735. void mli_Click(object sender, RoutedEventArgs e) {
  2736. var lib = ShellLibrary.Load(Path.GetFileNameWithoutExtension(((ShellItem)(sender as Fluent.MenuItem).Tag).ParsingName), false);
  2737. if (_ShellListView.GetFirstSelectedItem().IsFolder)
  2738. lib.Add(_ShellListView.GetFirstSelectedItem().ParsingName);
  2739. }
  2740. #endregion
  2741. #region ShellListView
  2742. void ShellListView_EndItemLabelEdit(object sender, bool e) {
  2743. //_ShellListView.FileNameChangeAttempt(this.txtEditor.Text, e);
  2744. //this.Editor.Visibility = WIN.Visibility.Collapsed;
  2745. //this.Editor.IsOpen = false;
  2746. }
  2747. void ShellListView_BeginItemLabelEdit(object sender, RenameEventArgs e) {
  2748. //if (this.Editor.IsOpen) return;
  2749. //var isSmall = this._ShellListView.IconSize == 16;
  2750. //if (isSmall) {
  2751. // this.txtEditor.TextWrapping = TextWrapping.WrapWithOverflow;
  2752. // this.txtEditor.TextAlignment = TextAlignment.Left;
  2753. //} else {
  2754. // this.txtEditor.TextWrapping = TextWrapping.Wrap;
  2755. // this.txtEditor.TextAlignment = TextAlignment.Center;
  2756. //}
  2757. //var itemRect = this._ShellListView.GetItemBounds(e.ItemIndex, 0);
  2758. //var itemLabelRect = this._ShellListView.GetItemBounds(e.ItemIndex, 2);
  2759. //this.txtEditor.Text = this._ShellListView.Items[e.ItemIndex].DisplayName;
  2760. //var point = this.ShellViewHost.PointToScreen(new WIN.Point(isSmall ? itemLabelRect.Left : itemRect.Left, itemLabelRect.Top - (isSmall ? 1 : 0)));
  2761. //this.Editor.HorizontalOffset = point.X;
  2762. //this.Editor.VerticalOffset = point.Y;
  2763. //this.txtEditor.MaxWidth = isSmall ? Double.PositiveInfinity : itemRect.Width;
  2764. //this.txtEditor.MaxHeight = isSmall ? itemLabelRect.Height + 2 : Double.PositiveInfinity;
  2765. //this.Editor.Width = isSmall ? this.txtEditor.Width : itemRect.Width;
  2766. //this.Editor.Height = this.txtEditor.Height + 2;
  2767. //this.Editor.Visibility = WIN.Visibility.Visible;
  2768. //this.Editor.IsOpen = true;
  2769. //this.txtEditor.Focus();
  2770. //var isCheckedExtensions = this.chkExtensions.IsChecked;
  2771. //if (isCheckedExtensions != null && (isCheckedExtensions.Value & this.txtEditor.Text.Contains(".") && !this._ShellListView.GetFirstSelectedItem().IsFolder)) {
  2772. // var lastIndexOfDot = this.txtEditor.Text.LastIndexOf(".", StringComparison.Ordinal);
  2773. // this.txtEditor.SelectionStart = 0;
  2774. // this.txtEditor.SelectionLength = lastIndexOfDot;
  2775. //} else {
  2776. // this.txtEditor.SelectAll();
  2777. //}
  2778. //Keyboard.Focus(this.txtEditor);
  2779. }
  2780. void ShellListView_Navigating(object sender, NavigatingEventArgs e) {
  2781. if (this._ShellListView.CurrentFolder == null) return;
  2782. Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
  2783. this.btnCancelNavigation.Visibility = Visibility.Visible;
  2784. this.btnGoNavigation.Visibility = Visibility.Collapsed;
  2785. this._ProgressTimer.Start();
  2786. }));
  2787. if (this.bcbc.RootItem.Items.OfType<ShellItem>().Last().IsSearchFolder) {
  2788. this.bcbc.RootItem.Items.RemoveAt(this.bcbc.RootItem.Items.Count - 1);
  2789. }
  2790. var pidl = e.Folder.PIDL.ToString();
  2791. this.bcbc.SetPathWithoutNavigate(pidl);
  2792. Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
  2793. var tab = tcMain.SelectedItem as Wpf.Controls.TabItem;
  2794. if (tab != null && this._ShellListView.GetSelectedCount() > 0) {
  2795. if (tab.SelectedItems != null)
  2796. tab.SelectedItems.AddRange(this._ShellListView.SelectedItems.Select(s => s.ParsingName).ToList());
  2797. else
  2798. tab.SelectedItems = this._ShellListView.SelectedItems.Select(s => s.ParsingName).ToList();
  2799. }
  2800. this.Title = "Better Explorer - " + e.Folder.DisplayName;
  2801. }));
  2802. if (e.Folder.IsSearchFolder) {
  2803. Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
  2804. var selectedTabItem = tcMain.SelectedItem as Wpf.Controls.TabItem;
  2805. if (selectedTabItem != null) {
  2806. selectedTabItem.Header = e.Folder.DisplayName;
  2807. selectedTabItem.Icon = e.Folder.ThumbnailSource(16, ShellThumbnailFormatOption.IconOnly, ShellThumbnailRetrievalOption.Default);
  2808. selectedTabItem.ShellObject = e.Folder;
  2809. selectedTabItem.ToolTip = e.Folder.ParsingName.Replace("%20", " ").Replace("%3A", ":").Replace("%5C", @"\");
  2810. }
  2811. }));
  2812. } else {
  2813. edtSearchBox.ClearSearchText();
  2814. }
  2815. this._ShellListView.Focus();
  2816. }
  2817. void ShellTree_NodeClick(object sender, WIN.Forms.TreeNodeMouseClickEventArgs e) {
  2818. if (e.Button == WIN.Forms.MouseButtons.Middle) {
  2819. var item = e.Node?.Tag as IListItemEx;
  2820. if ((item?.IsLink).Value) {
  2821. var shellLink = new ShellLink(item.ParsingName);
  2822. item = FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, shellLink.TargetPIDL);
  2823. shellLink.Dispose();
  2824. }
  2825. if (item != null) tcMain.NewTab(item, false);
  2826. }
  2827. }
  2828. WIN.Forms.Timer _keyjumpTimer = new WIN.Forms.Timer();
  2829. void ShellListView_KeyJumpTimerDone(object sender, EventArgs e) { _keyjumpTimer?.Stop(); _keyjumpTimer?.Start(); }
  2830. void _keyjumpTimer_Tick(object sender, EventArgs e) {
  2831. //key jump done
  2832. KeyJumpGrid.IsOpen = false;
  2833. var timer = sender as WIN.Forms.Timer;
  2834. timer?.Stop();
  2835. }
  2836. void ShellListView_KeyJumpKeyDown(object sender, WIN.Forms.KeyEventArgs e) {
  2837. //add key for key jump
  2838. KeyJumpGrid.IsOpen = true;
  2839. txtKeyJump.Text = _ShellListView.KeyJumpString;
  2840. }
  2841. void ShellListView_ColumnHeaderRightClick(object sender, WIN.Forms.MouseEventArgs e) {
  2842. //is where the more columns menu should be added
  2843. chcm.IsOpen = true;
  2844. }
  2845. void ShellListView_ItemUpdated(object sender, ItemUpdatedEventArgs e) {
  2846. Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
  2847. if (e.UpdateType == ItemUpdateType.RecycleBin) {
  2848. this.UpdateRecycleBinInfos();
  2849. }
  2850. if (e.UpdateType != ItemUpdateType.Renamed && e.UpdateType != ItemUpdateType.Updated) {
  2851. var itemsCount = _ShellListView.Items.Count;
  2852. sbiItemsCount.Visibility = itemsCount == 0 ? Visibility.Collapsed : Visibility.Visible;
  2853. sbiItemsCount.Content = itemsCount == 1 ? "1 item" : itemsCount + " items";
  2854. }
  2855. //if (e.UpdateType == ItemUpdateType.Created && this._ShellListView.IsRenameNeeded) {
  2856. // _ShellListView.SelectItemByIndex(e.NewItemIndex, true, true);
  2857. // _ShellListView.RenameSelectedItem();
  2858. // this._ShellListView.IsRenameNeeded = false;
  2859. //}
  2860. if (e.UpdateType == ItemUpdateType.DriveRemoved || (e.UpdateType == ItemUpdateType.Deleted && e.NewItem.IsFolder)) {
  2861. foreach (var tab in this.tcMain.Items.OfType<Wpf.Controls.TabItem>().ToArray().Where(w => w.ShellObject.ParsingName.StartsWith(e.NewItem.ParsingName))) {
  2862. this.tcMain.RemoveTabItem(tab, false);
  2863. }
  2864. }
  2865. this._ShellListView.Focus();
  2866. }));
  2867. }
  2868. void ShellListView_SelectionChanged(object sender, EventArgs e) {
  2869. if (!this._ShellListView.IsNavigationInProgress && !this._ShellListView.IsSearchNavigating)
  2870. SetupUIOnSelectOrNavigate();
  2871. if (BESettings.IsInfoPaneEnabled) Task.Run(() => this.DetailsPanel.FillPreviewPane(this._ShellListView));
  2872. SetUpStatusBarOnSelectOrNavigate(_ShellListView.GetSelectedCount());
  2873. }
  2874. #endregion
  2875. #region On Navigated
  2876. void ShellListView_Navigated(object sender, NavigatedEventArgs e) {
  2877. this._ProgressTimer.Stop();
  2878. this.btnCancelNavigation.Visibility = Visibility.Collapsed;
  2879. this.btnGoNavigation.Visibility = Visibility.Visible;
  2880. SetupUIOnSelectOrNavigate();
  2881. Dispatcher.BeginInvoke(DispatcherPriority.Background, (ThreadStart)(() => {
  2882. SetupColumnsButton();
  2883. SetSortingAndGroupingButtons();
  2884. if (!tcMain.isGoingBackOrForward) {
  2885. var Current = (tcMain.SelectedItem as Wpf.Controls.TabItem).log;
  2886. Current.ClearForwardItems();
  2887. if (Current.CurrentLocation != e.Folder) Current.CurrentLocation = e.Folder;
  2888. }
  2889. tcMain.isGoingBackOrForward = false;
  2890. SetupUIonNavComplete(e);
  2891. if (Settings.BESettings.IsConsoleShown)
  2892. ctrlConsole.ChangeFolder(e.Folder.ParsingName, e.Folder.IsFileSystem);
  2893. }));
  2894. Dispatcher.BeginInvoke(DispatcherPriority.Background, (ThreadStart)(() => {
  2895. ConstructMoveToCopyToMenu();
  2896. SetUpJumpListOnNavComplete();
  2897. SetUpButtonVisibilityOnNavComplete(SetUpNewFolderButtons());
  2898. }));
  2899. if (BESettings.IsInfoPaneEnabled) {
  2900. Task.Run(() => {
  2901. this.DetailsPanel.FillPreviewPane(this._ShellListView);
  2902. });
  2903. }
  2904. Dispatcher.Invoke(DispatcherPriority.Render, (Action)(() => {
  2905. this._ShellListView.Focus(false, true);
  2906. var selectedItem = this.tcMain.SelectedItem as Wpf.Controls.TabItem;
  2907. if (selectedItem == null) {
  2908. this.tcMain.SelectedItem = this.tcMain.Items.OfType<Wpf.Controls.TabItem>().Last();
  2909. selectedItem = this.tcMain.SelectedItem as Wpf.Controls.TabItem;
  2910. }
  2911. var oldCurrentItem = selectedItem.ShellObject;
  2912. var curentFolder = this._ShellListView.CurrentFolder.Clone();
  2913. selectedItem.Header = this._ShellListView.CurrentFolder.DisplayName;
  2914. selectedItem.Icon = curentFolder.ThumbnailSource(16, ShellThumbnailFormatOption.IconOnly, ShellThumbnailRetrievalOption.Default);
  2915. selectedItem.ShellObject = this._ShellListView.CurrentFolder;
  2916. if (selectedItem != null) {
  2917. var selectedPaths = selectedItem.SelectedItems;
  2918. if (selectedPaths?.Count > 0) {
  2919. foreach (var path in selectedPaths.ToArray()) {
  2920. var sho = this._ShellListView.Items.FirstOrDefault(w => w.ParsingName == path);
  2921. if (sho != null) {
  2922. var index = sho.ItemIndex;
  2923. this._ShellListView.SelectItemByIndex(index, path.Equals(selectedPaths.Last(), StringComparison.InvariantCultureIgnoreCase) || this.IsNeedEnsureVisible);
  2924. this.IsNeedEnsureVisible = false;
  2925. selectedPaths.Remove(path);
  2926. }
  2927. }
  2928. } else {
  2929. var realItem = this._ShellListView.Items.ToArray().FirstOrDefault(w => w.GetUniqueID() == oldCurrentItem.GetUniqueID());
  2930. if (realItem != null) {
  2931. this._ShellListView.SelectItems(new[] { realItem });
  2932. } else {
  2933. if (!curentFolder.ParsingName.Contains(oldCurrentItem.ParsingName)) {
  2934. var parents = new List<IListItemEx>();
  2935. var parent = oldCurrentItem.Parent;
  2936. while (parent != null) {
  2937. parents.Add(parent);
  2938. realItem = this._ShellListView.Items.ToArray().FirstOrDefault(w => w.GetUniqueID() == parent.GetUniqueID());
  2939. if (realItem != null) {
  2940. this._ShellListView.SelectItems(new[] { realItem });
  2941. break;
  2942. }
  2943. parent = parent.Parent;
  2944. }
  2945. }
  2946. }
  2947. //this._ShellListView.ScrollToTop();
  2948. }
  2949. }
  2950. oldCurrentItem.Dispose();
  2951. curentFolder.Dispose();
  2952. }));
  2953. ////This initially setup the statusbar after program opens
  2954. Dispatcher.BeginInvoke(DispatcherPriority.Background, (ThreadStart)(() => {
  2955. this.SetUpStatusBarOnSelectOrNavigate(_ShellListView.SelectedItems == null ? 0 : _ShellListView.GetSelectedCount());
  2956. }));
  2957. //Dispatcher.BeginInvoke(DispatcherPriority.Background, (ThreadStart) (() => {
  2958. // Thread.Sleep(1500);
  2959. if (this.bcbc.ProgressValue > 2)
  2960. this.bcbc.SetProgressValue(this.bcbc.ProgressMaximum, TimeSpan.FromMilliseconds(750));
  2961. else
  2962. this.bcbc.SetProgressValue(0, TimeSpan.FromSeconds(0));
  2963. this.bcbc.ProgressMaximum = 100;
  2964. //this.bcbc.SetProgressValue(0, TimeSpan.FromSeconds(0));
  2965. //}));
  2966. }
  2967. /// <summary>
  2968. /// Sets up the UI after the ShellListView has navigated
  2969. /// </summary>
  2970. /// <param name="e"></param>
  2971. private void SetupUIonNavComplete(NavigatedEventArgs e) {
  2972. btnSizeChart.IsEnabled = e.Folder.IsFileSystem;
  2973. btnAutosizeColls.IsEnabled = _ShellListView.View == ShellViewStyle.Details;
  2974. if (e.Folder.ParsingName != KnownFolders.RecycleBin.ParsingName)
  2975. miRestoreALLRB.Visibility = Visibility.Collapsed;
  2976. else if (_ShellListView.Items.Any())
  2977. miRestoreALLRB.Visibility = Visibility.Visible;
  2978. bool isFuncAvail;
  2979. int selectedItemsCount = _ShellListView.GetSelectedCount();
  2980. if (selectedItemsCount == 1) {
  2981. isFuncAvail = _ShellListView.GetFirstSelectedItem().IsFileSystem || _ShellListView.CurrentFolder.ParsingName == KnownFolders.Libraries.ParsingName;
  2982. } else {
  2983. isFuncAvail = true;
  2984. if (!(_ShellListView.CurrentFolder.IsFolder && !_ShellListView.CurrentFolder.IsDrive && !_ShellListView.CurrentFolder.IsSearchFolder))
  2985. ctgFolderTools.Visibility = Visibility.Collapsed;
  2986. }
  2987. bool IsChanged = selectedItemsCount > 0;
  2988. btnCopy.IsEnabled = IsChanged;
  2989. btnCut.IsEnabled = IsChanged;
  2990. btnRename.IsEnabled = IsChanged;
  2991. btnDelete.IsEnabled = IsChanged && isFuncAvail;
  2992. btnCopyto.IsEnabled = IsChanged;
  2993. btnMoveto.IsEnabled = IsChanged;
  2994. btnSelNone.IsEnabled = IsChanged;
  2995. leftNavBut.IsEnabled = (tcMain.SelectedItem as Wpf.Controls.TabItem).log.CanNavigateBackwards;
  2996. rightNavBut.IsEnabled = (tcMain.SelectedItem as Wpf.Controls.TabItem).log.CanNavigateForwards;
  2997. btnUpLevel.IsEnabled = _ShellListView.CanNavigateParent;
  2998. }
  2999. /// <summary>
  3000. /// Adds the current folder to the recent category of the Better Exlorer's <see cref="JumpList">JumpList</see>
  3001. /// </summary>
  3002. private void SetUpJumpListOnNavComplete() {
  3003. var pidl = IntPtr.Zero;
  3004. try {
  3005. pidl = this._ShellListView.CurrentFolder.AbsolutePidl;
  3006. var sfi = new SHFILEINFO();
  3007. if (pidl != IntPtr.Zero && !_ShellListView.CurrentFolder.IsFileSystem) {
  3008. var res = BExplorer.Shell.Interop.Shell32.SHGetFileInfo(pidl, 0, out sfi, Marshal.SizeOf(sfi), SHGFI.IconLocation | SHGFI.SmallIcon | SHGFI.PIDL);
  3009. }
  3010. if (_ShellListView.CurrentFolder.IsFileSystem) {
  3011. BExplorer.Shell.Interop.Shell32.SHGetFileInfo(Marshal.StringToHGlobalAuto(_ShellListView.CurrentFolder.ParsingName), 0, out sfi, Marshal.SizeOf(sfi), SHGFI.IconLocation | SHGFI.SmallIcon);
  3012. }
  3013. JumpList.AddToRecentCategory(new JumpTask() {
  3014. ApplicationPath = Process.GetCurrentProcess().MainModule.FileName,
  3015. Arguments = "\"" + _ShellListView.CurrentFolder.ParsingName + "\"",
  3016. Title = _ShellListView.CurrentFolder.DisplayName,
  3017. IconResourcePath = sfi.szDisplayName,
  3018. IconResourceIndex = sfi.iIcon
  3019. });
  3020. AppJL.Apply();
  3021. } finally {
  3022. if (pidl != IntPtr.Zero) Marshal.FreeCoTaskMem(pidl);
  3023. }
  3024. }
  3025. private bool SetUpNewFolderButtons() {
  3026. var currentFolder = FileSystemListItem.ToFileSystemItem(_ShellListView.CurrentFolder.ParentHandle, _ShellListView.CurrentFolder.PIDL);
  3027. if (currentFolder.Parent == null) {
  3028. return false;
  3029. } else if (currentFolder.ParsingName == KnownFolders.Libraries.ParsingName) {
  3030. btnCreateFolder.Header = FindResource("btnNewLibraryCP"); //"New Library";
  3031. stNewFolder.Title = FindResource("btnNewLibraryCP").ToString();//"New Library";
  3032. stNewFolder.Text = "Creates a new library in the current folder.";
  3033. stNewFolder.Image = new BitmapImage(new Uri(@"/BetterExplorer;component/Images/newlib32.png", UriKind.Relative));
  3034. btnCreateFolder.LargeIcon = @"..\Images\newlib32.png";
  3035. btnCreateFolder.Icon = @"..\Images\newlib16.png";
  3036. return true;
  3037. } else if (currentFolder.IsFileSystem || currentFolder.Parent.ParsingName == KnownFolders.Libraries.ParsingName) {
  3038. btnCreateFolder.Header = FindResource("btnNewFolderCP");//"New Folder";
  3039. stNewFolder.Title = FindResource("btnNewFolderCP").ToString(); //"New Folder";
  3040. stNewFolder.Text = "Creates a new folder in the current folder";
  3041. stNewFolder.Image = new BitmapImage(new Uri(@"/BetterExplorer;component/Images/folder_new32.png", UriKind.Relative));
  3042. btnCreateFolder.LargeIcon = @"..\Images\folder_new32.png";
  3043. btnCreateFolder.Icon = @"..\Images\folder_new16.png";
  3044. return false;
  3045. } else {
  3046. return false;
  3047. }
  3048. }
  3049. private void SetUpButtonVisibilityOnNavComplete(bool isinLibraries) {
  3050. if (_ShellListView.CurrentFolder.ParsingName.Contains(KnownFolders.Libraries.ParsingName) && _ShellListView.CurrentFolder.ParsingName != KnownFolders.Libraries.ParsingName) {
  3051. if (this._ShellListView.GetSelectedCount() == 1) {
  3052. ctgLibraries.Visibility = Visibility.Visible;
  3053. SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.CurrentFolder.ParsingName), false));
  3054. }
  3055. ctgFolderTools.Visibility = Visibility.Collapsed;
  3056. ctgImage.Visibility = Visibility.Collapsed;
  3057. ctgArchive.Visibility = Visibility.Collapsed;
  3058. ctgVirtualDisk.Visibility = Visibility.Collapsed;
  3059. ctgExe.Visibility = Visibility.Collapsed;
  3060. } else if (!_ShellListView.CurrentFolder.ParsingName.ToLowerInvariant().EndsWith("library-ms")) {
  3061. btnDefSave.Items.Clear();
  3062. ctgLibraries.Visibility = Visibility.Collapsed;
  3063. }
  3064. ctgDrive.Visibility = _ShellListView.CurrentFolder.IsDrive ? Visibility.Visible : Visibility.Collapsed;
  3065. if (isinLibraries) {
  3066. ctgFolderTools.Visibility = Visibility.Collapsed;
  3067. }
  3068. }
  3069. /// <summary>
  3070. /// Navigates to the <paramref name="Destination"/> When Destination != Current Folder
  3071. /// </summary>
  3072. /// <param name="Destination">The folder you want to navigate to</param>
  3073. private void NavigationController(IListItemEx Destination) {
  3074. if (!Destination.Equals(this._ShellListView.CurrentFolder)) this._ShellListView.Navigate_Full(Destination, true);
  3075. }
  3076. private void OnBreadcrumbbarNavigate(IListItemEx Destination) {
  3077. this.IsNeedEnsureVisible = true;
  3078. this.NavigationController(Destination);
  3079. }
  3080. /*
  3081. private string RemoveLastEmptySeparator(string path) {
  3082. path = path.Trim();
  3083. if (path.EndsWith(@"\")) path = path.Remove(path.Length - 1, 1);
  3084. return path;
  3085. }
  3086. */
  3087. #endregion
  3088. #region Misc
  3089. public MainWindow() {
  3090. this.Badges = this.LoadBadgesData();
  3091. this.DataContext = this;
  3092. this.LVItemsColorCol = new ObservableCollectionEx<LVItemColor>();
  3093. this.CommandBindings.AddRange(new[]
  3094. {
  3095. new CommandBinding(AppCommands.RoutedNavigateBack, leftNavBut_Click),
  3096. new CommandBinding(AppCommands.RoutedNavigateFF, rightNavBut_Click),
  3097. new CommandBinding(AppCommands.RoutedNavigateUp, btnUpLevel_Click),
  3098. new CommandBinding(AppCommands.RoutedGotoSearch, GoToSearchBox),
  3099. new CommandBinding(AppCommands.RoutedNewTab, (sender, e) => tcMain.NewTab()),
  3100. new CommandBinding(AppCommands.RoutedEnterInBreadCrumbCombo, (sender, e) => { this._ShellListView.IsFocusAllowed = false; this.bcbc.SetInputState(); }),
  3101. new CommandBinding(AppCommands.RoutedChangeTab, (sender, e) => {
  3102. int selIndex = tcMain.SelectedIndex == tcMain.Items.Count - 1 ? 0 : tcMain.SelectedIndex + 1;
  3103. tcMain.SelectedItem = tcMain.Items[selIndex];
  3104. }),
  3105. new CommandBinding(AppCommands.RoutedCloseTab, (sender, e) => {
  3106. if (tcMain.SelectedIndex == 0 && tcMain.Items.Count == 1) {
  3107. Close();
  3108. return;
  3109. }
  3110. int CurSelIndex = tcMain.SelectedIndex;
  3111. tcMain.SelectedItem = tcMain.SelectedIndex == 0 ? tcMain.Items[1] : tcMain.Items[CurSelIndex - 1];
  3112. tcMain.Items.RemoveAt(CurSelIndex);
  3113. })
  3114. });
  3115. // loads current Ribbon color theme
  3116. try {
  3117. switch (Settings.BESettings.CurrentTheme) {
  3118. case "Blue":
  3119. case "Silver":
  3120. case "Black":
  3121. case "Green":
  3122. ChangeRibbonTheme(Settings.BESettings.CurrentTheme);
  3123. break;
  3124. case "Metro":
  3125. //ChangeRibbonTheme(Color, true);
  3126. //Do nothing since Metro should be already loaded in App.Startup
  3127. break;
  3128. default:
  3129. ChangeRibbonTheme("Blue");
  3130. break;
  3131. }
  3132. } catch (Exception ex) {
  3133. MessageBox.Show($"An error occurred while trying to load the theme data from the Registry. \n\r \n\r{ex.Message}\n\r \n\rPlease let us know of this issue at http://bugs.gainedge.org/public/betterexplorer", "RibbonTheme Error - " + ex.ToString());
  3134. }
  3135. // loads current UI language (uses en-US if default)
  3136. try {
  3137. //load current UI language in case there is no specified registry value
  3138. ((App)Application.Current).SelectCulture(BESettings.Locale, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BExplorer\\translation.xaml");
  3139. } catch (Exception ex) {
  3140. MessageBox.Show($"An error occurred while trying to load the locale data from the Registry. \n\r \n\r{ex.Message}\n\r \n\rPlease let us know of this issue at http://bugs.gainedge.org/public/betterexplorer", "Locale Load Error - " + ex);
  3141. }
  3142. // gets values from registry to be applied after initialization
  3143. //bool rtlset = Convert.ToString(rks.GetValue("RTLMode", "notset")) != "notset";
  3144. RegistryKey rk = Registry.CurrentUser;
  3145. RegistryKey rks = rk.OpenSubKey(@"Software\BExplorer", true);
  3146. string RTLMode = Convert.ToString(rks.GetValue("RTLMode", "notset")); //TODO: Find out how to remove this properly, I'm not exactly sure now it works!!
  3147. rks.Close();
  3148. rk.Close();
  3149. //Main Initialization routine
  3150. InitializeComponent();
  3151. // sets up ComboBox to select the current UI language
  3152. this.TranslationComboBox.SelectedItem = this.TranslationComboBox.Items.OfType<TranslationComboBoxItem>().FirstOrDefault(x => x.LocaleCode == BESettings.Locale);
  3153. if (RTLMode == "notset") {
  3154. RTLMode = (this.TranslationComboBox.SelectedItem as TranslationComboBoxItem).UsesRTL.ToString();
  3155. }
  3156. this.SearchBarColumn.Width = new GridLength(BESettings.SearchBarWidth);
  3157. // prepares RTL mode
  3158. FlowDirection = RTLMode.ToLower() == "true" ? FlowDirection.RightToLeft : FlowDirection.LeftToRight;
  3159. // sets tab bar alignment
  3160. if (BESettings.TabBarAlignment == "top")
  3161. TabbaTop.IsChecked = true;
  3162. else if (BESettings.TabBarAlignment == "bottom")
  3163. TabbaBottom.IsChecked = true;
  3164. else
  3165. TabbaTop.IsChecked = true;
  3166. // allows user to change language
  3167. }
  3168. private void beNotifyIcon_TrayMouseDoubleClick(object sender, RoutedEventArgs e) {
  3169. this.Visibility = Visibility.Visible;
  3170. if (this.WindowState == WindowState.Minimized) {
  3171. User32.ShowWindow(Handle, User32.ShowWindowCommands.Restore);
  3172. }
  3173. this.Activate();
  3174. this.Topmost = true; // important
  3175. this.Topmost = false; // important
  3176. this.Focus(); // important
  3177. }
  3178. void ShellListView_ViewStyleChanged(object sender, BExplorer.Shell.ViewChangedEventArgs e) {
  3179. Dispatcher.BeginInvoke(DispatcherPriority.Background,
  3180. (ThreadStart)(() => {
  3181. this._IsShouldRiseViewChanged = false;
  3182. zoomSlider.Value = e.ThumbnailSize;
  3183. btnAutosizeColls.IsEnabled = e.CurrentView == ShellViewStyle.Details;
  3184. btnSbTiles.IsChecked = e.CurrentView == ShellViewStyle.Tile;
  3185. this.ViewGallery.SelectedIndex = -1;
  3186. if (e.CurrentView == ShellViewStyle.ExtraLargeIcon && e.ThumbnailSize == 256) {
  3187. ViewGallery.SelectedIndex = 0;
  3188. } else if (e.CurrentView == ShellViewStyle.LargeIcon && e.ThumbnailSize == 96) {
  3189. ViewGallery.SelectedIndex = 1;
  3190. } else if (e.CurrentView == ShellViewStyle.Medium && e.ThumbnailSize == 48) {
  3191. ViewGallery.SelectedIndex = 2;
  3192. btnSbIcons.IsChecked = true;
  3193. } else if (e.CurrentView == ShellViewStyle.SmallIcon) {
  3194. ViewGallery.SelectedIndex = 3;
  3195. } else {
  3196. btnSbIcons.IsChecked = false;
  3197. }
  3198. if (e.CurrentView == ShellViewStyle.List) {
  3199. ViewGallery.SelectedIndex = 4;
  3200. } else if (e.CurrentView == ShellViewStyle.Details) {
  3201. ViewGallery.SelectedIndex = 5;
  3202. btnSbDetails.IsChecked = true;
  3203. } else {
  3204. btnSbDetails.IsChecked = false;
  3205. }
  3206. if (e.CurrentView == ShellViewStyle.Tile) {
  3207. ViewGallery.SelectedIndex = 6;
  3208. } else if (e.CurrentView == ShellViewStyle.Content) {
  3209. ViewGallery.SelectedIndex = 7;
  3210. } else if (e.CurrentView == ShellViewStyle.Thumbstrip) {
  3211. ViewGallery.SelectedIndex = 8;
  3212. }
  3213. this._IsShouldRiseViewChanged = true;
  3214. }));
  3215. }
  3216. private void btnNewItem_DropDownOpened(object sender, EventArgs e) {
  3217. var mnu = new ShellContextMenu(this._ShellListView, true);
  3218. var controlPos = btnNewItem.TransformToAncestor(Application.Current.MainWindow).Transform(new WIN.Point(0, 0));
  3219. var tempPoint = PointToScreen(new WIN.Point(controlPos.X, controlPos.Y));
  3220. mnu.ShowContextMenu(new System.Drawing.Point((int)tempPoint.X, (int)tempPoint.Y + (int)btnNewItem.ActualHeight));
  3221. btnNewItem.IsDropDownOpen = false;
  3222. }
  3223. private void mnuPinToStart_Click(object sender, RoutedEventArgs e) {
  3224. if (_ShellListView.GetSelectedCount() == 1) {
  3225. string loc = KnownFolders.StartMenu.ParsingName + @"\" + _ShellListView.GetFirstSelectedItem().DisplayName + ".lnk";
  3226. var link = new ShellLink();
  3227. link.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
  3228. link.Target = _ShellListView.GetFirstSelectedItem().ParsingName;
  3229. link.Save(loc);
  3230. link.Dispose();
  3231. User32.PinUnpinToStartMenu(loc);
  3232. }
  3233. if (_ShellListView.GetSelectedCount() == 0) {
  3234. string loc = KnownFolders.StartMenu.ParsingName + @"\" + _ShellListView.CurrentFolder.DisplayName + ".lnk";
  3235. ShellLink link = new ShellLink();
  3236. link.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
  3237. link.Target = _ShellListView.CurrentFolder.ParsingName;
  3238. link.Save(loc);
  3239. link.Dispose();
  3240. User32.PinUnpinToStartMenu(loc);
  3241. }
  3242. }
  3243. private void tmpButtonB_Click(object sender, RoutedEventArgs e) => MessageBox.Show("This button currently does nothing");
  3244. private void RibbonWindow_PreviewKeyDown(object sender, KeyEventArgs e) {
  3245. if (!Keyboard.IsKeyDown(Key.LeftAlt) && (e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up || e.Key == Key.Down)) {
  3246. e.Handled = true;
  3247. var keyText = String.Empty;
  3248. switch (e.Key) {
  3249. case Key.Left:
  3250. keyText = "{LEFT}";
  3251. break;
  3252. case Key.Right:
  3253. keyText = "{RIGHT}";
  3254. break;
  3255. case Key.Up:
  3256. keyText = "{UP}";
  3257. break;
  3258. case Key.Down:
  3259. keyText = "{DOWN}";
  3260. break;
  3261. }
  3262. WIN.Forms.SendKeys.SendWait(keyText);
  3263. }
  3264. }
  3265. private void ToolBar_SizeChanged(object sender, SizeChangedEventArgs e) {
  3266. var toolBar = sender as ToolBar;
  3267. var overflowGrid = toolBar.Template.FindName("OverflowGrid", toolBar) as FrameworkElement;
  3268. if (overflowGrid != null) overflowGrid.Visibility = toolBar.HasOverflowItems ? Visibility.Visible : Visibility.Collapsed;
  3269. var mainPanelBorder = toolBar.Template.FindName("MainPanelBorder", toolBar) as FrameworkElement;
  3270. if (mainPanelBorder != null) mainPanelBorder.Margin = toolBar.HasOverflowItems ? new Thickness(0, 0, 11, 0) : new Thickness(0);
  3271. }
  3272. private void btnPaypal_Click(object sender, RoutedEventArgs e) {
  3273. string url = "";
  3274. string business = "dimitarcenevjp@gmail.com"; // your PayPal email
  3275. string description = "Donation%20for%20Better%20Explorer"; // '%20' represents a space. remember HTML!
  3276. string country = "US"; // AU, US, etc.
  3277. string currency = "USD"; // AUD, USD, etc.
  3278. url = $"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business={business}&lc={country}&item_name={description}&currency_code={currency}&bn=PP%2dDonationsBF";
  3279. Process.Start(url);
  3280. }
  3281. private void btnTest_Click(object sender, RoutedEventArgs e) {
  3282. /*
  3283. We could easily move this to another project and send that method
  3284. */
  3285. //Following could be an example of what the most basic plugin could look like
  3286. //We could also separate plugins so they could be enabled WHEN
  3287. //Always OR Folder_Selected OR File_Selected
  3288. Action<string, string> pluginExampleActivateBasic = (string pluginPath, string currentFileOrFolder) => Process.Start(pluginPath, currentFileOrFolder);
  3289. var Tab = new Fluent.RibbonTabItem() { Header = "Plugins", ToolTip = "Plugins" };
  3290. TheRibbon.Tabs.Add(Tab);
  3291. var groupBox1 = new RibbonGroupBox() { Header = "Test" };
  3292. Tab.Groups.Add(groupBox1);
  3293. var XML =
  3294. @"<Shortcuts>
  3295. <Shortcut Name='Test' Path = 'C:\Aaron'/>
  3296. </Shortcuts>";
  3297. var xDoc = XElement.Parse(XML);
  3298. var shortcuts = xDoc.Elements("Shortcut");
  3299. var dropDown = new SplitButton();
  3300. groupBox1.Items.Add(dropDown);
  3301. foreach (var Node in xDoc.Elements("Shortcut")) {
  3302. var item = new MenuItem() { Header = Node.Attribute("Name").Value };
  3303. item.Click += (x, y) => Process.Start(Node.Attribute("Path").Value);
  3304. dropDown.Items.Add(item);
  3305. }
  3306. }
  3307. private void tcMain_Setup(object sender, RoutedEventArgs e) {
  3308. tcMain.newt_DragEnter = newt_DragEnter;
  3309. tcMain.newt_DragOver = newt_DragOver;
  3310. tcMain.newt_Drop = newt_Drop;
  3311. tcMain.newt_Leave = newt_Leave;
  3312. tcMain.newt_GiveFeedback = newt_GiveFeedback;
  3313. tcMain.newt_PreviewMouseMove = newt_PreviewMouseMove;
  3314. tcMain.newt_PreviewMouseDown = newt_PreviewMouseDown;
  3315. tcMain.ConstructMoveToCopyToMenu += ConstructMoveToCopyToMenu;
  3316. tcMain.DefaultTabPath = tcMain.StartUpLocation.ToShellParsingName();
  3317. tcMain.PreviewSelectionChanged += tcMain_PreviewSelectionChanged;
  3318. // tcMain.StartUpLocation = Utilities.GetRegistryValue("StartUpLoc", KnownFolders.Libraries.ParsingName).ToString();
  3319. // if (tcMain.StartUpLocation == "") {
  3320. //BESettings.StartupLocation = KnownFolders.Libraries.ParsingName;
  3321. //BESettings.SaveSettings();
  3322. // tcMain.StartUpLocation = KnownFolders.Libraries.ParsingName;
  3323. // }
  3324. tcMain.StartUpLocation = BESettings.StartupLocation;
  3325. }
  3326. void tcMain_PreviewSelectionChanged(object sender, Wpf.Controls.PreviewSelectionChangedEventArgs e) {
  3327. //if (tcMain.IsInTabDragDrop) {
  3328. // e.Cancel = true;
  3329. // return;
  3330. //}
  3331. //if (e.RemovedItems.Count > 0) {
  3332. // var tab = e.RemovedItems[0] as Wpf.Controls.TabItem;
  3333. // if (tab != null && this._ShellListView.GetSelectedCount() > 0) {
  3334. // tab.SelectedItems = this._ShellListView.SelectedItems.Select(s => s.ParsingName).ToList();
  3335. // }
  3336. //}
  3337. //if (e.AddedItems.Count == 0 || tcMain.SelectNewTabOnCreate == false) return;
  3338. //tcMain.IsInTabDragDrop = true;
  3339. //var newTab = e.AddedItems[0] as Wpf.Controls.TabItem;
  3340. //if (this._ShellListView.CurrentFolder == null || !this._ShellListView.CurrentFolder.Equals(newTab.ShellObject) && tcMain.CurrentTabItem == null) {
  3341. // SelectTab(newTab);
  3342. //} else if (!tcMain.IsSelectionHandled) {
  3343. // SelectTab(newTab);
  3344. // //btnUndoClose
  3345. // btnUndoClose.Items.Clear();
  3346. // foreach (var item in tcMain.ReopenableTabs) {
  3347. // btnUndoClose.Items.Add(item.CurrentLocation);
  3348. // }
  3349. //}
  3350. ////else if (e.RemovedItems.Count == 0) {
  3351. //// e.Cancel = true;
  3352. //// SelectTab(newTab);
  3353. //// tcMain.SelectedItem = e.AddedItems[0];
  3354. ////} else if (e.RemovedItems[0] == tcMain.CurrentTabItem) {
  3355. //// e.Cancel = true;
  3356. //// tcMain.IsSelectionHandled = false;
  3357. //// tcMain.SelectedItem = e.RemovedItems[0];
  3358. //// tcMain.CurrentTabItem = null;
  3359. ////}
  3360. //tcMain.IsSelectionHandled = true;
  3361. //this._ShellListView.Focus();
  3362. //this._CurrentlySelectedItem = tcMain.SelectedItem as Wpf.Controls.TabItem;
  3363. }
  3364. private void newt_GiveFeedback(object sender, GiveFeedbackEventArgs e) {
  3365. e.Handled = true;
  3366. e.UseDefaultCursors = true;
  3367. if (this._TabDropData == null)
  3368. return;
  3369. var doo = new WIN.Forms.DataObject(this._TabDropData);
  3370. if (doo.GetDataPresent("DragWindow")) {
  3371. IntPtr hwnd = ShellView.GetIntPtrFromData(doo.GetData("DragWindow"));
  3372. User32.PostMessage(hwnd, 0x403, IntPtr.Zero, IntPtr.Zero);
  3373. } else {
  3374. e.UseDefaultCursors = true;
  3375. }
  3376. if (ShellView.IsDropDescriptionValid(this._TabDropData)) {
  3377. e.UseDefaultCursors = false;
  3378. Cursor = Cursors.Arrow;
  3379. } else {
  3380. e.UseDefaultCursors = true;
  3381. }
  3382. if (ShellView.IsShowingLayered(doo)) {
  3383. e.UseDefaultCursors = false;
  3384. Cursor = Cursors.Arrow;
  3385. } else {
  3386. e.UseDefaultCursors = true;
  3387. }
  3388. }
  3389. private void btnResetLibrary_Click(object sender, RoutedEventArgs e) => WIN.Forms.MessageBox.Show("This does nothing"); //TODO: Add functionality or remove
  3390. private void RibbonWindow_Activated(object sender, EventArgs e) {
  3391. //tcMain.CurrentTabItem = tcMain.SelectedItem as Wpf.Controls.TabItem;
  3392. tcMain.IsSelectionHandled = true;
  3393. focusTimer.Start();
  3394. }
  3395. private void RibbonWindow_StateChanged(object sender, EventArgs e) {
  3396. //tcMain.CurrentTabItem = tcMain.SelectedItem as Wpf.Controls.TabItem;
  3397. tcMain.IsSelectionHandled = true;
  3398. //if (this.WindowState != WindowState.Minimized && this.IsActive) focusTimer.Start();
  3399. }
  3400. void focusTimer_Tick(object sender, EventArgs e) {
  3401. this._ShellListView.Focus();
  3402. focusTimer.Stop();
  3403. }
  3404. private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
  3405. var badgeIconPath = ((sender as Image)?.Tag as IListItemEx)?.ParsingName;
  3406. var selectedItemPath = this._ShellListView.GetFirstSelectedItem().ParsingName;
  3407. this.SaveBadgeForItem(selectedItemPath, badgeIconPath);
  3408. this.Badges = this.LoadBadgesData();
  3409. this._ShellListView.BadgesData = this.Badges;
  3410. this._ShellListView.RefreshItem(this._ShellListView.GetFirstSelectedItemIndex(), true);
  3411. this.btnBadges.IsDropDownOpen = false;
  3412. }
  3413. private void SaveBadgeForItem(String itemPath, String badgePath, Boolean isClear = false) {
  3414. var m_dbConnection = new System.Data.SQLite.SQLiteConnection("Data Source=" + this._DBPath + ";Version=3;");
  3415. m_dbConnection.Open();
  3416. if (isClear) {
  3417. var command3 = new System.Data.SQLite.SQLiteCommand("DELETE FROM badges WHERE Path=@Path", m_dbConnection);
  3418. command3.Parameters.AddWithValue("Path", itemPath);
  3419. command3.ExecuteNonQuery();
  3420. } else {
  3421. var command1 = new System.Data.SQLite.SQLiteCommand("SELECT * FROM badges WHERE Path=@Path", m_dbConnection);
  3422. command1.Parameters.AddWithValue("Path", itemPath);
  3423. var Reader = command1.ExecuteReader();
  3424. var sql = Reader.Read()
  3425. ? @"UPDATE badges SET Collection = @Collection, Badge = @Badge WHERE Path = @Path"
  3426. : @"INSERT INTO badges (Path, Collection, Badge) VALUES (@Path, @Collection, @Badge)";
  3427. var command2 = new System.Data.SQLite.SQLiteCommand(sql, m_dbConnection);
  3428. command2.Parameters.AddWithValue("Path", itemPath);
  3429. command2.Parameters.AddWithValue("Collection", Path.GetFileName(Path.GetDirectoryName(badgePath)));
  3430. command2.Parameters.AddWithValue("Badge", Path.GetFileName(badgePath));
  3431. command2.ExecuteNonQuery();
  3432. Reader.Close();
  3433. }
  3434. m_dbConnection.Close();
  3435. }
  3436. private void MenuItem_Click_2(object sender, RoutedEventArgs e) {
  3437. this.SaveBadgeForItem(this._ShellListView.GetFirstSelectedItem().ParsingName, String.Empty, true);
  3438. this.Badges = this.LoadBadgesData();
  3439. this._ShellListView.BadgesData = this.Badges;
  3440. this._ShellListView.RefreshItem(this._ShellListView.GetFirstSelectedItemIndex(), true);
  3441. }
  3442. private void btnCancel_Click(object sender, RoutedEventArgs e) {
  3443. this._ShellListView.CancelNavigation();
  3444. this._ProgressTimer.Stop();
  3445. this.bcbc.SetProgressValue(this.bcbc.ProgressMaximum, TimeSpan.FromMilliseconds(750));
  3446. this.bcbc.ProgressMaximum = 100;
  3447. this.btnCancelNavigation.Visibility = Visibility.Collapsed;
  3448. this.btnGoNavigation.Visibility = Visibility.Visible;
  3449. }
  3450. private void btnRefresh_Click(object sender, RoutedEventArgs e) {
  3451. _ShellListView.RefreshContents();
  3452. SetSortingAndGroupingButtons();
  3453. SetupUIOnSelectOrNavigate();
  3454. }
  3455. void bcbc_OnEditModeToggle(object sender, Odyssey.Controls.EditModeToggleEventArgs e) {
  3456. this._ShellListView.IsFocusAllowed = e.IsExit;
  3457. if (!e.IsExit) this.bcbc.Focus();
  3458. }
  3459. private void bcbc_BreadcrumbItemDropDownOpened(object sender, Odyssey.Controls.BreadcrumbItemEventArgs e) {
  3460. this._ShellListView.IsFocusAllowed = false;
  3461. this.bcbc.Focus();
  3462. }
  3463. private void bcbc_BreadcrumbItemDropDownClosed(object sender, Odyssey.Controls.BreadcrumbItemEventArgs e) => this._ShellListView.IsFocusAllowed = true;
  3464. private void btnOpenWith_DropDownOpened(object sender, EventArgs e) {
  3465. var mnu = new ShellContextMenu(this._ShellListView, false);
  3466. var controlPos = btnOpenWith.TransformToAncestor(Application.Current.MainWindow).Transform(new WIN.Point(0, 0));
  3467. var tempPoint = PointToScreen(new WIN.Point(controlPos.X, controlPos.Y));
  3468. mnu.ShowContextMenu(new System.Drawing.Point((int)tempPoint.X, (int)tempPoint.Y + (int)btnOpenWith.ActualHeight), 1);
  3469. btnOpenWith.IsDropDownOpen = false;
  3470. }
  3471. private void btnSort_DropDownOpened(object sender, EventArgs e) {
  3472. var button = sender as DropDownButton;
  3473. foreach (MenuItem item in button.Items.OfType<MenuItem>()) {
  3474. var column = item.Tag as Collumns;
  3475. if (column == this._ShellListView.Collumns.FirstOrDefault(w => w.ID == this._ShellListView.LastSortedColumnId)) {
  3476. item.IsChecked = true;
  3477. break;
  3478. }
  3479. }
  3480. button.Items.OfType<MenuItem>().Last().IsChecked = this._ShellListView.LastSortOrder == WIN.Forms.SortOrder.Descending;
  3481. button.Items.OfType<MenuItem>().ToArray()[button.Items.OfType<MenuItem>().Count() - 2].IsChecked = this._ShellListView.LastSortOrder == WIN.Forms.SortOrder.Ascending;
  3482. }
  3483. private void btnGroup_DropDownOpened(object sender, EventArgs e) {
  3484. var button = sender as DropDownButton;
  3485. foreach (MenuItem item in button.Items.OfType<MenuItem>()) {
  3486. var column = item.Tag as Collumns;
  3487. if (column == this._ShellListView.LastGroupCollumn) {
  3488. item.IsChecked = true;
  3489. break;
  3490. }
  3491. }
  3492. button.Items.OfType<MenuItem>().Last().IsChecked = this._ShellListView.LastGroupOrder == WIN.Forms.SortOrder.Descending;
  3493. button.Items.OfType<MenuItem>().ToArray()[button.Items.OfType<MenuItem>().Count() - 2].IsChecked = this._ShellListView.LastGroupOrder == WIN.Forms.SortOrder.Ascending;
  3494. }
  3495. private void ShellTreeHost_SizeChanged(object sender, SizeChangedEventArgs e) {
  3496. this.ShellTree.Refresh();
  3497. this._ShellListView.Refresh();
  3498. }
  3499. private void btnStartPowerShellClick(object sender, RoutedEventArgs e) {
  3500. if (ctrlConsole.IsProcessRunning) ctrlConsole.StopProcess();
  3501. ctrlConsole.StartPowerShell();
  3502. }
  3503. private void chkTraditionalNameGrouping_CheckChanged(Object sender, RoutedEventArgs e) {
  3504. BESettings.IsTraditionalNameGrouping = e.RoutedEvent.Name == "Checked";
  3505. BESettings.SaveSettings();
  3506. }
  3507. private void btnResetFolderSettings_OnClick(object sender, RoutedEventArgs e) => this._ShellListView.ResetFolderSettings();
  3508. #endregion
  3509. }
  3510. }