]> Creatis software - crea.git/commitdiff
Feature #1711 CreaDevManager application implementation
authorDaniel Gonzalez <daniel.gonzalez@creatis.insa-lyon.fr>
Thu, 18 Apr 2013 15:14:40 +0000 (17:14 +0200)
committerDaniel Gonzalez <daniel.gonzalez@creatis.insa-lyon.fr>
Thu, 18 Apr 2013 15:14:40 +0000 (17:14 +0200)
Feature: Now including/excluding custom libraries in libraries using Regular Expressions.

lib/creaDevManagerLib/modelCDMLibrary.cpp
lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.cpp

index 611aaa0c2a92dda2e83825063d4f465ca6f4926e..03c3e45062c29a0c98ff88ecb3b4de1ec41395a3 100644 (file)
@@ -664,7 +664,7 @@ std::map<std::string, bool> modelCDMLibrary::GetCustomLibraries()
 
       //find included folders
       //std::cout << "searching..." << std::endl;
-      expression = boost::regex("^\\h*INCLUDE_DIRECTORIES([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*([\\./\\$\\{\\}\\w\\d]+|\"(?:[^\"\\\\]|\\\\.)*\")(([\\s]|#[^\\n]*\\n)+([\\$\\{\\}\\w\\d]+|\"(?:[^\"\\\\]|\\\\.)*\"))*([\\s]|#[^\\n]*\\n)*\\)");
+      expression = boost::regex("^\\h*INCLUDE_DIRECTORIES([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*([\\./\\$\\{\\}\\w\\d]+|\"(?:[^\"\\\\]|\\\\.)*\")??(([\\s]|#[^\\n]*\\n)+([\\./\\$\\{\\}\\w\\d]+|\"(?:[^\"\\\\]|\\\\.)*\"))*([\\s]|#[^\\n]*\\n)*\\)");
       start = CMfile.begin();
       end = CMfile.end();
       if(boost::regex_search(start, end, what, expression, flags))
