2 extender-engraver.cc -- implement Extender_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2005 Glen Prideaux <glenprideaux@iname.com>,
7 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
8 Jan Nieuwenhuizen <janneke@gnu.org>
12 #include "engraver.hh"
13 #include "group-interface.hh"
15 #include "lyric-extender.hh"
16 #include "note-head.hh"
19 void completize_extender (Spanner *sp);
21 class Extender_engraver : public Engraver
25 Spanner *pending_extender_;
28 TRANSLATOR_DECLARATIONS (Extender_engraver);
31 virtual void acknowledge_grob (Grob_info);
32 virtual void finalize ();
33 virtual bool try_music (Music *);
34 virtual void stop_translation_timestep ();
35 virtual void process_music ();
38 Extender_engraver::Extender_engraver ()
41 pending_extender_ = 0;
46 Extender_engraver::try_music (Music *r)
57 Extender_engraver::process_music ()
60 extender_ = make_spanner ("LyricExtender", ev_->self_scm ());
64 Extender_engraver::acknowledge_grob (Grob_info i)
66 Item *item = dynamic_cast<Item *> (i.grob ());
69 && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
72 extender_->set_bound (LEFT, item);
74 if (pending_extender_)
76 pending_extender_->set_property ("next", item->self_scm ());
77 completize_extender (pending_extender_);
78 pending_extender_ = 0;
84 Extender_engraver::stop_translation_timestep ()
86 if (extender_ || pending_extender_)
88 Context *voice = get_voice_to_lyrics (context ());
89 Grob *h = voice ? get_current_note_head (voice) : 0;
95 Pointer_group_interface::add_grob (extender_,
96 ly_symbol2scm ("heads"), h);
99 if (pending_extender_)
101 Pointer_group_interface::add_grob (pending_extender_,
102 ly_symbol2scm ("heads"), h);
108 pending_extender_ = extender_;
117 completize_extender (Spanner *sp)
119 if (!sp->get_bound (RIGHT))
121 SCM heads = sp->get_property ("heads");
122 if (scm_is_pair (heads))
124 Item *it = dynamic_cast<Item *> (unsmob_grob (scm_car (heads)));
126 sp->set_bound (RIGHT, it);
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_TRANSLATOR (Extender_engraver,
154 /* descr */ "Create lyric extenders",
155 /* creats*/ "LyricExtender",
156 /* accepts */ "extender-event",
157 /* acks */ "lyric-syllable-interface",