From 676c2e20d47a283c2fcbec49cb5449bf278946b2 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 11 Sep 2015 20:49:31 +0300 Subject: [PATCH] Html: Implemented event propagation --- src/Perspex.HtmlRenderer/HtmlControl.cs | 111 +++++++----------- ...pper.cs => HtmlRendererRoutedEventArgs.cs} | 2 +- .../Perspex.HtmlRenderer.csproj | 2 +- 3 files changed, 46 insertions(+), 69 deletions(-) rename src/Perspex.HtmlRenderer/{RoutedEventArgsWrapper.cs => HtmlRendererRoutedEventArgs.cs} (77%) diff --git a/src/Perspex.HtmlRenderer/HtmlControl.cs b/src/Perspex.HtmlRenderer/HtmlControl.cs index a9f9dc9d9a..87d06a1864 100644 --- a/src/Perspex.HtmlRenderer/HtmlControl.cs +++ b/src/Perspex.HtmlRenderer/HtmlControl.cs @@ -56,8 +56,6 @@ namespace Perspex.Controls public class HtmlControl : Control { - #region Fields and Consts - /// /// Underline html container instance. /// @@ -73,11 +71,6 @@ namespace Perspex.Controls /// protected Point _lastScrollOffset; - #endregion - - - #region Dependency properties / routed events - public static readonly PerspexProperty AvoidImagesLateLoadingProperty = PropertyHelper.Register("AvoidImagesLateLoading", false, OnPerspexProperty_valueChanged); public static readonly PerspexProperty IsSelectionEnabledProperty = @@ -106,19 +99,18 @@ namespace Perspex.Controls public static readonly RoutedEvent LoadCompleteEvent = RoutedEvent.Register("LoadComplete", RoutingStrategies.Bubble, typeof(HtmlControl)); public static readonly RoutedEvent LinkClickedEvent = - RoutedEvent.Register>("LinkClicked", RoutingStrategies.Bubble, typeof(HtmlControl)); + RoutedEvent.Register>("LinkClicked", RoutingStrategies.Bubble, typeof(HtmlControl)); public static readonly RoutedEvent RenderErrorEvent - = RoutedEvent.Register>("RenderError", RoutingStrategies.Bubble, typeof(HtmlControl)); + = RoutedEvent.Register>("RenderError", RoutingStrategies.Bubble, typeof(HtmlControl)); public static readonly RoutedEvent RefreshEvent - = RoutedEvent.Register< RoutedEventArgsWrapper>("Refresh", RoutingStrategies.Bubble, typeof(HtmlControl)); + = RoutedEvent.Register>("Refresh", RoutingStrategies.Bubble, typeof(HtmlControl)); public static readonly RoutedEvent StylesheetLoadEvent - = RoutedEvent.Register>("StylesheetLoad", RoutingStrategies.Bubble, typeof(HtmlControl)); + = RoutedEvent.Register>("StylesheetLoad", RoutingStrategies.Bubble, typeof(HtmlControl)); public static readonly RoutedEvent ImageLoadEvent - = RoutedEvent.Register>("ImageLoad", RoutingStrategies.Bubble, + = RoutedEvent.Register>("ImageLoad", RoutingStrategies.Bubble, typeof (HtmlControl)); - #endregion /// @@ -126,20 +118,20 @@ namespace Perspex.Controls /// protected HtmlControl() { - _htmlContainer = new HtmlContainer();/* - _htmlContainer.LoadComplete += OnLoadComplete; - _htmlContainer.LinkClicked += OnLinkClicked; - _htmlContainer.RenderError += OnRenderError; - _htmlContainer.Refresh += OnRefresh; - _htmlContainer.StylesheetLoad += OnStylesheetLoad; - _htmlContainer.ImageLoad += OnImageLoad;*/ + _htmlContainer = new HtmlContainer(); + _htmlContainer.LoadComplete += (_, e) => OnLoadComplete(e); + _htmlContainer.LinkClicked += (_, e) => OnLinkClicked(e); + _htmlContainer.RenderError += (_, e) => OnRenderError(e); + _htmlContainer.Refresh += (_, e) => OnRefresh(e); + _htmlContainer.StylesheetLoad += (_, e) => OnStylesheetLoad(e); + _htmlContainer.ImageLoad += (_, e) => OnImageLoad(e); } /// /// Raised when the set html document has been fully loaded.
/// Allows manipulation of the html dom, scroll position, etc. ///
- public event EventHandler LoadComplete + public event EventHandler> LoadComplete { add { AddHandler(LoadCompleteEvent, value); } remove { RemoveHandler(LoadCompleteEvent, value); } @@ -149,7 +141,7 @@ namespace Perspex.Controls /// Raised when the user clicks on a link in the html.
/// Allows canceling the execution of the link. /// - public event EventHandler LinkClicked + public event EventHandler> LinkClicked { add { AddHandler(LinkClickedEvent, value); } remove { RemoveHandler(LinkClickedEvent, value); } @@ -158,7 +150,7 @@ namespace Perspex.Controls /// /// Raised when an error occurred during html rendering.
///
- public event EventHandler RenderError + public event EventHandler> RenderError { add { AddHandler(RenderErrorEvent, value); } remove { RemoveHandler(RenderErrorEvent, value); } @@ -169,7 +161,7 @@ namespace Perspex.Controls /// This event allows to provide the stylesheet manually or provide new source (file or uri) to load from.
/// If no alternative data is provided the original source will be used.
/// - public event EventHandler StylesheetLoad + public event EventHandler> StylesheetLoad { add { AddHandler(StylesheetLoadEvent, value); } remove { RemoveHandler(StylesheetLoadEvent, value); } @@ -179,7 +171,7 @@ namespace Perspex.Controls /// Raised when an image is about to be loaded by file path or URI.
/// This event allows to provide the image manually, if not handled the image will be loaded from file or download from URI. /// - public event EventHandler ImageLoad + public event EventHandler> ImageLoad { add { AddHandler(ImageLoadEvent, value); } remove { RemoveHandler(ImageLoadEvent, value); } @@ -322,8 +314,7 @@ namespace Perspex.Controls _htmlContainer.ClearSelection(); } - - #region Private methods + //HACK: We don't have support for RenderSize for now private Size RenderSize => new Size(Bounds.Width, Bounds.Height); @@ -443,50 +434,42 @@ namespace Perspex.Controls _htmlContainer.HandleKeyDown(this, e); } + void RaiseRouted(RoutedEvent ev, T arg) + { + var e =new HtmlRendererRoutedEventArgs + { + Event = arg, + Source = this, + RoutedEvent = ev, + Route = ev.RoutingStrategies + }; + RaiseEvent(e); + } + /// /// Propagate the LoadComplete event from root container. /// - protected virtual void OnLoadComplete(EventArgs e) - { - //RoutedEventArgs newEventArgs = new RoutedEventArgs(LoadCompleteEvent, this, e); - //RaiseEvent(newEventArgs); - } + protected virtual void OnLoadComplete(EventArgs e) => RaiseRouted(LoadCompleteEvent, e); /// /// Propagate the LinkClicked event from root container. /// - protected virtual void OnLinkClicked(HtmlLinkClickedEventArgs e) - { - //RoutedEventArgs newEventArgs = new RoutedEvenArgs(LinkClickedEvent, this, e); - //RaiseEvent(newEventArgs); - } + protected virtual void OnLinkClicked(HtmlLinkClickedEventArgs e) => RaiseRouted(LinkClickedEvent, e); /// /// Propagate the Render Error event from root container. /// - protected virtual void OnRenderError(HtmlRenderErrorEventArgs e) - { - //RoutedEventArgs newEventArgs = new RoutedEvenArgs(RenderErrorEvent, this, e); - //RaiseEvent(newEventArgs); - } + protected virtual void OnRenderError(HtmlRenderErrorEventArgs e) => RaiseRouted(RenderErrorEvent, e); /// /// Propagate the stylesheet load event from root container. /// - protected virtual void OnStylesheetLoad(HtmlStylesheetLoadEventArgs e) - { - //RoutedEventArgs newEventArgs = new RoutedEvenArgs(StylesheetLoadEvent, this, e); - //RaiseEvent(newEventArgs); - } + protected virtual void OnStylesheetLoad(HtmlStylesheetLoadEventArgs e) => RaiseRouted(StylesheetLoadEvent, e); /// /// Propagate the image load event from root container. /// - protected virtual void OnImageLoad(HtmlImageLoadEventArgs e) - { - //RoutedEventArgs newEventArgs = new RoutedEvenArgs(ImageLoadEvent, this, e); - //RaiseEvent(newEventArgs); - } + protected virtual void OnImageLoad(HtmlImageLoadEventArgs e) => RaiseRouted(ImageLoadEvent, e); /// /// Handle html renderer invalidate and re-layout as requested. @@ -526,7 +509,8 @@ namespace Perspex.Controls /// /// Handle when dependency property value changes to update the underline HtmlContainer with the new value. /// - private static void OnPerspexProperty_valueChanged(PerspexObject PerspexObject, PerspexPropertyChangedEventArgs e) + private static void OnPerspexProperty_valueChanged(PerspexObject PerspexObject, + PerspexPropertyChangedEventArgs e) { var control = PerspexObject as HtmlControl; if (control != null) @@ -534,26 +518,26 @@ namespace Perspex.Controls var htmlContainer = control._htmlContainer; if (e.Property == AvoidImagesLateLoadingProperty) { - htmlContainer.AvoidImagesLateLoading = (bool)e.NewValue; + htmlContainer.AvoidImagesLateLoading = (bool) e.NewValue; } else if (e.Property == IsSelectionEnabledProperty) { - htmlContainer.IsSelectionEnabled = (bool)e.NewValue; + htmlContainer.IsSelectionEnabled = (bool) e.NewValue; } else if (e.Property == IsContextMenuEnabledProperty) { - htmlContainer.IsContextMenuEnabled = (bool)e.NewValue; + htmlContainer.IsContextMenuEnabled = (bool) e.NewValue; } else if (e.Property == BaseStylesheetProperty) { - var baseCssData = CssData.Parse(PerspexAdapter.Instance, (string)e.NewValue); + var baseCssData = CssData.Parse(PerspexAdapter.Instance, (string) e.NewValue); control._baseCssData = baseCssData; htmlContainer.SetHtml(control.Text, baseCssData); } else if (e.Property == TextProperty) { htmlContainer.ScrollOffset = new Point(0, 0); - htmlContainer.SetHtml((string)e.NewValue, control._baseCssData); + htmlContainer.SetHtml((string) e.NewValue, control._baseCssData); control.InvalidateMeasure(); control.InvalidateVisual(); control.InvokeMouseMove(); @@ -562,10 +546,8 @@ namespace Perspex.Controls } - #region Private event handlers - - - /* TODO: Implement events + //TODO: Implement CheckAccess calls + /* private void OnLoadComplete(object sender, EventArgs e) { @@ -616,10 +598,5 @@ namespace Perspex.Controls Dispatcher.Invoke(new Action(OnRefresh), e); } */ - - #endregion - - - #endregion } } \ No newline at end of file diff --git a/src/Perspex.HtmlRenderer/RoutedEventArgsWrapper.cs b/src/Perspex.HtmlRenderer/HtmlRendererRoutedEventArgs.cs similarity index 77% rename from src/Perspex.HtmlRenderer/RoutedEventArgsWrapper.cs rename to src/Perspex.HtmlRenderer/HtmlRendererRoutedEventArgs.cs index 625c296d00..61f2ccb1fa 100644 --- a/src/Perspex.HtmlRenderer/RoutedEventArgsWrapper.cs +++ b/src/Perspex.HtmlRenderer/HtmlRendererRoutedEventArgs.cs @@ -7,7 +7,7 @@ using Perspex.Interactivity; namespace Perspex.HtmlRenderer { - public class RoutedEventArgsWrapper : RoutedEventArgs + public class HtmlRendererRoutedEventArgs : RoutedEventArgs { public T Event { get; set; } } diff --git a/src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj b/src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj index 47e6491bf0..197ca7634d 100644 --- a/src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj +++ b/src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj @@ -131,7 +131,7 @@ - +