Вам необходимо убедиться, что ваш контент-провайдер TreeViewer предоставляет объекты, у которых их методы hashCode
и равны
] правильно определены. AbstractTreeViewer
должен иметь возможность сравнивать старые и новые объекты, чтобы определить их состояние расширения.
Как упоминалось в этой ветке , взгляните на последний ResourceNavigator
из
пакет org.eclipse.ui.views.navigator
.
(«поздно», потому что этот класс больше не используется напрямую, см. Eclipse Wiki ).
(как видно в модели Java eclipse )
Он использует
TreeViewer
и сохраняет развернутые элементы и выбранные элементы, среди прочего.
Элементами модели являются объектыIResource
, которые сохраняются с помощью механизмаIPersistableElement
/IElementFactory
.
АдаптерIPersistableElement
зарегистрирован вIResource
в классеWorkbenchAdapter
, но вместо этого он может быть получен с помощью элемента модели, непосредственно реализующегоIPersistableElement
. 1138708] СоответствующийIElementFactory
объявлен в расширенииelementFactory
вorg.eclipse.ui.ide
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());
}
}
}
[...]
}