2 item.cc -- implement Item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
13 // #include "elem-group.hh"
18 break_priority_i_ = 0;
20 break_status_i_ = CENTER;
21 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
24 IMPLEMENT_IS_TYPE_B1(Item, Score_elem);
27 Item::do_print() const
30 DOUT << "breakable_b_: " << breakable_b_ <<
31 " break_status_i_: " <<break_status_i_;
39 return absolute_coordinate (X_AXIS);
45 return (axis_group_l_a_[X_AXIS])? axis_group_l_a_[X_AXIS]->line_l() : 0;
49 Item::break_status_i() const
51 return break_status_i_;
55 Item::copy_breakable_items()
57 if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
59 Drul_array<Item *> new_copies;
63 Item * item_p = clone()->item ();
65 item_p->break_status_i_ = i;
66 pscore_l_->typeset_element (item_p);
67 item_p->handle_prebroken_dependencies();
68 new_copies[i] =item_p;
70 while (flip(&i) != LEFT);
71 broken_to_drul_= new_copies;
75 Item::do_breakable_col_processing()
80 if (!column_l ()->breakable_b_)
83 copy_breakable_items();
84 handle_prebroken_dependencies();
87 Otherwise the broken items won't be pre_process()'ed.
89 add_dependency (broken_to_drul_[LEFT]);
90 add_dependency (broken_to_drul_[RIGHT]);
94 Item::find_prebroken_piece (Line_of_score*l) const
98 else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
99 return broken_to_drul_[LEFT];
100 else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
101 return broken_to_drul_[RIGHT];
107 Item::find_prebroken_piece (Direction breakstatus) const
110 return (Item *) this; // ugh
112 return (Item*) broken_to_drul_[breakstatus];
116 Item::handle_prebroken_dependencies()
119 Score_elem::handle_prebroken_dependencies();
123 Item::left_right_compare(Item const *l, Item const *r)
125 while (!l->is_type_b (Paper_column::static_name ()))
126 l = l->axis_group_l_a_[X_AXIS]->item();
127 while (!r->is_type_b (Paper_column::static_name ()))
128 r = r->axis_group_l_a_[X_AXIS]->item();
130 Paper_column *p1 = (Paper_column*)l;
131 Paper_column* p2 = (Paper_column*)r;
132 return p1->rank_i () - p2->rank_i ();
137 Item::linked_b() const
139 return Score_elem::linked_b() || attached_span_l_arr_.size();
143 Item::do_junk_links()
145 attached_span_l_arr_.set_size(0);
151 Link_array<Spanner> attached = attached_span_l_arr_;
153 for (int i=0; i < attached_span_l_arr_.size (); i++) {
154 Spanner *&s= attached_span_l_arr_[i];
155 if (s->spanned_drul_[LEFT] == this)
156 s->set_bounds (LEFT, 0);
157 if (s->spanned_drul_[RIGHT] == this)
158 s->set_bounds (RIGHT,0);
161 attached_span_l_arr_.set_size (0);
165 Item::column_l () const
167 return axis_group_l_a_[X_AXIS]->item ()->column_l ();