0

データベースに永続化されるようにツリーを変更するための単純な DragNDrop エディターを作成しました。(GXT 2.2.5 を使用するとアップグレードできません)

TreeStore で構築された TreePanel があります。TreePanel は、TreePanelDragSource と TreePanelDropTarget の両方です。

ドラッグ アンド ドロップは正常に機能します。テストとして、既存の開いているダイアログ ウィンドウから TreeStore を使用しました。エディターにドラッグ アンド ドロップすると、別のウィンドウにツリーの変更がすぐに表示されます。

ただし、TreeStore をフェッチして保存すると、ストア内でノードが再配置されません。再編成されたツリー構造を取得するにはどうすればよいですか?

ティア

4

1 に答える 1

0

私の解決策

Apparently there is no way to directly get at the Tree structure altered by Drag and Drop.
I reasoned that TreePanelView = TreePanel.getView() might have the Drag and Drop chaanges.
By examining TreePanelView in the debugger after a drag and drop I devise this solution:
/*
* These 'My' classes are used to access the internal tree within TreePanelView.
* The internal tree reflects Drag and Drop activity,
* which is NOT reflected in the TreeStore.
*/
private class MyTreePanel<M extends ModelData> extends TreePanel<M> {
    public MyTreePanel(TreeStore<M> ts) {
        super(ts);
        view = new MyView<M>();
        view.bind(this, store);
    }
    public MyView<M> getMyView() {
        return (MyView<M>) getView();
    }
}
private class MyView<M extends ModelData> extends TreePanelView<M> {
    public MyTreeStore<M> getTreeStore() {
        return (MyTreeStore<M>) this.treeStore;
    }
}
private class MyTreeStore<M extends ModelData> extends TreeStore<M> {
    public MyTreeStore() {
        super();
    }
    public Map<M, TreeModel> getModelMap() {
        return modelMap;
    }
}
To extract the tree altered by Drag and Drop:
MyTreePanel<ModelData> myTree; //Initialize the TreeStore appropriately

// After Drag and Drop activity, get the altered tree thusly:
Map<ModelData, TreeModel> viewMap = myTree.getMyView().getTreeStore().getModelMap();

The TreeModel in viewMap is actually a BaseTreeModel.
The ModelData are the objects I originally loaded into TreeStore.
I had to:
1 - Iterate over viewMap, extract "id" from BaseTreeModel and create a reverse map,
    indexed by "id" and containing my ModelData objects.
2 - Fetch root BaseTreeModel node from viewMap using root ModelData of original tree.
3 - Walk the BaseTreeModel tree.
    At each node, fetched ModelData objects by "id" from the reverse map.

In this way I reconstructed the tree altered by Drag and Drop.
于 2012-11-06T14:22:12.953 に答える