]> git.donarmstrong.com Git - lilypond.git/blob - lily/separating-line-group-engraver.cc
patch::: 1.5.4.jcn5
[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 #include <iostream.h>
10
11 #include "separating-group-spanner.hh"
12 #include "separation-item.hh"
13 #include "paper-column.hh"
14 #include "paper-def.hh"
15 #include "engraver.hh"
16 #include "axis-group-interface.hh"
17
18 class Separating_line_group_engraver : public Engraver
19 {
20 protected:
21   Item * break_malt_p_;
22   Item * musical_malt_p_;
23
24   /*
25     malt_p_ : we used to have a Single_malt_grouping_item
26     
27    */
28   Item * last_step_musical_malt_p_;
29   Item * last_nonnil_musical_malt_p_;
30   Item * last_nonnil_break_malt_p_;
31   
32   Spanner * sep_span_p_;
33   
34   virtual void acknowledge_grob (Grob_info);
35   virtual void initialize ();
36   virtual void finalize ();
37   virtual void stop_translation_timestep ();
38 public:
39   Separating_line_group_engraver ();
40   VIRTUAL_COPY_CONS (Translator);
41 };
42
43 Separating_line_group_engraver::Separating_line_group_engraver ()
44 {
45   last_step_musical_malt_p_ = 0;
46   last_nonnil_break_malt_p_ = 0;
47   last_nonnil_musical_malt_p_ = 0;
48   
49   sep_span_p_ = 0;
50   break_malt_p_ = 0;
51   musical_malt_p_ =0;
52 }
53
54 void
55 Separating_line_group_engraver::initialize ()
56 {
57   sep_span_p_ = new Spanner (get_property ("SeparatingGroupSpanner"));
58
59   announce_grob (sep_span_p_, 0);
60   sep_span_p_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
61 }
62
63 void
64 Separating_line_group_engraver::finalize ()
65 {
66   sep_span_p_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
67   typeset_grob (sep_span_p_);
68   sep_span_p_ =0;
69 }
70
71 void
72 Separating_line_group_engraver::acknowledge_grob (Grob_info i)
73 {
74   Item * it = dynamic_cast <Item *> (i.elem_l_);
75   if (!it)
76     return;
77   if (it->parent_l (X_AXIS)
78       && it->parent_l (X_AXIS)->has_extent_callback_b
79  (Axis_group_interface::group_extent_callback_proc, X_AXIS))
80     return;
81
82   
83   bool ib =Item::breakable_b (it);
84   Item *&p_ref_ (ib ? break_malt_p_
85                  : musical_malt_p_);
86
87   if (!p_ref_)
88     {
89       p_ref_ = new Item
90  (get_property ("SeparationItem"));
91           
92       if (ib)
93         p_ref_->set_grob_property ("breakable", SCM_BOOL_T);
94       announce_grob (p_ref_, 0);
95     }
96   Separation_item::add_item (p_ref_,it);
97 }
98
99 void
100 Separating_line_group_engraver::stop_translation_timestep ()
101 {
102   if (break_malt_p_)
103     {
104       Separating_group_spanner::add_spacing_unit (sep_span_p_, break_malt_p_);
105
106       typeset_grob (break_malt_p_);
107
108       last_nonnil_break_malt_p_ = break_malt_p_;
109       break_malt_p_ =0;
110     }
111
112   if (musical_malt_p_)
113     {
114       Separating_group_spanner::add_spacing_unit (sep_span_p_, musical_malt_p_);
115
116
117       /* TODO
118
119          move this mucketry into separation-spanner.
120          
121        */
122       if (last_nonnil_break_malt_p_ && last_nonnil_musical_malt_p_)
123         {
124           cout << now_mom ().str () <<endl;
125           Item *col =     last_nonnil_break_malt_p_->column_l();
126           if (!col)
127             col = dynamic_cast<Item*> (unsmob_grob (get_property ("currentCommandColumn")));
128           
129           SCM between = col->get_grob_property ("between-cols");
130
131           SCM left = last_nonnil_musical_malt_p_->column_l()->self_scm ();
132           SCM right = get_property ("currentMusicalColumn"); // musical_malt_p_->column_l()->self_scm ();
133           if (gh_pair_p (between))
134             {
135               /*
136                 ugh. set_..._x ()
137                */
138               if (Paper_column::rank_i (unsmob_grob (gh_car (between))) < Paper_column::rank_i (unsmob_grob (left)))
139                 gh_set_car_x (between, left);
140               if (Paper_column::rank_i (unsmob_grob (gh_cdr (between))) > Paper_column::rank_i (unsmob_grob (right)))
141                 gh_set_cdr_x (between, right);
142             }
143           else
144             {
145               col->set_grob_property ("between-cols", gh_cons (left, right));
146             }
147         }
148       
149       if (last_step_musical_malt_p_)
150         {
151           Paper_column *col = 
152             last_step_musical_malt_p_->column_l();
153           SCM newtup = gh_cons (last_step_musical_malt_p_->self_scm (),
154                                 musical_malt_p_->self_scm ());
155           col->set_grob_property ("spacing-sequence",
156                                   gh_cons (newtup,
157                                            col->get_grob_property ("spacing-sequence")));
158         }
159
160       
161
162       last_nonnil_break_malt_p_ = 0;
163       last_nonnil_musical_malt_p_ = musical_malt_p_;
164       typeset_grob (musical_malt_p_);
165     }
166   last_step_musical_malt_p_ = musical_malt_p_;
167   musical_malt_p_ =0;
168
169 }
170
171
172
173 ADD_THIS_TRANSLATOR (Separating_line_group_engraver);
174