我已经使用了几天的sencha GXT,而且我正在尝试让Drag'n'drop在代表不同文件系统的两棵树之间工作。 这意味着可以将重复文件复制到几个不同文件夹中的一个系统上 - 但由于该文件具有相同的密钥,因此树库会中断。
到目前为止我尝试了什么,结果:
结果:当小工具被移动时,这些是适用的
尝试:覆盖TreeDataStore并覆盖添加方法
结果:拖放到树中时甚至都没有调用add方法 - 它们似乎只是手动将内容添加到树库中
尝试:只需复制整个树库并将其修改为我想要的工作
结果:Tree很明显地期望了treestore类,而不是实现某些抽象类的东西,所以我不能这样做
尝试:覆盖TreeStore中的插入方法
结果:这些方法位于treestore中的私有子类中,因此我无法直接访问它们
尝试:使treestore类的修改版本扩展原始版本并隐藏所有内容
我有点坚持在这一点上我甚至可以尝试做的事情。 如果有人有任何建议或例子,我将非常感激。
答案 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);
}
}
}
}