Salome HOME
Merge from Mandrake_10_1 branch (version 2.2.4)
[tools/install.git] / src / SALOME_InstallWizard.cxx
index 156682a04345f090e73fada97185a9f0f1d35858..ecc0a901f762b66de73df4561eefe1e8e18a26e3 100644 (file)
@@ -270,6 +270,19 @@ static bool hasSpace( const QString& dir )
   return false;
 }
 
+// ================================================================
+/*!
+ *  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 ); }
+};
+
 // ================================================================
 /*!
  *  SALOME_InstallWizard::SALOME_InstallWizard
@@ -290,12 +303,12 @@ SALOME_InstallWizard::SALOME_InstallWizard(QString aXmlFileName)
   setTitleFont( fnt );
 
   // set icon
-  setIcon( QPixmap( ( const char** ) image0_data ) );
+  setIcon( QPixmap( ( const char** ) image_icon ) );
   // enable sizegrip
   setSizeGripEnabled( true );
   
   // add logo
-  addLogo( QPixmap( (const char**)image1_data ) );
+  addLogo( QPixmap( (const char**)image_logo ) );
   
   // set defaults
   setVersion( "1.2" );
@@ -548,12 +561,23 @@ void SALOME_InstallWizard::setupProductsPage()
   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 );
@@ -599,6 +623,10 @@ void SALOME_InstallWizard::setupProductsPage()
   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& ) ) );
@@ -1052,30 +1080,32 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
     QString tmpFolder = QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME;
     QString tgtFolder = QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() );
     myThread->clearCommands();
-    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);
+    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"
-                                 "Please, add this product in config.xml file.").arg(item->text(0)).arg(item->text(1)),
-                             QMessageBox::Ok, 
-                             QMessageBox::NoButton, 
-                             QMessageBox::NoButton );
-       return false;
+         myThread->addCommand( item, script );
+       }
+       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
     }
-    WarnDialog::showWarnDlg( this, true );
-    myThread->start();
-    return true; // return in order to avoid default postValidateEvent() action
   }
   return InstallWizard::acceptData( pageTitle );
 }
@@ -1132,6 +1162,29 @@ void SALOME_InstallWizard::checkProductPage()
   // 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 ) {
+    if ( itProd.data().getContext() == "salome sources" ) {
+      totSrc++;
+      if ( productsView->isSources( itProd.key() ) )
+       selSrc++;
+    }
+    if ( itProd.data().getContext() == "salome binaries" ) {
+      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 );
@@ -1286,8 +1339,9 @@ void SALOME_InstallWizard::launchScript()
   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
   setBackEnabled( true );
   // script parameters
@@ -1479,8 +1533,9 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle)
   nextButton()->setText( tr( "&Next >" ) );
   QWhatsThis::add( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
   QToolTip::add  ( nextButton(), tr( "Moves to the next step of the installation procedure" ) );
-  nextButton()->disconnect();
-  connect( nextButton(), SIGNAL( clicked() ), this, SLOT( next() ) );
+  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() ) );
 
@@ -1509,8 +1564,9 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle)
       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() ) );
+      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();
@@ -1673,8 +1729,9 @@ void SALOME_InstallWizard::productInstalled( )
     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() ) );
     // enable <Back> button
     setBackEnabled( true );
   }
@@ -1803,6 +1860,8 @@ 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 ) {
@@ -1810,6 +1869,36 @@ void SALOME_InstallWizard::onProdBtn()
       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().getContext() == "salome sources" ) {
+       if ( checkBox->state() == QButton::Off )
+         productsView->setNone( itProd.key() );
+       else
+         productsView->setSources( 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().getContext() == "salome binaries" ) {
+       if ( checkBox->state() == QButton::Off )
+         productsView->setNone( itProd.key() );
+       else
+         productsView->setBinaries( itProd.key() );
+      }
+    }
+  }
+  selectSrcBtn->blockSignals( false );
+  selectBinBtn->blockSignals( false );
   productsView->blockSignals( false );
   onSelectionChanged();
   checkProductPage();