]> git.donarmstrong.com Git - lilypond.git/blob - lily/axis-group-element.cc
a0ea8abb995594add49b27ec4856dc08cd1b7496
[lilypond.git] / lily / axis-group-element.cc
1 /*
2   axis-group-element.cc -- implement Axis_group_element
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "axis-group-element.hh"
10 #include "graphical-axis-group.hh"
11 #include "dimension-cache.hh"
12
13 Link_array<Score_element>
14 Axis_group_element::get_extra_dependencies() const
15 {
16   Link_array<Score_element> e(elem_l_arr ());
17   return e;
18 }
19
20 Link_array<Score_element>
21 Axis_group_element::elem_l_arr () const
22 {  
23   /*
24     ugh. I know
25   */
26   Link_array<Score_element> r;
27   for (int i=0; i < elem_l_arr_.size (); i++)
28     r.push (dynamic_cast<Score_element*>(elem_l_arr_[i]));
29       
30   return r;
31 }
32
33 Link_array<Score_element> 
34 Axis_group_element::get_children ()
35 {
36   Link_array<Score_element> childs;
37   Link_array<Score_element> elems = elem_l_arr ();
38
39   elems.concat (extra_elems_ );
40   for (int i=0; i < elems.size (); i++) 
41     {
42       Score_element* e = elems[i];
43       childs.push (e) ;
44       Axis_group_element * axis_group= dynamic_cast <Axis_group_element *> (e);
45       if (axis_group)
46         childs.concat (axis_group->get_children ());      
47     }
48   
49   return childs;
50 }
51
52 void
53 Axis_group_element::do_print() const
54 {
55   Graphical_axis_group::do_print();
56 }
57
58 Axis_group_element::Axis_group_element()
59 {
60   set_elt_property (transparent_scm_sym, SCM_BOOL_T);
61 }
62
63 void
64 Axis_group_element::set_axes (Axis a1, Axis a2)
65 {
66   Graphical_axis_group::set_axes (a1,a2);
67   set_empty (a1 != X_AXIS && a2 != X_AXIS, X_AXIS);
68   set_empty (a1 != Y_AXIS && a2 != Y_AXIS, Y_AXIS);
69 }
70
71
72 void
73 Axis_group_element::do_substitute_element_pointer (Score_element*o,
74                                                    Score_element*n)
75 {
76   int i;
77   Graphical_element * go = o;
78   Graphical_element * gn = n;  
79   
80   while ((i = elem_l_arr_.find_i (go))>=0)
81     elem_l_arr_.substitute (go,gn);
82
83   extra_elems_.substitute (o, n);
84 }
85
86 Interval
87 Axis_group_element::extra_extent (Axis a )const
88 {
89   Interval g;
90   Axis_group_element* urg = (Axis_group_element*)this;
91   urg->purge_extra ();          // Yeah yeah,  const correctness.
92   for (int i=0;  i < extra_elems_.size (); i++)
93     {
94       Interval ge = extra_elems_[i]->relative_coordinate (this, a)
95         + extra_elems_[i]->extent (a);
96       g.unite (ge);
97     }
98   return g;
99 }
100
101 Interval
102 Axis_group_element::do_height () const
103 {
104   Interval gag = Graphical_axis_group::extent (Y_AXIS);
105   gag.unite (extra_extent (Y_AXIS));
106   return gag;
107 }
108
109 Interval
110 Axis_group_element::do_width () const
111 {
112   Interval gag = Graphical_axis_group::extent (X_AXIS);
113   gag.unite (extra_extent (X_AXIS));
114   return gag;
115 }
116
117
118 /*
119   UGH.
120  */
121 void
122 Axis_group_element::add_extra_element (Score_element *e)
123 {
124   Link_array<Score_element> se;
125   while (e && e != this)
126     {
127       se.push (e);
128       e = dynamic_cast<Score_element*> (e->parent_l (Y_AXIS));
129     }
130
131   if (1)                        // e == this)
132     {
133       for (int i=0; i < se.size( ); i++) 
134         {
135           extra_elems_.push (se[i]);
136           add_dependency (se[i]);
137           se[i]->set_elt_property (ly_symbol ("Axis_group_element::add_extra_element"), SCM_BOOL_T); // UGH GUH.
138         }
139       
140     }
141 }
142
143 /*
144   UGH GUH
145  */
146 void
147 Axis_group_element::purge_extra ()
148 {
149   for (int i=0; i < extra_elems_.size ();)
150     {
151       Score_element *e = extra_elems_[i];
152       while (e && e != this)
153         {
154           e = dynamic_cast<Score_element*> (e->parent_l (Y_AXIS));
155         }
156       if (e != this)
157         extra_elems_.del (i);
158       else
159         i++;
160     }
161 }
162
163 Interval
164 Axis_group_element::extent (Axis a) const
165 {
166   return Graphical_element::extent (a);
167 }
168