Как выделить несколько участков текста? [ЧАСТИЧНО РЕШЕНО]

Автор Рыбка Рио, 24 мая 2010, 18:04

0 Пользователи и 1 гость просматривают эту тему.

Рыбка Рио

Как в Writer выделить прерывистые участки текста? (т.е., то что делается с помощью нажатия Ctrl и левой кнопки мыши)
Тут уже задавали такой вопрос, но ответа нет.
ubuntu 12.04 + LibO3.6.0

dr.Faust

Создать несколько текстовых курсоров?
Свобода информации - свобода личности!

Рыбка Рио

А дальше, как несколько текстовых диапазонов превратить в видимое выделение?

Если у нас есть текст: "Jhgjhfg dgh rtkgertg erkjhtgwr tkjhe tgel g".
Если запустить макрос:

Sub Main
   oD = ThisComponent
   oSearch = oD.createSearchDescriptor
   oSearch.SearchRegularExpression = TRUE
   oSearch.SearchString = "(Jh).+(fg)|(kg).+(tg)"
   oResult = oD.findAll(oSearch)
   oD.CurrentController.Select(oResult)
End Sub

то получим множественное выделение. Но это очень частный случай. Нужно создать объект вроде oResult, но который бы состоял из произвольных дипазонов, можно ли это как-то сделать?

Вот тут есть какой-то похожий пример создания объекта "com.sun.star.container.XIndexAccess", но что делать дальше - не понятно. Может проще как-то не в Basic это сделать, а в другом языке?
ubuntu 12.04 + LibO3.6.0

dr.Faust

#3
Что-то подсказывает мне, что копать надо куда-то сюда:
ЦитироватьoCursor = oDoc.CurrentController.getViewCursor
         oTextCursor1 = oDoc.getText.createTextCursorByRange(oCursor.Start)
         oTextCursor2 = oDoc.getText.createTextCursorByRange(oCursor.Start)
         oTextCursor1.gotoNextWord(0)
         oTextCursor1.gotoNextWord(0)
         oTextCursor1.goLeft(4,1)
         oTextCursor2.gotoPreviousWord(0)
         oTextCursor2.gotoPreviousWord(0)
         oTextCursor2.gotoPreviousWord(0)
         oTextCursor2.goLeft(4,1)
      
         Dim gh() As Object
         gh = Array(oTextCursor1,oTextCursor2)
         oDoc.CurrentController.select(gh)
Свобода информации - свобода личности!

macros


А как Вы хотите задавать текстовые диапазоны?

Если строками, то задача решается просто:

Sub Nselect
   oD = ThisComponent
   oSearch = oD.createSearchDescriptor
   oSearch.SearchRegularExpression = TRUE

   str1="Have you pressing business in some other town?"
   str2="You laugh, my little star?"
   str3="the harem beauty, vainly trying to hide the tears"

str123=str1 & "|" & str2 & "|" & str3

oSearch.SearchString = str123

   oResult = oD.findAll(oSearch)
   oD.CurrentController.Select(oResult)
End Sub


Файл примера вложен.


[вложение удалено Администратором]

dr.Faust

Кстати, а для чего?
Может можно найти другое решение?
Свобода информации - свобода личности!

Рыбка Рио

В пределах одного абзаца, этот способ может и годится. А что если одна из строк содержит несколько абзацев?
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Цитата: dr.Faust от 25 мая 2010, 22:17
Кстати, а для чего?
Предположим, человек выделяет текст и применяет макрос, а макросу нужен видимый курсор для работы, но в конце этот макрос должен вернуть всё как было, т.е. чтобы выделение осталось на своём месте.

Кстати, текстовые курсоры умеют работать с несколькими абзацами, видимые курсоры умеют работать не только с текстом, но и с таблицами и изображениями, а поиск умеет только работать со строками в пределах одного абзаца, кажется.
ubuntu 12.04 + LibO3.6.0

dr.Faust

Цитата: Трио от 25 мая 2010, 21:45Предположим, человек выделяет текст и применяет макрос, а макросу нужен видимый курсор для работы, но в конце этот макрос должен вернуть всё как было, т.е. чтобы выделение осталось на своём месте.
Так просто же!
Заберите, то, что отдаёт .CyrrentSelection в переменную. Сделайте что надо и подсуньте переменную в   oDoc.CurrentController.select(СЮДА)
Свобода информации - свобода личности!

Рыбка Рио

Спасибо!
Это работает:
Sub Main
F=ThisComponent.CurrentSelection
VK=ThisComponent.CurrentController.ViewCursor
VK.gotoStart(FALSE)
VK.goDown(1,FALSE)
ThisComponent.CurrentController.Select(F)
End Sub
ubuntu 12.04 + LibO3.6.0

prof-alex

Цитата: dr.Faust от 25 мая 2010, 23:19
Заберите, то, что отдаёт .CyrrentSelection в переменную. Сделайте что надо и подсуньте переменную в   oDoc.CurrentController.select(СЮДА)
Что-то с python не получается. Т.е. если просто сбросить и восстановить выделение, вроде работает, но если с текстом в выделении "пошаманить", то не восстанавливается оно совсем.

«Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации» Э. Дейкстра

dr.Faust

Ну да - и не должно.
В этом случае подумать надо...
Тут в лоб не прокатит.Сам подумай - что выделять? Тот тект который был больше не существует - на месте него другой, и наверняка с другим размером. Как востановить выделение? В тех же границах включив (или отрезав если длинна увеличилась) новые символы? Нет.
Очевидно, что тут выделение определяется границами НЕВЫДЕЛЕННОГО текста.
Соответственно надо думать в направлении:
Инвертировать выделение
Запомнить
Пошаманить с невыделенным текстом
Вернуть выделение
Инвертировать выделение

Ну это как бы концепт идеи (или наоборот - идея кнцепта :) ).
Как на практике реализовать не знаю - поковырятся надо.
Свобода информации - свобода личности!

prof-alex

Цитата: dr.Faust от 13 июня 2010, 21:14
Тот тект который был больше не существует - на месте него другой, и наверняка с другим размером.
Тут тот частный случай, когда границы не меняются. Это попытка дописать Capitalise.py: http://forum.script-coding.info/viewtopic.php?id=777

Хорошо помню, что попытки решить задачу не "в лоб" толку не дали, но делал я это давно.

«Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации» Э. Дейкстра

dr.Faust

А чем, прошу прощения, LaterCAPS не удовлетворяет?
У него конечно есть проблемы, но не такие глобальные...
К тому же готовится к выпуску новая версия.
Свобода информации - свобода личности!

Рыбка Рио

Кстати, тема не совсем "решено", т.к. вопрос как выделить несколько произвольных участков текста не решен.
ubuntu 12.04 + LibO3.6.0