]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeHandlerImageAdder.cpp
057f16eb51e994563a107e3d0f7bfd374c17ba37
[creaImageIO.git] / src2 / creaImageIOTreeHandlerImageAdder.cpp
1 #include <creaImageIOTreeHandlerImageAdder.h>
2 #include <creaWx.h>
3 #include <wx/dir.h>
4 #include <wx/filename.h>
5
6 using namespace crea;
7
8 namespace creaImageIO
9 {
10   //====================================================================
11   // Ctor
12   TreeHandlerImageAdder::TreeHandlerImageAdder(TreeHandler* tree)
13     : mTreeHandler(tree)
14   {
15   }
16   // Dtor
17   TreeHandlerImageAdder::~TreeHandlerImageAdder()
18   {
19   }
20   //====================================================================
21
22   //====================================================================
23   void TreeHandlerImageAdder::ConnectProgressObserver(ProgressCallbackType callback)
24   {
25     mProgressSignal.connect(callback);
26   }
27   //====================================================================
28
29   //=====================================================================
30   bool TreeHandlerImageAdder::IsHandledFile( const std::string& filename)
31   {
32     return (mReader.CanRead(filename));
33   }
34   //=====================================================================
35
36   //=====================================================================
37   void TreeHandlerImageAdder::AddFiles( const std::vector<std::string>& filenames)
38   {
39     mProgress.Reset();
40
41     unsigned int nbf = filenames.size(); 
42     std::vector<std::string>::const_iterator i;
43     for (i=filenames.begin();i!=filenames.end();++i)
44       {
45         mProgress.IncNumberScannedFiles();
46         if (IsHandledFile(*i)) 
47           {
48             mProgress.IncNumberHandledFiles();
49             AddFile(*i);
50           }
51         mProgressSignal(mProgress);
52         if (mProgress.GetStop()) break;
53       }
54   }
55   //=====================================================================
56
57   //=====================================================================
58   void TreeHandlerImageAdder::AddDirectory( const std::string& directory,
59                                             bool recurse)
60   {
61     mProgress.Reset();
62     AddDirectoryRecursor( directory, recurse );
63   }
64   //=====================================================================
65
66
67
68
69   //=====================================================================
70   void TreeHandlerImageAdder::AddFile( const std::string& filename )
71   {
72     
73     std::map< std::string, std::string>  attr;
74     mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
75
76     mReader.ReadAttributes(filename,attr);
77
78     int lev = mTreeHandler->AddBranch(attr);
79
80     // update the progress according to lev
81     if (lev<mTreeHandler->GetTree().GetNumberOfLevels())
82       mProgress.IncNumberAddedFiles();
83   }
84   //=====================================================================
85
86   //=====================================================================
87   void TreeHandlerImageAdder::AddDirectoryRecursor(const std::string &dirpath, 
88                                                    bool recursive)
89   {
90     mProgress.IncNumberScannedDirs();
91
92     std::string fileName;
93     std::string dirName = dirpath;
94
95     wxDir dir( std2wx(dirpath) );
96
97     if ( !dir.IsOpened() )
98       {
99         // deal with the error here - wxDir would already log an error message
100         // explaining the exact reason of the failure
101         return;
102       }
103
104     wxString filename;
105
106     bool cont = dir.GetFirst(&filename, wxEmptyString, 
107                              wxDIR_FILES | wxDIR_HIDDEN );
108     while ( cont )
109       {
110         mProgress.IncNumberScannedFiles();
111
112         wxFileName wxffn(dir.GetName(),filename);
113         std::string ffn = wx2std(wxffn.GetFullPath());
114         if (IsHandledFile(ffn)) 
115           {
116             mProgress.IncNumberHandledFiles();
117             AddFile( ffn );
118           }
119         mProgressSignal(mProgress);
120         cont = ( dir.GetNext(&filename) && (!mProgress.GetStop()) );
121       }
122     
123     // Recurse into subdirs
124     if ( recursive )
125       {
126         cont = dir.GetFirst(&filename, wxEmptyString, 
127                             wxDIR_DIRS | wxDIR_HIDDEN );
128         while ( cont )
129           {
130             wxFileName wxffn(dir.GetName(),filename);
131             std::string ffn = wx2std(wxffn.GetFullPath());
132             AddDirectoryRecursor( ffn, recursive);
133             cont = dir.GetNext(&filename);
134           }
135       }
136     
137   }
138   //=======================================================================
139
140
141  
142 }