Fix displaying of notes in auto-created MIDI region when it's the first region in...
[ardour.git] / gtk2_ardour / editor.h
index 2d44538cb7d16b8e38425a96497af704ca57ce1f..7e96f9c9c551823545750994e93b30451fdce588 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #ifndef __ardour_editor_h__
 #include <string>
 #include <sys/time.h>
 
+#include <glibmm/ustring.h>
+
+#include <boost/optional.hpp>
+
 #include <libgnomecanvasmm/canvas.h>
 #include <libgnomecanvasmm/group.h>
 #include <libgnomecanvasmm/line.h>
+#include <libgnomecanvasmm/pixbuf.h>
 
 #include <cmath>
 
 #include "region_selection.h"
 #include "canvas.h"
 #include "draginfo.h"
+#include "tempo_lines.h"
 
 namespace Gtkmm2ext {
        class TearOff;
 }
 
-namespace LinuxAudioSystems {
-       class AudioEngine;
-}
-
 namespace ARDOUR {
        class AudioDiskstream;
        class RouteGroup;
@@ -75,8 +76,9 @@ namespace ARDOUR {
        class TempoSection;
        class NamedSelection;
        class Session;
-       class AudioFilter;
+       class Filter;
        class Crossfade;
+       class ChanCount;
 }
 
 namespace LADSPA {
@@ -84,7 +86,6 @@ namespace LADSPA {
 }
 
 class TimeAxisView;
-class RouteTimeAxisView;
 class AudioTimeAxisView;
 class AutomationTimeAxisView;
 class AudioRegionView;
@@ -104,6 +105,7 @@ class MixerStrip;
 class StreamView;
 class AudioStreamView;
 class ControlPoint;
+class SoundFileOmega;
 #ifdef FFT_ANALYSIS
 class AnalysisWindow;
 #endif
@@ -122,7 +124,7 @@ class TimeAxisViewItem ;
 class Editor : public PublicEditor
 {
   public:
-       Editor (ARDOUR::AudioEngine&);
+       Editor ();
        ~Editor ();
 
        void             connect_to_session (ARDOUR::Session *);
@@ -145,13 +147,19 @@ class Editor : public PublicEditor
 
        void set_mouse_mode (Editing::MouseMode, bool force=true);
        void step_mouse_mode (bool next);
-       Editing::MouseMode current_mouse_mode () { return mouse_mode; }
+       Editing::MouseMode current_mouse_mode () const { return mouse_mode; }
+       
+       void set_midi_edit_cursor (Editing::MidiEditMode);
+       void set_midi_edit_mode (Editing::MidiEditMode, bool force=true);
+       Editing::MidiEditMode current_midi_edit_mode () const { return midi_edit_mode; }
 
+#ifdef WITH_CMT
        void add_imageframe_time_axis(const std::string & track_name, void*) ;
        void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
        void connect_to_image_compositor() ;
        void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
        TimeAxisView* get_named_time_axis(const std::string & name) ;
+#endif
 
        void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
        void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
@@ -221,9 +229,9 @@ class Editor : public PublicEditor
        bool extend_selection_to_track (TimeAxisView&);
 
        void play_selection ();
-       void select_all_in_track (Selection::Operation op);
+       void select_all_in_selected_tracks (Selection::Operation op);
        void select_all (Selection::Operation op);
-       void invert_selection_in_track ();
+       void invert_selection_in_selected_tracks ();
        void invert_selection ();
 
        /* tempo */
@@ -247,6 +255,7 @@ class Editor : public PublicEditor
 
 
        void add_toplevel_controls (Gtk::Container&);
+       Gtk::HBox& get_status_bar_packer()  { return status_bar_hpacker; }
 
        void      set_zoom_focus (Editing::ZoomFocus);
        Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
@@ -262,14 +271,16 @@ class Editor : public PublicEditor
        nframes_t leftmost_frame;
        void clear_playlist (boost::shared_ptr<ARDOUR::Playlist>);
 
-       void new_playlists ();
-       void copy_playlists ();
-       void clear_playlists ();
+       void new_playlists (TimeAxisView* v);
+       void copy_playlists (TimeAxisView* v);
+       void clear_playlists (TimeAxisView* v);
 
        TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
 
        Width editor_mixer_strip_width;
+       void maybe_add_mixer_strip_width (XMLNode&);
        void show_editor_mixer (bool yn);
+       void show_editor_list (bool yn);
        void set_selected_mixer_strip (TimeAxisView&);
        void hide_track_in_display (TimeAxisView& tv);
        void show_track_in_display (TimeAxisView& tv);
@@ -294,6 +305,7 @@ class Editor : public PublicEditor
        void toggle_waveform_visibility ();
        void toggle_waveforms_while_recording ();
        void toggle_measure_visibility ();
+       void toggle_logo_visibility ();
 
        /* SMPTE timecode & video sync */
 
@@ -310,6 +322,7 @@ class Editor : public PublicEditor
        void toggle_xfades_active ();
        void toggle_xfade_visibility ();
        bool xfade_visibility() const { return _xfade_visibility; }
+       void update_xfade_visibility ();
        void update_crossfade_model ();
        void set_crossfade_model (ARDOUR::CrossfadeModel);
 
@@ -340,6 +353,10 @@ class Editor : public PublicEditor
        void reset_zoom (double);
        void reposition_and_zoom (nframes_t, double);
 
+       nframes_t edit_cursor_position(bool);
+       bool update_mouse_speed ();
+       bool decelerate_mouse_speed ();
+
   protected:
        void map_transport_state ();
        void map_position_change (nframes_t);
@@ -347,16 +364,21 @@ class Editor : public PublicEditor
        void on_realize();
 
   private:
-       
+
+       /// The session that we are editing, or 0
+       void color_handler ();
        ARDOUR::Session     *session;
-       ARDOUR::AudioEngine& engine;
        bool                 constructed;
 
+       // to keep track of the playhead position for control_scroll
+       boost::optional<nframes_t> _control_scroll_target;
        PlaylistSelector* _playlist_selector;
 
        void          set_frames_per_unit (double);
 
-       Editing::MouseMode mouse_mode;
+       Editing::MouseMode    mouse_mode;
+       Editing::MidiEditMode midi_edit_mode;
 
        int  post_maximal_editor_width;
        int  post_maximal_pane_position;
@@ -412,9 +434,14 @@ class Editor : public PublicEditor
        void clear_marker_display ();
        void mouse_add_new_marker (nframes_t where);
 
-       TimeAxisView*      clicked_trackview;
-       AudioTimeAxisView* clicked_audio_trackview;
+       TimeAxisView*      clicked_axisview;
+       RouteTimeAxisView* clicked_routeview;
+        /** The last RegionView that was clicked on, or 0 if the last click was not
+         * on a RegionView.  This is set up by the canvas event handlers in
+         * editor_canvas_events.cc
+         */
        RegionView*        clicked_regionview;
+       
        RegionView*        latest_regionview;
        uint32_t           clicked_selection;
        CrossfadeView*     clicked_crossfadeview;
@@ -422,16 +449,16 @@ class Editor : public PublicEditor
 
        void sort_track_selection ();
 
-       void get_relevant_audio_tracks (std::set<AudioTimeAxisView*>& relevant_tracks);
-       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&);
-       void mapover_audio_tracks (sigc::slot<void,AudioTimeAxisView&,uint32_t> sl);
+       void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
+       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const;
+       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*) const;
 
-       /* functions to be passed to mapover_audio_tracks(), possibly with sigc::bind()-supplied arguments */
+       /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
 
-       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*);
-       void mapped_use_new_playlist (AudioTimeAxisView&, uint32_t);
-       void mapped_use_copy_playlist (AudioTimeAxisView&, uint32_t);
-       void mapped_clear_playlist (AudioTimeAxisView&, uint32_t);
+       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*) const;
+       void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t);
+       void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t);
+       void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
 
        /* end */
 
