Elementfactory's

Elementfactory's worden gebruikt voor het opnieuw maken van workbenchmodelobjecten op basis van gegevens die tijdens het afsluiten van de workbench zijn opgeslagen.

Voordat de elementfactory-extensie wordt uitgelegd, moet u bekend zijn met een algemene techniek die in het platform wordt gebruikt voor het toevoegen van pluginspecifieke gedragspatronen aan gemeenschappelijke modelobjecten van het platform.

IAdaptables en workbenchadapters

Als u door de workbenchklassen bladert, zult u merken dat er veel workbenchinterfaces zijn die de interface IAdaptable uitbreiden.

Plugins gebruiken adapters voor het toevoegen van specifieke gedragspatronen aan bestaande typen in het systeem. De workbench kan resources bijvoorbeeld om een label en een afbeelding vragen voor weergavedoeleinden. Omdat het geen geen goed idee is gebruikersinterfacespecifieke gedragspatronen toe te voegen aan low-level objecten, moeten we een andere manier bedenken.

Plugins kunnen adapters registreren voor het toevoegen van gedragspatronen aan bestaande typen. Met toepassingscode kan dan een query worden uitgevoerd op een object voor een bepaalde adapter. Als er een adapter is geregistreerd voor het object, kan de adapter door de toepassing worden opgehaald en kunnen de nieuwe gedragspatronen worden gebruikt die in de adapter zijn gedefinieerd.

Als een query dynamisch kan worden uitgevoerd op een adapter voor een object, kan de flexibiliteit van het systeem worden verbeterd. Nieuwe adapters kunnen door nieuwe plugins worden geregistreerd voor platformtypen zonder dat de definities van de oorspronkelijke typen hoeven te worden gewijzigd. Het patroon voor het ophalen van een bepaalde adapter uit een object is als volgt:

   // Op het object o willen we "workbench"-taken uitvoeren.
   if (!(o instanceof IAdaptable)) {
     return null;
   }
   IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
   if (adapter == null)
     return null;
   // Nu kan o als IWorkbenchAdapter worden behandeld.
   ...

Als voor het object geen adapter is geregistreerd, is de adapter null. Clients moeten zijn deze situaties kunnen afhandelen. Het kan voorkomen dat een verwachte adapter niet is geregistreerd.

De workbench gebruikt adapters om gebruikersinterfacegegevens op te halen uit de basisplatformtypen, zoals IResource. De basistypen worden door de adapters afgeschermd van gebruikersinterfacespecifieke gegevens en de workbench kan de interfaces blijven ontwikkelen zonder de definities van de basis te wijzigen.

Zonder adapters zouden gebruikersinterfaces moeten worden geïmplementeerd door in de workbench-API doorgegeven klassen, wat zou leiden tot meer klassendefinities, expliciete verwijzingen en kringverwijzingen tussen de core- en gebruikersinterfaceklassen. Met adapters implementeert elke klasse IAdaptable en wordt het adapterregister gebruikt, zodat plugins het gedrag van de basistypen kunnen uitbreiden.

In de workbenchode zult u kunnen zien hoe de adapter van een core-type van het platform wordt opgevraagd. De query wordt gebruikt om een object op te halen waarmee gebruikersinterfacegegevens over het type kunnen worden opgevraagd.

Elementfactory's

Zodra de workbench wordt afgesloten door de gebruiker, moet de status worden opgeslagen van de IAdaptable-objecten die in de workbench worden afgebeeld. De elementgegevensparameters van het object worden opgeslagen in een speciale indeling (IMemento). Het ID van een factory waarmee het object opnieuw kan worden gemaakt op basis van een IMemento wordt ook opgeslagen en de gegevens worden opgeslagen in het bestandssysteem.

Zodra het platform opnieuw wordt gestart, wordt door de workbench de elementfactory opgezocht die aan het factory-ID van IMemento is gekoppeld. Daartoe wordt in het pluginregister gezocht naar aanleveringen voor de extensie org.eclipse.ui.elementFactories.

De markup is erg eenvoudig. U hoeft alleen het ID op te geven van de factory en de bijbehorende klassen waarmee de factory wordt geïmplementeerd.

Het volgende fragment komt uit het bestand plugin.xml van de workbench:

    <extension 
         point="org.eclipse.ui.elementFactories">
      <factory
            class="org.eclipse.ui.internal.model.ResourceFactory"
            id="org.eclipse.ui.internal.model.ResourceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.model.WorkspaceFactory"
            id="org.eclipse.ui.internal.model.WorkspaceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.part.FileEditorInputFactory"
            id="org.eclipse.ui.part.FileEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
            id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.WorkingSetFactory"
            id="org.eclipse.ui.internal.WorkingSetFactory">
      </factory>
    </extension>