private void CreateChildNodes(string lang, string role, DimensionNode parentNode, DefinitionLink dLink, Hashtable definisionLinks, HybridDictionary ChildDefinitionLocatorsHD, bool buildHypercubeChildren, bool isScenarioMarkup) { if (ChildDefinitionLocatorsHD == null) { return; } if (!buildHypercubeChildren) { if (parentNode.NodeDimensionInfo != null && parentNode.NodeDimensionInfo.NodeType == DimensionNode.NodeType.Hypercube) { //no need to build the children... return; } } foreach (ChildDefinitionLocator cdl in ChildDefinitionLocatorsHD.Values) { DefinitionLocator childLocator; if (!dLink.TryGetLocator(cdl.HRef, out childLocator)) { continue; } bool recursive = true; if (parentNode != null && parentNode.GetParent(childLocator.HRef) != null) { recursive = false; //we have a recursion.. //this might be ok if one of the links is a prohibitted link... } //organize locators by non xlink attributes //we should have only one valid LocatorRelationshipInfo for each order... DefinitionLocatorRelationshipInfo currentRelationShip = null; for (int i = cdl.LocatorRelationshipInfos.Count - 1; i >= 0; i--) { DefinitionLocatorRelationshipInfo lri = cdl.LocatorRelationshipInfos[i] as DefinitionLocatorRelationshipInfo; if (currentRelationShip != null && lri.IsNonXlinkEquivalentRelationship(currentRelationShip)) { continue; } currentRelationShip = lri; //if (lri.IsDefault) continue; //this is just the default definition...no need to include it when we build the tree.. if (lri.IsProhibited) { continue; } childLocator.CreateDimensionNode(lang, role, parentNode, parentNode.Id, dLink, recursive, definisionLinks, lri, null, buildHypercubeChildren, isScenarioMarkup); } } }
internal bool TryGetDimensionNodeForRole(string currentLanguage, string currentLabelRole, string roleId, out DimensionNode topLevelNode) { topLevelNode = null; DefinitionLink dl = definitionLinks[roleId] as DefinitionLink; if (dl != null) { string label = dl.Title; topLevelNode = new DimensionNode(label); topLevelNode.MyDefinitionLink = dl; if (dl.HypercubeLocatorsHrefs.Count > 0) { foreach (string hypercubeHref in dl.HypercubeLocatorsHrefs) { DimensionNode hyperCubeNode; if (dl.TryGetHypercubeNode(currentLanguage, currentLabelRole, this.definitionLinks, hypercubeHref, false, out hyperCubeNode)) { topLevelNode.AddChild(hyperCubeNode); } } } else { //we might have to build the dimension nodes by itself... if (dl.DimensionLocatorsHrefs.Count > 0) { foreach (string dimHref in dl.DimensionLocatorsHrefs) { DefinitionLocator dloc; if (!dl.TryGetLocator(dimHref, out dloc)) { return(false); } DimensionNode dn = dloc.CreateDimensionNode(currentLanguage, currentLabelRole, null, dimHref, dl, true, definitionLinks, null, null, true, false); if (dn != null) { topLevelNode.AddChild(dn); } } } } } return(topLevelNode != null); }
internal DimensionNode CreateDimensionNode(string lang, string role, Node parentNode, string parentId, DefinitionLink dLink, bool recursive, Hashtable definisionLinks, DefinitionLocatorRelationshipInfo lri, DimensionNode newNode, bool buildHypercubeChildren, bool isScenarioMarkup) { if (e == null) { return(null); } if (newNode == null) { newNode = new DimensionNode(e); newNode.IsSegmentMarkup = !isScenarioMarkup; newNode.SetLabel(lang, role); newNode.NodeDimensionInfo = lri; newNode.IsDraggable = false; if (lri != null && lri.NodeType == DimensionNode.NodeType.Item && lri.Usable) { if (!e.IsAbstract) { newNode.IsDraggable = true; } } newNode.MyDefinitionLink = dLink; } if (lri != null) { newNode.SetOrder(lri.Order); if (PresentationLocator.preferredLabelRole.Equals(role)) { if (lri.PrefLabel != null) { newNode.UpdatePreferredLabel(lang, lri.PrefLabel); } } } if (parentNode != null) { // and add it parentNode.AddChild(newNode); parentId = parentNode.Id; } if (recursive) { if (lri != null && lri.TargetRole != null && dLink.Role != lri.TargetRole) { if (definisionLinks != null) { DefinitionLink targetDLink = definisionLinks[lri.TargetRole] as DefinitionLink; if (targetDLink != null) { DefinitionLocator targetLocator; if (targetDLink.TryGetLocator(newNode.Id, out targetLocator)) { CreateChildNodes(lang, role, newNode, targetDLink, definisionLinks, targetLocator.childLocatorsByHRef, buildHypercubeChildren, isScenarioMarkup); } } } if (newNode.Children != null) { newNode.Children.Sort(new NodeOrderSorter()); } return(newNode); } CreateChildNodes(lang, role, newNode, dLink, definisionLinks, childLocatorsByHRef, buildHypercubeChildren, isScenarioMarkup); //need to sort the nodes if (newNode.Children != null) { newNode.Children.Sort(new NodeOrderSorter()); } } return(newNode); }