@@ -448,32 +475,20 @@ class Editor : public PublicEditor
        bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
 
        void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
-       bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr<ARDOUR::Region>);
        void collect_new_region_view (RegionView *);
 
-       Gtk::Menu track_context_menu;
-       Gtk::Menu track_region_context_menu;
-       Gtk::Menu track_selection_context_menu;
-       Gtk::Menu track_crossfade_context_menu;
-
        Gtk::MenuItem* region_edit_menu_split_item;
        Gtk::MenuItem* region_edit_menu_split_multichannel_item;
-       Gtk::Menu * track_region_edit_playlist_menu;
-       Gtk::Menu * track_edit_playlist_submenu;
-       Gtk::Menu * track_selection_edit_playlist_submenu;
-       
-       void popup_track_context_menu (int, int, ItemType, bool, nframes_t);
+
+       void popup_track_context_menu (int, int, nframes_t);
        Gtk::Menu* build_track_context_menu (nframes_t);
-       Gtk::Menu* build_track_bus_context_menu (nframes_t);
-       Gtk::Menu* build_track_region_context_menu (nframes_t frame);
-       Gtk::Menu* build_track_crossfade_context_menu (nframes_t);
-       Gtk::Menu* build_track_selection_context_menu (nframes_t);
-       void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
-       void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
-       void add_region_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Region>, Gtk::Menu_Helpers::MenuList&);
+       void add_bus_or_audio_track_context_items (Gtk::Menu_Helpers::MenuList&);
+       void add_region_context_items (Gtk::Menu_Helpers::MenuList&);
        void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Crossfade>, Gtk::Menu_Helpers::MenuList&, bool many);
        void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
 
