using System; using System.Collections.Generic; using System.Linq; using System.Windows; namespace DatabaseImport { public class TestObjectTemplate //: BasePropertyChanged, IComparable { // #region enums and constants public enum Tags { ChannelCountText, PossibleChannelCountText, TemplateName, TemplateDescription, TestObject, TestObjectType, TemplateAllUIChannels, TemplateZones, AvailableTestObjectTypes, TestObjectIndex, TestObjectTypeIndex, CurrentZone, CurrentZoneIndex, AreZoneControlsEnabled, TemplateAllChannels, RequiredChannels } public string LastModifiedBy { get; set; } = "N/A"; public DateTime LastModified { get; set; } = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; private int _currentZoneIndex = -1; public int CurrentZoneIndex { get => _currentZoneIndex; set { CurrentZone = value >= 0 ? TemplateZones[value] : null; _currentZoneIndex = value; } } private Zone _currentZone; public Zone CurrentZone { get => _currentZone; set { //if (null != _currentZone && _currentZone != value) { _currentZone.PropertyChanged -= CurrentZone_PropertyChanged; } _currentZone = value; //if (null != _currentZone) { _currentZone.PropertyChanged += CurrentZone_PropertyChanged; } AreZoneControlsEnabled = null != value; } } public bool AreZoneControlsEnabled { get; set; } private ISO.TestObjectTemplate _template; public List RequiredChannels { get; set; } = new List(); public string TemplateParent { get; set; } = ""; public bool SysBuilt { get; set; } private bool _embedded; public bool Embedded { get => _embedded; set { _embedded = value; if (null != _template) { _template.Embedded = value; } } } private string _originalTemplateName = ""; public string OriginalTemplateName { get => _originalTemplateName; set { _originalTemplateName = value; if (null != _template) { _template.OriginalTemplateName = value; } } } public string TemplateName { get; set; } public string TemplateDescription { get; set; } public bool IsLocalOnly { get; set; } private MMETestObjects _testObject; public MMETestObjects TestObject { get => _testObject; set { _testObject = value; if (null == _testObject) return; var app = Application.Current as App; if (app == null) return; AvailableTestObjectTypes = app.IsoDb.GetUniquePossibleChannelTypes(TestObjectTemplateChannel.NONISOCHANNELTYPE); if (AvailableTestObjectTypes.Length > 0) { TestObjectTypeIndex = 0; } else { TestObjectTypeIndex = -1; } } } private string _testObjectType; public string TestObjectType { get => _testObjectType; set { _testObjectType = value; _channels = new List(((App)Application.Current).IsoDb.GetPossibleChannelsForType(_testObjectType)); TemplateAllChannels = _channels.Select(pc => new TestObjectTemplateChannel(new TestObjectTemplateChannel(pc), /*ref db,*/ _template)).ToArray(); } } private List _channels = new List(); private List _allChannels = new List(); public TestObjectTemplateChannel[] TemplateAllChannels { get { _allChannels.Sort(CompareChannels); return _allChannels.ToArray(); } set { _allChannels = new List(value); TemplateAllUIChannels = value.Select(c => new TemplateChannelUI(c)).ToArray(); } } private List _allUIChannels = new List(); public TemplateChannelUI[] TemplateAllUIChannels { get => _allUIChannels.ToArray(); set => _allUIChannels = new List(value); } private List _zones = new List(); public Zone[] TemplateZones { get => _zones.ToArray(); set { _zones = new List(value); var j = CurrentZoneIndex; } } private List _availableTestObjectTypes = null; public string[] AvailableTestObjectTypes { get { if (null != _availableTestObjectTypes) return _availableTestObjectTypes.ToArray(); if (null == TestObject) { return new string[0]; } _availableTestObjectTypes = new List(((App)Application.Current).IsoDb.GetTestObjectTypeForTestObject(TestObject.Test_Object)); return _availableTestObjectTypes.ToArray(); } set => _availableTestObjectTypes = new List(value); } private int _testObjectTypeIndex = -1; public int TestObjectTypeIndex { get { if (string.IsNullOrEmpty(TestObjectType)) { return -1; } return _availableTestObjectTypes.IndexOf(TestObjectType); } set { TestObjectType = value >= 0 ? _availableTestObjectTypes[value] : null; _testObjectTypeIndex = value; TemplateAllChannels = _channels.Select(pc => new TestObjectTemplateChannel(new TestObjectTemplateChannel(pc), /*ref db,*/ _template)).ToArray(); } } public static MMETestObjects GetNonISOTestObject() { var existingobjects = ((App)Application.Current).IsoDb.GetTestObjects(false); var codes = new List(); foreach (var existingobject in existingobjects) { if (existingobject.Text_L1 == Constants.NON_ISO_TESTOBJECT_NAME) { return existingobject; } codes.Add(existingobject.Test_Object); } //first try to find a suitable alpha character that isn't in use for (var i = (int)'A'; i <= 'Z'; i++) { var s = new string(new[] { (char)i }); if (!codes.Contains(s)) { var to = new MMETestObjects(Guid.NewGuid().ToString(), s, Constants.NON_ISO_TESTOBJECT_NAME, Constants.NON_ISO_TESTOBJECT_NAME, 1, DateTime.Now, "SYSTEM", false, "", DateTime.Now, "created", "", MMEPossibleChannels.MMEChannelTypes.SQL); ((App)Application.Current).IsoDb.Commit(to); return to; } } //didn't find one, now try for a suitable numeric character for (var i = (int)'0'; i <= '9'; i++) { var s = new string(new[] { (char)i }); if (codes.Contains(s)) continue; var to = new MMETestObjects(Guid.NewGuid().ToString(), s, Constants.NON_ISO_TESTOBJECT_NAME, Constants.NON_ISO_TESTOBJECT_NAME, 1, DateTime.Now, "SYSTEM", false, "", DateTime.Now, "created", "", MMEPossibleChannels.MMEChannelTypes.SQL); ((App)Application.Current).IsoDb.Commit(to); return to; } throw new NotSupportedException("TestObjectTemplate_CouldNotCreateNONISOTESTOBJECT"); } public ISO.TestObjectTemplate ToISOTestObjectTemplate() { var template = new ISO.TestObjectTemplate(TemplateName, IsLocalOnly) { Description = TemplateDescription, OriginalTemplateName = OriginalTemplateName, Embedded = Embedded, Icon = "", LocalOnly = IsLocalOnly, TestObject = TestObject.Test_Object, TestObjectType = TestObjectType }; var zones = new List(); foreach (var zone in TemplateZones) { var isoZone = new TemplateZone(TemplateName, zone.Name, zone.GetPictureName(), zone.Description); var i = 0; isoZone.TemplateRegions = zone.Regions.Select(region => region.ToISORegion(this, zone, i++)).ToArray(); zones.Add(isoZone); } template.TemplateParent = TemplateParent; template.Channels = TemplateAllChannels; template.Zones = zones.ToArray(); template.SysBuilt = SysBuilt; return template; } private int CompareChannels(TestObjectTemplateChannel left, TestObjectTemplateChannel right) { if (left == right) { return 0; } if (null == left) { return -1; } return null == right ? 1 : left.DisplayOrder.CompareTo(right.DisplayOrder); } public TestObjectTemplate(TestObjectTemplate copy, ref ISO13499FileDb db) { if (null != copy._template) { _template = new ISO.TestObjectTemplate(copy._template, ref db); } TemplateDescription = copy.TemplateDescription; TemplateParent = copy.TemplateParent; TemplateName = copy.TemplateName; LastModified = copy.LastModified; LastModifiedBy = copy.LastModifiedBy; TestObject = copy.TestObject; TestObjectType = copy.TestObjectType; foreach (var c in copy.RequiredChannels) { RequiredChannels.Add(new TestObjectTemplateChannel(c, /*ref db,*/ _template)); } TemplateAllChannels = copy.TemplateAllChannels.Select(c => new TestObjectTemplateChannel(c, /*ref db,*/ _template)).ToArray(); TemplateZones = copy.TemplateZones.Select(z => new Zone(z, this)).ToArray(); SysBuilt = copy.SysBuilt; Embedded = copy.Embedded; OriginalTemplateName = copy.OriginalTemplateName; } public TestObjectTemplate(ISO.TestObjectTemplate template, ref ISO13499FileDb db) { Initialize(template, ref db, null); } private void Initialize(ISO.TestObjectTemplate template, ref ISO13499FileDb db, List testObjects) { _template = template; TemplateDescription = template.Description; TemplateName = template.TemplateName; LastModified = template.LastModified; LastModifiedBy = template.LastModifiedBy; //if a list of test objects is provided, check if the test object we wish is in the list, if so use it var bFoundTestObject = false; if (null != testObjects) { var matches = from to in testObjects where to.Test_Object == template.TestObject select to; var mmeTestObjectses = matches as MMETestObjects[] ?? matches.ToArray(); if (mmeTestObjectses.Any()) { TestObject = mmeTestObjectses[0]; bFoundTestObject = true; } } if (!bFoundTestObject) { TestObject = (Application.Current as App).IsoDb.GetTestObjectByIso(template.TestObject); } TestObjectType = template.TestObjectType; OriginalTemplateName = template.OriginalTemplateName; Embedded = template.Embedded; TemplateAllChannels = template.Channels.Select(c => new TestObjectTemplateChannel(c, /*ref db,*/ _template)).ToArray(); TemplateZones = template.Zones.Select(z => new Zone(z, this)).ToArray(); TemplateParent = template.TemplateParent; SysBuilt = template.SysBuilt; } public TestObjectTemplate() { TemplateName = string.Empty; TemplateDescription = string.Empty; TemplateParent = string.Empty; switch (SerializedSettings.ISOSupportLevel) { case SerializedSettings.ISOSupportLevels.ISO_ONLY: TestObject = ((App)Application.Current).IsoDb.GetTestObjects(false).FirstOrDefault(); break; case SerializedSettings.ISOSupportLevels.NO_ISO: //need to create a template just for this object! InitializeNonISO(); break; case SerializedSettings.ISOSupportLevels.TRANSITORY: TestObject = ((App)Application.Current).IsoDb.GetTestObjects(false).FirstOrDefault(); break; } } private void InitializeNonISO() { //create template, set template channel type to NONISOTYPE TemplateName = Guid.NewGuid().ToString(); TestObject = GetNonISOTestObject(); TestObjectType = Constants.NON_ISO_TESTOBJECT_CHANNEL_TYPE; } } }