// File : SALOME_InstallWizard.cxx
// Created : Thu Dec 18 12:01:00 2002
-// Author : Vadim SANDLER
-// Project : PAL/SALOME
-// Module : InstallWizard
-// Copyright : 2004 CEA
-// $Header$
+// Author : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com)
+// Project : SALOME
+// Module : Installation Wizard
+// Copyright : 2002-2006 CEA
+
+#include "globals.h"
#include "SALOME_InstallWizard.hxx"
#include "SALOME_ProductsView.hxx"
#include <qwhatsthis.h>
#include <qtooltip.h>
#include <qfile.h>
+#include <qthread.h>
+#include <qwaitcondition.h>
+#include <qmutex.h>
+#include <qstringlist.h>
+#include <qpopupmenu.h>
#ifdef WNT
#include <iostream.h>
#define max( x, y ) ( x ) > ( y ) ? ( x ) : ( y )
#endif
-#define TEMPDIRNAME ( "/INSTALLWORK" + QString::number( getpid() ) )
+QString tmpDirName() { return QString( "/INSTALLWORK" ) + QString::number( getpid() ); }
+#define TEMPDIRNAME tmpDirName()
+
+// ================================================================
+/*!
+ * ProcessThread
+ * Class for executing systen commands
+ */
+// ================================================================
+static QMutex myMutex(false);
+static QWaitCondition myWC;
+class ProcessThread: public QThread
+{
+ typedef QPtrList<QCheckListItem> ItemList;
+public:
+ ProcessThread( SALOME_InstallWizard* iw ) : QThread(), myWizard( iw ) { myItems.setAutoDelete( false ); }
+
+ void addCommand( QCheckListItem* item, const QString& cmd ) {
+ myItems.append( item );
+ myCommands.push_back( cmd );
+ }
+
+ bool hasCommands() const { return myCommands.count() > 0; }
+ void clearCommands() { myCommands.clear(); myItems.clear(); }
+
+ virtual void run() {
+ while ( hasCommands() ) {
+ ___MESSAGE___( "ProcessThread::run - Processing command : " << myCommands[ 0 ].latin1() );
+ int result = system( myCommands[ 0 ] ) / 256; // return code is <errno> * 256
+ ___MESSAGE___( "ProcessThread::run - Result : " << result );
+ QCheckListItem* item = myItems.first();
+ myCommands.pop_front();
+ myItems.removeFirst();
+ myMutex.lock();
+ SALOME_InstallWizard::postValidateEvent( myWizard, result, (void*)item );
+ if ( hasCommands() )
+ myWC.wait(&myMutex);
+ myMutex.unlock();
+ };
+ }
+
+private:
+ QStringList myCommands;
+ ItemList myItems;
+ SALOME_InstallWizard* myWizard;
+};
+
+// ================================================================
+/*!
+ * WarnDialog
+ * Warning dialog box
+ */
+// ================================================================
+class WarnDialog: public QDialog
+{
+ static WarnDialog* myDlg;
+ bool myCloseFlag;
+
+ WarnDialog( QWidget* parent )
+ : QDialog( parent, "WarnDialog", true, WDestructiveClose ) {
+ setCaption( tr( "Information" ) );
+ myCloseFlag = false;
+ QLabel* lab = new QLabel( tr( "Please, wait while checking native products configuration ..." ), this );
+ lab->setAlignment( AlignCenter );
+ lab->setFrameStyle( QFrame::Box | QFrame::Plain );
+ QVBoxLayout* l = new QVBoxLayout( this );
+ l->setMargin( 0 );
+ l->add( lab );
+ this->setFixedSize( lab->sizeHint().width() + 50,
+ lab->sizeHint().height() * 5 );
+ }
+ void accept() { return; }
+ void reject() { return; }
+ void closeEvent( QCloseEvent* e )
+ { if ( !myCloseFlag ) return;
+ e->accept();
+ QDialog::closeEvent( e );
+ }
+ ~WarnDialog() { myDlg = 0; }
+public:
+ static void showWarnDlg( QWidget* parent, bool show ) {
+ if ( show ) {
+ if ( !myDlg ) {
+ myDlg = new WarnDialog( parent );
+ QSize sh = myDlg->size();
+ myDlg->move( parent->x() + (parent->width()-sh.width())/2,
+ parent->y() + (parent->height()-sh.height())/2 );
+ myDlg->show();
+ }
+ myDlg->raise();
+ myDlg->setFocus();
+ }
+ else {
+ if ( myDlg ) {
+ myDlg->myCloseFlag = true;
+ myDlg->close();
+ }
+ }
+ }
+ static bool isWarnDlgShown() { return myDlg != 0; }
+};
+WarnDialog* WarnDialog::myDlg = 0;
+
+// ================================================================
+/*!
+ * InstallInfo
+ * Installation progress info window class
+ */
+// ================================================================
+class InstallInfo : public QTextEdit
+{
+public:
+ InstallInfo( QWidget* parent ) : QTextEdit( parent ), finished( false ) {}
+ void setFinished( const bool f ) { finished = f; }
+protected:
+ QPopupMenu* createPopupMenu( const QPoint& )
+ {
+ int para1, col1, para2, col2;
+ getSelection(¶1, &col1, ¶2, &col2);
+ bool allSelected = hasSelectedText() &&
+ para1 == 0 && para2 == paragraphs()-1 && col1 == 0 && col2 == paragraphLength(para2);
+ QPopupMenu* popup = new QPopupMenu( this );
+ int id = popup->insertItem( tr( "&Copy" ) );
+ popup->setItemEnabled( id, hasSelectedText() );
+ popup->connectItem ( id, this, SLOT( copy() ) );
+ id = popup->insertItem( tr( "Select &All" ) );
+ popup->setItemEnabled( id, (bool)text().length() && !allSelected );
+ popup->connectItem ( id, this, SLOT( selectAll() ) );
+ if ( finished ) {
+ QWidget* p = parentWidget();
+ while ( p && !p->inherits( "SALOME_InstallWizard" ) )
+ p = p->parentWidget();
+ if ( p && p->inherits( "SALOME_InstallWizard" ) ) {
+ popup->insertSeparator();
+ id = popup->insertItem( tr( "&Save Log" ) );
+ popup->setItemEnabled( id, (bool)text().length() );
+ popup->connectItem ( id, (SALOME_InstallWizard*)p, SLOT( saveLog() ) );
+ }
+ }
+ return popup;
+ }
+private:
+ bool finished;
+};
// ================================================================
/*!
* Defines list of dependancies as string separated by space symbols
*/
// ================================================================
-static QString DefineDependeces(MapProducts& theProductsMap) {
+static QString DefineDependeces(MapProducts& theProductsMap)
+{
QStringList aProducts;
for ( MapProducts::Iterator mapIter = theProductsMap.begin(); mapIter != theProductsMap.end(); ++mapIter ) {
QCheckListItem* item = mapIter.key();
// ================================================================
static bool makeDir( const QString& theDir, QString& theCreated )
{
- theCreated = QString::null;
if ( theDir.isEmpty() )
return false;
QString aDir = QDir::cleanDirPath( QFileInfo( theDir ).absFilePath() );
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( "<font color=red>%1</font>" ).arg( words[i].left(1) ) + words[i].mid(1);
+ }
+ else {
+ if ( words.count() > 0 )
+ words[0] = QString( "<font color=red>%1</font>" ).arg( words[0] );
+ if ( words.count() > 1 )
+ words[words.count()-1] = QString( "<font color=red>%1</font>" ).arg( words[words.count()-1] );
+ }
+ QString res = words.join( separator );
+ if ( !res.isEmpty() )
+ res = QString( "<b>%1</b>" ).arg( res );
+ return res;
+}
+
+// ================================================================
+/*!
+ * QMyCheckBox class : custom check box
+ * The only goal is to give access to the protected setState() method
+ */
+// ================================================================
+class QMyCheckBox: public QCheckBox
+{
+public:
+ QMyCheckBox( const QString& text, QWidget* parent, const char* name = 0 ) : QCheckBox ( text, parent, name ) {}
+ void setState ( ToggleState s ) { QCheckBox::setState( s ); }
+};
+
+// ================================================================
+/*!
+ * AboutDlg
+ * "About dialog box.
+ */
+// ================================================================
+class AboutDlg: public QDialog
+{
+public:
+ AboutDlg( SALOME_InstallWizard* parent ) : QDialog( parent, "About dialog box", true )
+ {
+ // caption
+ setCaption( QString( "About %1" ).arg( parent->getIWName() ) );
+ // palette
+ QPalette pal = palette();
+ QColorGroup cg = pal.active();
+ cg.setColor( QColorGroup::Foreground, Qt::darkBlue );
+ cg.setColor( QColorGroup::Background, Qt::white );
+ pal.setActive( cg ); pal.setInactive( cg ); pal.setDisabled( cg );
+ setPalette( pal );
+ // layout
+ QGridLayout* main = new QGridLayout( this, 1, 1, 11, 6 );
+ // image
+ QLabel* logo = new QLabel( this, "logo" );
+ logo->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ logo->setMinimumSize( 32, 32 ); logo->setMaximumSize( 32, 32 );
+ logo->setPaletteBackgroundColor( QColor( 234, 250, 234 ) );
+ logo->setFrameStyle( QLabel::NoFrame | QLabel::Plain );
+ logo->setPixmap( pixmap( pxAbout ) );
+ logo->setScaledContents( false );
+ logo->setAlignment( QLabel::AlignCenter );
+ // decoration
+ QLabel* decorLeft = new QLabel( this, "decorLeft" );
+ decorLeft->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ) );
+ decorLeft->setMinimumWidth( 32 ); decorLeft->setMaximumWidth( 32 );
+ decorLeft->setPaletteBackgroundColor( QColor( 234, 250, 234 ) );
+ decorLeft->setScaledContents( false );
+ QLabel* decorTop = new QLabel( this, "decorTop" );
+ decorTop->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+ decorTop->setMinimumHeight( 32 ); decorTop->setMaximumHeight( 32 );
+ decorTop->setPaletteBackgroundColor( QColor( 234, 250, 234 ) );
+ decorTop->setScaledContents( false );
+ // contents
+ QLabel* title = new QLabel( this, "title" );
+ QString tlt = parent->getIWName();
+ title->setText( makeTitle( tlt ) );
+ QLabel* version = new QLabel( this, "version" );
+ version->setText( QString( "<b>Version</b>: %1.%1.%1" ).arg( __IW_VERSION_MAJOR__ ) \
+ .arg( __IW_VERSION_MINOR__ ) \
+ .arg( __IW_VERSION_PATCH__ ) );
+ QLabel* copyright = new QLabel( this, "copyright" );
+ copyright->setText( "<b>Copyright</b> © 2004-2006 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)
+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 )
{
- 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;
+ targetDirPath = aTargetDir;
+ tmpDirPath = aTmpDir;
+
+ // set application font
+ QFont fnt = font();
+ fnt.setPointSize( 14 );
+ fnt.setBold( true );
setTitleFont( fnt );
// set icon
- setIcon( QPixmap( ( const char** ) image0_data ) );
+ setIcon( pixmap( pxIcon ) );
// enable sizegrip
setSizeGripEnabled( true );
// add logo
- addLogo( QPixmap( (const char**)image1_data ) );
+ addLogo( pixmap( pxLogo ) );
// set defaults
setVersion( "1.2" );
setLicense( tr( "All right reserved" ) );
setOS( "" );
-#ifdef DEBUG
- cout << "Config. file : " << xmlFileName << endl;
-#endif
+ ___MESSAGE___( "Configuration file : " << xmlFileName );
+ ___MESSAGE___( "Target directory : " << targetDirPath );
+ ___MESSAGE___( "Temporary directory: " << tmpDirPath );
// xml reader
QFile xmlfile(xmlFileName);
// common signals connections
connect( this, SIGNAL( selected( const QString& ) ),
- this, SLOT( pageChanged( const QString& ) ) );
- connect( this, SIGNAL( helpClicked() ), this, SLOT( helpClicked() ) );
+ this, SLOT( pageChanged( const QString& ) ) );
+ connect( this, SIGNAL( helpClicked() ), this, SLOT( helpClicked() ) );
+ connect( this, SIGNAL( aboutClicked() ), this, SLOT( onAbout() ) );
+
// catch signals from launched script
connect(shellProcess, SIGNAL( readyReadStdout() ), this, SLOT( readFromStdout() ) );
connect(shellProcess, SIGNAL( readyReadStderr() ), this, SLOT( readFromStderr() ) );
connect(shellProcess, SIGNAL( processExited() ), this, SLOT( productInstalled() ) );
connect(shellProcess, SIGNAL( wroteToStdin() ), this, SLOT( wroteToStdin() ) );
+
+ // create validation thread
+ myThread = new ProcessThread( this );
+
+ // show about button
+ setAboutIcon( pixmap( pxAbout ) );
+ showAboutBtn( true );
}
// ================================================================
/*!
if ( PID > 0 ) {
script += QString::number( PID );
script += " > /dev/null";
-#ifdef DEBUG
- cout << "script: "<< script.latin1() << endl;
-#endif
+ ___MESSAGE___( "script: " << script.latin1() );
if ( system( script.latin1() ) ) {
}
}
+ delete myThread;
}
// ================================================================
/*!
// ================================================================
void SALOME_InstallWizard::closeEvent( QCloseEvent* ce )
{
+ if ( WarnDialog::isWarnDlgShown() ) {
+ ce->ignore();
+ return;
+ }
if ( !exitConfirmed ) {
if ( QMessageBox::information( this,
tr( "Exit" ),
QGridLayout* pageLayout = new QGridLayout( introPage );
pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 );
// create logo picture
- QPixmap logo( (const char**)SALOME_Logo_xpm );
logoLab = new QLabel( introPage );
- logoLab->setPixmap( logo );
+ logoLab->setPixmap( pixmap( pxBigLogo ) );
logoLab->setScaledContents( false );
- logoLab->setFrameStyle( QLabel::Plain | QLabel::Box );
+ logoLab->setFrameStyle( QLabel::Plain | QLabel::NoFrame );
logoLab->setAlignment( AlignCenter );
// create version box
QVBox* versionBox = new QVBox( introPage ); versionBox->setSpacing( 6 );
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" ) );
- // <Unselect All> buttons
- unselectBtn = new QPushButton( tr( "&Unselect All" ), moreBox );
+ // <Unselect All> button
+ unselectBtn = new QPushButton( tr( "&Unselect All" ), moreBox );
QWhatsThis::add( unselectBtn, tr( "Unselects all products" ) );
QToolTip::add ( unselectBtn, tr( "Unselects all products" ) );
+ // <SALOME sources> / <SALOME binaries> 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 );
reader.setContentHandler( handler );
reader.parse( source );
}
+ // take into account command line parameters
+ if ( !targetDirPath.isEmpty() )
+ targetFolder->setText( targetDirPath );
+ if ( !tmpDirPath.isEmpty() )
+ tempFolder->setText( tmpDirPath );
+
// set first item to be selected
if ( productsView->childCount() > 0 ) {
productsView->setSelected( productsView->firstChild(), true );
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() ) );
// connecting signals
connect( targetFolder, SIGNAL( textChanged( const QString& ) ),
this, SLOT( directoryChanged( const QString& ) ) );
QGridLayout* layout = new QGridLayout( widget );
layout->setMargin( 0 ); layout->setSpacing( 6 );
// installation progress view box
- installInfo = new QTextEdit( widget );
+ installInfo = new InstallInfo( widget );
installInfo->setReadOnly( true );
installInfo->setTextFormat( RichText );
installInfo->setUndoRedoEnabled ( false );
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") );
+ // VSR: 10/11/05 - disable answer mode ==>
+ parametersLab->hide();
+ passedParams->hide();
+ // VSR: 10/11/05 - disable answer mode <==
// layouting
layout->addWidget( installInfo, 0, 0 );
layout->addWidget( parametersLab, 1, 0 );
readme = new QTextEdit( readmePage );
readme->setReadOnly( true );
readme->setTextFormat( PlainText );
+ readme->setFont( QFont( "Fixed", 12 ) );
readme->setUndoRedoEnabled ( false );
QWhatsThis::add( readme, tr( "Displays README information" ) );
QToolTip::add ( readme, tr( "Displays README information" ) );
pal.setColor( QColorGroup::Base, QApplication::palette().active().background() );
readme->setPalette( pal );
readme->setMinimumHeight( 10 );
- // <Launch SALOME> 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 );
- pageLayout->addLayout( hLayout );
- // connecting signals
- connect( runSalomeBtn, SIGNAL( clicked() ), this, SLOT( onLaunchSalome() ) );
+
+ // Operation buttons
+ if ( buttons.count() > 0 ) {
+ QHBoxLayout* hLayout = new QHBoxLayout;
+ hLayout->setMargin( 0 ); hLayout->setSpacing( 6 );
+ ButtonList::Iterator it;
+ for ( it = buttons.begin(); it != buttons.end(); ++it ) {
+ QButton* b = new QPushButton( tr( (*it).label() ), readmePage );
+ if ( !(*it).tootip().isEmpty() ) {
+ QWhatsThis::add( b, tr( (*it).tootip() ) );
+ QToolTip::add ( b, tr( (*it).tootip() ) );
+ }
+ hLayout->addWidget( b );
+ (*it).setButton( b );
+ connect( b, SIGNAL( clicked() ), this, SLOT( onFinishButton() ) );
+ }
+ hLayout->addStretch();
+ pageLayout->addLayout( hLayout );
+ }
+
// loading README file
QString readmeFile = QDir::currentDirPath() + "/README";
QString text;
readme->setText( text );
else
readme->setText( tr( "README file has not been found" ) );
+
// adding page
addPage( readmePage, tr( "Finish installation" ) );
}
text += "<br>";
}
if ( !myOS.isEmpty() ) {
- text += tr( "Target platform" ) + ": <b>" + myOS + "</b><br>";
+ text += tr( "Reference Linux platform" ) + ": <b>" + myOS + "</b><br>";
text += "<br>";
}
- text += tr( "Products to be used" ) + ":<ul>";
+ text += tr( "Native products to be used" ) + ":<ul>";
QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() );
while( item ) {
if ( productsMap.contains( item ) ) {
if ( item->childCount() > 0 ) {
if ( productsView->isNative( item ) ) {
- text += "<li><b>" + item->text() + "</b> " + tr( "as native" ) + "<br>";
+ text += "<li><b>" + item->text() + "</b><br>";
nbProd++;
}
}
if ( productsMap.contains( item ) ) {
if ( item->childCount() > 0 ) {
if ( productsView->isBinaries( item ) ) {
- text += "<li><b>" + item->text() + "</b> " + tr( "as binaries" ) + "<br>";
+ text += "<li><b>" + item->text() + " " + item->text(1) + "</b> " + tr( "as binaries" ) + "<br>";
nbProd++;
}
else if ( productsView->isSources( item ) ) {
- text+= "<li><b>" + item->text() + "</b> " + tr( "as sources" ) + "<br>";
+ text+= "<li><b>" + item->text() + " " + item->text(1) + "</b> " + tr( "as sources" ) + "<br>";
nbProd++;
}
}
// VSR: Temporary folder is used always now and it is not necessary to disable it -->
// if ( tempSize > 0 )
// VSR: <----------------------------------------------------------------------------
- text += tr( "Temp directory:" ) + " <b>" + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + "</b><br>";
+ text += tr( "Temporary directory:" ) + " <b>" + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + "</b><br>";
text += "<br>";
choices->setText( text );
}
QMessageBox::warning( this,
tr( "Warning" ),
tr( "The directory %1 doesn't exist.\n"
- "Do you want to create directory?" ).arg( fi.absFilePath() ),
+ "Create directory?" ).arg( fi.absFilePath() ),
QMessageBox::Yes,
QMessageBox::No,
QMessageBox::NoButton ) == QMessageBox::Yes;
if ( !fi.isDir() ) {
QMessageBox::warning( this,
tr( "Warning" ),
- tr( "The directory %1 is not a directory.\n"
+ tr( "%1 is not a directory.\n"
"Please, enter valid target directory path" ).arg( fi.absFilePath() ),
QMessageBox::Ok,
QMessageBox::NoButton,
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 sources/binaries archives directories existance
+ int nbSources = 0, nbBinaries = 0;
+ QCheckListItem* nitem = (QCheckListItem*)( productsView->firstChild() );
+ while( nitem ) {
+ if ( productsMap.contains( nitem ) ) {
+ if ( nitem->childCount() > 0 ) {
+ if ( productsView->isBinaries( nitem ) )
+ nbBinaries++;
+ else if ( productsView->isSources( nitem ) )
+ nbSources++;
+ }
+ else if ( nitem->isOn() ) {
+ nbBinaries++;
+ nbSources++;
+ }
+ }
+ nitem = (QCheckListItem*)( nitem->nextSibling() );
+ }
+
+ if ( nbBinaries > 0 ) {
+ QString binDir = "./Products/BINARIES";
+ if ( !myOS.isEmpty() )
+ binDir += "/" + myOS;
+ QFileInfo fib( QDir::cleanDirPath( binDir ) );
+ if ( !fib.exists() ) {
+ if ( QMessageBox::warning( this,
+ tr( "Warning" ),
+ tr( "The directory %1 doesn't exist.\n"
+ "This directory must contain binaries archives.\n"
+ "Continue?" ).arg( fib.absFilePath() ),
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::NoButton ) == QMessageBox::No )
+ return false;
+ }
+ }
+ if ( nbSources > 0 ) {
+ QString srcDir = "./Products/SOURCES";
+ QFileInfo fis( QDir::cleanDirPath( srcDir ) );
+ 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() ),
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::NoButton ) == QMessageBox::No )
+ return false;
+ }
}
// run script that checks available disk space for installing of products // returns 1 in case of error
QString script = "./config_files/checkSize.sh '";
script += fi.absFilePath();
script += "' ";
script += QString( "%1" ).arg( totSize );
-#ifdef DEBUG
- cout << "script = " << script << endl;
-#endif
+ ___MESSAGE___( "script = " << script );
if ( system( script ) ) {
QMessageBox::critical( this,
tr( "Out of space" ),
- tr( "There is not available disk space for installing of selected products" ),
+ tr( "There is no available disk space for installing of selected products" ),
QMessageBox::Ok,
QMessageBox::NoButton,
QMessageBox::NoButton );
if ( moreMode ) {
QMessageBox::warning( this,
tr( "Warning" ),
- tr( "Please, enter valid temp directory path" ),
+ tr( "Please, enter valid temporary directory path" ),
QMessageBox::Ok,
QMessageBox::NoButton,
QMessageBox::NoButton );
return false;
}
else {
- tempFolder->setText( "/tmp" );
+ tempDir = "/tmp";
+ tempFolder->setText( tempDir );
}
}
QFileInfo fit( QDir::cleanDirPath( tempDir ) );
tscript += fit.absFilePath();
tscript += "' ";
tscript += QString( "%1" ).arg( tempSize );
-#ifdef DEBUG
- cout << "script = " << tscript << endl;
-#endif
+ ___MESSAGE___( "script = " << tscript );
if ( system( tscript ) ) {
QMessageBox::critical( this,
tr( "Out of space" ),
- tr( "There is not available disk space for the temporary files" ),
+ tr( "There is no available disk space for the temporary files" ),
QMessageBox::Ok,
QMessageBox::NoButton,
QMessageBox::NoButton );
while( item ) {
if ( productsMap.contains( item ) ) {
if ( item->childCount() > 0 ) {
- if ( !productsView->isNone( item ) ) {
+ // 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( "Warning" ),
- tr( "You don't have a defined script for %1").arg(item->text(0)),
+ tr( "Error" ),
+ tr( "The installation script for %1 is not defined.").arg(item->text(0)),
QMessageBox::Ok,
QMessageBox::NoButton,
QMessageBox::NoButton );
- productsView->setNone( item );
+ if ( !moreMode )
+ onMoreBtn();
+ productsView->setCurrentItem( item );
+ productsView->setSelected( item, true );
+ productsView->ensureItemVisible( item );
+ //productsView->setNone( item );
return false;
} else {
QFileInfo fi( QString("./config_files/") + item->text(2) );
- if ( !fi.exists() ) {
+ if ( !fi.exists() || !fi.isExecutable() ) {
QMessageBox::warning( this,
- tr( "Warning" ),
- tr( "%1 required for %2 doesn't exist.").arg("./config_files/" + item->text(2)).arg(item->text(0)),
+ tr( "Error" ),
+ tr( "The script %1 required for %2 doesn't exist or doesn't have execute permissions.").arg("./config_files/" + item->text(2)).arg(item->text(0)),
QMessageBox::Ok,
QMessageBox::NoButton,
QMessageBox::NoButton );
- productsView->setNone( item );
+ if ( !moreMode )
+ onMoreBtn();
+ 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() )
}
else {
QMessageBox::warning( this,
- tr( "Warning" ),
+ tr( "Error" ),
tr( "%1 is required for %2 %3 installation.\n"
- "Please, add this product in config.xml file.").arg(dependOn[ i ]).arg(item->text(0)).arg(item->text(1)),
+ "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 );
}
QString tmpFolder = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME;
QString tgtFolder = QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() );
- for ( unsigned i = 0; i < natives.count(); i++ ) {
- item = findItem( natives[ i ] );
- if ( item ) {
- QString script = "cd ./config_files/;" + item->text(2) + " try_native " +
- QFileInfo( tmpFolder ).absFilePath() + " " + QDir::currentDirPath() + "/Products " + QFileInfo( tgtFolder ).absFilePath() + " " +
- QUOTE(DefineDependeces(productsMap)) + " " + item->text(0);
+ 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);
-#ifdef DEBUG
- cout << "1. Script : " << script << endl;
-#endif
- if ( system( script ) ) {
+ myThread->addCommand( item, script );
+ }
+ else {
QMessageBox::warning( this,
tr( "Warning" ),
- tr( "You don't have native %1 %2 installed").arg(item->text(0)).arg(item->text(1)),
+ 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 );
- productsView->setNone( item );
return false;
}
}
- else {
- QMessageBox::warning( this,
- tr( "Warning" ),
- tr( "%The product %1 %2 required for installation.\n"
- "Please, add this product in config.xml file.").arg(item->text(0)).arg(item->text(1)),
- QMessageBox::Ok,
- QMessageBox::NoButton,
- QMessageBox::NoButton );
- return false;
- }
+ WarnDialog::showWarnDlg( this, true );
+ myThread->start();
+ return true; // return in order to avoid default postValidateEvent() action
}
}
return InstallWizard::acceptData( pageTitle );
// update required size information
requiredSize->setText( QString::number( tots ) + " Kb");
requiredTemp->setText( QString::number( temps ) + " Kb");
+
+ // update <SALOME sources>, <SALOME binaries> 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 && !binctx ) {
+ totSrc++;
+ if ( productsView->isSources( itProd.key() ) )
+ selSrc++;
+ }
+ if ( binctx && !srcctx ) {
+ totBin++;
+ if ( productsView->isBinaries( itProd.key() ) )
+ 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 );
// enable/disable "Next" button
setNextEnabled( productsPage, isAnyProductSelected && isTargetDirValid && isTempDirValid );
// try to find product being processed now
QString prodProc = progressView->findStatus( Processing );
if ( !prodProc.isNull() ) {
-#ifdef DEBUG
- cout << "Found <Processing>: " << prodProc.latin1() << endl;
-#endif
+ ___MESSAGE___( "Found <Processing>: " );
// if found - set status to "completed"
progressView->setStatus( prodProc, Completed );
// else try to find next product which is not processed yet
prodProc = progressView->findStatus( Waiting );
if ( !prodProc.isNull() ) {
-#ifdef DEBUG
- cout << "Found <Waiting>: " << prodProc.latin1() << endl;
-#endif
+ ___MESSAGE___( "Found <Waiting>: " << prodProc.latin1() );
// if found - set status to "processed" and run script
progressView->setStatus( prodProc, Processing );
progressView->ensureVisible( prodProc );
QCheckListItem* item = findItem( prodProc );
- Dependancies dep = productsMap[ item ];
// fill in script parameters
shellProcess->clearArguments();
// ... script name
// ... temp folder
QString tmpFolder = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME;
- if( !tempFolder->isEnabled() )
- tmpFolder = "/tmp";
+ //if( !tempFolder->isEnabled() )
+ //tmpFolder = "/tmp";
// ... binaries ?
if ( productsView->isBinaries( item ) ) {
QString depproducts = DefineDependeces(productsMap);
-#ifdef DEBUG
- cout << "Dependancies"<< depproducts.latin1() << endl;
-#endif
+ ___MESSAGE___( "Dependancies"<< depproducts.latin1() );
shellProcess->addArgument( depproducts );
// ... product name - currently instaled product
// run script
if ( !shellProcess->start() ) {
// error handling can be here
-#ifdef DEBUG
- cout << "error" << endl;
-#endif
+ ___MESSAGE___( "error" );
}
return;
}
-#ifdef DEBUG
- cout << "All products have been installed successfully" << endl;
-#endif
- // all products installed successfully
- QFileInfo fi_sh ( targetFolder->text() + "/env_products.sh");
- QFileInfo fi_csh( targetFolder->text() + "/env_products.csh");
- QCheckListItem* itemBin = findItem( "KERNEL-Bin" );
- QCheckListItem* itemSrc = findItem( "KERNEL-Src" );
- if ( itemBin /*&& !productsView->isNone( itemBin )*/ ) {
- if ( fi_sh.exists() ) {
- QString script = "cp " + fi_sh.filePath() + " " + targetFolder->text() + "/KERNEL_" + itemBin->text(1) + "/salome.sh";
- if ( system( script.latin1() ) ) {}
- }
- if ( fi_csh.exists() ) {
- QString script = "cp " + fi_csh.filePath() + " " + targetFolder->text() + "/KERNEL_" + itemBin->text(1) + "/salome.csh";
- if ( system( script.latin1() ) ) {}
- }
- }
- if ( itemSrc /*&& !productsView->isNone( itemSrc )*/ ) {
- if ( fi_sh.exists() ) {
- QString script = "cp " + fi_sh.filePath() + " " + targetFolder->text() + "/KERNEL_SRC_" + itemSrc->text(1) + "/salome.sh";
- if ( system( script.latin1() ) ) {}
- }
- if ( fi_csh.exists() ) {
- QString script = "cp " + fi_csh.filePath() + " " + targetFolder->text() + "/KERNEL_SRC_" + itemSrc->text(1) + "/salome.csh";
- if ( system( script.latin1() ) ) {}
+ ___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" );
+ for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) {
+ QCheckListItem* item = mapIter.key();
+ Dependancies dep = mapIter.data();
+ QString depproducts = QUOTE( DefineDependeces(productsMap) );
+ if ( !productsView->isNone( item ) && dep.pickUpEnvironment() ) {
+ ___MESSAGE___( "... for " << dep.getName() );
+ QString script;
+ script += "cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; ";
+ script += item->text(2) + " ";
+ script += "pickup_env ";
+ script += QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ) + " ";
+ script += QUOTE( QFileInfo( QDir::cleanDirPath( QDir::currentDirPath() + "/Products" ) ).absFilePath() ) + " ";
+ script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " ";
+ script += depproducts + " ";
+ script += item->text(0);
+ ___MESSAGE___( "... --> " << script.latin1() );
+ if ( system( script.latin1() ) ) {
+ ___MESSAGE___( "ERROR" );
+ }
}
}
// <Next> button
- nextButton()->setEnabled( true );
+ setNextEnabled( true );
nextButton()->setText( tr( "&Next >" ) );
QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
QToolTip::add ( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
- nextButton()->disconnect();
- connect( nextButton(), SIGNAL( clicked() ), this, SLOT( next() ) );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
// <Back> button
- backButton()->setEnabled( true );
+ setBackEnabled( true );
// script parameters
passedParams->clear();
passedParams->setEnabled( false );
QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
+ installInfo->setFinished( true );
if ( isMinimized() )
showNormal();
raise();
}
// ================================================================
/*!
- * SALOME_InstallWizard::onLaunchSalome
- * <Launch Salome> button slot
+ * SALOME_InstallWizard::onFinishButton
+ * Operation buttons slot
*/
// ================================================================
-void SALOME_InstallWizard::onLaunchSalome()
+void SALOME_InstallWizard::onFinishButton()
{
- QCheckListItem* item = 0;
- if ( ( item = findItem( "KERNEL-Bin" ) ) ) {
- QFileInfo fi( targetFolder->text() + "/KERNEL_" + item->text(1) + "/bin/salome/runSalome" );
- if ( fi.exists() ) {
+ 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 " + targetFolder->text() + "/KERNEL_" + item->text(1) + "; ";
- script += "source salome.csh; ";
- script += "cd bin/salome; ";
- //script += "cd bin; ";
- //script += "runSalome > /dev/null";
- script += "runSalome > /dev/null";
- script = "(csh -c '" + script + "')";
-#ifdef DEBUG
- cout << script.latin1() << endl;
-#endif
- if ( system( script.latin1() ) ){
+ 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 launch SALOME" ),
+ tr( "Can't perform action!"),
QMessageBox::Ok,
QMessageBox::NoButton,
QMessageBox::NoButton );
return;
}
}
- QMessageBox::warning( this,
- tr( "Error" ),
- tr( "You don't have SALOME binaries installed in the %1 directory!" ).arg( targetFolder->text() ),
- QMessageBox::Ok,
- QMessageBox::NoButton,
- QMessageBox::NoButton );
}
+// ================================================================
+/*!
+ * SALOME_InstallWizard::onAbout
+ * <About> button slot: shows <About> dialog box
+ */
+// ================================================================
+void SALOME_InstallWizard::onAbout()
+{
+ AboutDlg d( this );
+ d.exec();
+}
+
// ================================================================
/*!
* SALOME_InstallWizard::findItem
// ================================================================
void SALOME_InstallWizard::reject()
{
-#ifdef DEBUG
- cout << "REJECTED" << endl;
-#endif
+ ___MESSAGE___( "REJECTED" );
if ( !exitConfirmed ) {
if ( QMessageBox::information( this,
tr( "Exit" ),
}
exitConfirmed = true;
}
- clean();
+ clean(true);
InstallWizard::reject();
}
// ================================================================
// ================================================================
void SALOME_InstallWizard::accept()
{
-#ifdef DEBUG
- cout << "ACCEPTED" << endl;
-#endif
- clean();
+ ___MESSAGE___( "ACCEPTED" );
+ clean(true);
InstallWizard::accept();
}
// ================================================================
/*!
* SALOME_InstallWizard::clean
- * Clears and removes temporary directory
+ * Clears and (optionally) removes temporary directory
*/
// ================================================================
-void SALOME_InstallWizard::clean()
+void SALOME_InstallWizard::clean(bool rmDir)
{
+ WarnDialog::showWarnDlg( 0, false );
+ myThread->clearCommands();
+ myWC.wakeAll();
+ while ( myThread->running() );
// VSR: first remove temporary files
QString script = "cd ./config_files/; remove_tmp.sh '";
- script += tempFolder->text().stripWhiteSpace();
+ script += tempFolder->text().stripWhiteSpace() + TEMPDIRNAME;
script += "' ";
script += QUOTE(DefineDependeces(productsMap));
script += " > /dev/null";
-#ifdef DEBUG
- cout << "script = " << script << endl;
-#endif
+ ___MESSAGE___( "script = " << script );
if ( system( script.latin1() ) ) {
}
// VSR: then try to remove created temporary directory
//script = "rm -rf " + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME;
- if ( !tmpCreated.isNull() ) {
+ if ( rmDir && !tmpCreated.isNull() ) {
script = "rm -rf " + tmpCreated;
script += " > /dev/null";
if ( system( script.latin1() ) ) {
}
-#ifdef DEBUG
- cout << "script = " << script << endl;
-#endif
+ ___MESSAGE___( "script = " << script );
}
}
// ================================================================
nextButton()->setText( tr( "&Next >" ) );
QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
QToolTip::add ( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
- nextButton()->disconnect();
- connect( nextButton(), SIGNAL( clicked() ), this, SLOT( next() ) );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
cancelButton()->disconnect();
connect( cancelButton(), SIGNAL( clicked()), this, SLOT( reject() ) );
// progress page
progressView->clear();
installInfo->clear();
+ installInfo->setFinished( false );
passedParams->clear();
passedParams->setEnabled( false );
QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
QWhatsThis::add( nextButton(), tr( "Starts installation process" ) );
QToolTip::add ( nextButton(), tr( "Starts installation process" ) );
// reconnect Next button - to use it as Start button
- nextButton()->disconnect();
- connect( nextButton(), SIGNAL( clicked() ), this, SLOT( onStart() ) );
- nextButton()->setEnabled( true );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ setNextEnabled( true );
// reconnect Cancel button to terminate process
cancelButton()->disconnect();
connect( cancelButton(), SIGNAL( clicked() ), this, SLOT( tryTerminate() ) );
}
}
else if ( aPage == readmePage ) {
- QCheckListItem* item = 0;
- runSalomeBtn->setEnabled( ( item = findItem( "KERNEL-Bin" ) ) &&
- QFileInfo( targetFolder->text() + "/KERNEL_" + item->text(1) + "/bin/salome/runSalome" ).exists() );
+ ButtonList::Iterator it;
+ for ( it = buttons.begin(); it != buttons.end(); ++it ) {
+ if ( (*it).button() ) {
+ QString script;
+ script += "( cd " + QUOTE( QFileInfo( QDir::cleanDirPath( "./config_files/" ) ).absFilePath() ) + "; ";
+ script += + (*it).script();
+ script += " check_enabled ";
+ script += QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() ) + " ";
+ script += QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() ) + " ";
+ script += " > /dev/null )";
+ ___MESSAGE___( "script: " << script.latin1() );
+ (*it).button()->setEnabled( !(*it).script().isEmpty() && !system( script.latin1() ) );
+ }
+ }
finishButton()->setEnabled( true );
}
previousPage = aPage;
-#ifdef DEBUG
- cout << "previousPage = " << previousPage << endl;
-#endif
+ ___MESSAGE___( "previousPage = " << previousPage );
}
// ================================================================
/*!
// ================================================================
void SALOME_InstallWizard::onStart()
{
+ if ( nextButton()->text() == tr( "&Stop" ) ) {
+ shellProcess->kill();
+ while( shellProcess->isRunning() );
+ return;
+ }
+ 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 ...
toInstall.clear();
// ... and fill it for new process
}
// if something at all is selected
if ( !toInstall.isEmpty() ) {
+ clean(false); // VSR 07/02/05 - bug fix: first we should clear temporary directory
// disable <Next> button
- nextButton()->setEnabled( false );
+ //setNextEnabled( false );
+ nextButton()->setText( tr( "&Stop" ) );
+ QWhatsThis::add( nextButton(), tr( "Aborts installation process" ) );
+ QToolTip::add ( nextButton(), tr( "Aborts installation process" ) );
// disable <Back> button
- backButton()->setEnabled ( false );
+ setBackEnabled( false );
// enable script parameters line edit
// VSR commented: 18/09/03: passedParams->setEnabled( true );
// VSR commented: 18/09/03: passedParams->setFocus();
*/
void SALOME_InstallWizard::productInstalled( )
{
-#ifdef DEBUG
- cout << "process exited" << endl;
-#endif
+ ___MESSAGE___( "process exited" );
if ( shellProcess->normalExit() ) {
-#ifdef DEBUG
- cout << "...normal exit" << endl;
-#endif
+ ___MESSAGE___( "...normal exit" );
// normal exit - try to proceed installation further
launchScript();
}
else {
-#ifdef DEBUG
- cout << "...abnormal exit" << endl;
-#endif
+ ___MESSAGE___( "...abnormal exit" );
// installation aborted
abort();
// clear script passed parameters lineedit
passedParams->clear();
passedParams->setEnabled( false );
QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
+ installInfo->setFinished( true );
// enable <Next> button
- nextButton()->setEnabled( true );
- nextButton()->setText( tr( "&Next >" ) );
- QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
- QToolTip::add ( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
- nextButton()->disconnect();
- connect( nextButton(), SIGNAL( clicked() ), this, SLOT( next() ) );
+ setNextEnabled( true );
+ nextButton()->setText( tr( "&Start" ) );
+ QWhatsThis::add( nextButton(), tr( "Starts installation process" ) );
+ QToolTip::add ( nextButton(), tr( "Starts 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" ) );
+ //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
+ //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ //connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
// enable <Back> button
- backButton()->setEnabled( true );
+ setBackEnabled( true );
}
}
// ================================================================
{
const QObject* snd = sender();
productsView->blockSignals( true );
+ selectSrcBtn->blockSignals( true );
+ selectBinBtn->blockSignals( true );
if ( snd == unselectBtn ) {
QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() );
while( 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 ) {
+ int selBin = 0;
+ MapProducts::Iterator itProd1;
+ for ( itProd1 = productsMap.begin(); itProd1 != productsMap.end(); ++itProd1 ) {
+ if ( itProd1.data().hasContext( "salome binaries" ) &&
+ !itProd1.data().hasContext( "salome sources" ) &&
+ productsView->isBinaries( itProd1.key() ) )
+ selBin++;
+ }
+ if ( !itProd.data().hasContext( "salome binaries" ) || !selBin )
+ 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 ) {
+ int selSrc = 0;
+ MapProducts::Iterator itProd1;
+ for ( itProd1 = productsMap.begin(); itProd1 != productsMap.end(); ++itProd1 ) {
+ if ( itProd1.data().hasContext( "salome sources" ) &&
+ !itProd1.data().hasContext( "salome binaries" ) &&
+ productsView->isSources( itProd1.key() ) )
+ selSrc++;
+ }
+ if ( !itProd.data().hasContext( "salome sources" ) || !selSrc )
+ 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();
// ================================================================
void SALOME_InstallWizard::wroteToStdin( )
{
-#ifdef DEBUG
- cout << "Something was sent to stdin" << endl;
-#endif
+ ___MESSAGE___( "Something was sent to stdin" );
}
// ================================================================
/*!
// ================================================================
void SALOME_InstallWizard::readFromStdout( )
{
-#ifdef DEBUG
- cout << "Something was sent to stdout" << endl;
-#endif
+ ___MESSAGE___( "Something was sent to stdout" );
while ( shellProcess->canReadLineStdout() ) {
installInfo->append( QString( shellProcess->readLineStdout() ) );
installInfo->scrollToBottom();
installInfo->scrollToBottom();
}
}
+
+#define OUTLINE_TEXT(x) QString( "<font color=#FF0000><b>" ) + QString( x ) + QString( "</b></font>" )
+
// ================================================================
/*!
* SALOME_InstallWizard::readFromStderr
// ================================================================
void SALOME_InstallWizard::readFromStderr( )
{
-#ifdef DEBUG
- cout << "Something was sent to stderr" << endl;
-#endif
+ ___MESSAGE___( "Something was sent to stderr" );
while ( shellProcess->canReadLineStderr() ) {
- installInfo->append( QString( shellProcess->readLineStderr() ) );
+ installInfo->append( OUTLINE_TEXT( QString( shellProcess->readLineStderr() ) ) );
installInfo->scrollToBottom();
}
QString str( shellProcess->readStderr() );
if ( !str.isEmpty() ) {
- installInfo->append( str );
+ installInfo->append( OUTLINE_TEXT( str ) );
installInfo->scrollToBottom();
}
- passedParams->setEnabled( true );
- passedParams->setFocus();
- QFont f = parametersLab->font(); f.setBold( true ); parametersLab->setFont( f );
+ // VSR: 10/11/05 - disable answer mode ==>
+ // passedParams->setEnabled( true );
+ // passedParams->setFocus();
+ // QFont f = parametersLab->font(); f.setBold( true ); parametersLab->setFont( f );
+ // VSR: 10/11/05 - disable answer mode <==
}
// ================================================================
/*!
productsMap[item] = dep;
}
// ================================================================
+/*!
+ * SALOME_InstallWizard::addFinishButton
+ * Add button for the <Finish> page
+ */
+// ================================================================
+void SALOME_InstallWizard::addFinishButton( const QString& label,
+ const QString& tooltip,
+ const QString& script)
+{
+ if ( !label.isEmpty() )
+ buttons.append( Button( label, tooltip, script ) );
+}
+// ================================================================
/*!
* SALOME_InstallWizard::polish
* Polishing of the widget - to set right initial size
InstallWizard::polish();
}
// ================================================================
+/*!
+ * SALOME_InstallWizard::saveLog
+ * Save installation log to file
+ */
+// ================================================================
+void SALOME_InstallWizard::saveLog()
+{
+ QString txt = installInfo->text();
+ if ( txt.length() <= 0 )
+ return;
+ QDateTime dt = QDateTime::currentDateTime();
+ QString fileName = dt.toString("ddMMyy-hhmm");
+ fileName.prepend("install-"); fileName.append(".html");
+ fileName = QFileDialog::getSaveFileName( fileName,
+ QString( "HTML files (*.htm *.html)" ),
+ this, 0,
+ tr( "Save Log file" ) );
+ if ( !fileName.isEmpty() ) {
+ QFile f( fileName );
+ if ( f.open( IO_WriteOnly ) ) {
+ QTextStream stream( &f );
+ stream << txt;
+ f.close();
+ }
+ else {
+ QMessageBox::critical( this,
+ tr( "Error" ),
+ tr( "Can't save file %1.\nCheck path and permissions.").arg( fileName ),
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
+ }
+ }
+}
+// ================================================================
/*!
* SALOME_InstallWizard::updateCaption
* Updates caption according to the current page number
tr( getIWName() ) + " - " +
tr( "Step %1 of %2").arg( QString::number( this->indexOf( aPage )+1 ) ).arg( QString::number( this->pageCount() ) ) );
}
+
+// ================================================================
+/*!
+ * SALOME_InstallWizard::processValidateEvent
+ * Processes validation event (<val> is validation code)
+ */
+// ================================================================
+void SALOME_InstallWizard::processValidateEvent( const int val, void* data )
+{
+ QWidget* aPage = InstallWizard::currentPage();
+ if ( aPage != productsPage ) {
+ InstallWizard::processValidateEvent( val, data );
+ return;
+ }
+ myMutex.lock();
+ myMutex.unlock();
+ 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();
+ else {
+ WarnDialog::showWarnDlg( 0, false );
+ InstallWizard::processValidateEvent( val, data );
+ }
+}