+       void add_item_with_sensitivity (Gtk::Menu_Helpers::MenuList&, Gtk::Menu_Helpers::MenuElem, bool) const;
+
        void handle_new_route (ARDOUR::Session::RouteList&);
        void remove_route (TimeAxisView *);
        bool route_removal;
@@ -505,8 +520,10 @@ class Editor : public PublicEditor
        Gtk::EventBox      time_canvas_event_box;
        Gtk::EventBox      track_canvas_event_box;
        Gtk::EventBox      time_button_event_box;
+       Gtk::Frame         time_button_frame;
 
        ArdourCanvas::Group      *minsec_group;
+       ArdourCanvas::Pixbuf     *logo_item;
        ArdourCanvas::Group      *bbt_group;
        ArdourCanvas::Group      *smpte_group;
        ArdourCanvas::Group      *frame_group;
@@ -561,6 +578,7 @@ class Editor : public PublicEditor
        gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
        gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
 
+       Gtk::Widget        *_ruler_separator;
        GtkWidget          *_smpte_ruler;
        GtkWidget          *_bbt_ruler;
        GtkWidget          *_frames_ruler;
@@ -581,13 +599,6 @@ class Editor : public PublicEditor
        ArdourCanvas::SimpleRect* range_marker_bar;
        ArdourCanvas::SimpleRect* transport_marker_bar;
 
-       
-       ArdourCanvas::SimpleLine* tempo_line;
-       ArdourCanvas::SimpleLine* meter_line;
-       ArdourCanvas::SimpleLine* marker_line;
-       ArdourCanvas::SimpleLine* range_marker_line;
-       ArdourCanvas::SimpleLine* transport_marker_line;
-
        Gtk::Label  minsec_label;
        Gtk::Label  bbt_label;
        Gtk::Label  smpte_label;
@@ -609,7 +620,7 @@ class Editor : public PublicEditor
            nframes_t        current_frame;
            double                length;
 
