]> git.donarmstrong.com Git - lilypond.git/blob - lily/bar-engraver.cc
release: 1.3.110
[lilypond.git] / lily / bar-engraver.cc
1 /*
2   bar-engraver.cc -- implement Bar_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   Jan Nieuwenhuizen <janneke@gnu.org>
8 */
9
10 #include "bar.hh"
11 #include "score-engraver.hh"
12 #include "musical-request.hh"
13 #include "engraver-group-engraver.hh"
14 #include "warn.hh"
15 #include "item.hh"
16 #include "engraver.hh"
17
18 /*
19   generate bars. Either user ("|:"), or default (new measure)
20
21   */
22 class Bar_engraver : public Engraver
23 {
24 public:
25   Bar_engraver();
26   VIRTUAL_COPY_CONS(Translator);
27   void request_bar (String type_str);
28     
29 protected:
30   virtual void finalize ();
31   virtual void stop_translation_timestep();
32   virtual void create_grobs ();
33
34 private:
35   void typeset_bar ();
36   void create_bar ();
37
38   Item * bar_p_;
39 };
40
41 Bar_engraver::Bar_engraver()
42 {
43   bar_p_ =0;
44 }
45
46 void
47 Bar_engraver::create_bar ()
48 {
49   if (!bar_p_)
50     {
51       bar_p_ = new Item (get_property ("BarLine"));
52
53       SCM gl = get_property ("whichBar");
54       if (scm_equal_p (gl, bar_p_->get_grob_property ("glyph")) != SCM_BOOL_T)
55           bar_p_->set_grob_property ("glyph", gl);
56       
57       announce_grob (bar_p_, 0);
58     }
59 }
60
61 void
62 Bar_engraver::finalize ()
63 {
64   typeset_bar ();
65 }
66
67 /*
68   Bar_engraver should come *after* any engravers that expect bars to
69   modify whichBar in  deprecated_process_music () be typeset
70 */
71 void
72 Bar_engraver::create_grobs ()
73 {
74   if (!bar_p_ && gh_string_p (get_property ("whichBar")))
75     {
76       create_bar ();
77     }
78 }
79
80 void
81 Bar_engraver::typeset_bar ()
82 {
83   if (bar_p_) 
84     {
85       typeset_grob (bar_p_);
86       bar_p_ =0;
87     }
88 }
89
90 /*
91   lines may only be broken if there is a barline in all staffs 
92 */
93 void 
94 Bar_engraver::stop_translation_timestep()
95 {
96   if (!bar_p_)
97     {
98       Score_engraver * e = 0;
99       Translator * t  =  daddy_grav_l ();
100       for (; !e && t;  t = t->daddy_trans_l_)
101         {
102           e = dynamic_cast<Score_engraver*> (t);
103         }
104
105       if (!e)
106         programming_error ("No score engraver!");
107       else
108         e->forbid_breaks ();    // guh. Use properties!
109     }
110   else
111     typeset_bar ();
112 }
113
114 ADD_THIS_TRANSLATOR(Bar_engraver);