Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Разработка плагина IntelliJ IDEA. Часть 7

Anna | 5.06.2014 | нет комментариев

В этой части: компоненты пользовательского интерфейса. Предыдущая часть здесь.

IntelliJ IDEA включает в себя огромное число пользовательских Swing-компонентов. Применение этих компонентов в ваших плагинах гарантирует, что они будут выглядеть и трудиться согласовано с остальным пользовательским интерфейсом IDE и Зачастую разрешает уменьшить размер кода, по сопоставлению с применением стандартных Swing-компонентов.

Меню и панели инструментов

Меню и панели инструментов (тулбары) строятся с применением системы действий (как теснее было описано во 2-й части).

Окна инструментов

Окна инструментов — это панели, которые отображаются слева, снизу и справа от основного окна IntelliJ IDEA. На всякой стороне содержится по две группы окон инструментов — первичное и вторичное, причем в один и тот же момент энергичной может быть только одна группа.

Всякое окно инструментов может содержать несколько вкладок (в API именуются «contents»). Скажем, toolwindow «Run» показывает вкладку для всякой энергичной конфигурации запуска, а «Changes» отображает фиксированный комплект вкладок в зависимости от системы управления версиями, применяемой в плане.

Существует два основных сценария для применения окон инструментов в плагинах. В первом сценарии (применяется, скажем, в плагинах Ant и Commander) кнопка окна инструментов отображается неизменно, следственно пользователь может активировать и взаимодействовать с функциональностью плагина в всякое время. Во втором сценарии (применяется действием «Analyze Dependencies») окно инструментов создается для того, Дабы показать итоги определенной операции и может быть закрыто пользователем сразу позже заключения операции.

В первом сценарии окно регистрируется в файле plugin.xml, применяя точку растяжения <toolWindow>настроек. Признаки точки растяжения содержат данные, которые применяются для отображения кнопки toolwindow:

  • Признак «id» (непременный) — соответствует тексту, отображаемому на кнопке toolwindow;
  • Признак «anchor» (непременный) — задает сторону экрана, к которой привязывается окно инструментов («left», «right» либо «bottom»);
  • Логичный признак «secondary» (добровольный) — указывает, будет ли окно инструментов принадлежать вторичной группе;
  • «icon» (добровольный) — иконка, которая будет отображаться на кнопке (13 x 13 пикселей).

В дополнение к этому следует указать фабричный класс (в признаке «factoryClass»), реализующий интерфейсToolWindowFactory. Когда пользователь кликает на кнопке окна инструмента, вызывается способ createToolWindowContent() и инициализирует пользовательский интерфейс. Эта процедура гарантирует, что неиспользуемые окна инструментов не вызывают каких-либо убыточных затрат в применении памяти либо времени запуска: если пользователь не взаимодействует с toolwindow вашего плагина, то никакой код не будет загружен либо исполнен.

Если окно инструментов не требуется для всех типов планов, дозволено указать добровольный признак conditionClass, содержащий полное имя класса, реализующего интерфейс Condition (это может быть тот же класс, что реализует фабрику). Если способ value() возвращает «false», окно инструментов не будет отображаться. Обратите внимание, что условие вычисляется только один раз при загрузке плана. Если вы хотите показывать и скрывать окна инструментов динамически, во время работы с планом, вам необходимо применять 2-й сценарий регистрации окна инструментов.

Пример конфигурации

<extensions defaultExtensionNs="com.intellij">
     <toolWindow id="My Sample Tool Window" icon="/myPackage/icon.png" anchor="right" factoryClass="myPackage.MyToolWindowFactory" />
 </extensions>

2-й сценарий заключается в обыкновенном вызове способа ToolWindowManager.registerToolWindow() из кода плагина. Данный способ имеет несколько перегрузок, которые могут применяться в зависимости от ваших задач. Если вы используете перегрузку, которая принимает Swing-компонент, то он становится первой вкладкой, отображаемой в окне инструмента.

Отображение содержимого многих toolwindows требует приобретение доступа к индексам. В силу этого окна выключаются при построении индексов, но оно останется энергичным, если вы передадите «true» в качестве значения параметра canWorkInDumbMode функции registerToolWindow().

Как упоминалось ранее, окна инструментов могут содержать несколько вкладок. Для управлением содержимым окна, вы можете вызвать ToolWindow.getContentManager(). Дабы добавить вкладку («content»), нужно вначале сделать ее путем вызова ContentManager.getFactory().createContent(), а после этого добавить в окно инструментов, с поддержкой ContentManager.addContent().

Вы можете определить, разрешено ли пользователю закрывать вкладки, либо глобально, либо для всякой в отдельности. Последнее осуществляется путем определения параметра canCloseContents функции registerToolWindow(), либо указав canCloseContents="true" в файле plugin.xml. Даже если закрытие вкладок разрешено глобально, его дозволено отключить для определенной вкладки путем вызоваContent.setCloseable(false).

Диалоги

DialogWrapper — является базовым классом для всех модальных (и некоторых не модальных) диалоговых окон, применяющихся в плагине IntelliJ IDEA. Он предоставляет следующие вероятности:

  • Расположение кнопок (платформо-специфичный порядок кнопок «ОК/Отмена», Mac OS-специфичная кнопка «Справка»);
  • Контекстная поддержка;
  • Запоминание размера диалогового окна;
  • Валидация данных (и отображение сообщения об ошибке, если данные, введенные в диалоговом окне некорректные);
  • Сочетания клавиш: Esc для закрытия диалогового окна, влево/вправо для переключения между кнопками и Y/N для результатов «Да/нет» если они присутствуют в диалоговом окне;
  • Добровольный флажок «Do not ask again».

