]> git.donarmstrong.com Git - lilypond.git/blob - lily/grace-engraver-group.cc
patch::: 1.3.18.jcn1
[lilypond.git] / lily / grace-engraver-group.cc
1 /*   
2   grace-engraver-group.cc -- implement Grace_engraver_group
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "grace-engraver-group.hh"
11 #include "lily-guile.hh"
12 #include "score-element.hh"
13 #include "musical-request.hh"
14
15 ADD_THIS_TRANSLATOR (Grace_engraver_group);
16
17 void
18 Grace_engraver_group::start ()
19 {
20 }
21 /*
22   We're really finished with this context. Get rid of everything.
23  */
24 void
25 Grace_engraver_group::finish ()
26 {
27   calling_self_b_ = true;
28   removal_processing ();        // ugr. We'd want to have this done by our parents.g
29   for (int i=0; i < announce_to_top_.size (); i++)
30     {
31       Engraver::announce_element (announce_to_top_[i]);
32     }
33
34   for (int i=0; i < typeset_us_.size (); i++)
35     {
36       Engraver::typeset_element (typeset_us_[i]);
37     }
38   typeset_us_.clear ();
39   calling_self_b_ = false;
40 }
41
42 void
43 Grace_engraver_group::do_removal_processing ()
44 {
45   Engraver_group_engraver::do_removal_processing ();
46 }
47
48 void
49 Grace_engraver_group::announce_element (Score_element_info inf)
50 {
51   announce_info_arr_.push (inf);
52   // do not propagate to top
53   announce_to_top_.push (inf);
54
55   inf.elem_l_->set_elt_property ("grace", SCM_BOOL_T);
56 }
57
58 void
59 Grace_engraver_group::typeset_element (Score_element*e)
60 {
61   typeset_us_.push (e);
62 }
63
64
65 Grace_engraver_group::Grace_engraver_group()
66 {
67   calling_self_b_ = false;
68 }
69
70 void
71 Grace_engraver_group::process ()
72 {
73   calling_self_b_  = true;
74   process_requests ();
75   do_announces();
76   pre_move_processing();
77   check_removal();
78   calling_self_b_ = false;
79 }
80
81
82 void
83 Grace_engraver_group::each (Method_pointer method)
84 {
85   if (calling_self_b_)
86     Engraver_group_engraver::each (method);
87 }
88
89
90 void
91 Grace_engraver_group::each (Const_method_pointer method) const
92 {
93  if (calling_self_b_)
94     Engraver_group_engraver::each (method);
95 }
96
97 /*
98   don't let the commands trickle up.
99  */
100 bool
101 Grace_engraver_group::do_try_music (Music *m)
102 {
103   bool hebbes_b = try_music_on_nongroup_children (m);
104
105   if (!hebbes_b && pass_to_top_b (m))
106     {
107       hebbes_b = daddy_trans_l_->try_music (m);
108     }
109
110   return hebbes_b;
111 }
112
113 bool
114 Grace_engraver_group::pass_to_top_b (Music *m) const
115 {
116   if (Span_req * sp = dynamic_cast<Span_req*> (m))
117     {
118       if (sp->span_type_str_ == "slur")
119         //      return true;
120         return false;
121     }
122   return false;
123 }
124