PageRenderTime 26ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/OfflineClient/GuidanceExplorerNT-Stripped/GuidanceExplorer/Controls/FolderNode.cs

#
C# | 223 lines | 156 code | 24 blank | 43 comment | 31 complexity | c9a5b5922548183706153573de4f32b9 MD5 | raw file
  1. //===============================================================================
  2. // Microsoft patterns & practices
  3. // Guidance Explorer Offline Client
  4. //===============================================================================
  5. // Copyright Microsoft Corporation. All rights reserved.
  6. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
  7. // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
  8. // LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  9. // FITNESS FOR A PARTICULAR PURPOSE.
  10. //===============================================================================
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Text;
  14. using System.Windows.Forms;
  15. using GuidanceExplorer.Model;
  16. namespace GuidanceExplorer.Controls
  17. {
  18. /// <summary>
  19. /// Represents a folder in the tree view.
  20. /// </summary>
  21. [MenuItemAttribute(12, "&File\\&New Item", GuidanceExplorer.Commands.NewGuidanceItem, typeof(ModelItemMenuItemIsEditableCondition), typeof(NewItemMenuItemProvider), Keys.None)]
  22. [MenuItemAttribute(15, "&File\\New &Folder", GuidanceExplorer.Commands.NewFolder, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  23. [MenuItemAttribute(20, "&File\\New &View", GuidanceExplorer.Commands.NewView, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  24. [MenuItemAttribute(30, "&File\\New Search Vie&w", GuidanceExplorer.Commands.NewSearchView, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  25. [MenuItemAttribute(40, "&File\\-", null, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  26. [MenuItemAttribute(50, "&File\\&Import Item...", GuidanceExplorer.Commands.ImportItemToFolder, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  27. [MenuItemAttribute(60, "&File\\-", null, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  28. //[MenuItemAttribute(70, "&File\\Save &Item as Xml...", "Save Items as Xml...", GuidanceExplorer.Commands.SaveItemAsXml, Keys.None)]
  29. [MenuItemAttribute(71, "&File\\&Save Folder as...", GuidanceExplorer.Commands.SaveFolderAs, Keys.None)]
  30. [MenuItemAttribute(80, "&File\\-", null, Keys.None)]
  31. //[MenuItemAttribute(82, "&File\\Subscribe to &Library\\From &File...", GuidanceExplorer.Commands.SubscribeLibraryFromFile, Keys.None)]
  32. [MenuItemAttribute(84, "&File\\Subscribe to &Library\\From &Web...", GuidanceExplorer.Commands.SubscribeLibraryFromWeb, Keys.None)]
  33. [MenuItemAttribute(85, "&File\\S&ynchronize Libraries", Commands.Synchronize, Keys.None)]
  34. [MenuItemAttribute(86, "&File\\-", null, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  35. [MenuItemAttribute(90, "&File\\E&xport as Library...", GuidanceExplorer.Commands.ExportFolderAsLibrary, Keys.None)]
  36. //[MenuItemAttribute(100, "&File\\Save Item &as...", "Save Items as...", GuidanceExplorer.Commands.SaveItemAs, Keys.None)]
  37. [MenuItemAttribute(110, "&File\\-", null, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  38. [MenuItemAttribute(120, "&File\\&Rename Folder", GuidanceExplorer.Commands.RenameFolder, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  39. [MenuItemAttribute(130, "&File\\&Delete Folder", GuidanceExplorer.Commands.DeleteFolder, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  40. [MenuItemAttribute(140, "&File\\-", null, Keys.None)]
  41. [MenuItemAttribute(148, "&File\\Add/Remove &Guidance Type...", GuidanceExplorer.Commands.AddRemoveGuidanceType, Keys.None)]
  42. [MenuItemAttribute(149, "&File\\-", null, Keys.None)]
  43. [MenuItemAttribute(150, "&File\\&Exit", GuidanceExplorer.Commands.FileExit, Keys.None)]
  44. [MenuItemAttribute(200, "&Edit\\&Undo drag/drop", GuidanceExplorer.Commands.UndoDragAndDrop, Keys.Control | Keys.Z)]
  45. [MenuItemAttribute(210, "&Edit\\-", null, Keys.None)]
  46. [MenuItemAttribute(230, "&Edit\\&Add To View...", GuidanceExplorer.Commands.MoveGuidanceItemToView, Keys.None)]
  47. [MenuItemAttribute(260, "&Edit\\-", null, Keys.None)]
  48. [MenuItemAttribute(270, "&Edit\\&Select All", GuidanceExplorer.Commands.SelectAll, Keys.Control | Keys.A)]
  49. [MenuItemAttribute(300, "&View\\Reset &Sort Order", GuidanceExplorer.Commands.ResetSortOrder, Keys.None)]
  50. [MenuItemAttribute(310, "&View\\&Reset Columns", GuidanceExplorer.Commands.ResetColumns, Keys.None)]
  51. [MenuItemAttribute(320, "&View\\Reset &Filters", GuidanceExplorer.Commands.ResetFilters, Keys.None)]
  52. [MenuItemAttribute(330, "&View\\&Column Chooser", GuidanceExplorer.Commands.ColumnChooser, Keys.None)]
  53. //[MenuItemAttribute(400, "&Help\\&About", GuidanceExplorer.Commands.HelpAbout, Keys.None)]
  54. [MenuItemAttribute(500, "context\\New Folder", GuidanceExplorer.Commands.NewFolder, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  55. [MenuItemAttribute(510, "context\\New View", GuidanceExplorer.Commands.NewView, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  56. //[MenuItemAttribute(520, "context\\New Search View", GuidanceExplorer.Commands.NewSearchView, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  57. [MenuItemAttribute(540, "context\\-", null, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  58. [MenuItemAttribute(560, "context\\Export as Library...", GuidanceExplorer.Commands.ExportFolderAsLibrary, Keys.None)]
  59. [MenuItemAttribute(561, "context\\Save Folder as...", GuidanceExplorer.Commands.SaveFolderAs, Keys.None)]
  60. [MenuItemAttribute(570, "context\\-", null, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  61. [MenuItemAttribute(580, "context\\Delete Folder", GuidanceExplorer.Commands.DeleteFolder, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  62. [MenuItemAttribute(590, "context\\Rename Folder", GuidanceExplorer.Commands.RenameFolder, typeof(ModelItemMenuItemIsEditableCondition), Keys.None)]
  63. public class FolderNode : ModelNode<Folder>
  64. {
  65. /// <summary>
  66. /// Factory.
  67. /// </summary>
  68. /// <returns></returns>
  69. public static FolderNode New()
  70. {
  71. return new FolderNode();
  72. }
  73. /// <summary>
  74. /// Private default constructor.
  75. /// </summary>
  76. private FolderNode() : base("a folder", 4, 4) { }
  77. public override bool CanDrop(IModelItem modelNode)
  78. {
  79. Library thisLibrary = ModelInstance.GetContainerLibrary();
  80. //If the library is read only, then all operations are cancelled.
  81. if (thisLibrary != null && thisLibrary.ReadProtection == ReadProtection.ReadOnly)
  82. {
  83. return false;
  84. }
  85. ViewNode viewNode = modelNode as ViewNode;
  86. FolderNode folderNode = modelNode as FolderNode;
  87. SearchViewNode searchViewNode = modelNode as SearchViewNode;
  88. if (viewNode != null)
  89. {
  90. /*
  91. * Test for views:
  92. * Views can't be droped in its parent folder.
  93. */
  94. //Root views cant be dragged
  95. if (viewNode.ModelInstance.RootView)
  96. {
  97. return false;
  98. }
  99. //Can't drag to its parent.
  100. if (Object.ReferenceEquals(viewNode.ModelInstance.ParentFolder, ModelInstance))
  101. {
  102. return false;
  103. }
  104. return true;
  105. }
  106. else if (folderNode != null)
  107. {
  108. /*
  109. * Test for folders:
  110. * Folders can't be droped in its parent folder.
  111. * A folder can't be droped to any of its childs.
  112. */
  113. //Can't drag to its parent.
  114. if (Object.ReferenceEquals(folderNode.ModelInstance.ParentFolder, ModelInstance))
  115. {
  116. return false;
  117. }
  118. //Find the node in its childs.
  119. if (FindNodeInChilds(folderNode, this))
  120. {
  121. return false;
  122. }
  123. return true;
  124. }
  125. else if (searchViewNode != null)
  126. {
  127. //Root views cant be dragged
  128. if (searchViewNode.ModelInstance.RootView)
  129. {
  130. return false;
  131. }
  132. return true;
  133. }
  134. return false;
  135. }
  136. /// <summary>
  137. /// Whether the node is editable.
  138. /// </summary>
  139. public override bool IsEditable
  140. {
  141. get
  142. {
  143. Library library = ModelInstance.GetContainerLibrary();
  144. if (library != null)
  145. {
  146. return (library.ReadProtection == ReadProtection.ReadWrite);
  147. }
  148. return true;
  149. }
  150. }
  151. public FolderNode Clone(Folder newModelInstance)
  152. {
  153. FolderNode cloneNode = new FolderNode();
  154. cloneNode.Text = Text;
  155. cloneNode.SelectedItem = SelectedItem;
  156. if (newModelInstance == null)
  157. {
  158. cloneNode.ModelInstance = (Folder)ModelInstance.Clone();
  159. }
  160. else
  161. {
  162. cloneNode.ModelInstance = newModelInstance;
  163. }
  164. if (Nodes.Count > 0)
  165. {
  166. foreach (TreeNode tempNode in Nodes)
  167. {
  168. FolderNode tempFolderNode = tempNode as FolderNode;
  169. ViewNode tempViewNode = tempNode as ViewNode;
  170. SearchViewNode tempSearchViewNode = tempNode as SearchViewNode;
  171. TreeNode copyNode = null;
  172. if (tempFolderNode != null)
  173. {
  174. Folder folder = tempFolderNode.ModelInstance.Clone();
  175. folder.ParentFolder = cloneNode.ModelInstance;
  176. copyNode = (TreeNode)tempFolderNode.Clone(folder);
  177. }
  178. else if (tempViewNode != null)
  179. {
  180. GuidanceExplorer.Model.View view = tempViewNode.ModelInstance.Clone();
  181. view.ParentFolder = cloneNode.ModelInstance;
  182. view.Container = null;
  183. copyNode = (TreeNode)tempViewNode.Clone(view);
  184. }
  185. else if (tempSearchViewNode != null)
  186. {
  187. SearchView searchView = (SearchView) tempSearchViewNode.ModelInstance.Clone();
  188. searchView.ParentFolder = cloneNode.ModelInstance;
  189. searchView.ReadedScope = SearchViewScope.Folder;
  190. searchView.Container = null;
  191. copyNode = (TreeNode)tempSearchViewNode.Clone(searchView);
  192. }
  193. cloneNode.Nodes.Add(copyNode);
  194. }
  195. }
  196. return cloneNode;
  197. }
  198. }
  199. }