2 engravergroup.cc -- implement Engraver_group_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
11 #include "engraver-group.hh"
12 #include "engraver.hh"
15 #include "score-elem.hh"
16 #include "input-translator.hh"
18 Engraver* get_engraver_p (String);
21 Engraver_group_engraver::print() const
26 Engraver_group_engraver::~Engraver_group_engraver()
28 assert (removable_b());
32 Engraver_group_engraver::check_removal()
34 for (int i =0; i < group_l_arr_.size();)
36 group_l_arr_[i]->check_removal();
37 if (group_l_arr_[i]->removable_b())
38 terminate_engraver (group_l_arr_[i]);
45 Engraver_group_engraver::removable_b() const
47 return !iterator_count_&& !group_l_arr_.size() ;
50 Engraver_group_engraver::Engraver_group_engraver()
56 Engraver_group_engraver::set_feature (Feature d)
58 PCursor<Engraver*> i (grav_list_.top());
59 // why the while construct?
62 // this construction to ensure clean deletion
63 Engraver *grav_l = i++;
64 grav_l->set_feature (d);
69 Engraver_group_engraver::sync_features()
71 PCursor<Engraver*> i (grav_list_.top());
74 Engraver *grav_l = i++;
75 grav_l->sync_features();
80 Engraver_group_engraver::do_pre_move_processing()
82 PCursor<Engraver*> i (grav_list_.top());
85 Engraver *grav_l = i++;
86 grav_l->pre_move_processing();
91 Engraver_group_engraver::do_process_requests()
93 PCursor<Engraver*> i (grav_list_.top());
96 Engraver *grav_l = i++;
97 grav_l->process_requests();
103 Engraver_group_engraver::do_post_move_processing()
105 PCursor<Engraver*> i (grav_list_.top());
108 // this construction to ensure clean deletion
109 Engraver *grav_l = i++;
110 grav_l->post_move_processing();
116 Engraver_group_engraver::contains_b (Engraver* grav_l) const
118 bool parent_b = Engraver::contains_b (grav_l);
122 for (PCursor<Engraver*> i (grav_list_.top()); i.ok (); i++)
123 if (i->contains_b (grav_l))
131 Engraver_group_engraver::do_try_request (Request*req_l)
133 bool hebbes_b =false;
134 for (int i =0; !hebbes_b && i < nongroup_l_arr_.size() ; i++)
135 hebbes_b =nongroup_l_arr_[i]->try_request (req_l);
136 if (!hebbes_b && daddy_grav_l_)
137 hebbes_b = daddy_grav_l_->try_request (req_l);
142 Engraver_group_engraver::try_request (Request* r)
144 return Engraver::try_request (r);
148 Engraver_group_engraver::add (Engraver *grav_p)
150 grav_list_.bottom().add (grav_p);
151 grav_p->daddy_grav_l_ = this;
153 if (grav_p->is_type_b (Engraver_group_engraver::static_name()))
155 group_l_arr_.push ((Engraver_group_engraver*)grav_p);
159 nongroup_l_arr_ .push (grav_p);
165 Engraver_group_engraver::remove_engraver_p (Engraver*grav_l)
167 group_l_arr_.substitute ((Engraver_group_engraver*)grav_l,0);
168 nongroup_l_arr_.substitute (grav_l,0);
169 PCursor<Engraver*> grav_cur (grav_list_.find (grav_l));
171 return grav_cur.remove_p();
175 Engraver_group_engraver::terminate_engraver (Engraver*r_l)
177 DOUT << "Removing " << r_l->name() << " at " << get_staff_info ().when () << "\n";
178 r_l->removal_processing();
179 Engraver * grav_p =remove_engraver_p (r_l);
184 IMPLEMENT_IS_TYPE_B2(Engraver_group_engraver,Engraver, Translator);
186 ADD_THIS_ENGRAVER(Engraver_group_engraver);
189 Engraver_group_engraver::do_print() const
194 DOUT << "ID: " << id_str_ ;
195 DOUT << " iterators: " << iterator_count_<< "\n";
196 for (PCursor<Engraver*> i (grav_list_.top()); i.ok (); i++)
202 Engraver_group_engraver*
203 Engraver_group_engraver::find_engraver_l (String n, String id)
205 if (name() == n && id_str_ == id)
207 Engraver_group_engraver * r = 0;
208 for (int i =0; !r && i< group_l_arr_.size(); i++)
210 r = group_l_arr_[i]->find_engraver_l (n,id);
217 Engraver_group_engraver::find_get_translator_l (String n,String id)
220 Input_translator * itrans_l= itrans_l_-> recursive_find (n);
223 ret = find_engraver_l (n,id);
226 Engraver_group_engraver * group =
227 itrans_l-> get_group_engraver_p();
232 if (group->itrans_l_->is_name_b (n))
235 return ret->find_get_translator_l (n,id);
239 else if (daddy_grav_l_)
240 ret =daddy_grav_l_->find_get_translator_l (n,id);
243 warning ("Can't find or create `" + n + "' called `" + id + "'\n");
250 Engraver_group_engraver::depth_i() const
252 return daddy_grav_l_->depth_i() + 1;
256 Engraver_group_engraver::ancestor_l (int l)
258 if (!l || !daddy_grav_l_)
261 return daddy_grav_l_->ancestor_l (l-1);
265 Engraver_group_engraver::announce_element (Score_elem_info info)
267 announce_info_arr_.push (info);
268 Engraver::announce_element (info);
272 Engraver_group_engraver::do_announces()
274 for (int i=0; i < group_l_arr_.size(); i++)
276 group_l_arr_[i]->do_announces();
281 for (int j =0; j < announce_info_arr_.size(); j++)
283 Score_elem_info info = announce_info_arr_[j];
286 info.req_l_ = &dummy_req;
287 for (int i=0; i < nongroup_l_arr_.size(); i++) { // Is this good enough?6
288 if (nongroup_l_arr_[i] != info.origin_grav_l_arr_[0])
289 nongroup_l_arr_[i]->acknowledge_element (info);
292 announce_info_arr_.clear();
297 Engraver_group_engraver::do_removal_processing()
299 for (PCursor<Engraver*> i (grav_list_.top()); i.ok (); i++)
300 i->removal_processing();
304 Engraver_group_engraver::get_staff_info() const
306 Staff_info inf = Engraver::get_staff_info();
308 for (int i=0; i < nongroup_l_arr_.size(); i++)
309 nongroup_l_arr_[i]->fill_staff_info (inf);
315 Engraver_group_engraver::get_default_interpreter()
318 if (is_bottom_engraver_b())
319 return daddy_grav_l_->get_default_interpreter();
321 Engraver_group_engraver *grav_p= itrans_l_->
322 get_default_itrans_l()->get_group_engraver_p ();
324 if (grav_p->is_bottom_engraver_b())
327 return grav_p->get_default_interpreter();
331 Engraver_group_engraver::is_bottom_engraver_b() const
333 return !itrans_l_->get_default_itrans_l();
337 Engraver_group_engraver::get_simple_engraver (char const *type) const
339 for (int i=0; i < nongroup_l_arr_.size(); i++)
341 if (nongroup_l_arr_[i]->name() == type)
342 return nongroup_l_arr_[i];
345 return daddy_grav_l_->get_simple_engraver (type);