1 | /************************************************************************
|
---|
2 | filename: CEGUIWindowFactoryManager.h
|
---|
3 | created: 22/2/2004
|
---|
4 | author: Paul D Turner
|
---|
5 |
|
---|
6 | purpose: Defines interface for WindowFactoryManager class
|
---|
7 | *************************************************************************/
|
---|
8 | /*************************************************************************
|
---|
9 | Crazy Eddie's GUI System (http://www.cegui.org.uk)
|
---|
10 | Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk)
|
---|
11 |
|
---|
12 | This library is free software; you can redistribute it and/or
|
---|
13 | modify it under the terms of the GNU Lesser General Public
|
---|
14 | License as published by the Free Software Foundation; either
|
---|
15 | version 2.1 of the License, or (at your option) any later version.
|
---|
16 |
|
---|
17 | This library is distributed in the hope that it will be useful,
|
---|
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
20 | Lesser General Public License for more details.
|
---|
21 |
|
---|
22 | You should have received a copy of the GNU Lesser General Public
|
---|
23 | License along with this library; if not, write to the Free Software
|
---|
24 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
25 | *************************************************************************/
|
---|
26 | #ifndef _CEGUIWindowFactoryManager_h_
|
---|
27 | #define _CEGUIWindowFactoryManager_h_
|
---|
28 |
|
---|
29 | #include "CEGUIBase.h"
|
---|
30 | #include "CEGUIString.h"
|
---|
31 | #include "CEGUISingleton.h"
|
---|
32 | #include "CEGUILogger.h"
|
---|
33 | #include "CEGUIIteratorBase.h"
|
---|
34 | #include <map>
|
---|
35 | #include <vector>
|
---|
36 |
|
---|
37 | #if defined(_MSC_VER)
|
---|
38 | # pragma warning(push)
|
---|
39 | # pragma warning(disable : 4275)
|
---|
40 | # pragma warning(disable : 4251)
|
---|
41 | #endif
|
---|
42 |
|
---|
43 |
|
---|
44 | // Start of CEGUI namespace section
|
---|
45 | namespace CEGUI
|
---|
46 | {
|
---|
47 | /*!
|
---|
48 | \brief
|
---|
49 | Class that manages WindowFactory objects
|
---|
50 | */
|
---|
51 | class CEGUIEXPORT WindowFactoryManager : public Singleton<WindowFactoryManager>
|
---|
52 | {
|
---|
53 | public:
|
---|
54 | /*!
|
---|
55 | \brief
|
---|
56 | struct used to hold mapping information required to create a falagard based window.
|
---|
57 | */
|
---|
58 | struct CEGUIEXPORT FalagardWindowMapping
|
---|
59 | {
|
---|
60 | String d_windowType;
|
---|
61 | String d_lookName;
|
---|
62 | String d_baseType;
|
---|
63 | };
|
---|
64 |
|
---|
65 | /*!
|
---|
66 | \brief
|
---|
67 | Class used to track active alias targets for Window factory types.
|
---|
68 | */
|
---|
69 | class CEGUIEXPORT AliasTargetStack
|
---|
70 | {
|
---|
71 | public:
|
---|
72 | /*!
|
---|
73 | \brief
|
---|
74 | Constructor for WindowAliasTargetStack objects
|
---|
75 | */
|
---|
76 | AliasTargetStack(void) {}
|
---|
77 |
|
---|
78 |
|
---|
79 | /*!
|
---|
80 | \brief
|
---|
81 | Destructor for WindowAliasTargetStack objects
|
---|
82 | */
|
---|
83 | ~AliasTargetStack(void) {}
|
---|
84 |
|
---|
85 |
|
---|
86 | /*!
|
---|
87 | \brief
|
---|
88 | Return a String holding the current target type for this stack
|
---|
89 |
|
---|
90 | \return
|
---|
91 | reference to a String object holding the currently active target type name for this stack.
|
---|
92 | */
|
---|
93 | const String& getActiveTarget(void) const;
|
---|
94 |
|
---|
95 | /*!
|
---|
96 | \brief
|
---|
97 | Return the number of stacked target types in the stack
|
---|
98 |
|
---|
99 | \return
|
---|
100 | number of target types stacked for this alias.
|
---|
101 | */
|
---|
102 | uint getStackedTargetCount(void) const;
|
---|
103 |
|
---|
104 |
|
---|
105 | private:
|
---|
106 | friend class WindowFactoryManager;
|
---|
107 | typedef std::vector<String> TargetTypeStack; //!< Type used to implement stack of target type names.
|
---|
108 |
|
---|
109 | TargetTypeStack d_targetStack; //!< Container holding the target types.
|
---|
110 | };
|
---|
111 |
|
---|
112 |
|
---|
113 | /*************************************************************************
|
---|
114 | Construction and Destruction
|
---|
115 | *************************************************************************/
|
---|
116 | /*!
|
---|
117 | \brief
|
---|
118 | Constructs a new WindowFactoryManager object.
|
---|
119 | */
|
---|
120 | WindowFactoryManager(void)
|
---|
121 | {
|
---|
122 | Logger::getSingleton().logEvent((utf8*)"CEGUI::WindowFactoryManager singleton created");
|
---|
123 | }
|
---|
124 |
|
---|
125 |
|
---|
126 | /*!
|
---|
127 | \brief
|
---|
128 | Destructor for WindowFactoryManager objects
|
---|
129 | */
|
---|
130 | ~WindowFactoryManager(void)
|
---|
131 | {
|
---|
132 | Logger::getSingleton().logEvent((utf8*)"CEGUI::WindowFactoryManager singleton destroyed");
|
---|
133 | }
|
---|
134 |
|
---|
135 |
|
---|
136 | /*************************************************************************
|
---|
137 | Public Interface
|
---|
138 | *************************************************************************/
|
---|
139 | /*!
|
---|
140 | \brief
|
---|
141 | Return singleton WindowFactoryManager object
|
---|
142 |
|
---|
143 | \return
|
---|
144 | Singleton WindowFactoryManager object
|
---|
145 | */
|
---|
146 | static WindowFactoryManager& getSingleton(void);
|
---|
147 |
|
---|
148 |
|
---|
149 | /*!
|
---|
150 | \brief
|
---|
151 | Return pointer to singleton WindowFactoryManager object
|
---|
152 |
|
---|
153 | \return
|
---|
154 | Pointer to singleton WindowFactoryManager object
|
---|
155 | */
|
---|
156 | static WindowFactoryManager* getSingletonPtr(void);
|
---|
157 |
|
---|
158 |
|
---|
159 | /*!
|
---|
160 | \brief
|
---|
161 | Adds a new WindowFactory to the list of registered factories.
|
---|
162 |
|
---|
163 | \param factory
|
---|
164 | Pointer to the WindowFactory to be added to the WindowManager.
|
---|
165 |
|
---|
166 | \return
|
---|
167 | Nothing
|
---|
168 |
|
---|
169 | \exception NullObjectException \a factory was null.
|
---|
170 | \exception AlreadyExistsException \a factory provided a Window type name which is in use by another registered WindowFactory.
|
---|
171 | */
|
---|
172 | void addFactory(WindowFactory* factory);
|
---|
173 |
|
---|
174 |
|
---|
175 | /*!
|
---|
176 | \brief
|
---|
177 | Removes a WindowFactory from the list of registered factories.
|
---|
178 |
|
---|
179 | \note
|
---|
180 | The WindowFactory object is not destroyed (since it was created externally), instead it is just removed from the list.
|
---|
181 |
|
---|
182 | \param name
|
---|
183 | String which holds the name (technically, Window type name) of the WindowFactory to be removed. If \a name is not
|
---|
184 | in the list, no error occurs (nothing happens).
|
---|
185 |
|
---|
186 | \return
|
---|
187 | Nothing
|
---|
188 | */
|
---|
189 | void removeFactory(const String& name);
|
---|
190 |
|
---|
191 |
|
---|
192 | /*!
|
---|
193 | \brief
|
---|
194 | Removes a WindowFactory from the list of registered factories.
|
---|
195 |
|
---|
196 | \note
|
---|
197 | The WindowFactory object is not destroyed (since it was created externally), instead it is just removed from the list.
|
---|
198 |
|
---|
199 | \param factory
|
---|
200 | Pointer to the factory object to be removed. If \a factory is null, or if no such WindowFactory is in the list, no
|
---|
201 | error occurs (nothing happens).
|
---|
202 |
|
---|
203 | \return
|
---|
204 | Nothing
|
---|
205 | */
|
---|
206 | void removeFactory(WindowFactory* factory);
|
---|
207 |
|
---|
208 |
|
---|
209 | /*!
|
---|
210 | \brief
|
---|
211 | Remove all WindowFactory objects from the list.
|
---|
212 |
|
---|
213 | \return
|
---|
214 | Nothing
|
---|
215 | */
|
---|
216 | void removeAllFactories(void) {d_factoryRegistry.clear();}
|
---|
217 |
|
---|
218 |
|
---|
219 | /*!
|
---|
220 | \brief
|
---|
221 | Return a pointer to the specified WindowFactory object.
|
---|
222 |
|
---|
223 | \param type
|
---|
224 | String holding the Window object type to return the WindowFactory for.
|
---|
225 |
|
---|
226 | \return
|
---|
227 | Pointer to the WindowFactory object that creates Windows of the type \a type.
|
---|
228 |
|
---|
229 | \exception UnknownObjectException No WindowFactory object for Window objects of type \a type was found.
|
---|
230 | */
|
---|
231 | WindowFactory* getFactory(const String& type) const;
|
---|
232 |
|
---|
233 |
|
---|
234 | /*!
|
---|
235 | \brief
|
---|
236 | Checks the list of registered WindowFactory objects, aliases, and
|
---|
237 | falagard mapped types for one which can create Window objects of the
|
---|
238 | specified type.
|
---|
239 |
|
---|
240 | \param name
|
---|
241 | String containing the Window type name to check for.
|
---|
242 |
|
---|
243 | \return
|
---|
244 | - true if a WindowFactory, alias, or falagard mapping for Window objects
|
---|
245 | of type \a name is registered.
|
---|
246 | - false if the system knows nothing about windows of type \a name.
|
---|
247 | */
|
---|
248 | bool isFactoryPresent(const String& name) const;
|
---|
249 |
|
---|
250 |
|
---|
251 | /*!
|
---|
252 | \brief
|
---|
253 | Adds an alias for a current window type.
|
---|
254 |
|
---|
255 | This method allows you to create an alias for a specified window type. This means that you can then use
|
---|
256 | either name as the type parameter when creating a window.
|
---|
257 |
|
---|
258 | \note
|
---|
259 | You need to be careful using this system. Creating an alias using a name that already exists will replace the previous
|
---|
260 | mapping for that alias. Each alias name maintains a stack, which means that it is possible to remove an alias and have the
|
---|
261 | previous alias restored. The windows created via an alias use the real type, so removing an alias after window creation is always
|
---|
262 | safe (i.e. it is not the same as removing a real factory, which would cause an exception when trying to destroy a window with a missing
|
---|
263 | factory).
|
---|
264 |
|
---|
265 | \param aliasName
|
---|
266 | String object holding the alias name. That is the name that \a targetType will also be known as from no on.
|
---|
267 |
|
---|
268 | \param targetType
|
---|
269 | String object holding the type window type name that is to be aliased. This type must already exist.
|
---|
270 |
|
---|
271 | \return
|
---|
272 | Nothing.
|
---|
273 |
|
---|
274 | \exception UnknownObjectException thrown if \a targetType is not known within the system.
|
---|
275 | */
|
---|
276 | void addWindowTypeAlias(const String& aliasName, const String& targetType);
|
---|
277 |
|
---|
278 |
|
---|
279 | /*!
|
---|
280 | \brief
|
---|
281 | Remove the specified alias mapping. If the alias mapping does not exist, nothing happens.
|
---|
282 |
|
---|
283 | \note
|
---|
284 | You are required to supply both the alias and target names because there may exist more than one entry for a given
|
---|
285 | alias - therefore you are required to be explicit about which alias is to be removed.
|
---|
286 |
|
---|
287 | \param aliasName
|
---|
288 | String object holding the alias name.
|
---|
289 |
|
---|
290 | \param targetType
|
---|
291 | String object holding the type window type name that was aliased.
|
---|
292 |
|
---|
293 | \return
|
---|
294 | Nothing.
|
---|
295 | */
|
---|
296 | void removeWindowTypeAlias(const String& aliasName, const String& targetType);
|
---|
297 |
|
---|
298 | /*!
|
---|
299 | \brief
|
---|
300 | Add a mapping for a falagard based window.
|
---|
301 |
|
---|
302 | This function creates maps a target window type and target 'look' name onto a registered window type, thus allowing
|
---|
303 | the ususal window creation interface to be used to create windows that require extra information to full initialise
|
---|
304 | themselves.
|
---|
305 | \note
|
---|
306 | These mappings support 'late binding' to the target window type, as such the type indicated by \a targetType need not
|
---|
307 | exist in the system until attempting to create a Window using the type.
|
---|
308 | \par
|
---|
309 | Also note that creating a mapping for an existing type will replace any previous mapping for that same type.
|
---|
310 |
|
---|
311 | \param newType
|
---|
312 | The type name that will be used to create windows using the target type and look.
|
---|
313 |
|
---|
314 | \param targetType
|
---|
315 | The base window type.
|
---|
316 |
|
---|
317 | \param lookName
|
---|
318 | The name of the 'look' that will be used by windows of this type.
|
---|
319 |
|
---|
320 | \return
|
---|
321 | Nothing.
|
---|
322 | */
|
---|
323 | void addFalagardWindowMapping(const String& newType, const String& targetType, const String& lookName);
|
---|
324 |
|
---|
325 | /*!
|
---|
326 | \brief
|
---|
327 | Remove the specified falagard type mapping if it exists.
|
---|
328 |
|
---|
329 | \return
|
---|
330 | Nothing.
|
---|
331 | */
|
---|
332 | void removeFalagardWindowMapping(const String& type);
|
---|
333 |
|
---|
334 | /*!
|
---|
335 | \brief
|
---|
336 | Return whether the given type is a falagard mapped type.
|
---|
337 |
|
---|
338 | \param type
|
---|
339 | Name of a window type.
|
---|
340 |
|
---|
341 | \return
|
---|
342 | - true if the requested type is a Falagard mapped window type.
|
---|
343 | - false if the requested type is a normal WindowFactory (or alias), or if the type does not exist.
|
---|
344 | */
|
---|
345 | bool isFalagardMappedType(const String& type) const;
|
---|
346 |
|
---|
347 | /*!
|
---|
348 | \brief
|
---|
349 | Return the name of the LookN'Feel assigned to the specified window mapping.
|
---|
350 |
|
---|
351 | \param type
|
---|
352 | Name of a window type. The window type referenced should be a falagard mapped type.
|
---|
353 |
|
---|
354 | \return
|
---|
355 | String object holding the name of the look mapped for the requested type.
|
---|
356 |
|
---|
357 | \exception InvalidRequestException thrown if \a type is not a falagard mapping type (or maybe the type didn't exist).
|
---|
358 | */
|
---|
359 | const String& getMappedLookForType(const String& type) const;
|
---|
360 |
|
---|
361 |
|
---|
362 | /*!
|
---|
363 | \brief
|
---|
364 | Use the alias system, where required, to 'de-reference' the specified
|
---|
365 | type to an actual window type that can be created directly (that being
|
---|
366 | either a concrete window type, or a falagard mapped type).
|
---|
367 |
|
---|
368 | \note
|
---|
369 | Even though implied by the above description, this method does not
|
---|
370 | check that a factory for the final type exists; we simply say that the
|
---|
371 | returned type is not an alias for some other type.
|
---|
372 |
|
---|
373 | \param type
|
---|
374 | String describing the type to be de-referenced.
|
---|
375 |
|
---|
376 | \return
|
---|
377 | String object holding a type for a window that can be created directly;
|
---|
378 | that is, a type that does not describe an alias to some other type.
|
---|
379 | */
|
---|
380 | String getDereferencedAliasType(const String& type) const;
|
---|
381 |
|
---|
382 | private:
|
---|
383 | /*************************************************************************
|
---|
384 | Implementation Data
|
---|
385 | *************************************************************************/
|
---|
386 | typedef std::map<String, WindowFactory*> WindowFactoryRegistry; //!< Type used to implement registry of WindowFactory objects
|
---|
387 | typedef std::map<String, AliasTargetStack> TypeAliasRegistry; //!< Type used to implement registry of window type aliases.
|
---|
388 | typedef std::map<String, FalagardWindowMapping> FalagardMapRegistry; //!< Type used to implement registry of falagard window mappings.
|
---|
389 |
|
---|
390 | WindowFactoryRegistry d_factoryRegistry; //!< The container that forms the WindowFactory registry
|
---|
391 | TypeAliasRegistry d_aliasRegistry; //!< The container that forms the window type alias registry.
|
---|
392 | FalagardMapRegistry d_falagardRegistry; //!< Container that hold all the falagard window mappings.
|
---|
393 |
|
---|
394 | public:
|
---|
395 | /*************************************************************************
|
---|
396 | Iterator stuff
|
---|
397 | *************************************************************************/
|
---|
398 | typedef ConstBaseIterator<WindowFactoryRegistry> WindowFactoryIterator;
|
---|
399 | typedef ConstBaseIterator<TypeAliasRegistry> TypeAliasIterator;
|
---|
400 | typedef ConstBaseIterator<FalagardMapRegistry> FalagardMappingIterator;
|
---|
401 |
|
---|
402 | /*!
|
---|
403 | \brief
|
---|
404 | Return a WindowFactoryManager::WindowFactoryIterator object to iterate over the available WindowFactory types.
|
---|
405 | */
|
---|
406 | WindowFactoryIterator getIterator(void) const;
|
---|
407 |
|
---|
408 |
|
---|
409 | /*!
|
---|
410 | \brief
|
---|
411 | Return a WindowFactoryManager::TypeAliasIterator object to iterate over the defined aliases for window types.
|
---|
412 | */
|
---|
413 | TypeAliasIterator getAliasIterator(void) const;
|
---|
414 |
|
---|
415 |
|
---|
416 | /*!
|
---|
417 | \brief
|
---|
418 | Return a WindowFactoryManager::FalagardMappingIterator object to iterate over the defined falagard window mappings.
|
---|
419 | */
|
---|
420 | FalagardMappingIterator getFalagardMappingIterator() const;
|
---|
421 | };
|
---|
422 |
|
---|
423 | } // End of CEGUI namespace section
|
---|
424 |
|
---|
425 |
|
---|
426 | #if defined(_MSC_VER)
|
---|
427 | # pragma warning(pop)
|
---|
428 | #endif
|
---|
429 |
|
---|
430 | #endif // end of guard _CEGUIWindowFactoryManager_h_
|
---|