lilypond-1.3.12
[lilypond.git] / lily / text-engraver.cc
blob56f7b3eae1bcd2267509af96d42efd29cf4ad8a1
1 /*
2 text-engraver.cc -- implement Text_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 */
9 #include "dimension-cache.hh"
11 #include "engraver.hh"
12 #include "side-position-interface.hh"
13 #include "text-item.hh"
14 #include "musical-request.hh"
15 #include "note-head.hh"
16 #include "stem.hh"
17 #include "staff-symbol.hh"
19 /**
20 typeset directions that are plain text.
22 class Text_engraver : public Engraver
24 Link_array<Text_script_req> reqs_;
25 Link_array<Text_item> texts_;
26 public:
28 VIRTUAL_COPY_CONS(Translator);
29 protected:
30 virtual bool do_try_music (Music* m);
31 virtual void do_pre_move_processing ();
32 virtual void do_post_move_processing ();
33 virtual void do_process_requests ();
34 virtual void acknowledge_element (Score_element_info);
38 bool
39 Text_engraver::do_try_music (Music *m)
41 if (Text_script_req *r = dynamic_cast<Text_script_req*> (m))
43 reqs_.push (r);
44 return true;
46 return false;
50 void
51 Text_engraver::acknowledge_element (Score_element_info i)
53 if (Note_head *n = dynamic_cast<Note_head*> (i.elem_l_))
55 for (int i=0; i < texts_.size (); i++)
57 Side_position_interface st (texts_[i]);
58 st.add_support (n);
59 if (st.get_axis( ) == X_AXIS
60 && !texts_[i]->parent_l (Y_AXIS))
61 texts_[i]->set_parent (n, Y_AXIS);
64 if (Stem *n = dynamic_cast<Stem*> (i.elem_l_))
66 for (int i=0; i < texts_.size (); i++)
68 Side_position_interface st(texts_[i]);
69 st.add_support (n);
74 void
75 Text_engraver::do_process_requests ()
77 for (int i=0; i < reqs_.size (); i++)
79 Text_script_req * r = reqs_[i];
81 Text_item *text = new Text_item;
82 Side_position_interface stafy (text);
84 SCM axisprop = get_property ("scriptHorizontal",0);
85 if (gh_boolean_p (axisprop) && gh_scm2bool (axisprop))
87 stafy.set_axis (X_AXIS);
88 // text->set_parent (ss, Y_AXIS);
90 else
91 stafy.set_axis (Y_AXIS);
93 text->set_elt_property ("script-priority",
94 gh_int2scm (200));
96 if (r->get_direction ())
97 stafy.set_direction (r->get_direction ());
99 text->text_str_ = r->text_str_;
101 if (r->style_str_.length_i ())
102 text->set_elt_property ("style", ly_str02scm (r->style_str_.ch_C()));
104 SCM empty = get_property ("textEmptyDimension", 0);
105 if (gh_boolean_p (empty) && gh_scm2bool (empty))
107 text->set_empty (X_AXIS);
110 announce_element (Score_element_info (text, r));
111 texts_.push (text);
115 void
116 Text_engraver::do_pre_move_processing ()
118 for (int i=0; i < texts_.size (); i++)
120 typeset_element (texts_[i]);
122 texts_.clear ();
125 void
126 Text_engraver::do_post_move_processing ()
128 reqs_.clear ();
131 ADD_THIS_TRANSLATOR(Text_engraver);