corrected rendering: styles are applied correct
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / TreeNode.cs
index 7993443ae4b076d99862ca23e3b8695a075aa052..5d6352b3e4ce9cf54a2b2903b16258ce40d145b4 100644 (file)
@@ -50,8 +50,6 @@ namespace System.Web.UI.WebControls
                string path;
                int depth = -1;
                
-               bool dataBound;
-               string dataPath;
                object dataItem;
                IHierarchyData hierarchyData;
 
@@ -136,6 +134,8 @@ namespace System.Web.UI.WebControls
                                if (nodes != null)
                                        nodes.SetTree (tree);
                                ResetPathData ();
+                               if (PopulateOnDemand && !Populated && Expanded.HasValue && Expanded.Value)
+                                       Populate ();
                        }
                }
                
@@ -143,14 +143,14 @@ namespace System.Web.UI.WebControls
                [DefaultValue (false)]
                [Browsable (false)]
                public bool DataBound {
-                       get { return dataBound; }
+                       get { return ViewState ["DataBound"] == null ? false : (bool) ViewState ["DataBound"]; }
+                       private set { ViewState ["DataBound"] = value; }
                }
                
                [DefaultValue (null)]
                [Browsable (false)]
                public object DataItem {
                        get {
-                               if (!dataBound) throw new InvalidOperationException ("TreeNode is not data bound.");
                                return dataItem;
                        }
                }
@@ -159,10 +159,8 @@ namespace System.Web.UI.WebControls
                [DefaultValue ("")]
                [Browsable (false)]
                public string DataPath {
-                       get {
-                               if (!dataBound) throw new InvalidOperationException ("TreeNode is not data bound.");
-                               return dataPath;
-                       }
+                       get { return ViewState ["DataPath"] == null ? String.Empty : (String) ViewState ["DataPath"]; }
+                       private set { ViewState ["DataPath"] = value; }
                }
                
                [DefaultValue (false)]
@@ -186,21 +184,10 @@ namespace System.Web.UI.WebControls
                public TreeNodeCollection ChildNodes {
                        get {
                                if (nodes == null) {
-                                       if (PopulateOnDemand && tree == null)
-                                               return null;
-
-                                       if (DataBound)
-                                               FillBoundChildren ();
-                                       else
-                                               nodes = new TreeNodeCollection (this);
+                                       nodes = new TreeNodeCollection (this);
                                                
                                        if (IsTrackingViewState)
                                                ((IStateManager)nodes).TrackViewState();
-                                       
-                                       if (PopulateOnDemand && !Populated) {
-                                               Populated = true;
-                                               Populate ();
-                                       }
                                }
                                return nodes;
                        }
@@ -210,13 +197,14 @@ namespace System.Web.UI.WebControls
                public bool? Expanded {
                        get {
                                object o = ViewState ["Expanded"];
-                               if (o != null) return (bool)o;
-                               return true;
+                               return (bool?)o;
                        }
                        set {
                                ViewState ["Expanded"] = value;
                                if (tree != null)
                                        tree.NotifyExpandedChanged (this);
+                               if (PopulateOnDemand && !Populated && value.HasValue && value.Value)
+                                       Populate ();
                        }
                }
 
@@ -226,14 +214,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["ImageToolTip"];
                                if (o != null) return (string)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null) {
-                                               if (bin.ImageToolTipField != "")
-                                                       return (string) GetBoundPropertyValue (bin.ImageToolTipField);
-                                               return bin.ImageToolTip;
-                                       }
-                               }
                                return "";
                        }
                        set {
@@ -248,14 +228,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["ImageUrl"];
                                if (o != null) return (string)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null) {
-                                               if (bin.ImageUrlField != "")
-                                                       return (string) GetBoundPropertyValue (bin.ImageUrlField);
-                                               return bin.ImageUrl;
-                                       }
-                               }
                                return "";
                        }
                        set {
@@ -270,14 +242,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["NavigateUrl"];
                                if (o != null) return (string)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null) {
-                                               if (bin.NavigateUrlField != "")
-                                                       return (string) GetBoundPropertyValue (bin.NavigateUrlField);
-                                               return bin.NavigateUrl;
-                                       }
-                               }
                                return "";
                        }
                        set {
@@ -290,11 +254,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["PopulateOnDemand"];
                                if (o != null) return (bool)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null)
