]> git.donarmstrong.com Git - lilypond.git/blob - lily/text-engraver.cc
2c86f50d67cc4e00aad9e3c144d7d565ec1e9d0f
[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       Axis ax = Y_AXIS;
92       Side_position_interface::set_axis (text, ax);
93
94       // Hmm
95       int priority = 200;
96       SCM s = text->get_property ("script-priority");
97       if (scm_is_number (s))
98         priority = scm_to_int (s);
99
100       /* see script-engraver.cc */
101       priority += i;
102
103       text->set_property ("script-priority", scm_from_int (priority));
104
105       Direction dir = to_dir (r->get_property ("direction"));
106       if (dir)
107         set_grob_direction (text, dir);
108
109       SCM mark = r->get_property ("text");
110
111       text->set_property ("text", mark);
112       texts_.push_back (text);
113     }
114 }
115
116 void
117 Text_engraver::stop_translation_timestep ()
118 {
119   texts_.clear ();
120   evs_.clear ();
121 }
122
123 Text_engraver::Text_engraver ()
124 {
125 }
126
127 ADD_ACKNOWLEDGER (Text_engraver, stem);
128 ADD_ACKNOWLEDGER (Text_engraver, stem_tremolo);
129 ADD_ACKNOWLEDGER (Text_engraver, rhythmic_head);
130 ADD_TRANSLATOR (Text_engraver,
131                 /* doc */ "Create text-scripts",
132                 /* create */ "TextScript",
133                 /* accept */ "text-script-event",
134                 /* read */ "",
135                 /* write */ "");