Author: jackson
Date: 2007-06-20 14:55:56 -0400 (Wed, 20 Jun 2007)
New Revision: 80348

Modified:
   trunk/moon/plugin/ChangeLog
   trunk/moon/plugin/moonlight.cs
Log:

        * moonlight.cs: Tie into events.



Modified: trunk/moon/plugin/ChangeLog
===================================================================
--- trunk/moon/plugin/ChangeLog 2007-06-20 18:53:45 UTC (rev 80347)
+++ trunk/moon/plugin/ChangeLog 2007-06-20 18:55:56 UTC (rev 80348)
@@ -1,3 +1,7 @@
+2007-06-20  Jackson Harper  <[EMAIL PROTECTED]>
+
+       * moonlight.cs: Tie into events.
+
 2007-06-20  Everaldo Canuto  <[EMAIL PROTECTED]>
 
        * plugin-class.cpp: Update DependencyObject setter to work with strings

Modified: trunk/moon/plugin/moonlight.cs
===================================================================
--- trunk/moon/plugin/moonlight.cs      2007-06-20 18:53:45 UTC (rev 80347)
+++ trunk/moon/plugin/moonlight.cs      2007-06-20 18:55:56 UTC (rev 80348)
@@ -40,6 +40,7 @@
 
        internal delegate IntPtr CreateElementCallback (string xmlns, string 
name);
        internal delegate void SetAttributeCallback (IntPtr target, string 
name, string value);
+       internal delegate void HookupEventCallback (IntPtr target, string name, 
string value);
        
        public class Hosting {
 
@@ -48,11 +49,11 @@
 
                [DllImport ("moon")]
                internal extern static IntPtr xaml_create_from_file (string 
file, bool create_namescope,
-                               CreateElementCallback ce, SetAttributeCallback 
sa, ref int kind_type);
+                               CreateElementCallback ce, SetAttributeCallback 
sa, HookupEventCallback hue, ref int kind_type);
 
                [DllImport ("moon")]
                internal extern static IntPtr xaml_create_from_str (string 
file, bool create_namescope,
-                               CreateElementCallback ce, SetAttributeCallback 
sa, ref int kind_type);
+                               CreateElementCallback ce, SetAttributeCallback 
sa, HookupEventCallback hue, ref int kind_type);
 
                [DllImport("moon",EntryPoint="dependency_object_get_name")]
                internal extern static IntPtr _dependency_object_get_name 
(IntPtr obj);
@@ -126,6 +127,7 @@
 
                CreateElementCallback create_element_callback;
                SetAttributeCallback set_attribute_callback;
+               HookupEventCallback hookup_event_callback;
                
                Hashtable h = new Hashtable ();
 
@@ -148,7 +150,7 @@
 
                        create_element_callback = new CreateElementCallback 
(create_element);
                        set_attribute_callback = new SetAttributeCallback 
(set_attribute);
-
+                       hookup_event_callback = new HookupEventCallback 
(hookup_event);
                        
                        Type t = typeof (System.Windows.Interop.BrowserHost);
                        MethodInfo m = t.GetMethod ("SetPluginHandle", 
BindingFlags.Static | BindingFlags.NonPublic);
@@ -185,9 +187,9 @@
                        
                        IntPtr element;
                        if (filename != String.Empty)
-                               element = Hosting.xaml_create_from_file 
(filename, true, create_element_callback, set_attribute_callback, ref kind);
+                               element = Hosting.xaml_create_from_file 
(filename, true, create_element_callback, set_attribute_callback, 
hookup_event_callback, ref kind);
                        else
-                               element = Hosting.xaml_create_from_str 
(contents, true, create_element_callback, set_attribute_callback, ref kind);
+                               element = Hosting.xaml_create_from_str 
(contents, true, create_element_callback, set_attribute_callback, 
hookup_event_callback, ref kind);
 
                        // HERE:
                        //     Insert code to check the output of from_file
@@ -305,6 +307,32 @@
                        pd.SetValue (target, pd.Converter.ConvertFrom (value));
                }
 
+               private void hookup_event (IntPtr target_ptr, string name, 
string value)
+               {
+                       MethodInfo m = typeof (DependencyObject).GetMethod 
("Lookup",
+                                       BindingFlags.Static | 
BindingFlags.NonPublic, null, new Type [] { typeof (IntPtr) }, null);
+                       DependencyObject target = (DependencyObject) m.Invoke 
(null, new object [] { target_ptr });
+
+                       if (target == null) {
+                               Console.WriteLine ("hookup event unable to 
create target object from: 0x{0}", target_ptr);
+                               return;
+                       }
+
+                       EventInfo src = target.GetType ().GetEvent (name);
+                       if (src == null) {
+                               Console.WriteLine ("hookup event unable to find 
event to hook to: '{0}'.", name);
+                               return;
+                       }
+
+                       Delegate d = Delegate.CreateDelegate 
(src.EventHandlerType, target, value);
+                       if (d == null) {
+                               Console.WriteLine ("hookup event unable to 
create delegate.");
+                               return;
+                       }
+
+                       src.AddEventHandler (target, d);
+               }
+
                internal static void ParseXmlns (string xmlns, out string 
type_name, out string ns, out string asm)
                {
                        type_name = null;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to