Exemplo n.º 1
0
    def OnRestoreResults(self, parentdir, exception, results):
        mw=self.mainwindow
        if mw.HandleException(exception): return
        ok=filter(lambda s: s[0], results)
        fail=filter(lambda s: not s[0], results)

        # re-read the filesystem (if anything was restored)
        if len(parentdir):
            dirs=[]
            for _, name in results:
                while(len(name)>len(parentdir)):
                    name=guihelper.dirname(name)
                    if name not in dirs:
                        dirs.append(name)
            dirs.sort()
            for d in dirs:
                self.OnDirListing(d)

        self.OnDirListing(parentdir)

        if len(ok) and len(fail)==0:
            dlg=wx.MessageDialog(mw, "All files restored ok", "All files restored",
                                wx.OK|wx.ICON_INFORMATION)
            dlg.Show(True)
            return
        if len(fail) and len(ok)==0:
            wx.MessageBox("All files failed to restore", "No files restored",
                         wx.OK|wx.ICON_ERROR)
            return

        op="Failed to restore some files.  Check the log for reasons.:\n\n"
        for s,n in fail:
            op+="   "+n+"\n"
        wx.MessageBox(op, "Some restores failed", wx.OK|wx.ICON_ERROR)
 def OnRestoreResults(self, parentdir, exception, results):
     mw=self.mainwindow
     if mw.HandleException(exception): return
     ok=filter(lambda s: s[0], results)
     fail=filter(lambda s: not s[0], results)
     if len(parentdir):
         dirs=[]
         for _, name in results:
             while(len(name)>len(parentdir)):
                 name=guihelper.dirname(name)
                 if name not in dirs:
                     dirs.append(name)
         dirs.sort()
         for d in dirs:
             self.OnDirListing(d)
     self.OnDirListing(parentdir)
     if len(ok) and len(fail)==0:
         dlg=wx.MessageDialog(mw, "All files restored ok", "All files restored",
                             wx.OK|wx.ICON_INFORMATION)
         dlg.Show(True)
         return
     if len(fail) and len(ok)==0:
         wx.MessageBox("All files failed to restore", "No files restored",
                      wx.OK|wx.ICON_ERROR)
         return
     op="Failed to restore some files.  Check the log for reasons.:\n\n"
     for s,n in fail:
         op+="   "+n+"\n"
     wx.MessageBox(op, "Some restores failed", wx.OK|wx.ICON_ERROR)
Exemplo n.º 3
0
 def OnFileOverwrite(self,_):
     path=self.itemtopath(self.GetFirstSelected())
     with guihelper.WXDialogWrapper(wx.FileDialog(self, style=wx.OPEN|wx.HIDE_READONLY|wx.CHANGE_DIR),
                                    True) as (dlg, retcode):
         if retcode==wx.ID_OK:
             infile=dlg.GetPath()
             contents=open(infile, "rb").read()
             mw=self.mainwindow
             mw.MakeCall( gui.Request(mw.wt.writefile, path, contents),
                          gui.Callback(self.OnFileOverwriteResults, guihelper.dirname(path)) )
Exemplo n.º 4
0
 def OnFileOverwrite(self,_):
     path=self.itemtopath(self.GetFirstSelected())
     with guihelper.WXDialogWrapper(wx.FileDialog(self, style=wx.OPEN|wx.HIDE_READONLY|wx.CHANGE_DIR),
                                    True) as (dlg, retcode):
         if retcode==wx.ID_OK:
             infile=dlg.GetPath()
             contents=open(infile, "rb").read()
             mw=self.mainwindow
             mw.MakeCall( gui.Request(mw.wt.writefile, path, contents),
                          gui.Callback(self.OnFileOverwriteResults, guihelper.dirname(path)) )
 def OnFileOverwrite(self,_):
     path=self.itemtopath(self.GetFirstSelected())
     dlg=wx.FileDialog(self, style=wx.OPEN|wx.HIDE_READONLY|wx.CHANGE_DIR)
     if dlg.ShowModal()!=wx.ID_OK:
         dlg.Destroy()
         return
     infile=dlg.GetPath()
     contents=open(infile, "rb").read()
     mw=self.mainwindow
     mw.MakeCall( gui.Request(mw.wt.writefile, path, contents),
                  gui.Callback(self.OnFileOverwriteResults, guihelper.dirname(path)) )
     dlg.Destroy()
 def OnFileDelete(self, _):
     path=self.itemtopath(self.GetFirstSelected())
     mw=self.mainwindow
     mw.MakeCall( gui.Request(mw.wt.rmfile, path),
                  gui.Callback(self.OnFileDeleteResults, guihelper.dirname(path)) )
