{
DECLARE_GROB_INTERFACE ();
- DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM));
static bool less (Grob *s1, Grob *s2);
static int get_column_rank (Item *);
static int get_column_rank (Spanner *, Direction);
static int get_position (Spanner *);
static int get_position_generic (Grob *);
- static Direction get_default_dir (Grob *);
+ static Direction get_default_dir (Spanner *);
static SCM get_control_points (Grob *, Grob *,
Tie_configuration const &,
Tie_details const &);
(what about linebreaks? )
*/
Direction
-Tie::get_default_dir (Grob *me)
+Tie::get_default_dir (Spanner *me)
{
Drul_array<Grob *> stems;
for (LEFT_and_RIGHT (d))
{
- Grob *one_head = 0;
- if (Spanner *spanner = dynamic_cast<Spanner *> (me))
- {
- one_head = head (spanner, d);
- if (!one_head)
- one_head = head (spanner->broken_neighbor (d), d);
- }
- else if (Item *item = dynamic_cast<Item *> (me))
- one_head = Semi_tie::head (item);
+ Grob *one_head = head (me, d);
+ if (!one_head)
+ one_head = head (me->broken_neighbor (d), d);
Grob *stem = one_head ? Rhythmic_head::get_stem (one_head) : 0;
stems[d] = (stem && !Stem::is_invisible (stem)) ? stem : 0;
return -get_grob_direction (stems[LEFT]);
else if (stems[RIGHT])
return -get_grob_direction (stems[RIGHT]);
- else if (int p = get_position_generic (me))
+ else if (int p = get_position (me))
return Direction (sign (p));
return to_dir (me->get_property ("neutral-direction"));
SCM
Tie::calc_direction (SCM smob)
{
+ // In this method, Tie and Semi_tie require the same logic with different
+ // types. It might be clearer to use a template.
Grob *me = unsmob<Grob> (smob);
Grob *yparent = me->get_parent (Y_AXIS);
if ((Tie_column::has_interface (yparent)
return me->get_property_data ("direction");
}
- else
- return scm_from_int (Tie::get_default_dir (me));
+
+ programming_error ("no Tie_column or Semi_tie_column. Killing grob.");
+ me->suicide ();
+ return scm_from_int (CENTER);
}
SCM