-           Cursor (Editor&, const string& color, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
+           Cursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
            ~Cursor ();
 
            void set_position (nframes_t);
@@ -759,7 +770,7 @@ class Editor : public PublicEditor
 
        /* snapshots */
 
-       Gtk::ScrolledWindow      snapshot_display_scroller;
+       Gtk::ScrolledWindow snapshot_display_scroller;
        struct SnapshotDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
            SnapshotDisplayModelColumns() { 
                    add (visible_name);
@@ -772,10 +783,12 @@ class Editor : public PublicEditor
        SnapshotDisplayModelColumns snapshot_display_columns;
        Glib::RefPtr<Gtk::ListStore> snapshot_display_model;
        Gtk::TreeView snapshot_display;
+       Gtk::Menu snapshot_context_menu;
 
        bool snapshot_display_button_press (GdkEventButton*);
        void snapshot_display_selection_changed ();
        void redisplay_snapshots();
+       void popup_snapshot_context_menu (int, int32_t, Glib::ustring);
 
        /* named selections */
 
@@ -797,6 +810,8 @@ class Editor : public PublicEditor
        void create_named_selection ();
        void paste_named_selection (float times);
        void remove_selected_named_selections ();
+       void remove_snapshot (Glib::ustring);
+       void rename_snapshot (Glib::ustring);
 
        void handle_new_named_selection ();
        void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
@@ -807,7 +822,6 @@ class Editor : public PublicEditor
        void named_selection_display_selection_changed ();
 
        /* track views */
-       int track_spacing;
        TrackViewList  track_views;
        TimeAxisView     *trackview_by_y_position (double ypos);
 
@@ -819,6 +833,9 @@ class Editor : public PublicEditor
        static Gdk::Cursor* time_fx_cursor;
        static Gdk::Cursor* fader_cursor;
        static Gdk::Cursor* speaker_cursor;
+       static Gdk::Cursor* midi_pencil_cursor;
+       static Gdk::Cursor* midi_select_cursor;
+       static Gdk::Cursor* midi_erase_cursor;
        static Gdk::Cursor* wait_cursor;
        static Gdk::Cursor* timebar_cursor;
 
@@ -849,16 +866,17 @@ class Editor : public PublicEditor
 
        int ensure_cursor (nframes_t* pos);
 
-       void handle_new_audio_region (boost::weak_ptr<ARDOUR::AudioRegion>);
-       void handle_audio_region_removed (boost::weak_ptr<ARDOUR::AudioRegion>);
-       void add_audio_region_to_region_display (boost::shared_ptr<ARDOUR::AudioRegion>);
+       void handle_new_region (boost::weak_ptr<ARDOUR::Region>);
+       void handle_region_removed (boost::weak_ptr<ARDOUR::Region>);
+       void add_region_to_region_display (boost::shared_ptr<ARDOUR::Region>);
        void region_hidden (boost::shared_ptr<ARDOUR::Region>);
        void redisplay_regions ();
-       void insert_into_tmp_audio_regionlist(boost::shared_ptr<ARDOUR::AudioRegion>);
+       void insert_into_tmp_regionlist(boost::shared_ptr<ARDOUR::Region>);
 
-       list<boost::shared_ptr<ARDOUR::AudioRegion> > tmp_audio_region_list;
+       list<boost::shared_ptr<ARDOUR::Region> > tmp_region_list;
 
        void cut_copy (Editing::CutCopyOp);
+       bool can_cut_copy () const;
        void cut_copy_points (Editing::CutCopyOp);
        void cut_copy_regions (Editing::CutCopyOp);
        void cut_copy_ranges (Editing::CutCopyOp);
@@ -872,9 +890,8 @@ class Editor : public PublicEditor
        void toggle_region_mute ();
        void toggle_region_lock ();
        void toggle_region_opaque ();
-       void raise_region ();
+       void toggle_region_position_lock ();
        void raise_region_to_top ();
-       void lower_region ();
        void lower_region_to_bottom ();
        void split_region ();
        void split_region_at (nframes_t);
@@ -887,8 +904,8 @@ class Editor : public PublicEditor
        void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position);
        void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
        void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes_t position);
