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 ParseChildElement(XElement child, ClassBuilder rootBuilder) { if (rootBuilder == null) { throw new ArgumentNullException(nameof(rootBuilder)); } if (child == null) { throw new ArgumentNullException(nameof(child)); } if (ushort.TryParse(child.Element("Properties")?.Element("ControlJoin")?.Value, out var result)) { SmartObjectParser.ParseSmartObject(child, rootBuilder); return; } var isSubpageRefItem = rootBuilder.ClassType == ClassType.SrlElement; var builder = new ClassBuilder(ClassType.Control) { ClassName = $"{(isSubpageRefItem ? rootBuilder.ClassName : "")}{child.Element("ObjectName")?.Value ?? ""}", NamespaceBase = rootBuilder.NamespaceBase }; builder.DigitalOffset = rootBuilder.DigitalOffset; builder.AnalogOffset = rootBuilder.AnalogOffset; builder.SerialOffset = rootBuilder.SerialOffset; if (rootBuilder.SmartJoin > 0) { builder.SmartJoin = rootBuilder.SmartJoin; } CIPTagParser.ParseCIP(child, builder); var controlType = child?.Element("TargetControl").Value.ToUpperInvariant(); if (child?.Element("Properties")?.Descendants().Count() > 0) { foreach (var e in child.Element("Properties").Descendants(). Where(e => e.Name.LocalName.ToUpperInvariant().Contains("JOIN") || e.Name.LocalName.ToUpperInvariant().Contains("FEEDBACK"))) { #pragma warning disable CA1308 // Normalize strings to uppercase var name = e.Name.LocalName.ToLower(CultureInfo.InvariantCulture); #pragma warning restore CA1308 // Normalize strings to uppercase if (ushort.TryParse(e.Value, out var join) && join > 0) { if (name.StartsWith("digitalpresshigh", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Raise", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.StartsWith("digitalpresslow", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Lower", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.StartsWith("digitalpress", StringComparison.InvariantCulture)) { if (child.Element("Properties")?.Element("ShowSelectFeedback")?.Value == "true") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, $"IsActive", JoinType.Digital, JoinDirection.ToPanel)); } builder.AddJoin(new JoinBuilder(join, builder.SmartJoin, $"", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.StartsWith("digitalenable", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "IsEnabled", JoinType.Digital, JoinDirection.ToPanel)); } else if (name.StartsWith("digitalvisibility", StringComparison.InvariantCulture) || name.StartsWith("visibility", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "IsVisible", JoinType.Digital, JoinDirection.ToPanel)); } else if (name.StartsWith("digitalonoff", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "OnOffToggle", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.StartsWith("butoffdigitalpress", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Off", JoinType.DigitalButton, JoinDirection.FromPanel)); builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "OffIsActive", JoinType.Digital, JoinDirection.ToPanel)); } else if (name.StartsWith("butondigitalpress", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "On", JoinType.DigitalButton, JoinDirection.FromPanel)); builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "OnIsActive", JoinType.Digital, JoinDirection.ToPanel)); } else if (name.StartsWith("checkedstate", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Toggle", JoinType.DigitalButton, JoinDirection.FromPanel)); builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "IsChecked", JoinType.Digital, JoinDirection.ToPanel)); } else if (name.StartsWith("indirecttext", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Text", JoinType.Serial, JoinDirection.ToPanel)); } else if (name.Contains("butonindirecttext")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "OnText", JoinType.Serial, JoinDirection.ToPanel)); } else if (name.Contains("butofindirecttext")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "OffText", JoinType.Serial, JoinDirection.ToPanel)); } else if (name.Contains("analogmode")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Mode", JoinType.Analog, JoinDirection.ToPanel)); } else if (name == "analogchildpositionjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "ChildPosition", JoinType.Analog, JoinDirection.ToPanel)); } else if (name == "primarylabeljoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "LeftLabel", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "primarychildlabeljoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "LeftChildLabel", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "secondarylabeljoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "CenterLabel", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "secondarychildlabeljoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "CenterChildLabel", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "tertiarylabeljoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "RightLabel", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "tertiarychildlabeljoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "RightChildLabel", JoinType.Serial, JoinDirection.ToPanel)); } else if (name.Contains("digitalswipeup")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "SwipedUp", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.Contains("digitalswipedown")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "SwipedDown", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.Contains("digitalswipeleft")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "SwipedLeft", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.Contains("digitalswiperight")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "SwipedRight", JoinType.DigitalButton, JoinDirection.FromPanel)); } else if (name.StartsWith("analogfeedbackjoin1", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "LowValue", JoinType.Analog, JoinDirection.Both)); } else if (name.StartsWith("analogfeedbackjoin2", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "HighValue", JoinType.Analog, JoinDirection.Both)); } else if (name.StartsWith("analogminvalue", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "MinValue", JoinType.Analog, JoinDirection.ToPanel)); } else if (name.StartsWith("analogmaxvalue", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "MaxValue", JoinType.Analog, JoinDirection.ToPanel)); } else if (name.StartsWith("digitalanimation", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "IsAnimating", JoinType.Digital, JoinDirection.ToPanel)); } else if (name.StartsWith("serialmode", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Mode", JoinType.Analog, JoinDirection.ToPanel)); } else if (name.StartsWith("enterkeypress", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Enter", JoinType.DigitalButton, JoinDirection.FromPanel) { ChangeEventName = "Enter" }); } else if (name.StartsWith("esckeypress", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Escape", JoinType.DigitalButton, JoinDirection.FromPanel) { ChangeEventName = "Escape" }); } else if (name == "serialjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "TextOverride", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "serialindirecttextjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Text", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "serialoutputjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Text", JoinType.Serial, JoinDirection.FromPanel)); } else if (name == "setfocusjoinon") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "SetFocus", JoinType.DigitalPulse, JoinDirection.ToPanel)); //var focuson = new PropertyElement($"Focus", join, builder.SmartJoin, JoinType.Digital, PropertyMethod.Void) //{ // ContentOverride = $"public void {child.Element("ObjectName").Value}Focus()\n\t{{\n\t\tPulse({join}, 100);" //}; //builder.AddProperty(focuson); } else if (name == "setfocusjoinoff") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "RemoveFocus", JoinType.DigitalPulse, JoinDirection.ToPanel)); //var focusoff = new PropertyElement($"Focus", join, builder.SmartJoin, JoinType.Digital, PropertyMethod.Void) //{ // ContentOverride = $"public void {child.Element("ObjectName").Value}Unfocus()\n\t{{\n\t\tPulse({join}, 100);" //}; //builder.AddProperty(focusoff); } else if (name == "hasfocusjoin") { //if ((child.Element("Properties")?.Element("SetFocusJoinOn")?.Value == "0" || string.IsNullOrEmpty(child.Element("Properties")?.Element("SetFocusJoinOn")?.Value)) && (child.Element("Properties")?.Element("SetFocusJoinOff")?.Value == "0" || string.IsNullOrEmpty(child.Element("Properties")?.Element("SetFocusJoinOff")?.Value))) //{ // var focus1 = new PropertyElement($"IsFocused", join, builder.SmartJoin, JoinType.Digital, PropertyMethod.Void) // { // ContentOverride = $"public void Focus()\n{{\n\tParentPanel.Pulse({(builder.SmartJoin > 0 ? builder.SmartJoin + ", " : "")}{join}, 100);\n}}" // }; // builder.AddProperty(focus1); //} //builder.AddEvent(new EventElement($"IsFocusedChanged", join, builder.SmartJoin, JoinType.Digital)); var direction = JoinDirection.Both; if ((child.Element("Properties")?.Element("SetFocusJoinOn")?.Value == "0" || string.IsNullOrEmpty(child.Element("Properties")?.Element("SetFocusJoinOn")?.Value)) && (child.Element("Properties")?.Element("SetFocusJoinOff")?.Value == "0" || string.IsNullOrEmpty(child.Element("Properties")?.Element("SetFocusJoinOff")?.Value))) { direction = JoinDirection.FromPanel; } builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "IsFocused", JoinType.Digital, direction)); } else if (name == "prependtextjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "PrependText", JoinType.SerialSet, JoinDirection.ToPanel)); } else if (name == "appendtextjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "AppendText", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "serialgraphicsjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "GraphicsPath", JoinType.Serial, JoinDirection.Both)); } else if (name == "serialdynamicgraphicsjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "GraphicsPath", JoinType.Serial, JoinDirection.Both)); } else if (name == "serialdynamiciconjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "IconName", JoinType.Serial, JoinDirection.ToPanel)); } else if (name == "analogdynamiciconjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "IconNumber", JoinType.Analog, JoinDirection.ToPanel)); } else if (name == "analogredjoin") { if (controlType == "COLOR_CHIP") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Red", JoinType.Analog, JoinDirection.ToPanel)); } else { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Red", JoinType.Analog, JoinDirection.Both)); } } else if (name == "analoggreenjoin") { if (controlType == "COLOR_CHIP") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Green", JoinType.Analog, JoinDirection.ToPanel)); } else { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Green", JoinType.Analog, JoinDirection.Both)); } } else if (name == "analogbluejoin") { if (controlType == "COLOR_CHIP") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Blue", JoinType.Analog, JoinDirection.ToPanel)); } else { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Blue", JoinType.Analog, JoinDirection.Both)); } } else if (name.StartsWith("velocity", StringComparison.InvariantCulture)) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, e.Name.LocalName.Replace("Join", ""), JoinType.Analog, JoinDirection.FromPanel)); } else if (name.Contains("analogtouchfeedback")) { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, e.Name.LocalName.Replace("Feedback", ""), JoinType.Analog, JoinDirection.FromPanel)); } else if (name == "holdjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Hold", JoinType.Digital, JoinDirection.FromPanel)); } else if (name == "clickjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Click", JoinType.Digital, JoinDirection.FromPanel)); } else if (name == "negxdigitaljoin" || name == "negydigitaljoin" || name == "posxdigitaljoin" || name == "posydigitaljoin") { var tempName = name == "negxdigitaljoin" ? "GestureLeft" : name == "negydigitaljoin" ? "GestureDown" : name == "posxdigitaljoin" ? "GestureRight" : name == "posydigitaljoin" ? "GestureUp" : ""; builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, tempName, JoinType.Digital, JoinDirection.FromPanel)); } else if (name.Contains("analogfeedback") || name == "analogjoin") { builder.AddJoin( new JoinBuilder(join, builder.SmartJoin, "Value", JoinType.Analog, JoinDirection.Both)); } } var useModes = child.Element("ModesOrDynamicGraphics")?.Element("UseModes"); if (ushort.TryParse(useModes?.Element("AnalogModeJoin")?.Value, out var modeJoin)) { builder.AddJoin( new JoinBuilder(modeJoin, builder.SmartJoin, "ControlMode", JoinType.Analog, JoinDirection.ToPanel)); } } } rootBuilder.AddControl(builder); }