+ if (parent)
+ Side_position_interface::add_support (delimiter_, parent);
+
+ for (vsize i = 0; i < children_.size (); i++)
+ children_[i]->set_nesting_support (delimiter_);
+}
+
+void
+Bracket_nesting_group::from_list (SCM x)
+{
+ for (SCM s = x; scm_is_pair (s); s = scm_cdr (s))
+ {
+ SCM entry = scm_car (s);
+ if (scm_is_pair (entry))
+ {
+ Bracket_nesting_group *node = new Bracket_nesting_group;
+ node->from_list (entry);
+ children_.push_back (node);
+ }
+ else if (scm_is_eq (entry, ly_symbol2scm ("SystemStartBrace"))
+ || scm_is_eq (entry, ly_symbol2scm ("SystemStartBracket"))
+ || scm_is_eq (entry, ly_symbol2scm ("SystemStartBar"))
+ || scm_is_eq (entry, ly_symbol2scm ("SystemStartSquare")))
+ symbol_ = entry;
+ else
+ children_.push_back (new Bracket_nesting_staff (0));
+ }
+}
+
+bool
+Bracket_nesting_group::add_staff (Grob *grob)
+{
+ for (vsize i = 0; i < children_.size (); i++)
+ {
+ if (children_[i]->add_staff (grob))
+ {
+ Pointer_group_interface::add_grob (delimiter_,
+ ly_symbol2scm ("elements"), grob);
+ return true;
+ }
+ }
+ return false;
+}
+
+/****************/
+
+class System_start_delimiter_engraver : public Engraver
+{
+public:
+ TRANSLATOR_DECLARATIONS (System_start_delimiter_engraver);
+
+protected:
+ Bracket_nesting_group *nesting_;
+
+ void acknowledge_system_start_delimiter (Grob_info);
+ void acknowledge_staff_symbol (Grob_info);
+
+ void process_music ();
+ virtual void finalize ();
+};
+
+System_start_delimiter_engraver::System_start_delimiter_engraver (Context *c)
+ : Engraver (c)
+{
+ nesting_ = 0;