using System; using System.Collections.Generic; using System.Windows.Forms; using WorkflowConfigurator.Resources; using SharedDatabase.Entities; namespace WorkflowConfigurator.UserControls { public partial class WorkstepsCtrl : UserControl, IMyUI { bool unsavedChanges; bool suppressNotifications; bool limitedUnlock; bool completeUnlock; public EditProcessCtrl EditProcessCtrl; /// Parent control reference Process currentProcess; Workstep currentWorkstep; WorkstepCtrl currentWsCtrl; string lastWorkstepName; public WorkstepsCtrl() { InitializeComponent(); Localize(); suppressNotifications = false; lastWorkstepName = string.Empty; } void Localize() { addWsButton.Text = Strings.Add; removeWsButton.Text = Strings.Remove; } public void UpdateProcess(Process process, Reason reason, IList allProcesses) { this.currentProcess = process; } /// /// Enable/disable/hide UI elements based on lock/unlock/complete unlock state /// /// true = unlock for released processes /// true = unlock for processes in preparation (complete unlock) public void UpdateLockState(bool unlock, bool completely) { limitedUnlock = unlock; completeUnlock = completely; /// Enable or disable adding/removing/reordering worksteps addWsButton.Enabled = completely; removeWsButton.Enabled = completely; workstepsTabControl.AllowDrop = completely; /// Propagate to subcontrols foreach (TabPage tp in workstepsTabControl.TabPages) { (tp.Controls[0] as IMyUI).UpdateLockState(unlock, completely); } } public void Data2UI() { suppressNotifications = true; string prefferedWorkstepName = (currentWorkstep != null) ? currentWorkstep.Name : lastWorkstepName; workstepsTabControl.TabPages.Clear(); workstepsTabControl.TabOrderChanged = false; currentWorkstep = null; currentWsCtrl = null; if ((currentProcess != null) && (currentProcess.Worksteps != null)) { /// Sort worksteps by WorkstepNr before displaying List displayedWorksteps = new List(); foreach (var ws in currentProcess.Worksteps) displayedWorksteps.Add(ws); displayedWorksteps.Sort(delegate(Workstep x, Workstep y) { return x.WorkstepNr.CompareTo(y.WorkstepNr); }); int tabIx = 0; int selectedtabIx = -1; foreach (var ws in displayedWorksteps) { WorkstepCtrl wsCtrl = AddWorkstepToTabs(ws); if (ws.Name == prefferedWorkstepName) { lastWorkstepName = prefferedWorkstepName; currentWorkstep = ws; currentWsCtrl = wsCtrl; selectedtabIx = tabIx; } else { if (currentWorkstep == null) { currentWorkstep = ws; currentWsCtrl = wsCtrl; selectedtabIx = tabIx; } } tabIx++; } if (selectedtabIx >= 0) { workstepsTabControl.SelectedIndex = selectedtabIx; } } suppressNotifications = false; } public bool VerifyUIData(out string message) { bool uiDataValid = true; message = string.Empty; foreach (TabPage tp in workstepsTabControl.TabPages) { string msg; if ((tp.Controls.Count > 0) && (tp.Controls[0] is WorkstepCtrl) && !(tp.Controls[0] as WorkstepCtrl).VerifyUIData(out msg)) { message += string.Format("{0} in workstep {1}", msg, (tp.Tag as Workstep).Name); uiDataValid = false; } } return uiDataValid; } public void UI2Data() { int workstepNr = 1; foreach (TabPage tp in workstepsTabControl.TabPages) { if ((tp.Controls.Count > 0) && (tp.Controls[0] is WorkstepCtrl)) { (tp.Controls[0] as WorkstepCtrl).UI2Data(workstepNr++); } } } public void Settings2UI() { lastWorkstepName = Program.LocalSettings.LastWorkstep; } public void UI2Settings() { Program.LocalSettings.LastWorkstep = (currentWorkstep != null) ? currentWorkstep.Name : lastWorkstepName; } public void ResetUnsavedFlag() { unsavedChanges = false; workstepsTabControl.TabOrderChanged = false; } public void SetUnsavedFlag() { if (!suppressNotifications) { unsavedChanges = true; EditProcessCtrl.SetUnsavedFlag(); } } public bool AddPartsToCurrentWorkstep(Part part) { if (currentWsCtrl != null) { return currentWsCtrl.AddPart(part); } else { return false; } } public Part RemovePartFromCurrentWorkstep() { return currentWsCtrl.RemovePart(); } /// /// Adds a new workstep tab page. /// Called from Data2UI() and addWsButton_Click() /// /// Workstep to be displayed /// Created WorkstepCtrl WorkstepCtrl AddWorkstepToTabs(Workstep ws) { TabPage tabPage = new TabPage(ws.Name); WorkstepCtrl wsCtrl = new WorkstepCtrl(this, tabPage, currentProcess, ws); wsCtrl.Dock = DockStyle.Fill; wsCtrl.UpdateLockState(limitedUnlock, completeUnlock); tabPage.Tag = ws; tabPage.Controls.Add(wsCtrl); workstepsTabControl.TabPages.Add(tabPage); return wsCtrl; } private void addWsButton_Click(object sender, EventArgs e) { int wsNr = currentProcess.Worksteps.Count + 1; Workstep ws = new Workstep(wsNr, string.Format("Workstep {0}", wsNr), currentProcess); currentProcess.Worksteps.Add(ws); WorkstepCtrl wsCtrl = AddWorkstepToTabs(ws); workstepsTabControl.SelectedIndex = wsNr - 1; lastWorkstepName = ws.Name; currentWorkstep = ws; currentWsCtrl = wsCtrl; SetUnsavedFlag(); } private void removeWsButton_Click(object sender, EventArgs e) { string wsName = workstepsTabControl.SelectedTab.Text; if (MessageBox.Show(string.Format("Do you really want to delete workstep {0}?", wsName), "", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.No) { return; } EditProcessCtrl.WorkstepsToBeDeleted.Add(currentWorkstep); currentProcess.Worksteps.Remove(currentWorkstep); workstepsTabControl.TabPages.Remove(workstepsTabControl.SelectedTab); SetUnsavedFlag(); } private void workstepsTabControl_Selected(object sender, TabControlEventArgs e) { if (e.TabPage != null) { currentWorkstep = e.TabPage.Tag as Workstep; currentWsCtrl = e.TabPage.Controls[0] as WorkstepCtrl; } if (workstepsTabControl.TabOrderChanged) { SetUnsavedFlag(); } } private void workstepsTabControl_SelectedIndexChanged(object sender, EventArgs e) { if (workstepsTabControl.SelectedTab != null) { currentWorkstep = workstepsTabControl.SelectedTab.Tag as Workstep; currentWsCtrl = workstepsTabControl.SelectedTab.Controls[0] as WorkstepCtrl; } if (workstepsTabControl.TabOrderChanged) { SetUnsavedFlag(); } } private void workstepsTabControl_MouseUp(object sender, MouseEventArgs e) { if (workstepsTabControl.TabOrderChanged) { SetUnsavedFlag(); } } private void analyzeButton_Click(object sender, EventArgs e) { new Forms.WorkflowAnalysisDlg(SharedDatabase.TracingDB.Session, currentProcess).ShowDialog(); } } }