Add attachable event support in XamlType (not yet in readers and writers).
authorAtsushi Eno <atsushi@ximian.com>
Thu, 16 Dec 2010 16:32:49 +0000 (01:32 +0900)
committerAtsushi Eno <atsushi@ximian.com>
Thu, 16 Dec 2010 16:32:49 +0000 (01:32 +0900)
mcs/class/System.Xaml/System.Xaml/XamlType.cs
mcs/class/System.Xaml/Test/System.Xaml/TestedTypes.cs
mcs/class/System.Xaml/Test/System.Xaml/XamlTypeTest.cs

index d98839371373b8b7d13d31ab35a11a0d8938214c..a4c33a56089327bbbef8295d5b565567e121a7e4 100755 (executable)
@@ -391,18 +391,19 @@ namespace System.Xaml
 
                        var gl = new Dictionary<string,MethodInfo> ();
                        var sl = new Dictionary<string,MethodInfo> ();
+                       var al = new Dictionary<string,MethodInfo> ();
+                       //var rl = new Dictionary<string,MethodInfo> ();
                        var nl = new List<string> ();
                        foreach (var mi in UnderlyingType.GetMethods (bf)) {
+                               string name = null;
                                if (mi.Name.StartsWith ("Get", StringComparison.Ordinal)) {
                                        if (mi.ReturnType == typeof (void))
                                                continue;
                                        var args = mi.GetParameters ();
                                        if (args.Length != 1)
                                                continue;
-                                       var name = mi.Name.Substring (3);
+                                       name = mi.Name.Substring (3);
                                        gl.Add (name, mi);
-                                       if (!nl.Contains (name))
-                                               nl.Add (name);
                                } else if (mi.Name.StartsWith ("Set", StringComparison.Ordinal)) {
                                        // looks like the return type is *ignored*
                                        //if (mi.ReturnType != typeof (void))
@@ -410,21 +411,35 @@ namespace System.Xaml
                                        var args = mi.GetParameters ();
                                        if (args.Length != 2)
                                                continue;
-                                       var name = mi.Name.Substring (3);
+                                       name = mi.Name.Substring (3);
                                        sl.Add (name, mi);
-                                       if (!nl.Contains (name))
-                                               nl.Add (name);
+                               } else if (mi.Name.EndsWith ("Handler", StringComparison.Ordinal)) {
+                                       var args = mi.GetParameters ();
+                                       if (args.Length != 2)
+                                               continue;
+                                       if (mi.Name.StartsWith ("Add", StringComparison.Ordinal)) {
+                                               name = mi.Name.Substring (3, mi.Name.Length - 3 - 7);
+                                               al.Add (name, mi);
+                                       }/* else if (mi.Name.StartsWith ("Remove", StringComparison.Ordinal)) {
+                                               name = mi.Name.Substring (6, mi.Name.Length - 6 - 7);
+                                               rl.Add (name, mi);
+                                       }*/
                                }
+                               if (name != null && !nl.Contains (name))
+                                       nl.Add (name);
                        }
 
                        foreach (var name in nl) {
                                MethodInfo m;
                                var g = gl.TryGetValue (name, out m) ? m : null;
                                var s = sl.TryGetValue (name, out m) ? m : null;
-                               yield return new XamlMember (name, g, s, SchemaContext);
+                               if (g != null || s != null)
+                                       yield return new XamlMember (name, g, s, SchemaContext);
+                               var a = al.TryGetValue (name, out m) ? m : null;
+                               //var r = rl.TryGetValue (name, out m) ? m : null;
+                               if (a != null)
+                                       yield return new XamlMember (name, a, SchemaContext);
                        }
-
-                       // FIXME: attachable events?
                }
 
                static readonly XamlMember [] empty_array = new XamlMember [0];
index a5412b6148949551e37bcb43abe3bccaba68b2be..92766fcb8e147f653888c3a01e8a1afe8d6e3f85 100755 (executable)
@@ -637,6 +637,23 @@ namespace MonoTests.System.Xaml
                {
                        dic [target] = value;
                }
+
+               static Dictionary<object,List<EventHandler>> handlers = new Dictionary<object,List<EventHandler>> ();
+
+               public static void AddXHandler (object target, EventHandler handler)
+               {
+                       List<EventHandler> l;
+                       if (!handlers.TryGetValue (target, out l)) {
+                               l = new List<EventHandler> ();
+                               handlers [target] = l;
+                       }
+                       l.Add (handler);
+               }
+
+               public static void RemoveXHandler (object target, EventHandler handler)
+               {
+                       handlers [target].Remove (handler);
+               }
        }
        
        public class AttachedPropertyStore : IAttachedPropertyStore
@@ -671,4 +688,18 @@ namespace MonoTests.System.Xaml
                        return props.TryGetValue (attachableMemberIdentifier, out value);
                }
        }
+
+       public class AttachedWrapper : Attachable
+       {
+               public AttachedWrapper ()
+               {
+                       Value = new Attached ();
+               }
+
+               public Attached Value { get; set; }
+       }
+
+       public class Attached
+       {
+       }
 }
index 5d1906e8ca5b37ae4fcba7cce05032a17eee502b..0543400d630342bea868ce139c88ab6ea6c21dd4 100755 (executable)
@@ -769,8 +769,10 @@ namespace MonoTests.System.Xaml
                        Assert.IsTrue (apl.Any (ap => ap.Name == "Protected"), "#2");
                        // oh? SetBaz() has non-void return value, but it seems ignored.
                        Assert.IsTrue (apl.Any (ap => ap.Name == "Baz"), "#3");
-                       Assert.AreEqual (3, apl.Count, "#4");
+                       Assert.AreEqual (4, apl.Count, "#4");
                        Assert.IsTrue (apl.All (ap => ap.IsAttachable), "#5");
+                       var x = apl.First (ap => ap.Name == "X");
+                       Assert.IsTrue (x.IsEvent, "#6");
                }
        }