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 "engraver.hh"
11 #include "protected-scm.hh"
12 #include "break-align-item.hh"
13 #include "axis-group-item.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 ();
29 ADD_THIS_TRANSLATOR (Break_align_engraver);
32 Break_align_engraver::add_column (SCM smob)
34 Score_element * e = unsmob_element (smob);
35 align_l_->add_element (e);
40 Break_align_engraver::do_pre_move_processing ()
42 SCM order = get_property ("breakAlignOrder", 0);
43 for (; gh_pair_p (order); order = gh_cdr (order))
45 SCM p = scm_assoc ( gh_car (order), column_alist_);
48 add_column (gh_cdr (p));
49 column_alist_ = scm_assoc_remove_x (column_alist_, gh_car (order));
53 for (SCM p = column_alist_; gh_pair_p (p); p = gh_cdr (p))
55 SCM pair = gh_car (p);
56 add_column (gh_cdr (pair));
60 column_alist_ = SCM_EOL;
64 typeset_element (align_l_);
70 Break_align_engraver::Break_align_engraver ()
72 column_alist_ = SCM_EOL;
77 Break_align_engraver::acknowledge_element (Score_element_info inf)
79 if (Item * item_l = dynamic_cast <Item *> (inf.elem_l_))
81 if (item_l->empty_b (X_AXIS) || item_l->parent_l (X_AXIS))
84 SCM bp=item_l->remove_elt_property ("breakable");
85 bool breakable = (to_boolean (bp));
89 SCM al = item_l->remove_elt_property ("break-aligned");
90 if (!gh_boolean_p (al ) || !gh_scm2bool (al))
96 align_l_ = new Break_align_item;
97 align_l_->set_elt_property ("breakable", SCM_BOOL_T);
98 announce_element (Score_element_info (align_l_,0));
101 SCM name = ly_str02scm (inf.elem_l_->name());
102 SCM s = scm_assoc (name, column_alist_);
104 Axis_group_item * group = 0;
107 Score_element *e = unsmob_element (gh_cdr(s));
108 group = dynamic_cast<Axis_group_item*> (e);
112 group = new Axis_group_item;
113 group->set_axes (X_AXIS,X_AXIS);
114 group->set_elt_property ("origin", name);
115 group->set_parent (align_l_, Y_AXIS);
116 announce_element (Score_element_info (group, 0));
117 column_alist_ = scm_assoc_set_x (column_alist_, name, group->self_scm_);
119 group->add_element (item_l);