Les fabriques d'éléments sont utilisées pour recréer les objets modèles du plan de travail à partir des données sauvegardée au cours de l'arrêt du plan de travail.
Avant de regarder en détails l'extension d'une fabrique d'éléments, nous devons revoir une technique générale utilisée dans toute la plateforme pour ajouter un comportement spécifique de plug-in à des objets modèles de plateforme courants.
Si vous parcourez les diverses classes du plan de travail, vous remarquerez que de nombreuses interfaces du plan de travail étendent l'interface IAdaptable.
Les plug-ins utilisent des adaptateurs pour ajouter un comportement spécifique aux types préexistants dans le système. Par exemple, le plan de travail peut souhaiter ajouter un comportement aux ressources, afin qu'elles répondent par un libellé et une image les représentant dans l'interface utilisateur. Nous savons que le fait d'ajouter un comportement spécifique de l'interface utilisateur à des objets de faible niveau n'est pas une bonne conception, aussi comment pouvons-nous ajouter ce comportement aux types de ressources ?
La plateforme définit une technique permettant d'interroger dynamiquement un objet sur son implémentation d'une interface particulière. Les plug-ins peuvent enregistrer des adaptateurs qui ajoutent un comportement à des types préexistants. De cette façon, un code d'application peut ensuite interroger un adaptateur particulier à propos d'un objet pendant qu'il l'utilise dans un contexte spécifique. Si un adaptateur est enregistré pour cet objet, le code peut l'obtenir et utiliser les nouveaux comportements définis dans l'adaptateur.
En fournissant une fonctionnalité permettant d'interroger dynamiquement un adaptateur sur un objet, nous pouvons également améliorer la flexibilité du système au fur et à mesure de son évolution. De nouveaux adaptateurs peuvent être enregistrés pour des types de plateforme par de nouveaux plug-ins sans devoir modifier les définitions des types d'origine. Le schéma consiste à demander un objet pour un adaptateur particulier.
// given an object o, we want to do "workbench" things with it.
if (!(o instanceof IAdaptable)) {
return null;
}
IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
if (adapter == null)
return null;
// now I can treat o as an IWorkbenchAdapter
...
Si aucun adaptateur est enregistré pour l'objet en question, la valeur "null" est retournée comme adaptateur. Les clients doit être préparés à traiter ce cas. Ceci permet aux clients de traiter correctement le cas où un adaptateur attendu n'a pas été enregistré.
Le plan de travail utilise des adaptateurs pour obtenir des informations de l'interface utilisateur à partir des types de plateforme de base, tel que IResource. Ceci isole les types de base d'une connaissance particulière de l'interface utilisateur et permet au plan de travail de faire évoluer ses interfaces sans modifier les définitions de la base.
Sans adaptateurs, toute classe pouvant être transmise dans l'API du plan de travail doit implémenter les interfaces utilisateur. Ceci encombre les définitions de classe et introduit un couplage étroit, ainsi que des dépendances circulaires entre les classes de l'interface utilisateur et des API. Avec des adaptateurs, chaque classe implémente IAdaptable et utilise le registre des adaptateurs pour permettre aux plug-ins d'étendre le comportement des types de base.
Tout au long du code du plan de travail, vous verrez des cas dans lesquels un type est demandé pour un adaptateur. Tout ceci est réalisé en vue d'obtenir un objet sachant comment donner des informations orientées interface utilisateur à propos d'un type d'API de plateforme.
Lorsque le plan de travail est arrêté par l'utilisateur, il doit sauvegarder l'état courant des objets IAdaptable figurant dans le plan de travail. Ceci est réalisé en sauvegardant les paramètres des données primitives de l'objet dans un format spécial, IMemento, aisément sauvegardable dans le système de fichiers. L'ID d'une fabrique pouvant recréer l'objet à partir de IMemento est également stocké.
Au redémarrage de la plateforme, le plan de travail recherche la fabrique d'éléments associés à l'ID de la fabrique mentionné dans le mémento. Il recherche la fabrique en vérifiant le registre du plug-in pour les contributions à l'extension org.eclipse.ui.elementFactories.
Les marques sont très simples. Il suffit de spécifier l'ID de la fabrique et la classe correspondante qui implémente cette dernière.
Le fragment de code ci-dessous est extrait du plugin.xml du plan de travail.
<extension
point = "org.eclipse.ui.elementFactories">
<factory id ="org.eclipse.ui.internal.model.ResourceFactory"
class="org.eclipse.ui.internal.model.ResourceFactory">
</factory>
<factory id ="org.eclipse.ui.internal.model.WorkspaceFactory"
class="org.eclipse.ui.internal.model.WorkspaceFactory">
</factory>
<factory id ="org.eclipse.ui.part.FileEditorInputFactory"
class="org.eclipse.ui.part.FileEditorInputFactory">
</factory>
<factory id ="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
</factory>
</extension>