2 axis-group-engraver.cc -- implement Axis_group_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "paper-column.hh"
11 #include "axis-group-interface.hh"
12 #include "engraver.hh"
13 #include "engraver-group-engraver.hh"
16 Put stuff in a Spanner with an Axis_group_interface.
17 Use as last element of a context.
19 class Axis_group_engraver : public Engraver
22 Spanner *staffline_p_;
23 Link_array<Score_element> elts_;
24 virtual void do_creation_processing();
25 virtual void do_removal_processing();
26 virtual void acknowledge_element (Score_element_info);
27 virtual void process_acknowledged ();
28 virtual Spanner* get_spanner_p () const;
29 virtual void add_element (Score_element*) ;
32 VIRTUAL_COPY_CONS(Translator);
33 Axis_group_engraver ();
36 ADD_THIS_TRANSLATOR(Axis_group_engraver);
38 Axis_group_engraver::Axis_group_engraver ()
44 Axis_group_engraver::do_creation_processing ()
46 staffline_p_ = get_spanner_p ();
47 Axis_group_interface::set_interface (staffline_p_);
48 Axis_group_interface::set_axes (staffline_p_, Y_AXIS, Y_AXIS);
50 Score_element * it = unsmob_element (get_property ("currentCommandColumn"));
51 Pointer_group_interface (it, "bounded-by-me").add_element (staffline_p_);
52 staffline_p_->set_bound(LEFT,it);
54 announce_element (staffline_p_, 0);
58 Axis_group_engraver::get_spanner_p () const
60 return new Spanner (get_property ("basicVerticalAxisGroupProperties"));
64 Axis_group_engraver::do_removal_processing ()
66 String type = daddy_grav_l ()->type_str_ ;
67 SCM dims = get_property ((type + "VerticalExtent").ch_C());
69 if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
70 && gh_number_p (gh_cdr (dims)))
72 staffline_p_->set_extent_callback (&Score_element::preset_extent, Y_AXIS);
73 staffline_p_->set_elt_property ("extent-Y", dims);
76 dims = get_property ((type + "MinimumVerticalExtent").ch_C());
77 if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
78 && gh_number_p (gh_cdr (dims)))
79 staffline_p_->set_elt_property ("minimum-extent-Y", dims);
81 dims = get_property ((type + "ExtraVerticalExtent").ch_C());
82 if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
83 && gh_number_p (gh_cdr (dims)))
84 staffline_p_->set_elt_property ("extra-extent-Y", dims);
86 Score_element * it = unsmob_element (get_property ("currentCommandColumn"));
88 Pointer_group_interface (it, "bounded-by-me").add_element (staffline_p_);
89 staffline_p_->set_bound(RIGHT,it);
91 typeset_element (staffline_p_);
96 Axis_group_engraver::acknowledge_element (Score_element_info i)
98 elts_.push (i.elem_l_);
102 Axis_group_engraver::process_acknowledged ()
105 for (int i=0; i < elts_.size (); i++)
107 Score_element *par = elts_[i]->parent_l (Y_AXIS);
109 if ((!par || !Axis_group_interface::has_interface (par))
110 && ! elts_[i]->empty_b (Y_AXIS))
111 add_element (elts_[i]);
117 Axis_group_engraver::add_element (Score_element*e)
119 Axis_group_interface::add_element (staffline_p_, e);
122 ////////////////////////////////////////////////////////
124 // maybenot sucsh a good idea after all.
126 #include "hara-kiri-group-spanner.hh"
127 #include "rhythmic-head.hh"
129 class Hara_kiri_engraver : public Axis_group_engraver
132 virtual Spanner*get_spanner_p ()const;
133 virtual void acknowledge_element (Score_element_info);
134 virtual void add_element (Score_element *e);
136 VIRTUAL_COPY_CONS(Translator);
140 Hara_kiri_engraver::add_element (Score_element*e)
142 Hara_kiri_group_spanner::add_element (staffline_p_, e);
147 Hara_kiri_engraver::get_spanner_p () const
149 Spanner * sp = new Spanner (get_property ("basicHaraKiriVerticalGroupspannerProperties"));
150 Hara_kiri_group_spanner::set_interface (sp);
155 Hara_kiri_engraver::acknowledge_element (Score_element_info i)
157 Axis_group_engraver::acknowledge_element (i);
158 if (Rhythmic_head::has_interface (i.elem_l_))
160 Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.elem_l_);
163 ADD_THIS_TRANSLATOR(Hara_kiri_engraver);