/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2009--2010 Joe Neeman <joeneeman@gmail.com>
+ Copyright (C) 2009--2012 Joe Neeman <joeneeman@gmail.com>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "staff-grouper-interface.hh"
#include "hara-kiri-group-spanner.hh"
+#include "page-layout-problem.hh"
#include "pointer-group-interface.hh"
-Grob*
-Staff_grouper_interface::get_maybe_pure_last_grob (Grob *me, bool pure, int start, int end)
+/* Checks whether the child grob is in the "interior" of this staff-grouper.
+ This is the case if the next spaceable, living child after the given one
+ belongs to the group.
+*/
+bool
+Staff_grouper_interface::maybe_pure_within_group (Grob *me, Grob *child, bool pure, int start, int end)
{
extract_grob_set (me, "elements", elts);
- for (vsize i = elts.size (); i--;)
- if ((pure && !Hara_kiri_group_spanner::request_suicide (me, start, end))
- || (!pure && elts[i]->is_live ()))
- return elts[i];
- return 0;
+ vector<Grob *>::const_iterator i = find (elts, child);
+
+ if (i == elts.end ())
+ return false;
+
+ for (++i; i != elts.end (); ++i)
+ if (Page_layout_problem::is_spaceable (*i)
+ && ((pure && !Hara_kiri_group_spanner::request_suicide (*i, start, end))
+ || (!pure && (*i)->is_live ())))
+ return me == unsmob_grob ((*i)->get_object ("staff-grouper"));
+
+ // If there was no spaceable, living child after me, I don't
+ // count as within the group.
+ return false;
}
ADD_INTERFACE (Staff_grouper_interface,
- "A grob that collects staves together.",
+ "A grob that collects staves together.",
- /* properties */
- "between-staff-spacing "
- "after-last-staff-spacing "
- );
+ /* properties */
+ "staff-staff-spacing "
+ "staffgroup-staff-spacing "
+ );