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>
13 // #include "elem-group.hh"
18 break_priority_i_ = 0;
20 break_status_dir_ = CENTER;
21 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
24 IMPLEMENT_IS_TYPE_B1(Item, Score_element);
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_axis_group *ga = axis_group_l_a_[X_AXIS];
50 assert (ga->access_Score_element());
51 return ga->access_Score_element ()-> line_l ();
55 Item::break_status_dir() const
57 return break_status_dir_;
61 Item::copy_breakable_items()
63 if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
65 Drul_array<Item *> new_copies;
69 Item * item_p = clone()->access_Item ();
71 item_p->break_status_dir_ = i;
72 pscore_l_->typeset_element (item_p);
73 item_p->handle_prebroken_dependencies();
74 new_copies[i] =item_p;
76 while (flip(&i) != LEFT);
77 broken_to_drul_= new_copies;
81 Item::do_breakable_col_processing()
86 if (!column_l ()->breakable_b_)
89 copy_breakable_items();
90 handle_prebroken_dependencies();
93 Otherwise the broken items won't be pre_process()'ed.
95 add_dependency (broken_to_drul_[LEFT]);
96 add_dependency (broken_to_drul_[RIGHT]);
100 Item::find_prebroken_piece (Line_of_score*l) const
104 else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
105 return broken_to_drul_[LEFT];
106 else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
107 return broken_to_drul_[RIGHT];
113 Item::find_prebroken_piece (Direction breakstatus) const
116 return (Item *) this; // ugh
118 return (Item*) broken_to_drul_[breakstatus];
122 Item::handle_prebroken_dependencies()
125 Score_element::handle_prebroken_dependencies();
129 Item::left_right_compare(Item const *l, Item const *r)
131 while (!l->is_type_b (Paper_column::static_name ()))
132 l = l->axis_group_l_a_[X_AXIS]->access_Score_element ()->access_Item ();
133 while (!r->is_type_b (Paper_column::static_name ()))
134 r = r->axis_group_l_a_[X_AXIS]->access_Score_element ()->access_Item ();
136 Paper_column *p1 = (Paper_column*)l;
137 Paper_column* p2 = (Paper_column*)r;
138 return p1->rank_i () - p2->rank_i ();
143 Item::linked_b() const
145 return Score_element::linked_b() || attached_span_l_arr_.size();
149 Item::do_junk_links()
151 attached_span_l_arr_.set_size(0);
157 for (int i=0; i < attached_span_l_arr_.size (); i++)
159 Spanner *&s= attached_span_l_arr_[i];
163 if (s->spanned_drul_[d] == this)
164 s->set_bounds (d, 0);
166 } while ( flip (&d) != LEFT);
168 attached_span_l_arr_.set_size (0);
172 Item::column_l () const
174 return axis_group_l_a_[X_AXIS]->access_Score_element ()->access_Item ()->column_l ();
177 Item::Item (Item const &s)
180 /* do not copy attached_span_l_arr_ */
181 breakable_b_ = s.breakable_b_;
182 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
183 break_status_dir_ = s.break_status_dir_;
184 break_priority_i_ = s.break_priority_i_;