]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-reg.cc
release: 0.0.63
[lilypond.git] / lily / clef-reg.cc
1 /*
2   clef.cc -- implement  Clef_register
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>,
7   Mats Bengtsson <matsb@s3.kth.se>
8 */
9 #include "bar.hh"
10 #include "clef-reg.hh"
11 #include "clef-item.hh"
12 #include "debug.hh"
13 #include "command-request.hh"
14 #include "time-description.hh"
15 #include "staff-column.hh"
16
17 Clef_register::Clef_register()
18 {
19     clef_p_ = 0;
20     
21     /* ugly hack to prevent segfault (daddy_reg_l_ == 0 at construction) */
22     clef_type_str_ = "";        
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     *get_staff_info().c0_position_i_l_ = c0_position_i_;
40     
41     return true;
42 }
43
44 void 
45 Clef_register::read_req(Clef_change_req*c_l)
46 {
47     if (!set_type(c_l->clef_str_))
48         c_l->error("unknown clef type ");
49 }
50 void
51 Clef_register::acknowledge_element(Staff_elem_info info)
52 {
53     if (info.elem_l_->name() == Bar::static_name()) {
54         if (!clef_p_){
55             create_clef();
56             clef_p_->change = false;
57         }
58     }
59 }
60 bool
61 Clef_register::try_request(Request * r_l)
62 {
63     Command_req* creq_l= r_l->command();
64     if (!creq_l || !creq_l->clefchange())
65         return false;
66
67     clef_req_l_ = creq_l->clefchange();
68     
69     // do it now! Others have to read c0_pos.
70     read_req(creq_l->clefchange()); 
71     return true;
72 }
73
74 void 
75 Clef_register::create_clef()
76 {
77     clef_p_ = new Clef_item;
78     clef_p_->read(*this);
79     announce_element(Staff_elem_info(clef_p_,
80                                          clef_req_l_));
81 }
82
83 void
84 Clef_register::process_requests()
85 {
86     if (clef_req_l_) {
87         create_clef();
88         clef_p_->change = true;
89     }
90 }
91
92 void
93 Clef_register::pre_move_processing()
94 {
95     if (!clef_p_)
96         return;
97     if (clef_p_->change) {
98         Clef_item* post_p = new Clef_item(*clef_p_);
99         post_p->change = false;
100         typeset_breakable_item(new Clef_item(*clef_p_),
101                                clef_p_,  post_p);
102     } else {
103         typeset_breakable_item(0, 0, clef_p_);
104     }
105     clef_p_ = 0;
106 }
107     
108 void
109 Clef_register::post_move_processing()
110 {
111     clef_req_l_ = 0;
112     /* not in ctor, since the reg might not be linked in.*/
113     if (clef_type_str_ == "") { 
114         set_type("violin");
115     }
116 }
117 IMPLEMENT_STATIC_NAME(Clef_register);
118 ADD_THIS_REGISTER(Clef_register);