]> git.donarmstrong.com Git - lilypond.git/blob - lily/extender-engraver.cc
patch::: 1.1.5.jcn2: extender
[lilypond.git] / lily / extender-engraver.cc
1 /*
2   extender-engraver.cc -- implement Extender_engraver
3
4   (c) 1998 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 "text-item.hh"
14
15 IMPLEMENT_IS_TYPE_B1 (Extender_engraver,Engraver);
16 ADD_THIS_TRANSLATOR (Extender_engraver);
17
18 Extender_engraver::Extender_engraver ()
19 {
20   extender_spanner_p_ = 0;
21   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
22 }
23
24 void
25 Extender_engraver::acknowledge_element (Score_element_info i)
26 {
27   Text_item* t = (dynamic_cast<Text_item*> (i.elem_l_));
28   if (!t)
29     return;
30   if (!extender_spanner_p_)
31     return;
32   if (!span_reqs_drul_[LEFT])
33     return;
34
35   if (!extender_spanner_p_->textitem_l_drul_[LEFT])
36     extender_spanner_p_->set_textitem (LEFT, t);
37   else
38     if (span_reqs_drul_[RIGHT] && !extender_spanner_p_->textitem_l_drul_[RIGHT]) 
39       extender_spanner_p_->set_textitem (RIGHT, t);
40 }
41
42 bool
43 Extender_engraver::do_try_request (Request* req_l)
44 {
45   Extender_req* p = dynamic_cast <Extender_req *> (req_l);
46   if (!p)
47     return false;
48
49   if (bool (extender_spanner_p_) == bool (p->spantype == Span_req::START))
50     return false;
51
52   Direction d = (!extender_spanner_p_) ? LEFT : RIGHT;
53   if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (req_l))
54     return false;
55
56   span_reqs_drul_[d] = p;
57   span_mom_drul_[d] = get_staff_info ().musical_l ()->when ();
58   return true;
59 }
60
61 void
62 Extender_engraver::do_removal_processing ()
63 {
64   if (extender_spanner_p_)
65     {
66       span_reqs_drul_[LEFT]->warning (_ ("unterminated extender"));
67       extender_spanner_p_->unlink ();
68       delete extender_spanner_p_;
69       extender_spanner_p_ = 0;
70       span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
71     }
72 }
73
74 void
75 Extender_engraver::do_process_requests ()
76 {
77   if (extender_spanner_p_ || !span_reqs_drul_[LEFT])
78     return;
79
80   extender_spanner_p_ = new Extender_spanner;
81
82   announce_element (Score_element_info (extender_spanner_p_, span_reqs_drul_[LEFT]));
83 }
84
85 void
86 Extender_engraver::do_pre_move_processing ()
87 {
88   if (!extender_spanner_p_ || !span_reqs_drul_[RIGHT]) 
89     return;
90
91   typeset_element (extender_spanner_p_);
92   
93   extender_spanner_p_ = 0;
94   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
95 }
96