Az elemgyárak az adatokból újból létrehozzák a munkaterület modell objektumokat, amelyek a munkaterület leállítása során mentésre kerültek.
Mielőtt közelebbről megnéznénk az elemgyár-kiterjesztést, át kell tekintenünk egy általános technikát, amelyet a platform használ a bedolgozó-specifikus viselkedés általános platform modell objektumokhoz adásához.
A különböző munkaterület-osztályok böngészésekor észreveheti, hogy a munkaterület-felületek nagy része kiterjeszti az IAdaptable felületet.
A bedolgozók adapterek segítségével adnak hozzá specifikus jellemzőt a rendszer már meglévő típusaihoz. A munkaterület például megkövetelheti, hogy megjelenítés céljából az erőforrások egy címkét és képet adjanak válaszul. Tudjuk, hogy ez nem jó kialakítás az UI specifikus viselkedés alacsony szintű objektumokhoz adásához, de hogyan adhatjuk hozzá ezt a viselkedést az erőforrástípusokhoz?
A bedolgozók bejegyezhetik az adaptereket, amelyek jellemzőt adhatnak a már meglévő típusokhoz. Az alkalmazáskód ezután lekérdezhet egy objektumot egy adott adapterhez. Ha csak egy van bejegyezve, akkor az alkalmazás megszerezheti az adaptert, és használhatja az adapterben megadott új viselkedéseket.
Azáltal, hogy az adapter dinamikusan lekérdezhető egy objektumhoz, javítható a rendszer rugalmassága. Az új bedolgozók adaptereket jegyezhetnek be a platformtípusokhoz az eredeti típusok definícióinak megváltoztatása nélkül. Az objektum adott adapterhez lekérésnek mintája az alábbi módon néz ki:
//az adott o objektummal "munkaterület" feladatokat kívánunk végrehajtani. if (!(o instanceof IAdaptable)) { return null; } IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class); if (adapter == null) return null; // az o ezután kezelhető IWorkbenchAdapter elemként ...
Ha nincs adapter bejegyezve a kezelt objektumhoz, akkor üres érték kerül visszaadásra adapterként. Az ügyfeleket fel kell készíteni ezen eset kezelésére. Előfordulhat, hogy a várt adapter még nem kerül bejegyzésre.
A munkaterület adaptereket használ az UI információk alap platformtípusokról lekéréséhez, mint például az IResource. Az adapterek megvédik az alaptípusokat az UI-specifikus ismerettől, és lehetővé teszik, hogy a munkaterület az alap definícióinak módosítása nélkül alakítson ki felületeket.
Adapterek nélkül a munkaterület API-n átadott osztályoknak meg kellene valósítaniuk az UI felületeket, ami nagyon megnövelné az osztálymeghatározásokat, szigorú csatolást vezetne be, és körkörös függéseket jelentene az alap és az UI osztályok között. Az adapterekkel minden osztály megvalósítja az IAdaptable elemet és az adapternyilvántartást segítségével lehetővé teszi, hogy a bedolgozók kiterjesszék az alaptípusok viselkedését.
A munkaterületkódban olyan esetek láthatók, amelyben a platform központi típus lekérésre kerül egy adapterhez. A lekérdezés lekér egy objektumot, amely tudja, hogy hogyan kell válaszolni a típusokkal kapcsolatos UI orientált információkra.
Ha a felhasználó leállítja a munkaterületet, akkor el kell mentenie a munkaterületen megjelenő IAdaptable objektumok aktuális állapotát. Egy objektum állapota a speciális formátumú objektum - az IMemento - primitív adatparamétereinek mentésével kerül tárolásra. A gyár azonosítója, amely újból létrehozhatja az objektumot egy IMemento elemből, szintén tárolásra kerül és az adatok a fájlrendszerben mentésre kerülnek.
A platform újraindításakor a munkaterület megkeresi az IMemento's gyárazonosítóhoz rendelt elemgyárat. Megkeresi a gyárat az org.eclipse.ui.elementFactories kiterjesztés közreadás bedolgozónyilvántartásának végignézésével.
A leírónyelv meglehetősen egyszerű. Meg kell adni a gyár azonosítóját és a gyárat megvalósító megfelelő osztályt.
Az alábbi kódrészlet a munkaterület plugin.xml fájlból származik.
<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>