1 /* Copyright (c) 2021 Samsung Electronics Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
17 using Tizen.NUI.BaseComponents;
18 using System.Collections.Generic;
19 using System.Collections.ObjectModel;
20 using System.ComponentModel;
21 using System.Diagnostics.CodeAnalysis;
22 using System.Globalization;
24 namespace Tizen.NUI.Components
27 /// TimeChangedEventArgs is a class to notify changed TimePicker value argument which will sent to user.
29 [EditorBrowsable(EditorBrowsableState.Never)]
30 public class TimeChangedEventArgs : EventArgs
33 /// TimeChangedEventArgs default constructor.
34 /// <param name="time">time value of TimePicker.</param>
36 [EditorBrowsable(EditorBrowsableState.Never)]
37 public TimeChangedEventArgs(DateTime time)
43 /// TimeChangedEventArgs default constructor.
44 /// <returns>The current time value of TimePicker.</returns>
46 [EditorBrowsable(EditorBrowsableState.Never)]
47 public DateTime Time { get; }
51 /// TimePicker is a class which provides a function that allows the user to select
52 /// a time through a scrolling motion by expressing the specified value as a list.
53 /// TimePicker expresses the current time using the locale information of the system.
55 [EditorBrowsable(EditorBrowsableState.Never)]
56 public class TimePicker : Control
59 private bool is24HourView;
60 private DateTime currentTime;
61 private String[] ampmText;
62 private Picker hourPicker;
63 private Picker minutePicker;
64 private Picker ampmPicker;
67 /// Creates a new instance of TimePicker.
69 [EditorBrowsable(EditorBrowsableState.Never)]
75 /// Creates a new instance of TimePicker.
77 /// <param name="style">Creates TimePicker by special style defined in UX.</param>
78 [EditorBrowsable(EditorBrowsableState.Never)]
79 public TimePicker(string style) : base(style)
84 /// Creates a new instance of TimePicker.
86 /// <param name="timePickerStyle">Creates TimePicker by style customized by user.</param>
87 [EditorBrowsable(EditorBrowsableState.Never)]
88 public TimePicker(TimePickerStyle timePickerStyle) : base(timePickerStyle)
93 /// Dispose TimePicker and all children on it.
95 /// <param name="type">Dispose type.</param>
96 [EditorBrowsable(EditorBrowsableState.Never)]
97 protected override void Dispose(DisposeTypes type)
104 if (type == DisposeTypes.Explicit)
107 Utility.Dispose(hourPicker);
109 Remove(minutePicker);
110 Utility.Dispose(minutePicker);
113 Utility.Dispose(ampmPicker);
121 /// An event emitted when TimePicker value changed, user can subscribe or unsubscribe to this event handler.
123 [EditorBrowsable(EditorBrowsableState.Never)]
124 public event EventHandler<TimeChangedEventArgs> TimeChanged;
127 /// The hour value of TimePicker.
129 [EditorBrowsable(EditorBrowsableState.Never)]
141 if (currentTime.Hour >= 12 && currentTime.Hour <= 23)
144 if (currentTime.Hour == 12) hourPicker.CurrentValue = currentTime.Hour;
145 else hourPicker.CurrentValue = currentTime.Hour - 12;
146 ampmPicker.CurrentValue = 2;
151 hourPicker.CurrentValue = currentTime.Hour;
152 ampmPicker.CurrentValue = 1;
155 else hourPicker.CurrentValue = currentTime.Hour;
157 minutePicker.CurrentValue = currentTime.Minute;
162 /// The is24hourview value of TimePicker.
164 [EditorBrowsable(EditorBrowsableState.Never)]
165 public bool Is24HourView
173 if (is24HourView == value) return;
175 Console.WriteLine(" Is 24 Hour View");
176 is24HourView = value;
180 hourPicker.MinValue = 0;
181 hourPicker.MaxValue = 23;
182 hourPicker.CurrentValue = currentTime.Hour;
186 hourPicker.MinValue = 1;
187 hourPicker.MaxValue = 12;
188 PickersOrderSet(true);
190 if (currentTime.Hour > 12)
192 ampmPicker.CurrentValue = 2;
193 hourPicker.CurrentValue = currentTime.Hour - 12;
200 /// Initialize TimePicker object.
202 [EditorBrowsable(EditorBrowsableState.Never)]
203 public override void OnInitialize()
206 SetAccessibilityConstructor(Role.DateEditor);
208 hourPicker = new Picker()
213 hourPicker.ValueChanged += OnHourValueChanged;
215 minutePicker = new Picker()
220 minutePicker.ValueChanged += OnMinuteValueChanged;
222 ampmPicker = new Picker()
227 ampmPicker.ValueChanged += OnAmpmValueChanged;
229 currentTime = DateTime.Now;
230 Console.WriteLine(" Time " + currentTime.Hour + " " + currentTime.Minute);
231 if (currentTime.Hour > 12)
233 ampmPicker.CurrentValue = 2;
234 hourPicker.CurrentValue = currentTime.Hour - 12;
237 hourPicker.CurrentValue = currentTime.Hour;
239 minutePicker.CurrentValue = currentTime.Minute;
245 /// Applies style to TimePicker.
247 /// <param name="viewStyle">The style to apply.</param>
248 [EditorBrowsable(EditorBrowsableState.Never)]
249 public override void ApplyStyle(ViewStyle viewStyle)
251 base.ApplyStyle(viewStyle);
253 var timePickerStyle = viewStyle as TimePickerStyle;
255 if (timePickerStyle == null) return;
258 if (timePickerStyle?.CellPadding != null && Layout != null)
259 ((LinearLayout)Layout).CellPadding = new Size2D(timePickerStyle.CellPadding.Width, timePickerStyle.CellPadding.Height);
261 //Apply Internal Pickers style.
262 if (timePickerStyle?.Pickers != null && hourPicker != null && minutePicker != null && ampmPicker != null)
264 hourPicker.ApplyStyle(timePickerStyle.Pickers);
265 minutePicker.ApplyStyle(timePickerStyle.Pickers);
266 ampmPicker.ApplyStyle(timePickerStyle.Pickers);
270 [SuppressMessage("Microsoft.Reliability",
271 "CA2000:DisposeObjectsBeforeLosingScope",
272 Justification = "The CellPadding will be dispose when the time picker disposed")]
273 private void Initialize()
275 HeightSpecification = LayoutParamPolicies.MatchParent;
277 Layout = new LinearLayout() {
278 LinearOrientation = LinearLayout.Orientation.Horizontal,
280 Console.WriteLine("initialize");
282 is24HourView = false;
284 PickersOrderSet(false);
288 private void ChangeTime(int hour, int minute, bool hourUpdate)
291 currentTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hour, currentTime.Minute, 0);
293 currentTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, currentTime.Hour, minute, 0);
296 private void OnHourValueChanged(object sender, ValueChangedEventArgs e)
298 if (currentTime.Hour == e.Value) return;
304 if (e.Value == 12) ChangeTime(12, 0, true);
305 else ChangeTime(e.Value, 0, true);
309 if (e.Value == 12) ChangeTime(0, 0, true);
310 else ChangeTime(e.Value + 12, 0, true);
314 ChangeTime(e.Value, 0, true);
319 private void OnMinuteValueChanged(object sender, ValueChangedEventArgs e)
321 if (currentTime.Minute == e.Value) return;
323 ChangeTime(0, e.Value, false);
328 private void OnAmpmValueChanged(object sender, ValueChangedEventArgs e)
330 if ((isAm && e.Value == 1) || (!isAm && e.Value == 2)) return;
334 if (currentTime.Hour > 12 || currentTime.Hour == 0)
336 if (currentTime.Hour == 0) ChangeTime(12, 0, true);
337 else ChangeTime(currentTime.Hour - 12, 0, true);
343 if (currentTime.Hour > 0 && currentTime.Hour <= 12)
345 if (currentTime.Hour == 12) ChangeTime(0, 0, true);
346 else ChangeTime(currentTime.Hour + 12, 0, true);
354 private void OnTimeChanged()
356 TimeChangedEventArgs eventArgs = new TimeChangedEventArgs(currentTime);
357 TimeChanged?.Invoke(this, eventArgs);
360 private void PickersOrderSet(bool ampmForceSet)
362 //FIXME: Check the pickers located in already proper position or not.
364 Remove(minutePicker);
367 //Get current system locale's time pattern
368 String locale = Environment.GetEnvironmentVariable("LC_TIME");
369 DateTimeFormatInfo timeFormatInfo = new CultureInfo(locale, false ).DateTimeFormat;
370 String timePattern = timeFormatInfo.ShortTimePattern;
371 String[] timePatternArray = timePattern.Split(' ', ':');
373 foreach (String format in timePatternArray) {
374 if (format.IndexOf("H") != -1|| format.IndexOf("h") != -1) Add(hourPicker);
375 else if (format.IndexOf("M") != -1 || format.IndexOf("m") != -1) Add(minutePicker);
376 else if (format.IndexOf("t") != -1)
378 is24HourView = false;
379 ampmForceSet = false;
384 if (ampmForceSet) Add(ampmPicker);
387 private void SetAmpmText()
389 //FIXME: There is no localeChanged Event for Component now
390 // AMPM text has to update when system locale changed.
391 String locale = Environment.GetEnvironmentVariable("LC_TIME");
392 CultureInfo info = new CultureInfo(locale);
393 ampmText = new string[] {info.DateTimeFormat.AMDesignator, info.DateTimeFormat.PMDesignator};
394 ampmPicker.DisplayedValues = new ReadOnlyCollection<string>(ampmText);