]> git.donarmstrong.com Git - lilypond.git/blob - lily/separating-line-group-engraver.cc
release: 1.5.7
[lilypond.git] / lily / separating-line-group-engraver.cc
1 /*   
2 '  separating-line-group-engraver.cc --  implement Separating_line_group_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1998--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "separating-group-spanner.hh"
11 #include "separation-item.hh"
12 #include "paper-column.hh"
13 #include "paper-def.hh"
14 #include "engraver.hh"
15 #include "axis-group-interface.hh"
16
17 class Separating_line_group_engraver : public Engraver
18 {
19 protected:
20   Item * break_malt_p_;
21   Item * musical_malt_p_;
22
23   Spanner * sep_span_p_;
24   
25   virtual void acknowledge_grob (Grob_info);
26   virtual void initialize ();
27   virtual void finalize ();
28   virtual void stop_translation_timestep ();
29 public:
30   Separating_line_group_engraver ();
31   VIRTUAL_COPY_CONS (Translator);
32 };
33
34 Separating_line_group_engraver::Separating_line_group_engraver ()
35 {
36   sep_span_p_ = 0;
37   break_malt_p_ = 0;
38   musical_malt_p_ =0;
39 }
40
41 void
42 Separating_line_group_engraver::initialize ()
43 {
44   sep_span_p_ = new Spanner (get_property ("SeparatingGroupSpanner"));
45
46   announce_grob (sep_span_p_, 0);
47   sep_span_p_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
48 }
49
50 void
51 Separating_line_group_engraver::finalize ()
52 {
53   sep_span_p_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
54   typeset_grob (sep_span_p_);
55   sep_span_p_ =0;
56 }
57
58 void
59 Separating_line_group_engraver::acknowledge_grob (Grob_info i)
60 {
61   Item * it = dynamic_cast <Item *> (i.elem_l_);
62   if (!it)
63     return;
64   if (it->parent_l (X_AXIS)
65       && it->parent_l (X_AXIS)->has_extent_callback_b
66  (Axis_group_interface::group_extent_callback_proc, X_AXIS))
67     return;
68
69   
70   bool ib =Item::breakable_b (it);
71   Item *&p_ref_ (ib ? break_malt_p_
72                  : musical_malt_p_);
73
74   if (!p_ref_)
75     {
76       p_ref_ = new Item
77  (get_property ("SeparationItem"));
78           
79       if (ib)
80         p_ref_->set_grob_property ("breakable", SCM_BOOL_T);
81       announce_grob (p_ref_, 0);
82     }
83   Separation_item::add_item (p_ref_,it);
84 }
85
86 void
87 Separating_line_group_engraver::stop_translation_timestep ()
88 {
89   if (break_malt_p_)
90     {
91       Separating_group_spanner::add_spacing_unit (sep_span_p_, break_malt_p_);
92       
93       typeset_grob (break_malt_p_);
94       break_malt_p_ =0;
95     }
96
97   if (musical_malt_p_)
98     {
99       Separating_group_spanner::add_spacing_unit (sep_span_p_, musical_malt_p_);
100       typeset_grob (musical_malt_p_);
101     }
102
103   musical_malt_p_ =0;
104 }
105
106
107
108 ADD_THIS_TRANSLATOR (Separating_line_group_engraver);
109