]> git.donarmstrong.com Git - lilypond.git/blob - lily/axis-group-engraver.cc
patch::: 1.3.77.jcn2
[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--2000 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<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*) ;
30 public:
31   
32   VIRTUAL_COPY_CONS(Translator);
33   Axis_group_engraver ();
34 };
35
36 ADD_THIS_TRANSLATOR(Axis_group_engraver);
37
38 Axis_group_engraver::Axis_group_engraver ()
39 {
40   staffline_p_ = 0;
41 }
42
43 void
44 Axis_group_engraver::do_creation_processing ()
45 {
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);
49
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);
53
54   announce_element (staffline_p_, 0);
55 }
56
57 Spanner*
58 Axis_group_engraver::get_spanner_p () const
59 {
60   return new Spanner (get_property ("basicVerticalAxisGroupProperties"));
61 }
62
63 void
64 Axis_group_engraver::do_removal_processing ()
65 {
66   String type = daddy_grav_l ()->type_str_ ;
67   SCM dims = get_property ((type  + "VerticalExtent").ch_C());
68   
69   if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
70       && gh_number_p (gh_cdr (dims)))
71     {
72       staffline_p_->set_extent_callback (&Score_element::preset_extent, Y_AXIS);
73       staffline_p_->set_elt_property ("extent-Y", dims);
74     }
75
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);
80
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);
85
86 Score_element *  it = unsmob_element (get_property ("currentCommandColumn"));
87
88   Pointer_group_interface (it, "bounded-by-me").add_element (staffline_p_);  
89   staffline_p_->set_bound(RIGHT,it);
90
91   typeset_element (staffline_p_);
92   staffline_p_ = 0;
93 }
94
95 void
96 Axis_group_engraver::acknowledge_element (Score_element_info i)
97 {
98   elts_.push (i.elem_l_);
99 }
100
101 void
102 Axis_group_engraver::process_acknowledged ()
103 {
104   /* UGH UGH UGH */
105   for (int i=0; i < elts_.size (); i++)
106     {
107       Score_element *par = elts_[i]->parent_l (Y_AXIS);
108
109       if ((!par || !Axis_group_interface::has_interface (par))
110           && ! elts_[i]->empty_b (Y_AXIS))
111         add_element (elts_[i]);
112     }
113   elts_.clear ();
114 }
115
116 void
117 Axis_group_engraver::add_element (Score_element*e)
118 {
119   Axis_group_interface::add_element (staffline_p_, e);
120 }
121
122 ////////////////////////////////////////////////////////
123
124 // maybenot sucsh a good idea after all.
125
126 #include "hara-kiri-group-spanner.hh"
127 #include "rhythmic-head.hh"
128
129 class Hara_kiri_engraver : public Axis_group_engraver
130 {
131 protected:
132   virtual Spanner*get_spanner_p ()const;
133   virtual void acknowledge_element (Score_element_info);
134   virtual void add_element (Score_element *e);
135 public:
136   VIRTUAL_COPY_CONS(Translator);
137 };
138
139 void
140 Hara_kiri_engraver::add_element (Score_element*e)
141 {
142   Hara_kiri_group_spanner::add_element (staffline_p_, e);
143 }
144
145
146 Spanner*
147 Hara_kiri_engraver::get_spanner_p () const
148 {
149   Spanner * sp = new Spanner (get_property ("basicHaraKiriVerticalGroupspannerProperties"));
150   Hara_kiri_group_spanner::set_interface (sp);
151   return sp;
152 }
153
154 void
155 Hara_kiri_engraver::acknowledge_element (Score_element_info i)
156 {
157   Axis_group_engraver::acknowledge_element (i);
158   if (Rhythmic_head::has_interface (i.elem_l_))
159     {
160       Hara_kiri_group_spanner::add_interesting_item (staffline_p_, i.elem_l_);
161     }
162 }
163 ADD_THIS_TRANSLATOR(Hara_kiri_engraver);