]> git.donarmstrong.com Git - lilypond.git/blob - lily/bar-grav.cc
release: 0.1.59
[lilypond.git] / lily / bar-grav.cc
1 /*
2   bar-reg.cc -- implement Bar_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "bar-grav.hh"
10 #include "bar.hh"
11 #include "musical-request.hh"
12 #include "multi-measure-rest.hh"
13 #include "command-request.hh"
14 #include "time-description.hh"
15 #include "engraver-group.hh"
16
17 Bar_engraver::Bar_engraver()
18 {
19   bar_p_ =0;
20   do_post_move_processing();
21 }
22
23 bool
24 Bar_engraver::do_try_request (Request*r_l)
25 {
26   Command_req* c_l = r_l->command();
27   if (!c_l|| !c_l->bar()) 
28     return false;
29   Bar_req  * b= c_l->bar();
30   if (bar_req_l_ && bar_req_l_->equal_b (b))
31     return false;
32   
33   bar_req_l_ = b;
34
35   return true;
36 }
37
38 void
39 Bar_engraver::create_bar ()
40 {
41   if (!bar_p_)
42     {
43       bar_p_ = new Bar;
44       bar_p_->break_priority_i_  = 0;
45       announce_element (Score_elem_info (bar_p_, bar_req_l_));
46     }
47 }
48
49 void
50 Bar_engraver::acknowledge_element (Score_elem_info i)
51 {
52   if (!bar_p_ || !i.elem_l_->is_type_b (Multi_measure_rest::static_name ()))
53     return;
54
55 #if 0
56   if (!bar_p_ || !i.req_l_ || !i.req_l_->musical () 
57     || !i.req_l_->musical ()->multi_measure ())
58     return;
59
60   // would this be enough?
61   //urg segfault
62   bar_p_->unlink ();
63   delete bar_p_;
64   bar_p_ = 0;
65 #endif
66 }
67
68 void 
69 Bar_engraver::do_creation_processing ()
70 {
71   create_bar ();
72   bar_p_->type_str_ = "";
73 }
74
75 void
76 Bar_engraver::do_removal_processing ()
77 {
78   if (bar_p_) 
79     {
80       typeset_element (bar_p_);
81       bar_p_ =0;
82     }
83 }
84
85 void
86 Bar_engraver::do_process_requests()
87 {  
88   if (bar_req_l_) 
89     {
90       if (!bar_p_)
91         create_bar ();    
92
93       bar_p_->type_str_ = bar_req_l_->type_str_;
94     }
95   else 
96     {
97       Time_description const *time = get_staff_info().time_C_;
98       if (time && !time->whole_in_measure_) 
99         create_bar ();
100     }
101   
102   if (!bar_p_)
103     {
104       Disallow_break_req r;
105       daddy_grav_l()->try_request (&r);
106     }
107 }
108
109
110 void 
111 Bar_engraver::do_pre_move_processing()
112 {
113   if (bar_p_) 
114     {
115       typeset_element (bar_p_);
116       bar_p_ =0;
117     }
118 }
119
120 void
121 Bar_engraver::do_post_move_processing()
122 {
123   bar_req_l_ = 0;
124 }
125
126
127 IMPLEMENT_IS_TYPE_B1(Bar_engraver,Engraver);
128 ADD_THIS_TRANSLATOR(Bar_engraver);
129
130