1 #include "translator-group.hh"
2 #include "context-def.hh"
4 #include "music-output-def.hh"
9 Translator_group::is_removable () const
11 return trans_group_list_ == SCM_EOL && ! iterator_count_;
15 Translator_group::find_existing_translator (SCM n, String id)
17 if ((is_alias (n) && (id_string_ == id || id.is_empty ())) || n == ly_symbol2scm ("Current"))
20 Translator_group* r = 0;
21 for (SCM p = trans_group_list_; !r && gh_pair_p (p); p = ly_cdr (p))
23 Translator * t = unsmob_translator (ly_car (p));
25 r = dynamic_cast<Translator_group*> (t)->find_existing_translator (n, id); }
32 Translator_group::find_create_translator (SCM n, String id, SCM operations)
34 Translator_group * existing = find_existing_translator (n,id);
40 TODO: use accepts_list_.
42 Link_array<Context_def> path
43 = unsmob_context_def (definition_)->path_to_acceptable_translator (n, get_output_def ());
47 Translator_group * current = this;
49 // start at 1. The first one (index 0) will be us.
50 for (int i=0; i < path.size (); i++)
52 SCM ops = (i == path.size () -1) ? operations : SCM_EOL;
54 Translator_group * new_group
55 = path[i]->instantiate (ops);
57 if (i == path.size () -1)
59 new_group->id_string_ = id;
62 current->add_fresh_group_translator (new_group);
63 apply_property_operations (new_group, ops);
71 Translator_group *ret = 0;
73 ret = daddy_trans_->find_create_translator (n, id, operations);
76 warning (_f ("Cannot find or create `%s' called `%s'",
77 ly_symbol2string (n).to_str0 (), id));
84 Default child context as a SCM string, or something else if there is
88 default_child_context_name (Translator_group const *tg)
90 return gh_pair_p (tg->accepts_list_)
91 ? ly_car (scm_last_pair (tg->accepts_list_))
97 Translator_group::is_bottom_context () const
99 return !gh_symbol_p (default_child_context_name (this));
103 Translator_group::get_default_interpreter ()
105 if (!is_bottom_context ())
107 SCM nm = default_child_context_name (this);
108 SCM st = get_output_def ()->find_translator (nm);
110 Context_def *t = unsmob_context_def (st);
113 warning (_f ("can't find or create: `%s'", ly_symbol2string (nm).to_str0 ()));
114 t = unsmob_context_def (this->definition_);
116 Translator_group *tg = t->instantiate (SCM_EOL);
117 add_fresh_group_translator (tg);
118 if (!tg->is_bottom_context ())
119 return tg->get_default_interpreter ();
130 Translator_group::where_defined (SCM sym) const
132 if (properties_dict ()->contains (sym))
134 return (Translator_group*)this;
137 return (daddy_trans_) ? daddy_trans_->where_defined (sym) : 0;
141 return SCM_EOL when not found.
144 Translator_group::internal_get_property (SCM sym) const
147 if (properties_dict ()->try_retrieve (sym, &val))
151 return daddy_trans_->internal_get_property (sym);
157 Translator_group::internal_set_property (SCM sym, SCM val)
160 if (internal_type_checking_global_b)
161 assert (type_check_assignment (sym, val, ly_symbol2scm ("translation-type?")));
164 properties_dict ()->set (sym, val);
168 TODO: look up to check whether we have inherited var?
171 Translator_group::unset_property (SCM sym)
173 properties_dict ()->remove (sym);