- Сообщения
- 17 532
- Реакции
- 7 929
Родилось здесь: http://forum.rudtp.ru/showthread.php?t=24297&p=543576&viewfull=1#post543576
Есть умельцы? Или это невозможно?
Есть умельцы? Или это невозможно?
...ограничения объектной модели будут, как флажки для волков, мысль не сможет за них выскочить...
Если зациклиться на стандартном определении, что выделенный текст -- это часть буквенного и цифрового набора, которую можно следующими операциями как-то изменять, и для визуального отделения этой части текста от остального текст делается инверсным, то да, ограничения объектной модели будут, как флажки для волков, мысль не сможет за них выскочить. И опять время от времени на форумах будем искать умные слова для объяснения, почему это невозможно.
InterfacePtr<ITextTarget> textTarget(QueryConcreteSelection()); //спросим что у нас выделено
InterfacePtr<ITextModel> textModel(textTarget->QueryTextModel()); // вот наша story, в которой что-то выделено.
RangeData textSelectionRange = textTarget->GetRange(); //получили какой конкретно кусок текста выделен.
class RangeData
{
//проскаю кусок, он нас не интересует
//а вот самое интересное
private:
TextIndex fStart; // начало выделения
TextIndex fEnd; //конец выделения
};
А если ввести другое определение выделенного текста -- набор, окрашенный служебным цветом, назовем его, например, 'SelectionColor', то никто не мешает выделить таким образом несмежные абзацы, отдельные слова. Приняв такую концепцию служебного цвета для выделений несмежного текста, можно сделать массу скриптов и плагинов для работы с таким текстом.
//Где-то далеко в дебрях InDesign в какой-то определенный момент вызывается метод Draw.
//И выглядит он где-то так
какой_то_возвращаемый_тип Draw(какие-то параметры)
{
DrawLayout(какие-то параметры);
DrawPageContent(какие-то параметры);
//Еще много всяких Draw
if(что-то выделено)
{
ISelectionHighlighter* selectionHighlighter = QuerySelectionHighlighter(concreteSelection);
selectionHighlighter->HighlightSelection(какие-то параметры);
}
}
array<RangeData> GetRanges();
Знаю уже, что не все приемлют использование скриптов, считая только штатные инструменты достойными изучения. Но для расширяющих возможности программы за счет коллекционирования полезных скриптов, думаю, этот подход работы со служебным цветом был бы полезен.
Я могу выделить один абзац и скопировать его во внутренний буфер плагина?
Что мешает мне оперировать массивом из указателей на подобные объекты?
Что мешает в цикле по всем объектом присвоить им единый набор параметров?
Если я могу сделать нечто с одним объектом, я могу сделать это же с их произвольным числом.
Я тоже ничего не понял, но тоже попробую прокомментирова . Максим, на скриншоте - ваш пост в темном стиле форума. Большая просьба не использовать тэг PHP (по крайней мере, до тех пор, пока я не приведу его в порядок). Используйте вместо него тэг CODE. Спасибо.Ничего не понял, но попробую прокомментирова.
Приведите конкретный пример, когда нужно выделять несколько блоков текста.
Хоткей на часто используемые стили и вперед. (Control+стрелка вниз - и вы уже на следующем абзаце).Я, например, вижу ускорение ручной расстановки стилей для равноценных множественных заголовков.
Максим использование этой фичи удобно для выделения нескольких участков, их последующего вырезания и вставки в другой документ, например.
Игорь, постом выше я ответил на эти вопросы.
Объектная модель позволяет маркировать инверсией только один кусок текста.
Потом весь текст с атрибутом выделения необходимо, чтобы по 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 прибавилось бы для такого выделения.