]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeHandlerImageAdder.cpp
ebfd2c594412a353fbcd025292497e1fa1168b3f
[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
52             /*
53             if (progress)
54               {
55                 std::string mess("Adding ");
56                 mess += *i;
57                 if (!progress->Update( (int)(summary.added_images*999./nbf),
58                                        std2wx(mess)))
59                   {
60                     // Some file was added hence we must return true !
61                     summary.cancelled_by_user = true;
62                     break;
63                   }
64               }
65             */
66           }
67         mProgressSignal(mProgress);
68       }
69   }
70   //=====================================================================
71
72   //=====================================================================
73   void TreeHandlerImageAdder::AddDirectory( const std::string& directory,
74                                             bool recurse)
75   {
76     mProgress.Reset();
77     AddDirectoryRecursor( directory, recurse );
78   }
79   //=====================================================================
80
81
82
83
84   //=====================================================================
85   void TreeHandlerImageAdder::AddFile( const std::string& filename )
86   {
87     
88     std::map< std::string, std::string>  attr;
89     mTreeHandler->GetTree().GetDescriptor().BuildAttributeMap(attr);
90
91     mReader.ReadAttributes(filename,attr);
92
93     int lev = mTreeHandler->AddBranch(attr);
94
95     // update the progress according to lev
96     if (lev<mTreeHandler->GetTree().GetNumberOfLevels())
97       mProgress.IncNumberAddedFiles();
98   }
99   //=====================================================================
100
101   //=====================================================================
102   void TreeHandlerImageAdder::AddDirectoryRecursor(const std::string &dirpath, 
103                                                    bool recursive)
104   {
105     //    std::cout << "dir : "<<dirpath << std::endl;
106    mProgress.IncNumberScannedDirs();
107     /*
108     if (progress) 
109       {
110         std::string mess("Parsing ");
111         mess += dirpath;
112         progress->Pulse(std2wx(mess));
113       }
114     */    
115     std::string fileName;
116     std::string dirName = dirpath;
117
118     wxDir dir( std2wx(dirpath) );
119
120     if ( !dir.IsOpened() )
121       {
122         // deal with the error here - wxDir would already log an error message
123         // explaining the exact reason of the failure
124         return;
125       }
126
127     wxString filename;
128
129     bool cont = dir.GetFirst(&filename, wxEmptyString, 
130                              wxDIR_FILES | wxDIR_HIDDEN );
131     while ( cont )
132       {
133         mProgress.IncNumberScannedFiles();
134
135         wxFileName wxffn(dir.GetName(),filename);
136         std::string ffn = wx2std(wxffn.GetFullPath());
137         //      std::cout << "file : "<<ffn << std::endl;
138         if (IsHandledFile(ffn)) 
139           {
140             mProgress.IncNumberHandledFiles();
141             //      std::cout << "handled : "<<ffn << std::endl;
142             AddFile( ffn );
143           }
144         //      std::cout << "signal " << std::endl;
145         mProgressSignal(mProgress);
146         //      std::cout << "cont " << std::endl;
147         cont = ( dir.GetNext(&filename) && (!mProgress.GetStop()) );
148         //      std::cout << "next" << std::endl;
149       }
150     
151     // Recurse into subdirs
152     if ( recursive )
153       {
154         //      std::cout << "recurse " << std::endl;
155         cont = dir.GetFirst(&filename, wxEmptyString, 
156                             wxDIR_DIRS | wxDIR_HIDDEN );
157         while ( cont )
158           {
159             wxFileName wxffn(dir.GetName(),filename);
160             std::string ffn = wx2std(wxffn.GetFullPath());
161             //      std::cout << "goto "<<ffn << std::endl;
162             AddDirectoryRecursor( ffn, recursive);
163             cont = dir.GetNext(&filename);
164           }
165       }
166     
167   }
168   //=======================================================================
169
170
171  
172 }