]> git.donarmstrong.com Git - lilypond.git/blob - lily/separating-line-group-engraver.cc
release: 1.5.13
[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   TRANSLATOR_DECLARATIONS(Separating_line_group_engraver);
31 };
32
33 Separating_line_group_engraver::Separating_line_group_engraver ()
34 {
35   sep_span_p_ = 0;
36   break_malt_p_ = 0;
37   musical_malt_p_ =0;
38 }
39
40 void
41 Separating_line_group_engraver::initialize ()
42 {
43   sep_span_p_ = new Spanner (get_property ("SeparatingGroupSpanner"));
44
45   announce_grob (sep_span_p_, 0);
46   sep_span_p_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
47 }
48
49 void
50 Separating_line_group_engraver::finalize ()
51 {
52   sep_span_p_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
53   typeset_grob (sep_span_p_);
54   sep_span_p_ =0;
55 }
56
57 void
58 Separating_line_group_engraver::acknowledge_grob (Grob_info i)
59 {
60   Item * it = dynamic_cast <Item *> (i.grob_l_);
61   if (!it)
62     return;
63   if (it->parent_l (X_AXIS)
64       && it->parent_l (X_AXIS)->has_extent_callback_b
65  (Axis_group_interface::group_extent_callback_proc, X_AXIS))
66     return;
67
68   
69   bool ib =Item::breakable_b (it);
70   Item *&p_ref_ (ib ? break_malt_p_
71                  : musical_malt_p_);
72
73   if (!p_ref_)
74     {
75       p_ref_ = new Item
76  (get_property ("SeparationItem"));
77           
78       if (ib)
79         p_ref_->set_grob_property ("breakable", SCM_BOOL_T);
80       announce_grob (p_ref_, 0);
81     }
82   Separation_item::add_item (p_ref_,it);
83 }
84
85 void
86 Separating_line_group_engraver::stop_translation_timestep ()
87 {
88   if (break_malt_p_)
89     {
90       Separating_group_spanner::add_spacing_unit (sep_span_p_, break_malt_p_);
91       
92       typeset_grob (break_malt_p_);
93       break_malt_p_ =0;
94     }
95
96   if (musical_malt_p_)
97     {
98       Separating_group_spanner::add_spacing_unit (sep_span_p_, musical_malt_p_);
99       typeset_grob (musical_malt_p_);
100     }
101
102   musical_malt_p_ =0;
103 }
104
105
106
107
108
109 ENTER_DESCRIPTION(Separating_line_group_engraver,
110 /* descr */       "Generates objects for computing spacing parameters.",
111 /* creats*/       "SeparationItem SeparatingGroupSpanner",
112 /* acks  */       "grob-interface",
113 /* reads */       "",
114 /* write */       "");