+       void remove_selected_regions ();
        void remove_clicked_region ();
-       void destroy_clicked_region ();
        void edit_region ();
        void duplicate_some_regions (RegionSelection&, float times);
        void duplicate_selection (float times);
@@ -898,9 +915,10 @@ class Editor : public PublicEditor
        void audition_playlist_region_standalone (boost::shared_ptr<ARDOUR::Region>);
        void audition_playlist_region_via_route (boost::shared_ptr<ARDOUR::Region>, ARDOUR::Route&);
        void split_multichannel_region();
-       void reverse_region ();
-       void normalize_region ();
-       void denormalize_region ();
+       void reverse_regions ();
+       void normalize_regions ();
+       void denormalize_regions ();
+       void quantize_regions ();
 
        void audition_region_from_region_list ();
        void hide_region_from_region_list ();
@@ -949,18 +967,35 @@ class Editor : public PublicEditor
        void amplitude_zoom (gdouble scale);
        void amplitude_zoom_step (bool in);
 
-       void insert_region_list_drag (boost::shared_ptr<ARDOUR::AudioRegion>, int x, int y);
+       void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
        void insert_region_list_selection (float times);
 
+       /* import & embed */
+       
        void add_external_audio_action (Editing::ImportMode);
+       void external_audio_dialog ();
+       bool check_multichannel_status (const std::vector<Glib::ustring>& paths);
+
+       SoundFileOmega* sfbrowser;
+       
+       void bring_in_external_audio (Editing::ImportMode mode,  nframes64_t& pos);
+       void do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t&);
+
+       void _do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
+       void do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
+       bool idle_do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
 
-       void bring_in_external_audio (Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t& pos, bool prompt);
-       void do_import (vector<Glib::ustring> paths, bool split, Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t&, bool);
-       void do_embed (vector<Glib::ustring> paths, bool split, Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t&, bool);
-       int  import_sndfile (vector<Glib::ustring> paths, Editing::ImportMode mode, ARDOUR::AudioTrack* track, nframes_t& pos);
-       int  embed_sndfile (vector<Glib::ustring> paths, bool split, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, 
-                           ARDOUR::AudioTrack* track, nframes_t& pos, bool prompt);
-       int finish_bringing_in_audio (boost::shared_ptr<ARDOUR::AudioRegion> region, uint32_t, uint32_t, ARDOUR::AudioTrack* track, nframes_t& pos, Editing::ImportMode mode);
+       int  import_sndfiles (vector<Glib::ustring> paths, Editing::ImportMode mode,  ARDOUR::SrcQuality, nframes64_t& pos,
+                             int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&);
+       int  embed_sndfiles (vector<Glib::ustring> paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, 
+                            nframes64_t& pos, int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&);
+
+       int add_sources (vector<Glib::ustring> paths, ARDOUR::SourceList& sources, nframes64_t& pos, Editing::ImportMode,
+                        int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&, bool add_channel_suffix);
+       int finish_bringing_in_audio (boost::shared_ptr<ARDOUR::AudioRegion> region, uint32_t, uint32_t,  nframes64_t& pos, Editing::ImportMode mode,
+                                     boost::shared_ptr<ARDOUR::AudioTrack>& existing_track);
+
+       boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const;
 
        /* generic interthread progress window */
        
@@ -1031,7 +1066,11 @@ class Editor : public PublicEditor
 
        void add_location_from_audio_region ();
        void add_location_from_selection ();
-       void set_route_loop_selection ();
+       void set_loop_from_selection (bool play);
+       void set_punch_from_selection ();
+       
+       void set_loop_range (nframes_t start, nframes_t end, std::string cmd);
+       void set_punch_range (nframes_t start, nframes_t end, std::string cmd);
 
        void add_location_from_playhead_cursor ();
 
