+void
+Editor::select_all_selectables_between (bool /*within*/)
+{
+ nframes64_t start;
+ nframes64_t end;
+ list<Selectable *> touched;
+
+ if (!get_edit_op_range (start, end)) {
+ return;
+ }
+
+ TrackViewList* ts;
+
+ if (selection->tracks.empty()) {
+ ts = &track_views;
+ } else {
+ ts = &selection->tracks;
+ }
+
+ for (TrackViewList::iterator iter = ts->begin(); iter != ts->end(); ++iter) {
+ if ((*iter)->hidden()) {
+ continue;
+ }
+ (*iter)->get_selectables (start, end, 0, DBL_MAX, touched);
+ }
+
+ selection->set (touched);
+}
+
+void
+Editor::select_range_between ()
+{
+ nframes64_t start;
+ nframes64_t end;
+
+ if (!get_edit_op_range (start, end)) {
+ return;
+ }
+
+ set_mouse_mode (MouseRange);
+ selection->set (start, end);
+}
+
+bool
+Editor::get_edit_op_range (nframes64_t& start, nframes64_t& end) const
+{
+ nframes64_t m;
+ bool ignored;
+
+ /* in range mode, use any existing selection */
+
+ if (mouse_mode == MouseRange && !selection->time.empty()) {
+ /* we know that these are ordered */
+ start = selection->time.start();
+ end = selection->time.end_frame();
+ return true;
+ }
+
+ if (!mouse_frame (m, ignored)) {
+ /* mouse is not in a canvas, try playhead+selected marker.
+ this is probably most true when using menus.
+ */
+
+ if (selection->markers.empty()) {
+ return false;
+ }
+
+ start = selection->markers.front()->position();
+ end = _session->audible_frame();
+
+ } else {
+
+ switch (_edit_point) {
+ case EditAtPlayhead:
+ if (selection->markers.empty()) {
+ /* use mouse + playhead */
+ start = m;
+ end = _session->audible_frame();
+ } else {
+ /* use playhead + selected marker */
+ start = _session->audible_frame();
+ end = selection->markers.front()->position();
+ }
+ break;
+
+ case EditAtMouse:
+ /* use mouse + selected marker */
+ if (selection->markers.empty()) {
+ start = m;
+ end = _session->audible_frame();
+ } else {
+ start = selection->markers.front()->position();
+ end = m;
+ }
+ break;
+
+ case EditAtSelectedMarker:
+ /* use mouse + selected marker */
+ if (selection->markers.empty()) {
+
+ MessageDialog win (_("No edit range defined"),
+ false,
+ MESSAGE_INFO,
+ BUTTONS_OK);
+
+ win.set_secondary_text (
+ _("the edit point is Selected Marker\nbut there is no selected marker."));
+
+
+ win.set_default_response (RESPONSE_CLOSE);
+ win.set_position (Gtk::WIN_POS_MOUSE);
+ win.show_all();
+
+ win.run ();
+
+ return false; // NO RANGE
+ }
+ start = selection->markers.front()->position();
+ end = m;
+ break;
+ }
+ }
+
+ if (start == end) {
+ return false;
+ }
+
+ if (start > end) {
+ swap (start, end);
+ }
+
+ /* turn range into one delimited by start...end,
+ not start...end-1
+ */
+
+ end++;
+
+ return true;
+}
+
+void
+Editor::deselect_all ()
+{
+ selection->clear ();
+}
+
+long
+Editor::select_range_around_region (RegionView* rv)
+{
+ assert (rv);
+
+ selection->set (&rv->get_time_axis_view());
+
+ selection->time.clear ();
+ boost::shared_ptr<Region> r = rv->region ();
+ return selection->set (r->position(), r->position() + r->length());
+}