]> git.donarmstrong.com Git - lilypond.git/blob - lily/engraver-group.cc
bd6873d0d227ef63a0bea59b627520f09fe6009d
[lilypond.git] / lily / engraver-group.cc
1 /*
2   engravergroup.cc -- implement Engraver_group_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "proto.hh"
10 #include "plist.hh"
11 #include "engraver-group.hh"
12 #include "engraver.hh"
13 #include "debug.hh"
14 #include "p-score.hh"
15 #include "score-elem.hh"
16
17 IMPLEMENT_IS_TYPE_B2(Engraver_group_engraver,Engraver, Translator_group);
18 ADD_THIS_TRANSLATOR(Engraver_group_engraver);
19
20 void
21 Engraver_group_engraver::announce_element (Score_elem_info info)
22 {
23   announce_info_arr_.push (info);
24   Engraver::announce_element (info);
25 }
26
27 void
28 Engraver_group_engraver::do_announces()
29 {
30   Link_array<Translator_group> groups = group_l_arr ();
31   for (int i=0; i < groups.size(); i++) 
32     {
33       Engraver * eng = groups[i]->engraver_l ();
34       if (eng)
35         {
36           Engraver_group_engraver * group =
37             (Engraver_group_engraver*) eng;
38           group->do_announces();
39         }
40     }
41   
42   Request dummy_req;
43
44   Link_array<Translator> nongroups = nongroup_l_arr ();
45   while (announce_info_arr_.size ())
46     {
47       for (int j =0; j < announce_info_arr_.size(); j++)
48         {
49           Score_elem_info info = announce_info_arr_[j];
50           
51           if (!info.req_l_)
52             info.req_l_ = &dummy_req;
53           for (int i=0; i < nongroups.size(); i++) 
54             {   // Is this good enough?
55               Engraver * eng = nongroups[i]->engraver_l ();
56               if (eng && eng!= info.origin_grav_l_arr_[0])
57                 eng->acknowledge_element (info);
58             }
59         }
60       announce_info_arr_.clear ();
61       for (int i=0; i < nongroups.size(); i++)
62         {
63           Engraver * eng = nongroups[i]->engraver_l ();
64           if (eng)
65             eng->process_acknowledged ();
66         }
67
68     }
69 }
70
71
72 Staff_info
73 Engraver_group_engraver::get_staff_info() const
74 {
75   Staff_info inf = Engraver::get_staff_info();
76
77   Link_array<Translator> simple_translators = nongroup_l_arr (); 
78   for (int i=0; i < simple_translators.size(); i++)
79     {
80     Engraver * eng = simple_translators[i]->engraver_l ();
81     if (eng)
82       eng->fill_staff_info (inf);
83     }
84   return inf;
85 }
86
87
88
89 Engraver_group_engraver::~Engraver_group_engraver ()
90 {
91 }
92
93 Engraver_group_engraver::Engraver_group_engraver ()
94 {
95 }