Exemplo n.º 7
0
 def OnFileDelete(self, _):
     path=self.itemtopath(self.GetFirstSelected())
     mw=self.mainwindow
     mw.MakeCall( gui.Request(mw.wt.rmfile, path),
                  gui.Callback(self.OnFileDeleteResults, guihelper.dirname(path)) )
	def OnFileOverwrite(self,_):

        path=self.itemtopath(self.GetFirstSelected())

        dlg=wx.FileDialog(self, style=wx.OPEN|wx.HIDE_READONLY|wx.CHANGE_DIR)

        if dlg.ShowModal()!=wx.ID_OK:

            dlg.Destroy()

            return

        infile=dlg.GetPath()

        contents=open(infile, "rb").read()

        mw=self.mainwindow

        mw.MakeCall( gui.Request(mw.wt.writefile, path, contents),
                     gui.Callback(self.OnFileOverwriteResults, guihelper.dirname(path)) )

        dlg.Destroy()

    
	def OnFileOverwriteResults(self, parentdir, exception, _):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        self.ShowFiles(parentdir, True)

    
	def ResetView(self):

        self.DeleteAllItems()

        self.files={}

        self.path=None

        self.itemDataMap = self.files

        self.itemIndexMap = self.files.keys()

        self.SetItemCount(0)

    
	def ShowFiles(self, path, refresh=False):

        mw=self.mainwindow

        if path == self.path and not refresh:

            return

        self.path=None

        mw.MakeCall( gui.Request(mw.wt.getfileonlylist, path),
                     gui.Callback(self.OnShowFilesResults, path) )

    
	def OnShowFilesResults(self, path, exception, result):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        count=self.GetItemCount()

        self.path=path

        self.DeleteAllItems()

        self.files={}

        index=0

        for file in result:

            index=index+1

            f=guihelper.basename(file)

            if self.datacolumn:

                self.files[index]=(f, `result[file]['size']`, result[file]['date'][1], result[file]['data'], file)

            else:

                self.files[index]=(f, `result[file]['size']`, result[file]['date'][1], file)

        self.itemDataMap = self.files

        self.itemIndexMap = self.files.keys()

        self.SetItemCount(index)

        self.SortListItems()

        if count!=0 and index==0:

            wx.EVT_PAINT(self, self.OnPaint)

        elif count==0 and index!=0:

            self.Unbind(wx.EVT_PAINT)

    
	def itemtopath(self, item):

        index=self.itemIndexMap[item]

        if self.datacolumn:

            return self.itemDataMap[index][4]

        return self.itemDataMap[index][3]

    
	def SortItems(self,sorter=None):

        col=self._col

        sf=self._colSortFlag[col]

        items=[]

        for k,v in self.itemDataMap.items():

            if col==1:

                items.append([int(v[col]),k])

            else:

                items.append([v[col],k])

        items.sort()

        k=[key for value, key in items]

        if sf==False:

            k.reverse()

        self.itemIndexMap=k

        self.Refresh()

    
	def GetListCtrl(self):

        return self

    
	def GetSortImages(self):

        return (self.sm_dn, self.sm_up)

    
	def OnGetItemText(self, item, col):

        index=self.itemIndexMap[item]

        s = self.itemDataMap[index][col]

        return s

    
	def OnGetItemImage(self, item):

        return self.img_file

    
	def OnGetItemAttr(self, item):

        return None



