]> git.donarmstrong.com Git - lilypond.git/blobdiff - hdr/register.hh
partial: 0.0.38.hanjan
[lilypond.git] / hdr / register.hh
index e2b5167d8d0d405f70967708fc86bf5213606ff4..95dfe1e67b8e48afc64436a0ab6a6d1a3eb728f5 100644 (file)
 
 #ifndef REGISTER_HH
 #define REGISTER_HH
+
 #include "proto.hh"
 #include "varray.hh"
+#include "request.hh"
+#include "staffeleminfo.hh"
 
-/// data container.
-struct Staff_elem_info {
-    Staff_elem * elem_p_;
-    Request*req_l_;
-    const Voice * voice_l_;
-    Voice_group_registers * group_regs_l_;
-    Request_register * origin_reg_l_;
-
-    /****/
-    Staff_elem_info(Staff_elem*, Request*, Request_register*);
-    Staff_elem_info();
-};
 
-/// Hungarian postfix: reg
-struct Request_register {
+/**
+  a struct which processes requests, and creates the #Staff_elem#s.
+   Hungarian postfix: reg
+  */
+class Request_register {
+    /**
+      Warning: you can't copy a #Request_register#
+      */
+    Request_register(Request_register const &);
+public:
     Complex_walker * walk_l_;
     Array<Request*> accepted_req_arr_;
     
-    /****************/
-
     Request_register(Complex_walker*);
     Request_register();
     virtual ~Request_register(){}
 
-    /// take note of item/spaanner
-    virtual void acknowledge_element(Staff_elem_info){}
     /**
+      take note of item/spanner
       put item in spanner. Adjust local key; etc.
+
+      Default: ignore the info
       */
-    
-    ///
-    virtual bool try_request(Request *req_l) =0;
+    virtual void acknowledge_element(Staff_elem_info){}
+
     /**
       try to fit the request in this register
 
-      RETURN
-      false: request noted, but not taken.
+      @return
+      false: not noted,  not taken.
 
-      true: request swallowed. Don't try to put elsewhere
+      true: request swallowed. Don't try to put the request elsewhere.
 
       (may be we could use C++ exceptions.. :-)
-      */
 
+      #Request_register::try_request# always returns false
+      */
+    virtual bool try_request(Request *req_l);
+    
     /// make items/spanners with the requests you got
-    virtual void process_request()=0;
+    virtual void process_request(){}
 
-    /// typeset any spanners. Empty accepted_req_arr_
+    /// typeset any spanners. Empty #accepted_req_arr_#
     void pre_move_processing();
+    /// reset any appropriate data.
     void post_move_processing();
-    
+    virtual bool acceptable_request_b(Request*) const;    
+    virtual void set_dir(int){}
 protected:
-    /// virtual, called by pre_move_process()
-    virtual void do_pre_move_process(){}
-    virtual void do_post_move_process(){}
-};
-/**
-  a struct which processes requests, and creates the Staff_elems  
-  */
+    /// utility
+    Paperdef * paper() const;
 
-struct Notehead_register : Request_register {
-    Item* note_p_;
-    /****************/
-    Notehead_register(Complex_walker*);
-    virtual bool try_request(Request *req_l) ;
-    virtual void process_request();
-    virtual void do_pre_move_process();
-};
-
-struct Slur_register : Request_register {
-    Array<Slur_req*> requests_arr_;
-    Array<Slur *> slur_l_stack_;
-    Array<Slur*> end_slur_l_arr_;
-    
-    /****************/
-    ~Slur_register();
-    Slur_register(Complex_walker*);
-    virtual bool try_request(Request*);
-    virtual void process_request();
-    virtual void acknowledge_element(Staff_elem_info);
-    virtual void do_pre_move_process();
-};
 
-struct Stem_beam_register : Request_register {
-    Stem * stem_p_;
-    Beam * beam_p_;
-    Beam_req * beam_req_l_;
-    Stem_req * stem_req_l_;
-    Beam_req * start_req_l_;
-    bool end_beam_b_;
-    Rhythmic_grouping *current_grouping;
-    int default_dir_i_;
-    
-    /****************/
-    Stem_beam_register(Complex_walker*);
-    ~Stem_beam_register();
-    void set_dir(int dir_i_);
-    virtual bool try_request(Request*);
-    virtual void process_request();
-    virtual void acknowledge_element(Staff_elem_info);
-    virtual void do_pre_move_process();
-    virtual void do_post_move_process();
-};
-
-struct   Script_register : Request_register {
-    Script * script_p_;
-    
-    /****************/
-    void set_dir(int dir_i_);
-    Script_register(Complex_walker*);
-    virtual bool try_request(Request*);
-    virtual void process_request();
-    virtual void acknowledge_element(Staff_elem_info);
-    virtual void do_pre_move_process();
-};
+     /**
+      invoke walker method to typeset element
+      */
+    void typeset_element(Staff_elem*elem_p);
 
-struct Text_register : Request_register{
-    Text_item * text_p_;
 
-    /****************/
-    void set_dir(int dir_i_);
-    Text_register(Complex_walker*);
-    virtual bool try_request(Request*);
-    virtual void process_request();
-    virtual void do_pre_move_process();
+    /**
+      typeset a "command" item.
+      If the column is not breakable, #pre_p# and #post_p# are junked
+      */
+    void typeset_breakable_item(Item * pre_p , Item * nobreak_p, Item * post_p);
+    /** virtual, called by #pre_move_processing()#
+      #Request_register::do_pre_move_process()# defaults to NOP
+      */
+    virtual void do_pre_move_process(){}
+    /** virtual, called by #post_move_processing#,
+      #Request_register::do_post_move_process()# defaults to NOP */
+    virtual void do_post_move_process(){}
+    /**
+      Announce element to walker. Utility
+      */
+    void announce_element(Staff_elem_info);
 };
 
 
-struct Local_key_register : Request_register {
-    Local_key_item* key_item_p_;
-
-    /****************/
-    
-    virtual bool try_request(Request*);
-    virtual void process_request();
-    virtual void acknowledge_element(Staff_elem_info);
-    virtual void do_pre_move_process();
-    Local_key_register(Complex_walker*);
-};
-
 #endif // REGISTER_HH