2009-10-16 5 views
10

Я пытаюсь сохранить JFace TreeViewer состояние расширения, чтобы обновить его после вызова метода setInput(). Я пробовал getExpandedElements, setExpandedElements, getExpandedTreePaths, setExpandedTreePaths методы TreeViewer но это не работает.Сохранение состояния TreeViewer перед setInput()

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

ответ

10

Вы должны убедиться, что ваш контент-провайдер TreeViewer предоставляет объекты, которые имеют свои hashCode и equals. AbstractTreeViewer должен иметь возможность сравнивать старые и новые объекты, чтобы определить их состояние расширения. Если hashCode и equals не предоставляются, это простая контрольная проверка, которая не будет работать, если вы воссоздали свое содержимое.

+0

Спасибо, он работает после реализации методов equals и hashset. – penguru

3

Как уже упоминалось в this thread, посмотрите на конце ResourceNavigator из пакета org.eclipse.ui.views.navigator.
(«поздно», потому что этот класс больше не используется напрямую, см. Eclipse Wiki).

alt text (как видно в eclipse Java Model)

Он использует TreeViewer, и сохраняет расширенные элементы и выбранные элементы, среди прочего состояния.
Элементы модели: IResource Объекты, которые сохраняются с использованием механизма IPersistableElement/IElementFactory.
Адаптер IPersistableElement зарегистрирован в отношении IResource в классе WorkbenchAdapter, но вместо этого он может быть получен с помощью элемента модели, реализующего непосредственно IPersistableElement.
Соответствующий IElementFactory указан в номере elementFactory в org.eclipse.ui.ide's plugin.xml.

Восстановленные ресурсы знают, как получить своих собственных детей (и родителя) через поставщика контента дерева, поэтому не все элементы дерева необходимо сохранить.

Аналогичный подход может быть использован для сохранения входного ресурса зрителя.
Для ResourceNavigator, существует уровень косвенности здесь через текущий кадр FrameList, но если вы пройдете через него в отладчике, вы увидите, что он по сути делает то же самое.


Малый экстракт (а остальная часть кода сохранить также много других вещей, включая выбор)

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