2 text-engraver.cc -- implement Text_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.hh"
11 #include "g-staff-side.hh"
12 #include "g-text-item.hh"
13 #include "text-def.hh"
14 #include "note-head.hh"
17 class Text_engraver : public Engraver
19 Link_array<Script_req> reqs_;
20 Link_array<G_staff_side_item> positionings_;
21 Link_array<G_text_item> texts_;
24 VIRTUAL_COPY_CONS(Translator);
26 virtual bool do_try_music (Music* m);
27 virtual void do_pre_move_processing ();
28 virtual void do_post_move_processing ();
29 virtual void do_process_requests ();
30 virtual void acknowledge_element (Score_element_info);
33 Text_engraver::Text_engraver ()
39 Text_engraver::do_try_music (Music *m)
41 if (Script_req *r = dynamic_cast<Script_req*> (m))
43 Text_def * t = dynamic_cast<Text_def*> (r->scriptdef_p_);
54 Text_engraver::acknowledge_element (Score_element_info i)
56 if (Note_head *n = dynamic_cast<Note_head*> (i.elem_l_))
58 for (int i=0; i < positionings_.size (); i++)
60 positionings_[i]->add_support (n);
63 if (Stem *n = dynamic_cast<Stem*> (i.elem_l_))
65 for (int i=0; i < positionings_.size (); i++)
67 positionings_[i]->add_support (n);
73 Text_engraver::do_process_requests ()
75 for (int i=0; i < reqs_.size (); i++)
77 Script_req * r = reqs_[i];
78 Text_def * t= dynamic_cast<Text_def*> (r->scriptdef_p_);
80 G_text_item *text = new G_text_item;
81 G_staff_side_item *ss = new G_staff_side_item;
82 ss->set_victim (text);
84 text->text_str_ = t->text_str_;
86 announce_element (Score_element_info (text, r));
87 announce_element (Score_element_info (ss, r));
90 positionings_.push (ss);
95 Text_engraver::do_pre_move_processing ()
97 for (int i=0; i < texts_.size (); i++)
99 typeset_element (texts_[i]);
100 typeset_element (positionings_[i]);
103 positionings_.clear ();
107 Text_engraver::do_post_move_processing ()
112 ADD_THIS_TRANSLATOR(Text_engraver);