]> git.donarmstrong.com Git - lilypond.git/blob - lily/extender-engraver.cc
* lily/text-item.cc (interpret_string): new file, select font with
[lilypond.git] / lily / extender-engraver.cc
1 /*
2   extender-engraver.cc -- implement Extender_engraver
3
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999--2004 Glen Prideaux <glenprideaux@iname.com>,
7                   Han-Wen Nienhuys <hanwen@cs.uu.nl>,
8                   Jan Nieuwenhuizen <janneke@gnu.org>
9 */
10
11 #include "warn.hh"
12 #include "lyric-extender.hh"
13 #include "item.hh"
14 #include "engraver.hh"
15 #include "context.hh"
16 #include "group-interface.hh"
17
18 class Extender_engraver : public Engraver
19 {
20   Music* ev_;
21   Spanner* extender_;
22   Spanner * pending_extender_;  
23 public:
24   TRANSLATOR_DECLARATIONS (Extender_engraver);
25
26 protected:
27   virtual void acknowledge_grob (Grob_info);
28   virtual void finalize ();
29   virtual bool try_music (Music*);
30   virtual void stop_translation_timestep ();
31   virtual void process_music ();
32 private:
33
34 };
35
36
37
38
39 Extender_engraver::Extender_engraver ()
40 {
41   extender_ = 0;
42   pending_extender_ = 0;
43   ev_ = 0;
44 }
45
46 bool
47 Extender_engraver::try_music (Music* r)
48 {
49   if (ev_)
50     return false;
51
52   ev_ = r;
53   return true;
54 }
55
56
57 void
58 Extender_engraver::process_music ()
59 {
60   if (ev_)
61     {
62       extender_ = make_spanner ("LyricExtender");
63       announce_grob (extender_, ev_->self_scm ());
64     }
65 }
66
67
68 void
69 Extender_engraver::acknowledge_grob (Grob_info i)
70 {
71   Item * item =  dynamic_cast<Item*> (i.grob_);
72
73   if (item
74       && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
75     {
76       if (extender_)
77         extender_->set_bound (LEFT, item);
78
79       if (pending_extender_)
80         pending_extender_->set_bound (RIGHT, item);
81     }
82 }
83
84 void
85 Extender_engraver::stop_translation_timestep ()
86 {
87   if (pending_extender_ && pending_extender_->get_bound (RIGHT))
88     {
89       typeset_grob (pending_extender_);
90       pending_extender_ = 0;
91     }
92
93   if (extender_ || pending_extender_)
94     {
95       Context *voice = get_voice_to_lyrics (daddy_context_);
96       Grob* h =  (voice) ? get_current_note_head (voice) : 0;
97
98       if (h)
99         {
100           if (extender_)
101             Pointer_group_interface::add_grob (extender_,
102                                                ly_symbol2scm ("heads"), h);
103           if (pending_extender_)
104             Pointer_group_interface::add_grob (pending_extender_,
105                                                ly_symbol2scm ("heads"), h);
106         }           
107
108       if (extender_)
109         {
110           pending_extender_ = extender_;
111           extender_ = 0;
112         }
113     }
114
115   ev_ = 0;
116 }
117
118 void
119 completize_extender (Spanner* sp)
120 {
121   if (!sp->get_bound (RIGHT))
122     {
123       SCM heads = sp->get_property ("heads");
124       if (is_pair (heads))
125         {
126           Item* it = dynamic_cast<Item*> (unsmob_grob (ly_car (heads)));
127           if (it)
128             sp->set_bound (RIGHT, it);
129         }
130     }
131 }
132
133   
134
135 void
136 Extender_engraver::finalize ()
137 {
138   if (extender_)
139     {
140       completize_extender (extender_);
141
142       if (!extender_->get_bound (RIGHT))
143         extender_->warning (_ ("unterminated extender"));
144       typeset_grob (extender_);
145       extender_ = 0;
146     }
147
148   if (pending_extender_)
149     {
150       completize_extender (pending_extender_);
151
152       if (!pending_extender_->get_bound (RIGHT))
153           pending_extender_->warning (_("unterminated extender"));
154       typeset_grob (pending_extender_);
155       pending_extender_ =0;
156     }
157 }
158
159
160
161
162
163 ENTER_DESCRIPTION (Extender_engraver,
164 /* descr */       "Create lyric extenders",
165 /* creats*/       "LyricExtender",
166 /* accepts */     "extender-event",
167 /* acks  */       "lyric-syllable-interface",
168 /* reads */       "",
169 /* write */       "");