addNextOccurrence method

bool addNextOccurrence()

Adds the next occurrence of the primary selected text.

Search wraps once and skips ranges already represented in the set.

Implementation

bool addNextOccurrence() {
  final active = selections;
  final primary = active.primary;
  if (primary == null || primary.isCollapsed) return false;
  final query = _document.textInRange(
    startOffset: primary.startOffset,
    endOffset: primary.endOffset,
  );
  if (query.isEmpty) return false;
  final result = findTextSearchMatches(
    _document,
    TextSearchQuery(pattern: query, caseSensitive: true),
  );
  if (result.matches.isEmpty) return false;
  final ordered = [
    ...result.matches.where(
      (match) => match.startOffset >= primary.endOffset,
    ),
    ...result.matches.where((match) => match.startOffset < primary.endOffset),
  ];
  for (final match in ordered) {
    final duplicate = active.ranges.any(
      (range) =>
          range.startOffset == match.startOffset &&
          range.endOffset == match.endOffset,
    );
    if (duplicate) continue;
    setSelections(
      active.add(
        TextSelectionRange(
          startOffset: match.startOffset,
          endOffset: match.endOffset,
        ),
      ),
    );
    return true;
  }
  return false;
}