@@ -1041,6 +1080,18 @@ class Editor : public PublicEditor
        void start_scrolling ();
        void stop_scrolling ();
 
+       bool _scrubbing;
+       bool have_full_mouse_speed;
+       nframes64_t last_scrub_frame;
+       double last_scrub_time;
+       int mouse_speed_update;
+       double mouse_direction;
+       double compute_mouse_speed ();
+       void add_mouse_speed (double, double);
+       double* mouse_speed;
+       size_t mouse_speed_entries;
+       size_t mouse_speed_size;
+
        void keyboard_selection_begin ();
        void keyboard_selection_finish (bool add);
        bool have_pending_keyboard_selection;
@@ -1052,6 +1103,8 @@ class Editor : public PublicEditor
 
        Editing::SnapType snap_type;
        Editing::SnapMode snap_mode;
+
+       /// Snap threshold in pixels
        double snap_threshold;
 
        void handle_gui_changes (const string &, void *);
@@ -1084,6 +1137,8 @@ class Editor : public PublicEditor
        std::set<boost::shared_ptr<ARDOUR::Playlist> > motion_frozen_playlists;
        void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
        void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
+       void create_region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
+       void create_region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
 
        bool _dragging_playhead;
 
@@ -1104,6 +1159,7 @@ class Editor : public PublicEditor
        gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*);
 
        void start_region_grab (ArdourCanvas::Item*, GdkEvent*);
+       void start_create_region_grab (ArdourCanvas::Item*, GdkEvent*);
        void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*);
        void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*);
        void start_selection_grab (ArdourCanvas::Item*, GdkEvent*);
@@ -1170,9 +1226,13 @@ class Editor : public PublicEditor
 
        bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
        bool canvas_edit_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
-       bool track_canvas_event (GdkEvent* event, ArdourCanvas::Item*);
        bool track_canvas_scroll (GdkEventScroll* event);
 
+       bool track_canvas_scroll_event (GdkEventScroll* event);
+       bool track_canvas_button_press_event (GdkEventButton* event);
+       bool track_canvas_button_release_event (GdkEventButton* event);
+       bool track_canvas_motion_notify_event (GdkEventMotion* event);
+
        Gtk::Allocation canvas_allocation;
        bool canvas_idle_queued;
        void track_canvas_allocate (Gtk::Allocation alloc);
@@ -1206,21 +1266,24 @@ class Editor : public PublicEditor
        /* display control */
        
        bool _show_measures;
+       /// true to show waveforms, otherwise false
        bool _show_waveforms;
+       /// true if the editor should follow the playhead, otherwise false
        bool _follow_playhead;
+       /// true if waveforms should be shown while recording audio tracks, otherwise false
        bool _show_waveforms_recording;
        
        ARDOUR::TempoMap::BBTPointList *current_bbt_points;
        
-       typedef vector<ArdourCanvas::SimpleLine*> TimeLineList;
-       TimeLineList free_measure_lines;
-       TimeLineList used_measure_lines;
-
        ArdourCanvas::Group* time_line_group;
-       ArdourCanvas::SimpleLine* get_time_line ();
+       ArdourCanvas::Group* marker_time_line_group;
+       
+       TempoLines* tempo_lines;
+       TempoLines* marker_tempo_lines;
+
        void hide_measures ();
        void draw_measures ();
-       bool lazy_hide_and_draw_measures ();
+       bool redraw_measures ();
 
        void new_tempo_section ();
 
@@ -1243,6 +1306,7 @@ class Editor : public PublicEditor
        void marker_menu_hide ();
        void marker_menu_loop_range ();
        void marker_menu_select_all_selectables_using_range ();
+       void marker_menu_select_using_range ();
        void marker_menu_separate_regions_using_location ();
        void marker_menu_play_from ();
        void marker_menu_play_range ();
