TreeView.cs 42 KB

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