* scm/beam.scm (check-slope-callbacks): check sign of slope.
[lilypond.git] / lily / extender-engraver.cc
blobf2f9d6761411002a89e47b853e55c9fe9c9b4843
1 /*
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>
9 */
11 #include "warn.hh"
12 #include "lyric-extender.hh"
13 #include "item.hh"
14 #include "engraver.hh"
15 #include "context.hh"
16 #include "group-interface.hh"
18 class Extender_engraver : public Engraver
20 Music* ev_;
21 Spanner* extender_;
22 Spanner * pending_extender_;
23 public:
24 TRANSLATOR_DECLARATIONS (Extender_engraver);
26 protected:
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 ();
32 private:
39 Extender_engraver::Extender_engraver ()
41 extender_ = 0;
42 pending_extender_ = 0;
43 ev_ = 0;
46 bool
47 Extender_engraver::try_music (Music* r)
49 if (ev_)
50 return false;
52 ev_ = r;
53 return true;
57 void
58 Extender_engraver::process_music ()
60 if (ev_)
62 extender_ = make_spanner ("LyricExtender", ev_->self_scm ());
67 void
68 Extender_engraver::acknowledge_grob (Grob_info i)
70 Item * item = dynamic_cast<Item*> (i.grob_);
72 if (item
73 && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
75 if (extender_)
76 extender_->set_bound (LEFT, item);
78 if (pending_extender_)
79 pending_extender_->set_bound (RIGHT, item);
83 void
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;
96 if (h)
98 if (extender_)
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);
106 if (extender_)
108 pending_extender_ = extender_;
109 extender_ = 0;
113 ev_ = 0;
116 void
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)));
125 if (it)
126 sp->set_bound (RIGHT, it);
133 void
134 Extender_engraver::finalize ()
136 if (extender_)
138 completize_extender (extender_);
140 if (!extender_->get_bound (RIGHT))
141 extender_->warning (_ ("unterminated extender"));
142 extender_ = 0;
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",
164 /* reads */ "",
165 /* write */ "");