TreeView.cs 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439
  1. //
  2. // System.Web.UI.WebControls.TreeView.cs
  3. //
  4. // Authors:
  5. // Lluis Sanchez Gual ([email protected])
  6. //
  7. // (C) 2004 Novell, Inc (http://www.novell.com)
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
  29. //
  30. #if NET_2_0
  31. using System.Collections;
  32. using System.Text;
  33. using System.ComponentModel;
  34. using System.Web.Handlers;
  35. using System.Collections.Specialized;
  36. using System.IO;
  37. using System.Security.Permissions;
  38. namespace System.Web.UI.WebControls
  39. {
  40. // CAS
  41. [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
  42. [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
  43. // attributes
  44. [SupportsEventValidation]
  45. [ControlValueProperty ("SelectedValue")]
  46. [DefaultEvent ("SelectedNodeChanged")]
  47. [Designer ("System.Web.UI.Design.WebControls.TreeViewDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
  48. public class TreeView: HierarchicalDataBoundControl, IPostBackEventHandler, IPostBackDataHandler, ICallbackEventHandler
  49. {
  50. Style hoverNodeStyle;
  51. TreeNodeStyle leafNodeStyle;
  52. TreeNodeStyle nodeStyle;
  53. TreeNodeStyle parentNodeStyle;
  54. TreeNodeStyle rootNodeStyle;
  55. TreeNodeStyle selectedNodeStyle;
  56. TreeNodeStyleCollection levelStyles;
  57. TreeNodeCollection nodes;
  58. TreeNodeBindingCollection dataBindings;
  59. TreeNode selectedNode;
  60. Hashtable bindings;
  61. private static readonly object TreeNodeCheckChangedEvent = new object();
  62. private static readonly object SelectedNodeChangedEvent = new object();
  63. private static readonly object TreeNodeCollapsedEvent = new object();
  64. private static readonly object TreeNodeDataBoundEvent = new object();
  65. private static readonly object TreeNodeExpandedEvent = new object();
  66. private static readonly object TreeNodePopulateEvent = new object();
  67. static Hashtable imageStyles = new Hashtable ();
  68. class ImageStyle
  69. {
  70. public ImageStyle (string expand, string collapse, string noExpand, string icon, string iconLeaf, string iconRoot) {
  71. Expand = expand;
  72. Collapse = collapse;
  73. NoExpand = noExpand;
  74. RootIcon = iconRoot;
  75. ParentIcon = icon;
  76. LeafIcon = iconLeaf;
  77. }
  78. public string Expand;
  79. public string Collapse;
  80. public string NoExpand;
  81. public string RootIcon;
  82. public string ParentIcon;
  83. public string LeafIcon;
  84. }
  85. static TreeView ()
  86. {
  87. imageStyles [TreeViewImageSet.Arrows] = new ImageStyle ("arrow_plus", "arrow_minus", "arrow_noexpand", null, null, null);
  88. imageStyles [TreeViewImageSet.BulletedList] = new ImageStyle (null, null, null, "dot_full", "dot_empty", "dot_full");
  89. imageStyles [TreeViewImageSet.BulletedList2] = new ImageStyle (null, null, null, "box_full", "box_empty", "box_full");
  90. imageStyles [TreeViewImageSet.BulletedList3] = new ImageStyle (null, null, null, "star_full", "star_empty", "star_full");
  91. imageStyles [TreeViewImageSet.BulletedList4] = new ImageStyle (null, null, null, "star_full", "star_empty", "dots");
  92. imageStyles [TreeViewImageSet.Contacts] = new ImageStyle ("TreeView_plus", "TreeView_minus", "contact", null, null, null);
  93. imageStyles [TreeViewImageSet.Events] = new ImageStyle ("TreeView_plus", "TreeView_minus", "TreeView_noexpand", null, "warning", null);
  94. imageStyles [TreeViewImageSet.Inbox] = new ImageStyle ("TreeView_plus", "TreeView_minus", "TreeView_noexpand", "inbox", "inbox", "inbox");
  95. imageStyles [TreeViewImageSet.Msdn] = new ImageStyle ("box_plus", "box_minus", "box_noexpand", null, null, null);
  96. imageStyles [TreeViewImageSet.Simple] = new ImageStyle ("TreeView_plus", "TreeView_minus", "box_full", null, null, null);
  97. imageStyles [TreeViewImageSet.Simple2] = new ImageStyle ("TreeView_plus", "TreeView_minus", "box_empty", null, null, null);
  98. // TODO
  99. imageStyles [TreeViewImageSet.News] = new ImageStyle ("TreeView_plus", "TreeView_minus", "TreeView_noexpand", null, null, null);
  100. imageStyles [TreeViewImageSet.Faq] = new ImageStyle ("TreeView_plus", "TreeView_minus", "TreeView_noexpand", null, null, null);
  101. imageStyles [TreeViewImageSet.WindowsHelp] = new ImageStyle ("TreeView_plus", "TreeView_minus", "TreeView_noexpand", null, null, null);
  102. imageStyles [TreeViewImageSet.XPFileExplorer] = new ImageStyle ("TreeView_plus", "TreeView_minus", "TreeView_noexpand", null, null, null);
  103. }
  104. public event TreeNodeEventHandler TreeNodeCheckChanged {
  105. add { Events.AddHandler (TreeNodeCheckChangedEvent, value); }
  106. remove { Events.RemoveHandler (TreeNodeCheckChangedEvent, value); }
  107. }
  108. public event EventHandler SelectedNodeChanged {
  109. add { Events.AddHandler (SelectedNodeChangedEvent, value); }
  110. remove { Events.RemoveHandler (SelectedNodeChangedEvent, value); }
  111. }
  112. public event TreeNodeEventHandler TreeNodeCollapsed {
  113. add { Events.AddHandler (TreeNodeCollapsedEvent, value); }
  114. remove { Events.RemoveHandler (TreeNodeCollapsedEvent, value); }
  115. }
  116. public event TreeNodeEventHandler TreeNodeDataBound {
  117. add { Events.AddHandler (TreeNodeDataBoundEvent, value); }
  118. remove { Events.RemoveHandler (TreeNodeDataBoundEvent, value); }
  119. }
  120. public event TreeNodeEventHandler TreeNodeExpanded {
  121. add { Events.AddHandler (TreeNodeExpandedEvent, value); }
  122. remove { Events.RemoveHandler (TreeNodeExpandedEvent, value); }
  123. }
  124. public event TreeNodeEventHandler TreeNodePopulate {
  125. add { Events.AddHandler (TreeNodePopulateEvent, value); }
  126. remove { Events.RemoveHandler (TreeNodePopulateEvent, value); }
  127. }
  128. protected virtual void OnTreeNodeCheckChanged (TreeNodeEventArgs e)
  129. {
  130. if (Events != null) {
  131. TreeNodeEventHandler eh = (TreeNodeEventHandler) Events [TreeNodeCheckChangedEvent];
  132. if (eh != null) eh (this, e);
  133. }
  134. }
  135. protected virtual void OnSelectedNodeChanged (EventArgs e)
  136. {
  137. if (Events != null) {
  138. EventHandler eh = (EventHandler) Events [SelectedNodeChangedEvent];
  139. if (eh != null) eh (this, e);
  140. }
  141. }
  142. protected virtual void OnTreeNodeCollapsed (TreeNodeEventArgs e)
  143. {
  144. if (Events != null) {
  145. TreeNodeEventHandler eh = (TreeNodeEventHandler) Events [TreeNodeCollapsedEvent];
  146. if (eh != null) eh (this, e);
  147. }
  148. }
  149. protected virtual void OnTreeNodeDataBound (TreeNodeEventArgs e)
  150. {
  151. if (Events != null) {
  152. TreeNodeEventHandler eh = (TreeNodeEventHandler) Events [TreeNodeDataBoundEvent];
  153. if (eh != null) eh (this, e);
  154. }
  155. }
  156. protected virtual void OnTreeNodeExpanded (TreeNodeEventArgs e)
  157. {
  158. if (Events != null) {
  159. TreeNodeEventHandler eh = (TreeNodeEventHandler) Events [TreeNodeExpandedEvent];
  160. if (eh != null) eh (this, e);
  161. }
  162. }
  163. protected virtual void OnTreeNodePopulate (TreeNodeEventArgs e)
  164. {
  165. if (Events != null) {
  166. TreeNodeEventHandler eh = (TreeNodeEventHandler) Events [TreeNodePopulateEvent];
  167. if (eh != null) eh (this, e);
  168. }
  169. }
  170. [Localizable (true)]
  171. public string CollapseImageToolTip {
  172. get {
  173. return ViewState.GetString ("CollapseImageToolTip", "Collapse {0}");
  174. }
  175. set {
  176. ViewState["CollapseImageToolTip"] = value;
  177. }
  178. }
  179. [MonoTODO ("Implement support for this")]
  180. [WebCategory ("Behavior")]
  181. [WebSysDescription ("Whether the tree will automatically generate bindings.")]
  182. [DefaultValue (true)]
  183. public bool AutoGenerateDataBindings {
  184. get {
  185. return ViewState.GetBool ("AutoGenerateDataBindings", true);
  186. }
  187. set {
  188. ViewState["AutoGenerateDataBindings"] = value;
  189. }
  190. }
  191. [DefaultValue ("")]
  192. [WebSysDescription ("The url of the image to show when a node can be collapsed.")]
  193. [UrlProperty]
  194. [WebCategory ("Appearance")]
  195. [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
  196. public string CollapseImageUrl {
  197. get {
  198. return ViewState.GetString ("CollapseImageUrl", "");
  199. }
  200. set {
  201. ViewState["CollapseImageUrl"] = value;
  202. }
  203. }
  204. [WebCategory ("Data")]
  205. [PersistenceMode (PersistenceMode.InnerProperty)]
  206. [WebSysDescription ("Bindings for tree nodes.")]
  207. [Editor ("System.Web.UI.Design.WebControls.TreeViewBindingsEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
  208. [DefaultValue (null)]
  209. [MergablePropertyAttribute (false)]
  210. public TreeNodeBindingCollection DataBindings {
  211. get {
  212. if (dataBindings == null) {
  213. dataBindings = new TreeNodeBindingCollection ();
  214. if (IsTrackingViewState)
  215. ((IStateManager)dataBindings).TrackViewState();
  216. }
  217. return dataBindings;
  218. }
  219. }
  220. [WebCategory ("Behavior")]
  221. [WebSysDescription ("Whether the tree view can use client-side script to expand and collapse nodes.")]
  222. [Themeable (false)]
  223. [DefaultValue (true)]
  224. public bool EnableClientScript {
  225. get {
  226. return ViewState.GetBool ("EnableClientScript", true);
  227. }
  228. set {
  229. ViewState["EnableClientScript"] = value;
  230. }
  231. }
  232. [DefaultValue (-1)]
  233. [WebCategory ("Behavior")]
  234. [WebSysDescription ("The initial expand depth.")]
  235. [TypeConverter ("System.Web.UI.WebControls.TreeView+TreeViewExpandDepthConverter, " + Consts.AssemblySystem_Web)]
  236. public int ExpandDepth {
  237. get {
  238. return ViewState.GetInt ("ExpandDepth", -1);
  239. }
  240. set {
  241. ViewState["ExpandDepth"] = value;
  242. }
  243. }
  244. [Localizable (true)]
  245. public string ExpandImageToolTip {
  246. get {
  247. return ViewState.GetString ("ExpandImageToolTip", "Expand {0}");
  248. }
  249. set {
  250. ViewState["ExpandImageToolTip"] = value;
  251. }
  252. }
  253. [DefaultValue ("")]
  254. [UrlProperty]
  255. [WebSysDescription ("The url of the image to show when a node can be expanded.")]
  256. [WebCategory ("Appearance")]
  257. [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
  258. public string ExpandImageUrl {
  259. get {
  260. return ViewState.GetString ("ExpandImageUrl", "");
  261. }
  262. set {
  263. ViewState["ExpandImageUrl"] = value;
  264. }
  265. }
  266. [PersistenceMode (PersistenceMode.InnerProperty)]
  267. [NotifyParentProperty (true)]
  268. [DefaultValue (null)]
  269. [WebCategory ("Styles")]
  270. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  271. public Style HoverNodeStyle {
  272. get {
  273. if (hoverNodeStyle == null) {
  274. hoverNodeStyle = new Style();
  275. if (IsTrackingViewState)
  276. hoverNodeStyle.TrackViewState();
  277. }
  278. return hoverNodeStyle;
  279. }
  280. }
  281. [DefaultValue (TreeViewImageSet.Custom)]
  282. public TreeViewImageSet ImageSet {
  283. get {
  284. return (TreeViewImageSet)ViewState.GetInt ("ImageSet", (int)TreeViewImageSet.Custom);
  285. }
  286. set {
  287. ViewState["ImageSet"] = value;
  288. }
  289. }
  290. [PersistenceMode (PersistenceMode.InnerProperty)]
  291. [NotifyParentProperty (true)]
  292. [DefaultValue (null)]
  293. [WebCategory ("Styles")]
  294. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  295. public TreeNodeStyle LeafNodeStyle {
  296. get {
  297. if (leafNodeStyle == null) {
  298. leafNodeStyle = new TreeNodeStyle ();
  299. if (IsTrackingViewState)
  300. leafNodeStyle.TrackViewState();
  301. }
  302. return leafNodeStyle;
  303. }
  304. }
  305. [DefaultValue (null)]
  306. [WebCategory ("Styles")]
  307. [PersistenceMode (PersistenceMode.InnerProperty)]
  308. [Editor ("System.Web.UI.Design.WebControls.TreeNodeStyleCollectionEditor," + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
  309. public TreeNodeStyleCollection LevelStyles {
  310. get {
  311. if (levelStyles == null) {
  312. levelStyles = new TreeNodeStyleCollection ();
  313. if (IsTrackingViewState)
  314. ((IStateManager)levelStyles).TrackViewState();
  315. }
  316. return levelStyles;
  317. }
  318. }
  319. [DefaultValue ("")]
  320. public string LineImagesFolder {
  321. get {
  322. return ViewState.GetString ("LineImagesFolder", "");
  323. }
  324. set {
  325. ViewState["LineImagesFolder"] = value;
  326. }
  327. }
  328. [DefaultValue (-1)]
  329. public int MaxDataBindDepth {
  330. get {
  331. return ViewState.GetInt ("MaxDataBindDepth", -1);
  332. }
  333. set {
  334. ViewState["MaxDataBindDepth"] = value;
  335. }
  336. }
  337. [DefaultValue (20)]
  338. public int NodeIndent {
  339. get {
  340. return ViewState.GetInt ("NodeIndent", 20);
  341. }
  342. set {
  343. ViewState["NodeIndent"] = value;
  344. }
  345. }
  346. [PersistenceMode (PersistenceMode.InnerProperty)]
  347. [Editor ("System.Web.UI.Design.WebControls.TreeNodeCollectionEditor," + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
  348. [DefaultValueAttribute (null)]
  349. [MergablePropertyAttribute (false)]
  350. public TreeNodeCollection Nodes {
  351. get {
  352. if (nodes == null) {
  353. nodes = new TreeNodeCollection (this);
  354. if (IsTrackingViewState)
  355. ((IStateManager)nodes).TrackViewState();
  356. }
  357. return nodes;
  358. }
  359. }
  360. [PersistenceMode (PersistenceMode.InnerProperty)]
  361. [NotifyParentProperty (true)]
  362. [DefaultValue (null)]
  363. [WebCategory ("Styles")]
  364. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  365. public TreeNodeStyle NodeStyle {
  366. get {
  367. if (nodeStyle == null) {
  368. nodeStyle = new TreeNodeStyle ();
  369. if (IsTrackingViewState)
  370. nodeStyle.TrackViewState();
  371. }
  372. return nodeStyle;
  373. }
  374. }
  375. [DefaultValue (false)]
  376. public bool NodeWrap {
  377. get {
  378. return ViewState.GetBool ("NodeWrap", false);
  379. }
  380. set {
  381. ViewState ["NodeWrap"] = value;
  382. }
  383. }
  384. [UrlProperty]
  385. [DefaultValue ("")]
  386. [WebSysDescription ("The url of the image to show for leaf nodes.")]
  387. [WebCategory ("Appearance")]
  388. [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
  389. public string NoExpandImageUrl {
  390. get {
  391. return ViewState.GetString ("NoExpandImageUrl", "");
  392. }
  393. set {
  394. ViewState ["NoExpandImageUrl"] = value;
  395. }
  396. }
  397. [PersistenceMode (PersistenceMode.InnerProperty)]
  398. [NotifyParentProperty (true)]
  399. [DefaultValue (null)]
  400. [WebCategory ("Styles")]
  401. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  402. public TreeNodeStyle ParentNodeStyle {
  403. get {
  404. if (parentNodeStyle == null) {
  405. parentNodeStyle = new TreeNodeStyle ();
  406. if (IsTrackingViewState)
  407. parentNodeStyle.TrackViewState();
  408. }
  409. return parentNodeStyle;
  410. }
  411. }
  412. [DefaultValue ('/')]
  413. public char PathSeparator {
  414. get {
  415. return ViewState.GetChar ("PathSeparator", '/');
  416. }
  417. set {
  418. ViewState ["PathSeparator"] = value;
  419. }
  420. }
  421. [DefaultValue (true)]
  422. public bool PopulateNodesFromClient {
  423. get {
  424. return ViewState.GetBool ("PopulateNodesFromClient", true);
  425. }
  426. set {
  427. ViewState ["PopulateNodesFromClient"] = value;
  428. }
  429. }
  430. [PersistenceMode (PersistenceMode.InnerProperty)]
  431. [NotifyParentProperty (true)]
  432. [DefaultValue (null)]
  433. [WebCategory ("Styles")]
  434. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  435. public TreeNodeStyle RootNodeStyle {
  436. get {
  437. if (rootNodeStyle == null) {
  438. rootNodeStyle = new TreeNodeStyle ();
  439. if (IsTrackingViewState)
  440. rootNodeStyle.TrackViewState();
  441. }
  442. return rootNodeStyle;
  443. }
  444. }
  445. [PersistenceMode (PersistenceMode.InnerProperty)]
  446. [NotifyParentProperty (true)]
  447. [DefaultValue (null)]
  448. [WebCategory ("Styles")]
  449. [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
  450. public TreeNodeStyle SelectedNodeStyle {
  451. get {
  452. if (selectedNodeStyle == null) {
  453. selectedNodeStyle = new TreeNodeStyle ();
  454. if (IsTrackingViewState)
  455. selectedNodeStyle.TrackViewState();
  456. }
  457. return selectedNodeStyle;
  458. }
  459. }
  460. [DefaultValue (TreeNodeTypes.None)]
  461. public TreeNodeTypes ShowCheckBoxes {
  462. get {
  463. return (TreeNodeTypes)ViewState.GetInt ("ShowCheckBoxes", (int)TreeNodeTypes.None);
  464. }
  465. set {
  466. ViewState ["ShowCheckBoxes"] = value;
  467. }
  468. }
  469. [DefaultValue (true)]
  470. public bool ShowExpandCollapse {
  471. get {
  472. return ViewState.GetBool ("ShowExpandCollapse", true);
  473. }
  474. set {
  475. ViewState ["ShowExpandCollapse"] = value;
  476. }
  477. }
  478. [DefaultValue (false)]
  479. public bool ShowLines {
  480. get {
  481. return ViewState.GetBool ("ShowLines", false);
  482. }
  483. set {
  484. ViewState ["ShowLines"] = value;
  485. }
  486. }
  487. [Localizable (true)]
  488. public string SkipLinkText
  489. {
  490. get {
  491. return ViewState.GetString ("SkipLinkText", "Skip Navigation Links.");
  492. }
  493. set {
  494. ViewState ["SkipLinkText"] = value;
  495. }
  496. }
  497. [Browsable (false)]
  498. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  499. public TreeNode SelectedNode {
  500. get { return selectedNode; }
  501. }
  502. [Browsable (false)]
  503. [DefaultValue ("")]
  504. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  505. public string SelectedValue {
  506. get { return selectedNode != null ? selectedNode.Value : ""; }
  507. }
  508. [DefaultValue ("")]
  509. public string Target {
  510. get {
  511. return ViewState.GetString ("Target", "");
  512. }
  513. set {
  514. ViewState ["Target"] = value;
  515. }
  516. }
  517. [MonoTODO ("why override?")]
  518. public override bool Visible
  519. {
  520. get {
  521. return base.Visible;
  522. }
  523. set {
  524. base.Visible = value;
  525. }
  526. }
  527. [Browsable (false)]
  528. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  529. public TreeNodeCollection CheckedNodes {
  530. get {
  531. TreeNodeCollection col = new TreeNodeCollection ();
  532. FindCheckedNodes (Nodes, col);
  533. return col;
  534. }
  535. }
  536. void FindCheckedNodes (TreeNodeCollection nodeList, TreeNodeCollection result)
  537. {
  538. foreach (TreeNode node in nodeList) {
  539. if (node.Checked) result.Add (node);
  540. FindCheckedNodes (node.ChildNodes, result);
  541. }
  542. }
  543. public void ExpandAll ()
  544. {
  545. foreach (TreeNode node in Nodes)
  546. node.ExpandAll ();
  547. }
  548. public void CollapseAll ()
  549. {
  550. foreach (TreeNode node in Nodes)
  551. node.CollapseAll ();
  552. }
  553. public TreeNode FindNode (string valuePath)
  554. {
  555. if (valuePath == null) throw new ArgumentNullException ("valuePath");
  556. string[] path = valuePath.Split (PathSeparator);
  557. int n = 0;
  558. TreeNodeCollection col = Nodes;
  559. bool foundBranch = true;
  560. while (col.Count > 0 && foundBranch) {
  561. foundBranch = false;
  562. foreach (TreeNode node in col) {
  563. if (node.Value == path [n]) {
  564. if (++n == path.Length) return node;
  565. col = node.ChildNodes;
  566. foundBranch = true;
  567. break;
  568. }
  569. }
  570. }
  571. return null;
  572. }
  573. ImageStyle GetImageStyle ()
  574. {
  575. if (ImageSet != TreeViewImageSet.Custom)
  576. return (ImageStyle) imageStyles [ImageSet];
  577. else
  578. return null;
  579. }
  580. protected override HtmlTextWriterTag TagKey {
  581. get { return HtmlTextWriterTag.Div; }
  582. }
  583. protected internal virtual TreeNode CreateNode ()
  584. {
  585. return new TreeNode (this);
  586. }
  587. public sealed override void DataBind ()
  588. {
  589. base.DataBind ();
  590. }
  591. protected void SetNodeDataBound (TreeNode node, bool dataBound)
  592. {
  593. node.SetDataBound (dataBound);
  594. }
  595. protected void SetNodeDataPath (TreeNode node, string dataPath)
  596. {
  597. node.SetDataPath (dataPath);
  598. }
  599. protected void SetNodeDataItem (TreeNode node, object dataItem)
  600. {
  601. node.SetDataItem (dataItem);
  602. }
  603. protected internal override void OnInit (EventArgs e)
  604. {
  605. if (!Page.IsPostBack && ExpandDepth != 0) {
  606. foreach (TreeNode node in Nodes)
  607. node.Expand (ExpandDepth - 1);
  608. }
  609. }
  610. internal void SetSelectedNode (TreeNode node, bool loading)
  611. {
  612. if (selectedNode == node) return;
  613. if (selectedNode != null)
  614. selectedNode.SelectedFlag = false;
  615. selectedNode = node;
  616. selectedNode.SelectedFlag = true;
  617. if (!loading)
  618. OnSelectedNodeChanged (new TreeNodeEventArgs (selectedNode));
  619. }
  620. internal void NotifyCheckChanged (TreeNode node)
  621. {
  622. OnTreeNodeCheckChanged (new TreeNodeEventArgs (node));
  623. }
  624. internal void NotifyExpandedChanged (TreeNode node)
  625. {
  626. if (node.Expanded.HasValue && node.Expanded.Value)
  627. OnTreeNodeExpanded (new TreeNodeEventArgs (node));
  628. else
  629. OnTreeNodeCollapsed (new TreeNodeEventArgs (node));
  630. }
  631. internal void NotifyPopulateRequired (TreeNode node)
  632. {
  633. OnTreeNodePopulate (new TreeNodeEventArgs (node));
  634. }
  635. protected override void TrackViewState()
  636. {
  637. EnsureDataBound ();
  638. base.TrackViewState();
  639. if (hoverNodeStyle != null) {
  640. hoverNodeStyle.TrackViewState();
  641. }
  642. if (leafNodeStyle != null) {
  643. leafNodeStyle.TrackViewState();
  644. }
  645. if (levelStyles != null) {
  646. ((IStateManager)levelStyles).TrackViewState();
  647. }
  648. if (nodeStyle != null) {
  649. nodeStyle.TrackViewState();
  650. }
  651. if (parentNodeStyle != null) {
  652. parentNodeStyle.TrackViewState();
  653. }
  654. if (rootNodeStyle != null) {
  655. rootNodeStyle.TrackViewState();
  656. }
  657. if (selectedNodeStyle != null) {
  658. selectedNodeStyle.TrackViewState();
  659. }
  660. if (dataBindings != null) {
  661. ((IStateManager)dataBindings).TrackViewState ();
  662. }
  663. if (nodes != null) {
  664. ((IStateManager)nodes).TrackViewState();;
  665. }
  666. }
  667. protected override object SaveViewState()
  668. {
  669. object[] states = new object [10];
  670. states[0] = base.SaveViewState();
  671. states[1] = (hoverNodeStyle == null ? null : hoverNodeStyle.SaveViewState());
  672. states[2] = (leafNodeStyle == null ? null : leafNodeStyle.SaveViewState());
  673. states[3] = (levelStyles == null ? null : ((IStateManager)levelStyles).SaveViewState());
  674. states[4] = (nodeStyle == null ? null : nodeStyle.SaveViewState());
  675. states[5] = (parentNodeStyle == null ? null : parentNodeStyle.SaveViewState());
  676. states[6] = (rootNodeStyle == null ? null : rootNodeStyle.SaveViewState());
  677. states[7] = (selectedNodeStyle == null ? null : selectedNodeStyle.SaveViewState());
  678. states[8] = (dataBindings == null ? null : ((IStateManager)dataBindings).SaveViewState());
  679. states[9] = (nodes == null ? null : ((IStateManager)nodes).SaveViewState());
  680. for (int i = states.Length - 1; i >= 0; i--) {
  681. if (states [i] != null)
  682. return states;
  683. }
  684. return null;
  685. }
  686. protected override void LoadViewState (object savedState)
  687. {
  688. if (savedState == null)
  689. return;
  690. object [] states = (object []) savedState;
  691. base.LoadViewState (states[0]);
  692. if (states[1] != null)
  693. HoverNodeStyle.LoadViewState (states[1]);
  694. if (states[2] != null)
  695. LeafNodeStyle.LoadViewState(states[2]);
  696. if (states[3] != null)
  697. ((IStateManager)LevelStyles).LoadViewState(states[3]);
  698. if (states[4] != null)
  699. NodeStyle.LoadViewState(states[4]);
  700. if (states[5] != null)
  701. ParentNodeStyle.LoadViewState(states[5]);
  702. if (states[6] != null)
  703. RootNodeStyle.LoadViewState(states[6]);
  704. if (states[7] != null)
  705. SelectedNodeStyle.LoadViewState(states[7]);
  706. if (states[8] != null)
  707. ((IStateManager)DataBindings).LoadViewState(states[8]);
  708. if (states[9] != null)
  709. ((IStateManager)Nodes).LoadViewState(states[9]);
  710. }
  711. protected virtual void RaisePostBackEvent (string eventArgument)
  712. {
  713. string[] args = eventArgument.Split ('|');
  714. TreeNode node = FindNodeByPos (args[1]);
  715. if (node == null) return;
  716. if (args [0] == "sel")
  717. HandleSelectEvent (node);
  718. else if (args [0] == "ec")
  719. HandleExpandCollapseEvent (node);
  720. }
  721. void HandleSelectEvent (TreeNode node)
  722. {
  723. switch (node.SelectAction) {
  724. case TreeNodeSelectAction.Select:
  725. node.Select ();
  726. break;
  727. case TreeNodeSelectAction.Expand:
  728. node.Expand ();
  729. break;
  730. case TreeNodeSelectAction.SelectExpand:
  731. node.Select ();
  732. node.Expand ();
  733. break;
  734. }
  735. }
  736. void HandleExpandCollapseEvent (TreeNode node)
  737. {
  738. node.ToggleExpandState ();
  739. }
  740. protected virtual void RaisePostDataChangedEvent ()
  741. {
  742. }
  743. string callbackResult;
  744. protected virtual void RaiseCallbackEvent (string eventArgs)
  745. {
  746. RequiresDataBinding = true;
  747. EnsureDataBound ();
  748. TreeNode node = FindNodeByPos (eventArgs);
  749. ArrayList levelLines = new ArrayList ();
  750. TreeNode nd = node;
  751. while (nd != null) {
  752. int childCount = nd.Parent != null ? nd.Parent.ChildNodes.Count : Nodes.Count;
  753. levelLines.Insert (0, (nd.Index < childCount - 1) ? this : null);
  754. nd = nd.Parent;
  755. }
  756. StringWriter sw = new StringWriter ();
  757. HtmlTextWriter writer = new HtmlTextWriter (sw);
  758. int num = node.ChildNodes.Count;
  759. for (int n=0; n<num; n++)
  760. RenderNode (writer, node.ChildNodes [n], node.Depth + 1, levelLines, true, n<num-1);
  761. string res = sw.ToString ();
  762. callbackResult = res != "" ? res : "*";
  763. }
  764. protected virtual string GetCallbackResult ()
  765. {
  766. return callbackResult;
  767. }
  768. void IPostBackEventHandler.RaisePostBackEvent (string eventArgument)
  769. {
  770. RaisePostBackEvent (eventArgument);
  771. }
  772. bool IPostBackDataHandler.LoadPostData (string postDataKey, NameValueCollection postCollection)
  773. {
  774. return LoadPostData (postDataKey, postCollection);
  775. }
  776. void IPostBackDataHandler.RaisePostDataChangedEvent ()
  777. {
  778. RaisePostDataChangedEvent ();
  779. }
  780. void ICallbackEventHandler.RaiseCallbackEvent (string eventArgs)
  781. {
  782. RaiseCallbackEvent (eventArgs);
  783. }
  784. string ICallbackEventHandler.GetCallbackResult ()
  785. {
  786. return GetCallbackResult ();
  787. }
  788. protected override ControlCollection CreateControlCollection ()
  789. {
  790. return new EmptyControlCollection (this);
  791. }
  792. protected internal override void PerformDataBinding ()
  793. {
  794. base.PerformDataBinding ();
  795. HierarchicalDataSourceView data = GetData ("");
  796. IHierarchicalEnumerable e = data.Select ();
  797. foreach (object obj in e) {
  798. IHierarchyData hdata = e.GetHierarchyData (obj);
  799. TreeNode node = CreateNode ();
  800. node.Bind (hdata);
  801. Nodes.Add (node);
  802. }
  803. }
  804. protected virtual bool LoadPostData (string postDataKey, NameValueCollection postCollection)
  805. {
  806. RequiresDataBinding = true;
  807. EnsureDataBound ();
  808. bool res = false;
  809. if (ShowCheckBoxes != TreeNodeTypes.None) {
  810. UnsetCheckStates (Nodes, postCollection);
  811. SetCheckStates (postCollection);
  812. res = true;
  813. }
  814. if (EnableClientScript) {
  815. string states = postCollection [ClientID + "_ExpandStates"];
  816. if (states != null) {
  817. string[] ids = states.Split ('|');
  818. UnsetExpandStates (Nodes, ids);
  819. SetExpandStates (ids);
  820. }
  821. else
  822. UnsetExpandStates (Nodes, new string[0]);
  823. res = true;
  824. }
  825. return res;
  826. }
  827. protected internal override void OnPreRender (EventArgs e)
  828. {
  829. base.OnPreRender (e);
  830. if (Page != null && Enabled)
  831. Page.RegisterRequiresPostBack (this);
  832. if (EnableClientScript && !Page.ClientScript.IsClientScriptIncludeRegistered (typeof(TreeView), "TreeView.js")) {
  833. string url = Page.ClientScript.GetWebResourceUrl (typeof(TreeView), "TreeView.js");
  834. Page.ClientScript.RegisterClientScriptInclude (typeof(TreeView), "TreeView.js", url);
  835. }
  836. string ctree = ClientID + "_data";
  837. string script = string.Format ("var {0} = new Object ();\n", ctree);
  838. script += string.Format ("{0}.showImage = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (ShowExpandCollapse));
  839. if (ShowExpandCollapse) {
  840. bool defaultImages = ShowLines || ImageSet != TreeViewImageSet.Custom || (ExpandImageUrl == "" && CollapseImageUrl == "");
  841. script += string.Format ("{0}.defaultImages = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (defaultImages));
  842. ImageStyle imageStyle = GetImageStyle ();
  843. if (!defaultImages) {
  844. script += string.Format ("{0}.expandImage = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageUrl ("plus", imageStyle)));
  845. script += string.Format ("{0}.collapseImage = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageUrl ("minus", imageStyle)));
  846. }
  847. if (PopulateNodesFromClient)
  848. script += string.Format ("{0}.noExpandImage = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageUrl ("noexpand", imageStyle)));
  849. }
  850. script += string.Format ("{0}.populateFromClient = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (PopulateNodesFromClient));
  851. script += string.Format ("{0}.expandAlt = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageToolTip (true, null)));
  852. script += string.Format ("{0}.collapseAlt = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageToolTip (false, null)));
  853. Page.ClientScript.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);
  854. if (EnableClientScript) {
  855. Page.ClientScript.RegisterHiddenField (ClientID + "_ExpandStates", GetExpandStates ());
  856. // Make sure the basic script infrastructure is rendered
  857. Page.ClientScript.GetCallbackEventReference (this, "null", "", "null");
  858. Page.ClientScript.GetPostBackClientHyperlink (this, "");
  859. }
  860. if (dataBindings != null && dataBindings.Count > 0) {
  861. bindings = new Hashtable ();
  862. foreach (TreeNodeBinding bin in dataBindings) {
  863. string key = GetBindingKey (bin.DataMember, bin.Depth);
  864. bindings [key] = bin;
  865. }
  866. }
  867. else
  868. bindings = null;
  869. }
  870. string GetBindingKey (string dataMember, int depth)
  871. {
  872. return dataMember + " " + depth;
  873. }
  874. internal TreeNodeBinding FindBindingForNode (string type, int depth)
  875. {
  876. if (bindings == null) return null;
  877. TreeNodeBinding bin = (TreeNodeBinding) bindings [GetBindingKey (type, depth)];
  878. if (bin != null) return bin;
  879. bin = (TreeNodeBinding) bindings [GetBindingKey (type, -1)];
  880. if (bin != null) return bin;
  881. bin = (TreeNodeBinding) bindings [GetBindingKey ("", depth)];
  882. if (bin != null) return bin;
  883. bin = (TreeNodeBinding) bindings [GetBindingKey ("", -1)];
  884. return bin;
  885. }
  886. protected internal override void RenderContents (HtmlTextWriter writer)
  887. {
  888. ArrayList levelLines = new ArrayList ();
  889. int num = Nodes.Count;
  890. for (int n=0; n<num; n++)
  891. RenderNode (writer, Nodes [n], 0, levelLines, n>0, n<num-1);
  892. }
  893. protected override void AddAttributesToRender(HtmlTextWriter writer)
  894. {
  895. base.AddAttributesToRender (writer);
  896. }
  897. public override void RenderBeginTag (HtmlTextWriter writer)
  898. {
  899. base.RenderBeginTag (writer);
  900. }
  901. public override void RenderEndTag (HtmlTextWriter writer)
  902. {
  903. base.RenderEndTag (writer);
  904. }
  905. void RenderNode (HtmlTextWriter writer, TreeNode node, int level, ArrayList levelLines, bool hasPrevious, bool hasNext)
  906. {
  907. string nodeImage;
  908. bool clientExpand = EnableClientScript && Events [TreeNodeCollapsedEvent] == null && Events [TreeNodeExpandedEvent] == null;
  909. ImageStyle imageStyle = GetImageStyle ();
  910. bool renderChildNodes = node.Expanded.HasValue && node.Expanded.Value;
  911. if (clientExpand && !renderChildNodes)
  912. renderChildNodes = (!PopulateNodesFromClient || HasChildInputData (node));
  913. bool hasChildNodes;
  914. if (renderChildNodes)
  915. hasChildNodes = node.ChildNodes.Count > 0;
  916. else
  917. hasChildNodes = (node.PopulateOnDemand && !node.Populated) || node.ChildNodes.Count > 0;
  918. writer.AddAttribute ("cellpadding", "0");
  919. writer.AddAttribute ("cellspacing", "0");
  920. writer.AddStyleAttribute ("border-width", "0");
  921. writer.RenderBeginTag (HtmlTextWriterTag.Table);
  922. writer.RenderBeginTag (HtmlTextWriterTag.Tr);
  923. // Vertical lines from previous levels
  924. for (int n=0; n<level; n++) {
  925. writer.RenderBeginTag (HtmlTextWriterTag.Td);
  926. if (ShowLines) {
  927. if (levelLines [n] == null)
  928. nodeImage = GetNodeImageUrl ("noexpand", imageStyle);
  929. else
  930. nodeImage = GetNodeImageUrl ("i", imageStyle);
  931. writer.AddAttribute ("src", nodeImage);
  932. writer.AddAttribute ("border", "0");
  933. writer.RenderBeginTag (HtmlTextWriterTag.Img);
  934. writer.RenderEndTag ();
  935. writer.RenderEndTag (); // TD
  936. writer.RenderBeginTag (HtmlTextWriterTag.Td);
  937. }
  938. writer.AddStyleAttribute ("width", NodeIndent + "px");
  939. writer.RenderBeginTag (HtmlTextWriterTag.Div);
  940. writer.RenderEndTag ();
  941. writer.RenderEndTag (); // TD
  942. }
  943. // Node image + line
  944. if (ShowExpandCollapse || ShowLines) {
  945. bool buttonImage = false;
  946. string tooltip = null;
  947. string shape;
  948. if (ShowLines) {
  949. if (hasPrevious && hasNext) shape = "t";
  950. else if (hasPrevious && !hasNext) shape = "l";
  951. else if (!hasPrevious && hasNext) shape = "r";
  952. else shape = "dash";
  953. } else
  954. shape = "";
  955. if (ShowExpandCollapse) {
  956. if (hasChildNodes) {
  957. buttonImage = true;
  958. if (node.Expanded.HasValue && node.Expanded.Value) shape += "minus";
  959. else shape += "plus";
  960. tooltip = GetNodeImageToolTip (!(node.Expanded.HasValue && node.Expanded.Value), node.Text);
  961. } else if (!ShowLines)
  962. shape = "noexpand";
  963. }
  964. if (shape != "") {
  965. nodeImage = GetNodeImageUrl (shape, imageStyle);
  966. writer.RenderBeginTag (HtmlTextWriterTag.Td); // TD
  967. if (buttonImage) {
  968. if (!clientExpand)
  969. writer.AddAttribute ("href", GetClientEvent (node, "ec"));
  970. else
  971. writer.AddAttribute ("href", GetClientExpandEvent(node));
  972. writer.RenderBeginTag (HtmlTextWriterTag.A); // Anchor
  973. }
  974. if (tooltip != null)
  975. writer.AddAttribute ("alt", tooltip);
  976. if (buttonImage && clientExpand)
  977. writer.AddAttribute ("id", GetNodeClientId (node, "img"));
  978. writer.AddAttribute ("src", nodeImage);
  979. writer.AddAttribute ("border", "0");
  980. writer.RenderBeginTag (HtmlTextWriterTag.Img);
  981. writer.RenderEndTag ();
  982. if (buttonImage)
  983. writer.RenderEndTag (); // Anchor
  984. writer.RenderEndTag (); // TD
  985. }
  986. }
  987. // Node icon
  988. string imageUrl = node.ImageUrl;
  989. if (imageUrl == "" && imageStyle != null) {
  990. if (imageStyle.RootIcon != null && node.IsRootNode)
  991. imageUrl = GetNodeIconUrl (imageStyle.RootIcon);
  992. else if (imageStyle.ParentIcon != null && node.IsParentNode)
  993. imageUrl = GetNodeIconUrl (imageStyle.ParentIcon);
  994. else if (imageStyle.LeafIcon != null && node.IsLeafNode)
  995. imageUrl = GetNodeIconUrl (imageStyle.LeafIcon);
  996. }
  997. if (imageUrl != "") {
  998. writer.RenderBeginTag (HtmlTextWriterTag.Td); // TD
  999. BeginNodeTag (writer, node, clientExpand);
  1000. writer.AddAttribute ("src", imageUrl);
  1001. writer.AddAttribute ("border", "0");
  1002. if (node.ImageToolTip != "") writer.AddAttribute ("alt", node.ImageToolTip);
  1003. writer.RenderBeginTag (HtmlTextWriterTag.Img);
  1004. writer.RenderEndTag (); // IMG
  1005. writer.RenderEndTag (); // style tag
  1006. writer.RenderEndTag (); // TD
  1007. }
  1008. // Checkbox
  1009. bool showChecks;
  1010. if (node.IsShowCheckBoxSet)
  1011. showChecks = node.ShowCheckBox.HasValue && node.ShowCheckBox.Value;
  1012. else
  1013. showChecks = (ShowCheckBoxes == TreeNodeTypes.All) ||
  1014. (ShowCheckBoxes == TreeNodeTypes.Leaf && node.ChildNodes.Count == 0) ||
  1015. (ShowCheckBoxes == TreeNodeTypes.Parent && node.ChildNodes.Count > 0 && node.Parent != null) ||
  1016. (ShowCheckBoxes == TreeNodeTypes.Root && node.Parent == null && node.ChildNodes.Count > 0);
  1017. if (showChecks) {
  1018. AddNodeStyle (writer, node, level);
  1019. writer.RenderBeginTag (HtmlTextWriterTag.Td); // TD
  1020. writer.AddAttribute ("name", ClientID + "_cs_" + node.Path);
  1021. writer.AddAttribute ("type", "checkbox");
  1022. if (node.Checked) writer.AddAttribute ("checked", "checked");
  1023. writer.RenderBeginTag (HtmlTextWriterTag.Input); // INPUT
  1024. writer.RenderEndTag (); // INPUT
  1025. writer.RenderEndTag (); // TD
  1026. }
  1027. // Text
  1028. if (!NodeWrap)
  1029. writer.AddAttribute ("nowrap", "nowrap");
  1030. writer.RenderBeginTag (HtmlTextWriterTag.Td); // TD
  1031. node.BeginRenderText (writer);
  1032. AddNodeStyle (writer, node, level);
  1033. if (clientExpand)
  1034. writer.AddAttribute ("id", GetNodeClientId (node, "txt"));
  1035. BeginNodeTag (writer, node, clientExpand);
  1036. writer.Write (node.Text);
  1037. writer.RenderEndTag (); // style tag
  1038. node.EndRenderText (writer);
  1039. writer.RenderEndTag (); // TD
  1040. writer.RenderEndTag (); // TR
  1041. writer.RenderEndTag (); // TABLE
  1042. // Children
  1043. if (hasChildNodes)
  1044. {
  1045. if (level >= levelLines.Count) {
  1046. if (hasNext) levelLines.Add (this);
  1047. else levelLines.Add (null);
  1048. } else {
  1049. if (hasNext) levelLines [level] = this;
  1050. else levelLines [level] = null;
  1051. }
  1052. if (clientExpand) {
  1053. if (!(node.Expanded.HasValue && node.Expanded.Value)) writer.AddStyleAttribute ("display", "none");
  1054. else writer.AddStyleAttribute ("display", "block");
  1055. writer.AddAttribute ("id", GetNodeClientId (node, null));
  1056. writer.RenderBeginTag (HtmlTextWriterTag.Span);
  1057. if (renderChildNodes) {
  1058. int num = node.ChildNodes.Count;
  1059. for (int n=0; n<num; n++)
  1060. RenderNode (writer, node.ChildNodes [n], level + 1, levelLines, true, n<num-1);
  1061. }
  1062. writer.RenderEndTag (); // SPAN
  1063. }
  1064. else if (renderChildNodes) {
  1065. int num = node.ChildNodes.Count;
  1066. for (int n=0; n<num; n++)
  1067. RenderNode (writer, node.ChildNodes [n], level + 1, levelLines, true, n<num-1);
  1068. }
  1069. }
  1070. }
  1071. void AddNodeStyle (HtmlTextWriter writer, TreeNode node, int level)
  1072. {
  1073. if (nodeStyle != null)
  1074. nodeStyle.AddAttributesToRender (writer);
  1075. if (levelStyles != null && level < levelStyles.Count)
  1076. levelStyles [level].AddAttributesToRender (writer);
  1077. else {
  1078. if (rootNodeStyle != null && node.IsRootNode)
  1079. rootNodeStyle.AddAttributesToRender (writer);
  1080. if (leafNodeStyle != null && node.IsLeafNode)
  1081. leafNodeStyle.AddAttributesToRender (writer);
  1082. if (parentNodeStyle != null && node.IsParentNode)
  1083. parentNodeStyle.AddAttributesToRender (writer);
  1084. }
  1085. if (node.Selected && selectedNodeStyle != null)
  1086. selectedNodeStyle.AddAttributesToRender (writer);
  1087. }
  1088. void BeginNodeTag (HtmlTextWriter writer, TreeNode node, bool clientExpand)
  1089. {
  1090. if (node.NavigateUrl != "") {
  1091. writer.AddAttribute ("href", node.NavigateUrl);
  1092. if (node.Target != null)
  1093. writer.AddAttribute ("target", node.Target);
  1094. writer.AddStyleAttribute ("text-decoration", "none");
  1095. writer.RenderBeginTag (HtmlTextWriterTag.A);
  1096. }
  1097. else if (node.SelectAction != TreeNodeSelectAction.None) {
  1098. if (node.SelectAction == TreeNodeSelectAction.Expand && clientExpand)
  1099. writer.AddAttribute ("href", GetClientExpandEvent (node));
  1100. else
  1101. writer.AddAttribute ("href", GetClientEvent (node, "sel"));
  1102. writer.AddStyleAttribute ("text-decoration", "none");
  1103. writer.RenderBeginTag (HtmlTextWriterTag.A);
  1104. }
  1105. else
  1106. writer.RenderBeginTag (HtmlTextWriterTag.Span);
  1107. }
  1108. bool HasChildInputData (TreeNode node)
  1109. {
  1110. // Returns true if this node contain childs whose state is hold in
  1111. // input elements that are rendered together with the node.
  1112. if (node.Checked) return true;
  1113. if (!node.HasChildData) return false;
  1114. foreach (TreeNode n in node.ChildNodes)
  1115. if (HasChildInputData (n)) return true;
  1116. return false;
  1117. }
  1118. string GetNodeImageToolTip (bool expand, string txt) {
  1119. if (expand) {
  1120. if (ExpandImageToolTip != "")
  1121. return ExpandImageToolTip;
  1122. else if (txt != null)
  1123. return "Expand " + txt;
  1124. else
  1125. return "Expand {0}";
  1126. } else {
  1127. if (CollapseImageToolTip != "")
  1128. return CollapseImageToolTip;
  1129. else if (txt != null)
  1130. return "Collapse " + txt;
  1131. else
  1132. return "Collapse {0}";
  1133. }
  1134. }
  1135. string GetNodeClientId (TreeNode node, string sufix)
  1136. {
  1137. return ClientID + "_" + node.Path + (sufix != null ? "_" + sufix : "");
  1138. }
  1139. string GetNodeImageUrl (string shape, ImageStyle imageStyle)
  1140. {
  1141. if (ShowLines) {
  1142. if (LineImagesFolder != "")
  1143. return LineImagesFolder + "/" + shape + ".gif";
  1144. } else {
  1145. if (shape == "plus") {
  1146. if (ExpandImageUrl != "")
  1147. return ExpandImageUrl;
  1148. if (imageStyle != null && imageStyle.Expand != null)
  1149. return imageStyle.Expand;
  1150. }
  1151. else if (shape == "minus") {
  1152. if (CollapseImageUrl != "")
  1153. return CollapseImageUrl;
  1154. if (imageStyle != null && imageStyle.Collapse != null)
  1155. return imageStyle.Collapse;
  1156. }
  1157. else if (shape == "noexpand") {
  1158. if (NoExpandImageUrl != "")
  1159. return NoExpandImageUrl;
  1160. if (imageStyle != null && imageStyle.NoExpand != null)
  1161. return imageStyle.NoExpand;
  1162. }
  1163. }
  1164. return AssemblyResourceLoader.GetResourceUrl (typeof(TreeView), "TreeView_" + shape + ".gif");
  1165. }
  1166. string GetNodeIconUrl (string icon)
  1167. {
  1168. return AssemblyResourceLoader.GetResourceUrl (typeof(TreeView), icon + ".gif");
  1169. }
  1170. string GetClientEvent (TreeNode node, string ev)
  1171. {
  1172. return Page.ClientScript.GetPostBackClientHyperlink (this, ev + "|" + node.Path);
  1173. }
  1174. string GetClientExpandEvent (TreeNode node)
  1175. {
  1176. return "javascript:TreeView_ToggleExpand ('" + ClientID + "', '" + node.Path + "')";
  1177. }
  1178. TreeNode FindNodeByPos (string path)
  1179. {
  1180. string[] indexes = path.Split ('_');
  1181. TreeNode node = null;
  1182. foreach (string index in indexes) {
  1183. int i = int.Parse (index);
  1184. if (node == null) {
  1185. if (i >= Nodes.Count) return null;
  1186. node = Nodes [i];
  1187. } else {
  1188. if (i >= node.ChildNodes.Count) return null;
  1189. node = node.ChildNodes [i];
  1190. }
  1191. }
  1192. return node;
  1193. }
  1194. void UnsetCheckStates (TreeNodeCollection col, NameValueCollection states)
  1195. {
  1196. foreach (TreeNode node in col) {
  1197. if (node.Checked) {
  1198. string val = states [ClientID + "_cs_" + node.Path];
  1199. if (val != "on") node.Checked = false;
  1200. }
  1201. if (node.HasChildData)
  1202. UnsetCheckStates (node.ChildNodes, states);
  1203. }
  1204. }
  1205. void SetCheckStates (NameValueCollection states)
  1206. {
  1207. string keyPrefix = ClientID + "_cs_";
  1208. foreach (string key in states) {
  1209. if (key.StartsWith (keyPrefix)) {
  1210. string id = key.Substring (keyPrefix.Length);
  1211. TreeNode node = FindNodeByPos (id);
  1212. if (node != null)
  1213. node.Checked = (Context.Request.Form [key] == "on");
  1214. }
  1215. }
  1216. }
  1217. void UnsetExpandStates (TreeNodeCollection col, string[] states)
  1218. {
  1219. foreach (TreeNode node in col) {
  1220. if (node.Expanded.HasValue && node.Expanded.Value) {
  1221. bool expand = (Array.IndexOf (states, node.Path) != -1);
  1222. if (!expand) node.Expanded = false;
  1223. }
  1224. if (node.HasChildData)
  1225. UnsetExpandStates (node.ChildNodes, states);
  1226. }
  1227. }
  1228. void SetExpandStates (string[] states)
  1229. {
  1230. foreach (string id in states) {
  1231. if (id == null || id == "") continue;
  1232. TreeNode node = FindNodeByPos (id);
  1233. node.Expanded = true;
  1234. }
  1235. }
  1236. string GetExpandStates ()
  1237. {
  1238. StringBuilder sb = new StringBuilder ("|");
  1239. foreach (TreeNode node in Nodes)
  1240. GetExpandStates (sb, node);
  1241. return sb.ToString ();
  1242. }
  1243. void GetExpandStates (StringBuilder sb, TreeNode node)
  1244. {
  1245. if (node.Expanded.HasValue && node.Expanded.Value) {
  1246. sb.Append (node.Path);
  1247. sb.Append ('|');
  1248. }
  1249. if (node.HasChildData) {
  1250. foreach (TreeNode child in node.ChildNodes)
  1251. GetExpandStates (sb, child);
  1252. }
  1253. }
  1254. }
  1255. }
  1256. #endif