286 lines
9.0 KiB
C#
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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|