class  FileSystemDirectoryView (wx.TreeCtrl) :
	def __init__(self, mainwindow, parent, id, style):

        wx.TreeCtrl.__init__(self, parent, id, style=style)

        self.parent=parent

        self.mainwindow=mainwindow

        wx.EVT_TREE_ITEM_EXPANDED(self, id, self.OnItemExpanded)

        wx.EVT_TREE_SEL_CHANGED(self,id, self.OnItemSelected)

        self.dirmenu=wx.Menu()

        self.dirmenu.Append(guihelper.ID_FV_NEWSUBDIR, "Make subdirectory ...")

        self.dirmenu.Append(guihelper.ID_FV_NEWFILE, "New File ...")

        self.dirmenu.AppendSeparator()

        self.dirmenu.Append(guihelper.ID_FV_BACKUP, "Backup directory ...")

        self.dirmenu.Append(guihelper.ID_FV_BACKUP_TREE, "Backup entire tree ...")

        self.dirmenu.Append(guihelper.ID_FV_RESTORE, "Restore ...")

        self.dirmenu.AppendSeparator()

        self.dirmenu.Append(guihelper.ID_FV_REFRESH, "Refresh")

        self.dirmenu.AppendSeparator()

        self.dirmenu.Append(guihelper.ID_FV_DELETE, "Delete")

        self.dirmenu.AppendSeparator()

        self.dirmenu.Append(guihelper.ID_FV_TOTAL_REFRESH, "Refresh Filesystem")

        self.dirmenu.Append(guihelper.ID_FV_OFFLINEPHONE, "Offline Phone")

        self.dirmenu.Append(guihelper.ID_FV_REBOOTPHONE, "Reboot Phone")

        self.dirmenu.Append(guihelper.ID_FV_MODEMMODE, "Go to modem mode")

        self.genericmenu=wx.Menu()

        self.genericmenu.Append(guihelper.ID_FV_TOTAL_REFRESH, "Refresh Filesystem")

        self.genericmenu.Append(guihelper.ID_FV_OFFLINEPHONE, "Offline Phone")

        self.genericmenu.Append(guihelper.ID_FV_REBOOTPHONE, "Reboot Phone")

        self.genericmenu.Append(guihelper.ID_FV_MODEMMODE, "Go to modem mode")

        wx.EVT_MENU(self.genericmenu, guihelper.ID_FV_TOTAL_REFRESH, self.OnRefresh)

        wx.EVT_MENU(self.genericmenu, guihelper.ID_FV_OFFLINEPHONE, parent.OnPhoneOffline)

        wx.EVT_MENU(self.genericmenu, guihelper.ID_FV_REBOOTPHONE, parent.OnPhoneReboot)

        wx.EVT_MENU(self.genericmenu, guihelper.ID_FV_MODEMMODE, parent.OnModemMode)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_NEWSUBDIR, self.OnNewSubdir)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_NEWFILE, self.OnNewFile)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_DELETE, self.OnDirDelete)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_BACKUP, self.OnBackupDirectory)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_BACKUP_TREE, self.OnBackupTree)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_RESTORE, self.OnRestore)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_REFRESH, self.OnDirRefresh)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_TOTAL_REFRESH, self.OnRefresh)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_OFFLINEPHONE, parent.OnPhoneOffline)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_REBOOTPHONE, parent.OnPhoneReboot)

        wx.EVT_MENU(self.dirmenu, guihelper.ID_FV_MODEMMODE, parent.OnModemMode)

        wx.EVT_RIGHT_UP(self, self.OnRightUp)

        self.image_list=wx.ImageList(16, 16)

        self.img_dir=self.image_list.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,
                                                             wx.ART_OTHER,
                                                             (16, 16)))

        self.img_dir_open=self.image_list.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER_OPEN,
                                                             wx.ART_OTHER,
                                                             (16, 16)))

        self.SetImageList(self.image_list)

        self.add_files=[]

        self.add_target=""

        self.droptarget=guiwidgets.MyFileDropTarget(self, True, True)

        self.SetDropTarget(self.droptarget)

        self.ResetView()

    
	def ResetView(self):

        self.first_time=True

        self.DeleteAllItems()

        self.root=self.AddRoot("/")

        self.item=self.root

        self.SetPyData(self.root, None)

        self.SetItemHasChildren(self.root, True)

        self.SetItemImage(self.root, self.img_dir)

        self.SetItemImage(self.root, self.img_dir_open, which=wx.TreeItemIcon_Expanded)

        self.SetPyData(self.AppendItem(self.root, "Retrieving..."), None)

        self.selections=[]

        self.dragging=False

        self.skip_dir_list=0

    
	def OnDropFiles(self, x, y, filenames):

        target=self

        t=self.mainwindow.nb.GetPage(self.mainwindow.nb.GetSelection())

        if isinstance(t, FileSystemDirectoryView):

            target=t

        item, flags = self.HitTest((x, y))

        if item.IsOk():

            self.SelectItem(item)

            self.add_target=self.itemtopath(item)

            self.add_files=filenames

            target.OnAddFiles()

        self.dragging=False

    
	def OnDragOver(self, x, y, d):

        target=self

        t=self.mainwindow.nb.GetPage(self.mainwindow.nb.GetSelection())

        if isinstance(t, FileSystemDirectoryView):

            target=t

        item, flags = self.HitTest((x, y))

        selections = self.GetSelections()

        if item.IsOk():

            if selections != [item]:

                self.UnselectAll()

                self.SelectItem(item)

            return wx._misc.DragCopy

        elif selections:

            self.UnselectAll()

        return wx._misc.DragNone

    
	def _saveSelection(self):

        self.selections = self.GetSelections()

        self.UnselectAll()

    
	def _restoreSelection(self):

        self.UnselectAll()

        for i in self.selections:

            self.SelectItem(i)

        self.selections=[]

    
	def OnEnter(self, x, y, d):

        self._saveSelection()

        self.dragging=True

        return d

    
	def OnLeave(self):

        self.dragging=False

        self._restoreSelection()

    
	def OnAddFiles(self):

        mw=self.mainwindow

        if not len(self.add_files):

            return

        for file in self.add_files:

            if file is None:

                continue

            if len(self.add_target):

                path=self.add_target+"/"+os.path.basename(file)

            else:

                path=os.path.basename(file) 

            contents=open(file, "rb").read()

            mw.MakeCall( gui.Request(mw.wt.writefile, path, contents),
                         gui.Callback(self.OnAddFilesResults, self.add_target) )

            self.add_files.remove(file)

            break

    
	def OnAddFilesResults(self, parentdir, exception, _):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        if not len(self.add_files):

            self.parent.ShowFiles(parentdir, True)

        else:

            self.OnAddFiles()

    
	def OnRightUp(self, event):

        pt = event.GetPosition();

        item, flags = self.HitTest(pt)

        if item.IsOk():

            self.SelectItem(item)

            self.PopupMenu(self.dirmenu, pt)

        else:

            self.SelectItem(self.item)

            self.PopupMenu(self.genericmenu, pt)

    
	def OnItemSelected(self,_):

        if not self.dragging and not self.first_time:

            item=self.GetSelection()

            if item.IsOk() and item != self.item:

                path=self.itemtopath(item)

                self.parent.ShowFiles(path)

                if not self.skip_dir_list:

                    self.OnDirListing(path)

                self.item=item

    
	def OnItemExpanded(self, event):

        if not self.skip_dir_list:

            item=event.GetItem()

            if self.first_time:

                self.GetFullFS()

            else:

                path=self.itemtopath(item)

                self.OnDirListing(path)

    
	def AddDirectory(self, location, name):

        new_item=self.AppendItem(location, name)

        self.SetPyData(new_item, None)

        self.SetItemImage(new_item, self.img_dir)

        self.SetItemImage(new_item, self.img_dir_open, which=wx.TreeItemIcon_Expanded)

        if self.GetChildrenCount(location, False) == 1 and not self.IsExpanded(location):

            self.skip_dir_list+=1

            self.Expand(location)

            self.Collapse(location)

            self.skip_dir_list-=1

        return new_item

    
	def RemoveDirectory(self, parent, item):

        if self.GetChildrenCount(parent, False) == 1:

            self.Collapse(parent)

        self.Delete(item)

    
	def GetFullFS(self):

        mw=self.mainwindow

        mw.OnBusyStart()

        mw.GetStatusBar().progressminor(0, 100, 'Reading Phone File System ...')

        mw.MakeCall( gui.Request(mw.wt.fulldirlisting),
                     gui.Callback(self.OnFullDirListingResults) )

    
	def OnFullDirListingResults(self, exception, result):

        mw=self.mainwindow

        mw.OnBusyEnd()

        if mw.HandleException(exception):

            self.Collapse(self.root)

            return

        self.first_time=False

        self.skip_dir_list+=1

        self.SelectItem(self.root)

        self.DeleteChildren(self.root)

        keys=result.keys()

        keys.sort()

        for k in keys:

            path, dir=os.path.split(k)

            item=self.pathtoitem(path)

            self.AddDirectory(item, dir)

        self.skip_dir_list-=1

        self.parent.ShowFiles("")

    
	def OnDirListing(self, path):

        mw=self.mainwindow

        mw.MakeCall( gui.Request(mw.wt.singledirlisting, path),
                     gui.Callback(self.OnDirListingResults, path) )

    
	def OnDirListingResults(self, path, exception, result):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        item=self.pathtoitem(path)

        l=[]

        child,cookie=self.GetFirstChild(item)

        for dummy in range(0,self.GetChildrenCount(item,False)):

            l.append(child)

            child,cookie=self.GetNextChild(item,cookie)

        sort=False

        for file in result:

            children=True

            f=guihelper.basename(file)

            found=None

            for i in l:

                if self.GetItemText(i)==f:

                    found=i

                    break

            if found is None:

                found=self.AddDirectory(item, f)

                self.OnDirListing(file)

                sort=True

        for i in l: 

            if not result.has_key(self.itemtopath(i)):

                self.RemoveDirectory(item, i)

        if sort:

            self.SortChildren(item)

    
	def OnNewSubdir(self, _):

        dlg=wx.TextEntryDialog(self, "Subdirectory name?", "Create Subdirectory", "newfolder")

        if dlg.ShowModal()!=wx.ID_OK:

            dlg.Destroy()

            return

        item=self.GetSelection()

        parent=self.itemtopath(item)

        if len(parent):

            path=parent+"/"+dlg.GetValue()

        else:

            path=dlg.GetValue()

        mw=self.mainwindow

        mw.MakeCall( gui.Request(mw.wt.mkdir, path),
                     gui.Callback(self.OnNewSubdirResults, path) )

        dlg.Destroy()

    
	def OnNewSubdirResults(self, new_path, exception, _):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        path, dir=os.path.split(new_path)

        item=self.pathtoitem(path)

        self.AddDirectory(item, dir)

        self.SortChildren(item)

        self.Expand(item)

        self.OnDirListing(path)

    
	def OnNewFile(self,_):

        parent=self.itemtopath(self.GetSelection())

        dlg=wx.FileDialog(self, style=wx.OPEN|wx.HIDE_READONLY|wx.CHANGE_DIR)

        if dlg.ShowModal()!=wx.ID_OK:

            dlg.Destroy()

            return

        infile=dlg.GetPath()

        contents=open(infile, "rb").read()

        if len(parent):

            path=parent+"/"+os.path.basename(dlg.GetPath())

        else:

            path=os.path.basename(dlg.GetPath()) 

        mw=self.mainwindow

        mw.MakeCall( gui.Request(mw.wt.writefile, path, contents),
                     gui.Callback(self.OnNewFileResults, parent) )

        dlg.Destroy()

    
	def OnNewFileResults(self, parentdir, exception, _):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        self.parent.ShowFiles(parentdir, True)

    
	def OnDirDelete(self, _):

        path=self.itemtopath(self.GetSelection())

        mw=self.mainwindow

        mw.MakeCall( gui.Request(mw.wt.rmdirs, path),
                     gui.Callback(self.OnDirDeleteResults, path) )

    
	def OnDirDeleteResults(self, path, exception, _):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        parent, dir=os.path.split(path)

        parent_item=self.pathtoitem(parent)

        del_item=self.pathtoitem(path)

        self.RemoveDirectory(parent_item, del_item)

        self.OnDirListing(parent)

    
	def OnBackupTree(self, _):

        self.OnBackup(recurse=100)

    
	def OnBackupDirectory(self, _):

        self.OnBackup()

    
	def OnBackup(self, recurse=0):

        path=self.itemtopath(self.GetSelection())

        mw=self.mainwindow

        mw.MakeCall( gui.Request(mw.wt.getbackup, path, recurse),
                     gui.Callback(self.OnBackupResults, path) )

    
	def OnBackupResults(self, path, exception, backup):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        bn=guihelper.basename(path)

        if len(bn)<1:

            bn="root"

        bn+=".zip"

        ext="Zip files|*.zip|All Files|*"

        dlg=wx.FileDialog(self, "Save File As", defaultFile=bn, wildcard=ext,
                             style=wx.SAVE|wx.OVERWRITE_PROMPT|wx.CHANGE_DIR)

        if dlg.ShowModal()==wx.ID_OK:

            open(dlg.GetPath(), "wb").write(backup)

        dlg.Destroy()

    
	def OnRestore(self, _):

        ext="Zip files|*.zip|All Files|*"

        path=self.itemtopath(self.GetSelection())

        bn=guihelper.basename(path)

        if len(bn)<1:

            bn="root"

        bn+=".zip"

        ext="Zip files|*.zip|All Files|*"

        dlg=wx.FileDialog(self, "Open backup file", defaultFile=bn, wildcard=ext,
                             style=wx.OPEN|wx.HIDE_READONLY|wx.CHANGE_DIR)

        if dlg.ShowModal()!=wx.ID_OK:

            return

        name=dlg.GetPath()

        if not zipfile.is_zipfile(name):

            dlg=guiwidgets.AlertDialogWithHelp(self.mainwindow, name+" is not a valid zipfile.", "Zip file required",
                                               lambda _: wx.GetApp().displayhelpid(helpids.ID_NOT_A_ZIPFILE),
                                               style=wx.OK|wx.ICON_ERROR)

            dlg.ShowModal()

            dlg.Destroy()

            return

        zipf=zipfile.ZipFile(name, "r")

        xx=zipf.testzip()

        if xx is not None:

            dlg=guiwidgets.AlertDialogWithHelp(self.mainwindow, name+" has corrupted contents.  Use a repair utility to fix it",
                                               "Zip file corrupted",
                                               lambda _: wx.GetApp().displayhelpid(helpids.ID_ZIPFILE_CORRUPTED),
                                               style=wx.OK|wx.ICON_ERROR)

            dlg.ShowModal()

            dlg.Destroy()

            return

        dlg=RestoreDialog(self.mainwindow, "Restore files", zipf, path, self.OnRestoreOK)

        dlg.Show(True)

    
	def OnRestoreOK(self, zipf, names, parentdir):

        if len(names)==0:

            wx.MessageBox("You didn't select any files to restore!", "No files selected",
                         wx.OK|wx.ICON_EXCLAMATION)

            return

        l=[]

        for zipname, fsname in names:

            l.append( (fsname, zipf.read(zipname)) )

        mw=self.mainwindow

        mw.MakeCall( gui.Request(mw.wt.restorefiles, l),
                     gui.Callback(self.OnRestoreResults, parentdir) )

    
	def OnRestoreResults(self, parentdir, exception, results):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        ok=filter(lambda s: s[0], results)

        fail=filter(lambda s: not s[0], results)

        if len(parentdir):

            dirs=[]

            for _, name in results:

                while(len(name)>len(parentdir)):

                    name=guihelper.dirname(name)

                    if name not in dirs:

                        dirs.append(name)

            dirs.sort()

            for d in dirs:

                self.OnDirListing(d)

        self.OnDirListing(parentdir)

        if len(ok) and len(fail)==0:

            dlg=wx.MessageDialog(mw, "All files restored ok", "All files restored",
                                wx.OK|wx.ICON_INFORMATION)

            dlg.Show(True)

            return

        if len(fail) and len(ok)==0:

            wx.MessageBox("All files failed to restore", "No files restored",
                         wx.OK|wx.ICON_ERROR)

            return

        op="Failed to restore some files.  Check the log for reasons.:\n\n"

        for s,n in fail:

            op+="   "+n+"\n"

        wx.MessageBox(op, "Some restores failed", wx.OK|wx.ICON_ERROR)

    
	def OnDirRefresh(self, _):

        path=self.itemtopath(self.GetSelection())

        self.parent.ShowFiles(path, True)

        self.OnDirListing(path)

    
	def OnRefresh(self, _):

        self.GetFullFS()

    
	def itemtopath(self, item):

        if item==self.root: return ""

        res=self.GetItemText(item)

        while True:

            parent=self.GetItemParent(item)

            if parent==self.root:

                return res

            item=parent

            res=self.GetItemText(item)+"/"+res

        assert False

        return ""

    
	def pathtoitem(self, path):

        if path=="": return self.root

        dirs=path.split('/')

        node=self.root

        for n in range(0, len(dirs)):

            foundnode=None

            child,cookie=self.GetFirstChild(node)

            for dummy in range(0, self.GetChildrenCount(node, False)):

                d=self.GetItemText(child)

                if d==dirs[n]:

                    node=child

                    foundnode=node

                    break

                child,cookie=self.GetNextChild(node,cookie)

            if foundnode is not None:

                continue

            node=self.AppendItem(node, dirs[n])

            self.SetPyData(node, None)

        return node



