summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Tizen/Renderers/LabelRenderer.cs
blob: d1d9c96da1f556e97e74a26d886c57746b233a60 (plain)
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
using EColor = ElmSharp.Color;
using Specific = Xamarin.Forms.PlatformConfiguration.TizenSpecific.Label;

namespace Xamarin.Forms.Platform.Tizen
{

	public class LabelRenderer : ViewRenderer<Label, Native.Label>
	{

		public LabelRenderer()
		{
			RegisterPropertyHandler(Label.TextProperty, () => Control.Text = Element.Text);
			RegisterPropertyHandler(Label.TextColorProperty, UpdateTextColor);
			// FontProperty change is called also for FontSizeProperty, FontFamilyProperty and FontAttributesProperty change
			RegisterPropertyHandler(Label.FontProperty, UpdateFontProperties);
			RegisterPropertyHandler(Label.LineBreakModeProperty, UpdateLineBreakMode);
			RegisterPropertyHandler(Label.HorizontalTextAlignmentProperty, UpdateTextAlignment);
			RegisterPropertyHandler(Label.VerticalTextAlignmentProperty, UpdateTextAlignment);
			RegisterPropertyHandler(Label.FormattedTextProperty, UpdateFormattedText);
			RegisterPropertyHandler(Specific.FontWeightProperty, UpdateFontWeight);
		}

		protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
		{
			if (Control == null)
			{
				var label = new Native.Label(Forms.Context.MainWindow);
				base.SetNativeControl(label);
			}

			if (e.OldElement != null)
			{
			}

			if (e.NewElement != null)
			{
			}

			base.OnElementChanged(e);
		}

		protected override Size MinimumSize()
		{
			return Control.Measure(Control.MinimumWidth, Control.MinimumHeight).ToDP();
		}

		Native.FormattedString ConvertFormattedText(FormattedString formattedString)
		{
			if (formattedString == null)
			{
				return null;
			}

			Native.FormattedString nativeString = new Native.FormattedString();

			foreach (var span in formattedString.Spans)
			{
				Native.Span nativeSpan = new Native.Span();
				nativeSpan.Text = span.Text;
				nativeSpan.FontAttributes = span.FontAttributes;
				nativeSpan.FontFamily = span.FontFamily;
				nativeSpan.FontSize = span.FontSize;
				nativeSpan.ForegroundColor = span.ForegroundColor.ToNative();
				nativeSpan.BackgroundColor = span.BackgroundColor.ToNative();
				nativeString.Spans.Add(nativeSpan);
			}

			return nativeString;
		}

		void UpdateFormattedText()
		{
			if (Element.FormattedText != null)
				Control.FormattedText = ConvertFormattedText(Element.FormattedText);
		}

		void UpdateTextColor()
		{
			Control.TextColor = Element.TextColor.ToNative();
		}

		void UpdateTextAlignment()
		{
			Control.HorizontalTextAlignment = Element.HorizontalTextAlignment.ToNative();
			Control.VerticalTextAlignment = Element.VerticalTextAlignment.ToNative();
		}

		void UpdateFontProperties()
		{
			Control.FontSize = Element.FontSize;
			Control.FontAttributes = Element.FontAttributes;
			Control.FontFamily = Element.FontFamily;
		}

		void UpdateLineBreakMode()
		{
			Control.LineBreakMode = ConvertToNativeLineBreakMode(Element.LineBreakMode);
		}

		void UpdateFontWeight()
		{
			Control.FontWeight = Specific.GetFontWeight(Element);
		}

		Native.LineBreakMode ConvertToNativeLineBreakMode(LineBreakMode mode)
		{
			switch (mode)
			{
				case LineBreakMode.CharacterWrap:
					return Native.LineBreakMode.CharacterWrap;
				case LineBreakMode.HeadTruncation:
					return Native.LineBreakMode.HeadTruncation;
				case LineBreakMode.MiddleTruncation:
					return Native.LineBreakMode.MiddleTruncation;
				case LineBreakMode.NoWrap:
					return Native.LineBreakMode.NoWrap;
				case LineBreakMode.TailTruncation:
					return Native.LineBreakMode.TailTruncation;
				case LineBreakMode.WordWrap:
				default:
					return Native.LineBreakMode.WordWrap;
			}
		}
	}
}