]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/change-iterator.cc
*** empty log message ***
[lilypond.git] / lily / change-iterator.cc
index 7d594273fd5038cd552cc9c277d33e572b16432d..d36567b5940981cf5ee0dd2babbfcb8b4fce4060 100644 (file)
@@ -3,21 +3,21 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 #include "change-iterator.hh"
-#include "translator-group.hh"
+#include "context.hh"
 #include "music.hh"
 #include "warn.hh"
-
+#include "input.hh"
 
 
 void
 Change_iterator::error (String reason)
 {
-  String to_type = ly_scm2string (get_music ()->get_mus_property ("change-to-type"));
-  String to_id =  ly_scm2string (get_music ()->get_mus_property ("change-to-id"));
+  String to_type = ly_symbol2string (get_music ()->get_property ("change-to-type"));
+  String to_id = ly_scm2string (get_music ()->get_property ("change-to-id"));
 
   String warn1 = _f ("can't change `%s' to `%s'", to_type, to_id) 
     + ": " + reason;
@@ -27,7 +27,7 @@ Change_iterator::error (String reason)
    */
   String warn2= "Change_iterator::process (): " 
     + get_outlet ()->context_name () + " = `"
-    + get_outlet ()->id_string_ + "': ";
+    + get_outlet ()->id_string () + "': ";
   warning (warn2);
   get_music ()->origin ()->warning (warn1);
 }
@@ -38,11 +38,11 @@ Change_iterator::error (String reason)
 void
 Change_iterator::process (Moment m)
 {
-  Translator_group * current = get_outlet ();
-  Translator_group * last = 0;
+  Context * current = get_outlet ();
+  Context * last = 0;
 
-  SCM to_type = get_music ()->get_mus_property ("change-to-type");
-  String to_id =  ly_scm2string (get_music ()->get_mus_property ("change-to-id"));
+  SCM to_type = get_music ()->get_property ("change-to-type");
+  String to_id =  ly_scm2string (get_music ()->get_property ("change-to-id"));
 
 
   /* find the type  of translator that we're changing.
@@ -52,10 +52,10 @@ Change_iterator::process (Moment m)
   while (current && !current->is_alias (to_type))
     {
       last = current;
-      current = current->daddy_trans_;
+      current = current->get_parent_context ();
     }
 
-  if (current && current->id_string_ == to_id)
+  if (current && current->id_string () == to_id)
     {
       String msg;
       msg += _ ("Can't switch translators, I'm there already");
@@ -64,10 +64,23 @@ Change_iterator::process (Moment m)
   if (current) 
     if (last)
       {
-       Translator_group * dest = 
-         get_outlet ()->find_create_translator (to_type, to_id, SCM_EOL);
-       current->remove_translator (last);
-       dest->add_used_group_translator (last);
+       Context * dest = 0;
+       Context * where = get_outlet ();
+       while (!dest && where)
+         {
+           dest = find_context_below (where, to_type, to_id);
+           where = where->get_parent_context ();
+         }
+       
+       if (dest)
+         {
+           current->remove_context (last);
+           dest->add_context (last);
+         }
+       else
+         {
+           get_music ()->origin ()->warning  ("could not find context to switch to.");
+         }
       }
     else
       {
@@ -75,7 +88,7 @@ Change_iterator::process (Moment m)
          We could change the current translator's id, but that would make 
          errors hard to catch
          
-          last->translator_id_string_  = get_change ()->change_to_id_string_;
+          last->translator_id_string ()  = get_change ()->change_to_id_string ();
        */
        error (_ ("I'm one myself"));
       }