private void ExecuteLoadDiagramCommand(object parameter) { IsBusy = true; DiagramItem wholeDiagramToLoad = null; if (SavedDiagramId == null) { messageBoxService.ShowError("You need to select a diagram to load"); return; } Task <DiagramViewModel> task = Task.Factory.StartNew <DiagramViewModel>(() => { //ensure that itemsToRemove is cleared ready for any new changes within a session itemsToRemove = new List <SelectableDesignerItemViewModelBase>(); DiagramViewModel diagramViewModel = new DiagramViewModel(); wholeDiagramToLoad = storageService.FetchDiagram((int)SavedDiagramId.Value); //load diagram items foreach (DiagramItemData diagramItemData in wholeDiagramToLoad.DesignerItems) { var designerItem = storageService.FetchDiagram(diagramItemData.ItemId); var viewModel = Activator.CreateInstance(diagramItemData.ItemType) as DesignerItemViewModelBase; viewModel.Id = designerItem.Id; viewModel.Parent = diagramViewModel; //viewModel.Left = designerItem.l //viewModel.Top = designerItem.t diagramViewModel.Items.Add(viewModel); } //load connection items foreach (int connectionId in wholeDiagramToLoad.ConnectionIds) { Connection connection = storageService.FetchConnection(connectionId); DesignerItemViewModelBase sourceItem = GetConnectorDataItem(diagramViewModel, connection.SourceId, connection.SourceType); ConnectorOrientation sourceConnectorOrientation = GetOrientationForConnector(connection.SourceOrientation); FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connection.Id, sourceItem, sourceConnectorOrientation); DesignerItemViewModelBase sinkItem = GetConnectorDataItem(diagramViewModel, connection.SinkId, connection.SinkType); ConnectorOrientation sinkConnectorOrientation = GetOrientationForConnector(connection.SinkOrientation); FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connection.Id, sinkItem, sinkConnectorOrientation); ConnectorViewModel connectionVM = new ConnectorViewModel(connection.Id, diagramViewModel, sourceConnectorInfo, sinkConnectorInfo); diagramViewModel.Items.Add(connectionVM); } return(diagramViewModel); }); task.ContinueWith((ant) => { this.DiagramViewModel = ant.Result; IsBusy = false; messageBoxService.ShowInformation(string.Format("Finished loading Diagram Id : {0}", wholeDiagramToLoad.Id)); }, TaskContinuationOptions.OnlyOnRanToCompletion); }
private void LoadPerstistDesignerItems(IDiagramItem wholeDiagramToLoad, IDiagramViewModel diagramViewModel) { //load diagram items foreach (DiagramItemData diagramItemData in wholeDiagramToLoad.DesignerItems) { if (diagramItemData.ItemType == typeof(PersistDesignerItem)) { PersistDesignerItem persistedDesignerItem = databaseAccessService.FetchPersistDesignerItem(diagramItemData.ItemId); PersistDesignerItemViewModel persistDesignerItemViewModel = new PersistDesignerItemViewModel(persistedDesignerItem.Id, diagramViewModel, persistedDesignerItem.Left, persistedDesignerItem.Top, persistedDesignerItem.ItemWidth, persistedDesignerItem.ItemHeight, persistedDesignerItem.HostUrl); diagramViewModel.Items.Add(persistDesignerItemViewModel); } if (diagramItemData.ItemType == typeof(SettingsDesignerItem)) { SettingsDesignerItem settingsDesignerItem = databaseAccessService.FetchSettingsDesignerItem(diagramItemData.ItemId); SettingsDesignerItemViewModel settingsDesignerItemViewModel = new SettingsDesignerItemViewModel(settingsDesignerItem.Id, diagramViewModel, settingsDesignerItem.Left, settingsDesignerItem.Top, settingsDesignerItem.ItemWidth, settingsDesignerItem.ItemHeight, settingsDesignerItem.Setting1); diagramViewModel.Items.Add(settingsDesignerItemViewModel); } if (diagramItemData.ItemType == typeof(GroupDesignerItem)) { GroupDesignerItem groupDesignerItem = databaseAccessService.FetchGroupingDesignerItem(diagramItemData.ItemId); GroupingDesignerItemViewModel groupingDesignerItemViewModel = new GroupingDesignerItemViewModel(groupDesignerItem.Id, diagramViewModel, groupDesignerItem.Left, groupDesignerItem.Top, groupDesignerItem.ItemWidth, groupDesignerItem.ItemHeight); if (groupDesignerItem.DesignerItems != null && groupDesignerItem.DesignerItems.Count > 0) { LoadPerstistDesignerItems(groupDesignerItem, groupingDesignerItemViewModel); } diagramViewModel.Items.Add(groupingDesignerItemViewModel); } } //load connection items foreach (int connectionId in wholeDiagramToLoad.ConnectionIds) { Connection connection = databaseAccessService.FetchConnection(connectionId); DesignerItemViewModelBase sourceItem = GetConnectorDataItem(diagramViewModel, connection.SourceId, connection.SourceType); ConnectorOrientation sourceConnectorOrientation = GetOrientationForConnector(connection.SourceOrientation); FullyCreatedConnectorInfo sourceConnectorInfo = GetFullConnectorInfo(connection.Id, sourceItem, sourceConnectorOrientation); DesignerItemViewModelBase sinkItem = GetConnectorDataItem(diagramViewModel, connection.SinkId, connection.SinkType); ConnectorOrientation sinkConnectorOrientation = GetOrientationForConnector(connection.SinkOrientation); FullyCreatedConnectorInfo sinkConnectorInfo = GetFullConnectorInfo(connection.Id, sinkItem, sinkConnectorOrientation); ConnectorViewModel connectionVM = new ConnectorViewModel(connection.Id, diagramViewModel, sourceConnectorInfo, sinkConnectorInfo); diagramViewModel.Items.Add(connectionVM); } }
private void SavePersistDesignerItem(IDiagramItem wholeDiagramToSave, IDiagramViewModel diagramViewModel) { //Save all PersistDesignerItemViewModel foreach (var persistItemVM in diagramViewModel.Items.OfType <PersistDesignerItemViewModel>()) { PersistDesignerItem persistDesignerItem = new PersistDesignerItem(persistItemVM.Id, persistItemVM.Left, persistItemVM.Top, persistItemVM.ItemWidth, persistItemVM.ItemHeight, persistItemVM.HostUrl); persistItemVM.Id = databaseAccessService.SavePersistDesignerItem(persistDesignerItem); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(persistDesignerItem.Id, typeof(PersistDesignerItem))); } //Save all SettingsDesignerItemViewModel foreach (var settingsItemVM in diagramViewModel.Items.OfType <SettingsDesignerItemViewModel>()) { SettingsDesignerItem settingsDesignerItem = new SettingsDesignerItem(settingsItemVM.Id, settingsItemVM.Left, settingsItemVM.Top, settingsItemVM.ItemWidth, settingsItemVM.ItemHeight, settingsItemVM.Setting1); settingsItemVM.Id = databaseAccessService.SaveSettingDesignerItem(settingsDesignerItem); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(settingsDesignerItem.Id, typeof(SettingsDesignerItem))); } //Save all GroupingDesignerItemViewModel foreach (var groupingItemVM in diagramViewModel.Items.OfType <GroupingDesignerItemViewModel>()) { GroupDesignerItem groupDesignerItem = new GroupDesignerItem(groupingItemVM.Id, groupingItemVM.Left, groupingItemVM.Top, groupingItemVM.ItemWidth, groupingItemVM.ItemHeight); if (groupingItemVM.Items != null && groupingItemVM.Items.Count > 0) { SavePersistDesignerItem(groupDesignerItem, groupingItemVM); } groupingItemVM.Id = databaseAccessService.SaveGroupingDesignerItem(groupDesignerItem); wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(groupDesignerItem.Id, typeof(GroupDesignerItem))); } //Save all connections which should now have their Connection.DataItems filled in with correct Ids foreach (var connectionVM in diagramViewModel.Items.OfType <ConnectorViewModel>()) { FullyCreatedConnectorInfo sinkConnector = connectionVM.SinkConnectorInfo as FullyCreatedConnectorInfo; Connection connection = new Connection( connectionVM.Id, connectionVM.SourceConnectorInfo.DataItem.Id, GetOrientationFromConnector(connectionVM.SourceConnectorInfo.Orientation), GetTypeOfDiagramItem(connectionVM.SourceConnectorInfo.DataItem), sinkConnector.DataItem.Id, GetOrientationFromConnector(sinkConnector.Orientation), GetTypeOfDiagramItem(sinkConnector.DataItem)); connectionVM.Id = databaseAccessService.SaveConnection(connection); wholeDiagramToSave.ConnectionIds.Add(connectionVM.Id); } }
private bool ItemsToDeleteHasConnector(List <SelectableDesignerItemViewModelBase> itemsToRemove, FullyCreatedConnectorInfo connector) { return(itemsToRemove.Contains(connector.DataItem)); }
public (IEnumerable <DesignerItemViewModelBase> items, IEnumerable <ConnectorViewModel> connectors) ToVM(DiagramViewModel dvm) { var dataItems = ActivityItems.Select(ai => { Enum.TryParse <ActivityGuardType>(Workflow.Activities.First(adef => adef.Id == ai.ActivityId).Guard, out var selectedGuard); var avm = new ActivityItemViewModel(ai.ActivityId, dvm, ai.X, ai.Y) { ActivityName = ai.ActivityName, IconPath = ai.IconPath, SelectedActivityGuardType = selectedGuard, Settings = (Workflow.Activities.First(a => a.Id == ai.ActivityId).Settings == null) ? (new System.Collections.ObjectModel.ObservableCollection <SettingInfo>()) : (new System.Collections.ObjectModel.ObservableCollection <SettingInfo>(Workflow.Activities.First(a => a.Id == ai.ActivityId).Settings?.Select(s => new SettingInfo() { Key = s.Name, Value = s.Value }))) }; return(avm); }).ToArray(); dvm.WorkflowName = Workflow.Name; //dvm.WorkflowId = Workflow.Id; int.TryParse(Workflow.Id, out var wfId); dvm.WorkflowId = wfId; dvm.WorkflowDescription = Workflow.Description; dvm.WorkflowSettings = new System.Collections.ObjectModel.ObservableCollection <SettingInfo>(Workflow.Settings.Select(s => new SettingInfo() { Key = s.Name, Value = s.Value })); var connectors = new List <ConnectorViewModel>(); foreach (var c in ConnectorItems) { if (c.SourceId == -1) { continue; // start transition, specially handled } if (c.TargetId == -999) { continue; //unfinished transition, ignore } var fcciSrc = new FullyCreatedConnectorInfo(dataItems.Where(di => di.Id == c.SourceId).FirstOrDefault(), c.SourceOrientation); var fcciTgt = new FullyCreatedConnectorInfo(dataItems.Where(di => di.Id == c.TargetId).FirstOrDefault(), c.TargetOrientation); var cvm = new ConnectorViewModel(c.ConnectorId, fcciSrc.DataItem.Parent, fcciSrc, fcciTgt) { SourceA = c.SourceA, SourceB = c.SourceB, EndPoint = c.EndPoint, Area = c.Area, ConnectionPoints = c.Points, ConditionText = Workflow.Transitions.FirstOrDefault(t => t.Id == c.ConnectorId)?.ConditionText }; connectors.Add(cvm); } var vm = (dataItems, connectors); foreach (var di in dataItems) { foreach (var connector in connectors) { var src = connector.SourceConnectorInfo; var tgt = connector.SinkConnectorInfo as FullyCreatedConnectorInfo; if (src.DataItem == di) { var orientation = src.Orientation; switch (orientation) { case ConnectorOrientation.None: throw new Exception("Bad Orientation found on connector source"); case ConnectorOrientation.Left: di.LeftConnector = src; break; case ConnectorOrientation.Top: di.TopConnector = src; break; case ConnectorOrientation.Right: di.RightConnector = src; break; case ConnectorOrientation.Bottom: di.BottomConnector = src; break; default: break; } } if (tgt.DataItem.Id == di.Id) { var orientation = tgt.Orientation; switch (orientation) { case ConnectorOrientation.None: throw new Exception("Bad Orientation found on connector target"); case ConnectorOrientation.Left: di.LeftConnector = tgt; break; case ConnectorOrientation.Top: di.TopConnector = tgt; break; case ConnectorOrientation.Right: di.RightConnector = tgt; break; case ConnectorOrientation.Bottom: di.BottomConnector = tgt; break; default: break; } } } } return(vm); }
private void ExecuteSaveDiagramCommand(object parameter) { if (!DiagramViewModel.Items.Any()) { messageBoxService.ShowError("There must be at least one item in order save a diagram"); return; } IsBusy = true; DiagramItem wholeDiagramToSave = null; Task <int> task = Task.Factory.StartNew <int>(() => { if (SavedDiagramId != null) { int currentSavedDiagramId = (int)SavedDiagramId.Value; wholeDiagramToSave = storageService.FetchDiagram(currentSavedDiagramId); //If we have a saved diagram, we need to make sure we clear out all the removed items that //the user deleted as part of this work sesssion foreach (var itemToRemove in itemsToRemove) { DeleteFromDatabase(wholeDiagramToSave, itemToRemove); } //start with empty collections of connections and items, which will be populated based on current diagram wholeDiagramToSave.ConnectionIds = new List <int>(); wholeDiagramToSave.DesignerItems = new List <DiagramItemData>(); } else { wholeDiagramToSave = new DiagramItem(); } //ensure that itemsToRemove is cleared ready for any new changes within a session itemsToRemove = new List <SelectableDesignerItemViewModelBase>(); foreach (var model in DiagramViewModel.Items) { DiagramItemData item = new DiagramItemData(model.Id, model.GetType()); storageService.SaveDiagramItem(item); wholeDiagramToSave.DesignerItems.Add(item); } //Save all connections which should now have their Connection.DataItems filled in with correct Ids foreach (var connectionVM in DiagramViewModel.Items.OfType <ConnectorViewModel>()) { FullyCreatedConnectorInfo sinkConnector = connectionVM.SinkConnectorInfo as FullyCreatedConnectorInfo; Connection connection = new Connection( connectionVM.Id, connectionVM.SourceConnectorInfo.DataItem.Id, GetOrientationFromConnector(connectionVM.SourceConnectorInfo.Orientation), GetTypeOfDiagramItem(connectionVM.SourceConnectorInfo.DataItem), sinkConnector.DataItem.Id, GetOrientationFromConnector(sinkConnector.Orientation), GetTypeOfDiagramItem(sinkConnector.DataItem)); connectionVM.Id = storageService.SaveConnection(connection); wholeDiagramToSave.ConnectionIds.Add(connectionVM.Id); } wholeDiagramToSave.Id = storageService.SaveDiagram(wholeDiagramToSave); return(wholeDiagramToSave.Id); }); task.ContinueWith((ant) => { int wholeDiagramToSaveId = ant.Result; if (!savedDiagrams.Contains(wholeDiagramToSaveId)) { List <int> newDiagrams = new List <int>(savedDiagrams); newDiagrams.Add(wholeDiagramToSaveId); SavedDiagrams = newDiagrams; } IsBusy = false; messageBoxService.ShowInformation(string.Format("Finished saving Diagram Id : {0}", wholeDiagramToSaveId)); }, TaskContinuationOptions.OnlyOnRanToCompletion); }