public Boolean EA_OnPreNewConnector(EA.Repository repository, EA.EventProperties info)
        {
            if (info.Get("Stereotype").Value.Equals(SDMModelingMain.LinkVariableStereotype))
            {
                EA.Element client   = repository.GetElementByID(Int32.Parse(info.Get("ClientID").Value as String));
                EA.Element supplier = repository.GetElementByID(Int32.Parse(info.Get("SupplierID").Value as String));
                if (client != null && supplier != null)
                {
                    List <SQLConnector> clientToSupplierAssociations = new List <SQLConnector>();
                    List <SQLConnector> supplierToClientAssociations = new List <SQLConnector>();

                    SQLRepository sqlRepository      = new SQLRepository(repository, false);
                    SQLElement    clientClassifier   = sqlRepository.GetElementByID(client.ClassfierID);
                    SQLElement    supplierClassifier = sqlRepository.GetElementByID(supplier.ClassfierID);

                    LinkVariablePropertiesForm.collectPossibleAssociations(ref clientClassifier, ref supplierClassifier, ref clientToSupplierAssociations, ref supplierToClientAssociations, ref sqlRepository);
                    if (clientToSupplierAssociations.Count == 0 && supplierToClientAssociations.Count == 0)
                    {
                        System.Windows.Forms.MessageBox.Show("There is no Association between these two elements");
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
        public override void doRuleQuickFix(SQLConnector eaConnector, SQLRepository repository, int i, String errorMessage)
        {
            LinkVariable lv = new LinkVariable(eaConnector, repository);

            lv.loadTreeFromTaggedValue();


            if (errorMessage == "The rolename(s) of the LinkVariable differs from the related EReference")
            {
                if (i == 0)
                {
                    SQLConnector referencedReference = SDMUtil.getRelatedEReference(lv);
                    if (referencedReference != null)
                    {
                        EA.Diagram currentDiagram = repository.GetCurrentDiagram();

                        lv.linkDialogueEntry.clientRoleName   = referencedReference.ClientEnd.Role;
                        lv.linkDialogueEntry.supplierRoleName = referencedReference.SupplierEnd.Role;
                        lv.saveTreeToEATaggedValue(true);


                        if (currentDiagram != null)
                        {
                            repository.SaveDiagram(currentDiagram.DiagramID);
                            repository.ReloadDiagram(currentDiagram.DiagramID);
                        }
                    }
                }
            }
            else
            {
                if (i == 0)
                {
                    if (eaConnector.Stereotype == SDMModelingMain.LinkVariableStereotype)
                    {
                        lv = new LinkVariable(eaConnector, repository);
                    }
                    else if (eaConnector.Stereotype == TGGModelingMain.TggLinkVariableStereotype)
                    {
                        lv = new TGGLinkVariable(eaConnector, repository);
                    }
                    LinkVariablePropertiesForm lvForm = new LinkVariablePropertiesForm(lv, repository, true);
                }
            }
        }
        private void onPostLinkVariableConnector(SQLRepository sqlRepository, EA.Connector actCon2)
        {
            //save initial data for linkVariable
            SQLConnector     actCon           = sqlRepository.GetConnectorByID(actCon2.ConnectorID);
            TGGLinkVariable  linkVariable     = new TGGLinkVariable(actCon, sqlRepository);
            SQLElement       newClient        = sqlRepository.GetElementByID(actCon.ClientID);
            SQLElement       newSupplier      = sqlRepository.GetElementByID(actCon.SupplierID);
            String           clientObjMod     = EAEcoreAddin.Util.EAUtil.findTaggedValue(newClient, ObjectVariable.BindingOperatorTaggedValueName).Value;
            String           supplierObjMod   = EAEcoreAddin.Util.EAUtil.findTaggedValue(newSupplier, ObjectVariable.BindingOperatorTaggedValueName).Value;
            BindingSemantics bindingSemantics = BindingSemantics.MANDATORY;
            BindingOperator  bindingOperator  = BindingOperator.CHECK_ONLY;

            if (supplierObjMod == "create" || clientObjMod == "create")
            {
                bindingSemantics = BindingSemantics.MANDATORY;
                bindingOperator  = BindingOperator.CREATE;
            }
            else if (supplierObjMod == "destroy" || clientObjMod == "destroy")
            {
                bindingSemantics = BindingSemantics.MANDATORY;
                bindingOperator  = BindingOperator.DESTROY;
            }
            else if (supplierObjMod == "check_only" && clientObjMod == "check_only")
            {
                bindingSemantics = BindingSemantics.MANDATORY;
                bindingOperator  = BindingOperator.CHECK_ONLY;
            }
            else if (supplierObjMod == "create" && clientObjMod == "destroy" || supplierObjMod == "destroy" && clientObjMod == "create")
            {
                bindingSemantics = BindingSemantics.MANDATORY;
                bindingOperator  = BindingOperator.CHECK_ONLY;
            }

            linkVariable.BindingOperator  = bindingOperator;
            linkVariable.BindingSemantics = bindingSemantics;

            this.LinkVariableDialog = new LinkVariablePropertiesForm(linkVariable, sqlRepository, false);
            EAEcoreAddin.Util.EAUtil.setTaggedValue(sqlRepository, actCon.getRealConnector(), Main.MoflonVerboseTaggedValueName, Main.FalseValue);
        }
        public Boolean EA_OnPostNewConnector(SQLRepository sqlRep, EA.Connector actCon, EA.Diagram currentDiagram)
        {
            if (SdmDiagramMetatype.Contains(currentDiagram.MetaType))
            {
                sqlRep.SaveDiagram(currentDiagram.DiagramID);
                if (actCon.Stereotype == SDMModelingMain.LinkVariableStereotype)
                {
                    //save initial data for linkVariable
                    LinkVariable   linkVariable = new LinkVariable(sqlRep.GetConnectorByID(actCon.ConnectorID), sqlRep);
                    ObjectVariable newClient    = new ObjectVariable(sqlRep.GetElementByID(actCon.ClientID), sqlRep);
                    ObjectVariable newSupplier  = new ObjectVariable(sqlRep.GetElementByID(actCon.SupplierID), sqlRep);
                    newClient.loadTreeFromTaggedValue();
                    newSupplier.loadTreeFromTaggedValue();
                    String           clientBindingOperator   = newClient.BindingOperator.ToString().ToLower();
                    String           supplierBindingOperator = newSupplier.BindingOperator.ToString().ToLower();
                    BindingSemantics bindingSemantics        = BindingSemantics.MANDATORY;
                    BindingOperator  bindingOperator         = BindingOperator.CHECK_ONLY;

                    if (supplierBindingOperator == BindingOperator.CREATE.ToString().ToLower() || clientBindingOperator == BindingOperator.CREATE.ToString().ToLower())
                    {
                        bindingSemantics = BindingSemantics.MANDATORY;
                        bindingOperator  = BindingOperator.CREATE;
                    }
                    else if (supplierBindingOperator == BindingOperator.DESTROY.ToString().ToLower() || clientBindingOperator == BindingOperator.DESTROY.ToString().ToLower())
                    {
                        bindingSemantics = BindingSemantics.MANDATORY;
                        bindingOperator  = BindingOperator.DESTROY;
                    }
                    else if (supplierBindingOperator == BindingOperator.CHECK_ONLY.ToString().ToLower() && clientBindingOperator == BindingOperator.CHECK_ONLY.ToString().ToLower())
                    {
                        bindingSemantics = BindingSemantics.MANDATORY;
                        bindingOperator  = BindingOperator.CHECK_ONLY;
                    }
                    else if (supplierBindingOperator == BindingOperator.CHECK_ONLY.ToString().ToLower() && clientBindingOperator == BindingOperator.DESTROY.ToString().ToLower() || supplierBindingOperator == BindingOperator.DESTROY.ToString().ToLower() && clientBindingOperator == BindingOperator.CREATE.ToString().ToLower())
                    {
                        bindingSemantics = BindingSemantics.MANDATORY;
                        bindingOperator  = BindingOperator.CHECK_ONLY;
                    }
                    linkVariable.BindingOperator  = bindingOperator;
                    linkVariable.BindingSemantics = bindingSemantics;
                    LinkVariablePropertiesForm linkVariableDialogue = new LinkVariablePropertiesForm(linkVariable, sqlRep, false);
                }
                else if (actCon.Type.Equals(Main.EAControlFlowType))
                {
                    ActivityEdge activityEdge = new ActivityEdge(sqlRep, sqlRep.GetConnectorByID(actCon.ConnectorID));

                    //if there is already Success / Failure / ForEach / End guarded edge set new Edge respectively
                    foreach (SQLConnector outgoingEdge in activityEdge.Source.Connectors)
                    {
                        if (outgoingEdge.ClientID == activityEdge.Source.ElementID && outgoingEdge.ConnectorID != activityEdge.EaConnector.ConnectorID)
                        {
                            if (outgoingEdge.TransitionGuard == ActivityEdge.EdgeGuardFailureGui)
                            {
                                activityEdge.GuardType = EdgeGuard.SUCCESS;
                                break;
                            }
                            else if (outgoingEdge.TransitionGuard == ActivityEdge.EdgeGuardSuccessGui)
                            {
                                activityEdge.GuardType = EdgeGuard.FAILURE;
                                break;
                            }
                            else if (outgoingEdge.TransitionGuard == ActivityEdge.EdgeGuardEachTimeGui)
                            {
                                activityEdge.GuardType = EdgeGuard.END;
                                break;
                            }
                            else if (outgoingEdge.TransitionGuard == ActivityEdge.EdgeGuardEndGui)
                            {
                                activityEdge.GuardType = EdgeGuard.EACH_TIME;
                                break;
                            }
                        }
                    }

                    if (activityEdge.GuardType == EdgeGuard.NONE)
                    {
                        SQLElement sourceNode = sqlRep.GetElementByID(actCon.ClientID);
                        if (sourceNode.Stereotype == SDMModelingMain.StoryNodeStereotype)
                        {
                            StoryNode storyNode = new StoryNode(sqlRep, sourceNode);
                            storyNode.loadTreeFromTaggedValue();
                            if (storyNode.ForEach)
                            {
                                activityEdge.GuardType = EdgeGuard.END;
                            }
                        }
                    }

                    activityEdge.saveTreeToEATaggedValue(true);
                }
            }
            return(true);
        }
        /// <summary>
        /// Defines what happens if the user doubleclicks on SDM related Elements.
        /// </summary>
        /// <param name="repository"></param>
        /// <param name="GUID"></param>
        /// <param name="ot"></param>
        /// <returns>True if the EA Dialogs should not be openend. False if the standard EA Dialogs should be opened.
        /// </returns>
        public bool EA_OnContextItemDoubleClicked(EA.Repository repository, String GUID, EA.ObjectType ot)
        {
            SQLRepository sqlRepository = new SQLRepository(repository, false);

            EA.Diagram   actDiag = repository.GetCurrentDiagram();
            SQLMethod    meth    = sqlRepository.GetMethodByGuid(GUID);
            SQLElement   elem    = sqlRepository.GetElementByGuid(GUID);
            SQLConnector con     = sqlRepository.GetConnectorByGuid(GUID);

            if (actDiag != null)
            {
                if (ECOREModelingMain.EcoreDiagramMetatype.Contains(actDiag.MetaType) && ot == EA.ObjectType.otMethod)
                {
                    SQLElement methParent;
                    SQLElement container;

                    if (!openSelectedMethodSDM(actDiag, meth, sqlRepository, out methParent, out container))
                    {
                        if (methParent.Stereotype == ECOREModelingMain.EClassStereotype)
                        {
                            CreateSDMDialog createSdmDialog = new CreateSDMDialog();
                            if (createSdmDialog.ShowDialog() == DialogResult.OK)
                            {
                                createStoryDiagram(meth, repository, actDiag);
                            }
                            return(true);
                        }
                    }
                    else
                    {
                        return(true);
                    }
                }
                else if (SdmDiagramMetatype.Contains(actDiag.MetaType))
                {
                    repository.SaveDiagram(actDiag.DiagramID);
                    if (elem != null)
                    {
                        if (elem.Stereotype == SDMModelingMain.ObjectVariableStereotype)
                        {
                            ObjectVariable ov = new ObjectVariable(elem, sqlRepository);
                            OvDialog       objectVariableDialogue = new OvDialog(sqlRepository, ov);
                            objectVariableDialogue.ShowDialog();
                            return(true);
                        }

                        else if (elem.Stereotype == SDMModelingMain.StoryNodeStereotype || elem.Stereotype == SDMModelingMain.StatementNodeStereotype)
                        {
                            SQLTaggedValue extractedTag = EAEcoreAddin.Util.EAUtil.findTaggedValue(elem, Main.MoflonExtractedStoryPatternTaggedValueName);
                            if (extractedTag == null)
                            {
                                SQLTaggedValue oldExtractedTag = EAEcoreAddin.Util.EAUtil.findTaggedValue(elem, "evacuated");
                                if (oldExtractedTag != null)
                                {
                                    EAEcoreAddin.Util.EAUtil.setTaggedValue(sqlRepository, elem.getRealElement(), Main.MoflonExtractedStoryPatternTaggedValueName, oldExtractedTag.Value);
                                }
                                else
                                {
                                    EAEcoreAddin.Util.EAUtil.setTaggedValue(sqlRepository, elem.getRealElement(), Main.MoflonExtractedStoryPatternTaggedValueName, "false");
                                }
                                extractedTag = EAEcoreAddin.Util.EAUtil.findTaggedValue(elem, Main.MoflonExtractedStoryPatternTaggedValueName);
                            }

                            if (extractedTag != null && extractedTag.Value == Main.TrueValue)
                            {
                                SQLDiagram diagram = (SQLDiagram)elem.Diagrams.GetAt(0);
                                Navigator.addAnchorEntry(diagram.DiagramID, actDiag.DiagramID);
                                repository.OpenDiagram(diagram.DiagramID);
                            }
                            else
                            {
                                if (elem.Stereotype == SDMModelingMain.StoryNodeStereotype)
                                {
                                    ActivityNodeTabsForm activityNodeDialog = new ActivityNodeTabsForm(new StoryNode(sqlRepository, elem), sqlRepository);
                                }
                                else if (elem.Stereotype == SDMModelingMain.StatementNodeStereotype)
                                {
                                    ActivityNodeTabsForm activityNodeDialog = new ActivityNodeTabsForm(new StatementNode(sqlRepository, elem), sqlRepository);
                                }
                            }
                            return(true);
                        }

                        else if (elem.Stereotype == SDMModelingMain.StopNodeStereotype)
                        {
                            StopNode     stopNode  = new StopNode(sqlRepository, elem);
                            StopNodeForm sNodeForm = new StopNodeForm(stopNode, sqlRepository);
                            return(true);
                        }

                        else if (elem.Stereotype == TGGModelingMain.CSPConstraintStereotype)
                        {
                            SDMCSPDialog sdmCspDialog = new SDMCSPDialog(elem, sqlRepository);
                            sdmCspDialog.ShowDialog();

                            return(true);
                        }
                    }
                    if (con != null)
                    {
                        if (con.Stereotype == SDMModelingMain.LinkVariableStereotype)
                        {
                            LinkVariablePropertiesForm linkVariableDialogue = new LinkVariablePropertiesForm(new LinkVariable(con, sqlRepository), sqlRepository, true);
                            return(true);
                        }
                        else if (con.Type == Main.EAControlFlowType)
                        {
                            ActivityEdge activityEdge = new ActivityEdge(sqlRepository, con);
                            ActivityEdgePropertiesForm activityEdgeDialog = new ActivityEdgePropertiesForm(activityEdge, repository);
                            return(true);
                        }
                        else if (con.Stereotype == SDMModelingMain.BindingExpressionLinkStereotype)
                        {
                            SQLElement     targetElement = sqlRepository.GetElementByID(con.SupplierID);
                            ObjectVariable ov            = new ObjectVariable(targetElement, sqlRepository);

                            OvDialog ovDialog = new OvDialog(sqlRepository, ov);
                            ovDialog.showTab(2);
                            ovDialog.ShowDialog();
                            return(true);
                        }
                    }
                    if (ot == EA.ObjectType.otDiagram)
                    {
                        EA.Diagram     diag         = (EA.Diagram)repository.GetDiagramByGuid(GUID);
                        EA.Element     activity     = null;
                        SQLTaggedValue evacuatedTag = null;
                        if (diag.ParentID != 0)
                        {
                            activity     = repository.GetElementByID(diag.ParentID);
                            evacuatedTag = EAEcoreAddin.Util.EAUtil.findTaggedValue(sqlRepository.GetElementByID(activity.ElementID), Main.MoflonExtractedStoryPatternTaggedValueName);
                        }

                        if (evacuatedTag != null && evacuatedTag.Value == Main.TrueValue)
                        {
                            StoryNode            activityNode       = new StoryNode(sqlRepository, sqlRepository.GetElementByID(activity.ElementID));
                            ActivityNodeTabsForm activityNodeDialog = new ActivityNodeTabsForm(activityNode, sqlRepository);
                            return(true);
                        }
                    }
                    //sqlRepository.ReloadDiagram(actDiag.DiagramID);
                }
                else if (TGGModelingMain.TggRulesDiagramMetatype.Contains(actDiag.MetaType) && ot == EA.ObjectType.otMethod)
                {
                    EA.TaggedValue aTag       = null;
                    EA.Element     methParent = repository.GetElementByID(meth.ParentID);
                    EA.Element     container  = null;
                    foreach (EA.Element sdmContainer in methParent.Elements)
                    {
                        if (sdmContainer.Stereotype == SDMModelingMain.SdmContainerStereotype)
                        {
                            aTag = EAEcoreAddin.Util.EAUtil.findTaggedValue(sdmContainer, SDMModelingMain.SDMContainerAssociatedMethodTaggedValueName);
                            if (aTag.Value == meth.MethodGUID.ToString())
                            {
                                container = sdmContainer;
                                break;
                            }
                        }
                    }
                    EA.Diagram sdmDiagg = null;
                    if (container != null)
                    {
                        foreach (EA.Diagram sdmDiag in container.Diagrams)
                        {
                            sdmDiagg = sdmDiag;
                            repository.OpenDiagram(sdmDiag.DiagramID);
                            return(true);
                        }
                    }
                    if (sdmDiagg == null && container == null)  // no SDM Diagram exists
                    {
                        if (methParent.Stereotype == TGGModelingMain.TggRuleStereotype)
                        {
                            createStoryDiagram(meth, repository, actDiag);
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
        private void onTggLvDoubleClicked(SQLRepository sqlRepository, SQLConnector doubleClickedConnector)
        {
            TGGLinkVariable tggLv = new TGGLinkVariable(doubleClickedConnector, sqlRepository);

            this.LinkVariableDialog = new LinkVariablePropertiesForm(tggLv, sqlRepository, true);
        }