]> git.donarmstrong.com Git - lilypond.git/blob - lily/extender-engraver.cc
* lily/lyric-phrasing-engraver.cc: move from
[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_ && !finished_extender_->get_bound (RIGHT))
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   if (finished_extender_)
81     {
82       finished_extender_->warning (_("unterminated extender"));
83       typeset_grob (finished_extender_);
84       finished_extender_ =0;
85     }
86 }
87
88 void
89 Extender_engraver::process_music ()
90 {
91   if (ev_)
92     {
93       extender_ = new Spanner (get_property ("LyricExtender"));
94       announce_grob (extender_, ev_->self_scm());
95     }
96 }
97
98
99 void
100 Extender_engraver::stop_translation_timestep ()
101 {
102   if (finished_extender_ && finished_extender_->get_bound (RIGHT))
103     {
104       typeset_grob (finished_extender_);
105       finished_extender_ = 0;
106     }
107
108   if (finished_extender_ && extender_)
109     {
110       programming_error ("Haven't finished extender yet.");
111       typeset_grob (finished_extender_);
112       finished_extender_ =0;
113     }
114   
115   if (extender_)
116     finished_extender_ = extender_;
117   extender_ = 0;
118 }
119
120 void
121 Extender_engraver::start_translation_timestep ()
122 {
123   ev_ = 0;
124 }
125
126
127 ENTER_DESCRIPTION(Extender_engraver,
128 /* descr */       "Create lyric extenders",
129 /* creats*/       "LyricExtender",
130 /* accepts */     "extender-event",
131 /* acks  */       "lyric-syllable-interface",
132 /* reads */       "",
133 /* write */       "");