예제 #1
0
        /// <summary>
        /// Activate the Name property in the Properties Window
        /// for the specified element
        /// </summary>
        /// <param name="targetElement">The underlying model element with a name property</param>
        protected void ActivateNameProperty(ModelElement targetElement)
        {
            Store store = Store;

            EditorUtility.ActivatePropertyEditor(
                (store as IORMToolServices).ServiceProvider,
                DomainTypeDescriptor.CreateNamePropertyDescriptor(targetElement),
                false);
        }
예제 #2
0
        /// <summary>
        /// Implements IModelErrorActivation.ActivateModelError
        /// </summary>
        protected new bool ActivateModelError(ModelError error)
        {
            RingConstraintTypeNotSpecifiedError ringTypeError;
            bool retVal = true;

            if (null != (ringTypeError = error as RingConstraintTypeNotSpecifiedError))
            {
                Store          store      = Store;
                RingConstraint constraint = ringTypeError.RingConstraint;
                EditorUtility.ActivatePropertyEditor(
                    (store as IORMToolServices).ServiceProvider,
                    DomainTypeDescriptor.CreatePropertyDescriptor(constraint, RingConstraint.RingTypeDomainPropertyId),
                    true);
            }
            else
            {
                retVal = base.ActivateModelError(error);
            }
            return(retVal);
        }
예제 #3
0
        /// <summary>
        /// Implements <see cref="IModelErrorActivation.ActivateModelError"/> for
        /// the <see cref="ValueComparisonConstraintOperatorNotSpecifiedError"/>
        /// </summary>
        protected new bool ActivateModelError(ModelError error)
        {
            ValueComparisonConstraintOperatorNotSpecifiedError operatorError;
            ValueComparisonRolesNotComparableError             comparabilityError;
            ValueComparisonConstraint constraint;
            Store store;
            bool  retVal = true;

            if (null != (operatorError = error as ValueComparisonConstraintOperatorNotSpecifiedError))
            {
                store      = Store;
                constraint = operatorError.ValueComparisonConstraint;
                EditorUtility.ActivatePropertyEditor(
                    (store as IORMToolServices).ServiceProvider,
                    DomainTypeDescriptor.CreatePropertyDescriptor(constraint, ValueComparisonConstraint.OperatorDomainPropertyId),
                    true);
            }
            else if (null != (comparabilityError = error as ValueComparisonRolesNotComparableError))
            {
                constraint = comparabilityError.ValueComparisonConstraint;
                LinkedElementCollection <Role> constraintRoles = constraint.RoleCollection;
                Role role1;
                Role role2;
                ObjectTypePlaysRole rolePlayerLink1;
                ObjectTypePlaysRole rolePlayerLink2;
                ObjectType          rolePlayer1 = null;
                ObjectType          rolePlayer2 = null;
                Role[] valueRoles1 = null;
                Role[] valueRoles2 = null;
                // The default behavior is to activate the role sequence
                // for editing. However, if the problem is with a single
                // resolved value type, and the units are correct, then
                // we need to select the first directly detached object.
                if (constraintRoles.Count == 2 &&
                    null != (rolePlayerLink1 = ObjectTypePlaysRole.GetLinkToRolePlayer(role1 = constraintRoles[0])) &&
                    null != (rolePlayerLink2 = ObjectTypePlaysRole.GetLinkToRolePlayer(role2 = constraintRoles[1])) &&
                    (rolePlayerLink1.RolePlayer == rolePlayerLink2.RolePlayer ||
                     (null != (valueRoles1 = role1.GetValueRoles()) &&
                      null != (valueRoles2 = role2.GetValueRoles()) &&
                      DataType.IsComparableValueType(rolePlayer1 = valueRoles1[0].RolePlayer, rolePlayer2 = valueRoles2[0].RolePlayer, !constraint.IsDirectional))))
                {
                    bool verifiedReferenceMode = true;
                    if (valueRoles1 != null)
                    {
                        ORMModel      model          = null;
                        ReferenceMode referenceMode1 = (valueRoles1.Length > 1) ?
                                                       ReferenceMode.FindReferenceModeFromEntityNameAndValueName(rolePlayer1.Name, valueRoles1[1].RolePlayer.Name, model = constraint.ResolvedModel) :
                                                       null;
                        ReferenceMode referenceMode2 = (valueRoles2.Length > 1) ?
                                                       ReferenceMode.FindReferenceModeFromEntityNameAndValueName(rolePlayer2.Name, valueRoles2[1].RolePlayer.Name, model ?? constraint.ResolvedModel) :
                                                       null;
                        bool referenceMode1IsUnit = referenceMode1 != null && referenceMode1.Kind.ReferenceModeType == ReferenceModeType.UnitBased;
                        bool referenceMode2IsUnit = referenceMode2 != null && referenceMode2.Kind.ReferenceModeType == ReferenceModeType.UnitBased;
                        verifiedReferenceMode = referenceMode1IsUnit ? (referenceMode2IsUnit && referenceMode1 == referenceMode2) : !referenceMode2IsUnit;
                    }
                    if (verifiedReferenceMode)
                    {
                        // Find a connected role player
                        foreach (ExternalConstraintLink constraintLink in MultiShapeUtility.GetEffectiveAttachedLinkShapes <ExternalConstraintLink>(this))
                        {
                            FactTypeShape factTypeShape;
                            if (constraintLink.AssociatedConstraintRole.Role == role1 &&
                                null != (factTypeShape = constraintLink.FromShape as FactTypeShape))
                            {
                                foreach (RolePlayerLink rolePlayerLinkShape in MultiShapeUtility.GetEffectiveAttachedLinkShapes <RolePlayerLink>(factTypeShape))
                                {
                                    if (rolePlayerLinkShape.AssociatedRolePlayerLink == rolePlayerLink1)
                                    {
                                        Diagram.ActiveDiagramView.Selection.Set(new DiagramItem(rolePlayerLinkShape.ToShape));
                                        return(true);
                                    }
                                }
                            }
                        }
                    }
                }
                ActivateNewRoleSequenceConnectAction(null);
            }
            else
            {
                retVal = base.ActivateModelError(error);
            }
            return(retVal);
        }
