TreeView.cs 41 KB

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