]> git.donarmstrong.com Git - lilypond.git/blob - src/groupregs.cc
release: 0.0.26
[lilypond.git] / src / groupregs.cc
1 #include "request.hh"
2 #include "beam.hh"
3 #include "stem.hh"
4 #include "register.hh"
5 #include "grouping.hh"
6 #include "complexwalker.hh"
7 #include "debug.hh"
8 #include "complexstaff.hh"
9 #include "textspanner.hh"
10
11 Stem_beam_register::Stem_beam_register(Complex_walker*w)
12     :Request_register(w)
13 {
14     do_post_move_process();
15     current_grouping = 0;
16     beam_p_ = 0;
17 }
18
19 bool
20 Stem_beam_register::try_request(Request*req_l)
21 {
22     if ( req_l->beam() ) {
23         if (bool(beam_p_ ) == bool(req_l->beam()->spantype == Span_req::START))
24             return false;
25         
26         if (beam_req_l_ && Beam_req::compare(*beam_req_l_ , *req_l->beam()))
27             return false;
28         
29         beam_req_l_ = req_l->beam();
30         return true;
31     }
32     
33     if ( req_l->stem() ) {
34         if (current_grouping && !current_grouping->child_fit_query(
35             walk_l_->col()->tdescription_->whole_in_measure))
36             return false;
37
38         if (stem_req_l_ && Stem_req::compare(*stem_req_l_, *req_l->stem()))
39             return false;
40
41         stem_req_l_ = req_l->stem();
42         return true;
43     }
44     return false;
45 }
46
47 void
48 Stem_beam_register::process_request()
49 {
50     if (beam_req_l_) {
51         if (beam_req_l_->spantype == Span_req::STOP)
52             end_beam_b_ = true;
53         else {
54             beam_p_ = new Beam;
55 //          walk_l_->announce_element(Staff_elem_info(beam_p_, ))
56             current_grouping = new Rhythmic_grouping;
57             if (beam_req_l_->nplet) {
58                 Text_spanner* t = new Text_spanner();
59                 t->set_support(beam_p_);
60                 t->spec.align_i_ = 0;
61                 t->spec.text_str_ = beam_req_l_->nplet;
62                 walk_l_->typeset_element(t);
63             }
64              
65         }
66     }
67
68     if (stem_req_l_) {
69         stem_p_ = new Stem(4);
70         if (current_grouping)
71             current_grouping->add_child(
72                 walk_l_->col()->tdescription_->whole_in_measure,
73                 stem_req_l_->duration());
74
75         stem_p_->flag = stem_req_l_->balltype;
76
77         if (beam_p_) {
78             beam_p_->add(stem_p_);
79             stem_p_->print_flag = false;
80         } else {
81             stem_p_->print_flag = true;
82         }
83         
84         walk_l_->announce_element(Staff_elem_info(stem_p_,
85                                                   stem_req_l_,  this));
86     }
87 }
88
89 void
90 Stem_beam_register::acknowledge_element(Staff_elem_info info)
91 {
92     if (!stem_p_)
93         return;
94
95     if (info.elem_p_->name() == String("Notehead") &&
96         stem_req_l_->duration() == info.req_l_->rhythmic()->duration())
97         
98         stem_p_->add((Notehead*)info.elem_p_);
99 }
100
101 void
102 Stem_beam_register::do_pre_move_process()
103 {
104     if (stem_p_) {
105         walk_l_->typeset_element(stem_p_);
106         stem_p_ = 0;
107     }
108     if (beam_p_ && end_beam_b_) {
109         walk_l_->default_grouping.extend(current_grouping->interval());
110         beam_p_->set_grouping(walk_l_->default_grouping, *current_grouping);
111         walk_l_->typeset_element(beam_p_);
112         delete current_grouping;
113         current_grouping = 0;
114         beam_p_ = 0;
115     }
116     end_beam_b_ = false;
117 }
118 void
119 Stem_beam_register::do_post_move_process()
120 {
121     stem_p_ = 0;
122     beam_req_l_ = 0;
123     stem_req_l_ = 0;
124     end_beam_b_ = false;
125 }
126
127 Stem_beam_register::~Stem_beam_register()
128 {
129     if (beam_p_)
130         error("unterminated beam");
131 }