При применении класса DialogWrapper для собственного диалогового окна, нужно исполнить следующие действия:

  • Вызвать конструктор базового класса и передать план в рамках которого будет отображаться диалоговое окно либо родительский компонент для диалогового окна;
  • Вызвать способ init() из конструктора класса диалогового окна;
  • Вызвать способ setTitle(), Дабы задать заголовок для диалогового окна;
  • Реализовать способ createCenterPanel() для возврата компонента, отвечающего за основное оглавление диалогового окна;
  • Необязательно: Переопределите способ getPreferredFocusedComponent(), возвращающий компонент, тот, что окажется в фокусе, когда диалоговое окно отобразится;
  • Добавочно: Переопределите способ getDimensionServiceKey() для определения идентификатора, тот, что будет применяться для сохранения размера диалогового окна;
  • Добавочно: Переопределите способ getHelpId() для задания контекста справки, связанного с диалоговым окном.

Класс DialogWrapper Зачастую применяется коллективно с формами UI Designer. Для того Дабы связать форму и ваш класс, расширяющий DialogWrapper, привяжите корневую панель формы к полю и возвратите его из способа createCenterPanel().

Для отображения диалогового окна, вызовите способ show() и после этого используйте способ getExitCode() для проверки, как было закрыто диалоговое окно.

Для настройки кнопок, отображаемых в диалоговом окне (т.е. замены стандартного комплекта кнопок ОК/Отмена/Помощь), дозволено переопределить способы createActions() либо createLeftActions(). Оба этих способа возвращают массив объектов Swing Action. Если кнопка, которую вы добавляете закрывает диалоговое окно, дозволено применять DialogWrapperExitAction в качестве базового класса для действия.

Дабы проверить данные, введенные в диалоговом окне, дозволено переопределить способ doValidate(). Способ будет вызываться механически по таймеру. Если в реальное время введенные данные возможны, вам необходимо возвратить null. В отвратном случае, возвратите объект ValidationInfo, тот, что инкапсулирует сообщеmk!TreeClassChooserFactory. Его разные способы разрешают указать область поиска, Дабы ограничить выбор потомками определенного класса либо реализациями интерфейса, а также включить либо исключить внутренние классы из списка.

Для выбора пакета Java, дозволено применять класс PackageChooserDialog.

Компоненты редактора

По сопоставлению со Swing JTextArea, компонент редактора IntelliJ IDEA имеет массу превосходств — подсветка синтаксиса, автозавершение кода, сворачивание кода и многое другое. Редакторы в IntelliJ IDEA обыкновенно отображаются в виде вкладок редактора, но они могут быть внедрены в диалоговые окна либо окна инструментов. Это разрешает компонент EditorTextField.

При создании EditorTextField, дозволено указать следующие признаки:

  • Тип файла, согласно которому выполняется синтаксический обзор текста в поле;
  • Будет ли текстовое поле только для чтения;
  • Является ли текстовое поле однострочным либо многострочным.

Одним из распространенных вариантов применения для EditorTextField является редактирование имени Java-класса либо пакета. Это может быть достигнуто с поддержкой следующих шагов:

  • Используйте JavaCodeFragmentFactory.getInstance().createReferenceCodeFragment() для создания фрагмента кода, представляющего имя класса либо пакета;
  • Вызовите PsiDocumentManager.getInstance().getDocument() Дабы получить документ, соответствующий фрагменту кода;
  • Передайте полученный документ в конструктор EditorTextField либо его способ setDocument().

 

Списки и деревья

 

JBList и Tree

Каждый раз, когда вы планируете задействовать типовой Swing компонент JList, разглядите вероятность применения его альтернативы JBList, тот, что поддерживает следующие добавочные функции:

  • Отрисовка всплывающей подсказки, содержащей полный текст элемента, если он не помещается в поле по ширине;
  • Отрисовка серого текстового сообщение посередине списка, когда он не содержит элементов (текст дозволено настроить путем вызова getEmptyText().setText());
  • Отрисовка иконки «Занят» в правом верхнем углу списка, когда выполняется фоновая операция (включается вызовом setPaintBusy()).

Подобно JBList, существует класс com.intellij.ui.treeStructure.Tree предоставляющий собой замену для стандартного класса JTree. В дополнение к функциям JBList он поддерживает отрисовку в жанре Mac и авто-прокрутку для drag & drop.

ColoredListCellRenderer и ColoredTreeCellRenderer

Когда вам необходимо настроить представление элементов в поле со списком либо дереве, рекомендуется применять классы ColoredListCellRenderer либо ColoredTreeCellRenderer в качестве средства визуализации ячеек. Эти классы разрешают собирать представления из нескольких фрагментов текста с различными признаками (посредством вызова append()) и использовать добавочный значок для элемента (путем вызова setIcon()). Система визуализации механически берет на себя настройку положительного цвета текста для выбранных элементов и многие другие платформозависимые детали рендеринга.

ListSpeedSearch и TreeSpeedSearch

Для упрощения выбора элементов с поддержкой клавиатуры в списке либо дереве, к ним дозволено применить обработчик стремительного поиска. Это дозволено сделать простым вызовом new ListSpeedSeach(list) либоnew TreeSpeedSearch(tree). Если вам необходимо настроить текст, тот, что применяется для поиска элемента, дозволено переопределить способ getElementText(). Помимо того, дозволено передать функцию для реформирования элементов в строки (как elementTextDelegate в конструктор ListSpeedSearch либо как способ toString() в конструктор TreeSpeedSearch).

ToolbarDecorator

Крайне распространенная задача при разработке плагина — отображение списка

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB