Revert "[ElmSharp*] Add Scrollable interface"
[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         /// <summary>
215         /// Sets or gets toolbar's current orientation.
216         /// </summary>
217         [EditorBrowsable(EditorBrowsableState.Never)]
218         public bool IsHorizontal
219         {
220             get
221             {
222                 return Interop.Elementary.elm_toolbar_horizontal_get(RealHandle);
223             }
224             set
225             {
226                 Interop.Elementary.elm_toolbar_horizontal_set(RealHandle, value);
227             }
228         }
229
230         /// <summary>
231         /// Sets or gets the icon lookup order, for toolbar items' icons.
232         /// The default lookup order is ToolbarIocnLookupOrder.ThemeFreedesktop.
233         /// Icons added before calling this function will not be affected.
234         /// </summary>
235         public ToolbarIconLookupOrder IconLookupOrder
236         {
237             get
238             {
239                 return (ToolbarIconLookupOrder)Interop.Elementary.elm_toolbar_icon_order_lookup_get(RealHandle);
240             }
241             set
242             {
243                 Interop.Elementary.elm_toolbar_icon_order_lookup_set(RealHandle, (int)value);
244             }
245         }
246
247         /// <summary>
248         /// Sets or gets the icon size of a given toolbar widget.
249         /// Default value is 32 pixels, to be used by toolbar items.
250         /// </summary>
251         public int IconSize
252         {
253             get
254             {
255                 return Interop.Elementary.elm_toolbar_icon_size_get(RealHandle);
256             }
257             set
258             {
259                 Interop.Elementary.elm_toolbar_icon_size_set(RealHandle, value);
260             }
261         }
262
263         /// <summary>
264         /// Gets the number of items in a toolbar widget.
265         /// </summary>
266         public int ItemsCount
267         {
268             get
269             {
270                 return Interop.Elementary.elm_toolbar_items_count(RealHandle);
271             }
272         }
273
274         /// <summary>
275         /// Sets or gets the alignment of the items.
276         /// </summary>
277         /// <remarks>The toolbar items alignment, a float between 0.0 and 1.0</remarks>
278         public double ItemAlignment
279         {
280             get
281             {
282                 return Interop.Elementary.elm_toolbar_align_get(RealHandle);
283             }
284             set
285             {
286                 Interop.Elementary.elm_toolbar_align_set(RealHandle, value);
287             }
288         }
289
290         /// <summary>
291         /// Sets or gets the item's transverse expansion of a given toolbar widget.
292         /// </summary>
293         /// <remarks>
294         /// The transverse expansion of the item, true for on and false for off.
295         /// By default it's false.
296         /// </remarks>
297         public bool TransverseExpansion
298         {
299             get
300             {
301                 return Interop.Elementary.elm_toolbar_transverse_expanded_get(RealHandle);
302             }
303             set
304             {
305                 Interop.Elementary.elm_toolbar_transverse_expanded_set(RealHandle, value);
306             }
307         }
308
309         /// <summary>
310         /// Appends ToolbarItem which just contains label to the toolbar.
311         /// </summary>
312         /// <param name="label">The label of the item</param>
313         /// <returns>The new ToolbarItem which appended to the toolbar</returns>
314         /// <seealso cref="Append(string, string)"/>
315         /// <seealso cref="Prepend(string)"/>
316         public ToolbarItem Append(string label)
317         {
318             return Append(label, null);
319         }
320
321         /// <summary>
322         /// Appends ToolbarItem which contains label and icon to the toolbar.
323         /// </summary>
324         /// <param name="label">The label of the item</param>
325         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
326         /// <returns>The new ToolbarItem which appended to the toolbar</returns>
327         /// <seealso cref="Append(string)"/>
328         /// <seealso cref="Prepend(string)"/>
329         /// <seealso cref="Prepend(string, string)"/>
330         public ToolbarItem Append(string label, string icon)
331         {
332             ToolbarItem item = new ToolbarItem(label, icon);
333             item.Handle = Interop.Elementary.elm_toolbar_item_append(RealHandle, icon, label, null, (IntPtr)item.Id);
334             return item;
335         }
336
337         /// <summary>
338         /// Prepends ToolbarItem which just contains label to the toolbar.
339         /// </summary>
340         /// <param name="label">The label of the item</param>
341         /// <returns>The new ToolbarItem which prepended to the toolbar</returns>
342         /// <seealso cref="Append(string)"/>
343         /// <seealso cref="Append(string, string)"/>
344         /// <seealso cref="Prepend(string, string)"/>
345         public ToolbarItem Prepend(string label)
346         {
347             return Prepend(label, null);
348         }
349
350         /// <summary>
351         /// Prepends ToolbarItem which contains label and icon to the toolbar.
352         /// </summary>
353         /// <param name="label">The label of the item</param>
354         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
355         /// <returns>The new <see cref="ToolbarItem"/> which prepended to the toolbar</returns>
356         /// <seealso cref="Append(string)"/>
357         /// <seealso cref="Append(string, string)"/>
358         /// <seealso cref="Prepend(string)"/>
359         public ToolbarItem Prepend(string label, string icon)
360         {
361             ToolbarItem item = new ToolbarItem(label, icon);
362             item.Handle = Interop.Elementary.elm_toolbar_item_prepend(RealHandle, icon, label, null, (IntPtr)item.Id);
363             return item;
364         }
365
366         /// <summary>
367         /// Inserts a new item which just contains label into the toolbar object before item <paramref name="before"/>.
368         /// </summary>
369         /// <param name="before">The toolbar item to insert before</param>
370         /// <param name="label">The label of the item</param>
371         /// <returns>The new <see cref="ToolbarItem"/> which insert into the toolbar</returns>
372         /// <seealso cref="InsertBefore(ToolbarItem, string, string)"/>
373         public ToolbarItem InsertBefore(ToolbarItem before, string label)
374         {
375             return InsertBefore(before, label, string.Empty);
376         }
377
378         /// <summary>
379         /// Inserts a new item which contains label and icon into the toolbar object before item <paramref name="before"/>.
380         /// </summary>
381         /// <param name="before">The toolbar item to insert before</param>
382         /// <param name="label">The label of the item</param>
383         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
384         /// <returns>The new <see cref="ToolbarItem"/> which insert into the toolbar</returns>
385         /// <seealso cref="InsertBefore(ToolbarItem, string)"/>
386         public ToolbarItem InsertBefore(ToolbarItem before, string label, string icon)
387         {
388             ToolbarItem item = new ToolbarItem(label, icon);
389             item.Handle = Interop.Elementary.elm_toolbar_item_insert_before(RealHandle, before, icon, label, null, (IntPtr)item.Id);
390             return item;
391         }
392
393         /// <summary>
394         /// Inserts a new item which contains label and icon into the toolbar object after item <paramref name="after"/>.
395         /// </summary>
396         /// <param name="after">The toolbar item to insert after</param>
397         /// <param name="label">The label of the item</param>
398         /// <param name="icon">A string with the icon name or the absolute path of an image file</param>
399         /// <returns>The new <see cref="ToolbarItem"/> which insert into the toolbar</returns>
400         public ToolbarItem InsertAfter(ToolbarItem after, string label, string icon)
401         {
402             ToolbarItem item = new ToolbarItem(label, icon);
403             item.Handle = Interop.Elementary.elm_toolbar_item_insert_after(RealHandle, after, icon, label, null, (IntPtr)item.Id);
404             return item;
405         }
406
407         /// <summary>
408         /// Find the item with that label in the toolbar.
409         /// </summary>
410         /// <param name="label">The label of the item</param>
411         /// <returns>The <see cref="ToolbarItem"/> into the toolbar</returns>
412         public ToolbarItem FindItemByLabel(string label)
413         {
414             IntPtr handle = Interop.Elementary.elm_toolbar_item_find_by_label(RealHandle, label);
415             return ItemObject.GetItemByHandle(handle) as ToolbarItem;
416         }
417
418         /// <summary>
419         /// Gets the selected ToolbarItemItem of the toolbar.
420         /// </summary>
421         public ToolbarItem SelectedItem
422         {
423             get
424             {
425                 IntPtr handle = Interop.Elementary.elm_toolbar_selected_item_get(RealHandle);
426                 return ItemObject.GetItemByHandle(handle) as ToolbarItem;
427             }
428         }
429
430         /// <summary>
431         /// Gets the first ToolbarItemItem of the toolbar.
432         /// </summary>
433         public ToolbarItem FirstItem
434         {
435             get
436             {
437                 IntPtr handle = Interop.Elementary.elm_toolbar_first_item_get(RealHandle);
438                 return ItemObject.GetItemByHandle(handle) as ToolbarItem;
439             }
440         }
441
442         /// <summary>
443         /// Gets the last ToolbarItemItem of the toolbar.
444         /// </summary>
445         public ToolbarItem LastItem
446         {
447             get
448             {
449                 IntPtr handle = Interop.Elementary.elm_toolbar_last_item_get(RealHandle);
450                 return ItemObject.GetItemByHandle(handle) as ToolbarItem;
451             }
452         }
453
454         /// <summary>
455         /// Creates a widget handle.
456         /// </summary>
457         /// <param name="parent">Parent EvasObject</param>
458         /// <returns>Handle IntPtr</returns>
459         protected override IntPtr CreateHandle(EvasObject parent)
460         {
461             IntPtr handle = Interop.Elementary.elm_layout_add(parent.Handle);
462             Interop.Elementary.elm_layout_theme_set(handle, "layout", "elm_widget", "default");
463
464             RealHandle = Interop.Elementary.elm_toolbar_add(handle);
465             Interop.Elementary.elm_object_part_content_set(handle, "elm.swallow.content", RealHandle);
466
467             return handle;
468         }
469     }
470 }