2 break-align-engraver.cc -- implement Break_align_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "protected-scm.hh"
11 #include "break-align-item.hh"
12 #include "axis-group-item.hh"
14 class Break_align_engraver : public Engraver
16 Break_align_item *align_l_;
17 Protected_scm column_alist_;
19 virtual void acknowledge_element(Score_element_info i);
20 virtual void do_pre_move_processing ();
21 void add_column (SCM);
24 VIRTUAL_COPY_CONS(Translator);
25 Break_align_engraver ();
30 ADD_THIS_TRANSLATOR(Break_align_engraver);
33 Break_align_engraver::add_column (SCM smob)
35 Score_element * e = unsmob_element (smob);
36 align_l_->add_element (e);
41 Break_align_engraver::do_pre_move_processing ()
43 SCM order = get_property ("breakAlignOrder", 0);
44 for (; gh_pair_p (order); order = gh_cdr (order))
46 SCM p = scm_assoc ( gh_car (order), column_alist_);
49 add_column (gh_cdr (p));
50 column_alist_ = scm_assoc_remove_x (column_alist_, gh_car (order));
54 for (SCM p = column_alist_; gh_pair_p (p); p = gh_cdr (p))
56 SCM pair = gh_car (p);
57 add_column (gh_cdr (pair));
61 column_alist_ = SCM_EOL;
65 typeset_element (align_l_);
71 Break_align_engraver::Break_align_engraver ()
73 column_alist_ = SCM_EOL;
78 Break_align_engraver::acknowledge_element (Score_element_info inf)
80 if (Item * item_l = dynamic_cast <Item *> (inf.elem_l_))
82 if (item_l->empty_b (X_AXIS) || item_l->parent_l (X_AXIS))
85 SCM bp=item_l->remove_elt_property ("breakable");
86 bool breakable = (to_boolean (bp));
90 SCM al = item_l->remove_elt_property ("break-aligned");
91 if (!gh_boolean_p (al ) || !gh_scm2bool (al))
97 align_l_ = new Break_align_item;
98 align_l_->set_elt_property ("breakable", SCM_BOOL_T);
99 announce_element (Score_element_info (align_l_,0));
102 SCM name = ly_str02scm (inf.elem_l_->name());
103 SCM s = scm_assoc (name, column_alist_);
105 Axis_group_item * group = 0;
108 Score_element *e = unsmob_element (gh_cdr(s));
109 group = dynamic_cast<Axis_group_item*> (e);
113 group = new Axis_group_item;
114 group->set_axes (X_AXIS,X_AXIS);
115 group->set_elt_property ("origin", name);
116 group->set_parent (align_l_, Y_AXIS);
117 announce_element (Score_element_info (group, 0));
118 column_alist_ = scm_assoc_set_x (column_alist_, name, group->self_scm_);
120 group->add_element (item_l);