]> git.donarmstrong.com Git - lilypond.git/blob - lily/axis-group-engraver.cc
release: 1.5.29
[lilypond.git] / lily / axis-group-engraver.cc
1 /*   
2   axis-group-engraver.cc --  implement Axis_group_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7  */
8
9 #include "spanner.hh"
10 #include "paper-column.hh"
11 #include "axis-group-interface.hh"
12 #include "engraver.hh"
13 #include "engraver-group-engraver.hh"
14
15 /**
16    Put stuff in a Spanner with an Axis_group_interface.
17    Use as last element of a context. 
18  */
19 class Axis_group_engraver : public Engraver
20 {
21 protected:
22   Spanner *staffline_p_;
23   Link_array<Grob> elts_;
24   virtual void initialize ();
25   virtual void finalize ();
26   virtual void acknowledge_grob (Grob_info);
27   virtual void create_grobs ();
28   virtual Spanner* get_spanner_p () const;
29   virtual void add_element (Grob*) ;
30 public:  
31 TRANSLATOR_DECLARATIONS(Axis_group_engraver );
32 };
33
34
35
36 Axis_group_engraver::Axis_group_engraver ()
37 {
38   staffline_p_ = 0;
39 }
40
41 void
42 Axis_group_engraver::initialize ()
43 {
44   staffline_p_ = get_spanner_p ();
45   Axis_group_interface::set_interface (staffline_p_);
46   Axis_group_interface::set_axes (staffline_p_, Y_AXIS, Y_AXIS);
47
48   Grob *  it = unsmob_grob (get_property ("currentCommandColumn"));
49
50   staffline_p_->set_bound (LEFT,it);
51
52   announce_grob (staffline_p_, 0);
53 }
54
55 Spanner*
56 Axis_group_engraver::get_spanner_p () const
57 {
58   return new Spanner (get_property ("VerticalAxisGroup"));
59 }
60
61 void
62 Axis_group_engraver::finalize ()
63 {
64   String type = daddy_grav_l ()->type_str_ ;
65   SCM dims = get_property ("VerticalExtent");
66   
67   if (gh_pair_p (dims) && gh_number_p (ly_car (dims))
68       && gh_number_p (ly_cdr (dims)))
69     {
70       staffline_p_->set_extent_callback (Grob::preset_extent_proc, Y_AXIS);
71       staffline_p_->set_grob_property ("extent-Y", dims);
72     }
73
74   dims = get_property ("MinimumVerticalExtent");
75   if (gh_pair_p (dims) && gh_number_p (ly_car (dims))
76       && gh_number_p (ly_cdr (dims)))
77     staffline_p_->set_grob_property ("minimum-extent-Y", dims);
78
79   dims = get_property ("ExtraVerticalExtent");
80   if (gh_pair_p (dims) && gh_number_p (ly_car (dims))
81       && gh_number_p (ly_cdr (dims)))
82     staffline_p_->set_grob_property ("extra-extent-Y", dims);
83
84   Grob *  it = unsmob_grob (get_property ("currentCommandColumn"));
85
86
87   staffline_p_->set_bound (RIGHT,it);
88
89   typeset_grob (staffline_p_);
90   staffline_p_ = 0;
91 }
92
93 void
94 Axis_group_engraver::acknowledge_grob (Grob_info i)
95 {
96   elts_.push (i.grob_l_);
97 }
98
99 /*
100   maybe should check if our parent_l is set, because we now get a
101   cyclic parent relationship if we have two Axis_group_engravers in
102   the context.  */
103 void
104 Axis_group_engraver::create_grobs ()
105 {
106   /* UGH UGH UGH */
107   for (int i=0; i < elts_.size (); i++)
108     {
109       Grob *par = elts_[i]->get_parent (Y_AXIS);
110
111       if ((!par || !Axis_group_interface::has_interface (par))
112           && ! elts_[i]->empty_b (Y_AXIS))
113         add_element (elts_[i]);
114     }
115   elts_.clear ();
116 }
117
118 void
119 Axis_group_engraver::add_element (Grob*e)
120 {
121   Axis_group_interface::add_element (staffline_p_, e);
122 }
123
124 ////////////////////////////////////////////////////////
125 // maybenot such a good idea after all., to put classes in .cc
126
127 #include "hara-kiri-group-spanner.hh"
128 #include "rhythmic-head.hh"
129
130 class Hara_kiri_engraver : public Axis_group_engraver
131 {
132 protected:
133   virtual Spanner*get_spanner_p ()const;
134   virtual void acknowledge_grob (Grob_info);
135   virtual void add_element (Grob *e);
136 public:
137   TRANSLATOR_DECLARATIONS(Hara_kiri_engraver);
138 };
139
140 void
141 Hara_kiri_engraver::add_element (Grob*e)
142 {
143   Hara_kiri_group_spanner::add_element (staffline_p_, e);
144 }
145
146
147 Spanner*
148 Hara_kiri_engraver::get_spanner_p () const
149 {
150   Spanner * sp = new Spanner (get_property ("HaraKiriVerticalGroup"));
151   Hara_kiri_group_spanner::set_interface (sp);
152   return sp;
153 }
154
155 void
156 Hara_kiri_engraver::acknowledge_grob (Grob_info i)
157 {
158   Axis_group_engraver::acknowledge_grob (i);
159   if (Rhythmic_head::has_interface (i.grob_l_)
160       || i.grob_l_->has_interface (ly_symbol2scm ("lyric-syllable-interface")))
161     {
162       Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.grob_l_);
163     }
164 }
165
166 Hara_kiri_engraver::Hara_kiri_engraver(){}
167
168 ENTER_DESCRIPTION(Hara_kiri_engraver,
169 /* descr */       "Like Axis_group_engraver, but make a hara kiri spanner, and add
170 interesting items (ie. note heads, lyric syllables and normal rests)
171 ",
172 /* creats*/       "HaraKiriVerticalGroup",
173 /* acks  */       "grob-interface",
174 /* reads */       "",
175 /* write */       "");
176
177 ENTER_DESCRIPTION(Axis_group_engraver,
178 /* descr */       "Group all objects created in this context in a VerticalAxisGroup spanner.",
179 /* creats*/       "VerticalAxisGroup",
180 /* acks  */       "grob-interface",
181 /* reads */       "VerticalExtent MinimumVerticalExtent ExtraVerticalExtent",
182 /* write */       "");