PageRenderTime 53ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/WebsitePanel/Branches/SSL Cert Management/Sources/WebsitePanel.WebPortal/Code/Adapters/MenuAdapter.cs

https://github.com/ShaneMcC/websitepanel
C# | 334 lines | 313 code | 19 blank | 2 comment | 32 complexity | 1f828f288d603a58c90ed7ac73aabe63 MD5 | raw file
  1. // Material sourced from the bluePortal project (http://blueportal.codeplex.com).
  2. // Licensed under the Microsoft Public License (available at http://www.opensource.org/licenses/ms-pl.html).
  3. using System;
  4. using System.IO;
  5. using System.Web;
  6. using System.Web.Configuration;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.HtmlControls;
  10. namespace CSSFriendly
  11. {
  12. public class MenuAdapter : System.Web.UI.WebControls.Adapters.MenuAdapter
  13. {
  14. private WebControlAdapterExtender _extender = null;
  15. private WebControlAdapterExtender Extender
  16. {
  17. get
  18. {
  19. if (((_extender == null) && (Control != null)) ||
  20. ((_extender != null) && (Control != _extender.AdaptedControl)))
  21. {
  22. _extender = new WebControlAdapterExtender(Control);
  23. }
  24. System.Diagnostics.Debug.Assert(_extender != null, "CSS Friendly adapters internal error", "Null extender instance");
  25. return _extender;
  26. }
  27. }
  28. protected override void OnInit(EventArgs e)
  29. {
  30. base.OnInit(e);
  31. if (Extender.AdapterEnabled)
  32. {
  33. RegisterScripts();
  34. }
  35. }
  36. private void RegisterScripts()
  37. {
  38. Extender.RegisterScripts();
  39. string folderPath = WebConfigurationManager.AppSettings.Get("CSSFriendly-JavaScript-Path");
  40. if (String.IsNullOrEmpty(folderPath))
  41. {
  42. folderPath = "~/JavaScript";
  43. }
  44. string filePath = folderPath.EndsWith("/") ? folderPath + "MenuAdapter.js" : folderPath + "/MenuAdapter.js";
  45. Page.ClientScript.RegisterClientScriptInclude(GetType(), GetType().ToString(), Page.ResolveUrl(filePath));
  46. }
  47. protected override void RenderBeginTag(HtmlTextWriter writer)
  48. {
  49. if (Extender.AdapterEnabled)
  50. {
  51. Extender.RenderBeginTag(writer, "AspNet-Menu-" + Control.Orientation.ToString());
  52. }
  53. else
  54. {
  55. base.RenderBeginTag(writer);
  56. }
  57. }
  58. protected override void RenderEndTag(HtmlTextWriter writer)
  59. {
  60. if (Extender.AdapterEnabled)
  61. {
  62. Extender.RenderEndTag(writer);
  63. }
  64. else
  65. {
  66. base.RenderEndTag(writer);
  67. }
  68. }
  69. protected override void RenderContents(HtmlTextWriter writer)
  70. {
  71. if (Extender.AdapterEnabled)
  72. {
  73. writer.Indent++;
  74. BuildItems(Control.Items, true, writer);
  75. writer.Indent--;
  76. writer.WriteLine();
  77. }
  78. else
  79. {
  80. base.RenderContents(writer);
  81. }
  82. }
  83. private void BuildItems(MenuItemCollection items, bool isRoot, HtmlTextWriter writer)
  84. {
  85. if (items.Count > 0)
  86. {
  87. writer.WriteLine();
  88. writer.WriteBeginTag("ul");
  89. if (isRoot)
  90. {
  91. writer.WriteAttribute("class", "AspNet-Menu");
  92. writer.WriteAttribute("id", Control.ClientID);
  93. }
  94. writer.Write(HtmlTextWriter.TagRightChar);
  95. writer.Indent++;
  96. foreach (MenuItem item in items)
  97. {
  98. BuildItem(item, writer);
  99. }
  100. writer.Indent--;
  101. writer.WriteLine();
  102. writer.WriteEndTag("ul");
  103. }
  104. }
  105. private void BuildItem(MenuItem item, HtmlTextWriter writer)
  106. {
  107. Menu menu = Control as Menu;
  108. if ((menu != null) && (item != null) && (writer != null))
  109. {
  110. writer.WriteLine();
  111. writer.WriteBeginTag("li");
  112. string theClass = (item.ChildItems.Count > 0) ? "AspNet-Menu-WithChildren" : "AspNet-Menu-Leaf";
  113. string selectedStatusClass = GetSelectStatusClass(item);
  114. if (!String.IsNullOrEmpty(selectedStatusClass))
  115. {
  116. theClass += " " + selectedStatusClass;
  117. }
  118. writer.WriteAttribute("class", theClass);
  119. writer.Write(HtmlTextWriter.TagRightChar);
  120. writer.Indent++;
  121. writer.WriteLine();
  122. if (((item.Depth < menu.StaticDisplayLevels) && (menu.StaticItemTemplate != null)) ||
  123. ((item.Depth >= menu.StaticDisplayLevels) && (menu.DynamicItemTemplate != null)))
  124. {
  125. writer.WriteBeginTag("div");
  126. writer.WriteAttribute("class", GetItemClass(menu, item));
  127. writer.Write(HtmlTextWriter.TagRightChar);
  128. writer.Indent++;
  129. writer.WriteLine();
  130. MenuItemTemplateContainer container = new MenuItemTemplateContainer(menu.Items.IndexOf(item), item);
  131. if ((item.Depth < menu.StaticDisplayLevels) && (menu.StaticItemTemplate != null))
  132. {
  133. menu.StaticItemTemplate.InstantiateIn(container);
  134. }
  135. else
  136. {
  137. menu.DynamicItemTemplate.InstantiateIn(container);
  138. }
  139. container.DataBind();
  140. container.RenderControl(writer);
  141. writer.Indent--;
  142. writer.WriteLine();
  143. writer.WriteEndTag("div");
  144. }
  145. else
  146. {
  147. if (IsLink(item))
  148. {
  149. writer.WriteBeginTag("a");
  150. if (!String.IsNullOrEmpty(item.NavigateUrl))
  151. {
  152. writer.WriteAttribute("href", Page.Server.HtmlEncode(menu.ResolveClientUrl(item.NavigateUrl)));
  153. }
  154. else
  155. {
  156. writer.WriteAttribute("href", Page.ClientScript.GetPostBackClientHyperlink(menu, "b" + item.ValuePath.Replace(menu.PathSeparator.ToString(), "\\"), true));
  157. }
  158. writer.WriteAttribute("class", GetItemClass(menu, item));
  159. WebControlAdapterExtender.WriteTargetAttribute(writer, item.Target);
  160. if (!String.IsNullOrEmpty(item.ToolTip))
  161. {
  162. writer.WriteAttribute("title", item.ToolTip);
  163. }
  164. else if (!String.IsNullOrEmpty(menu.ToolTip))
  165. {
  166. writer.WriteAttribute("title", menu.ToolTip);
  167. }
  168. writer.Write(HtmlTextWriter.TagRightChar);
  169. writer.Indent++;
  170. writer.WriteLine();
  171. }
  172. else
  173. {
  174. writer.WriteBeginTag("span");
  175. writer.WriteAttribute("class", GetItemClass(menu, item));
  176. writer.Write(HtmlTextWriter.TagRightChar);
  177. writer.Indent++;
  178. writer.WriteLine();
  179. }
  180. if (!String.IsNullOrEmpty(item.ImageUrl))
  181. {
  182. writer.WriteBeginTag("img");
  183. writer.WriteAttribute("src", menu.ResolveClientUrl(item.ImageUrl));
  184. writer.WriteAttribute("alt", !String.IsNullOrEmpty(item.ToolTip) ? item.ToolTip : (!String.IsNullOrEmpty(menu.ToolTip) ? menu.ToolTip : item.Text));
  185. writer.Write(HtmlTextWriter.SelfClosingTagEnd);
  186. }
  187. writer.Write(item.Text);
  188. if (IsLink(item))
  189. {
  190. writer.Indent--;
  191. writer.WriteLine();
  192. writer.WriteEndTag("a");
  193. }
  194. else
  195. {
  196. writer.Indent--;
  197. writer.WriteLine();
  198. writer.WriteEndTag("span");
  199. }
  200. }
  201. if ((item.ChildItems != null) && (item.ChildItems.Count > 0))
  202. {
  203. BuildItems(item.ChildItems, false, writer);
  204. }
  205. writer.Indent--;
  206. writer.WriteLine();
  207. writer.WriteEndTag("li");
  208. }
  209. }
  210. private bool IsLink(MenuItem item)
  211. {
  212. return (item != null) && item.Enabled && ((!String.IsNullOrEmpty(item.NavigateUrl)) || item.Selectable);
  213. }
  214. private string GetItemClass(Menu menu, MenuItem item)
  215. {
  216. string value = "AspNet-Menu-NonLink";
  217. if (item != null)
  218. {
  219. if (((item.Depth < menu.StaticDisplayLevels) && (menu.StaticItemTemplate != null)) ||
  220. ((item.Depth >= menu.StaticDisplayLevels) && (menu.DynamicItemTemplate != null)))
  221. {
  222. value = "AspNet-Menu-Template";
  223. }
  224. else if (IsLink(item))
  225. {
  226. value = "AspNet-Menu-Link";
  227. }
  228. string selectedStatusClass = GetSelectStatusClass(item);
  229. if (!String.IsNullOrEmpty(selectedStatusClass))
  230. {
  231. value += " " + selectedStatusClass;
  232. }
  233. }
  234. return value;
  235. }
  236. private string GetSelectStatusClass(MenuItem item)
  237. {
  238. string value = "";
  239. if (item.Selected)
  240. {
  241. value += " AspNet-Menu-Selected";
  242. }
  243. else if (IsChildItemSelected(item))
  244. {
  245. value += " AspNet-Menu-ChildSelected";
  246. }
  247. else if (IsParentItemSelected(item))
  248. {
  249. value += " AspNet-Menu-ParentSelected";
  250. }
  251. return value;
  252. }
  253. private bool IsChildItemSelected(MenuItem item)
  254. {
  255. bool bRet = false;
  256. if ((item != null) && (item.ChildItems != null))
  257. {
  258. bRet = IsChildItemSelected(item.ChildItems);
  259. }
  260. return bRet;
  261. }
  262. private bool IsChildItemSelected(MenuItemCollection items)
  263. {
  264. bool bRet = false;
  265. if (items != null)
  266. {
  267. foreach (MenuItem item in items)
  268. {
  269. if (item.Selected || IsChildItemSelected(item.ChildItems))
  270. {
  271. bRet = true;
  272. break;
  273. }
  274. }
  275. }
  276. return bRet;
  277. }
  278. private bool IsParentItemSelected(MenuItem item)
  279. {
  280. bool bRet = false;
  281. if ((item != null) && (item.Parent != null))
  282. {
  283. if (item.Parent.Selected)
  284. {
  285. bRet = true;
  286. }
  287. else
  288. {
  289. bRet = IsParentItemSelected(item.Parent);
  290. }
  291. }
  292. return bRet;
  293. }
  294. }
  295. }