]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/translator.hh
Update.
[lilypond.git] / lily / include / translator.hh
1 /*
2   translator.hh -- declare Translator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #ifndef TRANSLATOR_HH
10 #define TRANSLATOR_HH
11
12 #include "global-ctor.hh"
13 #include "string.hh"
14 #include "lily-proto.hh"
15 #include "virtual-methods.hh"
16 #include "input.hh"
17 #include "smobs.hh"
18
19 /* copied from lily-guile.hh */
20 #ifndef get_property
21 #define get_property(x) internal_get_property (ly_symbol2scm (x))
22 #endif
23
24 #define TRANSLATOR_DECLARATIONS(NAME)                   \
25   public:                                               \
26   NAME ();                                              \
27   VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME);          \
28   static SCM static_description_;                       \
29   virtual SCM static_translator_description () const;   \
30   virtual SCM translator_description () const;
31
32 /*
33   Translate music into grobs.
34 */
35 class Translator
36 {
37   void init ();
38
39 protected:
40   bool must_be_last_;
41
42 public:
43   bool must_be_last () const;
44
45   Context *context () const { return daddy_context_; }
46
47   Translator (Translator const &);
48
49   SCM internal_get_property (SCM symbol) const;
50
51   virtual Output_def *get_output_def () const;
52   virtual Translator_group *get_daddy_translator ()const;
53   virtual Moment now_mom () const;
54   virtual bool try_music (Music *req);
55   virtual void stop_translation_timestep ();
56   virtual void start_translation_timestep ();
57   virtual void initialize ();
58   virtual void process_music ();
59   virtual void do_announces ();
60   virtual void finalize ();
61
62   Score_context *get_score_context () const;
63   Global_context *get_global_context () const;
64
65   TRANSLATOR_DECLARATIONS (Translator);
66   DECLARE_SMOBS (Translator, dummy);
67 protected:                      // should be private.
68   Context *daddy_context_;
69   virtual void derived_mark () const;
70
71   friend class Context_def;
72   friend class Context;
73 };
74
75 /**
76    A macro to automate administration of translators.
77 */
78 #define ADD_THIS_TRANSLATOR(T)                                          \
79   SCM T::static_description_ = SCM_EOL;                                 \
80   static void _ ## T ## _adder ()                                       \
81   {                                                                     \
82     T *t = new T;                                                       \
83     T::static_description_ = t->static_translator_description ();       \
84     scm_permanent_object (T::static_description_);                      \
85     add_translator (t);                                                 \
86   }                                                                     \
87   SCM T::translator_description () const                                \
88   {                                                                     \
89     return static_description_;                                         \
90   }                                                                     \
91   ADD_GLOBAL_CTOR (_ ## T ## _adder);
92
93 #define ADD_TRANSLATOR(classname, desc, grobs, accepted, acked, read, write) \
94   ADD_THIS_TRANSLATOR (classname);                                      \
95   SCM                                                                   \
96   classname::static_translator_description () const                     \
97   {                                                                     \
98     SCM static_properties = SCM_EOL;                                    \
99     /*  static_properties = acons (name , gh_str02scm (Translator::name (self_scm ())), \
100         static_properties_);                                            \
101     */                                                                  \
102     static_properties = scm_acons (ly_symbol2scm ("grobs-created"),     \
103                                    parse_symbol_list (grobs), static_properties); \
104                                                                         \
105     static_properties = scm_acons (ly_symbol2scm ("description"),       \
106                                    scm_makfrom0str (desc), static_properties); \
107                                                                         \
108     static_properties = scm_acons (ly_symbol2scm ("interfaces-acked"),  \
109                                    parse_symbol_list (acked), static_properties); \
110     static_properties = scm_acons (ly_symbol2scm ("events-accepted"),   \
111                                    parse_symbol_list (accepted), static_properties); \
112                                                                         \
113     static_properties = scm_acons (ly_symbol2scm ("properties-read"),   \
114                                    parse_symbol_list (read), static_properties); \
115                                                                         \
116     static_properties = scm_acons (ly_symbol2scm ("properties-written"), \
117                                    parse_symbol_list (write), static_properties); \
118                                                                         \
119     return static_properties;                                           \
120   }
121
122 void add_translator (Translator *trans);
123
124 Translator *get_translator (SCM s);
125 DECLARE_UNSMOB (Translator, translator);
126 #endif // TRANSLATOR_HH