ObjectBrowser.jsxinc - реализация персонального Data Browser для собственных JS-скриптов

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

SlavaBuck

Участник
Топикстартер
Сообщения
75
Реакции
30
Представляю небольшой ObjectBrowser для adobe ExtendScript. На мой взгляд, получилась очень полезная штука.
Может использоваться как для отладки собственных скриптов (я сам активно начал использовать его ещё в процессе его же и написания :) sorry ), так и просто ради интереса и изучения внутренних структур данных любых объектов доступных в ExtendScript для любого приложения, им поддерживаемого.
ObjectBrowser имеет окно изменяемого размера (смотрите рис 1,2,3), перемещаемый сепаратор, так что можно регулировать области просмотра по своему усмотрению (есть небольшие проблемы – более подробно в самом файле ObjectBrowser.jsxinc)
рис.1
Рис_1.PNG

Сам ObjectBrowser ещё немного в процессе допиливания, но основной функционал уже полностью реализован.
Быстрый старт:
#include "ObjectBrowser.jsxinc" // включили файлик в свой скрипт
main();
function main() {
var myBrowser = new ObjectBrowser(); // создали ObjectBrowser (с типом окна paletteпо умолчанию)
myBrowser.show($); // … и видим, то, что изображено на рис.1;
}
Кликаем в дереве по global, и видим то, что изображено на рис.3 – новое окно прячется под текущее, я пока в процессе решения, поэтому:
Выхватываем мышкой окно снизу, и видим содержимое глобального пространства имён – рис.2… и т.д.
Может использоваться в циклах, можно указывать конструктору желаемый тип окна (var myBrowser = newObjectBrowser(‘dialog’); ), можно просматривать любые JS объекты, в том числе и исходный код методов функций…

Более подробное описание смотрите в самом файле ObjectBrowser.jsxinc
Если кому-то будет интересно, буду рад обсудить функционал и вопросы по реализации…

П.С.
Ещё маленькие примеры использования:
myBrowser.show(myObj); // отображение методов и свойств объекта myObj
myBrowser.show($.writeln); // просмотр глобыльного метода$.writeln. К сожелению просмотр исходного кода будет недоступен ("native code"), для этого нужен disassembler : ), но зато можно получить любую другую информацию по ней, доступную через интерфейс ReflectionInfo данного объекта.
myBrowser.show(new Window ("dialog") ); // Создание безымянного объекта ScriptUI Windows, и просмотр его свойств в окне ObjectBrowser-а.
 

Вложения

  • ObjectBrowser_v1.1.rar
    ObjectBrowser_v1.1.rar
    19.5 КБ · Просм.: 301
  • Рис_2.PNG
    Рис_2.PNG
    47.4 КБ · Просм.: 1 000
  • Рис_3.PNG
    Рис_3.PNG
    83.3 КБ · Просм.: 1 031
Последнее редактирование модератором:
  • Спасибо
Реакции: _MBK_
Друзья, совершенно случайно обнаружил одну неприятную ошибку, которая приводит к генерации скрытых исключений в дебагере (на работу скрипта, впрочем, она никак не влияет):
В ObjectBrowser.jsxinc есть строки (номера 459...463). Вот они:
459 var right_size = right_size_old - step;
460 var right_size = rightchild.size[this._dimension] - step;
461 var right_min = (rightchild.minimumSize[this._dimension])||0;
462 var right_max = (rightchild.maximumSize[this._dimension])|| (this._dimension==0) ? $.screens[0].right : $.screens[0].bottom; // пока как то так...
463 var right_size_old = rightchild.size[this._dimension];


Обратите внимание - строка 463 (выделена) - её нужно переместить над строкой 459! (А строка 460 ненужна, она дублирует операцию из строки 459 и просто замедляет критически важный код)
Когда я копировал этот кусок из своей библиотеки, я проделал небольшое профилирование кода и что-то перемудрил.
В итоге у Вас должно получиться следующие:
459 var right_size_old = rightchild.size[this._dimension];
460 var right_size = right_size_old - step;
461 var right_min = (rightchild.minimumSize[this._dimension])||0;
462 var right_max = (rightchild.maximumSize[this._dimension])|| (this._dimension==0) ? $.screens[0].right : $.screens[0].bottom; // пока как то так...

Это, тем не менее, не снимает проблему потери фокуса при интенсивном перемещении сепаратора. Пока выложу исправленный файлик, а над сепаратором ещё поработаю. На мой взгляд, он работает лучше чем у alexey-dmitrienko в его dynamicUI_library.jsx (см. www.scriptuibuilder.com), а реализация гораздо более простая и компактная.
 

Вложения

@SlavaBuck, настоятельно советую вам для выкладывания своих работ использовать наш Менеджер ресурсов, а в теме просто давать ссылки на него. Поверьте, это удобнее и для вас и для участников форума. Если возникнут вопросы по использованию файлообменника, обращайтесь к @Eugenyus, он всегда поможет.
 
