public void ResetOverride(Index indexToReset) { // TODO: comment if (indexToReset.IsEmpty) { OverrideContent(false); } else { OverrideItem(false, indexToReset); } var visitor = new GraphVisitorBase { SkipRootNode = true }; visitor.Visiting += (node, path) => { var childNode = (AssetNode)node; childNode.OverrideContent(false); foreach (var overrideItem in childNode.GetOverriddenItemIndices()) { childNode.OverrideItem(false, overrideItem); } foreach (var overrideKey in childNode.GetOverriddenKeyIndices()) { childNode.OverrideKey(false, overrideKey); } }; visitor.Visit(this); // TODO: we should reconcile directly only assetNode, not the whole asset PropertyGraph.ReconcileWithBase(); }
protected override IEnumerable <ReferenceReplacementViewModel <AssetViewModel> > GetReplacementsForReferencer(AssetViewModel referencer, object referencedMember) { var rootNode = SessionViewModel.Instance.AssetNodeContainer.GetNode(referencer.Asset); var visitor = new GraphVisitorBase { SkipRootNode = true }; var result = new List <ReferenceReplacementViewModel <AssetViewModel> >(); visitor.Visiting += (node, path) => { var memberNode = node as IAssetMemberNode; if (memberNode != null) { if (AssetRegistry.IsContentType(memberNode.Descriptor.GetInnerCollectionType())) { if (memberNode.Target?.IsEnumerable ?? false) { foreach (var index in memberNode.Target.Indices) { // If this property is inherited it will be updated by the standard propagation if (memberNode.Target.IsItemInherited(index)) { continue; } var target = ContentReferenceHelper.GetReferenceTarget(referencer.Session, memberNode.Target.Retrieve(index)); if (target == CurrentObjectToReplace) { // If so, prepare a replacement for it. var viewModel = new AssetReferenceReplacementViewModel(this, CurrentObjectToReplace, referencer, referencedMember, memberNode.Target, index); result.Add(viewModel); } } } else { // If this property is inherited it will be updated by the standard propagation if (memberNode.IsContentInherited()) { return; } var target = ContentReferenceHelper.GetReferenceTarget(referencer.Session, memberNode.Retrieve()); if (target == CurrentObjectToReplace) { // If so, prepare a replacement for it. var viewModel = new AssetReferenceReplacementViewModel(this, CurrentObjectToReplace, referencer, referencedMember, memberNode, NodeIndex.Empty); result.Add(viewModel); } } } } }; visitor.Visit(rootNode); return(result); }
public List <NodeOverride> ClearAllOverrides() { // Unregister handlers - must be done first! foreach (var linkedNode in baseLinkedNodes.Where(x => x.Value != null)) { var member = linkedNode.Key.BaseContent as IMemberNode; if (member != null) { member.Changed -= linkedNode.Value; } } baseLinkedNodes.Clear(); var clearedOverrides = new List <NodeOverride>(); // Clear override and base from node if (RootNode != null) { var visitor = new GraphVisitorBase { SkipRootNode = true }; visitor.Visiting += (node, path) => { var assetNode = node as AssetMemberNode; if (assetNode == null) { return; } if (assetNode.IsContentOverridden()) { assetNode.OverrideContent(false); clearedOverrides.Add(new NodeOverride(assetNode, Index.Empty, OverrideTarget.Content)); } foreach (var index in assetNode.GetOverriddenItemIndices()) { assetNode.OverrideItem(false, index); clearedOverrides.Add(new NodeOverride(assetNode, index, OverrideTarget.Item)); } foreach (var index in assetNode.GetOverriddenKeyIndices()) { assetNode.OverrideKey(false, index); clearedOverrides.Add(new NodeOverride(assetNode, index, OverrideTarget.Key)); } }; visitor.Visit(RootNode); } return(clearedOverrides); }