Projektnaturer

Projektnaturer gör det möjligt för insticksprogram att märka ett projekt som en viss typ av projekt. Ett exempel: Java-utvecklingsverktygen (JDT) använder en "Java-natur" till att lägga till Java-specifikt beteende till projekt.  Projektnaturer definieras av insticksprogram och läggs vanligen till eller tas bort på projektbas när användaren utför åtgärder som definieras av insticksprogrammet.

Ett projekt kan ha mer än en natur.  När du däremot definierar en projektnatur, kan du definiera särskilda begränsningar för naturen:

Om du vill implementera en egen natur måste du definiera en utökning och tillhandahålla en klass som implementerar IProjectNature.

Definiera en natur

Utökningspunkten org.eclipse.core.resources.natures används till att lägga till en projektnaturdefinition. Följande kod lägger till en natur för det hypotetiska insticksprogrammet com.example.natures.

   <extension
      point="org.eclipse.core.resources.natures"
      id="mynature"
      name="My Nature">
      <runtime>
         <run class="com.example.natures.MyNature">
         </run>
      </runtime>
   </extension>

Den klass som identifieras i utökningen måste implementera plattformsgränssnittet IProjectNature. Den här klassen implementerar insticksprogramsspecifikt beteende för associering av naturspecifik information med ett projekt när naturen konfigureras.

   public class MyNature implements IProjectNature {

      private IProject project;

      public void configure() throws CoreException {
         // Add nature-specific information
         // for the project, such as adding a builder
         // to a project's build spec.
      }
      public void deconfigure() throws CoreException {
         // Remove the nature-specific information here.
      }
      public IProject getProject() {
         return project;
      }
      public void setProject(IProject value) {
         project = value;
      }
   }

Metoderna configure() och deconfigure() skickas av plattformen när naturer läggs till och tas bort från ett projekt.  Du kan implementera metoden configure() till att lägga till en byggfunktion till ett projekt enligt diskussionen i Byggfunktioner.

Associera naturen med ett projekt

Det räcker inte med att definiera naturen för att associera den med ett projekt.  Du måste tilldela en natur till ett projekt genom att uppdatera projektets beskrivning till att innefatta din natur.  Detta inträffar vanligen när användaren skapar ett nytt projekt med en specialiserad ny projektguide som tilldelar naturen.  Följande kodstycke visar hur man tilldelar vår nya natur till ett givet projekt.

   try {
      IProjectDescription description = project.getDescription();
      String[] natures = description.getNatureIds();
      String[] newNatures = new String[natures.length + 1];
      System.arraycopy(natures, 0, newNatures, 0, natures.length);
      newNatures[natures.length] = "com.example.natures.mynature";
      description.setNatureIds(newNatures);
      project.setDescription(description, null);
   } catch (CoreException e) {
      // Something went wrong
   }

Obs! Natur-idt är det fullständigt kvalificerade idt för naturutökningen. Det fullständigt kvalificerade idt för en utökning skapas genom att kombinera insticksprogrammets id med det enkla utöknings-idt i plugin.xml-filen. Ett exempel: en natur med det enkla utöknings-idt "mynature" i insticksprogrammet "com.example.natures" får namnet "com.example.natures.mynature"

Naturerna tilldelas i praktiken inte till (och konfigureras inte) för projektet förrän du anger projektbeskrivningen i projektet.  Lägg märke till att identifieraren som används för naturen är det fullständigt kvalificerade namnet (insticksprograms-id + utöknings-id) för naturens utökning.

Om naturen har definierats med begränsningar kan arbetsytans API användas till att bekräfta den nya naturen.  Ett exempel: anta att en natur har definieras med ett obligatoriskt villkor:

   <extension
      point="org.eclipse.core.resources.natures"
      id="myOtherNature"
      name="My Other Nature">
      <runtime>
         <run class="com.example.natures.MyOtherNature">
         </run>
      </runtime>
   <requires-nature id="com.example.natures.mynature"/>
   </extension>

Den nya naturen är inte giltig såvida den första naturen inte finns för projektet.  Beroende på ditt insticksprograms utformning kan du vilja kontrollera huruvida den obligatoriska naturen har installerats eller lägga till den obligatoriska naturen själv.  Oavsett vilket kan du kontrollera giltigheten hos föreslagna kombinationer av projektnaturer med arbetsytans API.

   try {
      IProjectDescription description = project.getDescription();
      String[] natures = description.getNatureIds();
      String[] newNatures = new String[natures.length + 1];
      System.arraycopy(natures, 0, newNatures, 0, natures.length);
      newNatures[natures.length] = "com.example.natures.myOtherNature";
      IStatus status = workspace.validateNatureSet(natures);

      // check the status and decide what to do
      if (status.getCode() == IStatus.OK) {
      	description.setNatureIds(newNatures);
      	project.setDescription(description, null);
      } else {
      	// raise a user error
	...
      }
   } catch (CoreException e) {
      // Something went wrong
   }

Naturbeskrivningar

Förutom att arbeta med naturer via deras idn kan du erhålla beskrivningen (IProjectNatureDescriptor) som beskriver en natur, dess begränsningar och dess etikett. Du kan ställa en fråga till en viss natur om dess beskrivning eller hämta beskrivningar från arbetsytan. Följande kodstycke hämtar projektnaturbeskrivningen för vår nya natur:

      IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");

Du kan också hämta en matris med beskrivningar för alla installerade naturer:

      IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();