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;
27 Item::do_print() const
30 DOUT << "breakable_b_: " << breakable_b_ <<
31 " break_status_dir_: " << break_status_dir_;
39 return absolute_coordinate (X_AXIS);
45 Graphical_element *g =parent_l (X_AXIS);
48 return dynamic_cast <Score_element *> (g)-> line_l ();
52 Item::break_status_dir() const
54 return break_status_dir_;
58 Item::copy_breakable_items()
60 if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
62 Drul_array<Item *> new_copies;
66 Item * item_p = dynamic_cast<Item*>(clone());
68 item_p->break_status_dir_ = i;
69 pscore_l_->typeset_element (item_p);
70 item_p->handle_prebroken_dependencies();
71 new_copies[i] =item_p;
73 while (flip(&i) != LEFT);
74 broken_to_drul_= new_copies;
78 Item::do_breakable_col_processing()
83 if (!column_l ()->breakable_b_)
86 copy_breakable_items();
87 handle_prebroken_dependencies();
90 Otherwise the broken items won't be pre_process()'ed.
92 add_dependency (broken_to_drul_[LEFT]);
93 add_dependency (broken_to_drul_[RIGHT]);
97 Item::find_prebroken_piece (Line_of_score*l) const
101 else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
102 return broken_to_drul_[LEFT];
103 else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
104 return broken_to_drul_[RIGHT];
110 Item::find_prebroken_piece (Direction breakstatus) const
113 return (Item *) this; // ugh
115 return (Item*) broken_to_drul_[breakstatus];
119 Item::handle_prebroken_dependencies()
122 Score_element::handle_prebroken_dependencies();
126 Item::left_right_compare(Item const *l, Item const *r)
128 Paper_column *p1 = l->column_l ();
129 Paper_column* p2 = r->column_l ();
130 return p1->rank_i () - p2->rank_i ();
135 Item::linked_b() const
137 return Score_element::linked_b() || attached_span_l_arr_.size();
141 Item::do_junk_links()
143 attached_span_l_arr_.set_size(0);
149 Link_array<Spanner> attached=attached_span_l_arr_;
150 for (int i=0; i < attached.size (); i++)
152 Spanner *s= attached[i];
156 if (s->spanned_drul_[d] == this)
157 s->set_bounds (d, 0);
158 if (unbroken_original_l_
159 && unbroken_original_l_-> broken_to_drul_[d] == this)
160 unbroken_original_l_->broken_to_drul_[d] = 0;
161 } while (flip (&d) != LEFT);
163 assert (!attached_span_l_arr_.size ());
164 unbroken_original_l_ =0;
168 Item::column_l () const
170 return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
173 Item::Item (Item const &s)
176 unbroken_original_l_ = &s;
177 /* do not copy attached_span_l_arr_ */
178 breakable_b_ = s.breakable_b_;
179 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
180 break_status_dir_ = s.break_status_dir_;
181 break_priority_i_ = s.break_priority_i_;