]> git.donarmstrong.com Git - lilypond.git/blob - lily/mark-engraver.cc
release: 1.3.30
[lilypond.git] / lily / mark-engraver.cc
1 /*
2   mark-engraver.cc -- implement Mark_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6  (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "command-request.hh"
10 #include "bar-script-engraver.hh"
11 #include "engraver-group-engraver.hh"
12 #include "text-item.hh"
13
14 /**Print rehearsal marks.
15   */
16 class Mark_engraver : public Bar_script_engraver 
17 {
18 public:
19   Mark_engraver ();
20   VIRTUAL_COPY_CONS(Translator);
21 protected:
22   virtual bool do_try_music (Music *req_l);
23   virtual void do_process_requests ();
24   virtual void do_post_move_processing ();
25 private:
26   Mark_req * mark_req_l_;
27 };
28
29
30 ADD_THIS_TRANSLATOR (Mark_engraver);
31
32 Mark_engraver::Mark_engraver ()
33 {
34   mark_req_l_ = 0;
35   axis_ = Y_AXIS;
36   type_ = "mark";
37 }
38
39 void
40 Mark_engraver::do_post_move_processing ()
41 {
42   mark_req_l_ = 0;
43 }
44
45
46 bool
47 Mark_engraver::do_try_music (Music* r_l)
48 {
49   if (Mark_req *mr = dynamic_cast <Mark_req *> (r_l))
50     {
51       if (mark_req_l_ && mr->equal_b (mark_req_l_))
52         return true;
53       if (mark_req_l_)
54         return false;
55       mark_req_l_ = mr;
56       return true;
57     }
58   return false;
59 }
60
61 void
62 Mark_engraver::do_process_requests ()
63 {
64   if (mark_req_l_)
65     {
66       create_items (mark_req_l_);
67
68       String t;
69
70       SCM m = (mark_req_l_->mark_label_ == SCM_UNDEFINED)
71         ? get_property ("rehearsalMark")
72         : SCM(mark_req_l_->mark_label_);
73       
74       if (gh_number_p (m))
75         {
76           int mark_count = gh_scm2int (m);
77           t = to_str (mark_count);
78           mark_count ++;
79           m = gh_int2scm (mark_count);
80         }
81       else if (gh_string_p (m))
82         {
83           t = ly_scm2string (m);
84           String next;
85           if (t.length_i ())
86             {
87               char c = t[0];
88               c++;
89               next = to_str (c);
90             }
91           m = ly_str02scm (next.ch_C());
92         }
93       else
94         {
95           m = gh_int2scm (1);
96         }
97           
98       daddy_trans_l_->set_property ("rehearsalMark", m);
99
100       
101       text_p_->set_elt_property ("text",
102                                  ly_str02scm ( t.ch_C()));
103       SCM st = ly_str02scm ((t.index_any_i ("0123456789")  >= 0 )
104                             ? "mark" : "large");
105       text_p_->set_elt_property ("style",  st);
106     }
107 }
108