]> git.donarmstrong.com Git - lilypond.git/blob - lily/tie-reg.cc
release: 0.0.71pre
[lilypond.git] / lily / tie-reg.cc
1 /*
2   tie-reg.cc -- implement Tie_register
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "tie-reg.hh"
10 #include "tie.hh"
11 #include "note-head.hh"
12 #include "musical-request.hh"
13 #include "music-list.hh"
14
15 Tie_register::Tie_register()
16 {
17     end_tie_p_ = 0;
18     tie_p_ = 0;
19     req_l_ =0;
20     end_req_l_ =0;
21     end_mom_ = -1;
22     melodic_req_l_ = 0;
23     end_melodic_req_l_ =0;
24     dir_i_ = 0;
25 }
26
27 void
28 Tie_register::sync_features()
29 {
30     dir_i_ = get_feature("vdir");
31 }
32     
33
34 void
35 Tie_register::do_post_move_processing()
36 {
37     if (tie_p_ && get_staff_info().when() == end_mom_) {
38         end_tie_p_ = tie_p_;
39         end_req_l_ = req_l_;
40         end_melodic_req_l_ = melodic_req_l_;
41         tie_p_ =0;
42         req_l_ =0;
43         end_mom_ = -1;
44     }
45 }
46
47 bool
48 Tie_register::acceptable_request_b(Request*r)
49 {
50     return r->musical() && r->musical()->tie();
51 }
52
53 bool
54 Tie_register::do_try_request(Request*r)
55 {
56     if(!acceptable_request_b(r))
57         return false;
58     if (req_l_ ) {
59         return false;
60     }
61     req_l_ = r->musical()->tie();
62     end_mom_ = r->parent_music_l_->time_int().length()
63         + get_staff_info().when();
64     return true;
65 }
66
67 void
68 Tie_register::do_process_requests()
69 {
70     if (req_l_ && ! tie_p_) {
71         tie_p_ = new Tie;
72     }
73 }
74
75 void
76 Tie_register::acknowledge_element(Score_elem_info i)
77 {
78     if (i.elem_l_->name() == Note_head::static_name()) {
79         if (tie_p_) {
80             tie_p_->set_head(-1, (Note_head*)i.elem_l_->item());
81             melodic_req_l_ = i.req_l_->musical()->melodic();
82         }
83
84         if (end_tie_p_) {
85             end_tie_p_->set_head(1, (Note_head*)i.elem_l_->item());
86             if (!Melodic_req::compare ( *end_melodic_req_l_, *melodic_req_l_))
87                 end_tie_p_->same_pitch_b_ = true;
88             announce_element(Score_elem_info(end_tie_p_,end_req_l_));
89         }
90     }
91 }
92
93 void
94 Tie_register::do_pre_move_processing()
95 {
96     if (end_tie_p_) {
97         if (dir_i_)
98             end_tie_p_->dir_i_ =  dir_i_;
99         
100         typeset_element(end_tie_p_);
101         end_tie_p_ =0;
102         end_req_l_ =0;
103     }
104  
105 }
106
107 Tie_register::~Tie_register()
108 {
109     if (tie_p_) {
110         req_l_->warning("unended Tie");
111         delete tie_p_;
112     }
113 }
114
115 void
116 Tie_register::set_feature(Feature f)
117 {
118     if (f.type_ == "vdir")
119         dir_i_ = f.value_;
120 }
121
122 IMPLEMENT_STATIC_NAME(Tie_register);
123 IMPLEMENT_IS_TYPE_B1(Tie_register,Request_register);
124 ADD_THIS_REGISTER(Tie_register);