Make TabView APIs public
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.Components / Controls / TabView.cs
1 /*
2  * Copyright(c) 2021 Samsung Electronics Co., Ltd.
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 using Tizen.NUI.BaseComponents;
20
21 namespace Tizen.NUI.Components
22 {
23     /// <summary>
24     /// TabView is a class which contains a TabBar and TabContent.
25     /// TabView adds TabButtons and Views to TabBar and TabContent in TabView by <see cref="TabView.AddTab"/>.
26     /// TabView removes TabButtons and Views from TabBar and TabContent in TabView by <see cref="TabView.RemoveTab"/>.
27     /// TabView selects a view from the TabContent according to the selected TabButton in the TabBar.
28     ///
29     /// <example>
30     /// <code>
31     /// var tabView = new TabView()
32     /// {
33     ///     WidthSpecification = LayoutParamPolicies.MatchParent,
34     ///     HeightSpecification = LayoutParamPolicies.MatchParent,
35     /// };
36     ///
37     /// var tabButton = new TabButton()
38     /// {
39     ///     Text = "Tab#1"
40     /// };
41     ///
42     /// var content = new View()
43     /// {
44     ///     BackgroundColor = Color.Red,
45     ///     WidthSpecification = LayoutParamPolicies.MatchParent,
46     ///     HeightSpecification = LayoutParamPolicies.MatchParent,
47     /// };
48     ///
49     /// tabView.AddTab(tabButton, content);
50     ///
51     /// var tabButton2 = new TabButton()
52     /// {
53     ///     Text = "Tab#2"
54     /// };
55     ///
56     /// var content2 = new View()
57     /// {
58     ///     BackgroundColor = Color.Green,
59     ///     WidthSpecification = LayoutParamPolicies.MatchParent,
60     ///     HeightSpecification = LayoutParamPolicies.MatchParent,
61     /// };
62     ///
63     /// tabView.AddTab(tabButton2, content2);
64     ///
65     /// var tabButton3 = new TabButton()
66     /// {
67     ///     Text = "Tab#3"
68     /// };
69     ///
70     /// var content3 = new View()
71     /// {
72     ///     BackgroundColor = Color.Blue,
73     ///     WidthSpecification = LayoutParamPolicies.MatchParent,
74     ///     HeightSpecification = LayoutParamPolicies.MatchParent,
75     /// };
76     ///
77     /// tabView.AddTab(tabButton3, content3);
78     /// </code>
79     /// </example>
80     /// </summary>
81     /// <since_tizen> 9 </since_tizen>
82     public class TabView : Control
83     {
84         private TabBar tabBar = null;
85
86         private TabContent content = null;
87
88         /// <summary>
89         /// Creates a new instance of TabView.
90         /// </summary>
91         /// <since_tizen> 9 </since_tizen>
92         public TabView()
93         {
94             Layout = new LinearLayout() { LinearOrientation = LinearLayout.Orientation.Vertical };
95             WidthSpecification = LayoutParamPolicies.MatchParent;
96             HeightSpecification = LayoutParamPolicies.MatchParent;
97
98             InitTabBar();
99             InitContent();
100         }
101
102         private void InitTabBar()
103         {
104             if (tabBar != null)
105             {
106                 return;
107             }
108
109             tabBar = new TabBar();
110             tabBar.TabButtonSelected += tabButtonSelectedHandler;
111
112             Add(tabBar);
113         }
114
115         private void InitContent()
116         {
117             if (content != null)
118             {
119                 return;
120             }
121
122             content = new TabContent();
123             content.WidthSpecification = LayoutParamPolicies.MatchParent;
124             content.HeightSpecification = LayoutParamPolicies.MatchParent;
125
126             Add(content);
127         }
128
129         private void tabButtonSelectedHandler(object sender, TabButtonSelectedEventArgs args)
130         {
131             if ((content != null) && (content.ViewCount > args.Index))
132             {
133                 content.Select(args.Index);
134             }
135         }
136
137         /// <summary>
138         /// Gets TabBar of TabView.
139         /// </summary>
140         /// <since_tizen> 9 </since_tizen>
141         public TabBar TabBar
142         {
143             get
144             {
145                 return tabBar;
146             }
147         }
148
149         /// <summary>
150         /// Gets TabContent of TabView.
151         /// </summary>
152         /// <since_tizen> 9 </since_tizen>
153         public TabContent Content
154         {
155             get
156             {
157                 return content;
158             }
159         }
160
161         /// <summary>
162         /// Adds a tab with tab button and content view.
163         /// </summary>
164         /// <param name="tabButton">A tab button to be added.</param>
165         /// <param name="view">A content view to be added.</param>
166         /// <since_tizen> 9 </since_tizen>
167         public void AddTab(TabButton tabButton, View view)
168         {
169             if (TabBar != null)
170             {
171                 TabBar.AddTabButton(tabButton);
172             }
173
174             if (Content != null)
175             {
176                 Content.AddView(view);
177             }
178         }
179
180         /// <summary>
181         /// Removes a tab at the specified index of TabView.
182         /// The indices of tabs(tab buttons and views) in TabView are basically the order of adding to TabView by <see cref="TabView.AddTab"/>.
183         /// So the index of a tab(tab button and view) in TabView can be changed whenever <see cref="TabView.AddTab"/> or <see cref="TabView.RemoveTab"/> is called.
184         /// </summary>
185         /// <param name="index">The index of a tab(tab button and view) in TabView where the tab will be removed.</param>
186         /// <exception cref="ArgumentOutOfRangeException">Thrown when the index is less than 0, or greater than or equal to the number of tabs.</exception>
187         /// <since_tizen> 9 </since_tizen>
188         public void RemoveTab(int index)
189         {
190             var tabButton = TabBar.GetTabButton(index);
191             if (tabButton != null)
192             {
193                 TabBar.RemoveTabButton(tabButton);
194             }
195
196             var view = Content.GetView(index);
197             if (view != null)
198             {
199                 Content.RemoveView(view);
200             }
201         }
202
203         /// <inheritdoc/>
204         [EditorBrowsable(EditorBrowsableState.Never)]
205         protected override void Dispose(DisposeTypes type)
206         {
207             if (disposed)
208             {
209                 return;
210             }
211
212             if (type == DisposeTypes.Explicit)
213             {
214                 if (tabBar != null)
215                 {
216                     tabBar.TabButtonSelected -= tabButtonSelectedHandler;
217                     Utility.Dispose(tabBar);
218                 }
219
220                 if (content != null)
221                 {
222                     Utility.Dispose(content);
223                 }
224             }
225
226             base.Dispose(type);
227         }
228     }
229 }