]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-reg.cc
release: 0.0.68pre
[lilypond.git] / lily / clef-reg.cc
1 /*
2   clef.cc -- implement  Clef_register
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>,
7   Mats Bengtsson <matsb@s3.kth.se>
8 */
9
10 #include "bar.hh"
11 #include "clef-reg.hh"
12 #include "clef-item.hh"
13 #include "debug.hh"
14 #include "command-request.hh"
15 #include "time-description.hh"
16
17 Clef_register::Clef_register()
18 {
19     clef_p_ = 0;
20     clef_req_l_ =0;
21     
22     set_type("violin");
23 }
24
25 bool
26 Clef_register::set_type(String s)
27 {
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     
40     return true;
41 }
42
43 void
44 Clef_register::fill_staff_info(Staff_info &i)
45 {
46     i.c0_position_i_l_ = &c0_position_i_;
47 }
48
49 void 
50 Clef_register::read_req(Clef_change_req*c_l)
51 {
52     if (!set_type(c_l->clef_str_))
53         c_l->error("unknown clef type ");
54 }
55 void
56 Clef_register::acknowledge_element(Score_elem_info info)
57 {
58     if (info.elem_l_->name() == Bar::static_name() ) {
59         if (!clef_p_){
60             create_clef();
61             clef_p_->default_b_ = true;
62         }
63     }
64 }
65
66 void
67 Clef_register::do_creation_processing()
68 {
69     create_clef();
70     clef_p_->default_b_ = false;
71 }
72
73 bool
74 Clef_register::do_try_request(Request * r_l)
75 {
76     Command_req* creq_l= r_l->command();
77     if (!creq_l || !creq_l->clefchange())
78         return false;
79
80     clef_req_l_ = creq_l->clefchange();
81     
82     // do it now! Others have to read c0_pos.
83     read_req(creq_l->clefchange()); 
84     return true;
85 }
86
87 void 
88 Clef_register::create_clef()
89 {
90     if (!clef_p_) {
91         clef_p_ = new Clef_item;
92         announce_element(Score_elem_info(clef_p_,
93                                      clef_req_l_));
94     
95         clef_p_->read(*this);
96     }
97
98 }
99 void
100 Clef_register::do_process_requests()
101 {
102     if (clef_req_l_) {
103         create_clef();
104         clef_p_->default_b_ = false;
105     }
106 }
107
108 void
109 Clef_register::do_pre_move_processing()
110 {
111     if (!clef_p_)
112         return;
113     typeset_breakable_item(clef_p_);
114     clef_p_ = 0;
115 }
116     
117 void
118 Clef_register::do_post_move_processing()
119 {
120     clef_req_l_ = 0;
121 }
122
123 void
124 Clef_register::do_removal_processing()
125 {
126     delete clef_p_;
127     clef_p_ =0;
128 }
129
130 IMPLEMENT_STATIC_NAME(Clef_register);
131 IMPLEMENT_IS_TYPE_B1(Clef_register,Request_register);
132 ADD_THIS_REGISTER(Clef_register);