2009-10-16 14 views
10

Estoy intentando guardar el estado de expansión de JFace TreeViewer para actualizarlo después de llamar al método setInput(). Intenté getExpandedElements, setExpandedElements, getExpandedTreePaths, setExpandedTreePaths métodos de TreeViewer pero no funciona.Guardar el estado de TreeViewer antes de setInput()

Object[] expandedElements = viewer.getExpandedElements(); 
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths(); 
viewer.setInput(); 
viewer.setExpandedElements(expandedElements); 
viewer.setExpandedTreePaths(expandedTreePaths); 

Respuesta

10

usted necesita para asegurarse de que su proveedor de contenido de TreeViewer proporciona objetos que tienen su hashCode y equals métodos definidos correctamente. AbstractTreeViewer necesita poder comparar los objetos viejos y nuevos para determinar su estado de expansión. Si no se proporcionan hashCode y equals, se trata de una simple verificación de referencia, que no funcionará si ha recreado sus contenidos.

+0

Gracias, funciona después de implementar los métodos equals y hashset .. – penguru

3

Como se mencionó en this thread, echar un vistazo a finales del ResourceNavigator, del paquete org.eclipse.ui.views.navigator.
("tarde" porque esa clase ya no se usa directamente, vea Eclipse Wiki).

alt text (como se ve en la eclipse Java Model)

Se utiliza un TreeViewer, y guarda los elementos expandido y elementos seleccionados, entre otro estado.
Los elementos del modelo son objetos IResource, que se conservan utilizando el mecanismo IPersistableElement/IElementFactory.
El adaptador IPersistableElement está registrado contra IResource en la clase WorkbenchAdapter, pero en su lugar podría obtenerse mediante el elemento de modelo que implementa IPersistableElement directamente.
El correspondiente IElementFactory se declara en una extensión elementFactory en org.eclipse.ui.ide 's plugin.xml.

Los recursos restaurados saben cómo obtener sus propios hijos (y sus padres), a través del proveedor de contenido del árbol, por lo que no es necesario que persistan todos los elementos del árbol.

Se podría utilizar un enfoque similar para guardar el recurso de entrada del espectador.
Para ResourceNavigator, hay un nivel de indirección aquí a través del marco actual de FrameList, pero si lo revisa en el depurador, verá que básicamente está haciendo lo mismo.


extraer pequeñas (pero el resto del código guardar también otras muchas cosas, incluyendo la selección)

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()); 
      } 
     } 
    } 
    [...] 
} 
Cuestiones relacionadas