]> git.donarmstrong.com Git - lilypond.git/blob - lily/extender-engraver.cc
*** empty log message ***
[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 process_music ();
30 private:
31
32 };
33
34
35
36
37 Extender_engraver::Extender_engraver ()
38 {
39   extender_ = 0;
40   finished_extender_ = 0;
41   ev_ = 0;
42 }
43
44 void
45 Extender_engraver::acknowledge_grob (Grob_info i)
46 {
47   Item * item =  dynamic_cast<Item*> (i.grob_);
48   // -> text_item
49   if (item && item->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface")))
50     {
51       if (extender_)
52         extender_->set_bound (LEFT, item);
53
54       if (finished_extender_)
55         finished_extender_->set_bound (RIGHT, item);
56     }
57 }
58
59
60 bool
61 Extender_engraver::try_music (Music* r)
62 {
63   if (ev_)
64     return false;
65
66   ev_ = r;
67   return true;
68 }
69
70 void
71 Extender_engraver::finalize ()
72 {
73   if (extender_)
74     {
75       extender_->warning (_ ("unterminated extender"));
76       typeset_grob (extender_);
77       extender_ = 0;
78     }
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   ev_ = 0;
120 }
121
122
123
124 ENTER_DESCRIPTION(Extender_engraver,
125 /* descr */       "Create lyric extenders",
126 /* creats*/       "LyricExtender",
127 /* accepts */     "extender-event",
128 /* acks  */       "lyric-syllable-interface",
129 /* reads */       "",
130 /* write */       "");