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: 26780 $
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 protected:
177     //! @details :private
178     void Init();
179 
180     //! @details :private
181     PaneLinkList m_PaneLinkList;
182 
183     //! @details :private
184     char m_Name[ResourceNameStrMax + 1];
185 
186     //! @details :private
187     //! ユーザにより構築された場合は真
188     u8 m_UserAllocated;
189 
190     //! @details :private
191     u8 m_Padding[2];
192 };
193 
194 //! @name 管理
195 //@{
196 
197 //! @brief グループの一覧を保持します。
198 //!
199 //! @since 2009/09/18 初版。
200 //!
201 typedef ut::LinkList<Group, offsetof(Group, m_Link_)> GroupList;
202 
203 //@}
204 
205 //---------------------------------------------------------------------------
206 //! :category 管理
207 //!
208 //! @brief グループを管理するためのクラスです。
209 //!
210 //! @details
211 //! Layout::GetGroupContainer() で取得します。
212 //!
213 //! @since 2009/09/18 初版。
214 //---------------------------------------------------------------------------
215 class GroupContainer
216 {
217 public:
218     //----------------------------------------
219     //! @name コンストラクタ/デストラクタ
220     //@{
221 
222     //! @brief コンストラクタです。
223     //!
224     //! @since 2009/09/18 初版。
225     //!
GroupContainer()226     GroupContainer()
227     {}
228 
229     //! @brief デストラクタです。
230     //!
231     //! @since 2009/09/18 初版。
232     //!
233     ~GroupContainer();
234 
235     //@}
236 
237     //----------------------------------------
238     //! @name 取得/設定
239     //@{
240 
241     //! @brief グループを追加します。
242     //!
243     //! @param pGroup グループへのポインタです。
244     //!
245     //! @since 2009/09/18 初版。
246     //!
247     void AppendGroup(Group* pGroup);
248 
249     //@}
250 
251     //----------------------------------------
252     //! @name 取得/設定
253     //@{
254 
255     //! @brief グループの一覧を取得します。
256     //!
257     //! @return
258     //! グループの一覧を返します。
259     //!
260     //! @since 2009/09/18 初版。
261     //!
GetGroupList()262     GroupList& GetGroupList()
263     {
264         return m_GroupList;
265     }
266 
267     //@}
268 
269     //----------------------------------------
270     //! @name 検索
271     //@{
272 
273     //! @brief 名前でグループを検索します。
274     //!
275     //! @param findName 検索するグループ名です。
276     //!
277     //! @return 見つかった場合はグループへのポインタを、
278     //! 見つからなかった場合は NULL を返します。
279     //!
280     //! @since 2009/09/18 初版。
281     //!
282     Group* FindGroupByName(const char* findName);
283 
284     //@}
285 
286 protected:
287     //! @details :private
288     GroupList m_GroupList;
289 
290 };
291 
292 } // namespace nw::lyt
293 } // namespace nw
294 
295 #endif // NW_LYT_GROUP_H_
296 
297