// event handler pro validaci myší vytvořených linků jakožto povolených vztahů z UPMM
        private void diagram_LinkDrawn(object sender, DiagramEventArgs e)
        {
            Link link = (e.Part as Link);
            ActivityDiagramLinkData linkData = link.Data as ActivityDiagramLinkData;
            ActivityDiagramNodeData fromData = link.FromData as ActivityDiagramNodeData;
            ActivityDiagramNodeData toData   = link.ToData as ActivityDiagramNodeData;

            ChooseLinkCategory(fromData, toData, linkData);
            switch (linkData.Category)
            {
            case "Control Flow":
                CheckLink(fromData, toData, linkData);
                break;

            case "Object Flow":
                CheckLink(fromData, toData, linkData);
                break;

            case "Anchor":
                CheckLink(fromData, toData, linkData);
                break;

            default:
                (diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Remove(linkData);
                break;
            }
        }
        // event handler pro vkládání uzlu
        private void diagram_ExternalObjectsDropped(object sender, DiagramEventArgs e)
        {
            ActivityDiagramNodeData data = null;

            if ((sender as Diagram).SelectedNode == null)
            {
                data = (sender as Diagram).SelectedGroup.Data as ActivityDiagramNodeData;
            }
            else
            {
                data = (sender as Diagram).SelectedNode.Data as ActivityDiagramNodeData;
            }
            string[] categories = { Constants.UML_AD_ACTIVITY, Constants.UML_AD_OBJECT, Constants.UML_AD_SWIMLANE, Constants.UML_AD_NOTE, Constants.UML_AD_SEND_SIGNAL_ACTION, Constants.UML_AD_ACCEPT_EVENT_ACTION };
            if (data.Category == Constants.UML_AD_INITIAL_ACTIVITY /*|| data.Category == Constants.UML_AD_FINAL_ACTIVITY*/)
            {
                if ((sender as Diagram).Nodes.Where(x => (x.Data as ActivityDiagramNodeData).Category == data.Category).Count() > 1)
                {
                    diagram.Model.RemoveNode(data);
                }
            }
            else if (categories.Contains(data.Category) && !AllowDuplicateNodes)
            {
                if ((sender as Diagram).Nodes.Where(x => (x.Data as ActivityDiagramNodeData).IRI == data.IRI && (x.Data as ActivityDiagramNodeData).Category == data.Category).Count() > 1)
                {
                    diagram.Model.RemoveNode(data);
                }
            }
        }
 // metoda pro výběr typu hrany - anchor, object flow nebo control flow
 private void ChooseLinkCategory(ActivityDiagramNodeData fromData, ActivityDiagramNodeData toData, ActivityDiagramLinkData linkData)
 {
     if ((fromData.Category == Constants.UML_AD_OBJECT || toData.Category == Constants.UML_AD_OBJECT) && (fromData.Category != Constants.UML_AD_NOTE && toData.Category != Constants.UML_AD_NOTE))
     {
         linkData.Category = Constants.UML_AD_OBJECT_FLOW;
     }
     else if (fromData.Category == Constants.UML_AD_NOTE || toData.Category == Constants.UML_AD_NOTE)
     {
         linkData.Category = Constants.UML_AD_ANCHOR;
     }
     else
     {
         linkData.Category = Constants.UML_AD_CONTROL_FLOW;
     }
 }
        // metoda pro validaci hran jakožto povolených vztahů z UPMM - volá mapovací pravidla z UML4UPMM
        private void CheckLink(ActivityDiagramNodeData fromData, ActivityDiagramNodeData toData, ActivityDiagramLinkData linkData)
        {
            //pokud je na některé straně hrany jeden z uzlů těchto typů, tak se hrana automaticky povoluje, jedná se o podporu toku, která není mapovaná z UPMM
            if (fromData.Category == Constants.UML_AD_INITIAL_ACTIVITY || toData.Category == Constants.UML_AD_FINAL_ACTIVITY ||
                fromData.Category == Constants.UML_AD_DECISION || toData.Category == Constants.UML_AD_DECISION ||
                fromData.Category == Constants.UML_AD_DECISION_MERGE || toData.Category == Constants.UML_AD_DECISION_MERGE ||
                fromData.Category == Constants.UML_AD_FORK || toData.Category == Constants.UML_AD_FORK ||
                fromData.Category == Constants.UML_AD_JOIN || toData.Category == Constants.UML_AD_JOIN)
            {
                linkData.Color = Constants.VALID_COLOR;
                if (linkData.Guide == null || linkData.Guide == "")
                {
                    linkData.Guide = "[Guide]";
                }
                if ((diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Where(x => x.From == linkData.From && x.To == linkData.To).Count() == 0)
                {
                    (diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Add(linkData);
                }
            }
            // jinak zkontroluj vztah z UPMM
            else
            {
                // metoda CheeckADRelationShip může vracet dvě možnosti
                // 1. null - to znamená, že je ZAPNUTÁ validace a hrana není datově obsažena v profilu
                // 2. ekvivalentní namapovaný vztah z UPMM a barvu pro hranu podle toho, jestli je hrana v profilu nebo není
                string color        = Constants.VALID_COLOR;
                string relationship = uml4upmm.CheckADRelationship(fromData.IRI, toData.IRI, ActivityDiagramPage.IsValidatingWithModel, out color);

                // možnost 1
                if (relationship == null)
                {
                    (diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Remove(linkData);
                    return;
                }
                // možnost 2
                linkData.Guide = "<<" + relationship + ">>";
                linkData.Color = color;
                if ((diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Where(x => x.From == linkData.From && x.To == linkData.To).Count() > 1)
                {
                    (diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Remove(linkData);
                }
                else if ((diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Where(x => x.From == linkData.From && x.To == linkData.To).Count() == 0)
                {
                    (diagram.LinksSource as ObservableCollection <ActivityDiagramLinkData>).Add(linkData);
                }
            }
        }