2 paper-column.cc -- implement Paper_column
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "paper-column.hh"
11 #include "paper-score.hh"
13 #include "axis-group-interface.hh"
14 #include "spaceable-grob.hh"
16 #include "text-item.hh"
18 #include "font-interface.hh"
19 #include "output-def.hh"
25 Paper_column::clone (int count) const
27 return new Paper_column (*this, count);
31 ADD_INTERFACE (Paper_column, "paper-column-interface",
32 "@code{Paper_column} objects form the top-most X-parents for items. "
33 " The are two types of columns: musical columns, where are attached to, and "
34 " non-musical columns, where bar-lines, clefs etc. are attached to. "
35 " The spacing engine determines the X-positions of these objects."
38 " numbered, the first (leftmost) is column 0. Numbering happens before\n"
39 " line-breaking, and columns are not renumbered after line breaking.\n"
40 " Since many columns go unused, you should only use the rank field to\n"
41 " get ordering information. Two adjacent columns may have\n"
42 " non-adjacent numbers.\n"
45 "between-cols when bounded-by-me "
46 "page-penalty shortest-playing-duration shortest-starter-duration");
49 Paper_column::do_break_processing ()
51 Spaceable_grob::remove_interface (this);
52 Item::do_break_processing ();
57 Paper_column::get_rank (Grob*me)
59 return dynamic_cast<Paper_column*> (me)->rank_;
63 Paper_column::get_system () const
69 Paper_column::get_column () const
71 return (Paper_column*) (this);
74 Paper_column::Paper_column (SCM l, Object_key const*key)
75 : Item (l, key) // guh.?
82 Paper_column::Paper_column (Paper_column const& src, int count)
91 Paper_column::when_mom (Grob *me)
93 SCM m = me->get_property ("when");
94 if (Moment *when = unsmob_moment (m))
100 Paper_column::is_musical (Grob *me)
102 SCM m = me->get_property ("shortest-starter-duration");
104 if (unsmob_moment (m))
106 s = *unsmob_moment (m);
108 return s != Moment (0);
113 Paper_column::is_used (Grob*me)
115 return scm_is_pair (me->get_property ("elements")) || Item::is_breakable (me)
116 || scm_is_pair (me->get_property ("bounded-by-me"))
121 Print a vertical line and the rank number, to aid debugging.
124 MAKE_SCHEME_CALLBACK (Paper_column,print,1);
126 Paper_column::print (SCM p)
128 Grob *me = unsmob_grob (p);
130 String r = to_string (Paper_column::get_rank (me));
131 SCM properties = Font_interface::text_font_alist_chain (me);
133 SCM scm_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
135 scm_makfrom0str (r.to_str0 ()));
136 Stencil t = *unsmob_stencil (scm_mol);
137 t.align_to (X_AXIS, CENTER);
138 t.align_to (Y_AXIS, DOWN);
140 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
144 return t.smobbed_copy ();
148 This is all too hairy. We use bounded-by-me to make sure that some
149 columns are kept "alive". Unfortunately, when spanners are suicided,
150 this falls apart again. (sigh.)
152 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
154 MAKE_SCHEME_CALLBACK (Paper_column,before_line_breaking,1);
156 Paper_column::before_line_breaking (SCM grob)
158 Grob *me = unsmob_grob (grob);
160 SCM c = me->get_property ("bounded-by-me");
163 while (scm_is_pair (*ptrptr))
165 Grob * g = unsmob_grob (scm_car (*ptrptr));
167 if (!g || !g->is_live ())
169 *ptrptr = scm_cdr (*ptrptr);
173 ptrptr = SCM_CDRLOC (*ptrptr);
177 me->set_property ("bounded-by-me", c);
178 return SCM_UNSPECIFIED;