using System; using System.Collections; using System.Xml; namespace Stetic { public abstract class WidgetLibrary: IDisposable { Hashtable classes_by_cname = new Hashtable (); Hashtable classes_by_csname = new Hashtable (); Hashtable enums = new Hashtable (); string targetGtkVersion; XmlElement[] importElems = new XmlElement [0]; XmlElement[] exportElems = new XmlElement [0]; public event EventHandler Changed; public abstract string Name { get; } public virtual bool NeedsReload { get { return false; } } public virtual bool CanReload { get { return false; } } // Returns true if it is possible to generate code using this widget library. // Not all widget libraries can generate code. For example, when a widget // depends on a wrapper class, and the wrapper class can't be loaded in memory, // then it is not possible to generate code. public virtual bool CanGenerateCode { get { return true; } } public virtual string[] GetLibraryDependencies () { return new string [0]; } public string TargetGtkVersion { get { return targetGtkVersion != null && targetGtkVersion.Length > 0 ? targetGtkVersion : "2.4"; } } public bool SupportsGtkVersion (string targetVersion) { return WidgetUtils.CompareVersions (TargetGtkVersion, targetVersion) >= 0; } public virtual void Reload () { Load (); } public virtual void Load () { } protected virtual void Load (XmlDocument objects) { classes_by_cname.Clear (); classes_by_csname.Clear (); enums.Clear (); if (objects == null || objects.DocumentElement == null) return; targetGtkVersion = objects.DocumentElement.GetAttribute ("gtk-version"); if (targetGtkVersion.Length == 0) targetGtkVersion = "2.4"; foreach (XmlElement element in objects.SelectNodes ("/objects/enum")) { EnumDescriptor enm = new EnumDescriptor (element); enums[enm.Name] = enm; } foreach (XmlElement element in objects.SelectNodes ("/objects/object")) AddClass (LoadClassDescriptor (element)); XmlNamespaceManager nsm = new XmlNamespaceManager (objects.NameTable); nsm.AddNamespace ("xsl", "http://www.w3.org/1999/XSL/Transform"); XmlNodeList nodes = objects.SelectNodes ("/objects/object/glade-transform/import/xsl:*", nsm); importElems = new XmlElement [nodes.Count]; for (int n=0; n