]> git.donarmstrong.com Git - lilypond.git/blob - hdr/register.hh
0c47e35cd1979bd2ed7a8c6a04c7bc0b9e03c2e2
[lilypond.git] / hdr / register.hh
1 /*
2   register.hh -- part of LilyPond
3
4   (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
5 */
6
7 #ifndef REGISTER_HH
8 #define REGISTER_HH
9 #include "proto.hh"
10 #include "varray.hh"
11 #include "request.hh"
12
13 /// data container.
14 struct Staff_elem_info {
15     Staff_elem * elem_p_;
16     Request*req_l_;
17     const Voice * voice_l_;
18     Voice_group_registers * group_regs_l_; 
19     Request_register * origin_reg_l_;
20
21     /* *** */
22     Staff_elem_info(Staff_elem*, Request*, Request_register*);
23     Staff_elem_info();
24 };
25
26 /// Hungarian postfix: reg
27 /**
28   a struct which processes requests, and creates the Staff_elems  
29   */
30 struct Request_register {
31     Complex_walker * walk_l_;
32     Array<Request*> accepted_req_arr_;
33     
34     /* *************** */
35     /**
36       Warning: you can't copy a Request_register
37       */
38     Request_register(Request_register const &);
39     Request_register(Complex_walker*);
40     Request_register();
41     virtual ~Request_register(){}
42
43     /** take note of item/spaanner
44         put item in spanner. Adjust local key; etc.
45       */
46     virtual void acknowledge_element(Staff_elem_info){}
47     /**
48       Announce element to  walker
49       */
50     void announce_element(Staff_elem_info);
51
52     /**
53       invoke walker method to typeset element
54       */
55     void typeset_element(Staff_elem*elem_p);
56     
57     /**
58       try to fit the request in this register
59
60       @return
61       false: not noted,  not taken.
62
63       true: request swallowed. Don't try to put elsewhere
64
65       (may be we could use C++ exceptions.. :-)
66       */
67     virtual bool try_request(Request *req_l) =0;
68     
69     /// make items/spanners with the requests you got
70     virtual void process_request()=0;
71     Paperdef * paper() const;
72     /// typeset any spanners. Empty accepted_req_arr_
73     void pre_move_processing();
74     void post_move_processing();
75     virtual void set_dir(int){}
76 protected:
77     /// virtual, called by pre_move_process()
78     virtual void do_pre_move_process(){}
79     virtual void do_post_move_process(){}
80 };
81
82
83 #endif // REGISTER_HH
84