]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/register.hh
release: 0.0.71pre
[lilypond.git] / lily / include / register.hh
1 /*
2   register.hh -- declare Request_register
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9
10 #ifndef REGISTER_HH
11 #define REGISTER_HH
12
13 #include "lily-proto.hh"
14 #include "varray.hh"
15 #include "request.hh"
16 #include "score-elem-info.hh"
17 #include "staff-info.hh"
18
19
20
21
22 /**
23   a struct which processes requests, and creates the #Score_elem#s.
24   It may use derived classes. Hungarian postfix: register
25   */
26 class Request_register {
27     friend class Register_group_register;
28     /**
29       You cannot copy a Request_register
30      */
31     Request_register(const Request_register&){}
32
33     enum { 
34         VIRGIN,
35         CREATION_INITED,
36         MOVE_INITED,
37         ACCEPTED_REQS,
38         PROCESSED_REQS,
39         ACKED_REQS,
40         MOVE_DONE
41     } status;
42
43 protected:
44     
45
46     /// utility
47     virtual Paper_def * paper() const;
48
49     
50     /// make items/spanners with the requests you got
51     virtual void do_process_requests(){}
52
53     /** typeset any items/spanners. Default: do nothing
54      */
55     virtual void do_pre_move_processing(){}
56     /** reset any appropriate data. Default: do nothing
57      */
58     virtual void do_post_move_processing(){}
59    
60
61     virtual void do_creation_processing () {}
62     virtual void do_removal_processing() {}
63
64     /**
65       typeset a "command" item. Default: pass on to daddy.
66       If the column is not breakable, #pre_p# and #post_p# are junked
67       */
68     virtual void typeset_breakable_item(Item * nobreak_p);
69     /**
70       Invoke walker method to typeset element. Default: pass on to daddy.
71       */
72     virtual void typeset_element(Score_elem*elem_p);
73     
74      /**
75       take note of item/spanner
76       put item in spanner. Adjust local key; etc.
77
78       Default: ignore the info
79       */
80     virtual void acknowledge_element(Score_elem_info) {}
81     /**
82       Announce element. Default: pass on to daddy. Utility
83       */
84     virtual void announce_element(Score_elem_info);
85     /**
86       Set Feature of the register(s). Default: ignore Feature.
87      */
88     virtual void set_feature(Feature){}
89     /**
90       ask daddy for a feature
91      */
92     virtual Scalar get_feature(String type_str);
93     /**
94       Does this equal or contain a certain register?
95      */
96
97     virtual void sync_features() {}
98    
99     virtual bool contains_b(Request_register*reg_l)const;
100     /**
101       Get information on the staff. Default: ask daddy.
102       */
103     virtual Staff_info get_staff_info()const;
104     virtual void fill_staff_info(Staff_info&);
105
106
107     virtual void do_print()const;  
108     /*    
109           @see{try_request}
110           Default: always return false
111       */
112     virtual bool do_try_request(Request *req_l);
113 public:
114     void pre_move_processing();
115     void process_requests();
116     /**
117       try to fit the request in this register
118
119       @return
120       false: not noted,  not taken.
121
122       true: request swallowed. Don't try to put the request elsewhere.
123
124       */
125     bool try_request(Request*);
126
127     void post_move_processing();
128     
129     Register_group_register * daddy_reg_l_;
130
131     Request_register();
132     virtual ~Request_register(){}
133     NAME_MEMBERS();
134     void print() const;
135 };
136
137 /**
138   A macro to automate administration of registers.
139  */
140 #define ADD_THIS_REGISTER(c)                            \
141 struct c ## init {                                      \
142     static Request_register * globalctor (){            \
143         return new c;                                   \
144     }                                                   \
145     c ## init () {                                      \
146         add_request_register(c::static_name(), globalctor);     \
147                                                         \
148     }                                                   \
149 } _ ## c ## init;
150
151 typedef Request_register*(*Reg_ctor)(void);
152 void add_request_register(String s, Reg_ctor f);
153
154 #endif // REGISTER_HH
155