class  RestoreDialog (wx.Dialog) :
	"""A dialog that lists all the files that will be restored"""
	    def __init__(self, parent, title, zipf, path, okcb):

        """Constructor
        @param path: Placed before names in the archive.  Should not include a
                       trailing slash.
        """

        wx.Dialog.__init__(self, parent, -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)

        vbs=wx.BoxSizer(wx.VERTICAL)

        vbs.Add( wx.StaticText(self, -1, "Choose files to restore"), 0, wx.ALIGN_CENTRE|wx.ALL, 5)

        nl=zipf.namelist()

        nl.sort()

        prefix=path

        if len(prefix)=="/" or prefix=="":

            prefix=""

        else:

            prefix+="/"

        nnl=map(lambda i: prefix+i, nl)

        self.clb=wx.CheckListBox(self, -1, choices=nnl, style=wx.LB_SINGLE|wx.LB_HSCROLL|wx.LB_NEEDED_SB, size=wx.Size(200,300))

        for i in range(len(nnl)):

            self.clb.Check(i, True)

        vbs.Add( self.clb, 1, wx.EXPAND|wx.ALL, 5)

        vbs.Add(wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL), 0, wx.EXPAND|wx.ALL, 5)

        vbs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.HELP), 0, wx.ALIGN_CENTER|wx.ALL, 5)

        self.SetSizer(vbs)

        self.SetAutoLayout(True)

        vbs.Fit(self)

        wx.EVT_BUTTON(self, wx.ID_HELP, lambda _: wx.GetApp().displayhelpid(helpids.ID_RESTOREDIALOG))

        wx.EVT_BUTTON(self, wx.ID_OK, self.OnOK)

        self.okcb=okcb

        self.zipf=zipf

        self.nl=zip(nl, nnl)

        self.path=path

    
	def OnOK(self, _):

        names=[]

        for i in range(len(self.nl)):

            if self.clb.IsChecked(i):

                names.append(self.nl[i])

        self.okcb(self.zipf, names, self.path)

        self.Show(False)

        self.Destroy()
	def OnRestoreResults(self, parentdir, exception, results):

        mw=self.mainwindow

        if mw.HandleException(exception): return

        ok=filter(lambda s: s[0], results)

        fail=filter(lambda s: not s[0], results)

        if len(parentdir):

            dirs=[]

            for _, name in results:

                while(len(name)>len(parentdir)):

                    name=guihelper.dirname(name)

                    if name not in dirs:

                        dirs.append(name)

            dirs.sort()

            for d in dirs:

                self.OnDirListing(d)

        self.OnDirListing(parentdir)

        if len(ok) and len(fail)==0:

            dlg=wx.MessageDialog(mw, "All files restored ok", "All files restored",
                                wx.OK|wx.ICON_INFORMATION)

            dlg.Show(True)

            return

        if len(fail) and len(ok)==0:

            wx.MessageBox("All files failed to restore", "No files restored",
                         wx.OK|wx.ICON_ERROR)

            return

        op="Failed to restore some files.  Check the log for reasons.:\n\n"

        for s,n in fail:

            op+="   "+n+"\n"

        wx.MessageBox(op, "Some restores failed", wx.OK|wx.ICON_ERROR)

    
	def OnDirRefresh(self, _):

        path=self.itemtopath(self.GetSelection())

        self.parent.ShowFiles(path, True)

        self.OnDirListing(path)

    
	def OnRefresh(self, _):

        self.GetFullFS()

    
	def itemtopath(self, item):

        if item==self.root: return ""

        res=self.GetItemText(item)

        while True:

            parent=self.GetItemParent(item)

            if parent==self.root:

                return res

            item=parent

            res=self.GetItemText(item)+"/"+res

        assert False

        return ""

    
	def pathtoitem(self, path):

        if path=="": return self.root

        dirs=path.split('/')

        node=self.root

        for n in range(0, len(dirs)):

            foundnode=None

            child,cookie=self.GetFirstChild(node)

            for dummy in range(0, self.GetChildrenCount(node, False)):

                d=self.GetItemText(child)

                if d==dirs[n]:

                    node=child

                    foundnode=node

                    break

                child,cookie=self.GetNextChild(node,cookie)

            if foundnode is not None:

                continue

            node=self.AppendItem(node, dirs[n])

            self.SetPyData(node, None)

        return node



