X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fengraver-group.cc;h=8c5306f544c6e5737dde436ae22249e5e49b561c;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=fa6a780681b74db384ddcc4de2f9bdf89719552f;hpb=5700feb8f2c755876f7ff9aab46470c074d59918;p=lilypond.git diff --git a/lily/engraver-group.cc b/lily/engraver-group.cc index fa6a780681..8c5306f544 100644 --- a/lily/engraver-group.cc +++ b/lily/engraver-group.cc @@ -3,26 +3,67 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2008 Han-Wen Nienhuys */ +#include "context.hh" +#include "dispatcher.hh" #include "engraver-group.hh" - -#include "warn.hh" -#include "paper-score.hh" #include "grob.hh" -#include "context.hh" +#include "paper-score.hh" #include "translator-dispatch-list.hh" +#include "warn.hh" + +IMPLEMENT_LISTENER (Engraver_group, override); +void +Engraver_group::override (SCM sev) +{ + Stream_event *ev = unsmob_stream_event (sev); + + sloppy_general_pushpop_property (context (), + ev->get_property ("symbol"), + ev->get_property ("property-path"), + ev->get_property ("value")); +} + +IMPLEMENT_LISTENER (Engraver_group, revert); +void +Engraver_group::revert (SCM sev) +{ + Stream_event *ev = unsmob_stream_event (sev); + + sloppy_general_pushpop_property (context (), + ev->get_property ("symbol"), + ev->get_property ("property-path"), + SCM_UNDEFINED); +} + +void +Engraver_group::connect_to_context (Context *c) +{ + Translator_group::connect_to_context (c); + c->event_source ()->add_listener (GET_LISTENER (override), ly_symbol2scm ("Override")); + c->event_source ()->add_listener (GET_LISTENER (revert), ly_symbol2scm ("Revert")); +} + +void +Engraver_group::disconnect_from_context () +{ + context ()->event_source ()->remove_listener (GET_LISTENER (override), ly_symbol2scm ("Override")); + context ()->event_source ()->remove_listener (GET_LISTENER (revert), ly_symbol2scm ("Revert")); + Translator_group::disconnect_from_context (); +} void Engraver_group::announce_grob (Grob_info info) { - announce_infos_.push (info); + announce_infos_.push_back (info); Engraver_group *dad_eng = context_->get_parent_context () ? dynamic_cast (context_->get_parent_context ()->implementation ()) : 0; + if (dad_eng) dad_eng->announce_grob (info); } @@ -36,10 +77,10 @@ Engraver_group::acknowledge_grobs () SCM name_sym = ly_symbol2scm ("name"); SCM meta_sym = ly_symbol2scm ("meta"); - for (int j = 0; j < announce_infos_.size (); j++) + for (vsize j = 0; j < announce_infos_.size (); j++) { Grob_info info = announce_infos_[j]; - + SCM meta = info.grob ()->internal_get_property (meta_sym); SCM nm = scm_assoc (name_sym, meta); if (scm_is_pair (nm)) @@ -47,7 +88,9 @@ Engraver_group::acknowledge_grobs () else continue; - SCM acklist = scm_hashq_ref (acknowledge_hash_table_, nm, SCM_BOOL_F); + SCM acklist = scm_hashq_ref (acknowledge_hash_table_drul_[info.start_end ()], + nm, SCM_BOOL_F); + Engraver_dispatch_list *dispatch = Engraver_dispatch_list::unsmob (acklist); @@ -56,12 +99,12 @@ Engraver_group::acknowledge_grobs () SCM ifaces = scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta)); acklist = Engraver_dispatch_list::create (get_simple_trans_list (), - ifaces); + ifaces, info.start_end ()); dispatch = Engraver_dispatch_list::unsmob (acklist); - scm_hashq_set_x (acknowledge_hash_table_, nm, acklist); + scm_hashq_set_x (acknowledge_hash_table_drul_[info.start_end ()], nm, acklist); } if (dispatch) @@ -124,21 +167,33 @@ Engraver_group::do_announces () Engraver_group::Engraver_group () { - acknowledge_hash_table_ = SCM_EOL; - acknowledge_hash_table_ = scm_c_make_hash_table (61); + acknowledge_hash_table_drul_[LEFT] + = acknowledge_hash_table_drul_[RIGHT] + = SCM_EOL; + + acknowledge_hash_table_drul_[LEFT] = scm_c_make_hash_table (61); + acknowledge_hash_table_drul_[RIGHT] = scm_c_make_hash_table (61); } #include "translator.icc" ADD_TRANSLATOR_GROUP (Engraver_group, - /* doc */ "A group of engravers taken together", - /* create */ "", - /* accept */ "", - /* read */ "", - /* write */ ""); + /* doc */ + "A group of engravers taken together.", + + /* create */ + "", + + /* read */ + "", + + /* write */ + "" + ); void Engraver_group::derived_mark () const { - scm_gc_mark (acknowledge_hash_table_); + scm_gc_mark (acknowledge_hash_table_drul_[LEFT]); + scm_gc_mark (acknowledge_hash_table_drul_[RIGHT]); }