Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

  • Автор темы Автор темы George
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

George

I wish I was a monster you think I am
Топикстартер
15 лет на форуме
Сообщения
17 532
Реакции
7 929
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Невозможно. API не предоставляет такой возможности. Закрывай тему.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Strizh,
:(( Вечно ты так, - обламываешь дикие идеи. Кстати модератор в плагинах ты - хочешь закрывай. Имхо пусть висит пока открытой - жить не мешает :)
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Если зациклиться на стандартном определении, что выделенный текст -- это часть буквенного и цифрового набора, которую можно следующими операциями как-то изменять, и для визуального отделения этой части текста от остального текст делается инверсным, то да, ограничения объектной модели будут, как флажки для волков, мысль не сможет за них выскочить. И опять время от времени на форумах будем искать умные слова для объяснения, почему это невозможно.
А если ввести другое определение выделенного текста -- набор, окрашенный служебным цветом, назовем его, например, 'SelectionColor', то никто не мешает выделить таким образом несмежные абзацы, отдельные слова. Приняв такую концепцию служебного цвета для выделений несмежного текста, можно сделать массу скриптов и плагинов для работы с таким текстом.
Знаю уже, что не все приемлют использование скриптов, считая только штатные инструменты достойными изучения. Но для расширяющих возможности программы за счет коллекционирования полезных скриптов, думаю, этот подход работы со служебным цветом был бы полезен.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

...ограничения объектной модели будут, как флажки для волков, мысль не сможет за них выскочить...

Михаил, мне кажется, мы не сталкиваемся в данном случае с ограничениями объектной модели.

Я могу выделить один абзац и скопировать его во внутренний буфер плагина?
Что мешает мне оперировать массивом из указателей на подобные объекты?
Что мешает в цикле по всем объектом присвоить им единый набор параметров?

Если я могу сделать нечто с одним объектом, я могу сделать это же с их произвольным числом.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Здравствуйте, Михаил.

Ничего не понял, но попробую прокомментирова.

Если зациклиться на стандартном определении, что выделенный текст -- это часть буквенного и цифрового набора, которую можно следующими операциями как-то изменять, и для визуального отделения этой части текста от остального текст делается инверсным, то да, ограничения объектной модели будут, как флажки для волков, мысль не сможет за них выскочить. И опять время от времени на форумах будем искать умные слова для объяснения, почему это невозможно.

Все плагины (от Adobe и от других производителей) работают с выделением одинаково.
Рассмотрим как из плагина работать с выделением текста. Приблизительный код выглядит так:

Код:
InterfacePtr<ITextTarget> textTarget(QueryConcreteSelection()); //спросим что у нас выделено
InterfacePtr<ITextModel> textModel(textTarget->QueryTextModel()); // вот наша story, в которой что-то выделено.
RangeData textSelectionRange = textTarget->GetRange(); //получили какой конкретно кусок текста выделен.

А теперь посмотрим во внутрь RangeData.

Код:
class  RangeData
{
//проскаю кусок, он нас не интересует

//а вот самое интересное
private:
 TextIndex fStart; // начало выделения
 TextIndex fEnd; //конец выделения

};

Как видно из приведенного примера, выделять и работать можно только с одним ЦЕЛЬНЫМ выделением.


А если ввести другое определение выделенного текста -- набор, окрашенный служебным цветом, назовем его, например, 'SelectionColor', то никто не мешает выделить таким образом несмежные абзацы, отдельные слова. Приняв такую концепцию служебного цвета для выделений несмежного текста, можно сделать массу скриптов и плагинов для работы с таким текстом.

Давайте посмотрим как InDesign подсвечивает выделенный текст (ну и не только текст).
Конкретно кода не видел, но думаю что где-то так (процентов на 98 буду прав)

Код:
//Где-то далеко в дебрях InDesign в какой-то определенный момент вызывается метод Draw.
//И выглядит он где-то так

какой_то_возвращаемый_тип Draw(какие-то параметры)
{
   DrawLayout(какие-то параметры); 
   DrawPageContent(какие-то параметры);
   //Еще много всяких Draw
   if(что-то выделено)
   {
      ISelectionHighlighter* selectionHighlighter = QuerySelectionHighlighter(concreteSelection);
      selectionHighlighter->HighlightSelection(какие-то параметры); 
    }
}

Резюмируя вышесказанное:
Допустим, мы/я/ты/он/они (нужное подчеркнуть) исхитрились и придумали как выделять несколько блоков текста, и написали новый интерфейс и его реализацию ITextTargetMultipleSelection.
У которого есть метод:
Код:
array<RangeData> GetRanges();

Вопрос в том, как теперь заставить всех производителей скриптов, включая Adobe использовть именно этот интерфейс при работе с выделенным текстом.

Знаю уже, что не все приемлют использование скриптов, считая только штатные инструменты достойными изучения. Но для расширяющих возможности программы за счет коллекционирования полезных скриптов, думаю, этот подход работы со служебным цветом был бы полезен.

Служебным цветом можно пометить что угодно и как угодно, тут возможности почти безграничны, осталось написать нужный плагин.

Надеюсь мой ответ закрыл все возникшие вопросы.

P.S. Приведите конкретный пример, когда нужно выделять несколько блоков текста. (мне необходимо только вертикальное выделение, и то в редких случаях, и то не в InDesign)
P.P.S. Может в CS6 Adobe выкинет интерфейс ITextTarget и заменит его на ITextTargetMultipleSelection. Тогда уже дело техники.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Я могу выделить один абзац и скопировать его во внутренний буфер плагина?
Что мешает мне оперировать массивом из указателей на подобные объекты?
Что мешает в цикле по всем объектом присвоить им единый набор параметров?

Если я могу сделать нечто с одним объектом, я могу сделать это же с их произвольным числом.

Игорь, постом выше я ответил на эти вопросы.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Ничего не понял, но попробую прокомментирова.
Я тоже ничего не понял, но тоже попробую прокомментирова :). Максим, на скриншоте - ваш пост в темном стиле форума. Большая просьба не использовать тэг PHP (по крайней мере, до тех пор, пока я не приведу его в порядок). Используйте вместо него тэг CODE. Спасибо.
 

