public static void ParseSmartObject(XElement child, ClassBuilder rootBuilder) { if (child == null || rootBuilder == null) { return; } var builder = new ClassBuilder(ClassType.SmartObject) { ClassName = $"{child?.Element("ObjectName")?.Value ?? ""}", Namespace = rootBuilder.Namespace }; var props = child?.Element("Properties"); if (ushort.TryParse(props?.Element("ControlJoin").Value, out var controlJoin)) { builder.SmartJoin = controlJoin; } if (ushort.TryParse(props?.Element("DigitalEnableJoin")?.Value, out var enableJoin) && enableJoin > 0) { builder.AddJoin(new JoinBuilder(enableJoin, 0, "IsEnabled", JoinType.Digital, JoinDirection.ToPanel)); } else if (ushort.TryParse(props?.Element("EnableDigitalJoin")?.Value, out var enableJoin2) && enableJoin2 > 0) { builder.AddJoin(new JoinBuilder(enableJoin2, 0, "IsEnabled", JoinType.Digital, JoinDirection.ToPanel)); } if (ushort.TryParse(props?.Element("DigitalVisibilityJoin")?.Value, out var visibilityJoin) && visibilityJoin > 0) { builder.AddJoin(new JoinBuilder(visibilityJoin, 0, "IsVisible", JoinType.Digital, JoinDirection.ToPanel)); } else if (ushort.TryParse(props?.Element("VisibilityDigitalJoin")?.Value, out var visibilityJoin2) && visibilityJoin2 > 0) { builder.AddJoin(new JoinBuilder(visibilityJoin2, 0, "IsVisible", JoinType.Digital, JoinDirection.ToPanel)); } var joinProps = props?.Elements().Where(e => e.Attribute("Type")?.Value == "JoinCommand"); if (joinProps != null) { foreach (var j in joinProps) { var joinTypeText = j?.Element("JoinType")?.Value; var joinName = SanitizeSignalName(j?.Element("SignalName")?.Value ?? ""); _ = ushort.TryParse(j?.Element("JoinNumber")?.Value, out var joinNumber); var isIn = false; var isOut = false; if (j?.Element("Direction") != null && j.Element("Direction").Value.Contains("In")) { isIn = true; } if (j?.Element("Direction") != null && j.Element("Direction").Value.Contains("Out")) { isOut = true; } var joinType = JoinType.Analog; if (joinTypeText == "Serial") { joinType = JoinType.Serial; } else if (joinTypeText == "Digital") { joinType = JoinType.Digital; } var joinDirection = JoinDirection.ToPanel; if (isIn && isOut) { joinDirection = JoinDirection.Both; } else if (isIn && !isOut) { joinDirection = JoinDirection.ToPanel; } else if (!isIn && isOut) { joinDirection = JoinDirection.FromPanel; } if (j?.Name?.LocalName?.Contains("Button") ?? false) { if (joinType == JoinType.Digital) { joinType = JoinType.SmartDigitalButton; } } if (!string.IsNullOrEmpty(joinName)) { builder.AddJoin( new JoinBuilder(joinNumber, builder.SmartJoin, joinName, joinType, joinDirection)); } } } //Check for specific type overrides and parse separately. if (child?.Element("TargetControl")?.Value == "SubpageReference_List" && props != null) { SubpageReferenceListParser.Parse(props, builder); rootBuilder.AddControl(builder); return; } joinProps = props?.Elements().Where(e => e.Attribute("Type")?.Value == "EncapsulatedJoin"); if (joinProps != null) { foreach (var j in joinProps) { var joinTypeText = j?.Element("JoinType")?.Value; _ = ushort.TryParse(j?.Element("JoinNumber")?.Value, out var joinNumber); var isIn = false; var isOut = false; var inName = ""; var outName = ""; if (j?.Element("Direction") != null && j.Element("Direction").Value.Contains("In")) { isIn = true; inName = SanitizeSignalName(j?.Element("InCueName")?.Value ?? ""); } if (j?.Element("Direction") != null && j.Element("Direction").Value.Contains("Out")) { isOut = true; outName = SanitizeSignalName(j?.Element("OutCueName")?.Value ?? ""); } var joinType = JoinType.Analog; if (joinTypeText == "Serial") { joinType = JoinType.Serial; } else if (joinTypeText == "Digital") { joinType = JoinType.Digital; } var joinDirection = JoinDirection.ToPanel; if (isIn && isOut) { joinDirection = JoinDirection.Both; } else if (isIn && !isOut) { joinDirection = JoinDirection.ToPanel; } else if (!isIn && isOut) { joinDirection = JoinDirection.FromPanel; } if (j?.Name?.LocalName?.Contains("Button") ?? false) { if (joinType == JoinType.Digital) { joinType = JoinType.SmartDigitalButton; } } if (!string.IsNullOrEmpty(inName)) { if (inName != outName) { builder.AddJoin( new JoinBuilder(joinNumber, builder.SmartJoin, inName, joinType, joinDirection) { ChangeEventName = outName }); } else { builder.AddJoin( new JoinBuilder(joinNumber, builder.SmartJoin, inName, joinType, joinDirection)); } } else if (!string.IsNullOrEmpty(outName)) { builder.AddJoin( new JoinBuilder(joinNumber, builder.SmartJoin, outName, joinType, joinDirection)); } } } if (((child?.Element("TargetControl")?.Value.Contains("List") ?? false) || (child?.Element("TargetControl")?.Value.Contains("Tab_Button") ?? false)) && props != null) { var groupElement = GetEncapsulatedGroupJoins(props); if (groupElement != null) { var listElementName = groupElement?.Name?.LocalName.Remove(groupElement.Name.LocalName.Length - 1, 1); var itemCount = ushort.Parse(groupElement?.Elements().Where(e => e.Name.LocalName.ToUpperInvariant().Contains("COUNT"))?.FirstOrDefault()?.Value ?? "0", NumberFormatInfo.InvariantInfo); if (itemCount == 0) { if (!ushort.TryParse(groupElement?.Parent?.Elements().Where(e => e.Name.LocalName.ToUpperInvariant().Contains("COUNT"))?.FirstOrDefault()?.Value, out itemCount)) { return; } } var itemBuilder = new ClassBuilder(ClassType.SrlElement) { SmartJoin = builder.SmartJoin }; var groupJoins = GetEncapsulatedGroupJoins(props)?.Elements(); var isDynamicList = false; if (groupJoins != null) { if (groupJoins?.FirstOrDefault()?.Element("InCueName") != null) { isDynamicList = true; foreach (var j in groupJoins) { var inName = j?.Element("InCueName")?.Value ?? ""; var outName = j?.Element("OutCueName")?.Value ?? ""; var isIn = j?.Element("Direction")?.Value.Contains("In") ?? false; var isOut = j?.Element("Direction")?.Value.Contains("Out") ?? false; var startJoin = ushort.Parse(j?.Element("StartJoinNumber")?.Value ?? "0", NumberFormatInfo.InvariantInfo); var jt = j?.Element("JoinType")?.Value ?? ""; var inJoinType = JoinType.None; var outJoinType = JoinType.None; if (jt == "Digital") { inJoinType = JoinType.SmartDigital; outJoinType = JoinType.SmartDigital; } else if (jt == "Analog") { inJoinType = JoinType.SmartAnalog; outJoinType = JoinType.SmartAnalog; } else if (jt == "Serial") { inJoinType = JoinType.SmartSerial; outJoinType = JoinType.SmartSerial; } if (inName.StartsWith("Set Item %i ", StringComparison.InvariantCulture)) { inName = inName.Replace("Set Item %i ", ""); } else if (inName.StartsWith("Item %i ", StringComparison.InvariantCulture)) { inName = inName.Replace("Item %i ", "Is"); } if (inName.StartsWith("In") && !inName.Contains("Checked")) { inName = inName.Remove(0, 2); } inName = SanitizeSignalName(inName); if (outName.StartsWith("Item %i ", StringComparison.InvariantCulture)) { outName = outName.Replace("Item %i ", ""); } if (outName.ToUpperInvariant().Contains("PRESSED") || outName.ToUpperInvariant().Contains("RELEASED")) { if (outJoinType == JoinType.SmartDigital) { outJoinType = JoinType.SmartDigitalButton; outName = string.Empty; } } if (outName.StartsWith("In") && !outName.Contains("Checked")) { outName = outName.Remove(0, 2); } outName = SanitizeSignalName(outName); var joinDirection = JoinDirection.Unknown; if (isIn && !isOut) { joinDirection = JoinDirection.ToPanel; } else if (!isIn && isOut) { joinDirection = JoinDirection.FromPanel; } else if (isIn && isOut) { joinDirection = JoinDirection.Both; } if (joinDirection == JoinDirection.Both || joinDirection == JoinDirection.ToPanel) { itemBuilder.AddJoin( new JoinBuilder(startJoin, itemBuilder.SmartJoin, inName, inJoinType, JoinDirection.ToPanel)); } if (joinDirection == JoinDirection.Both || joinDirection == JoinDirection.FromPanel) { itemBuilder.AddJoin( new JoinBuilder(startJoin, itemBuilder.SmartJoin, outName, outJoinType, JoinDirection.FromPanel)); } } } //else if (groupJoins?.FirstOrDefault()?.Element("SignalName") != null) //{ // foreach (var j in groupJoins) // { // var joinName = j?.Element("SignalName")?.Value ?? ""; // var isIn = j?.Element("Direction")?.Value.Contains("In") ?? false; // var isOut = j?.Element("Direction")?.Value.Contains("Out") ?? false; // var joinNumber = ushort.Parse(j?.Element("JoinNumber")?.Value ?? "0", NumberFormatInfo.InvariantInfo); // var jt = j?.Element("JoinType")?.Value ?? ""; // var joinType = JoinType.None; // if (jt == "Digital") // { // joinType = JoinType.SmartDigital; // } // else if (jt == "Analog") // { // joinType = JoinType.SmartAnalog; // } // else if (jt == "Serial") // { // joinType = JoinType.SmartSerial; // } // var joinDirection = JoinDirection.Unknown; // if (isIn && !isOut) // { // joinDirection = JoinDirection.ToPanel; // } // else if (!isIn && isOut) // { // joinDirection = JoinDirection.FromPanel; // } // else if (isIn && isOut) // { // joinDirection = JoinDirection.Both; // } // if (joinName.ToUpperInvariant().Contains("PRESS") || joinName.ToUpperInvariant().Contains("CHECK")) // { // if (joinType == JoinType.Digital) // { // joinName = ""; // joinType = JoinType.SmartDigitalButton; // } // } // else if (joinName.ToUpperInvariant().Contains("SELECT")) // { // joinName = "Selected"; // } // if (j?.Name?.LocalName?.Contains("Button") ?? false) // { // if (joinType == JoinType.Digital) // { // joinType = JoinType.SmartDigitalButton; // } // } // joinName = SanitizeSignalName(joinName); // itemBuilder.AddJoin( // new JoinBuilder(joinNumber, itemBuilder.SmartJoin, joinName, joinType, joinDirection)); // } //} else { if (groupJoins != null) { foreach (var j in groupJoins) { var inName = j?.Element("SignalName")?.Value ?? ""; if (string.IsNullOrEmpty(inName)) { continue; } var isIn = j?.Element("Direction")?.Value.Contains("In") ?? false; var isOut = j?.Element("Direction")?.Value.Contains("Out") ?? false; var joinNumber = ushort.Parse(j?.Element("JoinNumber")?.Value ?? "0", NumberFormatInfo.InvariantInfo); var jt = j?.Element("JoinType")?.Value ?? ""; var inJoinType = JoinType.None; var outJoinType = JoinType.None; if (jt == "Digital") { inJoinType = JoinType.SmartDigital; outJoinType = JoinType.SmartDigital; } else if (jt == "Analog") { inJoinType = JoinType.SmartAnalog; outJoinType = JoinType.SmartAnalog; } else if (jt == "Serial") { inJoinType = JoinType.SmartSerial; outJoinType = JoinType.SmartSerial; } if (inName.StartsWith("Set Item %i ", StringComparison.InvariantCulture)) { inName = inName.Replace("Set Item %i ", ""); } else if (inName.StartsWith("Item %i ", StringComparison.InvariantCulture)) { inName = inName.Replace("Item %i ", "Is"); } var joinDirection = JoinDirection.Unknown; if (isIn && !isOut) { joinDirection = JoinDirection.ToPanel; } else if (!isIn && isOut) { joinDirection = JoinDirection.FromPanel; } else if (isIn && isOut) { joinDirection = JoinDirection.Both; } var outName = inName; if (outName == "IsPressed" || outName == "IsChecked") { if (outJoinType == JoinType.SmartDigital) { outName = ""; outJoinType = JoinType.SmartDigitalButton; } } else if (inName.ToUpperInvariant().Contains("SELECT")) { inName = "Selected"; } if (inName.StartsWith("Is") && !inName.Contains("Checked")) { inName = inName.Remove(0, 2); } if (outName.StartsWith("Is") && !outName.Contains("Checked")) { outName = outName.Remove(0, 2); } inName = SanitizeSignalName(inName); outName = SanitizeSignalName(outName); if (inName == outName) { itemBuilder.AddJoin( new JoinBuilder(joinNumber, itemBuilder.SmartJoin, outName, outJoinType, joinDirection)); } else { if (joinDirection == JoinDirection.Both || joinDirection == JoinDirection.ToPanel) { itemBuilder.AddJoin( new JoinBuilder(joinNumber, itemBuilder.SmartJoin, inName, inJoinType, JoinDirection.ToPanel)); } if (joinDirection == JoinDirection.Both || joinDirection == JoinDirection.FromPanel) { itemBuilder.AddJoin( new JoinBuilder(joinNumber, itemBuilder.SmartJoin, outName, outJoinType, JoinDirection.FromPanel)); } } } } } if (string.IsNullOrEmpty(itemBuilder.ClassName)) { itemBuilder.ClassName = builder.ClassName + "Item"; } else { itemBuilder.ClassName += "Item"; } ListBuilder list; if (isDynamicList) { list = new ListBuilder(itemBuilder, itemCount, 1, 1, 1); } else { list = new ListBuilder(itemBuilder, itemCount, 0, 0, 0); } if (list != null) { list.Name = props?.Parent?.Element("ObjectName")?.Value.Replace(" ", "") ?? "List";// + "Item" ?? "ListItem"; builder.AddList(list); } } } } CIPTagParser.ParseCIP(child, builder); rootBuilder.AddControl(builder); }
public static void Parse(XElement props, ClassBuilder builder) { if (props == null || builder == null) { return; } var useSetQuantity = bool.Parse(props?.Element("UseSetNumItems")?.Value ?? "false"); var useEnabled = bool.Parse(props?.Element("UseEnabledItems")?.Value ?? "false"); var useVisible = bool.Parse(props?.Element("UseVisibleItems")?.Value ?? "false"); _ = ushort.TryParse(props?.Element("DigitalJoinIncrement")?.Value ?? "0", out var digitalIncrement); _ = ushort.TryParse(props?.Element("AnalogJoinIncrement")?.Value ?? "0", out var analogIncrement); _ = ushort.TryParse(props?.Element("SerialJoinIncrement")?.Value ?? "0", out var serialIncrement); _ = ushort.TryParse(props?.Element("NumSubpageReferences")?.Value ?? "0", out var pageQuantity); _ = ushort.TryParse(props?.Element("ItemEnableJoinGroup")?.Element("StartJoinNumber")?.Value ?? "0", out var enableStart); _ = ushort.TryParse(props?.Element("ItemVisibilityJoinGroup")?.Element("StartJoinNumber")?.Value ?? "0", out var visStart); _ = ushort.TryParse(props?.Element("DigitalTriListJoinGroup")?.Element("StartJoinNumber")?.Value ?? "0", out var digStart); _ = ushort.TryParse(props?.Element("AnalogTriListJoinGroup")?.Element("StartJoinNumber")?.Value ?? "0", out var analogStart); _ = ushort.TryParse(props?.Element("SerialTriListJoinGroup")?.Element("StartJoinNumber")?.Value ?? "0", out var serialStart); var pageReference = props?.Element("Subpage")?.Element("PageID").Value ?? "0"; if (pageReference == "0") { return; } if (useSetQuantity) { if (ushort.TryParse(props?.Element("AnalogNumberOfItemsJoin")?.Element("JoinNumber")?.Value ?? "0", out var quantityJoin) && quantityJoin > 0) { builder.AddJoin(new JoinBuilder(quantityJoin, builder.SmartJoin, "ItemQuantity", JoinType.Analog, JoinDirection.ToPanel)); } } if (ushort.TryParse(props?.Element("AnalogSelectJoin")?.Element("JoinNumber")?.Value ?? "0", out var selectJoin) && selectJoin > 0) { builder.AddJoin(new JoinBuilder(selectJoin, builder.SmartJoin, "ItemSelection", JoinType.Analog, JoinDirection.FromPanel)); } if (ushort.TryParse(props?.Element("AnalogScrollJoin")?.Element("JoinNumber")?.Value ?? "0", out var scrollJoin) && selectJoin > 0) { builder.AddJoin(new JoinBuilder(scrollJoin, builder.SmartJoin, "ScrollToItem", JoinType.AnalogSet, JoinDirection.ToPanel)); } var subpage = props?.Document?.Root?.Element("Properties")?.Element("Pages")?.Elements()?.Where(e => e.Name.LocalName.ToUpperInvariant() == "PAGE" && e.Element("ControlName")?.Value.ToUpperInvariant() == "SUBPAGE" && e.Attribute("uid")?.Value == pageReference)?.FirstOrDefault() ?? null; if (subpage == null) { return; } var subBuilder = new ClassBuilder(ClassType.SrlElement) { ClassName = $"{builder.ClassName}Item", //$"Item", //$"{(subpage?.Element("ObjectName")?.Value ?? "Subpage")}", Namespace = builder.Namespace, //DigitalOffset = (ushort)(digStart - 1), //AnalogOffset = (ushort)(analogStart - 1), //SerialOffset = (ushort)(serialStart - 1), SmartJoin = builder.SmartJoin }; foreach (var c in subpage?.Element("Properties")?.Element("Children")?.Elements()?. Where(e => e.Name.LocalName != "Subpage") ?? System.Array.Empty <XElement>()) { GenericParser.ParseChildElement(c, subBuilder); } if (useVisible) { subBuilder.AddJoin(new JoinBuilder(1, subBuilder.SmartJoin, "IsVisible", JoinType.SrlVisibility, JoinDirection.ToPanel)); } if (useEnabled) { subBuilder.AddJoin(new JoinBuilder(1, subBuilder.SmartJoin, "IsEnabled", JoinType.SrlEnable, JoinDirection.ToPanel)); } subBuilder.DigitalOffset = (ushort)(digStart - 1); subBuilder.AnalogOffset = (ushort)(analogStart - 1); subBuilder.SerialOffset = (ushort)(serialStart - 1); var list = new ListBuilder(subBuilder, pageQuantity, digitalIncrement, analogIncrement, serialIncrement) { Name = props?.Parent?.Element("ObjectName")?.Value ?? "" }; builder.AddList(list); }