274 lines
8.5 KiB
C#
274 lines
8.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Windows.Forms;
|
|
using SharedDatabase.Entities;
|
|
using WorkflowConfigurator.Resources;
|
|
|
|
namespace WorkflowConfigurator.UserControls
|
|
{
|
|
public partial class WorkstepCtrl : UserControl, IMyUI
|
|
{
|
|
bool unsavedChanges;
|
|
bool suppressNotifications;
|
|
bool limitedUnlock;
|
|
bool completeUnlock;
|
|
|
|
WorkstepsCtrl wstepsCtrl;
|
|
TabPage tabPage;
|
|
|
|
Process process;
|
|
Workstep workstep;
|
|
|
|
/// <summary> Constructor </summary>
|
|
public WorkstepCtrl()
|
|
{
|
|
InitializeComponent();
|
|
Localize();
|
|
suppressNotifications = false;
|
|
}
|
|
|
|
public WorkstepCtrl(WorkstepsCtrl workstepsCtrl, TabPage tabPage, Process process, Workstep workstep)
|
|
: this()
|
|
{
|
|
this.wstepsCtrl = workstepsCtrl;
|
|
this.tabPage = tabPage;
|
|
this.process = process;
|
|
this.workstep = workstep;
|
|
Data2UI();
|
|
}
|
|
|
|
/// <summary> Localizes constant strings </summary>
|
|
void Localize()
|
|
{
|
|
workstepNameLabel.Text = Strings.Workstep;
|
|
workstepDescriptionLabel.Text = Strings.Description;
|
|
refPartLabel.Text = Strings.Reference_part;
|
|
}
|
|
|
|
/// <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)
|
|
{
|
|
workstepNameTextBox.Enabled = completely;
|
|
workstepDescriptionTextBox.Enabled = unlock;
|
|
refPartComboBox.Enabled = completely;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates UI elements with workstep data entities.
|
|
/// </summary>
|
|
public void Data2UI()
|
|
{
|
|
suppressNotifications = true;
|
|
|
|
workstepNameTextBox.Text = workstep.Name;
|
|
workstepDescriptionTextBox.Text = workstep.Description;
|
|
|
|
/// Show reference part, update combo box items
|
|
refPartComboBox.Items.Clear();
|
|
refPartComboBox.Items.Add(Strings._none_);
|
|
foreach (var p in process.Parts)
|
|
{
|
|
if (p.CodeLocation == SharedDatabase.CodeLocation.OnPart) refPartComboBox.Items.Add(p.ToString());
|
|
}
|
|
refPartComboBox.Text = (workstep.ReferencePart != null) ? workstep.ReferencePart.ToString() : Strings._none_;
|
|
|
|
/// Sort non-reference workstep parts before displaying
|
|
Part[] sortedParts = new Part[workstep.Parts.Count];
|
|
int i = 0;
|
|
foreach (var part in this.workstep.Parts) sortedParts[i++] = part;
|
|
Array.Sort(sortedParts, (Part part1, Part part2) => part1.StepNumber.CompareTo(part2.StepNumber));
|
|
|
|
/// Display non-reference workstep parts
|
|
listBox1.Items.Clear();
|
|
listBox2.Items.Clear();
|
|
foreach (var p in sortedParts)
|
|
{
|
|
if (p.CodeLocation == SharedDatabase.CodeLocation.OnPart)
|
|
{
|
|
listBox1.Items.Add(p);
|
|
}
|
|
else
|
|
{
|
|
listBox2.Items.Add(p);
|
|
}
|
|
}
|
|
|
|
suppressNotifications = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Validates data in UI elements.
|
|
/// </summary>
|
|
/// <param name="message">Explanation message when UI data are NOT OK and this function returns false</param>
|
|
/// <returns>true when data are OK</returns>
|
|
public bool VerifyUIData(out string message)
|
|
{
|
|
bool allValid = true;
|
|
message = string.Empty;
|
|
|
|
/// Reference part
|
|
if (!refPartComboBox.Items.Contains(refPartComboBox.Text))
|
|
{
|
|
message += string.Format(Strings.Invalid_0, Strings.Reference_part) + Environment.NewLine;
|
|
allValid = false;
|
|
}
|
|
|
|
return allValid;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates workstep data entities from UI elements.
|
|
/// </summary>
|
|
public void UI2Data()
|
|
{
|
|
UI2Data(workstep.WorkstepNr);
|
|
}
|
|
|
|
public void UI2Data(int workstepNr)
|
|
{
|
|
workstep.WorkstepNr = workstepNr;
|
|
workstep.Name = workstepNameTextBox.Text;
|
|
workstep.Description = workstepDescriptionTextBox.Text;
|
|
|
|
foreach (var part in process.Parts)
|
|
{
|
|
if (part.ToString().Equals(refPartComboBox.Text))
|
|
{
|
|
workstep.ReferencePart = part;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void UpdateProcess(Process process, Reason reason, IList<Process> allProcesses) { }
|
|
public void Settings2UI() { }
|
|
public void UI2Settings() { }
|
|
|
|
public void ResetUnsavedFlag()
|
|
{
|
|
unsavedChanges = false;
|
|
}
|
|
|
|
public void SetUnsavedFlag()
|
|
{
|
|
if (!suppressNotifications)
|
|
{
|
|
unsavedChanges = true;
|
|
wstepsCtrl.SetUnsavedFlag();
|
|
}
|
|
}
|
|
|
|
|
|
public bool AddPart(Part part)
|
|
{
|
|
if (part == null)
|
|
{
|
|
return true; /// There was no part to add = OK
|
|
}
|
|
else if (part == workstep.ReferencePart)
|
|
{
|
|
MessageBox.Show(Strings.Selected_part_is_the_reference_part_in_this_workstep,
|
|
Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Hand);
|
|
return false; /// NOK
|
|
}
|
|
else if (workstep.Parts.Contains(part))
|
|
{
|
|
MessageBox.Show(Strings.Selected_part_is_already_used_in_this_workstep,
|
|
Strings.Error, MessageBoxButtons.OK, MessageBoxIcon.Hand);
|
|
return false; /// NOK
|
|
}
|
|
|
|
part.Workstep = workstep;
|
|
workstep.Parts.Add(part);
|
|
|
|
Data2UI();
|
|
|
|
return true; /// Part added = OK
|
|
}
|
|
|
|
/// <summary>
|
|
/// Deletes a part from UI and Workstep entity.
|
|
/// Returns the part to be deleted from the DB.
|
|
/// </summary>
|
|
/// <returns>Part to be deleted from the DB</returns>
|
|
public Part RemovePart()
|
|
{
|
|
ListBox currentListBox;
|
|
|
|
if (listBox1.SelectedIndices.Count == 1 && listBox2.SelectedIndices.Count == 0)
|
|
{
|
|
currentListBox = listBox1;
|
|
}
|
|
else if (listBox1.SelectedIndices.Count == 0 && listBox2.SelectedIndices.Count == 1)
|
|
{
|
|
currentListBox = listBox2;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int ix = currentListBox.SelectedIndex;
|
|
Part partToBedeleted = currentListBox.Items[ix] as Part;
|
|
currentListBox.Items.RemoveAt(ix);
|
|
workstep.Parts.Remove(partToBedeleted);
|
|
partToBedeleted.Workstep = null;
|
|
return partToBedeleted;
|
|
}
|
|
|
|
|
|
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (suppressNotifications) return;
|
|
|
|
if (listBox1.SelectedIndices.Count == 1)
|
|
{
|
|
listBox2.SelectedIndices.Clear();
|
|
}
|
|
}
|
|
|
|
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (suppressNotifications) return;
|
|
|
|
if (listBox2.SelectedIndices.Count == 1)
|
|
{
|
|
listBox1.SelectedIndices.Clear();
|
|
}
|
|
}
|
|
|
|
private void workstepNameTextBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
if (suppressNotifications) return;
|
|
|
|
tabPage.Text = workstepNameTextBox.Text;
|
|
SetUnsavedFlag();
|
|
}
|
|
|
|
private void workstepDescriptionTextBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
if (suppressNotifications) return;
|
|
|
|
SetUnsavedFlag();
|
|
}
|
|
|
|
private void refPartComboBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
if (suppressNotifications) return;
|
|
|
|
SetUnsavedFlag();
|
|
}
|
|
|
|
private void refPartComboBox_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (suppressNotifications) return;
|
|
|
|
SetUnsavedFlag();
|
|
}
|
|
}
|
|
}
|