2 item.cc -- implement Item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1998 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::do_print() const
28 DOUT << "breakable_b_: " << breakable_b_ <<
29 " break_status_dir_: " << break_status_dir_;
37 return absolute_coordinate (X_AXIS);
43 Graphical_element *g = parent_l (X_AXIS);
46 return dynamic_cast <Score_element *> (g)-> line_l ();
50 Item::break_status_dir() const
52 return break_status_dir_;
56 Item::copy_breakable_items()
58 if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
60 Drul_array<Item *> new_copies;
64 Score_element * dolly = clone();
65 Item * item_p = dynamic_cast<Item*>(dolly);
67 item_p->break_status_dir_ = i;
68 pscore_l_->typeset_element (item_p);
69 new_copies[i] =item_p;
71 while (flip(&i) != LEFT);
72 broken_to_drul_= new_copies;
76 broken_to_drul_[i]->handle_prebroken_dependencies();
77 broken_to_drul_[i]->try_visibility_lambda();
79 while (flip(&i) != LEFT);
80 try_visibility_lambda ();
84 Item::try_visibility_lambda ()
86 if (visibility_lambda_)
88 SCM args = scm_listify (gh_int2scm (break_status_dir_), SCM_UNDEFINED);
89 SCM result = gh_apply (visibility_lambda_, args);
90 int trans = gh_scm2bool (gh_car (result));
91 int empty = gh_scm2bool (gh_cdr (result));
96 transparent_b_ = true;
103 copy_breakable_items();
104 handle_prebroken_dependencies();
107 Otherwise the broken items won't be pre_process()'ed.
109 add_dependency (broken_to_drul_[LEFT]);
110 add_dependency (broken_to_drul_[RIGHT]);
115 Item::do_breakable_col_processing()
122 Item::find_prebroken_piece (Line_of_score*l) const
126 else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
127 return broken_to_drul_[LEFT];
128 else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
129 return broken_to_drul_[RIGHT];
135 Item::find_prebroken_piece (Direction breakstatus) const
138 return (Item *) this; // ugh
140 return (Item*) broken_to_drul_[breakstatus];
144 Item::handle_prebroken_dependencies()
147 Score_element::handle_prebroken_dependencies();
151 Item::left_right_compare(Item const *l, Item const *r)
153 Paper_column *p1 = l->column_l ();
154 Paper_column* p2 = r->column_l ();
155 return p1->rank_i () - p2->rank_i ();
160 Item::linked_b() const
162 return Score_element::linked_b() || attached_span_l_arr_.size();
166 Item::do_junk_links()
168 attached_span_l_arr_.set_size(0);
174 Link_array<Spanner> attached=attached_span_l_arr_;
175 for (int i=0; i < attached.size (); i++)
177 Spanner *s= attached[i];
181 if (s->spanned_drul_[d] == this)
182 s->set_bounds (d, 0);
183 if (unbroken_original_l_
184 && unbroken_original_l_-> broken_to_drul_[d] == this)
185 unbroken_original_l_->broken_to_drul_[d] = 0;
186 } while (flip (&d) != LEFT);
188 assert (!attached_span_l_arr_.size ());
189 unbroken_original_l_ =0;
193 Item::column_l () const
195 return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
198 Item::Item (Item const &s)
201 unbroken_original_l_ = &s;
202 /* do not copy attached_span_l_arr_ */
203 breakable_b_ = s.breakable_b_;
204 visibility_lambda_ = s.visibility_lambda_;
205 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
206 break_status_dir_ = s.break_status_dir_;
207 break_priority_i_ = s.break_priority_i_;
212 Item::handle_prebroken_dependents ()
214 Dimension_cache * dim = dim_cache_[X_AXIS].parent_l_;
218 Item * parent = dynamic_cast<Item*> (dim->element_l ());
219 if (parent && parent->broken_to_drul_[LEFT])
221 if(!(broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]))
227 broken_to_drul_[d]->dim_cache_[X_AXIS].parent_l_ =
228 &parent->broken_to_drul_[d]->dim_cache_[X_AXIS];
229 parent->broken_to_drul_[d]->add_dependency (broken_to_drul_[d]);
231 while ((flip (&d))!=LEFT);