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;
30 VIRTUAL_COPY_CONS(Translator
);
31 Axis_group_engraver ();
34 ADD_THIS_TRANSLATOR(Axis_group_engraver
);
36 Axis_group_engraver::Axis_group_engraver ()
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);
56 Axis_group_engraver::get_spanner_p () const
58 return new Spanner (get_property ("basicVerticalAxisGroupProperties"));
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_
);
94 Axis_group_engraver::acknowledge_element (Score_element_info i
)
96 elts_
.push (i
.elem_l_
);
100 Axis_group_engraver::process_acknowledged ()
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
]);
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
125 virtual Spanner
*get_spanner_p ()const;
126 virtual void acknowledge_element (Score_element_info
);
128 VIRTUAL_COPY_CONS(Translator
);
132 Hara_kiri_engraver::get_spanner_p () const
134 Spanner
* sp
= new Spanner (get_property ("basicHaraKiriVerticalGroupspannerProperties"));
135 Hara_kiri_group_spanner::set_interface (sp
);
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
);