string path;
int depth = -1;
- bool dataBound;
- string dataPath;
object dataItem;
IHierarchyData hierarchyData;
if (nodes != null)
nodes.SetTree (tree);
ResetPathData ();
+ if (PopulateOnDemand && !Populated && Expanded.HasValue && Expanded.Value)
+ Populate ();
}
}
[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;
}
}
[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)]
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;
}
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 ();
}
}
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
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 {
internal void Populate ()
{
+ if (tree == null)
+ return;
+
+ Populated = true;
tree.NotifyPopulateRequired (this);
}
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)
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 ());
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)
internal void SetDataPath (string path)
{
- dataPath = path;
+ DataPath = path;
}
internal void SetDataBound (bool bound)
{
- dataBound = bound;
+ DataBound = bound;
}
string GetDefaultBoundText ()
}
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 ()
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);