2 staff-regs.cc -- implement Staff_registers
4 source file of the LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
8 #include "staff-sym.hh"
9 #include "voice-group-regs.hh"
10 #include "voice-regs.hh"
11 #include "staff-regs.hh"
12 #include "command-request.hh"
15 #include "input-register.hh"
18 Staff_registers::get_staff_info() return inf;
20 inf = Request_register::get_staff_info();
21 inf.c0_position_i_l_ = &c0_position_i_;
24 Staff_registers::Staff_registers(Input_register const*ireg_C)
28 add( ireg_C->get_nongroup_p_arr());
32 /** Magic function which takes a Voice_registers out of one of its own
33 children, and puts it in another. This also handles the push and
36 Staff_registers::change_group(Group_change_req * greq_l,
37 Voice_registers *voice_regs_l,
38 Voice_group_registers * old_group)
41 Voice_registers *regs_p = (old_group)
42 ? (Voice_registers*) old_group->get_register_p(
44 : new Voice_registers(
45 greq_l->voice_l(), ireg_C_->get_ireg_l("Voice_group_registers")
46 ->get_ireg_l("Voice_registers"));
48 String new_str = greq_l->newgroup_str_;
51 old_str = old_group->group_id_str_;
52 if ( new_str[0] == '+') {
53 new_str = old_str + new_str;
54 } else if (new_str[0] == '-') {
55 int idx = old_str.index_last_i('+');
57 new_str = old_str.left_str ( idx );
59 Voice_group_registers * new_group_l = get_group(new_str);
60 new_group_l->add(regs_p);
62 mtor << "processed change_group " << get_staff_info().when()<<"\n";
66 Voice_group_registers *
67 Staff_registers::get_group(String id)
69 for (int i=0; i < group_l_arr_.size(); i++) {
70 if (group_l_arr_[i]->group_id_str_ == id)
71 return group_l_arr_[i];
73 Voice_group_registers *group_p =
74 new Voice_group_registers(id, ireg_C_->get_ireg_l("Voice_group_registers"));
75 group_l_arr_.push(group_p);
82 Staff_registers::terminate_register(Request_register * reg)
84 for (int i=0; i < group_l_arr_.size(); i++) {
85 if (group_l_arr_[i] == reg) {
87 Register_group_register::terminate_register(reg);
95 Staff_registers::try_request(Request * r)
97 bool b = Register_group_register::try_request(r);
99 Command_req * cr_l = r->command() ;
101 if (cr_l && cr_l->groupchange()) {
102 change_group(cr_l->groupchange(), 0, 0);
110 IMPLEMENT_STATIC_NAME(Staff_registers);
113 Staff_registers::acceptable_request_b(Request*r)const
115 return Register_group_register::acceptable_request_b(r) ||
116 (r->command() && r->command()->groupchange());