Вложения

  • Screen shot 2011-05-12 at 11.29.52 AM.png
    Screen shot 2011-05-12 at 11.29.52 AM.png
    143.1 КБ · Просм.: 1 199
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Приведите конкретный пример, когда нужно выделять несколько блоков текста.

Я, например, вижу ускорение ручной расстановки стилей для равноценных множественных заголовков.
Потыкал через какой-нибудь Ctrl, как в ворде и присвоил им стиль.
Но без этого прекрасно можно обойтись.

Ещё версии?
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Я, например, вижу ускорение ручной расстановки стилей для равноценных множественных заголовков.
Хоткей на часто используемые стили и вперед. (Control+стрелка вниз - и вы уже на следующем абзаце).
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Я могу выделить один абзац и скопировать его во внутренний буфер плагина?
Что мешает мне оперировать массивом из указателей на подобные объекты?
Что мешает в цикле по всем объектом присвоить им единый набор параметров?

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


Приведите конкретный пример, когда нужно выделять несколько блоков текста
Это вопрос не ко мне. Не я озвучил необходимость такой возможности. Я только высказал свое видение, как это можно было бы реализовать.

Вопрос в том, как теперь заставить всех производителей скриптов, включая Adobe использовать именно этот интерфейс при работе с выделенным текстом.

Не надо никого заставлять. Вы заставляете людей пользоваться именно Вашими плагинами?
Мы просто обсуждаем возможное решение объявленной задачи.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Strizh,
Максим использование этой фичи удобно для выделения нескольких участков, их последующего вырезания и вставки в другой документ, например.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Максим использование этой фичи удобно для выделения нескольких участков, их последующего вырезания и вставки в другой документ, например.

Опять двадцать пять.

Допустим, мы написали плагин, который позволяет помечать цветом "SelectionColor" выделенный участок текста.
Дальше мы действуем так, выделили кусок, пометили, выделили второй, пометили и т.д.
Вопрос: "Дальше то что?".
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Игорь, постом выше я ответил на эти вопросы.

Максим, спасибо. Понял.

Объектная модель позволяет маркировать инверсией только один кусок текста.

Михаил, думаю, это не проблема. Инвертирование можно имитировать с помощью временного стиля... После изменения параметров абзацев все вернуть на круги своя...

