예제 #1
0
파일: Tab.cs 프로젝트: drjcw/TouchGUI
                /// <summary>
                /// Initializes the components of the tab widget to the values specified by the strings.
                /// </summary>
                /// <param name="ID">The unique id (if any) of this object.</param>
                /// <param name="MaxTabWidth">The maximum (non-zero) width a page tab can be (can be null for unconstrained width)</param>
                /// <param name="Parent">The parent layout (used for adding and validating page/widget ids)</param>
                /// <param name="Children">The XML node list containing the child elements that compose the style of the button (see XML notation docs for further information).</param>
                /// <param name="X">The x positioning of the tab container rect relative to the parent as governed by the horizontal alignment as follows:
                /// <list type="table">
                /// <listheader>
                /// <term>Alignment</term>
                /// <term>X Position</term>
                /// </listheader>
                /// <item>
                /// <term>null or empty</term>
                /// <term>x units from parent's left edge</term>
                /// </item>
                /// <item>
                /// <term>Left</term>
                /// <term>x units from parent's left edge</term>
                /// </item>
                /// <item>
                /// <term>Center</term>
                /// <term>x position is ignored</term>
                /// </item>
                /// <item>
                /// <term>Right</term>
                /// <term>x units from parent's right edge</term>
                /// </item>
                /// </list>
                /// </param>
                /// <param name="Y">The y positioning of the tab container rect relative to the parent as governed by the vertical alignment as follows:
                /// <list type="table">
                /// <listheader>
                /// <term>Alignment</term>
                /// <term>Y Position</term>
                /// </listheader>
                /// <item>
                /// <term>null or empty</term>
                /// <term>y units from parent's top edge</term>
                /// </item>
                /// <item>
                /// <term>Top</term>
                /// <term>y units from parent's top edge</term>
                /// </item>
                /// <item>
                /// <term>Center</term>
                /// <term>y position is ignored</term>
                /// </item>
                /// <item>
                /// <term>Bottom</term>
                /// <term>y units from parent's bottom edge</term>
                /// </item>
                /// </list>
                /// </param>
                /// <param name="W">The width of the tab container rect.</param>
                /// <param name="H">The height of the tab container rect.</param>
                /// <param name="HAlign">The horizontal alignemnt of the tab container rect within the parent rect as specified by the following values:
                /// <list type="table">
                /// <listheader>
                /// <term>String Value</term>
                /// <term>Alignment.Type</term>
                /// </listheader>
                /// <item>
                /// <term>null or empty</term>
                /// <term>null</term>
                /// </item>
                /// <item>
                /// <term>left</term>
                /// <term>Alignment.Type.Left</term>
                /// </item>
                /// <item>
                /// <term>center</term>
                /// <term>Alignment.Type.Center</term>
                /// </item>
                /// <item>
                /// <term>right</term>
                /// <term>Alignment.Type.Right</term>
                /// </item>
                /// </list>
                /// </param>
                /// <param name="VAlign">The horizontal alignemnt of the tab container rect within the parent rect  as specified by the following values:
                /// <list type="table">
                /// <listheader>
                /// <term>String Value</term>
                /// <term>Alignment.Type</term>
                /// </listheader>
                /// <item>
                /// <term>null or empty</term>
                /// <term>null</term>
                /// </item>
                /// <item>
                /// <term>top</term>
                /// <term>Alignment.Type.Top</term>
                /// </item>
                /// <item>
                /// <term>center</term>
                /// <term>Alignment.Type.Center</term>
                /// </item>
                /// <item>
                /// <term>bottom</term>
                /// <term>Alignment.Type.Bottom</term>
                /// </item>
                /// </list>
                /// </param>
                /// <remarks>This constructor is used primarily in conjunction with XML-based layouts</remarks>
                public Tab(StyleSheet Styling, string ID, string MaxTabWidth, Layout Parent, XmlNodeList Children, string X, string Y, string W, string H, string HAlign, string VAlign, string Visible) : base(ID, X, Y, W, H, HAlign, VAlign, Visible)
                {
                    maxTabWidth = new Unit(MaxTabWidth);

                    foreach (XmlNode element in Children)
                    {
                        string style = Xml.Att(element.Attributes["style"]);

                        // Tab header for defining tab sizes, backgrounds etc.
                        if (element.Name == "header")
                        {
                            headerHeight = new Unit(Styling.Apply(style, "height", element.Attributes));
                            maxTabWidth  = new Unit(Styling.Apply(style, "maxW", element.Attributes));

                            foreach (XmlNode hChild in element.ChildNodes)
                            {
                                style = Xml.Att(element.Attributes["style"]);

                                switch (hChild.Name)
                                {
                                case "background":

                                    headerBackground = new Image(null,
                                                                 Styling.Apply(style, "src", hChild.Attributes),
                                                                 Styling.Apply(style, "colour", hChild.Attributes),
                                                                 Styling.Apply(style, "scale", hChild.Attributes),
                                                                 "0",
                                                                 "0",
                                                                 "100%",
                                                                 "100%",
                                                                 null,
                                                                 null,
                                                                 null);

                                    break;

                                case "active":

                                    Image imgA = new Image(null,
                                                           Styling.Apply(style, "src", hChild.Attributes),
                                                           Styling.Apply(style, "colour", hChild.Attributes),
                                                           Styling.Apply(style, "scale", hChild.Attributes),
                                                           "0",
                                                           "0",
                                                           "100%",
                                                           "100%",
                                                           null,
                                                           null,
                                                           null);

                                    activeTab = new Button(null,
                                                           null,
                                                           null,
                                                           imgA,
                                                           "0",
                                                           "0",
                                                           "100%",
                                                           "100%",
                                                           null,
                                                           null,
                                                           Xml.Att(element.Attributes["enabled"]),
                                                           null);

                                    activeTab.guiDispatcher.AttachHandler("onClick", this, "tab_Click");

                                    break;

                                case "inactive":

                                    Image imgI = new Image(null,
                                                           Styling.Apply(style, "src", hChild.Attributes),
                                                           Styling.Apply(style, "colour", hChild.Attributes),
                                                           Styling.Apply(style, "scale", hChild.Attributes),
                                                           "0",
                                                           "0",
                                                           "100%",
                                                           "100%",
                                                           null,
                                                           null,
                                                           null);

                                    inactiveTab = new Button(null,
                                                             null,
                                                             null,
                                                             imgI,
                                                             "0",
                                                             "0",
                                                             "100%",
                                                             "100%",
                                                             null,
                                                             null,
                                                             Xml.Att(element.Attributes["enabled"]),
                                                             null);

                                    inactiveTab.guiDispatcher.AttachHandler("onClick", this, "tab_Click");

                                    break;

                                case "text":

                                    tabText = new Text(null,
                                                       "middleCenter",
                                                       null,
                                                       Styling.Apply(style, "colour", element.Attributes),
                                                       Styling.Apply(style, "fontFace", hChild.Attributes),
                                                       Styling.Apply(style, "fontSize", hChild.Attributes));

                                    break;

                                default: throw new Exception(string.Format("Encountered unknown tab child: {0}", element.Name));
                                }
                            }
                        }
                        else if (element.Name == "body")
                        {
                            bodyHeight = new Unit(Styling.Apply(style, "height", element.Attributes));

                            pages = new PageContainer(Xml.Att(element.Attributes["id"]), Xml.Att(element.Attributes["title"]));

                            pages.AddChildren(element.ChildNodes, Parent);

                            pages.ActivatePage(Xml.Att(element.FirstChild.Attributes["id"]));
                        }
                        else
                        {
                            throw new Exception("Unexpected child node in tab widget: " + element.Name);
                        }
                    }

                    if ((headerHeight == null || headerHeight.value == null) && (bodyHeight == null || bodyHeight.value == null))
                    {
                        throw new Exception("Tab must have either header or body element height specified");
                    }
                    if (activeTab == null)
                    {
                        throw new Exception("Tab must have active tab specified");
                    }
                    if (inactiveTab == null)
                    {
                        throw new Exception("Tab must have inactive tab specified");
                    }
                }