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 unbroken_original_l_ =0;
19 break_priority_i_ = 0;
21 break_status_dir_ = CENTER;
22 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0;
25 IMPLEMENT_IS_TYPE_B1(Item, Score_element);
28 Item::do_print() const
31 DOUT << "breakable_b_: " << breakable_b_ <<
32 " break_status_dir_: " << break_status_dir_;
40 return absolute_coordinate (X_AXIS);
46 Graphical_axis_group *ga = axis_group_l_a_[X_AXIS];
51 assert (dynamic_cast <Score_element *> (ga));
52 return dynamic_cast <Score_element *> (ga)-> line_l ();
56 Item::break_status_dir() const
58 return break_status_dir_;
62 Item::copy_breakable_items()
64 if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])
66 Drul_array<Item *> new_copies;
70 Item * item_p = dynamic_cast<Item*>(clone());
72 item_p->break_status_dir_ = i;
73 pscore_l_->typeset_element (item_p);
74 item_p->handle_prebroken_dependencies();
75 new_copies[i] =item_p;
77 while (flip(&i) != LEFT);
78 broken_to_drul_= new_copies;
82 Item::do_breakable_col_processing()
87 if (!column_l ()->breakable_b_)
90 copy_breakable_items();
91 handle_prebroken_dependencies();
94 Otherwise the broken items won't be pre_process()'ed.
96 add_dependency (broken_to_drul_[LEFT]);
97 add_dependency (broken_to_drul_[RIGHT]);
101 Item::find_prebroken_piece (Line_of_score*l) const
105 else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
106 return broken_to_drul_[LEFT];
107 else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
108 return broken_to_drul_[RIGHT];
114 Item::find_prebroken_piece (Direction breakstatus) const
117 return (Item *) this; // ugh
119 return (Item*) broken_to_drul_[breakstatus];
123 Item::handle_prebroken_dependencies()
126 Score_element::handle_prebroken_dependencies();
130 Item::left_right_compare(Item const *l, Item const *r)
132 while (!(dynamic_cast<Paper_column const *> (l)))
133 l = dynamic_cast<Item const*> (l->axis_group_l_a_[X_AXIS]);
134 while (!(dynamic_cast<Paper_column const *> (r)))
135 r = dynamic_cast<Item const*> (r->axis_group_l_a_[X_AXIS]);
137 Paper_column *p1 = (Paper_column*)l;
138 Paper_column* p2 = (Paper_column*)r;
139 return p1->rank_i () - p2->rank_i ();
144 Item::linked_b() const
146 return Score_element::linked_b() || attached_span_l_arr_.size();
150 Item::do_junk_links()
152 attached_span_l_arr_.set_size(0);
158 Link_array<Spanner> attached=attached_span_l_arr_;
159 for (int i=0; i < attached.size (); i++)
161 Spanner *s= attached[i];
165 if (s->spanned_drul_[d] == this)
166 s->set_bounds (d, 0);
167 if (unbroken_original_l_
168 && unbroken_original_l_-> broken_to_drul_[d] == this)
169 unbroken_original_l_->broken_to_drul_[d] = 0;
170 } while (flip (&d) != LEFT);
172 assert (!attached_span_l_arr_.size ());
173 unbroken_original_l_ =0;
177 Item::column_l () const
179 return dynamic_cast<Item*> (axis_group_l_a_[X_AXIS]) ->column_l ();
182 Item::Item (Item const &s)
185 unbroken_original_l_ = &s;
186 /* do not copy attached_span_l_arr_ */
187 breakable_b_ = s.breakable_b_;
188 broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
189 break_status_dir_ = s.break_status_dir_;
190 break_priority_i_ = s.break_priority_i_;