output, T defaultVal)
+ {
+ var vals = GetPreValues();
+ return vals.Count >= (int)index + 1 ? output((PreValue)vals[(int)index]) : defaultVal;
+ }
+
+ #endregion
+ }
+}
diff --git a/components/editorControls/MultiNodeTreePicker/MultiNodeTreePickerExtensions.cs b/components/editorControls/MultiNodeTreePicker/MultiNodeTreePickerExtensions.cs
new file mode 100644
index 0000000000..4352e7a2ee
--- /dev/null
+++ b/components/editorControls/MultiNodeTreePicker/MultiNodeTreePickerExtensions.cs
@@ -0,0 +1,45 @@
+using System.Web.UI;
+using umbraco.cms.businesslogic.datatype;
+
+[assembly: WebResource("umbraco.editorControls.MultiNodeTreePicker.jquery.tooltip.min.js", "application/x-javascript")]
+[assembly: WebResource("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerScripts.js", "application/x-javascript")]
+[assembly: WebResource("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerStyles.css", "text/css", PerformSubstitution = true)]
+
+namespace umbraco.editorControls.MultiNodeTreePicker
+{
+ ///
+ /// Extension methods for this namespace
+ ///
+ public static class MultiNodeTreePickerExtensions
+ {
+ ///
+ /// Adds the JS/CSS required for the MultiNodeTreePicker
+ ///
+ ///
+ public static void AddAllMNTPClientDependencies(this Control ctl)
+ {
+ //get the urls for the embedded resources
+ AddCssMNTPClientDependencies(ctl);
+ AddJsMNTPClientDependencies(ctl);
+ }
+
+ ///
+ /// Adds the CSS required for the MultiNodeTreePicker
+ ///
+ ///
+ public static void AddCssMNTPClientDependencies(this Control ctl)
+ {
+ ctl.AddResourceToClientDependency("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerStyles.css", ClientDependencyType.Css);
+ }
+
+ ///
+ /// Adds the JS required for the MultiNodeTreePicker
+ ///
+ ///
+ public static void AddJsMNTPClientDependencies(this Control ctl)
+ {
+ ctl.AddResourceToClientDependency("umbraco.editorControls.MultiNodeTreePicker.MultiNodePickerScripts.js", ClientDependencyType.Javascript);
+ ctl.AddResourceToClientDependency("umbraco.editorControls.MultiNodeTreePicker.jquery.tooltip.min.js", ClientDependencyType.Javascript);
+ }
+ }
+}
\ No newline at end of file
diff --git a/components/editorControls/MultiNodeTreePicker/NodeSelectionType.cs b/components/editorControls/MultiNodeTreePicker/NodeSelectionType.cs
new file mode 100644
index 0000000000..76dc493cee
--- /dev/null
+++ b/components/editorControls/MultiNodeTreePicker/NodeSelectionType.cs
@@ -0,0 +1,18 @@
+namespace umbraco.editorControls.MultiNodeTreePicker
+{
+ ///
+ ///
+ ///
+ public enum NodeSelectionType
+ {
+ ///
+ ///
+ ///
+ Picker,
+
+ ///
+ ///
+ ///
+ XPathExpression
+ }
+}
\ No newline at end of file
diff --git a/components/editorControls/MultiNodeTreePicker/SelectedItemsTemplate.cs b/components/editorControls/MultiNodeTreePicker/SelectedItemsTemplate.cs
new file mode 100644
index 0000000000..9020ebed01
--- /dev/null
+++ b/components/editorControls/MultiNodeTreePicker/SelectedItemsTemplate.cs
@@ -0,0 +1,81 @@
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.HtmlControls;
+using System.Web.UI.WebControls;
+using umbraco.controls.Images;
+using umbraco.IO;
+
+namespace umbraco.editorControls.MultiNodeTreePicker
+{
+ ///
+ /// The item template for the selected items repeater
+ ///
+ internal class SelectedItemsTemplate : ITemplate
+ {
+
+ #region ITemplate Members
+
+ ///
+ /// Creates the template for the repeater item
+ ///
+ ///
+ public void InstantiateIn(Control container)
+ {
+ var itemDiv = new HtmlGenericControl("div");
+ itemDiv.ID = "Item";
+ itemDiv.Attributes.Add("class", "item");
+
+ var page = (Page)HttpContext.Current.CurrentHandler;
+ var imgPreview = (ImageViewer)page.LoadControl(
+ string.Concat(SystemDirectories.Umbraco, "/controls/Images/ImageViewer.ascx"));
+
+ imgPreview.ID = "ImgPreview";
+ imgPreview.Visible = false; //hidden by default
+ imgPreview.ViewerStyle = ImageViewer.Style.Basic;
+ itemDiv.Controls.Add(imgPreview);
+
+ var infoBtn = new HtmlAnchor();
+ infoBtn.ID = "InfoButton";
+ infoBtn.HRef = "javascript:void(0);";
+ infoBtn.Attributes.Add("class", "info");
+ itemDiv.Controls.Add(infoBtn);
+
+ var innerDiv = new HtmlGenericControl("div");
+ innerDiv.ID = "InnerItem";
+ innerDiv.Attributes.Add("class", "inner");
+
+ innerDiv.Controls.Add(
+ new LiteralControl(@""));
+
+ var liSelectNode = new HtmlGenericControl("li");
+ liSelectNode.Attributes.Add("class", "closed");
+ liSelectNode.ID = "SelectedNodeListItem";
+ innerDiv.Controls.Add(liSelectNode);
+
+ var selectedNodeLink = new HtmlAnchor();
+ selectedNodeLink.ID = "SelectedNodeLink";
+ selectedNodeLink.Attributes.Add("class", "sprTree");
+ selectedNodeLink.Attributes.Add("title", "Sync tree");
+ innerDiv.Controls.Add(selectedNodeLink);
+
+ var selectedNodeText = new Literal();
+ selectedNodeText.ID = "SelectedNodeText";
+ innerDiv.Controls.Add(selectedNodeText);
+
+ selectedNodeLink.Controls.Add(new LiteralControl(""));
+ selectedNodeLink.Controls.Add(selectedNodeText);
+ selectedNodeLink.Controls.Add(new LiteralControl("
"));
+
+ liSelectNode.Controls.Add(selectedNodeLink);
+
+ innerDiv.Controls.Add(
+ new LiteralControl(@"
"));
+
+ itemDiv.Controls.Add(innerDiv);
+
+ container.Controls.Add(itemDiv);
+ }
+
+ #endregion
+ }
+}
diff --git a/components/editorControls/MultiNodeTreePicker/XPathExpressionType.cs b/components/editorControls/MultiNodeTreePicker/XPathExpressionType.cs
new file mode 100644
index 0000000000..43b1fb7bc3
--- /dev/null
+++ b/components/editorControls/MultiNodeTreePicker/XPathExpressionType.cs
@@ -0,0 +1,18 @@
+namespace umbraco.editorControls.MultiNodeTreePicker
+{
+ ///
+ /// An enumerator for the XPath expression.
+ ///
+ public enum XPathExpressionType
+ {
+ ///
+ ///
+ ///
+ Global,
+
+ ///
+ ///
+ ///
+ FromCurrent
+ }
+}
\ No newline at end of file
diff --git a/components/editorControls/MultiNodeTreePicker/XPathFilterType.cs b/components/editorControls/MultiNodeTreePicker/XPathFilterType.cs
new file mode 100644
index 0000000000..4f4a983425
--- /dev/null
+++ b/components/editorControls/MultiNodeTreePicker/XPathFilterType.cs
@@ -0,0 +1,18 @@
+namespace umbraco.editorControls.MultiNodeTreePicker
+{
+ ///
+ /// An enumerator for the XPath filter, for either enable/disable.
+ ///
+ public enum XPathFilterType
+ {
+ ///
+ /// Disables the XPath filter.
+ ///
+ Disable,
+
+ ///
+ /// Enables the XPath filter.
+ ///
+ Enable
+ }
+}
\ No newline at end of file
diff --git a/components/editorControls/MultiNodeTreePicker/XmlTreeNodeExtensions.cs b/components/editorControls/MultiNodeTreePicker/XmlTreeNodeExtensions.cs
new file mode 100644
index 0000000000..64bd4e4640
--- /dev/null
+++ b/components/editorControls/MultiNodeTreePicker/XmlTreeNodeExtensions.cs
@@ -0,0 +1,78 @@
+using System.Linq;
+using System.Xml.Linq;
+using System.Xml.XPath;
+using umbraco.cms.presentation.Trees;
+
+namespace umbraco.editorControls.MultiNodeTreePicker
+{
+ ///
+ /// XmlTreeNode extensions for the MultiNodeTreePicker.
+ ///
+ public static class XmlTreeNodeExtensions
+ {
+ //public static void DetermineSelected(this XmlTreeNode node)
+ //{
+ //}
+
+ ///
+ /// Determines if the node should be clickable based on the xpath given
+ ///
+ /// The node.
+ /// The xpath.
+ /// The type.
+ /// The XML.
+ public static void DetermineClickable(this XmlTreeNode node, string xpath, XPathFilterType type, XElement xml)
+ {
+ if (!string.IsNullOrEmpty(xpath))
+ {
+ try
+ {
+ var matched = xml.XPathSelectElements(xpath);
+ if (matched.Count() > 0)
+ {
+ if (type == XPathFilterType.Disable)
+ {
+ //add the non-clickable color to the node
+ node.Style.AddCustom("uc-treenode-noclick");
+ }
+ else
+ {
+ //add the non-clickable color to the node
+ node.Style.AddCustom("uc-treenode-click");
+ }
+ }
+ else
+ {
+ if (type == XPathFilterType.Disable)
+ {
+ //ensure the individual node is the correct color
+ node.Style.AddCustom("uc-treenode-click");
+ }
+ else
+ {
+ //ensure the individual node is the correct color
+ node.Style.AddCustom("uc-treenode-noclick");
+ }
+ }
+ }
+ catch (XPathException)
+ {
+ node.Text = "uComponents: XPath Error!";
+ }
+ }
+ else
+ {
+ if (type == XPathFilterType.Disable)
+ {
+ //ensure the individual node is the correct color
+ node.Style.AddCustom("uc-treenode-click");
+ }
+ else
+ {
+ //ensure the individual node is the correct color
+ node.Style.AddCustom("uc-treenode-noclick");
+ }
+ }
+ }
+ }
+}
diff --git a/components/editorControls/umbraco.editorControls.csproj b/components/editorControls/umbraco.editorControls.csproj
index e52d320516..77a315e39a 100644
--- a/components/editorControls/umbraco.editorControls.csproj
+++ b/components/editorControls/umbraco.editorControls.csproj
@@ -133,9 +133,6 @@
System.Windows.Forms
-
- System.XML
-
umbraco.businesslogic
{E469A9CE-1BEC-423F-AC44-713CD72457EA}
@@ -163,6 +160,8 @@
{6EDD2061-82F2-461B-BB6E-879245A832DE}
umbraco.controls
+
+
@@ -187,6 +186,7 @@
Code
+
Code
@@ -278,6 +278,24 @@
Code
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Code
@@ -331,6 +349,10 @@
Code
+
+
+
+
@@ -376,6 +398,14 @@
+
+
+
+
+
+
+
+
Code
@@ -390,6 +420,7 @@
ResXFileCodeGenerator
MediaChooserScripts.Designer.cs
+
textFieldDataEditor.cs
Designer
@@ -423,6 +454,11 @@
+
+
+
+
+
diff --git a/umbraco/presentation/umbraco.presentation.csproj b/umbraco/presentation/umbraco.presentation.csproj
index 683787a659..2ede531ad4 100644
--- a/umbraco/presentation/umbraco.presentation.csproj
+++ b/umbraco/presentation/umbraco.presentation.csproj
@@ -514,8 +514,18 @@
ProgressBar.ascx
+
+ ASPXCodeBehind
+
+
+ Component
+
+
+
+ Code
+
TreeControl.ascx
ASPXCodeBehind
@@ -1691,6 +1701,7 @@
+
@@ -3213,6 +3224,7 @@
welcome.ascx.cs
Designer
+
language.aspx.cs
Designer
diff --git a/umbraco/presentation/umbraco/controls/Tree/CustomTreeControl.cs b/umbraco/presentation/umbraco/controls/Tree/CustomTreeControl.cs
new file mode 100644
index 0000000000..eb284314e9
--- /dev/null
+++ b/umbraco/presentation/umbraco/controls/Tree/CustomTreeControl.cs
@@ -0,0 +1,167 @@
+using System;
+using System.IO;
+using System.Web.UI;
+using System.Web.UI.HtmlControls;
+using ClientDependency.Core;
+using umbraco.controls.Tree;
+using umbraco.IO;
+
+namespace umbraco.controls.Tree
+{
+ ///
+ /// A custom tree control that uses a custom web service to return the initial node, this is required
+ /// due to a bug that exists in Umbraco 4.5.1 tree control/web service.
+ ///
+ ///
+ /// Since we're inheriting from a UserControl and all of the ClientDependency registrations are done inline, we need
+ /// to re-register the ClientDependencies.
+ ///
+ [ClientDependency(10, ClientDependencyType.Css, "Tree/treeIcons.css", "UmbracoClient")]
+ [ClientDependency(11, ClientDependencyType.Css, "Tree/menuIcons.css", "UmbracoClient")]
+ [ClientDependency(12, ClientDependencyType.Css, "Tree/Themes/umbraco/style.css", "UmbracoClient")]
+ [ClientDependency(0, ClientDependencyType.Javascript, "Application/NamespaceManager.js", "UmbracoClient")]
+ [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoClientManager.js", "UmbracoClient")]
+ [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoApplicationActions.js", "UmbracoClient")]
+ [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoUtils.js", "UmbracoClient")]
+ [ClientDependency(0, ClientDependencyType.Javascript, "ui/jquery.js", "UmbracoClient")]
+ [ClientDependency(10, ClientDependencyType.Javascript, "Application/JQuery/jquery.metadata.min.js", "UmbracoClient")]
+ [ClientDependency(11, ClientDependencyType.Javascript, "Tree/jquery.tree.js", "UmbracoClient")]
+ [ClientDependency(12, ClientDependencyType.Javascript, "Tree/UmbracoContext.js", "UmbracoClient")]
+ [ClientDependency(12, ClientDependencyType.Javascript, "Tree/jquery.tree.contextmenu.js", "UmbracoClient")]
+ [ClientDependency(12, ClientDependencyType.Javascript, "Tree/jquery.tree.checkbox.js", "UmbracoClient")]
+ [ClientDependency(12, ClientDependencyType.Javascript, "Tree/NodeDefinition.js", "UmbracoClient")]
+ [ClientDependency(13, ClientDependencyType.Javascript, "Tree/UmbracoTree.js", "UmbracoClient")]
+ public class CustomTreeControl : TreeControl
+ {
+ ///
+ /// Static constructor to ensure that our web service is copied locally
+ ///
+ static CustomTreeControl()
+ {
+ var servicePath = Path.Combine(SystemDirectories.Umbraco, "plugins", "MultiNodePicker");
+
+ if (!Directory.Exists(servicePath))
+ {
+ lock (m_Locker)
+ {
+ //double check locking
+ if (!Directory.Exists(servicePath))
+ {
+ //now create our new local web service
+ var wServiceTxt = CustomTreeServiceResource.CustomTreeService;
+ var dirMultiNodePicker = new DirectoryInfo(servicePath);
+ if (!dirMultiNodePicker.Exists)
+ {
+ dirMultiNodePicker.Create();
+ }
+ var wServiceFile = new FileInfo(Path.Combine(dirMultiNodePicker.FullName, "CustomTreeService.asmx"));
+ if (!wServiceFile.Exists)
+ {
+ using (var sw = new StreamWriter(wServiceFile.Create()))
+ {
+ sw.Write(wServiceTxt);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static readonly object m_Locker = new object();
+
+ ///
+ /// Ensure child controls are created on init
+ ///
+ ///
+ protected override void OnInit(EventArgs e)
+ {
+ base.OnInit(e);
+
+ this.EnsureChildControls();
+ }
+
+ ///
+ /// Create the child controls
+ ///
+ protected override void CreateChildControls()
+ {
+ base.CreateChildControls();
+
+ TreeContainer = new HtmlGenericControl();
+ TreeContainer.TagName = "div";
+ TreeContainer.ID = "TreeContainer";
+
+ this.Controls.Add(TreeContainer);
+ }
+
+ ///
+ /// Adds the internal markup to the TreeContainer control
+ ///
+ ///
+ protected override void OnPreRender(EventArgs e)
+ {
+ base.OnPreRender(e);
+
+ //add the internal markup to the TreeContainer
+ /* */
+ TreeContainer.Controls.Add(new LiteralControl(@""));
+ }
+
+ ///
+ /// Render out the correct markup for the tree
+ ///
+ ///
+ /// Since we're inheriting from a UserControl, we need to render out the markup manually
+ ///
+ ///
+ protected override void Render(System.Web.UI.HtmlTextWriter writer)
+ {
+ //You'll notice that we're replacing the 'serviceUrl' parameter with our own custom web service!
+
+ writer.Write(@"
+");
+
+ //render the controls
+ TreeContainer.RenderControl(writer);
+ }
+ }
+}
\ No newline at end of file
diff --git a/umbraco/presentation/umbraco/controls/Tree/CustomTreeService.asmx b/umbraco/presentation/umbraco/controls/Tree/CustomTreeService.asmx
new file mode 100644
index 0000000000..2ddab055f6
--- /dev/null
+++ b/umbraco/presentation/umbraco/controls/Tree/CustomTreeService.asmx
@@ -0,0 +1 @@
+<%@ WebService language="C#" class="umbraco.controls.Tree.CustomTreeService" %>
\ No newline at end of file
diff --git a/umbraco/presentation/umbraco/controls/Tree/CustomTreeService.cs b/umbraco/presentation/umbraco/controls/Tree/CustomTreeService.cs
new file mode 100644
index 0000000000..d9a8ae4158
--- /dev/null
+++ b/umbraco/presentation/umbraco/controls/Tree/CustomTreeService.cs
@@ -0,0 +1,123 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web.Script.Services;
+using System.Web.Services;
+using umbraco;
+using umbraco.cms.businesslogic;
+using umbraco.cms.presentation.Trees;
+using umbraco.controls.Tree;
+
+namespace umbraco.controls.Tree
+{
+ ///
+ /// Client side ajax utlities for the tree
+ ///
+ [ScriptService]
+ [WebService]
+ public class CustomTreeService : WebService
+ {
+ ///
+ /// Returns some info about the node such as path and id
+ ///
+ ///
+ ///
+ [WebMethod]
+ [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
+ public NodeInfo GetNodeInfo(int id)
+ {
+ Authorize();
+
+ var node = new CMSNode(id);
+ return new NodeInfo()
+ {
+ Id = node.Id,
+ Path = node.Path,
+ PathAsNames = string.Join("->",
+ GetPathNames(node.Path.Split(',')
+ .Select(x => int.Parse(x))
+ .ToArray()))
+ };
+ }
+
+ ///
+ /// returns the node names for each id passed in
+ ///
+ ///
+ ///
+ private string[] GetPathNames(int[] ids)
+ {
+ return ids
+ .Where(x => x != -1)
+ .Select(x => new CMSNode(x).Text).ToArray();
+ }
+
+ ///
+ /// Returns a key/value object with: json, app, js as the keys
+ ///
+ ///
+ [WebMethod]
+ [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
+ public Dictionary GetInitAppTreeData(string app, string treeType, bool showContextMenu, bool isDialog, TreeDialogModes dialogMode, string functionToCall, string nodeKey)
+ {
+ Authorize();
+
+ var treeCtl = new TreeControl()
+ {
+ ShowContextMenu = showContextMenu,
+ IsDialog = isDialog,
+ DialogMode = dialogMode,
+ App = app,
+ TreeType = string.IsNullOrEmpty(treeType) ? "" : treeType, //don't set the tree type unless explicitly set
+ NodeKey = string.IsNullOrEmpty(nodeKey) ? "" : nodeKey,
+ //StartNodeID = -1, //TODO: set this based on parameters!
+ FunctionToCall = string.IsNullOrEmpty(functionToCall) ? "" : functionToCall
+ };
+
+ var returnVal = new Dictionary();
+
+ if (string.IsNullOrEmpty(treeType))
+ {
+ //if there's not tree type specified, then render out the tree as per normal with the normal
+ //way of doing things
+ returnVal.Add("json", treeCtl.GetJSONInitNode());
+ }
+ else
+ {
+ //since 4.5.1 has a bug in it, it ignores if the treeType is specified and will always only render
+ //the whole APP not just a specific tree.
+ //this is a work around for this bug until it is fixed (which should be fixed in 4.5.2
+
+ //get the tree that we need to render
+ var tree = TreeDefinitionCollection.Instance.FindTree(treeType).CreateInstance();
+ tree.ShowContextMenu = showContextMenu;
+ tree.IsDialog = isDialog;
+ tree.DialogMode = dialogMode;
+ tree.NodeKey = string.IsNullOrEmpty(nodeKey) ? "" : nodeKey;
+ tree.FunctionToCall = string.IsNullOrEmpty(functionToCall) ? "" : functionToCall;
+
+ //now render it's start node
+ var xTree = new XmlTree();
+
+ //we're going to hijack the node name here to make it say content/media
+ var node = tree.RootNode;
+ if (node.Text.Equals("[FilteredContentTree]")) node.Text = ui.GetText("content");
+ else if (node.Text.Equals("[FilteredMediaTree]")) node.Text = ui.GetText("media");
+ xTree.Add(node);
+
+ returnVal.Add("json", xTree.ToString());
+ }
+
+ returnVal.Add("app", app);
+ returnVal.Add("js", treeCtl.JSCurrApp);
+
+ return returnVal;
+ }
+
+ internal static void Authorize()
+ {
+ if (!umbraco.BasePages.BasePage.ValidateUserContextID(umbraco.BasePages.BasePage.umbracoUserContextID))
+ throw new Exception("Client authorization failed. User is not logged in");
+ }
+ }
+}
\ No newline at end of file
diff --git a/umbraco/presentation/umbraco/controls/Tree/CustomTreeServiceResource.Designer.cs b/umbraco/presentation/umbraco/controls/Tree/CustomTreeServiceResource.Designer.cs
new file mode 100644
index 0000000000..fe84e5292e
--- /dev/null
+++ b/umbraco/presentation/umbraco/controls/Tree/CustomTreeServiceResource.Designer.cs
@@ -0,0 +1,72 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.488
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace umbraco.controls.Tree
+{
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class CustomTreeServiceResource {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal CustomTreeServiceResource() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("uComponents.Core.Shared.Tree.CustomTreeServiceResource", typeof(CustomTreeServiceResource).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to <%@ WebService language="C#" class="uComponents.Core.Shared.Tree.CustomTreeService" %>.
+ ///
+ internal static string CustomTreeService {
+ get {
+ return ResourceManager.GetString("CustomTreeService", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/umbraco/presentation/umbraco/controls/Tree/CustomTreeServiceResource.resx b/umbraco/presentation/umbraco/controls/Tree/CustomTreeServiceResource.resx
new file mode 100644
index 0000000000..ff813c630a
--- /dev/null
+++ b/umbraco/presentation/umbraco/controls/Tree/CustomTreeServiceResource.resx
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ customtreeservice.asmx;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8
+
+
\ No newline at end of file
diff --git a/umbraco/presentation/umbraco/controls/Tree/NodeInfo.cs b/umbraco/presentation/umbraco/controls/Tree/NodeInfo.cs
new file mode 100644
index 0000000000..48f46e30db
--- /dev/null
+++ b/umbraco/presentation/umbraco/controls/Tree/NodeInfo.cs
@@ -0,0 +1,32 @@
+namespace umbraco.controls.Tree
+{
+ ///
+ /// Simple data object to hold information about a node
+ ///
+ public class NodeInfo
+ {
+ ///
+ /// Gets or sets the id.
+ ///
+ /// The id.
+ public int Id { get; set; }
+
+ ///
+ /// Gets or sets the path.
+ ///
+ /// The path.
+ public string Path { get; set; }
+
+ ///
+ /// Gets or sets the path as names.
+ ///
+ /// The path as names.
+ public string PathAsNames { get; set; }
+
+ ///
+ /// Gets or sets the type of the node.
+ ///
+ /// The type of the node.
+ public string NodeType { get; set; }
+ }
+}
\ No newline at end of file