]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
update SalomeApprc with SALOME_APPLICATION_DIR
authorDUC ANH HOANG <dh77501n@dsp1043837>
Wed, 19 Jul 2023 23:47:52 +0000 (01:47 +0200)
committerDUC ANH HOANG <dh77501n@dsp1043837>
Wed, 19 Jul 2023 23:47:52 +0000 (01:47 +0200)
15 files changed:
CMakeLists.txt
src/CMakeLists.txt
src/LightApp/CMakeLists.txt
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/SalomeApprc_tool/.vscode/settings.json [deleted file]
src/SalomeApprc_tool/CMakeLists.txt [deleted file]
src/SalomeApprc_tool/SalomeApprc_tool.cxx [deleted file]
src/SalomeApprc_tool/SalomeApprc_utils.cxx [deleted file]
src/SalomeApprc_tool/SalomeApprc_utils.h [deleted file]
src/SalomeApprc_utils/.vscode/settings.json [new file with mode: 0644]
src/SalomeApprc_utils/CMakeLists.txt [new file with mode: 0644]
src/SalomeApprc_utils/SalomeApprc_tool.cxx [new file with mode: 0644]
src/SalomeApprc_utils/SalomeApprc_utils.cxx [new file with mode: 0644]
src/SalomeApprc_utils/SalomeApprc_utils.h [new file with mode: 0644]

index b9b4a03f1aff153360372f267e635a16d40ecebe..1077203a56e63ffc187cb71081334fbb2e547aea 100644 (file)
@@ -323,6 +323,7 @@ SET(_${PROJECT_NAME}_exposed_targets
     CAM CASCatch DDS Event LightApp LogWindow ObjBrowser
     QDS qtx SalomePrs SalomeStyle std SUITApp suit ViewerTools ViewerData
     ImageComposer
+    SalomeApprc_utils
 )
 
 IF(SALOME_USE_OCCVIEWER OR SALOME_USE_VTKVIEWER OR SALOME_USE_GLVIEWER)
index f5f7684947292e69005690d34927556bd25b009c..0e9f2cef6cc4d8da8bc213d5fb12e0783e3e7a11 100644 (file)
@@ -41,6 +41,7 @@ ADD_SUBDIRECTORY(ViewerData)
 ADD_SUBDIRECTORY(ViewerTools)
 ADD_SUBDIRECTORY(ImageComposer)
 ADD_SUBDIRECTORY(GUI_PY)
+ADD_SUBDIRECTORY(SalomeApprc_utils)
 
 ##
 # SALOME object
index 1dd89a2e860907bedd11c295617ac53a1c4fe514..9f00d3949825d46b3e9e32f707dba50ef673dbfb 100644 (file)
@@ -38,6 +38,7 @@ INCLUDE_DIRECTORIES(
   ${PROJECT_SOURCE_DIR}/src/STD
   ${PROJECT_SOURCE_DIR}/src/SUIT
   ${PROJECT_SOURCE_DIR}/src/Style
+  ${PROJECT_SOURCE_DIR}/src/SalomeApprc_utils
 )
 IF(SALOME_USE_SALOMEOBJECT)
   INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/OBJECT)
@@ -100,7 +101,8 @@ SET(_link_LIBRARIES
   ${OpenCASCADE_FoundationClasses_LIBRARIES}
   ${QT_LIBRARIES}
   ${HDF5_LIBRARIES}
-  CASCatch qtx suit std SalomeStyle SalomePrs CAM LogWindow ObjBrowser Event
+  CASCatch qtx suit std SalomeStyle SalomePrs CAM LogWindow ObjBrowser Event 
+  SalomeApprc_utils
   ${KERNEL_SalomeHDFPersist} ${KERNEL_SALOMELocalTrace}
   ${GRAPHVIZ_LIBRARIES}
 )
index 9db7595f59944b654054ac75369d610f22d22480..44b057ce62f5e36e7faf5b818ff92559856538cd 100644 (file)
@@ -98,6 +98,7 @@
 #include <QtxMap.h>
 
 #include <LogWindow.h>
