import wx
import sys
import os

opj = os.path.join
opb = os.path.basename

class MyFileDropTarget(wx.FileDropTarget):
    def __init__(self, parent):
        wx.FileDropTarget.__init__(self)
        self.parent = parent
    def OnDropFiles(self, x, y, files):
        item, flag = self.parent.HitTest((x,y))
        if flag & wx.LIST_HITTEST_ONITEM:
            index = item
        else:
            index = sys.maxint
        for file in files: self.parent.AddFile(file, index)
            
class DNDFileList(wx.ListCtrl):
    def __init__(self, parent, dir=os.getcwd()):
        wx.ListCtrl.__init__(self, parent, style=wx.LC_REPORT)
        self.dir = dir
        dt = MyFileDropTarget(self)
        self.SetDropTarget(dt)
        self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.OnDrag)
        self.InsertColumn(0, "Files")
        self.populate()
    def populate(self):
        if self.dir is not None:
            self.files = os.listdir(self.dir)
            self.files.sort()        
            for file in self.files:
                self.AddFile(file)
    def AddFile(self, file, index=sys.maxint):
        item = self.InsertStringItem(index, opb(file))
    def OnDrag(self, evt):
        items = []
        files = []
        item = self.GetNextItem(-1, state=wx.LIST_STATE_SELECTED)
        while item !=-1:
            items.append(item)
            files.append(opj(self.dir, self.GetItemText(item)))
            item = self.GetNextItem(item, state=wx.LIST_STATE_SELECTED)
        if len(items)>0:
            data = wx.FileDataObject()
            map(data.AddFile, files)
            dropSource = wx.DropSource(self)
            dropSource.SetData(data)
            result = dropSource.DoDragDrop(wx.Drag_AllowMove)
            if result == wx.DragMove:
                for file in files:
                    item = self.FindItem(0, os.path.basename(file))
                    self.DeleteItem(item)
                self.Refresh()

        evt.Skip()

class DemoPanel(wx.Panel):
    def __init__(self, parent, dir=wx.HORIZONTAL):
        wx.Panel.__init__(self, parent)
        self.sizer = wx.BoxSizer(dir)
        self.SetSizer(self.sizer)
    def Add(self, *args, **kargs):
        self.sizer.Add(*args, **kargs)
        
if __name__ == '__main__':
    app = wx.App(0)
    frame = wx.Frame(None, title="DNDLists")
    panel = DemoPanel(frame)
    l1 = DNDFileList(panel, os.getcwd())
    l2 = DNDFileList(panel)
    panel.Add(l1, 1, wx.EXPAND)
    panel.Add(l2, 1, wx.EXPAND)
    frame.Show()
    app.MainLoop()