Comment and (hopefully) simplify Editor::region_drag_motion_callback, fixing problems...
[ardour.git] / gtk2_ardour / editor.h
1 /*
2     Copyright (C) 2000-2003 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_editor_h__
21 #define __ardour_editor_h__
22
23 #include <list>
24 #include <map>
25 #include <set>
26 #include <string>
27 #include <sys/time.h>
28 #include <bitset>
29
30 #include <glibmm/ustring.h>
31
32 #include <boost/optional.hpp>
33
34 #include <libgnomecanvasmm/canvas.h>
35 #include <libgnomecanvasmm/group.h>
36 #include <libgnomecanvasmm/line.h>
37 #include <libgnomecanvasmm/pixbuf.h>
38
39 #include <cmath>
40
41 #include <gtkmm/layout.h>
42 #include <gtkmm/comboboxtext.h>
43
44 #include <gtkmm2ext/selector.h>
45 #include <gtkmm2ext/click_box.h>
46 #include <gtkmm2ext/dndtreeview.h>
47
48 #include <pbd/stateful.h>
49 #include <ardour/session.h>
50 #include <ardour/tempo.h>
51 #include <ardour/stretch.h>
52 #include <ardour/location.h>
53 #include <ardour/audioregion.h>
54 #include <ardour/track.h>
55 #include <ardour/types.h>
56
57 #include "audio_clock.h"
58 #include "gtk-custom-ruler.h"
59 #include "ardour_dialog.h"
60 #include "public_editor.h"
61 #include "editing.h"
62 #include "enums.h"
63 #include "editor_items.h"
64 #include "region_selection.h"
65 #include "canvas.h"
66 #include "draginfo.h"
67
68 namespace Gtkmm2ext {
69         class TearOff;
70 }
71
72 namespace ARDOUR {
73         class AudioDiskstream;
74         class RouteGroup;
75         class Playlist;
76         class AudioPlaylist;
77         class Region;
78         class Location;
79         class TempoSection;
80         class NamedSelection;
81         class Session;
82         class Filter;
83         class Crossfade;
84         class ChanCount;
85 }
86
87 namespace LADSPA {
88         class Plugin;
89 }
90
91 class TimeAxisView;
92 class AudioTimeAxisView;
93 class AutomationTimeAxisView;
94 class AudioRegionView;
95 class CrossfadeView;
96 class PluginSelector;
97 class PlaylistSelector;
98 class Marker;
99 class GroupedButtons;
100 class AutomationLine;
101 class Selection;
102 class TempoLines;
103 class TimeSelection;
104 class TrackSelection;
105 class AutomationSelection;
106 class MixerStrip;
107 class StreamView;
108 class AudioStreamView;
109 class ControlPoint;
110 class SoundFileOmega;
111 class RhythmFerret;
112 class AnalysisWindow;
113
114 /* <CMT Additions> */
115 class ImageFrameView;
116 class ImageFrameTimeAxisView;
117 class ImageFrameTimeAxis;
118 class MarkerTimeAxis ;
119 class MarkerView ;
120 class ImageFrameSocketHandler ;
121 class TimeAxisViewItem ;
122 /* </CMT Additions> */
123
124
125 class Editor : public PublicEditor
126 {
127   public:
128         Editor ();
129         ~Editor ();
130         
131         void             connect_to_session (ARDOUR::Session *);
132         ARDOUR::Session* current_session() const { return session; }
133         void             first_idle ();
134         virtual bool have_idled() const { return _have_idled; }
135
136         nframes64_t leftmost_position() const { return leftmost_frame; }
137         nframes64_t current_page_frames() const {
138                 return (nframes64_t) floor (canvas_width * frames_per_unit);
139         }
140
141         void cycle_snap_mode ();
142         void cycle_snap_choice ();
143         void set_snap_to (Editing::SnapType);
144         void set_snap_mode (Editing::SnapMode);
145         void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;}
146
147         void undo (uint32_t n = 1);
148         void redo (uint32_t n = 1);
149
150         XMLNode& get_state ();
151         int set_state (const XMLNode& );
152
153         void set_mouse_mode (Editing::MouseMode, bool force=true);
154         void step_mouse_mode (bool next);
155         Editing::MouseMode current_mouse_mode () const { return mouse_mode; }
156         
157         void set_midi_edit_cursor (Editing::MidiEditMode);
158         void set_midi_edit_mode (Editing::MidiEditMode, bool force=true);
159         Editing::MidiEditMode current_midi_edit_mode () const { return midi_edit_mode; }
160
161 #ifdef WITH_CMT
162         void add_imageframe_time_axis(const std::string & track_name, void*) ;
163         void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
164         void connect_to_image_compositor() ;
165         void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
166 #endif
167
168         TimeAxisView* get_named_time_axis(const std::string & name) ;
169         void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
170         void add_to_idle_resize (TimeAxisView*, uint32_t);
171
172         RouteTimeAxisView* get_route_view_by_id (PBD::ID& id);
173
174         void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
175         void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
176         void remove_a_region (boost::shared_ptr<ARDOUR::Region>);
177
178 #ifdef USE_RUBBERBAND
179         std::vector<std::string> rb_opt_strings;
180 #endif
181
182         /* option editor-access */
183
184         void set_show_waveforms (bool yn);
185         bool show_waveforms() const { return _show_waveforms; }
186
187         void set_waveform_scale (Editing::WaveformScale);
188
189         void set_show_waveforms_recording (bool yn);
190         bool show_waveforms_recording() const { return _show_waveforms_recording; }
191         
192         /* things that need to be public to be used in the main menubar */
193
194         void new_region_from_selection ();
195         void separate_regions_between (const TimeSelection&);
196         void separate_region_from_selection ();
197         void separate_region_from_punch ();
198         void separate_region_from_loop ();
199         void separate_regions_using_location (ARDOUR::Location&);
200         void toggle_playback (bool with_abort);
201         void transition_to_rolling (bool forward);
202
203         /* undo related */
204
205         nframes64_t unit_to_frame (double unit) const {
206                 return (nframes64_t) rint (unit * frames_per_unit);
207         }
208         
209         double frame_to_unit (nframes64_t frame) const {
210                 return rint ((double) frame / (double) frames_per_unit);
211         }
212
213         double frame_to_unit (double frame) const {
214                 return rint (frame / frames_per_unit);
215         }
216
217         /* NOTE: these functions assume that the "pixel" coordinate is
218            the result of using the world->canvas affine transform on a
219            world coordinate. These coordinates already take into
220            account any scrolling carried out by adjusting the
221            xscroll_adjustment.  
222         */
223
224         nframes64_t pixel_to_frame (double pixel) const {
225                 
226                 /* pixel can be less than zero when motion events
227                    are processed. since we've already run the world->canvas
228                    affine, that means that the location *really* is "off
229                    to the right" and thus really is "before the start".
230                 */
231
232                 if (pixel >= 0) {
233                         return (nframes64_t) rint (pixel * frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit);
234                 } else {
235                         return 0;
236                 }
237         }
238
239         gulong frame_to_pixel (nframes64_t frame) const {
240                 return (gulong) rint ((frame / (frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit)));
241         }
242
243         void flush_canvas ();
244
245         /* selection */
246
247         Selection& get_selection() const { return *selection; }
248         Selection& get_cut_buffer() const { return *cut_buffer; }
249
250         bool extend_selection_to_track (TimeAxisView&);
251
252         void play_selection ();
253         void select_all_in_track (Selection::Operation op);
254         void select_all (Selection::Operation op);
255         void invert_selection_in_track ();
256         void invert_selection ();
257         void deselect_all ();
258
259         /* tempo */
260
261         void set_show_measures (bool yn);
262         bool show_measures () const { return _show_measures; }
263
264         /* analysis window */
265         void analyze_region_selection();
266         void analyze_range_selection();
267
268         /* export */
269         
270         void export_audio ();
271         void export_selection ();
272         void export_range ();
273         void export_region ();
274
275         void add_toplevel_controls (Gtk::Container&);
276         Gtk::HBox& get_status_bar_packer()  { return status_bar_hpacker; }
277
278         void      set_zoom_focus (Editing::ZoomFocus);
279         Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
280         double   get_current_zoom () const { return frames_per_unit; }
281
282         void temporal_zoom_step (bool coarser);
283
284         /* stuff that AudioTimeAxisView and related classes use */
285
286         PlaylistSelector& playlist_selector() const;
287         void route_name_changed (TimeAxisView *);
288         void clear_playlist (boost::shared_ptr<ARDOUR::Playlist>);
289
290         void new_playlists (TimeAxisView* v);
291         void copy_playlists (TimeAxisView* v);
292         void clear_playlists (TimeAxisView* v);
293
294         TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
295
296         Width editor_mixer_strip_width;
297         void maybe_add_mixer_strip_width (XMLNode&);
298         void show_editor_mixer (bool yn);
299         void create_editor_mixer ();
300         void show_editor_list (bool yn);
301         void set_selected_mixer_strip (TimeAxisView&);
302         void hide_track_in_display (TimeAxisView& tv, bool temporary = false);
303         void show_track_in_display (TimeAxisView& tv);
304
305         /* nudge is initiated by transport controls owned by ARDOUR_UI */
306
307         void nudge_forward (bool next, bool force_playhead);
308         void nudge_backward (bool next, bool force_playhead);
309
310         /* nudge initiated from context menu */
311
312         void nudge_forward_capture_offset ();
313         void nudge_backward_capture_offset ();
314
315         /* playhead/screen stuff */
316         
317         void set_follow_playhead (bool yn);
318         void toggle_follow_playhead ();
319         bool follow_playhead() const { return _follow_playhead; }
320         bool dragging_playhead () const { return _dragging_playhead; }
321
322         void toggle_waveform_visibility ();
323         void toggle_zero_line_visibility ();
324         void toggle_waveforms_while_recording ();
325         void toggle_measure_visibility ();
326         void toggle_logo_visibility ();
327
328         double get_physical_screen_width () const { return physical_screen_width; };
329         double physical_screen_width;
330         double physical_screen_height;
331
332         /* SMPTE timecode & video sync */
333
334         void smpte_fps_chosen (ARDOUR::SmpteFormat format);
335         void video_pullup_chosen (ARDOUR::Session::PullupFormat pullup);
336         void subframes_per_frame_chosen (uint32_t);
337
338         void update_smpte_mode();
339         void update_video_pullup();
340         void update_subframes_per_frame ();
341
342         /* fades/xfades */
343
344         void toggle_region_fades ();
345         void toggle_region_fades_visible ();
346         void toggle_selected_region_fades (int dir);
347         void update_region_fade_visibility ();
348         void toggle_auto_xfade ();
349         void toggle_xfades_active ();
350         void toggle_xfade_visibility ();
351         bool xfade_visibility() const { return _xfade_visibility; }
352         void update_xfade_visibility ();
353         void update_crossfade_model ();
354         void set_crossfade_model (ARDOUR::CrossfadeModel);
355
356         /* layers */
357         void set_layer_model (ARDOUR::LayerModel);
358         void update_layering_model ();
359         
360         void toggle_link_region_and_track_selection ();
361         void toggle_automation_follows_regions ();
362
363         /* redirect shared ops menu. caller must free returned menu */
364
365         Gtk::Menu* redirect_menu ();
366
367         /* floating windows/transient */
368
369         void ensure_float (Gtk::Window&);
370
371         void show_window ();
372
373         void scroll_tracks_down_line ();
374         void scroll_tracks_up_line ();
375
376         void move_selected_tracks (bool up);
377
378         bool new_regionviews_display_gain () { return _new_regionviews_show_envelope; }
379         void prepare_for_cleanup ();
380         void finish_cleanup ();
381
382         void maximise_editing_space();
383         void restore_editing_space();
384
385         void reset_x_origin (nframes64_t);
386         void reset_zoom (double);
387         void reposition_and_zoom (nframes64_t, double);
388
389         nframes64_t get_preferred_edit_position (bool ignore_playhead = false);
390
391         bool update_mouse_speed ();
392         bool decelerate_mouse_speed ();
393
394         void toggle_meter_updating();
395
396         void show_rhythm_ferret();
397
398         void goto_visual_state (uint32_t);
399         void save_visual_state (uint32_t);
400
401         void queue_draw_resize_line (int at);
402         void start_resize_line_ops ();
403         void end_resize_line_ops ();
404
405   protected:
406         void map_transport_state ();
407         void map_position_change (nframes64_t);
408
409         void on_realize();
410         bool on_expose_event (GdkEventExpose*);
411
412   private:
413
414         /// The session that we are editing, or 0
415         void color_handler ();
416         ARDOUR::Session     *session;
417         bool                 constructed;
418
419         // to keep track of the playhead position for control_scroll
420         boost::optional<nframes64_t> _control_scroll_target;
421  
422         PlaylistSelector* _playlist_selector;
423
424         typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
425
426         struct VisualState {
427             double              y_position;
428             double              frames_per_unit;
429             nframes64_t         leftmost_frame;
430             Editing::ZoomFocus  zoom_focus;
431             bool                zoomed_to_region;
432             std::list<TAVState> track_states;
433         };
434         
435         std::list<VisualState*> undo_visual_stack;
436         std::list<VisualState*> redo_visual_stack;
437         VisualState* current_visual_state (bool with_tracks = true);
438         void undo_visual_state ();
439         void redo_visual_state ();
440         void use_visual_state (VisualState&);
441         bool no_save_visual;
442         void swap_visual_state ();
443         
444         std::vector<VisualState*> visual_states;
445         sigc::connection visual_state_op_connection;
446         void start_visual_state_op (uint32_t n);
447         void cancel_visual_state_op (uint32_t n);
448         bool end_visual_state_op (uint32_t n);
449
450         nframes64_t leftmost_frame;
451         double      frames_per_unit;
452         Editing::ZoomFocus zoom_focus;
453
454         void set_frames_per_unit (double);
455         void post_zoom ();
456
457         Editing::MouseMode mouse_mode;
458         Editing::MidiEditMode midi_edit_mode;
459
460         int  post_maximal_editor_width;
461         int  post_maximal_pane_position;
462         int  pre_maximal_pane_position;
463         int  pre_maximal_editor_width;
464         void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
465
466         Gtk::Notebook the_notebook;
467         Gtk::HPaned   edit_pane;
468
469         Gtk::EventBox meter_base;
470         Gtk::HBox     meter_box;
471         Gtk::EventBox marker_base;
472         Gtk::HBox     marker_box;
473         Gtk::VBox     scrollers_rulers_markers_box;
474
475         void location_changed (ARDOUR::Location *);
476         void location_flags_changed (ARDOUR::Location *, void *);
477         void refresh_location_display ();
478         void refresh_location_display_s (ARDOUR::Change);
479         void refresh_location_display_internal (ARDOUR::Locations::LocationList&);
480         void add_new_location (ARDOUR::Location *);
481         void location_gone (ARDOUR::Location *);
482         void remove_marker (ArdourCanvas::Item&, GdkEvent*);
483         gint really_remove_marker (ARDOUR::Location* loc);
484         void goto_nth_marker (int nth);
485
486         uint32_t location_marker_color;
487         uint32_t location_range_color;
488         uint32_t location_loop_color;
489         uint32_t location_punch_color;
490         uint32_t location_cd_marker_color;
491
492         struct LocationMarkers {
493             Marker* start;
494             Marker* end;
495             bool    valid;
496
497             LocationMarkers () : start(0), end(0), valid (true) {}
498             
499             ~LocationMarkers ();
500
501             void hide();
502             void show ();
503             void set_name (const string&);
504             void set_position (nframes64_t start, nframes64_t end = 0);
505             void set_color_rgba (uint32_t);
506         };
507
508         LocationMarkers  *find_location_markers (ARDOUR::Location *) const;
509         ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const;
510         Marker* entered_marker;
511
512         typedef std::map<ARDOUR::Location*,LocationMarkers *> LocationMarkerMap;
513         LocationMarkerMap location_markers;
514
515         void hide_marker (ArdourCanvas::Item*, GdkEvent*);
516         void clear_marker_display ();
517         void mouse_add_new_marker (nframes64_t where, bool is_cd=false, bool is_xrun=false);
518         bool choose_new_marker_name(string &name);
519         void update_cd_marker_display ();
520         void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location);
521
522         TimeAxisView*      clicked_axisview;
523         RouteTimeAxisView* clicked_routeview;
524         /** The last RegionView that was clicked on, or 0 if the last click was not
525          * on a RegionView.  This is set up by the canvas event handlers in
526          * editor_canvas_events.cc
527          */
528         RegionView*        clicked_regionview;
529         RegionSelection    latest_regionviews;
530         uint32_t           clicked_selection;
531         CrossfadeView*     clicked_crossfadeview;
532         ControlPoint*      clicked_control_point;
533
534         void sort_track_selection (TrackSelection* sel = 0);
535
536         void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
537         void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const;
538         void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*) const;
539
540         /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
541
542         void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*) const;
543         void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
544         void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t, vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
545         void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
546
547         /* end */
548
549         void button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type);
550         bool button_release_can_deselect;
551
552         void catch_vanishing_regionview (RegionView *);
553
554         void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false);
555         void select_all_tracks ();
556         
557         int get_regionview_count_from_region_list (boost::shared_ptr<ARDOUR::Region> region);
558         
559         bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
560         void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
561         void set_selected_track_as_side_effect (bool force = false);
562         bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
563
564         void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
565         bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr<ARDOUR::Region>);
566         void collect_new_region_view (RegionView *);
567         void collect_and_select_new_region_view (RegionView *);
568         
569         Gtk::Menu track_context_menu;
570         Gtk::Menu track_region_context_menu;
571         Gtk::Menu track_selection_context_menu;
572         Gtk::Menu track_crossfade_context_menu;
573
574         Gtk::MenuItem* region_edit_menu_split_item;
575         Gtk::MenuItem* region_edit_menu_split_multichannel_item;
576         Gtk::Menu * track_region_edit_playlist_menu;
577         Gtk::Menu * track_edit_playlist_submenu;
578         Gtk::Menu * track_selection_edit_playlist_submenu;
579
580         void popup_track_context_menu (int, int, ItemType, bool, nframes64_t);
581         Gtk::Menu* build_track_context_menu (nframes64_t);
582         Gtk::Menu* build_track_bus_context_menu (nframes64_t);
583         Gtk::Menu* build_track_region_context_menu (nframes64_t frame);
584         Gtk::Menu* build_track_crossfade_context_menu (nframes64_t);
585         Gtk::Menu* build_track_selection_context_menu (nframes64_t);
586         void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
587         void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
588         void add_region_context_items (StreamView*, boost::shared_ptr<ARDOUR::Region>, Gtk::Menu_Helpers::MenuList&);
589         void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Crossfade>, Gtk::Menu_Helpers::MenuList&, bool many);
590         void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
591
592         void add_item_with_sensitivity (Gtk::Menu_Helpers::MenuList&, Gtk::Menu_Helpers::MenuElem, bool) const;
593
594         void handle_new_route (ARDOUR::Session::RouteList&);
595         void remove_route (TimeAxisView *);
596         bool route_removal;
597
598         Gtk::HBox           global_hpacker;
599         Gtk::VBox           global_vpacker;
600         Gtk::VBox           vpacker;
601
602         bool need_resize_line;
603         int  resize_line_y;
604         int  old_resize_line_y;
605
606         Gdk::Cursor*          current_canvas_cursor;
607         void set_canvas_cursor ();
608         Gdk::Cursor* which_grabber_cursor ();
609
610         ArdourCanvas::Canvas* track_canvas;
611
612         ArdourCanvas::Text* first_action_message;
613         ArdourCanvas::Text* verbose_canvas_cursor;
614         bool                 verbose_cursor_visible;
615
616         void parameter_changed (const char *);
617         
618         bool track_canvas_motion (GdkEvent*);
619
620         void set_verbose_canvas_cursor (const string &, double x, double y);
621         void set_verbose_canvas_cursor_text (const string &);
622         void show_verbose_canvas_cursor();
623         void hide_verbose_canvas_cursor();
624
625         bool verbose_cursor_on; // so far unused
626
627         Gtk::EventBox      time_canvas_event_box;
628         Gtk::EventBox      track_canvas_event_box;
629         Gtk::EventBox      time_button_event_box;
630         Gtk::EventBox      ruler_label_event_box;
631
632         ArdourCanvas::Group      *minsec_group;
633         ArdourCanvas::Pixbuf     *logo_item;
634         ArdourCanvas::Group      *bbt_group;
635         ArdourCanvas::Group      *smpte_group;
636         ArdourCanvas::Group      *frame_group;
637         ArdourCanvas::Group      *tempo_group;
638         ArdourCanvas::Group      *meter_group;
639         ArdourCanvas::Group      *marker_group;
640         ArdourCanvas::Group      *range_marker_group;
641         ArdourCanvas::Group      *transport_marker_group;
642         ArdourCanvas::Group*      cd_marker_group;
643
644         ArdourCanvas::Group*      timebar_group;
645
646         /* These bars never need to be scrolled */
647         ArdourCanvas::Group*      meter_bar_group;
648         ArdourCanvas::Group*      tempo_bar_group;
649         ArdourCanvas::Group*      marker_bar_group;
650         ArdourCanvas::Group*      range_marker_bar_group;
651         ArdourCanvas::Group*      transport_marker_bar_group;
652         ArdourCanvas::Group*      cd_marker_bar_group;
653
654         /** The group containing all items that require horizontal scrolling. */
655         ArdourCanvas::Group* _background_group;
656         /* 
657            The _master_group is the group containing all items
658            that require horizontal scrolling..
659            It is primarily used to separate canvas items 
660            that require horizontal scrolling from those that do not. 
661         */
662         ArdourCanvas::Group* _master_group;
663
664         /* The group containing all trackviews.  Only scrolled vertically. */
665         ArdourCanvas::Group* _trackview_group;
666         
667         /* The group used for region motion.  Sits on top of _trackview_group */
668         ArdourCanvas::Group* _region_motion_group;
669         
670         enum RulerType {
671                 ruler_metric_smpte = 0,
672                 ruler_metric_bbt = 1,
673                 ruler_metric_frames = 2,
674                 ruler_metric_minsec = 3,
675
676                 ruler_time_tempo = 4,
677                 ruler_time_meter = 5,
678                 ruler_time_marker = 6,
679                 ruler_time_range_marker = 7,
680                 ruler_time_transport_marker = 8,
681                 ruler_time_cd_marker = 9,
682         };
683
684         static GtkCustomMetric ruler_metrics[4];
685         Glib::RefPtr<Gtk::ToggleAction> ruler_timecode_action;
686         Glib::RefPtr<Gtk::ToggleAction> ruler_bbt_action;
687         Glib::RefPtr<Gtk::ToggleAction> ruler_samples_action;
688         Glib::RefPtr<Gtk::ToggleAction> ruler_minsec_action;
689         Glib::RefPtr<Gtk::ToggleAction> ruler_tempo_action;
690         Glib::RefPtr<Gtk::ToggleAction> ruler_meter_action;
691         Glib::RefPtr<Gtk::ToggleAction> ruler_marker_action;
692         Glib::RefPtr<Gtk::ToggleAction> ruler_range_action;
693         Glib::RefPtr<Gtk::ToggleAction> ruler_loop_punch_action;
694         Glib::RefPtr<Gtk::ToggleAction> ruler_cd_marker_action;
695         bool                   no_ruler_shown_update;
696         
697         gint ruler_button_press (GdkEventButton*);
698         gint ruler_button_release (GdkEventButton*);
699         gint ruler_mouse_motion (GdkEventMotion*);
700         bool ruler_scroll (GdkEventScroll* event);
701
702         gint ruler_pressed_button;
703         Gtk::Widget * ruler_grabbed_widget;
704         
705         void initialize_rulers ();
706         void update_just_smpte ();
707         void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
708         void update_fixed_rulers ();
709         void update_tempo_based_rulers (); 
710         void popup_ruler_menu (nframes64_t where = 0, ItemType type = RegionItem);
711         void update_ruler_visibility ();
712         void set_ruler_visible (RulerType, bool);
713         void toggle_ruler_visibility (RulerType rt);
714         void ruler_toggled (int);
715         gint ruler_label_button_release (GdkEventButton*);
716         void store_ruler_visibility ();
717         void restore_ruler_visibility ();
718         
719         static gint _metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
720         static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
721         static gint _metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
722         static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
723         
724         enum MinsecRulerScale {
725                 minsec_show_seconds,
726                 minsec_show_minutes,
727                 minsec_show_hours,
728                 minsec_show_frames
729         };
730
731         MinsecRulerScale minsec_ruler_scale;
732
733         nframes_t minsec_mark_interval;
734         gint minsec_mark_modulo;
735         gint minsec_nmarks;
736         void set_minsec_ruler_scale (gdouble lower, gdouble upper);
737
738         enum SMPTERulerScale {
739                 smpte_show_bits,
740                 smpte_show_frames,
741                 smpte_show_seconds,
742                 smpte_show_minutes,
743                 smpte_show_hours
744         };
745
746         SMPTERulerScale smpte_ruler_scale;
747
748         nframes_t smpte_mark_interval;
749         gint smpte_mark_modulo;
750         gint smpte_nmarks;
751         void set_smpte_ruler_scale (gdouble lower, gdouble upper);
752
753         enum BBTRulerScale {
754                 bbt_over,
755                 bbt_show_64,
756                 bbt_show_16,
757                 bbt_show_4,
758                 bbt_show_1,
759                 bbt_show_beats,
760                 bbt_show_ticks,
761                 bbt_show_ticks_detail,
762                 bbt_show_ticks_super_detail
763         };
764
765         BBTRulerScale bbt_ruler_scale;
766
767         uint32_t bbt_bars;
768         gint bbt_nmarks;
769         uint32_t bbt_bar_helper_on;
770         uint32_t bbt_accent_modulo;
771         void compute_bbt_ruler_scale (nframes64_t lower, nframes64_t upper);
772
773         gint metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
774         gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
775         gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
776         gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
777
778         Gtk::Widget        *_ruler_separator;
779         GtkWidget          *_smpte_ruler;
780         GtkWidget          *_bbt_ruler;
781         GtkWidget          *_frames_ruler;
782         GtkWidget          *_minsec_ruler;
783         Gtk::Widget        *smpte_ruler;
784         Gtk::Widget        *bbt_ruler;
785         Gtk::Widget        *frames_ruler;
786         Gtk::Widget        *minsec_ruler;
787         static Editor      *ruler_editor;
788
789         static const double timebar_height;
790         guint32 visible_timebars;
791         gdouble canvas_timebars_vsize;
792         gdouble get_canvas_timebars_vsize () const { return canvas_timebars_vsize; }
793         Gtk::Menu          *editor_ruler_menu;
794         
795         ArdourCanvas::SimpleRect* tempo_bar;
796         ArdourCanvas::SimpleRect* meter_bar;
797         ArdourCanvas::SimpleRect* marker_bar;
798         ArdourCanvas::SimpleRect* range_marker_bar;
799         ArdourCanvas::SimpleRect* transport_marker_bar;
800         ArdourCanvas::SimpleRect* cd_marker_bar;
801         
802         Gtk::Label  minsec_label;
803         Gtk::Label  bbt_label;
804         Gtk::Label  smpte_label;
805         Gtk::Label  frame_label;
806         Gtk::Label  tempo_label;
807         Gtk::Label  meter_label;
808         Gtk::Label  mark_label;
809         Gtk::Label  range_mark_label;
810         Gtk::Label  transport_mark_label;
811         Gtk::Label  cd_mark_label;
812         
813
814         Gtk::VBox          time_button_vbox;
815         Gtk::HBox          time_button_hbox;
816
817         struct Cursor {
818             Editor&               editor;
819             ArdourCanvas::Points  points;
820             ArdourCanvas::Line    canvas_item;
821             nframes64_t           current_frame;
822             double                length;
823
824             Cursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
825             ~Cursor ();
826
827             void set_position (nframes64_t);
828             void set_length (double units);
829             void set_y_axis (double position);
830         };
831
832         friend struct Cursor; /* it needs access to several private
833                                  fields. XXX fix me.
834                               */
835
836         Cursor* playhead_cursor;
837         ArdourCanvas::Group* cursor_group;
838
839         void    cursor_to_region_boundary (Cursor*, int32_t dir);
840         void    cursor_to_next_region_boundary (Cursor*);
841         void    cursor_to_previous_region_boundary (Cursor*);
842         void    cursor_to_next_region_point (Cursor*, ARDOUR::RegionPoint);
843         void    cursor_to_previous_region_point (Cursor*, ARDOUR::RegionPoint);
844         void    cursor_to_region_point (Cursor*, ARDOUR::RegionPoint, int32_t dir);
845         void    cursor_to_selection_start (Cursor *);
846         void    cursor_to_selection_end   (Cursor *);
847
848         void    selected_marker_to_region_boundary (int32_t dir);
849         void    selected_marker_to_next_region_boundary ();
850         void    selected_marker_to_previous_region_boundary ();
851         void    selected_marker_to_next_region_point (ARDOUR::RegionPoint);
852         void    selected_marker_to_previous_region_point (ARDOUR::RegionPoint);
853         void    selected_marker_to_region_point (ARDOUR::RegionPoint, int32_t dir);
854         void    selected_marker_to_selection_start ();
855         void    selected_marker_to_selection_end   ();
856
857         void    select_all_selectables_using_cursor (Cursor *, bool);
858         void    select_all_selectables_using_edit (bool);
859         void    select_all_selectables_between (bool within);
860         void    select_range_between ();
861
862         boost::shared_ptr<ARDOUR::Region> find_next_region (nframes64_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0);
863         nframes64_t find_next_region_boundary (nframes64_t, int32_t dir, const TrackViewList&);
864
865         vector<nframes64_t> region_boundary_cache;
866         void build_region_boundary_cache ();
867
868         Gtk::HBox           top_hbox;
869         Gtk::HBox           bottom_hbox;
870         
871         Gtk::Table          edit_packer;
872         Gtk::VScrollbar     edit_vscrollbar;
873
874         Gtk::Adjustment     vertical_adjustment;
875         Gtk::Adjustment     horizontal_adjustment;
876
877         Gtk::Layout         controls_layout;
878         bool control_layout_scroll (GdkEventScroll* ev);
879         void controls_layout_size_request (Gtk::Requisition*);
880         sigc::connection controls_layout_size_request_connection;
881
882         Gtk::HScrollbar     edit_hscrollbar;
883         bool                _dragging_hscrollbar;
884
885         void reset_hscrollbar_stepping ();
886         
887         bool hscrollbar_button_press (GdkEventButton*);
888         bool hscrollbar_button_release (GdkEventButton*);
889         void hscrollbar_allocate (Gtk::Allocation &alloc);
890
891         double canvas_width;
892         double canvas_height;
893         double full_canvas_height;
894
895         bool track_canvas_map_handler (GdkEventAny*);
896
897         gint edit_controls_button_release (GdkEventButton*);
898         Gtk::Menu *edit_controls_left_menu;
899         Gtk::Menu *edit_controls_right_menu;
900
901         Gtk::VBox           ruler_label_vbox;
902         Gtk::VBox           track_canvas_vbox;
903         Gtk::VBox           time_canvas_vbox;
904         Gtk::VBox           edit_controls_vbox;
905         Gtk::HBox           edit_controls_hbox;
906
907         void control_scroll (float);
908         void access_action (std::string,std::string);
909         bool deferred_control_scroll (nframes64_t);
910         sigc::connection control_scroll_connection;
911
912         gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
913         
914         ArdourCanvas::Group* get_background_group () const { return _background_group; }
915         ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
916         double last_trackview_group_vertical_offset;
917         void tie_vertical_scrolling ();
918         void scroll_canvas_horizontally ();
919         void scroll_canvas_vertically ();
920         void canvas_horizontally_scrolled ();
921         void canvas_scroll_to (nframes64_t);
922
923         struct VisualChange {
924             enum Type { 
925                     TimeOrigin = 0x1,
926                     ZoomLevel = 0x2
927             };
928
929             Type pending;
930             nframes64_t time_origin;
931             double frames_per_unit;
932
933             int idle_handler_id;
934
935             VisualChange() : pending ((VisualChange::Type) 0), time_origin (0), frames_per_unit (0), idle_handler_id (-1) {}
936         };
937
938
939         VisualChange pending_visual_change;
940
941         static int _idle_visual_changer (void *arg);
942         int idle_visual_changer ();
943
944         void queue_visual_change (nframes64_t);
945         void queue_visual_change (double);
946
947         void end_location_changed (ARDOUR::Location*);
948
949         struct RegionListDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
950             RegionListDisplayModelColumns() {
951                         add (name);
952                     add (region);
953                     add (color_);
954                     add (start);
955                     add (end);
956                     add (length);
957                         add (sync);
958                         add (fadein);
959                         add (fadeout);
960                         add (locked);
961                         add (glued);
962                         add (muted);
963                         add (opaque);
964                         add (used);
965                     add (path);
966             }
967             Gtk::TreeModelColumn<Glib::ustring> name;
968             Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Region> > region;
969             Gtk::TreeModelColumn<Gdk::Color> color_;
970             Gtk::TreeModelColumn<Glib::ustring> start;
971             Gtk::TreeModelColumn<Glib::ustring> end;
972             Gtk::TreeModelColumn<Glib::ustring> length;
973             Gtk::TreeModelColumn<Glib::ustring> sync;
974             Gtk::TreeModelColumn<Glib::ustring> fadein;
975             Gtk::TreeModelColumn<Glib::ustring> fadeout;
976             Gtk::TreeModelColumn<bool> locked;
977             Gtk::TreeModelColumn<bool> glued;
978             Gtk::TreeModelColumn<bool> muted;
979             Gtk::TreeModelColumn<bool> opaque;
980             Gtk::TreeModelColumn<Glib::ustring> used;
981             Gtk::TreeModelColumn<Glib::ustring> path;
982         };
983             
984         RegionListDisplayModelColumns          region_list_columns;
985         Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Region> > region_list_display;
986         
987         Glib::RefPtr<Gtk::TreeStore>           region_list_model;
988         Glib::RefPtr<Gtk::ToggleAction>        toggle_full_region_list_action;
989         Glib::RefPtr<Gtk::ToggleAction>        toggle_show_auto_regions_action;
990
991         void region_list_region_changed (ARDOUR::Change, boost::weak_ptr<ARDOUR::Region>);
992         void region_list_selection_changed ();
993         bool region_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
994         void region_name_edit (const Glib::ustring&, const Glib::ustring&);
995         void get_regions_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions);
996
997         Gtk::Menu          *region_list_menu;
998         Gtk::ScrolledWindow region_list_scroller;
999         Gtk::Frame          region_list_frame;
1000
1001         bool region_list_display_key_press (GdkEventKey *);
1002         bool region_list_display_key_release (GdkEventKey *);
1003         bool region_list_display_button_press (GdkEventButton *);
1004         bool region_list_display_button_release (GdkEventButton *);
1005         void region_list_clear ();
1006         void region_list_selection_mapover (sigc::slot<void,boost::shared_ptr<ARDOUR::Region> >);
1007         void build_region_list_menu ();
1008         void show_region_list_display_context_menu (int button, int time);
1009
1010         bool show_automatic_regions_in_region_list;
1011         Editing::RegionListSortType region_list_sort_type;
1012
1013         void reset_region_list_sort_direction (bool);
1014         void reset_region_list_sort_type (Editing::RegionListSortType);
1015
1016         void toggle_full_region_list ();
1017         void toggle_show_auto_regions ();
1018
1019         int region_list_sorter (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
1020
1021         /* snapshots */
1022
1023         Gtk::ScrolledWindow snapshot_display_scroller;
1024         struct SnapshotDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1025             SnapshotDisplayModelColumns() { 
1026                     add (visible_name);
1027                     add (real_name);
1028             }
1029             Gtk::TreeModelColumn<Glib::ustring> visible_name;
1030             Gtk::TreeModelColumn<Glib::ustring> real_name;
1031         };
1032
1033         SnapshotDisplayModelColumns snapshot_display_columns;
1034         Glib::RefPtr<Gtk::ListStore> snapshot_display_model;
1035         Gtk::TreeView snapshot_display;
1036         Gtk::Menu snapshot_context_menu;
1037
1038         bool snapshot_display_button_press (GdkEventButton*);
1039         void snapshot_display_selection_changed ();
1040         void redisplay_snapshots();
1041         void popup_snapshot_context_menu (int, int32_t, Glib::ustring);
1042
1043         /* named selections */
1044
1045         struct NamedSelectionDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1046             NamedSelectionDisplayModelColumns() { 
1047                     add (text);
1048                     add (selection);
1049             }
1050             Gtk::TreeModelColumn<Glib::ustring>  text;
1051             Gtk::TreeModelColumn<ARDOUR::NamedSelection*>    selection;
1052         };
1053
1054         NamedSelectionDisplayModelColumns named_selection_columns;
1055         Glib::RefPtr<Gtk::TreeStore>     named_selection_model;
1056
1057         Gtkmm2ext::DnDTreeView<ARDOUR::NamedSelection*> named_selection_display;
1058         Gtk::ScrolledWindow    named_selection_scroller;
1059
1060         void create_named_selection ();
1061         void paste_named_selection (float times);
1062         void remove_selected_named_selections ();
1063         void remove_snapshot (Glib::ustring);
1064         void rename_snapshot (Glib::ustring);
1065
1066         void handle_new_named_selection ();
1067         void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
1068         void redisplay_named_selections ();
1069
1070         bool named_selection_display_button_release (GdkEventButton *ev);
1071         bool named_selection_display_key_release (GdkEventKey *ev);
1072         void named_selection_display_selection_changed ();
1073
1074         /* track views */
1075         TrackViewList  track_views;
1076         std::pair<TimeAxisView*, ARDOUR::layer_t> trackview_by_y_position (double);
1077
1078         static Gdk::Cursor* cross_hair_cursor;
1079         static Gdk::Cursor* trimmer_cursor;
1080         static Gdk::Cursor* selector_cursor;
1081         static Gdk::Cursor* grabber_cursor;
1082         static Gdk::Cursor* grabber_edit_point_cursor;
1083         static Gdk::Cursor* zoom_cursor;
1084         static Gdk::Cursor* time_fx_cursor;
1085         static Gdk::Cursor* fader_cursor;
1086         static Gdk::Cursor* speaker_cursor;
1087         static Gdk::Cursor* midi_pencil_cursor;
1088         static Gdk::Cursor* midi_select_cursor;
1089         static Gdk::Cursor* midi_resize_cursor;
1090         static Gdk::Cursor* midi_erase_cursor;
1091         static Gdk::Cursor* wait_cursor;
1092         static Gdk::Cursor* timebar_cursor;
1093         static Gdk::Cursor* transparent_cursor;
1094
1095         static void build_cursors ();
1096
1097         sigc::connection scroll_connection;
1098         nframes64_t last_update_frame;
1099         void center_screen (nframes64_t);
1100         void center_screen_internal (nframes64_t, float);
1101         
1102         void update_current_screen ();
1103         
1104         void session_going_away ();
1105
1106         nframes64_t cut_buffer_start;
1107         nframes64_t cut_buffer_length;
1108
1109         bool typed_event (ArdourCanvas::Item*, GdkEvent*, ItemType);
1110         bool button_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1111         bool button_release_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1112         bool motion_handler (ArdourCanvas::Item*, GdkEvent*, ItemType, bool from_autoscroll = false);
1113         bool enter_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1114         bool leave_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
1115         
1116         /* KEYMAP HANDLING */
1117
1118         void register_actions ();
1119
1120         int ensure_cursor (nframes64_t* pos);
1121
1122         void handle_new_region (boost::weak_ptr<ARDOUR::Region>);
1123         void handle_new_regions (vector<boost::weak_ptr<ARDOUR::Region> >& );
1124         void handle_region_removed (boost::weak_ptr<ARDOUR::Region>);
1125         void add_region_to_region_display (boost::shared_ptr<ARDOUR::Region>);
1126         void add_regions_to_region_display (std::vector<boost::weak_ptr<ARDOUR::Region> > & );
1127         void region_hidden (boost::shared_ptr<ARDOUR::Region>);
1128         void redisplay_regions ();
1129         void populate_row (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &);
1130         void update_region_row (boost::shared_ptr<ARDOUR::Region>);
1131         bool update_region_subrows (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, int);
1132         void update_all_region_rows ();
1133         void update_all_region_subrows (Gtk::TreeModel::Row const &, int);
1134         bool no_region_list_redisplay;
1135         void insert_into_tmp_regionlist(boost::shared_ptr<ARDOUR::Region>);
1136
1137         list<boost::shared_ptr<ARDOUR::Region> > tmp_region_list;
1138
1139         void cut_copy (Editing::CutCopyOp);
1140         bool can_cut_copy () const;
1141         void cut_copy_points (Editing::CutCopyOp);
1142         void cut_copy_regions (Editing::CutCopyOp, RegionSelection&);
1143         void cut_copy_ranges (Editing::CutCopyOp);
1144
1145         void mouse_paste ();
1146         void paste_internal (nframes64_t position, float times);
1147
1148         /* EDITING OPERATIONS */
1149         
1150         void reset_point_selection ();
1151         void toggle_region_mute ();
1152         void toggle_region_lock ();
1153         void toggle_region_opaque ();
1154         void toggle_record_enable ();
1155         void set_region_lock_style (ARDOUR::Region::PositionLockStyle);
1156         void raise_region ();
1157         void raise_region_to_top ();
1158         void lower_region ();
1159         void lower_region_to_bottom ();
1160         void split_region ();
1161         void split_region_at (nframes64_t);
1162         void split_regions_at (nframes64_t, RegionSelection&);
1163         void split_region_at_transients ();
1164         void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret);
1165         void crop_region_to_selection ();
1166         void crop_region_to (nframes64_t start, nframes64_t end);
1167         void set_sync_point (nframes64_t, const RegionSelection&);
1168         void set_region_sync_from_edit_point ();
1169         void remove_region_sync();
1170         void align_selection (ARDOUR::RegionPoint, nframes64_t position, const RegionSelection&);
1171         void align_selection_relative (ARDOUR::RegionPoint point, nframes64_t position, const RegionSelection&);
1172         void align_region (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes64_t position);
1173         void align_region_internal (boost::shared_ptr<ARDOUR::Region>, ARDOUR::RegionPoint point, nframes64_t position);
1174         void remove_selected_regions ();
1175         void remove_clicked_region ();
1176         void edit_region ();
1177         void rename_region ();
1178         void duplicate_some_regions (RegionSelection&, float times);
1179         void duplicate_selection (float times);
1180         void region_fill_selection ();
1181
1182         void region_fill_track ();
1183         void audition_playlist_region_standalone (boost::shared_ptr<ARDOUR::Region>);
1184         void audition_playlist_region_via_route (boost::shared_ptr<ARDOUR::Region>, ARDOUR::Route&);
1185         void split_multichannel_region();
1186         void reverse_region ();
1187         void normalize_region ();
1188         void denormalize_region ();
1189         void adjust_region_scale_amplitude (bool up);
1190         void quantize_region ();
1191
1192         void do_insert_time ();
1193         void insert_time (nframes64_t pos, nframes64_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too);
1194
1195         void tab_to_transient (bool forward);
1196
1197         void use_region_as_bar ();
1198         void use_range_as_bar ();
1199
1200         void define_one_bar (nframes64_t start, nframes64_t end);
1201
1202         void audition_region_from_region_list ();
1203         void hide_region_from_region_list ();
1204         void remove_region_from_region_list ();
1205
1206         void align (ARDOUR::RegionPoint);
1207         void align_relative (ARDOUR::RegionPoint);
1208         void naturalize ();
1209
1210         void reset_focus ();
1211
1212         void split ();
1213
1214         void cut ();
1215         void copy ();
1216         void paste (float times);
1217
1218         int  get_prefix (float&, bool&);
1219
1220         void keyboard_paste ();
1221         void keyboard_insert_region_list_selection ();
1222
1223         void region_from_selection ();
1224         void create_region_from_selection (std::vector<boost::shared_ptr<ARDOUR::Region> >&);
1225
1226         void play_from_start ();
1227         void play_from_edit_point ();
1228         void play_from_edit_point_and_return ();
1229         void play_selected_region ();
1230         void play_edit_range ();
1231         void loop_selected_region ();
1232         void play_location (ARDOUR::Location&);
1233         void loop_location (ARDOUR::Location&);
1234
1235         void temporal_zoom_selection ();
1236         void temporal_zoom_region (bool both_axes);
1237         void toggle_zoom_region (bool both_axes);
1238         bool zoomed_to_region;
1239         void temporal_zoom_session ();
1240         void temporal_zoom (gdouble scale);
1241         void temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & op);
1242         void temporal_zoom_to_frame (bool coarser, nframes64_t frame);
1243
1244         void amplitude_zoom (gdouble scale);
1245         void amplitude_zoom_step (bool in);
1246
1247         void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
1248         void insert_region_list_selection (float times);
1249
1250         void insert_route_list_drag (boost::shared_ptr<ARDOUR::Route>, int x, int y);
1251
1252         /* import & embed */
1253         
1254         void add_external_audio_action (Editing::ImportMode);
1255         void external_audio_dialog ();
1256         void session_import_dialog ();
1257
1258         int  check_whether_and_how_to_import(string, bool all_or_nothing = true);
1259         bool check_multichannel_status (const std::vector<Glib::ustring>& paths);
1260
1261         SoundFileOmega* sfbrowser;
1262         
1263         void bring_in_external_audio (Editing::ImportMode mode,  nframes64_t& pos);
1264
1265         bool  idle_drop_paths  (std::vector<Glib::ustring> paths, nframes64_t frame, double ypos);
1266         void  drop_paths_part_two  (const std::vector<Glib::ustring>& paths, nframes64_t frame, double ypos);
1267         
1268         void do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t&);
1269         void do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
1270
1271         int  import_sndfiles (vector<Glib::ustring> paths, Editing::ImportMode mode,  ARDOUR::SrcQuality, nframes64_t& pos,
1272                               int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>, bool, uint32_t total);
1273         int  embed_sndfiles (vector<Glib::ustring> paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, 
1274                              nframes64_t& pos, int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&);
1275
1276         int add_sources (vector<Glib::ustring> paths, ARDOUR::SourceList& sources, nframes64_t& pos, Editing::ImportMode,
1277                          int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::Track>&, bool add_channel_suffix);
1278         int finish_bringing_in_material (boost::shared_ptr<ARDOUR::Region> region, uint32_t, uint32_t,  nframes64_t& pos, Editing::ImportMode mode,
1279                                       boost::shared_ptr<ARDOUR::Track>& existing_track);
1280
1281         boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const;
1282         boost::shared_ptr<ARDOUR::MidiTrack> get_nth_selected_midi_track (int nth) const;
1283
1284         /* generic interthread progress window */
1285         
1286         ArdourDialog* interthread_progress_window;
1287         Gtk::Label interthread_progress_label;
1288         Gtk::VBox interthread_progress_vbox;
1289         Gtk::ProgressBar interthread_progress_bar;
1290         Gtk::Button interthread_cancel_button;
1291         Gtk::Label interthread_cancel_label;
1292         sigc::connection  interthread_progress_connection;
1293         void interthread_cancel_clicked ();
1294         void build_interthread_progress_window ();
1295         ARDOUR::InterThreadInfo* current_interthread_info;
1296
1297         AnalysisWindow* analysis_window;
1298
1299         /* import specific info */
1300
1301         struct EditorImportStatus : public ARDOUR::Session::import_status {
1302             Editing::ImportMode mode;
1303             nframes64_t pos;
1304             int target_tracks;
1305             int target_regions;
1306             boost::shared_ptr<ARDOUR::Track> track;
1307             bool replace;
1308         };
1309
1310         EditorImportStatus import_status;
1311         gint import_progress_timeout (void *);
1312         static void *_import_thread (void *);
1313         void* import_thread ();
1314         void finish_import ();
1315
1316         /* to support this ... */
1317
1318         void import_audio (bool as_tracks);
1319         void do_import (vector<Glib::ustring> paths, bool split, bool as_tracks);
1320
1321         void move_to_start ();
1322         void move_to_end ();
1323         void goto_frame ();
1324         void center_playhead ();
1325         void center_edit_point ();
1326         void edit_cursor_backward ();
1327         void edit_cursor_forward ();
1328         void playhead_forward_to_grid ();
1329         void playhead_backward_to_grid ();
1330         void playhead_backward ();
1331         void playhead_forward ();
1332         void scroll_playhead (bool forward);
1333         void scroll_backward (float pages=0.8f);
1334         void scroll_forward (float pages=0.8f);
1335         void scroll_tracks_down ();
1336         void scroll_tracks_up ();
1337         void delete_sample_forward ();
1338         void delete_sample_backward ();
1339         void delete_screen ();
1340         void search_backwards ();
1341         void search_forwards ();
1342         void set_mark ();
1343         void clear_markers ();
1344         void clear_ranges ();
1345         void clear_locations ();
1346         void unhide_markers ();
1347         void unhide_ranges ();
1348         void jump_forward_to_mark ();
1349         void jump_backward_to_mark ();
1350         void cursor_align (bool playhead_to_edit);
1351
1352         void remove_last_capture ();
1353         void select_all_selectables_using_time_selection ();
1354         void select_all_selectables_using_loop();
1355         void select_all_selectables_using_punch();
1356         void set_selection_from_range (ARDOUR::Location&);
1357         void set_selection_from_punch ();
1358         void set_selection_from_loop ();
1359         void set_selection_from_region ();
1360
1361         void add_location_mark (nframes64_t where);
1362         void add_location_from_audio_region ();
1363         void add_locations_from_audio_region ();
1364         void add_location_from_selection ();
1365         void set_loop_from_selection (bool play);
1366         void set_punch_from_selection ();
1367         void set_punch_from_region ();
1368
1369         void set_loop_from_edit_range (bool play);
1370         void set_loop_from_region (bool play);
1371         void set_punch_from_edit_range ();
1372
1373         void set_loop_range (nframes64_t start, nframes64_t end, std::string cmd);
1374         void set_punch_range (nframes64_t start, nframes64_t end, std::string cmd);
1375
1376         void add_location_from_playhead_cursor ();
1377         bool select_new_marker;
1378
1379         void reverse_selection ();
1380         void edit_envelope ();
1381
1382         void start_scrolling ();
1383         void stop_scrolling ();
1384
1385         bool _scrubbing;
1386         double last_scrub_x;
1387         int scrubbing_direction;
1388         int scrub_reversals;
1389         int scrub_reverse_distance;
1390         void scrub ();
1391
1392         void keyboard_selection_begin ();
1393         void keyboard_selection_finish (bool add);
1394         bool have_pending_keyboard_selection;
1395         nframes64_t pending_keyboard_selection_start;
1396
1397         boost::shared_ptr<ARDOUR::Region> select_region_for_operation (int dir, TimeAxisView **tv);
1398         void extend_selection_to_end_of_region (bool next);
1399         void extend_selection_to_start_of_region (bool previous);
1400
1401         Editing::SnapType snap_type;
1402         Editing::SnapMode snap_mode;
1403
1404         /// Snap threshold in pixels
1405         double snap_threshold;
1406
1407         void handle_gui_changes (const string &, void *);
1408         bool ignore_gui_changes;
1409
1410         void    hide_all_tracks (bool with_select);
1411
1412         DragInfo drag_info;
1413         LineDragInfo current_line_drag_info;
1414
1415         void start_grab (GdkEvent*, Gdk::Cursor* cursor = 0);
1416         bool end_grab (ArdourCanvas::Item*, GdkEvent*);
1417         void swap_grab (ArdourCanvas::Item*, Gdk::Cursor* cursor, uint32_t time);
1418         void break_drag ();
1419         void finalize_drag ();
1420
1421         Gtk::Menu fade_context_menu;
1422         void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType);
1423
1424         void region_gain_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1425
1426         void start_fade_in_grab (ArdourCanvas::Item*, GdkEvent*);
1427         void start_fade_out_grab (ArdourCanvas::Item*, GdkEvent*);
1428         void fade_in_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1429         void fade_out_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1430         void fade_in_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1431         void fade_out_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1432
1433         void set_fade_in_shape (ARDOUR::AudioRegion::FadeShape);
1434         void set_fade_out_shape (ARDOUR::AudioRegion::FadeShape);
1435         
1436         void set_fade_length (bool in);
1437         void toggle_fade_active (bool in);
1438         void set_fade_in_active (bool);
1439         void set_fade_out_active (bool);
1440         
1441         std::set<boost::shared_ptr<ARDOUR::Playlist> > motion_frozen_playlists;
1442         RegionSelection pre_drag_region_selection;
1443         void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1444         void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1445         void create_region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1446         void create_region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1447         bool check_region_drag_possible (RouteTimeAxisView**, ARDOUR::layer_t*);
1448         void possibly_copy_regions_during_grab (GdkEvent*);
1449         void region_drag_splice_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1450         void region_drag_splice_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1451
1452         bool _dragging_playhead;
1453         bool _dragging_edit_point;
1454
1455         void cursor_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1456         void cursor_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1457         void cursor_drag_finished_ensure_locate_callback (ArdourCanvas::Item*, GdkEvent*);
1458         void marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1459         void marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1460         void control_point_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1461         void control_point_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1462         void line_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1463         void line_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1464
1465         void tempo_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1466         void tempo_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1467         void meter_marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1468         void meter_marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1469
1470         gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*);
1471
1472         void start_region_grab (ArdourCanvas::Item*, GdkEvent*);
1473         void start_create_region_grab (ArdourCanvas::Item*, GdkEvent*);
1474         void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1475         void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*);
1476         void start_selection_grab (ArdourCanvas::Item*, GdkEvent*);
1477         void start_cursor_grab (ArdourCanvas::Item*, GdkEvent*);
1478         void start_cursor_grab_no_stop (ArdourCanvas::Item*, GdkEvent*);
1479         void start_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1480         void start_control_point_grab (ArdourCanvas::Item*, GdkEvent*);
1481         void start_line_grab_from_regionview (ArdourCanvas::Item*, GdkEvent*);
1482         void start_line_grab_from_line (ArdourCanvas::Item*, GdkEvent*);
1483         void start_line_grab (AutomationLine *, GdkEvent*);
1484         void start_tempo_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1485         void start_tempo_marker_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1486         void start_meter_marker_grab (ArdourCanvas::Item*, GdkEvent*);
1487         void start_meter_marker_copy_grab (ArdourCanvas::Item*, GdkEvent*);
1488
1489         void region_view_item_click (AudioRegionView&, GdkEventButton*);
1490
1491         void remove_gain_control_point (ArdourCanvas::Item*, GdkEvent*);
1492         void remove_control_point (ArdourCanvas::Item*, GdkEvent*);
1493
1494         void mouse_brush_insert_region (RegionView*, nframes64_t pos);
1495         void brush (nframes64_t);
1496
1497         void show_verbose_time_cursor (nframes64_t frame, double offset = 0, double xpos=-1, double ypos=-1);
1498         void show_verbose_duration_cursor (nframes64_t start, nframes64_t end, double offset = 0, double xpos=-1, double ypos=-1);
1499         double clamp_verbose_cursor_x (double);
1500         double clamp_verbose_cursor_y (double);
1501
1502         /* Canvas event handlers */
1503
1504         bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*);
1505         bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*);
1506         bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1507         bool canvas_selection_start_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1508         bool canvas_selection_end_trim_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*);
1509         bool canvas_crossfade_view_event (GdkEvent* event,ArdourCanvas::Item*, CrossfadeView*);
1510         bool canvas_fade_in_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1511         bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1512         bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1513         bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*);
1514         
1515
1516         // These variables are used to detect a feedback loop and break it to avoid a gui hang
1517 private:
1518         ArdourCanvas::Item *last_item_entered;
1519         int last_item_entered_n;
1520 public:
1521
1522         bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1523         bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1524         bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
1525         bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
1526         bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*);
1527         bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*);
1528         bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
1529         bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
1530         bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*) ;
1531
1532         bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1533         bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1534         bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1535         bool canvas_range_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1536         bool canvas_transport_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1537         bool canvas_cd_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*);
1538
1539         bool canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1540         bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*);
1541         bool canvas_imageframe_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1542         bool canvas_imageframe_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*);
1543         bool canvas_marker_time_axis_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerTimeAxis*);
1544         bool canvas_markerview_item_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1545         bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1546         bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*);
1547
1548         /* non-public event handlers */
1549
1550         bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
1551         bool track_canvas_scroll (GdkEventScroll* event);
1552
1553         bool track_canvas_scroll_event (GdkEventScroll* event);
1554         bool track_canvas_button_press_event (GdkEventButton* event);
1555         bool track_canvas_button_release_event (GdkEventButton* event);
1556         bool track_canvas_motion_notify_event (GdkEventMotion* event);
1557
1558         Gtk::Allocation canvas_allocation;
1559         void track_canvas_allocate (Gtk::Allocation alloc);
1560         bool track_canvas_size_allocated ();
1561
1562         void set_playhead_cursor ();
1563
1564         void kbd_driver (sigc::slot<void,GdkEvent*>, bool use_track_canvas = true, bool use_time_canvas = true, bool can_select = true);
1565         void kbd_mute_unmute_region ();
1566         void kbd_brush ();
1567
1568         void kbd_do_brush (GdkEvent*);
1569         void kbd_do_audition (GdkEvent*);
1570
1571         void handle_new_duration ();
1572         void initialize_canvas ();
1573
1574         /* display control */
1575         
1576         bool _show_measures;
1577         /// true to show waveforms, otherwise false
1578         bool _show_waveforms;
1579         /// true if the editor should follow the playhead, otherwise false
1580         bool _follow_playhead;
1581         /// true if waveforms should be shown while recording audio tracks, otherwise false
1582         bool _show_waveforms_recording;
1583         
1584         ARDOUR::TempoMap::BBTPointList *current_bbt_points;
1585         
1586         TempoLines* tempo_lines;
1587
1588         ArdourCanvas::Group* time_line_group;
1589
1590         void hide_measures ();
1591         void draw_measures ();
1592         bool redraw_measures ();
1593
1594         void new_tempo_section ();
1595
1596         void mouse_add_new_tempo_event (nframes64_t where);
1597         void mouse_add_new_meter_event (nframes64_t where);
1598
1599         void remove_tempo_marker (ArdourCanvas::Item*);
1600         void remove_meter_marker (ArdourCanvas::Item*);
1601         gint real_remove_tempo_marker (ARDOUR::TempoSection*);
1602         gint real_remove_meter_marker (ARDOUR::MeterSection*);
1603         
1604         void edit_tempo_section (ARDOUR::TempoSection*);
1605         void edit_meter_section (ARDOUR::MeterSection*);
1606         void edit_tempo_marker (ArdourCanvas::Item*);
1607         void edit_meter_marker (ArdourCanvas::Item*);
1608         void edit_control_point (ArdourCanvas::Item*);
1609         
1610         void marker_menu_edit ();
1611         void marker_menu_remove ();
1612         void marker_menu_rename ();
1613         void marker_menu_lock (bool yn);
1614         void marker_menu_hide ();
1615         void marker_menu_loop_range ();
1616         void marker_menu_select_all_selectables_using_range ();
1617         void marker_menu_select_using_range ();
1618         void marker_menu_separate_regions_using_location ();
1619         void marker_menu_play_from ();
1620         void marker_menu_play_range ();
1621         void marker_menu_set_playhead ();
1622         void marker_menu_set_from_playhead ();
1623         void marker_menu_set_from_selection ();
1624         void marker_menu_range_to_next ();
1625         void new_transport_marker_menu_set_loop ();
1626         void new_transport_marker_menu_set_punch ();
1627         void update_loop_range_view (bool visibility=false);
1628         void update_punch_range_view (bool visibility=false);
1629         void new_transport_marker_menu_popdown ();
1630         void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1631         void tm_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1632         void transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1633         void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
1634         void build_range_marker_menu (bool loop_or_punch);
1635         void build_marker_menu (bool start_or_end);
1636         void build_tm_marker_menu ();
1637         void build_new_transport_marker_menu ();
1638
1639         Gtk::Menu* tm_marker_menu;
1640         Gtk::Menu* marker_menu;
1641         Gtk::Menu* start_end_marker_menu;
1642         Gtk::Menu* range_marker_menu;
1643         Gtk::Menu* transport_marker_menu;
1644         Gtk::Menu* new_transport_marker_menu;
1645         Gtk::Menu* cd_marker_menu;
1646         ArdourCanvas::Item* marker_menu_item;
1647
1648         typedef list<Marker*> Marks;
1649         Marks metric_marks;
1650
1651         void remove_metric_marks ();
1652         void draw_metric_marks (const ARDOUR::Metrics& metrics);
1653
1654         void compute_current_bbt_points (nframes_t left, nframes_t right);
1655         void tempo_map_changed (ARDOUR::Change);
1656         void redisplay_tempo (bool immediate_redraw);
1657         
1658         void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
1659         
1660         double snap_length_beats (nframes64_t start);
1661
1662         uint32_t bbt_beat_subdivision;
1663
1664         /* toolbar */
1665
1666         Gtk::ToggleButton editor_mixer_button;
1667         Gtk::ToggleButton editor_list_button;
1668         void editor_mixer_button_toggled ();
1669         void editor_list_button_toggled ();
1670
1671         AudioClock               edit_point_clock;
1672         AudioClock               zoom_range_clock;
1673         Gtk::Button              zoom_in_button;
1674         Gtk::Button              zoom_out_button;
1675         Gtk::Button              zoom_out_full_button;
1676         Gtk::Button              zoom_onetoone_button;
1677
1678         Gtk::VBox                toolbar_clock_vbox;
1679         Gtk::VBox                toolbar_selection_clock_vbox; 
1680         Gtk::Table               toolbar_selection_clock_table;
1681         Gtk::Label               toolbar_selection_cursor_label;
1682         
1683         Gtk::HBox                mouse_mode_button_box;
1684         Gtkmm2ext::TearOff*      mouse_mode_tearoff;
1685         Gtk::ToggleButton        mouse_select_button;
1686         Gtk::ToggleButton        mouse_move_button;
1687         Gtk::ToggleButton        mouse_gain_button;
1688         Gtk::ToggleButton        mouse_zoom_button;
1689         Gtk::ToggleButton        mouse_timefx_button;
1690         Gtk::ToggleButton        mouse_audition_button;
1691         Gtk::ToggleButton        mouse_note_button;
1692         GroupedButtons          *mouse_mode_button_set;
1693         void                     mouse_mode_toggled (Editing::MouseMode m);
1694         bool                     ignore_mouse_mode_toggle;
1695
1696         gint                     mouse_select_button_release (GdkEventButton*);
1697
1698         Gtk::VBox                automation_box;
1699         Gtk::Button              automation_mode_button;
1700         Gtk::ToggleButton        global_automation_button;
1701
1702         Gtk::ComboBoxText edit_mode_selector;
1703         Gtk::VBox         edit_mode_box;
1704
1705         void set_edit_mode (ARDOUR::EditMode);
1706         void cycle_edit_mode ();
1707         void edit_mode_selection_done ();
1708
1709         Gtk::ComboBoxText snap_type_selector;
1710         Gtk::ComboBoxText snap_mode_selector;
1711         Gtk::HBox         snap_box;
1712
1713         std::vector<std::string> snap_type_strings;
1714         std::vector<std::string> snap_mode_strings;
1715
1716         void snap_type_selection_done ();
1717         void snap_mode_selection_done ();
1718         void snap_mode_chosen (Editing::SnapMode);
1719         void snap_type_chosen (Editing::SnapType);
1720
1721         Glib::RefPtr<Gtk::RadioAction> snap_type_action (Editing::SnapType);
1722         Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode);
1723
1724         Gtk::ComboBoxText zoom_focus_selector;
1725         Gtk::VBox         zoom_focus_box;
1726
1727         std::vector<std::string> zoom_focus_strings;
1728         
1729         void zoom_focus_selection_done ();
1730         void zoom_focus_chosen (Editing::ZoomFocus);
1731
1732         Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
1733
1734         Gtk::HBox           zoom_box;
1735
1736         void                zoom_adjustment_changed();
1737
1738         void                edit_point_clock_changed();
1739         
1740         void setup_toolbar ();
1741
1742         Gtkmm2ext::TearOff*      tools_tearoff;
1743         Gtk::HBox                toolbar_hbox;
1744         Gtk::EventBox            toolbar_base;
1745         Gtk::Frame               toolbar_frame;
1746
1747         /* midi toolbar */
1748
1749         Gtk::HBox                midi_tool_button_box;
1750         Gtk::ToggleButton        midi_tool_pencil_button;
1751         Gtk::ToggleButton        midi_tool_select_button;
1752         Gtk::ToggleButton        midi_tool_resize_button;
1753         Gtk::ToggleButton        midi_tool_erase_button;
1754         Gtk::Button              midi_panic_button;
1755         Gtk::ToggleButton        midi_sound_notes;
1756         GroupedButtons          *midi_tool_button_set;
1757         void                     midi_edit_mode_toggled (Editing::MidiEditMode m);
1758         void                     midi_panic_button_pressed ();
1759         bool                     is_midi_sound_notes_active () const { return midi_sound_notes.get_active(); }
1760         
1761         bool                     ignore_midi_edit_mode_toggle;
1762
1763         Gtkmm2ext::TearOff* midi_tools_tearoff;
1764         Gtk::HBox           midi_toolbar_hbox;
1765         Gtk::EventBox       midi_toolbar_base;
1766         Gtk::Frame          midi_toolbar_frame;
1767         
1768         void setup_midi_toolbar ();
1769
1770         /* selection process */
1771
1772         Selection* selection;
1773         Selection* cut_buffer;
1774
1775         void time_selection_changed ();
1776         void track_selection_changed ();
1777         void region_selection_changed ();
1778         void sensitize_the_right_region_actions (bool have_selected_regions);
1779         void point_selection_changed ();
1780         void marker_selection_changed ();
1781
1782         enum SelectionOp {
1783                 CreateSelection,
1784                 SelectionStartTrim,
1785                 SelectionEndTrim,
1786                 SelectionMove
1787         } selection_op;
1788
1789         void start_selection_op (ArdourCanvas::Item* item, GdkEvent* event, SelectionOp);
1790         void drag_selection (ArdourCanvas::Item* item, GdkEvent* event);
1791         void end_selection_op (ArdourCanvas::Item* item, GdkEvent* event);
1792         void cancel_selection ();
1793
1794         void region_selection_op (void (ARDOUR::Region::*pmf)(void));
1795         void region_selection_op (void (ARDOUR::Region::*pmf)(void*), void*);
1796         void region_selection_op (void (ARDOUR::Region::*pmf)(bool), bool);
1797
1798         bool audio_region_selection_covers (nframes64_t where);
1799
1800         /* transport range select process */
1801         enum RangeMarkerOp {
1802                 CreateRangeMarker,
1803                 CreateTransportMarker,
1804                 CreateCDMarker
1805         } range_marker_op;
1806
1807         void start_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event, RangeMarkerOp);
1808         void drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1809         void end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event);
1810
1811         ArdourCanvas::SimpleRect*  cd_marker_bar_drag_rect;
1812         ArdourCanvas::SimpleRect*  range_bar_drag_rect;
1813         ArdourCanvas::SimpleRect*  transport_bar_drag_rect;
1814         ArdourCanvas::Line*        marker_drag_line;
1815         ArdourCanvas::Points       marker_drag_line_points;
1816         ArdourCanvas::SimpleRect*  range_marker_drag_rect;
1817
1818         void update_marker_drag_item (ARDOUR::Location *);
1819 #ifdef GTKOSX
1820         ArdourCanvas::SimpleRect     *bogus_background_rect;
1821 #endif
1822         ArdourCanvas::SimpleRect     *transport_bar_range_rect;
1823         ArdourCanvas::SimpleRect     *transport_bar_preroll_rect;
1824         ArdourCanvas::SimpleRect     *transport_bar_postroll_rect;
1825         ArdourCanvas::SimpleRect     *transport_loop_range_rect;
1826         ArdourCanvas::SimpleRect     *transport_punch_range_rect;
1827         ArdourCanvas::SimpleLine     *transport_punchin_line;
1828         ArdourCanvas::SimpleLine     *transport_punchout_line;
1829         ArdourCanvas::SimpleRect     *transport_preroll_rect;
1830         ArdourCanvas::SimpleRect     *transport_postroll_rect;
1831
1832         ARDOUR::Location*  transport_loop_location();
1833         ARDOUR::Location*  transport_punch_location();
1834
1835         ARDOUR::Location   *temp_location;
1836         
1837         /* object rubberband select process */
1838         
1839         void start_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1840         void drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1841         void end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
1842
1843         bool select_all_within (nframes64_t start, nframes64_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op);
1844         
1845         ArdourCanvas::SimpleRect   *rubberband_rect;
1846         
1847         /* mouse zoom process */
1848
1849         void start_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1850         void drag_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1851         void end_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event);
1852
1853         ArdourCanvas::SimpleRect   *zoom_rect;
1854         void reposition_zoom_rect (nframes64_t start, nframes64_t end);
1855         
1856         /* diskstream/route display management */
1857
1858         struct RouteDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
1859             RouteDisplayModelColumns() { 
1860                     add (text);
1861                     add (visible);
1862                     add (temporary_visible);
1863                     add (tv);
1864                     add (route);
1865             }
1866             Gtk::TreeModelColumn<Glib::ustring>  text;
1867             Gtk::TreeModelColumn<bool>           visible;
1868             Gtk::TreeModelColumn<bool>           temporary_visible;
1869             Gtk::TreeModelColumn<TimeAxisView*>  tv;
1870             Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> >  route;
1871         };
1872
1873         RouteDisplayModelColumns         route_display_columns;
1874         Glib::RefPtr<Gtk::ListStore>     route_display_model;
1875         Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
1876
1877         Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Route> > route_list_display; 
1878         Gtk::ScrolledWindow                   route_list_scroller;
1879         Gtk::Menu*                            route_list_menu;
1880
1881         void update_route_visibility ();
1882
1883         void sync_order_keys (const char*);
1884         bool route_redisplay_does_not_sync_order_keys;
1885         bool route_redisplay_does_not_reset_order_keys;
1886
1887         bool route_list_display_button_press (GdkEventButton*);
1888         void route_list_display_drag_data_received  (const Glib::RefPtr<Gdk::DragContext>& context,
1889                                                      gint                x,
1890                                                      gint                y,
1891                                                      const Gtk::SelectionData& data,
1892                                                      guint               info,
1893                                                      guint               time);
1894
1895         bool route_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
1896
1897         void route_list_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
1898         void route_list_delete (const Gtk::TreeModel::Path&);
1899         void track_list_reorder (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* new_order);
1900
1901         void initial_route_list_display ();
1902         void redisplay_route_list();
1903         void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what);
1904         bool ignore_route_list_reorder;
1905         bool no_route_list_redisplay;
1906
1907         void build_route_list_menu ();
1908         void show_route_list_menu ();
1909
1910         void show_all_routes ();
1911         void hide_all_routes ();
1912         void show_all_audiotracks ();
1913         void hide_all_audiotracks ();
1914         void show_all_audiobus ();
1915         void hide_all_audiobus ();
1916
1917         void set_all_tracks_visibility (bool yn);
1918         void set_all_audio_visibility (int type, bool yn);
1919
1920         /* edit group management */
1921
1922         struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
1923                 GroupListModelColumns () {
1924                        add (is_active);
1925                        add (is_visible);
1926                        add (text);
1927                        add (routegroup);
1928                 }
1929                 Gtk::TreeModelColumn<bool> is_active;
1930                 Gtk::TreeModelColumn<bool> is_visible;
1931                 Gtk::TreeModelColumn<std::string> text;
1932                 Gtk::TreeModelColumn<ARDOUR::RouteGroup*>   routegroup;
1933         };
1934
1935         GroupListModelColumns group_columns;
1936         Glib::RefPtr<Gtk::ListStore> group_model;
1937         Glib::RefPtr<Gtk::TreeSelection> group_selection;
1938
1939         Gtk::TreeView          edit_group_display;
1940         Gtk::ScrolledWindow    edit_group_display_scroller;
1941         Gtk::Menu*             edit_group_list_menu;
1942
1943         void build_edit_group_list_menu ();
1944         void activate_all_edit_groups ();
1945         void disable_all_edit_groups ();
1946
1947         bool in_edit_group_row_change;
1948         void edit_group_row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
1949         void edit_group_name_edit (const Glib::ustring&, const Glib::ustring&);
1950         void new_edit_group ();
1951         void edit_group_list_button_clicked ();
1952         gint edit_group_list_button_press_event (GdkEventButton* ev);
1953         void add_edit_group (ARDOUR::RouteGroup* group);
1954         void remove_selected_edit_group ();
1955         void edit_groups_changed ();
1956         void group_flags_changed (void*, ARDOUR::RouteGroup*);
1957
1958         Gtk::VBox           list_vpacker;
1959
1960         /* autoscrolling */
1961
1962         bool autoscroll_active;
1963         int autoscroll_timeout_tag;
1964         int autoscroll_x;
1965         int autoscroll_y;
1966         int last_autoscroll_x;
1967         int last_autoscroll_y;
1968         uint32_t autoscroll_cnt;
1969         nframes64_t autoscroll_x_distance;
1970         double autoscroll_y_distance;
1971
1972         static gint _autoscroll_canvas (void *);
1973         bool autoscroll_canvas ();
1974         void start_canvas_autoscroll (int x, int y);
1975         void stop_canvas_autoscroll ();
1976         void maybe_autoscroll (GdkEventMotion*);
1977         void maybe_autoscroll_horizontally (GdkEventMotion*);
1978         bool allow_vertical_scroll;
1979
1980         /* trimming */
1981         enum TrimOp {
1982                 StartTrim,
1983                 EndTrim,
1984                 ContentsTrim,
1985         } trim_op;
1986
1987         void start_trim (ArdourCanvas::Item*, GdkEvent*);
1988         void point_trim (GdkEvent*);
1989         void trim_motion_callback (ArdourCanvas::Item*, GdkEvent*);
1990         void single_contents_trim (RegionView&, nframes64_t, bool, bool, bool);
1991         void single_start_trim (RegionView&, nframes64_t, bool, bool);
1992         void single_end_trim (RegionView&, nframes64_t, bool, bool);
1993
1994         void trim_finished_callback (ArdourCanvas::Item*, GdkEvent*);
1995         void thaw_region_after_trim (RegionView& rv);
1996
1997         void trim_region_front();
1998         void trim_region_back();
1999         void trim_region (bool front);
2000
2001         void trim_region_to_edit_point ();
2002         void trim_region_from_edit_point ();
2003         void trim_region_to_loop ();
2004         void trim_region_to_punch ();
2005         void trim_region_to_location (const ARDOUR::Location&, const char* cmd);
2006
2007         bool show_gain_after_trim;
2008
2009         /* Drag-n-Drop */
2010
2011         int convert_drop_to_paths (std::vector<Glib::ustring>& paths,
2012                                    const Glib::RefPtr<Gdk::DragContext>& context,
2013                                    gint                x,
2014                                    gint                y,
2015                                    const Gtk::SelectionData& data,
2016                                    guint               info,
2017                                    guint               time);
2018
2019         void  track_canvas_drag_data_received  (const Glib::RefPtr<Gdk::DragContext>& context,
2020                                                 gint                x,
2021                                                 gint                y,
2022                                                 const Gtk::SelectionData& data,
2023                                                 guint               info,
2024                                                 guint               time);
2025         
2026         void  region_list_display_drag_data_received  (const Glib::RefPtr<Gdk::DragContext>& context,
2027                                                        gint                x,
2028                                                        gint                y,
2029                                                        const Gtk::SelectionData& data,
2030                                                        guint               info,
2031                                                        guint               time);
2032
2033         void  drop_paths  (const Glib::RefPtr<Gdk::DragContext>& context,
2034                            gint                x,
2035                            gint                y,
2036                            const Gtk::SelectionData& data,
2037                            guint               info,
2038                            guint               time);
2039
2040         void  drop_regions  (const Glib::RefPtr<Gdk::DragContext>& context,
2041                              gint                x,
2042                              gint                y,
2043                              const Gtk::SelectionData& data,
2044                              guint               info,
2045                              guint               time);
2046
2047         void  drop_routes (const Glib::RefPtr<Gdk::DragContext>& context,
2048                            gint                x,
2049                            gint                y,
2050                            const Gtk::SelectionData& data,
2051                            guint               info,
2052                            guint               time);
2053
2054         /* audio export */
2055
2056         int  write_region_selection(RegionSelection&);
2057         bool write_region (string path, boost::shared_ptr<ARDOUR::AudioRegion>);
2058         void bounce_region_selection ();
2059         void bounce_range_selection (bool replace);
2060         void external_edit_region ();
2061
2062         int write_audio_selection (TimeSelection&);
2063         bool write_audio_range (ARDOUR::AudioPlaylist&, const ARDOUR::ChanCount& channels, list<ARDOUR::AudioRange>&);
2064
2065         void write_selection ();
2066
2067         /* history */
2068
2069         UndoAction get_memento() const;
2070
2071         XMLNode *before; /* used in *_reversible_command */
2072
2073         void begin_reversible_command (string cmd_name);
2074         void commit_reversible_command ();
2075
2076         void update_title ();   
2077         void update_title_s (const string & snapshot_name);
2078
2079         struct State {
2080             Selection* selection;
2081             double frames_per_unit;
2082
2083             State (PublicEditor const * e);
2084             ~State ();
2085         };
2086
2087         void store_state (State&) const;
2088         void restore_state (State *);
2089
2090         void instant_save ();
2091
2092         boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
2093         
2094         /* freeze operations */
2095
2096         ARDOUR::InterThreadInfo freeze_status;
2097         gint freeze_progress_timeout (void *);
2098         static void* _freeze_thread (void*);
2099         void* freeze_thread ();
2100
2101         void freeze_route ();
2102         void unfreeze_route ();
2103
2104         /* edit-group solo + mute */
2105
2106         void set_edit_group_solo (ARDOUR::Route&, bool);
2107         void set_edit_group_mute (ARDOUR::Route&, bool);
2108
2109         /* duplication */
2110
2111         void duplicate_dialog (bool with_dialog);
2112         
2113         nframes64_t event_frame (GdkEvent*, double* px = 0, double* py = 0) const;
2114
2115         /* returns false if mouse pointer is not in track or marker canvas
2116          */
2117         bool mouse_frame (nframes64_t&, bool& in_track_canvas) const;
2118
2119         void time_fx_motion (ArdourCanvas::Item*, GdkEvent*);
2120         void start_time_fx (ArdourCanvas::Item*, GdkEvent*);
2121         void end_time_fx (ArdourCanvas::Item*, GdkEvent*);
2122
2123         struct TimeFXDialog : public ArdourDialog {
2124             ARDOUR::TimeFXRequest request;
2125             Editor&               editor;
2126             bool                  pitching;
2127             Gtk::Adjustment       pitch_octave_adjustment;
2128             Gtk::Adjustment       pitch_semitone_adjustment;
2129             Gtk::Adjustment       pitch_cent_adjustment;
2130             Gtk::SpinButton       pitch_octave_spinner;
2131             Gtk::SpinButton       pitch_semitone_spinner;
2132             Gtk::SpinButton       pitch_cent_spinner;
2133             RegionSelection       regions;
2134             Gtk::ProgressBar      progress_bar;
2135
2136             /* SoundTouch */
2137             Gtk::ToggleButton     quick_button;
2138             Gtk::ToggleButton     antialias_button;
2139             Gtk::HBox             upper_button_box;
2140
2141             /* RubberBand */
2142             Gtk::ComboBoxText     stretch_opts_selector;
2143             Gtk::Label            stretch_opts_label;
2144             Gtk::ToggleButton     precise_button;
2145             Gtk::ToggleButton     preserve_formants_button;
2146             Gtk::HBox             opts_box;
2147
2148             Gtk::Button*          cancel_button;
2149             Gtk::Button*          action_button;
2150             Gtk::VBox             packer;
2151             int                   status;
2152
2153             TimeFXDialog (Editor& e, bool for_pitch);
2154
2155             gint update_progress ();
2156             sigc::connection first_cancel;
2157             sigc::connection first_delete;
2158             void cancel_in_progress ();
2159             gint delete_in_progress (GdkEventAny*);
2160         };
2161
2162         /* "whats mine is yours" */
2163
2164         friend class TimeFXDialog;
2165
2166         TimeFXDialog* current_timefx;
2167
2168         static void* timefx_thread (void *arg);
2169         void do_timefx (TimeFXDialog&);
2170
2171         int time_stretch (RegionSelection&, float fraction);
2172         int pitch_shift (RegionSelection&, float cents);
2173         void pitch_shift_regions ();
2174         int time_fx (RegionSelection&, float val, bool pitching);
2175
2176         /* editor-mixer strip */
2177
2178         MixerStrip *current_mixer_strip;
2179         bool show_editor_mixer_when_tracks_arrive;
2180         Gtk::VBox current_mixer_strip_vbox;
2181         void cms_new (boost::shared_ptr<ARDOUR::Route>);
2182         void cms_deleted ();
2183         void current_mixer_strip_hidden ();
2184         void current_mixer_strip_removed ();
2185
2186         void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
2187         void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
2188 #ifdef GTKOSX
2189         void ensure_all_elements_drawn ();
2190 #endif
2191         /* nudging tracks */
2192
2193         void nudge_track (bool use_edit_point, bool forwards);
2194
2195         /* xfades */
2196
2197         bool _xfade_visibility;
2198         
2199 #ifdef WITH_CMT
2200         void handle_new_imageframe_time_axis_view(const string & track_name, void* src) ;
2201         void handle_new_imageframe_marker_time_axis_view(const string & track_name, TimeAxisView* marked_track) ;
2202
2203         void start_imageframe_grab(ArdourCanvas::Item*, GdkEvent*) ;
2204         void start_markerview_grab(ArdourCanvas::Item*, GdkEvent*) ;
2205
2206         void imageframe_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
2207         void markerview_drag_motion_callback(ArdourCanvas::Item*, GdkEvent*) ;
2208         void timeaxis_item_drag_finished_callback(ArdourCanvas::Item*, GdkEvent*) ;
2209
2210         gint canvas_imageframe_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2211         gint canvas_imageframe_view_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameTimeAxis* ifta);
2212         gint canvas_imageframe_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2213         gint canvas_imageframe_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, ImageFrameView* ifv);
2214
2215         gint canvas_marker_time_axis_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerTimeAxis* mta);
2216         gint canvas_markerview_item_view_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2217         gint canvas_markerview_start_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2218         gint canvas_markerview_end_handle_event(ArdourCanvas::Item* item, GdkEvent* event, MarkerView* mv);
2219
2220         void imageframe_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2221         void imageframe_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2222         void imageframe_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2223         void imageframe_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2224         void imageframe_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2225         void imageframe_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2226         
2227         void markerview_item_start_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2228         void markerview_item_end_handle_op(ArdourCanvas::Item* item, GdkEvent* event) ;
2229         void markerview_start_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2230         void markerview_start_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2231         void markerview_end_handle_trim_motion(ArdourCanvas::Item* item, GdkEvent* event) ;
2232         void markerview_end_handle_end_trim(ArdourCanvas::Item* item, GdkEvent* event) ;
2233
2234         void popup_imageframe_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
2235         void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
2236
2237         ImageFrameSocketHandler* image_socket_listener ;
2238 #endif
2239
2240         void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
2241         void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
2242         void edit_xfade (boost::weak_ptr<ARDOUR::Crossfade>);
2243         void xfade_edit_left_region ();
2244         void xfade_edit_right_region ();
2245
2246         static const int32_t default_width = 995;
2247         static const int32_t default_height = 765;
2248
2249         /* nudge */
2250
2251         Gtk::Button      nudge_forward_button;
2252         Gtk::Button      nudge_backward_button;
2253         Gtk::HBox        nudge_hbox;
2254         Gtk::VBox        nudge_vbox;
2255         AudioClock       nudge_clock;
2256
2257         nframes64_t get_nudge_distance (nframes64_t pos, nframes64_t& next);
2258
2259         bool nudge_forward_release (GdkEventButton*);
2260         bool nudge_backward_release (GdkEventButton*);
2261         
2262         /* audio filters */
2263
2264         void apply_filter (ARDOUR::Filter&, string cmd);
2265
2266         /* handling cleanup */
2267
2268         int playlist_deletion_dialog (boost::shared_ptr<ARDOUR::Playlist>);
2269
2270         vector<sigc::connection> session_connections;
2271
2272         /* tracking step changes of track height */
2273
2274         TimeAxisView* current_stepping_trackview;
2275         ARDOUR::microseconds_t last_track_height_step_timestamp;
2276         gint track_height_step_timeout();
2277         sigc::connection step_timeout;
2278
2279         TimeAxisView* entered_track;
2280         RegionView*   entered_regionview;
2281
2282
2283         void ensure_entered_track_selected (bool op_acts_on_objects = false);
2284         bool clear_entered_track;
2285         bool left_track_canvas (GdkEventCrossing*);
2286         bool entered_track_canvas (GdkEventCrossing*);
2287         void set_entered_track (TimeAxisView*);
2288         void set_entered_regionview (RegionView*);
2289         void ensure_track_visible (TimeAxisView*);
2290         gint left_automation_track ();
2291
2292         bool _new_regionviews_show_envelope;
2293
2294         void reset_canvas_action_sensitivity (bool);
2295         void toggle_gain_envelope_visibility ();
2296         void toggle_gain_envelope_active ();
2297         void reset_region_gain_envelopes ();
2298
2299         bool on_key_press_event (GdkEventKey*);
2300         bool on_key_release_event (GdkEventKey*);
2301
2302         void session_state_saved (string);
2303
2304         Glib::RefPtr<Gtk::Action>              undo_action;
2305         Glib::RefPtr<Gtk::Action>              redo_action;
2306
2307         void history_changed ();
2308
2309         Gtk::HBox      status_bar_hpacker;
2310
2311         Editing::EditPoint _edit_point;
2312
2313         Gtk::ComboBoxText edit_point_selector;
2314
2315         void set_edit_point_preference (Editing::EditPoint ep, bool force = false);
2316         void cycle_edit_point (bool with_marker);
2317         void set_edit_point ();
2318         void edit_point_selection_done ();
2319         void edit_point_chosen (Editing::EditPoint);
2320         Glib::RefPtr<Gtk::RadioAction> edit_point_action (Editing::EditPoint);
2321         std::vector<std::string> edit_point_strings;
2322
2323         void selected_marker_moved (ARDOUR::Location*);
2324         sigc::connection edit_point_clock_connection_a;
2325         sigc::connection edit_point_clock_connection_b;
2326
2327         bool get_edit_op_range (nframes64_t& start, nframes64_t& end) const;
2328
2329         void get_regions_at (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
2330         void get_regions_after (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
2331         
2332         void get_regions_for_action (RegionSelection&, bool allowed_entered_regionview = false);
2333
2334         sigc::connection fast_screen_update_connection;
2335         gint start_updating ();
2336         gint stop_updating ();
2337         void fast_update_strips ();
2338         bool meters_running;
2339
2340         void select_next_route ();
2341         void select_prev_route ();
2342
2343         void snap_to_internal (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
2344
2345         RhythmFerret* rhythm_ferret;
2346
2347         void fit_tracks ();
2348         void set_track_height (uint32_t h);
2349         void set_track_height_largest ();
2350         void set_track_height_large ();
2351         void set_track_height_larger ();
2352         void set_track_height_normal ();
2353         void set_track_height_smaller ();
2354         void set_track_height_small ();
2355
2356         void remove_tracks ();
2357         void toggle_tracks_active ();
2358         void waveform_scale_chosen (Editing::WaveformScale);
2359
2360         bool _have_idled;
2361         int resize_idle_id;
2362         int32_t resize_idle_target;
2363         bool idle_resize();
2364         friend gboolean _idle_resize (gpointer);
2365         std::vector<TimeAxisView*> pending_resizes;
2366
2367         void visible_order_range (int*, int*) const;
2368         bool y_movement_disallowed (int, int, int, int, int, std::bitset<512> const &, std::vector<int32_t> const &) const;
2369 };
2370
2371 #endif /* __ardour_editor_h__ */