]> git.donarmstrong.com Git - lilypond.git/blob - lily/performer-group-performer.cc
patch::: 0.1.1.jcn1: zachte pats
[lilypond.git] / lily / performer-group-performer.cc
1 /*
2   performer-group-performer.cc -- implement Performer_group_performer
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7                  Jan Nieuwenhuizen <jan@digicash.com>
8  */
9
10 #include "performer-group-performer.hh"
11 #include "input-translator.hh"
12 #include "debug.hh"
13
14 IMPLEMENT_IS_TYPE_B2(Performer_group_performer,Performer, Translator);
15
16 ADD_THIS_PERFORMER(Performer_group_performer);
17
18 Performer_group_performer::Performer_group_performer()
19 {
20 }
21
22 Performer_group_performer::~Performer_group_performer()
23 {
24 }
25
26 void
27 Performer_group_performer::add( Performer *perf_p )
28 {
29     perf_p_list_.bottom().add(perf_p);
30     perf_p->daddy_perf_l_ = this;
31
32     if (perf_p->is_type_b(Performer_group_performer::static_name())) {
33         group_l_arr_.push((Performer_group_performer*)perf_p);
34     } else {
35         nongroup_l_arr_ .push(perf_p);
36     }
37 }
38
39 Translator*
40 Performer_group_performer::ancestor_l( int l )
41 {
42     if (!l || !daddy_perf_l_)
43         return this;
44     
45     return daddy_perf_l_->ancestor_l( l - 1 );
46 }
47
48 int
49 Performer_group_performer::depth_i() const
50 {
51     return daddy_perf_l_->depth_i() + 1;
52 }
53
54 Translator*
55 Performer_group_performer::find_get_translator_l( String n,String id )
56 {
57     Translator * ret=0;
58     Input_translator* itrans_l= itrans_l_-> recursive_find ( n );
59     if (itrans_l ) {
60         ret = find_performer_l(n,id);
61         if (!ret) {
62             Performer_group_performer * group = 
63                 itrans_l-> get_group_performer_p();
64             
65             add(group);
66             ret = group;
67             
68             if (group->itrans_l_->is_name_b( n ) )
69                 ret ->id_str_ = id;
70             else
71                 return ret->find_get_translator_l(n,id);
72
73         }
74     } else if (daddy_perf_l_)
75         ret =daddy_perf_l_->find_get_translator_l(n,id);
76     else {
77         warning("Can't find or create `" + n + "' called `" + id + "'\n");
78         ret =0;
79     }
80     return ret;
81 }
82
83 Performer_group_performer*
84 Performer_group_performer::find_performer_l( String n, String id )
85 {
86     if (name() == n && id_str_ == id)
87         return this;
88     Performer_group_performer * r = 0;
89     for (int i =0; !r && i<  group_l_arr_.size(); i++) {
90         r = group_l_arr_[i]->find_performer_l(n,id);
91     }
92     
93     return r;
94 }
95
96 Translator*
97 Performer_group_performer::get_default_interpreter()
98 {
99     // ? 
100     if ( is_bottom_performer_b() )
101         return daddy_perf_l_->get_default_interpreter();
102
103     Performer_group_performer *perf_p= itrans_l_->
104         get_default_itrans_l()->get_group_performer_p();
105     add(perf_p );
106     if (perf_p->is_bottom_performer_b())
107         return perf_p;
108     else
109         return perf_p->get_default_interpreter();
110 }
111
112 Moment
113 Performer_group_performer::get_mom() const
114 {
115     Moment mom = Performer::get_mom();
116
117     for ( int i = 0; i < nongroup_l_arr_.size(); i++ )
118         nongroup_l_arr_[ i ]->set( mom );
119     
120     return mom;
121 }
122
123 bool
124 Performer_group_performer::is_bottom_performer_b() const
125 {
126     return !itrans_l_->get_default_itrans_l();
127 }
128
129
130 void
131 Performer_group_performer::process_requests()
132 {
133     for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
134         i->process_requests();
135 }
136
137 //<ugh>
138 int
139 Performer_group_performer::get_track_i() const
140 {
141     int track_i = Performer::get_track_i();
142
143     for ( int i = 0; i < nongroup_l_arr_.size(); i++ )
144         nongroup_l_arr_[ i ]->set_track( track_i );
145     
146     return track_i;
147 }
148
149 void
150 Performer_group_performer::set_track( int& track_i_r )
151 {
152     for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
153         i->set_track( track_i_r );
154 }
155 //</ugh>
156
157 bool
158 Performer_group_performer::do_try_request( Request* req_l )
159 {
160     bool hebbes_b =false;
161     for (int i =0; !hebbes_b && i < nongroup_l_arr_.size() ; i++)
162         hebbes_b =nongroup_l_arr_[i]->try_request(req_l);
163     if ( !hebbes_b && daddy_perf_l_ )
164         hebbes_b = daddy_perf_l_->try_request(req_l);
165     return hebbes_b ;
166 }
167
168 void
169 Performer_group_performer::do_print()const
170 {
171 #ifndef NPRINT
172     if ( !check_debug)
173         return ;
174     for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
175         i->print();
176 #endif
177 }
178
179 void
180 Performer_group_performer::do_creation_processing()
181 {
182     for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
183         i->creation_processing();
184 }
185
186 void
187 Performer_group_performer::do_removal_processing()
188 {
189     for ( PCursor<Performer*> i( perf_p_list_.top() ); i.ok(); i++ )
190         i->do_removal_processing();
191 }