private void Application_MarkerEvent(Application application, int sequence, string context)
        {
            if (application.ActiveDocument.Template.Contains(Information.TemplateName))
            {
                try
                {
                    Selection selection = Application.ActiveWindow.Selection; //event must originate from selected element

                    foreach (Shape s in selection)
                    {
                        if (s.CellExistsU[VisioFormulas.Cell_RationallyType, (short)VisExistsFlags.visExistsAnywhere] == Constants.CellExists)
                        {
                            string identifier = context;
                            if (context.Contains("."))
                            {
                                identifier = context.Split('.')[1];
                                context    = context.Split('.')[0];
                            }
                            Log.Debug("Marker event being handled for: " + s.Name);
                            MarkerEventHandlerRegistry.HandleEvent(s.CellsU[VisioFormulas.Cell_RationallyType].ResultStr[VisioFormulas.Value] + "." + context, s, identifier);
                            ContextMenuEventHandler.Instance.OnContextMenuEvent(application, sequence, context);
                        }
                    }
                }
                catch (COMException e)
                {
                    Log.Error("COMExeption occured:" + e.Message);
                    Log.Error("source: " + e.Source);
                    Log.Error("error code:" + e.ErrorCode);
                    Log.Error("inner exception:\n" + e.InnerException?.StackTrace);
#if DEBUG
                    throw;
#endif
                }
                catch (Exception ex)
                {
                    Log.Error(ex, ex);
#if DEBUG
                    throw;
#endif
                }
            }
        }
        private void Application_ShapeAddedEvent(Shape s)
        {
            Log.Debug("Shape added with name: " + s.Name);
            if (s.Document.Template.Contains(Information.TemplateName) && (s.CellExistsU[VisioFormulas.Cell_RationallyType, (short)VisExistsFlags.visExistsAnywhere] == Constants.CellExists) && !View.ExistsInTree(s))
            {
                try
                {
                    switch (s.CellsU[VisioFormulas.Cell_RationallyType].ResultStr[VisioFormulas.Value])
                    {
                    case "alternativeAddStub":
                        if (!Application.IsUndoingOrRedoing)
                        {
                            int scopeId = Application.BeginUndoScope(Messages.Scope_AddAlternative);
                            s.Delete();
                            AlternativesContainer alternativesContainer = Globals.RationallyAddIn.View.Children.FirstOrDefault(ch => ch is AlternativesContainer) as AlternativesContainer;
                            alternativesContainer?.AddAlternative("Title", default(AlternativeState).GetName());

                            Application.EndUndoScope(scopeId, true);
                        }
                        break;

                    case "forceAddStub":
                        if (!Application.IsUndoingOrRedoing)
                        {
                            int scopeId = Application.BeginUndoScope(Messages.Scope_AddForce);
                            s.Delete();
                            MarkerEventHandlerRegistry.HandleEvent("forces.add", null, null);
                            Application.EndUndoScope(scopeId, true);
                        }
                        break;

                    case "relatedDocumentAddStub":
                        if (!Application.IsUndoingOrRedoing)
                        {
                            int scopeId = Application.BeginUndoScope(Messages.Scope_AddFile);
                            s.Delete();
                            MarkerEventHandlerRegistry.HandleEvent("relatedDocuments.addRelatedFile", null, null);
                            Application.EndUndoScope(scopeId, true);
                        }
                        break;

                    case "relatedUrlAddStub":
                        if (!Application.IsUndoingOrRedoing)
                        {
                            int scopeId = Application.BeginUndoScope(Messages.Scope_AddUrl);
                            s.Delete();
                            MarkerEventHandlerRegistry.HandleEvent("relatedDocuments.addRelatedUrl", null, null);
                            Application.EndUndoScope(scopeId, true);
                        }
                        break;

                    case "stakeholderAddStub":
                        if (!Application.IsUndoingOrRedoing)
                        {
                            int scopeId = Application.BeginUndoScope(Messages.Scope_AddStakeholder);
                            s.Delete();
                            StakeholdersContainer stakeholdersContainer = View.Children.FirstOrDefault(ch => ch is StakeholdersContainer) as StakeholdersContainer;
                            stakeholdersContainer?.AddStakeholder("<<name>>", "<<role>>");

                            Application.EndUndoScope(scopeId, true);
                        }
                        break;

                    case "planningItemStub":
                        if (!Application.IsUndoingOrRedoing)
                        {
                            int scopeId = Application.BeginUndoScope(Messages.Scope_AddPlanningItem);
                            s.Delete();
                            PlanningContainer planningContainer = View.Children.FirstOrDefault(ch => ch is PlanningContainer) as PlanningContainer;
                            planningContainer?.AddPlanningItem();

                            Application.EndUndoScope(scopeId, true);
                        }
                        break;

                    default:
                        View.AddToTree(s, true);
                        break;
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex, ex);
#if DEBUG
                    throw;
#endif
                }
            }
        }
        private static void RegisterMarkerEventHandlers()
        {
            MarkerEventHandlerRegistry.Register("alternatives.add", new AddAlternativeEventHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocuments}.addRelatedFile", new AddRelatedDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentContainer}.addRelatedFile", new AddRelatedDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrlUrl}.addRelatedFile", new AddRelatedDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrl}.addRelatedFile", new AddRelatedDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedFile}.addRelatedFile", new AddRelatedDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentTitle}.addRelatedFile", new AddRelatedDocumentHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocuments}.addRelatedUrl", new AddRelatedUrlHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentContainer}.addRelatedUrl", new AddRelatedUrlHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrlUrl}.addRelatedUrl", new AddRelatedUrlHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrl}.addRelatedUrl", new AddRelatedUrlHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedFile}.addRelatedUrl", new AddRelatedUrlHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentTitle}.addRelatedUrl", new AddRelatedUrlHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentContainer}.moveUp", new MoveUpDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrlUrl}.moveUp", new MoveUpDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrl}.moveUp", new MoveUpDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedFile}.moveUp", new MoveUpDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentTitle}.moveUp", new MoveUpDocumentHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentContainer}.moveDown", new MoveDownDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrlUrl}.moveDown", new MoveDownDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrl}.moveDown", new MoveDownDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedFile}.moveDown", new MoveDownDocumentHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentTitle}.moveDown", new MoveDownDocumentHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentContainer}.delete", new MarkerDeleteRelatedDocumentEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrlUrl}.delete", new MarkerDeleteRelatedDocumentEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedUrl}.delete", new MarkerDeleteRelatedDocumentEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedFile}.delete", new MarkerDeleteRelatedDocumentEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeRelatedDocumentTitle}.delete", new MarkerDeleteRelatedDocumentEventHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternative}.add", new AddAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeState}.add", new AddAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeIdentifier}.add", new AddAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeTitle}.add", new AddAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeDescription}.add", new AddAlternativeEventHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternative}.delete", new MarkerDeleteAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeState}.delete", new MarkerDeleteAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeIdentifier}.delete", new MarkerDeleteAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeTitle}.delete", new MarkerDeleteAlternativeEventHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeDescription}.delete", new MarkerDeleteAlternativeEventHandler());

            // MarkerEventHandlerRegistry.Register("alternativeState.change", new EditAlternativeStateEventHandler());
            MarkerEventHandlerRegistry.Register("relatedFile.edit", new EditRelatedFileHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternative}.moveUp", new MoveUpAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeState}.moveUp", new MoveUpAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeIdentifier}.moveUp", new MoveUpAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeTitle}.moveUp", new MoveUpAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeDescription}.moveUp", new MoveUpAlternativeHandler());

            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternative}.moveDown", new MoveDownAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeState}.moveDown", new MoveDownAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeIdentifier}.moveDown", new MoveDownAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeTitle}.moveDown", new MoveDownAlternativeHandler());
            MarkerEventHandlerRegistry.Register($"{ShapeNames.TypeAlternativeDescription}.moveDown", new MoveDownAlternativeHandler());

            MarkerEventHandlerRegistry.Register("forces.add", new AddForceHandler());
            MarkerEventHandlerRegistry.Register("forceContainer.add", new AddForceHandler());
            MarkerEventHandlerRegistry.Register("forceConcern.add", new AddForceHandler());
            MarkerEventHandlerRegistry.Register("forceValue.add", new AddForceHandler());
            MarkerEventHandlerRegistry.Register("forceDescription.add", new AddForceHandler());

            MarkerEventHandlerRegistry.Register("forceContainer.delete", new StartDeleteForceEventHandler());
            MarkerEventHandlerRegistry.Register("forceConcern.delete", new StartDeleteForceEventHandler());
            MarkerEventHandlerRegistry.Register("forceValue.delete", new StartDeleteForceEventHandler());
            MarkerEventHandlerRegistry.Register("forceDescription.delete", new StartDeleteForceEventHandler());

            MarkerEventHandlerRegistry.Register("forceContainer.moveUp", new MoveUpForceHandler());
            MarkerEventHandlerRegistry.Register("forceConcern.moveUp", new MoveUpForceHandler());
            MarkerEventHandlerRegistry.Register("forceValue.moveUp", new MoveUpForceHandler());
            MarkerEventHandlerRegistry.Register("forceDescription.moveUp", new MoveUpForceHandler());

            MarkerEventHandlerRegistry.Register("forceContainer.moveDown", new MoveDownForceHandler());
            MarkerEventHandlerRegistry.Register("forceConcern.moveDown", new MoveDownForceHandler());
            MarkerEventHandlerRegistry.Register("forceValue.moveDown", new MoveDownForceHandler());
            MarkerEventHandlerRegistry.Register("forceDescription.moveDown", new MoveDownForceHandler());

            MarkerEventHandlerRegistry.Register("informationAuthor.openWizard", new OpenWizardEventHandler());
            MarkerEventHandlerRegistry.Register("informationDate.openWizard", new OpenWizardEventHandler());
            MarkerEventHandlerRegistry.Register("informationVersion.openWizard", new OpenWizardEventHandler());
            MarkerEventHandlerRegistry.Register("decisionName.openWizard", new OpenWizardEventHandler());

            MarkerEventHandlerRegistry.Register("stakeholders.add", new AddStakeholderEventHandler());
            MarkerEventHandlerRegistry.Register("stakeholder.add", new AddStakeholderEventHandler());
            MarkerEventHandlerRegistry.Register("stakeholderName.add", new AddStakeholderEventHandler());
            MarkerEventHandlerRegistry.Register("stakeholderRole.add", new AddStakeholderEventHandler());

            MarkerEventHandlerRegistry.Register("stakeholder.delete", new StartDeleteStakeholderEventHandler());
            MarkerEventHandlerRegistry.Register("stakeholderName.delete", new StartDeleteStakeholderEventHandler());
            MarkerEventHandlerRegistry.Register("stakeholderRole.delete", new StartDeleteStakeholderEventHandler());

            MarkerEventHandlerRegistry.Register("stakeholder.moveUp", new MoveUpStakeholderHandler());
            MarkerEventHandlerRegistry.Register("stakeholderName.moveUp", new MoveUpStakeholderHandler());
            MarkerEventHandlerRegistry.Register("stakeholderRole.moveUp", new MoveUpStakeholderHandler());
            MarkerEventHandlerRegistry.Register("stakeholderRole.moveDown", new MoveDownStakeholderHandler());
            MarkerEventHandlerRegistry.Register("stakeholder.moveDown", new MoveDownStakeholderHandler());
            MarkerEventHandlerRegistry.Register("stakeholderName.moveDown", new MoveDownStakeholderHandler());

            MarkerEventHandlerRegistry.Register("planning.add", new AddPlanningItemEventHandler());
            MarkerEventHandlerRegistry.Register("planningItemTextComponent.add", new AddPlanningItemEventHandler());

            MarkerEventHandlerRegistry.Register("planningItem.moveUp", new MoveUpPlanningItemHandler());
            MarkerEventHandlerRegistry.Register("planningItemTextComponent.moveUp", new MoveUpPlanningItemHandler());
            MarkerEventHandlerRegistry.Register("planningItemTextComponent.moveDown", new MoveDownPlanningItemHandler());
            MarkerEventHandlerRegistry.Register("planningItem.moveDown", new MoveDownPlanningItemHandler());


            MarkerEventHandlerRegistry.Register("planning.delete", new MarkerDeletePlanningItemEventHandler());
            MarkerEventHandlerRegistry.Register("planningItem.delete", new MarkerDeletePlanningItemEventHandler());
            MarkerEventHandlerRegistry.Register("planningItemTextComponent.delete", new MarkerDeletePlanningItemEventHandler());
        }