代码之家  ›  专栏  ›  技术社区  ›  penguru

保存setinput()之前的TreeViewer状态

  •  10
  • penguru  · 技术社区  · 16 年前

    我想救JFace TreeViewer 在调用后刷新的扩展状态 setInput() 方法。我试过 getExpandedElements , setExpandedElements , getExpandedTreePaths , setExpandedTreePaths 方法 树状 但它不起作用。

    Object[] expandedElements = viewer.getExpandedElements();
    TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
    viewer.setInput();
    viewer.setExpandedElements(expandedElements);
    viewer.setExpandedTreePaths(expandedTreePaths);
    
    2 回复  |  直到 10 年前
        1
  •  10
  •   flavio.donze    10 年前

    您需要确保TreeViewer的内容提供程序提供的对象 hashCode 和 equals 方法定义正确。 AbstractTreeViewer 需要能够比较新旧对象以确定其扩展状态。如果 哈希码 和 等于 没有提供,这是一个简单的引用检查,如果您重新创建了内容,它将不起作用。

        2
  •  3
  •   VonC    12 年前

    如上所述 this thread 晚些时候看看 ResourceNavigator ,从 org.eclipse.ui.views.navigator 包裹。
    (“late”,因为该类不再直接使用,请参见 Eclipse Wiki )

    alt text (如图中所见) eclipse Java Model )

    它使用了 TreeViewer ,并保存展开的元素和选定的元素以及其他状态。
    模型元素是 IResource 对象,使用 IPersistableElement / IElementFactory 机制。
    这个 IPersistableElement公司 适配器已针对注册 信息资源 课堂上 WorkbenchAdapter ,但这可以由模型元素实现 IPersistableElement公司 直接。
    相应的 工业工厂 在中声明 elementFactory 扩展在 org.eclipse.ui.ide 的 plugin.xml .

    恢复的资源知道如何通过树的内容提供程序获取自己的子级(和父级),因此并非树的所有元素都需要持久化。

    可以使用类似的方法来保存查看器的输入资源。
    为了 资源导航器 有一个间接的层次 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());
                }
            }
        }
        [...]
     }