Интерфейсы сайта

Аргументы конструктора компонента называются зависимостями. Зависимости заменяют различные адаптеры и методы get. Например, для получения доступа к IActionBars сайта конструктору компонента необходим экземпляр IActionBars.

Современные сайты предоставляют расширяемый набор интерфейсов. Любой модуль может расширить набор интерфейсов сайтов с помощью точки расширения org.eclipse.core.component.types. Несмотря на возможность расширения, все сайты поддерживают один и тот же набор, поскольку такой подход позволяет добавить компонент в любой сайт. При необходимости вы можете просмотреть полный набор интерфейсов сайта с помощью панели реестра модуля PDE.

Рабочая среда предоставляет следующие интерфейсы сайта:

Интерфейс
Описание
IErrorContext
Создает сообщения IStatus и заносит их в протокол модуля.
Bundle
Комплект, содержащий реализацию компонента. Он предоставляет другим компонентам, таким как реализация IErrorContext, информацию о связанных модулях.
IContainer
Контейнер сайта. Он предоставляет сведения о других интерфейсах сайта. Это может потребоваться, если компоненту необходимо перенаправить все данные, поступающие от сайта, дочерним элементам.
INameable
Позволяет компоненту указать собственное имя, значок, всплывающую подсказку и описание информационного наполнения. Заменяет различные методы получения, а также получатели запросов IWorkbenchPart.
Composite
Родительский объект компонента. Он не связан с другими компонентами и очищается вместе с компонентом. Компонент может задать макет этого объекта, а также указать для него обработчиков событий.
ISecondaryId
Интерфейс, возвращающий вторичный ИД компонента, если применяется панель с несколькими экземплярами.
ResourceManager
Безопасно выделяет и освобождает изображения, шрифты, цвета и другие ресурсы SWT. Обеспечивает совестное применение компонентами одинаковых ресурсов, а также очистку утечек при закрытии компонента.
IDirtyHandler
Позволяет компоненту задать или сбросить черновое состояние.
IMessageDialogs
Отображает пользователю сообщения об ошибках, предупреждения и информационные окна диалога.
IActionBars
Аналогичен getViewSite().getActionBars() в API Eclipse 3.0.
IMultiplexer
Предоставляет компонент, поддерживающий одновременную передачу, с доступом к мультиплексору, а также общим интерфейсам
.
ISavedState
Содержит предыдущее постоянное состояние компонента.
IPartFactory
Позволяет компоненту создавать вложенные панели и редакторы.
IPartDescriptor
Содержит мета-информацию о компоненте, такую как ИД, название, изображение по умолчанию и т.д.
IEditorInput
Содержит ввод редактора. Указывает на пустой ввод редактора для панелей.
ISelectionHandler
Обрабатывает изменения выбранных элементов. С помощью этого интерфейса компонент может изменить список выбранных элементов, предоставляемый рабочей среде.

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

 

Применение новых интерфейсов сайта с существующими компонентами

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

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

DependenciesViewOld

В следующем примере приведен исходный код панели, открывающей окно диалога с помощью нового интерфейса IMessageDialogs.

/**
 * Показано, каким образом зависимости применяются в новом компоненте.
 *
 * @since 3.1
 */
public class DependenciesViewNew {
    // Зависимости
    private IMessageDialogs dialogs;
   
    /**
     * Конструктор компонента. Не следует вызывать непосредственно.
     */
    public DependenciesViewNew(Composite parent, IMessageDialogs dialogs) {
        this.dialogs = dialogs;
       
        Button testButton = new Button(parent, SWT.PUSH);
        testButton.setText("Open a dialog");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (не документация по Java)
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        public void widgetSelected(SelectionEvent e) {
            openADialog();
        }
        });
    }
   
    private void openADialog() {
        dialogs.open(IStatus.INFO, "This is a message");
    }
}

В следующем примере рассмотрена стандартная панель, открывающая окно диалога с помощью IMessageDialogs. Показано, каким образом это можно сделать с помощью обычного компонента рабочей среды. Красным цветом выделены строки, соответствующие инициализации и применению интерфейса IMessageDialogs.

/**
 * Показано, каким образом зависимости компонента применяются в старой панели
 *
 * @since 3.1
 */
public class DependenciesViewOld extends ViewPart {
    // Зависимости
    private IMessageDialogs dialogs;
    
    // Основной виджет
    private Composite parent;
    
    /* (не документация по Java)
     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        this.parent = parent;
        this.dialogs = (IMessageDialogs)getSite().getAdapter(IMessageDialogs.class);
        
        Button testButton = new Button(parent, SWT.PUSH);
        testButton.setText("Open a dialog");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (не документация по Java)
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        public void widgetSelected(SelectionEvent e) {
            openADialog();
        }
        });
    }
    
    private void openADialog() {
        if (dialogs != null) {
            dialogs.open(IStatus.INFO, "This is a message");
        }
    }

    /* (не документация по Java)
     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
     */
    public void setFocus() {
        parent.setFocus();
    }
}