2 line-number-engraver.cc -- implement Line_number_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.hh"
12 #include "side-position-interface.hh"
13 #include "rhythmic-head.hh"
15 #include "note-head.hh"
18 Annotate output with line numbers. Creates text-items when it
19 catches note heads. */
20 class Line_number_engraver
: public Engraver
22 Array
<Score_element_info
> interesting_
;
23 Link_array
<Score_element
> support_
;
27 Line_number_engraver ();
28 VIRTUAL_COPY_CONS (Translator
);
30 virtual void do_pre_move_processing ();
31 virtual void acknowledge_element (Score_element_info
);
32 virtual void process_acknowledged ();
36 Line_number_engraver::process_acknowledged ()
38 if (!text_item_p_
&& interesting_
.size ())
40 text_item_p_
= new Item (get_property ("basicTextProperties") );
41 Side_position::set_axis (text_item_p_
,Y_AXIS
);
42 Side_position::set_direction (text_item_p_
, UP
);
43 text_item_p_
->set_parent (interesting_
[0].elem_l_
, Y_AXIS
);
46 announce_element (text_item_p_
, 0);
51 Line_number_engraver::acknowledge_element (Score_element_info inf
)
56 if ( Note_head::has_interface (inf
.elem_l_
))
58 interesting_
.push (inf
);
59 support_
.push (inf
.elem_l_
);
61 else if (Stem::has_interface (inf
.elem_l_
))
63 support_
.push (inf
.elem_l_
);
68 Line_number_engraver::do_pre_move_processing ()
74 for (int i
=0; i
< interesting_
.size (); i
++)
79 s
+= interesting_
[i
].req_l_
->origin ()->line_number_str ();
83 for (int j
= support_
.size (); j
--; )
85 Side_position::add_support (text_item_p_
,support_
[j
]);
89 text_item_p_
->set_elt_property ("text", ly_str02scm (s
.ch_C()));
93 typeset_element (text_item_p_
);
96 interesting_
.clear ();
100 Line_number_engraver::Line_number_engraver ()
105 ADD_THIS_TRANSLATOR(Line_number_engraver
);