SWT Browser фокусируется на следующем и предыдущем выделенном тексте

Я разрабатываю небольшое приложение с виджетами SWT Browser. Я выделяю текстовое слово для поиска с помощью

<a id="xyz" href=''><mark>test</mark></a>

в документе HTML. и замените все слова поиска в тексте HTML таким образом, чтобы мы выделили все слова поиска.

    htmltext.replaceAll("(?i)"+Pattern.quote(searchword), "\\<a id='xyz' href=''> <mark>$0\\</mark></a>

Я хочу реализовать функциональность, которая, если я нажму на следующую кнопку, следующее выделенное слово должно получить фокус, и если я нажму на предыдущую кнопку, предыдущий выделенный текст должен получить фокус. как я могу выполнить следующий и предыдущий хит с использованием Javascript в приложении RCP Eclipse.

Ответ 1

Это лучше всего решить, объединив JavaScript с кодом Java. Это зависит от того, какой контент HTML вы собираетесь обрабатывать, если он неактивен (например, не может перезагружаться), динамический с большим количеством JS-кода или простой статический. В большинстве случаев наилучшее решение будет включать большую часть логики, которая должна быть записана в JS, и просто минимальный код в Java для привязки действий JS к SWT GUI.

Здесь необходимо выполнить несколько действий:

  • поиск ключевых слов
  • подсветка
  • переключение выделения из одного слова в другое

1. Поиск: вы понимаете, что не сможете искать слова, которые охватывают многие элементы HTML, например W<span>o</span>rd? Если это нормально, вы можете просто искать и заменять Java, как сейчас. Я хотел бы пометить каждое совпадение слов с id: <span id="match1"> и вспомнить, сколько совпадений было найдено.

Вы также можете выполнить такой поиск на стороне JS, добавив функцию, которая выполняет итерацию через DOM, и ищет определенный текст и обертывает его другим объектом DOM.

2. Переключение подсветки. Лучше всего это сделать в JavaScript. Добавьте в свой HTML фрагмент кода JS, который переключает стиль элемента DOM. Что-то вроде: `

function highlight(id) {
  document.getElementById(id).className = 'highlighted'
}

Вы можете вызвать этот JS из SWT, вызвав swtBrowser.execute("highlight('match1')") Далее вы должны реализовать функцию, которая снимает подсветку.

3. Переключение подсветки между элементами: Это можно сделать как на стороне Java, так и на стороне JS. Я, вероятно, поеду с JS и добавлю еще две функции: highlightNext() и highlightPrev(), которые просто вызовут функцию highlight() с соответствующими идентификаторами. Затем в Java вы можете создавать SWT-кнопки, которые вызывают функции JS через SWTBrowser.execute().