]> Creatis software - crea.git/blobdiff - lib/creaDevManagerLib/modelCDMProject.cpp
Feature #1711 CreaDevManager application implementation
[crea.git] / lib / creaDevManagerLib / modelCDMProject.cpp
index dff1b63728b2fe054d5514cd4d4e9d430b717a06..886a3659c4854cf4163be399bfb3b9f5c4c8de36 100644 (file)
@@ -45,6 +45,7 @@
 #include "CDMUtilities.h"
 #include "creaWx.h"
 #include "wx/dir.h"
+#include <wx/config.h>
 
 modelCDMProject::modelCDMProject()
 {
@@ -169,17 +170,54 @@ modelCDMProject::modelCDMProject(
               this->lib = new modelCDMLib(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
               this->children.push_back(this->lib);
             }
-          //if package , create package
-          else if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG")
-            {
-              modelCDMPackage* package = new modelCDMPackage(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
-              this->packages.push_back(package);
-              this->children.push_back(package);
-            }
-          //if is an unknown folder, create folder
           else
             {
-              this->children.push_back(new modelCDMFolder(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1));
+              bool isPackage = false;
+
+              // check if cmakelists file exist in folder.
+              std::string tmppath = this->GetPath() + CDMUtilities::SLASH + stdfileName + CDMUtilities::SLASH + "CMakeLists.txt";
+              CDMUtilities::CMLFile CMfile = CDMUtilities::readCMLFile(tmppath.c_str());
+              if (CMfile.size() > 0)
+                {
+                  std::cout << "-->" << stdfileName << " ::has cmakelists" << std::endl;
+                  // check if cmakelists file has the SET(BBTK_PACKAGE_NAME [pkgname]) instruction.
+                  for (int i = 0; !isPackage && i < CMfile.size(); ++i) {
+                    if (CMfile[i].first == "command" && CMfile[i].second.size() > 1)
+                      {
+                        std::string cm = CMfile[i].second[0];
+
+                        int pos = 1;
+                        while(pos < CMfile[i].second.size()-1 && !isalpha(CMfile[i].second[pos][0]))
+                          pos++;
+
+                        std::string pm1 = CMfile[i].second[pos];
+
+                        std::cout << cm << " " << pm1 << std::endl;
+                        std::transform(cm.begin(), cm.end(), cm.begin(), ::toupper);
+                        std::transform(pm1.begin(), pm1.end(), pm1.begin(), ::toupper);
+                        if(cm == "SET" && pm1 == "BBTK_PACKAGE_NAME")
+                          {
+                            isPackage = true;
+                          }
+                      }
+                  }
+                }
+
+              // if package, create package
+              if(isPackage)
+                {
+                  std::cout << "is Package\n";
+                  modelCDMPackage* package = new modelCDMPackage(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
+                  std::cout << "Package created\n";
+                  this->packages.push_back(package);
+                  this->children.push_back(package);
+                }
+              // if is an unknown folder, create folder
+              else
+                {
+                  this->children.push_back(new modelCDMFolder(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1));
+                }
+
             }
 
           cont = dir.GetNext(&fileName);
@@ -189,6 +227,12 @@ modelCDMProject::modelCDMProject(
       while (cont)
         {
           std::string stdfileName = crea::wx2std(fileName);
+          std::size_t fileTypePos = stdfileName.find_last_of(".");
+          std::string fileType;
+          if(fileTypePos != std::string::npos)
+            fileType = stdfileName.substr(fileTypePos);
+          else
+            fileType = "";
 
           //if CMakeLists, create CMakeLists
           if(stdfileName == "CMakeLists.txt")
@@ -196,11 +240,23 @@ modelCDMProject::modelCDMProject(
               this->CMakeLists = new modelCDMCMakeListsFile(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
               this->children.push_back(this->CMakeLists);
             }
+          //if is a code file, create modelCDMCodeFile
+          else if(
+              fileType == ".c" ||
+              fileType == ".cxx" ||
+              fileType == ".h" ||
+              fileType == ".cpp" ||
+              fileType == ".txx" ||
+              fileType == ".cmake" )
+            {
+              this->children.push_back(new modelCDMCodeFile(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1));
+            }
+          //if is an unknown file, create file
           else
             {
               this->children.push_back(new modelCDMFile(this, pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1));
             }
-          //if is an unknown file, create file
+
           cont = dir.GetNext(&fileName);
         }
     }
@@ -251,7 +307,11 @@ modelCDMLib* modelCDMProject::GetLib() const
 
 std::string modelCDMProject::GetBuildInstruction() const
 {
-  std::string makeComm = "make -C \"" + this->buildPath + "\""; /*> \"" + this->buildPath + CDMUtilities::SLASH + "building.log\" 2>&1";*/
+  wxConfigBase* pConfig =  wxConfigBase::Get();
+  std::string commandline = crea::wx2std(pConfig->Read(wxT("BUILD_COMMAND"), crea::std2wx(CDMUtilities::BUILD_COMMAND)));
+
+
+  std::string makeComm = "cd \"" + this->buildPath + "\";" + commandline;// -C \"" + this->buildPath + "\""; /*> \"" + this->buildPath + CDMUtilities::SLASH + "building.log\" 2>&1";*/
   return makeComm;
 }
 
@@ -577,7 +637,7 @@ const bool modelCDMProject::Refresh(std::string*& result)
 
             }
           //if package , create package
-          else if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG")
+          /*else if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG")
             {
               bool found = false;
               for (int i = 0; !found && i < (int)(this->packages.size()); i++)
@@ -599,26 +659,85 @@ const bool modelCDMProject::Refresh(std::string*& result)
                   this->children.push_back(package);
                 }
 
-            }
-          //if is an unknown folder, create folder
+            }*/
+          // package or folder
           else
             {
-              bool found = false;
-              for (int i = 0; !found && i < (int)(this->children.size()); i++)
+              bool isPackage = false;
+
+              // check if cmakelists file exist in folder.
+              std::string tmppath = this->GetPath() + CDMUtilities::SLASH + stdfileName + CDMUtilities::SLASH + "CMakeLists.txt";
+              CDMUtilities::CMLFile CMfile = CDMUtilities::readCMLFile(tmppath.c_str());
+              if (CMfile.size() > 0)
+
                 {
-                  if (this->children[i]->GetName() == stdfileName)
+                  // check if cmakelists file has the SET(BBTK_PACKAGE_NAME [pkgname]) instruction.
+                  for (int i = 0; !isPackage && i < CMfile.size(); ++i) {
+                    if (CMfile[i].first == "command" && CMfile[i].second.size() > 1)
+                      {
+                        std::string cm = CMfile[i].second[0];
+
+                        int pos = 1;
+                        while(pos < CMfile[i].second.size()-1 && !isalpha(CMfile[i].second[pos][0]))
+                          pos++;
+
+                        std::string pm1 = CMfile[i].second[pos];
+
+                        std::cout << cm << " " << pm1 << std::endl;
+                        std::transform(cm.begin(), cm.end(), cm.begin(), ::toupper);
+                        std::transform(pm1.begin(), pm1.end(), pm1.begin(), ::toupper);
+                        if(cm == "SET" && pm1 == "BBTK_PACKAGE_NAME")
+                          {
+                            isPackage = true;
+                          }
+                      }
+                  }
+                }
+
+              // if package, create package
+              if (isPackage)
+                {
+                  bool found = false;
+                  for (int i = 0; !found && i < (int)(this->packages.size()); i++)
                     {
-                      found = true;
-                      checked[i] = true;
-                      if(!this->children[i]->Refresh(result))
-                        return false;
+                      if (this->packages[i]->GetName() == stdfileName)
+                        {
+                          found = true;
+                          int pos = std::find(this->children.begin(), this->children.end(), this->packages[i]) - this->children.begin();
+                          checked[pos] = true;
+                          checkedPackages[i] = true;
+                          if(!this->packages[i]->Refresh(result))
+                            return false;
+                        }
                     }
-                }
 
-              if(!found)
+                  if (!found)
+                    {
+                      modelCDMPackage* package = new modelCDMPackage(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
+                      this->packages.push_back(package);
+                      this->children.push_back(package);
+                    }
+                }
+              //if is an unknown folder, create folder
+              else
                 {
-                  modelCDMFolder* folder = new modelCDMFolder(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
-                  this->children.push_back(folder);
+                  bool found = false;
+                  for (int i = 0; !found && i < (int)(this->children.size()); i++)
+                    {
+                      if (this->children[i]->GetName() == stdfileName)
+                        {
+                          found = true;
+                          checked[i] = true;
+                          if(!this->children[i]->Refresh(result))
+                            return false;
+                        }
+                    }
+
+                  if(!found)
+                    {
+                      modelCDMFolder* folder = new modelCDMFolder(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
+                      this->children.push_back(folder);
+                    }
                 }
             }
 
@@ -629,6 +748,12 @@ const bool modelCDMProject::Refresh(std::string*& result)
       while (cont)
         {
           std::string stdfileName = crea::wx2std(fileName);
+          std::size_t fileTypePos = stdfileName.find_last_of(".");
+          std::string fileType;
+          if(fileTypePos != std::string::npos)
+            fileType = stdfileName.substr(fileTypePos);
+          else
+            fileType = "";
 
           //if CMakeLists, create CMakeLists
           if(stdfileName == "CMakeLists.txt")
@@ -646,6 +771,7 @@ const bool modelCDMProject::Refresh(std::string*& result)
                     return false;
                 }
             }
+          //if is a code file, create modelCDMCodeFile
           //if is an unknown file, create file
           else
             {
@@ -663,8 +789,21 @@ const bool modelCDMProject::Refresh(std::string*& result)
 
               if(!found)
                 {
-                  modelCDMFile* file = new modelCDMFile(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
-                  this->children.push_back(file);
+                  if(
+                    fileType == ".c" ||
+                    fileType == ".cxx" ||
+                    fileType == ".h" ||
+                    fileType == ".cpp" ||
+                    fileType == ".txx" ||
+                    fileType == ".cmake" )
+                    {
+                      this->children.push_back(new modelCDMCodeFile(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1));
+                    }
+                  else
+                    {
+                      modelCDMFile* file = new modelCDMFile(this, this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1);
+                      this->children.push_back(file);
+                    }
                 }
             }
 
@@ -1138,7 +1277,7 @@ std::map<std::string, bool> modelCDMProject::Get3rdPartyLibraries()
       boost::match_flag_type flags = boost::match_default;
       while(boost::regex_search(start, end, what, expression, flags))
         {
-          std::cout << what[0].str() << std::endl;
+          //std::cout << what[0].str() << std::endl;
           boost::regex expression1 = boost::regex("USE_\\w+");
           std::string::const_iterator start1, end1;
           start1 = what[0].first;
@@ -1148,7 +1287,7 @@ std::map<std::string, bool> modelCDMProject::Get3rdPartyLibraries()
             {
               std::string dete = what1.str();
               CDMUtilities::normalizeStr(dete);
-              std::cout << dete << std::endl;
+              //std::cout << dete << std::endl;
               if(correspondence.find(dete) != correspondence.end())
                 res[correspondence[dete]] = true;
             }