]> git.donarmstrong.com Git - lilypond.git/blob - lily/script-engraver.cc
release: 1.1.1
[lilypond.git] / lily / script-engraver.cc
1 /*
2   script-reg.cc -- implement Script_engraver
3
4   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
5 */
6
7 #include "script-engraver.hh"
8 #include "script.hh"
9 #include "musical-request.hh"
10 #include "stem.hh"
11 #include "staff-sym.hh"
12 #include "general-script-def.hh"
13 #include "text-def.hh"
14
15
16 Script_engraver::Script_engraver()
17 {
18   do_post_move_processing();
19 }
20
21 bool
22 Script_engraver::do_try_request (Request *r_l)
23 {
24   if (!dynamic_cast <Musical_script_req *> (r_l))
25     return false ;
26   
27   for (int i=0; i < script_req_l_arr_.size(); i++) 
28     {
29       if (r_l->equal_b (script_req_l_arr_[i]))
30         return true;
31     }
32   script_req_l_arr_.push (dynamic_cast <Script_req *> (r_l));
33   
34   return true;
35 }
36
37 void
38 Script_engraver::do_process_requests()
39 {
40   if (script_p_arr_.size ())
41     return ;
42   
43   for (int i=0; i < script_req_l_arr_.size(); i++)
44     {
45       Script_req* l=script_req_l_arr_[i];
46       Script *p =new Script;
47       p->dir_ = l->dir_;
48       p->specs_p_ = l->scriptdef_p_->clone ();
49       script_p_arr_.push (p);
50       announce_element (Score_element_info (p, l));
51     }
52 }
53
54 void
55 Script_engraver::do_pre_move_processing()
56 {
57   Staff_symbol* s_l = get_staff_info().staff_sym_l_;
58   for (int i=0; i < script_p_arr_.size(); i++) 
59     {
60       Script*script_p = script_p_arr_[i];
61       if (!script_p->specs_p_->inside_b())
62         script_p->add_support (s_l);
63
64       if (dynamic_cast<Text_def *> (script_p->specs_p_)) // UGH
65         {
66           Text_def * td_l = (Text_def*)script_p->specs_p_;
67           Scalar style = get_property ("textstyle");
68           if (style.to_bool ())
69             {
70               td_l->style_str_= style;
71             }
72           Scalar alignment = get_property ("textalignment");
73           if (alignment.isnum_b())
74             {
75               td_l->align_dir_= (Direction)(int)alignment;
76             }
77         }
78       typeset_element (script_p);
79     }
80   script_p_arr_.clear();
81 }
82
83 void
84 Script_engraver::do_post_move_processing()
85 {
86   script_req_l_arr_.clear();
87 }
88
89
90 IMPLEMENT_IS_TYPE_B1(Script_engraver,Engraver);
91 ADD_THIS_TRANSLATOR(Script_engraver);