]> git.donarmstrong.com Git - lilypond.git/blob - lily/text-engraver.cc
release: 1.1.18
[lilypond.git] / lily / text-engraver.cc
1 /*   
2   text-engraver.cc --  implement Text_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
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"
15 #include "stem.hh"
16
17 class Text_engraver : public Engraver
18 {
19   Link_array<Script_req> reqs_;
20   Link_array<G_staff_side_item> positionings_;
21   Link_array<G_text_item> texts_;
22 public:
23   Text_engraver();
24   VIRTUAL_COPY_CONS(Translator);
25 protected:
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);
31 };
32
33 Text_engraver::Text_engraver ()
34 {
35   
36 }
37
38 bool
39 Text_engraver::do_try_music (Music *m)
40 {
41   if (Script_req *r = dynamic_cast<Script_req*> (m))
42     {
43       Text_def * t = dynamic_cast<Text_def*> (r->scriptdef_p_);
44       if (!t)
45         return false;
46       reqs_.push (r);
47       return true;
48     }
49   return false;
50 }
51
52
53 void
54 Text_engraver::acknowledge_element (Score_element_info i)
55 {
56   if (Note_head *n = dynamic_cast<Note_head*> (i.elem_l_))
57     {
58       for (int i=0; i < positionings_.size (); i++)
59         {
60           positionings_[i]->add_support (n);
61         }
62     }
63   if (Stem *n = dynamic_cast<Stem*> (i.elem_l_))
64     {
65       for (int i=0; i < positionings_.size (); i++)
66         {
67           positionings_[i]->add_support (n);
68         }
69     }
70 }
71
72 void
73 Text_engraver::do_process_requests ()
74 {
75   for (int i=0; i < reqs_.size (); i++)
76     {
77       Script_req * r = reqs_[i];
78       Text_def * t= dynamic_cast<Text_def*> (r->scriptdef_p_);
79
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);
83
84       text->text_str_ = t->text_str_;
85
86       announce_element (Score_element_info (text, r));
87       announce_element (Score_element_info (ss, r));
88
89       texts_.push (text);
90       positionings_.push (ss);
91     }
92 }
93
94 void
95 Text_engraver::do_pre_move_processing ()
96 {
97   for (int i=0; i < texts_.size (); i++)
98     {
99       typeset_element (texts_[i]);
100       typeset_element (positionings_[i]);
101     }
102   texts_.clear ();
103   positionings_.clear ();
104 }
105
106 void
107 Text_engraver::do_post_move_processing ()
108 {
109   reqs_.clear ();
110 }
111
112 ADD_THIS_TRANSLATOR(Text_engraver);