2 * Copyright(c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 using System.Runtime.InteropServices;
21 using Tizen.NUI.UIComponents;
22 using Tizen.NUI.BaseComponents;
24 // A spin control (for continously changing values when users can easily predict a set of values)
29 ///Spins the CustomView class.
31 public class Spin : CustomView
33 private VisualBase _arrowVisual;
34 private TextField _textField;
35 private int _arrowVisualPropertyIndex;
36 private string _arrowImage;
37 private int _currentValue;
38 private int _minValue;
39 private int _maxValue;
40 private int _singleStep;
41 private bool _wrappingEnabled;
42 private int _pointSize;
43 private Color _textColor;
44 private Color _textBackgroundColor;
45 private int _maxTextLength;
47 // Called by DALi Builder if it finds a Spin control in a JSON file
48 static CustomView CreateInstance()
53 // static constructor registers the control type (only runs once)
56 // ViewRegistry registers control type with DALi type registery
57 // also uses introspection to find any properties that need to be registered with type registry
58 CustomViewRegistry.Instance.Register(CreateInstance, typeof(Spin));
62 /// Creates an initialized spin.
64 /// <since_tizen> 3 </since_tizen>
65 public Spin() : base(typeof(Spin).FullName, CustomViewBehaviour.RequiresKeyboardNavigationSupport)
70 /// Overrides the method of OnInitialize() for the CustomView class.<br />
71 /// This method is called after the control has been initialized.<br />
72 /// Derived classes should do any second phase initialization by overriding this method.<br />
74 /// <since_tizen> 3 </since_tizen>
75 public override void OnInitialize()
77 // Initialize the propertiesControl
78 //_arrowImage = "/home/tengxb/Workspace/nui-debug/examples/res/images/arrow.png";
79 _arrowImage = Tizen.Applications.Application.Current.DirectoryInfo.Resource + "picture.png";
80 _textBackgroundColor = new Color(0.6f, 0.6f, 0.6f, 1.0f);
87 // Create image visual for the arrow keys
88 _arrowVisualPropertyIndex = RegisterProperty("ArrowImage", new PropertyValue(_arrowImage), Tizen.NUI.PropertyAccessMode.ReadWrite);
89 _arrowVisual = VisualFactory.Instance.CreateVisual(
90 new PropertyMap().Add(Visual.Property.Type, new PropertyValue((int)Visual.Type.Image))
91 .Add(ImageVisualProperty.URL, new PropertyValue(_arrowImage))
92 .Add(ImageVisualProperty.DesiredHeight, new PropertyValue(150))
93 .Add(ImageVisualProperty.DesiredWidth, new PropertyValue(150)));
94 RegisterVisual(_arrowVisualPropertyIndex, _arrowVisual);
96 // Create a text field
97 _textField = new TextField();
98 _textField.PivotPoint = Tizen.NUI.PivotPoint.Center;
99 _textField.WidthResizePolicy = ResizePolicyType.SizeRelativeToParent;
100 _textField.HeightResizePolicy = ResizePolicyType.SizeRelativeToParent;
101 _textField.SizeModeFactor = new Vector3(1.0f, 0.45f, 1.0f);
102 _textField.PlaceholderText = "----";
103 _textField.BackgroundColor = _textBackgroundColor;
104 _textField.HorizontalAlignment = HorizontalAlignment.Center;
105 _textField.VerticalAlignment = VerticalAlignment.Center;
106 _textField.Focusable = (true);
107 _textField.Name = "_textField";
108 _textField.Position2D = new Position2D(0, 40);
110 this.Add(_textField);
112 _textField.FocusGained += TextFieldKeyInputFocusGained;
113 _textField.FocusLost += TextFieldKeyInputFocusLost;
117 /// Overrides the method of GetNaturalSize() for the CustomView class.<br />
118 /// Returns the natural size of the actor.<br />
120 /// <returns> Natural size of this spin itself.</returns>
121 /// <since_tizen> 3 </since_tizen>
122 public override Size2D GetNaturalSize()
124 return new Size2D(150, 150);
128 /// An event handler is used when the TextField in the spin gets the key focus.<br />
129 /// Make sure when the current spin that takes input focus, also takes the keyboard focus.<br />
130 /// For example, when you tap the spin directly.<br />
132 /// <param name="source">Sender of this event.</param>
133 /// <param name="e">Event arguments.</param>
134 /// <since_tizen> 3 </since_tizen>
135 public void TextFieldKeyInputFocusGained(object source, EventArgs e)
137 FocusManager.Instance.SetCurrentFocusView(_textField);
141 /// An event handler when the TextField in the spin looses it's key focus.
143 /// <param name="source"></param>
144 /// <param name="e"></param>
145 /// <since_tizen> 3 </since_tizen>
146 public void TextFieldKeyInputFocusLost(object source, EventArgs e)
148 int previousValue = _currentValue;
150 // If the input value is invalid, change it back to the previous valid value
151 if (int.TryParse(_textField.Text, out _currentValue))
153 if (_currentValue < _minValue || _currentValue > _maxValue)
155 _currentValue = previousValue;
160 _currentValue = previousValue;
163 // Otherwise take the new value
164 this.Value = _currentValue;
168 /// Overrides the method of GetNextKeyboardFocusableView() for the CustomView class.<br />
169 /// Gets the next key focusable view in this view towards the given direction.<br />
170 /// A view needs to override this function in order to support two-dimensional key navigation.<br />
172 /// <param name="currentFocusedView">The current focused view.</param>
173 /// <param name="direction">The direction to move the focus towards.</param>
174 /// <param name="loopEnabled">Whether the focus movement should be looped within the control.</param>
175 /// <returns>The next keyboard focusable view in this control or an empty handle if no view can be focused.</returns>
176 /// <since_tizen> 3 </since_tizen>
177 public override View GetNextFocusableView(View currentFocusedView, View.FocusDirection direction, bool loopEnabled)
179 // Respond to Up/Down keys to change the value while keeping the current spin focused
180 View nextFocusedView = currentFocusedView;
181 if (direction == View.FocusDirection.Up)
183 this.Value += this.Step;
184 nextFocusedView = _textField;
186 else if (direction == View.FocusDirection.Down)
188 this.Value -= this.Step;
189 nextFocusedView = _textField;
197 return nextFocusedView;
201 /// Value to be set in the spin.
203 /// <since_tizen> 3 </since_tizen>
204 [ScriptableProperty()]
209 return _currentValue;
214 Tizen.Log.Debug("NUI", "Value set to " + value);
215 _currentValue = value;
217 // Make sure no invalid value is accepted
218 if (_currentValue < _minValue)
220 _currentValue = _minValue;
223 if (_currentValue > _maxValue)
225 _currentValue = _maxValue;
228 _textField.Text = _currentValue.ToString();
233 /// Minimum value of the spin value.
235 /// <since_tizen> 3 </since_tizen>
236 // MinValue property of type int:
237 [ScriptableProperty()]
251 /// Maximum value of the spin value.
253 /// <since_tizen> 3 </since_tizen>
254 // MaxValue property of type int:
255 [ScriptableProperty()]
269 /// Increasing, decreasing step of the spin value when up or down keys are pressed.
271 /// <since_tizen> 3 </since_tizen>
272 // Step property of type int:
273 [ScriptableProperty()]
287 /// Wrapping enabled status.
289 /// <since_tizen> 3 </since_tizen>
290 // WrappingEnabled property of type bool:
291 [ScriptableProperty()]
292 public bool WrappingEnabled
296 return _wrappingEnabled;
300 _wrappingEnabled = value;
305 /// Text point size of the spin value.
307 /// <since_tizen> 3 </since_tizen>
308 // TextPointSize property of type int:
309 [ScriptableProperty()]
310 public int TextPointSize
319 _textField.PointSize = _pointSize;
324 /// The color of the spin value.
326 /// <since_tizen> 3 </since_tizen>
327 // TextColor property of type Color:
328 [ScriptableProperty()]
329 public Color TextColor
337 Tizen.Log.Debug("NUI", "TextColor set to " + value.R + "," + value.G + "," + value.B);
340 _textField.TextColor = _textColor;
345 /// Maximum text lengh of the spin value.
347 /// <since_tizen> 3 </since_tizen>
348 // MaxTextLength property of type int:
349 [ScriptableProperty()]
350 public int MaxTextLength
354 return _maxTextLength;
358 _maxTextLength = value;
359 _textField.MaxLength = _maxTextLength;
364 /// Reference of TextField of the spin.
366 /// <since_tizen> 3 </since_tizen>
367 public TextField SpinText
380 /// Show indicator image, for example, up or down arrow image.
382 /// <since_tizen> 3 </since_tizen>
383 public string IndicatorImage
392 _arrowVisual = VisualFactory.Instance.CreateVisual(
393 new PropertyMap().Add(Visual.Property.Type, new PropertyValue((int)Visual.Type.Image))
394 .Add(ImageVisualProperty.URL, new PropertyValue(_arrowImage))
395 .Add(ImageVisualProperty.DesiredHeight, new PropertyValue(150))
396 .Add(ImageVisualProperty.DesiredWidth, new PropertyValue(150)));
397 RegisterVisual(_arrowVisualPropertyIndex, _arrowVisual);