+
+void
+Break_align_interface::order_elements (Grob *grob)
+{
+ Item *me = dynamic_cast<Item*> (grob);
+ SCM elts = me->get_property ("elements");
+ SCM order_vec = me->get_property ("break-align-orders");
+ if (!gh_vector_p (order_vec)
+ || gh_vector_length (order_vec) < 3)
+ return ;
+
+ SCM order = scm_vector_ref (order_vec,
+ gh_int2scm (me->break_status_dir() + 1));
+
+ /*
+ Copy in order specified in BREAK-ALIGN-ORDER. We use
+ Pointer_group_interface__extract_grobs (which reverses the list)
+ down the line, so it's ok to prepend onto newlist.
+ */
+ SCM new_list = SCM_EOL;
+ for (; gh_pair_p (order); order = ly_cdr (order))
+ {
+ SCM sym = gh_car (order);
+
+ SCM *tail = &elts;
+ for (; gh_pair_p (*tail); tail = SCM_CDRLOC(*tail))
+ {
+ Grob * g = unsmob_grob (gh_car (*tail));
+ if (sym == g->get_property ("break-align-symbol"))
+ {
+ SCM new_pair = *tail;
+ *tail = gh_cdr (*tail);
+ if (gh_pair_p (*tail))
+ tail = SCM_CDRLOC(*tail);
+
+ gh_set_cdr_x (new_pair, new_list);
+ new_list = new_pair;
+ break;
+ }
+ }
+ }
+
+ new_list = scm_reverse_x (elts, new_list);
+ me->set_property ("elements", new_list);
+}
+