+ Pointer_group_interface::add_grob (me, ly_symbol2scm ("conditional-elements"), e);
+}
+
+Real
+Separation_item::set_distance (Item *l, Item *r, Real padding)
+{
+ Drul_array<Skyline_pair*> lines (Skyline_pair::unsmob (l->get_property ("horizontal-skylines")),
+ Skyline_pair::unsmob (r->get_property ("horizontal-skylines")));
+ Skyline right = conditional_skyline (r, l);
+ right.merge ((*lines[RIGHT])[LEFT]);
+
+ Real dist = padding + (*lines[LEFT])[RIGHT].distance (right);
+ if (dist > 0)
+ {
+ Rod rod;
+
+ rod.item_drul_ = Drul_array<Item*> (l, r);
+
+ rod.distance_ = dist;
+ rod.add_to_cols ();
+ }
+
+ return max (dist, 0.0);
+}
+
+bool
+Separation_item::is_empty (Grob *me)
+{
+ Skyline_pair *sky = Skyline_pair::unsmob (me->get_property ("horizontal-skylines"));
+ return (!sky || sky->is_empty ());
+}
+
+/*
+ Return the width of ME given that we are considering the object on
+ the LEFT.
+*/
+Skyline
+Separation_item::conditional_skyline (Grob *me, Grob *left)
+{
+ vector<Box> bs = boxes (me, left);
+ return Skyline (bs, 0.1, Y_AXIS, LEFT);
+}
+
+
+MAKE_SCHEME_CALLBACK (Separation_item, calc_skylines,1);
+SCM
+Separation_item::calc_skylines (SCM smob)
+{
+ Item *me = unsmob_item (smob);
+ vector<Box> bs = boxes (me, 0);
+ /* todo: the horizon_padding is somewhat arbitrary */
+ return Skyline_pair (bs, 0.1, Y_AXIS).smobbed_copy ();