TreeViewer到GridTreeViewer:现有ITreeContentProviders和" lazy"之间的桥梁。 ObservableListTreeContentProvider

时间:2017-03-19 18:52:11

标签: eclipse-plugin swt jface nebula eclipse-databinding

TL; DR

基于 Thomas Schindl 的文章JFace-Viewer and Eclipse Databinding with > 10.000 Objects(这表明一个非常好的主意),我想转换常规TreeViewer +多个ITreeContentProvider实施到Nebula's GridTreeViewer,使用ObservableListTreeContentProviderVisibleRangeChangedListenerEclipse Data Binding使其成为"懒惰" (lazier)并按需加载数据

我应该如何重写现有的常规ITreeContentProvider实现,以使用与ObservableListTreeContentProvider相同的层次结构?  我可以做一个"桥梁"旧解决方案和新解决方案之间? 使用DelegatingListProperty某种方式如this?还有其他想法吗?
我发现了一些过于简单的例子,但我并没有真正理解在这种复杂的分层树格式中使用数据绑定的概念。

示例树&内容提供商:

内容提供商1。:

|- A1
   |-- B1
       |-- MyMessage1
|- A2
   |-- B2
       |-- MyMessage2

内容提供商2 ..:

|- C1
   |-- D1
       |-- MyMessage1
|- C2
   |-- D2
       |-- MyMessage2

更长的解释

我有一个视图,我使用经典的自定义 TreeViewer 以分层格式显示大量对象 ITreeContentProviderLabelProvider + ITableLabelProvider实施。ITreeContentProvider还有一个菜单,用户可以选择以何种格式显示此层次结构。当用户选择其他显示格式时,唯一发生的事情是另一个viewer.setUseHashlookup(true)实现设置为查看器并以编程方式刷新查看器。
它有效,但由于元素数量巨大(在某些情况下,100-200k行,请不要问原因,只需要工作),显示项目可以,UI有时会冻结,因为TreeItems上有太多的监听器,视图刷新需要花费很多时间等等......

所以我想在模型元素已经加载到内存中的同时使用某种懒惰的解决方案
我已经尝试了SWT.VIRTUAL and ILazyTreeContentProvider,但它表现不佳(即使使用GridTreeViewer)并且存在问题(滚动时,TreeItems需要花费大量时间加载,有{{}} bugs 3}},排序,过滤等问题。

现在我读了Thomas Schindl的博客文章:JFace-Viewer and Eclipse Databinding with > 10.000 Objects。我想尝试使用Eclipse Nebula Grid ObservableListTreeContentProvider 和+ ITreeContentProvider (这也是VisibleRangeChangedListener实施)和ITreeContentProvider以及"懒惰"标签提供者(如文章中所述)。 我可以以某种方式使用我现有的ObservableListTreeContentProvider实现并构建一个"桥接器#34;介于此与新mkdir /var/www/myapp chown -R usernameofyourusr:www-data /var/www/myapp chmod 755 /var/www/myapp 之间?

BTW我检查了Nebula NatTable,但我发现很难将现有的内容提供商迁移到这个新的解决方案,它的API和它的方法完全不同(层次结构从子节点到父节点,而不是相反的方式) ,与Trees相关的文档仍为空。

1 个答案:

答案 0 :(得分:0)

Nebula不久前将网格变为虚拟。以下是查看器的片段,其中包含一些惰性内容提供者的示例。

http://git.eclipse.org/c/nebula/org.eclipse.nebula.git/tree/examples/org.eclipse.nebula.snippets/src/org/eclipse/nebula/snippets/grid/viewer