]> git.donarmstrong.com Git - lilypond.git/blob - lily/extender-engraver.cc
release: 1.1.30
[lilypond.git] / lily / extender-engraver.cc
1 /*
2   extender-engraver.cc -- implement Extender_engraver
3
4   (c) 1998--1999 Jan Nieuwenhuizen <janneke@gnu.org>
5 */
6
7 #include "proto.hh"
8 #include "musical-request.hh"
9 #include "extender-engraver.hh"
10 #include "extender-spanner.hh"
11 #include "text-def.hh"
12 #include "score-column.hh"
13 #include "g-text-item.hh"
14
15 ADD_THIS_TRANSLATOR (Extender_engraver);
16
17 Extender_engraver::Extender_engraver ()
18 {
19   extender_spanner_p_ = 0;
20   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
21 }
22
23 void
24 Extender_engraver::acknowledge_element (Score_element_info i)
25 {
26   G_text_item* t = dynamic_cast<G_text_item*> (i.elem_l_);
27   if (!t)
28     return;
29   if (!extender_spanner_p_)
30     return;
31   if (!span_reqs_drul_[LEFT])
32     return;
33
34   if (!extender_spanner_p_->item_l_drul_[LEFT])
35     extender_spanner_p_->set_textitem (LEFT, t);
36   else
37     if (span_reqs_drul_[RIGHT] && !extender_spanner_p_->item_l_drul_[RIGHT]) 
38       extender_spanner_p_->set_textitem (RIGHT, t);
39 }
40
41 bool
42 Extender_engraver::do_try_music (Music* req_l)
43 {
44   if (Extender_req* p = dynamic_cast <Extender_req *> (req_l))
45     {
46       if (bool (extender_spanner_p_) == bool (p->spantype_ == START))
47         return false;
48
49       Direction d = (!extender_spanner_p_) ? LEFT : RIGHT;
50       if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (p))
51         return false;
52
53       span_reqs_drul_[d] = p;
54       span_mom_drul_[d] = get_staff_info ().musical_l ()->when ();
55       return true;
56     }
57   return false;
58 }
59
60 void
61 Extender_engraver::do_removal_processing ()
62 {
63   if (extender_spanner_p_)
64     {
65       span_reqs_drul_[LEFT]->warning (_ ("unterminated extender"));
66       extender_spanner_p_->set_bounds(RIGHT, get_staff_info ().command_l ());
67     }
68 }
69
70 void
71 Extender_engraver::do_process_requests ()
72 {
73   if (extender_spanner_p_ || !span_reqs_drul_[LEFT])
74     return;
75
76   extender_spanner_p_ = new Extender_spanner;
77
78   announce_element (Score_element_info (extender_spanner_p_, span_reqs_drul_[LEFT]));
79 }
80
81 void
82 Extender_engraver::do_pre_move_processing ()
83 {
84   if (!extender_spanner_p_ || !span_reqs_drul_[RIGHT]) 
85     return;
86
87   typeset_element (extender_spanner_p_);
88   
89   extender_spanner_p_ = 0;
90   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
91 }
92