tbf/WorkflowConfigurator/UserControls/WorkstepsCtrl.cs
2022-01-07 12:23:23 +01:00

286 lines
9.0 KiB
C#

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<Process> allProcesses)
{
this.currentProcess = process;
}
/// <summary>
/// Enable/disable/hide UI elements based on lock/unlock/complete unlock state
/// </summary>
/// <param name="unlock">true = unlock for released processes</param>
/// <param name="completely">true = unlock for processes in preparation (complete unlock)</param>
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<Workstep> displayedWorksteps = new List<Workstep>();
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();
}
/// <summary>
/// Adds a new workstep tab page.
/// Called from Data2UI() and addWsButton_Click()
/// </summary>
/// <param name="ws">Workstep to be displayed</param>
/// <returns>Created WorkstepCtrl</returns>
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();
}
}
}