Merge pull request #49 from jsuarezruiz/master
Added SearchBarRenderer and SearchBar Sample
This commit is contained in:
		
						commit
						4a996501c1
					
				| 
						 | 
				
			
			@ -14,8 +14,9 @@ using Xamarin.Forms;
 | 
			
		|||
[assembly: ExportRenderer(typeof(Image), typeof(ImageRenderer))]
 | 
			
		||||
[assembly: ExportRenderer(typeof(Label), typeof(LabelRenderer))]
 | 
			
		||||
[assembly: ExportRenderer(typeof(ProgressBar), typeof(ProgressBarRenderer))]
 | 
			
		||||
[assembly: ExportRenderer(typeof(TimePicker), typeof(TimePickerRenderer))]
 | 
			
		||||
[assembly: ExportRenderer(typeof(SearchBar), typeof(SearchBarRenderer))]
 | 
			
		||||
[assembly: ExportRenderer(typeof(Switch), typeof(SwitchRenderer))]
 | 
			
		||||
[assembly: ExportRenderer(typeof(TimePicker), typeof(TimePickerRenderer))]
 | 
			
		||||
[assembly: ExportImageSourceHandler(typeof(FileImageSource), typeof(FileImageSourceHandler))]
 | 
			
		||||
[assembly: ExportImageSourceHandler(typeof(StreamImageSource), typeof(StreamImagesourceHandler))]
 | 
			
		||||
[assembly: ExportImageSourceHandler(typeof(UriImageSource), typeof(ImageLoaderSourceHandler))]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,130 @@
 | 
			
		|||
using Ooui.Forms.Extensions;
 | 
			
		||||
using System;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Xamarin.Forms;
 | 
			
		||||
 | 
			
		||||
