2 break-align-engraver.cc -- implement Break_align_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "protected-scm.hh"
11 #include "break-align-item.hh"
12 #include "axis-group-item.hh"
13 #include "axis-group-interface.hh"
15 class Break_align_engraver : public Engraver
17 Break_align_item *align_l_;
18 Protected_scm column_alist_;
20 virtual void acknowledge_element(Score_element_info i);
21 virtual void do_pre_move_processing ();
22 void add_column (SCM);
25 VIRTUAL_COPY_CONS(Translator);
26 Break_align_engraver ();
31 ADD_THIS_TRANSLATOR(Break_align_engraver);
34 Break_align_engraver::add_column (SCM smob)
36 Score_element * e = unsmob_element (smob);
37 align_l_->add_element (e);
42 Break_align_engraver::do_pre_move_processing ()
44 SCM order = get_property ("breakAlignOrder");
45 for (; gh_pair_p (order); order = gh_cdr (order))
47 SCM p = scm_assoc ( gh_car (order), column_alist_);
50 add_column (gh_cdr (p));
51 column_alist_ = scm_assoc_remove_x (column_alist_, gh_car (order));
55 for (SCM p = column_alist_; gh_pair_p (p); p = gh_cdr (p))
57 SCM pair = gh_car (p);
58 add_column (gh_cdr (pair));
62 column_alist_ = SCM_EOL;
66 typeset_element (align_l_);
72 Break_align_engraver::Break_align_engraver ()
74 column_alist_ = SCM_EOL;
79 Break_align_engraver::acknowledge_element (Score_element_info inf)
81 if (Item * item_l = dynamic_cast <Item *> (inf.elem_l_))
83 if (item_l->empty_b (X_AXIS) || item_l->parent_l (X_AXIS))
86 SCM bp=item_l->remove_elt_property ("breakable");
87 bool breakable = (to_boolean (bp));
91 SCM al = item_l->remove_elt_property ("break-aligned");
92 if (!gh_boolean_p (al ) || !gh_scm2bool (al))
98 align_l_ = new Break_align_item;
99 align_l_->set_elt_property ("breakable", SCM_BOOL_T);
100 announce_element (Score_element_info (align_l_,0));
103 SCM name = ly_str02scm (inf.elem_l_->name());
104 SCM s = scm_assoc (name, column_alist_);
106 Axis_group_item * group = 0;
109 Score_element *e = unsmob_element (gh_cdr(s));
110 group = dynamic_cast<Axis_group_item*> (e);
114 group = new Axis_group_item;
115 axis_group(group).set_axes (X_AXIS,X_AXIS);
116 group->set_elt_property ("origin", name);
117 group->set_parent (align_l_, Y_AXIS);
118 announce_element (Score_element_info (group, 0));
119 column_alist_ = scm_assoc_set_x (column_alist_, name, group->self_scm_);
121 axis_group (group).add_element (item_l);