2012-10-26 29 views
0

我創建了一個簡單的DragNDrop編輯器來修改一個樹來保存在我的數據庫中。 (使用GXT 2.2.5無法升級)TreeStore DragNrop活動沒有反映在TreeStore

我有一個用TreeStore構造的TreePanel。 TreePanel既是TreePanelDragSource又是TreePanelDropTarget。

拖放工作正常; 作爲測試,我使用了現有的打開的對話窗口中的TreeStore。 當我在編輯器中拖放時,其他窗口會立即顯示樹的更改。

但是,當我獲取TreeStore進行保存時,節點不會在Store中重新排列。 如何獲得重組樹結構?

TIA

回答

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.