2007-05-03 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / TreeView.cs
index f28419802fcc6d5b10e4d864db96600849a62c64..15c4697d7907fb6bb79cf0e8fd030876bf905c52 100644 (file)
@@ -111,11 +111,11 @@ namespace System.Web.UI.WebControls
                        imageStyles [TreeViewImageSet.BulletedList2] = new ImageStyle (null, null, null, "box_full", "box_empty", "box_full");
                        imageStyles [TreeViewImageSet.BulletedList3] = new ImageStyle (null, null, null, "star_full", "star_empty", "star_full");
                        imageStyles [TreeViewImageSet.BulletedList4] = new ImageStyle (null, null, null, "star_full", "star_empty", "dots");
-                       imageStyles [TreeViewImageSet.Contacts] = new ImageStyle ("TreeView_plus", "TreeView_minus", "contact", null, null, null);\r
+                       imageStyles [TreeViewImageSet.Contacts] = new ImageStyle ("TreeView_plus", "TreeView_minus", "contact", null, null, null);
                        imageStyles [TreeViewImageSet.Events] = new ImageStyle (null, null, null, "warning", "warning", "warning");
                        imageStyles [TreeViewImageSet.Inbox] = new ImageStyle (null, null, null, "inbox", "inbox", "inbox");
-                       imageStyles [TreeViewImageSet.Msdn] = new ImageStyle ("box_plus", "box_minus", "box_noexpand", null, null, null);\r
-                       imageStyles [TreeViewImageSet.Simple] = new ImageStyle (null, null, "box_full", null, null, null);\r
+                       imageStyles [TreeViewImageSet.Msdn] = new ImageStyle ("box_plus", "box_minus", "box_noexpand", null, null, null);
+                       imageStyles [TreeViewImageSet.Simple] = new ImageStyle (null, null, "box_full", null, null, null);
                        imageStyles [TreeViewImageSet.Simple2] = new ImageStyle (null, null, "box_empty", null, null, null);
 
                        // TODO
@@ -675,7 +675,7 @@ namespace System.Web.UI.WebControls
                void FindCheckedNodes (TreeNodeCollection nodeList, TreeNodeCollection result)
                {
                        foreach (TreeNode node in nodeList) {
-                               if (node.Checked) result.Add (node);
+                               if (node.Checked) result.Add (node, false);
                                FindCheckedNodes (node.ChildNodes, result);
                        }
                }
@@ -761,7 +761,6 @@ namespace System.Web.UI.WebControls
                        if (selectedNode != null)
                                selectedNode.SelectedFlag = false;
                        selectedNode = node;
-                       selectedNode.SelectedFlag = true;
                        if (!loading)
                                OnSelectedNodeChanged (new TreeNodeEventArgs (selectedNode));
                }
@@ -772,10 +771,10 @@ namespace System.Web.UI.WebControls
                }
 
                internal void NotifyExpandedChanged (TreeNode node)
-               {\r
-                       if (node.Expanded.HasValue && node.Expanded.Value)\r
-                               OnTreeNodeExpanded (new TreeNodeEventArgs (node));\r
-                       else if (node.Expanded.HasValue && node.IsParentNode)\r
+               {
+                       if (node.Expanded.HasValue && node.Expanded.Value)
+                               OnTreeNodeExpanded (new TreeNodeEventArgs (node));
+                       else if (node.Expanded.HasValue && node.IsParentNode)
                                OnTreeNodeCollapsed (new TreeNodeEventArgs (node));
                }
 
@@ -980,7 +979,10 @@ namespace System.Web.UI.WebControls
                        FillBoundChildrenRecursive (e, Nodes);
                }
                
