Din insticksmodul kan använda dekoreringsfunktioner till att kommentera bilderna för resurser och andra objekt som visas i arbetsmiljöns vyer. Dekoreringsfunktionerna är användbara när dina insticksmoduler lägger till funktioner för befintliga resurstyper. Många av arbetsmiljöns standardvyer deltar i att visa dekorationer.
Ett exempel: PDE bidrar med dekoreringsfunktioner som gör det möjligt för dig att urskilja mellan binära projekt och källprojekt.
Projektet com.example.helloworld är det enda källprojekt som visas i navigatorn. Lägg märke till hur alla andra binära projekt visas den binära dekoreringsfunktionen längst upp till vänster om Java-projektikonen. Den här dekoreringsfunktionen bidras med av PDE genom utökningspunkten org.eclipse.ui.decorators.
<extension point="org.eclipse.ui.decorators"> <decorator lightweight="true" quadrant="TOP_LEFT" adaptable="true" label="%decorator.label" icon="icons/full/ovr16/binary_co.png" state="false" id="org.eclipse.pde.ui.binaryProjectDecorator"> <description> %decorator.desc </description> <enablement> ... </enablement> </decorator> </extension>
Det finns flera olika sätt att tillhandahålla en implementation av en dekoreringsfunktion. Denna kod använder det enklaste sättet, känt som en deklarativ lättviktig dekoreringsfunktion. När en deklarativ lättviktig dekoreringsfunktion definieras innehåller koden en fullständig beskrivning av dekoreringsfunktionen ikon, placering och aktiveringsvillkor. Deklarativa dekoreringsfunktioner är användbara när bara en ikon används för dekorering av etiketten. Insticksmodulen behöver bara anger den kvadrant där dekoreringsfunktionen ska läggas över för den vanliga ikonen och ikonen för överläggningen. Som visat i bilden läggs den binära PDE-ikonen över i den översta vänstra kvadraten i paketikonen.
Om din insticksmodul behöver manipulera etikettexten förutom ikonen, eller om typen av ikon fastställs dynamiskt, kan du använda en icke deklarativ lättviktig dekoreringsfunktion. I det här fallet måste en implementationsklass som implementerar ILightweightLabelDecorator definieras. Den angivna klassen ansvarar för att tillhandahålla ett prefix, suffix och överläggsbild vid runtime som sedan tillämpas på etiketten. Mekaniken för sammanfogning av prefixet och suffixet med etikettexten och utförande av överläggningen, hanteras av arbetsmiljökoden i en bakgrundstråd. Därför måste allt arbete som utförs av insticksmodulen i sin ILightweightLabelDecorator-implementation vara UI-trådsäker. (Mer information finns i Köra kod från en tråd som inte är en användargränssnittstråd.)
Följande kod visar hur CVS-klienten definierar sin dekoreringsfunktion med hjälp av denna teknik:
<extension point="org.eclipse.ui.decorators"> <decorator objectClass="org.eclipse.core.resources.IResource" adaptable="true" label="%DecoratorStandard.name" state="false" lightweight= "true" quadrant = "BOTTOM_RIGHT" class="org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator" id="org.eclipse.team.cvs.ui.decorator"> <description> %DecoratorStandard.desc </description> </decorator> </extension>
Dekoreringsfunktioner styrs i slutänden av användarens via inställningssidan Etikettdekorationer i arbetsmiljön. Enskilda dekoreringsfunktioner kan aktiveras och avaktiveras. Trots detta är det en bra idé att utforma dina dekoreringsfunktioner så att de inte överlappar eller hamnar i konflikt med befintliga dekoreringsfunktioner i plattforms-SDK. Om flera insticksmoduler bidrar med lättviktiga dekoreringsfunktioner i samma kvadrant löses konflikterna på ett icke deterministiskt sätt.
Din insticksmodul kan också hantera all bild- och etiketthantering själv. I så fall ska det lättviktiga attributet anges till false och class-attributet namnge en klass som implementerar ILabelDecorator. Med den här klassen kan du dekorera den ursprungliga etikettens bild och text med dina egna anteckningar. Det ger dig ökad flexibilitet eftersom du inte begränsas till prefix, suffix och enkla kvadrantöverlägg.
Andra attribut för en dekoreringsfunktion är beroende av det aktuella implementationsformatet. Attributen label och description anger den text som användas till att namnge och beskriva dekoreringsfunktionen i inställningsdialogrutan. objectClass namnger klassen med objekt som dekoreringsfunktionen ska tillämpas för. Med attributet enablement kan du beskriva de villkor under vilka objektet ska dekoreras. Flaggan adaptable anger huruvida även objekt som uppfyller IResource ska dekoreras. Flaggan state styr huruvida dekoreringsfunktionen visas som standard.
Om dekoreringsfunktionerna innehåller information som är dyr att beräkna eller potentiellt distraherande, kan du bidra med egna inställningar som ger användaren möjlighet att finjustera dekoreringsfunktionen ytterligare när den är på. Den här tekniken används av CVS-klienten.
Uppdateringscykel för dekoreringsfunktion
Dekoreringen initieras av uppdatering av etikettproviders som tillhandahåller dekorering med DecoratorManager. Eftersom dekoreringsbearbetningen utförs i bakgrunden blir det en period mellan det att etikett begärs och att labelProviderChanged-händelsen startas, som tas upp av dekoreringsberäkningen. Under denna tid beräknas dekoreringen av ett objekt bara en gång av effektivitetsorsaker. Om dekoreringsfunktionen ändras under denna tid är det möjligt att ett gammalt resultat sänds ut eftersom den andra och efterföljande anrop att dekorera ett element då ignoreras.
Dekoreringsbidragare ska undvika att ändra sina dekoreringsfunktioner under tiden som dekorering pågår. Om detta inte är möjligt krävs ytterligare ett anrop att dekorera ett element efter det pågående labelProviderChanged.