]> git.donarmstrong.com Git - lilypond.git/blob - lily/text-spanner-engraver.cc
release: 1.3.103
[lilypond.git] / lily / text-spanner-engraver.cc
1 /*
2   text-spanner-engraver.cc -- implement Text_spanner_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2000 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "dimensions.hh"
10 #include "musical-request.hh"
11 #include "paper-column.hh"
12 #include "note-column.hh"
13 #include "item.hh"
14 #include "side-position-interface.hh"
15 #include "engraver.hh"
16 #include "group-interface.hh"
17 #include "directional-element-interface.hh"
18 #include "translator-group.hh"
19 #include "axis-group-interface.hh"
20
21
22 class Text_spanner_engraver : public Engraver
23 {
24 public:
25   VIRTUAL_COPY_CONS (Translator);
26   Text_spanner_engraver ();
27   
28 protected:
29   virtual void do_removal_processing ();
30   virtual void acknowledge_element (Score_element_info);
31   virtual bool do_try_music (Music *);
32   virtual void do_process_music ();
33   virtual void do_pre_move_processing ();
34   virtual void do_post_move_processing ();
35
36 private:
37   Spanner *span_;
38   Spanner *finished_;
39   Span_req *current_req_;
40   Drul_array<Span_req*> req_drul_;
41   void typeset_all ();
42 };
43
44 ADD_THIS_TRANSLATOR (Text_spanner_engraver);
45
46
47 Text_spanner_engraver::Text_spanner_engraver ()
48 {
49   finished_ = 0;
50   current_req_ = 0;
51   span_ =0;
52   req_drul_[START] = 0;
53   req_drul_[STOP] = 0;
54 }
55
56 void
57 Text_spanner_engraver::do_post_move_processing ()
58 {
59   req_drul_[START] = 0;
60   req_drul_[STOP] = 0;
61 }
62
63 bool
64 Text_spanner_engraver::do_try_music (Music *m)
65 {
66   if (Span_req *s =  dynamic_cast <Span_req*> (m))
67     {
68       if (s->span_type_str_ == "abort")
69         {
70           req_drul_[LEFT] = 0;
71           req_drul_[RIGHT] = 0;
72           if (span_)
73             span_->suicide ();
74           span_ = 0;
75         }
76       else if (s->span_type_str_ == "text")
77         {
78           req_drul_[s->get_span_dir()] = s;
79           return true;
80         }
81     }
82   return false;
83 }
84
85 void
86 Text_spanner_engraver::do_process_music ()
87 {
88   if (req_drul_[STOP])
89     {
90       if (!span_)
91         {
92           req_drul_[STOP]->origin ()->warning
93             (_ ("can't find start of text spanner"));
94         }
95       else
96         {
97           assert (!finished_);
98           Score_element* e = unsmob_element (get_property ("currentMusicalColumn"));
99           span_->set_bound (RIGHT, e);
100
101           finished_ = span_;
102           span_ = 0;
103           current_req_ = 0;
104         }
105     }
106
107   if (req_drul_[START])
108     {
109       if (current_req_)
110         {
111           req_drul_[START]->origin ()->warning
112             (_ ("already have a text spanner"));
113         }
114       else
115         {
116           current_req_ = req_drul_[START];
117           span_  = new Spanner (get_property ("TextSpanner"));
118           Side_position::set_axis (span_, Y_AXIS);
119           Score_element *e = unsmob_element (get_property ("currentMusicalColumn"));
120           span_->set_bound (LEFT, e);
121           announce_element (span_, req_drul_[START]);
122         }
123     }
124 }
125
126 void
127 Text_spanner_engraver::acknowledge_element (Score_element_info info)
128 {
129   if (span_ && Note_column::has_interface (info.elem_l_))
130     {
131       Side_position::add_support (span_, info.elem_l_);
132       add_bound_item (span_, dynamic_cast<Item*> (info.elem_l_));
133     }
134 }
135
136 void
137 Text_spanner_engraver::typeset_all ()
138 {  
139   if (finished_)
140     {
141       Side_position::add_staff_support (finished_);
142       typeset_element (finished_);
143       finished_ = 0;
144     }
145 }
146
147 void
148 Text_spanner_engraver::do_pre_move_processing ()
149 {
150   typeset_all ();
151 }
152
153 void
154 Text_spanner_engraver::do_removal_processing ()
155 {
156   typeset_all ();
157   if (span_)
158     {
159       current_req_->origin ()->warning (_ ("unterminated text spanner"));
160       span_->suicide ();
161       span_ = 0;
162     }
163 }
164