From 8317b5244bc12ee70e614ce994e1b2bf2fbd0284 Mon Sep 17 00:00:00 2001 From: "Frank A. Krueger" Date: Sun, 26 Nov 2017 11:30:19 -0800 Subject: [PATCH] Add Entry and XAML Preview sample --- Ooui.Forms/Exports.cs | 1 + Ooui.Forms/Renderers/EditorRenderer.cs | 129 +++++++++++++++++++++++++ Samples/Samples.csproj | 14 ++- Samples/XamlPreviewPage.xaml | 17 ++++ Samples/XamlPreviewPage.xaml.cs | 46 +++++++++ Samples/XamlPreviewPageSample.cs | 17 ++++ 6 files changed, 220 insertions(+), 4 deletions(-) create mode 100644 Ooui.Forms/Renderers/EditorRenderer.cs create mode 100644 Samples/XamlPreviewPage.xaml create mode 100644 Samples/XamlPreviewPage.xaml.cs create mode 100644 Samples/XamlPreviewPageSample.cs diff --git a/Ooui.Forms/Exports.cs b/Ooui.Forms/Exports.cs index c231e3d..c823d1b 100644 --- a/Ooui.Forms/Exports.cs +++ b/Ooui.Forms/Exports.cs @@ -9,6 +9,7 @@ using Xamarin.Forms.Internals; [assembly: ExportRenderer (typeof (BoxView), typeof (BoxRenderer))] [assembly: ExportRenderer (typeof (Button), typeof (ButtonRenderer))] [assembly: ExportRenderer (typeof (DatePicker), typeof (DatePickerRenderer))] +[assembly: ExportRenderer (typeof (Editor), typeof (EditorRenderer))] [assembly: ExportRenderer (typeof (Entry), typeof (EntryRenderer))] [assembly: ExportRenderer (typeof (Label), typeof (LabelRenderer))] [assembly: ExportRenderer (typeof (ProgressBar), typeof (ProgressBarRenderer))] diff --git a/Ooui.Forms/Renderers/EditorRenderer.cs b/Ooui.Forms/Renderers/EditorRenderer.cs new file mode 100644 index 0000000..880c51e --- /dev/null +++ b/Ooui.Forms/Renderers/EditorRenderer.cs @@ -0,0 +1,129 @@ +using System; +using System.ComponentModel; +using Xamarin.Forms; +using Ooui.Forms.Extensions; + +namespace Ooui.Forms.Renderers +{ + public class EditorRenderer : ViewRenderer + { + bool _disposed; + IEditorController ElementController => Element; + + protected override void Dispose (bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) { + if (Control != null) { + Control.Changed -= HandleChanged; + //Control.Started -= OnStarted; + //Control.Ended -= OnEnded; + } + } + + base.Dispose (disposing); + } + + protected override void OnElementChanged (ElementChangedEventArgs e) + { + base.OnElementChanged (e); + + if (e.NewElement == null) + return; + + if (Control == null) { + SetNativeControl (new TextArea { + ClassName = "form-control" + }); + + Control.Changed += HandleChanged; + //Control.Started += OnStarted; + //Control.Ended += OnEnded; + } + + UpdateText (); + UpdateFont (); + UpdateTextColor (); + UpdateKeyboard (); + UpdateEditable (); + UpdateTextAlignment (); + } + + protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged (sender, e); + + if (e.PropertyName == Editor.TextProperty.PropertyName) + UpdateText (); + else if (e.PropertyName == Xamarin.Forms.InputView.KeyboardProperty.PropertyName) + UpdateKeyboard (); + else if (e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + UpdateEditable (); + else if (e.PropertyName == Editor.TextColorProperty.PropertyName) + UpdateTextColor (); + else if (e.PropertyName == Editor.FontAttributesProperty.PropertyName) + UpdateFont (); + else if (e.PropertyName == Editor.FontFamilyProperty.PropertyName) + UpdateFont (); + else if (e.PropertyName == Editor.FontSizeProperty.PropertyName) + UpdateFont (); + } + + void HandleChanged (object sender, EventArgs e) + { + ElementController.SetValueFromRenderer (Editor.TextProperty, Control.Text); + } + + void OnEnded (object sender, EventArgs eventArgs) + { + if (Control.Text != Element.Text) + ElementController.SetValueFromRenderer (Editor.TextProperty, Control.Text); + + Element.SetValue (VisualElement.IsFocusedPropertyKey, false); + ElementController.SendCompleted (); + } + + void OnStarted (object sender, EventArgs eventArgs) + { + ElementController.SetValueFromRenderer (VisualElement.IsFocusedPropertyKey, true); + } + + void UpdateEditable () + { + Control.IsDisabled = !Element.IsEnabled; + } + + void UpdateFont () + { + Element.SetStyleFont (Element.FontFamily, Element.FontSize, Element.FontAttributes, Control.Style); + } + + void UpdateKeyboard () + { + } + + void UpdateText () + { + if (Control.Text != Element.Text) + Control.Text = Element.Text; + } + + void UpdateTextAlignment () + { + } + + void UpdateTextColor () + { + var textColor = Element.TextColor; + + if (textColor.IsDefault) + Control.Style.Color = "black"; + else + Control.Style.Color = textColor.ToOouiColor (); + } + } +} diff --git a/Samples/Samples.csproj b/Samples/Samples.csproj index 2f5ef34..8666c6a 100644 --- a/Samples/Samples.csproj +++ b/Samples/Samples.csproj @@ -18,11 +18,14 @@ - - *.xaml + + ButtonXamlPage.xaml - - *.xaml + + DisplayAlertPage.xaml + + + XamlPreviewPage.xaml @@ -33,6 +36,9 @@ MSBuild:UpdateDesignTimeXaml + + MSBuild:UpdateDesignTimeXaml + diff --git a/Samples/XamlPreviewPage.xaml b/Samples/XamlPreviewPage.xaml new file mode 100644 index 0000000..93adffc --- /dev/null +++ b/Samples/XamlPreviewPage.xaml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Samples/XamlPreviewPage.xaml.cs b/Samples/XamlPreviewPage.xaml.cs new file mode 100644 index 0000000..2a7ba12 --- /dev/null +++ b/Samples/XamlPreviewPage.xaml.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +using Xamarin.Forms; + +namespace Samples +{ + public partial class XamlPreviewPage : ContentPage + { + public XamlPreviewPage () + { + InitializeComponent (); + + editor.Text = @" + + + + + + + + + + +"; + DisplayXaml (); + } + + public void DisplayXaml () + { + var asm = typeof (Xamarin.Forms.Xaml.Internals.XamlTypeResolver).Assembly; + var xamlLoaderType = asm.GetType ("Xamarin.Forms.Xaml.XamlLoader"); + var loadArgTypes = new[] { typeof (object), typeof (string) }; + var loadMethod = xamlLoaderType.GetMethod ("Load", System.Reflection.BindingFlags.Static|System.Reflection.BindingFlags.Public, null, System.Reflection.CallingConventions.Any, loadArgTypes, null); + var contentView = new ContentView (); + loadMethod.Invoke (null, new object[] { contentView, editor.Text }); + results.Content = contentView; + } + } +} diff --git a/Samples/XamlPreviewPageSample.cs b/Samples/XamlPreviewPageSample.cs new file mode 100644 index 0000000..0f38ff5 --- /dev/null +++ b/Samples/XamlPreviewPageSample.cs @@ -0,0 +1,17 @@ +using System; + +using Xamarin.Forms; + +namespace Samples +{ + public class XamlPreviewPageSample : ISample + { + public string Title => "Xamarin.Forms XAML Editor"; + + public Ooui.Element CreateElement () + { + var page = new XamlPreviewPage (); + return page.GetOouiElement (); + } + } +}