]> git.donarmstrong.com Git - lilypond.git/blob - lily/repeat-tie-engraver.cc
Run grand-replace for 2010.
[lilypond.git] / lily / repeat-tie-engraver.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2005--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
5
6
7   LilyPond is free software: you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   LilyPond is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21
22 #include "engraver.hh"
23 #include "item.hh"
24 #include "pointer-group-interface.hh"
25 #include "stream-event.hh"
26
27 #include "translator.icc"
28
29 class Repeat_tie_engraver : public Engraver
30 {
31   Stream_event *event_;
32   Grob *semi_tie_column_;
33   vector<Grob*> semi_ties_;
34   
35   void stop_translation_timestep (); 
36   DECLARE_ACKNOWLEDGER (note_head);
37   DECLARE_TRANSLATOR_LISTENER (repeat_tie);
38   
39 public:
40   TRANSLATOR_DECLARATIONS (Repeat_tie_engraver);
41 };
42
43 Repeat_tie_engraver::Repeat_tie_engraver ()
44 {
45   event_ = 0;
46   semi_tie_column_ = 0;
47 }
48
49 void
50 Repeat_tie_engraver::stop_translation_timestep ()
51 {
52   event_ = 0;
53   semi_tie_column_ = 0;
54   semi_ties_.clear ();
55 }
56
57 IMPLEMENT_TRANSLATOR_LISTENER (Repeat_tie_engraver, repeat_tie);
58 void
59 Repeat_tie_engraver::listen_repeat_tie (Stream_event *ev)
60 {
61   ASSIGN_EVENT_ONCE (event_, ev);
62 }
63
64 void
65 Repeat_tie_engraver::acknowledge_note_head (Grob_info inf)
66 {
67   if (!event_)
68     return;
69
70   if (!semi_tie_column_)
71     {
72       semi_tie_column_ = make_item ("RepeatTieColumn", event_->self_scm ());
73     }
74
75   SCM cause = event_->self_scm ();
76   Grob *semi_tie = make_item ("RepeatTie", cause);
77   semi_tie->set_object ("note-head", inf.grob ()->self_scm ());
78   
79   Pointer_group_interface::add_grob (semi_tie_column_, ly_symbol2scm ("ties"),
80                                      semi_tie);
81   semi_tie->set_parent (semi_tie_column_, Y_AXIS);
82   semi_ties_.push_back (semi_tie);
83
84
85   if (is_direction (unsmob_stream_event (cause)->get_property ("direction")))
86     {
87       Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction"));
88       semi_tie->set_property ("direction", scm_from_int (d)); 
89     }
90
91 }
92
93 ADD_ACKNOWLEDGER (Repeat_tie_engraver, note_head);
94 ADD_TRANSLATOR (Repeat_tie_engraver, 
95                 /* doc */
96                 "Create repeat ties.",
97                 
98                 /* create */
99                 "RepeatTie "
100                 "RepeatTieColumn ",
101
102                 /* read */
103                 "",
104
105                 /* write */
106                 ""
107                 );