Beispiel #1
0
class TreeExplorer:
    """
    @summary: This class is a handler for a TreeView, for
        simulating a tree explorer, like nautilus has.
    """
    
    __selectCallback__ = None
    __showHiddens__ = True

    __TEMP_NODE__ = " !TempCamimg"    
    
    # Index of each column
    __IMG_COLUMN__ = 0
    __NAME_COLUMN__ = 1
    __PATH_COLUMN__ = 2
    
    def __init__(self, selectCallback=None, showHiddens=True):
        """
        @summary: Create new TreeExplorer.
        @param selectCallback: Callback that will call when an item will be selected.
        @param showHiddens: True to show hidden folders.
        @note: selectCallback must be a funtion reference, like function(path : str)
        """
        self.__selectedPath__ = ""
        self.__ioUtils__ = IOUtils()

        # Define Treeview explorer
        self.__explorer__ = gtk.TreeView()
        self.__explorer__.connect("cursor-changed", self.__selectRowTvOneClickSignal__)
        self.__explorer__.connect("row-collapsed", self.__collapsedRowTVSignal__)
        self.__explorer__.connect("row-expanded", self.__expandRowTVSignal__)
        
        self.__exportControl__ = gtk.ScrolledWindow()
        self.__exportControl__.add(self.__explorer__)
        
        self.__HOME_NODE__ = _("home")
        
        # Initialize TreeView explorer
        self.__initializeExplorer__()
        
        self.__selectCallback__ = selectCallback
        self.__showHiddens__ = showHiddens
    
    def __initializeExplorer__(self):
        """
        @summary: Initialize TreeView explorer. Add drives of OS.
        """
        # Make a model for TreeView explorer
        self.__model__ = gtk.TreeStore(gtk.gdk.Pixbuf,
                                       gobject.TYPE_STRING,
                                       gobject.TYPE_STRING)
        
        __log__.debug("Created model for TreeExplorer.")
        # Gets home icon
        iconHome = FactoryControls.getPixbufFromStock(gtk.STOCK_HOME)
        
        # Gets drive icon
        icon = FactoryControls.getPixbufFromStock(gtk.STOCK_HARDDISK)
    
        self.__explorer__.set_model(None)
    
        # Apply look to TreeView
        self.__explorer__.set_headers_visible(False)
        self.__explorer__.set_show_expanders(True)
        self.__explorer__.get_selection().set_mode(gtk.SELECTION_SINGLE)
    
        column = FactoryControls.getTreeColumnTextAndPixbuf(_("Explorer"),
                                                            self.__NAME_COLUMN__,
                                                            self.__IMG_COLUMN__)
        self.__explorer__.append_column(column)
    
        __log__.debug("Added columns to TreeExplorer")
        
        # Add home node
        self.addDirectory(self.__HOME_NODE__, os.path.expanduser("~"), iconHome, glock=False)
        
        # Gets drives from the OS
        for sDrive in self.__ioUtils__.getDrives():
            if (sDrive != None) and (sDrive != ""):
                self.addDirectory (sDrive, sDrive, icon, glock=False)
        
        __log__.debug("Drives added.")
        
        # Set model to explorer TreeView
        self.__explorer__.set_model(self.__model__)
     
    def __fillDirectory__(self, path):
        """
        @summary: Fills a node with sub-directories.
        @param path: Folder path to fill. 
        """
        newExpand = False
        # Gets current path
        iter = self.__model__.get_iter(path)
        sPath = self.__model__.get_value(iter, self.__PATH_COLUMN__)
        
        monitor = FactoryDirectoryMonitor.getMonitor(sPath)
        
        # Checks if first child y a temporal node. If it is, it must be removed
        itFirstChild = self.__model__.iter_children(iter)
        if (itFirstChild != None):
            if (self.__model__.get_value(itFirstChild, self.__PATH_COLUMN__) == self.__TEMP_NODE__):
                # Gets number of nodes. If nNodes > 1, 
                # there is another thread that is loading the directory 
                nNodes = self.__model__.iter_n_children(iter)
                if (nNodes > 1):
                    return
                newExpand = True
        else:
            __log__.warning("It can not get first child of %s" % sPath)
    
        # Gets directories of the path
        lDirectories = self.__ioUtils__.getDirectories(sPath,
                                                       showhidden=self.__showHiddens__)
    
        if (lDirectories != None):
            icon = FactoryControls.getPixbufFromStock(gtk.STOCK_DIRECTORY)
                
            if (not newExpand):
                __log__.debug("It is not a new expand. Checking directories...")
                
                iterStep = self.__model__.iter_children(iter)
                # Find deleted iters
                while (iterStep != None):
                    doStep = True
                    sDirFind = self.__model__.get_value(iterStep, self.__NAME_COLUMN__)
                    if (sDirFind != None):
                        try:
                            index = lDirectories.index(sDirFind)
                        except ValueError, ve:
                            __log__.debug("It can not get index of %s. %s" % (sDirFind, ve))
                            index = -1
                        if (index == -1):
                            # In case of directory does not exist, it will remove from treeview
                            iterDelete = iterStep
                            iterStep = self.__model__.iter_next(iterStep)
                            self.deleteNode(iterDelete)
                            __log__.debug("Delete node %s" % sDirFind)
                            
                            doStep = False
                        else:
                            # In case of directory just exists, it will remove from list
                            lDirectories.remove(sDirFind)
                            __log__.debug("%s skipped" % sDirFind)
        
                    if (doStep):
                        iterStep = self.__model__.iter_next(iterStep)
                
                # Check directories in the list 
                for sDir in lDirectories:
                    sFullPath = os.path.join(sPath, sDir)
                    checkIter = self.__findDirectoryOnParent__(iter, sDir)
                    if (checkIter == None):
                        self.addDirectory(sDir, sFullPath, icon, iter)
                        __log__.debug("Add %s" % sFullPath)
            
            # Insert directories
            for sDir in lDirectories:
                sFullPath = os.path.join(sPath, sDir)
                self.addDirectory(sDir, sFullPath, icon, iter)
                __log__.debug("Add %s" % sFullPath)
                    
            if ((itFirstChild != None) and newExpand):
                __log__.debug("Remove temporal node.")
                self.deleteNode(itFirstChild)
                
            monitor.addDirectories(lDirectories)
            monitor.addListener(self.__handlerDirectoryMonitorEvents__)
            
        else:  # When there isn't any directory