Introduction
Vous développez une application utilisant le framework Eclipse RCP, vous avez créé votre propre éditeur et vous voulez implémenter une MRU. Si votre classe ne dérive pas de AbstractTextEditor
, qui implémente ce mécanisme par défaut, voici un mode d'emploi.
Pour rappel, MRU signifie Most Recent Used, et est la liste des fichiers récemment utilisés, qui est généralement accessible dans le menu Fichiers.
Voici les étapes nécessaires pour l'implémenter. Je vous parle d'expérience, l'ayant mis en œuvre dans mon logiciel iNatch. J'ai trouvé la plupart des informations dans une liste de diffusion à l'adresse suivante :
http://dev.eclipse.org/newslists/news.e … 08987.html.
Première étape
Vous l'avez probablement déjà mis en œuvre, elle consiste à faire que votre application sauvegarde d'une session à l'autre un ensemble d'informations. Il faut ajouter la ligne configurer.setSaveAndRestore(true);
dans la méthode initialize(IWorkbenchConfigurer configurer)
de votre classe WorkbenchAdvisor
:
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
...
@Override
public void initialize(IWorkbenchConfigurer configurer) {
configurer.setSaveAndRestore(true);
}
}
Avec ce paramètre mis à true
, Eclipse sauvegarde automatiquement dans un fichier XML, dont nous n'avons pas à nous préoccuper, les informations concernant la position et la taille de la fenêtre (ou des fenêtres si vous avez permis d'en ouvrir plusieurs), la disposition des vues et des éditeurs à l'intérieur de la fenêtre. Ces informations prennent alors le pas sur la disposition que vous avez définies dans la fonction createInitialLayout(IPageLayout layout)
de la classe Perspective
.
Cette option intègre le fait de sauvegarder la liste des éditeurs qui sont présent au moment de quitter votre application. Mais pour l'instant, le framework n'a aucun moyen de savoir ce qu'il faut sauver à propos de votre éditeur, ni comment utiliser cette information au moment du redémarrage.
Deuxième étape
Elle consiste à implémenter IPersistableElement
dans votre classe IEditorInput
. La fonction getPersistable
renvoie alors this
si l'éditeur a été sauvegardé, null
sinon. Pour pouvoir faire ce test, l'un des attributs de la classe peut-être de type File
, mis à jour au moment de la sauvegarde sur disque de l'éditeur (par les options Enregistrer
ou Enregistrer sous
).
public class GameEditorInput implements IEditorInput, IPersistableElement {
...
public IPersistableElement getPersistable() {
return file_ == null ? null : this;
}
public String getFactoryId() {
return GameEditorInputFactory.ID;
}
public void saveState(IMemento memento) {
GameEditorInputFactory.saveState(memento, file_);
}
...
private File file_;
}
Il faut maintenant créer la classe EditorInputFactory
. Il faut d'abord y définir les éléments que nous utilisons dans EditorInput
, l'identifiant unique ID
, et la fonction saveState
, qui se contente de stocker le chemin vers le fichier dans un attribut.
public class GameEditorInputFactory implements IElementFactory {
...
private static final String TAG_PATH = "path"; //$NON-NLS-1$
...
public static void saveState(IMemento memento, File file) {
if (file != null) {
memento.putString(TAG_PATH, file.getPath().toString());
}
}
La sauvegarde des informations est maintenant complètes. Mais il faut encore écrire la partie qui relit cette information au moment du lancement de votre application. C'est la fonction createElement
de la classe EditorInputFactory
qui s'en charge. Cette partie est un peu dépendante de la manière que vous avez prévu pour créer un éditeur à partir d'un nom de fichier. Je n'ai pas eu de difficulté dans mon code, parce que j'avais déjà un constructeur qui crée un EditorInput
à partir d'un nom de fichier. Voici comment j'ai agencé les choses dans mon code :
public class GameEditorInputFactory implements IElementFactory {
...
public IAdaptable createElement(IMemento memento) {
String fileName = memento.getString(TAG_PATH);
if (fileName != null) {
try {
GameEditorInput gei = new GameEditorInput(new File(fileName));
return gei;
} catch (PartInitException e) {
// Nothing to do
}
}
return null;
}
Troisième étape
La dernière partie consiste à intégrer la classe EditorInputFactory
dans l'infrastructure de Eclipse. Cela se fait en étendant l'extension point elementFactories
, en lui donnant en paramètre votre classe EditorInputFactory
.
Conclusion
Il n'est pas très difficile d'implémenter une MRU dans une application Eclipse RCP. De plus, il y a un effet de bord intéressant, c'est que tout éditeur ouvert à l'arrêt précédent de votre application est automatiquement rouvert au prochain lancement.