]> git.donarmstrong.com Git - lilypond.git/blob - lily/bar-engraver.cc
release: 1.1.24
[lilypond.git] / lily / bar-engraver.cc
1 /*
2   bar-engraver.cc -- implement Bar_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997, 1998, 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   Jan Nieuwenhuizen <janneke@gnu.org>
8 */
9
10 #include "bar-engraver.hh"
11 #include "bar.hh"
12 #include "musical-request.hh"
13 #include "multi-measure-rest.hh"
14 #include "command-request.hh"
15 #include "time-description.hh"
16 #include "engraver-group.hh"
17 #include "repeated-music.hh"
18
19 Bar_engraver::Bar_engraver()
20 {
21   bar_p_ =0;
22   do_post_move_processing();
23 }
24
25 bool
26 Bar_engraver::do_try_music (Music*r_l)
27 {
28   if (Bar_req  * b= dynamic_cast <Bar_req *> (r_l))
29     {
30       if (bar_req_l_ && bar_req_l_->equal_b (b)) // huh?
31         return false;
32       
33       bar_req_l_ = b;
34       return true;
35     }
36   
37   return false;
38
39 }
40
41 void
42 Bar_engraver::acknowledge_element (Score_element_info i)
43 {
44   if (Bar *b = dynamic_cast<Bar *> (i.elem_l_))
45     {
46       // only bar-engraver should create bars
47       assert (0);
48     }
49 }
50
51 void
52 Bar_engraver::create_bar ()
53 {
54   if (!bar_p_)
55     {
56       bar_p_ = new Bar;
57       bar_p_->break_priority_i_  = 0;
58       // urg: "" != empty...
59       String default_type = get_property ("defaultBarType", 0);
60       if (default_type.length_i ())
61         {
62           bar_p_->type_str_ = default_type;
63         }
64       announce_element (Score_element_info (bar_p_, bar_req_l_));
65     }
66 }
67
68 void
69 Bar_engraver::request_bar (String type_str)
70 {
71   create_bar ();
72   if (((type_str == "|:") && (bar_p_->type_str_ == ":|"))
73     || ((type_str == ":|") && (bar_p_->type_str_ == "|:")))
74     bar_p_->type_str_ = ":|:";
75   else
76     bar_p_->type_str_ = type_str;
77 }
78
79 void 
80 Bar_engraver::do_creation_processing ()
81 {
82   create_bar ();
83   bar_p_->type_str_ = "";
84   Scalar prop = get_property ("barAuto", 0);
85   auto_create_bar_b_ = prop.to_bool ();
86 }
87
88 void
89 Bar_engraver::do_removal_processing ()
90 {
91   if (bar_p_) 
92     {
93       typeset_element (bar_p_);
94       bar_p_ =0;
95     }
96 }
97
98 void
99 Bar_engraver::do_process_requests()
100 {  
101   Time_description const *time = get_staff_info().time_C_;
102   if (bar_req_l_) 
103     {
104       create_bar ();    
105       bar_p_->type_str_ = bar_req_l_->type_str_;
106     }
107   else if (!now_moment ())
108     {
109       create_bar ();
110       bar_p_->type_str_ = "";
111     }
112   else 
113     {
114       Scalar always = get_property ("barAlways", 0);
115       if ((time && !time->whole_in_measure_) || always.to_bool ())
116         {
117           if (auto_create_bar_b_)
118             create_bar ();
119           Scalar prop = get_property ("barAuto", 0);
120           auto_create_bar_b_ = prop.to_bool ();
121         }
122     }
123   
124   if (!bar_p_)
125     {
126       Break_req r;
127       r.penalty_i_ = Break_req::DISALLOW;
128       daddy_grav_l ()->try_music (&r);
129     }
130 }
131
132
133 void 
134 Bar_engraver::do_pre_move_processing()
135 {
136   if (bar_p_) 
137     {
138       typeset_element (bar_p_);
139       bar_p_ =0;
140     }
141 }
142
143 void
144 Bar_engraver::do_post_move_processing()
145 {
146   bar_req_l_ = 0;
147 }
148
149
150
151 ADD_THIS_TRANSLATOR(Bar_engraver);
152
153