2 grace-position-engraver.cc -- implement Grace_position_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.hh"
11 #include "grace-align-item.hh"
12 #include "note-head.hh"
13 #include "local-key-item.hh"
14 #include "paper-column.hh"
15 #include "dimension-cache.hh"
17 class Grace_position_engraver
:public Engraver
19 Paper_column
*last_musical_col_l_
;
21 VIRTUAL_COPY_CONS(Translator
);
22 virtual void acknowledge_element (Score_element_info
);
23 virtual void process_acknowledged ();
24 virtual void do_post_move_processing ();
25 virtual void do_pre_move_processing ();
26 Grace_align_item
*align_l_
;
27 Link_array
<Item
> support_
;
29 Grace_position_engraver();
33 Grace_position_engraver::Grace_position_engraver ()
36 last_musical_col_l_
=0;
40 Grace_position_engraver::acknowledge_element (Score_element_info i
)
42 if (Grace_align_item
*g
=dynamic_cast<Grace_align_item
*>(i
.elem_l_
))
46 else if (Note_head
* n
= dynamic_cast <Note_head
*> (i
.elem_l_
))
48 if (!to_boolean (n
->get_elt_property ("grace")))
51 else if (Local_key_item
*it
= dynamic_cast<Local_key_item
*>(i
.elem_l_
))
53 if (!to_boolean (it
->get_elt_property ("grace")))
56 it
->add_dependency (align_l_
);
61 Grace_position_engraver::process_acknowledged ()
65 for (int i
=0; i
< support_
.size (); i
++)
66 align_l_
->add_support (support_
[i
]);
72 Grace_position_engraver::do_pre_move_processing ()
75 We don't have support. Either some moron tried attaching us to a rest,
76 or we're at the end of the piece. In the latter case, we have a
77 problem if there are spanners in the grace section,
78 they will want to be broken into pieces (their line_l () field is nil).
80 Solution: attach ourselves to the last musical column known. A little intricate.
83 if (align_l_
&& !align_l_
->supported_b ())
85 Score_element
* elt
= align_l_
->parent_l (X_AXIS
);
89 warning (_("Unattached grace notes. Attaching to last musical column."));
91 ae->remove_element (align_l_);
95 align_l_
->set_parent (0, X_AXIS
);
96 last_musical_col_l_
->add_element (align_l_
);
99 last_musical_col_l_
= get_staff_info ().musical_pcol_l ();
103 Grace_position_engraver::do_post_move_processing ()
109 ADD_THIS_TRANSLATOR(Grace_position_engraver
);