-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
StaticRegistrar.cs
150 lines (132 loc) · 6.14 KB
/
StaticRegistrar.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.Collections.Generic;
using System.Reflection;
using Xamarin.Forms.Internals;
using Xamarin.Forms.Platform.Tizen.Native;
using Xamarin.Forms.PlatformConfiguration.TizenSpecific;
using Xamarin.Forms.Xaml.Internals;
namespace Xamarin.Forms.Platform.Tizen
{
public class StaticRegistrar<TRegistrable> where TRegistrable : class
{
readonly Dictionary<Type, Func<TRegistrable>> _handlers = new Dictionary<Type, Func<TRegistrable>>();
public void Register(Type tview, Func<TRegistrable> renderer)
{
if (renderer == null)
return;
_handlers[tview] = renderer;
}
public TOut GetHandler<TOut>(Type type, params object[] args) where TOut : class, TRegistrable
{
if (LookupHandler(type, out Func<TRegistrable> renderer))
{
return (TRegistrable)renderer() as TOut;
}
Log.Error("No handler could be found for that type :" + type);
return null;
}
public bool LookupHandler(Type viewType, out Func<TRegistrable> handler)
{
while (viewType != null && viewType != typeof(Element))
{
if (_handlers.TryGetValue(viewType, out handler))
return true;
viewType = viewType.GetTypeInfo().BaseType;
}
handler = null;
return false;
}
public TOut GetHandlerForObject<TOut>(object obj) where TOut : class, TRegistrable
{
return GetHandlerForObject<TOut>(obj, null);
}
public TOut GetHandlerForObject<TOut>(object obj, params object[] args) where TOut : class, TRegistrable
{
var reflectableType = obj as IReflectableType;
var type = reflectableType != null ? reflectableType.GetTypeInfo().AsType() : obj.GetType();
return GetHandler<TOut>(type, args);
}
}
public static class StaticRegistrar
{
public static StaticRegistrar<IRegisterable> Registered { get; internal set; }
static StaticRegistrar()
{
Registered = new StaticRegistrar<IRegisterable>();
}
public static void RegisterHandlers(Dictionary<Type, Func<IRegisterable>> customHandlers)
{
//Renderers
Registered.Register(typeof(Layout), () => new LayoutRenderer());
Registered.Register(typeof(ScrollView), () => new ScrollViewRenderer());
Registered.Register(typeof(CarouselPage), () => new CarouselPageRenderer());
Registered.Register(typeof(Page), () => new PageRenderer());
Registered.Register(typeof(NavigationPage), () => new NavigationPageRenderer());
Registered.Register(typeof(MasterDetailPage), () => new MasterDetailPageRenderer());
Registered.Register(typeof(TabbedPage), () => new TabbedPageRenderer());
Registered.Register(typeof(Label), () => new LabelRenderer());
Registered.Register(typeof(Button), () => new ButtonRenderer());
Registered.Register(typeof(Image), () => new ImageRenderer());
Registered.Register(typeof(Slider), () => new SliderRenderer());
Registered.Register(typeof(Picker), () => new PickerRenderer());
Registered.Register(typeof(Frame), () => new FrameRenderer());
Registered.Register(typeof(Stepper), () => new StepperRenderer());
Registered.Register(typeof(DatePicker), () => new DatePickerRenderer());
Registered.Register(typeof(TimePicker), () => new TimePickerRenderer());
Registered.Register(typeof(ProgressBar), () => new ProgressBarRenderer());
Registered.Register(typeof(Switch), () => new SwitchRenderer());
Registered.Register(typeof(CheckBox), () => new CheckBoxRenderer());
Registered.Register(typeof(ListView), () => new ListViewRenderer());
Registered.Register(typeof(BoxView), () => new BoxViewRenderer());
Registered.Register(typeof(ActivityIndicator), () => new ActivityIndicatorRenderer());
Registered.Register(typeof(SearchBar), () => new SearchBarRenderer());
Registered.Register(typeof(Entry), () => new EntryRenderer());
Registered.Register(typeof(Editor), () => new EditorRenderer());
Registered.Register(typeof(TableView), () => new TableViewRenderer());
Registered.Register(typeof(NativeViewWrapper), () => new NativeViewWrapperRenderer());
Registered.Register(typeof(WebView), () => new WebViewRenderer());
Registered.Register(typeof(ImageButton), () => new ImageButtonRenderer());
Registered.Register(typeof(StructuredItemsView), () => new StructuredItemsViewRenderer());
Registered.Register(typeof(CarouselView), () => new CarouselViewRenderer());
Registered.Register(typeof(SwipeView), () => new SwipeViewRenderer());
Registered.Register(typeof(RefreshView), () => new RefreshViewRenderer());
Registered.Register(typeof(MediaElement), () => new MediaElementRenderer());
Registered.Register(typeof(IndicatorView), () => new IndicatorViewRenderer());
Registered.Register(typeof(RadioButton), () => new RadioButtonRenderer());
if (Device.Idiom == TargetIdiom.Watch)
{
Registered.Register(typeof(Shell), () => new Watch.ShellRenderer());
}
else
{
Registered.Register(typeof(Shell), () => new ShellRenderer());
}
//ImageSourceHandlers
Registered.Register(typeof(FileImageSource), () => new FileImageSourceHandler());
Registered.Register(typeof(StreamImageSource), () => new StreamImageSourceHandler());
Registered.Register(typeof(UriImageSource), () => new UriImageSourceHandler());
//Cell Renderers
Registered.Register(typeof(TextCell), () => new TextCellRenderer());
Registered.Register(typeof(ImageCell), () => new ImageCellRenderer());
Registered.Register(typeof(SwitchCell), () => new SwitchCellRenderer());
Registered.Register(typeof(EntryCell), () => new EntryCellRenderer());
Registered.Register(typeof(ViewCell), () => new ViewCellRenderer());
//Font Loaders
Registered.Register(typeof(EmbeddedFont), () => new EmbeddedFontLoader());
//Dependencies
DependencyService.Register<ISystemResourcesProvider, ResourcesProvider>();
DependencyService.Register<IDeserializer, Deserializer>();
DependencyService.Register<INativeBindingService, NativeBindingService>();
DependencyService.Register<INativeValueConverterService, NativeValueConverterService>();
DependencyService.Register<IPlatformMediaPlayer, MediaPlayerImpl>();
//Custom Handlers
if (customHandlers != null)
{
foreach (KeyValuePair<Type, Func<IRegisterable>> handler in customHandlers)
{
Registered.Register(handler.Key, handler.Value);
}
}
}
}
}