]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeHandlerImageAdder.h
Added Timestamp database to avoid repetition of files on addition.
[creaImageIO.git] / src2 / creaImageIOTreeHandlerImageAdder.h
1 #ifndef __creaImageIOTreeHandlerImageAdder_h_INCLUDED__
2 #define __creaImageIOTreeHandlerImageAdder_h_INCLUDED__
3
4 #include <creaImageIOTreeHandler.h>
5 #include <creaImageIOTimestampDatabaseHandler.h>
6 #include <creaImageIOImageReader.h>
7 #include <wx/wx.h>
8 #include <wx/progdlg.h>
9 // Signal/slot mechanism for progress events
10 #include <boost/signal.hpp>
11 #include <boost/bind.hpp>
12
13
14 namespace creaImageIO
15 {
16         /**
17         * \ingroup Model
18         */
19
20   //=======================================================================
21   /// Object which can add images files to a TreeHandler. Is able to parse (recursively) a part of a filesystem to look for known images and load their attributes in order to add the images to a Tree (submission via a TreeHandler::AddBranch)
22
23   class TreeHandlerImageAdder
24   {
25   public:
26     //====================================================================
27     /// Ctor
28     TreeHandlerImageAdder(TreeHandler* tree);
29     /// Dtor
30     ~TreeHandlerImageAdder();
31     /// Sets the TreeHandler
32     void SetTreeHandler(TreeHandler* tree) { mTreeHandler = tree;}
33         /// Sets the TimestampDatabaseHandler
34     void SetTimestampHandler(TimestampDatabaseHandler* tdh) { mTimestampHandler = tdh;}
35     //====================================================================
36
37     //====================================================================
38     /// Structure which holds progress information
39     /// To stop the image adder use SetStop()
40     class Progress
41     {
42     public:
43       Progress() { Reset(); }
44       ~Progress() {}
45       
46       void Reset() 
47       {
48         mStop = false;
49         mNumberScannedFiles = 0;
50         mNumberScannedDirs = 0;
51         mNumberHandledFiles = 0;
52         mNumberAddedFiles = 0;
53       }
54
55       int GetNumberScannedFiles() const { return mNumberScannedFiles; }
56       int GetNumberScannedDirs() const { return mNumberScannedDirs; }
57       int GetNumberHandledFiles() const { return mNumberHandledFiles; }
58       int GetNumberAddedFiles() const { return mNumberAddedFiles; }
59
60       void IncNumberScannedFiles() { mNumberScannedFiles++; }
61       void IncNumberScannedDirs() { mNumberScannedDirs++; }
62       void IncNumberHandledFiles() { mNumberHandledFiles++; }
63       void IncNumberAddedFiles() { mNumberAddedFiles++; }
64
65       void SetStop() { mStop = true; }
66       bool GetStop() const { return mStop; }
67
68     private:
69       bool mStop;
70       int mNumberScannedFiles;
71       int mNumberScannedDirs;
72       int mNumberHandledFiles;
73       int mNumberAddedFiles;
74     };
75     //=============================================
76
77     //=============================================
78     const Progress& GetProgress() const { return mProgress; }
79     //=============================================
80
81     //=============================================
82     typedef boost::signal<void (Progress&)>  ProgressSignalType;
83     typedef ProgressSignalType::slot_function_type ProgressCallbackType;
84     //=============================================
85
86    //==================================================================
87     /// Adds the function f to the list of functions to call 
88     /// when the addition progresses.
89     /// f is of type ProgressCallbackType which is:
90     /// void (*ProgressCallbackType)(Progress&)
91     /// To pass a member function 'f' of an instance 'c' of a class 'C' 
92     /// as callback you have to 'bind' it, i.e. call:
93     /// ConnectProgressObserver ( boost::bind( &C::f , c, _1 ) );
94     void ConnectProgressObserver(ProgressCallbackType callback);
95    //==================================================================
96
97     //====================================================================
98     /// Returns if the file can be read or not
99     bool IsHandledFile( const std::string& filename);
100     /// Adds a list of files to the TreeHandler 
101     void AddFiles( const std::vector<std::string>& filename );
102     /// (Recursively) adds the files of a directory to the TreeHandler 
103     void AddDirectory( const std::string& directory, 
104                        bool recurse );
105     //====================================================================
106
107   private:
108
109     /// Adds a single file to the TreeHandler 
110     /// **WITHOUT** testing wether it is handled or not 
111     /// hence you have to call IsHandledFile before using AddFile!
112     void AddFile( const std::string& filename );
113
114     /// Recursive method which does the main job for AddDirectory
115     void AddDirectoryRecursor( const std::string& directory, 
116                                bool recurse );
117
118     TreeHandler* mTreeHandler;
119         TimestampDatabaseHandler* mTimestampHandler;
120     ImageReader mReader;
121     
122     Progress mProgress;
123     ProgressSignalType mProgressSignal;
124
125
126   };
127   // EO class TreeHandlerImageAdder
128   //=======================================================================
129
130
131  
132
133
134 } // EO namespace creaImageIO
135
136 #include <iostream>
137 inline std::ostream& operator << ( std::ostream& o, 
138                             const creaImageIO::TreeHandlerImageAdder::Progress& p)
139 {
140   o << p.GetNumberScannedFiles() << " files - "
141     << p.GetNumberScannedDirs() << " dirs - "
142     << p.GetNumberHandledFiles() << " handled -"
143     << p.GetNumberAddedFiles() << " added";
144   return o;
145 }
146
147 // EOF
148 #endif  
149