#ifndef _FileVisitor_H_
#define _FileVisitor_H_
//start

#include <QDir>
#include <QObject>
#include <QStringList>
#include "utils_export.h"

/** @short Visitor Pattern - visits files in a directory tree, recursively or non,
    performing the same operation on each file.
	@author Alan Ezust sae@mcs.suffolk.edu
    @version $Id: filevisitor.h 1028 2009-11-13 17:56:35Z sae $  

    Note: QDirIterator (Qt 4.3) serves a similar purpose and could be used instead of this class 
*/
class UTILS_EXPORT FileVisitor : public QObject {
    Q_OBJECT
 public:
    /**
       @param nameFilter unix glob-style fileName filter 
       e.g. *.html
       @param recursive if true, also process subdirectores
       @param symlinks if true, also process symbolic links.
    */
    FileVisitor(QString nameFilter="*",
                bool recursive=true, bool symlinks=false);
    FileVisitor(QStringList nameFilterList,
            bool recursive=true, bool symlinks = false);
    
 public slots:

    /** @short Convenience method for processing a
    list of file specs.

    Useful for handling command line arguments.
    Calls @ref processEntry() on each file item in list. 

    @param sl - stringlist of files or
    directories to process  */
    void processFileList(QStringList sl);
    
    /** @short processes a single directory entry
    Does not care if it is a directory or a file -
    does all the proper checking before calling the
    appropriate function, @ref processFile() on files,
    or @ref processDir() on directories.
    @param pathname location of a directory or a file
    */
    void processEntry(QString pathname);

    
 signals:
    /** @short emitted whenever a file is found
        @param filename an absolute path
    */
    void foundFile(QString filename);
 protected:
    /** @short override this to customize behavior
    
    The operation which is performed on each file
    (currently, it emits @ref foundFile() on each found file).
    
    @param filename (absolute or relative) path 
    of file to be processed.
    */
    virtual void processFile(QString filename); /* override this
    */

    //end
    /** @short @ref processEntry(QString) is a convenience function
        which calls this method.
    */
    void processEntry(QFileInfo finfo);
    /** @short Process a directory - calls processFile on each file in the directory
     */
    void processDir(QString pathname);
    /** @short Process a directory - calls processFile on each file in the directory.
     */
    void processDir(QDir& directory);
  
    /**@short override this method if you want to skip particular directories.
    
    @return true if dir == (CVS | . | ..)
    */
    virtual bool skipDir(const QDir& dir);
 public:
    /**
       @param nf  a unix glob-style wildcard for specifying
       filename filters. */
     
    void addNameFilter(QString nf);
  
    void setFilters(QStringList filters);
    
    void setRecursive(bool r) {
        m_Recursive = r;
    }
    
    void clearFilter() {
        m_filterList.clear();
    }
    
    /** @short helper Function for reading all lines from a file
        in one line */
    static QStringList readLines(QFile &f);
    /** @short helper function for reading all lines from a file
        in one line */
    static QStringList readLines(QString fn);
    /** expands ~ only, not ~username.
      @param path a location that may contain a ~ prefix.  
      @return an absolute path based on path.
      */
    static QString expandTilde(QString path);
    //start
 protected:
    QStringList m_filterList;
    bool m_Recursive;
    QDir::Filters m_DirFilter;
};
//end
#endif