+#include <SalomeApprc_utils.h>
 
 #ifndef DISABLE_GLVIEWER
   #include <GLViewer_Viewer.h>
@@ -883,6 +884,8 @@ void LightApp_Application::customize()
   // b. here we add custom modules (manually added by the user)
   if ( HAS_SALOME_ON_DEMAND )
   {
+    // Update SalomeApprc.X.X.X with SALOME_APPLICATION_DIR
+    updateSalomeApprc();
     QStringList modList = resourceMgr()->stringValue( "launch", "user_modules" ).split( ";", QString::SkipEmptyParts );
     foreach ( QString aModule, modList )
       addUserModule(  aModule, resourceMgr()->stringValue( "user_modules", aModule ) );
@@ -893,6 +896,18 @@ void LightApp_Application::customize()
   }
 }
 
+void LightApp_Application::updateSalomeApprc()
+{
+    SUIT_ResourceMgr* resMgr = resourceMgr();
+    auto extRootDir = getenv(salomeAppDir);
+
+    QString salomemodules(getenv("SALOME_MODULES"));
+    if(salomemodules.isEmpty())
+        AddComponents_from_salomeappdir(  QDir(extRootDir), resMgr );
+    else
+        AddComponents_from_salomemodules(salomemodules, QDir(extRootDir), resMgr);
+}
+
 /*!On module activation action.*/
 void LightApp_Application::onModuleActivation( const QString& modTitle )
 {
index a45ef0c8b8c12980dd9616a90c0a514da45832ad..170c3b933c9c6181d75c461a870a8b1126251530 100644 (file)
@@ -337,6 +337,7 @@ private:
   QList<QToolBar*>                    findToolBars( const QStringList& names = QStringList() );
   void                                createHelpItems( const QString& );
   void                                removeHelpItems( const QString& );
+  void                                updateSalomeApprc();
 
   QByteArray                          processState(QByteArray& input,
                                                    const bool processWin,
diff --git a/src/SalomeApprc_tool/.vscode/settings.json b/src/SalomeApprc_tool/.vscode/settings.json
deleted file mode 100644 (file)
index 8ec2894..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-    "files.associations": {
-        "array": "cpp",
-        "atomic": "cpp",
-        "strstream": "cpp",
-        "*.tcc": "cpp",
-        "bitset": "cpp",
-        "cctype": "cpp",
-        "chrono": "cpp",
-        "clocale": "cpp",
-        "cmath": "cpp",
-        "complex": "cpp",
-        "cstdarg": "cpp",
-        "cstddef": "cpp",
-        "cstdint": "cpp",
-        "cstdio": "cpp",
-        "cstdlib": "cpp",
-        "cstring": "cpp",
-        "ctime": "cpp",
-        "cwchar": "cpp",
-        "cwctype": "cpp",
-        "deque": "cpp",
-        "list": "cpp",
-        "unordered_map": "cpp",
-        "vector": "cpp",
-        "exception": "cpp",
-        "algorithm": "cpp",
-        "functional": "cpp",
-        "iterator": "cpp",
-        "map": "cpp",
-        "memory": "cpp",
-        "memory_resource": "cpp",
-        "numeric": "cpp",
-        "optional": "cpp",
-        "random": "cpp",
-        "ratio": "cpp",
-        "set": "cpp",
-        "string": "cpp",
-        "string_view": "cpp",
-        "system_error": "cpp",
-        "tuple": "cpp",
-        "type_traits": "cpp",
-        "utility": "cpp",
-        "fstream": "cpp",
-        "initializer_list": "cpp",
-        "iomanip": "cpp",
-        "iosfwd": "cpp",
-        "iostream": "cpp",
-        "istream": "cpp",
-        "limits": "cpp",
-        "new": "cpp",
-        "ostream": "cpp",
-        "sstream": "cpp",
-        "stdexcept": "cpp",
-        "streambuf": "cpp",
-        "thread": "cpp",
-        "cfenv": "cpp",
-        "cinttypes": "cpp",
-        "typeindex": "cpp",
-        "typeinfo": "cpp"
-    }
-}
\ No newline at end of file
diff --git a/src/SalomeApprc_tool/CMakeLists.txt b/src/SalomeApprc_tool/CMakeLists.txt
deleted file mode 100644 (file)
index cde321b..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (C) 2012-2022  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-#
-# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-#
-
-# Common CMake macros
-# ===================
-SET(CONFIGURATION_ROOT_DIR $ENV{CONFIGURATION_ROOT_DIR} CACHE PATH "Path to the Salome CMake configuration files")
-IF(EXISTS ${CONFIGURATION_ROOT_DIR})
-  LIST(APPEND CMAKE_MODULE_PATH "${CONFIGURATION_ROOT_DIR}/cmake")
-  INCLUDE(SalomeMacros NO_POLICY_SCOPE)
-ELSE()
-  MESSAGE(FATAL_ERROR "We absolutely need the Salome CMake configuration files, please define CONFIGURATION_ROOT_DIR !")
-ENDIF()
-
-SET(GUI_ROOT_DIR $ENV{GUI_ROOT_DIR} CACHE PATH "Path to the Salome CMake GUI files")
-IF(EXISTS ${GUI_ROOT_DIR})
-  SET(GUI_INCLUDE_DIRS ${GUI_ROOT_DIR}/include/salome)
-  LINK_DIRECTORIES(${GUI_ROOT_DIR}/lib/salome)
-ELSE()
-  MESSAGE(FATAL_ERROR "We absolutely need the GUI installation, please define GUI_ROOT_DIR !")
-ENDIF()
-
-FIND_PACKAGE(SalomeQt5)
-
-# additional include directories
-INCLUDE_DIRECTORIES(
-  ${QT_INCLUDES}
-  ${PYTHON_INCLUDE_DIRS}
-  ${GUI_INCLUDE_DIRS}
-)
-# additional preprocessor / compiler flags
-ADD_DEFINITIONS(${QT_DEFINITIONS} ${PYTHON_DEFINITIONS})
-
-# libraries to link to
-SET(_link_LIBRARIES ${QT_LIBRARIES} ${PYTHON_LIBRARIES} qtx suit)
-
-## --- headers ---
-#
-# header files / to be processed by moc
-SET(_moc_HEADERS   
-  SalomeApprc_utils.h
-)
-#
-# header files / to install
-SET(SalomeApprc_tool_HEADERS ${_moc_HEADERS})
-
-# sources / moc wrappings
-QT5_WRAP_CPP(_moc_SOURCES SalomeApprc_tool.cxx SalomeApprc_utils.cxx)
-
-# --- rules ---
-
-ADD_EXECUTABLE(SalomeApprc_tool SalomeApprc_tool.cxx SalomeApprc_utils.cxx)
-TARGET_LINK_LIBRARIES(SalomeApprc_tool ${_link_LIBRARIES})
-INSTALL(TARGETS SalomeApprc_tool DESTINATION bin)
-
diff --git a/src/SalomeApprc_tool/SalomeApprc_tool.cxx b/src/SalomeApprc_tool/SalomeApprc_tool.cxx
deleted file mode 100644 (file)
index 18e7992..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "SalomeApprc_utils.h"
-
-QDir salomeappdir(getenv("SALOME_APPLICATION_DIR"));
-SUIT_ResourceMgr ResMgr("SalomeApp");
-
-int main(int argc, char** argv)
-{
-    QString salome_version;
-    if (QString::compare(salomeappdir.dirName(), ".") == 0)
-    {
-        qWarning() << "SALOME_APPLICATION_DIR must not be empty!!";
-        return 1;
-    }
-    if (argc >2)
-    {
-        qWarning() << "Too many arguments!! This function accept only one arg for the version name";
-        return 1;
-    }
-    else if (argc < 2)
-    {
-        qInfo() << "Enter the salome version:";
-        bool ok_input = false;
-        while(!ok_input)
-        {
-            QTextStream in (stdin);
-            salome_version = in.readLine();
-            if (!salome_version.contains(" "))
-                ok_input = true;
-            else
-                qWarning() << "The version string must not contain a blank space. Please re-enter the salome version"; 
-        }
-    }
-    else
-    {
-        salome_version = (QString)argv[1];
-    }
-
-    QApplication app(argc, argv);
-    app.setOrganizationName("salome");
-    ResMgr.setVersion(salome_version);
-    
-    QString salomemodules(getenv("SALOME_MODULES"));
-    if(salomemodules.isEmpty())
-        AddComponents_from_salomeappdir();
-    else
-        AddComponents_from_salomemodules(salomemodules);
-    ResMgr.setCurrentFormat("xml");
-    ResMgr.save();
-    return 0;
-}
diff --git a/src/SalomeApprc_tool/SalomeApprc_utils.cxx b/src/SalomeApprc_tool/SalomeApprc_utils.cxx
deleted file mode 100644 (file)
index b481eca..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-#include "SalomeApprc_utils.h"
-
-QString getenv(const QString & envVar)
-{
-       QString value;
-#ifndef WIN32
-       value = qgetenv(envVar.toLocal8Bit().constData());
-#else
-       LPTSTR buff = new TCHAR[MAX_VALUE_SIZE];
-#ifdef UNICODE
-       LPTSTR anEnvVar = new TCHAR[envVar.length() + 1];       
-       anEnvVar[envVar.toWCharArray(anEnvVar)] = '\0';
-#else
-       const TCHAR* anEnvVar = envVar.toLocal8Bit(buff).constData();
-#endif 
-       const DWORD ret = GetEnvironmentVariable(anEnvVar, buff, MAX_VALUE_SIZE);
-       buff[ret] = '\0';
-       if (ret > 0) {
-#ifdef UNICODE
-               value = QString::fromWCharArray(buff);
-#else
-               value = QString::fromLocal8Bit(buff);
-#endif 
-       }
-       delete buff;
-#ifdef UNICODE
-       delete anEnvVar;
-#endif
-#endif
-       return value;
-}
-
-void AddComponents_from_salomeappdir()
-{
-       QFileInfoList salomexd_list = salomeappdir.entryInfoList(QStringList() << "*.salomexd",QDir::Files);
-
-    foreach(QFileInfo filename, salomexd_list)
-    {
-        QFile file( filename.filePath() );
-        if ( !file.open( QFile::ReadOnly ) )
-        {
-            qWarning() << "file " << filename.fileName() << " is not accessible";
-            continue;
-        }
-
-        QJsonDocument document = QJsonDocument::fromJson( file.readAll() );
-        if ( document.isNull() )
-        {
-            qWarning() << "invalid json file. Filename: " << filename.fileName();
-            continue;
-        }
-        QJsonObject root = document.object();
-        QJsonValue components = root.value( "components");
-        AddComponents_from_extmodule(components);
-    }
-}
-
-void AddComponents_from_extmodule(const QJsonValue & components )
-{
-       QString root(salomeappdir.path() + "/__SALOME_EXT__");
-       if ( components.isArray() )
-    {
-       foreach ( auto comp, components.toArray())
-          {
-                  AddGuiComponent(comp.toString(), root);
-          }
-    }
-    else
-    {
-               QJsonObject compObj = components.toObject();
-               foreach ( QString key, compObj.keys() )
-        {
-                       if ( QString::compare(key, ITERACTIVE_EXTCOMPONENT_KEY) == 0 )
-                       {
-                               foreach (auto comp, compObj.value(key).toArray() )
-                                       AddGuiComponent(comp.toString(), root);
-                       }
-               }
-    }
-}
-
-void AddComponents_from_salomemodules(const QString & salomemodules)
-{
-       QRegularExpression sep(":|,");
-       QStringList components_list = salomemodules.split(sep,QString::SkipEmptyParts);
-       foreach (QString comp, components_list)
-       {
-               QString comp_root_dir = getenv(comp + "_ROOT_DIR");
-
-               qWarning() << comp;
-               qWarning() << comp_root_dir;
-               if (comp_root_dir.isEmpty())
-                       comp_root_dir = salomeappdir.path() + "/__SALOME_EXT__";
-               AddGuiComponent(comp, comp_root_dir);
-       }
-
-
-}
-void AddGuiComponent(const QString& comp, const QString& CompRoot)
-{
-       QStringList CompsResMgr = ResMgr.stringValue("launch", "user_modules").split(";", QString::SkipEmptyParts);
-       if (!CompsResMgr.contains(comp))
-       {
-       ResMgr.setValue( "user_modules", comp, CompRoot );
-       }
-
-       CompsResMgr << comp;
-       CompsResMgr.removeDuplicates();
-    ResMgr.setValue( "launch", "user_modules", CompsResMgr.join( ";" ) );
-}
\ No newline at end of file
diff --git a/src/SalomeApprc_tool/SalomeApprc_utils.h b/src/SalomeApprc_tool/SalomeApprc_utils.h
deleted file mode 100644 (file)
index 9970af3..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <QtCore>
-#include <QApplication>
-#include <QDir>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <SUIT_ResourceMgr.h>
-
-#include <iostream>
-
-extern QDir salomeappdir;
-const QString ITERACTIVE_EXTCOMPONENT_KEY("salome_interactive");
-extern SUIT_ResourceMgr ResMgr;
-
-QString getenv(const QString & envVar);
-void AddComponents_from_extmodule (const QJsonValue & components );
-void AddComponents_from_salomeappdir();
-void AddComponents_from_salomemodules(const QString & salomemodules);
-void AddGuiComponent(const QString& comp, const QString& CompRoot);
diff --git a/src/SalomeApprc_utils/.vscode/settings.json b/src/SalomeApprc_utils/.vscode/settings.json
new file mode 100644 (file)
index 0000000..8ec2894
--- /dev/null
@@ -0,0 +1,62 @@
+{
+    "files.associations": {
+        "array": "cpp",
+        "atomic": "cpp",
+        "strstream": "cpp",
+        "*.tcc": "cpp",
+        "bitset": "cpp",
+        "cctype": "cpp",
+        "chrono": "cpp",
+        "clocale": "cpp",
+        "cmath": "cpp",
+        "complex": "cpp",
+        "cstdarg": "cpp",
+        "cstddef": "cpp",
+        "cstdint": "cpp",
+        "cstdio": "cpp",
+        "cstdlib": "cpp",
+        "cstring": "cpp",
+        "ctime": "cpp",
+        "cwchar": "cpp",
+        "cwctype": "cpp",
+        "deque": "cpp",
+        "list": "cpp",
+        "unordered_map": "cpp",
+        "vector": "cpp",
+        "exception": "cpp",
+        "algorithm": "cpp",
+        "functional": "cpp",
+        "iterator": "cpp",
+        "map": "cpp",
+        "memory": "cpp",
+        "memory_resource": "cpp",
+        "numeric": "cpp",
+        "optional": "cpp",
+        "random": "cpp",
+        "ratio": "cpp",
+        "set": "cpp",
+        "string": "cpp",
+        "string_view": "cpp",
+        "system_error": "cpp",
+        "tuple": "cpp",
+        "type_traits": "cpp",
+        "utility": "cpp",
+        "fstream": "cpp",
+        "initializer_list": "cpp",
+        "iomanip": "cpp",
+        "iosfwd": "cpp",
+        "iostream": "cpp",
+        "istream": "cpp",
+        "limits": "cpp",
+        "new": "cpp",
+        "ostream": "cpp",
+        "sstream": "cpp",
+        "stdexcept": "cpp",
+        "streambuf": "cpp",
+        "thread": "cpp",
+        "cfenv": "cpp",
+        "cinttypes": "cpp",
+        "typeindex": "cpp",
+        "typeinfo": "cpp"
+    }
+}
\ No newline at end of file
diff --git a/src/SalomeApprc_utils/CMakeLists.txt b/src/SalomeApprc_utils/CMakeLists.txt
new file mode 100644 (file)
index 0000000..a3cb300
--- /dev/null
@@ -0,0 +1,65 @@
+# Copyright (C) 2012-2022  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+# Common CMake macros
+# ===================
+SET(CONFIGURATION_ROOT_DIR $ENV{CONFIGURATION_ROOT_DIR} CACHE PATH "Path to the Salome CMake configuration files")
+IF(EXISTS ${CONFIGURATION_ROOT_DIR})
+  LIST(APPEND CMAKE_MODULE_PATH "${CONFIGURATION_ROOT_DIR}/cmake")
+  INCLUDE(SalomeMacros NO_POLICY_SCOPE)
+ELSE()
+  MESSAGE(FATAL_ERROR "We absolutely need the Salome CMake configuration files, please define CONFIGURATION_ROOT_DIR !")
+ENDIF()
+
+FIND_PACKAGE(SalomeQt5)
+
+# additional include directories
+INCLUDE_DIRECTORIES(
+  ${QT_INCLUDES}
+  ${PROJECT_SOURCE_DIR}/src/Qtx
+  ${PROJECT_SOURCE_DIR}/src/SUIT
+)
+# additional preprocessor / compiler flags
+ADD_DEFINITIONS(${QT_DEFINITIONS} ${PYTHON_DEFINITIONS})
+
+# libraries to link to
+SET(_link_LIBRARIES ${QT_LIBRARIES} qtx suit)
+
+## --- headers ---
+#
+# header files / to be processed by moc
+SET(_moc_HEADERS   
+  SalomeApprc_utils.h
+)
+#
+# header files / to install
+SET(SalomeApprc_utils_HEADERS ${_moc_HEADERS})
+
+# sources / moc wrappings
+QT5_WRAP_CPP(_moc_SOURCES SalomeApprc_utils.cxx)
+
+# --- rules ---
+
+ADD_LIBRARY(SalomeApprc_utils SalomeApprc_utils.cxx)
+
+TARGET_LINK_LIBRARIES(SalomeApprc_utils ${_link_LIBRARIES})
+INSTALL(TARGETS SalomeApprc_utils EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS})
+#INSTALL(TARGETS suit EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS})
+
+INSTALL(FILES ${SalomeApprc_utils_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS})
diff --git a/src/SalomeApprc_utils/SalomeApprc_tool.cxx b/src/SalomeApprc_utils/SalomeApprc_tool.cxx
new file mode 100644 (file)
index 0000000..18e7992
--- /dev/null
@@ -0,0 +1,50 @@
+#include "SalomeApprc_utils.h"
+
+QDir salomeappdir(getenv("SALOME_APPLICATION_DIR"));
+SUIT_ResourceMgr ResMgr("SalomeApp");
+
+int main(int argc, char** argv)
+{
+    QString salome_version;
+    if (QString::compare(salomeappdir.dirName(), ".") == 0)
+    {
+        qWarning() << "SALOME_APPLICATION_DIR must not be empty!!";
+        return 1;
+    }
+    if (argc >2)
+    {
+        qWarning() << "Too many arguments!! This function accept only one arg for the version name";
+        return 1;
+    }
+    else if (argc < 2)
+    {
+        qInfo() << "Enter the salome version:";
+        bool ok_input = false;
+        while(!ok_input)
+        {
+            QTextStream in (stdin);
+            salome_version = in.readLine();
+            if (!salome_version.contains(" "))
+                ok_input = true;
+            else
+                qWarning() << "The version string must not contain a blank space. Please re-enter the salome version"; 
+        }
+    }
+    else
+    {
+        salome_version = (QString)argv[1];
+    }
+
+    QApplication app(argc, argv);
+    app.setOrganizationName("salome");
+    ResMgr.setVersion(salome_version);
+    
+    QString salomemodules(getenv("SALOME_MODULES"));
+    if(salomemodules.isEmpty())
+        AddComponents_from_salomeappdir();
+    else
+        AddComponents_from_salomemodules(salomemodules);
+    ResMgr.setCurrentFormat("xml");
+    ResMgr.save();
+    return 0;
+}
diff --git a/src/SalomeApprc_utils/SalomeApprc_utils.cxx b/src/SalomeApprc_utils/SalomeApprc_utils.cxx
new file mode 100644 (file)
index 0000000..0b153aa
--- /dev/null
@@ -0,0 +1,77 @@
+#include "SalomeApprc_utils.h"
+
+void AddComponents_from_salomeappdir(const QDir& salomeappdir, SUIT_ResourceMgr* ResMgr)
+{
+       QFileInfoList salomexd_list = salomeappdir.entryInfoList(QStringList() << "*.salomexd",QDir::Files);
+       foreach(QFileInfo filename, salomexd_list)
+    {
+               QFile file( filename.filePath() );
+        if ( !file.open( QFile::ReadOnly ) )
+        {
+            qWarning() << "file " << filename.fileName() << " is not accessible";
+            continue;
+        }
+
+        QJsonDocument document = QJsonDocument::fromJson( file.readAll() );
+        if ( document.isNull() )
+        {
+            qWarning() << "invalid json file. Filename: " << filename.fileName();
+            continue;
+        }
+        QJsonObject salomexd_dict = document.object();
+        QJsonValue components = salomexd_dict.value( "components");
+
+               QString root(salomeappdir.path() + "/__SALOME_EXT__");
+               if ( components.isArray() )
+               {
+                       // In the case that we have a list of components. We consider that all of them are GUI module
+                       foreach ( auto comp, components.toArray())
+                       {
+                               AddGuiComponent(comp.toString(), root, ResMgr);
+                       }
+               }
+               else
+               {
+                       // In the case that we have a dict of several component group
+                       QJsonObject compObj = components.toObject();
+                       foreach ( QString key, compObj.keys() )
+                   {
+                               if ( QString::compare(key, ITERACTIVE_EXTCOMPONENT_KEY) == 0 )
+                               {
+                                       foreach (auto comp, compObj.value(key).toArray() )
+                                               AddGuiComponent(comp.toString(), root, ResMgr);
+                               }
+                       }
+               }
+    }
+}
+
+void AddComponents_from_salomemodules(const QString& salomemodules, const QDir& salomeappdir, SUIT_ResourceMgr* ResMgr)
+{
+       QRegularExpression sep(":|,");
+       QStringList components_list = salomemodules.split(sep,QString::SkipEmptyParts);
+       foreach (QString comp, components_list)
+       {
+               QString comp_root_dir = Qtx::getenv(comp + "_ROOT_DIR");
+
+               qWarning() << comp;
+               qWarning() << comp_root_dir;
+               if (comp_root_dir.isEmpty())
+                       comp_root_dir = salomeappdir.path() + "/__SALOME_EXT__";
+               AddGuiComponent(comp, comp_root_dir, ResMgr);
+       }
+
+
+}
+void AddGuiComponent(const QString& comp, const QString& CompRoot, SUIT_ResourceMgr* ResMgr)
+{
+       QStringList CompsResMgr = ResMgr->stringValue("launch", "user_modules").split(";", QString::SkipEmptyParts);
+       if (!CompsResMgr.contains(comp))
+       {
+               ResMgr->setValue( "user_modules", comp, CompRoot );
+       }
+
+       CompsResMgr << comp;
+       CompsResMgr.removeDuplicates();
+    ResMgr->setValue( "launch", "user_modules", CompsResMgr.join( ";" ) );
+}
\ No newline at end of file
diff --git a/src/SalomeApprc_utils/SalomeApprc_utils.h b/src/SalomeApprc_utils/SalomeApprc_utils.h
new file mode 100644 (file)
index 0000000..c1dbcd7
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef SALOMEAPPRC_UTILS_H
+#define SALOMEAPPRC_UTILS_H
+
+#include <QtCore>
+#include <QDir>
+#include <QJsonDocument>
+#include <QJsonObject>
+
+#include <Qtx.h>
+#include <SUIT_ResourceMgr.h>
+
+const QString ITERACTIVE_EXTCOMPONENT_KEY("salome_interactive");
+
+void AddComponents_from_salomeappdir(const QDir& salomeappdir, SUIT_ResourceMgr* ResMgr);
+void AddComponents_from_salomemodules(const QString& salomemodules, const QDir& salomeappdir, SUIT_ResourceMgr* ResMgr);
+void AddGuiComponent(const QString& comp, const QString& CompRoot, SUIT_ResourceMgr* ResMgr );
+
+#endif
\ No newline at end of file