+Bracket_nesting_group::~Bracket_nesting_group ()
+{
+ junk_pointers (children_);
+}
+
+void
+Bracket_nesting_group::set_bound (Direction d, Grob *g)
+{
+ delimiter_->set_bound (d, g);
+ for (vsize i = 0 ; i < children_.size (); i++)
+ {
+ children_[i]->set_bound (d, g);
+ }
+}
+
+void
+Bracket_nesting_group::set_nesting_support (Grob *parent)
+{
+ 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 (entry == ly_symbol2scm ("SystemStartBrace")
+ || entry == ly_symbol2scm ("SystemStartBracket")
+ || entry == ly_symbol2scm ("SystemStartBar")
+ || 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_;
+
+ DECLARE_ACKNOWLEDGER (system_start_delimiter);
+ DECLARE_ACKNOWLEDGER (system_start_text);
+ DECLARE_ACKNOWLEDGER (staff_symbol);
+
+ void process_music ();
+ virtual void finalize ();
+};
+