From 9872865fe013a4e92944c18d65ddc5c4fb77d021 Mon Sep 17 00:00:00 2001 From: toshok Date: Mon, 9 Nov 2009 16:32:45 +0000 Subject: [PATCH] in class/Microsoft.SilverlightControls/: 2009-11-09 Chris Toshok * Controls/Src/ToolTip/ToolTip.cs: add stubbed things for PlacementProperty and PlacementTargetProperty. in class/System.Windows/System.Windows.Data/: 2009-11-09 Chris Toshok * BindingExpression.cs: stub UpdateSource method. * Binding.cs: stub UpdateSourceTrigger property. in class/System.Windows/System.Windows/: 2009-11-09 Chris Toshok * UIElement.cs: add the static key event and mouse button event fields and partially implement AddEventHandler method. * FrameworkElement.cs: remove the LoadedEvent field, as it's generated now. * RoutedEvent.cs (ctor): pass the eventid so we can later retried it in UIElement.AddEventHandler. * Events.g.cs: regen. in src/: 2009-11-09 Chris Toshok * uielement.h (class UIElement): mark the Key a MouseLeftButton events as GenerateManagedEventField=true. in tools/generators/: 2009-11-09 Chris Toshok * FieldInfo.cs: add GenerateManagedEventField to determine if we output the static RoutedEvent field (default = false). * Generator.cs (GenerateManagedEvents): if the event is marked as GenerateManagedEventField=true, output the static field. Also, add it to an autogenerated method for creating a dispatcher from the event id (Events.CreateDispatcherFromEventId). r: rolf git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/moon@145747 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- class/Microsoft.SilverlightControls/ChangeLog | 7 +++ .../Controls/Src/ToolTip/ToolTip.cs | 52 ++++++++++++++++++++++ .../System.Windows/System.Windows.Data/Binding.cs | 7 +++ .../System.Windows.Data/BindingExpression.cs | 7 +++ class/System.Windows/System.Windows.Data/ChangeLog | 8 ++++ class/System.Windows/System.Windows/ChangeLog | 15 +++++++ class/System.Windows/System.Windows/Events.g.cs | 17 +++++++ .../System.Windows/FrameworkElement.cs | 3 -- class/System.Windows/System.Windows/RoutedEvent.cs | 11 ++++- class/System.Windows/System.Windows/UIElement.cs | 9 ++++ src/ChangeLog | 7 +++ src/uielement.h | 10 ++--- tools/generators/ChangeLog | 12 +++++ tools/generators/FieldInfo.cs | 12 +++++ tools/generators/Generator.cs | 37 +++++++++++++++ 15 files changed, 205 insertions(+), 9 deletions(-) diff --git a/class/Microsoft.SilverlightControls/ChangeLog b/class/Microsoft.SilverlightControls/ChangeLog index 5c00c80d6..5b2bf62cf 100644 --- a/class/Microsoft.SilverlightControls/ChangeLog +++ b/class/Microsoft.SilverlightControls/ChangeLog @@ -1,3 +1,10 @@ +2009-11-09 Chris Toshok + + * Controls/Src/ToolTip/ToolTip.cs: add stubbed things for + PlacementProperty and PlacementTargetProperty. + + r: rolf + 2009-11-08 Andreia Gaita * RuntimeControls/SilverlightControls/Button.cs: Add missing diff --git a/class/Microsoft.SilverlightControls/Controls/Src/ToolTip/ToolTip.cs b/class/Microsoft.SilverlightControls/Controls/Src/ToolTip/ToolTip.cs index baff13c06..4dd8aa086 100644 --- a/class/Microsoft.SilverlightControls/Controls/Src/ToolTip/ToolTip.cs +++ b/class/Microsoft.SilverlightControls/Controls/Src/ToolTip/ToolTip.cs @@ -65,7 +65,59 @@ namespace System.Windows.Controls } #endregion HorizontalOffset Property + + #region PlacementTarget Property + /// + /// Determines a horizontal offset in pixels from the left side of + /// the mouse bounding rectangle to the left side of the ToolTip. + /// + public UIElement PlacementTarget + { + get { return (UIElement)GetValue(PlacementTargetProperty);} + set { SetValue(PlacementTargetProperty, value);} + } + + /// + /// Identifies the HorizontalOffset dependency property. + /// + public static readonly DependencyProperty PlacementTargetProperty = + DependencyProperty.RegisterCore( + "PlacementTarget", + typeof(UIElement), + typeof(ToolTip), + new PropertyMetadata(new PropertyChangedCallback(OnPlacementTargetPropertyChanged))); + + private static void OnPlacementTargetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + } + #endregion PlacementTarget Property + + #region Placement Property + /// + /// Determines a horizontal offset in pixels from the left side of + /// the mouse bounding rectangle to the left side of the ToolTip. + /// + public PlacementMode Placement + { + get { return (PlacementMode)GetValue(PlacementProperty);} + set { SetValue(PlacementProperty, value);} + } + + /// + /// Identifies the HorizontalOffset dependency property. + /// + public static readonly DependencyProperty PlacementProperty = + DependencyProperty.RegisterCore( + "Placement", + typeof(PlacementMode), + typeof(ToolTip), + new PropertyMetadata(new PropertyChangedCallback(OnPlacementPropertyChanged))); + private static void OnPlacementPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + } + #endregion PlacementTarget Property + #region IsOpen Property /// diff --git a/class/System.Windows/System.Windows.Data/Binding.cs b/class/System.Windows/System.Windows.Data/Binding.cs index 1ef3dd578..f30c5d651 100644 --- a/class/System.Windows/System.Windows.Data/Binding.cs +++ b/class/System.Windows/System.Windows.Data/Binding.cs @@ -44,6 +44,7 @@ namespace System.Windows.Data { bool validatesonex; bool issealed; object source; + UpdateSourceTrigger trigger; public IValueConverter Converter { get { return converter; } @@ -115,6 +116,11 @@ namespace System.Windows.Data { source = value; } } + + public UpdateSourceTrigger UpdateSourceTrigger { + get { return trigger; } + set { trigger = value; } + } public bool ValidatesOnExceptions { get { return validatesonex; } @@ -137,6 +143,7 @@ namespace System.Windows.Data { Mode = BindingMode.OneWay; Path = new PropertyPath (path); + trigger = UpdateSourceTrigger.Default; } void CheckSealed () diff --git a/class/System.Windows/System.Windows.Data/BindingExpression.cs b/class/System.Windows/System.Windows.Data/BindingExpression.cs index 275551686..9385ad0e2 100644 --- a/class/System.Windows/System.Windows.Data/BindingExpression.cs +++ b/class/System.Windows/System.Windows.Data/BindingExpression.cs @@ -40,5 +40,12 @@ namespace System.Windows.Data : base (binding, target, property) { } + + + + public void UpdateSource() + { + } + } } diff --git a/class/System.Windows/System.Windows.Data/ChangeLog b/class/System.Windows/System.Windows.Data/ChangeLog index 535b99e1f..1a22755df 100644 --- a/class/System.Windows/System.Windows.Data/ChangeLog +++ b/class/System.Windows/System.Windows.Data/ChangeLog @@ -1,3 +1,11 @@ +2009-11-09 Chris Toshok + + * BindingExpression.cs: stub UpdateSource method. + + * Binding.cs: stub UpdateSourceTrigger property. + + r: rolf + 2009-10-05 Jackson Harper * BindingExpression.cs: This is a public class in 3.0 (constructor diff --git a/class/System.Windows/System.Windows/ChangeLog b/class/System.Windows/System.Windows/ChangeLog index 3513c0d5d..d31e144ef 100644 --- a/class/System.Windows/System.Windows/ChangeLog +++ b/class/System.Windows/System.Windows/ChangeLog @@ -1,3 +1,18 @@ +2009-11-09 Chris Toshok + + * UIElement.cs: add the static key event and mouse button event + fields and partially implement AddEventHandler method. + + * FrameworkElement.cs: remove the LoadedEvent field, as it's + generated now. + + * RoutedEvent.cs (ctor): pass the eventid so we can later retried + it in UIElement.AddEventHandler. + + * Events.g.cs: regen. + + r: rolf + 2009-11-08 Chris Toshok * Icon.cs, IconCollection.cs, WindowSettings.cs: new files. diff --git a/class/System.Windows/System.Windows/Events.g.cs b/class/System.Windows/System.Windows/Events.g.cs index 15022fc47..b3e91bc41 100644 --- a/class/System.Windows/System.Windows/Events.g.cs +++ b/class/System.Windows/System.Windows/Events.g.cs @@ -116,6 +116,18 @@ namespace Mono { public const int UIElement_MouseRightButtonUpEvent = 15; public const int UIElement_MouseWheelEvent = 16; } + internal partial class Events { + public static UnmanagedEventHandler CreateDispatcherFromEventId (int eventId, Delegate value) { + switch (eventId) { + case EventIds.UIElement_KeyDownEvent: return Events.CreateKeyEventHandlerDispatcher ((KeyEventHandler) value); + case EventIds.UIElement_KeyUpEvent: return Events.CreateKeyEventHandlerDispatcher ((KeyEventHandler) value); + case EventIds.UIElement_LoadedEvent: return Events.CreateRoutedEventHandlerDispatcher ((RoutedEventHandler) value); + case EventIds.UIElement_MouseLeftButtonDownEvent: return Events.CreateMouseButtonEventHandlerDispatcher ((MouseButtonEventHandler) value); + case EventIds.UIElement_MouseLeftButtonUpEvent: return Events.CreateMouseButtonEventHandlerDispatcher ((MouseButtonEventHandler) value); + default: throw new NotSupportedException (); + } + } + } } namespace System.Windows { partial class FrameworkElement { @@ -124,6 +136,7 @@ namespace System.Windows { add { RegisterEvent (EventIds.UIElement_LoadedEvent, value, Events.CreateRoutedEventHandlerDispatcher (value)); } remove { UnregisterEvent (EventIds.UIElement_LoadedEvent, value); } } + public static readonly RoutedEvent LoadedEvent = new RoutedEvent (EventIds.UIElement_LoadedEvent); public event SizeChangedEventHandler SizeChanged { add { RegisterEvent (EventIds.FrameworkElement_SizeChangedEvent, value, Events.CreateSizeChangedEventHandlerDispatcher (value)); } @@ -142,11 +155,13 @@ namespace System.Windows { add { RegisterEvent (EventIds.UIElement_KeyDownEvent, value, Events.CreateKeyEventHandlerDispatcher (value)); } remove { UnregisterEvent (EventIds.UIElement_KeyDownEvent, value); } } + public static readonly RoutedEvent KeyDownEvent = new RoutedEvent (EventIds.UIElement_KeyDownEvent); public event KeyEventHandler KeyUp { add { RegisterEvent (EventIds.UIElement_KeyUpEvent, value, Events.CreateKeyEventHandlerDispatcher (value)); } remove { UnregisterEvent (EventIds.UIElement_KeyUpEvent, value); } } + public static readonly RoutedEvent KeyUpEvent = new RoutedEvent (EventIds.UIElement_KeyUpEvent); public event RoutedEventHandler LostFocus { add { RegisterEvent (EventIds.UIElement_LostFocusEvent, value, Events.CreateRoutedEventHandlerDispatcher (value)); } @@ -172,11 +187,13 @@ namespace System.Windows { add { RegisterEvent (EventIds.UIElement_MouseLeftButtonDownEvent, value, Events.CreateMouseButtonEventHandlerDispatcher (value)); } remove { UnregisterEvent (EventIds.UIElement_MouseLeftButtonDownEvent, value); } } + public static readonly RoutedEvent MouseLeftButtonDownEvent = new RoutedEvent (EventIds.UIElement_MouseLeftButtonDownEvent); public event MouseButtonEventHandler MouseLeftButtonUp { add { RegisterEvent (EventIds.UIElement_MouseLeftButtonUpEvent, value, Events.CreateMouseButtonEventHandlerDispatcher (value)); } remove { UnregisterEvent (EventIds.UIElement_MouseLeftButtonUpEvent, value); } } + public static readonly RoutedEvent MouseLeftButtonUpEvent = new RoutedEvent (EventIds.UIElement_MouseLeftButtonUpEvent); public event MouseEventHandler MouseMove { add { RegisterEvent (EventIds.UIElement_MouseMoveEvent, value, Events.CreateMouseEventHandlerDispatcher (value)); } diff --git a/class/System.Windows/System.Windows/FrameworkElement.cs b/class/System.Windows/System.Windows/FrameworkElement.cs index 5a471f0bc..3bad9bc62 100644 --- a/class/System.Windows/System.Windows/FrameworkElement.cs +++ b/class/System.Windows/System.Windows/FrameworkElement.cs @@ -221,9 +221,6 @@ namespace System.Windows { } } - [MonoTODO ("figure out how to construct routed events")] - public static readonly RoutedEvent LoadedEvent = new RoutedEvent(); - public event EventHandler BindingValidationError; internal virtual void InvokeOnApplyTemplate () diff --git a/class/System.Windows/System.Windows/RoutedEvent.cs b/class/System.Windows/System.Windows/RoutedEvent.cs index ae18cc03f..9f154bf10 100644 --- a/class/System.Windows/System.Windows/RoutedEvent.cs +++ b/class/System.Windows/System.Windows/RoutedEvent.cs @@ -27,14 +27,17 @@ // // +using Mono; using System; +using System.Windows.Input; namespace System.Windows { public sealed class RoutedEvent { - internal RoutedEvent() + internal RoutedEvent (int eventId) { + EventId = eventId; } public override string ToString () @@ -42,5 +45,11 @@ namespace System.Windows return base.ToString (); } + internal int EventId { + get { return eventId; } + set { eventId = value; } + } + + int eventId; } } diff --git a/class/System.Windows/System.Windows/UIElement.cs b/class/System.Windows/System.Windows/UIElement.cs index 6e0eb9af0..4d9b74c57 100644 --- a/class/System.Windows/System.Windows/UIElement.cs +++ b/class/System.Windows/System.Windows/UIElement.cs @@ -150,5 +150,14 @@ namespace System.Windows { } } #endif + + public void AddHandler (RoutedEvent routedEvent, + Delegate handler, + bool handledEventsToo) + + { + // FIXME: we don't handle handledEventsToo + RegisterEvent (routedEvent.EventId, handler, Events.CreateDispatcherFromEventId (routedEvent.EventId, handler)); + } } } diff --git a/src/ChangeLog b/src/ChangeLog index 8d3328c72..e339b76bf 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2009-11-09 Chris Toshok + + * uielement.h (class UIElement): mark the Key a MouseLeftButton + events as GenerateManagedEventField=true. + + r: rolf + 2009-11-09 Rolf Bjarne Kvinge * xaml.cpp: diff --git a/src/uielement.h b/src/uielement.h index 889b26c9c..5793be511 100644 --- a/src/uielement.h +++ b/src/uielement.h @@ -490,17 +490,17 @@ public: // Events you can AddHandler to - /* @ManagedDeclaringType=FrameworkElement,DelegateType=RoutedEventHandler */ + /* @ManagedDeclaringType=FrameworkElement,DelegateType=RoutedEventHandler,GenerateManagedEventField=true */ const static int LoadedEvent; /* @DelegateType=MouseEventHandler */ const static int MouseMoveEvent; - /* @DelegateType=MouseButtonEventHandler */ + /* @DelegateType=MouseButtonEventHandler,GenerateManagedEventField=true */ const static int MouseLeftButtonDownEvent; - /* @DelegateType=MouseButtonEventHandler */ + /* @DelegateType=MouseButtonEventHandler,GenerateManagedEventField=true */ const static int MouseLeftButtonUpEvent; - /* @DelegateType=KeyEventHandler */ + /* @DelegateType=KeyEventHandler,GenerateManagedEventField=true */ const static int KeyDownEvent; - /* @DelegateType=KeyEventHandler */ + /* @DelegateType=KeyEventHandler,GenerateManagedEventField=true */ const static int KeyUpEvent; /* @DelegateType=MouseEventHandler */ const static int MouseEnterEvent; diff --git a/tools/generators/ChangeLog b/tools/generators/ChangeLog index aeb349427..307c73d12 100644 --- a/tools/generators/ChangeLog +++ b/tools/generators/ChangeLog @@ -1,3 +1,15 @@ +2009-11-09 Chris Toshok + + * FieldInfo.cs: add GenerateManagedEventField to determine if we + output the static RoutedEvent field (default = false). + + * Generator.cs (GenerateManagedEvents): if the event is marked as + GenerateManagedEventField=true, output the static field. Also, + add it to an autogenerated method for creating a dispatcher from + the event id (Events.CreateDispatcherFromEventId). + + r: rolf + 2009-11-05 Alan McGovern * TypeReference.cs: Templates must be expanded as part of the diff --git a/tools/generators/FieldInfo.cs b/tools/generators/FieldInfo.cs index 446affdda..c91c8428e 100644 --- a/tools/generators/FieldInfo.cs +++ b/tools/generators/FieldInfo.cs @@ -45,6 +45,18 @@ class FieldInfo : MemberInfo { } } + public bool GenerateManagedEventField { + get { + string val = Annotations.GetValue ("GenerateManagedEventField"); + if (val == null || val == "false") + return false; + if (val == "true") + return true; + + throw new Exception ("Invalid value for 'GenerateManagedEventField'. Must be 'true' or 'false'"); + } + } + public string EventDelegateType { get { string val = Annotations.GetValue ("DelegateType"); diff --git a/tools/generators/Generator.cs b/tools/generators/Generator.cs index 9710dc025..45f01c49d 100644 --- a/tools/generators/Generator.cs +++ b/tools/generators/Generator.cs @@ -343,6 +343,37 @@ class Generator { } } text.AppendLine ("\t}"); + + text.AppendLine ("\tinternal partial class Events {"); + text.AppendLine ("\t\tpublic static UnmanagedEventHandler CreateDispatcherFromEventId (int eventId, Delegate value) {"); + text.AppendLine ("\t\t\tswitch (eventId) {"); + + foreach (TypeInfo t in all.Children.SortedTypesByKind) { + if (t.GetEventCount () == 0) + continue; + + + foreach (FieldInfo field in t.Events) { + if (field.GenerateManagedEventField == false) + continue; + text.Append ("\t\t\t\tcase EventIds."); + text.Append (t.Name); + text.Append ("_"); + text.Append (field.EventName); + text.Append ("Event: return Events."); + + text.Append (GetDispatcherMethodName(field.EventDelegateType)); + text.Append (" (("); + text.Append (field.EventDelegateType); + text.Append (") value)"); + text.AppendLine (";"); + } + } + text.AppendLine ("\t\t\t\tdefault: throw new NotSupportedException ();"); + text.AppendLine ("\t\t\t}"); + text.AppendLine ("\t\t}"); + text.AppendLine ("\t}"); + text.AppendLine ("}"); sorted_types.Sort (new Members.MembersSortedByManagedFullName ()); @@ -440,6 +471,12 @@ class Generator { text.AppendLine (" }"); text.AppendLine ("\t\t}"); + + if (field.GenerateManagedEventField) { + text.Append ("\t\t"); + text.Append (string.Format ("public static readonly RoutedEvent {0}Event = new RoutedEvent (EventIds.{1}_{2}Event);", field.EventName, field.ParentType.Name, field.EventName)); + text.AppendLine (); + } } text.AppendLine ("\t}"); -- 2.11.4.GIT