在项目添加到GXT树时修改密钥

时间:2016-12-12 11:04:49

标签: tree gxt treestore

我已经使用了几天的sencha GXT,而且我正在尝试让Drag'n'drop在代表不同文件系统的两棵树之间工作。 这意味着可以将重复文件复制到几个不同文件夹中的一个系统上 - 但由于该文件具有相同的密钥,因此树库会中断。

到目前为止我尝试了什么,结果:

  • 尝试:在TreeDropHandler / TreeMoveHandler
  • 中执行操作
  • 结果:当小工具被移动时,这些是适用的

  • 尝试:覆盖TreeDataStore并覆盖添加方法

  • 结果:拖放到树中时甚至都没有调用add方法 - 它们似乎只是手动将内容添加到树库中

  • 尝试:只需复制整个树库并将其修改为我想要的工作

  • 结果:Tree很明显地期望了treestore类,而不是实现某些抽象类的东西,所以我不能这样做

  • 尝试:覆盖TreeStore中的插入方法

  • 结果:这些方法位于treestore中的私有子类中,因此我无法直接访问它们

  • 尝试:使treestore类的修改版本扩展原始版本并隐藏所有内容

  • 结果:编译器会告诉我我需要一个变量的@Override来处理重复类型,当我添加它时,它会告诉我没有任何东西可以覆盖它(x 100)

我有点坚持在这一点上我甚至可以尝试做的事情。 如果有人有任何建议或例子,我将非常感激。

1 个答案:

答案 0 :(得分:0)

当我在两棵树之间拖放东西时,我最终将一些有用的东西(对于我的具体使用案例)进行了攻击 - 特定的密钥实例并不重要,我只是将项目本身的路径作为密钥的一部分 - 主要部分只是修改appendModel以使用insert而不是addSubTree单独添加树组件,所以我有一个实际上允许我创建实例的数据类型。

如果有人能找到更好的方法,我很乐意看到它。

public class MyTreeDropTarget extends TreeDropTarget<FileSystemKey> {
    public MyTreeDropTarget(Tree<FileSystemKey, ?> tree) {
        super(tree);
    }

    private void InsertClone(FileSystemKey parent,
            TreeStore.TreeNode<FileSystemKey> node, int index) {
        FileSystemKey clone;
        if (parent == null) { //root of the tree
            clone = new FileSystemKey(node.getData());
            clone.SetKey("/", null, "/" + clone.key2);
            getWidget().getStore().insert(index, clone);
        } else { //a child element
            clone = new FileSystemKey(node.getData());
            clone.SetKey(parent.key1 + parent.key2 + "/", null, parent.key1
                + parent.key2);
            getWidget().getStore().insert(parent, index, clone);
        }
        //if this node had children, 
        //we then insert the children as children of this node
        if (node.getChildren().size() > 0) { 
            //TODO: rewrite to preserve order       
            appendModel(clone, node.getChildren(), 0);
        }
    }

    @Override
    protected void appendModel(FileSystemKey p, List<?> items, int index) {
        if (items.size() == 0)
            return;
        if (items.get(0) instanceof TreeStore.TreeNode) {
            // @SuppressWarnings("unchecked")

            List<TreeStore.TreeNode<FileSystemKey>> nodes = (List<TreeStore.TreeNode<FileSystemKey>>) items;

            // TODO: replace clone with gets
            for (TreeStore.TreeNode<FileSystemKey> key : nodes) {
                InsertClone(p, key, index);
            }
        } else {// no changes here - maybe change
                // this if you have non-homogenous key types
            @SuppressWarnings("unchecked")
            List<FileSystemKey> models = (List<FileSystemKey>) items;
            if (p == null) {
                getWidget().getStore().insert(index, models);
            } else {
                getWidget().getStore().insert(p, index, models);
            }
        }
    }
}