bug in RC
[anna.git] / include / anna / core / util / TextManager.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_core_util_TextManager_hpp
10 #define anna_core_util_TextManager_hpp
11
12 #include <vector>
13
14 #include <anna/core/functions.hpp>
15 #include <anna/core/mt/Mutex.hpp>
16
17 namespace anna {
18
19 class TextComposer;
20
21 /**
22    Gestor de textos con formato.
23 */
24 class TextManager : public Mutex {
25 public:
26   /**
27      Constructor.
28   */
29   TextManager(const char* name);
30
31   /**
32      Destructor.
33   */
34   virtual ~TextManager() { clear(); }
35
36   /**
37      Operador de acceso. El compositor solicitado deberia estar creado mediate #create.
38      \param composer Indica el numero de compositor al que deseamos acceder.
39      \return El compositor de textos.
40   */
41   TextComposer& operator [](const int composer) throw(RuntimeException) { return find(composer); }
42
43   /**
44      Operador de acceso. El compositor solicitado deberia estar creado mediate #create.
45      \param composer Indica el numero de compositor al que deseamos acceder.
46      \return El compositor de textos.
47   */
48   const TextComposer& operator [](const int composer) const throw(RuntimeException) { return find(composer); }
49
50   /**
51      Crea un nuevo compositor de textos.
52      \param composer Índice del compositor.
53      \param expression Expresion asociada al compositor que vamos a crear. El numero de variables que hay que
54      establecer antes de invocar a TextComposer::apply dependera de este texto.
55   */
56   void create(const int composer, const char* expression) throw(RuntimeException);
57
58   /**
59      Devuelve el compositor de textos asociado al numero recibido como parametro.
60      El compositor solicitado deberia estar creado mediate #create.
61      \param composer Indica el numero de compositor al que deseamos acceder.
62      \return El compositor de textos.
63   */
64   TextComposer& find(const int composer) throw(RuntimeException);
65
66   /**
67      Devuelve el compositor de textos asociado al numero recibido como parametro.
68      El compositor solicitado deberia estar creado mediate #create.
69      \param composer Indica el numero de compositor al que deseamos acceder.
70      \return El compositor de textos.
71   */
72   const TextComposer& find(const int composer) const throw(RuntimeException);
73
74   /**
75      Elimina todos los compositores de texto creados hasta el momento.
76   */
77   void clear() throw();
78
79   /**
80      Metodo que podemos reescribir para crear cualquier clase heredada de TextComposer.
81      Por defecto la impletacion sera:
82      \code
83         return new util::TextComposer (composer, expression);
84      \endcode
85      \warning La reimplementacion de este metodo nunca deberia devolver NULL.
86   */
87   virtual TextComposer* createTextComposer(const int composer, const char* expression) throw();
88
89 private:
90   typedef std::vector <TextComposer*> TextComposerVector;
91
92   const char* a_name;
93   TextComposerVector a_composers;
94
95   TextManager(const TextManager&);
96
97   TextComposer* xfind(const int composer) throw();
98 };
99
100 }
101
102 #endif
103