1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Web;
5: using System.Web.Mvc;
6: using System.Web.Mvc.Html;
7:
8: namespace Ethos.Xrm.HR
9: {
10: #region Helper
11:
12: public static class HighlightActionMenuHelper
13: {
14: public static IHighlightActionMenuProviderAfterCreated HighlightActionMenu(this HtmlHelper helper)
15: {
16: return new HighlightActionMenuProvider(helper);
17: }
18: }
19:
20: #endregion
21:
22: #region Interfaces
23:
24: public interface IHighlightActionMenuProviderAfterCreated
25: {
26: IHighlightActionMenuProviderAfterOn On(string actionName, string controllerName);
27: }
28:
29: public interface IHighlightActionMenuProviderAfterOn
30: {
31: IHighlightActionMenuProviderAfterWith With(string text, object routeData, object htmlAttributes);
32: }
33:
34: public interface IHighlightActionMenuProviderAfterWith
35: {
36: IHighlightActionMenuProviderAfterHighlightWhen HighlightWhen(Func<HtmlHelper, bool> predicate);
37: IHighlightActionMenuProviderAfterHighlightWhen HighlightWhenControllerMatch();
38: IHighlightActionMenuProviderAfterHighlightWhen HighlightWhenControllerAndActionMatch();
39: }
40:
41: public interface IHighlightActionMenuProviderAfterHighlightWhen
42: {
43: IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(object highlightHtmlAttributes, string highlightText);
44: IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(object highlightHtmlAttributes);
45: IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(string cssClass, string highlightText);
46: IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(string cssClass);
47: }
48:
49: public interface IHighlightActionMenuProviderAfterApplyHighlightStyle
50: {
51: MvcHtmlString ToActionLink();
52: }
53:
54: #endregion
55:
56: public class HighlightActionMenuProvider :
57: IHighlightActionMenuProviderAfterCreated,
58: IHighlightActionMenuProviderAfterOn, IHighlightActionMenuProviderAfterWith,
59: IHighlightActionMenuProviderAfterHighlightWhen, IHighlightActionMenuProviderAfterApplyHighlightStyle
60: {
61: private HtmlHelper _helper;
62:
63: private string _controllerName;
64: private string _actionName;
65: private string _text;
66: private object _routeData;
67: private object _htmlAttributes;
68:
69: private Func<HtmlHelper, bool> _highlightPredicate;
70:
71: private string _highlightText;
72: private object _highlightHtmlAttributes;
73:
74: public HighlightActionMenuProvider(HtmlHelper helper)
75: {
76: _helper = helper;
77: }
78:
79: public IHighlightActionMenuProviderAfterOn On(string actionName, string controllerName)
80: {
81: _actionName = actionName;
82: _controllerName = controllerName;
83: return this;
84: }
85:
86: public IHighlightActionMenuProviderAfterWith With(string text, object routeData, object htmlAttributes)
87: {
88: _text = text;
89: _routeData = routeData;
90: _htmlAttributes = htmlAttributes;
91: return this;
92: }
93:
94: public IHighlightActionMenuProviderAfterHighlightWhen HighlightWhen(Func<HtmlHelper, bool> predicate)
95: {
96: _highlightPredicate = predicate;
97: return this;
98: }
99:
100: public IHighlightActionMenuProviderAfterHighlightWhen HighlightWhenControllerMatch()
101: {
102: return HighlightWhen((helper) =>
103: {
104: return helper.ViewContext.RouteData.Values["controller"].ToString().ToLower() == _controllerName.ToLower();
105: });
106: }
107:
108: public IHighlightActionMenuProviderAfterHighlightWhen HighlightWhenControllerAndActionMatch()
109: {
110: return HighlightWhen((helper) =>
111: {
112: return helper.ViewContext.RouteData.Values["controller"].ToString().ToLower() == _controllerName.ToLower() &&
113: helper.ViewContext.RouteData.Values["action"].ToString().ToLower() == _actionName.ToLower();
114: });
115: }
116:
117: public IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(object highlightHtmlAttributes, string highlightText)
118: {
119: _highlightText = highlightText;
120: _highlightHtmlAttributes = highlightHtmlAttributes;
121: return this;
122: }
123:
124: public IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(object highlightHtmlAttributes)
125: {
126: return ApplyHighlighStyle(highlightHtmlAttributes, _text);
127: }
128:
129: public IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(string cssClass, string highlightText)
130: {
131: return ApplyHighlighStyle(new { @class = cssClass }, highlightText);
132: }
133:
134: public IHighlightActionMenuProviderAfterApplyHighlightStyle ApplyHighlighStyle(string cssClass)
135: {
136: return ApplyHighlighStyle(new { @class = cssClass }, _text);
137: }
138:
139: public MvcHtmlString ToActionLink()
140: {
141: if (_highlightPredicate.Invoke(_helper))
142: {
143: // should be highlight
144: return _helper.ActionLink(_highlightText, _actionName, _controllerName, _routeData, _highlightHtmlAttributes);
145: }
146: else
147: {
148: // should not be highlight
149: return _helper.ActionLink(_text, _actionName, _controllerName, _routeData, _htmlAttributes);
150: }
151: }
152: }
153: }