PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/Branches/4.0.2.0/TaskCardCreator/MainWindow.xaml.cs

#
C# | 316 lines | 256 code | 38 blank | 22 comment | 38 complexity | 8d1f367bc14d8a22f4d5e52a26ec3ff5 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. // This source is subject to Microsoft Public License (Ms-PL).
  2. // Please see http://taskcardcreator.codeplex.com for details.
  3. // All other rights reserved.
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel.Composition;
  7. using System.ComponentModel.Composition.Hosting;
  8. using System.IO;
  9. using System.IO.Packaging;
  10. using System.Linq;
  11. using System.Reflection;
  12. using System.Windows;
  13. using System.Windows.Controls;
  14. using System.Windows.Forms;
  15. using System.Windows.Interop;
  16. using System.Windows.Xps.Packaging;
  17. using Microsoft.TeamFoundation.Client;
  18. using Microsoft.TeamFoundation.Server;
  19. using Microsoft.TeamFoundation.WorkItemTracking.Client;
  20. using Microsoft.Windows.Controls.Ribbon;
  21. using WorkItemReportInterface;
  22. using MessageBox = System.Windows.MessageBox;
  23. using Microsoft.Practices.EnterpriseLibrary.Logging;
  24. namespace TaskCardCreator
  25. {
  26. /// <summary>
  27. /// Interaction logic for MainWindow.xaml
  28. /// </summary>
  29. public partial class MainWindow : RibbonWindow, System.Windows.Forms.IWin32Window
  30. {
  31. private ProjectInfo projInfo;
  32. private WorkItemStore workItemStoreService;
  33. private WorkItemTypeCollection wiTypes;
  34. [ImportMany(typeof(IWorkItemReport))]
  35. private IEnumerable<IWorkItemReport> reports;
  36. public MainWindow()
  37. {
  38. LoadReports();
  39. InitializeComponent();
  40. }
  41. public IntPtr Handle
  42. {
  43. get
  44. {
  45. return ((HwndSource)PresentationSource.FromVisual(this)).Handle;
  46. }
  47. }
  48. private void LoadReports()
  49. {
  50. Logger.Write("Entering LoadReports method");
  51. // An aggregate catalog that combines multiple catalogs
  52. var catalog = new AggregateCatalog();
  53. // Adds all the parts found in all assemblies in
  54. // the same directory as the executing program
  55. catalog.Catalogs.Add(
  56. new DirectoryCatalog(
  57. Path.GetDirectoryName(
  58. Assembly.GetExecutingAssembly().Location)));
  59. // Create the CompositionContainer with the parts in the catalog
  60. var container = new CompositionContainer(catalog);
  61. // Fill the imports of this object
  62. container.ComposeParts(this);
  63. }
  64. private void selectProjectButton_Click(object sender, RoutedEventArgs e)
  65. {
  66. Logger.Write("Entering selectProjectButton_Click method");
  67. using (TeamProjectPicker tpp = new TeamProjectPicker(TeamProjectPickerMode.SingleProject, false))
  68. {
  69. DialogResult result = tpp.ShowDialog(this);
  70. if (result == System.Windows.Forms.DialogResult.OK)
  71. {
  72. ReportButton.IsEnabled = true;
  73. projInfo = tpp.SelectedProjects[0];
  74. workItemStoreService = tpp.SelectedTeamProjectCollection.GetService<WorkItemStore>();
  75. foreach (Project project in workItemStoreService.Projects)
  76. {
  77. if (project.Name == projInfo.Name)
  78. {
  79. wiTypes = project.WorkItemTypes;
  80. break;
  81. }
  82. wiTypes = null;
  83. }
  84. }
  85. }
  86. }
  87. private enum ProjectTypes
  88. {
  89. MicrosoftVisualStudioScrum10,
  90. MSFforAgileSoftwareDevelopmentv50,
  91. UpgradedProcessTemplate,
  92. Unknown
  93. }
  94. /// <summary>
  95. /// Try to detect process template. This is done by looking at specific work item types
  96. /// </summary>
  97. /// <returns>Project type</returns>
  98. private ProjectTypes ProjectType()
  99. {
  100. Logger.Write("Entering ProjectType method");
  101. if (wiTypes == null)
  102. {
  103. Logger.Write("Returning ProjectTypes.Unknown");
  104. return ProjectTypes.Unknown;
  105. }
  106. if (wiTypes.Count == 0)
  107. {
  108. Logger.Write("Returning ProjectTypes.Unknown");
  109. return ProjectTypes.Unknown;
  110. }
  111. //An MSF Agile v4.0 process template can be upgraded to MSF Agile v5.0, this is messy and so it is unsupported.
  112. if (wiTypes.Contains("User Story") == true && wiTypes.Contains("Scenario") == true)
  113. {
  114. Logger.Write("Returning ProjectTypes.UpgradedProcessTemplate");
  115. return ProjectTypes.UpgradedProcessTemplate;
  116. }
  117. // Only the Scrum process template has this type
  118. if (wiTypes.Contains("Product Backlog Item") == true)
  119. {
  120. Logger.Write("Returning ProjectTypes.MicrosoftVisualStudioScrum10");
  121. return ProjectTypes.MicrosoftVisualStudioScrum10;
  122. }
  123. // Only the MSF for Agile process template has this type
  124. if (wiTypes.Contains("User Story") == true)
  125. {
  126. Logger.Write("Returning ProjectTypes.MSFforAgileSoftwareDevelopmentv50");
  127. return ProjectTypes.MSFforAgileSoftwareDevelopmentv50;
  128. }
  129. Logger.Write("Returning ProjectTypes.Unknown");
  130. return ProjectTypes.Unknown;
  131. }
  132. private void generateReport_Click(object sender, RoutedEventArgs e)
  133. {
  134. Logger.Write("Entering generateReport_Click method");
  135. if (projInfo == null)
  136. return;
  137. // Create report
  138. IWorkItemReport reportTemplate = null;
  139. IEnumerable<WorkItem> workItems = null;
  140. switch (ProjectType())
  141. {
  142. case ProjectTypes.MicrosoftVisualStudioScrum10:
  143. var scrumReports = from r in reports
  144. where r.ProcessTemplate == ReportType.MicrosoftVisualStudioScrum10
  145. select r;
  146. var scrumPopup = new TaskCardDetailsPopup(scrumReports) { Owner = this };
  147. scrumPopup.queries.BuildQueryTree(workItemStoreService.Projects[projInfo.Name].QueryHierarchy, projInfo.Name);
  148. scrumPopup.workItemStoreService = workItemStoreService;
  149. if (scrumPopup.ShowDialog() == false)
  150. return;
  151. reportTemplate = scrumPopup.SelectedReport;
  152. workItems = scrumPopup.listView.SelectedItems.Cast<WorkItem>().ToList();
  153. break;
  154. case ProjectTypes.MSFforAgileSoftwareDevelopmentv50:
  155. var agileReports = from r in reports
  156. where r.ProcessTemplate == ReportType.MSFforAgileSoftwareDevelopmentv50
  157. select r;
  158. var agilePopup = new TaskCardDetailsPopup(agileReports) { Owner = this };
  159. agilePopup.queries.BuildQueryTree(workItemStoreService.Projects[projInfo.Name].QueryHierarchy, projInfo.Name);
  160. agilePopup.workItemStoreService = workItemStoreService;
  161. if (agilePopup.ShowDialog() == false)
  162. return;
  163. reportTemplate = agilePopup.SelectedReport;
  164. workItems = agilePopup.listView.SelectedItems.Cast<WorkItem>().ToList();
  165. break;
  166. case ProjectTypes.UpgradedProcessTemplate:
  167. MessageBox.Show("The current project is using an upgraded process template." + Environment.NewLine +
  168. "This process template is not supported." + Environment.NewLine +
  169. Environment.NewLine +
  170. "Supported process templates:" + Environment.NewLine +
  171. "Microsoft Visual Studio Scrum 1.0" + Environment.NewLine +
  172. "MSF for Agile Software Development v5.0", "Error");
  173. return;
  174. default:
  175. MessageBox.Show(
  176. "Supported process templates:" + Environment.NewLine +
  177. "Microsoft Visual Studio Scrum 1.0" + Environment.NewLine +
  178. "MSF for Agile Software Development v5.0", "Error");
  179. return;
  180. }
  181. var ms = new MemoryStream();
  182. var pkg = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite);
  183. string pack = string.Format("pack://{0}.xps", Guid.NewGuid());
  184. PackageStore.AddPackage(new Uri(pack), pkg);
  185. var compressionOption = CompressionOption.NotCompressed;
  186. if (XpsCompression.IsChecked.Value)
  187. compressionOption = CompressionOption.SuperFast;
  188. var document = new XpsDocument(pkg, compressionOption, pack);
  189. var report = reportTemplate.Create(workItems);
  190. var writer = XpsDocument.CreateXpsDocumentWriter(document);
  191. writer.Write(report.DocumentPaginator);
  192. // Create tab
  193. var tab = new TabItem { Header = "Report @ " + DateTime.Now.ToLongTimeString() };
  194. var doc = new DocumentViewer { Document = document.GetFixedDocumentSequence() };
  195. // Remove toolbar from DocumentViewer
  196. var contentHost = doc.Template.FindName("PART_ContentHost", doc) as ScrollViewer;
  197. var grid = contentHost.Parent as Grid;
  198. grid.Children.RemoveAt(0);
  199. doc.FitToMaxPagesAcross(1);
  200. tab.Content = doc;
  201. tabControl.Items.Insert(1, tab);
  202. tabControl.SelectedItem = tab;
  203. }
  204. private void GoToWebSiteButton_Click(object sender, RoutedEventArgs e)
  205. {
  206. Logger.Write("Entering GoToWebSiteButton_Click method");
  207. System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(@"http://taskcardcreator.codeplex.com"));
  208. }
  209. private void CheckForUpdatesButton_Click(object sender, RoutedEventArgs e)
  210. {
  211. Logger.Write("Entering CheckForUpdatesButton_Click method");
  212. System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(@"http://taskcardcreator.codeplex.com/releases"));
  213. }
  214. private void SubmitBugButton_Click(object sender, RoutedEventArgs e)
  215. {
  216. Logger.Write("Entering SubmitBugButton_Click method");
  217. System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(@"http://taskcardcreator.codeplex.com/workitem/list/advanced"));
  218. }
  219. private void HelpButton_Click(object sender, RoutedEventArgs e)
  220. {
  221. Logger.Write("Entering HelpButton_Click method");
  222. System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(@"http://taskcardcreator.codeplex.com"));
  223. }
  224. private void ExitButton_Click(object sender, RoutedEventArgs e)
  225. {
  226. Logger.Write("Entering ExitButton_Click method");
  227. Close();
  228. }
  229. private void TabSelectionChanged(object sender, SelectionChangedEventArgs e)
  230. {
  231. var isTaskCardTab = (tabControl.SelectedIndex != 0);
  232. TaskCardContextualTab.Visibility = isTaskCardTab ? Visibility.Visible : Visibility.Collapsed;
  233. // Change focus to contextual tab?
  234. if (isTaskCardTab)
  235. TaskCardTab.IsSelected = true;
  236. }
  237. private DocumentViewer GetDocViewer()
  238. {
  239. var tab = tabControl.SelectedItem as TabItem;
  240. if (tab != null)
  241. {
  242. var doc = tab.Content as DocumentViewer;
  243. if (doc != null)
  244. {
  245. return doc;
  246. }
  247. }
  248. return null;
  249. }
  250. private void PrintButton_Click(object sender, RoutedEventArgs e)
  251. {
  252. Logger.Write("Entering PrintButton_Click method");
  253. var docViewer = GetDocViewer();
  254. if (docViewer != null)
  255. {
  256. docViewer.Print();
  257. }
  258. }
  259. private void ZoomInButton_Click(object sender, RoutedEventArgs e)
  260. {
  261. Logger.Write("Entering ZoomInButton_Click method");
  262. var docViewer = GetDocViewer();
  263. if (docViewer != null)
  264. {
  265. docViewer.IncreaseZoom();
  266. }
  267. }
  268. private void ZoomOutButton_Click(object sender, RoutedEventArgs e)
  269. {
  270. Logger.Write("Entering ZoomOutButton_Click method");
  271. var docViewer = GetDocViewer();
  272. if (docViewer != null)
  273. {
  274. docViewer.DecreaseZoom();
  275. }
  276. }
  277. }
  278. }