]> git.donarmstrong.com Git - lilypond.git/blob - lily/text-engraver.cc
Merge with git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond.git
[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--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "directional-element-interface.hh"
10 #include "engraver.hh"
11 #include "rhythmic-head.hh"
12 #include "side-position-interface.hh"
13 #include "stem.hh"
14 #include "stream-event.hh"
15 #include "text-interface.hh"
16
17 #include "translator.icc"
18
19 /**
20    typeset directions that are  plain text.
21 */
22 class Text_engraver : public Engraver
23 {
24   vector<Stream_event *> evs_;
25   vector<Item*> texts_;
26 public:
27   TRANSLATOR_DECLARATIONS (Text_engraver);
28 protected:
29   void stop_translation_timestep ();
30   void process_acknowledged ();
31
32   DECLARE_TRANSLATOR_LISTENER (text_script);
33   DECLARE_ACKNOWLEDGER (stem_tremolo);
34   DECLARE_ACKNOWLEDGER (stem);
35   DECLARE_ACKNOWLEDGER (rhythmic_head);
36 };
37
38 IMPLEMENT_TRANSLATOR_LISTENER (Text_engraver, text_script);
39 void
40 Text_engraver::listen_text_script (Stream_event *ev)
41 {
42   evs_.push_back (ev);
43 }
44
45 void
46 Text_engraver::acknowledge_rhythmic_head (Grob_info inf)
47 {
48   for (vsize i = 0; i < texts_.size (); i++)
49     {
50       Grob *t = texts_[i];
51       Side_position_interface::add_support (t, inf.grob ());
52
53       /*
54         ugh.
55       */
56       if (Side_position_interface::get_axis (t) == X_AXIS
57           && !t->get_parent (Y_AXIS))
58         t->set_parent (inf.grob (), Y_AXIS);
59       else if (Side_position_interface::get_axis (t) == Y_AXIS
60                && !t->get_parent (X_AXIS))
61         t->set_parent (inf.grob (), X_AXIS);
62     }
63 }
64
65 void
66 Text_engraver::acknowledge_stem (Grob_info inf)
67 {
68   for (vsize i = 0; i < texts_.size (); i++)
69     Side_position_interface::add_support (texts_[i], inf.grob ());
70 }
71
72 void
73 Text_engraver::acknowledge_stem_tremolo (Grob_info info)
74 {
75   for (vsize i = 0; i < texts_.size (); i++)
76     Side_position_interface::add_support (texts_[i], info.grob ());
77 }
78
79 void
80 Text_engraver::process_acknowledged ()
81 {
82   if (texts_.size ())
83     return;
84   for (vsize i = 0; i < evs_.size (); i++)
85     {
86       Stream_event *r = evs_[i];
87
88       // URG: Text vs TextScript
89       Item *text = make_item ("TextScript", r->self_scm ());
90
91       int priority = robust_scm2int (text->get_property ("script-priority"),
92                                      200);
93
94       /* see script-engraver.cc */
95       priority += i;
96
97       text->set_property ("script-priority", scm_from_int (priority));
98
99       Direction dir = to_dir (r->get_property ("direction"));
100       if (dir)
101         set_grob_direction (text, dir);
102
103       SCM mark = r->get_property ("text");
104
105       text->set_property ("text", mark);
106       texts_.push_back (text);
107     }
108 }
109
110 void
111 Text_engraver::stop_translation_timestep ()
112 {
113   texts_.clear ();
114   evs_.clear ();
115 }
116
117 Text_engraver::Text_engraver ()
118 {
119 }
120
121 ADD_ACKNOWLEDGER (Text_engraver, stem);
122 ADD_ACKNOWLEDGER (Text_engraver, stem_tremolo);
123 ADD_ACKNOWLEDGER (Text_engraver, rhythmic_head);
124 ADD_TRANSLATOR (Text_engraver,
125                 /* doc */ "Create text-scripts",
126                 /* create */ "TextScript",
127                 /* read */ "",
128                 /* write */ "");