Dynamiska insticksprogram gör det möjligt att infoga och ta bort insticksprogram i en Eclipse-förekomst som är igång. En Dynamiska insticksprogram är återanvändningsbara komponenter som kan tas bort och kan på ett enkelt sätt hjälpa dig spåra inkommande och borttagna insticksprogram.
Ett dynamiskt insticksprogram kanske inte varar hela tillämpningens livslängd vilket gör det mycket viktigt att se till att allt rensas upp när komponenten tas bort. När lyssnare ansluts till arbetsmiljön och objekt registreras, förblir de kvar efter avstängning vilket innebär att dessa insticksprogram måste vara medvetna om att de måste städa upp.
Antagandet att det vid uppstart sker en genomläsning av alla implementationer av utökningspunkten är tillräcklig för hela tillämpningens livslängd är fel eftersom detta inte fungerar. Du måste se till att antingen lyssnaren ansluts eller att inget någonsin cachas så att det lyssnas efter registerändringar. Det är viktigt att förstå att objekt i arbetsmiljön inte nödvändigtvis är statiska utan istället är transienta och kan försvinna när som helst. Om du skriver ett insticksprogram för en viss vy måste du först se till att vyn fortfarande finns där.
Som utvecklare av insticksprogram måste du se till att alla utökningar du använder tillåts komma och försvinna när som helst. När de försvinner bör du bekräfta deras försvinnande genom att rensa upp alla interna strukturer som de kan betecknar och ta bort alla UI-testobjektsamlingar som de möjligen driver. När de uppträder ska du förstärka dina interna strukturer och möjligen även skapa nya UI-testobjektsamlingar. Anta att tillämpningen läser från registret och har en utökning, då skapar du en post för den och tilldelar den dess plats. När den slutförs får du ett meddelande om att en upprensnings krävs. Dessutom annonserar en lyssnare när nya objekt kommer in och skapar dem.
Org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker och tillhörande gränssnitt tillhandahåller en mekanism med vilken utvecklare av insticksprogram enkelt kan spåra inkommande och avgående utökningar och hantera de resurser som genereras av sådana åtgärder.
I följande exempel antar vi att du har en utökningspunkt i ditt insticksprogram som anropar kontroller och att du använder IExtensionTracker. Internt har du WidgetDescriptors som kapslar in kontrollutökningar och ett WidgetRegistry som hanterar dem.
public class WidgetRegistry implements IExtensionChangeHandler { public WidgetRegistry() { IExtensionTracker tracker = PlatformUI.getWorkbench() .getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("my.plugin.namespace", "widget");
IExtension[] extensions = point.getExtensions();
// initial population
for (int i = 0; i < extensions.length; i++) { addExtension(tracker, extensions[i]);
} tracker
.registerHandler(this, tracker
.createExtensionPointFilter(point)); } public void addExtension(IExtensionTracker tracker, IExtension extension){ WidgetDescriptor descriptor = new WidgetDescriptor(extension); tracker.registerObject(extension, descriptor,
IExtensionTracker.REF_STRONG); addToInternalStructure(descriptor) } private void addToInternalStructure(WidgetDescriptor descriptor) { // registry specific logic } public void removeExtension(IExtension extension, Object[] objects) { for (int i = 0; i < objects.length; i++) { WidgetDescriptor descriptor = (WidgetDescriptor) objects[i];
removeFromInternalStructure(descriptor);
}
} private void removeFromInternalStructure(WidgetDescriptor descriptor) { // registry specific logic }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }
I det här exemplet på plattformsanvändargränssnitt tillhandahåller IExtensionTracker förekomster på olika nivåer av arbetsmiljön. Om du spårar objekt som lever hela arbetsmiljöns livslängd ska du använda den spårningsfunktion som tillhandahålls av IWorkbench.getExtensionTracker(). Om dina objekt är relevanta för vissa arbetsmiljöfönster eller -sidor kan du använda de spårningsfunktioner som tillhandahålls av IWorkbenchWindow.getExtensionTracker() eller IWorkbenchPage.getExtensionTracker(). Ett exempel: arbetsmiljön spårar vybeskrivningar på arbetsmiljönivå, men spårar faktiska vyförekomster på sidnivå i arbetsmiljön. Dina hanterare kan vara registrerade mot särskilda utökningspunkter genom att tillhandahålla en IFilter-förekomst till IExtensionTracker.registerHandler(). Din hanterare anropas bara när utökningar som matchar IFilter-objektet läggs till eller tas bort.
När en utökning kommer in i körtiden anropas denna metod. Din hanterare har sedan möjlighet att införliva den nya utökningen i sin associerade modell. Alla objekt som skapas baserad den IExtension som tillhandahålls till detta gränssnitt ska registreras mot spårningsfunktionen via IExtensionTracker.registerObject(). När en utökning lämnar körtiden anropas denna metod. Alla objekt som tidigare registrerat mot denna utökning skickas som argument. Din hanterare kan sedan rensa upp och ta bort alla objekt om det behövs. Det är god ses att avregistrera hanterare så att registren inte läcker.