Salome HOME
Merge branch 'V7_dev'
[modules/gui.git] / src / SUITApp / SUITApp.cxx
index 57098d0cc80cbc27b7c43862b7cd377d3e547350..979783334852ad305733f82479eb07a5278fa09e 100644 (file)
-// Copyright (C) 2005  OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D
-// 
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
 // 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.
-// 
-// 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 
+// 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 
+// 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/
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-#if defined WNT
 
-#undef SUIT_ENABLE_PYTHON
-//#else
-//#include "SUITconfig.h"
+//#ifdefined WIN32
+//#ifndef DISABLE_PYCONSOLE
+//#define DISABLE_PYCONSOLE
+//#endif
+//#else //#if defined WIN32
+//#ifdef DISABLE_PYCONSOLE
+// NOTE: DO NOT DELETE THIS DEFINITION ON LINUX
+// or make sure Python is initialized in main() in any case
+// Otherwise, application based on light SALOME and using Python 
+// are unlikely to work properly.
+//#undef DISABLE_PYCONSOLE
+//#include <Python.h>
+//#endif
+//
+#ifndef DISABLE_PYCONSOLE
+#include "SUITApp_init_python.hxx"
 #endif
 
+//#endif //#if defined WIN32
+
+#include "GUI_version.h"
 #include "SUITApp_Application.h"
+#include "SUIT_Desktop.h"
+#include "SUIT_LicenseDlg.h"
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+#ifdef USE_SALOME_STYLE
+#include "Style_Salome.h"
+#endif // USE_SALOME_STYLE
+#include "QtxSplash.h"
 
-#include <SUIT_Session.h>
-#include <SUIT_Desktop.h>
-#include <SUIT_ResourceMgr.h>
+#include <QDir>
+#include <QFile>
+#include <QLocale>
+#include <QRegExp>
+#include <QString>
+#include <QStringList>
 
-#include <QtxSplash.h>
+#include <stdlib.h>
 
-#ifdef SUIT_ENABLE_PYTHON
-#include <Python.h>
+#ifdef WIN32
+#include <UserEnv.h>
 #endif
 
-#include <qdir.h>
-#include <qfile.h>
-#include <qstring.h>
-#include <qstringlist.h>
-#include <qregexp.h>
-
-#include <stdlib.h>
-
-QString salomeVersion()
+static QString salomeVersion()
 {
-  QString path( ::getenv( "GUI_ROOT_DIR" ) );
-  if ( !path.isEmpty() )
-    path += QDir::separator();
-
-  path += QString( "bin/salome/VERSION" );
-
-  QFile vf( path );
-  if ( !vf.open( IO_ReadOnly ) )
-    return QString::null;
-
-  QString line;
-  vf.readLine( line, 1024 );
-  vf.close();
-
-  if ( line.isEmpty() )
-    return QString::null;
-
-  while ( !line.isEmpty() && line.at( line.length() - 1 ) == QChar( '\n' ) )
-    line.remove( line.length() - 1, 1 );
-
-  QString ver;
-  int idx = line.findRev( ":" );
-  if ( idx != -1 )
-    ver = line.mid( idx + 1 ).stripWhiteSpace();
-
-  return ver;
+  return GUI_VERSION_STR;
 }
 
+static QString getAppName( const QString& libName )
+{
+  QString appName = QFileInfo( libName ).baseName();
+  if ( appName.startsWith( "lib" ) ) appName = appName.mid( 3 );
+  return appName;
+}
 
-/* XPM */
-static const char* pixmap_not_found_xpm[] = {
-"16 16 3 1",
-"       c None",
-".      c #000000",
-"+      c #A80000",
-"                ",
-"                ",
-"    .     .     ",
-"   .+.   .+.    ",
-"  .+++. .+++.   ",
-"   .+++.+++.    ",
-"    .+++++.     ",
-"     .+++.      ",
-"    .+++++.     ",
-"   .+++.+++.    ",
-"  .+++. .+++.   ",
-"   .+.   .+.    ",
-"    .     .     ",
-"                ",
-"                ",
-"                "};
+// static void MessageOutput( QtMsgType type, const char* msg )
+// {
+//   switch ( type )
+//   {
+//   case QtDebugMsg:
+// #ifdef _DEBUG_
+//     printf( "Debug: %s\n", msg );
+// #endif
+//     break;
+//   case QtWarningMsg:
+// #ifdef _DEBUG_
+//     printf( "Warning: %s\n", msg );
+// #endif
+//     break;
+//   case QtFatalMsg:
+// #ifdef _DEBUG_
+//     printf( "Fatal: %s\n", msg );
+// #endif
+//     break;
+//   default:
+//     break;
+//   }
+// }
 
 class SUITApp_Session: public SUIT_Session
 {
 public:
-  SUITApp_Session( bool theIniFormat ) : SUIT_Session(), myIniFormat ( theIniFormat ) {}
+  SUITApp_Session( bool theIniFormat, int argc, char** argv ) : SUIT_Session( argc, argv ), myIniFormat ( theIniFormat ) {}
   virtual ~SUITApp_Session() {}
 
   virtual SUIT_ResourceMgr* createResourceMgr( const QString& appName ) const
@@ -108,7 +111,7 @@ public:
     SUIT_ResourceMgr* resMgr = 0;
     if ( myIniFormat )
     {
-      resMgr = new SUIT_ResourceMgr( appName );
+      resMgr = new SUIT_ResourceMgr( appName, QString( "%1Config" ) );
       resMgr->setCurrentFormat( "ini" );
     }
     else
@@ -120,8 +123,6 @@ public:
 
     if ( resMgr )
     {
-      static QPixmap defaultPixmap( pixmap_not_found_xpm );
-      resMgr->setDefaultPixmap( defaultPixmap );
       resMgr->setOption( "translators", QString( "%P_msg_%L.qm|%P_icons.qm|%P_images.qm" ) );
     }
     return resMgr;
@@ -131,18 +132,26 @@ private:
   bool  myIniFormat;
 };
 
