private void CommandBinding_ExecuteSetOriginToCursor(object sender, ExecutedRoutedEventArgs e)
        {
            MusicSegmentViewModel segment = e.Parameter as MusicSegmentViewModel;

            if (segment == null)
            {
                throw new ArgumentException("invalid parameter");
            }

            segment.TimeOrigin = TimeSpan.FromSeconds(sequencer.CursorPosition);
        }
        private void CommandBinding_ExecuteSelectReferringBlocks(object sender, ExecutedRoutedEventArgs e)
        {
            MusicSegmentViewModel segment = e.Parameter as MusicSegmentViewModel;

            if (segment == null)
            {
                throw new ArgumentException("invalid parameter");
            }

            var blocks = sequencer.AllBlocks.Where(block => block.SegmentContext == segment);

            sequencer.SelectBlocks(blocks, CompositionMode.None);
        }
        private void CommandBinding_ExecuteMoveSegmentByTime(object sender, ExecutedRoutedEventArgs e)
        {
            MusicSegmentViewModel segment = e.Parameter as MusicSegmentViewModel;

            if (segment == null)
            {
                throw new ArgumentException("invalid parameter");
            }

            var result = Mastermind.ShowPromptTimeSpan(this, "Enter time delta", TimeSpan.Zero);

            if (!result.Success)
            {
                return; // cancelled by user
            }
            segment.TimeOrigin += result.Value;
        }
        private void CommandBinding_ExecuteDeleteSegment(object sender, ExecutedRoutedEventArgs e)
        {
            if (e.Parameter == null)
            {
                return;
            }

            MusicSegmentViewModel segment = (MusicSegmentViewModel)e.Parameter;

            if (segment.ReferringBlocksDummies.Count > 0)
            {
                MessageBoxResult result = MessageBox.Show(this, segment.ReferringBlocksDummies.Count + " blocks are referring to '" + segment.Label + "' and will have their music segment reset." + Environment.NewLine + "Are you sure?", "Confirmation", MessageBoxButton.YesNo);
                if (result != MessageBoxResult.Yes)
                {
                    return;
                }
            }

            sequencer.DeleteMusicSegment(segment);
        }
        private void CommandBinding_ExecuteAddSegment(object sender, ExecutedRoutedEventArgs e)
        {
            MusicSegmentViewModel newSegment = sequencer.AddMusicSegment();

            segmentsListBox.SelectedItem = newSegment;
        }