Une vue est une partie du plan de travail dans laquelle peut naviguer une hiérarchie d'informations ou qui affiche des propriétés pour un objet. Les vues sont souvent fournies pour supporter un éditeur correspondant. Par exemple, une vue de l'aperçu montre une vue structurée des informations dans un éditeur. Une vue des propriétés montre les propriétés d'un objet en cours d'édition.
Lorsque l'utilisateur effectue des sélections ou des modifications dans une vue, elles se reflètent immédiatement dans les autres parties connexes de l'interface utilisateur. Seule une instance d'une vue donnée est ouverte dans une page du plan de travail.
Le point d'extension org.eclipse.ui.views permet aux plug-ins d'ajouter des vues au plan de travail. Les plug-ins qui contribuent à une vue doivent l'enregistrer dans leur fichier plugin.xml, avec des informations de configuration qui la concernent, comme par exemple sa classe d'implémentation, la catégorie (ou le groupe) de vues à laquelle elle appartient, ainsi que le nom et l'icône devant être utilisés pour décrire la vue dans les menus et les libellés.
L'interface destinée aux vues est défini dans IViewPart, mais les plug-ins peuvent choisir d'étendre la classe ViewPart plutôt que d'implémenter une classe IViewPart à partir de rien.
Nous avons implémenté une extension de vue minimale dans l'exemple "Hello World". Maintenant, nous allons observer une extension qui tient compte des autres vues du plan de travail et qui répond à la navigation et aux sélections de l'utilisateur dans le plan de travail. En premier lieu, attachons-nous à la déclaration de l'extension dans le fichier plugin.xml.
<extension
point="org.eclipse.ui.views">
<category
id="org.eclipse.ui.examples.readmetool"
name="&Readme">
</category>
<view
id="org.eclipse.ui.examples.readmetool.views.SectionsView"
name="Readme Sections"
icon="icons/basic/view16/sections.gif"
category="org.eclipse.ui.examples.readmetool"
class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
</view>
</extension>
Ceci doit vous paraître familier. Nous voyons qu'une nouvelle vue, ReadmeSectionsView, contribue au plan de travail. L'ID vue, le nom et la catégorie sont spécifiés comme nous l'avons vu précédemment. Une icône est également fournie pour la vue, à l'aide d'un chemin d'accès relatif au répertoire d'installation du plug-in.
Observons ReadmeSectionsView. Vous pouvez afficher n'importe quelle vue dans le plan de travail en choisissant Perspective->Afficher la vue->Autre... et en sélectionnant la vue dans la liste Affichage de la vue.
Ensuite nous affichons ReadmeSectionsView, une vue dont la liste s'affiche en incrustation. La liste est vide à moins de cliquer sur un fichier portant l'extension .readme, au quel cas il remplit la liste avec des sections du fichier readme.
Comment le plug-in est-il mis au courant des modifications de sélection et comment reconnaît-il le fichier readme ? Si nous pouvons suivre cela dans le code, nous sommes en passe de comprendre comment générer des plug-ins intégrés au plan de travail.
Nous allons commencer par la méthode bien connue createPartControl. Comme nous l'avons vu dans l'exemple d'Hello World, c'est là que les widgets représentant une vue sont créés. Pour commencer, nous ignorerons une partie du code.
public void createPartControl(Composite parent) {
viewer = new ListViewer(parent);
...
// add myself as a global selection listener
getSite().getPage().addSelectionListener(this);
// prime the selection
selectionChanged(null, getSite().getPage().getSelection());
}
La vue crée et stocke un ListViewer et s'enregistre comme écouteur de sélection sur sa page. Elle obtient la page d'un IViewSite qui contient des informations sur le contexte de la vue, par exemple sa fenêtre de plan de travail, la page de contenu et le plug-in. Lorsque nous sommes averti d'un changement de sélection, que se passe-t-il ? Le code suivant est exécuté :
public void selectionChanged(IWorkbenchPart part, ISelection sel) {
//if the selection is a readme file, get its sections.
AdaptableList input =
ReadmeModelFactory.getInstance().getSections(sel);
viewer.setInput(input);
}
Il semble que la classe ReadmeModelFactory soit impliquée dans la transformation de la sélection en sections du readme qui sont comprises comme des entrées pour l'afficheur créé dans la méthode createPartControl.
Nous savons que la vue a enregistré son intérêt en modifications de sélection. Quoi qu'il en soit, la sélection est convertie en entrée appropriée à l'afficheur. Et ce dernier opère afin de remplir un widget de liste.
Si vous souhaitez dès à présent tout savoir sur cet afficheur, passez à la section Afficheurs. Pour le moment, nous nous contenterons de dire qu'une fois l'élément d'entrée indiqué à l'afficheur, ce dernier sait comment ajouter les informations dans un widget de liste. (Après tout, il s'agit d'un ListViewer.) Mais comment avons-nous su qu'il s'agissait d'un fichier readme et d'où proviennent les informations de section destinées à l'afficheur ? Un rapide coup d'oeil à ReadmeModelFactory apporte des explications.
public AdaptableList getSections(ISelection sel) {
// If sel is not a structured selection just return.
if (!(sel instanceof IStructuredSelection))
return null;
IStructuredSelection structured = (IStructuredSelection)sel;
//if the selection is a readme file, get its sections.
Object object = structured.getFirstElement();
if (object instanceof IFile) {
IFile file = (IFile) object;
String extension =
file.getFileExtension();
if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) {
return
getSections(file);
}
}
//the selected object is not a readme file
return null;
}
Nous vérifions la sélection pour voir s'il s'agit d'une sélection structurée (multiple). (Le concept de sélection structurée vient des afficheurs JFace.) Pour le premier objet de la sélection, nous vérifions s'il s'agit d'une ressource de fichier (IFile). Si tel est le cas, nous vérifions son extension pour voir si elle correspond à l'extension ".readme". Dès que nous savons que nous sommes en présence d'un fichier readme, nous pouvons utiliser d'autres méthodes pour analyser les sections. Vous pouvez parcourir le reste de ReadmeModelFactory, MarkElement et DefaultSectionsParser pour obtenir les détails de l'analyse du fichier.
En étudiant cette extension, nous avons couvert un grand nombre de concepts de plan de travail courants. A présent, nous allons passer aux autres extensions du plan de travail et examiner comment votre plug-in peut contribuer davantage à l'interface utilisateur du plan de travail.