using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Reflection; using System.Xml; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using XBMC; namespace XBMC.GUI { public class GUIWindow { const string LogFile = "C:\\XBMC-XNA.log.txt"; int _windowId; int _defaultControlId = 0; bool _isOverlayAllowed; bool _isSkinLoaded; bool isWindowVisible; List GUIControlIList = new List(); List GUIControlBList = new List(); List GUIControlLList =new List(); private GraphicsDevice GD; private SpriteBatch thebuffer; private BitmapFont m_font; /// /// Return the id of this window /// public virtual int GetID { get { return _windowId; } set { _windowId = value; } } public void init(GraphicsDevice GD, string xmlPath, SpriteBatch thebuffer, BitmapFont m_font) { this.GD = GD; this.thebuffer = thebuffer; //MessageBox.Show("New nodes must have a label."); Logger(1,"Initalziing Window using XML:" + xmlPath); this.m_font = m_font; LoadSkin(xmlPath); this.isWindowVisible = true; } public bool OnWindowLoaded() { return true; } public bool LoadSkin(string xmlPathFile) { _defaultControlId = 0; if (!System.IO.File.Exists(xmlPathFile)) { Logger(2,"SKIN: Missing {0}" + xmlPathFile); return false; } // Load the XML file XmlDocument doc = new XmlDocument(); doc.Load(xmlPathFile); if (doc.DocumentElement == null) return false; try { if (doc.DocumentElement == null) return false; string root = doc.DocumentElement.Name; // Check root element if (root != "window") return false; /* XmlNodeList nodeListAnimations = doc.DocumentElement.SelectNodes("/window/animation"); if (nodeListAnimations != null) { foreach (XmlNode nodeAnimation in nodeListAnimations) { //Disabled } }*/ Logger(5, "Woring 1"); int nodeId; if (doc.DocumentElement.HasAttribute("id")) nodeId = (int)System.Int32.Parse(doc.DocumentElement.GetAttribute("id")); else return false; // Set the default control that has the focus after loading the window XmlNode nodeDefault = doc.DocumentElement.SelectSingleNode("/window/defaultcontrol"); if (nodeDefault == null) return false; // Convert the id of the default control to an int try { _defaultControlId = System.Int32.Parse(nodeDefault.InnerText); } catch (Exception) { // TODO Add some error when conversion fails message here. Logger(1, "Specifed Window XML has no DefaultControlId"); } // find any XAML complex/compound properties foreach (XmlNode node in doc.DocumentElement.SelectNodes("/window/*[contains(name(), '.')]")) { string xml = node.OuterXml; if (xml.IndexOf("Button.") != -1) xml = xml.Replace("Button.", "GUIControl."); if (xml.IndexOf("Window.") != -1) xml = xml.Replace("Window.", "GUIWindow."); LoadXML(xml);//, XmlNodeType.Element, this); } // Configure the overlay settings XmlNode nodeOverlay = doc.DocumentElement.SelectSingleNode("/window/allowoverlay"); if (nodeOverlay != null) { if (nodeOverlay.InnerText != null) { string allowed = nodeOverlay.InnerText.ToLower(); if (allowed == "yes" || allowed == "true") _isOverlayAllowed = true; if (allowed == "no" || allowed == "false") _isOverlayAllowed = false; } } XmlNodeList nodeList = doc.DocumentElement.SelectNodes("/window/controls/*"); foreach (XmlNode node in nodeList) { if (node.Name == null) continue; switch (node.Name) { case "control": LoadControl(node); break; } } // TODO: remove this when all XAML parser or will result in double initialization // PrepareTriggers(); // initialize the controls OnWindowLoaded(); _isSkinLoaded = true; return true; } catch (Exception ex) { Logger(5, "4124 to Get Window ID" + ex.Message ); //Log.Error("exception loading window {0} err:{1}\r\n\r\n{2}\r\n\r\n", xmlPathFile, ex.Message, ex.StackTrace); return false; } } public void Logger(int loglevel, string dat) { System.IO.FileStream fs = new System.IO.FileStream(LogFile, System.IO.FileMode.Append); System.IO.StreamWriter objWriter = new System.IO.StreamWriter(fs); objWriter.WriteLine(dat); objWriter.Close(); fs.Close(); } protected void LoadControl(XmlNode node) { /* Notes: node.name should == control no matter what */ if (node == null ) //Children == null) return; Logger(1, "XBMC.GUI.GUIWindo.LoadControl()"); try { // Contorl must have type element, id is optional //GUIControlType ctrltype; int cid = 0 ; string typename =""; foreach (XmlAttribute xa in node.Attributes) { if (xa.Name == "type") { typename = xa.Value; } if (xa.Name == "id") { cid = Int32.Parse(xa.Value); } } int posx = 0; int posy = 0; int width = 0; int hieght = 0; string label = ""; string texture1 = ""; string texture2 = ""; foreach( XmlNode cn in node.ChildNodes ) { switch (cn.Name) { case "posx": posx = Int32.Parse(cn.InnerText); break; case "posy": posy = Int32.Parse(cn.InnerText); break; case "width": width = Int32.Parse(cn.InnerText); break; case "height": hieght = Int32.Parse(cn.InnerText); break; case "label": label = cn.InnerText; break; case "texture": texture1 = @"D:\TheSVN\XBMC\skin\Project Mayhem III\media\" + cn.InnerText; break; case "texturefocus": texture1 = @"D:\TheSVN\XBMC\skin\Project Mayhem III\media\" + cn.InnerText; break; case "texturenofocus": texture2 = @"D:\TheSVN\XBMC\skin\Project Mayhem III\media\" + cn.InnerText; break; } } switch (typename) { case "image": GUIImage newImage = new GUIImage(); //Logger(1, controldoc.SelectSingleNode("/posy").InnerText); newImage.init(thebuffer, GD, posx, posy, width, hieght, texture1, Color.White); GUIControlIList.Add(newImage); break; case "label": GUILabel newLabel = new GUILabel(); newLabel.init(posx, posy, width, hieght, label, HorizontalAlignment.Left, m_font); GUIControlLList.Add(newLabel); break; case "button": GUIButton newButton = new GUIButton(); newButton.init(thebuffer, GD, cid, posx, posy, width, hieght, label, texture1, texture2, HorizontalAlignment.Left, VerticalAlignment.Top, m_font); GUIControlBList.Add(newButton); break; } /*GUIImage img = new GUIImage(); if (img != null) { if (img.Width == 0 || img.Height == 0) { Log.Info("xml:{0} image id:{1} width:{2} height:{3} gfx:{4}", _windowXmlFileName, img.GetID, img.Width, img.Height, img.FileName); } }*/ //Children.Add(newControl); } catch (Exception ex) { //Log.Error("Unable to load control. exception:{0}", ex.ToString()); Logger(1, ex.ToString()); } } /*public UIElementCollection Children { get { if (_children == null) _children = new UIElementCollection(); return _children; } }*/ public void Render() { if (_isSkinLoaded && isWindowVisible) { foreach (GUIImage gi in GUIControlIList) { gi.Render(); } foreach (GUIButton gb in GUIControlBList) { gb.Render(); } foreach (GUILabel gl in GUIControlLList) { gl.Render(); } } } private void LoadXML(string XML) { /* System.IO.FileStream fs = new System.IO.FileStream(LogFile, System.IO.FileMode.Open); System.IO.StreamReader objReader = new System.IO.StreamReader(fs); string XML = ""; string line; while ((line = objReader.ReadLine()) != null) { XML += line + "\n"; }*/ Logger(1, XML); XmlReader objXmlTextReader = new XmlTextReader(XML,XmlNodeType.Document, null); System.IO.StringWriter objString = new System.IO.StringWriter(); while (objXmlTextReader.Read()) { Logger(9, objXmlTextReader.Name); } /* If objXmlTextReader.NodeType = XmlNodeType.Element Then objXmlTextWriter.WriteStartElement(objXmlTextReader.Name.ToLower) For intLoop As Integer = 0 To objXmlTextReader.AttributeCount - 1 objXmlTextReader.MoveToAttribute(intLoop) objXmlTextWriter.WriteAttributeString(objXmlTextReader.Name.ToLower, objXmlTextReader.Value) Next intLoop ElseIf objXmlTextReader.NodeType = XmlNodeType.EndElement Then objXmlTextWriter.WriteEndElement() ElseIf objXmlTextReader.NodeType = XmlNodeType.Comment Then objXmlTextWriter.WriteComment(objXmlTextReader.Value) ElseIf objXmlTextReader.NodeType = XmlNodeType.CDATA Then objXmlTextWriter.WriteCData(objXmlTextReader.Value) ElseIf objXmlTextReader.NodeType = XmlNodeType.Text Then objXmlTextWriter.WriteString(EncodeString(objXmlTextReader.Value)) End If End While objXmlTextWriter.Close() objXmlTextReader.Close() Return objString.ToString*/ objXmlTextReader.Close(); } } } // Stuff to CODE // CONTROL // COTROL_BUTTON // List of Controls