Сохранение состояния 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).
(как показано в 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());
}
}
}
[...]
}