X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOME_InstallWizard.cxx;h=403011e029bb825f76441bf6ba3c52dd7f6e9ae9;hb=7f20464cbfdbb123c2880002895cdbb454e63fbf;hp=b6c2aafad0c1a84c3eb780ff9faeae9ff1aa2828;hpb=896eed97e1d0ae195b9130de5bd056a1b5b08621;p=tools%2Finstall.git diff --git a/src/SALOME_InstallWizard.cxx b/src/SALOME_InstallWizard.cxx index b6c2aaf..403011e 100644 --- a/src/SALOME_InstallWizard.cxx +++ b/src/SALOME_InstallWizard.cxx @@ -1,9 +1,9 @@ -// File : SALOME_InstallWizard.cxx +// File : SALOME_InstallWizard.cxx // Created : Thu Dec 18 12:01:00 2002 -// Author : Vadim SANDLER +// Author : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com) // Project : SALOME // Module : Installation Wizard -// Copyright : 2004-2005 CEA +// Copyright : 2002-2007 CEA #include "globals.h" @@ -25,13 +25,13 @@ #include #include #include -#include +#include #include -#include -#include -#include +#include +#include +#include #include -#include +#include #include #include #include @@ -39,6 +39,10 @@ #include #include #include +#include +#include +#include +#include #ifdef WNT #include @@ -80,7 +84,7 @@ public: virtual void run() { while ( hasCommands() ) { ___MESSAGE___( "ProcessThread::run - Processing command : " << myCommands[ 0 ].latin1() ); - int result = system( myCommands[ 0 ] ) / 256; // return code is * 256 + int result = system( myCommands[ 0 ] ) / 256; // return code is * 256 ___MESSAGE___( "ProcessThread::run - Result : " << result ); QCheckListItem* item = myItems.first(); myCommands.pop_front(); @@ -110,23 +114,23 @@ class WarnDialog: public QDialog static WarnDialog* myDlg; bool myCloseFlag; - WarnDialog( QWidget* parent ) + 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 ); + lab->setFrameStyle( QFrame::Box | QFrame::Plain ); QVBoxLayout* l = new QVBoxLayout( this ); l->setMargin( 0 ); l->add( lab ); - this->setFixedSize( lab->sizeHint().width() + 50, + this->setFixedSize( lab->sizeHint().width() + 50, lab->sizeHint().height() * 5 ); } void accept() { return; } void reject() { return; } void closeEvent( QCloseEvent* e ) - { if ( !myCloseFlag ) return; + { if ( !myCloseFlag ) return; e->accept(); QDialog::closeEvent( e ); } @@ -137,7 +141,7 @@ public: if ( !myDlg ) { myDlg = new WarnDialog( parent ); QSize sh = myDlg->size(); - myDlg->move( parent->x() + (parent->width()-sh.width())/2, + myDlg->move( parent->x() + (parent->width()-sh.width())/2, parent->y() + (parent->height()-sh.height())/2 ); myDlg->show(); } @@ -203,7 +207,7 @@ private: * 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 ) { @@ -211,19 +215,35 @@ static QString DefineDependeces(MapProducts& theProductsMap) 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 ) ) { @@ -317,6 +337,31 @@ 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 @@ -330,58 +375,176 @@ public: 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( pixmap( pxIcon ) ); // enable sizegrip setSizeGripEnabled( true ); - + // add logo 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( "" ); + setVersion( "3.2.7" ); + setCaption( tr( "SALOME %1" ).arg( myVersion ) ); + setCopyright( tr( "Copyright (C) 2007 CEA" ) ); + setLicense( tr( "All rights reserved." ) ); - ___MESSAGE___( "Config. file : " << xmlFileName ); + ___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 @@ -390,23 +553,20 @@ 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() ) ); @@ -415,6 +575,10 @@ SALOME_InstallWizard::SALOME_InstallWizard(QString aXmlFileName) // create validation thread myThread = new ProcessThread( this ); + + // show about button + setAboutIcon( pixmap( pxAbout ) ); + showAboutBtn( true ); } // ================================================================ /*! @@ -431,12 +595,162 @@ SALOME_InstallWizard::~SALOME_InstallWizard() script += QString::number( PID ); script += " > /dev/null"; ___MESSAGE___( "script: " << script.latin1() ); - if ( system( 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" ); + } + } +} +// ================================================================ /*! * SALOME_InstallWizard::eventFilter * Event filter, spies for Help window closing @@ -461,10 +775,10 @@ void SALOME_InstallWizard::closeEvent( QCloseEvent* ce ) 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, @@ -488,7 +802,7 @@ 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 logoLab = new QLabel( introPage ); @@ -533,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 @@ -542,147 +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" ) ); - // button - unselectBtn = new QPushButton( tr( "&Unselect All" ), moreBox ); - QWhatsThis::add( unselectBtn, tr( "Unselects all products" ) ); - QToolTip::add ( unselectBtn, tr( "Unselects all products" ) ); - // / tri-state checkboxes - selectSrcBtn = new QMyCheckBox( tr( "SALOME sources" ), moreBox ); - selectSrcBtn->setTristate( true ); - QWhatsThis::add( selectSrcBtn, tr( "Selects/unselects SALOME sources" ) ); - QToolTip::add ( selectSrcBtn, tr( "Selects/unselects SALOME sources" ) ); - selectBinBtn = new QMyCheckBox( tr( "SALOME binaries" ), moreBox ); - selectBinBtn->setTristate( true ); - QWhatsThis::add( selectBinBtn, tr( "Selects/unselects SALOME binaries" ) ); - QToolTip::add ( selectBinBtn, tr( "Selects/unselects SALOME binaries" ) ); - QVBoxLayout* btnLayout = new QVBoxLayout; btnLayout->setMargin( 0 ); btnLayout->setSpacing( 6 ); - btnLayout->addWidget( unselectBtn ); - btnLayout->addWidget( selectSrcBtn ); - btnLayout->addWidget( selectBinBtn ); - // 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() ) ); - connect( selectSrcBtn, SIGNAL( stateChanged(int) ), - this, SLOT( onProdBtn() ) ); - connect( selectBinBtn, SIGNAL( stateChanged(int) ), - 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(); } // ================================================================ /*! @@ -694,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 ); @@ -723,14 +1183,14 @@ 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 InstallInfo( widget ); @@ -739,13 +1199,11 @@ void SALOME_InstallWizard::setupProgressPage() 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(); @@ -757,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 @@ -786,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", 10 ) ); + 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; @@ -820,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" ) ); } @@ -838,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( "Reference Linux platform" ) + ": " + myOS + "
"; - text += "
"; - } - text += tr( "Native 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() + "
      "; - nbProd++; - } + if ( item->isOn() ) { + text += "
    • " + item->text() + "
      "; + nbProd++; } } item = (QCheckListItem*)( item->nextSibling() ); @@ -864,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() + " " + item->text(1) + " " + tr( "as binaries" ) + "
        "; - nbProd++; - } - else if ( productsView->isSources( item ) ) { - text+= "
      • " + item->text() + " " + item->text(1) + " " + 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() ); @@ -889,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( "Temporary 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 ); } // ================================================================ @@ -910,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" - "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" ), + QMessageBox::warning( this, + tr( "Warning" ), tr( "%1 is not a directory.\n" - "Please, enter valid target directory path" ).arg( fi.absFilePath() ), - QMessageBox::Ok, + "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; @@ -1000,173 +1461,145 @@ 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 ); - ___MESSAGE___( "script = " << script ); + ___MESSAGE___( "script = " << script.latin1() ); if ( system( script ) ) { - QMessageBox::critical( this, - tr( "Out of space" ), - tr( "There is no 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 temporary 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 ); - ___MESSAGE___( "script = " << tscript ); + ___MESSAGE___( "script = " << tscript.latin1() ); if ( system( tscript ) ) { - QMessageBox::critical( this, - tr( "Out of space" ), - tr( "There is no 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 ) { - // VSR : 29/01/05 : Check installation script even if product is not being installed - // if ( !productsView->isNone( item ) ) { - 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, + } + */ + // 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 ); - if ( !moreMode ) - onMoreBtn(); - productsView->setCurrentItem( item ); - productsView->setSelected( item, true ); - productsView->ensureItemVisible( item ); - //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() || !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 ); - if ( !moreMode ) - onMoreBtn(); - productsView->setCurrentItem( item ); - productsView->setSelected( item, true ); - productsView->ensureItemVisible( item ); - //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( "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(item->text(1)).arg(xmlFileName), - 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() ); - } - QString tmpFolder = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME; - QString tgtFolder = QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ); - myThread->clearCommands(); - if ( natives.count() > 0 ) { - for ( unsigned i = 0; i < natives.count(); i++ ) { - item = findItem( natives[ i ] ); - if ( item ) { - QString dependOn = productsMap[ item ].getDependancies().join(" "); - QString script = "cd ./config_files/;" + item->text(2) + " try_native " + - QFileInfo( tmpFolder ).absFilePath() + " " + QDir::currentDirPath() + "/Products " + QFileInfo( tgtFolder ).absFilePath() + " " + - QUOTE(dependOn) + " " + item->text(0); - - myThread->addCommand( item, script ); - } - else { - QMessageBox::warning( this, - tr( "Warning" ), - tr( "%The product %1 %2 required for installation.\n" - "This product is missing in the configuration file %4.").arg(item->text(0)).arg(item->text(1)).arg(xmlFileName), - QMessageBox::Ok, - QMessageBox::NoButton, - QMessageBox::NoButton ); - return false; - } - } - WarnDialog::showWarnDlg( this, true ); - myThread->start(); - return true; // return in order to avoid default postValidateEvent() action + prodsView = prereqsView; } +// return true; // return in order to avoid default postValidateEvent() action } return InstallWizard::acceptData( pageTitle ); } @@ -1179,30 +1612,106 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle ) 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 ( productsView->isBinaries( item ) ) { - tots += dep.getSize(); - } - else if ( productsView->isSources( item ) ) { - tots += dep.getSize(true); - temps = max( temps, dep.getTempSize() ); - } - if ( !productsView->isNone( item ) ) - nbSelected++; + 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 ); + } + // Update GUI and check installation errors + completeInstallation(); +} +// ================================================================ +/*! + * SALOME_InstallWizard::updateSizeColumn + * Sets required size for each product according to + * installation type and 'Remove SRC & TMP' checkbox state + */ +// ================================================================ +void SALOME_InstallWizard::updateSizeColumn() +{ + 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(); + // 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 ); + } + 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" ); + } +} +// ================================================================ /*! * SALOME_InstallWizard::checkProductPage * Checks products page validity (directories and products selection) and @@ -1211,48 +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"); - - // update , check boxes state - int totSrc = 0, selSrc = 0; - int totBin = 0, selBin = 0; - MapProducts::Iterator itProd; - for ( itProd = productsMap.begin(); itProd != productsMap.end(); ++itProd ) { - bool srcctx = itProd.data().hasContext( "salome sources" ); - bool binctx = itProd.data().hasContext( "salome binaries" ); - if ( srcctx ) totSrc++; - if ( binctx ) totBin++; - if ( srcctx && !binctx && productsView->isSources( itProd.key() ) ) - selSrc++; - if ( !srcctx && binctx && productsView->isBinaries( itProd.key() ) ) - selBin++; - if ( srcctx && binctx && - ( productsView->isSources( itProd.key() ) || - productsView->isBinaries( itProd.key() ) ) ) { - selSrc++; - selBin++; - } - } - selectSrcBtn->blockSignals( true ); - selectBinBtn->blockSignals( true ); - selectSrcBtn->setState( selSrc == 0 ? QButton::Off : ( selSrc == totSrc ? QButton::On : QButton::NoChange ) ); - selectBinBtn->setState( selBin == 0 ? QButton::Off : ( selBin == totBin ? QButton::On : QButton::NoChange ) ); - selectSrcBtn->blockSignals( false ); - selectBinBtn->blockSignals( false ); + 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 ); } // ================================================================ /*! @@ -1264,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 ); + } } } } @@ -1303,6 +1855,8 @@ void SALOME_InstallWizard::launchScript() // if found - set status to "completed" progressView->setStatus( prodProc, Completed ); + // ... clear status label + statusLab->clear(); // ... and call this method again launchScript(); return; @@ -1314,58 +1868,76 @@ void SALOME_InstallWizard::launchScript() // if found - set status to "processed" and run script progressView->setStatus( prodProc, Processing ); progressView->ensureVisible( prodProc ); - - QCheckListItem* item = findItem( prodProc ); + + 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); + // ... 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 @@ -1375,15 +1947,15 @@ void SALOME_InstallWizard::launchScript() } ___MESSAGE___( "All products have been installed successfully" ); // all products are installed successfully - QString workDir = QDir::cleanDirPath( QFileInfo( "./config_files/" ).absFilePath() ); MapProducts::Iterator mapIter; ___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() ) { - ___MESSAGE___( "... for " << dep.getName() ); + 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) + " "; @@ -1392,18 +1964,48 @@ 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); + script += item->text(0) + " "; + script += QUOTE( prodSequence.join( " " ) ); ___MESSAGE___( "... --> " << script.latin1() ); - if ( system( script.latin1() ) ) { - ___MESSAGE___( "ERROR" ); + 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 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" ) ); + 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() ) ); @@ -1417,6 +2019,48 @@ void SALOME_InstallWizard::launchScript() 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 ); + } + } + } } // ================================================================ /*! @@ -1427,69 +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.sh" ); - if ( fienv.exists() ) { - if ( fi.exists() ) { - QString script; - script += "cd " + targetFolder->text() + "/KERNEL_" + item->text(1) + "; "; - script += "source salome.sh; "; - script += "cd bin/salome; "; - script += "runSalome > /dev/null"; - script = "(bash -c '" + script + "')"; - ___MESSAGE___( "script: " << script.latin1() ); - 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 ) @@ -1530,10 +2177,10 @@ void SALOME_InstallWizard::reject() { ___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, @@ -1569,23 +2216,23 @@ void SALOME_InstallWizard::clean(bool rmDir) myThread->clearCommands(); myWC.wakeAll(); while ( myThread->running() ); - // VSR: first remove temporary files + // 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"; - ___MESSAGE___( "script = " << script ); + ___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 ( rmDir && !tmpCreated.isNull() ) { script = "rm -rf " + tmpCreated; script += " > /dev/null"; if ( system( script.latin1() ) ) { } - ___MESSAGE___( "script = " << script ); + ___MESSAGE___( "script = " << script.latin1() ); } } // ================================================================ @@ -1597,8 +2244,7 @@ void SALOME_InstallWizard::clean(bool rmDir) 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" ) ); + 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() ) ); @@ -1609,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(); @@ -1621,6 +2330,7 @@ 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 ); @@ -1628,8 +2338,7 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle) 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 disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) ); disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) ); @@ -1641,16 +2350,53 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle) } } 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; ___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; + } +} +// ================================================================ /*! * SALOME_InstallWizard::helpClicked * Shows help window @@ -1665,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" ) ); } } @@ -1696,7 +2442,6 @@ void SALOME_InstallWizard::browseDirectory() theFolder->setText( typedDir ); theFolder->end( false ); } - checkProductPage(); } // ================================================================ /*! @@ -1717,54 +2462,169 @@ void SALOME_InstallWizard::directoryChanged( const QString& /*text*/ ) void SALOME_InstallWizard::onStart() { 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 ); - // clear list of products to install ... + + // 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 ( 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() ); + } + item = (QCheckListItem*)( modulesView->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() ); } // 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 //setNextEnabled( false ); nextButton()->setText( tr( "&Stop" ) ); - QWhatsThis::add( nextButton(), tr( "Aborts installation process" ) ); - QToolTip::add ( nextButton(), tr( "Aborts installation process" ) ); + setAboutInfo( nextButton(), tr( "Abort installation process" ) ); // disable button 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(); } @@ -1789,7 +2649,7 @@ void SALOME_InstallWizard::onReturnPressed() /*! Callback function - as response for the script finishing */ -void SALOME_InstallWizard::productInstalled( ) +void SALOME_InstallWizard::productInstalled() { ___MESSAGE___( "process exited" ); if ( shellProcess->normalExit() ) { @@ -1799,6 +2659,7 @@ void SALOME_InstallWizard::productInstalled( ) } else { ___MESSAGE___( "...abnormal exit" ); + statusLab->setText( tr( "Installation has been aborted" ) ); // installation aborted abort(); // clear script passed parameters lineedit @@ -1809,15 +2670,13 @@ void SALOME_InstallWizard::productInstalled( ) // enable button setNextEnabled( true ); 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 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 >" ) ); - //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" ) ); + //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() ) ); @@ -1834,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, @@ -1871,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 ); } // ================================================================ /*! @@ -1926,79 +2774,16 @@ 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 ); - } + else + unsetPrerequisites( item ); } 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 ); - selectSrcBtn->blockSignals( true ); - selectBinBtn->blockSignals( true ); - if ( snd == unselectBtn ) { - QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() ); - while( item ) { - productsView->setNone( item ); - item = (QCheckListItem*)( item->nextSibling() ); - } - } - else if ( snd == selectSrcBtn ) { - QMyCheckBox* checkBox = ( QMyCheckBox* )snd; - if ( checkBox->state() == QButton::NoChange ) - checkBox->setState( QButton::On ); - MapProducts::Iterator itProd; - for ( itProd = productsMap.begin(); itProd != productsMap.end(); ++itProd ) { - if ( itProd.data().hasContext( "salome sources" ) ) { - if ( checkBox->state() == QButton::Off ) - productsView->setNone( itProd.key() ); - else { - productsView->setSources( itProd.key() ); - if ( prerequisites->isChecked() ) - setPrerequisites( itProd.key() ); - } - } - } - } - else if ( snd == selectBinBtn ) { - QMyCheckBox* checkBox = ( QMyCheckBox* )snd; - if ( checkBox->state() == QButton::NoChange ) - checkBox->setState( QButton::On ); - MapProducts::Iterator itProd; - for ( itProd = productsMap.begin(); itProd != productsMap.end(); ++itProd ) { - if ( itProd.data().hasContext( "salome binaries" ) ) { - if ( checkBox->state() == QButton::Off ) - productsView->setNone( itProd.key() ); - else { - productsView->setBinaries( itProd.key() ); - if ( prerequisites->isChecked() ) - setPrerequisites( itProd.key() ); - } - } - } - } - selectSrcBtn->blockSignals( false ); - selectBinBtn->blockSignals( false ); - productsView->blockSignals( false ); - onSelectionChanged(); - checkProductPage(); -} -// ================================================================ /*! * SALOME_InstallWizard::wroteToStdin * QProcess slot: -->something was written to stdin @@ -2042,11 +2827,13 @@ void SALOME_InstallWizard::readFromStderr( ) while ( shellProcess->canReadLineStderr() ) { installInfo->append( OUTLINE_TEXT( QString( shellProcess->readLineStderr() ) ) ); installInfo->scrollToBottom(); + hasErrors = true; } QString str( shellProcess->readStderr() ); if ( !str.isEmpty() ) { installInfo->append( OUTLINE_TEXT( str ) ); installInfo->scrollToBottom(); + hasErrors = true; } // VSR: 10/11/05 - disable answer mode ==> // passedParams->setEnabled( true ); @@ -2065,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 @@ -2089,6 +2912,7 @@ void SALOME_InstallWizard::saveLog() 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, @@ -2101,11 +2925,11 @@ void SALOME_InstallWizard::saveLog() 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::critical( this, + tr( "Error" ), + tr( "Can't save file %1.\nCheck path and permissions.").arg( fileName ), + QMessageBox::Ok, + QMessageBox::NoButton, QMessageBox::NoButton ); } } @@ -2119,7 +2943,7 @@ void SALOME_InstallWizard::saveLog() void SALOME_InstallWizard::updateCaption() { QWidget* aPage = InstallWizard::currentPage(); - if ( !aPage ) + if ( !aPage ) return; InstallWizard::setCaption( tr( myCaption ) + " " + tr( getIWName() ) + " - " + @@ -2141,59 +2965,7 @@ void SALOME_InstallWizard::processValidateEvent( const int val, void* data ) } myMutex.lock(); myMutex.unlock(); - QCheckListItem* item = (QCheckListItem*)data; if ( val > 0 ) { - if ( val == 2 ) { - WarnDialog::showWarnDlg( 0, false ); - // when try_native returns 2 it means that native product version is higher than that is prerequisited - if ( QMessageBox::warning( this, - tr( "Warning" ), - tr( "You have newer version of %1 installed on your computer than that is required (%2).\nContinue?").arg(item->text(0)).arg(item->text(1)), - QMessageBox::Yes, - QMessageBox::No, - QMessageBox::NoButton ) == QMessageBox::No ) { - myThread->clearCommands(); - myWC.wakeAll(); - setNextEnabled( true ); - setBackEnabled( true ); - return; - } - WarnDialog::showWarnDlg( this, true ); - } - else { - WarnDialog::showWarnDlg( 0, false ); - bool binMode = productsView->hasBinaries( item ); - bool srcMode = productsView->hasSources( item ); - QStringList buttons; - buttons.append( binMode ? tr( "Install binaries" ) : ( srcMode ? tr( "Install sources" ) : - tr( "Select manually" ) ) ); - buttons.append( binMode ? ( srcMode ? tr( "Install sources" ) : tr( "Select manually" ) ) : - ( srcMode ? tr( "Select manually" ) : QString::null ) ); - buttons.append( binMode && srcMode ? tr( "Select manually" ) : QString::null ); - int answer = QMessageBox::warning( this, - tr( "Warning" ), - tr( "You don't have native %1 %2 on your computer.\nPlease, change your installation settings.").arg(item->text(0)).arg(item->text(1)), - buttons[0], - buttons[1], - buttons[2] ); - if ( buttons[ answer ] == tr( "Install binaries" ) ) - productsView->setBinaries( item ); - else if ( buttons[ answer ] == tr( "Install sources" ) ) - productsView->setSources( item ); - else { - if ( !moreMode ) - onMoreBtn(); - productsView->setCurrentItem( item ); - productsView->setSelected( item, true ); - productsView->ensureItemVisible( item ); - myThread->clearCommands(); - myWC.wakeAll(); - setNextEnabled( true ); - setBackEnabled( true ); - return; - } - WarnDialog::showWarnDlg( this, true ); - } } if ( myThread->hasCommands() ) myWC.wakeAll();