@@ -1277,17 +1341,28 @@ class Editor : public PublicEditor
        void remove_metric_marks ();
        void draw_metric_marks (const ARDOUR::Metrics& metrics);
 
-       void tempo_map_changed (ARDOUR::Change, bool immediate_redraw);
-       void redisplay_tempo ();
+       void tempo_map_changed (ARDOUR::Change);
+       void redisplay_tempo (bool immediate_redraw);
+       
+       void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
+       void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false) {
+               /* XXX remove this function when everything moves to 64 bit frame counts */
+               nframes64_t first64 = first;
+               snap_to (first64, direction, for_mark);
+               first = (nframes_t) first64;
+       }
        
-       void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false);
+       double snap_length_beats (nframes_t start);
+
        uint32_t bbt_beat_subdivision;
 
        /* toolbar */
        
-       Gtk::ToggleButton        editor_mixer_button;
+       Gtk::ToggleButton editor_mixer_button;
+       Gtk::ToggleButton editor_list_button;
 
        void editor_mixer_button_toggled ();
+       void editor_list_button_toggled ();
 
        AudioClock               edit_cursor_clock;
        AudioClock               zoom_range_clock;
@@ -1309,6 +1384,7 @@ class Editor : public PublicEditor
        Gtk::ToggleButton        mouse_zoom_button;
        Gtk::ToggleButton        mouse_timefx_button;
        Gtk::ToggleButton        mouse_audition_button;
+       Gtk::ToggleButton        mouse_note_button;
        GroupedButtons          *mouse_mode_button_set;
        void                     mouse_mode_toggled (Editing::MouseMode m);
        bool                     ignore_mouse_mode_toggle;
@@ -1357,11 +1433,29 @@ class Editor : public PublicEditor
        
        void setup_toolbar ();
 
-       Gtkmm2ext::TearOff*       tools_tearoff;
+       Gtkmm2ext::TearOff*      tools_tearoff;
        Gtk::HBox                toolbar_hbox;
        Gtk::EventBox            toolbar_base;
        Gtk::Frame               toolbar_frame;
 
+       /* midi toolbar */
+
+       Gtk::HBox                midi_tool_button_box;
+       Gtkmm2ext::TearOff*      midi_tool_tearoff;
+       Gtk::ToggleButton        midi_tool_pencil_button;
+       Gtk::ToggleButton        midi_tool_select_button;
+       Gtk::ToggleButton        midi_tool_erase_button;
+       GroupedButtons          *midi_tool_button_set;
+       void                     midi_edit_mode_toggled (Editing::MidiEditMode m);
+       bool                     ignore_midi_edit_mode_toggle;
+
+       Gtkmm2ext::TearOff* midi_tools_tearoff;
+       Gtk::HBox           midi_toolbar_hbox;
+       Gtk::EventBox       midi_toolbar_base;
+       Gtk::Frame          midi_toolbar_frame;
+       
+       void setup_midi_toolbar ();
+
        /* selection process */
 
        Selection* selection;
@@ -1429,7 +1523,7 @@ class Editor : public PublicEditor
        void drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
        void end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
 
-       bool select_all_within (nframes_t start, nframes_t end, gdouble topy, gdouble boty, Selection::Operation op);
+       bool select_all_within (nframes_t start, nframes_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op);
        
        ArdourCanvas::SimpleRect   *rubberband_rect;
        
@@ -1449,10 +1543,12 @@ class Editor : public PublicEditor
                    add (text);
                    add (visible);
                    add (tv);
+                   add (route);
            }
            Gtk::TreeModelColumn<Glib::ustring>  text;
            Gtk::TreeModelColumn<bool>           visible;
            Gtk::TreeModelColumn<TimeAxisView*>  tv;
+           Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> >  route;
        };
 
        RouteDisplayModelColumns         route_display_columns;
