]> git.donarmstrong.com Git - lilypond.git/blob - lily/extender-engraver.cc
* lily/tie.cc: change 'heads to 'head-pair.
[lilypond.git] / lily / extender-engraver.cc
1 /*
2   extender-engraver.cc -- implement Extender_engraver
3
4   source file of the GNU LilyPond music typesetter
5   
6   (c)  1999--2003 Glen Prideaux <glenprideaux@iname.com>,
7                   Han-Wen Nienhuys <hanwen@cs.uu.nl>,
8                   Jan Nieuwenhuizen <janneke@gnu.org>
9 */
10
11 #include "warn.hh"
12 #include "lyric-extender.hh"
13 #include "item.hh"
14 #include "engraver.hh"
15
16 class Extender_engraver : public Engraver
17 {
18   Music* ev_;
19   Spanner* extender_;
20   Spanner * finished_extender_;  
21 public:
22   TRANSLATOR_DECLARATIONS(Extender_engraver);
23
24 protected:
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 start_translation_timestep ();
30   virtual void process_music ();
31 private:
32
33 };
34
35
36
37
38 Extender_engraver::Extender_engraver ()
39 {
40   extender_ = 0;
41   finished_extender_ = 0;
42   ev_ = 0;
43 }
44
45 void
46 Extender_engraver::acknowledge_grob (Grob_info i)
47 {
48   Item * item =  dynamic_cast<Item*> (i.grob_);
49   // -> text_item
50   if (item && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
51     {
52       if (extender_)
53         extender_->set_bound (LEFT, item);
54
55       if (finished_extender_)
56         finished_extender_->set_bound (RIGHT, item);
57     }
58 }
59
60
61 bool
62 Extender_engraver::try_music (Music* r)
63 {
64   if (ev_)
65     return false;
66
67   ev_ = r;
68   return true;
69 }
70
71 void
72 Extender_engraver::finalize ()
73 {
74   if (extender_)
75     {
76       extender_->warning (_ ("unterminated extender"));
77       typeset_grob (extender_);
78       extender_ = 0;
79     }
80
81   if (finished_extender_)
82     {
83       finished_extender_->warning (_("unterminated extender"));
84       typeset_grob (finished_extender_);
85       finished_extender_ =0;
86     }
87 }
88
89 void
90 Extender_engraver::process_music ()
91 {
92   if (ev_)
93     {
94       extender_ = new Spanner (get_property ("LyricExtender"));
95       announce_grob (extender_, ev_->self_scm());
96     }
97 }
98
99
100 void
101 Extender_engraver::stop_translation_timestep ()
102 {
103   if (finished_extender_ && finished_extender_->get_bound (RIGHT))
104     {
105       typeset_grob (finished_extender_);
106       finished_extender_ = 0;
107     }
108
109   if (finished_extender_ && extender_)
110     {
111       programming_error ("Haven't finished extender yet.");
112       typeset_grob (finished_extender_);
113       finished_extender_ =0;
114     }
115   
116   if (extender_)
117     finished_extender_ = extender_;
118   extender_ = 0;
119 }
120
121 void
122 Extender_engraver::start_translation_timestep ()
123 {
124   ev_ = 0;
125 }
126
127
128 ENTER_DESCRIPTION(Extender_engraver,
129 /* descr */       "Create lyric extenders",
130 /* creats*/       "LyricExtender",
131 /* accepts */     "extender-event",
132 /* acks  */       "lyric-syllable-interface",
133 /* reads */       "",
134 /* write */       "");