PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/nuget.packages/MainWindow.xaml.cs

https://bitbucket.org/nisbus/nuget_package_config_manager
C# | 286 lines | 253 code | 30 blank | 3 comment | 38 complexity | cbb03dfdfcd0a43fa138b735aa3a68be MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.ComponentModel;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Reactive.Linq;
  8. using System.Reactive.Subjects;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. using System.Windows.Controls;
  13. using System.Windows.Data;
  14. using System.Windows.Documents;
  15. using System.Windows.Forms;
  16. using System.Windows.Input;
  17. using System.Windows.Media;
  18. using System.Windows.Media.Imaging;
  19. using System.Windows.Navigation;
  20. using System.Windows.Shapes;
  21. using System.Xml;
  22. using System.Xml.Linq;
  23. using ReactiveUI;
  24. using Elysium.Theme;
  25. using MahApps.Metro.Controls;
  26. namespace nuget.packages
  27. {
  28. /// <summary>
  29. /// Interaction logic for MainWindow.xaml
  30. /// </summary>
  31. public partial class MainWindow : MetroWindow, INotifyPropertyChanged
  32. {
  33. #region Fields
  34. Subject<NugetPackage> packageSubscription = new Subject<NugetPackage>();
  35. #endregion
  36. #region Properties
  37. string _Path;
  38. public string Path
  39. {
  40. get { return _Path; }
  41. set
  42. {
  43. _Path = value;
  44. if (PropertyChanged != null)
  45. PropertyChanged(this, new PropertyChangedEventArgs("Path"));
  46. if (!string.IsNullOrEmpty(value))
  47. ScanFolder();
  48. }
  49. }
  50. public ReactiveCollection<NugetPackage> Packages { get; set; }
  51. bool loading;
  52. public bool Loading
  53. {
  54. get { return loading; }
  55. set
  56. {
  57. loading = value;
  58. if (PropertyChanged != null)
  59. {
  60. PropertyChanged(this, new PropertyChangedEventArgs("Loading"));
  61. PropertyChanged(this, new PropertyChangedEventArgs("NotLoading"));
  62. }
  63. }
  64. }
  65. public bool NotLoading { get { return !Loading; } }
  66. #endregion
  67. #region CTOR
  68. public MainWindow()
  69. {
  70. InitializeComponent();
  71. Packages = new ReactiveCollection<NugetPackage>();
  72. packageSubscription.ObserveOnDispatcher().Subscribe(x => Packages.Add(x));
  73. this.DataContext = this;
  74. }
  75. #endregion
  76. private void ScanFolder()
  77. {
  78. Loading = true;
  79. Packages.Clear();
  80. Task.Factory.StartNew<IEnumerable<NugetPackage>>(() =>
  81. {
  82. IEnumerable<NugetPackage> packUnion = new List<NugetPackage>();
  83. var packagesFiles = Directory.GetFiles(Path, "packages.config", SearchOption.AllDirectories).ToList();
  84. foreach (var file in packagesFiles)
  85. {
  86. XDocument doc = XDocument.Load(file);
  87. List<NugetPackage> packages = new List<NugetPackage>();
  88. foreach (XElement p in doc.Root.DescendantNodes())
  89. {
  90. var id = p.Attribute("id") != null ? p.Attribute("id").Value : string.Empty;
  91. var version = p.Attribute("version") != null ? p.Attribute("version").Value : string.Empty;
  92. var allowed = p.Attribute("allowedVersions") != null ? p.Attribute("allowedVersions").Value : string.Empty;
  93. var framework = p.Attribute("targetFramework") != null ? p.Attribute("targetFramework").Value : string.Empty;
  94. packages.Add(new NugetPackage(id, version, allowed, framework, file));
  95. }
  96. packUnion = packages.Union(packUnion).OrderByDescending(x => x.Id);
  97. }
  98. return packUnion;
  99. }).ContinueWith((packs) =>
  100. {
  101. foreach (var p in packs.Result)
  102. packageSubscription.OnNext(p);
  103. Loading = false;
  104. });
  105. }
  106. #region Button and menu clicks
  107. private void btnFolderSelectClick(object sender, RoutedEventArgs e)
  108. {
  109. var dlg = new FolderBrowserDialog();
  110. var result = dlg.ShowDialog(this.GetIWin32Window());
  111. if (result == System.Windows.Forms.DialogResult.OK)
  112. Path = dlg.SelectedPath;
  113. }
  114. private void SmartMergeClick(object sender, RoutedEventArgs e)
  115. {
  116. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  117. if (selected.Count() > 0 && selected.All(x => x.Id == selected.First().Id))
  118. {
  119. var highest = selected.Max(x => x.Version);
  120. var allowed = selected.Where(x => !string.IsNullOrEmpty(x.AllowedVersions)).Min(x => x.AllowedVersions);
  121. var target = selected.Max(x => x.TargetFramework);
  122. foreach (var package in selected)
  123. {
  124. package.Version = highest;
  125. package.TargetFramework = target;
  126. package.AllowedVersions = allowed;
  127. }
  128. }
  129. }
  130. private void SmartMergeAllClick(object sender, RoutedEventArgs e)
  131. {
  132. var groups = Packages.GroupBy(x => x.Id);
  133. foreach (var g in groups)
  134. {
  135. var selected = Packages.Where(x => x.Id == g.Key);
  136. var highest = selected.Max(x => x.Version);
  137. var allowed = selected.Where(x => !string.IsNullOrEmpty(x.AllowedVersions)).Min(x => x.AllowedVersions);
  138. var target = selected.Max(x => x.TargetFramework);
  139. foreach (var package in selected)
  140. {
  141. package.Version = highest;
  142. package.TargetFramework = target;
  143. package.AllowedVersions = allowed;
  144. }
  145. }
  146. }
  147. private void MergeVersionsClick(object sender, RoutedEventArgs e)
  148. {
  149. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  150. if (selected.Count() > 0 && selected.All(x => x.Id == selected.First().Id))
  151. {
  152. var highest = selected.Max(x => x.Version);
  153. foreach (var package in selected)
  154. package.Version = highest;
  155. }
  156. }
  157. private void SpecificVersionClick(object sender, RoutedEventArgs e)
  158. {
  159. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  160. if (selected.Count() > 0 && selected.All(x => x.Id == selected.First().Id))
  161. {
  162. InputDialog dlg = new InputDialog("Confirm", "Type the version");
  163. if ((bool)dlg.ShowDialog())
  164. {
  165. foreach (var p in selected)
  166. p.Version = dlg.Result;
  167. }
  168. }
  169. }
  170. private void TargetFrameworkClick(object sender, RoutedEventArgs e)
  171. {
  172. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  173. if (selected.Count() > 0 && selected.All(x => x.Id == selected.First().Id))
  174. {
  175. InputDialog dlg = new InputDialog("Confirm", "Type the target framework");
  176. if ((bool)dlg.ShowDialog())
  177. {
  178. foreach (var p in selected)
  179. p.TargetFramework = dlg.Result;
  180. }
  181. }
  182. }
  183. private void AllowedVersionsClick(object sender, RoutedEventArgs e)
  184. {
  185. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  186. if (selected.Count() > 0 && selected.All(x => x.Id == selected.First().Id))
  187. {
  188. InputDialog dlg = new InputDialog("Confirm", "Type the allowed versions");
  189. if ((bool)dlg.ShowDialog())
  190. {
  191. foreach (var p in selected)
  192. p.AllowedVersions = dlg.Result;
  193. }
  194. }
  195. }
  196. private void RestrictToCurrentClick(object sender, RoutedEventArgs e)
  197. {
  198. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  199. if (selected.Count() > 0 && selected.All(x => x.Id == selected.First().Id))
  200. {
  201. var highest = selected.Max(x => x.Version);
  202. foreach (var package in selected)
  203. {
  204. package.AllowedVersions = "["+highest+"]";
  205. }
  206. }
  207. }
  208. private void RestrictAllToCurrentClick(object sender, RoutedEventArgs e)
  209. {
  210. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  211. if (selected.Count() > 0 && selected.All(x => x.Id == selected.First().Id))
  212. {
  213. var highest = selected.Max(x => x.Version);
  214. foreach (var package in selected)
  215. {
  216. package.AllowedVersions = "[" + highest + "]";
  217. }
  218. }
  219. }
  220. private void btnWriteClick(object sender, RoutedEventArgs e)
  221. {
  222. Loading = true;
  223. var selected = packageGrid.SelectedItems.OfType<NugetPackage>();
  224. foreach (var s in selected.GroupBy(x => x.Project))
  225. {
  226. var file = s.Key;
  227. var projectPackages = Packages.Where(x => x.Project == file);
  228. if (projectPackages.Count() > 0)
  229. {
  230. var newFile = projectPackages.GetPackageString();
  231. using (var f = File.Create(file))
  232. {
  233. var fileAsBytes = Encoding.UTF8.GetBytes(newFile);
  234. f.Write(fileAsBytes, 0, fileAsBytes.Length);
  235. }
  236. }
  237. }
  238. Loading = false;
  239. }
  240. #endregion
  241. public event PropertyChangedEventHandler PropertyChanged;
  242. }
  243. public static class EnumerableExtensions
  244. {
  245. public static string GetPackageString(this IEnumerable<NugetPackage> source)
  246. {
  247. StringBuilder sb = new StringBuilder();
  248. sb.AppendLine(@"<?xml version=""1.0"" encoding=""utf-8""?>");
  249. sb.AppendLine("<packages>");
  250. foreach (var s in source)
  251. sb.AppendLine(" "+s.ToString());
  252. sb.AppendLine("</packages>");
  253. return sb.ToString();
  254. }
  255. }
  256. }