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