2009-07-30 4 views
3

Dans Eclipse, vous pouvez publier un point d'extension pour les plug-ins en aval à utiliser. Lorsque vous parcourez les extensions pour votre point, telles que renvoyées à partir du Registre, existe-t-il un moyen de connaître/contrôler l'ordre dans lequel elles sont renvoyées?Tri/Commande des extensions de votre point d'extension Eclipse

Comment éclipse trouver des extensions, par ordre de fichiers sur le disque?, Nom?

Mise à jour:
Quelqu'un m'a demandé pourquoi je voudrais le faire donc je vais donner et exemple cas d'utilisation

En éclipse si vous exécutez l'exemple du plugin MultiPageEditor vous allez créer un éditeur avec trois onglets . Si je publie une extension permettant l'ajout d'onglets à ceci et je voulais les ajouter dans un ordre certain/logique/contextuel et pas un ordre de classement de fichiers aléatoire/OS spécifique.

Répondre

2

Quand je veux commander les contributions de point d'extension, j'ajouter un numéro de priorité, comme int 10.

Je n'utilise que le nombre de 10, 20, 30, ... parce que vous pouvez facilement mettre des éléments entre dans l'avenir. Vous pouvez l'utiliser pour commander des boutons, des composites ou tout ce que vous ne pouvez pas classer par nom.

Vous pouvez ajouter cette priorité dans l'interface que vous utilisez pour définir votre point d'extension. Ou vous pouvez dépenser un champ dans la description du point d'extension. Lorsque vous collectez toutes les contributions de points d'extension, vous pouvez demander la priorité et ordonner les contributions dans une liste liée avant de les renvoyer.

String tmpExtensionPoint = "EXTENSION POINT ID"; //$NON-NLS-1$ 
IExtensionRegistry registry = Platform.getExtensionRegistry(); 
IConfigurationElement[] elements = registry.getConfigurationElementsFor(tmpExtensionPoint); 

    List references = new LinkedList(); 
    if (elements != null && elements.length > 0) { 
     for (int i = 0; i < elements.length; i++) { 
      try { 
       Object obj = elements[i].createExecutableExtension("class"); 
       references.add((IExtensionPointInterface)obj); //$NON-NLS-1$ 
      } catch (CoreException e) { 
       logger.error("Get Extension Point For " + tmpExtensionPoint, e); 
      } 
     } 
    } 

//... 
//ORDER here 

return references; 

Le code de commande pourrait par quelque chose comme ceci:

Arrays.sort(references, new Comparator() { 
     public int compare(Object arg0, Object arg1) { 
      if (!(arg0 instanceof IExtensionPointInterface)) { 
       return -1; 
      } 

      if (!(arg1 instanceof IExtensionPointInterface)) { 
       return -1; 
      } 

      IExtensionPointInterface part0 = (IExtensionPointInterface)arg0; 
      IExtensionPointInterface part1 = (IExtensionPointInterface)arg1; 

      if (part0.getPriority() < part1.getPriority()) { 
       return -1; 
      } 

      if (part0.getPriority() > part1.getPriority()) { 
       return 1; 
      } 

      return 0; 
     } 
    }); 
2

Vous n'avez aucun contrôle direct sur l'ordre dans lequel ils sont analysés ou renvoyés, mais cela ne devrait pas avoir d'importance. Pourquoi est-ce important pour vous qu'ils soient renvoyés dans un ordre particulier? Pour ce que ça vaut, je rappelle vaguement que chaque emplacement d'extension est lu successivement dans l'ordre où ils sont définis, et chaque plugin dans l'emplacement est lu par ordre alphabétique, mais cela a pu changer depuis P2 est apparu dans Eclipse 3.4 . Je ne compterais sur aucune commande de lecture de toute façon car vous n'êtes pas censé être au courant de cette connaissance.

Si vous avez besoin de commander vos contributions, lorsque vous obtenez les extensions du registre, vous pouvez les ajouter à une liste, implémenter un comparateur et les trier si vous le souhaitez. Ou vous pouvez les itérer dans l'ordre et trier les objets résultants avant de continuer.

Ce article est un peu vieux mais je crois encore valide. Il vous donne quelques indications sur le traitement des points d'extension.

Questions connexes