-                                               return bin.PopulateOnDemand;
-                               }
                                return false;
                        }
                        set {
@@ -307,11 +266,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["SelectAction"];
                                if (o != null) return (TreeNodeSelectAction)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null)
-                                               return bin.SelectAction;
-                               }
                                return TreeNodeSelectAction.Select;
                        }
                        set {
@@ -323,36 +277,18 @@ namespace System.Web.UI.WebControls
                public bool? ShowCheckBox {
                        get {
                                object o = ViewState ["ShowCheckBox"];
-                               if (o != null) return (bool)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null)
-                                               return bin.ShowCheckBox;
-                               }
-                               return true;
+                               return (bool?)o;
                        }
                        set {
                                ViewState ["ShowCheckBox"] = value;
                        }
                }
                
-               internal bool IsShowCheckBoxSet {
-                       get { return ViewState ["ShowCheckBox"] != null; }
-               }
-
                [DefaultValue ("")]
                public string Target {
                        get {
                                object o = ViewState ["Target"];
                                if(o != null) return (string)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null) {
-                                               if (bin.TargetField != "")
-                                                       return (string) GetBoundPropertyValue (bin.TargetField);
-                                               return bin.Target;
-                                       }
-                               }
                                return "";
                        }
                        set {
@@ -367,23 +303,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["Text"];
                                if (o != null) return (string)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null) {
-                                               string text;
-                                               if (bin.TextField != "")
-                                                       text = (string) GetBoundPropertyValue (bin.TextField);
-                                               else if (bin.Text != "")
-                                                       text = bin.Text;
-                                               else
-                                                       text = GetDefaultBoundText ();
-                                                       
-                                               if (bin.FormatString.Length != 0)
-                                                       text = string.Format (bin.FormatString, text);
-                                               return text;
-                                       }
-                                       return GetDefaultBoundText ();
-                               }
                                return "";
                        }
                        set {
@@ -397,14 +316,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["ToolTip"];
                                if(o != null) return (string)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null) {
-                                               if (bin.ToolTipField != "")
-                                                       return (string) GetBoundPropertyValue (bin.ToolTipField);
-                                               return bin.ToolTip;
-                                       }
-                               }
                                return "";
                        }
                        set {
@@ -418,16 +329,6 @@ namespace System.Web.UI.WebControls
                        get {
                                object o = ViewState ["Value"];
                                if(o != null) return (string)o;
-                               if (DataBound) {
-                                       TreeNodeBinding bin = GetBinding ();
-                                       if (bin != null) {
-                                               if (bin.ValueField != "")
-                                                       return (string) GetBoundPropertyValue (bin.ValueField);
-                                               if (bin.Value != "")
-                                                       return bin.Value;
-                                       }
-                                       return GetDefaultBoundText ();
-                               }
                                return "";
                        }
                        set {
@@ -528,6 +429,10 @@ namespace System.Web.UI.WebControls
                
                internal void Populate ()
                {
+                       if (tree == null)
+                               return;
+
+                       Populated = true;
                        tree.NotifyPopulateRequired (this);
                }
                
@@ -572,7 +477,12 @@ namespace System.Web.UI.WebControls
                
                public void ToggleExpandState ()
                {
-                       Expanded = !Expanded;
+#if TARGET_JVM //No support for Nullable<bool>.GetValueOrDefault() yet
+                       bool? value = Expanded;
+                       Expanded = value.HasValue ? !value.Value : true;
+#else
+                       Expanded = !Expanded.GetValueOrDefault(false);
+#endif
                }
 
                void IStateManager.LoadViewState (object savedState)
@@ -640,13 +550,15 @@ namespace System.Web.UI.WebControls
                internal void SetDirty ()
                {
                        ViewState.SetDirty (true);
+                       if (nodes != null)
+                               nodes.SetDirty ();
                }
                
                public virtual object Clone ()
                {
                        TreeNode nod = tree != null ? tree.CreateNode () : new TreeNode ();
                        foreach (DictionaryEntry e in ViewState)
-                               nod.ViewState [(string)e.Key] = e.Value;
+                               nod.ViewState [(string)e.Key] = ((StateItem)e.Value).Value;
                                
                        foreach (TreeNode c in ChildNodes)
                                nod.ChildNodes.Add ((TreeNode)c.Clone ());
@@ -657,9 +569,118 @@ namespace System.Web.UI.WebControls
                internal void Bind (IHierarchyData hierarchyData)
                {
                        this.hierarchyData = hierarchyData;
-                       dataBound = true;
-                       dataPath = hierarchyData.Path;
+                       DataBound = true;
+                       DataPath = hierarchyData.Path;
                        dataItem = hierarchyData.Item;
+                       
+                       TreeNodeBinding bin = GetBinding ();
+                       if (bin != null) {
+                       
+                               // Bind ImageToolTip property
+
+                               if (bin.ImageToolTipField.Length > 0) {
+                                       ImageToolTip = Convert.ToString (GetBoundPropertyValue (bin.ImageToolTipField));
+                                       if (ImageToolTip.Length == 0)
+                                               ImageToolTip = bin.ImageToolTip;
+                               }
+                               else if (bin.ImageToolTip.Length > 0)
+                                       ImageToolTip = bin.ImageToolTip;
+                                       
+                               // Bind ImageUrl property
+
+                               if (bin.ImageUrlField.Length > 0) {
+                                       ImageUrl = Convert.ToString (GetBoundPropertyValue (bin.ImageUrlField));
+                                       if (ImageUrl.Length == 0)
+                                               ImageUrl = bin.ImageUrl;
+                               }
+                               else if (bin.ImageUrl.Length > 0)
+                                       ImageUrl = bin.ImageUrl;
+                                       
+                               // Bind NavigateUrl property
+
+                               if (bin.NavigateUrlField.Length > 0) {
+                                       NavigateUrl = Convert.ToString (GetBoundPropertyValue (bin.NavigateUrlField));
+                                       if (NavigateUrl.Length == 0)
+                                               NavigateUrl = bin.NavigateUrl;
+                               }
+                               else if (bin.NavigateUrl.Length > 0)
+                                       NavigateUrl = bin.NavigateUrl;
+                                       
+                               // Bind PopulateOnDemand property
+                               
+                               if (bin.HasPropertyValue ("PopulateOnDemand"))
+                                       PopulateOnDemand = bin.PopulateOnDemand;
+                               
+                               // Bind SelectAction property
+                                       
+                               if (bin.HasPropertyValue ("SelectAction"))
+                                       SelectAction = bin.SelectAction;
+                               
+                               // Bind ShowCheckBox property
+                                       
+                               if (bin.HasPropertyValue ("ShowCheckBox"))
+                                       ShowCheckBox = bin.ShowCheckBox;
+                                       
+                               // Bind Target property
+
+                               if (bin.TargetField.Length > 0) {
+                                       Target = Convert.ToString (GetBoundPropertyValue (bin.TargetField));
+                                       if (Target.Length == 0)
+                                               Target = bin.Target;
+                               }
+                               else if (bin.Target.Length > 0)
+                                       Target = bin.Target;
+                                       
+                               // Bind Text property
+                                       
+                               if (bin.TextField.Length > 0) {
+                                       Text = Convert.ToString (GetBoundPropertyValue (bin.TextField));
+                                       if (bin.FormatString.Length > 0)
+                                               Text = string.Format (bin.FormatString, Text);
+                                       if (Text.Length == 0)
+                                               Text = bin.Text;
+                                       if (Text.Length == 0)
+                                               Text = bin.Value;
+                                       if (Text.Length == 0 && bin.ValueField.Length > 0)
+                                               Text = Convert.ToString (GetBoundPropertyValue (bin.ValueField));
+                               }
+                               else if (bin.Text.Length > 0)
+                                       Text = bin.Text;
+                               else if (bin.Value.Length > 0)
+                                       Text = bin.Value;
+                               else
+                                       Text = GetDefaultBoundText ();
+                                       
+                               // Bind ToolTip property
+
+                               if (bin.ToolTipField.Length > 0) {
+                                       ToolTip = Convert.ToString (GetBoundPropertyValue (bin.ToolTipField));
+                                       if (ToolTip.Length == 0)
+                                               ToolTip = bin.ToolTip;
+                               }
+                               else if (bin.ToolTip.Length > 0)
+                                       ToolTip = bin.ToolTip;
+                                       
+                               // Bind Value property
+
+                               if (bin.ValueField.Length > 0) {
+                                       Value = Convert.ToString (GetBoundPropertyValue (bin.ValueField));
+                                       if (Value.Length == 0)
+                                               Value = bin.Value;
+                                       if (Value.Length == 0)
+                                               Value = bin.Text;
+                                       if(Value.Length == 0 && bin.TextField.Length > 0)
+                                               Value = Convert.ToString (GetBoundPropertyValue (bin.TextField));
+                               }
+                               else if (bin.Value.Length > 0)
+                                       Value = bin.Value;
+                               else if (bin.Text.Length > 0)
+                                       Value = bin.Text;
+                               else
+                                       Value = GetDefaultBoundText ();
+                       } else {
+                               Text = Value = GetDefaultBoundText ();
+                       }
                }
                
                internal void SetDataItem (object item)
@@ -669,12 +690,12 @@ namespace System.Web.UI.WebControls
                
                internal void SetDataPath (string path)
                {
-                       dataPath = path;
+                       DataPath = path;
                }
                
                internal void SetDataBound (bool bound)
                {
-                       dataBound = bound;
+                       DataBound = bound;
                }
                
                string GetDefaultBoundText ()
@@ -692,15 +713,15 @@ namespace System.Web.UI.WebControls
                }
                                
                internal bool IsParentNode {
-                       get { return ChildNodes.Count > 0 && Parent != null; }
+                       get { return !IsRootNode && (ChildNodes.Count > 0 || PopulateOnDemand); }
                }
                
                internal bool IsLeafNode {
-                       get { return ChildNodes.Count == 0; }
+                       get { return !IsRootNode && ChildNodes.Count == 0 && !PopulateOnDemand; }
                }
                
                internal bool IsRootNode {
-                       get { return ChildNodes.Count > 0 && Parent == null; }
+                       get { return Depth == 0; }
                }
                
                TreeNodeBinding GetBinding ()
@@ -731,21 +752,6 @@ namespace System.Web.UI.WebControls
                                return prop.GetValue (dataItem);
                }
 
-               void FillBoundChildren ()
-               {
-                       nodes = new TreeNodeCollection (this);
-                       if (hierarchyData == null || !hierarchyData.HasChildren) return;
-                       if (tree.MaxDataBindDepth != -1 && Depth >= tree.MaxDataBindDepth) return;
-
-                       IHierarchicalEnumerable e = hierarchyData.GetChildren ();
-                       foreach (object obj in e) {
-                               IHierarchyData hdata = e.GetHierarchyData (obj);
-                               TreeNode node = tree != null ? tree.CreateNode () : new TreeNode ();
-                               node.Bind (hdata);
-                               nodes.Add (node);
-                       }
-               }
-               
                internal void BeginRenderText (HtmlTextWriter writer)
                {
                        RenderPreText (writer);