using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using log4net; using Common; using SharedDatabase.Entities; using SharedDatabase.Forms; using WorkflowConfigurator.Resources; using NHibernate; namespace WorkflowConfigurator.UserControls { public partial class OverviewOfProcessesCtrl : UserControl { static readonly ILog log = LogManager.GetLogger(typeof(OverviewOfProcessesCtrl)); MainWnd parent; IList allProcesses; /// /// Default constructor used by designer only. /// private OverviewOfProcessesCtrl() { InitializeComponent(); } /// /// Constructor used in runtime, the control is created and added to the tab page dunamically by code. /// /// Parent public OverviewOfProcessesCtrl(MainWnd parent) : this() { this.parent = parent; Dock = DockStyle.Fill; allProcesses = new List(); editProcessCtrl.OverviewCtrl = this; } private void OverviewOfProcessesCtrl_Load(object sender, EventArgs e) { if (parent != null) { Localize(); Settings2UI(); ((Form)parent).Closing += new CancelEventHandler(ParentClosing); allProcesses = SharedDatabase.TracingDB.Session.QueryOver().OrderBy(x => x.Name).Asc.List(); ; RedrawLeftPane(RedrawType.FromScratch, null); editProcessCtrl.UpdateProcess(null, Reason.OpenProcess, allProcesses); } } private void settingsButton_Click(object sender, EventArgs e) { GID[] rqrdMmbrshp = Program.SettingsAccessLevel; /// if (CurrentUser.IsMemberOf(rqrdMmbrshp) || new LoginDlg(rqrdMmbrshp, null).ShowDialog() == DialogResult.OK) { MainWnd.PrintTitle(false); new Forms.SettingsDlg().ShowDialog(); /// Logged in => Show settings dialog } } private void allListBox_SelectedIndexChanged(object sender, EventArgs e) { /// TODO: Check whether the process really changed int selectedIx = allListBox.SelectedIndex; Process selectedProcess = (selectedIx >= 0) ? (allListBox.Items[selectedIx] as Process) : null; if (selectedProcess != editProcessCtrl.Process) { switch (editProcessCtrl.FinishEditing()) { case EditFinishedInfo.Cancel: /// Continue editing, redraw left pane so that the previously selected item is selected again RedrawLeftPane(RedrawType.FromScratch, editProcessCtrl.Process); break; case EditFinishedInfo.DataChanged: /// Left pane might have been changed => redraw it editProcessCtrl.UpdateProcess(selectedProcess, Reason.OpenProcess, allProcesses); RedrawLeftPane(RedrawType.FromScratch, selectedProcess); break; default: editProcessCtrl.UpdateProcess(selectedProcess, Reason.OpenProcess, allProcesses); break; } } } private void checkBox6_CheckedChanged(object sender, EventArgs e) { AnyFilterChanged(); } private void checkBox7_CheckedChanged(object sender, EventArgs e) { AnyFilterChanged(); } private void checkBox8_CheckedChanged(object sender, EventArgs e) { AnyFilterChanged(); } private void checkBox9_CheckedChanged(object sender, EventArgs e) { AnyFilterChanged(); } private void nameContainsTextBox_TextChanged(object sender, EventArgs e) { AnyFilterChanged(); } void AnyFilterChanged() { RedrawLeftPane(RedrawType.FromScratch, editProcessCtrl.Process); } void ParentClosing(object sender, CancelEventArgs e) { if (editProcessCtrl.FinishEditing() == EditFinishedInfo.Cancel) { e.Cancel = true; return; } UI2Settings(); } /// /// Redraw a list of processes selected by filters. /// /// public void RedrawLeftPane(RedrawType redrawType, Process selectedProcess) { int count; if (redrawType == RedrawType.FromScratch) { allListBox.Items.Clear(); count = 0; foreach (var process in allProcesses) { if (IsProcessEnabled(process)) { allListBox.Items.Add(process); if ((selectedProcess != null) && (selectedProcess == process)) { allListBox.SetSelected(count, true); } count++; } } } else { /// Not supported now count = allListBox.Items.Count; } allProcessesLabel.Text = string.Format("{0} ({1})", Strings.Workflows, count); } #region Helper functions void Localize() { settingsButton.Text = Strings.Settings; newButton.Text = Strings.New_workflow; copyButton.Text = Strings.Copy_workflow; filterGroupBox.Text = Strings.Filter; checkBox6.Text = Strings.In_preparation; checkBox7.Text = Strings.Testing; checkBox8.Text = Strings.Released; checkBox9.Text = Strings.Deactivated; nameContainsGroupBox.Text = Strings.Name_contains + ':'; allProcessesLabel.Text = Strings.Workflows; } /// /// Set UI properties (determining the window position, etc) to values obtained from local settings /// void Settings2UI() { try { LocalSettings ls = Program.LocalSettings; /// checkBox6.Checked = ls.OverviewCB6; checkBox7.Checked = ls.OverviewCB7; checkBox8.Checked = ls.OverviewCB8; checkBox9.Checked = ls.OverviewCB9; nameContainsTextBox.Text = ls.OverviewNameContains; rootSplitContainer.SplitterDistance = Math.Max(rootSplitContainer.Panel1MinSize, Math.Min(rootSplitContainer.Width - rootSplitContainer.Panel2MinSize, (ls.SplDst2 > 0) ? Convert.ToInt32(ls.SplDst1 * Width) : 400)); editProcessCtrl.Settings2UI(); } catch (Exception exc) { log.ErrorFormat("Cannot restore settings: {0}", exc.Message); } } /// /// Retrieve UI properties and save them to local settings /// void UI2Settings() { LocalSettings ls = Program.LocalSettings; /// ls.OverviewCB6 = checkBox6.Checked; ls.OverviewCB7 = checkBox7.Checked; ls.OverviewCB8 = checkBox8.Checked; ls.OverviewCB9 = checkBox9.Checked; ls.OverviewNameContains = nameContainsTextBox.Text; ls.SplDst1 = (float)rootSplitContainer.SplitterDistance / (float)Width; editProcessCtrl.UI2Settings(); } /// /// Determines whether a process is enabled for display based on process.ReleaseStatus, /// process.Name and a combination of process.SubClass and checked states of checkBoxes. /// /// Process /// true when enabled bool IsProcessEnabled(Process process) { /// Display a newly created process even if it would be hidden by the filter if (process.Id == 0) { return true; } if (!string.IsNullOrEmpty(nameContainsTextBox.Text)) { /// Hide processes that do not contain a search pattern (in case there is any search patrtern) if (!process.Name.Contains(nameContainsTextBox.Text)) return false; } return ((process.ReleaseStatus == SharedDatabase.ReleaseStatus.In_preparation && checkBox6.Checked) || (process.ReleaseStatus == SharedDatabase.ReleaseStatus.ToBeApproved && checkBox7.Checked) || ((process.ReleaseStatus == SharedDatabase.ReleaseStatus.Released || process.ReleaseStatus == SharedDatabase.ReleaseStatus.ReleasedActive) && checkBox8.Checked) || (process.ReleaseStatus == SharedDatabase.ReleaseStatus.Deactivated && checkBox9.Checked)); } #endregion /// /// Find an unused process name. /// /// public string NewProcessName(string rootName) { int nameId = 1; string newName; bool nameIsUsed; do { newName = string.Format("{0} {1}", rootName, nameId++); nameIsUsed = false; foreach (var t in allProcesses) { if (t.Name.Equals(newName)) { nameIsUsed = true; break; } } } while (nameIsUsed); return newName; } private void newButton_Click(object sender, EventArgs e) { GID[] rqrdMmbrshp = EditProcessCtrl.UnlockAccessLevel; /// if (CurrentUser.IsMemberOf(rqrdMmbrshp) || new LoginDlg(rqrdMmbrshp, null).ShowDialog() == DialogResult.OK) { MainWnd.PrintTitle(false); if (editProcessCtrl.FinishEditing() == EditFinishedInfo.Cancel) return; Process newProcess = new Process(NewProcessName(Strings.Workflow)); newProcess.CreatedBy = CurrentUser.UserName(); allProcesses.Add(newProcess); editProcessCtrl.UpdateProcess(newProcess, Reason.NewProcess, allProcesses); RedrawLeftPane(RedrawType.FromScratch, newProcess); /// By this the new process will be selected } } private void copyButton_Click(object sender, EventArgs e) { MainWnd.PrintTitle(false); if ((editProcessCtrl.Process == null) || (editProcessCtrl.FinishEditing() == EditFinishedInfo.Cancel)) return; Process processCopy = editProcessCtrl.Process.Clone(NewProcessName(string.Format("{0} - {1}", editProcessCtrl.Process.Name, Strings.copy)), CurrentUser.UserName()); allProcesses.Add(processCopy); editProcessCtrl.UpdateProcess(processCopy, Reason.CopyProcess, allProcesses); RedrawLeftPane(RedrawType.FromScratch, processCopy); /// By this the copied process will be selected } private void wizardButton_Click(object sender, EventArgs e) { MainWnd.PrintTitle(false); if ((editProcessCtrl.Process == null) || (editProcessCtrl.FinishEditing() == EditFinishedInfo.Cancel)) return; Process processFromTemplate = editProcessCtrl.Process.Clone(NewProcessName(string.Format(Strings.Workflow_from_template_0, editProcessCtrl.Process.Name)), CurrentUser.UserName()); allProcesses.Add(processFromTemplate); editProcessCtrl.UpdateProcess(processFromTemplate, Reason.CopyProcess, allProcesses); RedrawLeftPane(RedrawType.FromScratch, processFromTemplate); /// By this the process created from a template will be selected editProcessCtrl.ImportPartsUsingTemplate(); } } }