1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     lyt_Group.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 23662 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_LYT_GROUP_H_
17 #define NW_LYT_GROUP_H_
18 
19 #include <cstddef>
20 #include <nw/ut/ut_LinkList.h>
21 
22 #include <nw/lyt/lyt_Pane.h>
23 #include <nw/lyt/lyt_Types.h>
24 
25 namespace nw
26 {
27 namespace lyt
28 {
29 
30 //---------------------------------------------------------------------------
31 //! :category 管理
32 //!
33 //! @brief グループに属するペインへのリンクです。
34 //!
35 //! @since 2009/09/18 初版。
36 //---------------------------------------------------------------------------
37 struct PaneLink
38 {
39     //! :private
40     //! @brief リンク情報です。
41     ut::LinkListNode link;
42 
43     //! グループに属するペインへのポインタです。
44     Pane* target;
45 };
46 
47 //! @name 管理
48 //@{
49 
50 //! @brief ペインへのリンクの一覧を保持します。
51 //!
52 //! @since 2009/09/18 初版。
53 //!
54 typedef ut::LinkList<PaneLink, offsetof(PaneLink, link)> PaneLinkList;
55 
56 //@}
57 
58 //---------------------------------------------------------------------------
59 //! :category 管理
60 //!
61 //! @brief ペインをグループで管理するためのクラスです。
62 //!
63 //! @since 2009/09/18 初版。
64 //---------------------------------------------------------------------------
65 class Group
66 {
67 public:
68     //----------------------------------------
69     //! @name コンストラクタ/デストラクタ
70     //@{
71 
72     //! @brief コンストラクタです。
73     //!
74     //! @details
75     //! ペインのない状態で初期化します。
76     //!
77     //! @since 2009/09/18 初版。
78     //!
79     Group();
80 
81     //! @brief コンストラクタです。
82     //!
83     //! @details
84     //! グループリソースをもとにペインを追加した状態で初期化します。
85     //!
86     //! @param pResGroup グループリソースへのポインタです。
87     //! @param pRootPane ルートペインへのポインタです。
88     //!
89     //! @since 2009/09/18 初版。
90     //!
91     Group(const res::Group* pResGroup, Pane* pRootPane);
92 
93     //! @brief デストラクタです。
94     //!
95     //! @since 2009/09/18 初版。
96     //!
97     virtual ~Group();
98 
99     //@}
100 
101     //----------------------------------------
102     //! @name 取得/設定
103     //@{
104 
105     //! @brief グループの名前を取得します。
106     //!
107     //! @return グループの名前を返します。
108     //!
109     //! @since 2009/09/18 初版。
110     //!
GetName()111     const char* GetName() const
112     {
113         return m_Name;
114     }
115 
116     //! @brief グループに所属するペインの一覧を取得します。
117     //!
118     //! @return ペインの一覧を返します。
119     //!
120     //! @since 2009/09/18 初版。
121     //!
GetPaneList()122     PaneLinkList& GetPaneList()
123     {
124         return m_PaneLinkList;
125     }
126 
127     //@}
128 
129     //----------------------------------------
130     //! @name 追加
131     //@{
132 
133     //! @brief ペインを追加します。
134     //!
135     //! @param pPane ペインへのポインタです。
136     //!
137     //! @since 2009/09/18 初版。
138     //!
139     void AppendPane(Pane* pPane);
140 
141     //@}
142 
143     //----------------------------------------
144     //! @name その他
145     //@{
146 
147     //! @brief ユーザーがグループを構築したかどうかを判定します。
148     //!
149     //! @return グループをユーザーが構築した場合は true を返します。
150     //!
151     //! @since 2009/09/18 初版。
152     //!
IsUserAllocated()153     bool IsUserAllocated() const
154     {
155         return m_UserAllocated != 0;
156     }
157 
158     //! @brief ユーザーが構築したグループであることを宣言します。
159     //!
160     //! @details
161     //! ユーザが構築したと宣言されたグループはライブラリによって解放されません。
162     //!
163     //! @since 2010/08/27 初版。
164     //!
SetUserAllocated()165     void SetUserAllocated()
166     {
167         m_UserAllocated = 1;
168     }
169 
170     //@}
171 
172     //! :private
173     //! @brief リンク情報です。
174     ut::LinkListNode m_Link_;
175 
176 private:
177     void Init();
178 
179     PaneLinkList m_PaneLinkList;
180     char m_Name[ResourceNameStrMax + 1];
181     u8 m_UserAllocated; // ユーザにより構築された場合は真
182     u8 m_Padding[2];
183 };
184 
185 //! @name 管理
186 //@{
187 
188 //! @brief グループの一覧を保持します。
189 //!
190 //! @since 2009/09/18 初版。
191 //!
192 typedef ut::LinkList<Group, offsetof(Group, m_Link_)> GroupList;
193 
194 //@}
195 
196 //---------------------------------------------------------------------------
197 //! :category 管理
198 //!
199 //! @brief グループを管理するためのクラスです。
200 //!
201 //! @details
202 //! Layout::GetGroupContainer() で取得します。
203 //!
204 //! @since 2009/09/18 初版。
205 //---------------------------------------------------------------------------
206 class GroupContainer
207 {
208 public:
209     //----------------------------------------
210     //! @name コンストラクタ/デストラクタ
211     //@{
212 
213     //! @brief コンストラクタです。
214     //!
215     //! @since 2009/09/18 初版。
216     //!
GroupContainer()217     GroupContainer()
218     {}
219 
220     //! @brief デストラクタです。
221     //!
222     //! @since 2009/09/18 初版。
223     //!
224     ~GroupContainer();
225 
226     //@}
227 
228     //----------------------------------------
229     //! @name 取得/設定
230     //@{
231 
232     //! @brief グループを追加します。
233     //!
234     //! @param pGroup グループへのポインタです。
235     //!
236     //! @since 2009/09/18 初版。
237     //!
238     void AppendGroup(Group* pGroup);
239 
240     //@}
241 
242     //----------------------------------------
243     //! @name 取得/設定
244     //@{
245 
246     //! @brief グループの一覧を取得します。
247     //!
248     //! @return
249     //! グループの一覧を返します。
250     //!
251     //! @since 2009/09/18 初版。
252     //!
GetGroupList()253     GroupList& GetGroupList()
254     {
255         return m_GroupList;
256     }
257 
258     //@}
259 
260     //----------------------------------------
261     //! @name 検索
262     //@{
263 
264     //! @brief 名前でグループを検索します。
265     //!
266     //! @param findName 検索するグループ名です。
267     //!
268     //! @return 見つかった場合はグループへのポインタを、
269     //! 見つからなかった場合は NULL を返します。
270     //!
271     //! @since 2009/09/18 初版。
272     //!
273     Group* FindGroupByName(const char* findName);
274 
275     //@}
276 
277 private:
278     GroupList m_GroupList;
279 
280 };
281 
282 } // namespace nw::lyt
283 } // namespace nw
284 
285 #endif // NW_LYT_GROUP_H_
286 
287