public static IEnumerable <Element> GetNamespaceAndFormElements(ElementProviderContext context, string ns)
        {
            using (var data = new DataConnection())
            {
                var allModelReferences = data.Get <IModelReference>();

                var folders      = new List <string>();
                var formElements = new List <Element>();

                if (String.IsNullOrEmpty(ns))
                {
                    var homepageIds = data.Get <IPageStructure>().Where(s => s.ParentId == Guid.Empty).Select(s => s.Id);
                    if (homepageIds.Count() > 1)
                    {
                        folders.AddRange(homepageIds
                                         .Select(id => PageManager.GetPageById(id))
                                         .Select(page => SanatizeFormName(page.Title)));
                    }
                }
                else
                {
                    allModelReferences = allModelReferences.Where(def => def.Name.StartsWith(ns + "."));
                }

                foreach (var modelReference in allModelReferences)
                {
                    var label = modelReference.Name;

                    if (!String.IsNullOrEmpty(ns))
                    {
                        label = label.Remove(0, ns.Length + 1);
                    }

                    var split = label.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                    if (split.Length > 1)
                    {
                        var folder = split[0];

                        if (!folders.Contains(folder))
                        {
                            folders.Add(folder);
                        }
                    }
                    else if (split.Length == 1)
                    {
                        var token = modelReference.GetDataEntityToken();

                        var elementHandle = context.CreateElementHandle(token);
                        var formElement   = new Element(elementHandle)
                        {
                            VisualData = new ElementVisualizedData
                            {
                                Label       = label,
                                ToolTip     = label,
                                HasChildren = true,
                                Icon        = ResourceHandle.BuildIconFromDefaultProvider("localization-element-closed-root"),
                                OpenedIcon  = ResourceHandle.BuildIconFromDefaultProvider("localization-element-opened-root")
                            }
                        };

                        formElements.Add(formElement);
                    }
                }

                foreach (var folder in folders.OrderBy(f => f))
                {
                    var handleNamespace = folder;
                    if (!String.IsNullOrEmpty(ns))
                    {
                        handleNamespace = ns + "." + handleNamespace;
                    }

                    var folderElement = NamespaceFolderEntityToken.CreateElement(context, typeof(FormBuilderElementProvider).Name, folder, handleNamespace);

                    yield return(folderElement);
                }

                foreach (var form in formElements)
                {
                    yield return(form);
                }
            }
        }
        private static IEnumerable <Element> GetNamespaceAndResourceElements(ElementProviderContext context, string ns)
        {
            var resources = LocalizationsFacade.GetResourceKeys(ns);

            var folders  = new List <string>();
            var elements = new List <Element>();

            foreach (var key in resources)
            {
                var label = key.Key;

                if (label == ns)
                {
                    continue;
                }

                var labelParts = label.Split('.');

                if (!String.IsNullOrEmpty(ns))
                {
                    var nsParts = ns.Split('.');

                    if (nsParts.Length > labelParts.Length)
                    {
                        continue;
                    }

                    labelParts = labelParts.Skip(nsParts.Length).ToArray();
                    label      = String.Join(".", labelParts);
                }

                if (labelParts.Length > 1)
                {
                    var folder = labelParts[0];

                    if (!folders.Contains(folder))
                    {
                        folders.Add(folder);
                    }
                }
                else if (labelParts.Length == 1)
                {
                    var token = key.GetDataEntityToken();

                    var dragAndDropInfo = new ElementDragAndDropInfo(typeof(IResourceKey));

                    dragAndDropInfo.AddDropType(typeof(NamespaceFolderEntityToken));
                    dragAndDropInfo.SupportsIndexedPosition = false;

                    var elementHandle = context.CreateElementHandle(token);
                    var element       = new Element(elementHandle, dragAndDropInfo)
                    {
                        VisualData = new ElementVisualizedData
                        {
                            Label       = label,
                            ToolTip     = label,
                            HasChildren = false,
                            Icon        = ResourceHandle.BuildIconFromDefaultProvider("localization-element-closed-root"),
                            OpenedIcon  = ResourceHandle.BuildIconFromDefaultProvider("localization-element-opened-root")
                        }
                    };

                    var editActionToken = new WorkflowActionToken(typeof(EditResourceWorkflow), new[] { PermissionType.Edit });
                    element.AddAction(new ElementAction(new ActionHandle(editActionToken))
                    {
                        VisualData = new ActionVisualizedData
                        {
                            Label          = "Edit",
                            ToolTip        = "Edit",
                            Icon           = new ResourceHandle("Composite.Icons", "generated-type-data-edit"),
                            ActionLocation = Actions.ActionLocation
                        }
                    });

                    var deleteActionToken = new ConfirmWorkflowActionToken("Are you sure?", typeof(DeleteResourceActionToken));
                    element.AddAction(new ElementAction(new ActionHandle(deleteActionToken))
                    {
                        VisualData = new ActionVisualizedData
                        {
                            Label          = "Delete",
                            ToolTip        = "Delete",
                            Icon           = new ResourceHandle("Composite.Icons", "generated-type-data-delete"),
                            ActionLocation = Actions.ActionLocation
                        }
                    });

                    elements.Add(element);
                }
            }

            foreach (var folder in folders.OrderBy(f => f))
            {
                var handleNamespace = folder;
                if (!String.IsNullOrEmpty(ns))
                {
                    handleNamespace = ns + "." + handleNamespace;
                }

                var folderElement = NamespaceFolderEntityToken.CreateElement(context, folder, handleNamespace);

                var deleteActionToken = new ConfirmWorkflowActionToken("Are you sure?", typeof(DeleteNamespaceActionToken));
                folderElement.AddAction(new ElementAction(new ActionHandle(deleteActionToken))
                {
                    VisualData = new ActionVisualizedData
                    {
                        Label          = "Delete",
                        ToolTip        = "Delete",
                        Icon           = new ResourceHandle("Composite.Icons", "generated-type-data-delete"),
                        ActionLocation = Actions.ActionLocation
                    }
                });

                folderElement.AddAction(Actions.GetAddAction());
                folderElement.AddAction(Actions.GetExportAction());

                yield return(folderElement);
            }

            foreach (var el in elements)
            {
                yield return(el);
            }
        }