-               private void FillBoundChildrenRecursive (IHierarchicalEnumerable hEnumerable, TreeNodeCollection nodeCollection) {
+               private void FillBoundChildrenRecursive (IHierarchicalEnumerable hEnumerable, TreeNodeCollection nodeCollection)
+               {\r
+                       if (hEnumerable == null)\r
+                               return;\r
                        foreach (object obj in hEnumerable) {
                                IHierarchyData hdata = hEnumerable.GetHierarchyData (obj);
                                TreeNode child = new TreeNode ();
@@ -1017,11 +1019,8 @@ namespace System.Web.UI.WebControls
                                res = true;
                        }
 
-                       if (ShowCheckBoxes != TreeNodeTypes.None) {
-                               UnsetCheckStates (Nodes, postCollection);
-                               SetCheckStates (postCollection);
-                               res = true;
-                       }
+                       UnsetCheckStates (Nodes, postCollection);
+                       SetCheckStates (postCollection);
                        
                        if (EnableClientScript) {
                                string states = postCollection [ClientID + "_ExpandStates"];
@@ -1053,6 +1052,7 @@ namespace System.Web.UI.WebControls
                        
                        string ctree = ClientID + "_data";
                        string script = string.Format ("var {0} = new Object ();\n", ctree);
+                       script += string.Format ("{0}.uid = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (UniqueID));
                        script += string.Format ("{0}.showImage = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (ShowExpandCollapse));
                        
                        if (ShowExpandCollapse) {
@@ -1068,6 +1068,7 @@ namespace System.Web.UI.WebControls
                        }
 
                        if (Page != null) {
+                               script += string.Format ("{0}.form = {1};\n", ctree, Page.theForm);
                                script += string.Format ("{0}.populateFromClient = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (PopulateNodesFromClient));
                                script += string.Format ("{0}.expandAlt = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageToolTip (true, null)));
                                script += string.Format ("{0}.collapseAlt = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageToolTip (false, null)));
@@ -1078,10 +1079,9 @@ namespace System.Web.UI.WebControls
 
                                if (EnableClientScript) {
                                        Page.ClientScript.RegisterHiddenField (ClientID + "_ExpandStates", GetExpandStates ());
-                               
+
                                        // Make sure the basic script infrastructure is rendered
-                                       Page.ClientScript.GetCallbackEventReference (this, "null", "", "null");
-                                       Page.ClientScript.GetPostBackClientHyperlink (this, "");
+                                       Page.ClientScript.RegisterWebFormClientScript ();
                                }
 
                                if (EnableClientScript && PopulateNodesFromClient) {
@@ -1167,7 +1167,7 @@ namespace System.Web.UI.WebControls
                void RegisterStyle (Style baseStyle) {
                        if (Page.Header == null)
                                return;
-                       string className = IncrementStyleClassName ();
+                       string className = IncrementStyleClassName ().Trim ('_');
                        baseStyle.SetRegisteredCssClass (className);
                        Page.Header.StyleSheet.CreateStyleRule (baseStyle, this, "." + className);
                }
@@ -1383,6 +1383,9 @@ namespace System.Web.UI.WebControls
                                        imageUrl = GetNodeIconUrl (imageStyle.LeafIcon);
                        }
                        
+                       if (level < LevelStyles.Count && LevelStyles [level].ImageUrl != null)
+                               imageUrl = ResolveClientUrl (LevelStyles [level].ImageUrl);
+                       
                        if (!String.IsNullOrEmpty (imageUrl)) {
                                writer.RenderBeginTag (HtmlTextWriterTag.Td);   // TD
                                BeginNodeTag (writer, node, clientExpand);
@@ -1406,16 +1409,7 @@ namespace System.Web.UI.WebControls
                        
                        // Checkbox
                        
-                       bool showChecks;
-                       if (node.ShowCheckBox.HasValue)
-                               showChecks = node.ShowCheckBox.Value;
-                       else
-                               showChecks = (ShowCheckBoxes == TreeNodeTypes.All) ||
-                                                        ((ShowCheckBoxes & TreeNodeTypes.Leaf) > 0 && node.IsLeafNode) ||
-                                                        ((ShowCheckBoxes & TreeNodeTypes.Parent) > 0 && node.IsParentNode && node.Parent != null) ||
-                                                        ((ShowCheckBoxes & TreeNodeTypes.Root) > 0 && node.Parent == null && node.ChildNodes.Count > 0);
-
-                       if (showChecks) {
+                       if (node.ShowCheckBoxInternal) {
                                writer.AddAttribute ("name", ClientID + "_cs_" + node.Path);
                                writer.AddAttribute ("type", "checkbox");
                                writer.AddAttribute ("title", node.Text);
@@ -1450,6 +1444,7 @@ namespace System.Web.UI.WebControls
                        
                        if (hasChildNodes)
                        {
+                               AddChildrenPadding (writer, node);
                                if (level >= levelLines.Count) {
                                        if (hasNext) levelLines.Add (this);
                                        else levelLines.Add (null);
@@ -1476,9 +1471,32 @@ namespace System.Web.UI.WebControls
                                        for (int n=0; n<num; n++)
                                                RenderNode (writer, node.ChildNodes [n], level + 1, levelLines, true, n<num-1);
                                }
+                               AddChildrenPadding (writer, node);
                        }
                }
 
+               private void AddChildrenPadding (HtmlTextWriter writer, TreeNode node)
+               {
+                       if (nodeStyle == null)
+                               return;
+                       Unit cnp = nodeStyle.ChildNodesPadding;
+                       double value;
+                       
+                       if (cnp.IsEmpty || (value = cnp.Value) == 0)
+                               return;
+
+                       if (cnp.Type != UnitType.Pixel)
+                               return;
+
+                       writer.RenderBeginTag (HtmlTextWriterTag.Table);
+                       writer.AddAttribute ("height", ((int)value).ToString ());
+                       writer.RenderBeginTag (HtmlTextWriterTag.Tr);
+                       writer.RenderBeginTag (HtmlTextWriterTag.Td);
+                       writer.RenderEndTag (); // td
+                       writer.RenderEndTag (); // tr
+                       writer.RenderEndTag (); // table
+               }
+               
                private void RenderMenuItemSpacing (HtmlTextWriter writer, Unit itemSpacing) {
                        writer.AddStyleAttribute ("height", itemSpacing.ToString ());
                        writer.RenderBeginTag (HtmlTextWriterTag.Tr);
@@ -1656,11 +1674,15 @@ namespace System.Web.UI.WebControls
                                writer.AddAttribute ("title", node.ToolTip);
 
                        if (node.NavigateUrl != "") {
-                               writer.AddAttribute ("href", ResolveClientUrl (node.NavigateUrl));
-                               if (node.Target.Length > 0)
-                                       writer.AddAttribute ("target", node.Target);
-                               else if (Target.Length > 0)
-                                       writer.AddAttribute ("target", Target);
+                               string target = node.Target.Length > 0 ? node.Target : Target;
+#if TARGET_J2EE
+                               string navUrl = ResolveClientUrl (node.NavigateUrl, String.Compare (target, "_blank", StringComparison.InvariantCultureIgnoreCase) != 0);
+#else
+                               string navUrl = ResolveClientUrl (node.NavigateUrl);
+#endif
+                               writer.AddAttribute ("href", navUrl);
+                               if (target.Length > 0)
+                                       writer.AddAttribute ("target", target);
                                writer.RenderBeginTag (HtmlTextWriterTag.A);
                        }
                        else if (node.SelectAction != TreeNodeSelectAction.None) {
@@ -1699,40 +1721,40 @@ namespace System.Web.UI.WebControls
                                                        
                string GetNodeImageUrl (string shape, ImageStyle imageStyle)
                {
-                       if (ShowLines) {\r
-                               if (!String.IsNullOrEmpty (LineImagesFolder))\r
+                       if (ShowLines) {
+                               if (!String.IsNullOrEmpty (LineImagesFolder))
+                                       return ResolveClientUrl (LineImagesFolder + "/" + shape + ".gif");
+                       } else {
+                               if (imageStyle != null) {
+                                       if (shape == "plus") {
+                                               if (!String.IsNullOrEmpty (imageStyle.Expand))
+                                                       return GetNodeIconUrl (imageStyle.Expand);
+                                       }
+                                       else if (shape == "minus") {
+                                               if (!String.IsNullOrEmpty (imageStyle.Collapse))
+                                                       return GetNodeIconUrl (imageStyle.Collapse);
+                                       }
+                                       else if (shape == "noexpand") {
+                                               if (!String.IsNullOrEmpty (imageStyle.NoExpand))
+                                                       return GetNodeIconUrl (imageStyle.NoExpand);
+                                       }
+                               }
+                               else {
+                                       if (shape == "plus") {
+                                               if (!String.IsNullOrEmpty (ExpandImageUrl))
+                                                       return ResolveClientUrl (ExpandImageUrl);
+                                       }
+                                       else if (shape == "minus") {
+                                               if (!String.IsNullOrEmpty (CollapseImageUrl))
+                                                       return ResolveClientUrl (CollapseImageUrl);
+                                       }
+                                       else if (shape == "noexpand") {
+                                               if (!String.IsNullOrEmpty (NoExpandImageUrl))
+                                                       return ResolveClientUrl (NoExpandImageUrl);
+                                       }
+                               }
+                               if (!String.IsNullOrEmpty (LineImagesFolder))
                                        return ResolveClientUrl (LineImagesFolder + "/" + shape + ".gif");
-                       } else {\r
-                               if (imageStyle != null) {\r
-                                       if (shape == "plus") {\r
-                                               if (!String.IsNullOrEmpty (imageStyle.Expand))\r
-                                                       return GetNodeIconUrl (imageStyle.Expand);\r
-                                       }\r
-                                       else if (shape == "minus") {\r
-                                               if (!String.IsNullOrEmpty (imageStyle.Collapse))\r
-                                                       return GetNodeIconUrl (imageStyle.Collapse);\r
-                                       }\r
-                                       else if (shape == "noexpand") {\r
-                                               if (!String.IsNullOrEmpty (imageStyle.NoExpand))\r
-                                                       return GetNodeIconUrl (imageStyle.NoExpand);\r
-                                       }\r
-                               }\r
-                               else {\r
-                                       if (shape == "plus") {\r
-                                               if (!String.IsNullOrEmpty (ExpandImageUrl))\r
-                                                       return ResolveClientUrl (ExpandImageUrl);\r
-                                       }\r
-                                       else if (shape == "minus") {\r
-                                               if (!String.IsNullOrEmpty (CollapseImageUrl))\r
-                                                       return ResolveClientUrl (CollapseImageUrl);\r
-                                       }\r
-                                       else if (shape == "noexpand") {\r
-                                               if (!String.IsNullOrEmpty (NoExpandImageUrl))\r
-                                                       return ResolveClientUrl (NoExpandImageUrl);\r
-                                       }\r
-                               }\r
-                               if (!String.IsNullOrEmpty (LineImagesFolder))\r
-                                       return ResolveClientUrl (LineImagesFolder + "/" + shape + ".gif");\r
                        }
                        return AssemblyResourceLoader.GetResourceUrl (typeof(TreeView), "TreeView_" + shape + ".gif");
                }
@@ -1772,10 +1794,10 @@ namespace System.Web.UI.WebControls
                
                void UnsetCheckStates (TreeNodeCollection col, NameValueCollection states)
                {
-                       foreach (TreeNode node in col) {
-                               if (node.Checked) {
-                                       string val = states [ClientID + "_cs_" + node.Path];
-                                       if (val != "on") node.Checked = false;
+                       foreach (TreeNode node in col) {\r
+                               if (node.ShowCheckBoxInternal && node.Checked) {
+                                       if (states == null || states [ClientID + "_cs_" + node.Path] == null)\r
+                                               node.Checked = false;
                                }
                                if (node.HasChildData)
                                        UnsetCheckStates (node.ChildNodes, states);
@@ -1783,14 +1805,17 @@ namespace System.Web.UI.WebControls
                }
                
                void SetCheckStates (NameValueCollection states)
-               {
+               {\r
+                       if (states == null)\r
+                               return;
+
                        string keyPrefix = ClientID + "_cs_";
                        foreach (string key in states) {
-                               if (key.StartsWith (keyPrefix)) {
+                               if (key.StartsWith (keyPrefix, StringComparison.Ordinal)) {
                                        string id = key.Substring (keyPrefix.Length);
                                        TreeNode node = FindNodeByPos (id);
-                                       if (node != null)
-                                               node.Checked = (Context.Request.Form [key] == "on");
+                                       if (node != null && !node.Checked)\r
+                                               node.Checked = true;
                                }
                        }
                }