2 item.cc -- implement Item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
17 unbroken_original_l_ =0;
18 break_priority_i_ = 0;
20 break_status_dir_ = CENTER;
21 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
25 Item::breakable_b () const
27 return !unbroken_original_l_
28 && dynamic_cast<Item*>(parent_l (X_AXIS))->breakable_b ();
32 Item::do_print() const
35 DOUT << "breakable_b_: " << breakable_b_ <<
36 " break_status_dir_: " << break_status_dir_;
44 return absolute_coordinate (X_AXIS);
50 Graphical_element *g = parent_l (X_AXIS);
53 return dynamic_cast<Score_element *> (g)-> line_l ();
57 Item::break_status_dir() const
59 return break_status_dir_;
63 Item::copy_breakable_items()
65 if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]
69 Drul_array<Item *> new_copies;
73 Score_element * dolly = clone();
74 Item * item_p = dynamic_cast<Item*>(dolly);
76 item_p->break_status_dir_ = i;
77 pscore_l_->typeset_element (item_p);
78 new_copies[i] =item_p;
80 while (flip(&i) != LEFT);
81 broken_to_drul_= new_copies;
85 broken_to_drul_[i]->handle_prebroken_dependencies();
86 broken_to_drul_[i]->try_visibility_lambda();
88 while (flip(&i) != LEFT);
89 try_visibility_lambda ();
93 Item::try_visibility_lambda ()
95 if (visibility_lambda_)
97 SCM args = scm_listify (gh_int2scm (break_status_dir_), SCM_UNDEFINED);
98 SCM result = gh_apply (visibility_lambda_, args);
99 int trans = gh_scm2bool (gh_car (result));
100 int empty = gh_scm2bool (gh_cdr (result));
105 transparent_b_ = true;
112 copy_breakable_items();
113 handle_prebroken_dependencies();
116 Otherwise the broken items won't be pre_process()'ed.
118 add_dependency (broken_to_drul_[LEFT]);
119 add_dependency (broken_to_drul_[RIGHT]);
123 Item::do_breakable_col_processing()
130 Item::find_prebroken_piece (Line_of_score*l) const
133 return (Item*)(this);
134 else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
135 return broken_to_drul_[LEFT];
136 else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
137 return broken_to_drul_[RIGHT];
143 Item::find_prebroken_piece (Direction breakstatus) const
146 return (Item *) (this); // ugh
148 return dynamic_cast<Item*> (broken_to_drul_[breakstatus]);
152 Item::handle_prebroken_dependencies()
155 Score_element::handle_prebroken_dependencies();
159 Item::left_right_compare(Item const *l, Item const *r)
161 Paper_column *p1 = l->column_l ();
162 Paper_column* p2 = r->column_l ();
163 return p1->rank_i () - p2->rank_i ();
168 Item::linked_b() const
170 return Score_element::linked_b() || attached_span_l_arr_.size();
174 Item::do_junk_links()
176 attached_span_l_arr_.set_size(0);
182 Link_array<Spanner> attached=attached_span_l_arr_;
183 for (int i=0; i < attached.size (); i++)
185 Spanner *s= attached[i];
189 if (s->spanned_drul_[d] == this)
190 s->set_bounds (d, 0);
191 if (unbroken_original_l_
192 && unbroken_original_l_-> broken_to_drul_[d] == this)
193 unbroken_original_l_->broken_to_drul_[d] = 0;
194 } while (flip (&d) != LEFT);
196 assert (!attached_span_l_arr_.size ());
197 unbroken_original_l_ =0;
201 Item::column_l () const
203 return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
206 Item::Item (Item const &s)
209 unbroken_original_l_ = &s;
210 /* do not copy attached_span_l_arr_ */
211 breakable_b_ = s.breakable_b_;
212 visibility_lambda_ = s.visibility_lambda_;
213 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
214 break_status_dir_ = s.break_status_dir_;
215 break_priority_i_ = s.break_priority_i_;
220 Item::handle_prebroken_dependents ()
222 Item * parent = dynamic_cast<Item*> (parent_l( X_AXIS));
223 if (breakable_b () && parent)
225 if(!(broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]))
231 broken_to_drul_[d]->dim_cache_[X_AXIS].parent_l_ =
232 &parent->broken_to_drul_[d]->dim_cache_[X_AXIS];
233 parent->broken_to_drul_[d]->add_dependency (broken_to_drul_[d]);
235 while ((flip (&d))!=LEFT);