Implementace komponenty

Komponenty registrované bodem rozšíření typu jsou obdobou komponent části. Ve svém konstruktoru mohou mít sadu závislostí a musejí implementovat rozhraní, pro které byly registrovány. Tento příklad předvádí implementaci NullNameableService.

/**
 * Výchozí implementace služby Nameable. Všechny metody jsou prázdnou implementací (no-op).
 *
 * @od 3.1
 */
public class NullNameableService implements INameable {

    /**
     * Konstruktor komponenty. Nespouštějte přímo.
     */
    public NullNameableService() {}

    public void setName(String newName) {}
    public void setContentDescription(String contentDescription) {}
    public void setImage(ImageDescriptor theImage) {}
    public void setTooltip(String toolTip) {}
}

Toto lze chápat jako jednoduchý příklad, protože třída nedělá naprosto nic jiného, než že představuje obecný vzorek. Služba INameable se používá k informování nadřazeného prvku o změnách stavu podřízeného prvku. Výchozí implementace kombinovaná s rozhraním tohoto typu v typickém případě nedělá vůbec nic. Význam to však má: pokud se nadřazený prvek nestará o stav svých podřízených prvků, může být ignorován. Podle zavedené konvence používáme předponu "Null" kvůli signalizaci, že jde o komponentu, která nedělá vůbec nic. Tento typ objektu je obvykle registruje jako jedináčka, protože by vytváření většího počtu instancí tohoto triviálního objektu bylo plýtváním prostředků. Klienti by měli zajistit, aby veškerá nová rozhraní poskytující informaci o stavu podporovala multiplexování.

Je-li účelem rozhraní přidělení prostředků nebo vytvoření výstupu, výchozí implementace v typickém případě provádí něco užitečnějšího. Následující příklad předvádí implementaci třídy DefaultMessageDialogs. Tato třída je určena k vytváření interaktivního výstupu, a proto má užitečnou výchozí implementaci, a neměla by nepodporovat multiplexování. Tato třída potřebuje přistupovat ke kompozitnímu prvku části, a proto nemůže být jedináčkem. Podle zavedené konvence používáme předponu "Default" jako signalizaci, že jde o výchozí komponentu s užitečným chováním.

/**
 * Výchozí implementace rozhraní IMessageDialogs. Obslužný prvek části
 * přijímá jako kontext a umožňuje části otevírat dialogová okna v podřízené nadstavbě.
 *
 * @od 3.1
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * Konstruktor komponenty. Nespouštějte přímo.
     */
    public DefaultMessageDialogs(Composite control) {
        this.control = control;
    }
   
    public void open(IStatus message) {
        if (message.getSeverity() == IStatus.ERROR) {
            ErrorDialog.openError(control.getShell(), null, null, message);
        } else {
            open(message.getSeverity(), message.getMessage());
        }
    }

    public void openError(String message, Throwable cause) {
        open(new Status(IStatus.ERROR,
                WorkbenchPlugin.getDefault().getBundle().getSymbolicName(),
                IStatus.OK,
                message,
                cause));
    }
   
    public void open(int severity, String message) {
        if (severity == IStatus.ERROR) {
            MessageDialog.openError(control.getShell(), null, message);
        } else if (severity == IStatus.WARNING) {
            MessageDialog.openWarning(control.getShell(), null, message);
        } else {
            MessageDialog.openInformation(control.getShell(), null, message);
        }   
    }
}

Zde je přidružený markup bodu rozšíření pro DefaultMessageDialog.

<extension point="org.eclipse.core.component.types">
      <component
            initializer="org.eclipse.ui.part.SiteInitializer"
            interface="org.eclipse.ui.part.services.IMessageDialogs"
            implementation="org.eclipse.ui.internal.part.services.DefaultMessageDialogs"
            singleton="false"/>
</extension>