lilypond-0.1.35
[lilypond.git] / src / clef-reg.cc
blob2d9dcc112b08fecd50b8c37f9fba505368187b9a
1 /*
2 clef.cc -- implement Clef_register
4 source file of the LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>,
7 Mats Bengtsson <matsb@s3.kth.se>
8 */
10 #include "clef-reg.hh"
11 #include "clef-item.hh"
12 #include "debug.hh"
13 #include "commandrequest.hh"
14 #include "time-description.hh"
15 #include "staff-column.hh"
17 Clef_register::Clef_register()
19 clef_p_ = 0;
21 /* ugly hack to prevent segfault (daddy_reg_l_ == 0 at construction) */
22 clef_type_str_ = "";
25 bool
26 Clef_register::set_type(String s)
28 clef_type_str_ = s;
29 if (clef_type_str_ == "violin") {
30 c0_position_i_= -2;
31 } else if (clef_type_str_ == "alto") {
32 c0_position_i_= 4;
33 } else if (clef_type_str_ == "tenor") {
34 c0_position_i_= 6;
35 } else if (clef_type_str_ == "bass") {
36 c0_position_i_= 10;
37 }else
38 return false;
39 *get_staff_info().c0_position_i_ = c0_position_i_;
41 return true;
44 void
45 Clef_register::read_req(Clef_change_req*c_l)
47 if (!set_type(c_l->clef_str_))
48 error("unknown clef type ", c_l->defined_ch_c_l_);
51 bool
52 Clef_register::try_request(Request * r_l)
54 Command_req* creq_l= r_l->command();
55 if (!creq_l || !creq_l->clefchange())
56 return false;
58 clef_req_l_ = creq_l->clefchange();
60 // do it now! Others have to read c0_pos.
61 read_req(creq_l->clefchange());
62 return true;
65 void
66 Clef_register::process_requests()
68 const Time_description *time_l = get_staff_info().time_c_l_;
69 if (!clef_req_l_ && (!time_l->whole_in_measure_|| !time_l->when_)) {
70 clef_p_ = new Clef_item;
71 clef_p_->change = false;
72 } else if (clef_req_l_) {
73 clef_p_ = new Clef_item;
74 clef_p_->change = true;
76 if (clef_p_) {
77 clef_p_->read(*this);
78 announce_element(Staff_elem_info(clef_p_,
79 clef_req_l_));
83 void
84 Clef_register::pre_move_processing()
86 if (!clef_p_)
87 return;
88 if (clef_p_->change) {
89 Clef_item* post_p = new Clef_item(*clef_p_);
90 post_p->change = false;
91 typeset_breakable_item(new Clef_item(*clef_p_),
92 clef_p_, post_p);
93 } else {
94 typeset_breakable_item(0, 0, clef_p_);
96 clef_p_ = 0;
99 void
100 Clef_register::post_move_processing()
102 clef_req_l_ = 0;
103 /* not in ctor, since the reg might not be linked in.*/
104 if (clef_type_str_ == "") {
105 set_type("violin");