Example #1
0
        private static void ProcessModelErrorChange(ModelHasError errorLink)
        {
            ModelError error = errorLink.Error;

            // Give the error itself a chance to have an indirect owner.
            // A ModelError can own itself.
            InvalidateIndirectErrorOwnerDisplay(error, null, null);
            DomainClassInfo classInfo = error.GetDomainClass();
            ReadOnlyCollection <DomainRoleInfo> playedMetaRoles = classInfo.AllDomainRolesPlayed;
            int playedMetaRoleCount = playedMetaRoles.Count;

            for (int i = 0; i < playedMetaRoleCount; ++i)
            {
                DomainRoleInfo roleInfo = playedMetaRoles[i];
                if (roleInfo.Id != ModelHasError.ErrorDomainRoleId)
                {
                    LinkedElementCollection <ModelElement> rolePlayers = roleInfo.GetLinkedElements(error);
                    int rolePlayerCount = rolePlayers.Count;
                    for (int j = 0; j < rolePlayerCount; ++j)
                    {
                        ModelElement rolePlayer = rolePlayers[j];
                        InvalidateErrorOwnerDisplay(rolePlayer);
                        InvalidateIndirectErrorOwnerDisplay(rolePlayer, null, null);
                    }
                }
            }
        }
Example #2
0
        private static void InvalidateIndirectErrorOwnerDisplay(ModelElement element, DomainDataDirectory domainDataDirectory, Predicate <ModelElement> filter)
        {
            IHasIndirectModelErrorOwner indirectOwner = element as IHasIndirectModelErrorOwner;

            if (indirectOwner != null)
            {
                Guid[] metaRoles = indirectOwner.GetIndirectModelErrorOwnerLinkRoles();
                int    roleCount;
                if (metaRoles != null &&
                    0 != (roleCount = metaRoles.Length))
                {
                    if (domainDataDirectory == null)
                    {
                        domainDataDirectory = element.Store.DomainDataDirectory;
                    }
                    for (int i = 0; i < roleCount; ++i)
                    {
                        Debug.Assert(metaRoles[i] != Guid.Empty);
                        DomainRoleInfo metaRole = domainDataDirectory.FindDomainRole(metaRoles[i]);
                        if (metaRole != null)
                        {
                            LinkedElementCollection <ModelElement> counterparts = metaRole.GetLinkedElements(element);
                            int counterpartCount = counterparts.Count;
                            for (int j = 0; j < counterpartCount; ++j)
                            {
                                ModelElement counterpart = counterparts[j];
                                if (filter != null && filter(counterpart))
                                {
                                    continue;
                                }
                                if (counterpart is IModelErrorOwner)
                                {
                                    InvalidateErrorOwnerDisplay(counterpart);
                                }
                                InvalidateIndirectErrorOwnerDisplay(
                                    counterpart,
                                    domainDataDirectory,
                                    delegate(ModelElement testElement)
                                {
                                    return(testElement == element ||
                                           (filter != null && filter(testElement)));
                                });
                            }
                        }
                    }
                }
            }
            ElementLink elementLink;
            IElementLinkRoleHasIndirectModelErrorOwner indirectLinkRoleOwner;

            if (null != (indirectLinkRoleOwner = element as IElementLinkRoleHasIndirectModelErrorOwner) &&
                null != (elementLink = element as ElementLink))
            {
                Guid[] metaRoles = indirectLinkRoleOwner.GetIndirectModelErrorOwnerElementLinkRoles();
                int    roleCount;
                if (metaRoles != null &&
                    0 != (roleCount = metaRoles.Length))
                {
                    if (domainDataDirectory == null)
                    {
                        domainDataDirectory = element.Store.DomainDataDirectory;
                    }
                    for (int i = 0; i < roleCount; ++i)
                    {
                        Debug.Assert(metaRoles[i] != Guid.Empty);
                        DomainRoleInfo metaRole = domainDataDirectory.FindDomainRole(metaRoles[i]);
                        if (metaRole != null)
                        {
                            ModelElement rolePlayer = metaRole.GetRolePlayer(elementLink);
                            if (filter != null && filter(rolePlayer))
                            {
                                continue;
                            }
                            if (rolePlayer is IModelErrorOwner)
                            {
                                InvalidateErrorOwnerDisplay(rolePlayer);
                            }
                            InvalidateIndirectErrorOwnerDisplay(
                                rolePlayer,
                                domainDataDirectory,
                                delegate(ModelElement testElement)
                            {
                                return(testElement == element ||
                                       (filter != null && filter(testElement)));
                            });
                        }
                    }
                }
            }
        }