2 Copyright (C) 2000 Paul Davis
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.
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.
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.
25 #include "pbd/stacktrace.h"
27 #include "ardour/audioplaylist.h"
28 #include "ardour/audioregion.h"
29 #include "ardour/region_factory.h"
30 #include "ardour/midi_region.h"
34 #include "public_editor.h"
35 #include "audio_region_view.h"
36 #include "audio_streamview.h"
37 #include "canvas-noevent-text.h"
38 #include "crossfade_view.h"
39 #include "audio_time_axis.h"
40 #include "region_gain_line.h"
41 #include "automation_line.h"
42 #include "automation_time_axis.h"
43 #include "automation_line.h"
44 #include "control_point.h"
45 #include "canvas_impl.h"
46 #include "simplerect.h"
47 #include "interactive-item.h"
48 #include "editor_drag.h"
49 #include "midi_time_axis.h"
50 #include "editor_regions.h"
55 using namespace ARDOUR;
58 using namespace ArdourCanvas;
60 using Gtkmm2ext::Keyboard;
63 Editor::track_canvas_scroll (GdkEventScroll* ev)
66 int direction = ev->direction;
68 Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y);
69 InteractiveItem* interactive_item = dynamic_cast<InteractiveItem*>(item);
70 if (interactive_item) {
71 return interactive_item->on_event(reinterpret_cast<GdkEvent*>(ev));
77 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
78 temporal_zoom_step (false);
80 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
81 direction = GDK_SCROLL_LEFT;
83 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
84 if (!current_stepping_trackview) {
85 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
86 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
87 current_stepping_trackview = p.first;
88 if (!current_stepping_trackview) {
92 last_track_height_step_timestamp = get_microseconds();
93 current_stepping_trackview->step_height (true);
96 scroll_tracks_up_line ();
101 case GDK_SCROLL_DOWN:
102 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
103 temporal_zoom_step (true);
105 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
106 direction = GDK_SCROLL_RIGHT;
108 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
109 if (!current_stepping_trackview) {
110 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
111 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
112 current_stepping_trackview = p.first;
113 if (!current_stepping_trackview) {
117 last_track_height_step_timestamp = get_microseconds();
118 current_stepping_trackview->step_height (false);
121 scroll_tracks_down_line ();
126 case GDK_SCROLL_LEFT:
127 xdelta = (current_page_frames() / 8);
128 if (leftmost_frame > xdelta) {
129 reset_x_origin (leftmost_frame - xdelta);
135 case GDK_SCROLL_RIGHT:
136 xdelta = (current_page_frames() / 8);
137 if (max_frames - xdelta > leftmost_frame) {
138 reset_x_origin (leftmost_frame + xdelta);
140 reset_x_origin (max_frames - current_page_frames());
153 Editor::track_canvas_scroll_event (GdkEventScroll *event)
155 track_canvas->grab_focus();
156 track_canvas_scroll (event);
161 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
164 track_canvas->grab_focus();
169 Editor::track_canvas_button_release_event (GdkEventButton *event)
171 if (_drags->active ()) {
172 _drags->end_grab ((GdkEvent*) event);
178 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
181 /* keep those motion events coming */
182 track_canvas->get_pointer (x, y);
187 Editor::track_canvas_motion (GdkEvent *ev)
189 if (verbose_cursor_visible) {
190 verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10);
191 verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10);
198 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
202 switch (event->type) {
203 case GDK_BUTTON_PRESS:
204 case GDK_2BUTTON_PRESS:
205 case GDK_3BUTTON_PRESS:
206 ret = button_press_handler (item, event, type);
208 case GDK_BUTTON_RELEASE:
209 ret = button_release_handler (item, event, type);
211 case GDK_MOTION_NOTIFY:
212 ret = motion_handler (item, event);
215 case GDK_ENTER_NOTIFY:
216 ret = enter_handler (item, event, type);
219 case GDK_LEAVE_NOTIFY:
220 ret = leave_handler (item, event, type);
230 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
234 if (!rv->sensitive ()) {
238 switch (event->type) {
239 case GDK_BUTTON_PRESS:
240 case GDK_2BUTTON_PRESS:
241 case GDK_3BUTTON_PRESS:
242 clicked_regionview = rv;
243 clicked_control_point = 0;
244 clicked_axisview = &rv->get_time_axis_view();
245 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
246 ret = button_press_handler (item, event, RegionItem);
249 case GDK_BUTTON_RELEASE:
250 ret = button_release_handler (item, event, RegionItem);
253 case GDK_MOTION_NOTIFY:
254 ret = motion_handler (item, event);
257 case GDK_ENTER_NOTIFY:
258 set_entered_track (&rv->get_time_axis_view ());
259 set_entered_regionview (rv);
262 case GDK_LEAVE_NOTIFY:
263 set_entered_track (0);
264 set_entered_regionview (0);
275 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
279 switch (event->type) {
280 case GDK_BUTTON_PRESS:
281 case GDK_2BUTTON_PRESS:
282 case GDK_3BUTTON_PRESS:
283 clicked_regionview = 0;
284 clicked_control_point = 0;
285 clicked_axisview = tv;
286 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(tv);
287 ret = button_press_handler (item, event, StreamItem);
290 case GDK_BUTTON_RELEASE:
291 ret = button_release_handler (item, event, StreamItem);
294 case GDK_MOTION_NOTIFY:
295 ret = motion_handler (item, event);
298 case GDK_ENTER_NOTIFY:
299 set_entered_track (tv);
302 case GDK_LEAVE_NOTIFY:
303 set_entered_track (0);
314 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
318 switch (event->type) {
319 case GDK_BUTTON_PRESS:
320 case GDK_2BUTTON_PRESS:
321 case GDK_3BUTTON_PRESS:
322 clicked_regionview = 0;
323 clicked_control_point = 0;
324 clicked_axisview = atv;
325 clicked_routeview = 0;
326 ret = button_press_handler (item, event, AutomationTrackItem);
329 case GDK_BUTTON_RELEASE:
330 ret = button_release_handler (item, event, AutomationTrackItem);
333 case GDK_MOTION_NOTIFY:
334 ret = motion_handler (item, event);
337 case GDK_ENTER_NOTIFY:
338 ret = enter_handler (item, event, AutomationTrackItem);
341 case GDK_LEAVE_NOTIFY:
342 ret = leave_handler (item, event, AutomationTrackItem);
353 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
355 /* we handle only button 3 press/release events */
357 if (!rv->sensitive()) {
361 switch (event->type) {
362 case GDK_BUTTON_PRESS:
363 clicked_regionview = rv;
364 clicked_control_point = 0;
365 clicked_axisview = &rv->get_time_axis_view();
366 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
367 if (event->button.button == 3) {
368 return button_press_handler (item, event, FadeInItem);
372 case GDK_BUTTON_RELEASE:
373 if (event->button.button == 3) {
374 return button_release_handler (item, event, FadeInItem);
383 /* proxy for the regionview */
385 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
389 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
393 if (!rv->sensitive()) {
397 switch (event->type) {
398 case GDK_BUTTON_PRESS:
399 case GDK_2BUTTON_PRESS:
400 case GDK_3BUTTON_PRESS:
401 clicked_regionview = rv;
402 clicked_control_point = 0;
403 clicked_axisview = &rv->get_time_axis_view();
404 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
405 ret = button_press_handler (item, event, FadeInHandleItem);
408 case GDK_BUTTON_RELEASE:
409 ret = button_release_handler (item, event, FadeInHandleItem);
412 case GDK_MOTION_NOTIFY:
413 ret = motion_handler (item, event);
416 case GDK_ENTER_NOTIFY:
417 ret = enter_handler (item, event, FadeInHandleItem);
420 case GDK_LEAVE_NOTIFY:
421 ret = leave_handler (item, event, FadeInHandleItem);
432 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
434 /* we handle only button 3 press/release events */
436 if (!rv->sensitive()) {
440 switch (event->type) {
441 case GDK_BUTTON_PRESS:
442 clicked_regionview = rv;
443 clicked_control_point = 0;
444 clicked_axisview = &rv->get_time_axis_view();
445 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
446 if (event->button.button == 3) {
447 return button_press_handler (item, event, FadeOutItem);
451 case GDK_BUTTON_RELEASE:
452 if (event->button.button == 3) {
453 return button_release_handler (item, event, FadeOutItem);
462 /* proxy for the regionview */
464 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
468 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
472 if (!rv->sensitive()) {
476 switch (event->type) {
477 case GDK_BUTTON_PRESS:
478 case GDK_2BUTTON_PRESS:
479 case GDK_3BUTTON_PRESS:
480 clicked_regionview = rv;
481 clicked_control_point = 0;
482 clicked_axisview = &rv->get_time_axis_view();
483 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
484 ret = button_press_handler (item, event, FadeOutHandleItem);
487 case GDK_BUTTON_RELEASE:
488 ret = button_release_handler (item, event, FadeOutHandleItem);
491 case GDK_MOTION_NOTIFY:
492 ret = motion_handler (item, event);
495 case GDK_ENTER_NOTIFY:
496 ret = enter_handler (item, event, FadeOutHandleItem);
499 case GDK_LEAVE_NOTIFY:
500 ret = leave_handler (item, event, FadeOutHandleItem);
510 struct DescendingRegionLayerSorter {
511 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
512 return a->layer() > b->layer();
517 Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
519 /* we handle only button 3 press/release events */
521 switch (event->type) {
522 case GDK_BUTTON_PRESS:
523 clicked_crossfadeview = xfv;
524 clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
525 if (event->button.button == 3) {
526 return button_press_handler (item, event, CrossfadeViewItem);
530 case GDK_BUTTON_RELEASE:
531 if (event->button.button == 3) {
532 bool ret = button_release_handler (item, event, CrossfadeViewItem);
542 /* XXX do not forward double clicks */
544 if (event->type == GDK_2BUTTON_PRESS) {
548 /* proxy for an underlying regionview */
550 /* XXX really need to check if we are in the name highlight,
551 and proxy to that when required.
554 TimeAxisView& tv (xfv->get_time_axis_view());
555 AudioTimeAxisView* atv;
557 if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
559 if (atv->is_audio_track()) {
561 boost::shared_ptr<AudioPlaylist> pl;
562 if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->track()->playlist())) != 0) {
564 Playlist::RegionList* rl = pl->regions_at (event_frame (event));
567 if (atv->layer_display() == Overlaid) {
569 /* we're in overlaid mode; proxy to the uppermost region view */
571 DescendingRegionLayerSorter cmp;
574 RegionView* rv = atv->view()->find_view (rl->front());
579 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
583 /* we're in stacked mode; proxy to the region view under the mouse */
585 /* XXX: FIXME: this is an evil hack; it assumes that any event for which
586 this proxy is being used has its GdkEvent laid out such that the y
587 member is in the same place as that for a GdkEventButton */
589 /* position of the event within the track */
590 double cx = event->button.x;
591 double cy = event->button.y;
592 atv->view()->canvas_item()->w2i (cx, cy);
594 /* hence layer that we're over */
595 double const c = atv->view()->child_height ();
596 layer_t const l = pl->top_layer () + 1 - (cy / c);
599 Playlist::RegionList::iterator i = rl->begin();
600 while (i != rl->end() && (*i)->layer() != l) {
604 if (i != rl->end()) {
605 RegionView* rv = atv->view()->find_view (*i);
609 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
623 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
625 switch (event->type) {
626 case GDK_BUTTON_PRESS:
627 case GDK_2BUTTON_PRESS:
628 case GDK_3BUTTON_PRESS:
629 clicked_control_point = cp;
630 clicked_axisview = &cp->line().trackview;
631 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
632 clicked_regionview = 0;
638 case GDK_SCROLL_DOWN:
645 return typed_event (item, event, ControlPointItem);
649 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
653 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
656 type = AutomationLineItem;
659 return typed_event (item, event, type);
663 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
667 switch (event->type) {
668 case GDK_BUTTON_PRESS:
669 case GDK_2BUTTON_PRESS:
670 case GDK_3BUTTON_PRESS:
671 clicked_selection = rect->id;
672 ret = button_press_handler (item, event, SelectionItem);
674 case GDK_BUTTON_RELEASE:
675 ret = button_release_handler (item, event, SelectionItem);
677 case GDK_MOTION_NOTIFY:
678 ret = motion_handler (item, event);
680 /* Don't need these at the moment. */
681 case GDK_ENTER_NOTIFY:
682 ret = enter_handler (item, event, SelectionItem);
685 case GDK_LEAVE_NOTIFY:
686 ret = leave_handler (item, event, SelectionItem);
697 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
701 switch (event->type) {
702 case GDK_BUTTON_PRESS:
703 case GDK_2BUTTON_PRESS:
704 case GDK_3BUTTON_PRESS:
705 clicked_selection = rect->id;
706 ret = button_press_handler (item, event, StartSelectionTrimItem);
708 case GDK_BUTTON_RELEASE:
709 ret = button_release_handler (item, event, StartSelectionTrimItem);
711 case GDK_MOTION_NOTIFY:
712 ret = motion_handler (item, event);
714 case GDK_ENTER_NOTIFY:
715 ret = enter_handler (item, event, StartSelectionTrimItem);
718 case GDK_LEAVE_NOTIFY:
719 ret = leave_handler (item, event, StartSelectionTrimItem);
730 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
734 switch (event->type) {
735 case GDK_BUTTON_PRESS:
736 case GDK_2BUTTON_PRESS:
737 case GDK_3BUTTON_PRESS:
738 clicked_selection = rect->id;
739 ret = button_press_handler (item, event, EndSelectionTrimItem);
741 case GDK_BUTTON_RELEASE:
742 ret = button_release_handler (item, event, EndSelectionTrimItem);
744 case GDK_MOTION_NOTIFY:
745 ret = motion_handler (item, event);
747 case GDK_ENTER_NOTIFY:
748 ret = enter_handler (item, event, EndSelectionTrimItem);
751 case GDK_LEAVE_NOTIFY:
752 ret = leave_handler (item, event, EndSelectionTrimItem);
763 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
767 /* frame handles are not active when in internal edit mode, because actual notes
768 might be in the area occupied by the handle - we want them to be editable as normal.
771 if (internal_editing() || !rv->sensitive()) {
775 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
776 perspective. XXX change this ??
779 switch (event->type) {
780 case GDK_BUTTON_PRESS:
781 case GDK_2BUTTON_PRESS:
782 case GDK_3BUTTON_PRESS:
783 clicked_regionview = rv;
784 clicked_control_point = 0;
785 clicked_axisview = &clicked_regionview->get_time_axis_view();
786 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
787 ret = button_press_handler (item, event, RegionViewNameHighlight);
789 case GDK_BUTTON_RELEASE:
790 ret = button_release_handler (item, event, RegionViewNameHighlight);
792 case GDK_MOTION_NOTIFY:
793 ret = motion_handler (item, event);
795 case GDK_ENTER_NOTIFY:
796 ret = enter_handler (item, event, RegionViewNameHighlight);
799 case GDK_LEAVE_NOTIFY:
800 ret = leave_handler (item, event, RegionViewNameHighlight);
812 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
816 if (!rv->sensitive()) {
820 switch (event->type) {
821 case GDK_BUTTON_PRESS:
822 case GDK_2BUTTON_PRESS:
823 case GDK_3BUTTON_PRESS:
824 clicked_regionview = rv;
825 clicked_control_point = 0;
826 clicked_axisview = &clicked_regionview->get_time_axis_view();
827 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
828 ret = button_press_handler (item, event, RegionViewNameHighlight);
830 case GDK_BUTTON_RELEASE:
831 ret = button_release_handler (item, event, RegionViewNameHighlight);
833 case GDK_MOTION_NOTIFY:
834 ret = motion_handler (item, event);
836 case GDK_ENTER_NOTIFY:
837 ret = enter_handler (item, event, RegionViewNameHighlight);
840 case GDK_LEAVE_NOTIFY:
841 ret = leave_handler (item, event, RegionViewNameHighlight);
852 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
856 if (!rv->sensitive()) {
860 switch (event->type) {
861 case GDK_BUTTON_PRESS:
862 case GDK_2BUTTON_PRESS:
863 case GDK_3BUTTON_PRESS:
864 clicked_regionview = rv;
865 clicked_control_point = 0;
866 clicked_axisview = &clicked_regionview->get_time_axis_view();
867 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
868 ret = button_press_handler (item, event, RegionViewName);
870 case GDK_BUTTON_RELEASE:
871 ret = button_release_handler (item, event, RegionViewName);
873 case GDK_MOTION_NOTIFY:
874 ret = motion_handler (item, event);
876 case GDK_ENTER_NOTIFY:
877 ret = enter_handler (item, event, RegionViewName);
880 case GDK_LEAVE_NOTIFY:
881 ret = leave_handler (item, event, RegionViewName);
892 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
894 return typed_event (item, event, MarkerItem);
898 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
900 return typed_event (item, event, MarkerBarItem);
904 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
906 return typed_event (item, event, RangeMarkerBarItem);
910 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
912 return typed_event (item, event, TransportMarkerBarItem);
916 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
918 return typed_event (item, event, CdMarkerBarItem);
922 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
924 return typed_event (item, event, TempoMarkerItem);
928 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
930 return typed_event (item, event, MeterMarkerItem);
934 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
936 return typed_event (item, event, TempoBarItem);
940 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
942 return typed_event (item, event, MeterBarItem);
946 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
948 return typed_event (item, event, PlayheadCursorItem);
952 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
954 return typed_event (item, event, NoItem);
958 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
960 if (!internal_editing()) {
964 return typed_event (item, event, NoteItem);
968 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
972 track_canvas->window_to_world (x, y, wx, wy);
975 event.type = GDK_MOTION_NOTIFY;
978 /* assume we're dragging with button 1 */
979 event.motion.state = Gdk::BUTTON1_MASK;
981 if (!_drags->active ()) {
985 nframes64_t const pos = event_frame (&event, &px, &py);
987 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
992 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
993 if (rtav == 0 || !rtav->is_track ()) {
997 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
999 boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
1001 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1002 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1004 /* audio -> non-audio */
1008 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
1009 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
1011 /* MIDI -> non-MIDI */
1015 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1018 _drags->motion_handler (&event, false);