예제 #1
0
        public bool ExecuteCommand(MoveLastCaretDownCommandArgs args, CommandExecutionContext executionContext)
        {
            var broker = args.TextView.GetMultiSelectionBroker();

            if (broker.HasMultipleSelections)
            {
                Selection toRemove    = FindLastSelection(broker);
                var       addNextArgs = new InsertNextMatchingCaretCommandArgs(args.TextView, args.SubjectBuffer);
                if (ExecuteCommand(addNextArgs, executionContext))
                {
                    if (broker.TryRemoveSelection(toRemove))
                    {
                        return(broker.TryEnsureVisible(FindLastSelection(broker), EnsureSpanVisibleOptions.None));
                    }
                }
            }

            return(false);
        }
예제 #2
0
 public CommandState GetCommandState(InsertNextMatchingCaretCommandArgs args)
 {
     return(CommandState.Available);
 }
예제 #3
0
        public bool ExecuteCommand(InsertNextMatchingCaretCommandArgs args, CommandExecutionContext executionContext)
        {
            var broker = args.TextView.GetMultiSelectionBroker();

            if (broker.PrimarySelection.IsEmpty)
            {
                broker.TryPerformActionOnSelection(broker.PrimarySelection, PredefinedSelectionTransformations.SelectCurrentWord, out _);
                return(true);
            }

            var navigator = TextSearchNavigatorFactoryService.CreateSearchNavigator(args.TextView.TextViewModel.EditBuffer);

            var    primaryRegion = broker.PrimarySelection;
            string searchString  = primaryRegion.Extent.GetText();

            // Intentionally look at all whitespace here
            if (!string.IsNullOrEmpty(searchString))
            {
                navigator.SearchTerm    = searchString;
                navigator.SearchOptions = FindOptions.MatchCase | FindOptions.Multiline;

                var regionArray  = broker.AllSelections.ToArray();
                int primaryIndex = 0;
                for (; primaryIndex < regionArray.Length; primaryIndex++)
                {
                    if (regionArray[primaryIndex] == broker.PrimarySelection)
                    {
                        break;
                    }
                }

                if (primaryIndex != 0)
                {
                    var wrappedLastRegion = regionArray[primaryIndex - 1];

                    navigator.StartPoint = wrappedLastRegion.End.Position;
                    var spanStart  = wrappedLastRegion.End.Position;
                    var spanLength = primaryRegion.Start.Position - spanStart;
                    navigator.SearchSpan = args.TextView.TextViewModel.EditBuffer.CurrentSnapshot.CreateTrackingSpan(
                        new Span(spanStart, spanLength),
                        SpanTrackingMode.EdgeInclusive);
                }
                else
                {
                    navigator.StartPoint = broker.SelectionExtent.End.Position;
                    navigator.SearchSpan = args.TextView.TextViewModel.EditBuffer.CurrentSnapshot.CreateTrackingSpan(
                        new Span(0, args.TextView.TextViewModel.EditBuffer.CurrentSnapshot.Length),
                        SpanTrackingMode.EdgeInclusive);

                    navigator.SearchOptions = navigator.SearchOptions | FindOptions.Wrap;
                }

                if (navigator.Find())
                {
                    var found = navigator.CurrentResult.Value;

                    if (!broker.SelectedSpans.OverlapsWith(found))
                    {
                        var outliningManager = OutliningManagerService.GetOutliningManager(args.TextView);
                        if (outliningManager != null)
                        {
                            outliningManager.ExpandAll(found, collapsible => true);
                        }

                        var addedRegion = InsertDiscoveredMatchRegion(broker, primaryRegion, found);
                        broker.TryEnsureVisible(addedRegion, EnsureSpanVisibleOptions.None);

                        return(true);
                    }
                }
            }

            return(false);
        }