lilypond-1.3.74
[lilypond.git] / lily / axis-group-engraver.cc
blobca6f5fb359fe8c6544102647ce32c4705d97edb8
1 /*
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>
7 */
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"
15 /**
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
21 protected:
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 public:
30 VIRTUAL_COPY_CONS(Translator);
31 Axis_group_engraver ();
34 ADD_THIS_TRANSLATOR(Axis_group_engraver);
36 Axis_group_engraver::Axis_group_engraver ()
38 staffline_p_ = 0;
41 void
42 Axis_group_engraver::do_creation_processing ()
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);
48 Score_element * it = unsmob_element (get_property ("currentCommandColumn"));
49 Pointer_group_interface (it, "bounded-by-me").add_element (staffline_p_);
50 staffline_p_->set_bound(LEFT,it);
52 announce_element (staffline_p_, 0);
55 Spanner*
56 Axis_group_engraver::get_spanner_p () const
58 return new Spanner (get_property ("basicVerticalAxisGroupProperties"));
61 void
62 Axis_group_engraver::do_removal_processing ()
64 String type = daddy_grav_l ()->type_str_ ;
65 SCM dims = get_property ((type + "VerticalExtent").ch_C());
67 if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
68 && gh_number_p (gh_cdr (dims)))
70 staffline_p_->set_extent_callback (&Score_element::preset_extent, Y_AXIS);
71 staffline_p_->set_elt_property ("extent-Y", dims);
74 dims = get_property ((type + "MinimumVerticalExtent").ch_C());
75 if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
76 && gh_number_p (gh_cdr (dims)))
77 staffline_p_->set_elt_property ("minimum-extent-Y", dims);
79 dims = get_property ((type + "ExtraVerticalExtent").ch_C());
80 if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
81 && gh_number_p (gh_cdr (dims)))
82 staffline_p_->set_elt_property ("extra-extent-Y", dims);
84 Score_element * it = unsmob_element (get_property ("currentCommandColumn"));
86 Pointer_group_interface (it, "bounded-by-me").add_element (staffline_p_);
87 staffline_p_->set_bound(RIGHT,it);
89 typeset_element (staffline_p_);
90 staffline_p_ = 0;
93 void
94 Axis_group_engraver::acknowledge_element (Score_element_info i)
96 elts_.push (i.elem_l_);
99 void
100 Axis_group_engraver::process_acknowledged ()
102 /* UGH UGH UGH */
103 for (int i=0; i < elts_.size (); i++)
105 Score_element *par = elts_[i]->parent_l (Y_AXIS);
107 if ((!par || !Axis_group_interface::has_interface (par))
108 && ! elts_[i]->empty_b (Y_AXIS))
109 Axis_group_interface::add_element (staffline_p_, elts_[i]);
111 elts_.clear ();
115 ////////////////////////////////////////////////////////
117 // maybenot sucsh a good idea after all.
119 #include "hara-kiri-group-spanner.hh"
120 #include "rhythmic-head.hh"
122 class Hara_kiri_engraver : public Axis_group_engraver
124 protected:
125 virtual Spanner*get_spanner_p ()const;
126 virtual void acknowledge_element (Score_element_info);
127 public:
128 VIRTUAL_COPY_CONS(Translator);
131 Spanner*
132 Hara_kiri_engraver::get_spanner_p () const
134 Spanner * sp = new Spanner (get_property ("basicHaraKiriVerticalGroupspannerProperties"));
135 Hara_kiri_group_spanner::set_interface (sp);
136 return sp;
139 void
140 Hara_kiri_engraver::acknowledge_element (Score_element_info i)
142 Axis_group_engraver::acknowledge_element (i);
143 if (Rhythmic_head::has_interface (i.elem_l_))
145 Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.elem_l_);
148 ADD_THIS_TRANSLATOR(Hara_kiri_engraver);