]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-grav.cc
release: 0.1.14
[lilypond.git] / lily / clef-grav.cc
1 /*
2   clef.cc -- implement  Clef_engraver
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-grav.hh"
12 #include "clef-item.hh"
13 #include "debug.hh"
14 #include "command-request.hh"
15 #include "time-description.hh"
16
17 Clef_engraver::Clef_engraver()
18 {
19   clef_p_ = 0;
20   clef_req_l_ =0;
21   clef_type_str_ = 0;
22   c0_position_i_ =0;
23 }
24
25 bool
26 Clef_engraver::set_type (String s)
27 {
28   clef_type_str_  = s;
29   if (clef_type_str_ == "violin") 
30     {
31       c0_position_i_= -2;
32     }
33   else if (clef_type_str_ == "alto") 
34     {
35       c0_position_i_= 4;
36     }
37   else if (clef_type_str_ == "tenor") 
38     {
39       c0_position_i_= 6;
40     }
41   else if (clef_type_str_ == "bass") 
42     {
43       c0_position_i_= 10;
44     }
45   else 
46     return false;
47   
48   return true;
49 }
50
51 void
52 Clef_engraver::fill_staff_info (Staff_info &i)
53 {
54   i.c0_position_i_l_ = &c0_position_i_;
55 }
56
57 void 
58 Clef_engraver::read_req (Clef_change_req*c_l)
59 {
60   if (!set_type (c_l->clef_str_))
61     c_l->error ("unknown clef type ");
62 }
63 void
64 Clef_engraver::acknowledge_element (Score_elem_info info)
65 {
66   if (info.elem_l_->name() == Bar::static_name () && clef_type_str_) 
67     {
68       create_clef();
69       if (!clef_req_l_)
70         clef_p_->default_b_ = true;
71     }
72 }
73
74 void
75 Clef_engraver::do_creation_processing()
76 {
77   Scalar def = get_property ("defaultclef");
78   if (def)
79     set_type (def);
80   if (clef_type_str_)
81     create_clef();
82   clef_p_->default_b_ = false;
83 }
84
85 bool
86 Clef_engraver::do_try_request (Request * r_l)
87 {
88   Command_req* creq_l= r_l->command();
89   if (!creq_l || !creq_l->clefchange())
90     return false;
91
92   clef_req_l_ = creq_l->clefchange();  
93   read_req (clef_req_l_); 
94   return true;
95 }
96
97 void 
98 Clef_engraver::create_clef()
99 {
100   if (!clef_p_) 
101     {
102       clef_p_ = new Clef_item;
103       announce_element (Score_elem_info (clef_p_,clef_req_l_));
104     }
105   clef_p_->read (*this);
106 }
107
108 void
109 Clef_engraver::do_process_requests()
110 {
111   if (clef_req_l_) 
112     {
113       create_clef();
114       clef_p_->default_b_ = false;
115     }
116 }
117
118 void
119 Clef_engraver::do_pre_move_processing()
120 {
121   if (clef_p_)
122     {
123       typeset_element (clef_p_);
124       clef_p_ = 0;
125     }
126 }
127 void
128 Clef_engraver::do_post_move_processing()
129 {
130   clef_req_l_ = 0;
131 }
132
133 void
134 Clef_engraver::do_removal_processing()
135 {
136   delete clef_p_;
137   clef_p_ =0;
138 }
139
140
141 IMPLEMENT_IS_TYPE_B1(Clef_engraver,Engraver);
142 ADD_THIS_TRANSLATOR(Clef_engraver);