2 extender-spanner.cc -- implement Extender_spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
13 #include "molecule.hh"
15 #include "paper-def.hh"
16 #include "extender-spanner.hh"
17 #include "text-item.hh"
18 #include "text-def.hh"
20 IMPLEMENT_IS_TYPE_B1 (Extender_spanner, Directional_spanner);
22 Extender_spanner::Extender_spanner ()
23 : Directional_spanner ()
25 textitem_l_drul_[LEFT] = textitem_l_drul_[RIGHT] = 0;
26 dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
27 dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
30 Extender_spanner::Extender_spanner (Extender_spanner const& c)
31 : Directional_spanner (c)
33 textitem_l_drul_ = c.textitem_l_drul_;
34 dy_f_drul_ = c.dy_f_drul_;
35 dx_f_drul_ = c.dx_f_drul_;
38 Extender_spanner::~Extender_spanner ()
43 Extender_spanner::center () const
45 Real dx = width ().length ();
47 return Offset (dx / 2, 0);
51 Extender_spanner::brew_molecule_p () const
53 Molecule* mol_p = new Molecule;
55 Real w = width ().length ();
57 w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
59 Atom a = lookup_l ()->extender (w);
61 a.translate (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
69 Extender_spanner::do_add_processing ()
72 Drul_array<Text_item *> new_textitem_drul = textitem_l_drul_;
74 if (!textitem_l_drul_[d])
75 new_textitem_drul[d] = textitem_l_drul_[(Direction)-d];
76 } while (flip(&d) != LEFT);
77 textitem_l_drul_ = new_textitem_drul;
81 Extender_spanner::do_height () const
83 return Interval (0,0);
87 Extender_spanner::do_post_processing ()
89 assert (textitem_l_drul_[LEFT] || textitem_l_drul_[RIGHT]);
92 Real nw_f = paper ()->note_width () * 0.8;
97 Text_item* t = textitem_l_drul_[d] ? textitem_l_drul_[d] : textitem_l_drul_[(Direction)-d];
99 dy_f_drul_[d] += t->height ().length () / 2;
101 dx_f_drul_[d] += t->width ().length ();
103 dx_f_drul_[d] -= d * nw_f / 2;
105 // dx_f_drul_[d] -= d * nw_f / 4;
107 while (flip(&d) != LEFT);
111 Extender_spanner::do_substitute_dependency (Score_element* o, Score_element* n)
113 Text_item* new_l = n ? dynamic_cast<Text_item *> (n) : 0;
114 if (dynamic_cast <Item *> (o) == textitem_l_drul_[LEFT])
115 textitem_l_drul_[LEFT] = new_l;
116 else if (dynamic_cast <Item *> (o) == textitem_l_drul_[RIGHT])
117 textitem_l_drul_[RIGHT] = new_l;
121 Extender_spanner::set_textitem (Direction d, Text_item* textitem_l)
123 assert (!textitem_l_drul_[d]);
124 textitem_l_drul_[d] = textitem_l;
125 set_bounds (d, textitem_l);
127 add_dependency (textitem_l);