6cddfec0e5c1e6aff862bab7f724fec6d275a215
[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             InitContent();
99             InitTabBar();
100         }
101
102         /// <inheritdoc/>
103         [EditorBrowsable(EditorBrowsableState.Never)]
104         public override void OnInitialize()
105         {
106             base.OnInitialize();
107
108             SetAccessibilityConstructor(Role.PageTabList);
109         }
110
111         private void InitTabBar()
112         {
113             if (tabBar != null)
114             {
115                 return;
116             }
117
118             tabBar = new TabBar();
119             tabBar.TabButtonSelected += tabButtonSelectedHandler;
120
121             Add(tabBar);
122         }
123
124         private void InitContent()
125         {
126             if (content != null)
127             {
128                 return;
129             }
130
131             content = new TabContent();
132             content.WidthSpecification = LayoutParamPolicies.MatchParent;
133             content.HeightSpecification = LayoutParamPolicies.MatchParent;
134
135             Add(content);
136         }
137
138         private void tabButtonSelectedHandler(object sender, TabButtonSelectedEventArgs args)
139         {
140             if ((content != null) && (content.ViewCount > args.Index))
141             {
142                 content.Select(args.Index);
143             }
144         }
145
146         /// <summary>
147         /// Gets TabBar of TabView.
148         /// </summary>
149         /// <since_tizen> 9 </since_tizen>
150         public TabBar TabBar
151         {
152             get
153             {
154                 return tabBar;
155             }
156         }
157
158         /// <summary>
159         /// Gets TabContent of TabView.
160         /// </summary>
161         /// <since_tizen> 9 </since_tizen>
162         public TabContent Content
163         {
164             get
165             {
166                 return content;
167             }
168         }
169
170         /// <summary>
171         /// Adds a tab with tab button and content view.
172         /// </summary>
173         /// <param name="tabButton">A tab button to be added.</param>
174         /// <param name="view">A content view to be added.</param>
175         /// <since_tizen> 9 </since_tizen>
176         public void AddTab(TabButton tabButton, View view)
177         {
178             if (TabBar != null)
179             {
180                 TabBar.AddTabButton(tabButton);
181             }
182
183             if (Content != null)
184             {
185                 Content.AddView(view);
186             }
187         }
188
189         /// <summary>
190         /// Removes a tab at the specified index of TabView.
191         /// The indices of tabs(tab buttons and views) in TabView are basically the order of adding to TabView by <see cref="TabView.AddTab"/>.
192         /// 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.
193         /// </summary>
194         /// <param name="index">The index of a tab(tab button and view) in TabView where the tab will be removed.</param>
195         /// <exception cref="ArgumentOutOfRangeException">Thrown when the index is less than 0, or greater than or equal to the number of tabs.</exception>
196         /// <since_tizen> 9 </since_tizen>
197         public void RemoveTab(int index)
198         {
199             var tabButton = TabBar.GetTabButton(index);
200             if (tabButton != null)
201             {
202                 TabBar.RemoveTabButton(tabButton);
203             }
204
205             var view = Content.GetView(index);
206             if (view != null)
207             {
208                 Content.RemoveView(view);
209             }
210         }
211
212         /// <inheritdoc/>
213         [EditorBrowsable(EditorBrowsableState.Never)]
214         protected override void Dispose(DisposeTypes type)
215         {
216             if (disposed)
217             {
218                 return;
219             }
220
221             if (type == DisposeTypes.Explicit)
222             {
223                 if (tabBar != null)
224                 {
225                     tabBar.TabButtonSelected -= tabButtonSelectedHandler;
226                     Utility.Dispose(tabBar);
227                 }
228
229                 if (content != null)
230                 {
231                     Utility.Dispose(content);
232                 }
233             }
234
235             base.Dispose(type);
236         }
237     }
238 }