2 item.cc -- implement Item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "dimension-cache.hh"
10 #include "paper-score.hh"
13 #include "paper-column.hh"
15 #include "lily-guile.hh"
19 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
23 Item copy ctor. Copy nothing: everything should be a elt property
24 or a special purpose poitner (such as broken_to_drul_[]) */
25 Item::Item (Item const &s)
28 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
34 Item::breakable_b () const
39 Item * i =dynamic_cast<Item*> (parent_l (X_AXIS));
40 return (i) ? i->breakable_b () : to_boolean (get_elt_property( "breakable"));
46 Score_element *g = parent_l (X_AXIS);
49 return dynamic_cast<Score_element *> (g)-> line_l ();
54 Item::copy_breakable_items()
56 Drul_array<Item *> new_copies;
60 Score_element * dolly = clone();
61 Item * item_p = dynamic_cast<Item*>(dolly);
62 pscore_l_->typeset_element (item_p);
63 new_copies[i] =item_p;
65 while (flip(&i) != LEFT);
66 broken_to_drul_= new_copies;
70 broken_to_drul_[i]->handle_prebroken_dependencies();
71 broken_to_drul_[i]->try_visibility_lambda();
73 while (flip(&i) != LEFT);
77 Item::try_visibility_lambda ()
79 SCM vis = remove_elt_property ("visibility-lambda");
80 if (gh_procedure_p (vis))
82 SCM args = scm_listify (gh_int2scm (break_status_dir ()), SCM_UNDEFINED);
83 SCM result = gh_apply (vis, args);
84 bool trans = gh_scm2bool (gh_car (result));
85 bool empty = gh_scm2bool (gh_cdr (result));
93 set_elt_property ("transparent", SCM_BOOL_T);
98 Item::broken_b () const
100 return broken_to_drul_[LEFT] || broken_to_drul_[RIGHT];
111 copy_breakable_items();
112 handle_prebroken_dependencies();
115 Otherwise the broken items won't be pre_process()'ed.
118 if (broken_to_drul_[LEFT])
120 add_dependency (broken_to_drul_[LEFT]);
121 add_dependency (broken_to_drul_[RIGHT]);
124 try_visibility_lambda (); // ugh.
128 Item::do_breakable_col_processing()
134 Item::find_broken_piece (Line_of_score*l) const
137 return (Item*)(this);
141 Score_element *s = find_broken_piece (d);
142 if (s && s->line_l () == l)
145 while (flip (&d) != LEFT);
151 Item::find_broken_piece (Direction d) const
153 Item * me = (Item *) (this);
156 else if (breakable_b ())
159 return dynamic_cast<Item*> (broken_to_drul_[d]);
166 Item::column_l () const
168 return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
172 Item::break_status_dir () const
176 Item * i = dynamic_cast<Item*> (original_l_);
178 return (i->broken_to_drul_[LEFT] == this) ? LEFT : RIGHT;