2 extender-engraver.cc -- implement Extender_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2006 Glen Prideaux <glenprideaux@iname.com>,
7 Han-Wen Nienhuys <hanwen@xs4all.nl>,
8 Jan Nieuwenhuizen <janneke@gnu.org>
12 #include "engraver.hh"
13 #include "international.hh"
15 #include "lyric-extender.hh"
16 #include "note-head.hh"
17 #include "pointer-group-interface.hh"
18 #include "stream-event.hh"
22 #include "translator.icc"
24 void completize_extender (Spanner *sp);
26 class Extender_engraver : public Engraver
30 Spanner *pending_extender_;
33 TRANSLATOR_DECLARATIONS (Extender_engraver);
36 DECLARE_TRANSLATOR_LISTENER (extender);
37 DECLARE_ACKNOWLEDGER (lyric_syllable);
38 virtual void finalize ();
39 void stop_translation_timestep ();
40 void process_music ();
43 Extender_engraver::Extender_engraver ()
46 pending_extender_ = 0;
50 IMPLEMENT_TRANSLATOR_LISTENER (Extender_engraver, extender);
52 Extender_engraver::listen_extender (Stream_event *ev)
54 ASSIGN_EVENT_ONCE (ev_, ev);
58 Extender_engraver::process_music ()
61 extender_ = make_spanner ("LyricExtender", ev_->self_scm ());
65 Extender_engraver::acknowledge_lyric_syllable (Grob_info i)
67 Item *item = i.item ();
69 extender_->set_bound (LEFT, item);
71 if (pending_extender_)
73 pending_extender_->set_object ("next", item->self_scm ());
74 completize_extender (pending_extender_);
75 pending_extender_ = 0;
80 Extender_engraver::stop_translation_timestep ()
82 if (extender_ || pending_extender_)
84 Context *voice = get_voice_to_lyrics (context ());
85 Grob *h = voice ? get_current_note_head (voice) : 0;
91 Pointer_group_interface::add_grob (extender_,
92 ly_symbol2scm ("heads"), h);
95 if (pending_extender_)
97 Pointer_group_interface::add_grob (pending_extender_,
98 ly_symbol2scm ("heads"), h);
103 if (pending_extender_)
105 completize_extender (pending_extender_);
106 pending_extender_ = 0;
112 pending_extender_ = extender_;
121 completize_extender (Spanner *sp)
123 if (!sp->get_bound (RIGHT))
125 extract_item_set (sp, "heads", heads);
127 sp->set_bound (RIGHT, heads.back ());
132 Extender_engraver::finalize ()
136 completize_extender (extender_);
138 if (!extender_->get_bound (RIGHT))
139 extender_->warning (_ ("unterminated extender"));
143 if (pending_extender_)
145 completize_extender (pending_extender_);
147 if (!pending_extender_->get_bound (RIGHT))
148 pending_extender_->warning (_ ("unterminated extender"));
149 pending_extender_ = 0;
153 ADD_ACKNOWLEDGER (Extender_engraver, lyric_syllable);
154 ADD_TRANSLATOR (Extender_engraver,
155 /* doc */ "Create lyric extenders",
156 /* create */ "LyricExtender",