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"
21 #include "translator.icc"
23 void completize_extender (Spanner *sp);
25 class Extender_engraver : public Engraver
29 Spanner *pending_extender_;
32 TRANSLATOR_DECLARATIONS (Extender_engraver);
35 DECLARE_TRANSLATOR_LISTENER (extender);
36 DECLARE_ACKNOWLEDGER (lyric_syllable);
37 virtual void finalize ();
38 void stop_translation_timestep ();
39 void process_music ();
42 Extender_engraver::Extender_engraver ()
45 pending_extender_ = 0;
49 IMPLEMENT_TRANSLATOR_LISTENER (Extender_engraver, extender);
51 Extender_engraver::listen_extender (Stream_event *ev)
53 ASSIGN_EVENT_ONCE (ev_, ev);
57 Extender_engraver::process_music ()
60 extender_ = make_spanner ("LyricExtender", ev_->self_scm ());
64 Extender_engraver::acknowledge_lyric_syllable (Grob_info i)
66 Item *item = i.item ();
68 extender_->set_bound (LEFT, item);
70 if (pending_extender_)
72 pending_extender_->set_object ("next", item->self_scm ());
73 completize_extender (pending_extender_);
74 pending_extender_ = 0;
79 Extender_engraver::stop_translation_timestep ()
81 if (extender_ || pending_extender_)
83 Context *voice = get_voice_to_lyrics (context ());
84 Grob *h = voice ? get_current_note_head (voice) : 0;
90 Pointer_group_interface::add_grob (extender_,
91 ly_symbol2scm ("heads"), h);
94 if (pending_extender_)
96 Pointer_group_interface::add_grob (pending_extender_,
97 ly_symbol2scm ("heads"), h);
103 pending_extender_ = extender_;
112 completize_extender (Spanner *sp)
114 if (!sp->get_bound (RIGHT))
116 extract_item_set (sp, "heads", heads);
118 sp->set_bound (RIGHT, heads.back ());
123 Extender_engraver::finalize ()
127 completize_extender (extender_);
129 if (!extender_->get_bound (RIGHT))
130 extender_->warning (_ ("unterminated extender"));
134 if (pending_extender_)
136 completize_extender (pending_extender_);
138 if (!pending_extender_->get_bound (RIGHT))
139 pending_extender_->warning (_ ("unterminated extender"));
140 pending_extender_ = 0;
144 ADD_ACKNOWLEDGER (Extender_engraver, lyric_syllable);
145 ADD_TRANSLATOR (Extender_engraver,
146 /* doc */ "Create lyric extenders",
147 /* create */ "LyricExtender",