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 "engraver.hh"
13 #include "group-interface.hh"
15 #include "lyric-extender.hh"
16 #include "note-head.hh"
19 class Extender_engraver : public Engraver
23 Spanner *pending_extender_;
26 TRANSLATOR_DECLARATIONS (Extender_engraver);
29 virtual void acknowledge_grob (Grob_info);
30 virtual void finalize ();
31 virtual bool try_music (Music*);
32 virtual void stop_translation_timestep ();
33 virtual void process_music ();
37 Extender_engraver::Extender_engraver ()
40 pending_extender_ = 0;
45 Extender_engraver::try_music (Music *r)
56 Extender_engraver::process_music ()
59 extender_ = make_spanner ("LyricExtender", ev_->self_scm ());
63 Extender_engraver::acknowledge_grob (Grob_info i)
65 Item *item = dynamic_cast<Item*> (i.grob_);
68 && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
71 extender_->set_bound (LEFT, item);
73 if (pending_extender_)
74 pending_extender_->set_bound (RIGHT, item);
79 Extender_engraver::stop_translation_timestep ()
81 if (pending_extender_ && pending_extender_->get_bound (RIGHT))
82 pending_extender_ = 0;
84 if (extender_ || pending_extender_)
86 Context *voice = get_voice_to_lyrics (context ());
87 Grob *h = voice ? get_current_note_head (voice) : 0;
88 Grob *r = voice ? get_current_rest (voice) : 0;
93 Pointer_group_interface::add_grob (extender_,
94 ly_symbol2scm ("heads"), h);
95 if (pending_extender_)
96 Pointer_group_interface::add_grob (pending_extender_,
97 ly_symbol2scm ("heads"), h);
99 else if (r && pending_extender_)
100 /* Rest: stop right here. */
101 pending_extender_->set_bound (RIGHT, h);
105 pending_extender_ = extender_;
114 completize_extender (Spanner *sp)
116 if (!sp->get_bound (RIGHT))
118 SCM heads = sp->get_property ("heads");
119 if (ly_c_pair_p (heads))
121 Item *it = dynamic_cast<Item*> (unsmob_grob (ly_car (heads)));
123 sp->set_bound (RIGHT, it);
129 Extender_engraver::finalize ()
133 completize_extender (extender_);
135 if (!extender_->get_bound (RIGHT))
136 extender_->warning (_ ("unterminated extender"));
140 if (pending_extender_)
142 completize_extender (pending_extender_);
144 if (!pending_extender_->get_bound (RIGHT))
145 pending_extender_->warning (_ ("unterminated extender"));
146 pending_extender_ =0;
151 ENTER_DESCRIPTION (Extender_engraver,
152 /* descr */ "Create lyric extenders",
153 /* creats*/ "LyricExtender",
154 /* accepts */ "extender-event",
155 /* acks */ "lyric-syllable-interface",