Работа сложная и кропотливая получается... Если бы не расписанные на несколько лет вперед планы по переносам, попробовал бы сделать. Функция нужная.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

"Дальше то что?".
Потом весь текст с атрибутом выделения необходимо, чтобы по CTRL+C или CTRL+X загнался в буфер обмена.




Не по теме:
ваш пост в темном стиле форума.
Тов. Власов перешёл на тёмную сторону? :)

 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Потом весь текст с атрибутом выделения необходимо, чтобы по CTRL+C или CTRL+X загнался в буфер обмена.

Смотрю, невнимательно народ читает форум. Несколькими постами выше, я писал как плагины работают с выделением.
Покажу еще методы для Cut/Paste/Replace

virtual ErrorCode Cut (TextIndex start, int32 len, K2::shared_ptr< PasteData > &pasteData)=0
Cut range of text from story.

virtual ErrorCode Replace (TextIndex start, int32 len, const WideString *data, const ILanguage *language=nil, bool16 clearNonContinuingAttrs=kTrue)=0
Replace text in a range.

virtual ErrorCode Paste (TextIndex start, const K2::shared_ptr< PasteData > &data)=0
Paste data into story.

С copy все немного сложнее, но факт, входные параметры: начало и длина текста (не массив начал и длин).
Вопрос остается:
Вопрос в том, как теперь заставить всех производителей скриптов, включая Adobe использовть именно этот интерфейс при работе с выделенным текстом.

Все рассмотрено с выделением текста, но то же самое можно сказать и про ячейки таблиц не по порядку.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд


Не по теме:
Тов. Власов перешёл на тёмную сторону?
Тов. Власов уже утомился перемещаться от умных к красивым и обратно :). Работа у меня такая.

 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Работа сложная и кропотливая получается... Если бы не расписанные на несколько лет вперед планы по переносам, попробовал бы сделать. Функция нужная.
Еще бы планов лет на 10 прибавилось бы для такого выделения.
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Запомнить скриптом несколько выделенных областей в принципе оказалось несложно. Нижеприведенный скрипт пока ничего особого не делает — можно только добавить область, удалить ее из списка, а также перейти к одной из "запомненных". Выбирать текст можно где угодно, но для наглядности перехода — лучше на одном развороте (не научил его пока, как перепрыгивать на разные страницы).

Как прикрутить какой-нибудь функционал (типа стиль назначить или еще чего), пока мыслей нет. Хотелось бы придумать, чтобы можно было нажимать какую-то кнопку (условно "запись"?), после чего через стандартные палитры форматировать "мульти-выбранный" текст. Как это сделать, пока не знаю. Мысли принимаются, желательно в виде конкретных строчек кода.
Код:
#targetengine "session"
var mySel = []; //Сюда будем запоминать выделенные области как объекты (по нажатию кнопки "+")
var mySelComment = []; //Список-текст для отображения в окне

var w = new Window("palette", "  Multiselect", [1000,50,1200,270]);
w.pan = w.add("panel", [10,10,190,180]);
w.pan.list = w.pan.add("listbox", [10,10,170,150], mySelComment);

var butAdd = w.add("button", [10,190,30,210], "+");
butAdd.onClick = function(){
	mySel[mySel.length]=app.activeDocument.selection[0];
	mySelComment[mySelComment.length]="sel"+mySelComment.length;
	w.pan.list.add("item",mySelComment[mySelComment.length-1]);
	}

var butRemove = w.add("button",[35,190,55,210],"–");
butRemove.onClick = function(){
	for (i=w.pan.list.selection.index;i<mySel.length-1;i++){
		mySel[i]=mySel[i+1];
		}
	mySel.pop();
	w.pan.list.remove(w.pan.list.items[w.pan.list.selection.index]);
	}

var butGoto = w.add("button",[60,190,160,210],"Go to selection");
butGoto.onClick = function(){
	mySel[w.pan.list.selection.index].select();
	}

w.show();
 
Ответ: Одновременное выделение нескольких абзацев текста, расположенных в разных частях текста, не подряд

Еще бы планов лет на 10 прибавилось бы для такого выделения.
В виду сложности построения плагина - перемещаю в скрипты.
 
Статус
Закрыто для дальнейших ответов.