--- /dev/null
+/*
+ multi_measure_rest-engraver.hh -- declare Multi_measure_rest_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#ifndef MULTI_MEASURE_REST_ENGRAVER_HH
+#define MULTI_MEASURE_REST_ENGRAVER_HH
+
+#include "engraver.hh"
+#include "moment.hh"
+
+/**
+ */
+class Multi_measure_rest_engraver : public Engraver
+{
+public:
+ TRANSLATOR_CLONE(Multi_measure_rest_engraver);
+ DECLARE_MY_RUNTIME_TYPEINFO;
+ Multi_measure_rest_engraver ();
+
+protected:
+ virtual void do_removal_processing ();
+ virtual void do_process_requests ();
+ virtual bool do_try_request (Request*);
+ virtual void do_pre_move_processing ();
+
+private:
+ bool part_b_;
+ Moment last_mom_;
+ Multi_measure_rest_req* multi_measure_req_l_;
+ Multi_measure_rest* mmrest_p_;
+};
+
+#endif // MULTI_MEASURE_REST_ENGRAVER_HH
--- /dev/null
+/*
+ multi-measure-rest.hh -- declare Multi_measure_rest
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+
+ */
+
+#ifndef MULTI_MEASURE_REST_HH
+#define MULTI_MEASURE_REST_HH
+
+#include "item.hh"
+
+class Multi_measure_rest : public Item
+{
+public:
+ Multi_measure_rest ();
+ int measures_i_;
+
+ DECLARE_MY_RUNTIME_TYPEINFO;
+
+protected:
+ virtual void do_print () const;
+ virtual Molecule *brew_molecule_p () const;
+};
+
+#endif /* MULTI_MEASURE_REST_HH */
+
--- /dev/null
+/*
+ multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#include "proto.hh"
+#include "musical-request.hh"
+#include "multi-measure-rest.hh"
+#include "multi-measure-rest-engraver.hh"
+#include "score-column.hh"
+
+IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_engraver, Engraver);
+ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
+
+Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
+{
+ last_mom_ = 0;
+ multi_measure_req_l_ = 0;
+ mmrest_p_ = 0;
+}
+
+bool
+Multi_measure_rest_engraver::do_try_request (Request* req_l)
+{
+ if (!req_l->musical () || !req_l->musical ()->multi_measure ())
+ return false;
+
+ multi_measure_req_l_ = req_l->musical ()->multi_measure ();
+ last_mom_ = now_moment () + multi_measure_req_l_->duration_.length ();
+
+ return true;
+}
+
+void
+Multi_measure_rest_engraver::do_removal_processing ()
+{
+ if (mmrest_p_)
+ {
+ typeset_element (mmrest_p_);
+ mmrest_p_ = 0;
+ }
+}
+
+void
+Multi_measure_rest_engraver::do_process_requests ()
+{
+ if (mmrest_p_ || !multi_measure_req_l_)
+ return;
+
+ mmrest_p_ = new Multi_measure_rest;
+
+ Scalar prop = get_property ("part");
+ if (prop.isnum_b ())
+ part_b_ = prop.to_bool ();
+
+// if (!part_b_)
+// return;
+
+ int measures_i = (int)multi_measure_req_l_->duration_.plet_.iso_i_;
+ if (part_b_)
+ mmrest_p_->measures_i_ = measures_i;
+
+ announce_element (Score_elem_info (mmrest_p_, multi_measure_req_l_));
+
+ multi_measure_req_l_ = 0;
+}
+
+void
+Multi_measure_rest_engraver::do_pre_move_processing ()
+{
+ if (!mmrest_p_)
+ return;
+
+ typeset_element (mmrest_p_);
+ mmrest_p_ = 0;
+
+ if (part_b_)
+ return;
+
+ if (last_mom_ <= now_moment () + Moment (1))
+ multi_measure_req_l_ = 0;
+}
+
--- /dev/null
+/*
+ multi-measure-rest.cc -- implement Multi_measure_rest
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998 Jan Nieuwenhuizen <jan@digicash.com>
+
+ */
+
+#include "multi-measure-rest.hh"
+#include "debug.hh"
+#include "paper-def.hh"
+#include "lookup.hh"
+#include "dimen.hh"
+#include "rest.hh"
+#include "script.hh"
+#include "text-def.hh"
+#include "molecule.hh"
+
+IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest, Item);
+
+Multi_measure_rest::Multi_measure_rest ()
+{
+ measures_i_ = 0;
+}
+
+void
+Multi_measure_rest::do_print () const
+{
+ DOUT << "measures_i_ " << measures_i_;
+}
+
+Molecule*
+Multi_measure_rest::brew_molecule_p () const
+{
+ /*
+ [TODO] 3
+ * make real multi-measure rest symbol: |---|
+ * make two,four,eight-measure-rest symbols
+ */
+
+ Atom s (paper ()->lookup_l ()->rest (0, 0));
+ Molecule* mol_p = new Molecule ( Atom (s));
+ Real interline_f = paper ()->interline_f ();
+ mol_p->translate_axis (interline_f, Y_AXIS);
+
+ if (measures_i_)
+ {
+ Text_def text;
+ text.text_str_ = measures_i_;
+ text.style_str_ = "number";
+ Atom s = text.get_atom (paper (), UP);
+ s.translate_axis (3.0 * interline_f, Y_AXIS);
+ mol_p->add (s);
+ }
+
+ return mol_p;
+}
+