@@ -702,5 +702,179 @@ std::map<std::string, bool> modelCDMLibrary::GetCustomLibraries()
 
 bool modelCDMLibrary::SetCustomLibrary(const std::string& library_name, const bool& toInclude)
 {
+  std::map<std::string, std::string> correspondence;
+  std::vector<modelCDMLibrary*> libraries = ((modelCDMLib*)this->parent)->GetLibraries();
+  for (int i = 0; i < libraries.size(); ++i)
+    {
+      if(libraries[i]->GetNameLibrary() == this->nameLibrary)
+        continue;
+      correspondence[libraries[i]->GetNameLibrary()] = libraries[i]->GetName();
+    }
+
+  if (correspondence.find(library_name) != correspondence.end())
+    {
+      if (this->HasCMakeLists())
+        {
+          std::string resCMfile = "";
+          std::string CMfile = CDMUtilities::readFile(this->CMakeLists->GetPath().c_str());
+          bool found = false;
+
+          //find included libraries
+          boost::regex expression("^\\h*SET([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*\\$\\{LIBRARY_NAME\\}_LINK_LIBRARIES(([\\s]|#[^\\n]*\\n)+([\\$\\{\\}\\w\\d]+|\"(?:[^\"\\\\]|\\\\.)*\"))*([\\s]|#[^\\n]*\\n)*\\)");
+          std::string::const_iterator start, end;
+          start = CMfile.begin();
+          end = CMfile.end();
+          boost::match_results<std::string::const_iterator> what;
+          boost::match_flag_type flags = boost::match_default;
+          if(boost::regex_search(start, end, what, expression, flags))
+            {
+              resCMfile += what.prefix().str();
+              expression = boost::regex("^\\h*SET([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*\\$\\{LIBRARY_NAME\\}_LINK_LIBRARIES");
+              std::string::const_iterator start1, end1;
+              start1 = what[0].first;
+              end1 = what[0].second;
+              boost::match_results<std::string::const_iterator> what1;
+              if(boost::regex_search(start1, end1, what1, expression, flags))
+                {
+                  resCMfile += what1.prefix().str() + what1.str();
+                  //check if already exists
+                  expression = boost::regex("^\\h*"+library_name);
+                  std::string::const_iterator start2, end2;
+                  start2 = what1[0].second;
+                  end2 = what[0].second;
+                  boost::match_results<std::string::const_iterator> what2, temp2;
+                  while(boost::regex_search(start2, end2, what2, expression, flags))
+                    {
+                      resCMfile += what2.prefix().str();
+                      found = true;
+                      if (!toInclude)
+                        {
+                          resCMfile += "#";
+                        }
+                      resCMfile += what2.str();
+                      temp2 = what2;
+                      start2 = what2[0].second;
+                    }
+                  if(found)
+                    resCMfile += temp2.suffix().str();
+                  //check if is commented
+                  else
+                    {
+                      expression = boost::regex("^\\h*#+\\h*"+library_name);
+                      start2 = what1[0].second;
+                      end2 = what[0].second;
+                      while(boost::regex_search(start2, end2, what2, expression, flags))
+                        {
+                          found = true;
+                          resCMfile += what2.prefix().str();
+                          if(toInclude)
+                            {
+                              std::string dete = what2[0].str();
+                              for (int i = 0; i < dete.size(); ++i) {
+                                if (dete[i] != '#')
+                                  resCMfile.push_back(dete[i]);
+                              }
+                            }
+                          temp2 = what2;
+                          start2 = what2[0].second;
+                        }
+                      if(found)
+                        resCMfile += temp2.suffix().str();
+                      //add at the beggining of instruction
+                      else
+                        {
+                          if(toInclude)
+                            resCMfile += "\n" + library_name;
+                          resCMfile += what1.suffix().str();
+                        }
+                    }
+                }
+              resCMfile += what.suffix().str();
+            }
+          else
+            return false;
+
+          //find included folders
+          CMfile = resCMfile;
+          resCMfile = "";
+
+
+          found = false;
+          std::cout << "searching..." << CMfile << std::endl;
+          expression = boost::regex("^\\h*INCLUDE_DIRECTORIES([\\s]|#[^\\n]*\\n)*\\(([\\s]|#[^\\n]*\\n)*([\\.\\/\\$\\{\\}\\w\\d]+|\"(?:[^\"\\\\]|\\\\.)*\")??(([\\s]|#[^\\n]*\\n)+([\\.\\/\\$\\{\\}\\w\\d]+|\"(?:[^\"\\\\]|\\\\.)*\"))*([\\s]|#[^\\n]*\\n)*\\)");
+          start = CMfile.begin();
+          end = CMfile.end();
+          if(boost::regex_search(start, end, what, expression, flags))
+            {
+              resCMfile += what.prefix().str();
+              std::cout << what.str() << std::endl;
+              expression = boost::regex("^\\h*INCLUDE_DIRECTORIES([\\s]|#[^\\n]*\\n)*\\(");
+              std::string::const_iterator start1, end1;
+              start1 = what[0].first;
+              end1 = what[0].second;
+              boost::match_results<std::string::const_iterator> what1;
+              if(boost::regex_search(start1, end1, what1, expression, flags))
+                {
+                  resCMfile += what1.prefix().str() + what1.str();
+                  std::cout << what1.str() << std::endl;
+                  //search if dir is already included
+                  expression = boost::regex("^\\h*\\.\\.\\/"+correspondence[library_name]);
+                  std::string::const_iterator start2, end2;
+                  start2 = what1[0].second;
+                  end2 = what[0].second;
+                  boost::match_results<std::string::const_iterator> what2, temp2;
+                  while(boost::regex_search(start2, end2, what2, expression, flags))
+                    {
+                      found = true;
+                      resCMfile += what2.prefix().str();
+                      if(!toInclude)
+                        resCMfile += "#";
+                      resCMfile += what2.str();
+                      temp2 = what2;
+                      start2 = what2[0].second;
+                    }
+                  if(found)
+                    resCMfile += temp2.suffix().str();
+                  //search if dir is commented
+                  else
+                    {
+                      expression = boost::regex("^\\h*#+\\h*\\.\\.\\/"+correspondence[library_name]);
+                      start2 = what1[0].second;
+                      end2 = what[0].second;
+                      while(boost::regex_search(start2, end2, what2, expression, flags))
+                        {
+                          found = true;
+                          resCMfile += what2.prefix().str();
+                          if(toInclude)
+                            {
+                              std::string dete = what2[0].str();
+                              for (int i = 0; i < dete.size(); ++i) {
+                                if (dete[i] != '#')
+                                  resCMfile.push_back(dete[i]);
+                              }
+                            }
+                          temp2 = what2;
+                          start2 = what2[0].second;
+                        }
+                      if(found)
+                        resCMfile += temp2.suffix().str();
+                      //add at the beggining of instruction
+                      else
+                        {
+                          if(toInclude)
+                            resCMfile += "\n../" + correspondence[library_name];
+                          resCMfile += what1.suffix().str();
+                        }
+                    }
+                }
+              resCMfile += what.suffix().str();
+            }
+          else
+            return false;
+
+          return CDMUtilities::writeFile(this->CMakeLists->GetPath().c_str(), resCMfile);
+        }
+    }
+
   return false;
 }
index fb756e9c2ad3ae45cdaf7db03894ea02bbcb65ba..d97d019ddb4e761c805586607978cea6cd0970ad 100644 (file)
@@ -359,7 +359,10 @@ void wxCDMLibraryDescriptionPanel::On3rdLibraryChBChange(wxCommandEvent& event)
 
 void wxCDMLibraryDescriptionPanel::OnLibraryChBChange(wxCommandEvent& event)
 {
-  this->library->SetCustomLibrary(crea::wx2std(((wxCheckBox*)event.GetEventObject())->GetName()), ((wxCheckBox*)event.GetEventObject())->GetValue());
+  if(this->library->SetCustomLibrary(crea::wx2std(((wxCheckBox*)event.GetEventObject())->GetName()), ((wxCheckBox*)event.GetEventObject())->GetValue()))
+      ((wxCheckBox*)event.GetEventObject())->SetValue(((wxCheckBox*)event.GetEventObject())->GetValue());
+    else
+      ((wxCheckBox*)event.GetEventObject())->SetValue(!((wxCheckBox*)event.GetEventObject())->GetValue());
 }
 
 void wxCDMLibraryDescriptionPanel::OnBtnCreateClass(wxCommandEvent& event)