2 grace-position-engraver.cc -- implement Grace_position_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.hh"
11 #include "grace-align-item.hh"
12 #include "rhythmic-head.hh"
13 #include "local-key-item.hh"
14 #include "paper-column.hh"
15 #include "note-head.hh"
16 #include "side-position-interface.hh"
17 #include "axis-group-interface.hh"
20 class Grace_position_engraver
:public Engraver
22 Paper_column
*last_musical_col_l_
;
24 VIRTUAL_COPY_CONS(Translator
);
25 virtual void acknowledge_element (Score_element_info
);
26 virtual void process_acknowledged ();
27 virtual void do_post_move_processing ();
28 virtual void do_pre_move_processing ();
30 Link_array
<Item
> support_
;
32 Grace_position_engraver();
36 Grace_position_engraver::Grace_position_engraver ()
39 last_musical_col_l_
=0;
43 Grace_position_engraver::acknowledge_element (Score_element_info i
)
45 Item
*item
= dynamic_cast<Item
*> (i
.elem_l_
);
46 if (item
&& Grace_align_item::has_interface (i
.elem_l_
))
50 else if (item
&& Note_head::has_interface (i
.elem_l_
))
52 if (!to_boolean (item
->get_elt_property ("grace")))
55 else if (item
&& Local_key_item::has_interface (i
.elem_l_
))
57 if (!to_boolean (item
->get_elt_property ("grace")))
60 item
->add_dependency (align_l_
);
65 Grace_position_engraver::process_acknowledged ()
69 for (int i
=0; i
< support_
.size (); i
++)
70 Side_position::add_support (align_l_
,support_
[i
]);
76 Grace_position_engraver::do_pre_move_processing ()
78 if (align_l_
&& !Side_position::supported_b (align_l_
))
81 We don't have support. Either some moron tried attaching us to a rest,
82 or we're at the end of the piece. In the latter case, we have a
83 problem if there are spanners in the grace section,
84 they will want to be broken into pieces (their line_l () field is nil).
86 Solution: attach ourselves to the last musical column known. A little intricate.
90 Score_element
* elt
= align_l_
->parent_l (X_AXIS
);
94 warning (_("Unattached grace notes. Attaching to last musical column."));
96 align_l_
->set_parent (0, X_AXIS
);
97 Axis_group_interface::add_element (last_musical_col_l_
, align_l_
);
100 last_musical_col_l_
= dynamic_cast<Paper_column
*>( unsmob_element (get_property ("currentMusicalColumn")));
104 Grace_position_engraver::do_post_move_processing ()
110 ADD_THIS_TRANSLATOR(Grace_position_engraver
);