]> git.donarmstrong.com Git - lilypond.git/blob - lily/engraver-group.cc
release: 1.1.29
[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--1999 Han-Wen Nienhuys <hanwen@cs.uu.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-element.hh"
16
17
18 ADD_THIS_TRANSLATOR(Engraver_group_engraver);
19
20 void
21 Engraver_group_engraver::announce_element (Score_element_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_group_engraver * group = dynamic_cast<Engraver_group_engraver*> (groups[i]);
34       if (group)
35         {
36           group->do_announces();
37         }
38     }
39   
40   Request dummy_req;
41
42   Link_array<Translator> nongroups = nongroup_l_arr ();
43   while (announce_info_arr_.size ())
44     {
45       for (int j =0; j < announce_info_arr_.size(); j++)
46         {
47           Score_element_info info = announce_info_arr_[j];
48           
49           if (!info.req_l_)
50             info.req_l_ = &dummy_req;
51           for (int i=0; i < nongroups.size(); i++) 
52             {   // Is this good enough?
53               Engraver * eng = dynamic_cast<Engraver*> (nongroups[i]);
54               if (eng && eng!= info.origin_grav_l_arr_[0])
55                 eng->acknowledge_element (info);
56             }
57         }
58       announce_info_arr_.clear ();
59       for (int i=0; i < nongroups.size(); i++)
60         {
61           Engraver * eng = dynamic_cast<Engraver*> (nongroups[i]);
62           if (eng)
63             eng->process_acknowledged ();
64         }
65
66     }
67 }
68
69
70 Staff_info
71 Engraver_group_engraver::get_staff_info() const
72 {
73   Staff_info inf = Engraver::get_staff_info();
74
75   Link_array<Translator> simple_translators = nongroup_l_arr (); 
76   for (int i=0; i < simple_translators.size(); i++)
77     {
78     Engraver * eng = dynamic_cast<Engraver*> (simple_translators[i]);
79     if (eng)
80       eng->fill_staff_info (inf);
81     }
82   return inf;
83 }
84
85
86
87 Engraver_group_engraver::~Engraver_group_engraver ()
88 {
89 }
90
91 Engraver_group_engraver::Engraver_group_engraver ()
92 {
93 }