/verve patch/base/Applications/BetterExplorer/BExplorer/BetterExplorer/MainWindow.xaml.cs
C# | 4158 lines | 3239 code | 628 blank | 291 comment | 747 complexity | 4806bfa8d44f4dae5cca83557fa289ee MD5 | raw file
Possible License(s): Apache-2.0, GPL-2.0
Large files files are truncated, but you can click here to view the full file
- // --------------------------------------------------------------------------------------------------------------------
- // <copyright file="MainWindow.xaml.cs" company="Gainedge ORG">
- // Better Explorer (c)2016
- // </copyright>
- // <summary>
- // Interaction logic for MainWindow.xaml
- // </summary>
- // --------------------------------------------------------------------------------------------------------------------
- using System;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.ComponentModel;
- using System.Diagnostics;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Reflection;
- using System.Runtime.InteropServices;
- using System.ServiceModel;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Controls.Primitives;
- using System.Windows.Input;
- using System.Windows.Interop;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Shell;
- using System.Windows.Threading;
- using System.Xml;
- using System.Xml.Linq;
- using BEHelper;
- using BetterExplorer.UsbEject;
- using BetterExplorerControls;
- using BExplorer.Shell;
- using BExplorer.Shell._Plugin_Interfaces;
- using BExplorer.Shell.CommonFileDialogs;
- using BExplorer.Shell.DropTargetHelper;
- using BExplorer.Shell.Interop;
- using Fluent;
- using LTR.IO.ImDisk;
- using Microsoft.Win32;
- using Settings;
- using SevenZip;
- using Shell32;
- using TaskDialogInterop;
- using wyDay.Controls;
- using Clipboards = System.Windows.Forms.Clipboard;
- using ContextMenu = Fluent.ContextMenu;
- using Image = System.Windows.Controls.Image;
- using MenuItem = Fluent.MenuItem;
- using WIN = System.Windows;
- namespace BetterExplorer {
- /// <summary>
- /// Interaction logic for MainWindow.xaml
- /// </summary>
- public partial class MainWindow : Fluent.RibbonWindow {
- #region DLLImports
- [DllImport("user32.dll")]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool GetCursorPos(ref BExplorer.Shell.DataObject.Win32Point pt);
- //[DllImport("user32.dll", SetLastError = true)]
- //private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
- //[DllImport("user32.dll", SetLastError = true)]
- //private static extern int UnregisterHotKey(IntPtr hwnd, int id);
- [DllImport("winmm.dll")]
- static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
- #endregion
- #region Private Members
- private bool _IsCalledFromLoading, isOnLoad;
- private MenuItem misa, misd, misag, misdg;
- private ShellTreeViewEx ShellTree = new ShellTreeViewEx();
- private ShellView _ShellListView = new ShellView();
- private bool IsNeedEnsureVisible;
- private ClipboardMonitor cbm = new ClipboardMonitor();
- private ContextMenu _CMHistory = new ContextMenu();
- private WIN.Shell.JumpList AppJL = new WIN.Shell.JumpList();
- //private List<string> Archives = new List<string>(new[] { ".rar", ".zip", ".7z", ".tar", ".gz", ".xz", ".bz2" });
- private List<string> Images = new List<string>(new[] { ".jpg", ".jpeg", ".png", ".bmp", ".gif", ".wmf" });
- private string SelectedArchive = "";
- private bool KeepBackstageOpen = false;
- string sessionid = DateTime.UtcNow.ToFileTimeUtc().ToString();
- string logdir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\BExplorer\\ActionLog\\";
- WIN.Forms.Timer updateCheckTimer = new WIN.Forms.Timer();
- Double CommandPromptWinHeight;
- //List<LVItemColor> LVItemsColor { get; set; }
- ContextMenu chcm;
- WIN.Forms.Timer focusTimer = new WIN.Forms.Timer() { Interval = 500 };
- private WIN.Forms.Timer _ProgressTimer = new WIN.Forms.Timer() { Interval = 1000, Enabled = false };
- private string _DBPath = Path.Combine(KnownFolders.RoamingAppData.ParsingName, @"BExplorer\Settings.sqlite");
- private IntPtr Handle;
- private ObservableCollectionEx<LVItemColor> LVItemsColorCol { get; set; }
- public Dictionary<String, Dictionary<IListItemEx, List<string>>> Badges { get; set; }
- #endregion
- public bool IsMultipleWindowsOpened { get; set; }
- #region Events
- private void btnAbout_Click(object sender, RoutedEventArgs e) => new fmAbout(this).ShowDialog();
- private void btnBugtracker_Click(object sender, RoutedEventArgs e) => Process.Start("http://bugs.gainedge.org/public/betterexplorer");
- private void TheRibbon_CustomizeQuickAccessToolbar(object sender, EventArgs e) => CustomizeQAT.Open(this, TheRibbon);
- private void btnConsolePane_Click(object sender, RoutedEventArgs e) {
- Settings.BESettings.IsConsoleShown = btnConsolePane.IsChecked.Value;
- Settings.BESettings.SaveSettings();
- if (btnConsolePane.IsChecked.Value) {
- rCommandPrompt.Height = new GridLength(this.CommandPromptWinHeight);
- rCommandPrompt.MinHeight = 100;
- spCommandPrompt.Height = GridLength.Auto;
- if (!ctrlConsole.IsProcessRunning)
- ctrlConsole.ChangeFolder(_ShellListView.CurrentFolder.ParsingName, _ShellListView.CurrentFolder.IsFileSystem);
- } else {
- rCommandPrompt.MinHeight = 0;
- rCommandPrompt.Height = new GridLength(0);
- spCommandPrompt.Height = new GridLength(0);
- ctrlConsole.StopProcess();
- }
- }
- private void backstage_IsOpenChanged(object sender, DependencyPropertyChangedEventArgs e) {
- if ((Boolean)e.NewValue) {
- this._ShellListView.IsFocusAllowed = false;
- this.backstage.Focus();
- } else {
- this._ShellListView.IsFocusAllowed = true;
- }
- this.autoUpdater.Visibility = Visibility.Visible;
- this.autoUpdater.UpdateLayout();
- if (this.KeepBackstageOpen) {
- this.backstage.IsOpen = true;
- this.KeepBackstageOpen = false;
- }
- }
- /// <summary>
- /// Loads initial position of the main window
- /// </summary>
- private void LoadInitialWindowPositionAndState() {
- this.Width = BESettings.LastWindowWidth;
- this.Height = BESettings.LastWindowHeight;
- var location = new System.Drawing.Point();
- try {
- location = new System.Drawing.Point((int)BESettings.LastWindowPosLeft, (int)BESettings.LastWindowPosTop);
- } catch { }
- this.Left = location.X;
- this.Top = location.Y;
- switch (BESettings.LastWindowState) {
- case 2:
- this.WindowState = WindowState.Maximized;
- break;
- case 1:
- this.WindowState = WindowState.Minimized;
- break;
- case 0:
- this.WindowState = WindowState.Normal;
- break;
- default:
- this.WindowState = WindowState.Maximized;
- break;
- }
- this.chkRibbonMinimizedGlass.IsChecked = BESettings.IsGlassOnRibonMinimized;
- this.TheRibbon.IsMinimized = BESettings.IsRibonMinimized;
- //CommandPrompt window size
- this.CommandPromptWinHeight = BESettings.CmdWinHeight;
- this.rCommandPrompt.Height = new GridLength(this.CommandPromptWinHeight);
- if (BESettings.IsConsoleShown) {
- this.rCommandPrompt.MinHeight = 100;
- this.rCommandPrompt.Height = new GridLength(this.CommandPromptWinHeight);
- this.spCommandPrompt.Height = GridLength.Auto;
- } else {
- this.rCommandPrompt.MinHeight = 0;
- this.rCommandPrompt.Height = new GridLength(0);
- this.spCommandPrompt.Height = new GridLength(0);
- }
- }
- private void LoadColorCodesFromFile() {
- Task.Run(() => {
- var itemColorSettingsLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"BExplorer\itemcolors.cfg");
- if (File.Exists(itemColorSettingsLocation)) {
- var docs = XDocument.Load(itemColorSettingsLocation);
- docs.Root.Elements("ItemColorRow")
- .Select(
- element =>
- new LVItemColor(
- element.Elements().ToArray()[0].Value,
- WIN.Media.Color.FromArgb(
- BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[0],
- BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[1],
- BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[2],
- BitConverter.GetBytes(Convert.ToInt32(element.Elements().ToArray()[1].Value))[3])))
- .ToList().ForEach(e => this.LVItemsColorCol.Add(e));
- }
- });
- }
- private void RibbonWindow_Initialized(object sender, EventArgs e) {
- this.LoadInitialWindowPositionAndState();
- this.LoadColorCodesFromFile();
- AppCommands.RoutedNewTab.InputGestures.Add(new KeyGesture(Key.T, ModifierKeys.Control));
- AppCommands.RoutedEnterInBreadCrumbCombo.InputGestures.Add(new KeyGesture(Key.E, ModifierKeys.Alt));
- AppCommands.RoutedChangeTab.InputGestures.Add(new KeyGesture(Key.Tab, ModifierKeys.Control));
- AppCommands.RoutedCloseTab.InputGestures.Add(new KeyGesture(Key.W, ModifierKeys.Control));
- AppCommands.RoutedNavigateBack.InputGestures.Add(new KeyGesture(Key.Left, ModifierKeys.Alt));
- AppCommands.RoutedNavigateFF.InputGestures.Add(new KeyGesture(Key.Right, ModifierKeys.Alt));
- AppCommands.RoutedNavigateUp.InputGestures.Add(new KeyGesture(Key.Up, ModifierKeys.Alt));
- AppCommands.RoutedGotoSearch.InputGestures.Add(new KeyGesture(Key.F, ModifierKeys.Control));
- }
- #region ViewEnumerationComplete
- /// <summary>
- /// Sets up btnSort and btnGroup so they have the correct items after navigating
- /// </summary>
- private void SetSortingAndGroupingButtons() {
- btnSort.Items.Clear();
- btnGroup.Items.Clear();
- try {
- foreach (Collumns item in _ShellListView.Collumns.Where(x => x != null)) {
- var lastSortedColumn = _ShellListView.Collumns.FirstOrDefault(w => w.ID == this._ShellListView.LastSortedColumnId);
- if (lastSortedColumn != null) {
- var IsChecked1 = (item.pkey.fmtid == lastSortedColumn.pkey.fmtid) && (item.pkey.pid == lastSortedColumn.pkey.pid);
- btnSort.Items.Add(Utilities.Build_MenuItem(item.Name, item, checkable: true, isChecked: IsChecked1, GroupName: "GR2", onClick: mi_Click));
- }
- var IsCheckable2 = _ShellListView.LastGroupCollumn != null && (item.pkey.fmtid == _ShellListView.LastGroupCollumn.pkey.fmtid) && (item.pkey.pid == _ShellListView.LastGroupCollumn.pkey.pid);
- btnGroup.Items.Add(Utilities.Build_MenuItem(item.Name, item, checkable: true, isChecked: IsCheckable2, GroupName: "GR3", onClick: mig_Click));
- }
- } catch (Exception ex) {
- //FIXME: I disable this message because of strange null after filter
- 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);
- }
- btnSort.Items.Add(new Separator() { Focusable = false });
- misa = Utilities.Build_MenuItem(FindResource("miAscending"), checkable: true, GroupName: "GR1", onClick: misa_Click);
- misd = Utilities.Build_MenuItem(FindResource("miDescending"), checkable: true, GroupName: "GR1", onClick: misd_Click);
- if (this._ShellListView.LastSortOrder == WIN.Forms.SortOrder.Ascending)
- misa.IsChecked = true;
- else
- misd.IsChecked = true;
- btnSort.Items.Add(misa);
- btnSort.Items.Add(misd);
- btnGroup.Items.Add(Utilities.Build_MenuItem("(none)", GroupName: "GR3", checkable: true, isChecked: _ShellListView.LastGroupCollumn == null, onClick: misng_Click));
- btnGroup.Items.Add(new Separator());
- misag = Utilities.Build_MenuItem(FindResource("miAscending"), checkable: true, GroupName: "GR4", onClick: misag_Click);
- misdg = Utilities.Build_MenuItem(FindResource("miDescending"), checkable: true, GroupName: "GR4", onClick: misag_Click);
- if (this._ShellListView.LastGroupOrder == WIN.Forms.SortOrder.Ascending)
- misag.IsChecked = true;
- else
- misdg.IsChecked = true;
- btnGroup.Items.Add(misag);
- btnGroup.Items.Add(misdg);
- }
- void misag_Click(object sender, RoutedEventArgs e) {
- this._ShellListView.SetGroupOrder();
- }
- private void SetupColumnsButton() {
- var allAvailColls = this._ShellListView.AllAvailableColumns.Values.ToList();
- btnMoreColls.Items.Clear();
- chcm.Items.Clear();
- for (int j = 1; j < 10; j++) {
- //TODO: Try to remove this Try Catch!!
- try {
- var IsChecked = _ShellListView.Collumns.Any(col => col.pkey.fmtid == allAvailColls[j].pkey.fmtid && col.pkey.pid == allAvailColls[j].pkey.pid);
- btnMoreColls.Items.Add(Utilities.Build_MenuItem(allAvailColls[j].Name, allAvailColls[j], checkable: true, onClick: mic_Click, isChecked: IsChecked));
- chcm.Items.Add(Utilities.Build_MenuItem(allAvailColls[j].Name, allAvailColls[j], checkable: true, onClick: mic_Click, isChecked: IsChecked));
- } catch (Exception) {
- }
- }
- int ItemsCount = _ShellListView.Items.Count;
- sbiItemsCount.Visibility = ItemsCount == 0 ? Visibility.Collapsed : Visibility.Visible;
- sbiItemsCount.Content = ItemsCount == 1 ? "1 item" : ItemsCount + " items";
- sbiSelItemsCount.Visibility = _ShellListView.GetSelectedCount() == 0 ? Visibility.Collapsed : Visibility.Visible;
- spSelItems.Visibility = sbiSelItemsCount.Visibility;
- btnMoreColls.Items.Add(new Separator());
- btnMoreColls.Items.Add(Utilities.Build_MenuItem(FindResource("btnMoreColCP"), allAvailColls, onClick: micm_Click));
- btnMoreColls.Tag = allAvailColls;
- chcm.Items.Add(new Separator());
- chcm.Items.Add(Utilities.Build_MenuItem(FindResource("btnMoreColCP"), allAvailColls, onClick: micm_Click));
- }
- #endregion
- void misd_Click(object sender, RoutedEventArgs e) {
- foreach (var item in btnSort.Items.OfType<MenuItem>().Where(item => item.IsChecked && item != (sender as MenuItem))) {
- _ShellListView.SetSortCollumn(true, (Collumns)item.Tag, WIN.Forms.SortOrder.Descending);
- }
- }
- void misa_Click(object sender, RoutedEventArgs e) {
- foreach (var item in btnSort.Items.OfType<MenuItem>().Where(item => item.IsChecked && item != (sender as MenuItem))) {
- _ShellListView.SetSortCollumn(true, (Collumns)item.Tag, WIN.Forms.SortOrder.Ascending);
- }
- }
- void micm_Click(object sender, RoutedEventArgs e) {
- var fMoreCollumns = new MoreColumns();
- fMoreCollumns.PopulateAvailableColumns((List<Collumns>)(sender as FrameworkElement).Tag, this._ShellListView, this.PointToScreen(Mouse.GetPosition(this)));
- }
- void mic_Click(object sender, RoutedEventArgs e) {
- var mi = (sender as MenuItem);
- Collumns col = (Collumns)mi.Tag;
- _ShellListView.SetColInView(col, !mi.IsChecked);
- }
- void miItem_Click(object sender, RoutedEventArgs e) {
- MenuItem mi = sender as MenuItem;
- ShellItem SaveLoc = mi.Tag as ShellItem;
- if (_ShellListView.CurrentFolder.ParsingName.Contains(KnownFolders.Libraries.ParsingName) && _ShellListView.CurrentFolder.ParsingName.EndsWith("library-ms")) {
- var lib = ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.CurrentFolder.ParsingName), false);
- lib.DefaultSaveFolder = SaveLoc.ParsingName;
- lib.Close();
- } else if (_ShellListView.GetFirstSelectedItem().ParsingName.Contains(KnownFolders.Libraries.ParsingName)) {
- var lib = ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.GetFirstSelectedItem().ParsingName), false);
- lib.DefaultSaveFolder = SaveLoc.ParsingName;
- lib.Close();
- }
- }
- void LinksFolderWarcher_Renamed(object sender, RenamedEventArgs e) {
- Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(
- () => btnFavorites.Items.OfType<MenuItem>().First(x => (x.Tag as ShellItem).ParsingName == e.OldFullPath).Header = Path.GetFileNameWithoutExtension(e.Name)));
- }
- void LinksFolderWarcher_Deleted(object sender, FileSystemEventArgs e) {
- Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(
- () => btnFavorites.Items.Remove(btnFavorites.Items.OfType<MenuItem>().First(item => item.Header.ToString() == Path.GetFileNameWithoutExtension(e.Name)))));
- }
- void LinksFolderWarcher_Created(object sender, FileSystemEventArgs e) {
- Dispatcher.BeginInvoke(DispatcherPriority.Normal,
- (Action)(() => {
- if (Path.GetExtension(e.FullPath).ToLowerInvariant() == ".lnk") {
- var so = new ShellItem(e.FullPath);
- so.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly;
- so.Thumbnail.CurrentSize = new WIN.Size(16, 16);
- ImageSource icon = so.Thumbnail.BitmapSource;
- btnFavorites.Items.Add(Utilities.Build_MenuItem(so.DisplayName, so, icon, onClick: mif_Click));
- }
- }));
- }
- /// <summary>
- /// Sets up each ribbon tab after select or navigate in ShellListView
- /// </summary>
- /// <param name="selectedItemsCount">The number of items selected</param>
- /// <param name="selectedItem">The last selected item</param>
- /// <remarks>
- /// Only used in SetupUIOnSelectOrNavigate
- /// </remarks>
- private void SetUpRibbonTabsVisibilityOnSelectOrNavigate(int selectedItemsCount, IListItemEx selectedItem) {
- #region Search Contextual Tab
- ctgSearch.Visibility = BooleanToVisibiliy(_ShellListView.CurrentFolder.IsSearchFolder);
- if (ctgSearch.Visibility == Visibility.Visible && !_ShellListView.CurrentFolder.IsSearchFolder) {
- ctgSearch.Visibility = Visibility.Collapsed;
- TheRibbon.SelectedTabItem = HomeTab;
- }
- #endregion
- #region Folder Tools Context Tab
- ctgFolderTools.Visibility = BooleanToVisibiliy((selectedItemsCount == 1 && selectedItem.IsFolder && selectedItem.IsFileSystem && !selectedItem.IsDrive && !selectedItem.IsNetworkPath));
- if (BESettings.AutoSwitchFolderTools && ctgFolderTools.Visibility == Visibility.Visible) {
- TheRibbon.SelectedTabItem = ctgFolderTools.Items[0];
- }
- #endregion
- #region Drive Contextual Tab
- ctgDrive.Visibility = BooleanToVisibiliy(_ShellListView.CurrentFolder.IsDrive || (selectedItemsCount == 1 && (selectedItem.IsDrive || (selectedItem.Parent != null && selectedItem.Parent.IsDrive))));
- if (BESettings.AutoSwitchDriveTools && ctgDrive.Visibility == Visibility.Visible && selectedItemsCount == 1 && selectedItem.IsDrive) {
- TheRibbon.SelectedTabItem = ctgDrive.Items[0];
- }
- #endregion
- #region Library Context Tab
- ctgLibraries.Visibility = BooleanToVisibiliy((selectedItemsCount == 1 && _ShellListView.CurrentFolder.ParsingName.Equals(KnownFolders.Libraries.ParsingName)) || (selectedItemsCount == 1 && selectedItem.Parent != null && selectedItem.Parent.ParsingName.Equals(KnownFolders.Libraries.ParsingName)));
- if (ctgLibraries.Visibility == Visibility.Visible && BESettings.AutoSwitchLibraryTools) {
- TheRibbon.SelectedTabItem = ctgLibraries.Items[0];
- }
- /*
- if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.ParsingName.Equals(KnownFolders.Libraries.ParsingName)) {
- if (selectedItem != null && selectedItemsCount == 1)
- SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(selectedItem.ParsingName), false));
- } else if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.Parent.ParsingName.Equals(KnownFolders.Libraries.ParsingName)) {
- if (selectedItemsCount == 1)
- SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.CurrentFolder.ParsingName), false));
- }
- if (selectedItemsCount == 0) {
- ctgLibraries.Visibility = Visibility.Collapsed;
- }
- */
- if (selectedItemsCount == 0)
- ctgLibraries.Visibility = Visibility.Collapsed;
- else if (selectedItemsCount > 1) { } else if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.ParsingName.Equals(KnownFolders.Libraries.ParsingName))
- SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(selectedItem.ParsingName), false));
- else if (ctgLibraries.Visibility == Visibility.Visible && _ShellListView.CurrentFolder.Parent.ParsingName.Equals(KnownFolders.Libraries.ParsingName))
- SetupLibrariesTab(ShellLibrary.Load(Path.GetFileNameWithoutExtension(_ShellListView.CurrentFolder.ParsingName), false));
- #endregion
- #region Archive Contextual Tab
- ctgArchive.Visibility = WIN.Visibility.Collapsed; //TODO: Restore this: BooleanToVisibiliy(selectedItemsCount == 1 && Archives.Contains(Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant()));
- if (BESettings.AutoSwitchArchiveTools && ctgArchive.Visibility == Visibility.Visible)
- TheRibbon.SelectedTabItem = ctgArchive.Items[0];
- #endregion
- #region Application Context Tab
- ctgExe.Visibility = BooleanToVisibiliy(selectedItemsCount == 1 && !selectedItem.IsFolder && (Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant() == ".exe" || Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant() == ".msi"));
- if (BESettings.AutoSwitchApplicationTools && ctgExe.Visibility == Visibility.Visible) {
- TheRibbon.SelectedTabItem = ctgExe.Items[0];
- }
- #endregion
- #region Image Context Tab
- ctgImage.Visibility = BooleanToVisibiliy(selectedItemsCount == 1 && !selectedItem.IsFolder && Images.Contains(Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant()));
- if (ctgImage.Visibility == Visibility.Visible) {
- try {
- if (new FileInfo(selectedItem.ParsingName).Length != 0) {
- using (var cvt = new Bitmap(selectedItem.ParsingName)) {
- imgSizeDisplay.WidthData = cvt.Width.ToString();
- imgSizeDisplay.HeightData = cvt.Height.ToString();
- if (BESettings.AutoSwitchImageTools) TheRibbon.SelectedTabItem = ctgImage.Items[0];
- }
- }
- } catch (Exception) {
- MessageBox.Show("Image was invalid");
- }
- }
- #endregion
- #region Virtual Disk Context Tab
- ctgVirtualDisk.Visibility = BooleanToVisibiliy(selectedItemsCount == 1 && !selectedItem.IsFolder && Path.GetExtension(selectedItem.ParsingName).ToLowerInvariant() == ".iso");
- if (BESettings.AutoSwitchVirtualDriveTools && ctgVirtualDisk.Visibility == Visibility.Visible) {
- TheRibbon.SelectedTabItem = ctgVirtualDisk.Items[0];
- }
- #endregion
- }
- /// <summary>
- /// Sets up the status bar
- /// </summary>
- /// <param name="selectedItemsCount">The number of items currently selected</param>
- private void SetUpStatusBarOnSelectOrNavigate(int selectedItemsCount) {
- spSelItems.Visibility = BooleanToVisibiliy(selectedItemsCount > 0);
- sbiSelItemsCount.Visibility = BooleanToVisibiliy(selectedItemsCount > 0);
- if (selectedItemsCount == 1)
- sbiSelItemsCount.Content = "1 item selected";
- else if (selectedItemsCount > 1)
- sbiSelItemsCount.Content = selectedItemsCount.ToString() + " items selected";
- }
- private void SetUpButtonsStateOnSelectOrNavigate(int selectedItemsCount, IListItemEx selectedItem) {
- btnBadges.IsEnabled = selectedItemsCount > 0;
- btnCopy.IsEnabled = selectedItemsCount > 0;
- btnCopyto.IsEnabled = selectedItemsCount > 0;
- btnMoveto.IsEnabled = selectedItemsCount > 0;
- btnCut.IsEnabled = selectedItemsCount > 0;
- btnDelete.IsEnabled = selectedItem != null && selectedItem.IsFileSystem;
- btnRename.IsEnabled = selectedItem != null && (selectedItem.IsFileSystem || (selectedItem.Parent != null && selectedItem.Parent.Equals(KnownFolders.Libraries)));
- btnProperties3.IsEnabled = selectedItemsCount > 0;
- if (selectedItem != null) {
- var rg = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + Path.GetExtension(selectedItem.ParsingName) + @"\OpenWithProgids");
- if (rg == null)
- btnEdit.IsEnabled = false;
- else {
- string filetype = rg.GetValueNames()[0];
- rg.Close();
- using (var rgtype = Registry.ClassesRoot.OpenSubKey(filetype + @"\shell\edit\command")) {
- btnEdit.IsEnabled = !(rgtype == null);
- }
- }
- }
- btnSelAll.IsEnabled = selectedItemsCount != _ShellListView.Items.Count;
- btnSelNone.IsEnabled = selectedItemsCount > 0;
- btnShare.IsEnabled = selectedItemsCount == 1 && selectedItem.IsFolder;
- btnAdvancedSecurity.IsEnabled = selectedItemsCount == 1;
- btnHideSelItems.IsEnabled = _ShellListView.CurrentFolder.IsFileSystem;
- }
- private void SetupLibrariesTab(ShellLibrary lib) {
- IsFromSelectionOrNavigation = true;
- chkPinNav.IsChecked = lib.IsPinnedToNavigationPane;
- IsFromSelectionOrNavigation = false;
- foreach (ShellItem item in lib) {
- item.Thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly;
- item.Thumbnail.CurrentSize = new WIN.Size(16, 16);
- btnDefSave.Items.Add(Utilities.Build_MenuItem(item.GetDisplayName(SIGDN.NORMALDISPLAY), item, item.Thumbnail.BitmapSource, GroupName: "GRDS1", checkable: true,
- isChecked: item.ParsingName == lib.DefaultSaveFolder, onClick: miItem_Click));
- }
- btnDefSave.IsEnabled = lib.Count != 0;
- lib.Close();
- }
- /// <summary>
- /// Does setup required for the UI when navigation occurs to a new folder
- /// </summary>
- private void SetupUIOnSelectOrNavigate() {
- Dispatcher.BeginInvoke(DispatcherPriority.Background, (ThreadStart)(() => {
- btnDefSave.Items.Clear();
- var selItemsCount = _ShellListView.GetSelectedCount();
- var selectedItem = this._ShellListView.GetFirstSelectedItem();
- if (selectedItem == null) {
- btnOpenWith.IsEnabled = false;
- } else {
- var mnu = new ShellContextMenu(this._ShellListView, false);
- try {
- var tempPoint = btnOpenWith.PointToScreen(new WIN.Point(0, 0));
- var itemMenuCount = mnu.ShowContextMenu(new System.Drawing.Point((int)tempPoint.X, (int)tempPoint.Y + (int)btnOpenWith.ActualHeight), 1, false);
- btnOpenWith.IsEnabled = itemMenuCount > 0 && selItemsCount == 1;
- } catch {
- btnOpenWith.IsEnabled = false;
- }
- }
- btnNewItem.IsEnabled = this._ShellListView.CurrentFolder.IsFileSystem || this._ShellListView.CurrentFolder.ParsingName == KnownFolders.Libraries.ParsingName;
- if (selectedItem != null && selectedItem.IsFileSystem && BESettings.IsPreviewPaneEnabled && !selectedItem.IsFolder && selItemsCount == 1)
- this.Previewer.FileName = selectedItem.ParsingName;
- else if (!String.IsNullOrEmpty(this.Previewer.FileName))
- this.Previewer.FileName = null;
- //Set up ribbon contextual tabs on selection changed
- SetUpRibbonTabsVisibilityOnSelectOrNavigate(selItemsCount, selectedItem);
- SetUpButtonsStateOnSelectOrNavigate(selItemsCount, selectedItem);
- }));
- }
- bool IsFromSelectionOrNavigation = false;
- void cbm_ClipboardChanged(object sender, Tuple<WIN.Forms.IDataObject> e) {
- btnPaste.IsEnabled = e.Item1.GetDataPresent(DataFormats.FileDrop) || e.Item1.GetDataPresent("Shell IDList Array");
- btnPasetShC.IsEnabled = e.Item1.GetDataPresent(DataFormats.FileDrop) || e.Item1.GetDataPresent("Shell IDList Array");
- }
- #endregion
- #region Conditional Select
- private void miSelAllByType_Click(object sender, RoutedEventArgs e) {
- if (_ShellListView.GetSelectedCount() > 0) {
- var typePK = new PROPERTYKEY() { fmtid = Guid.Parse("B725F130-47EF-101A-A5F1-02608C9EEBAC"), pid = 4 };
- var flt = _ShellListView.SelectedItems.Select(item => item.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant());
- var items = _ShellListView.Items.Where(w => flt.Contains(w.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant())).ToArray();
- _ShellListView.SelectItems(items);
- btnCondSel.IsDropDownOpen = false;
- }
- }
- private void miSelAllByDate_Click(object sender, RoutedEventArgs e) {
- if (_ShellListView.GetSelectedCount() > 0) {
- var typePK = new PROPERTYKEY() { fmtid = Guid.Parse("b725f130-47ef-101a-a5f1-02608c9eebac"), pid = 15 };
- var flt = _ShellListView.SelectedItems.Select(item => DateTime.Parse(item.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant()).Date);
- var items = _ShellListView.Items.Where(w => flt.Contains(DateTime.Parse(w.GetPropertyValue(typePK, typeof(String)).Value.ToString().ToLowerInvariant()).Date)).ToArray();
- _ShellListView.SelectItems(items);
- btnCondSel.IsDropDownOpen = false;
- }
- }
- private void btnCondSel_Click(object sender, RoutedEventArgs e) {
- btnCondSel.IsDropDownOpen = false;
- ConditionalSelectForm.Open(_ShellListView);
- }
- #endregion
- #region Size Chart
- private void btnFSizeChart_Click(object sender, RoutedEventArgs e) {
- if (_ShellListView.GetSelectedCount() > 0) {
- if ((_ShellListView.GetFirstSelectedItem().IsFolder || _ShellListView.GetFirstSelectedItem().IsDrive) && _ShellListView.GetFirstSelectedItem().IsFileSystem) {
- FolderSizeWindow.Open(_ShellListView.GetFirstSelectedItem().ParsingName, this);
- return;
- }
- } else if ((_ShellListView.CurrentFolder.IsFolder || _ShellListView.CurrentFolder.IsDrive) && _ShellListView.CurrentFolder.IsFileSystem) {
- FolderSizeWindow.Open(_ShellListView.CurrentFolder.ParsingName, this);
- }
- }
- private void btnSizeChart_Click(object sender, RoutedEventArgs e) {
- FolderSizeWindow.Open(_ShellListView.CurrentFolder.ParsingName, this);
- }
- #endregion
- #region Home Tab
- private void btnctDocuments_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Documents.ParsingName, OperationType.Copy);
- private void btnctDesktop_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Desktop.ParsingName, OperationType.Copy);
- private void btnctDounloads_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Downloads.ParsingName, OperationType.Copy);
- private void btnmtDocuments_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Documents.ParsingName, OperationType.Move);
- private void btnmtDesktop_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Desktop.ParsingName, OperationType.Move);
- private void btnmtDounloads_Click(object sender, RoutedEventArgs e) => SetFOperation(KnownFolders.Downloads.ParsingName, OperationType.Move);
- private void btnCopyto_Click(object sender, RoutedEventArgs e) => btnctOther_Click(sender, e);
- private void btnMoveto_Click(object sender, RoutedEventArgs e) => btnmtOther_Click(sender, e);
- private void btnCut_Click(object sender, RoutedEventArgs e) => _ShellListView.CutSelectedFiles();
- private void btnOpenWith_Click(object sender, RoutedEventArgs e) => Process.Start($"\"{_ShellListView.GetFirstSelectedItem().ParsingName}\"");
- private void btnPaste_Click(object sender, RoutedEventArgs e) => _ShellListView.PasteAvailableFiles();
- private void btnDelete_Click(object sender, RoutedEventArgs e) => MenuItem_Click(sender, e);
- private void btnRename_Click(object sender, RoutedEventArgs e) => _ShellListView.RenameSelectedItem();
- private void btnSelAll_Click(object sender, RoutedEventArgs e) => _ShellListView.SelectAll();
- private void btnSelNone_Click(object sender, RoutedEventArgs e) => _ShellListView.DeSelectAllItems();
- private void MenuItem_Click(object sender, RoutedEventArgs e) => _ShellListView.DeleteSelectedFiles(true);
- private void MenuItem_Click_1(object sender, RoutedEventArgs e) => _ShellListView.DeleteSelectedFiles(false);
- private void btnProperties_Click(object sender, RoutedEventArgs e) => _ShellListView.ShowPropPage(this.Handle, _ShellListView.GetFirstSelectedItem().ParsingName, "");
- private void btnInvSel_Click(object sender, RoutedEventArgs e) => _ShellListView.InvertSelection();
- private void btnNewWindow_Click(object sender, RoutedEventArgs e) => Process.Start(Assembly.GetExecutingAssembly().Location, "/nw");
- void miow_Click(object sender, RoutedEventArgs e) => ((AssociationItem)(sender as MenuItem).Tag).Invoke();
- private void miJunctionpoint_Click(object sender, RoutedEventArgs e) {
- string pathForDrop = _ShellListView.CurrentFolder.ParsingName.Replace(@"\\", @"\");
- var files = new string[0];
- if (Clipboards.ContainsData("Shell IDList Array"))
- files = Clipboards.GetDataObject().ToShellItemArray().ToArray().Select(s => new ShellItem(s).ParsingName).ToArray();
- else
- files = Clipboards.GetFileDropList().OfType<string>().ToArray();
- foreach (string item in files) {
- var o = new ShellItem(item);
- JunctionPointUtils.JunctionPoint.Create($@"{pathForDrop}\{o.GetDisplayName(SIGDN.NORMALDISPLAY)}", o.ParsingName, true);
- AddToLog($@"Created Junction Point at {pathForDrop}\{o.GetDisplayName(SIGDN.NORMALDISPLAY)} linked to {o.ParsingName}");
- }
- }
- private void miCreateSymlink_Click(object sender, RoutedEventArgs e) {
- var items = new IListItemEx[0];
- 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();
- var pathForDrop = _ShellListView.CurrentFolder.ParsingName.Replace(@"\\", @"\");
- var exePath = Utilities.AppDirectoryItem("BetterExplorerOperations.exe");
- var linkItems = items.Select(s => new LinkItem() {
- IsDirectory = s.IsFolder,
- DestinationData = pathForDrop + @"\" + s.DisplayName,
- SourceData = s.ParsingName
- }).ToArray();
- Task.Run(() => {
- using (var proc = new Process()) {
- proc.StartInfo = new ProcessStartInfo {
- FileName = exePath,
- Verb = "runas",
- UseShellExecute = true,
- Arguments = $"/env /user:Administrator \"{exePath}\""
- };
- proc.Start();
- ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
- var address = new EndpointAddress(new Uri("net.tcp://localhost:60000/BEComChannel"));
- var binding = new NetTcpBinding() { MaxReceivedMessageSize = 4000000, MaxBufferPoolSize = 4000000, MaxBufferSize = 4000000 };
- binding.Security = new NetTcpSecurity() { Mode = SecurityMode.Message };
- var factory = new ChannelFactory<IBetterExplorerCommunication>(binding, address);
- var beSvc = factory.CreateChannel();
- try {
- beSvc.CreateLink(new LinkData() { Items = linkItems });
- } finally {
- Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => this._ShellListView.UnvalidateDirectory()));
- }
- proc.WaitForExit();
- if (proc.ExitCode == 1)
- MessageBox.Show("Error in creating symlink", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
- else {
- Thread.Sleep(1000);
- Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => this._ShellListView.UnvalidateDirectory()));
- }
- }
- });
- }
- private void btnHistory_Click(object sender, RoutedEventArgs e) {
- _ShellListView.ShowPropPage(this.Handle, _ShellListView.GetFirstSelectedItem().ParsingName,
- User32.LoadResourceString(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "twext.dll"), 1024, "Previous Versions"));
- }
- private void btnBackstageExit_Click(object sender, RoutedEventArgs e) {
- //! We call Shutdown() so to explicit shutdown the app regardless of windows closing cancel flag.
- if (this.IsMultipleWindowsOpened)
- this.Close();
- else
- Application.Current.Shutdown();
- }
- void mif_Click(object sender, RoutedEventArgs e) {
- using (var obj = (sender as MenuItem).Tag as ShellItem)
- using (var lnk = new ShellLink(obj.ParsingName)) {
- NavigationController(FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, lnk.TargetPIDL));
- }
- }
- private void btnCopy_Click(object sender, RoutedEventArgs e) {
- var sc = new StringCollection();
- sc.AddRange(_ShellListView.SelectedItems.Select(x => x.ParsingName).ToArray());
- Clipboards.SetFileDropList(sc);
- }
- private void btnPathCopy_Click(object sender, RoutedEventArgs e) {
- if (_ShellListView.SelectedItems.Count > 1)
- Clipboards.SetText(_ShellListView.SelectedItems.Select(item => "\r\n" + item.ParsingName).Aggregate((x, y) => x + y).Trim());
- else if (_ShellListView.SelectedItems.Count == 1)
- Clipboards.SetText(_ShellListView.GetFirstSelectedItem().ParsingName);
- else
- Clipboards.SetText(_ShellListView.CurrentFolder.ParsingName);
- }
- // New Folder/Library
- private void btnNewFolder_Library(object sender, RoutedEventArgs e) {
- //We should focus the ListView or on some circumstances new folder does not start renaming after folder is created
- this._ShellListView.Focus();
- _ShellListView.IsRenameNeeded = true;
- if (_ShellListView.CurrentFolder.ParsingName == KnownFolders.Libraries.ParsingName)
- _ShellListView.CreateNewLibrary(FindResource("btnNewLibraryCP").ToString());
- else
- _ShellListView.CreateNewFolder(null);
- }
- private void btnPasetShC_Click(object sender, RoutedEventArgs e) {
- string PathForDrop = _ShellListView.CurrentFolder.ParsingName;
- foreach (string item in Clipboards.GetFileDropList()) {
- using (var shortcut = new ShellLink()) {
- var o = new ShellItem(item);
- shortcut.Target = item;
- shortcut.WorkingDirectory = Path.GetDirectoryName(item);
- shortcut.Description = o.GetDisplayName(SIGDN.NORMALDISPLAY);
- shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
- shortcut.Save($"{PathForDrop}\\{o.GetDisplayName(SIGDN.NORMALDISPLAY)}.lnk");
- AddToLog($"Shortcut created at {PathForDrop}\\{o.GetDisplayName(SIGDN.NORMALDISPLAY)} from source {item}");
- }
- }
- }
- private void btnmtOther_Click(object sender, RoutedEventArgs e) {
- var dlg = new FolderSelectDialog();
- if (dlg.ShowDialog())
- SetFOperation(dlg.FileName, OperationType.Move);
- }
- private void SetFOperation(String fileName, OperationType opType) {
- var obj = FileSystemListItem.ToFileSystemItem(this._ShellListView.LVHandle, fileName.ToShellParsingName());
- if (opType == OperationType.Copy)
- _ShellListView.DoCopy(obj);
- else if (opType == OperationType.Move)
- _ShellListView.DoMove(obj);
- }
- private void SetFOperation(IListItemEx obj, OperationType opType) {
- if (opType == OperationType.Copy)
- _ShellListView.DoCopy(obj);
- else if (opType == OperationType.Move)
- _ShellListView.DoMove(obj);
- }
- private void btnctOther_Click(object sender, RoutedEventArgs e) {
- var dlg = new FolderSelectDialog();
- if (dlg.ShowDialog())
- SetFOperation(dlg.FileName, OperationType.Copy);
- _ShellListView.Focus();
- }
- private void btnNewItem_Click(object sender, RoutedEventArgs e) {
- var state = new BExplorer.Shell.Interop.Shell32.SHELLSTATE() { fShowAllObjects = 0 };
- BExplorer.Shell.Interop.Shell32.SHGetSetSettings(ref state, BExplorer.Shell.Interop.Shell32.SSF.SSF_SHOWALLOBJECTS, true);
- }
- private void btnEdit_Click(object sender, RoutedEventArgs e) {
- new Process() {
- StartInfo = new ProcessStartInfo {
- FileName = _ShellListView.GetFirstSelectedItem().ParsingName,
- Verb = "edit",
- UseShellExecute = true,
- }
- }.Start();
- }
- private void btnFavorites_Click(object sender, RoutedEventArgs e) {
- var selectedItems = _ShellListView.SelectedItems;
- if (selectedItems.Count == 1) {
- var link = new ShellLink();
- link.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
- link.Target = _ShellListView.GetFirstSelectedItem().ParsingName;
- link.Save($@"{KnownFolders.Links.ParsingName}\{_ShellListView.GetFirstSelectedItem().DisplayName}.lnk");
- link.Dispose();
- }
- if (selectedItems.Count == 0) {
- var link = new ShellLink();
- link.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
- link.Target = _ShellListView.CurrentFolder.ParsingName;
- link.Save($@"{KnownFolders.Links.ParsingName}\{_ShellListView.CurrentFolder.DisplayName}.lnk");
- link.Dispose();
- }
- }
- #endregion
- #region Drive Tools / Virtual Disk Tools
- private void btnDefragDrive_Click(object sender, RoutedEventArgs e) {
- string DriveLetter = "";
- if (!_ShellListView.SelectedItems.Any())
- DriveLetter = _ShellListView.CurrentFolder.ParsingName;
- else if (Directory.GetLogicalDrives().Contains(_ShellListView.SelectedItems[0].ParsingName))
- DriveLetter = _ShellListView.SelectedItems[0].ParsingName;
- else
- DriveLetter = _ShellListView.CurrentFolder.ParsingName;
- Process.Start(Path.Combine(Environment.SystemDirectory, "dfrgui.exe"), $"/u /v {DriveLetter.Replace("\\", "")}");
- }
- private char GetDriveLetterFromDrivePath(string path) => path.Substring(0, 1).ToCharArray()[0];
- private void btnFormatDrive_Click(object sender, RoutedEventArgs e) {
- if (MessageBox.Show("Are you sure you want to do this?", FindResource("btnFormatDriveCP").ToString(), MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) {
- var formatDriveThread = new Thread(() => {
- string DriveLetter =
- _ShellListView.SelectedItems.Any() ?
- DriveLetter = Directory.GetLogicalDrives().Contains(_ShellListView.SelectedItems[0].ParsingName) ? _ShellListView.SelectedItems[0].ParsingName : _ShellListView.CurrentFolder.ParsingName
- :
- DriveLetter = _ShellListView.CurrentFolder.ParsingName;
- BExplorer.Shell.Interop.Shell32.FormatDrive(IntPtr.Zero, DriveLetter);
- });
- formatDriveThread.Start();
- }
- }
- private void btnCleanDrive_Click(object sender, RoutedEventArgs e) {
- string DriveLetter = "";
- if (_ShellListView.SelectedItems.Any())
- DriveLetter = Directory.GetLogicalDrives().Contains(_ShellListView.SelectedItems[0].ParsingName) ? _ShellListView.SelectedItems[0].ParsingName : _ShellListView.CurrentFolder.ParsingName;
- else
- DriveLetter = _ShellListView.CurrentFolder.ParsingName;
- Process.Start("Cleanmgr.exe", "/d" + DriveLetter.Replace(":\\", ""));
- }
- private void OpenCDTray(char DriveLetter) {
- mciSendString($"open {DriveLetter}: type CDAudio alias drive{DriveLetter}", null, 0, IntPtr.Zero);
- mciSendString($"set drive{DriveLetter} door open", null, 0, IntPtr.Zero);
- }
- private void CloseCDTray(char DriveLetter) {
- mciSendString($"open {DriveLetter}: type CDAudio alias drive{DriveLetter}", null, 0, IntPtr.Zero);
- mciSendString($"set drive{DriveLetter} door closed", null, 0, IntPtr.Zero);
- }
- private void btnOpenTray_Click(object sender, RoutedEventArgs e) {
- if (_ShellListView.GetFirstSelectedItem()?.GetDriveInfo().DriveType == DriveType.CDRom)
- OpenCDTray(GetDriveLetterFromDrivePath(_ShellListView.GetFirstSelectedItem().ParsingName));
- }
- private void btnCloseTray_Click(object sender, RoutedEventArgs e) {
- if (_ShellListView.GetFirstSelectedItem()?.GetDriveInfo().DriveType == DriveType.CDRom)
- CloseCDTray(GetDriveLetterFromDrivePath(_ShellListView.GetFirstSelectedItem().ParsingName));
- }
- private void EjectDisk(char DriveLetter) {
- Thread t = new Thread(() => {
- Thread.Sleep(10);
- var vdc = new VolumeDeviceClass();
- foreach (Volume item in vdc.Devices) {
- if (GetDriveLetterFromDrivePath(item.LogicalDrive) == DriveLetter) {
- var veto = item.Eject(false);
- if (veto != Native.PNP_VETO_TYPE.TypeUnknown) {
- if (veto == Native.PNP_VETO_TYPE.Ok) {
- Dispatcher.BeginInvoke(DispatcherPriority.Normal,
- (Action)(() => {
- this.beNotifyIcon.ShowBalloonTip("Information", $"It is safe to remove {item.LogicalDrive}", Hardcodet.Wpf.TaskbarNotification.BalloonIcon.Info);
- var tabsForRemove = tcMain.Items.OfType<Wpf.Controls.TabItem>().Where(w => {
- var root = String.Empty;
- try {
- root = Path.GetPathRoot(w.ShellObject.ParsingName.ToShellParsingName());
- } catch { }
- return !String.IsNullOrEmpty(root) && (w.ShellObject.IsFileSystem &&
- root.ToLowerInvariant() == $"{DriveLetter}:\\".ToLowerInvariant());
- }).ToArray();
- foreach (Wpf.Controls.TabItem tab in tabsForRemove) {
- tcMain.RemoveTabItem(tab);
- }
- }));
- } else {
- var message = String.Empty;
- var obj = new ShellItem(item.LogicalDrive);
- switch (veto) {
- case Native.PNP_VETO_TYPE.Ok:
- break;
- case Native.PNP_VETO_TYPE.TypeUnknown:
- break;
- case Native.PNP_VETO_TYPE.LegacyDevice:
- break;
- case Native.PNP_VETO_TYPE.PendingClose:
- break;
- case Native.PNP_VETO_TYPE.WindowsApp:
- break;
- case Native.PNP_VETO_TYPE.WindowsService:
- break;
- case Native.PNP_VETO_TYPE.OutstandingOpen:
- message = $"The device {obj.GetDisplayName(SIGDN.NORMALDISPLAY)} can not be disconnected because is in use!";
- break;
- case Native.PNP_VETO_TYPE.Device:
- break;
- case Native.PNP_VETO_TYPE.Driver:
- break;
- case Native.PNP_VETO_TYPE.IllegalDeviceRequest:
- break;
- case Native.PNP_VETO_TYPE.InsufficientPower:
- break;
- case Native.PNP_VETO_TYPE.NonDisableable:
- message = $"The device {obj.GetDisplayName(SIGDN.NORMALDISPLAY)} does not support disconnecting!";
- break;
- case Native.PNP_VETO_TYPE.LegacyDriver:
- break;
- default:
- break;
- }
- Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => this.beNotifyIcon.ShowBalloonTip("Error", message, Hardcodet.Wpf.TaskbarNotification.BalloonIcon.Error)));
- }
- }
- break;
- }
- }
- });
- t.SetApartmentState(ApartmentState.STA);
- t.Start();
- }
- private void btnEjectDevice_Click(object sender, RoutedEventArgs e) {
- var firstSelectedItem = _ShellListView.GetFirstSelectedItem();
- if (firstSelectedItem?.GetDriveInfo().DriveType == DriveType.Removable || firstSelectedItem.GetDriveInfo().DriveType == DriveType.Fixed) {
- EjectDisk(GetDriveLetterFromDrivePath(firstSelectedItem.ParsingName));
- //USBEject.EjectDrive(GetDriveLetterFromDrivePath(firstSelectedItem.ParsingName));
- }
- }
- // Virtual Disk Tools
- private bool CheckImDiskInstalled() {
- try {
- ImDiskAPI.GetDeviceList();
- return true;
- } catch (DllNotFoundException) {
- return false;
- }
- }
- public void ShowInstallImDiskMessage() {
- 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) {
- Process.Start("http://www.ltr-data.se/opencode.html/#ImDisk");
- }
- }
- private void btnAdvMountIso_Click(object sender, RoutedEventArgs e) {
- if (!CheckImDiskInstalled()) {
- ShowInstallImDiskMessage();
- return;
- }
- var mi = new MountIso() { Owner = this };
- mi.ShowDialog();
- if (mi.yep) {
- string DriveLetter = String.Format("{0}:", mi.chkPreselect.IsChecked == true ? ImDiskAPI.FindFreeDriveLetter() : (char)mi.cbbLetter.SelectedItem);
- long size = mi.chkPresized.IsChecked == true ? 0 : Convert.ToInt64(mi.txtSize.Text);
- ImDiskFlags i…
Large files files are truncated, but you can click here to view the full file