2 extender-engraver.cc -- implement Extender_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2004 Glen Prideaux <glenprideaux@iname.com>,
7 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
8 Jan Nieuwenhuizen <janneke@gnu.org>
12 #include "lyric-extender.hh"
14 #include "engraver.hh"
16 #include "group-interface.hh"
18 class Extender_engraver : public Engraver
22 Spanner * pending_extender_;
24 TRANSLATOR_DECLARATIONS(Extender_engraver);
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 ();
39 Extender_engraver::Extender_engraver ()
42 pending_extender_ = 0;
47 Extender_engraver::try_music (Music* r)
58 Extender_engraver::process_music ()
62 extender_ = make_spanner ("LyricExtender");
63 announce_grob (extender_, ev_->self_scm());
69 Extender_engraver::acknowledge_grob (Grob_info i)
71 Item * item = dynamic_cast<Item*> (i.grob_);
74 && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
77 extender_->set_bound (LEFT, item);
79 if (pending_extender_)
80 pending_extender_->set_bound (RIGHT, item);
85 Extender_engraver::stop_translation_timestep ()
87 if (pending_extender_ && pending_extender_->get_bound (RIGHT))
89 typeset_grob (pending_extender_);
90 pending_extender_ = 0;
93 if (extender_ || pending_extender_)
95 Context *voice = get_voice_to_lyrics (daddy_context_);
96 Grob* h = (voice) ? get_current_note_head (voice) : 0;
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);
110 pending_extender_ = extender_;
119 completize_extender (Spanner* sp)
121 if (!sp->get_bound (RIGHT))
123 SCM heads = sp->get_property ("heads");
124 if (gh_pair_p (heads))
126 Item* it = dynamic_cast<Item*> (unsmob_grob (gh_car (heads)));
128 sp->set_bound (RIGHT, it);
136 Extender_engraver::finalize ()
140 completize_extender (extender_);
142 if (!extender_->get_bound (RIGHT))
143 extender_->warning (_ ("unterminated extender"));
144 typeset_grob (extender_);
148 if (pending_extender_)
150 completize_extender (pending_extender_);
152 if (!pending_extender_->get_bound (RIGHT))
153 pending_extender_->warning (_("unterminated extender"));
154 typeset_grob (pending_extender_);
155 pending_extender_ =0;
163 ENTER_DESCRIPTION(Extender_engraver,
164 /* descr */ "Create lyric extenders",
165 /* creats*/ "LyricExtender",
166 /* accepts */ "extender-event",
167 /* acks */ "lyric-syllable-interface",