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