]> git.donarmstrong.com Git - lilypond.git/blob - lily/voice-regs.cc
release: 0.0.63
[lilypond.git] / lily / voice-regs.cc
1 /*
2   voice-regs.cc -- implement Voice_registers
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8 #include "proto.hh"
9 #include "plist.hh"
10 #include "command-request.hh"
11 #include "musical-request.hh"
12 #include "voice-regs.hh"
13 #include "register.hh"
14 #include "staff-regs.hh"        // needed because somebody has to delete us.
15 #include "debug.hh"
16 #include "input-register.hh"
17 #include "voice-group-regs.hh"
18
19 Voice_registers::Voice_registers(Voice *v_p, Input_register const*ireg_C)
20 {
21     terminate_b_ = false;
22     ireg_C_ = ireg_C;
23     voice_l_ = v_p;
24     add(ireg_C->get_nongroup_p_arr());
25 }
26
27 void
28 Voice_registers::acknowledge_element(Staff_elem_info i)
29 {
30     if (i.voice_l_ != voice_l_)
31         return;
32     Register_group_register::acknowledge_element(i);
33 }
34
35 bool
36 Voice_registers::try_request(Request*r_l)
37 {
38     if (r_l->voice_l() !=voice_l_)
39         return false;
40     
41     Command_req *c=r_l->command();
42     if (c&&c->terminate()) {
43         terminate_b_ = true;
44         return true;            // scary. We're deleted now.. 
45     } else if (c&&c->groupchange()) {
46         /* this is scary as well. The groupchange has to be handled by
47          the Staff_registers, which are two levels up in the hierarchy
48          */
49           
50         assert(daddy_reg_l_->name() == Voice_group_registers::static_name());
51         ((Staff_registers*)daddy_reg_l_->daddy_reg_l_)->        // scary.
52             change_group(c->groupchange(), this,
53                          (Voice_group_registers*)daddy_reg_l_); // ugh!
54         return true;
55     }
56     
57     return Register_group_register::try_request(r_l);
58 }
59
60 bool
61 Voice_registers::acceptable_request_b(Request*r)
62 {
63     Command_req *  c_l = r->command();
64     return   (c_l&&(c_l->terminate()||c_l->groupchange()))
65         || Register_group_register::acceptable_request_b(r);
66 }
67 IMPLEMENT_STATIC_NAME(Voice_registers);
68
69 void
70 Voice_registers::do_print() const
71 {
72 #ifndef NPRINT
73     mtor << "Voice= " << voice_l_<<'\n';
74     Register_group_register::do_print();
75 #endif
76 }
77
78 void
79 Voice_registers::pre_move_processing()
80 {
81     if (terminate_b_)
82         daddy_reg_l_->terminate_register(this);
83     else 
84         Register_group_register::pre_move_processing();
85 }