@@ -1463,11 +1559,16 @@ class Editor : public PublicEditor
        Gtk::ScrolledWindow                   route_list_scroller;
        Gtk::Menu*                            route_list_menu;
 
+       void sync_order_keys ();
+       bool ignore_route_order_sync;
+
        bool route_list_display_button_press (GdkEventButton*);
        bool route_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
 
        void route_list_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
        void route_list_delete (const Gtk::TreeModel::Path&);
+       void track_list_reorder (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* new_order);
+
        void initial_route_list_display ();
        void redisplay_route_list();
        void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what);
@@ -1618,7 +1719,7 @@ class Editor : public PublicEditor
        void external_edit_region ();
 
        int write_audio_selection (TimeSelection&);
-       bool write_audio_range (ARDOUR::AudioPlaylist&, uint32_t channels, list<ARDOUR::AudioRange>&);
+       bool write_audio_range (ARDOUR::AudioPlaylist&, const ARDOUR::ChanCount& channels, list<ARDOUR::AudioRange>&);
 
        void write_selection ();
 
@@ -1626,7 +1727,8 @@ class Editor : public PublicEditor
 
        UndoAction get_memento() const;
 
-        XMLNode *before; /* used in *_reversible_command */
+       XMLNode *before; /* used in *_reversible_command */
+
        void begin_reversible_command (string cmd_name);
        void commit_reversible_command ();
 
@@ -1641,10 +1743,10 @@ class Editor : public PublicEditor
 
        struct State {
            Selection* selection;
-           double     frames_per_unit;
+           double frames_per_unit;
 
-           State();
-           ~State();
+           State (PublicEditor const * e);
+           ~State ();
        };
 
        void store_state (State&) const;
@@ -1661,8 +1763,8 @@ class Editor : public PublicEditor
        static void* _freeze_thread (void*);
        void* freeze_thread ();
 
-       void freeze_route ();
-       void unfreeze_route ();
+       void freeze_routes ();
+       void unfreeze_routes ();
 
        /* edit-group solo + mute */
 
@@ -1725,13 +1827,13 @@ class Editor : public PublicEditor
 
        /* nudging tracks */
 
-       void nudge_track (bool use_edit_cursor, bool forwards);
+       void nudge_selected_tracks (bool use_edit_cursor, bool forwards);
 
        /* xfades */
 
        bool _xfade_visibility;
        
-       /* <CMT Additions> */
+#ifdef WITH_CMT
        void handle_new_imageframe_time_axis_view(const string & track_name, void* src) ;
        void handle_new_imageframe_marker_time_axis_view(const string & track_name, TimeAxisView* marked_track) ;
 
@@ -1770,7 +1872,7 @@ class Editor : public PublicEditor
        void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
 
        ImageFrameSocketHandler* image_socket_listener ;
-       /* </CMT Additions> */
+#endif
 
        void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
        void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
@@ -1793,7 +1895,7 @@ class Editor : public PublicEditor
        
        /* audio filters */
 
-       void apply_filter (ARDOUR::AudioFilter&, string cmd);
+       void apply_filter (ARDOUR::Filter&, string cmd);
 
        /* handling cleanup */
 
@@ -1826,6 +1928,7 @@ class Editor : public PublicEditor
        Gtk::CheckMenuItem* region_envelope_active_item;
        Gtk::CheckMenuItem* region_mute_item;
        Gtk::CheckMenuItem* region_lock_item;
+       Gtk::CheckMenuItem* region_lock_position_item;
        Gtk::CheckMenuItem* region_opaque_item;
        
        bool on_key_press_event (GdkEventKey*);
@@ -1836,6 +1939,8 @@ class Editor : public PublicEditor
        Glib::RefPtr<Gtk::Action>              redo_action;
 
        void history_changed ();
+
+       Gtk::HBox      status_bar_hpacker;
 };
 
 #endif /* __ardour_editor_h__ */