lilypond-1.3.154
[lilypond.git] / lily / axis-group-interface.cc
blobe133402284f201a9c0e7dcd224802ec2d04cc979
1 /*
2 axis-group-interface.cc -- implement Axis_group_interface
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 */
9 #include "hara-kiri-group-spanner.hh"
10 #include "axis-group-interface.hh"
11 #include "grob.hh"
13 void
14 Axis_group_interface::add_element (Grob*me,Grob *e)
16 for (SCM ax = me->get_grob_property ("axes"); ax != SCM_EOL ; ax = gh_cdr (ax))
18 Axis a = (Axis) gh_scm2int (gh_car (ax));
20 if (!e->parent_l (a))
21 e->set_parent (me, a);
24 Pointer_group_interface::add_element (me, "elements", e);
25 me->add_dependency (e);
28 bool
29 Axis_group_interface::axis_b (Grob*me,Axis a)
32 urg. FIXME, check for Hara_kiri_group_spanner shouldn't be necessary?
36 return me->has_extent_callback_b (group_extent_callback_proc, a) ||
37 (me->has_extent_callback_b (Hara_kiri_group_spanner::y_extent_proc, a));
40 Interval
41 Axis_group_interface::relative_group_extent (Axis a, Grob *common, SCM elts)
43 Interval r;
44 for (SCM s = elts; gh_pair_p (s); s = gh_cdr (s))
46 Grob * se = unsmob_grob (gh_car (s));
47 Interval dims = se->extent (common, a);
48 if (!dims.empty_b ())
49 r.unite (dims);
51 return r;
54 MAKE_SCHEME_CALLBACK (Axis_group_interface,group_extent_callback,2);
55 SCM
56 Axis_group_interface::group_extent_callback (SCM element_smob, SCM scm_axis)
58 Grob *me = unsmob_grob (element_smob);
59 Axis a = (Axis) gh_scm2int (scm_axis);
61 Grob * common = (Grob*) me;
63 for (SCM s = me->get_grob_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
65 Grob * se = unsmob_grob (gh_car (s));
66 common = se->common_refpoint (common, a);
69 Real my_coord = me->relative_coordinate (common, a);
70 Interval r (relative_group_extent (a, common, me->get_grob_property ("elements")));
72 return ly_interval2scm (r - my_coord);
77 void
78 Axis_group_interface::set_axes (Grob*me,Axis a1, Axis a2)
80 // set_interface () ?
81 SCM sa1= gh_int2scm (a1);
82 SCM sa2 = gh_int2scm (a2);
84 SCM axes = me->get_grob_property ("axes");
86 if (!gh_pair_p (axes)
87 || scm_memq (sa1, axes) == SCM_BOOL_F
88 || scm_memq (sa2, axes) == SCM_BOOL_F)
90 SCM ax = gh_cons (sa1, SCM_EOL);
91 if (a1 != a2)
92 ax= gh_cons (sa2, ax);
93 me->set_grob_property ("axes", ax);
96 if (a1 != X_AXIS && a2 != X_AXIS)
97 me->set_extent_callback (SCM_EOL, X_AXIS);
98 if (a1 != Y_AXIS && a2 != Y_AXIS)
99 me->set_extent_callback (SCM_EOL, Y_AXIS);
102 why so convoluted ? (fixme/documentme?)
104 if (me->has_extent_callback_b (Grob::molecule_extent_proc, a1))
105 me->set_extent_callback (Axis_group_interface::group_extent_callback_proc,a1);
106 if (me->has_extent_callback_b (Grob::molecule_extent_proc, a2))
107 me->set_extent_callback (Axis_group_interface::group_extent_callback_proc,a2);
110 Link_array<Grob>
111 Axis_group_interface::get_children (Grob*me)
113 Link_array<Grob> childs;
114 childs.push (me) ;
116 if (!has_interface (me))
117 return childs;
119 for (SCM ep = me->get_grob_property ("elements"); gh_pair_p (ep); ep = gh_cdr (ep))
121 Grob* e = unsmob_grob (gh_car (ep));
122 if (e)
123 childs.concat (Axis_group_interface::get_children (e));
126 return childs;
129 bool
130 Axis_group_interface::has_interface (Grob*me)
132 return me && me->has_interface (ly_symbol2scm ("axis-group-interface"));
137 void
138 Axis_group_interface::set_interface (Grob*me)
140 if (!has_interface (me))
142 me->set_interface (ly_symbol2scm ("axis-group-interface"));