Сохранение состояния TreeViewer до setInput()

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

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

Ответ 1

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

Ответ 2

Как упоминалось в этот поток, посмотрите на поздний 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 plugin.xml.

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

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


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

if (frameList.getCurrentIndex() > 0) {
    //save frame, it 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());
            }
        }
    }
    [...]
 }