-int main( int args, char* argv[] )
+int main( int argc, char* argv[] )
 {
-#ifdef SUIT_ENABLE_PYTHON
-  Py_Initialize();
-  PySys_SetArgv( args, argv );
-#endif
+  //#ifndef DISABLE_PYCONSOLE
+  //  // First of all initialize Python, as in complex multi-component applications
+  //  // someone else might initialize it some way unsuitable for light SALOME!
+  //  Py_SetProgramName( argv[0] );
+  //  Py_Initialize(); // Initialize the interpreter
+  //  PySys_SetArgv( argc,  argv );
+  //  PyEval_InitThreads(); // Create (and acquire) the interpreter lock
+  //  PyEval_ReleaseLock(); // Let the others use Python API until we need it again
+  //#endif
+
+  //qInstallMsgHandler( MessageOutput );
 
   QStringList argList;
   bool noExceptHandling = false;
   bool iniFormat        = false;
   bool noSplash         = false;
-  for ( int i = 1; i < args /*&& !noExceptHandling*/; i++ )
+  bool useLicense       = false;
+  for ( int i = 1; i < argc; i++ )
   {
     if ( !strcmp( argv[i], "--noexcepthandling" ) )
       noExceptHandling = true;
@@ -150,81 +159,138 @@ int main( int args, char* argv[] )
       iniFormat = true;
     else if ( !strcmp( argv[i], "--nosplash") )
       noSplash = true;
+    else if ( !strcmp( argv[i], "--uselicense" ) )
+      useLicense = true;
     else
       argList.append( QString( argv[i] ) );
   }
 
-  SUITApp_Application app( args, argv );
+  // set "C" locale if requested via preferences
+  {
+    SUITApp_Session stmp( iniFormat, argc, argv );
+    QApplication::setApplicationName( "salome" );
+    SUIT_ResourceMgr* resMgr = stmp.createResourceMgr( "LightApp" );
+    bool isCloc = resMgr->booleanValue( "language", "locale", true );
+    if ( isCloc ) {
+      QLocale::setDefault( QLocale::c() );
+    }
+    else {
+      QLocale::setDefault( QLocale::system() );
+    }
+  }
+
+  // add <qtdir>/plugins directory to the pluins search path for image plugins
+  QString qtdir = Qtx::qtDir( "plugins" );
+  if ( !qtdir.isEmpty() )
+    QApplication::addLibraryPath( qtdir );
+
+// TODO (QT5 PORTING) Below is a temporary solution, to allow compiling with Qt 5
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
+  //Set a "native" graphic system in case if application runs on the remote host
+  QString remote(::getenv("REMOTEHOST"));
+  QString client(::getenv("SSH_CLIENT"));
+  if(remote.length() > 0 || client.length() > 0 ) {
+    QApplication::setGraphicsSystem(QLatin1String("native"));
+  }
+#endif
+  
+  SUITApp_Application app( argc, argv );
+  QString cfgAppName = getAppName( argList.isEmpty() ? QString() : argList.first() );
+  // hard-coding for LightApp :( no other way to this for the moment
+  if ( cfgAppName == "LightApp" ) {
+    app.setOrganizationName( "salome" );
+    app.setApplicationName( "salome" );
+    app.setApplicationVersion( salomeVersion() );
+  }
 
   int result = -1;
+
+  if ( useLicense ) {
+    QString env;
+
+#ifdef WIN32
+    DWORD aLen=1024;
+    char aStr[1024];
+    HANDLE aToken=0;
+    HANDLE hProcess = GetCurrentProcess();
+    OpenProcessToken(hProcess,TOKEN_QUERY,&aToken);
+    if( GetUserProfileDirectory( aToken, aStr, &aLen ) )
+      env = aStr;
+
+#else
+    if ( ::getenv( "HOME" ) )
+      env = ::getenv( "HOME" );
+#endif
+    QFile file( env + "/ReadLicense.log" ); // Read the text from a file    
+    if( !file.exists() ) {
+      SUIT_LicenseDlg aLicense;
+      if ( aLicense.exec() != QDialog::Accepted ) 
+        return result;
+    }
+  }
+
   if ( !argList.isEmpty() )
   {
-    SUITApp_Session* aSession = new SUITApp_Session( iniFormat );
+    SUITApp_Session aSession( iniFormat, argc, argv );
     QtxSplash* splash = 0;
-    if ( !noSplash ) {
-      SUIT_ResourceMgr* resMgr = aSession->createResourceMgr( argList.first() );
-      if ( resMgr ) {
-       resMgr->loadLanguage();
-       QString splashIcon, splashInfo, splashTextColors;
-       resMgr->value( "splash", "image",       splashIcon );
-       resMgr->value( "splash", "info",        splashInfo, false );
-       resMgr->value( "splash", "text_colors", splashTextColors );
-       QString appName    = QObject::tr( "APP_NAME" ).stripWhiteSpace();
-       QString appVersion = QObject::tr( "APP_VERSION" ).stripWhiteSpace();
-       if ( appVersion == "APP_VERSION" ) {
-         if ( appName == "APP_NAME" || appName.lower() == "salome" )
-           appVersion = salomeVersion();
-         else
-           appVersion = "";
-       }
-       QPixmap px( splashIcon );
-       if ( !px.isNull() ) {
-         splash = QtxSplash::splash( px );
-         if ( !splashTextColors.isEmpty() ) {
-           QStringList colors = QStringList::split( "|", splashTextColors );
-           QColor c1, c2;
-           if ( colors.count() > 0 ) c1 = QColor( colors[0] );
-           if ( colors.count() > 1 ) c2 = QColor( colors[1] );
-           splash->setTextColors( c1, c2 );
-         }
-         else {
-           splash->setTextColors( Qt::white, Qt::black );
-         }
-#ifdef _DEBUG_
-         splash->setHideOnClick( true );
-#endif
-         QFont f = splash->font();
-         f.setBold( true );
-         splash->setFont( f );
-         if ( !splashInfo.isEmpty() ) {
-           splashInfo.replace( QRegExp( "%A" ),  appName );
-           splashInfo.replace( QRegExp( "%V" ),  QObject::tr( "ABOUT_VERSION" ).arg( appVersion ) );
-           splashInfo.replace( QRegExp( "%L" ),  QObject::tr( "ABOUT_LICENSE" ) );
-           splashInfo.replace( QRegExp( "%C" ),  QObject::tr( "ABOUT_COPYRIGHT" ) );
-           splashInfo.replace( QRegExp( "\\\\n" ), "\n" );
-           splash->message( splashInfo );
-         }
-         splash->show();
-         qApp->processEvents();
-       }
+    SUIT_ResourceMgr* resMgr = aSession.createResourceMgr( argList.first() );
+    if ( !noSplash ) 
+    {
+      if ( resMgr )
+      {
+        resMgr->loadLanguage();
+
+        splash = QtxSplash::splash( QPixmap() );
+        splash->readSettings( resMgr );
+        if ( splash->pixmap().isNull() ) {
+          delete splash;
+          splash = 0;
+        }
+        else {
+          QString appName    = QObject::tr( "APP_NAME" ).trimmed();
+          QString appVersion = QObject::tr( "APP_VERSION" ).trimmed();
+          if ( appVersion == "APP_VERSION" )
+          {
+            if ( appName == "APP_NAME" || appName.toLower() == "salome" )
+              appVersion = salomeVersion();
+            else
+              appVersion = "";
+          }
+          splash->setOption( "%A", appName );
+          splash->setOption( "%V", QObject::tr( "ABOUT_VERSION" ).arg( appVersion ) );
+          splash->setOption( "%L", QObject::tr( "ABOUT_LICENSE" ) );
+          splash->setOption( "%C", QObject::tr( "ABOUT_COPYRIGHT" ) );
+          splash->show();
+          QApplication::instance()->processEvents();
+        }
       }
     }
-    SUIT_Application* theApp = aSession->startApplication( argList.first() );
+
+#ifndef DISABLE_PYCONSOLE
+    //...Initialize python 
+    int   _argc   = 1;
+    char* _argv[] = {(char*)""};
+    SUIT_PYTHON::init_python(_argc,_argv);
+#endif
+
+    SUIT_Application* theApp = aSession.startApplication( argList.first() );
     if ( theApp )
     {
+#ifdef USE_SALOME_STYLE
+      Style_Salome::initialize( theApp->resourceMgr() );
+      if ( theApp->resourceMgr()->booleanValue( "Style", "use_salome_style", true ) )
+        Style_Salome::apply();
+#endif // USE_SALOME_STYLE
+
       if ( !noExceptHandling )
-        app.setHandler( aSession->handler() );
+        app.setHandler( aSession.handler() );
 
-//      if ( !app.mainWidget() )
-//        app.setMainWidget( theApp->desktop() );
       if ( splash )
-       splash->finish( theApp->desktop() );
+        splash->finish( theApp->desktop() );
 
       result = app.exec();
-      if ( splash )
-       delete splash;
     }
-    delete aSession;
   }
 
   return result;