Он прекрасен :). Но дело не в отладчике, как в таковом. Хотя свой я могу поместить над окном документа и видеть только то, что мне нужно, я могу пройтись по методам объекта и увидеть их реализацию. В конце-концов я могу скопировать вывод из своего окна (удобно проверять - обладает ли выбранный объект нужным свойством?") - всего этого со встроенным Data Browser я сделать не могу либо больше мороки (с контролем в тех же циклах без breakpoints не обойтись и иногда переключение экранов напрягает).
Целью написания было не заменить встроенный Data Browser, а разобраться со скриптингом в части написания UI, и использования adobe DOM...
Выкладываю, так как нечего похожего в интернете я не находил! Единственные два нормальных ресурса, где освещены тонкости работы именно с ESTK - это этот форум!, и непревзойдённый сайт М.Иванюшина http://adobeindesign.ru/. Есть ещё буквально 1-2 сайта, такие как у Eugenyus-а - http://eugenyus.ucoz.ua/. И всё! Информации либо очень мало, либо она очень разрознена. Особенно по части ScriptUI.
Например, у меня в этом модуле есть, ИМХО - шикарная реализация динамических сепараторов (которые можно таскать мышкой) - единственное близкое по смыслу есть в коде dynamicUI_library.jsx у alexey-dmitrienko (www.scriptuibuilder.com). Но его библиотека представляет 315 строк кода и требует спецефического подхода для использования, а моя реализация имеет около 180 (с комментариями и прочей лабудой), при этом мои сепараторы полностью автоматические - сами определяют свою ориентацию, умеют быть просто линиями или полноценными разделителями, их кол-во в окне не ограничено, их можно добавлять в любой контейнер, их использование крайне простое - поскольку в них не переопределяется AutoLayoutManager, - их использование не нарушает обычные подходы при написании UI, их поведение точно предсказуемое, и главное - они работают не хуже, чем у alexey-dmitrienko (они работают гораздо лучше, при небольшом кол-ве пользовательских контролов). Если кому-то интересно - мог бы сделать документацию и выложить эту библиотеку отдельно...

Там ещё много всяких вкусностей - внедрение ресурсов в jsx, временные файлы для их 'трансформации' в объекты ScriptUIImage, работа с интерфейсом объектов ReflectionInfo и пр...
Так что файл носит скорее познавательное значение, но он достаточно подготовлен и для полноценного практического использования.
Ещё в планах добавить ему интерфейс Data Provaider, чтобы можно было однажды в скрипте сделать так:
Код:
      myObjectBrowser.attach(someObj);
и окно браузера обновлялось бы автоматически при каждом изменении объекта...
@SlavaBuck, настоятельно советую вам для выкладывания своих работ использовать наш Менеджер ресурсов, а в теме просто давать ссылки на него. Поверьте, это удобнее и для вас и для участников форума. Если возникнут вопросы по использованию файлообменника, обращайтесь к @Eugenyus, он всегда поможет.
Как то до сих пор особо не обращал внимание на него ;]=.
Выложил на обменник http://forum.rudtp.ru/resources/objectbrowser-estk-scriptui.311/ Пропатченную версию 1.10 - в ней устранены некоторые проблемы просмотра глобальных объектов Application (Включая app.activeDocument, app.activeBook и похожее).
 
Последнее редактирование:
Как то до сих пор особо не обращал внимание на него .
Выложил на обменник
Спасибо.
Я слегка подредактировал этот ваш ресурс:
- поправил отображаемую версию
- перенес в нужную категорию, таким файлам не место в «Файлообменнике» :)
- убрал в тэги [code] пример «быстрого старта».
 
  • Спасибо
Реакции: SlavaBuck
to svlasov: Не разобрался. Большое спасибо!
 
http://forum.rudtp.ru/resources/objectbrowser-estk-scriptui.311/updates
ver 1.11
- доработана обработка ошибок чтения свойств, имеющих значение undefined и добавлена соответствующая раскраска в иконке такого свойства;
- добавлена обработка свойств с типом 'Collection';
- добавлено отображение статических методов объекта;
- улучшена информативность вывода в окне описания свойства;
- значительно улучшена производительность вывода за счёт усечения длинных строк в дереве свойств объекта
 
Подсветка сепаратора - очень правильное решение, с вашего позволения позаимствую ;)
 
http://forum.rudtp.ru/resources/objectbrowser-estk-scriptui.311/updates
ver 1.12
- подкорректирована обработка ошибок чтения свойств (проблема осталась только с чтением static методов, наследуемых от базовых классов)
- слегка изменён порядок обработки типов Enumeration - теперь в дереве свойств и в правом окне с информацией выводится их строковое представление (как пишется в теле скрипта), а в заголовке - фактическое численное или строковое значение (было наоборот)
- значительно переработан и оптимизирован для быстрого вывода _buildTree(), для уменьшения мерцания при обновлении дерева, для этого контейнер, содержащий центральные части окна, был сделан белым, а вывод в дерево происходит при его скрытии (визуально это практически не заметно зато в циклах окно обновляется в разы лучше и быстрее).
- доработана часть библиотеки, отвечающая за сепараторы: исправлен поиск левых и правых соседей, доработана основная функция onMouseMove
- подчищен код, во все ключевые места добавлены комментарии

Важно: доработаны сепараторы, во все ключевые места добавлены комментарии!
Подсветка сепаратора - очень правильное решение, с вашего позволения позаимствую ;)
Так потому и выкладываю :)
А в сепараторах обнаружил глупую недоработку: в onMouseDown() там где происходит поиск левых и правых соседей, была добавлена принудительная установка соседа, в случае если ни у одного из имеющихся небыло обнаружено установленное свойство alignment (и учтена ошибка чтения этого свойства в случаях, когда оно вообще не определено у соседа).

П.С.
Думаю, эта версия - именно то, что я хотел видеть изначально.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.