X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOME_InstallWizard.cxx;h=403011e029bb825f76441bf6ba3c52dd7f6e9ae9;hb=7f20464cbfdbb123c2880002895cdbb454e63fbf;hp=dab7573f183b5ab1a70e9cb82ecb44e2eda43536;hpb=1a22caba07a06708b5ac99ae05a9a64657526fc6;p=tools%2Finstall.git diff --git a/src/SALOME_InstallWizard.cxx b/src/SALOME_InstallWizard.cxx index dab7573..403011e 100644 --- a/src/SALOME_InstallWizard.cxx +++ b/src/SALOME_InstallWizard.cxx @@ -1,10 +1,11 @@ -// File : SALOME_InstallWizard.cxx +// File : SALOME_InstallWizard.cxx // Created : Thu Dec 18 12:01:00 2002 -// Author : Vadim SANDLER -// Project : PAL/SALOME -// Module : InstallWizard -// Copyright : 2004 CEA -// $Header$ +// Author : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com) +// Project : SALOME +// Module : Installation Wizard +// Copyright : 2002-2007 CEA + +#include "globals.h" #include "SALOME_InstallWizard.hxx" #include "SALOME_ProductsView.hxx" @@ -24,15 +25,24 @@ #include #include #include -#include +#include #include -#include -#include -#include +#include +#include +#include #include -#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #ifdef WNT #include @@ -49,32 +59,191 @@ QString tmpDirName() { return QString( "/INSTALLWORK" ) + QString::number( getpid() ); } #define TEMPDIRNAME tmpDirName() +// ================================================================ +/*! + * ProcessThread + * Class for executing systen commands + */ +// ================================================================ +static QMutex myMutex(false); +static QWaitCondition myWC; +class ProcessThread: public QThread +{ + typedef QPtrList ItemList; +public: + ProcessThread( SALOME_InstallWizard* iw ) : QThread(), myWizard( iw ) { myItems.setAutoDelete( false ); } + + void addCommand( QCheckListItem* item, const QString& cmd ) { + myItems.append( item ); + myCommands.push_back( cmd ); + } + + bool hasCommands() const { return myCommands.count() > 0; } + void clearCommands() { myCommands.clear(); myItems.clear(); } + + virtual void run() { + while ( hasCommands() ) { + ___MESSAGE___( "ProcessThread::run - Processing command : " << myCommands[ 0 ].latin1() ); + int result = system( myCommands[ 0 ] ) / 256; // return code is * 256 + ___MESSAGE___( "ProcessThread::run - Result : " << result ); + QCheckListItem* item = myItems.first(); + myCommands.pop_front(); + myItems.removeFirst(); + myMutex.lock(); + SALOME_InstallWizard::postValidateEvent( myWizard, result, (void*)item ); + if ( hasCommands() ) + myWC.wait(&myMutex); + myMutex.unlock(); + }; + } + +private: + QStringList myCommands; + ItemList myItems; + SALOME_InstallWizard* myWizard; +}; + +// ================================================================ +/*! + * WarnDialog + * Warning dialog box + */ +// ================================================================ +class WarnDialog: public QDialog +{ + static WarnDialog* myDlg; + bool myCloseFlag; + + WarnDialog( QWidget* parent ) + : QDialog( parent, "WarnDialog", true, WDestructiveClose ) { + setCaption( tr( "Information" ) ); + myCloseFlag = false; + QLabel* lab = new QLabel( tr( "Please, wait while checking native products configuration ..." ), this ); + lab->setAlignment( AlignCenter ); + lab->setFrameStyle( QFrame::Box | QFrame::Plain ); + QVBoxLayout* l = new QVBoxLayout( this ); + l->setMargin( 0 ); + l->add( lab ); + this->setFixedSize( lab->sizeHint().width() + 50, + lab->sizeHint().height() * 5 ); + } + void accept() { return; } + void reject() { return; } + void closeEvent( QCloseEvent* e ) + { if ( !myCloseFlag ) return; + e->accept(); + QDialog::closeEvent( e ); + } + ~WarnDialog() { myDlg = 0; } +public: + static void showWarnDlg( QWidget* parent, bool show ) { + if ( show ) { + if ( !myDlg ) { + myDlg = new WarnDialog( parent ); + QSize sh = myDlg->size(); + myDlg->move( parent->x() + (parent->width()-sh.width())/2, + parent->y() + (parent->height()-sh.height())/2 ); + myDlg->show(); + } + myDlg->raise(); + myDlg->setFocus(); + } + else { + if ( myDlg ) { + myDlg->myCloseFlag = true; + myDlg->close(); + } + } + } + static bool isWarnDlgShown() { return myDlg != 0; } +}; +WarnDialog* WarnDialog::myDlg = 0; + +// ================================================================ +/*! + * InstallInfo + * Installation progress info window class + */ +// ================================================================ +class InstallInfo : public QTextEdit +{ +public: + InstallInfo( QWidget* parent ) : QTextEdit( parent ), finished( false ) {} + void setFinished( const bool f ) { finished = f; } +protected: + QPopupMenu* createPopupMenu( const QPoint& ) + { + int para1, col1, para2, col2; + getSelection(¶1, &col1, ¶2, &col2); + bool allSelected = hasSelectedText() && + para1 == 0 && para2 == paragraphs()-1 && col1 == 0 && col2 == paragraphLength(para2); + QPopupMenu* popup = new QPopupMenu( this ); + int id = popup->insertItem( tr( "&Copy" ) ); + popup->setItemEnabled( id, hasSelectedText() ); + popup->connectItem ( id, this, SLOT( copy() ) ); + id = popup->insertItem( tr( "Select &All" ) ); + popup->setItemEnabled( id, (bool)text().length() && !allSelected ); + popup->connectItem ( id, this, SLOT( selectAll() ) ); + if ( finished ) { + QWidget* p = parentWidget(); + while ( p && !p->inherits( "SALOME_InstallWizard" ) ) + p = p->parentWidget(); + if ( p && p->inherits( "SALOME_InstallWizard" ) ) { + popup->insertSeparator(); + id = popup->insertItem( tr( "&Save Log" ) ); + popup->setItemEnabled( id, (bool)text().length() ); + popup->connectItem ( id, (SALOME_InstallWizard*)p, SLOT( saveLog() ) ); + } + } + return popup; + } +private: + bool finished; +}; + // ================================================================ /*! * DefineDependeces [ static ] * Defines list of dependancies as string separated by space symbols */ // ================================================================ -static QString DefineDependeces(MapProducts& theProductsMap) { +static QString DefineDependeces(MapProducts& theProductsMap) +{ QStringList aProducts; for ( MapProducts::Iterator mapIter = theProductsMap.begin(); mapIter != theProductsMap.end(); ++mapIter ) { QCheckListItem* item = mapIter.key(); Dependancies dep = mapIter.data(); QStringList deps = dep.getDependancies(); for (int i = 0; i<(int)deps.count(); i++ ) { - if ( !aProducts.contains( deps[i] ) ) + if ( !aProducts.contains( deps[i] ) ) { aProducts.append( deps[i] ); + aProducts.append( deps[i] + "_src" ); + } } - if ( !aProducts.contains( item->text(0) ) ) + if ( !aProducts.contains( item->text(0) ) ) { aProducts.append( item->text(0) ); + aProducts.append( item->text(0) + "_src" ); + } } return aProducts.join(" "); } +// ================================================================ +/*! + * setAboutInfo [ static ] + * Sets 'what's this' and 'tooltip' information for the widget + */ +// ================================================================ +static void setAboutInfo( QWidget* widget, const QString& tip ) +{ + QWhatsThis::add( widget, tip ); + QToolTip::add ( widget, tip ); +} + #define QUOTE(arg) QString("'") + QString(arg) + QString("'") /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - T H E O L D I M P L E M E N T A T I O N + T H E O L D I M P L E M E N T A T I O N static QString DefineDependeces(MapProducts& theProductsMap, QCheckListItem* product ){ QStringList aProducts; if ( theProductsMap.contains( product ) ) { @@ -168,60 +337,214 @@ static bool hasSpace( const QString& dir ) return false; } +// ================================================================ +/*! + * makeTitle + * Creates HTML-wrapped title text + */ +// ================================================================ +QString makeTitle( const QString& text, const QString& separator = " ", bool fl = true ) +{ + QStringList words = QStringList::split( separator, text ); + if ( fl ) { + for ( uint i = 0; i < words.count(); i++ ) + words[i] = QString( "%1" ).arg( words[i].left(1) ) + words[i].mid(1); + } + else { + if ( words.count() > 0 ) + words[0] = QString( "%1" ).arg( words[0] ); + if ( words.count() > 1 ) + words[words.count()-1] = QString( "%1" ).arg( words[words.count()-1] ); + } + QString res = words.join( separator ); + if ( !res.isEmpty() ) + res = QString( "%1" ).arg( res ); + return res; +} + +// ================================================================ +/*! + * QMyCheckBox class : custom check box + * The only goal is to give access to the protected setState() method + */ +// ================================================================ +class QMyCheckBox: public QCheckBox +{ +public: + QMyCheckBox( const QString& text, QWidget* parent, const char* name = 0 ) : QCheckBox ( text, parent, name ) {} + void setState ( ToggleState s ) { QCheckBox::setState( s ); } +}; + +// ================================================================ +/*! + * AboutDlg + * "About dialog box. + */ +// ================================================================ +class AboutDlg: public QDialog +{ +public: + AboutDlg( SALOME_InstallWizard* parent ) : QDialog( parent, "About dialog box", true ) + { + // caption + setCaption( QString( "About %1" ).arg( parent->getIWName() ) ); + // palette + QPalette pal = palette(); + QColorGroup cg = pal.active(); + cg.setColor( QColorGroup::Foreground, Qt::darkBlue ); + cg.setColor( QColorGroup::Background, Qt::white ); + pal.setActive( cg ); pal.setInactive( cg ); pal.setDisabled( cg ); + setPalette( pal ); + // layout + QGridLayout* main = new QGridLayout( this, 1, 1, 11, 6 ); + // image + QLabel* logo = new QLabel( this, "logo" ); + logo->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); + logo->setMinimumSize( 32, 32 ); logo->setMaximumSize( 32, 32 ); + logo->setPaletteBackgroundColor( QColor( 234, 250, 234 ) ); + logo->setFrameStyle( QLabel::NoFrame | QLabel::Plain ); + logo->setPixmap( pixmap( pxAbout ) ); + logo->setScaledContents( false ); + logo->setAlignment( QLabel::AlignCenter ); + // decoration + QLabel* decorLeft = new QLabel( this, "decorLeft" ); + decorLeft->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ) ); + decorLeft->setMinimumWidth( 32 ); decorLeft->setMaximumWidth( 32 ); + decorLeft->setPaletteBackgroundColor( QColor( 234, 250, 234 ) ); + decorLeft->setScaledContents( false ); + QLabel* decorTop = new QLabel( this, "decorTop" ); + decorTop->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + decorTop->setMinimumHeight( 32 ); decorTop->setMaximumHeight( 32 ); + decorTop->setPaletteBackgroundColor( QColor( 234, 250, 234 ) ); + decorTop->setScaledContents( false ); + // contents + QLabel* title = new QLabel( this, "title" ); + QString tlt = parent->getIWName(); + title->setText( makeTitle( tlt ) ); + QLabel* version = new QLabel( this, "version" ); + version->setText( QString( "Version: %1.%1.%1" ).arg( __IW_VERSION_MAJOR__ ) \ + .arg( __IW_VERSION_MINOR__ ) \ + .arg( __IW_VERSION_PATCH__ ) ); + QLabel* copyright = new QLabel( this, "copyright" ); + copyright->setText( "Copyright © 2004-2007 CEA" ); + QFont font = title->font(); + font.setPointSize( (int)( font.pointSize() * 1.8 ) ); + title->setFont( font ); + QFrame* line = new QFrame( this, "line" ); + line->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + QLabel* url = new QLabel( this, "url" ); + url->setText( makeTitle( "www.salome-platform.org", ".", false ) ); + url->setAlignment( AlignRight ); + font = version->font(); + font.setPointSize( (int)( font.pointSize() / 1.2 ) ); + version->setFont( font ); + copyright->setFont( font ); + url->setFont( font ); + // layout + main->addWidget( logo, 0, 0 ); + main->addMultiCellWidget( decorLeft, 1, 5, 0, 0 ); + main->addWidget( decorTop, 0, 1 ); + main->addWidget( title, 1, 1 ); + main->addWidget( version, 2, 1 ); + main->addWidget( copyright, 3, 1 ); + main->addWidget( line, 4, 1 ); + main->addWidget( url, 5, 1 ); + // resize + QFontMetrics fm( title->font() ); + int width = (int)( fm.width( tlt ) * 1.5 ); + title->setMinimumWidth( width ); + setMaximumSize( minimumSize() ); + } + void mousePressEvent( QMouseEvent* ) + { + accept(); + } +}; + // ================================================================ /*! * SALOME_InstallWizard::SALOME_InstallWizard * Constructor */ // ================================================================ -SALOME_InstallWizard::SALOME_InstallWizard(QString aXmlFileName) - : InstallWizard( qApp->desktop(), "SALOME_InstallWizard", false, 0 ), - helpWindow( NULL ), - moreMode( false ), - previousPage( 0 ), - exitConfirmed( false ) +SALOME_InstallWizard::SALOME_InstallWizard(const QString& aXmlFileName, + const QString& aTargetDir, + const QString& aTmpDir) + : InstallWizard( qApp->desktop(), "SALOME_InstallWizard", false, 0 ), + helpWindow( NULL ), + moreMode( false ), + previousPage( 0 ), + exitConfirmed( false ), + hasErrors( false ) { - myIWName = tr( "Installation Wizard" ); - tmpCreated = QString::null; - xmlFileName = aXmlFileName; - QFont fnt = font(); fnt.setPointSize( 14 ); fnt.setBold( true ); + myIWName = tr( "Installation Wizard" ); + tmpCreated = QString::null; + xmlFileName = aXmlFileName; + myTargetPath = aTargetDir; + myTmpPath = aTmpDir; + stateChanged = true; + binPath = QDir::currentDirPath() + "/Products/BINARIES"; + srcPath = QDir::currentDirPath() + "/Products/SOURCES"; + + // + // get XML filename and current platform + // + // ... get current platform + curPlatform = currentPlatform(); +// cout << "curOS = " << curPlatform << endl; +// curPlatform = ""; + // ... check XML and platform definition + getXmlAndPlatform(); + + // set application font + QFont fnt = font(); + fnt.setPointSize( 14 ); + fnt.setBold( true ); setTitleFont( fnt ); // set icon - setIcon( QPixmap( ( const char** ) image0_data ) ); + setIcon( pixmap( pxIcon ) ); // enable sizegrip setSizeGripEnabled( true ); - + // add logo - addLogo( QPixmap( (const char**)image1_data ) ); - + addLogo( pixmap( pxLogo ) ); + // set defaults - setVersion( "1.2" ); - setCaption( tr( "PAL/SALOME %1" ).arg( myVersion ) ); - setCopyright( tr( "Copyright (C) 2004 CEA" ) ); - setLicense( tr( "All right reserved" ) ); - setOS( "" ); - -#ifdef DEBUG - cout << "Config. file : " << xmlFileName << endl; -#endif + setVersion( "3.2.7" ); + setCaption( tr( "SALOME %1" ).arg( myVersion ) ); + setCopyright( tr( "Copyright (C) 2007 CEA" ) ); + setLicense( tr( "All rights reserved." ) ); + ___MESSAGE___( "Configuration file : " << xmlFileName.latin1() ); + ___MESSAGE___( "Target directory : " << myTargetPath.latin1() ); + ___MESSAGE___( "Temporary directory: " << myTmpPath.latin1() ); + + // // xml reader - QFile xmlfile(xmlFileName); - if ( xmlfile.exists() ) { - QXmlInputSource source( &xmlfile ); - QXmlSimpleReader reader; + // + StructureParser* parser = new StructureParser( this ); + parser->readXmlFile(xmlFileName); - StructureParser* handler = new StructureParser( this ); - reader.setContentHandler( handler ); - reader.parse( source ); - } + // create instance of class for starting shell script to get available disk space + diskSpaceProc = new QProcess( this, "procDiskSpace" ); + connect( diskSpaceProc, SIGNAL( processExited() ), this, SLOT( updateAvailableSpace() ) ); // create instance of class for starting shell install script shellProcess = new QProcess( this, "shellProcess" ); + // create instance of class for starting shell script to check Fortran libraries + checkFLibProc = new QProcess( this, "checkFLibProc" ); + connect(checkFLibProc, SIGNAL( processExited() ), this, SLOT( checkFLibResult() ) ); + // create introduction page setupIntroPage(); + // create page to select installation type + setupTypePage(); + // create page to select the reference installation platform (if necessary) + setupPlatformPage(); + // create directories page + setupDirPage(); // create products page setupProductsPage(); // create prestart page @@ -230,28 +553,32 @@ SALOME_InstallWizard::SALOME_InstallWizard(QString aXmlFileName) setupProgressPage(); // create readme page setupReadmePage(); - + // common buttons - QWhatsThis::add( backButton(), tr( "Returns to the previous step of the installation procedure" ) ); - QToolTip::add ( backButton(), tr( "Returns to the previous step of the installation procedure" ) ); - QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - QToolTip::add ( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - QWhatsThis::add( finishButton(), tr( "Finishes installation and quits program" ) ); - QToolTip::add ( finishButton(), tr( "Finishes installation and quits program" ) ); - QWhatsThis::add( cancelButton(), tr( "Cancels installation and quits program" ) ); - QToolTip::add ( cancelButton(), tr( "Cancels installation and quits program" ) ); - QWhatsThis::add( helpButton(), tr( "Displays help information window" ) ); - QToolTip::add ( helpButton(), tr( "Displays help information window" ) ); - + setAboutInfo( backButton(), tr( "Return to the previous step\nof the installation procedure" ) ); + setAboutInfo( nextButton(), tr( "Move to the next step\nof the installation procedure" ) ); + setAboutInfo( finishButton(), tr( "Finish the installation and quit the program" ) ); + setAboutInfo( cancelButton(), tr( "Cancel the installation and quit the program" ) ); + setAboutInfo( helpButton(), tr( "Show the help information" ) ); + // common signals connections connect( this, SIGNAL( selected( const QString& ) ), - this, SLOT( pageChanged( const QString& ) ) ); - connect( this, SIGNAL( helpClicked() ), this, SLOT( helpClicked() ) ); + this, SLOT( pageChanged( const QString& ) ) ); + connect( this, SIGNAL( helpClicked() ), this, SLOT( helpClicked() ) ); + connect( this, SIGNAL( aboutClicked() ), this, SLOT( onAbout() ) ); + // catch signals from launched script connect(shellProcess, SIGNAL( readyReadStdout() ), this, SLOT( readFromStdout() ) ); connect(shellProcess, SIGNAL( readyReadStderr() ), this, SLOT( readFromStderr() ) ); connect(shellProcess, SIGNAL( processExited() ), this, SLOT( productInstalled() ) ); connect(shellProcess, SIGNAL( wroteToStdin() ), this, SLOT( wroteToStdin() ) ); + + // create validation thread + myThread = new ProcessThread( this ); + + // show about button + setAboutIcon( pixmap( pxAbout ) ); + showAboutBtn( true ); } // ================================================================ /*! @@ -267,10 +594,159 @@ SALOME_InstallWizard::~SALOME_InstallWizard() if ( PID > 0 ) { script += QString::number( PID ); script += " > /dev/null"; -#ifdef DEBUG - cout << "script: "<< script.latin1() << endl; -#endif - if ( system( script.latin1() ) ) { + ___MESSAGE___( "script: " << script.latin1() ); + if ( system( script.latin1() ) ) { + } + } + delete myThread; +} +// ================================================================ +/*! + * SALOME_InstallWizard::currentPlatform + * Tries to determine the current user's operating system + */ +// ================================================================ +QString SALOME_InstallWizard::currentPlatform() +{ + // file parsing + QString curOS = ""; + QString osFileName = "/etc/issue"; + if ( QFile::exists( osFileName ) ) { + QFile file( osFileName ); + if ( file.open( IO_ReadOnly ) ) { + QTextStream stream( &file ); + QString str = stream.readLine(); + file.close(); + // line parsing + QString pltName = "", platVersion = "", platBit = ""; + QRegExp rx( "(.*)[L|l]inux.*release\\s+([\\d.]*)" ); +// str = "Debian GNU/Linux 3.1 \n \l"; +// str = "Red Hat Enterprise Linux WS release 4 (Nahant)"; +// str = "Mandriva Linux release 2006.0 (Official) for x86_64"; + int pos = rx.search( str ); + if ( pos == -1 ) {// Debian case + rx = QRegExp( "(.*)GNU/Linux\\s+([\\d.]*)" ); + pos = rx.search( str ); + } + if ( pos > -1 ) { + pltName = rx.cap( 1 ); + platVersion = rx.cap( 2 ); + rx = QRegExp( "x86_64" ); + pos = rx.search( str ); + if ( pos > -1 ) + platBit = "_64"; + curOS = pltName + platVersion + platBit; + } + } + } + // return curOS.remove( " " ); + QString str( " " ); + int index = 0; + while ( (index = curOS.find( str, index, true)) != -1 ) + curOS.remove( index, str.length() ); + return curOS; +} +// ================================================================ +/*! + * SALOME_InstallWizard::getXmlMap + * Creates a map of the supported operating systems and + * corresponding XML files. + */ +// ================================================================ +MapXmlFiles SALOME_InstallWizard::getXmlMap( const QString& xmlFileName ) +{ + MapXmlFiles xmlMap; + QStringList xmlList; + if ( xmlFileName ) + xmlList.append( xmlFileName ); + else { + QDir dir( QDir::currentDirPath() ); + xmlList = dir.entryList( "*.xml", QDir::Files | QDir::Readable ); + } +// cout << xmlList.join(",") << endl; + // XML files parsing + QFile file; + QDomDocument doc( "xml_doc" ); + QDomElement docElem; + QDomNodeList nodeList; + QDomNode node; + QDomElement elem; + QString platforms = ""; + QStringList platList; + for ( uint i = 0; i < xmlList.count(); i++ ) { + file.setName( xmlList[i] ); + if ( !doc.setContent( &file ) ) { + file.close(); + continue; + } + file.close(); + + docElem = doc.documentElement(); + nodeList = docElem.elementsByTagName( "config" ); + if ( nodeList.count() == 0 ) + continue; + node = nodeList.item( 0 ); + if ( node.isElement() ) { + elem = node.toElement(); + if ( elem.attribute( "platforms" ) ) { + platforms = elem.attribute( "platforms" ).stripWhiteSpace(); + QStringList platList = QStringList::split( ",", platforms ); + for ( uint j = 0; j < platList.count(); j++ ) { + if ( !platList[j].isEmpty() && xmlMap.find( platList[j] ) == xmlMap.end() ) + xmlMap[ platList[j] ] = xmlList[i]; + } +// if ( !curPlatform.isEmpty() && xmlMap.find( curPlatform ) != xmlMap.end() ) +// return xmlMap; + } + } + } + return xmlMap; +} +// ================================================================ +/*! + * SALOME_InstallWizard::checkXmlAndPlatform + * Check XML file and current platform definition + */ +// ================================================================ +void SALOME_InstallWizard::getXmlAndPlatform() +{ + MapXmlFiles xmlMap; + if ( xmlFileName.isNull() ) { + xmlMap = getXmlMap(); + if ( !curPlatform.isEmpty() ) { + // try to get XML file for current platform + if ( xmlMap.find( curPlatform ) != xmlMap.end() ) + xmlFileName = xmlMap[ curPlatform ]; + else { + platformsMap = xmlMap; + warnMsg = tr( "Your Linux platform is not supported by this SALOME package" ); + } + } + else { + // get all supported platforms + platformsMap = xmlMap; + warnMsg = tr( "Install Wizard can't define your Linux platform" ); + } + } + else { + xmlMap = getXmlMap( xmlFileName ); + if ( !curPlatform.isEmpty() ) { + // check that the user's XML file supports current platform + if ( xmlMap.find( curPlatform ) == xmlMap.end() ) { + platformsMap = getXmlMap(); + MapXmlFiles::Iterator it; + for ( it = xmlMap.begin(); it != xmlMap.end(); ++it ) + platformsMap.insert( it.key(), it.data(), true ); + warnMsg = tr( "The given configuration file doesn't support your Linux platform" ); + } + } + else { + // get all supported platforms + platformsMap = getXmlMap(); + MapXmlFiles::Iterator it; + for ( it = xmlMap.begin(); it != xmlMap.end(); ++it ) + platformsMap.insert( it.key(), it.data(), true ); + warnMsg = tr( "Install Wizard can't define your Linux platform" ); } } } @@ -294,11 +770,15 @@ bool SALOME_InstallWizard::eventFilter( QObject* object, QEvent* event ) // ================================================================ void SALOME_InstallWizard::closeEvent( QCloseEvent* ce ) { + if ( WarnDialog::isWarnDlgShown() ) { + ce->ignore(); + return; + } if ( !exitConfirmed ) { - if ( QMessageBox::information( this, - tr( "Exit" ), - tr( "Do you want to quit %1?" ).arg( getIWName() ), - tr( "&Yes" ), + if ( QMessageBox::information( this, + tr( "Exit" ), + tr( "Do you want to quit %1?" ).arg( getIWName() ), + tr( "&Yes" ), tr( "&No" ), QString::null, 0, @@ -322,14 +802,13 @@ void SALOME_InstallWizard::setupIntroPage() { // create page introPage = new QWidget( this, "IntroPage" ); - QGridLayout* pageLayout = new QGridLayout( introPage ); + QGridLayout* pageLayout = new QGridLayout( introPage ); pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); // create logo picture - QPixmap logo( (const char**)SALOME_Logo_xpm ); logoLab = new QLabel( introPage ); - logoLab->setPixmap( logo ); + logoLab->setPixmap( pixmap( pxBigLogo ) ); logoLab->setScaledContents( false ); - logoLab->setFrameStyle( QLabel::Plain | QLabel::Box ); + logoLab->setFrameStyle( QLabel::Plain | QLabel::NoFrame ); logoLab->setAlignment( AlignCenter ); // create version box QVBox* versionBox = new QVBox( introPage ); versionBox->setSpacing( 6 ); @@ -368,6 +847,211 @@ void SALOME_InstallWizard::setupIntroPage() addPage( introPage, tr( "Introduction" ) ); } // ================================================================ +/*! + * SALOME_InstallWizard::setupTypePage + * Creates installation types page + */ +// ================================================================ +void SALOME_InstallWizard::setupTypePage() +{ + // create page + typePage = new QWidget( this, "TypePage" ); + QGridLayout* pageLayout = new QGridLayout( typePage ); + pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); + // create installation type button group + buttonGrp = new QButtonGroup( typePage ); + buttonGrp->setFrameShape(QButtonGroup::NoFrame); + QGridLayout* buttonGrpLayout = new QGridLayout( buttonGrp ); + buttonGrpLayout->setMargin( 0 ); buttonGrpLayout->setSpacing( 6 ); + QSpacerItem* spacer1 = new QSpacerItem( 16, 50, QSizePolicy::Minimum, QSizePolicy::Expanding ); + QSpacerItem* spacer2 = new QSpacerItem( 16, 50, QSizePolicy::Minimum, QSizePolicy::Expanding ); + QLabel* selectLab = new QLabel( tr( "Select a type of the installation:" ), buttonGrp ); + QSpacerItem* spacer3 = new QSpacerItem( 20, 20, QSizePolicy::Fixed, QSizePolicy::Minimum ); + // ... 'install binaries' layout + QGridLayout* binLayout = new QGridLayout( 2, 2, 0 ); + binBtn = new QRadioButton( tr( "Install binaries" ), buttonGrp ); + QFont rbFont = binBtn->font(); + rbFont.setBold( true ); + binBtn->setFont( rbFont ); + QSpacerItem* spacer4 = new QSpacerItem( 16, 16, QSizePolicy::Fixed, QSizePolicy::Minimum ); + QLabel* binLab = new QLabel( tr( "- all the binaries and sources of the chosen SALOME modules will be installed.\n" + "- all the binaries of the chosen prerequisites will be installed." ), + buttonGrp ); + binLayout->addMultiCellWidget( binBtn, 0, 0, 0, 1 ); + binLayout->addItem ( spacer4, 1, 0 ); + binLayout->addWidget ( binLab, 1, 1 ); + // ... 'install sources' layout + QGridLayout* srcLayout = new QGridLayout( 2, 2, 0 ); + srcBtn = new QRadioButton( tr( "Install sources" ), buttonGrp ); + srcBtn->setFont( rbFont ); + QSpacerItem* spacer5 = new QSpacerItem( 16, 16, QSizePolicy::Fixed, QSizePolicy::Minimum ); + QLabel* srcLab = new QLabel( tr( "- all the sources of the chosen modules and prerequisites will be installed without\ncompilation." ), + buttonGrp ); + srcLayout->addMultiCellWidget( srcBtn, 0, 0, 0, 1 ); + srcLayout->addItem ( spacer5, 1, 0 ); + srcLayout->addWidget ( srcLab, 1, 1 ); + // ... 'install sources and make compilation' layout + QGridLayout* srcCompileLayout = new QGridLayout( 3, 3, 0 ); + srcCompileBtn = new QRadioButton( tr( "Install sources and make a compilation" ), buttonGrp ); + srcCompileBtn->setFont( rbFont ); + QSpacerItem* spacer6 = new QSpacerItem( 16, 16, QSizePolicy::Fixed, QSizePolicy::Minimum ); + QLabel* srcCompileLab1 = new QLabel( tr( "- all the sources of the chosen modules and prerequisites will be installed and\ncompiled." ), + buttonGrp ); + QLabel* srcCompileLab2 = new QLabel( tr( "Note:" ), + buttonGrp ); + QFont noteFont = srcCompileLab2->font(); + noteFont.setUnderline( true ); + srcCompileLab2->setFont( noteFont ); + srcCompileLab2->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Preferred ) ); + srcCompileLab2->setAlignment( Qt::AlignHCenter | Qt::AlignTop ); + QLabel* srcCompileLab3 = new QLabel( " " + + tr( "it is a long time operation and it can take more than 24 hours depending\n on the computer." ), + buttonGrp ); + removeSrcBtn = new QCheckBox( tr( "Remove sources and temporary files after compilation" ), typePage ); + setAboutInfo( removeSrcBtn, tr( "Check this option if you want to remove sources of the products\nwith all the temporary files after build finishing" ) ); + removeSrcBtn->setChecked( false ); + removeSrcBtn->setEnabled( false ); + rmSrcPrevState = removeSrcBtn->isChecked(); + + srcCompileLayout->addMultiCellWidget( srcCompileBtn, 0, 0, 0, 2 ); + srcCompileLayout->addMultiCell ( spacer6, 1, 2, 0, 0 ); + srcCompileLayout->addMultiCellWidget( srcCompileLab1, 1, 1, 1, 2 ); + srcCompileLayout->addWidget ( srcCompileLab2, 2, 1 ); + srcCompileLayout->addWidget ( srcCompileLab3, 2, 2 ); + srcCompileLayout->addMultiCellWidget( removeSrcBtn, 3, 3, 1, 2 ); + // layout widgets in the button group + buttonGrpLayout->addItem ( spacer1, 0, 1 ); + buttonGrpLayout->addMultiCellWidget( selectLab, 1, 1, 0, 1 ); + buttonGrpLayout->addMultiCell ( spacer3, 2, 4, 0, 0 ); + buttonGrpLayout->addLayout ( binLayout, 2, 1 ); + buttonGrpLayout->addLayout ( srcLayout, 3, 1 ); + buttonGrpLayout->addLayout ( srcCompileLayout, 4, 1 ); + buttonGrpLayout->addItem ( spacer2, 5, 1 ); + // layout button group at the page + pageLayout->addWidget( buttonGrp, 0, 0 ); + // connecting signals + connect( buttonGrp, SIGNAL( clicked(int) ), this, SLOT ( onButtonGroup(int) ) ); + // adding page + addPage( typePage, tr( "Installation type" ) ); +} +// ================================================================ +/*! + * SALOME_InstallWizard::setupPlatformPage + * Creates platforms page, if necessary + */ +// ================================================================ +void SALOME_InstallWizard::setupPlatformPage() +{ + // create page or not? + if ( platformsMap.isEmpty() ) + return; + + // create page + platformsPage = new QWidget( this, "PlatformsPage" ); + QGridLayout* pageLayout = new QGridLayout( platformsPage ); + pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); + // create warning labels + QLabel* warnLab2 = new QLabel( tr( "WARNING!" ), platformsPage ); + warnLab2->setAlignment( Qt::AlignHCenter ); + QFont fnt = warnLab2->font(); + fnt.setBold( true ); + warnLab2->setFont( fnt ); + if ( installType == Compile && platformsMap.find( curPlatform ) == platformsMap.end() ) + warnMsg += tr( " and compilation is not tested on this one." ); + else + warnMsg += "."; + warnLab = new QLabel( warnMsg, platformsPage ); + warnLab->setAlignment( Qt::AlignHCenter | Qt::WordBreak ); + QLabel* warnLab3 = new QLabel( tr( "If you want to proceed anyway, please select platform from the following list:" ), + platformsPage ); + warnLab3->setAlignment( Qt::AlignHCenter | Qt::WordBreak ); + // create button group + platBtnGrp = new QButtonGroup( platformsPage ); + platBtnGrp->setFrameShape(QButtonGroup::LineEditPanel); + platBtnGrp->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Preferred ) ); + QVBoxLayout* platBtnGrpLayout = new QVBoxLayout( platBtnGrp ); + platBtnGrpLayout->setMargin( 11 ); platBtnGrpLayout->setSpacing( 6 ); + // create platforms radio-buttons + QString plat; + MapXmlFiles::Iterator it; + for ( it = platformsMap.begin(); it != platformsMap.end(); ++it ) { + plat = it.key(); + QRadioButton* rb = new QRadioButton( plat, platBtnGrp, plat ); + platBtnGrpLayout->addWidget( rb ); + } + // create spacers + QSpacerItem* spacer1 = new QSpacerItem( 16, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); + QSpacerItem* spacer2 = new QSpacerItem( 16, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); + + // layout widgets on page + pageLayout->addItem ( spacer1, 0, 0 ); + pageLayout->addWidget ( warnLab2, 1, 0 ); + pageLayout->addWidget ( warnLab, 2, 0 ); + pageLayout->addWidget ( warnLab3, 3, 0 ); + pageLayout->addItem ( spacer2, 4, 0 ); + pageLayout->addMultiCellWidget( platBtnGrp, 0, 4, 1, 1 ); + + // connecting signals + connect( platBtnGrp, SIGNAL( clicked(int) ), this, SLOT ( onButtonGroup(int) ) ); + + // adding page + addPage( platformsPage, tr( "Installation platform" ) ); +} +// ================================================================ +/*! + * SALOME_InstallWizard::setupDirPage + * Creates directories page + */ +// ================================================================ +void SALOME_InstallWizard::setupDirPage() +{ + // create page + dirPage = new QWidget( this, "DirPage" ); + QGridLayout* pageLayout = new QGridLayout( dirPage ); + pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); + QSpacerItem* spacer1 = new QSpacerItem( 16, 50, QSizePolicy::Minimum, QSizePolicy::Expanding ); + QSpacerItem* spacer2 = new QSpacerItem( 16, 50, QSizePolicy::Minimum, QSizePolicy::Expanding ); + // target directory + QGridLayout* targetLayout = new QGridLayout( 2, 2, 0 ); + QLabel* targetLab = new QLabel( tr( "Set a target directory to install SALOME platform:" ), dirPage ); + targetFolder = new QLineEdit( dirPage ); + targetBtn = new QPushButton( tr( "Browse..." ), dirPage ); + setAboutInfo( targetBtn, tr( "Click this button to browse\nthe installation directory" ) ); + targetLayout->addMultiCellWidget( targetLab, 0, 0, 0, 1 ); + targetLayout->addWidget ( targetFolder, 1, 0 ); + targetLayout->addWidget ( targetBtn, 1, 1 ); + // temporary directory + QGridLayout* tempLayout = new QGridLayout( 2, 2, 0 ); + QLabel* tempLab = new QLabel( tr( "Set a directory that should be used for temporary SALOME files:" ), dirPage ); + tempFolder = new QLineEdit( dirPage ); + tempBtn = new QPushButton( tr( "Browse..." ), dirPage ); + setAboutInfo( tempBtn, tr( "Click this button to browse\nthe temporary directory" ) ); + tempLayout->addMultiCellWidget( tempLab, 0, 0, 0, 1 ); + tempLayout->addWidget ( tempFolder, 1, 0 ); + tempLayout->addWidget ( tempBtn, 1, 1 ); + // AKL: 13/08/07 - disable temporary directory setting in GUI ==> + tempLab->hide(); + tempFolder->hide(); + tempBtn->hide(); + // AKL: 13/08/07 - disable temporary directory setting in GUI <== + // layout widgets + pageLayout->addItem ( spacer1, 0, 0 ); + pageLayout->addLayout( targetLayout, 1, 0 ); + pageLayout->addLayout( tempLayout, 2, 0 ); + pageLayout->addItem ( spacer2, 3, 0 ); + // connecting signals + connect( targetFolder, SIGNAL( textChanged( const QString& ) ), + this, SLOT( directoryChanged( const QString& ) ) ); + connect( targetBtn, SIGNAL( clicked() ), + this, SLOT( browseDirectory() ) ); + connect( tempFolder, SIGNAL( textChanged( const QString& ) ), + this, SLOT( directoryChanged( const QString& ) ) ); + connect( tempBtn, SIGNAL( clicked() ), this, SLOT( browseDirectory() ) ); + + // adding page + addPage( dirPage, tr( "Installation directory" ) ); +} +// ================================================================ /*! * SALOME_InstallWizard::setupProductsPage * Creates products page @@ -377,132 +1061,91 @@ void SALOME_InstallWizard::setupProductsPage() { // create page productsPage = new QWidget( this, "ProductsPage" ); - QGridLayout* pageLayout = new QGridLayout( productsPage ); + QGridLayout* pageLayout = new QGridLayout( productsPage ); pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); - // target directory - QLabel* targetLab = new QLabel( tr( "Type the target directory:" ), productsPage ); - targetFolder = new QLineEdit( productsPage ); - QWhatsThis::add( targetFolder, tr( "Enter target root directory where products will be installed" ) ); - QToolTip::add ( targetFolder, tr( "Enter target root directory where products will be installed" ) ); - targetBtn = new QPushButton( tr( "Browse..." ), productsPage ); - QWhatsThis::add( targetBtn, tr( "Click this to browse target directory" ) ); - QToolTip::add ( targetBtn, tr( "Click this to browse target directory" ) ); - // create advanced mode widgets container - moreBox = new QWidget( productsPage ); - QGridLayout* moreBoxLayout = new QGridLayout( moreBox ); - moreBoxLayout->setMargin( 0 ); moreBoxLayout->setSpacing( 6 ); - // temp directory - QLabel* tempLab = new QLabel( tr( "Type the directory for the temporary files:" ), moreBox ); - tempFolder = new QLineEdit( moreBox ); - // tempFolder->setText( "/tmp" ); // default is /tmp directory - QWhatsThis::add( tempFolder, tr( "Enter directory where to put temporary files" ) ); - QToolTip::add ( tempFolder, tr( "Enter directory where to put temporary files" ) ); - tempBtn = new QPushButton( tr( "Browse..." ), moreBox ); - tempBtn->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); - QWhatsThis::add( tempBtn, tr( "Click this to browse temporary directory" ) ); - QToolTip::add ( tempBtn, tr( "Click this to browse temporary directory" ) ); - // create products list - productsView = new ProductsView( moreBox ); - productsView->setMinimumSize( 250, 180 ); - QWhatsThis::add( productsView, tr( "This view lists the products you wish to be installed" ) ); - QToolTip::add ( productsView, tr( "This view lists the products you wish to be installed" ) ); - // products info box - productsInfo = new QTextBrowser( moreBox ); - productsInfo->setMinimumSize( 270, 135 ); - QWhatsThis::add( productsInfo, tr( "Shows info about the product: required disk space and prerequisites" ) ); - QToolTip::add ( productsInfo, tr( "Shows info about the product: required disk space and prerequisites" ) ); - // disk space labels - QLabel* reqLab1 = new QLabel( tr( "Total disk space required:" ), moreBox ); - QWhatsThis::add( reqLab1, tr( "Shows total disk space required for installing selected products" ) ); - QToolTip::add ( reqLab1, tr( "Shows total disk space required for installing selected products" ) ); - requiredSize = new QLabel( moreBox ); - requiredSize->setMinimumWidth( 100 ); - QWhatsThis::add( requiredSize, tr( "Shows total disk space required for installing selected products" ) ); - QToolTip::add ( requiredSize, tr( "Shows total disk space required for installing selected products" ) ); - QLabel* reqLab2 = new QLabel( tr( "Space for temporary files:" ), moreBox ); - QWhatsThis::add( reqLab2, tr( "Shows additional disk space which is required for temporary files" ) ); - QToolTip::add ( reqLab2, tr( "Shows additional disk space which is required for temporary files" ) ); - requiredTemp = new QLabel( moreBox ); - requiredTemp->setMinimumWidth( 100 ); - QWhatsThis::add( requiredTemp, tr( "Shows additional disk space which is required for temporary files" ) ); - QToolTip::add ( requiredTemp, tr( "Shows additional disk space which is required for temporary files" ) ); - QFont fnt = reqLab1->font(); - fnt.setBold( true ); - reqLab1->setFont( fnt ); - requiredSize->setFont( fnt ); - reqLab2->setFont( fnt ); - requiredTemp->setFont( fnt ); + // + // create left column widgets + // + QVBoxLayout* leftBoxLayout = new QVBoxLayout; + leftBoxLayout->setMargin( 0 ); leftBoxLayout->setSpacing( 6 ); + // ... modules list + modulesView = new ProductsView( productsPage, "modulesView" ); + setAboutInfo( modulesView, tr( "The modules available for the installation" ) ); + modulesView->setColumnAlignment( 1, Qt::AlignRight ); + leftBoxLayout->addWidget( modulesView ); + // ... 'Installation with GUI' checkbox + installGuiBtn = new QMyCheckBox( tr( "Installation with GUI" ), productsPage ); + setAboutInfo( installGuiBtn, tr( "Check this option if you want\nto install SALOME with GUI" ) ); + leftBoxLayout->addWidget( installGuiBtn ); + // ... prerequisites list + prereqsView = new ProductsView( productsPage, "prereqsView" ); + prereqsView->renameColumn( 0, "Prerequisite" ); + setAboutInfo( prereqsView, tr( "The prerequisites that can be installed" ) ); + prereqsView->setColumnAlignment( 1, Qt::AlignRight ); + leftBoxLayout->addWidget( prereqsView ); + // ... 'Show/Hide prerequisites' button + moreBtn = new QPushButton( tr( "Show prerequisites..." ), productsPage ); + setAboutInfo( moreBtn, tr( "Click to show list of prerequisites" ) ); + leftBoxLayout->addWidget( moreBtn ); + // + // create right column widgets + // + // ... info box + productInfo = new QTextBrowser( productsPage ); + productInfo->setFrameShape( QFrame::LineEditPanel ); + productInfo->setPaletteBackgroundColor( productsPage->paletteBackgroundColor() ); + setAboutInfo( productInfo, tr( "Short information about the product being selected" ) ); + // ... disk space labels + QLabel* reqLab1 = new QLabel( tr( "Disk space required:" ), productsPage ); + setAboutInfo( reqLab1, tr( "Total disk space required for the installation\nof the selected products" ) ); + requiredSize = new QLabel( productsPage ); + setAboutInfo( requiredSize, tr( "Total disk space required for the installation\nof the selected products" ) ); + requiredSize->setAlignment( Qt::AlignRight ); + QLabel* reqLab2 = new QLabel( tr( "Space for temporary files:" ), productsPage ); + setAboutInfo( reqLab2, tr( "Disk space required for the temporary files" ) ); + requiredTemp = new QLabel( productsPage ); + setAboutInfo( requiredTemp, tr( "Disk space required for the temporary files" ) ); + requiredTemp->setAlignment( Qt::AlignRight ); + QLabel* reqLab3 = new QLabel( tr( "Available disk space:" ), productsPage ); + setAboutInfo( reqLab3, tr( "Disk space available on the selected device" ) ); + availableSize = new QLabel( productsPage ); + setAboutInfo( availableSize, tr( "Disk space available on the selected device" ) ); + availableSize->setAlignment( Qt::AlignRight ); + // layout size widgets QGridLayout* sizeLayout = new QGridLayout; sizeLayout->setMargin( 0 ); sizeLayout->setSpacing( 6 ); - sizeLayout->addWidget( reqLab1, 0, 0 ); - sizeLayout->addWidget( requiredSize, 0, 1 ); - sizeLayout->addWidget( reqLab2, 1, 0 ); - sizeLayout->addWidget( requiredTemp, 1, 1 ); - // prerequisites checkbox - prerequisites = new QCheckBox( tr( "Auto set prerequisites products" ), moreBox ); - prerequisites->setChecked( true ); - QWhatsThis::add( prerequisites, tr( "Check this if you want prerequisites products to be set on automatically" ) ); - QToolTip::add ( prerequisites, tr( "Check this if you want prerequisites products to be set on automatically" ) ); - // buttons - unselectBtn = new QPushButton( tr( "&Unselect All" ), moreBox ); - QWhatsThis::add( unselectBtn, tr( "Unselects all products" ) ); - QToolTip::add ( unselectBtn, tr( "Unselects all products" ) ); - QVBoxLayout* btnLayout = new QVBoxLayout; btnLayout->setMargin( 0 ); btnLayout->setSpacing( 6 ); - btnLayout->addWidget( unselectBtn ); - // layouting advancet mode widgets - moreBoxLayout->addMultiCellWidget( tempLab, 0, 0, 0, 2 ); - moreBoxLayout->addMultiCellWidget( tempFolder, 1, 1, 0, 1 ); - moreBoxLayout->addWidget ( tempBtn, 1, 2 ); - moreBoxLayout->addMultiCellWidget( productsView, 2, 5, 0, 0 ); - moreBoxLayout->addMultiCellWidget( productsInfo, 2, 2, 1, 2 ); - moreBoxLayout->addMultiCellWidget( prerequisites,3, 3, 1, 2 ); - moreBoxLayout->addMultiCellLayout( btnLayout, 4, 4, 1, 2 ); - moreBoxLayout->addMultiCellLayout( sizeLayout, 5, 5, 1, 2 ); - // button - moreBtn = new QPushButton( tr( "More..." ), productsPage ); - // layouting - pageLayout->addMultiCellWidget( targetLab, 0, 0, 0, 1 ); - pageLayout->addWidget ( targetFolder, 1, 0 ); - pageLayout->addWidget ( targetBtn, 1, 1 ); - pageLayout->addMultiCellWidget( moreBox, 2, 2, 0, 1 ); - pageLayout->addWidget ( moreBtn, 3, 1 ); - pageLayout->setRowStretch( 2, 5 ); - //pageLayout->addRowSpacing( 6, 10 ); - // xml reader - QFile xmlfile(xmlFileName); - if ( xmlfile.exists() ) { - QXmlInputSource source( &xmlfile ); - QXmlSimpleReader reader; - - StructureParser* handler = new StructureParser( this ); - handler->setProductsList(productsView); - handler->setTargetDir(targetFolder); - handler->setTempDir(tempFolder); - reader.setContentHandler( handler ); - reader.parse( source ); - } - // set first item to be selected - if ( productsView->childCount() > 0 ) { - productsView->setSelected( productsView->firstChild(), true ); - onSelectionChanged(); - } + sizeLayout->addWidget( reqLab1, 0, 0 ); + sizeLayout->addWidget( requiredSize, 0, 1 ); + sizeLayout->addWidget( reqLab2, 1, 0 ); + sizeLayout->addWidget( requiredTemp, 1, 1 ); + sizeLayout->addWidget( reqLab3, 2, 0 ); + sizeLayout->addWidget( availableSize, 2, 1 ); + + // layout common widgets + pageLayout->addMultiCellLayout( leftBoxLayout, 0, 1, 0, 0 ); + pageLayout->addWidget ( productInfo, 0, 1 ); + pageLayout->addLayout ( sizeLayout, 1, 1 ); + // adding page - addPage( productsPage, tr( "Installation settings" ) ); - // connecting signals - connect( productsView, SIGNAL( selectionChanged() ), - this, SLOT( onSelectionChanged() ) ); - connect( productsView, SIGNAL( itemToggled( QCheckListItem* ) ), - this, SLOT( onItemToggled( QCheckListItem* ) ) ); - connect( unselectBtn, SIGNAL( clicked() ), this, SLOT( onProdBtn() ) ); + addPage( productsPage, tr( "Choice of the products to be installed" ) ); + // connecting signals - connect( targetFolder, SIGNAL( textChanged( const QString& ) ), - this, SLOT( directoryChanged( const QString& ) ) ); - connect( targetBtn, SIGNAL( clicked() ), this, SLOT( browseDirectory() ) ); - connect( tempFolder, SIGNAL( textChanged( const QString& ) ), - this, SLOT( directoryChanged( const QString& ) ) ); - connect( tempBtn, SIGNAL( clicked() ), this, SLOT( browseDirectory() ) ); - connect( moreBtn, SIGNAL( clicked() ), this, SLOT( onMoreBtn() ) ); - // start on default - non-advanced - mode - moreBox->hide(); + connect( modulesView, SIGNAL( selectionChanged() ), + this, SLOT( onSelectionChanged() ) ); + connect( prereqsView, SIGNAL( selectionChanged() ), + this, SLOT( onSelectionChanged() ) ); + connect( modulesView, SIGNAL( clicked ( QListViewItem * item ) ), + this, SLOT( onSelectionChanged() ) ); + connect( prereqsView, SIGNAL( clicked ( QListViewItem * item ) ), + this, SLOT( onSelectionChanged() ) ); + connect( modulesView, SIGNAL( itemToggled( QCheckListItem* ) ), + this, SLOT( onItemToggled( QCheckListItem* ) ) ); + connect( prereqsView, SIGNAL( itemToggled( QCheckListItem* ) ), + this, SLOT( onItemToggled( QCheckListItem* ) ) ); + connect( installGuiBtn, SIGNAL( toggled( bool ) ), + this, SLOT( onInstallGuiBtn() ) ); + connect( moreBtn, SIGNAL( clicked() ), this, SLOT( onMoreBtn() ) ); + // start on default - non-advanced mode + prereqsView->hide(); } // ================================================================ /*! @@ -514,18 +1157,15 @@ void SALOME_InstallWizard::setupCheckPage() { // create page prestartPage = new QWidget( this, "PrestartPage" ); - QVBoxLayout* pageLayout = new QVBoxLayout( prestartPage ); + QVBoxLayout* pageLayout = new QVBoxLayout( prestartPage ); pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); // choice text view choices = new QTextEdit( prestartPage ); choices->setReadOnly( true ); choices->setTextFormat( RichText ); choices->setUndoRedoEnabled ( false ); - QWhatsThis::add( choices, tr( "Displays information about installation settings you made" ) ); - QToolTip::add ( choices, tr( "Displays information about installation settings you made" ) ); - QPalette pal = choices->palette(); - pal.setColor( QColorGroup::Base, QApplication::palette().active().background() ); - choices->setPalette( pal ); + setAboutInfo( choices, tr( "Information about the installation choice you have made" ) ); + choices->setPaletteBackgroundColor( prestartPage->paletteBackgroundColor() ); choices->setMinimumHeight( 10 ); // layouting pageLayout->addWidget( choices ); @@ -543,29 +1183,31 @@ void SALOME_InstallWizard::setupProgressPage() { // create page progressPage = new QWidget( this, "progressPage" ); - QGridLayout* pageLayout = new QGridLayout( progressPage ); + QGridLayout* pageLayout = new QGridLayout( progressPage ); pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); // top splitter splitter = new QSplitter( Vertical, progressPage ); splitter->setOpaqueResize( true ); // the parent for the widgets QWidget* widget = new QWidget( splitter ); - QGridLayout* layout = new QGridLayout( widget ); + QGridLayout* layout = new QGridLayout( widget ); layout->setMargin( 0 ); layout->setSpacing( 6 ); // installation progress view box - installInfo = new QTextEdit( widget ); + installInfo = new InstallInfo( widget ); installInfo->setReadOnly( true ); installInfo->setTextFormat( RichText ); installInfo->setUndoRedoEnabled ( false ); installInfo->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) ); installInfo->setMinimumSize( 100, 10 ); - QWhatsThis::add( installInfo, tr( "Displays installation process" ) ); - QToolTip::add ( installInfo, tr( "Displays installation process" ) ); + setAboutInfo( installInfo, tr( "Installation process output" ) ); // parameters for the script parametersLab = new QLabel( tr( "Enter your answer here:" ), widget ); passedParams = new QLineEdit ( widget ); - QWhatsThis::add( passedParams, tr( "Use this field to enter answer for the running script when it is necessary") ); - QToolTip::add ( passedParams, tr( "Use this field to enter answer for the running script when it is necessary") ); + setAboutInfo( passedParams, tr( "Use this field to enter the answer\nfor the running script when it is necessary") ); + // VSR: 10/11/05 - disable answer mode ==> + parametersLab->hide(); + passedParams->hide(); + // VSR: 10/11/05 - disable answer mode <== // layouting layout->addWidget( installInfo, 0, 0 ); layout->addWidget( parametersLab, 1, 0 ); @@ -573,21 +1215,23 @@ void SALOME_InstallWizard::setupProgressPage() layout->addRowSpacing( 3, 6 ); // the parent for the widgets widget = new QWidget( splitter ); - layout = new QGridLayout( widget ); + layout = new QGridLayout( widget ); layout->setMargin( 0 ); layout->setSpacing( 6 ); // installation results view box QLabel* resultLab = new QLabel( tr( "Installation Status:" ), widget ); progressView = new ProgressView( widget ); progressView->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) ); progressView->setMinimumSize( 100, 10 ); - QWhatsThis::add( progressView, tr( "Displays installation status" ) ); - QToolTip::add ( progressView, tr( "Displays installation status" ) ); + statusLab = new QLabel( widget ); + statusLab->setFrameShape( QButtonGroup::LineEditPanel ); + setAboutInfo( progressView, tr( "Installation status on the selected products" ) ); // layouting layout->addRowSpacing( 0, 6 ); layout->addWidget( resultLab, 1, 0 ); layout->addWidget( progressView, 2, 0 ); + layout->addWidget( statusLab, 3, 0 ); // layouting - pageLayout->addWidget( splitter, 0, 0 ); + pageLayout->addWidget( splitter, 0, 0 ); // adding page addPage( progressPage, tr( "Installation progress" ) ); // connect signals @@ -602,33 +1246,28 @@ void SALOME_InstallWizard::setupProgressPage() void SALOME_InstallWizard::setupReadmePage() { // create page - readmePage = new QWidget( this, "ReadmePage" ); - QVBoxLayout* pageLayout = new QVBoxLayout( readmePage ); + readmePage = new QWidget( this, "readmePage" ); + QVBoxLayout* pageLayout = new QVBoxLayout( readmePage ); pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 ); // README info text box readme = new QTextEdit( readmePage ); readme->setReadOnly( true ); readme->setTextFormat( PlainText ); - readme->setFont( QFont( "Fixed" ) ); + readme->setFont( QFont( "Fixed", 12 ) ); readme->setUndoRedoEnabled ( false ); - QWhatsThis::add( readme, tr( "Displays README information" ) ); - QToolTip::add ( readme, tr( "Displays README information" ) ); - QPalette pal = readme->palette(); - pal.setColor( QColorGroup::Base, QApplication::palette().active().background() ); - readme->setPalette( pal ); + setAboutInfo( readme, tr( "README information" ) ); + readme->setPaletteBackgroundColor( readmePage->paletteBackgroundColor() ); readme->setMinimumHeight( 10 ); - // button - runSalomeBtn = new QPushButton( tr( "Launch SALOME" ), readmePage ); - QWhatsThis::add( runSalomeBtn, tr( "Click this button to run SALOME desktop" ) ); - QToolTip::add ( runSalomeBtn, tr( "Click this button to run SALOME desktop" ) ); - QHBoxLayout* hLayout = new QHBoxLayout; - hLayout->addWidget( runSalomeBtn ); hLayout->addStretch(); - // layouting + pageLayout->addWidget( readme ); pageLayout->setStretchFactor( readme, 5 ); + + // Operation buttons + QHBoxLayout* hLayout = new QHBoxLayout( -1, "finishButtons" ); + hLayout->setMargin( 0 ); hLayout->setSpacing( 6 ); + hLayout->addStretch(); pageLayout->addLayout( hLayout ); - // connecting signals - connect( runSalomeBtn, SIGNAL( clicked() ), this, SLOT( onLaunchSalome() ) ); + // loading README file QString readmeFile = QDir::currentDirPath() + "/README"; QString text; @@ -636,6 +1275,7 @@ void SALOME_InstallWizard::setupReadmePage() readme->setText( text ); else readme->setText( tr( "README file has not been found" ) ); + // adding page addPage( readmePage, tr( "Finish installation" ) ); } @@ -654,23 +1294,22 @@ void SALOME_InstallWizard::showChoiceInfo() int nbProd = 0; QString text; - if ( !xmlFileName.isEmpty() ) { - text += tr( "Configuration file" )+ ": " + xmlFileName + "
"; - text += "
"; - } - if ( !myOS.isEmpty() ) { - text += tr( "Target platform" ) + ": " + myOS + "
"; - text += "
"; - } - text += tr( "Products to be used" ) + ":
    "; - QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() ); + text += tr( "Current Linux platform" )+ ": " + (!curPlatform.isEmpty() ? curPlatform : QString( "Unknown" )) + "
    "; + if ( !refPlatform.isEmpty() ) + text += tr( "Reference Linux platform" ) + ": " + refPlatform + "
    "; + text += "
    "; + + text += tr( "Target directory:" ) + " " + QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) + "
    "; + text += tr( "Temporary directory:" ) + " " + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + "
    "; + text += "
    "; + + text += tr( "SALOME modules to be installed" ) + ":
      "; + QCheckListItem* item = (QCheckListItem*)( modulesView->firstChild() ); while( item ) { if ( productsMap.contains( item ) ) { - if ( item->childCount() > 0 ) { - if ( productsView->isNative( item ) ) { - text += "
    • " + item->text() + " " + tr( "as native" ) + "
      "; - nbProd++; - } + if ( item->isOn() ) { + text += "
    • " + item->text() + "
      "; + nbProd++; } } item = (QCheckListItem*)( item->nextSibling() ); @@ -680,23 +1319,13 @@ void SALOME_InstallWizard::showChoiceInfo() } text += "
    "; nbProd = 0; - text += tr( "Products to be installed" ) + ":
      "; - item = (QCheckListItem*)( productsView->firstChild() ); + text += tr( "Prerequisites to be installed" ) + ":
        "; + item = (QCheckListItem*)( prereqsView->firstChild() ); while( item ) { if ( productsMap.contains( item ) ) { - if ( item->childCount() > 0 ) { - if ( productsView->isBinaries( item ) ) { - text += "
      • " + item->text() + " " + tr( "as binaries" ) + "
        "; - nbProd++; - } - else if ( productsView->isSources( item ) ) { - text+= "
      • " + item->text() + " " + tr( "as sources" ) + "
        "; - nbProd++; - } - } - else if ( item->isOn() ) { - text+= "
      • " + item->text() + "
        "; - nbProd++; + if ( item->isOn() ) { + text += "
      • " + item->text() + " " + productsMap[ item ].getVersion() + "
        "; + nbProd++; } } item = (QCheckListItem*)( item->nextSibling() ); @@ -705,15 +1334,8 @@ void SALOME_InstallWizard::showChoiceInfo() text += "
      • " + tr( "none" ) + "
        "; } text += "
      "; - text += tr( "Total disk space required:" ) + " " + QString::number( totSize ) + " Kb
      " ; - text += tr( "Space for temporary files required:" ) + " " + QString::number( tempSize ) + " Kb
      " ; - text += "
      "; - text += tr( "Target directory:" ) + " " + QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) + "
      "; - // VSR: Temporary folder is used always now and it is not necessary to disable it --> - // if ( tempSize > 0 ) - // VSR: <---------------------------------------------------------------------------- - text += tr( "Temp directory:" ) + " " + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + "
      "; - text += "
      "; + text += tr( "Total disk space required:" ) + " " + QString::number( totSize ) + " KB
      " ; + text += tr( "Space for temporary files required:" ) + " " + QString::number( tempSize ) + " KB
      " ; choices->setText( text ); } // ================================================================ @@ -726,81 +1348,104 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle ) { QString tmpstr; QWidget* aPage = InstallWizard::page( pageTitle ); - if ( aPage == productsPage ) { - // ########## check if any products are selected to be installed - long totSize, tempSize; - bool anySelected = checkSize( &totSize, &tempSize ); - if ( !anySelected ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "Select one or more products to install" ), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - return false; + if ( aPage == typePage ) { + // installation type page + if ( installType == Binaries ) { // 'Binary' installation type + // check binaries directory + QFileInfo fib( QDir::cleanDirPath( getBinPath() ) ); + if ( !fib.exists() ) { + QMessageBox::warning( this, + tr( "Warning" ), + tr( "The directory %1 doesn't exist.\n" + "This directory must contain sources archives.\n").arg( fib.absFilePath() ), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + return false; + } + // check sources directory + QFileInfo fis( QDir::cleanDirPath( getSrcPath() ) ); + if ( !fis.exists() ) + if ( QMessageBox::warning( this, + tr( "Warning" ), + tr( "The directory %1 doesn't exist.\n" + "This directory must contain sources archives.\n" + "Continue?" ).arg( fis.absFilePath() ), + tr( "&Yes" ), + tr( "&No" ), + QString::null, 1, 1 ) == 1 ) + return false; + } + else { // 'Source' or 'Compile' installation type + // check sources directory + QFileInfo fis( QDir::cleanDirPath( getSrcPath() ) ); + if ( !fis.exists() ) { + QMessageBox::warning( this, + tr( "Warning" ), + tr( "The directory %1 doesn't exist.\n" + "This directory must contain sources archives.\n" ).arg( fis.absFilePath() ), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + return false; + } } + } + + else if ( aPage == dirPage ) { + // installation platform page // ########## check target and temp directories (existence and available disk space) // get dirs QString targetDir = QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ); QString tempDir = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ); - // directories should differ -// if (!targetDir.isEmpty() && tempDir == targetDir) { -// QMessageBox::warning( this, -// tr( "Warning" ), -// tr( "Target and temporary directories must be different"), -// QMessageBox::Ok, -// QMessageBox::NoButton, -// QMessageBox::NoButton ); -// return false; -// } // check target directory if ( targetDir.isEmpty() ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "Please, enter valid target directory path" ), - QMessageBox::Ok, + QMessageBox::warning( this, + tr( "Warning" ), + tr( "Please, enter valid target directory path" ), + QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton ); return false; } QFileInfo fi( QDir::cleanDirPath( targetDir ) ); if ( !fi.exists() ) { - bool toCreate = - QMessageBox::warning( this, - tr( "Warning" ), + bool toCreate = + QMessageBox::warning( this, + tr( "Warning" ), tr( "The directory %1 doesn't exist.\n" - "Do you want to create directory?" ).arg( fi.absFilePath() ), - QMessageBox::Yes, + "Create directory?" ).arg( fi.absFilePath() ), + QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton ) == QMessageBox::Yes; - if ( !toCreate) + if ( !toCreate) return false; if ( !makeDir( fi.absFilePath(), tmpstr ) ) { - QMessageBox::critical( this, - tr( "Error" ), - tr( "Can't create the directory\n%1").arg( fi.absFilePath() ), - QMessageBox::Ok, - QMessageBox::NoButton, + QMessageBox::critical( this, + tr( "Error" ), + tr( "Can't create the directory\n%1").arg( fi.absFilePath() ), + QMessageBox::Ok, + QMessageBox::NoButton, QMessageBox::NoButton ); return false; } } if ( !fi.isDir() ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "The directory %1 is not a directory.\n" - "Please, enter valid target directory path" ).arg( fi.absFilePath() ), - QMessageBox::Ok, + QMessageBox::warning( this, + tr( "Warning" ), + tr( "%1 is not a directory.\n" + "Please, enter valid target directory path" ).arg( fi.absFilePath() ), + QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton ); return false; } if ( !fi.isWritable() ) { - QMessageBox::warning( this, - tr( "Warning" ), + QMessageBox::warning( this, + tr( "Warning" ), tr( "The directory %1 is not writeable.\n" - "Please, enter valid target directory path or change permissions" ).arg( fi.absFilePath() ), - QMessageBox::Ok, + "Please, enter valid target directory path or change permissions" ).arg( fi.absFilePath() ), + QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton ); return false; @@ -816,205 +1461,255 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle ) QMessageBox::NoButton ) == QMessageBox::No ) { return false; } - QString binDir = "./Products/BINARIES"; - if ( !myOS.isEmpty() ) - binDir += "/" + myOS; - QFileInfo fib( QDir::cleanDirPath( binDir ) ); - if ( !fib.exists() ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "The directory %1 doesn't exist.\n" - "This directory must contain binaries archives." ).arg( fib.absFilePath() )); + // check temp directory + if ( tempDir.isEmpty() ) { + QMessageBox::warning( this, + tr( "Warning" ), + tr( "Please, enter valid temporary directory path" ), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + return false; + } + QFileInfo fit( QDir::cleanDirPath( tempDir ) ); + if ( !makeDir( fit.absFilePath() + TEMPDIRNAME, tmpCreated ) ) { + QMessageBox::critical( this, + tr( "Error" ), + tr( "Can't use temporary directory.\nCheck permissions for the %1 directory.").arg( fit.absFilePath() ), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + return false; + } + } + + else if ( aPage == productsPage ) { + // products page + // ########## check if any products are selected to be installed + long totSize, tempSize; + bool anySelected = checkSize( &totSize, &tempSize ); + if ( installType == Compile && removeSrcBtn->isOn() ) { + totSize += tempSize; + } + if ( !anySelected ) { + QMessageBox::warning( this, + tr( "Warning" ), + tr( "Select one or more products to install" ), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + return false; } // run script that checks available disk space for installing of products // returns 1 in case of error + QFileInfo fi( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ); QString script = "./config_files/checkSize.sh '"; script += fi.absFilePath(); script += "' "; script += QString( "%1" ).arg( totSize ); -#ifdef DEBUG - cout << "script = " << script << endl; -#endif + ___MESSAGE___( "script = " << script.latin1() ); if ( system( script ) ) { - QMessageBox::critical( this, - tr( "Out of space" ), - tr( "There is not available disk space for installing of selected products" ), - QMessageBox::Ok, - QMessageBox::NoButton, + QMessageBox::critical( this, + tr( "Out of space" ), + tr( "There is no available disk space for installing of selected products" ), + QMessageBox::Ok, + QMessageBox::NoButton, QMessageBox::NoButton ); return false; } - // check temp directory - if ( tempDir.isEmpty() ) { - if ( moreMode ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "Please, enter valid temp directory path" ), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - return false; - } - else { - tempDir = "/tmp"; - tempFolder->setText( tempDir ); - } - } - QFileInfo fit( QDir::cleanDirPath( tempDir ) ); - if ( !makeDir( fit.absFilePath() + TEMPDIRNAME, tmpCreated ) ) { - QMessageBox::critical( this, - tr( "Error" ), - tr( "Can't use temporary directory.\nCheck permissions for the %1 directory.").arg( fit.absFilePath() ), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - return false; - } + // AKL: 13/08/07 - skip tmp disk space checking (all files are unpacked into installation directory) ==> + /* // run script that check available disk space for temporary files // returns 1 in case of error + QFileInfo fit( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) ); QString tscript = "./config_files/checkSize.sh '"; tscript += fit.absFilePath(); tscript += "' "; tscript += QString( "%1" ).arg( tempSize ); -#ifdef DEBUG - cout << "script = " << tscript << endl; -#endif + ___MESSAGE___( "script = " << tscript.latin1() ); if ( system( tscript ) ) { - QMessageBox::critical( this, - tr( "Out of space" ), - tr( "There is not available disk space for the temporary files" ), - QMessageBox::Ok, - QMessageBox::NoButton, + QMessageBox::critical( this, + tr( "Out of space" ), + tr( "There is no available disk space for the temporary files" ), + QMessageBox::Ok, + QMessageBox::NoButton, QMessageBox::NoButton ); return false; - } -// VSR: <------------------------------------------------------------------------------ - // ########## check native products - QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() ); - QStringList natives; - while( item ) { - if ( productsMap.contains( item ) ) { - if ( item->childCount() > 0 ) { - if ( !productsView->isNone( item ) ) { - if ( item->text(2).isEmpty() || item->text(2).isNull() ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "You don't have a defined script for %1").arg(item->text(0)), - QMessageBox::Ok, - QMessageBox::NoButton, + } + */ + // AKL: 13/08/07 - skip tmp disk space checking (all files are unpacked into installation directory) <== + + // ########## check installation scripts + QCheckListItem* item; + ProductsView* prodsView = modulesView; + for ( int i = 0; i < 2; i++ ) { + item = (QCheckListItem*)( prodsView->firstChild() ); + while( item ) { + if ( productsMap.contains( item ) && item->isOn() ) { + // check installation script definition + if ( item->text(2).isEmpty() || item->text(2).isNull() ) { + QMessageBox::warning( this, + tr( "Error" ), + tr( "The installation script for %1 is not defined.").arg(item->text(0)), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + if ( !moreMode ) onMoreBtn(); + QListView* listView = item->listView(); + listView->setCurrentItem( item ); + listView->setSelected( item, true ); + listView->ensureItemVisible( item ); + return false; + } + // check installation script existence + else { + QFileInfo fi( QString("./config_files/") + item->text(2) ); + if ( !fi.exists() || !fi.isExecutable() ) { + QMessageBox::warning( this, + tr( "Error" ), + tr( "The script %1 required for %2 doesn't exist or doesn't have execute permissions.").arg("./config_files/" + item->text(2)).arg(item->text(0)), + QMessageBox::Ok, + QMessageBox::NoButton, QMessageBox::NoButton ); - productsView->setNone( item ); + if ( !moreMode ) onMoreBtn(); + QListView* listView = item->listView(); + listView->setCurrentItem( item ); + listView->setSelected( item, true ); + listView->ensureItemVisible( item ); return false; - } else { - QFileInfo fi( QString("./config_files/") + item->text(2) ); - if ( !fi.exists() ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "%1 required for %2 doesn't exist.").arg("./config_files/" + item->text(2)).arg(item->text(0)), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - productsView->setNone( item ); - return false; - } } } - // collect native products - if ( productsView->isNative( item ) ) { - if ( natives.find( item->text(0) ) == natives.end() ) - natives.append( item->text(0) ); - } - else if ( productsView->isBinaries( item ) || productsView->isSources( item ) ) { - QStringList dependOn = productsMap[ item ].getDependancies(); - for ( int i = 0; i < (int)dependOn.count(); i++ ) { - QCheckListItem* depitem = findItem( dependOn[ i ] ); - if ( depitem ) { - if ( productsView->isNative( depitem ) && natives.find( depitem->text(0) ) == natives.end() ) - natives.append( depitem->text(0) ); - } - else { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "%1 is required for %2 %3 installation.\n" - "Please, add this product in config.xml file.").arg(dependOn[ i ]).arg(item->text(0)).arg(item->text(1)), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - return false; - } + // check installation scripts dependencies + QStringList dependOn = productsMap[ item ].getDependancies(); + QString version = productsMap[ item ].getVersion(); + for ( int i = 0; i < (int)dependOn.count(); i++ ) { + QCheckListItem* depitem = findItem( dependOn[ i ] ); + if ( !depitem ) { + QMessageBox::warning( this, + tr( "Error" ), + tr( "%1 is required for %2 %3 installation.\n" + "This product is missing in the configuration file %4.").arg(dependOn[ i ]).arg(item->text(0)).arg(version).arg(xmlFileName), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + return false; } } } + item = (QCheckListItem*)( item->nextSibling() ); } - item = (QCheckListItem*)( item->nextSibling() ); + prodsView = prereqsView; } - QString tmpFolder = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME; - QString tgtFolder = QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ); - for ( unsigned i = 0; i < natives.count(); i++ ) { - item = findItem( natives[ i ] ); - if ( item ) { - QString script = "cd ./config_files/;" + item->text(2) + " try_native " + - QFileInfo( tmpFolder ).absFilePath() + " " + QDir::currentDirPath() + "/Products " + QFileInfo( tgtFolder ).absFilePath() + " " + - QUOTE(DefineDependeces(productsMap)) + " " + item->text(0); - -#ifdef DEBUG - cout << "1. Script : " << script << endl; -#endif - if ( system( script ) ) { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "You don't have native %1 %2 installed").arg(item->text(0)).arg(item->text(1)), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - productsView->setNone( item ); - return false; - } - } - else { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "%The product %1 %2 required for installation.\n" - "Please, add this product in config.xml file.").arg(item->text(0)).arg(item->text(1)), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - return false; - } +// return true; // return in order to avoid default postValidateEvent() action + } + return InstallWizard::acceptData( pageTitle ); +} +// ================================================================ +/*! + * SALOME_InstallWizard::checkSize + * Calculates disk space required for the installation + */ +// ================================================================ +bool SALOME_InstallWizard::checkSize( long* totSize, long* tempSize ) +{ + long tots = 0, temps = 0; + long maxSrcTmp = 0; + int nbSelected = 0; + + MapProducts::Iterator mapIter; + for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) { + QCheckListItem* item = mapIter.key(); + Dependancies dep = mapIter.data(); + if ( !item->isOn() ) + continue; + tots += ( QStringList::split( " ", item->text(1) )[0] ).toLong(); + maxSrcTmp = max( maxSrcTmp, dep.getSize( Compile ) - dep.getSize( Binaries ) ); + temps += dep.getTempSize( installType ); + nbSelected++; + } + + if ( totSize ) + if ( installType == Compile && removeSrcBtn->isOn() ) + temps += maxSrcTmp; + *totSize = tots; + if ( tempSize ) + *tempSize = temps; + return ( nbSelected > 0 ); +} +// ================================================================ +/*! + * SALOME_InstallWizard::updateAvailableSpace + * Slot to update 'Available disk space' field + */ +// ================================================================ +void SALOME_InstallWizard::updateAvailableSpace() +{ + if ( diskSpaceProc->normalExit() ) + availableSize->setText( diskSpaceProc->readLineStdout() + " KB"); +} +// ================================================================ +/*! + * SALOME_InstallWizard::checkFLibResult + * Slot to take result of Fortran libraries checking + */ +// ================================================================ +void SALOME_InstallWizard::checkFLibResult() +{ + if ( checkFLibProc->normalExit() && checkFLibProc->exitStatus() == 1 ) { + QStringList notFoundLibsList; + QString record = ""; + while ( checkFLibProc->canReadLineStdout() ) { + record = checkFLibProc->readLineStdout(); + if ( !record.isEmpty() && !notFoundLibsList.contains( record ) ) + notFoundLibsList.append( record ); } + QMessageBox::warning( this, + tr( "Warning" ), + tr( "The following libraries are absent on current system:\n" + "%1").arg( notFoundLibsList.join( "\n" ) ), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); } - return InstallWizard::acceptData( pageTitle ); + // Update GUI and check installation errors + completeInstallation(); } // ================================================================ /*! - * SALOME_InstallWizard::checkSize - * Calculates disk space required for the installation + * SALOME_InstallWizard::updateSizeColumn + * Sets required size for each product according to + * installation type and 'Remove SRC & TMP' checkbox state */ // ================================================================ -bool SALOME_InstallWizard::checkSize( long* totSize, long* tempSize ) +void SALOME_InstallWizard::updateSizeColumn() { - long tots = 0, temps = 0; - int nbSelected = 0; - + long prodSize = 0; + bool removeSrc = removeSrcBtn->isChecked(); MapProducts::Iterator mapIter; for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) { QCheckListItem* item = mapIter.key(); Dependancies dep = mapIter.data(); - if ( productsView->isBinaries( item ) ) { - tots += dep.getSize(); - } - else if ( productsView->isSources( item ) ) { - tots += dep.getSize(true); - temps = max( temps, dep.getTempSize() ); + // get required size for current product + long binSize = dep.getSize( Binaries ); + long srcSize = dep.getSize( Sources ); + long bldSize = dep.getSize( Compile ); + InstallationType instType = getInstType(); + if ( instType == Binaries ) { + if ( dep.getType() == "component" ) + prodSize = binSize + srcSize; + else + prodSize = ( binSize != 0 ? binSize : srcSize ); } - if ( !productsView->isNone( item ) ) - nbSelected++; + else if ( instType == Sources ) + prodSize = srcSize; + else + if ( removeSrc ) + prodSize = ( binSize != 0 ? binSize : srcSize ); + else { + prodSize = ( bldSize != 0 ? bldSize : srcSize ); + } + // fill in 'Size' field + item->setText( 1, QString::number( prodSize )+" KB" ); } - - if ( totSize ) - *totSize = tots; - if ( tempSize ) - *tempSize = temps; - return ( nbSelected > 0 ); } // ================================================================ /*! @@ -1025,21 +1720,29 @@ bool SALOME_InstallWizard::checkSize( long* totSize, long* tempSize ) // ================================================================ void SALOME_InstallWizard::checkProductPage() { + if ( this->currentPage() != productsPage ) + return; long tots = 0, temps = 0; - // check if any product is selected; bool isAnyProductSelected = checkSize( &tots, &temps ); - // check if target directory is valid - bool isTargetDirValid = !targetFolder->text().stripWhiteSpace().isEmpty(); - // check if temp directory is valid - bool isTempDirValid = !moreMode || !tempFolder->text().stripWhiteSpace().isEmpty(); // update required size information - requiredSize->setText( QString::number( tots ) + " Kb"); - requiredTemp->setText( QString::number( temps ) + " Kb"); + requiredSize->setText( QString::number( tots ) + " KB"); + requiredTemp->setText( QString::number( temps ) + " KB"); + + // update available size information + QFileInfo fi( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ); + if ( fi.exists() ) { + diskSpaceProc->clearArguments(); + QString script = "./config_files/diskSpace.sh"; + diskSpaceProc->addArgument( script ); + diskSpaceProc->addArgument( fi.absFilePath() ); + // run script + diskSpaceProc->start(); + } // enable/disable "Next" button - setNextEnabled( productsPage, isAnyProductSelected && isTargetDirValid && isTempDirValid ); + setNextEnabled( productsPage, isAnyProductSelected ); } // ================================================================ /*! @@ -1051,25 +1754,87 @@ void SALOME_InstallWizard::setPrerequisites( QCheckListItem* item ) { if ( !productsMap.contains( item ) ) return; - if ( productsView->isNone( item ) ) + if ( !item->isOn() ) return; // get all prerequisites QStringList dependOn = productsMap[ item ].getDependancies(); + // install MED without GUI case + if ( installGuiBtn->state() != QButton::On && item->text(0) == "MED" ) { + dependOn.remove( "GUI" ); + } + // setting prerequisites for ( int i = 0; i < (int)dependOn.count(); i++ ) { MapProducts::Iterator itProd; for ( itProd = productsMap.begin(); itProd != productsMap.end(); ++itProd ) { if ( itProd.data().getName() == dependOn[ i ] ) { - if ( productsView->isNone( itProd.key() ) ) { - QString defMode = itProd.data().getDefault(); - if ( defMode.isEmpty() ) - defMode = tr( "install binaries" ); - if ( defMode == tr( "install binaries" ) ) - productsView->setBinaries( itProd.key() ); - else if ( defMode == tr( "install sources" ) ) - productsView->setSources( itProd.key() ); - else if ( defMode == tr( "use native" ) ) - productsView->setNative( itProd.key() ); - setPrerequisites( itProd.key() ); + if ( itProd.data().getType() == "component" && !itProd.key()->isOn() ) + itProd.key()->setOn( true ); + else if ( itProd.data().getType() == "prerequisite" ) { + itProd.key()->setOn( true ); + itProd.key()->setEnabled( false ); + } + } + } + } +} +// ================================================================ +/*! + * SALOME_InstallWizard::unsetPrerequisites + * Unsets all modules which depend of the unchecked product ( recursively ) + */ +// ================================================================ +void SALOME_InstallWizard::unsetPrerequisites( QCheckListItem* item ) +{ + if ( !productsMap.contains( item ) ) + return; + if ( item->isOn() ) + return; + +// uncheck dependent products + QString itemName = productsMap[ item ].getName(); + MapProducts::Iterator itProd; + for ( itProd = productsMap.begin(); itProd != productsMap.end(); ++itProd ) { + if ( itProd.data().getType() == productsMap[ item ].getType() ) { + QStringList dependOn = itProd.data().getDependancies(); + // install MED without GUI case + if ( installGuiBtn->state() != QButton::On && itemName == "GUI" ) { + dependOn.remove( "MED" ); + } + for ( int i = 0; i < (int)dependOn.count(); i++ ) { + if ( dependOn[ i ] == itemName ) { + if ( itProd.key()->isOn() ) { + itProd.key()->setOn( false ); + } + } + } + } + } + +// uncheck prerequisites + int nbDependents; +// cout << "item name = " << productsMap[ item ].getName() << endl; + QStringList dependOnList = productsMap[ item ].getDependancies(); + for ( int j = 0; j < (int)dependOnList.count(); j++ ) { + nbDependents = 0; + MapProducts::Iterator itProd1; + for ( itProd1 = productsMap.begin(); itProd1 != productsMap.end(); ++itProd1 ) { + if ( itProd1.data().getName() == dependOnList[ j ] ) { + if ( itProd1.data().getType() == "prerequisite" ) { + MapProducts::Iterator itProd2; + for ( itProd2 = productsMap.begin(); itProd2 != productsMap.end(); ++itProd2 ) { + if ( itProd2.key()->isOn() ) { + QStringList prereqsList = productsMap[ itProd2.key() ].getDependancies(); + for ( int k = 0; k < (int)prereqsList.count(); k++ ) { + if ( prereqsList[ k ] == itProd1.data().getName() ) { + nbDependents++; + } + } + } + } + if ( nbDependents == 0 ) { + itProd1.key()->setEnabled( true ); + itProd1.key()->setOn( false ); + } } } } @@ -1086,12 +1851,12 @@ void SALOME_InstallWizard::launchScript() // try to find product being processed now QString prodProc = progressView->findStatus( Processing ); if ( !prodProc.isNull() ) { -#ifdef DEBUG - cout << "Found : " << prodProc.latin1() << endl; -#endif + ___MESSAGE___( "Found : " ); // if found - set status to "completed" progressView->setStatus( prodProc, Completed ); + // ... clear status label + statusLab->clear(); // ... and call this method again launchScript(); return; @@ -1099,93 +1864,98 @@ void SALOME_InstallWizard::launchScript() // else try to find next product which is not processed yet prodProc = progressView->findStatus( Waiting ); if ( !prodProc.isNull() ) { -#ifdef DEBUG - cout << "Found : " << prodProc.latin1() << endl; -#endif + ___MESSAGE___( "Found : " << prodProc.latin1() ); // if found - set status to "processed" and run script progressView->setStatus( prodProc, Processing ); progressView->ensureVisible( prodProc ); - - QCheckListItem* item = findItem( prodProc ); - Dependancies dep = productsMap[ item ]; + + QCheckListItem* item; + if ( prodProc != "gcc" ) + item = findItem( prodProc ); // fill in script parameters shellProcess->clearArguments(); // ... script name shellProcess->setWorkingDirectory( QDir::cleanDirPath( QFileInfo( "./config_files/" ).absFilePath() ) ); - shellProcess->addArgument( item->text(2) ); + if ( prodProc != "gcc" ) + shellProcess->addArgument( item->text(2) ); + else + shellProcess->addArgument( "gcc-common.sh" ); // ... temp folder QString tmpFolder = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME; //if( !tempFolder->isEnabled() ) - //tmpFolder = "/tmp"; + // tmpFolder = "/tmp"; + // ... not install : try to find preinstalled + if ( !progressView->isVisible( prodProc ) ) { + shellProcess->addArgument( "try_preinstalled" ); + shellProcess->addArgument( QFileInfo( tmpFolder ).absFilePath() ); + shellProcess->addArgument( QDir::currentDirPath() + "/Products" ); + statusLab->setText( tr( "Collecting environment for '" ) + prodProc + "'..." ); + } // ... binaries ? - if ( productsView->isBinaries( item ) ) { + else if ( installType == Binaries ) { shellProcess->addArgument( "install_binary" ); shellProcess->addArgument( QFileInfo( tmpFolder ).absFilePath() ); - QString binDir = QDir::currentDirPath() + "/Products/BINARIES"; - if ( !myOS.isEmpty() ) - binDir += "/" + myOS; + QString binDir = QDir::cleanDirPath( getBinPath() ); + QString OS = getPlatform(); + if ( !OS.isEmpty() ) + binDir += "/" + OS; shellProcess->addArgument( binDir ); + statusLab->setText( tr( "Installing '" ) + prodProc + "'..." ); } - // ... sources ? - else if ( productsView->isSources( item ) ) { - shellProcess->addArgument( "install_source" ); - shellProcess->addArgument( QFileInfo( tmpFolder ).absFilePath() ); - shellProcess->addArgument( QDir::currentDirPath() + "/Products/SOURCES" ); - } - // ... native ? - else if ( productsView->isNative( item ) ) { - shellProcess->addArgument( "try_native" ); - shellProcess->addArgument( QFileInfo( tmpFolder ).absFilePath() ); - shellProcess->addArgument( QDir::currentDirPath() + "/Products" ); - } - // ... not install : try to find preinstalled + // ... sources or sources_and_compilation ? else { - shellProcess->addArgument( "try_preinstalled" ); + shellProcess->addArgument( installType == Sources ? "install_source" : + "install_source_and_build" ); shellProcess->addArgument( QFileInfo( tmpFolder ).absFilePath() ); - shellProcess->addArgument( QDir::currentDirPath() + "/Products" ); + shellProcess->addArgument( QDir::cleanDirPath( getSrcPath() ) ); + statusLab->setText( tr( "Installing '" ) + prodProc + "'..." ); } // ... target folder QString tgtFolder = QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ); shellProcess->addArgument( QFileInfo( tgtFolder ).absFilePath() ); - - - QString depproducts = DefineDependeces(productsMap); -#ifdef DEBUG - cout << "Dependancies"<< depproducts.latin1() << endl; -#endif - + // ... list of all products + QString depproducts = DefineDependeces(productsMap); + depproducts.prepend( "gcc " ); + ___MESSAGE___( "Dependancies"<< depproducts.latin1() ); shellProcess->addArgument( depproducts ); - // ... product name - currently instaled product - shellProcess->addArgument( item->text(0) ); - + // ... product name - currently installed product + if ( prodProc != "gcc" ) + shellProcess->addArgument( item->text(0) ); + else + shellProcess->addArgument( "gcc" ); + // ... list of products being installed + shellProcess->addArgument( prodSequence.join( " " ) ); + // ... sources directory + shellProcess->addArgument( QDir::cleanDirPath( getSrcPath() ) ); + // ... remove sources and tmp files or not? + if ( installType == Compile && removeSrcBtn->isOn() ) + shellProcess->addArgument( "TRUE" ); + else + shellProcess->addArgument( "FALSE" ); + // ... install MED with GUI or not? + if ( installGuiBtn->state() != QButton::On && prodProc == "MED" && + (installType == Binaries || installType == Compile) ) + shellProcess->addArgument( "FALSE" ); // run script if ( !shellProcess->start() ) { // error handling can be here -#ifdef DEBUG - cout << "error" << endl; -#endif + ___MESSAGE___( "error" ); } return; } -#ifdef DEBUG - cout << "All products have been installed successfully" << endl; -#endif + ___MESSAGE___( "All products have been installed successfully" ); // all products are installed successfully - QString workDir = QDir::cleanDirPath( QFileInfo( "./config_files/" ).absFilePath() ); MapProducts::Iterator mapIter; -#ifdef DEBUG - cout << "starting pick-up environment" << endl; -#endif + ___MESSAGE___( "starting pick-up environment" ); + QString depproducts = QUOTE( DefineDependeces(productsMap).prepend( "gcc " ) ); for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) { QCheckListItem* item = mapIter.key(); Dependancies dep = mapIter.data(); - QString depproducts = QUOTE( DefineDependeces(productsMap) ); - if ( dep.pickUpEnvironment() ) { -#ifdef DEBUG - cout << "... for " << dep.getName() << endl; -#endif + if ( item->isOn() && dep.pickUpEnvironment() ) { + statusLab->setText( tr( "Pick-up products environment for " ) + dep.getName().latin1() + "..." ); + ___MESSAGE___( "... for " << dep.getName().latin1() ); QString script; script += "cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; "; script += item->text(2) + " "; @@ -1194,33 +1964,103 @@ void SALOME_InstallWizard::launchScript() script += QUOTE( QFileInfo( QDir::cleanDirPath( QDir::currentDirPath() + "/Products" ) ).absFilePath() ) + " "; script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " "; script += depproducts + " "; - script += item->text(0); -#ifdef DEBUG - cout << "... --> " << script.latin1() << endl; -#endif - if ( system( script.latin1() ) ) { -#ifdef DEBUG - cout << "ERROR" << endl; -#endif + script += item->text(0) + " "; + script += QUOTE( prodSequence.join( " " ) ); + ___MESSAGE___( "... --> " << script.latin1() ); + if ( system( script.latin1() ) ) { + ___MESSAGE___( "ERROR" ); } } } + + if ( installType == Binaries ) { + // Check Fortran libraries + // ... update status label + statusLab->setText( tr( "Check Fortran libraries..." ) ); + // ... search "not found" libraries + checkFLibProc->setWorkingDirectory( QDir::cleanDirPath( QFileInfo( "./config_files/" ).absFilePath() ) ); + checkFLibProc->addArgument( "checkFortran.sh" ); + checkFLibProc->addArgument( "find_libraries" ); + checkFLibProc->addArgument( QDir::cleanDirPath( QFileInfo( targetFolder->text().stripWhiteSpace() ).absFilePath() ) ); + // ... run script + if ( !checkFLibProc->start() ) { + ___MESSAGE___( "Error: process could not start!" ); + } + } + else + // Update GUI and check installation errors + completeInstallation(); + +} +// ================================================================ +/*! + * SALOME_InstallWizard::completeInstallation + * Update GUI and check installation errors + */ +// ================================================================ +void SALOME_InstallWizard::completeInstallation() +{ + // update status label + statusLab->setText( tr( "Installation completed" ) ); // button - nextButton()->setEnabled( true ); + setNextEnabled( true ); nextButton()->setText( tr( "&Next >" ) ); - QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - QToolTip::add ( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - nextButton()->disconnect(); - connect( nextButton(), SIGNAL( clicked() ), this, SLOT( next() ) ); + setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); // button - backButton()->setEnabled( true ); + setBackEnabled( true ); // script parameters passedParams->clear(); passedParams->setEnabled( false ); QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f ); + installInfo->setFinished( true ); if ( isMinimized() ) showNormal(); raise(); + if ( hasErrors ) { + if ( QMessageBox::warning( this, + tr( "Warning" ), + tr( "There were some errors and/or warnings during the installation.\n" + "Do you want to save the installation log?" ), + tr( "&Save" ), + tr( "&Cancel" ), + QString::null, + 0, + 1 ) == 0 ) + saveLog(); + } + hasErrors = false; + +} +// ================================================================ +/*! + * SALOME_InstallWizard::onInstallGuiBtn + * check-box slot + */ +// ================================================================ +void SALOME_InstallWizard::onInstallGuiBtn() +{ + MapProducts::Iterator itProd; + for ( itProd = productsMap.begin(); itProd != productsMap.end(); ++itProd ) { + if ( itProd.data().getType() == "component" ) { + if ( installGuiBtn->state() == QButton::On ) { + itProd.key()->setEnabled( true ); + itProd.key()->setOn( true ); + } + else { + QString itemName = itProd.data().getName(); + if ( itemName != "KERNEL" && itemName != "MED" && + itemName != "SAMPLES" && itemName != "DOCUMENTATION" ) { + itProd.key()->setOn( false ); + itProd.key()->setEnabled( false ); + } + else + itProd.key()->setOn( true ); + } + } + } } // ================================================================ /*! @@ -1231,71 +2071,72 @@ void SALOME_InstallWizard::launchScript() void SALOME_InstallWizard::onMoreBtn() { if ( moreMode ) { - moreBox->hide(); - moreBtn->setText( tr( "More..." ) ); + prereqsView->hide(); + moreBtn->setText( tr( "Show prerequisites..." ) ); + setAboutInfo( moreBtn, tr( "Show list of prerequisites" ) ); } else { - moreBox->show(); - moreBtn->setText( tr( "Less..." ) ); + prereqsView->show(); + moreBtn->setText( tr( "Hide prerequisites" ) ); + setAboutInfo( moreBtn, tr( "Hide list of prerequisites" ) ); } qApp->processEvents(); moreMode = !moreMode; InstallWizard::layOut(); qApp->processEvents(); if ( !isMaximized() ) { - //setGeometry( geometry().x(), geometry().y(), geometry().width(), 0 ); - resize( geometry().width(), 0 ); qApp->processEvents(); } checkProductPage(); } // ================================================================ /*! - * SALOME_InstallWizard::onLaunchSalome - * button slot + * SALOME_InstallWizard::onFinishButton + * Operation buttons slot */ // ================================================================ -void SALOME_InstallWizard::onLaunchSalome() +void SALOME_InstallWizard::onFinishButton() { - QString msg = tr( "You don't have SALOME binaries installed in the %1 directory!" ).arg( targetFolder->text() ); - - QCheckListItem* item = findItem( "KERNEL-Bin" ); - if ( item ) { - QFileInfo fi( targetFolder->text() + "/KERNEL_" + item->text(1) + "/bin/salome/runSalome" ); - QFileInfo fienv( targetFolder->text() + "/KERNEL_" + item->text(1) + "/salome.csh" ); - if ( fienv.exists() ) { - if ( fi.exists() ) { - QString script; - script += "cd " + targetFolder->text() + "/KERNEL_" + item->text(1) + "; "; - script += "source salome.csh; "; - script += "cd bin/salome; "; - script += "runSalome > /dev/null"; - script = "(csh -c '" + script + "')"; -#ifdef DEBUG - cout << script.latin1() << endl; -#endif - if ( !system( script.latin1() ) ) - return; - else - msg = tr( "Can't launch SALOME." ); + const QObject* btn = sender(); + ButtonList::Iterator it; + for ( it = buttons.begin(); it != buttons.end(); ++it ) { + if ( (*it).button() && (*it).button() == btn ) { + QString script; + script += "( cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; "; + script += + (*it).script(); + script += " execute "; + script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " "; + script += QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ) + " "; + script += " > /dev/null )"; + ___MESSAGE___( "script: " << script.latin1() ); + if ( (*it).script().isEmpty() || system( script.latin1() ) ) { + QMessageBox::warning( this, + tr( "Error" ), + tr( "Can't perform action!"), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); } - else - msg = tr( "Can't launch SALOME." ) + "\n" + tr( "runSalome file can not be found." ); + return; } - else - msg = tr( "Can't launch SALOME." ) + "\n" + tr( "Can't find environment file." ); - } - QMessageBox::warning( this, - tr( "Error" ), - msg, - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); + } +} +// ================================================================ +/*! + * SALOME_InstallWizard::onAbout + * button slot: shows dialog box + */ +// ================================================================ +void SALOME_InstallWizard::onAbout() +{ + AboutDlg d( this ); + d.exec(); } + // ================================================================ /*! * SALOME_InstallWizard::findItem - * Searches product listview item with given symbolic name + * Searches product listview item with given symbolic name */ // ================================================================ QCheckListItem* SALOME_InstallWizard::findItem( const QString& sName ) @@ -1334,14 +2175,12 @@ void SALOME_InstallWizard::abort() // ================================================================ void SALOME_InstallWizard::reject() { -#ifdef DEBUG - cout << "REJECTED" << endl; -#endif + ___MESSAGE___( "REJECTED" ); if ( !exitConfirmed ) { - if ( QMessageBox::information( this, - tr( "Exit" ), - tr( "Do you want to quit %1?" ).arg( getIWName() ), - tr( "&Yes" ), + if ( QMessageBox::information( this, + tr( "Exit" ), + tr( "Do you want to quit %1?" ).arg( getIWName() ), + tr( "&Yes" ), tr( "&No" ), QString::null, 0, @@ -1350,7 +2189,7 @@ void SALOME_InstallWizard::reject() } exitConfirmed = true; } - clean(); + clean(true); InstallWizard::reject(); } // ================================================================ @@ -1361,41 +2200,39 @@ void SALOME_InstallWizard::reject() // ================================================================ void SALOME_InstallWizard::accept() { -#ifdef DEBUG - cout << "ACCEPTED" << endl; -#endif - clean(); + ___MESSAGE___( "ACCEPTED" ); + clean(true); InstallWizard::accept(); } // ================================================================ /*! * SALOME_InstallWizard::clean - * Clears and removes temporary directory + * Clears and (optionally) removes temporary directory */ // ================================================================ -void SALOME_InstallWizard::clean() +void SALOME_InstallWizard::clean(bool rmDir) { - // VSR: first remove temporary files + WarnDialog::showWarnDlg( 0, false ); + myThread->clearCommands(); + myWC.wakeAll(); + while ( myThread->running() ); + // first remove temporary files QString script = "cd ./config_files/; remove_tmp.sh '"; script += tempFolder->text().stripWhiteSpace() + TEMPDIRNAME; script += "' "; script += QUOTE(DefineDependeces(productsMap)); script += " > /dev/null"; -#ifdef DEBUG - cout << "script = " << script << endl; -#endif + ___MESSAGE___( "script = " << script.latin1() ); if ( system( script.latin1() ) ) { } - // VSR: then try to remove created temporary directory + // then try to remove created temporary directory //script = "rm -rf " + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME; - if ( !tmpCreated.isNull() ) { + if ( rmDir && !tmpCreated.isNull() ) { script = "rm -rf " + tmpCreated; script += " > /dev/null"; if ( system( script.latin1() ) ) { } -#ifdef DEBUG - cout << "script = " << script << endl; -#endif + ___MESSAGE___( "script = " << script.latin1() ); } } // ================================================================ @@ -1407,10 +2244,10 @@ void SALOME_InstallWizard::clean() void SALOME_InstallWizard::pageChanged( const QString & mytitle) { nextButton()->setText( tr( "&Next >" ) ); - QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - QToolTip::add ( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - nextButton()->disconnect(); - connect( nextButton(), SIGNAL( clicked() ), this, SLOT( next() ) ); + setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); cancelButton()->disconnect(); connect( cancelButton(), SIGNAL( clicked()), this, SLOT( reject() ) ); @@ -1418,7 +2255,70 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle) if ( !aPage ) return; updateCaption(); - if ( aPage == productsPage ) { + + if ( aPage == typePage ) { + // installation type page + if ( buttonGrp->id( buttonGrp->selected() ) == -1 ) + binBtn->animateClick(); // set default installation type + } + else if ( aPage == platformsPage ) { + // installation platforms page + MapXmlFiles::Iterator it; + if ( previousPage == typePage ) { + for ( it = platformsMap.begin(); it != platformsMap.end(); ++it ) { + QString plat = it.key(); + QRadioButton* rb = ( (QRadioButton*) platBtnGrp->child( plat ) ); + if ( installType == Binaries ) { + QFileInfo fib( QDir::cleanDirPath( getBinPath() + "/" + plat ) ); + rb->setEnabled( fib.exists() ); + } + else { + QFileInfo fis( QDir::cleanDirPath( getSrcPath() ) ); + rb->setEnabled( fis.exists() ); + } + rb->setChecked( rb->isChecked() && rb->isEnabled() ); + } + setNextEnabled( platformsPage, platBtnGrp->id( platBtnGrp->selected() ) != -1 ); + } + } + else if ( aPage == dirPage ) { + // installation and temporary directories page + if ( ( indexOf( platformsPage ) != -1 ? + previousPage == platformsPage : previousPage == typePage ) + && stateChanged ) { + // clear global variables before reading XML file + modulesView->clear(); + prereqsView->clear(); + productsMap.clear(); + // read XML file + StructureParser* parser = new StructureParser( this ); + parser->setProductsLists( modulesView, prereqsView ); + if ( targetFolder->text().isEmpty() ) + parser->setTargetDir( targetFolder ); + if ( tempFolder->text().isEmpty() ) + parser->setTempDir( tempFolder ); + parser->readXmlFile( xmlFileName ); + // update required size for each product + updateSizeColumn(); + // take into account command line parameters + if ( !myTargetPath.isEmpty() ) + targetFolder->setText( myTargetPath ); + if ( !myTmpPath.isEmpty() ) + tempFolder->setText( myTmpPath ); + // set all modules to be checked and first module to be selected + installGuiBtn->setState( QButton::Off ); + installGuiBtn->setState( QButton::On ); + if ( modulesView->childCount() > 0 && !modulesView->selectedItem() ) + modulesView->setSelected( modulesView->firstChild(), true ); + stateChanged = false; + } + else if ( rmSrcPrevState != removeSrcBtn->isChecked() ) { + // only update required size for each product + updateSizeColumn(); + rmSrcPrevState = removeSrcBtn->isChecked(); + } + } + else if ( aPage == productsPage ) { // products page onSelectionChanged(); checkProductPage(); @@ -1430,34 +2330,71 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle) else if ( aPage == progressPage ) { if ( previousPage == prestartPage ) { // progress page + statusLab->clear(); progressView->clear(); installInfo->clear(); + installInfo->setFinished( false ); passedParams->clear(); passedParams->setEnabled( false ); QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f ); nextButton()->setText( tr( "&Start" ) ); - QWhatsThis::add( nextButton(), tr( "Starts installation process" ) ); - QToolTip::add ( nextButton(), tr( "Starts installation process" ) ); + setAboutInfo( nextButton(), tr( "Start installation process" ) ); // reconnect Next button - to use it as Start button - nextButton()->disconnect(); - connect( nextButton(), SIGNAL( clicked() ), this, SLOT( onStart() ) ); - nextButton()->setEnabled( true ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + setNextEnabled( true ); // reconnect Cancel button to terminate process cancelButton()->disconnect(); connect( cancelButton(), SIGNAL( clicked() ), this, SLOT( tryTerminate() ) ); } } else if ( aPage == readmePage ) { - QCheckListItem* item = findItem( "KERNEL-Bin" ); - runSalomeBtn->setEnabled( item && - QFileInfo( targetFolder->text() + "/KERNEL_" + item->text(1) + "/bin/salome/runSalome" ).exists() && - QFileInfo( targetFolder->text() + "/KERNEL_" + item->text(1) + "/salome.csh" ).exists() ); + ButtonList::Iterator it; + for ( it = buttons.begin(); it != buttons.end(); ++it ) { + if ( (*it).button() ) { + QString script; + script += "( cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; "; + script += + (*it).script(); + script += " check_enabled "; + script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " "; + script += QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ) + " "; + script += " > /dev/null )"; + ___MESSAGE___( "script: " << script.latin1() ); + (*it).button()->setEnabled( !(*it).script().isEmpty() && !system( script.latin1() ) ); + } + } finishButton()->setEnabled( true ); } previousPage = aPage; -#ifdef DEBUG - cout << "previousPage = " << previousPage << endl; -#endif + ___MESSAGE___( "previousPage = " << previousPage ); +} +// ================================================================ +/*! + * SALOME_InstallWizard::onButtonGroup + * Called when user selected either installation type or installation platform + */ +// ================================================================ +void SALOME_InstallWizard::onButtonGroup( int rbIndex ) +{ + int prevType = installType; + QString prevPlat = getPlatform(); + QWidget* aPage = InstallWizard::currentPage(); + if ( aPage == typePage ) { + installType = InstallationType( rbIndex ); + // management of the check-box + removeSrcBtn->setEnabled( installType == Compile ); + } + else if ( aPage == platformsPage ) { + refPlatform = platBtnGrp->find( rbIndex )->name(); + xmlFileName = platformsMap[ refPlatform ]; +// cout << xmlFileName << endl; + setNextEnabled( platformsPage, true ); + } + if ( prevType != installType || + ( indexOf( platformsPage ) != -1 ? prevPlat != getPlatform() : false ) ) { + stateChanged = true; + } } // ================================================================ /*! @@ -1474,8 +2411,8 @@ void SALOME_InstallWizard::helpClicked() helpWindow->installEventFilter( this ); } else { - QMessageBox::warning( this, - tr( "Help file not found" ), + QMessageBox::warning( this, + tr( "Help file not found" ), tr( "Sorry, help is unavailable" ) ); } } @@ -1505,7 +2442,6 @@ void SALOME_InstallWizard::browseDirectory() theFolder->setText( typedDir ); theFolder->end( false ); } - checkProductPage(); } // ================================================================ /*! @@ -1525,40 +2461,170 @@ void SALOME_InstallWizard::directoryChanged( const QString& /*text*/ ) // ================================================================ void SALOME_InstallWizard::onStart() { - // clear list of products to install ... + if ( nextButton()->text() == tr( "&Stop" ) ) { + statusLab->setText( tr( "Aborting installation..." ) ); + shellProcess->kill(); + while( shellProcess->isRunning() ); + statusLab->setText( tr( "Installation has been aborted by user" ) ); + return; + } + + hasErrors = false; + progressView->clear(); + installInfo->clear(); + installInfo->setFinished( false ); + passedParams->clear(); + passedParams->setEnabled( false ); + QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f ); + + // update status label + statusLab->setText( tr( "Preparing for installation..." ) ); + // clear lists of products toInstall.clear(); + notInstall.clear(); // ... and fill it for new process - QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() ); + toInstall.append( "gcc" ); + QCheckListItem* item = (QCheckListItem*)( prereqsView->firstChild() ); + while( item ) { + if ( productsMap.contains( item ) ) { + if ( item->isOn() ) + toInstall.append( productsMap[item].getName() ); + else + notInstall.append( productsMap[item].getName() ); + } + item = (QCheckListItem*)( item->nextSibling() ); + } + item = (QCheckListItem*)( modulesView->firstChild() ); while( item ) { -// if ( productsView->isBinaries( item ) || productsView->isSources( item ) || productsView->isNative( item ) ) { - if ( productsMap.contains( item ) ) - toInstall.append( productsMap[item].getName() ); -// } + if ( productsMap.contains( item ) ) { + if ( item->isOn() ) + toInstall.append( productsMap[item].getName() ); + else + notInstall.append( productsMap[item].getName() ); + } item = (QCheckListItem*)( item->nextSibling() ); } // if something at all is selected - if ( !toInstall.isEmpty() ) { + if ( (int)toInstall.count() > 1 ) { + + if ( installType == Compile ) { + // update status label + statusLab->setText( tr( "Check Fortran compiler..." ) ); + // check Fortran compiler. + QString script = "./config_files/checkFortran.sh find_compilers"; + script += " " + QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ); + ___MESSAGE___( "script = " << script.latin1() ); + if ( system( script ) ) { + QMessageBox::critical( this, + tr( "Error" ), + tr( "Fortran compiler was not found at current system!\n" + "Installation can not be continued!"), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + // installation aborted + abort(); + statusLab->setText( tr( "Installation has been aborted" ) ); + // enable button + setNextEnabled( true ); + nextButton()->setText( tr( "&Start" ) ); + setAboutInfo( nextButton(), tr( "Start installation process" ) ); + // reconnect Next button - to use it as Start button + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + // enable button + setBackEnabled( true ); + return; + } + } + + // update status label + statusLab->setText( tr( "Preparing for installation..." ) ); + + clean(false); // VSR 07/02/05 - bug fix: first we should clear temporary directory // disable button - nextButton()->setEnabled( false ); + //setNextEnabled( false ); + nextButton()->setText( tr( "&Stop" ) ); + setAboutInfo( nextButton(), tr( "Abort installation process" ) ); // disable button - backButton()->setEnabled ( false ); + setBackEnabled( false ); // enable script parameters line edit // VSR commented: 18/09/03: passedParams->setEnabled( true ); // VSR commented: 18/09/03: passedParams->setFocus(); - // set status for all products + ProgressViewItem* progressItem; + // set status for installed products for ( int i = 0; i < (int)toInstall.count(); i++ ) { - item = findItem( toInstall[ i ] ); - QString type = ""; - if ( productsView->isBinaries( item ) ) - type = tr( "binaries" ); - else if ( productsView->isSources( item ) ) - type = tr( "sources" ); - else if ( productsView->isNative( item ) ) - type = tr( "native" ); - else - type = tr( "not install" ); - progressView->addProduct( item->text(0), type, item->text(2) ); + if ( toInstall[i] != "gcc" ) { + item = findItem( toInstall[i] ); + progressView->addProduct( item->text(0), item->text(2) ); + continue; + } + progressItem = progressView->addProduct( "gcc", "gcc-common.sh" ); + progressItem->setVisible( false ); + } + // set status for not installed products + for ( int i = 0; i < (int)notInstall.count(); i++ ) { + item = findItem( notInstall[i] ); + progressItem = progressView->addProduct( item->text(0), item->text(2) ); + progressItem->setVisible( false ); + } + // get specified list of products being installed + prodSequence.clear(); + for (int i = 0; i<(int)toInstall.count(); i++ ) { + if ( toInstall[i] == "gcc" ) { + prodSequence.append( toInstall[i] ); + continue; + } + if ( installType == Binaries ) { + prodSequence.append( toInstall[i] ); + QString prodType; + MapProducts::Iterator mapIter; + for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) { + if ( mapIter.data().getName() == toInstall[i] && mapIter.data().getType() == "component" ) { + prodSequence.append( toInstall[i] + "_src" ); + break; + } + } + } + else if ( installType == Sources ) + prodSequence.append( toInstall[i] + "_src" ); + else { + prodSequence.append( toInstall[i] ); + prodSequence.append( toInstall[i] + "_src" ); + } + } + + // create a backup of 'env_build.csh', 'env_build.sh', 'env_products.csh', 'env_products.sh' + // ( backup of 'salome.csh' and 'salome.sh' is made if pick-up environment is called ) + QString script = "./config_files/backupEnv.sh "; + script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ); + ___MESSAGE___( "script = " << script.latin1() ); + if ( system( script ) ) { + if ( QMessageBox::warning( this, + tr( "Warning" ), + tr( "Backup environment files have not been created.\n" + "Do you want to continue an installation process?" ), + tr( "&Yes" ), + tr( "&No" ), + QString::null, 0, 1 ) == 1 ) { + // installation aborted + abort(); + statusLab->setText( tr( "Installation has been aborted by user" ) ); + // enable button + setNextEnabled( true ); + nextButton()->setText( tr( "&Start" ) ); + setAboutInfo( nextButton(), tr( "Start installation process" ) ); + // reconnect Next button - to use it as Start button + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + // enable button + setBackEnabled( true ); + return; + } } + // launch install script launchScript(); } @@ -1583,37 +2649,39 @@ void SALOME_InstallWizard::onReturnPressed() /*! Callback function - as response for the script finishing */ -void SALOME_InstallWizard::productInstalled( ) +void SALOME_InstallWizard::productInstalled() { -#ifdef DEBUG - cout << "process exited" << endl; -#endif + ___MESSAGE___( "process exited" ); if ( shellProcess->normalExit() ) { -#ifdef DEBUG - cout << "...normal exit" << endl; -#endif + ___MESSAGE___( "...normal exit" ); // normal exit - try to proceed installation further launchScript(); } else { -#ifdef DEBUG - cout << "...abnormal exit" << endl; -#endif + ___MESSAGE___( "...abnormal exit" ); + statusLab->setText( tr( "Installation has been aborted" ) ); // installation aborted abort(); // clear script passed parameters lineedit passedParams->clear(); passedParams->setEnabled( false ); QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f ); + installInfo->setFinished( true ); // enable button - nextButton()->setEnabled( true ); - nextButton()->setText( tr( "&Next >" ) ); - QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - QToolTip::add ( nextButton(), tr( "Moves to the next step of the installation procedure" ) ); - nextButton()->disconnect(); - connect( nextButton(), SIGNAL( clicked() ), this, SLOT( next() ) ); + setNextEnabled( true ); + nextButton()->setText( tr( "&Start" ) ); + setAboutInfo( nextButton(), tr( "Start installation process" ) ); + // reconnect Next button - to use it as Start button + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); + disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + //nextButton()->setText( tr( "&Next >" ) ); + //setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) ); + //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); + //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); + //connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); // enable button - backButton()->setEnabled( true ); + setBackEnabled( true ); } } // ================================================================ @@ -1625,10 +2693,10 @@ void SALOME_InstallWizard::productInstalled( ) void SALOME_InstallWizard::tryTerminate() { if ( shellProcess->isRunning() ) { - if ( QMessageBox::information( this, - tr( "Exit" ), - tr( "Do you want to quit %1?" ).arg( getIWName() ), - tr( "&Yes" ), + if ( QMessageBox::information( this, + tr( "Exit" ), + tr( "Do you want to quit %1?" ).arg( getIWName() ), + tr( "&Yes" ), tr( "&No" ), QString::null, 0, @@ -1662,51 +2730,40 @@ void SALOME_InstallWizard::onCancel() /*! * SALOME_InstallWizard::onSelectionChanged * Called when selection is changed in the products list view + * to fill in the 'Information about product' text box */ // ================================================================ void SALOME_InstallWizard::onSelectionChanged() { - productsInfo->clear(); - QListViewItem* item = productsView->selectedItem(); + const QObject* snd = sender(); + QListViewItem* item = modulesView->selectedItem(); + if ( snd == prereqsView ) + item = prereqsView->selectedItem(); if ( !item ) return; - if ( item->parent() ) - item = item->parent(); - QCheckListItem* aItem = (QCheckListItem*)item; - if ( !productsMap.contains( aItem ) ) + productInfo->clear(); + QCheckListItem* anItem = (QCheckListItem*)item; + if ( !productsMap.contains( anItem ) ) return; - Dependancies dep = productsMap[ aItem ]; - QString text = "" + aItem->text(0) + "" + "
      "; - if ( !aItem->text(1).stripWhiteSpace().isEmpty() ) - text += tr( "Version" ) + ": " + aItem->text(1) + "
      "; + Dependancies dep = productsMap[ anItem ]; + QString text = "" + anItem->text(0) + "" + "
      "; + if ( !dep.getVersion().isEmpty() ) + text += tr( "Version" ) + ": " + dep.getVersion() + "
      "; text += "
      "; if ( !dep.getDescription().isEmpty() ) { text += "" + dep.getDescription() + "

      "; } - text += tr( "User choice" ) + ": "; - long totSize = 0, tempSize = 0; - if ( productsView->isBinaries( aItem ) ) { - text += "" + tr( "install binaries" ) + "" + "
      "; - totSize = dep.getSize(); - } - else if ( productsView->isSources( aItem ) ) { - text += "" + tr( "install sources" ) + "" + "
      "; - totSize = dep.getSize( true ); - tempSize = dep.getTempSize(); - } - else if ( productsView->isNative( aItem ) ) { - text += "" + tr( "use native" ) + "" + "
      "; - } - else { - text += "" + tr( "not install" ) + "" + "
      "; - } - - text += tr( "Disk space required" ) + ": " + QString::number( totSize ) + " Kb
      "; - text += tr( "Disk space for tmp files required" ) + ": " + QString::number( tempSize ) + " Kb
      "; + /* AKL: 07/08/28 - hide required disk space for tmp files for each product ==> + long tempSize = 0; + tempSize = dep.getTempSize( installType ); + text += tr( "Disk space for tmp files required" ) + ": " + QString::number( tempSize ) + " KB
      "; + AKL: 07/08/28 - hide required disk space for tmp files for each product <== + */ + text += tr( "Disk space required" ) + ": " + item->text(1) + "
      "; text += "
      "; QString req = ( dep.getDependancies().count() > 0 ? dep.getDependancies().join(", ") : tr( "none" ) ); text += tr( "Prerequisites" ) + ": " + req; - productsInfo->setText( text ); + productInfo->setText( text ); } // ================================================================ /*! @@ -1717,37 +2774,12 @@ void SALOME_InstallWizard::onSelectionChanged() // ================================================================ void SALOME_InstallWizard::onItemToggled( QCheckListItem* item ) { - if ( prerequisites->isChecked() ) { - if ( item->parent() ) - item = (QCheckListItem*)( item->parent() ); - if ( productsMap.contains( item ) ) { - productsView->blockSignals( true ); + if ( productsMap.contains( item ) ) { + if ( item->isOn() ) setPrerequisites( item ); - productsView->blockSignals( false ); - } - } - onSelectionChanged(); - checkProductPage(); -} -// ================================================================ -/*! - * SALOME_InstallWizard::onProdBtn - * This slot is called when user clicks one of , buttons ( products page ) - */ -// ================================================================ -void SALOME_InstallWizard::onProdBtn() -{ - const QObject* snd = sender(); - productsView->blockSignals( true ); - if ( snd == unselectBtn ) { - QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() ); - while( item ) { - productsView->setNone( item ); - item = (QCheckListItem*)( item->nextSibling() ); - } + else + unsetPrerequisites( item ); } - productsView->blockSignals( false ); onSelectionChanged(); checkProductPage(); } @@ -1759,9 +2791,7 @@ void SALOME_InstallWizard::onProdBtn() // ================================================================ void SALOME_InstallWizard::wroteToStdin( ) { -#ifdef DEBUG - cout << "Something was sent to stdin" << endl; -#endif + ___MESSAGE___( "Something was sent to stdin" ); } // ================================================================ /*! @@ -1771,9 +2801,7 @@ void SALOME_InstallWizard::wroteToStdin( ) // ================================================================ void SALOME_InstallWizard::readFromStdout( ) { -#ifdef DEBUG - cout << "Something was sent to stdout" << endl; -#endif + ___MESSAGE___( "Something was sent to stdout" ); while ( shellProcess->canReadLineStdout() ) { installInfo->append( QString( shellProcess->readLineStdout() ) ); installInfo->scrollToBottom(); @@ -1784,6 +2812,9 @@ void SALOME_InstallWizard::readFromStdout( ) installInfo->scrollToBottom(); } } + +#define OUTLINE_TEXT(x) QString( "" ) + QString( x ) + QString( "" ) + // ================================================================ /*! * SALOME_InstallWizard::readFromStderr @@ -1792,21 +2823,23 @@ void SALOME_InstallWizard::readFromStdout( ) // ================================================================ void SALOME_InstallWizard::readFromStderr( ) { -#ifdef DEBUG - cout << "Something was sent to stderr" << endl; -#endif + ___MESSAGE___( "Something was sent to stderr" ); while ( shellProcess->canReadLineStderr() ) { - installInfo->append( QString( shellProcess->readLineStderr() ) ); + installInfo->append( OUTLINE_TEXT( QString( shellProcess->readLineStderr() ) ) ); installInfo->scrollToBottom(); + hasErrors = true; } QString str( shellProcess->readStderr() ); if ( !str.isEmpty() ) { - installInfo->append( str ); + installInfo->append( OUTLINE_TEXT( str ) ); installInfo->scrollToBottom(); + hasErrors = true; } - passedParams->setEnabled( true ); - passedParams->setFocus(); - QFont f = parametersLab->font(); f.setBold( true ); parametersLab->setFont( f ); + // VSR: 10/11/05 - disable answer mode ==> + // passedParams->setEnabled( true ); + // passedParams->setFocus(); + // QFont f = parametersLab->font(); f.setBold( true ); parametersLab->setFont( f ); + // VSR: 10/11/05 - disable answer mode <== } // ================================================================ /*! @@ -1819,6 +2852,42 @@ void SALOME_InstallWizard::setDependancies( QCheckListItem* item, Dependancies d productsMap[item] = dep; } // ================================================================ +/*! + * SALOME_InstallWizard::addFinishButton + * Add button for the page. + * Clear list of buttons if flag is true. + */ +// ================================================================ +void SALOME_InstallWizard::addFinishButton( const QString& label, + const QString& tooltip, + const QString& script, + bool toClear ) +{ + ButtonList btns; + if ( toClear ) { + btns = buttons; + buttons.clear(); + } + buttons.append( Button( label, tooltip, script ) ); + // create finish buttons + QButton* b = new QPushButton( tr( buttons.last().label() ), readmePage ); + if ( !buttons.last().tootip().isEmpty() ) + setAboutInfo( b, tr( buttons.last().tootip() ) ); + QHBoxLayout* hLayout = (QHBoxLayout*)readmePage->layout()->child("finishButtons"); + if ( toClear ) { + // remove previous buttons + ButtonList::Iterator it; + for ( it = btns.begin(); it != btns.end(); ++it ) { + hLayout->removeChild( (*it).button() ); + delete (*it).button(); + } + } + // add buttons to finish page + hLayout->insertWidget( buttons.count()-1, b ); + buttons.last().setButton( b ); + connect( b, SIGNAL( clicked() ), this, SLOT( onFinishButton() ) ); +} +// ================================================================ /*! * SALOME_InstallWizard::polish * Polishing of the widget - to set right initial size @@ -1830,6 +2899,42 @@ void SALOME_InstallWizard::polish() InstallWizard::polish(); } // ================================================================ +/*! + * SALOME_InstallWizard::saveLog + * Save installation log to file + */ +// ================================================================ +void SALOME_InstallWizard::saveLog() +{ + QString txt = installInfo->text(); + if ( txt.length() <= 0 ) + return; + QDateTime dt = QDateTime::currentDateTime(); + QString fileName = dt.toString("ddMMyy-hhmm"); + fileName.prepend("install-"); fileName.append(".html"); + fileName = QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ), fileName ).absFilePath(); + fileName = QFileDialog::getSaveFileName( fileName, + QString( "HTML files (*.htm *.html)" ), + this, 0, + tr( "Save Log file" ) ); + if ( !fileName.isEmpty() ) { + QFile f( fileName ); + if ( f.open( IO_WriteOnly ) ) { + QTextStream stream( &f ); + stream << txt; + f.close(); + } + else { + QMessageBox::critical( this, + tr( "Error" ), + tr( "Can't save file %1.\nCheck path and permissions.").arg( fileName ), + QMessageBox::Ok, + QMessageBox::NoButton, + QMessageBox::NoButton ); + } + } +} +// ================================================================ /*! * SALOME_InstallWizard::updateCaption * Updates caption according to the current page number @@ -1838,9 +2943,34 @@ void SALOME_InstallWizard::polish() void SALOME_InstallWizard::updateCaption() { QWidget* aPage = InstallWizard::currentPage(); - if ( !aPage ) + if ( !aPage ) return; InstallWizard::setCaption( tr( myCaption ) + " " + tr( getIWName() ) + " - " + tr( "Step %1 of %2").arg( QString::number( this->indexOf( aPage )+1 ) ).arg( QString::number( this->pageCount() ) ) ); } + +// ================================================================ +/*! + * SALOME_InstallWizard::processValidateEvent + * Processes validation event ( is validation code) + */ +// ================================================================ +void SALOME_InstallWizard::processValidateEvent( const int val, void* data ) +{ + QWidget* aPage = InstallWizard::currentPage(); + if ( aPage != productsPage ) { + InstallWizard::processValidateEvent( val, data ); + return; + } + myMutex.lock(); + myMutex.unlock(); + if ( val > 0 ) { + } + if ( myThread->hasCommands() ) + myWC.wakeAll(); + else { + WarnDialog::showWarnDlg( 0, false ); + InstallWizard::processValidateEvent( val, data ); + } +}