diff --git a/ChangeLog b/ChangeLog index bc7422feb..6c9dfd0eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2002-08-03 Mike Kestner + + * generator/Method.cs : Added IsGetter, IsSetter, ReturnType. Made + GenerateImport, GenerateBody public. + * generator/Parameters.cs : Added Parameter::MarshalType + * generator/Property.cs : Added logic to use methods instead of text + properties wherever possible. + 2002-08-03 Rachel Hestilow * generator/Method.cs: Support libname overrides. Call parms.Finish. diff --git a/generator/Method.cs b/generator/Method.cs index 9a703ef31..96f6dc0ba 100644 --- a/generator/Method.cs +++ b/generator/Method.cs @@ -39,6 +39,18 @@ namespace GtkSharp.Generation { this.libname = libname; } + public bool IsGetter { + get { + return is_get; + } + } + + public bool IsSetter { + get { + return is_set; + } + } + public string Name { get { return name; @@ -63,6 +75,12 @@ namespace GtkSharp.Generation { } } + public string ReturnType { + get { + return s_ret; + } + } + public override bool Equals (object o) { if (!(o is Method)) @@ -258,7 +276,7 @@ namespace GtkSharp.Generation { sw.WriteLine("\t\t/// To be completed "); } - protected void GenerateImport (StreamWriter sw) + public void GenerateImport (StreamWriter sw) { sw.WriteLine("\t\t[DllImport(\"" + libname + "\")]"); sw.Write("\t\tstatic extern " + safety + m_ret + " " + cname + isig); @@ -337,7 +355,12 @@ namespace GtkSharp.Generation { Statistics.MethodCount++; } - protected void GenerateBody (StreamWriter sw, string indent) + public void GenerateBody (StreamWriter sw, string indent) + { + GenerateBody(sw, indent, ""); + } + + public void GenerateBody (StreamWriter sw, string indent, string cast_type) { sw.WriteLine(" {"); if (parms != null) diff --git a/generator/Parameters.cs b/generator/Parameters.cs index ae6439768..0f49e1102 100644 --- a/generator/Parameters.cs +++ b/generator/Parameters.cs @@ -25,6 +25,12 @@ namespace GtkSharp.Generation { } } + public string MarshalType { + get { + return SymbolTable.GetMarshalType( elem.GetAttribute("type")); + } + } + public string Name { get { string name = elem.GetAttribute("name"); diff --git a/generator/Property.cs b/generator/Property.cs index cc38211ec..6685c6411 100644 --- a/generator/Property.cs +++ b/generator/Property.cs @@ -59,8 +59,8 @@ namespace GtkSharp.Generation { modifiers = "new "; XmlElement parent = (XmlElement) elem.ParentNode; - string name = elem.GetAttribute("name"); - if (name == parent.GetAttribute("name")) { + string name = Name; + if (name == container_type.Name) { name += "Prop"; } string cname = "\"" + elem.GetAttribute("cname") + "\""; @@ -85,13 +85,36 @@ namespace GtkSharp.Generation { return; } + bool has_getter = false; + bool has_setter = false; + Method getter = container_type.GetMethod("Get" + Name); + Method setter = container_type.GetMethod("Set" + Name); + + if (getter != null && getter.Validate() && getter.IsGetter) { + has_getter = true; + getter.GenerateImport(sw); + } + if (setter != null && setter.Validate() && setter.IsSetter) { + has_setter = true; + setter.GenerateImport(sw); + } + + if (has_setter && setter.Params[0].CSType != cs_type) + cs_type = setter.Params[0].CSType; + else if (has_getter && getter.ReturnType != cs_type) + cs_type = getter.ReturnType; + sw.WriteLine(); sw.WriteLine("\t\t/// " + name + " Property "); sw.WriteLine("\t\t/// "); sw.WriteLine("\t\t/// "); sw.WriteLine("\t\tpublic " + modifiers + cs_type + " " + name + " {"); - if (elem.HasAttribute("readable")) { + if (has_getter) { + sw.Write("\t\t\tget "); + getter.GenerateBody(sw, "\t", c_type); + sw.WriteLine(); + } else if (elem.HasAttribute("readable")) { sw.WriteLine("\t\t\tget {"); sw.WriteLine("\t\t\t\tGLib.Value val = new GLib.Value (Handle, " + cname + ");"); sw.WriteLine("\t\t\t\tGetProperty(" + cname + ", val);"); @@ -113,7 +136,11 @@ namespace GtkSharp.Generation { sw.WriteLine("\t\t\t}"); } - if (elem.HasAttribute("writeable") && !elem.HasAttribute("construct-only")) { + if (has_setter) { + sw.Write("\t\t\tset "); + setter.GenerateBody(sw, "\t", c_type); + sw.WriteLine(); + } else if (elem.HasAttribute("writeable") && !elem.HasAttribute("construct-only")) { sw.WriteLine("\t\t\tset {"); sw.Write("\t\t\t\tSetProperty(" + cname + ", new GLib.Value("); if (SymbolTable.IsEnum(c_type)) { diff --git a/sample/Scribble.cs b/sample/Scribble.cs index b2bf9a08e..38895909b 100644 --- a/sample/Scribble.cs +++ b/sample/Scribble.cs @@ -29,7 +29,7 @@ namespace GtkSamples { darea.ConfigureEvent += new ConfigureEventHandler (ConfigureEvent); darea.MotionNotifyEvent += new MotionNotifyEventHandler (MotionNotifyEvent); darea.ButtonPressEvent += new ButtonPressEventHandler (ButtonPressEvent); - darea.Events = EventMask.ExposureMask | + darea.Events = (int)EventMask.ExposureMask | EventMask.LeaveNotifyMask | EventMask.ButtonPressMask | EventMask.PointerMotionMask |