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

/Signum.Windows/Facades/MenuManager.cs

http://signum.codeplex.com
C# | 176 lines | 141 code | 35 blank | 0 comment | 35 complexity | b8f17cb7affb58bab7a42ec5b4d6a8d8 MD5 | raw file
Possible License(s): LGPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows.Controls;
  6. using System.Windows;
  7. using Signum.Utilities;
  8. using Signum.Entities.Reflection;
  9. using System.Windows.Media;
  10. using Signum.Services;
  11. using System.Diagnostics;
  12. using System.IO;
  13. using Signum.Entities.DynamicQuery;
  14. namespace Signum.Windows
  15. {
  16. public static class MenuManager
  17. {
  18. public static event Action<MenuItem> Tasks;
  19. static MenuManager()
  20. {
  21. Tasks += TaskCollapseSubMenuParent;
  22. Tasks += TaskSetHeader;
  23. Tasks += TaskSetIcon;
  24. Tasks += TaskKeyboardShortcut;
  25. Tasks += TaskCleanSeparators;
  26. }
  27. public static void TaskKeyboardShortcut(MenuItem menuItem)
  28. {
  29. ShortcutHelper.SetMenuItemShortcuts(menuItem);
  30. }
  31. public static void TaskCollapseSubMenuParent(MenuItem menuItem)
  32. {
  33. if (menuItem.Items.Count > 0 && menuItem.Items.OfType<MenuItem>().All(mi => mi.Visibility == Visibility.Collapsed))
  34. menuItem.Visibility = Visibility.Collapsed;
  35. }
  36. static void TaskCleanSeparators(MenuItem menuItem)
  37. {
  38. menuItem.Items.Cast<Control>().Where(a => a.Visibility == Visibility.Visible).BiSelect((first, second) =>
  39. {
  40. if (second is Separator && first is Separator)
  41. return (Separator)second;
  42. if (second is Separator && first == null)
  43. return (Separator)second;
  44. if (first is Separator && second == null)
  45. return (Separator)first;
  46. return null;
  47. }, BiSelectOptions.InitialAndFinal).NotNull().ToList().ForEach(a => a.Visibility = Visibility.Collapsed);
  48. }
  49. public static void TaskSetHeader(MenuItem menuItem)
  50. {
  51. if (menuItem.NotSet(MenuItem.HeaderProperty))
  52. {
  53. object o = menuItem.Tag;
  54. if (o == null)
  55. return;
  56. if (o is FindOptionsBase)
  57. menuItem.Header = QueryUtils.GetNiceName(((FindOptionsBase)o).QueryName);
  58. else if (o is Type)
  59. menuItem.Header = ((Type)o).NicePluralName();
  60. else if (o is Enum)
  61. menuItem.Header = ((Enum)o).NiceToString();
  62. else
  63. menuItem.Header = o.ToString();
  64. }
  65. }
  66. static void TaskSetIcon(MenuItem menuItem)
  67. {
  68. if (menuItem.NotSet(MenuItem.IconProperty))
  69. {
  70. object o = menuItem.Tag;
  71. if (o == null)
  72. return;
  73. ImageSource source =
  74. o is FindOptionsBase ? Navigator.Manager.GetFindIcon(((FindOptionsBase)o).QueryName, false) : null;
  75. menuItem.Icon = new Image { Source = source, Stretch = Stretch.None };
  76. }
  77. }
  78. public static void ProcessMenu(Menu menu)
  79. {
  80. menu.AddHandler(MenuItem.ClickEvent, new RoutedEventHandler(GenericMenuItem_Click));
  81. if (Tasks == null)
  82. return;
  83. foreach (MenuItem menuItem in menu.Items)
  84. {
  85. ProcessMenuItem(menuItem);
  86. }
  87. }
  88. static void GenericMenuItem_Click(object sender, RoutedEventArgs e)
  89. {
  90. object o = ((MenuItem)e.OriginalSource).Tag;
  91. if (o == null)
  92. return;
  93. if (o is ExploreOptions)
  94. Navigator.Explore((ExploreOptions)o);
  95. }
  96. static void ProcessMenuItem(MenuItem menuItem)
  97. {
  98. foreach (MenuItem item in menuItem.Items.OfType<MenuItem>())
  99. {
  100. ProcessMenuItem(item);
  101. }
  102. foreach (Action<MenuItem> action in Tasks.GetInvocationList())
  103. {
  104. action(menuItem);
  105. }
  106. }
  107. public static void MenuItemFactory(string fileName)
  108. {
  109. Dictionary<string, string> dic = new Dictionary<string, string>();
  110. List<object> queryNames = Server.Return((IDynamicQueryServer s)=>s.GetQueryNames());
  111. string menuItems = queryNames.ToString(o => GetMenuItem(o, dic), "\r\n");
  112. string nameSpaces = dic.ToString(kvp => "xmlns:{0}=\"clr-namespace:{1};assembly={2}\"".Formato(kvp.Value, kvp.Key.Split(';')[0], kvp.Key.Split(';')[1]), "\r\n");
  113. File.WriteAllText(fileName, nameSpaces);
  114. File.AppendAllText(fileName, menuItems);
  115. Process.Start(fileName);
  116. }
  117. static string GetMenuItem(object queryName, Dictionary<string,string> dic)
  118. {
  119. string menuItem = "<MenuItem Tag=\"{{m:FindOptions QueryName={0}}}\"/>";
  120. Type type = queryName as Type;
  121. if (type != null)
  122. return menuItem.Formato("{{x:Type {0}:{1}}}".Formato(GetAlias(type, dic), type.Name));
  123. Enum enumValue = queryName as Enum;
  124. if (enumValue != null)
  125. return menuItem.Formato("{{x:Static {0}:{1}.{2}}}".Formato(GetAlias(enumValue.GetType(), dic), enumValue.GetType().Name, enumValue.ToString()));
  126. return menuItem.Formato(queryName.ToString());
  127. }
  128. static string GetAlias(Type exampleType, Dictionary<string,string> dic)
  129. {
  130. return dic.GetOrCreate(exampleType.Namespace + ";" + exampleType.Assembly.GetName().Name, () =>
  131. {
  132. string result = exampleType.Namespace.Split('.').ToString(str => str.Substring(0, 1), "").ToLower();
  133. if (!dic.Values.Contains(result))
  134. return result;
  135. for (int i = 0; ; i++)
  136. if (!dic.Values.Contains(result + i))
  137. return result + i;
  138. });
  139. }
  140. }
  141. }