Enregistrement d'état TreeViewer avant setInput ()
-
21-09-2019 - |
Question
Je suis en train de sauver JFace état d'extension TreeViewer
pour le rafraîchir après avoir appelé méthode setInput()
. J'ai essayé getExpandedElements
, setExpandedElements
, getExpandedTreePaths
, les méthodes de setExpandedTreePaths
de TreeViewer
mais il ne fonctionne pas.
Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
La solution
Vous devez vous assurer que votre fournisseur de contenu de TreeViewer fournit des objets qui ont leurs méthodes hashCode
et equals
correctement définies. AbstractTreeViewer
doit être en mesure de comparer les anciens et les nouveaux objets pour déterminer leur état d'expansion. Si hashCode
et equals
ne sont pas fournis, il est une simple vérification de référence, qui ne fonctionnera pas si vous avez recréé votre contenu.
Autres conseils
Comme mentionné dans ce fil , prendre un coup d'oeil à la fin ResourceNavigator
, du
paquet org.eclipse.ui.views.navigator
.
( "Fin", car cette classe est plus directement utilisé, voir le Eclipse Wiki ).
(comme on le voit dans la Java eclipse modèle )
Il utilise un
TreeViewer
, et enregistre les éléments développés et éléments sélectionnés, entre autre Etat.
Les éléments de modèle sont des objets, qui sontIResource
persistaient à l'aide du mécanisme deIPersistableElement
/IElementFactory
.
L'adaptateurIPersistableElement
est enregistré contreIResource
en classeWorkbenchAdapter
, mais cela pourrait plutôt être obtenue par l'élément de modèle directement la mise en œuvreIPersistableElement
.
LeIElementFactory
correspondant est déclaré dans une extensionelementFactory
dans leorg.eclipse.ui.ide
deplugin.xml
.Les ressources restaurées savent comment obtenir leurs propres enfants (et parents), par l'intermédiaire du fournisseur de contenu de l'arbre, de sorte que tous les éléments de l'arbre doivent être persisté.
Une approche similaire pourrait être utilisée pour sauver la ressource d'entrée du spectateur.
PourResourceNavigator
, il y a un niveau d'indirection ici à travers le cadre actuel de sonFrameList
, mais si vous franchissez dans le débogueur, vous verrez que ça fait essentiellement la même chose.
Petit extrait (mais le reste du code permettent également d'économiser beaucoup d'autres choses, y compris la sélection)
if (frameList.getCurrentIndex() > 0) {
//save frame, it's not the "home"/workspace frame
TreeFrame currentFrame = (TreeFrame) frameList.getCurrentFrame();
IMemento frameMemento = memento.createChild(TAG_CURRENT_FRAME);
currentFrame.saveState(frameMemento);
} else {
//save visible expanded elements
Object JavaDoc expandedElements[] = viewer.getVisibleExpandedElements();
if (expandedElements.length > 0) {
IMemento expandedMem = memento.createChild(TAG_EXPANDED);
for (int i = 0; i < expandedElements.length; i++) {
if (expandedElements[i] instanceof IResource) {
IMemento elementMem = expandedMem
.createChild(TAG_ELEMENT);
elementMem.putString(TAG_PATH,
((IResource) expandedElements[i]).getFullPath()
.toString());
}
}
}
[...]
}