PageRenderTime 47ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/DJME 2/RichTextBox/RichTextBoxToolbarBuilder.cs

#
C# | 245 lines | 204 code | 35 blank | 6 comment | 18 complexity | 1f11837a1832b911227471304f4c8d35 MD5 | raw file
Possible License(s): GPL-2.0
  1. // Copyright (c) 2011 Ray Liang (http://www.dotnetage.com)
  2. // Dual licensed under the MIT and GPL licenses:
  3. // http://www.opensource.org/licenses/mit-license.php
  4. // http://www.gnu.org/licenses/gpl.html
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Web.Mvc;
  10. using System.Linq.Expressions;
  11. namespace DNA.Mvc.jQuery
  12. {
  13. public class RichTextBoxToolbarBuilder : ViewComponentBuilder<RichTextBoxToolbar, RichTextBoxToolbarBuilder>
  14. {
  15. public RichTextBoxToolbarBuilder(RichTextBoxToolbar component, ViewContext context, IViewDataContainer container) : base(component, context, container) { }
  16. private ToolbarButtonFactory buttonFactory;
  17. public RichTextBoxToolbarBuilder Buttons(Action<ToolbarButtonFactory> buttons)
  18. {
  19. var fac = new ToolbarButtonFactory(Component, ViewContext,ViewDataContainer);
  20. buttons.Invoke(fac);
  21. return this;
  22. }
  23. private ToolbarButtonFactory ButtonFactory
  24. {
  25. get
  26. {
  27. if (buttonFactory == null)
  28. buttonFactory = new ToolbarButtonFactory(Component, this.ViewContext,this.ViewDataContainer);
  29. return buttonFactory;
  30. }
  31. }
  32. public RichTextBoxToolbarBuilder AddTemplateTool(Action tmpl)
  33. {
  34. var tmplButton = ButtonFactory.Add();
  35. tmplButton.Template(tmpl);
  36. return this;
  37. }
  38. public RichTextBoxToolbarBuilder AddText(string text, string onclick, bool? isPushed = false, bool? isChecked = false)
  39. {
  40. var txtButton = ButtonFactory.AddButton(text, onclick);
  41. if (isPushed.Value)
  42. txtButton.Settings(settings =>
  43. {
  44. settings.ChangeType(ButtonTypes.ToggleButton)
  45. .States(states =>
  46. {
  47. states.Add()
  48. .Select(!isChecked.Value)
  49. .ToggleClass("d-rte-icon-button")
  50. .SetValue(false);
  51. states.Add()
  52. .Select(isChecked.Value)
  53. .ToggleClass("d-rte-icon-button-push")
  54. .SetValue(true);
  55. });
  56. });
  57. return this;
  58. }
  59. public RichTextBoxToolbarBuilder AddImage(string imageUrl, string text, string onclick, string toolTip, bool? isPushed = false, bool? isChecked = false)
  60. {
  61. var imgButton = ButtonFactory.AddImageButton(imageUrl, onclick);
  62. if (!string.IsNullOrEmpty(text))
  63. imgButton.Text(text);
  64. if (!string.IsNullOrEmpty(toolTip))
  65. imgButton.ToolTip(toolTip);
  66. if (isPushed.Value)
  67. imgButton.Settings(settings =>
  68. {
  69. settings.ChangeType(ButtonTypes.ToggleButton)
  70. .States(states =>
  71. {
  72. states.Add()
  73. .ImageIcons(imageUrl)
  74. .Select(!isChecked.Value)
  75. .ToggleClass("d-rte-icon-button")
  76. .SetValue(false);
  77. states.Add()
  78. .ImageIcons(imageUrl)
  79. .Select(isChecked.Value)
  80. .ToggleClass("d-rte-icon-button-push")
  81. .SetValue(true);
  82. });
  83. });
  84. return this;
  85. }
  86. public RichTextBoxToolbarBuilder AddImage(string imageUrl, string onclick, string toolTip, bool? isPushed = false, bool? isChecked = false)
  87. {
  88. return this.AddImage(imageUrl, null, onclick, toolTip, isPushed, isChecked);
  89. }
  90. public RichTextBoxToolbarBuilder AddIcon(string cssClass, string onclick, string text, string toolTip, Action<string> onNormalized, bool? isPushed = false, bool? isChecked = false)
  91. {
  92. var iconButton = ButtonFactory.AddIconButton(cssClass, onclick);
  93. if (!string.IsNullOrEmpty(text))
  94. iconButton.Text(text);
  95. if (!string.IsNullOrEmpty(toolTip))
  96. iconButton.ToolTip(toolTip);
  97. if (isPushed.Value)
  98. iconButton.Settings(settings =>
  99. {
  100. settings.ChangeType(ButtonTypes.ToggleButton)
  101. .States(states =>
  102. {
  103. states.Add()
  104. .Icons(cssClass)
  105. .Select(!isChecked.Value)
  106. .ToggleClass("d-rte-icon-button")
  107. .SetValue(false);
  108. states.Add()
  109. .Icons(cssClass)
  110. .Select(isChecked.Value)
  111. .ToggleClass("d-rte-icon-button-push")
  112. .SetValue(true);
  113. });
  114. });
  115. if (onNormalized != null)
  116. onNormalized.Invoke(iconButton.Component.Id);
  117. //if (!string.IsNullOrEmpty(onNormalized))
  118. // this.Component.EditBox.OnNormalized.AppendLine("var self"+onNormalized);
  119. return this;
  120. }
  121. public RichTextBoxToolbarBuilder AddIcon(string cssClass, string onclick, string toolTip, bool? isPushed = false, bool? isChecked = false)
  122. {
  123. return this.AddIcon(cssClass, onclick, null, toolTip, null, isPushed, isChecked);
  124. }
  125. public RichTextBoxToolbarBuilder AddPush(string cssClass, string onclick, string toolTip, string group, Action<ButtonStateFactory> states)
  126. {
  127. return this.AddPush(cssClass, onclick, toolTip, group, states, null);
  128. }
  129. public RichTextBoxToolbarBuilder AddPush(string cssClass, string onclick, string toolTip, string group, Action<ButtonStateFactory> states, Action<string> onNormalized)
  130. {
  131. var pushButton = ButtonFactory.AddIconButton(cssClass, onclick)
  132. .Settings(settings =>
  133. {
  134. settings.ChangeType(ButtonTypes.RadioBox)
  135. .Group(group, Component.Name)
  136. .States(s => { states.Invoke(s); });
  137. });
  138. if (!string.IsNullOrEmpty(toolTip))
  139. pushButton.ToolTip(toolTip);
  140. if (onNormalized != null)
  141. onNormalized.Invoke(pushButton.Component.Id);
  142. return this;
  143. }
  144. public RichTextBoxToolbarBuilder AddColorPicker(string cssClass, string onselect)
  145. {
  146. var builder = ButtonFactory.AddButton("")
  147. .Icons(cssClass);
  148. string id = builder.Component.Id;
  149. string colorId = id + "_foreColorPicker";
  150. builder.Settings(settings =>
  151. {
  152. settings.ChangeType(ButtonTypes.LinkButton)
  153. .Options(opts =>
  154. {
  155. opts.OnCommand = onselect; //"$(\"#" + Component.EditBox.Id + "\").richtextbox(\"runCmd\",\"forecolor\",cmd);";
  156. })
  157. .ShowSplitButton("$('#" + colorId + "').dropdownable('open');");
  158. });
  159. builder.Component.AfterComponentRender += new ViewComponentRenderDelegate((writer) =>
  160. {
  161. Helper.Dna().ColorPicker(colorId).Render();
  162. var scripts = new DNA.Mvc.jQuery.jQueryScriptBuilder("#" + colorId, "dropdownable");
  163. scripts.AddOption("target", "#" + id, true)
  164. .AddFunctionOption("closed", "var _val=$(\"#" + colorId + "\").colorpicker(\"option\",\"value\"); $(\"#" +
  165. id + "\").find(\".d-button-primary-icon\"). css({\"margin\":\"0px\",\"border-bottom\":\"3px solid \"+_val}); $(\"#" + id
  166. + "\").buttonex(\"option\",\"cmd\",_val);$(\"#" + id + "\").click();");
  167. Helper.RegisterStartupScript(scripts.ToString());
  168. });
  169. return this;
  170. }
  171. public RichTextBoxToolbarBuilder AddCombo(Action<ComboBoxBuilder> combo)
  172. {
  173. return this.AddCombo(combo, null);
  174. }
  175. public RichTextBoxToolbarBuilder AddCombo(Action<ComboBoxBuilder> combo, Action<string> onNormalized)
  176. {
  177. if (combo != null)
  178. {
  179. var comboBuilder = ButtonFactory.AddCombo();
  180. combo.Invoke(comboBuilder);
  181. if (onNormalized != null)
  182. onNormalized.Invoke(comboBuilder.Component.Id);
  183. }
  184. return this;
  185. }
  186. public RichTextBoxToolbarBuilder AddCombo(Enum _enum, string onselection)
  187. {
  188. ButtonFactory.AddCombo().Bind(_enum).Options(opts => { opts.OnItemSelected = onselection; });
  189. return this;
  190. }
  191. public RichTextBoxToolbarBuilder AddCombo<T>(IEnumerable<T> collection, string onselection)
  192. where T : NavigableView
  193. {
  194. ButtonFactory.AddCombo(collection).Options(opts => { opts.OnItemSelected = onselection; });
  195. return this;
  196. }
  197. public RichTextBoxToolbarBuilder AddCombo<T>(IEnumerable<T> collection, string onselection, Expression<Func<T, dynamic>> textFieldSelector,
  198. Expression<Func<T, dynamic>> valueFieldSelector)
  199. where T:class
  200. {
  201. ButtonFactory.AddCombo(collection, textFieldSelector, valueFieldSelector).Options(opts => { opts.OnItemSelected = onselection; });
  202. return this;
  203. }
  204. public RichTextBoxToolbarBuilder AddSeparator()
  205. {
  206. ButtonFactory.AddSpliter();
  207. return this;
  208. }
  209. }
  210. }