I am having a bit of trouble with the Menu adapter and Sharepoint 2007 tr2. I have the adapter working fine and it is outputting the appropraite HTML. The problem is that it is not recognizing the current page as selected. When I turn off the adapters the selected item works fine. Any thoughts? I have included my adapter code if it is helpful.
-dcp
1 using System;
2 using System.IO;
3 using System.Web;
4 using System.Web.Configuration;
5 using System.Web.UI;
6 using System.Web.UI.WebControls;
7 using System.Web.UI.HtmlControls;
8
9 namespace CSSFriendly
10 {
11 public class MenuAdapter : System.Web.UI.WebControls.Adapters.MenuAdapter
12 {
13 private WebControlAdapterExtender _extender = null;
14 private WebControlAdapterExtender Extender
15 {
16 get
17 {
18 if (((_extender == null) && (Control != null)) ||
19 ((_extender != null) && (Control != _extender.AdaptedControl)))
20 {
21 _extender = new WebControlAdapterExtender(Control);
22 }
23
24 System.Diagnostics.Debug.Assert(_extender != null, "CSS Friendly adapters internal error", "Null extender instance");
25 return _extender;
26 }
27 }
28
29 protected override void OnInit(EventArgs e)
30 {
31 base.OnInit(e);
32
33 if (Extender.AdapterEnabled)
34 {
35 RegisterScripts();
36 }
37 }
38
39 private void RegisterScripts()
40 {
41 Extender.RegisterScripts();
42 string folderPath = WebConfigurationManager.AppSettings.Get("CSSFriendly-JavaScript-Path");
43 if (String.IsNullOrEmpty(folderPath))
44 {
45 folderPath = "~/JavaScript";
46 }
47 string filePath = folderPath.EndsWith("/") ? folderPath + "MenuAdapter.js" : folderPath + "/MenuAdapter.js";
48 Page.ClientScript.RegisterClientScriptInclude(GetType(), GetType().ToString(), Page.ResolveUrl(filePath));
49 }
50
51 protected override void RenderBeginTag(HtmlTextWriter writer)
52 {
53 if (Extender.AdapterEnabled)
54 {
55 //Extender.RenderBeginTag(writer, "AspNet-Menu-" + Control.Orientation.ToString());
56 Extender.RenderBeginTag(writer, "");
57 }
58 else
59 {
60 base.RenderBeginTag(writer);
61 }
62 }
63
64 protected override void RenderEndTag(HtmlTextWriter writer)
65 {
66 if (Extender.AdapterEnabled)
67 {
68 Extender.RenderEndTag(writer);
69 }
70 else
71 {
72 base.RenderEndTag(writer);
73 }
74 }
75
76 protected override void RenderContents(HtmlTextWriter writer)
77 {
78 if (Extender.AdapterEnabled)
79 {
80 writer.Indent++;
81 BuildItems(Control.Items, true, writer);
82 writer.Indent--;
83 writer.WriteLine();
84 }
85 else
86 {
87 base.RenderContents(writer);
88 }
89 }
90
91 private void BuildItems(MenuItemCollection items, bool isRoot, HtmlTextWriter writer)
92 {
93 Menu menu = Control as Menu;
94 if (items.Count > 0)
95 {
96 writer.WriteLine();
97
98 writer.WriteBeginTag("ul");
99 if ((isRoot) && menu.StaticMenuStyle.CssClass != "")
100 {
101 writer.WriteAttribute("id", menu.StaticMenuStyle.CssClass);
102 }
103 writer.Write(HtmlTextWriter.TagRightChar);
104 writer.Indent++;
105
106 foreach (MenuItem item in items)
107 {
108 BuildItem(item, writer);
109 }
110
111 writer.Indent--;
112 writer.WriteLine();
113 writer.WriteEndTag("ul");
114 }
115 }
116
117 private void BuildItem(MenuItem item, HtmlTextWriter writer)
118 {
119 Menu menu = Control as Menu;
120 if ((menu != null) && (item != null) && (writer != null))
121 {
122 writer.WriteLine();
123 writer.WriteBeginTag("li");
124 if (item.Selected)
125 {
126 writer.WriteAttribute("class", "AspNet-Menu-Leaf-Selected");
127 }
128 else
129 {
130 writer.WriteAttribute("class", item.ChildItems.Count > 0 ? "AspNet-Menu-WithChildren" : "AspNet-Menu-Leaf");
131 }
132 ////string theClass = (item.ChildItems.Count > 0) ? "AspNet-Menu-WithChildren" : "AspNet-Menu-Leaf";
133 string theClass = String.Empty;
134 string selectedStatusClass = GetSelectStatusClass(item);
135 if (!String.IsNullOrEmpty(selectedStatusClass))
136 {
137 theClass += " " + selectedStatusClass;
138 writer.WriteAttribute("class", theClass);
139 }
140 //writer.WriteAttribute("class", theClass);
141
142 string strID = item.Text.ToLower();
143 strID = strID.Replace(" ", "_").Replace("&", "and");
144 writer.WriteAttribute("id", menu.StaticMenuItemStyle.CssClass + strID);
145
146 writer.Write(HtmlTextWriter.TagRightChar);
147 writer.Indent++;
148 writer.WriteLine();
149
150 if (((item.Depth < menu.StaticDisplayLevels) && (menu.StaticItemTemplate != null)) ||
151 ((item.Depth >= menu.StaticDisplayLevels) && (menu.DynamicItemTemplate != null)))
152 {
153 writer.WriteBeginTag("div");
154 writer.WriteAttribute("class", GetItemClass(menu, item));
155 writer.Write(HtmlTextWriter.TagRightChar);
156 writer.Indent++;
157 writer.WriteLine();
158
159 MenuItemTemplateContainer container = new MenuItemTemplateContainer(menu.Items.IndexOf(item), item);
160 if ((item.Depth < menu.StaticDisplayLevels) && (menu.StaticItemTemplate != null))
161 {
162 menu.StaticItemTemplate.InstantiateIn(container);
163 }
164 else
165 {
166 menu.DynamicItemTemplate.InstantiateIn(container);
167 }
168 container.DataBind();
169 container.RenderControl(writer);
170
171 writer.Indent--;
172 writer.WriteLine();
173 writer.WriteEndTag("div");
174 }
175 else
176 {
177 if (IsLink(item))
178 {
179 writer.WriteBeginTag("a");
180 if (!String.IsNullOrEmpty(item.NavigateUrl))
181 {
182 writer.WriteAttribute("href", Page.Server.HtmlEncode(menu.ResolveClientUrl(item.NavigateUrl)));
183 }
184 else
185 {
186 writer.WriteAttribute("href", Page.ClientScript.GetPostBackClientHyperlink(menu, "b" + item.ValuePath.Replace(menu.PathSeparator.ToString(), "\\"), true));
187 }
188
189 //writer.WriteAttribute("class", GetItemClass(menu, item));
190 WebControlAdapterExtender.WriteTargetAttribute(writer, item.Target);
191
192 if (!String.IsNullOrEmpty(item.ToolTip))
193 {
194 writer.WriteAttribute("title", item.ToolTip);
195 }
196 else if (!String.IsNullOrEmpty(menu.ToolTip))
197 {
198 writer.WriteAttribute("title", menu.ToolTip);
199 }
200 writer.Write(HtmlTextWriter.TagRightChar);
201 writer.Indent++;
202 writer.WriteLine();
203 }
204 else
205 {
206 writer.WriteBeginTag("span");
207 writer.WriteAttribute("class", GetItemClass(menu, item));
208 writer.Write(HtmlTextWriter.TagRightChar);
209 writer.Indent++;
210 writer.WriteLine();
211 }
212
213 if (!String.IsNullOrEmpty(item.ImageUrl))
214 {
215 writer.WriteBeginTag("img");
216 writer.WriteAttribute("src", menu.ResolveClientUrl(item.ImageUrl));
217 writer.WriteAttribute("alt", !String.IsNullOrEmpty(item.ToolTip) ? item.ToolTip : (!String.IsNullOrEmpty(menu.ToolTip) ? menu.ToolTip : item.Text));
218 writer.Write(HtmlTextWriter.SelfClosingTagEnd);
219 }
220
221 writer.Write(item.Text);
222
223 if (IsLink(item))
224 {
225 writer.Indent--;
226 writer.WriteLine();
227 writer.WriteEndTag("a");
228 }
229 else
230 {
231 writer.Indent--;
232 writer.WriteLine();
233 writer.WriteEndTag("span");
234 }
235
236 }
237
238 if ((item.ChildItems != null) && (item.ChildItems.Count > 0))
239 {
240 BuildItems(item.ChildItems, false, writer);
241 }
242
243 writer.Indent--;
244 writer.WriteLine();
245 writer.WriteEndTag("li");
246 }
247 }
248
249 private bool IsLink(MenuItem item)
250 {
251 return (item != null) && item.Enabled && ((!String.IsNullOrEmpty(item.NavigateUrl)) || item.Selectable);
252 }
253
254 private string GetItemClass(Menu menu, MenuItem item)
255 {
256 string value = "AspNet-Menu-NonLink";
257 if (item != null)
258 {
259 if (((item.Depth < menu.StaticDisplayLevels) && (menu.StaticItemTemplate != null)) ||
260 ((item.Depth >= menu.StaticDisplayLevels) && (menu.DynamicItemTemplate != null)))
261 {
262 value = "AspNet-Menu-Template";
263 }
264 else if (IsLink(item))
265 {
266 value = "AspNet-Menu-Link";
267 }
268 string selectedStatusClass = GetSelectStatusClass(item);
269 if (!String.IsNullOrEmpty(selectedStatusClass))
270 {
271 value += " " + selectedStatusClass;
272 }
273 }
274 return value;
275 }
276
277 private string GetSelectStatusClass(MenuItem item)
278 {
279 string value = "";
280 if (item.Selected)
281 {
282 //value += " AspNet-Menu-Selected";
283 value += "active";
284 }
285 else if (IsChildItemSelected(item))
286 {
287 //value += " AspNet-Menu-ChildSelected";
288 value += "active";
289 }
290 else if (IsParentItemSelected(item))
291 {
292 //value += " AspNet-Menu-ParentSelected";
293 value += "active";
294 }
295 return value;
296 }
297
298 private bool IsChildItemSelected(MenuItem item)
299 {
300 bool bRet = false;
301
302 if ((item != null) && (item.ChildItems != null))
303 {
304 bRet = IsChildItemSelected(item.ChildItems);
305 }
306
307 return bRet;
308 }
309
310 private bool IsChildItemSelected(MenuItemCollection items)
311 {
312 bool bRet = false;
313
314 if (items != null)
315 {
316 foreach (MenuItem item in items)
317 {
318 if (item.Selected || IsChildItemSelected(item.ChildItems))
319 {
320 bRet = true;
321 break;
322 }
323 }
324 }
325
326 return bRet;
327 }
328
329 private bool IsParentItemSelected(MenuItem item)
330 {
331 bool bRet = false;
332
333 if ((item != null) && (item.Parent != null))
334 {
335 if (item.Parent.Selected)
336 {
337 bRet = true;
338 }
339 else
340 {
341 bRet = IsParentItemSelected(item.Parent);
342 }
343 }
344
345 return bRet;
346 }
347 }
348 }
349