- if (oi&&oi->is_type_b (Rhythmic_head::static_name ()))
- head_l_arr_.substitute ((Rhythmic_head*)oi, (Rhythmic_head*)ni);
- else if (oi && oi->is_type_b (Dots::static_name ()))
- dot_l_arr_.substitute ((Dots*) oi, (Dots*) ni);
+ if (dots.size () < 2)
+ return SCM_UNSPECIFIED;
+ Slice s;
+ s.set_empty ();
+
+ Array<int> taken_posns;
+ int conflicts = 0;
+ for (int i=0; i < dots.size (); i++)
+ {
+ Real p = Staff_symbol_referencer::get_position (dots[i]);
+ for (int j=0; j < taken_posns.size (); j++)
+ {
+ if (taken_posns[j] == (int) p)
+ conflicts++;
+ }
+ taken_posns.push ((int)p);
+ s.unite (Slice ((int)p,
+ (int)p));
+ }
+
+ if (!conflicts)
+ return SCM_UNSPECIFIED;
+
+ int middle = s.center ();
+ /*
+ +1 -> off by one
+ */
+ int pos = middle - dots.size () + 1;
+ if (! (pos % 2))
+ pos ++; // center () rounds down.
+
+ for (int i=0; i < dots.size (); pos += 2, i++)
+ {
+ Grob * d = dots[i];
+ Staff_symbol_referencer::set_position (d,pos);
+ }
+
+ return SCM_UNSPECIFIED;