]> git.donarmstrong.com Git - lilypond.git/blob - lily/walk-regs.cc
release: 0.0.46.jcn1
[lilypond.git] / lily / walk-regs.cc
1 /*
2   walkregs.cc -- implement Walker_registers
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8 #include "debug.hh"
9 #include "walk-regs.hh"
10 #include "staff-regs.hh"
11 #include "staff-elem.hh"
12 #include "staff.hh"
13 #include "complex-walker.hh"
14 #include "staff-column.hh"
15 #include "score-walker.hh"
16 #include "bar.hh"               // needed for Bar::static_name
17 #include "input-register.hh"
18
19 Walker_registers::Walker_registers(Complex_walker *w)
20 {
21     walk_l_ = w;
22     Input_register * ireg_l = w->staff_l_->ireg_p_;
23     if (ireg_l->name_str_ == "Staff_registers") 
24         add(new Staff_registers(ireg_l));
25     else {
26         add(ireg_l->get_nongroup_p_arr());
27     }
28 }
29
30 void
31 Walker_registers::announce_element(Staff_elem_info info)
32 {
33     if (info.elem_p_->name() == Bar::static_name()) {
34         walk_l_->allow_break();
35     }
36     announce_info_arr_.push(info);
37 }
38
39 void
40 Walker_registers::acknowledge_element(Staff_elem_info )
41 {
42     assert(false);
43 }
44
45 void
46 Walker_registers::do_announces()
47 {
48     Request dummy_req;
49     for (int i = 0; i < announce_info_arr_.size(); i++){
50         Staff_elem_info info = announce_info_arr_[i];
51
52         if (!info.req_l_)
53             info.req_l_ = &dummy_req;
54         Register_group_register::acknowledge_element(info);
55     }
56     announce_info_arr_.set_size(0);
57 }
58
59 void
60 Walker_registers::typeset_element(Staff_elem *elem_p)
61 {
62     typeset_musical_item(elem_p);
63 }
64
65 void
66 Walker_registers::typeset_musical_item(Staff_elem * elem_p)
67 {
68     walk_l_->typeset_element(elem_p);
69 }
70
71 void
72 Walker_registers::typeset_breakable_item(Item * pre_p , Item * nobreak_p,
73                                        Item * post_p)
74 {
75     if (pre_p)
76         prebreak_item_p_arr_.push(pre_p);
77     if (nobreak_p)
78         nobreak_item_p_arr_.push(nobreak_p);
79     if (post_p)
80         postbreak_item_p_arr_.push(post_p);
81 }
82
83 void
84 Walker_registers::pre_move_processing()
85 {
86     // this generates all items.
87     Register_group_register::pre_move_processing();
88     walk_l_->ptr()->typeset_breakable_items(prebreak_item_p_arr_,
89                                             nobreak_item_p_arr_,
90                                             postbreak_item_p_arr_);
91 }
92 void
93 Walker_registers::post_move_processing()
94 {
95     Register_group_register::post_move_processing();
96 }
97
98
99 Staff_info
100 Walker_registers::get_staff_info() return inf;
101 {
102     if (walk_l_->score_walk_l_) // we get called ctors
103         inf.break_allowed_b_ = walk_l_->score_walk_l_->break_allowed_b();
104     inf.walk_l_ = walk_l_;
105     inf.time_C_ = &walk_l_->time_;
106     inf.rhythmic_C_ = walk_l_->default_grouping;
107 }
108
109 Paper_def*
110 Walker_registers::paper()const
111 {
112     return walk_l_->staff_l_->paper();
113 }