summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Tizen/Renderers/LabelRenderer.cs
blob: 24e93bcafa8eaa51b6a4672881b5190ff85192dd (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
using EColor = ElmSharp.Color;

namespace Xamarin.Forms.Platform.Tizen
{

	public class LabelRenderer : ViewRenderer<Label, Native.Label>
	{
		static readonly EColor s_defaultBackgroundColor = EColor.Transparent;
		static readonly EColor s_defaultForegroundColor = EColor.Black;
		static readonly EColor s_defaultTextColor = s_defaultForegroundColor;

		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, () => Control.FormattedText = ConvertFormattedText(Element.FormattedText));
		}

		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 new Size(Control.MinimumWidth, Control.MinimumHeight);
		}

		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.FormattedText = span.Text;
				nativeSpan.FontAttributes = span.FontAttributes == FontAttributes.None ? Element.FontAttributes : span.FontAttributes;
				nativeSpan.FontFamily = span.FontFamily == null ? Element.FontFamily : span.FontFamily;
				nativeSpan.FontSize = span.FontSize == Device.GetNamedSize(NamedSize.Default, typeof(Label), true) ? Element.FontSize : span.FontSize;

				if (span.ForegroundColor.IsDefault)
					nativeSpan.ForegroundColor = Element.TextColor.IsDefault ? s_defaultForegroundColor : Element.TextColor.ToNative();
				else
					nativeSpan.ForegroundColor = span.ForegroundColor.ToNative();

				if (span.BackgroundColor.IsDefault)
					nativeSpan.BackgroundColor = Element.BackgroundColor.IsDefault ? s_defaultBackgroundColor : Element.BackgroundColor.ToNative();
				else
					nativeSpan.BackgroundColor = span.BackgroundColor.ToNative();

				nativeString.Spans.Add(nativeSpan);
			}

			return nativeString;
		}

		void UpdateTextColor()
		{
			Control.TextColor = Element.TextColor.IsDefault ? s_defaultTextColor : 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);
		}

		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;
			}
		}
	}
}