]> git.donarmstrong.com Git - lilypond.git/blob - lily/ledger-line-engraver.cc
* lily/ledger-line-engraver.cc (acknowledge_grob): create new
[lilypond.git] / lily / ledger-line-engraver.cc
1 /*
2   ledger-line-engraver.cc -- implement Ledger_line_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "group-interface.hh"
10 #include "spanner.hh"
11 #include "engraver.hh"
12 #include "staff-symbol.hh"
13
14 class Ledger_line_engraver : public Engraver
15 {
16   Spanner *span_;
17
18 public:
19   TRANSLATOR_DECLARATIONS (Ledger_line_engraver);
20
21 protected:
22   virtual void finalize ();
23   virtual void process_music ();
24   virtual void acknowledge_grob (Grob_info);
25
26   void start_spanner ();
27   void stop_spanner ();
28 };
29
30 Ledger_line_engraver::Ledger_line_engraver ()
31 {
32   span_ = 0;
33 }
34
35 void
36 Ledger_line_engraver::start_spanner ()
37 {
38   assert (!span_);
39   span_ = make_spanner ("LedgerLineSpanner", SCM_EOL);
40
41   span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
42 }
43
44 void
45 Ledger_line_engraver::process_music ()
46 {
47   if (!span_)
48     start_spanner ();
49 }
50
51 void
52 Ledger_line_engraver::finalize ()
53 {
54   stop_spanner();
55 }
56
57 void
58 Ledger_line_engraver::stop_spanner ()
59 {
60   if (span_)
61     {
62       span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
63       span_ = 0;
64     }
65 }
66
67 void
68 Ledger_line_engraver::acknowledge_grob (Grob_info s)
69 {
70   if (Staff_symbol::has_interface (s.grob ()))
71     {
72       Spanner *sym = dynamic_cast<Spanner*> (s.grob ());
73
74       if (!span_
75           || span_->get_bound (LEFT) != sym->get_bound (LEFT))
76         {
77           stop_spanner ();
78           start_spanner ();
79         }
80     }
81   else if (span_)
82     {
83       if (!to_boolean (s.grob ()->get_property ("no-ledgers")))
84         Pointer_group_interface::add_grob (span_, ly_symbol2scm ("note-heads"),
85                                            s.grob ());
86     }
87 }
88
89 ADD_TRANSLATOR (Ledger_line_engraver,
90                 "Creates the spanner to draw ledger lines, and notices objects that need ledger lines",
91                 /* creats*/ "LedgerLineSpanner",
92                 /* accepts */ "",
93                 /* acks  */ "staff-symbol-interface ledgered-interface", // ledgered-interface? 
94                 /* reads */ "",
95                 /* write */ "")