public static void AddSubProcessToOverView(SubProcessBase element, ModelBusReference oldValue, ModelBusReference newValue) { string fileName = Utilities.GetFileNameForStore(element.Store); if (fileName == "") return; //get modelbus, adapters and create reference based on from activity in sub-process diagram IModelBus modelBus = element.Store.GetService(typeof(SModelBus)) as IModelBus; ModelBusAdapterManager manager = modelBus.FindAdapterManagers(fileName).First(); //reference to Sub-Process Diagram ModelBusReference referenceToSubProcessDiagram = manager.CreateReference(fileName); //reference to Activity initiating the ModelBusReference fromSubProcessActivityRef; using (ModelBusAdapter adapter = modelBus.CreateAdapter(referenceToSubProcessDiagram)) fromSubProcessActivityRef = adapter.GetElementReference(element); ProcessOverview.Process targetOverviewProc = null; ProcessOverview.SubProcessElement targetOverviewSubProc = null; ProcessOverview.Process oldOverviewProc = null; //ProcessOverview.SubProcess oldSubProc = null; if (oldValue != null) { using (ModelBusAdapter adapterRef = modelBus.CreateAdapter(oldValue)) { if (adapterRef != null) { ModelBusView viewOld = adapterRef.GetDefaultView(); Diagram targetOldDiagram = ((StandardVsModelingDiagramView)viewOld).Diagram; //Delete old Subprocess Shape & element if (targetOldDiagram.ModelElement != null) { oldOverviewProc = (ProcessOverview.Process)targetOldDiagram.ModelElement; if (element.ProcessOverviewSubProcessRef != null) { //oldSubProc = (ProcessOverview.SubProcess)adapterRef.ResolveElementReference(element.SubProcessRef); using (Transaction t = targetOldDiagram.Store.TransactionManager.BeginTransaction("Delete Old Item")) { //if (oldSubProc != null) //{ IEnumerable<ProcessOverview.SubProcessShape> subProcShapes = targetOldDiagram.NestedChildShapes.Where(s => s is ProcessOverview.SubProcessShape && ((ProcessOverview.SubProcessElement)s.ModelElement).VisioId == element.VisioId).Cast<ProcessOverview.SubProcessShape>(); for (int x = 0; x < subProcShapes.Count(); x++) { if (newValue == null || newValue != oldValue) { subProcShapes.ElementAt(x).Delete(); } else { //targetSubProc = oldSubProc; targetOverviewProc = oldOverviewProc; } } t.Commit(); //} } using (Transaction t = element.Store.TransactionManager.BeginTransaction("Init Items")) { element.ProcessOverviewSubProcessRef = null; element.ProcessRef = null; t.Commit(); } } } } } } if (newValue != null) { using (ModelBusAdapter adapterExternalRef = modelBus.CreateAdapter(newValue)) { if (adapterExternalRef != null) { ModelBusView view = adapterExternalRef.GetDefaultView(); Diagram targetDiagram = ((StandardVsModelingDiagramView)view).Diagram; //Get Process overview diagram based on target diagram targetOverviewProc = (ProcessOverview.Process)targetDiagram.ModelElement; using (Transaction t = targetDiagram.Store.TransactionManager.BeginTransaction("Create New Item")) { if (newValue != null && newValue != oldValue) { //Instantiate Process Overview Sub-Process Model based on sub-process diagram file details targetOverviewSubProc = new ProcessOverview.SubProcessElement(targetDiagram.Partition) { SubProcessRef = fromSubProcessActivityRef, Name = element.SubProcessName, VisioId = string.IsNullOrEmpty(element.VisioId) ? element.Id.ToString() : element.VisioId }; //set the visioid of the targetOverviewSubProc to it's id //targetOverviewSubProc.VisioId = targetOverviewSubProc.Id.ToString(); ModelBusAdapter adapterForSubProcessDiagram = modelBus.CreateAdapter(referenceToSubProcessDiagram); //TODO: check this //checking whether the sub-process activity already exists in the process overview //if (targetOverviewProc.BTSubProcess.Where(p => p.SubProcessRef == adapterForSubProcessDiagram.GetElementReference(element)).Count() > 0) //need to figure out what must happen //right now assuming that if a shape and model exists, do nothing if (targetOverviewProc.BTSubProcess.Where(p => p.SubProcessRef == adapterForSubProcessDiagram.GetElementReference(element)).Count() == 0) { //add sub process instantiation to sub process collection in process overview targetOverviewProc.BTSubProcess.Add(targetOverviewSubProc); //create shape to add to process overview diagram var shape = new ProcessOverview.SubProcessShape(targetDiagram.Partition); //link sub-process model instantiation to the shape shape.ModelElement = targetOverviewSubProc; //Todo: Get location of linked activity and do placement shape.AbsoluteBounds = new Microsoft.VisualStudio.Modeling.Diagrams.RectangleD(new PointD(2, 2), new SizeD(2, 0.75)); //Add shape to the process overview diagram if (targetDiagram.NestedChildShapes.Where(s => s == shape).Count() == 0) targetDiagram.NestedChildShapes.Add(shape); } } else { targetOverviewSubProc.Name = element.SubProcessName; targetOverviewSubProc.VisioId = string.IsNullOrEmpty(element.VisioId) ? element.Id.ToString() : element.VisioId; } t.Commit(); } using (Transaction t = element.Store.TransactionManager.BeginTransaction("Update Sub Process Reference")) { element.ProcessOverviewSubProcessRef = adapterExternalRef.GetElementReference(targetOverviewSubProc); element.ProcessRef = newValue; t.Commit(); } } } } }
public static void AddReferencedSubProcesses(SubProcessBase element, ModelBusReference newValue) { string fileName = Utilities.GetFileNameForStore(element.Store); if (fileName == "") return; ProcessOverview.Process targetProc = null; ProcessOverview.SubProcessElement targetSubProc = null; ModelBusReference fromSubProcessActRef = null; SubProcess fromSubProcess = null; ModelBusReference mbr = null; IModelBus modelBus = element.Store.GetService(typeof(SModelBus)) as IModelBus; ModelBusAdapterManager manager = modelBus.FindAdapterManagers(fileName).First(); ModelBusReference reference = manager.CreateReference(fileName); List<Activity> subProcActs = new List<Activity>(); //Get List of sub process activities in this diagram that reference another sub process subProcActs.AddRange(element.Activities.Where(a => a is ToProcessConnector || a is FromProcessConnector)); foreach (var item in subProcActs) { if (item is ToProcessConnector) mbr = ((ToProcessConnector)item).ToProcessConnectorRef; else mbr = ((FromProcessConnector)item).FromProcessConnectorRef; using (ModelBusAdapter adapter = modelBus.CreateAdapter(mbr)) { ModelBusView view = adapter.GetDefaultView(); Diagram targetDiagram = ((StandardVsModelingDiagramView)view).Diagram; fromSubProcess = (SubProcess)targetDiagram.ModelElement; fromSubProcessActRef = adapter.GetElementReference(fromSubProcess); } using (Transaction tt = fromSubProcess.Store.TransactionManager.BeginTransaction("Update Linked Sub Process Reference")) { string fileNameItem = Utilities.GetFileNameForStore(item.Store); IModelBus modelBusItem = item.Store.GetService(typeof(SModelBus)) as IModelBus; ModelBusAdapterManager managerItem = modelBusItem.FindAdapterManagers(fileNameItem).First(); ModelBusReference referenceItem = managerItem.CreateReference(fileNameItem); using (ModelBusAdapter adapterItem = modelBus.CreateAdapter(referenceItem)) { ModelBusReference oldProcRef = fromSubProcess.ProcessRef; if (oldProcRef != null) { using (ModelBusAdapter oldItemAdapter = modelBus.CreateAdapter(oldProcRef)) { ModelBusView oldView = oldItemAdapter.GetDefaultView(); Diagram oldDiagram = ((StandardVsModelingDiagramView)oldView).Diagram; if (oldDiagram.ModelElement != null) { using (Transaction ttt = oldDiagram.Store.TransactionManager.BeginTransaction("Delete Old Item")) { ProcessOverview.Process oldProc = (ProcessOverview.Process)oldDiagram.ModelElement; //Delete old items in old diagram IEnumerable<ProcessOverview.SubProcessElement> listOldSubProc = oldProc.BTSubProcess.Where(s => s.VisioId == fromSubProcess.VisioId || s.VisioId == item.VisioId); for (int x = 0; x < listOldSubProc.Count(); x++) { listOldSubProc.ElementAt(x).Delete(); } ttt.Commit(); } } } } fromSubProcess.ProcessOverviewSubProcessRef = adapterItem.GetElementReference(item.SubProcess); fromSubProcess.ProcessRef = item.SubProcess.ProcessRef; } tt.Commit(); } if (newValue != null) { Diagram targetDiagram; using (ModelBusAdapter targetAdapter = modelBus.CreateAdapter(newValue)) { ModelBusView view = targetAdapter.GetDefaultView(); targetDiagram = ((StandardVsModelingDiagramView)view).Diagram; } targetProc = (ProcessOverview.Process)targetDiagram.ModelElement; using (Transaction t = targetDiagram.Store.TransactionManager.BeginTransaction("Create New Item")) { using (ModelBusAdapter adapter2 = modelBus.CreateAdapter(reference)) { //Delete old items in new diagram if exist IEnumerable<ProcessOverview.SubProcessElement> listTargetSubProc = targetProc.BTSubProcess.Where(s => s.VisioId == fromSubProcess.VisioId); for (int x = 0; x < listTargetSubProc.Count(); x++) { listTargetSubProc.ElementAt(x).Delete(); } targetSubProc = new ProcessOverview.SubProcessElement(targetDiagram.Partition) { SubProcessRef = fromSubProcessActRef, Name = fromSubProcess.SubProcessName, VisioId = fromSubProcess.VisioId }; if (targetProc.BTSubProcess.Where(s => s.VisioId == targetProc.VisioId).Count() == 0) { targetProc.BTSubProcess.Add(targetSubProc); var shape = new ProcessOverview.SubProcessShape(targetDiagram.Partition); shape.ModelElement = targetSubProc; //Todo: Get location of linked activity and do placement shape.AbsoluteBounds = new Microsoft.VisualStudio.Modeling.Diagrams.RectangleD(new PointD(2, 2), new SizeD(2, 0.75)); targetDiagram.NestedChildShapes.Add(shape); } } t.Commit(); } } } }