예제 #4
0
        /// <summary>
        /// Add shared model error activation handlers. Activation handlers are
        /// static, this is called once during intitial load.
        /// </summary>
        /// <param name="store">The <see cref="Store"/></param>
        public static void RegisterModelErrorActivators(Store store)
        {
            IORMToolServices toolServices;
            IORMModelErrorActivationService activationService;

            if (null != (toolServices = store as IORMToolServices) &&
                null != (activationService = toolServices.ModelErrorActivationService))
            {
                #region Role error activation
                activationService.RegisterErrorActivator(
                    typeof(Role),
                    true,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    if (error is RolePlayerRequiredError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            RoleTypeDescriptor.GetRolePlayerDisplayPropertyDescriptor((Role)selectedElement),
                            true);
                    }
                    else if (error is ValueConstraintError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, Role.ValueRangeTextDomainPropertyId),
                            false);
                    }
                    else if (error is CardinalityRangeOverlapError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            RoleTypeDescriptor.CardinalityDisplayPropertyDescriptor,
                            false);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // Role error activation
                #region ValueConstraint error activation
                activationService.RegisterErrorActivator(
                    typeof(ValueConstraint),
                    true,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    if (error is ValueConstraintError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, ValueConstraint.TextDomainPropertyId),
                            false);
                    }
                    else if (error is ConstraintDuplicateNameError)
                    {
                        ActivateNameProperty(selectedElement);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // ValueConstraint error activation
                #region CardinalityConstraint error activation
                activationService.RegisterErrorActivator(
                    typeof(CardinalityConstraint),
                    true,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    if (error is CardinalityRangeOverlapError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, CardinalityConstraint.TextDomainPropertyId),
                            false);
                    }
                    else if (error is ConstraintDuplicateNameError)
                    {
                        ActivateNameProperty(selectedElement);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // CardinalityConstraint error activation
                #region SetConstraint error activation
                activationService.RegisterErrorActivator(
                    typeof(SetConstraint),
                    true,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    if (error is ConstraintDuplicateNameError)
                    {
                        ActivateNameProperty(selectedElement);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // SetConstraint error activation
                #region FrequencyConstraint error activation
                activationService.RegisterErrorActivator(
                    typeof(FrequencyConstraint),
                    true,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    if (error is FrequencyConstraintExactlyOneError)
                    {
                        ((FrequencyConstraint)selectedElement).ConvertToUniquenessConstraint();
                    }
                    else if (error is FrequencyConstraintNonRestrictiveRangeError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, FrequencyConstraint.MinFrequencyDomainPropertyId),
                            false);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // FrequencyConstraint error activation
                #region RingConstraint error activation
                activationService.RegisterErrorActivator(
                    typeof(RingConstraint),
                    false,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    if (error is RingConstraintTypeNotSpecifiedError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, RingConstraint.RingTypeDomainPropertyId),
                            true);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // RingConstraint error activation
                #region ValueComparisonConstraint error activation
                activationService.RegisterErrorActivator(
                    typeof(ValueComparisonConstraint),
                    false,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    if (error is ValueComparisonConstraintOperatorNotSpecifiedError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, ValueComparisonConstraint.OperatorDomainPropertyId),
                            true);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // ValueComparisonConstraint error activation
                #region SetComparisonConstraint error activation
                activationService.RegisterErrorActivator(
                    typeof(SetComparisonConstraint),
                    true,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    ConstraintDuplicateNameError duplicateName;
                    if (null != (duplicateName = error as ConstraintDuplicateNameError))
                    {
                        ActivateNameProperty(selectedElement);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // SetComparisonConstraint error activation
                #region ObjectType error activation
                activationService.RegisterErrorActivator(
                    typeof(ObjectType),
                    false,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    bool retVal = true;
                    PopulationMandatoryError populationMandatory;
                    if (error is DataTypeNotSpecifiedError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            ObjectTypeTypeDescriptor.DataTypeDisplayPropertyDescriptor,
                            true);
                    }
                    else if (error is EntityTypeRequiresReferenceSchemeError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, ObjectType.ReferenceModeDisplayDomainPropertyId),
                            true);
                    }
                    else if (error is ValueConstraintError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, ObjectType.ValueRangeTextDomainPropertyId),
                            false);
                    }
                    else if (error is CardinalityRangeOverlapError)
                    {
                        EditorUtility.ActivatePropertyEditor(
                            services.ServiceProvider,
                            ObjectTypeTypeDescriptor.CardinalityDisplayPropertyDescriptor,
                            false);
                    }
                    else if (error is ObjectTypeDuplicateNameError)
                    {
                        ActivateNameProperty(selectedElement);
                    }
                    else if (error is ObjectifiedInstanceRequiredError || error is TooFewEntityTypeRoleInstancesError)
                    {
                        ORMDesignerPackage.SamplePopulationEditorWindow.ActivateModelError(error);
                    }
                    else if (null != (populationMandatory = error as PopulationMandatoryError))
                    {
                        retVal = ORMDesignerPackage.SamplePopulationEditorWindow.AutoCorrectMandatoryError(populationMandatory, (ObjectType)selectedElement);
                    }
                    else
                    {
                        retVal = false;
                    }
                    return(retVal);
                });
                #endregion                 // ObjectType error activation
                #region FactType error activation
                activationService.RegisterErrorActivator(
                    typeof(FactType),
                    true,
                    delegate(IORMToolServices services, ModelElement selectedElement, ModelError error)
                {
                    PopulationMandatoryError populationMandatory;
                    TooFewReadingRolesError tooFew;
                    TooManyReadingRolesError tooMany;
                    ReadingRequiresUserModificationError userModification;
                    DuplicateReadingSignatureError duplicateSignature;
                    FactTypeRequiresReadingError noReading;
                    ValueConstraintError valueError;
                    CardinalityRangeOverlapError cardinalityRangeError;
                    FactType factType;
                    ImpliedInternalUniquenessConstraintError implConstraint;
                    Reading reading = null;
                    bool retVal     = true;
                    if (null != (populationMandatory = error as PopulationMandatoryError))
                    {
                        retVal = ORMDesignerPackage.SamplePopulationEditorWindow.AutoCorrectMandatoryError(populationMandatory, null, (FactType)selectedElement);
                    }
                    else if (null != (tooFew = error as TooFewReadingRolesError))
                    {
                        reading = tooFew.Reading;
                    }
                    else if (null != (tooMany = error as TooManyReadingRolesError))
                    {
                        reading = tooMany.Reading;
                    }
                    else if (null != (noReading = error as FactTypeRequiresReadingError))
                    {
                        factType = noReading.FactType;
                        Debug.Assert(factType != null);
                        ORMReadingEditorToolWindow newWindow = ORMDesignerPackage.ReadingEditorWindow;
                        newWindow.Show();
                        newWindow.ActivateReading(factType);
                    }
                    else if (null != (userModification = error as ReadingRequiresUserModificationError))
                    {
                        reading = userModification.Reading;
                    }
                    else if (null != (duplicateSignature = error as DuplicateReadingSignatureError))
                    {
                        factType = (FactType)selectedElement;
                        LinkedElementCollection <Reading> readings = duplicateSignature.ReadingCollection;
                        foreach (Reading testReading in readings)
                        {
                            if (testReading.ReadingOrder.FactType == factType)
                            {
                                reading = testReading;
                                break;
                            }
                        }
                        if (reading == null)
                        {
                            Objectification objectification;
                            if (null != (objectification = factType.Objectification))
                            {
                                foreach (Reading testReading in readings)
                                {
                                    if (testReading.ReadingOrder.FactType.ImpliedByObjectification == objectification)
                                    {
                                        reading = testReading;
                                        break;
                                    }
                                }
                            }
                            if (reading == null)
                            {
                                // Defensive, shouldn't happen.
                                reading = readings[0];
                            }
                        }
                    }
                    else if (null != (implConstraint = error as ImpliedInternalUniquenessConstraintError))
                    {
                        IServiceProvider provider;
                        IVsUIShell shell;
                        if (null != (provider = services.ServiceProvider) &&
                            null != (shell = (IVsUIShell)provider.GetService(typeof(IVsUIShell))))
                        {
                            Guid g = new Guid();
                            int pnResult;
                            shell.ShowMessageBox(0, ref g, ResourceStrings.PackageOfficialName,
                                                 ResourceStrings.ImpliedInternalConstraintFixMessage,
                                                 "", 0, OLEMSGBUTTON.OLEMSGBUTTON_YESNO,
                                                 OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_QUERY, 0, out pnResult);
                            if (pnResult == (int)DialogResult.Yes)
                            {
                                implConstraint.FactType.RemoveImpliedInternalUniquenessConstraints();
                            }
                        }
                    }
                    else if (null != (valueError = error as ValueConstraintError))
                    {
                        if (valueError.ContextValueConstraint is RoleValueConstraint)
                        {
                            EditorUtility.ActivatePropertyEditor(
                                services.ServiceProvider,
                                DomainTypeDescriptor.CreatePropertyDescriptor(selectedElement, ObjectType.ValueRangeTextDomainPropertyId),
                                false);
                        }
                        else
                        {
                            retVal = false;
                        }
                    }
                    else if (null != (cardinalityRangeError = error as CardinalityRangeOverlapError))
                    {
                        if (cardinalityRangeError.CardinalityConstraint is ObjectTypeCardinalityConstraint)
                        {
                            EditorUtility.ActivatePropertyEditor(
                                services.ServiceProvider,
                                ObjectTypeTypeDescriptor.CardinalityDisplayPropertyDescriptor,
                                false);
                        }
                        else
                        {
                            retVal = false;
                        }
                    }
                    else if (error is TooFewFactTypeRoleInstancesError || error is ObjectifyingInstanceRequiredError)
                    {
                        ORMDesignerPackage.SamplePopulationEditorWindow.ActivateModelError(error);
                    }
                    else
                    {
                        retVal = false;
                    }

                    if (reading != null)
                    {
                        // Open the reading editor window and activate the reading
                        ORMReadingEditorToolWindow window = ORMDesignerPackage.ReadingEditorWindow;
                        window.Show();
                        window.ActivateReading(reading);
                    }
                    return(retVal);
                });
                #endregion                 // FactType error activation
            }
        }