diff --git a/src/Helpers/TreeViewHelper.cs b/src/Helpers/TreeViewHelper.cs
index d1b74bf2..605fc4f4 100644
--- a/src/Helpers/TreeViewHelper.cs
+++ b/src/Helpers/TreeViewHelper.cs
@@ -122,6 +122,25 @@ namespace SourceGit.Helpers {
if (tree != null) tree.RemoveHandler(MultiSelectionChangedEvent, handler);
}
+ ///
+ /// Find ScrollViewer of a tree view
+ ///
+ ///
+ ///
+ public static ScrollViewer GetScrollViewer(FrameworkElement owner) {
+ if (owner == null) return null;
+ if (owner is ScrollViewer) return owner as ScrollViewer;
+
+ int n = VisualTreeHelper.GetChildrenCount(owner);
+ for (int i = 0; i < n; i++) {
+ var child = VisualTreeHelper.GetChild(owner, i) as FrameworkElement;
+ var deep = GetScrollViewer(child);
+ if (deep != null) return deep;
+ }
+
+ return null;
+ }
+
///
/// Select all items in tree.
///
diff --git a/src/SourceGit.csproj b/src/SourceGit.csproj
index 6b4dca0f..d846c6f3 100644
--- a/src/SourceGit.csproj
+++ b/src/SourceGit.csproj
@@ -3,7 +3,6 @@
net46
WinExe
true
- true
App.ico
sourcegit
OpenSource GIT client for Windows
diff --git a/src/UI/AddSubmodule.xaml.cs b/src/UI/AddSubmodule.xaml.cs
index 7a9c9471..8307faae 100644
--- a/src/UI/AddSubmodule.xaml.cs
+++ b/src/UI/AddSubmodule.xaml.cs
@@ -38,17 +38,6 @@ namespace SourceGit.UI {
}
#region EVENTS
- private void SelectFolder(object sender, RoutedEventArgs e) {
- var dialog = new System.Windows.Forms.FolderBrowserDialog();
- dialog.Description = "Select Folder To Clone Repository";
- dialog.SelectedPath = repo.Path;
- dialog.ShowNewFolderButton = true;
-
- if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
- txtPath.Text = dialog.SelectedPath;
- }
- }
-
private async void Sure(object sender, RoutedEventArgs e) {
txtRepoUrl.GetBindingExpression(TextBox.TextProperty).UpdateSource();
if (Validation.GetHasError(txtRepoUrl)) return;
diff --git a/src/UI/Clone.xaml.cs b/src/UI/Clone.xaml.cs
index 278f13cb..6beccdf9 100644
--- a/src/UI/Clone.xaml.cs
+++ b/src/UI/Clone.xaml.cs
@@ -1,4 +1,3 @@
-using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
@@ -46,14 +45,8 @@ namespace SourceGit.UI {
///
///
private void SelectParentFolder(object sender, RoutedEventArgs e) {
- var dialog = new System.Windows.Forms.FolderBrowserDialog();
- dialog.Description = "Git Repository URL";
- dialog.RootFolder = Environment.SpecialFolder.MyComputer;
- dialog.ShowNewFolderButton = true;
-
- if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
- txtParentFolder.Text = dialog.SelectedPath;
- }
+ var dialog = new FolderDailog("Select folder to store repository", null);
+ dialog.Open(path => txtParentFolder.Text = path);
}
///
diff --git a/src/UI/CommitViewer.xaml.cs b/src/UI/CommitViewer.xaml.cs
index f63cc373..f84f64b3 100644
--- a/src/UI/CommitViewer.xaml.cs
+++ b/src/UI/CommitViewer.xaml.cs
@@ -297,14 +297,11 @@ namespace SourceGit.UI {
MenuItem saveAs = new MenuItem();
saveAs.Header = "Save As ...";
saveAs.Click += (obj, ev) => {
- var dialog = new System.Windows.Forms.FolderBrowserDialog();
- dialog.Description = path;
- dialog.ShowNewFolderButton = true;
-
- if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
- var savePath = Path.Combine(dialog.SelectedPath, Path.GetFileName(path));
+ var dialog = new FolderDailog("Save To ...", null);
+ dialog.Open(saveTo => {
+ var savePath = Path.Combine(saveTo, Path.GetFileName(path));
commit.SaveFileTo(repo, path, savePath);
- }
+ });
};
menu.Items.Add(saveAs);
}
@@ -453,22 +450,8 @@ namespace SourceGit.UI {
}
}
- private ScrollViewer GetScrollViewer(FrameworkElement owner) {
- if (owner == null) return null;
- if (owner is ScrollViewer) return owner as ScrollViewer;
-
- int n = VisualTreeHelper.GetChildrenCount(owner);
- for (int i = 0; i < n; i++) {
- var child = VisualTreeHelper.GetChild(owner, i) as FrameworkElement;
- var deep = GetScrollViewer(child);
- if (deep != null) return deep;
- }
-
- return null;
- }
-
private void TreeMouseWheel(object sender, MouseWheelEventArgs e) {
- var scroll = GetScrollViewer(sender as TreeView);
+ var scroll = Helpers.TreeViewHelper.GetScrollViewer(sender as TreeView);
if (scroll == null) return;
if (e.Delta > 0) {
@@ -520,14 +503,11 @@ namespace SourceGit.UI {
saveAs.Header = "Save As ...";
saveAs.IsEnabled = node.CommitObject == null || node.CommitObject.Kind == Git.Commit.Object.Type.Blob;
saveAs.Click += (obj, ev) => {
- var dialog = new System.Windows.Forms.FolderBrowserDialog();
- dialog.Description = node.FilePath;
- dialog.ShowNewFolderButton = true;
-
- if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
- var path = Path.Combine(dialog.SelectedPath, node.Name);
+ var dialog = new FolderDailog("Save To ...", null);
+ dialog.Open(saveTo => {
+ var path = Path.Combine(saveTo, node.Name);
commit.SaveFileTo(repo, node.FilePath, path);
- }
+ });
};
menu.Items.Add(saveAs);
}
diff --git a/src/UI/Dashboard.xaml.cs b/src/UI/Dashboard.xaml.cs
index 9b60dc35..f4d6a048 100644
--- a/src/UI/Dashboard.xaml.cs
+++ b/src/UI/Dashboard.xaml.cs
@@ -1054,22 +1054,8 @@ namespace SourceGit.UI {
if (item != null) item.IsSelected = false;
}
- private ScrollViewer GetScrollViewer(FrameworkElement owner) {
- if (owner == null) return null;
- if (owner is ScrollViewer) return owner as ScrollViewer;
-
- int n = VisualTreeHelper.GetChildrenCount(owner);
- for (int i = 0; i < n; i++) {
- var child = VisualTreeHelper.GetChild(owner, i) as FrameworkElement;
- var deep = GetScrollViewer(child);
- if (deep != null) return deep;
- }
-
- return null;
- }
-
private void TreeMouseWheel(object sender, MouseWheelEventArgs e) {
- var scroll = GetScrollViewer(sender as TreeView);
+ var scroll = Helpers.TreeViewHelper.GetScrollViewer(sender as TreeView);
if (scroll == null) return;
if (e.Delta > 0) {
diff --git a/src/UI/DiffViewer.xaml.cs b/src/UI/DiffViewer.xaml.cs
index 6f0dc81c..672001df 100644
--- a/src/UI/DiffViewer.xaml.cs
+++ b/src/UI/DiffViewer.xaml.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
-using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
diff --git a/src/UI/FolderDailog.xaml b/src/UI/FolderDailog.xaml
new file mode 100644
index 00000000..744c719d
--- /dev/null
+++ b/src/UI/FolderDailog.xaml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/UI/FolderDailog.xaml.cs b/src/UI/FolderDailog.xaml.cs
new file mode 100644
index 00000000..1f8c79e8
--- /dev/null
+++ b/src/UI/FolderDailog.xaml.cs
@@ -0,0 +1,185 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace SourceGit.UI {
+
+ ///
+ /// Interaction logic for FolderDailog.xaml
+ ///
+ public partial class FolderDailog : Window {
+ private Action cb = null;
+ private Node root = new Node("", "");
+ private Node selected = null;
+
+ ///
+ /// Tree node.
+ ///
+ public class Node : INotifyPropertyChanged {
+ public string Name { get; set; }
+ public string Path { get; set; }
+ public bool IsOpened { get; set; }
+ public ObservableCollection Children { get; set; }
+
+ ///
+ /// INotifyPropertyChanged.PropertyChanged
+ ///
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ ///
+ /// Constructor.
+ ///
+ ///
+ ///
+ ///
+ public Node(string name, string path) {
+ Name = name;
+ Path = path;
+ IsOpened = false;
+ Children = new ObservableCollection();
+ }
+
+ ///
+ /// Collect children.
+ ///
+ public void CollectChildren() {
+ Children.Clear();
+
+ try {
+ var dir = new DirectoryInfo(Path);
+ var subs = dir.GetDirectories();
+
+ foreach (var sub in subs) {
+ if ((sub.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue;
+ Children.Add(new Node(sub.Name, sub.FullName));
+ }
+ } catch {}
+
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Children"));
+ }
+ }
+
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
+ public FolderDailog(string title, string initPath) {
+ InitializeComponent();
+
+ // Move to center.
+ var parent = App.Current.MainWindow;
+ Left = parent.Left + (parent.Width - Width) * 0.5;
+ Top = parent.Top + (parent.Height - Height) * 0.5;
+
+ var drives = DriveInfo.GetDrives();
+ foreach (var drive in drives) {
+ var node = new Node(drive.Name, drive.Name);
+
+ node.CollectChildren();
+ if (initPath != null && initPath.StartsWith(drive.Name)) InitializePath(node, initPath);
+
+ root.Children.Add(node);
+ }
+
+ txtTitle.Content = title.ToUpper();
+ treePath.ItemsSource = root.Children;
+
+ if (selected != null) {
+ Helpers.TreeViewHelper.SelectOneByContext(treePath, selected);
+ } else {
+ btnSure.IsEnabled = false;
+ }
+ }
+
+ ///
+ /// Set callbacks on click OK.
+ ///
+ ///
+ public void Open(Action onOK) {
+ cb = onOK;
+ Show();
+ }
+
+ ///
+ /// Initialize given path.
+ ///
+ ///
+ ///
+ private void InitializePath(Node parent, string initPath) {
+ foreach (var child in parent.Children) {
+ child.CollectChildren();
+ if (child.Path == initPath) {
+ selected = child;
+ } else if (initPath.StartsWith(child.Path)) {
+ InitializePath(child, initPath);
+ }
+ }
+ }
+
+ #region EVENTS
+ private void OnSure(object sender, RoutedEventArgs e) {
+ if (selected != null) cb?.Invoke(selected.Path);
+ Close();
+ }
+
+ private void OnQuit(object sender, RoutedEventArgs e) {
+ Close();
+ }
+
+ private void OnTreeMouseWheel(object sender, MouseWheelEventArgs e) {
+ var scroll = Helpers.TreeViewHelper.GetScrollViewer(sender as TreeView);
+ if (scroll == null) return;
+
+ if (e.Delta > 0) {
+ scroll.LineUp();
+ } else {
+ scroll.LineDown();
+ }
+
+ e.Handled = true;
+ }
+
+ private void OnTreeSelectedChanged(object sender, RoutedPropertyChangedEventArgs