]> git.donarmstrong.com Git - lilypond.git/blob - lily/nested-system-start-delimiter-engraver.cc
5f8855437dd9c2ea2cac08f2f41c8732f9a9b33a
[lilypond.git] / lily / nested-system-start-delimiter-engraver.cc
1 /*
2   new-system-start-delimiter-engraver.cc -- implement
3   Nested_system_start_delimiter_engraver
4
5   source file of the GNU LilyPond music typesetter
6
7   (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
8
9 */
10
11 #include "side-position-interface.hh"
12 #include "system-start-delimiter.hh"
13 #include "engraver.hh"
14 #include "staff-symbol.hh"
15 #include "pointer-group-interface.hh"
16 #include "paper-column.hh"
17 #include "output-def.hh"
18 #include "spanner.hh"
19
20 class Nested_system_start_delimiter_engraver : public Engraver
21 {
22 public:
23   TRANSLATOR_DECLARATIONS (Nested_system_start_delimiter_engraver);
24
25 protected:
26   Spanner *delimiter_;
27   
28   DECLARE_ACKNOWLEDGER (system_start_delimiter);
29   DECLARE_ACKNOWLEDGER (staff_symbol);
30
31   void process_music ();
32   virtual void finalize ();
33 };
34
35 Nested_system_start_delimiter_engraver::Nested_system_start_delimiter_engraver ()
36 {
37   delimiter_ = 0;
38 }
39
40 bool
41 add_staff_to_hierarchy (SCM hierarchy, SCM grob)
42 {
43   for (SCM s = hierarchy; scm_is_pair (s); s = scm_cdr (s))
44     {
45       SCM entry = scm_car (s);
46
47       if (unsmob_grob (entry))
48         ;
49       else if (scm_is_pair (entry))
50         {
51           bool success = add_staff_to_hierarchy (entry, grob);
52           if (success)
53             return success;
54         }
55       else
56         {
57           scm_set_car_x (s, grob);
58           return true;
59         }
60     }
61
62   return false;
63 }
64
65 void
66 Nested_system_start_delimiter_engraver::process_music ()
67 {
68   if (!delimiter_)
69     {
70       delimiter_ = make_spanner ("NestedSystemStartDelimiter", SCM_EOL);
71       SCM hierarchy = get_property ("systemStartDelimiterHierarchy");
72       
73       
74       delimiter_->set_object ("staff-hierarchy", ly_deep_copy (hierarchy));
75       delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
76     }
77 }
78
79 void
80 Nested_system_start_delimiter_engraver::finalize ()
81 {
82   if (delimiter_)
83     delimiter_->set_bound (RIGHT,
84                            unsmob_grob (get_property ("currentCommandColumn")));
85 }
86
87 void
88 Nested_system_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf)
89 {
90   Grob *staff = inf.grob();
91   SCM hier = delimiter_->get_object ("staff-hierarchy");
92   bool succ = add_staff_to_hierarchy (hier, staff->self_scm ());
93
94   if (!succ)
95     {
96       hier = scm_append_x (scm_list_2 (hier,
97                                        scm_list_1 (staff->self_scm ())));
98
99       delimiter_->set_object ("staff-hierarchy", hier);
100     }
101 }
102
103
104 void
105 Nested_system_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf)
106 {
107   Side_position_interface::add_support (inf.grob (), delimiter_);
108 }
109
110 #include "translator.icc"
111
112 ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, staff_symbol);
113 ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, system_start_delimiter);
114
115 ADD_TRANSLATOR (Nested_system_start_delimiter_engraver,
116                 /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner",
117                 /* create */ "NestedSystemStartDelimiter",
118                 /* accept */ "",
119                 /* read */ "systemStartDelimiterHierarchy",
120                 /* write */ "");