]> git.donarmstrong.com Git - lilypond.git/blob - lily/plet-engraver.cc
release: 0.1.43
[lilypond.git] / lily / plet-engraver.cc
1 /*
2   plet-engraver.cc -- implement Plet_engraver
3
4   (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
5 */
6
7 #include "proto.hh"
8 #include "musical-request.hh"
9 #include "plet-engraver.hh"
10 #include "plet-spanner.hh"
11 #include "text-def.hh"
12 #include "stem.hh"
13
14 IMPLEMENT_IS_TYPE_B1 (Plet_engraver,Engraver);
15 ADD_THIS_TRANSLATOR (Plet_engraver);
16
17 Plet_engraver::Plet_engraver ()
18 {
19   plet_spanner_p_ = 0;
20   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
21 }
22
23 void
24 Plet_engraver::acknowledge_element (Score_elem_info i)
25 {
26   if (!i.elem_l_->is_type_b (Stem::static_name ()))
27     return;
28   if (!plet_spanner_p_)
29     return;
30   if (!span_reqs_drul_[LEFT])
31     return;
32
33   if (!plet_spanner_p_->stem_l_drul_[LEFT])
34     plet_spanner_p_->set_stem (LEFT, (Stem*)i.elem_l_->item ());
35   else
36     if (span_reqs_drul_[RIGHT] && !plet_spanner_p_->stem_l_drul_[RIGHT]) 
37       plet_spanner_p_->set_stem (RIGHT, (Stem*)i.elem_l_->item());
38 }
39
40 bool
41 Plet_engraver::do_try_request (Request* req_l)
42 {
43   Musical_req* mus_l = req_l->musical ();
44   if (!mus_l)
45     return false;
46
47   Plet_req* p = mus_l->plet ();
48   if (!p)
49     return false;
50
51   if (bool (plet_spanner_p_) == bool (p->spantype == Span_req::START))
52     return false;
53
54   Direction d = (!plet_spanner_p_) ? LEFT : RIGHT;
55   if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (mus_l))
56     return false;
57
58   span_reqs_drul_[d] = p;
59   return true;
60 }
61
62 void
63 Plet_engraver::do_removal_processing ()
64 {
65   if (plet_spanner_p_)
66     {
67       span_reqs_drul_[LEFT]->warning (_("unterminated plet"));
68       plet_spanner_p_->unlink ();
69       delete plet_spanner_p_;
70       plet_spanner_p_ = 0;
71     }
72 }
73
74 void
75 Plet_engraver::do_process_requests ()
76 {
77   if (plet_spanner_p_ || !span_reqs_drul_[LEFT])
78     return;
79
80   plet_spanner_p_ = new Plet_spanner;
81   plet_spanner_p_->tdef_p_->text_str_ = span_reqs_drul_[LEFT]->plet_i_;
82
83   announce_element (Score_elem_info (plet_spanner_p_, span_reqs_drul_[LEFT]));
84 }
85
86 void
87 Plet_engraver::do_pre_move_processing ()
88 {
89   if (!plet_spanner_p_ || !span_reqs_drul_[RIGHT]) 
90     return;
91
92   typeset_element (plet_spanner_p_);
93   plet_spanner_p_ = 0;
94   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
95 }
96