]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-grav.cc
release: 0.1.11
[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   
22   set_type ("violin");
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 ()) 
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   create_clef();
78   clef_p_->default_b_ = false;
79 }
80
81 bool
82 Clef_engraver::do_try_request (Request * r_l)
83 {
84   Command_req* creq_l= r_l->command();
85   if (!creq_l || !creq_l->clefchange())
86         return false;
87
88   clef_req_l_ = creq_l->clefchange();
89   
90   read_req (clef_req_l_); 
91   return true;
92 }
93
94 void 
95 Clef_engraver::create_clef()
96 {
97   if (!clef_p_) 
98     {
99         clef_p_ = new Clef_item;
100       announce_element (Score_elem_info (clef_p_,clef_req_l_));
101     }
102   clef_p_->read (*this);
103 }
104
105 void
106 Clef_engraver::do_process_requests()
107 {
108   if (clef_req_l_) 
109     {
110         create_clef();
111         clef_p_->default_b_ = false;
112     }
113 }
114
115 void
116 Clef_engraver::do_pre_move_processing()
117 {
118   if (!clef_p_)
119         return;
120   typeset_element (clef_p_);
121   clef_p_ = 0;
122 }
123   
124 void
125 Clef_engraver::do_post_move_processing()
126 {
127   clef_req_l_ = 0;
128 }
129
130 void
131 Clef_engraver::do_removal_processing()
132 {
133   delete clef_p_;
134   clef_p_ =0;
135 }
136
137
138 IMPLEMENT_IS_TYPE_B1(Clef_engraver,Engraver);
139 ADD_THIS_ENGRAVER(Clef_engraver);