Release 4.0.0-preview1-00051
[platform/core/csapi/tizenfx.git] / src / ElmSharp / ElmSharp / Toolbar.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18 using System.ComponentModel;
19
20 namespace ElmSharp
21 {
22     /// <summary>
23     /// Enumeration for the selection mode of Toolbar.
24     /// </summary>
25     public enum ToolbarSelectionMode
26     {
27         /// <summary>
28         /// Default select mode.
29         /// </summary>
30         Default = 0,
31
32         /// <summary>
33         /// Always select mode.
34         /// </summary>
35         Always,
36
37         /// <summary>
38         /// No select mode.
39         /// </summary>
40         None,
41
42         /// <summary>
43         /// No select mode with no finger size rule.
44         /// </summary>
45         DisplayOnly,
46     }
47
48     /// <summary>
49     /// Enumeration that sets the toolbar items display behavior, it can be scrollable, can show a menu with exceeding items, or simply hide them.
50     /// </summary>
51     public enum ToolbarShrinkMode
52     {
53         /// <summary>
54         /// Sets minimum toolbar size to fit all the items.
55         /// </summary>
56         None = 0,
57
58         /// <summary>
59         /// Hides exceeding items.
60         /// </summary>
61         Hide,
62
63         /// <summary>
64         /// Allows accessing exceeding items through a scroller.
65         /// </summary>
66         Scroll,
67
68         /// <summary>
69         /// Inserts a button to pop up a menu with exceeding items.
70         /// </summary>
71         Menu,
72
73         /// <summary>
74         /// Expands all items according to the size of the toolbar.
75         /// </summary>
76         Expand
77     }
78
79     /// <summary>
80     /// Enumeration for the icon lookup order of Toolbar.
81     /// </summary>
82     public enum ToolbarIconLookupOrder
83     {
84         /// <summary>
85         /// Icon look up order: freedesktop, theme.
86         /// </summary>
87         FreedesktopTheme,
88
89         /// <summary>
90         /// Icon look up order: theme, freedesktop.
91         /// </summary>
92         ThemeFreedesktop,
93
94         /// <summary>
95         /// Icon look up order: freedesktop.
96         /// </summary>
97         Freedesktop,
98
99         /// <summary>
100         /// Icon look up order: theme.
101         /// </summary>
102         Theme,
103     }
104
105     /// <summary>
106     /// Event arguments for events of <see cref="ToolbarItem"/>.
107     /// </summary>
108     /// <remarks>
109     /// Inherits EventArgs.
110     /// </remarks>
111     public class ToolbarItemEventArgs : EventArgs
112     {
113         /// <summary>
114         /// Gets the ToolbarItem.
115         /// </summary>
116         public ToolbarItem Item { get; private set; }
117
118         internal static ToolbarItemEventArgs CreateFromSmartEvent(IntPtr data, IntPtr obj, IntPtr info)
119         {
120             ToolbarItem item = ItemObject.GetItemByHandle(info) as ToolbarItem;
121             return new ToolbarItemEventArgs() { Item = item };
122         }
123     }
124
125     /// <summary>
126     /// The Toolbar is a widget that displays a list of items inside a box.
127     /// </summary>
128     public class Toolbar : Widget
129     {
130         SmartEvent<ToolbarItemEventArgs> _clicked;
131         SmartEvent<ToolbarItemEventArgs> _selected;
132         SmartEvent<ToolbarItemEventArgs> _longpressed;
133
134         /// <summary>
135         /// Creates and initializes a new instance of the Toolbar class.
136         /// </summary>
137         /// <param name="parent">
138         /// A EvasObject to which the new Table instance will be attached.
139         /// </param>
140         public Toolbar(EvasObject parent) : base(parent)
141         {
142             _selected = new SmartEvent<ToolbarItemEventArgs>(this, this.RealHandle, "selected", ToolbarItemEventArgs.CreateFromSmartEvent);
143             _selected.On += (s, e) =>
144             {
145                 if (e.Item != null)
146                 {
147                     Selected?.Invoke(this, e);
148                     e.Item.SendSelected();
149                 }
150             };
151             _longpressed = new SmartEvent<ToolbarItemEventArgs>(this, this.RealHandle, "longpressed", ToolbarItemEventArgs.CreateFromSmartEvent);
152             _longpressed.On += (s, e) =>
153             {
154                 e.Item?.SendLongPressed();
155             };
156             _clicked = new SmartEvent<ToolbarItemEventArgs>(this, this.RealHandle, "clicked", ToolbarItemEventArgs.CreateFromSmartEvent);
157             _clicked.On += (s, e) =>
158             {
159                 e.Item?.SendClicked();
160             };
161         }
162
163         /// <summary>
164         /// Selected will be triggered when toolbar have been selected.
165         /// </summary>
166         public event EventHandler<ToolbarItemEventArgs> Selected;
167
168         /// <summary>
169         /// Sets or gets whether the layout of this toolbar is homogeneous.
170         /// </summary>
171         /// <remarks>True for homogeneous, False for no homogeneous</remarks>
172         public bool Homogeneous
173         {
174             get
175             {
176                 return Interop.Elementary.elm_toolbar_homogeneous_get(RealHandle);
177             }
178             set
179             {
180                 Interop.Elementary.elm_toolbar_homogeneous_set(RealHandle, value);
181             }
182         }
183
184         /// <summary>
185         /// Sets or gets the slection mode of a given Toolbar widget.
186         /// </summary>
187         public ToolbarSelectionMode SelectionMode
188         {
189             get
190             {
191                 return (ToolbarSelectionMode)Interop.Elementary.elm_toolbar_select_mode_get(RealHandle);
192             }
193             set
194             {
195                 Interop.Elementary.elm_toolbar_select_mode_set(RealHandle, (int)value);
196             }
197         }
198
199         /// <summary>
200         /// Sets or gets the shrink mode of a given Toolbar widget.
201         /// </summary>
202         public ToolbarShrinkMode ShrinkMode
203         {
204             get
205             {
206                 return (ToolbarShrinkMode)Interop.Elementary.elm_toolbar_shrink_mode_get(RealHandle);
207             }
208             set
209             {
210                 Interop.Elementary.elm_toolbar_shrink_mode_set(RealHandle, (int)value);
211             }
212         }
213
214         [EditorBrowsable(EditorBrowsableState.Never)]
215         public bool IsHorizontal
216         {
217             get
218             {
219                 return Interop.Elementary.elm_toolbar_horizontal_get(RealHandle);
220             }
221             set
222             {
223                 Interop.Elementary.elm_toolbar_horizontal_set(RealHandle, value);
224             }
225         }
226
227         /// <summary>
228         /// Sets or gets the icon lookup order, for toolbar items' icons.
229         /// The default lookup order is ToolbarIocnLookupOrder.ThemeFreedesktop.
230         /// Icons added before calling this function will not be affected.
231         /// </summary>
232         public ToolbarIconLookupOrder IconLookupOrder
233         {
234             get
235             {
236                 return (ToolbarIconLookupOrder)Interop.Elementary.elm_toolbar_icon_order_lookup_get(RealHandle);
237             }
238             set
239             {
240                 Interop.Elementary.elm_toolbar_icon_order_lookup_set(RealHandle, (int)value);
241             }
242         }
243
244         /// <summary>
245         /// Sets or gets the icon size of a given toolbar widget.
246         /// Default value is 32 pixels, to be used by toolbar items.
247         /// </summary>
248         public int IconSize
249         {
250             get
251             {
252                 return Interop.Elementary.elm_toolbar_icon_size_get(RealHandle);
253             }
254             set
255             {
256                 Interop.Elementary.elm_toolbar_icon_size_set(RealHandle, value);
257             }
258         }
259
260         /// <summary>
261         /// Gets the number of items in a toolbar widget.
262         /// </summary>
263         public int ItemsCount
264         {
265             get
266             {
267                 return Interop.Elementary.elm_toolbar_items_count(RealHandle);
268             }
269         }
270
271         /// <summary>
272         /// Sets or gets the alignment of the items.
273         /// </summary>
274         /// <remarks>The toolbar items alignment, a float between 0.0 and 1.0</remarks>
275         public double ItemAlignment
276         {
277             get
278             {
279                 return Interop.Elementary.elm_toolbar_align_get(RealHandle);
280             }
281             set
282             {
283                 Interop.Elementary.elm_toolbar_align_set(RealHandle, value);
284             }
285         }
286
287         /// <summary>
288         /// Sets or gets the item's transverse expansion of a given toolbar widget.
289         /// </summary>
290         /// <remarks>
291         /// The transverse expansion of the item, true for on and false for off.
292         /// By default it's false.
293         /// </remarks>
294         public bool TransverseExpansion
295         {
296             get
297             {
298                 return Interop.Elementary.elm_toolbar_transverse_expanded_get(RealHandle);
299             }
300             set
301             {
302                 Interop.Elementary.elm_toolbar_transverse_expanded_set(RealHandle, value);
303             }
304         }
305
306         /// <summary>
307         /// Appends ToolbarItem which just contains label to the toolbar.
308         /// </summary>
309         /// <param name="label">The label of the item</param>
310         /// <returns>The new ToolbarItem which appended to the toolbar</returns>
311         /// <seealso cref="Append(string, string)"/>
312         /// <seealso cref="Prepend(string)"/>
313         public ToolbarItem Append(string label)
314         {
315             return Append(label, null);
316         }
317
318         /// <summary>
319         /// Appends ToolbarItem which contains label and icon to the toolbar.
320         /// </summary>
321         /// <param name="label">The label of the item</param>
322         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
323         /// <returns>The new ToolbarItem which appended to the toolbar</returns>
324         /// <seealso cref="Append(string)"/>
325         /// <seealso cref="Prepend(string)"/>
326         /// <seealso cref="Prepend(string, string)"/>
327         public ToolbarItem Append(string label, string icon)
328         {
329             ToolbarItem item = new ToolbarItem(label, icon);
330             item.Handle = Interop.Elementary.elm_toolbar_item_append(RealHandle, icon, label, null, (IntPtr)item.Id);
331             return item;
332         }
333
334         /// <summary>
335         /// Prepends ToolbarItem which just contains label to the toolbar.
336         /// </summary>
337         /// <param name="label">The label of the item</param>
338         /// <returns>The new ToolbarItem which prepended to the toolbar</returns>
339         /// <seealso cref="Append(string)"/>
340         /// <seealso cref="Append(string, string)"/>
341         /// <seealso cref="Prepend(string, string)"/>
342         public ToolbarItem Prepend(string label)
343         {
344             return Prepend(label, null);
345         }
346
347         /// <summary>
348         /// Prepends ToolbarItem which contains label and icon to the toolbar.
349         /// </summary>
350         /// <param name="label">The label of the item</param>
351         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
352         /// <returns>The new <see cref="ToolbarItem"/> which prepended to the toolbar</returns>
353         /// <seealso cref="Append(string)"/>
354         /// <seealso cref="Append(string, string)"/>
355         /// <seealso cref="Prepend(string)"/>
356         public ToolbarItem Prepend(string label, string icon)
357         {
358             ToolbarItem item = new ToolbarItem(label, icon);
359             item.Handle = Interop.Elementary.elm_toolbar_item_prepend(RealHandle, icon, label, null, (IntPtr)item.Id);
360             return item;
361         }
362
363         /// <summary>
364         /// Inserts a new item which just contains label into the toolbar object before item <paramref name="before"/>.
365         /// </summary>
366         /// <param name="before">The toolbar item to insert before</param>
367         /// <param name="label">The label of the item</param>
368         /// <returns>The new <see cref="ToolbarItem"/> which insert into the toolbar</returns>
369         /// <seealso cref="InsertBefore(ToolbarItem, string, string)"/>
370         public ToolbarItem InsertBefore(ToolbarItem before, string label)
371         {
372             return InsertBefore(before, label, string.Empty);
373         }
374
375         /// <summary>
376         /// Inserts a new item which contains label and icon into the toolbar object before item <paramref name="before"/>.
377         /// </summary>
378         /// <param name="before">The toolbar item to insert before</param>
379         /// <param name="label">The label of the item</param>
380         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
381         /// <returns>The new <see cref="ToolbarItem"/> which insert into the toolbar</returns>
382         /// <seealso cref="InsertBefore(ToolbarItem, string)"/>
383         public ToolbarItem InsertBefore(ToolbarItem before, string label, string icon)
384         {
385             ToolbarItem item = new ToolbarItem(label, icon);
386             item.Handle = Interop.Elementary.elm_toolbar_item_insert_before(RealHandle, before, icon, label, null, (IntPtr)item.Id);
387             return item;
388         }
389
390         /// <summary>
391         /// Inserts a new item which contains label and icon into the toolbar object after item <paramref name="after"/>.
392         /// </summary>
393         /// <param name="after">The toolbar item to insert after</param>
394         /// <param name="label">The label of the item</param>
395         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
396         /// <returns>The new <see cref="ToolbarItem"/> which insert into the toolbar</returns>
397         /// <seealso cref="InsertAfter(ToolbarItem, string)"/>
398         public ToolbarItem InsertAfter(ToolbarItem after, string label, string icon)
399         {
400             ToolbarItem item = new ToolbarItem(label, icon);
401             item.Handle = Interop.Elementary.elm_toolbar_item_insert_after(RealHandle, after, icon, label, null, (IntPtr)item.Id);
402             return item;
403         }
404
405         /// <summary>
406         /// Find the item with that label in the toolbar.
407         /// </summary>
408         /// <param name="label">The label of the item</param>
409         /// <returns>The <see cref="ToolbarItem"/> into the toolbar</returns>
410         public ToolbarItem FindItemByLabel(string label)
411         {
412             IntPtr handle = Interop.Elementary.elm_toolbar_item_find_by_label(RealHandle, label);
413             return ItemObject.GetItemByHandle(handle) as ToolbarItem;
414         }
415
416         /// <summary>
417         /// Gets the selected ToolbarItemItem of the toolbar.
418         /// </summary>
419         public ToolbarItem SelectedItem
420         {
421             get
422             {
423                 IntPtr handle = Interop.Elementary.elm_toolbar_selected_item_get(RealHandle);
424                 return ItemObject.GetItemByHandle(handle) as ToolbarItem;
425             }
426         }
427
428         /// <summary>
429         /// Gets the first ToolbarItemItem of the toolbar.
430         /// </summary>
431         public ToolbarItem FirstItem
432         {
433             get
434             {
435                 IntPtr handle = Interop.Elementary.elm_toolbar_first_item_get(RealHandle);
436                 return ItemObject.GetItemByHandle(handle) as ToolbarItem;
437             }
438         }
439
440         /// <summary>
441         /// Gets the last ToolbarItemItem of the toolbar.
442         /// </summary>
443         public ToolbarItem LastItem
444         {
445             get
446             {
447                 IntPtr handle = Interop.Elementary.elm_toolbar_last_item_get(RealHandle);
448                 return ItemObject.GetItemByHandle(handle) as ToolbarItem;
449             }
450         }
451
452         protected override IntPtr CreateHandle(EvasObject parent)
453         {
454             IntPtr handle = Interop.Elementary.elm_layout_add(parent.Handle);
455             Interop.Elementary.elm_layout_theme_set(handle, "layout", "elm_widget", "default");
456
457             RealHandle = Interop.Elementary.elm_toolbar_add(handle);
458             Interop.Elementary.elm_object_part_content_set(handle, "elm.swallow.content", RealHandle);
459
460             return handle;
461         }
462     }
463 }