Elementfabriker

Elementfabriker används till att återskapa arbetsmiljöns modellobjekt från data som sparats när arbetsmiljön stängdes.

Innan vi tar en närmare titt på elementfabriksutökningen måste vi granska en allmän teknisk som används i hela plattformen för att lägga till insticksmodulsspecifikt beteende till vanliga plattformsmodellobjekt.

IAdaptables och arbetsmiljöadaptrar

När du bläddrar i de olika arbetsmiljöklasserna kommer du att lägga märke till att många av arbetsmiljögränssnitten utökar gränssnittet IAdaptable.

Insticksmoduler använder adaptrar till att lägga till specifikt beteende till redan befintliga typer i systemet. Ett exempel: arbetsmiljön kanske vill att resurser ska svara på en etikett och en bild i visningssyfte. Vi vet att det inte är god design att lägga till UI-specifikt beteende på lågnivåobjekt, så hur kan vi lägga till detta beteende till resurstyperna?

Insticksmoduler kan registrera adaptrar som lägger till beteende till redan befintliga typer. Tillämpningskod kan sedan fråga ett objekt för en viss adapter. Om det finns en registrerat för den, kan tillämpningen erhålla adaptern och använda de nya beteenden som definierats i adaptern.

Genom att tillhandahålla en funktion som dynamiskt frågar en adapter om ett objekt kan vi förbättra flexibiliteten för systemet allt eftersom det utvecklas. Nya adaptrar kan registreras för plattformstyper genom nya insticksmoduler utan att de ursprungliga typernas definitioner behöver ändras. Mönstret som du ska fråga ett objekt för en viss adapter är som följer:

   //given an object o, we want to do "workbench" things with it.
   if (!(o instanceof IAdaptable)) {
      return null;
   }
   IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
   if (adapter == null)
      return null;
   // now I can treat o as an IWorkbenchAdapter
   ...

Om det inte finns någon adapter registrerad för det aktuella objektet, returneras null som adaptern. Klienter måste vara förberedda på att hantera detta. Det kan bli tillfällen när en förväntad adapter inte har registrerats.

Arbetsmiljön använder adaptrar till att erhålla UI-information från basplattformstyperna, t.ex. IResource. Adaptrar skärmar bastyperna från UI-specifik kunskap och gör det möjligt för arbetsmiljön att utveckla sina gränssnitt utan att ändra basens definitioner.

Utan adaptrar skulle alla klasser som kan skickas runt i arbetsytans API tvingas implementera UI-gränssnittet vilket skulle öka antalet klassdefinitioner, introducera en tajt koppling och skapa cirkulära beroenden mellan kärnan och UI-klasserna. Med adaptrar implementerar varje klass IAdaptable och använder adapterregistret till att tillåta insticksmoduler utöka bastypernas beteende.

Genom hela arbetsmiljökoden ser du fall där en plattforms kärntyp frågas om en adapter. Frågan används till att erhålla ett objekt som vet hur det ska svara med UI-orienterad information om typen.

Elementfabriker

När användaren stänger av arbetsmiljön måste den spara det aktuella läget för detIAdaptable-objekt som visas i arbetsmiljön. Ett objekts läge lagras genom att objektets primitiva dataparametrar sparas i ett specialformat, ett IMemento. ID:R ID:t för en fabrik som kan återskapa objektet från ett IMemento lagras också och data sparas i filsystemet.

När plattformen startas om söker arbetsmiljön upp den elementfabrik som är associerad till IMemento:s fabriks-id. Den söker upp fabriken genom att kontrollera insticksmodulens register för bidrag till org.eclipse.ui.elementFactories-utökningen.

Koden är ganska enkel. Vi behöver bara ange id:t för fabriken och den motsvarande klass som implementerar fabriken.

Följande kodstycke kommer från plugin.xml för arbetsmiljön.

<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>