class  RestoreDialog (wx.Dialog) :
	"""A dialog that lists all the files that will be restored"""
	    def __init__(self, parent, title, zipf, path, okcb):

        """Constructor
        @param path: Placed before names in the archive.  Should not include a
                       trailing slash.
        """

        wx.Dialog.__init__(self, parent, -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)

        vbs=wx.BoxSizer(wx.VERTICAL)

        vbs.Add( wx.StaticText(self, -1, "Choose files to restore"), 0, wx.ALIGN_CENTRE|wx.ALL, 5)

        nl=zipf.namelist()

        nl.sort()

        prefix=path

        if len(prefix)=="/" or prefix=="":

            prefix=""

        else:

            prefix+="/"

        nnl=map(lambda i: prefix+i, nl)

        self.clb=wx.CheckListBox(self, -1, choices=nnl, style=wx.LB_SINGLE|wx.LB_HSCROLL|wx.LB_NEEDED_SB, size=wx.Size(200,300))

        for i in range(len(nnl)):

            self.clb.Check(i, True)

        vbs.Add( self.clb, 1, wx.EXPAND|wx.ALL, 5)

        vbs.Add(wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL), 0, wx.EXPAND|wx.ALL, 5)

        vbs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.HELP), 0, wx.ALIGN_CENTER|wx.ALL, 5)

        self.SetSizer(vbs)

        self.SetAutoLayout(True)

        vbs.Fit(self)

        wx.EVT_BUTTON(self, wx.ID_HELP, lambda _: wx.GetApp().displayhelpid(helpids.ID_RESTOREDIALOG))

        wx.EVT_BUTTON(self, wx.ID_OK, self.OnOK)

        self.okcb=okcb

        self.zipf=zipf

        self.nl=zip(nl, nnl)

        self.path=path

    
	def OnOK(self, _):

        names=[]

        for i in range(len(self.nl)):

            if self.clb.IsChecked(i):

                names.append(self.nl[i])

        self.okcb(self.zipf, names, self.path)

        self.Show(False)

        self.Destroy()