using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using Comal.Classes; using InABox.Configuration; using InABox.Core; using InABox.DynamicGrid; using InABox.WPF; using PRSDesktop.Utils; using Syncfusion.Windows.Controls.Grid; namespace PRSDesktop { /// /// Interaction logic for SetoutStagesPanel.xaml /// public partial class SetoutStagesPanel : UserControl { private readonly List _stages = new(); private Type _type; private FactorySetup settings; public SetoutStagesPanel() { InitializeComponent(); Grid.Model.RowCount = 1; Grid.Model.ColumnCount = 7; Grid.Model.ColumnWidths[0] = 20; Grid.Model.ColumnWidths[1] = 20; Grid.Model.ColumnWidths[2] = Grid.ActualWidth - 150; Grid.Model.ColumnWidths[3] = 50; Grid.Model.ColumnWidths[4] = 20; Grid.Model.ColumnWidths[5] = 20; Grid.Model.ColumnWidths[6] = 20; Grid.Model.HeaderColumns = 0; } private IStageTemplate CreateStage() { return (IStageTemplate)Activator.CreateInstance(_type); } public IList GetStages() where T : IStageTemplate { var result = new List(); foreach (var stage in _stages) result.Add((T)stage); return result; } public void SetStages(IList stages) where T : IStageTemplate { settings = new GlobalConfiguration().Load(); _stages.Clear(); foreach (IStageTemplate stage in stages) _stages.Add(stage); _type = typeof(T); Grid.Model.RowCount = 0; Grid.Model.RowCount = _stages.Count + 2; } private void Grid_SizeChanged(object sender, SizeChangedEventArgs e) { Grid.Model.ColumnWidths[2] = e.NewSize.Width - 150; } private void Grid_QueryCellInfo(object sender, GridQueryCellInfoEventArgs e) { try { var row = e.Cell.RowIndex - 1; var col = e.Cell.ColumnIndex; switch (col) { case 0: if (row != 0 && row < _stages.Count) GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.uparrow, Grid.Model, col); else GridUtils.SetButtonImage(e.Style, null, Grid.Model, col); break; case 1: if (row < _stages.Count - 1) GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.downarrow, Grid.Model, col); else GridUtils.SetButtonImage(e.Style, null, Grid.Model, col); break; case 2: if (row == -1) { e.Style.CellValue = "Section Name"; } else { e.Style.CellType = "ComboBox"; var sections = new List(); sections.AddRange(settings.Sections); if (row == _stages.Count) sections.Add(new FactorySection { ID = Guid.Empty, Name = "Add new..", Stations = 0 }); e.Style.ItemsSource = sections .Select(x => new { x.ID, Name = !string.IsNullOrEmpty(x.Group) ? x.Group + " : " + x.Name : x.Name }).ToList(); e.Style.DropDownStyle = GridDropDownStyle.AutoComplete; e.Style.DisplayMember = "Name"; e.Style.ValueMember = "ID"; e.Style.CellValue = row < _stages.Count ? _stages[row].SectionID : Guid.Empty; } e.Style.VerticalAlignment = VerticalAlignment.Center; break; case 3: e.Style.CellValue = row == -1 ? "Time" : row < _stages.Count ? _stages[row].Minutes.ToString() : ""; e.Style.HorizontalAlignment = HorizontalAlignment.Center; e.Style.VerticalAlignment = VerticalAlignment.Center; break; case 4: if (row == -1) { GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.quality, Grid.Model, col); } else if (row < _stages.Count) { if (!string.IsNullOrWhiteSpace(_stages[row].QualityChecks)) GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.quality, Grid.Model, col); else GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.quality.AsGrayScale(), Grid.Model, col); } else { GridUtils.SetButtonImage(e.Style, null, Grid.Model, col); } break; case 5: if (row == -1) { GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.link, Grid.Model, col); } else if (row < _stages.Count) { if (_stages[row].Sequence == SequenceType.Consolidate) GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.milestone, Grid.Model, col); else if (_stages[row].Sequence == SequenceType.Link) GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.link, Grid.Model, col); else GridUtils.SetButtonImage(e.Style, null, Grid.Model, col); } else { GridUtils.SetButtonImage(e.Style, null, Grid.Model, col); } break; case 6: if (row < _stages.Count) GridUtils.SetButtonImage(e.Style, PRSDesktop.Resources.delete, Grid.Model, col); else GridUtils.SetButtonImage(e.Style, null, Grid.Model, col); break; } } catch (Exception err) { Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", err.Message, err.StackTrace)); } } private void Grid_CommitCellInfo(object sender, GridCommitCellInfoEventArgs e) { IStageTemplate stage; if (e.Style.RowIndex > _stages.Count) { stage = CreateStage(); stage.Sequence = SequenceType.Link; _stages.Add(stage); } else { stage = _stages[e.Style.RowIndex - 1]; } switch (e.Cell.ColumnIndex) { case 2: stage.SectionID = (Guid)e.Style.CellValue; break; case 3: stage.Minutes = Convert.ToInt32(e.Style.CellValue.ToString()); break; } Grid.Model.RowCount = 0; Grid.Model.RowCount = _stages.Count + 2; } private void Grid_CellClick(object sender, GridCellClickEventArgs e) { var row = e.RowIndex - 1; if (row > -1 && row < _stages.Count) { var stage = _stages[row]; switch (e.ColumnIndex) { case 0: if (row > 0) { _stages.Remove(stage); _stages.Insert(row - 1, stage); e.Handled = true; } break; case 1: if (e.RowIndex < settings.Sections.Count - 1) { _stages.Remove(stage); _stages.Insert(row + 1, stage); e.Handled = true; } break; case 4: var form = new NotesForm { Caption = "Please enter the Quality Checks to be performed before starting work on this stage", Text = _stages[row].QualityChecks }; if (form.ShowDialog() == true) _stages[row].QualityChecks = form.Text; e.Handled = true; break; case 5: switch (_stages[row].Sequence) { case SequenceType.None: _stages[row].Sequence = SequenceType.Link; break; case SequenceType.Link: _stages[row].Sequence = SequenceType.Consolidate; break; case SequenceType.Consolidate: _stages[row].Sequence = SequenceType.None; break; } e.Handled = true; break; case 6: _stages.Remove(stage); e.Handled = true; break; } if (e.Handled) { Grid.Model.RowCount = 0; Grid.Model.RowCount = _stages.Count + 2; } } } } }