+ if (gh_pair_p (right_neighbors))
+ {
+ cols[i]->set_grob_property ("right-neighbors", right_neighbors);
+ }
+ }
+}
+
+/*
+ Set neighboring columns that have no left/right-neighbor set
+ yet. Only do breakable non-musical columns, and musical columns.
+*/
+void
+Spacing_spanner::set_implicit_neighbor_columns (Link_array<Grob> cols)
+{
+ for (int i = 0; i < cols.size (); i++)
+ {
+ Item * it = dynamic_cast<Item*>(cols[i]);
+ if (!Item::breakable_b (it) && !Paper_column::musical_b (it))
+ continue;
+
+ // it->breakable || it->musical
+
+ /*
+ sloppy with typnig left/right-neighbors should take list, but paper-column found instead.
+ */
+ SCM ln = cols[i] ->get_grob_property ("left-neighbors");
+ if (!gh_pair_p (ln) && i )
+ {
+ cols[i]->set_grob_property ("left-neighbors", gh_cons (cols[i-1]->self_scm(), SCM_EOL));
+ }
+
+ SCM rn = cols[i] ->get_grob_property ("right-neighbors");
+ if (!gh_pair_p (rn) && i < cols.size () - 1)
+ {
+ cols[i]->set_grob_property ("right-neighbors", gh_cons (cols[i + 1]->self_scm(), SCM_EOL));
+ }
+ }
+}
+
+
+MAKE_SCHEME_CALLBACK (Spacing_spanner, set_springs,1);
+SCM
+Spacing_spanner::set_springs (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+
+ Link_array<Grob> all (me->pscore_->system_->columns ());
+
+ set_explicit_neighbor_columns (all);
+
+ SCM preset_shortest = me->get_grob_property ("common-shortest-duration");
+ Rational global_shortest;
+ if (unsmob_moment (preset_shortest))
+ {
+ global_shortest = unsmob_moment (preset_shortest)->main_part_;
+ }
+ else
+ {
+ global_shortest = find_shortest (me, all);
+ if (verbose_global_b)
+ {
+ progress_indication (_f("Global shortest duration is %s\n", global_shortest.to_string ()));
+ }
+ }
+ prune_loose_columns (me, &all, global_shortest);
+ set_implicit_neighbor_columns (all);
+
+
+ int j = 0;
+ for (int i = 1; i < all.size (); i++)
+ {
+ Grob *sc = all[i];
+ if (Item::breakable_b (sc))
+ {
+ Link_array<Grob> measure (all.slice (j, i+1));
+ do_measure (global_shortest, me, &measure);
+ j = i;
+ }
+ }
+
+ return SCM_UNSPECIFIED;
+}