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);
        }
Example #2
0
        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);
        }