I paketet org.eclipse.core.runtime.preferences finns infrastrukturen för lagring av inställningarna för ett insticksprogram. Inställningarna avbildas vanligtvis till inställningar som styrs av användaren på sidan Inställningar, men det är ingenting som krävs för den underliggande infrastrukturen. Inställningar för insticksprogram är nyckel-/värdepar, där nyckeln beskriver inställningens namn, och värdet är något av ett antal olika typer (boolean, double, float, int, long, eller string). Inställningarna kan lagras och hämtas från filsystemet av plattformen. Den exakta placeringen av de sparade inställningarna beror på inställningens omfång.
Du kan föreställa den övergripande lagringen av inställningar som en hierarki av noder där varje huvudgren av hierarkin motsvarar ett visst omfång. Vilka objekt som är direkt underordnade till en viss nod beror på hur omfånget är definierat. För förekomst- och konfigurationsomfång är de direkt underordnade noderna de inställningar för ett visst insticksprogram enligt namnled, som vanligen är insticksprogrammets ID.
Oroa dig inte om allt det här verkar förvirrande. Om du inte bryr dig om omfång och noder behöver du inte bekymra dig om något bestämt omfång eller om vilken nod av trädet som faktiskt innehåller ditt inställningsvärde. Inställnings-APIt bläddrar automatiskt igenom noderna i rätt ordning (förekomst, konfiguration, standard) när du ställer en fråga om ett inställningsvärde. Det använder sedan det angivna namnledet och inställningsnamnet till att hitta den nod som faktiskt innehåller värdet.
Du accessar inställningar med hjälp av protokollet IPreferencesService. Plattformens standardtjänst för inställningar kan accessas med klassen Platform.
... IPreferencesService service = Platform.getPreferencesService(); ...
När du har hämtat inställningstjänsten kan du ställa frågor om inställningsvärden per namn med hjälp av någon av de get...-metoder som tillhandahålls i IPreferencesService. Med följande kodstycke ställer du till exempel en fråga om värdet för inställningen "MyPreference" i insticksprogrammet "com.example.myplugin".
... IPreferencesService service = Platform.getPreferencesService(); boolean value = service.getBoolean("com.example.myplugin", "MyPreference", true, null); //gör något med värdet. ...
Den sista parametern i frågemetoden är en vektor av omfångssammanhang som ska användas vid sökning efter inställningsnoden. Om vektorn är null förutsätter plattformen att ordningen för standardomfånget ska användas och kan sedan gissa sig till lämplig inställningsnod. Om en vektor av omfångssammanhang skickas är det den som avgör i vilken ordning omfången söks, och det är den ordning som ska användas till att söka efter inställningsnoden. Standardordningen för sökning efter omfång används alltid om ingen nod hittas med de angivna omfången.
Om ett insticksprogram kräver mer finjusterad styrning över sökordningen vid omfångssökning går det att använda klasser som representerar omfången till att accessa den faktiska nod som representerar inställningen i ett visst omfång. På så sätt kan en vektor av noder skapas som anger den särskilda sökordning som krävs. I följande kodstycke ställer vi en fråga till inställningstjänsten om samma inställning som användes ovan, men vi söker efter insticksprogrammets konfigurationsomfång, följt av förekomstomfånget. När noderna anges för sökordningen tas inte standardomfånget med. Det innebär att plattformen endast söker efter de exakta noder som tillhandahålls.
... IPreferencesService service = Platform.getPreferencesService(); Preferences configurationNode = new ConfigurationScope().getNode("com.example.myplugin"); Preferences instanceNode = new InstanceScope().getNode("com.example.myplugin"); Preferences[] nodes = new Preferences[] {configurationNode, instanceNode}; stringValue = service.get("MyPreference", "true", nodes); //gör något med värdet. ...
Ett insticksprogram kan också implementera sin egen bläddring genom noderna i inställningsträdet. Rotnoden i inställningsträdet kan hämtas från inställningstjänsten. Det går att använda omfångsklasserna till vidare bläddring i trädet. Med följande kodstycke bläddrar vi till en viss nod och hämtar inställningsvärdet från själva noden.
... IPreferencesService service = Platform.getPreferencesService(); Preferences root = service.getRootNode(); Preferences myInstanceNode = root.node(InstanceScope.SCOPE).node("com.example.myplugin"); if (myInstanceNode != null) { value = node.getBoolean("MyPreference", "true"); //gör ingenting med värdet. } ...
Insticksprogrammen kan definiera sina egna specialiserade omfång med hjälp av utökningen org.eclipse.core.runtime.preferences. I den här utökningen definierar insticksprogrammet namnet på det nya omfånget, liksom en klass som kan skapa inställningsnoder för det nya omfånget. Som ett alternativ kan den ange namnet på en klass som initialiserar standardinställningsvärdet vid det omfånget. När ett insticksprogram definierar ett nytt omfång ska det insticksprogrammet implementera bläddringsordningen för alla nya omfång i förhållande till plattformens bläddringsordning. Den här funktionaliteten ska vi se närmare på med hjälp av det specifika exemplet i Projektomfångsbaserade inställningar.