-// 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/ 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
SUIT_ResourceMgr* resMgr = 0;
if ( myIniFormat )
{
- resMgr = new SUIT_ResourceMgr( appName );
+ resMgr = new SUIT_ResourceMgr( appName, QString( "%1Config" ) );
resMgr->setCurrentFormat( "ini" );
}
else
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;
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;
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() );
+ }
+ }
+
+#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
+ // RNV: setup the default format:
+ // QSurfaceFormat should be set before creation of QApplication,
+ // so to avoid conflicts beetween SALOME and ParaView QSurfaceFormats we should merge theirs formats
+ // (see void Qtx::initDefaultSurfaceFormat()) and set the resultant format here.
+ Qtx::initDefaultSurfaceFormat();
+#endif
+
+ // 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 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 = "";
- }
- QString splashIcon;
- resMgr->value( "splash", "image", splashIcon );
- QPixmap px( splashIcon );
- if ( !px.isNull() ) {
- splash = QtxSplash::splash( px );
- int splashMargin;
- if ( resMgr->value( "splash", "margin", splashMargin ) && splashMargin > 0 ) {
- splash->setMargin( splashMargin );
- }
- QString splashTextColors;
- if ( resMgr->value( "splash", "text_colors", splashTextColors ) && !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 );
- QString splashInfo;
- if ( resMgr->value( "splash", "info", splashInfo, false ) && !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;