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", ev_
->self_scm ());
68 Extender_engraver::acknowledge_grob (Grob_info i
)
70 Item
* item
= dynamic_cast<Item
*> (i
.grob_
);
73 && item
->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
76 extender_
->set_bound (LEFT
, item
);
78 if (pending_extender_
)
79 pending_extender_
->set_bound (RIGHT
, item
);
84 Extender_engraver::stop_translation_timestep ()
86 if (pending_extender_
&& pending_extender_
->get_bound (RIGHT
))
88 pending_extender_
= 0;
91 if (extender_
|| pending_extender_
)
93 Context
*voice
= get_voice_to_lyrics (context ());
94 Grob
* h
= (voice
) ? get_current_note_head (voice
) : 0;
99 Pointer_group_interface::add_grob (extender_
,
100 ly_symbol2scm ("heads"), h
);
101 if (pending_extender_
)
102 Pointer_group_interface::add_grob (pending_extender_
,
103 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 (ly_c_pair_p (heads
))
124 Item
* it
= dynamic_cast<Item
*> (unsmob_grob (ly_car (heads
)));
126 sp
->set_bound (RIGHT
, it
);
134 Extender_engraver::finalize ()
138 completize_extender (extender_
);
140 if (!extender_
->get_bound (RIGHT
))
141 extender_
->warning (_ ("unterminated extender"));
145 if (pending_extender_
)
147 completize_extender (pending_extender_
);
149 if (!pending_extender_
->get_bound (RIGHT
))
150 pending_extender_
->warning (_("unterminated extender"));
151 pending_extender_
=0;
159 ENTER_DESCRIPTION (Extender_engraver
,
160 /* descr */ "Create lyric extenders",
161 /* creats*/ "LyricExtender",
162 /* accepts */ "extender-event",
163 /* acks */ "lyric-syllable-interface",