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"
13 #include "align-interface.hh"
14 #include "axis-group-interface.hh"
17 class Break_align_engraver : public Engraver
20 Protected_scm column_alist_;
22 virtual void acknowledge_element(Score_element_info i);
23 virtual void do_pre_move_processing ();
24 void add_column (SCM);
27 VIRTUAL_COPY_CONS(Translator);
28 Break_align_engraver ();
33 ADD_THIS_TRANSLATOR(Break_align_engraver);
36 Break_align_engraver::add_column (SCM smob)
38 Score_element * e = unsmob_element (smob);
39 Break_align_item::add_element (align_l_,e);
44 Break_align_engraver::do_pre_move_processing ()
46 SCM order = get_property ("breakAlignOrder");
47 for (; gh_pair_p (order); order = gh_cdr (order))
49 SCM p = scm_assoc ( gh_car (order), column_alist_);
52 add_column (gh_cdr (p));
53 column_alist_ = scm_assoc_remove_x (column_alist_, gh_car (order));
57 for (SCM p = column_alist_; gh_pair_p (p); p = gh_cdr (p))
59 SCM pair = gh_car (p);
60 add_column (gh_cdr (pair));
64 column_alist_ = SCM_EOL;
68 typeset_element (align_l_);
74 Break_align_engraver::Break_align_engraver ()
76 column_alist_ = SCM_EOL;
81 Break_align_engraver::acknowledge_element (Score_element_info inf)
83 if (Item * item_l = dynamic_cast <Item *> (inf.elem_l_))
85 if (item_l->empty_b (X_AXIS) || item_l->parent_l (X_AXIS))
88 SCM bp=item_l->get_elt_property ("breakable");
89 bool breakable = (to_boolean (bp));
93 SCM align_name = item_l->get_elt_property ("break-align-symbol");
94 if (!gh_symbol_p (align_name))
99 align_l_ = new Item (get_property ("basicBreakAlignProperties"));
100 Break_align_item::set_interface (align_l_);
101 announce_element (align_l_,0);
103 SCM edge_sym = ly_symbol2scm ("Left_edge_item");
104 Item * edge = new Item (get_property ("leftEdgeBasicProperties"));
107 If the element is empty, it will be ignored in the break
110 TODO: switch off ignoring empty stuff?
112 edge->set_extent_callback (Score_element::point_dimension_callback,X_AXIS);
114 align_l_->set_elt_property ("group-center-element", edge->self_scm ());
116 announce_element (edge, 0);
117 column_alist_ = scm_assoc_set_x (column_alist_, edge_sym, edge->self_scm ());
120 SCM s = scm_assoc (align_name, column_alist_);
126 Score_element *e = unsmob_element (gh_cdr(s));
127 group = dynamic_cast<Item*> (e);
131 group = new Item (get_property ("basicBreakAlignGroupProperties"));
133 Axis_group_interface::set_interface (group);
134 Axis_group_interface::set_axes (group, X_AXIS,X_AXIS);
136 group->set_elt_property ("break-align-symbol", align_name);
137 group->set_parent (align_l_, Y_AXIS);
138 announce_element (group, 0);
139 column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm ());
141 Axis_group_interface::add_element (group, item_l);