namespace Ooui.Forms.Renderers
 | 
			
		||||
{
 | 
			
		||||
    public class SearchBarRenderer : ViewRenderer<SearchBar, Div>
 | 
			
		||||
    {
 | 
			
		||||
        Input _searchBar;
 | 
			
		||||
        Button _searchButton;
 | 
			
		||||
        bool _disposed;
 | 
			
		||||
 | 
			
		||||
        IElementController ElementController => Element as IElementController;
 | 
			
		||||
 | 
			
		||||
        public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint)
 | 
			
		||||
        {
 | 
			
		||||
            var text = Element.Text;
 | 
			
		||||
            if (text == null || text.Length == 0)
 | 
			
		||||
            {
 | 
			
		||||
                text = Element.Placeholder;
 | 
			
		||||
            }
 | 
			
		||||
            Size size;
 | 
			
		||||
            if (text == null || text.Length == 0)
 | 
			
		||||
            {
 | 
			
		||||
                size = new Size(Element.FontSize * 0.25, Element.FontSize);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                size = text.MeasureSize(Element.FontFamily, Element.FontSize, Element.FontAttributes);
 | 
			
		||||
            }
 | 
			
		||||
            size = new Size(size.Width, size.Height * 1.428 + 14);
 | 
			
		||||
            return new SizeRequest(size, size);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void Dispose(bool disposing)
 | 
			
		||||
        {
 | 
			
		||||
            if (_disposed)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            _disposed = true;
 | 
			
		||||
 | 
			
		||||
            if (disposing)
 | 
			
		||||
            {
 | 
			
		||||
                if (Control != null && _searchBar != null && _searchButton != null)
 | 
			
		||||
                {
 | 
			
		||||
                    _searchBar.Change -= OnChange;
 | 
			
		||||
                    _searchButton.Click -= OnClick;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            base.Dispose(disposing);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
 | 
			
		||||
        {
 | 
			
		||||
            base.OnElementChanged(e);
 | 
			
		||||
 | 
			
		||||
            if (e.NewElement == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            if (Control == null)
 | 
			
		||||
            {
 | 
			
		||||
                var p = new Div { ClassName = "input-group" };
 | 
			
		||||
                var pb = new Span { ClassName = "input-group-btn" };
 | 
			
		||||
                _searchButton = new Button { ClassName = "btn btn-secondary", Text = "Search" };
 | 
			
		||||
                pb.AppendChild(_searchButton);
 | 
			
		||||
                _searchBar = new Input
 | 
			
		||||
                {
 | 
			
		||||
                    ClassName = "form-control",
 | 
			
		||||
                    Type = InputType.Text
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                p.AppendChild(_searchBar);
 | 
			
		||||
                p.AppendChild(pb);
 | 
			
		||||
          
 | 
			
		||||
                _searchBar.Change += OnChange;
 | 
			
		||||
                _searchButton.Click += OnClick;
 | 
			
		||||
 | 
			
		||||
                SetNativeControl(p);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            UpdateText();
 | 
			
		||||
            UpdateTextColor();
 | 
			
		||||
            UpdatePlaceholder();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            base.OnElementPropertyChanged(sender, e);
 | 
			
		||||
 | 
			
		||||
            if (e.PropertyName == SearchBar.TextProperty.PropertyName)
 | 
			
		||||
                UpdateText();
 | 
			
		||||
            else if (e.PropertyName == SearchBar.PlaceholderProperty.PropertyName)
 | 
			
		||||
                UpdatePlaceholder();
 | 
			
		||||
            else if (e.PropertyName == SearchBar.PlaceholderColorProperty.PropertyName)
 | 
			
		||||
                UpdatePlaceholder();
 | 
			
		||||
            else if(e.PropertyName == SearchBar.TextColorProperty.PropertyName)
 | 
			
		||||
                UpdateTextColor();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void UpdateText()
 | 
			
		||||
        {
 | 
			
		||||
            _searchBar.Value = Element.Text;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void UpdateTextColor()
 | 
			
		||||
        {
 | 
			
		||||
            var textColor = (Xamarin.Forms.Color)Element.GetValue(TimePicker.TextColorProperty);
 | 
			
		||||
 | 
			
		||||
            Control.Style.Color = textColor.ToOouiColor(Xamarin.Forms.Color.Black);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void UpdatePlaceholder()
 | 
			
		||||
        {
 | 
			
		||||
            _searchBar.Placeholder = Element.Placeholder ?? string.Empty;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void OnChange(object sender, EventArgs eventArgs)
 | 
			
		||||
        {
 | 
			
		||||
            if (_searchBar.Value != Element.Text)
 | 
			
		||||
                ElementController.SetValueFromRenderer(SearchBar.TextProperty, _searchBar.Value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void OnClick(object sender, TargetEventArgs e)
 | 
			
		||||
        {
 | 
			
		||||
            Element.OnSearchButtonPressed();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ namespace Samples
 | 
			
		|||
            new DisplayAlertSample ().Publish ();
 | 
			
		||||
            new DotMatrixClockSample().Publish();
 | 
			
		||||
            new EditorSample().Publish();
 | 
			
		||||
            new SearchBarSample().Publish();
 | 
			
		||||
            new TimePickerSample().Publish();
 | 
			
		||||
            new TipCalcSample().Publish();
 | 
			
		||||
            new WeatherAppSample().Publish();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
using Ooui;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using Xamarin.Forms;
 | 
			
		||||
 | 
			
		||||
namespace Samples
 | 
			
		||||
{
 | 
			
		||||
    public class SearchBarSample : ISample
 | 
			
		||||
    {
 | 
			
		||||
        private Xamarin.Forms.Label _resultsLabel;
 | 
			
		||||
        
 | 
			
		||||
        public string Title => "Xamarin.Forms SearchBar";
 | 
			
		||||
 | 
			
		||||
        public Ooui.Element CreateElement()
 | 
			
		||||
        {
 | 
			
		||||
            var panel = new StackLayout();
 | 
			
		||||
 | 
			
		||||
            var titleLabel = new Xamarin.Forms.Label
 | 
			
		||||
            {
 | 
			
		||||
                Text = "SearchBar",
 | 
			
		||||
                FontSize = 24,
 | 
			
		||||
                FontAttributes = FontAttributes.Bold,
 | 
			
		||||
            };
 | 
			
		||||
            panel.Children.Add(titleLabel);
 | 
			
		||||
 | 
			
		||||
            SearchBar searchBar = new SearchBar
 | 
			
		||||
            {
 | 
			
		||||
                Placeholder = "Xamarin.Forms Property",
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            searchBar.SearchButtonPressed += OnSearchBarButtonPressed;
 | 
			
		||||
 | 
			
		||||
            panel.Children.Add(searchBar);
 | 
			
		||||
 | 
			
		||||
            _resultsLabel = new Xamarin.Forms.Label();
 | 
			
		||||
            panel.Children.Add(_resultsLabel);
 | 
			
		||||
 | 
			
		||||
            var page = new ContentPage
 | 
			
		||||
            {
 | 
			
		||||
                Content = panel
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            return page.GetOouiElement();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void OnSearchBarButtonPressed(object sender, EventArgs args)
 | 
			
		||||
        {
 | 
			
		||||
            // Get the search text.
 | 
			
		||||
            SearchBar searchBar = (SearchBar)sender;
 | 
			
		||||
            string searchText = searchBar.Text;
 | 
			
		||||
 | 
			
		||||
            // Create a List and initialize the results Label.
 | 
			
		||||
            var list = new List<Tuple<Type, Type>>();
 | 
			
		||||
            _resultsLabel.Text = string.Empty;
 | 
			
		||||
 | 
			
		||||
            // Get Xamarin.Forms assembly.
 | 
			
		||||
            Assembly xamarinFormsAssembly = typeof(View).GetTypeInfo().Assembly;
 | 
			
		||||
 | 
			
		||||
            // Loop through all the types.
 | 
			
		||||
            foreach (Type type in xamarinFormsAssembly.ExportedTypes)
 | 
			
		||||
            {
 | 
			
		||||
                TypeInfo typeInfo = type.GetTypeInfo();
 | 
			
		||||
 | 
			
		||||
                // Public types only.
 | 
			
		||||
                if (typeInfo.IsPublic)
 | 
			
		||||
                {
 | 
			
		||||
                    // Loop through the properties.
 | 
			
		||||
                    foreach (PropertyInfo property in typeInfo.DeclaredProperties)
 | 
			
		||||
                    {
 | 
			
		||||
                        // Check for a match
 | 
			
		||||
                        if (property.Name.Equals(searchText))
 | 
			
		||||
                        {
 | 
			
		||||
                            // Add it to the list.
 | 
			
		||||
                            list.Add(Tuple.Create<Type, Type>(type, property.PropertyType));
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (list.Count == 0)
 | 
			
		||||
            {
 | 
			
		||||
                _resultsLabel.Text =
 | 
			
		||||
                    String.Format("No Xamarin.Forms properties with " +
 | 
			
		||||
                                  "the name of {0} were found",
 | 
			
		||||
                                  searchText);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                _resultsLabel.Text = "The ";
 | 
			
		||||
 | 
			
		||||
                foreach (Tuple<Type, Type> tuple in list)
 | 
			
		||||
                {
 | 
			
		||||
                    _resultsLabel.Text +=
 | 
			
		||||
                        String.Format("{0} type defines a property named {1} of type {2}",
 | 
			
		||||
                                      tuple.Item1.Name, searchText, tuple.Item2.Name);
 | 
			
		||||
 | 
			
		||||
                    if (tuple != list.Last())
 | 
			
		||||
                    {
 | 
			
		||||
                        _resultsLabel.Text += "; and the ";
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                _resultsLabel.Text += ".";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Publish()
 | 
			
		||||
        {
 | 
			
		||||
            UI.Publish("/searchbar", CreateElement);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue