summaryrefslogtreecommitdiff
path: root/lily/instrument-name-engraver.cc
blob: 2f361f0fe5204f0d2a3393973d733fb0b3043ebd (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
  instrument-name-engraver.cc -- implement Instrument_name_engraver

  source file of the GNU LilyPond music typesetter

  (c) 2000--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/

#include "engraver.hh"
#include "spanner.hh"
#include "pointer-group-interface.hh"
#include "side-position-interface.hh"
#include "axis-group-interface.hh"
#include "align-interface.hh"
#include "text-interface.hh"
#include "system.hh"

#include "translator.icc"

class Instrument_name_engraver : public Engraver
{
public:
  TRANSLATOR_DECLARATIONS (Instrument_name_engraver);

protected:
  Spanner *text_spanner_;

  virtual void finalize ();
  DECLARE_ACKNOWLEDGER (axis_group);
  void process_music ();
};

Instrument_name_engraver::Instrument_name_engraver ()
{
  text_spanner_ = 0;
}

void
Instrument_name_engraver::process_music ()
{
  if (!text_spanner_)
    {
      SCM long_text = get_property ("instrument");
      SCM short_text = get_property ("instr");

      if (!(Text_interface::is_markup (long_text)
	    || Text_interface::is_markup (short_text)))
	{
	  long_text = get_property ("vocalName");
	  short_text = get_property ("vocNam");
	}
  
      if (Text_interface::is_markup (long_text)
	  || Text_interface::is_markup (short_text))
	{
	  text_spanner_ = make_spanner ("InstrumentName", SCM_EOL);
	  
	  Grob *col = unsmob_grob (get_property ("currentCommandColumn"));
	  text_spanner_->set_bound (LEFT, col);
	  text_spanner_->set_property ("text", short_text);
	  text_spanner_->set_property ("long-text", long_text);
	}
    }
}

void
Instrument_name_engraver::acknowledge_axis_group (Grob_info info)
{
  if (text_spanner_ 
      && dynamic_cast<Spanner *> (info.grob ())
      && Axis_group_interface::has_axis (info.grob (), Y_AXIS)
      && (!Align_interface::has_interface (info.grob ())))
    {
      Grob *staff = info.grob();
      Pointer_group_interface::add_grob (text_spanner_, ly_symbol2scm ("elements"), staff);
    }
}

void
Instrument_name_engraver::finalize ()
{
  if (text_spanner_)
    {
      text_spanner_->set_bound (RIGHT,
				unsmob_grob (get_property ("currentCommandColumn")));

      Pointer_group_interface::set_ordered (text_spanner_, ly_symbol2scm ("elements"), false);

      System *system = get_root_system (text_spanner_);

      /*
	UGH, should handle this in Score_engraver.
       */
      if (system)
	Axis_group_interface::add_element (system, text_spanner_);
      else
	text_spanner_->programming_error ("can't find root system");
    }
}

#include "translator.icc"

ADD_ACKNOWLEDGER (Instrument_name_engraver, axis_group);

ADD_TRANSLATOR (Instrument_name_engraver,

		/* doc */
		"Creates a system start text for instrument or vocal names.",
		
		/* create */
		"InstrumentName ",
		
		/* accept */
		"",
		
		/* read */
		"vocNam vocalName instrument instr "
		"currentCommandColumn",

		/* write */ "");