Interfejsy serwisu

Argumenty konstruktora części nazywamy zależnościami. Zastępują one różne adaptery i metody pobierające. Na przykład dostęp do interfejsu IActionBars serwisu dla części opartej na komponentach uzyskuje się przez podanie instancji interfejsu IActionBars w wywołaniu konstruktora części.

Serwisy korzystające z nowych stylów udostępniają otwarty zbiór interfejsów. Dowolny moduł dodatkowy może powiększać zbiór interfejsów serwisu przy użyciu punktu rozszerzenia org.eclipse.core.component.types. Pomimo możliwości rozszerzenia zbioru interfejsów serwisu, wszystkie serwisy obsługują ten sam zbiór, dzięki czemu możliwe jest używanie każdej części w każdym serwisie. Pełny zbiór interfejsów serwisu można wyświetlić w widoku rejestru modułu dodatkowego PDE.

W środowisku roboczym są dostępne następujące interfejsy serwisu:

Interfejs
Opis
IErrorContext
Tworzy komunikaty interfejsu IStatus i zapisuje je w protokole modułu dodatkowego.
Bundle
Pakunek modułów dodatkowych zawierający implementację części. Automatycznie informuje inne komponenty, takie jak implementację interfejsu IErrorContext, o ich modułach dodatkowych.
IContainer
Kontener serwisu. Ten obiekt obsługuje zapytania dotyczące innych interfejsów serwisów. Jest to przydatne, gdy część musi przekierowywać lub multipleksować wszystkie dane ze swojego serwisu do jego elementów potomnych.
INameable
Umożliwia części ustawienie jej nazwy, ikony, tekstu podpowiedzi i opisu treści. Zastępuje metody pobierające i funkcje nasłuchiwania związane z interfejsem IWorkbenchPart.
Composite
Nadrzędny element złożony części. Ten element nie jest współużytkowany z żadnymi innymi częściami. Jest on utylizowany razem z częścią. Część może ustawiać układ tego elementu i przyłączać do niego funkcje nasłuchiwania.
ISecondaryId
Interfejs, który użyty jako widok wielu instancji, zwraca drugorzędny identyfikator części.
ResourceManager
Przydziela i zwalnia w bezpieczny sposób obrazy, czcionki, kolory i inne zasoby pakietu SWT. Zapewnia, że części współużytkują identyczne zasoby, a wszelkie przecieki pamięci są naprawiane przy zamykaniu części.
IDirtyHandler
Pozwala części ustawić lub wyzerować swoje informacje o zmianach.
IMessageDialogs
Wyświetla na ekranie okna dialogowe z błędami, ostrzeżeniami i informacjami.
IActionBars
Służy do wykonywania tych samych zadań, co metoda getViewSite().getActionBars() interfejsu API platformy Eclipse 3.0.
IMultiplexer
Udostępnia komponent multipleksowany z dostępem do jego multipleksera i wszelkich współużytkowanych interfejsów.
.
ISavedState
Przechowuje stan części określający, czy część była wcześniej trwała.
IPartFactory
Pozwala części tworzyć zagnieżdżone widoki i edytory.
IPartDescriptor
Przechowuje metainformacje o części, takie jak identyfikator, tytuł, domyślny obraz itd.
IEditorInput
Przechowuje dane wejściowe edytora. Wskazuje widokom puste dane wejściowe edytora.
ISelectionHandler
Obsługuje zmiany wyboru. Części mogą używać tego pola do zmieniania wyboru, jaki udostępniają środowisku roboczemu.

Do kontekstu zawierającego daną część należy określenie, czy część otrzyma unikalną instancję dla każdego interfejsu lub obiektu współużytkowanych przez wiele części. Konstruktor części nigdy nie otrzymuje argumentu o wartości NULL.

 

Używanie nowych interfejsów serwisu z istniejącymi częściami

Wstawianie konstruktorów jest wygodne, ale przepisywanie istniejących edytorów i widoków tak, aby korzystały z możliwości nowych interfejsów serwisu byłoby bardzo niepraktyczne. Dlatego wszystkie nowe interfejsy są dostępne dla istniejących widoków także jako adaptery interfejsu IWorkbenchPartSite.

Poniżej przedstawiono widok z pojedynczym przyciskiem otwierającym okno dialogowe komunikatu.

Obraz klasy DependenciesViewOld

Poniższy przykład zawiera kod źródłowy widoku korzystającego z nowego stylu, który otwiera okno dialogowe za pomocą nowego interfejsu IMessageDialogs.

/**
 * Prezentacja użycia zależności komponentów w częściach korzystających z nowego stylu.
 *
 * @since 3.1
 */
public class DependenciesViewNew {
    // Zależności
    private IMessageDialogs dialogs;
   
    /**
     * Konstruktor komponentu. Nie należy wywoływać bezpośrednio.
     */
    public DependenciesViewNew(Composite parent, IMessageDialogs dialogs) {
        this.dialogs = dialogs;
       
        Button testButton = new Button(parent, SWT.PUSH);
        testButton.setText("Otwórz okno dialogowe");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (nie należy do dokumentacji Javadoc)
         * @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, "To jest komunikat");
    }
}

Ten przykład zawiera tradycyjny widok, który otwiera okno dialogowe przy użyciu interfejsu IMessageDialogs i przedstawia fakt, że jest to wykonalne także za pomocą tradycyjnych części środowiska roboczego. Wiersze wyróżnione czerwoną czcionką zawierają inicjalizację interfejsu IMessageDialogs i pokazują sposób korzystania z niego.

/**
 * Prezentacja użycia zależności komponentów w częściach korzystających ze starego stylu.
 *
 * @since 3.1
 */
public class DependenciesViewOld extends ViewPart {
    // Zależności
    private IMessageDialogs dialogs;
    
    // Główny widget
    private Composite parent;
    
    /* (nie należy do dokumentacji Javadoc)
     * @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("Otwórz okno dialogowe");
        testButton.addSelectionListener(new SelectionAdapter() {
        /* (nie należy do dokumentacji Javadoc)
         * @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, "To jest komunikat");
        }
    }

    /* (nie należy do dokumentacji Javadoc)
     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
     */
    public void setFocus() {
        parent.setFocus();
    }
}