+ void dkdm_begin_drag (wxTreeEvent& ev)
+ {
+ ev.Allow ();
+ }
+
+ void dkdm_end_drag (wxTreeEvent& ev)
+ {
+ DKDMMap::iterator from = _dkdm_id.find (_dkdm->GetSelection ());
+ DKDMMap::iterator to = _dkdm_id.find (ev.GetItem ());
+ if (from == _dkdm_id.end() || to == _dkdm_id.end()) {
+ return;
+ }
+
+ shared_ptr<DKDMGroup> group = dynamic_pointer_cast<DKDMGroup> (to->second);
+ if (!group) {
+ group = to->second->parent();
+ }
+
+ DCPOMATIC_ASSERT (group);
+ DCPOMATIC_ASSERT (from->second->parent ());
+
+ from->second->parent()->remove (from->second);
+ add_dkdm_model (from->second, group);
+
+ _dkdm->Delete (from->first);
+ _dkdm_id.erase (from->first);
+ add_dkdm_view (from->second);
+ }
+