]> git.donarmstrong.com Git - lilypond.git/blob - lily/grace-position-engraver.cc
3d0295f0179ed7a9114c9d2414fe860c01edb8ee
[lilypond.git] / lily / grace-position-engraver.cc
1 /*   
2   grace-position-engraver.cc --  implement Grace_position_engraver
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 "engraver.hh"
11 #include "grace-align-item.hh"
12 #include "note-head.hh"
13 #include "local-key-item.hh"
14
15 class Grace_position_engraver:public Engraver
16 {
17 protected:
18   VIRTUAL_COPY_CONS(Translator);
19   virtual void acknowledge_element (Score_element_info);
20   virtual void process_acknowledged ();
21   virtual void do_post_move_processing ();
22   Grace_align_item*align_l_;
23   Link_array<Item> support_;
24 public:
25   Grace_position_engraver();
26 };
27
28
29 Grace_position_engraver::Grace_position_engraver ()
30 {
31   align_l_ =0;
32 }
33
34 void
35 Grace_position_engraver::acknowledge_element (Score_element_info i)
36 {
37   if (Grace_align_item*g  =dynamic_cast<Grace_align_item*>(i.elem_l_))
38     {
39       align_l_ = g;
40     }
41   else if (Note_head * n = dynamic_cast <Note_head*> (i.elem_l_))
42     {
43       support_.push (n);
44     }
45   else if (Local_key_item*it = dynamic_cast<Local_key_item*>(i.elem_l_))
46     {
47       if (it->get_elt_property (grace_scm_sym) == SCM_BOOL_F)
48         support_.push (it);
49       else if (align_l_) 
50         it->add_dependency (align_l_);
51     }
52 }
53
54 void
55 Grace_position_engraver::process_acknowledged ()
56 {
57   if (align_l_)
58     {
59       for (int i=0; i < support_.size (); i++)
60         align_l_->add_support (support_[i]);
61       support_.clear ();
62     }
63 }
64
65 void
66 Grace_position_engraver::do_post_move_processing ()
67 {
68   support_.clear ();
69   align_l_ =0;
70 }
71
72 ADD_THIS_TRANSLATOR(Grace_position_engraver);