]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/grace-position-engraver.cc
patch::: 1.3.107.mb1: Re: lily 1.3.107
[lilypond.git] / lily / grace-position-engraver.cc
index 1b9fe9534fcab36da5bafc0d16f62f6d35bddba3..6de4b273ec60ac9f602d31d843c41e5aad28f989 100644 (file)
@@ -3,16 +3,19 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 
 #include "engraver.hh"
 #include "grace-align-item.hh"
-#include "note-head.hh"
+#include "rhythmic-head.hh"
 #include "local-key-item.hh"
 #include "paper-column.hh"
-#include "dimension-cache.hh"
+#include "note-head.hh"
+#include "side-position-interface.hh"
+#include "axis-group-interface.hh"
+
 
 class Grace_position_engraver:public Engraver
 {
@@ -23,7 +26,7 @@ protected:
   virtual void process_acknowledged ();
   virtual void do_post_move_processing ();
   virtual void do_pre_move_processing ();
-  Grace_align_item*align_l_;
+  Item*align_l_;
   Link_array<Item> support_;
 public:
   Grace_position_engraver();
@@ -39,21 +42,22 @@ Grace_position_engraver::Grace_position_engraver ()
 void
 Grace_position_engraver::acknowledge_element (Score_element_info i)
 {
-  if (Grace_align_item*g  =dynamic_cast<Grace_align_item*>(i.elem_l_))
+  Item *item = dynamic_cast<Item*> (i.elem_l_);
+  if (item && Grace_align_item::has_interface (i.elem_l_))
     {
-      align_l_ = g;
+      align_l_ = item;
     }
-  else if (Note_head * n = dynamic_cast <Note_head*> (i.elem_l_))
+  else if (item && Note_head::has_interface (i.elem_l_))
     {
-      if (!to_boolean (n->get_elt_property ("grace")))
-       support_.push (n);
+      if (!to_boolean (item->get_elt_property ("grace")))
+       support_.push (item);
     }
-  else if (Local_key_item*it = dynamic_cast<Local_key_item*>(i.elem_l_))
+  else if (item && Local_key_item::has_interface (i.elem_l_))
     {
-      if (!to_boolean (it->get_elt_property ("grace")))
-       support_.push (it);
+      if (!to_boolean (item->get_elt_property ("grace")))
+       support_.push (item);
       else if (align_l_) 
-       it->add_dependency (align_l_);
+       item->add_dependency (align_l_);
     }
 }
 
@@ -63,7 +67,7 @@ Grace_position_engraver::process_acknowledged ()
   if (align_l_)
     {
       for (int i=0; i < support_.size (); i++)
-       align_l_->add_support (support_[i]);
+       Side_position::add_support (align_l_,support_[i]);
       support_.clear ();
     }
 }
@@ -71,6 +75,8 @@ Grace_position_engraver::process_acknowledged ()
 void
 Grace_position_engraver::do_pre_move_processing ()
 {
+  if (align_l_ && !Side_position::supported_b (align_l_))
+    {
   /*
      We don't have support. Either some moron tried attaching us to a rest,
      or we're at the end of the piece.  In the latter case, we have a
@@ -80,23 +86,18 @@ Grace_position_engraver::do_pre_move_processing ()
      Solution: attach ourselves to  the last musical column known.  A little intricate.
      
   */
-  if (align_l_ && !align_l_->supported_b ())
-    {
+
       Score_element * elt = align_l_->parent_l (X_AXIS);
       if (elt)
        return;
 
       warning (_("Unattached grace notes.  Attaching to last musical column."));
-      /*      if (ae)
-       ae->remove_element (align_l_);
-       else if (elt)*/
-
       
       align_l_->set_parent (0, X_AXIS);
-      last_musical_col_l_->add_element (align_l_);
+      Axis_group_interface::add_element (last_musical_col_l_, align_l_);
     }
 
-  last_musical_col_l_ = get_staff_info ().musical_pcol_l ();
+  last_musical_col_l_ = dynamic_cast<Paper_column*>( unsmob_element (get_property ("currentMusicalColumn")));
 }
 
 void