2 extender-engraver.cc -- implement Extender_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2003 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 class Extender_engraver : public Engraver
20 Spanner * finished_extender_;
22 TRANSLATOR_DECLARATIONS(Extender_engraver);
25 virtual void acknowledge_grob (Grob_info);
26 virtual void finalize ();
27 virtual bool try_music (Music*);
28 virtual void stop_translation_timestep ();
29 virtual void process_music ();
37 Extender_engraver::Extender_engraver ()
40 finished_extender_ = 0;
45 Extender_engraver::acknowledge_grob (Grob_info i)
47 Item * item = dynamic_cast<Item*> (i.grob_);
49 if (item && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
52 extender_->set_bound (LEFT, item);
54 if (finished_extender_)
55 finished_extender_->set_bound (RIGHT, item);
61 Extender_engraver::try_music (Music* r)
71 completize_extender (Spanner* sp)
73 if (!sp->get_bound (RIGHT))
75 SCM heads = sp->get_grob_property ("heads");
76 if (gh_pair_p (heads))
78 Item* it = dynamic_cast<Item*> (unsmob_grob (gh_car (heads)));
80 sp->set_bound (RIGHT, it);
88 Extender_engraver::finalize ()
92 completize_extender (extender_);
94 if (!extender_->get_bound (RIGHT))
95 extender_->warning (_ ("unterminated extender"));
96 typeset_grob (extender_);
100 if (finished_extender_)
102 completize_extender (finished_extender_);
104 if (!finished_extender_->get_bound (RIGHT))
105 finished_extender_->warning (_("unterminated extender"));
106 typeset_grob (finished_extender_);
107 finished_extender_ =0;
112 Extender_engraver::process_music ()
116 extender_ = new Spanner (get_property ("LyricExtender"));
117 announce_grob (extender_, ev_->self_scm());
123 Extender_engraver::stop_translation_timestep ()
125 if (finished_extender_ && finished_extender_->get_bound (RIGHT))
127 typeset_grob (finished_extender_);
128 finished_extender_ = 0;
131 if (finished_extender_ && extender_)
133 programming_error ("Haven't finished extender yet.");
134 typeset_grob (finished_extender_);
135 finished_extender_ =0;
139 finished_extender_ = extender_;
147 ENTER_DESCRIPTION(Extender_engraver,
148 /* descr */ "Create lyric extenders",
149 /* creats*/ "LyricExtender",
150 /* accepts */ "extender-event",
151 /* acks */ "lyric-syllable-interface",