+RefPtr<Action> ProcessorBox::cut_action;
+RefPtr<Action> ProcessorBox::rename_action;
+RefPtr<Action> ProcessorBox::edit_action;
+Glib::RefPtr<Gdk::Pixbuf> SendProcessorEntry::_slider;
+
+ProcessorEntry::ProcessorEntry (boost::shared_ptr<Processor> p, Width w)
+ : _position (PreFader)
+ , _processor (p)
+ , _width (w)
+ , _visual_state (Gtk::STATE_NORMAL)
+{
+ _hbox.pack_start (_active, false, false);
+ _event_box.add (_name);
+ _hbox.pack_start (_event_box, true, true);
+ _vbox.pack_start (_hbox);
+ _frame.add (_vbox);
+
+ /* without this, the border is mis-drawn on some systems */
+ _vbox.set_border_width (1);
+
+ _name.set_alignment (0, 0.5);
+ _name.set_text (name ());
+ _name.set_padding (2, 2);
+
+ if (boost::dynamic_pointer_cast<Amp> (p)) {
+ /* Fader processor gets a special look */
+ _event_box.set_name ("ProcessorFader");
+ _frame.set_name ("ProcessorFaderFrame");
+ _name.set_padding (2, 4);
+ }
+
+ _active.set_active (_processor->active ());
+ _active.signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::active_toggled));
+
+ _frame.show ();
+ _vbox.show ();
+ _hbox.show ();
+ _event_box.show ();
+ _name.show ();
+ _active.show ();
+
+ _processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context());
+ _processor->PropertyChanged.connect (name_connection, invalidator (*this), ui_bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context());
+}
+
+EventBox&
+ProcessorEntry::action_widget ()
+{
+ return _event_box;
+}
+
+Gtk::Widget&
+ProcessorEntry::widget ()
+{
+ return _frame;
+}
+
+string
+ProcessorEntry::drag_text () const
+{
+ return name ();
+}
+
+void
+ProcessorEntry::set_visual_state (Gtk::StateType t)
+{
+ _visual_state = t;
+ setup_visuals ();
+}
+
+void
+ProcessorEntry::set_position (Position p)
+{
+ _position = p;
+ setup_visuals ();
+}
+
+void
+ProcessorEntry::setup_visuals ()
+{
+ switch (_position) {
+ case PreFader:
+ _event_box.set_name ("ProcessorPreFader");
+ if (_visual_state == Gtk::STATE_NORMAL) {
+ _frame.set_name ("ProcessorPreFaderFrame");
+ }
+ break;
+
+ case Fader:
+ _event_box.set_name ("ProcessorFader");
+ if (_visual_state == Gtk::STATE_NORMAL) {
+ _frame.set_name ("ProcessorFaderFrame");
+ }
+ break;
+
+ case PostFader:
+ _event_box.set_name ("ProcessorPostFader");
+ if (_visual_state == Gtk::STATE_NORMAL) {
+ _frame.set_name ("ProcessorPostFaderFrame");
+ }
+ break;
+ }
+
+ switch (_visual_state) {
+ case Gtk::STATE_NORMAL:
+ /* _frame has been set up above */
+ _event_box.set_state (Gtk::STATE_NORMAL);
+ break;
+ case Gtk::STATE_SELECTED:
+ _frame.set_name ("ProcessorFrameSelected");
+ /* don't change the background of the box when it is selected */
+ _event_box.set_state (Gtk::STATE_NORMAL);
+ break;
+ case Gtk::STATE_ACTIVE:
+ _frame.set_name ("ProcessorFrameActiveSend");
+ _event_box.set_state (Gtk::STATE_ACTIVE);
+ break;
+ default:
+ break;
+ }
+}
+
+
+boost::shared_ptr<Processor>
+ProcessorEntry::processor () const
+{
+ return _processor;
+}
+
+void
+ProcessorEntry::set_enum_width (Width w)
+{
+ _width = w;
+}
+
+void
+ProcessorEntry::active_toggled ()
+{
+ if (_active.get_active ()) {
+ if (!_processor->active ()) {
+ _processor->activate ();
+ }
+ } else {
+ if (_processor->active ()) {
+ _processor->deactivate ();
+ }
+ }
+}
+
+void
+ProcessorEntry::processor_active_changed ()
+{
+ if (_active.get_active () != _processor->active ()) {
+ _active.set_active (_processor->active ());
+ }
+}
+
+void
+ProcessorEntry::processor_property_changed (const PropertyChange& what_changed)
+{
+ if (what_changed.contains (ARDOUR::Properties::name)) {
+ _name.set_text (name ());
+ }
+}
+
+string
+ProcessorEntry::name () const
+{
+ boost::shared_ptr<Send> send;
+ string name_display;
+
+ if ((send = boost::dynamic_pointer_cast<Send> (_processor)) != 0 &&
+ !boost::dynamic_pointer_cast<InternalSend>(_processor)) {
+
+ name_display += '>';
+
+ /* grab the send name out of its overall name */
+
+ string::size_type lbracket, rbracket;
+ lbracket = send->name().find ('[');
+ rbracket = send->name().find (']');
+
+ switch (_width) {
+ case Wide:
+ name_display += send->name().substr (lbracket+1, lbracket-rbracket-1);
+ break;
+ case Narrow:
+ name_display += PBD::short_version (send->name().substr (lbracket+1, lbracket-rbracket-1), 4);
+ break;
+ }
+
+ } else {
+
+ switch (_width) {
+ case Wide:
+ name_display += _processor->display_name();
+ break;
+ case Narrow:
+ name_display += PBD::short_version (_processor->display_name(), 5);
+ break;
+ }
+
+ }
+
+ return name_display;
+}
+
+SendProcessorEntry::SendProcessorEntry (boost::shared_ptr<Send> s, Width w)
+ : ProcessorEntry (s, w),
+ _send (s),
+ /* set the adjustment to a gain of 0dB so that the fader's default value is right */
+ _adjustment (0.781787, 0, 1, 0.01, 0.1),
+ _fader (_slider, &_adjustment, 0, false),
+ _ignore_gain_change (false)
+{
+ _fader.set_name ("SendFader");
+ _fader.set_controllable (_send->amp()->gain_control ());
+ _vbox.pack_start (_fader);
+
+ _fader.show ();
+
+ _adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &SendProcessorEntry::gain_adjusted));
+ _send->amp()->gain_control()->Changed.connect (send_gain_connection, invalidator (*this), boost::bind (&SendProcessorEntry::show_gain, this), gui_context());
+ show_gain ();
+}
+
+void
+SendProcessorEntry::setup_slider_pix ()
+{
+ _slider = ::get_icon ("fader_belt_h_thin");
+ assert (_slider);
+}