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