Salome HOME
Use OpenCASCADE 5.2
[tools/install.git] / src / SALOME_InstallWizard.cxx
index 599b682292e8808d818846bf07eddbfca1200131..d43c3b5087a4f4234a195ef878927ff169876e73 100644 (file)
@@ -1,30 +1,38 @@
 //  File      : SALOME_InstallWizard.cxx 
 //  Created   : Thu Dec 18 12:01:00 2002
 //  Author    : Vadim SANDLER
-//  Project   : SALOME Professional
+//  Project   : PAL/SALOME
 //  Module    : InstallWizard
-//  Copyright : 2003 CEA/DEN, EDF R&D
+//  Copyright : 2004 CEA
 //  $Header$ 
 
 #include "SALOME_InstallWizard.hxx"
+#include "SALOME_ProductsView.hxx"
+#include "SALOME_ProgressView.hxx"
+#include "SALOME_XmlHandler.hxx"
+#include "SALOME_HelpWindow.hxx"
+
 #include "icons.h"
 
-#include <qbuttongroup.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qlistview.h>
+#include <qlabel.h>
+#include <qtextedit.h>
+#include <qtextbrowser.h>
+#include <qprocess.h>
+#include <qcheckbox.h>
+#include <qsplitter.h>
 #include <qlayout.h>
 #include <qfiledialog.h> 
 #include <qapplication.h>
-#include <qtextbrowser.h> 
-#include <qdesktopwidget.h> 
 #include <qfileinfo.h> 
 #include <qmessagebox.h> 
 #include <qtimer.h> 
-#include <qhbuttongroup.h>
-#include <qradiobutton.h> 
 #include <qvbox.h>
 #include <qwhatsthis.h> 
 #include <qtooltip.h>
 #include <qfile.h>
-#include <qxml.h>
 
 #ifdef WNT
 #include <iostream.h>
 #define max( x, y ) ( x ) > ( y ) ? ( x ) : ( y )
 #endif
 
-// ######################################## Globals ##############################################
-
-QString myVersion   = "1.2";
-QString myCaption   = QString("SALOME Professional %1 Installation Wizard").arg(myVersion);
-QString myCopyright = "Copyright (C) 2003 CEA/DEN, EDF R&D";
-QString myLicense   = "All right reserved";
-QString myOS        = "";
+QString tmpDirName() { return QString(  "/INSTALLWORK" ) + QString::number( getpid() ); }
+#define TEMPDIRNAME tmpDirName()
 
-#define TEMPDIRNAME ( "/INSTALLWORK" + QString::number( getpid() ) )
+// ================================================================
 /*!
-  Defines list of dependancies as string separated by space symbols
-*/
+ *  DefineDependeces [ static ]
+ *  Defines list of dependancies as string separated by space symbols
+ */
+// ================================================================
 static QString DefineDependeces(MapProducts& theProductsMap) {
   QStringList aProducts;
   for ( MapProducts::Iterator mapIter = theProductsMap.begin(); mapIter != theProductsMap.end(); ++mapIter ) {
@@ -83,12 +88,14 @@ static QString DefineDependeces(MapProducts& theProductsMap, QCheckListItem* pro
 }
 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
 
+// ================================================================
 /*!
-  Makes directory recursively, returns false if not succedes [ static ]
-*/
+ *  makeDir [ static ]
+ *  Makes directory recursively, returns false if not succedes
+ */
+// ================================================================
 static bool makeDir( const QString& theDir, QString& theCreated )
 {
-  theCreated = QString::null;
   if ( theDir.isEmpty() )
     return false;
   QString aDir = QDir::cleanDirPath( QFileInfo( theDir ).absFilePath() );
@@ -123,9 +130,12 @@ static bool makeDir( const QString& theDir, QString& theCreated )
   }
   return true;
 }
+// ================================================================
 /*!
-  Reads the file, returns false if can't open it
-*/
+ *  readFile [ static ]
+ *  Reads the file, returns false if can't open it
+ */
+// ================================================================
 static bool readFile( const QString& fileName, QString& text )
 {
   if ( QFile::exists( fileName ) ) {
@@ -143,163 +153,55 @@ static bool readFile( const QString& fileName, QString& text )
   }
   return false;
 }
-// ###################################### Progress View ###########################################
-
+// ================================================================
 /*!
-  Constructor of progress view's item
-  <parent>      - parent progress view
-  <productName> - full name of the product
-  <smbName>     - alias for he product used by the script
-  <status>      - initial status of the product, default is 'Waiting'
-*/
-ProgressViewItem::ProgressViewItem( ProgressView* parent, QString productName, const QString installType, const QString scriptName, Status status  ) 
-     : QListViewItem( parent, productName, installType ), myScript( scriptName )
-{
-  setStatus( status );
-}
-/*!
-  Sets new status for the item
-*/
-void ProgressViewItem::setStatus( Status status )
-{ 
-  myStatus = status; 
-  switch ( myStatus ) {
-  case Waiting:
-    setText( 2, "Waiting" );    break;
-  case Processing:
-    setText( 2, "Processing" ); break;
-  case Completed:
-    setText( 2, "Completed" );  break;
-  case Aborted:
-    setText( 2, "Aborted" );  break;
-  default:
-    break;
-  }
-  repaint(); 
-}
-/*!
-  Paints the cell of the list view item
-*/
-void ProgressViewItem::paintCell( QPainter* painter, const QColorGroup& cg, int column, int width, int align ) 
-{
-  QColorGroup acg( cg );
-  if ( column == 2 ) {
-    switch ( myStatus ) {
-    case Waiting:
-      acg.setColor( QColorGroup::Text, ( ( ProgressView* )listView() )->getWaitingColor() ); break;
-    case Processing:
-      acg.setColor( QColorGroup::Text, ( ( ProgressView* )listView() )->getProcessingColor() ); break;
-    case Completed:
-      acg.setColor( QColorGroup::Text, ( ( ProgressView* )listView() )->getCompletedColor() ); break;
-    case Aborted:
-      acg.setColor( QColorGroup::Text, ( ( ProgressView* )listView() )->getWaitingColor() ); break;
-    default:
-      break;
-    }
-  }
-  QListViewItem::paintCell( painter, acg, column, width, align );
-}
-/*!
-  Progress view's constructor
-*/
-ProgressView::ProgressView( QWidget* parent ) : QListView( parent ) 
+ *  hasSpace [ static ]
+ *  Checks if string contains spaces; used to check directory paths
+ */
+// ================================================================
+static bool hasSpace( const QString& dir )
 {
-  addColumn( tr( "Product" ) ); addColumn( tr( "Type" ) ); addColumn( tr( "Status" ) );
-  header()->hide();
-  setSelectionMode( QListView::NoSelection );
-  setSorting( -1 );
-  setResizeMode( QListView::AllColumns );
-  setFocusPolicy( QWidget::NoFocus );
-  setColors( QColor( "red" ), QColor( "orange" ), QColor( "green" ) );
-}
-/*!
-  Sets status colors
-*/
-void ProgressView::setColors( QColor wColor, QColor pColor, QColor cColor ) {
-  myWaitingColor    = wColor;
-  myProcessingColor = pColor;
-  myCompletedColor  = cColor;
-  repaint();
-}
-/*!
-  Adds product item
-*/
-void ProgressView::addProduct( const QString product, const QString type, const QString script ) {
-  QListViewItem* lastItem = this->lastItem();
-  ProgressViewItem* newItem = new ProgressViewItem( this, product, type, script );
-  if ( lastItem )
-    newItem->moveItem( lastItem );
-}
-/*!
-  Finds the first item with given status
-*/
-QString ProgressView::findStatus( Status status ) {
-  ProgressViewItem* item = ( ProgressViewItem* )firstChild();
-  while( item ) {
-    if ( item->getStatus() == status )
-      return item->getProduct();
-    item = ( ProgressViewItem* )( item->nextSibling() );
-  }
-  return QString::null;
-}
-/*!
-  Sets new status for the product item
-*/
-void ProgressView::setStatus( const QString product, Status status ) {
-  ProgressViewItem* item = findItem( product );
-  if ( item ) {
-    item->setStatus( status );
-    repaint();
-  }
-}
-/*!
-  Scrolls the view to make item visible if necessary
-*/
-void ProgressView::ensureVisible( const QString product )  {
-  ProgressViewItem* item = findItem( product );
-  if ( item ) {
-    ensureItemVisible( item );
-  }
-}
-/*!
-  Finds the item by the product name
-*/
-ProgressViewItem* ProgressView::findItem( const QString product ) {
-  ProgressViewItem* item = ( ProgressViewItem* )firstChild();
-  while( item ) {
-    if ( item->getProduct() == product )
-      return item;
-    item = ( ProgressViewItem* )( item->nextSibling() );
-  }
-  return 0;
-}
-/*!
-  Gets the product script
-*/
-QString ProgressView::getScript( const QString product ) {
-  ProgressViewItem* item = ( ProgressViewItem* )firstChild();
-  while( item ) {
-    if ( item->getProduct() == product )
-      return item->getScript();
-    item = ( ProgressViewItem* )( item->nextSibling() );
+  for ( int i = 0; i < (int)dir.length(); i++ ) {
+    if ( dir[ i ].isSpace() )
+      return true;
   }
-  return QString::null;
+  return false;
 }
 
-// ###################################### Install Wizard ###########################################
-
+// ================================================================
 /*!
-  Constructor
-*/
+ *  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 )
+     : InstallWizard( qApp->desktop(), "SALOME_InstallWizard", false, 0 ), 
+       helpWindow( NULL ), 
+       moreMode( false ), 
+       previousPage( 0 ), 
+       exitConfirmed( false )
 {
+  myIWName = tr( "Installation Wizard" );
   tmpCreated = QString::null;
-  // set xml file
   xmlFileName = aXmlFileName;
   QFont fnt = font(); fnt.setPointSize( 14 ); fnt.setBold( true );
   setTitleFont( fnt );
 
+  // set icon
+  setIcon( QPixmap( ( const char** ) image0_data ) );
+  // enable sizegrip
+  setSizeGripEnabled( true );
+  
+  // add logo
+  addLogo( QPixmap( (const char**)image1_data ) );
+  
+  // set defaults
+  setVersion( "1.2" );
+  setCaption( tr( "PAL/SALOME %1" ).arg( myVersion ) );
+  setCopyright( tr( "Copyright (C) 2004 CEA" ) );
+  setLicense( tr( "All right reserved" ) );
+  setOS( "" );
+
 #ifdef DEBUG
   cout << "Config. file : " << xmlFileName << endl;
 #endif
@@ -310,19 +212,13 @@ SALOME_InstallWizard::SALOME_InstallWizard(QString aXmlFileName)
     QXmlInputSource source( &xmlfile );
     QXmlSimpleReader reader;
 
-    StructureParser * handler = new StructureParser();
+    StructureParser* handler = new StructureParser( this );
     reader.setContentHandler( handler );
     reader.parse( source );  
   }
-  // set caption
-  setCaption( myCaption );
-  // set icon
-  setIcon( QPixmap( ( const char** ) image0_data ) );
-  // enable sizegrip
-  setSizeGripEnabled( true );
 
   // create instance of class for starting shell install script
-  shellProcess = new QProcess(this,"shellProcess");
+  shellProcess = new QProcess( this, "shellProcess" );
 
   // create introduction page
   setupIntroPage();
@@ -357,9 +253,12 @@ SALOME_InstallWizard::SALOME_InstallWizard(QString aXmlFileName)
   connect(shellProcess, SIGNAL( processExited() ),   this, SLOT( productInstalled() ) );
   connect(shellProcess, SIGNAL( wroteToStdin() ),    this, SLOT( wroteToStdin() ) );
 }
+// ================================================================
 /*!
-  Destructor
-*/
+ *  SALOME_InstallWizard::~SALOME_InstallWizard
+ *  Destructor
+ */
+// ================================================================
 SALOME_InstallWizard::~SALOME_InstallWizard()
 {
   shellProcess->kill(); // kill it for sure
@@ -375,26 +274,32 @@ SALOME_InstallWizard::~SALOME_InstallWizard()
     }
   }
 }
+// ================================================================
 /*!
-  Event filter, spies for Help window closing
-*/
+ *  SALOME_InstallWizard::eventFilter
+ *  Event filter, spies for Help window closing
+ */
+// ================================================================
 bool SALOME_InstallWizard::eventFilter( QObject* object, QEvent* event )
 {
   if ( object && object == helpWindow && event->type() == QEvent::Close )
     helpWindow = NULL;
   return InstallWizard::eventFilter( object, event );
 }
-/*! 
-  Close event handler
-*/
+// ================================================================
+/*!
+ *  SALOME_InstallWizard::closeEvent
+ *  Close event handler
+ */
+// ================================================================
 void SALOME_InstallWizard::closeEvent( QCloseEvent* ce )
 {
   if ( !exitConfirmed ) {
     if ( QMessageBox::information( this, 
                                   tr( "Exit" ), 
-                                  tr( "Do you want to quit Installation Wizard?" ), 
-                                  tr( "Yes" ), 
-                                  tr( "No" ),
+                                  tr( "Do you want to quit %1?" ).arg( getIWName() ), 
+                                  tr( "&Yes" ), 
+                                  tr( "&No" ),
                                   QString::null,
                                   0,
                                   1 ) == 1 ) {
@@ -407,9 +312,12 @@ void SALOME_InstallWizard::closeEvent( QCloseEvent* ce )
     }
   }
 }
+// ================================================================
 /*!
-  Creates introduction page
-*/
+ *  SALOME_InstallWizard::setupIntroPage
+ *  Creates introduction page
+ */
+// ================================================================
 void SALOME_InstallWizard::setupIntroPage()
 {
   // create page
@@ -417,7 +325,7 @@ void SALOME_InstallWizard::setupIntroPage()
   QGridLayout* pageLayout = new QGridLayout( introPage ); 
   pageLayout->setMargin( 0 ); pageLayout->setSpacing( 6 );
   // create logo picture
-  QPixmap logo( (const char**)SALOMEPRO_Logo_xpm );
+  QPixmap logo( (const char**)SALOME_Logo_xpm );
   logoLab = new QLabel( introPage );
   logoLab->setPixmap( logo );
   logoLab->setScaledContents( false );
@@ -425,9 +333,9 @@ void SALOME_InstallWizard::setupIntroPage()
   logoLab->setAlignment( AlignCenter );
   // create version box
   QVBox* versionBox = new QVBox( introPage ); versionBox->setSpacing( 6 );
-  versionBox->setFrameStyle( QGroupBox::Panel | QGroupBox::Sunken );
+  versionBox->setFrameStyle( QVBox::Panel | QVBox::Sunken );
   QWidget* stretch1 = new QWidget( versionBox ); versionBox->setStretchFactor( stretch1, 5 );
-  versionLab = new QLabel( QString("Version %1").arg(myVersion), versionBox );
+  versionLab = new QLabel( QString("%1 %2").arg( tr( "Version" ) ).arg(myVersion), versionBox );
   versionLab->setAlignment( AlignCenter );
   copyrightLab = new QLabel( myCopyright, versionBox );
   copyrightLab->setAlignment( AlignCenter );
@@ -436,16 +344,16 @@ void SALOME_InstallWizard::setupIntroPage()
   QWidget* stretch2 = new QWidget( versionBox ); versionBox->setStretchFactor( stretch2, 5 );
   // create info box
   info = new QLabel( introPage );
-  info->setText( tr( "This program will install <b>SALOME Professional Version %1</b>."
+  info->setText( tr( "This program will install <b>%1</b>."
                      "<br><br>The wizard will also help you to install all products "
-                     "which are necessary for <b>SALOME PRO</b> platform and setup "
+                     "which are necessary for <b>%2</b> and setup "
                      "your environment.<br><br>Click <code>Cancel</code> button to abort "
                      "installation and quit. Click <code>Next</code> button to continue with the "
-                     "installation program.").arg(myVersion) );
-  info->setFrameStyle( QGroupBox::WinPanel | QGroupBox::Sunken );
+                     "installation program." ).arg( myCaption ).arg( myCaption ) );
+  info->setFrameStyle( QLabel::WinPanel | QLabel::Sunken );
   info->setMargin( 6 );
   info->setAlignment( WordBreak );
-  info->setMinimumSize( 250, 250 );
+  info->setMinimumWidth( 250 );
   QPalette pal = info->palette();
   pal.setColor( QColorGroup::Background, QApplication::palette().active().base() );
   info->setPalette( pal );
@@ -459,9 +367,12 @@ void SALOME_InstallWizard::setupIntroPage()
   // adding page
   addPage( introPage, tr( "Introduction" ) );
 }
+// ================================================================
 /*!
-  Creates products page
-*/
+ *  SALOME_InstallWizard::setupProductsPage
+ *  Creates products page
+ */
+// ================================================================
 void SALOME_InstallWizard::setupProductsPage()
 {
   // create page
@@ -491,8 +402,8 @@ void SALOME_InstallWizard::setupProductsPage()
   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 MyListView( moreBox );
-  productsView->setMinimumSize( 200, 180 );
+  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
@@ -562,9 +473,8 @@ void SALOME_InstallWizard::setupProductsPage()
     QXmlInputSource source( &xmlfile );
     QXmlSimpleReader reader;
 
-    StructureParser * handler = new StructureParser();
-    handler->setWizard( this );
-    handler->setListView(productsView);
+    StructureParser* handler = new StructureParser( this );
+    handler->setProductsList(productsView);
     handler->setTargetDir(targetFolder);
     handler->setTempDir(tempFolder);
     reader.setContentHandler( handler );
@@ -573,13 +483,13 @@ void SALOME_InstallWizard::setupProductsPage()
   // set first item to be selected
   if ( productsView->childCount() > 0 ) {
     productsView->setSelected( productsView->firstChild(), true );
-    onSelectionChanged( productsView->firstChild() );
+    onSelectionChanged();
   }
   // adding page
   addPage( productsPage, tr( "Installation settings" ) );
   // connecting signals
-  connect( productsView, SIGNAL( selectionChanged( QListViewItem* ) ), 
-                                              this, SLOT( onSelectionChanged( QListViewItem* ) ) );
+  connect( productsView, SIGNAL( selectionChanged() ), 
+                                              this, SLOT( onSelectionChanged() ) );
   connect( productsView, SIGNAL( itemToggled( QCheckListItem* ) ), 
                                               this, SLOT( onItemToggled( QCheckListItem* ) ) );
   connect( unselectBtn,  SIGNAL( clicked() ), this, SLOT( onProdBtn() ) );
@@ -594,9 +504,12 @@ void SALOME_InstallWizard::setupProductsPage()
   // start on default - non-advanced - mode
   moreBox->hide();
 }
+// ================================================================
 /*!
-  Creates prestart page
-*/
+ *  SALOME_InstallWizard::setupCheckPage
+ *  Creates prestart page
+ */
+// ================================================================
 void SALOME_InstallWizard::setupCheckPage()
 {
   // create page
@@ -620,9 +533,12 @@ void SALOME_InstallWizard::setupCheckPage()
   // adding page
   addPage( prestartPage, tr( "Check your choice" ) );
 }
+// ================================================================
 /*!
-  Creates progress page
-*/
+ *  SALOME_InstallWizard::setupProgressPage
+ *  Creates progress page
+ */
+// ================================================================
 void SALOME_InstallWizard::setupProgressPage()
 {
   // create page
@@ -677,19 +593,23 @@ void SALOME_InstallWizard::setupProgressPage()
   // connect signals
   connect( passedParams, SIGNAL( returnPressed() ), this, SLOT( onReturnPressed() ) ) ;
 }
+// ================================================================
 /*!
-  Creates readme page
-*/
+ *  SALOME_InstallWizard::setupReadmePage
+ *  Creates readme page
+ */
+// ================================================================
 void SALOME_InstallWizard::setupReadmePage()
 {
   // create page
-  readmePage = new QWidget( this, "RedamePage" );
+  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->setUndoRedoEnabled ( false );
   QWhatsThis::add( readme, tr( "Displays README information" ) );
   QToolTip::add  ( readme, tr( "Displays README information" ) );
@@ -715,13 +635,16 @@ void SALOME_InstallWizard::setupReadmePage()
   if ( readFile( readmeFile, text ) )
     readme->setText( text );
   else
-    readme->setText( "README file has not been found" );
+    readme->setText( tr( "README file has not been found" ) );
   // adding page
   addPage( readmePage, tr( "Finish installation" ) );
 }
+// ================================================================
 /*!
-  Displays choice info
-*/
+ *  SALOME_InstallWizard::showChoiceInfo
+ *  Displays choice info
+ */
+// ================================================================
 void SALOME_InstallWizard::showChoiceInfo()
 {
   choices->clear();
@@ -732,21 +655,20 @@ void SALOME_InstallWizard::showChoiceInfo()
   QString text;
 
   if ( !xmlFileName.isEmpty() ) {
-    text += tr( "Configuration file: <b>" ) + xmlFileName + "</b><br>";
+    text += tr( "Configuration file" )+ ": <b>" + xmlFileName + "</b><br>";
     text += "<br>";
   }
   if ( !myOS.isEmpty() ) {
-    text += tr( "Target platform: <b>" ) + myOS + "</b><br>";
+    text += tr( "Target platform" ) + ": <b>" + myOS + "</b><br>";
     text += "<br>";
   }
-  text += tr( "Products to be used:<ul>" );
+  text += tr( "Products to be used" ) + ":<ul>";
   QCheckListItem* item = (QCheckListItem*)( productsView->firstChild() );
   while( item ) {
     if ( productsMap.contains( item ) ) {
       if ( item->childCount() > 0 ) {
-        // Neither "SALOME binaries", no "SALOME sources"
         if ( productsView->isNative( item ) ) {
-          text += "<li><b>" + item->text() + "</b> as native<br>";
+          text += "<li><b>" + item->text() + "</b> " + tr( "as native" ) + "<br>";
           nbProd++;
         }
       }
@@ -754,26 +676,25 @@ void SALOME_InstallWizard::showChoiceInfo()
     item = (QCheckListItem*)( item->nextSibling() );
   }
   if ( nbProd == 0 ) {
-    text += "<li><b>none</b><br>";
+    text += "<li><b>" + tr( "none" ) + "</b><br>";
   }
   text += "</ul>";
-  text += tr( "Products to be installed:<ul>" );
+  nbProd = 0;
+  text += tr( "Products to be installed" ) + ":<ul>";
   item = (QCheckListItem*)( productsView->firstChild() );
   while( item ) {
     if ( productsMap.contains( item ) ) {
       if ( item->childCount() > 0 ) {
-        // Neither "SALOME binaries", no "SALOME sources"
         if ( productsView->isBinaries( item ) ) {
-          text += "<li><b>" + item->text() + "</b> as binaries<br>";
+          text += "<li><b>" + item->text() + "</b> " + tr( "as binaries" ) + "<br>";
           nbProd++;
         }
         else if ( productsView->isSources( item ) ) {
-          text+= "<li><b>" + item->text() + "</b> as sources<br>";
+          text+= "<li><b>" + item->text() + "</b> " + tr( "as sources" ) + "<br>";
           nbProd++;
         }
       }
       else if ( item->isOn() ) {
-        // "SALOME binaries" or "SALOME sources"
         text+= "<li><b>" + item->text() + "</b><br>";
         nbProd++;
       }
@@ -781,34 +702,26 @@ void SALOME_InstallWizard::showChoiceInfo()
     item = (QCheckListItem*)( item->nextSibling() );
   }
   if ( nbProd == 0 ) {
-    text += "<li><b>none</b><br>";
+    text += "<li><b>" + tr( "none" ) + "</b><br>";
   }
   text += "</ul>";
-  text += "Total disk space required: <b>" + QString::number( totSize ) + " Kb</b><br>" ;
-  text += "Space for temporary files required: <b>" + QString::number( tempSize ) + " Kb</b><br>" ;
+  text += tr( "Total disk space required:" ) + " <b>" + QString::number( totSize ) + " Kb</b><br>" ;
+  text += tr( "Space for temporary files required:" ) + " <b>" + QString::number( tempSize ) + " Kb</b><br>" ;
   text += "<br>";
-  text += "Target directory: <b>" + QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) + "</b><br>";
+  text += tr( "Target directory:" ) + " <b>" + QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) + "</b><br>";
   // VSR: Temporary folder is used always now and it is not necessary to disable it -->
   // if ( tempSize > 0 )
   // VSR: <----------------------------------------------------------------------------
-  text += "Temp directory: <b>" + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + "</b><br>";
+  text += tr( "Temp directory:" ) + " <b>" + QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + "</b><br>";
   text += "<br>";
   choices->setText( text );
 }
+// ================================================================
 /*!
-  Checks if string contains spaces; used to check directory paths [ static ]
-*/
-static bool hasSpace( const QString& dir )
-{
-  for ( int i = 0; i < (int)dir.length(); i++ ) {
-    if ( dir[ i ].isSpace() )
-      return true;
-  }
-  return false;
-}
-/*!
-  Validates page when <Next> button is clicked
-*/
+ *  SALOME_InstallWizard::acceptData
+ *  Validates page when <Next> button is clicked
+ */
+// ================================================================
 bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
 {
   QString tmpstr;
@@ -816,8 +729,8 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
   if ( aPage == productsPage ) {
     // ########## check if any products are selected to be installed
     long totSize, tempSize;
-    checkSize( &totSize, &tempSize );
-    if ( totSize <= 0 ) {
+    bool anySelected = checkSize( &totSize, &tempSize );
+    if ( !anySelected ) {
       QMessageBox::warning( this, 
                             tr( "Warning" ), 
                             tr( "Select one or more products to install" ), 
@@ -942,7 +855,8 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
        return false; 
       }
       else {
-       tempFolder->setText( "/tmp" );
+       tempDir = "/tmp";
+       tempFolder->setText( tempDir );
       }
     }
     QFileInfo fit( QDir::cleanDirPath( tempDir ) );
@@ -984,7 +898,7 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
            if ( item->text(2).isEmpty() || item->text(2).isNull() ) {
              QMessageBox::warning( this, 
                                    tr( "Warning" ), 
-                                   tr( QString("You don't have a defined script for %1").arg(item->text(0))), 
+                                   tr( "You don't have a defined script for %1").arg(item->text(0)), 
                                    QMessageBox::Ok, 
                                    QMessageBox::NoButton, 
                                    QMessageBox::NoButton );
@@ -995,7 +909,7 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
              if ( !fi.exists() ) {
                QMessageBox::warning( this, 
                                      tr( "Warning" ),  
-                                           tr( QString("%1 required for %2 doesn't exist.").arg("./config_files/" + item->text(2)).arg(item->text(0))),  
+                                     tr( "%1 required for %2 doesn't exist.").arg("./config_files/" + item->text(2)).arg(item->text(0)),  
                                      QMessageBox::Ok, 
                                      QMessageBox::NoButton, 
                                      QMessageBox::NoButton );
@@ -1020,8 +934,8 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
              else {
                QMessageBox::warning( this, 
                                      tr( "Warning" ), 
-                                     tr( QString("%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))), 
+                                     tr( "%1 is required for %2 %3 installation.\n"
+                                         "Please, add this product in config.xml file.").arg(dependOn[ i ]).arg(item->text(0)).arg(item->text(1)), 
                                      QMessageBox::Ok, 
                                      QMessageBox::NoButton, 
                                      QMessageBox::NoButton );
@@ -1048,7 +962,7 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
        if ( system( script ) ) {
          QMessageBox::warning( this, 
                                tr( "Warning" ), 
-                               tr( QString("You don't have native %1 %2 installed").arg(item->text(0)).arg(item->text(1)) ), 
+                               tr( "You don't have native %1 %2 installed").arg(item->text(0)).arg(item->text(1)), 
                                QMessageBox::Ok, 
                                QMessageBox::NoButton, 
                                QMessageBox::NoButton );
@@ -1059,8 +973,8 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
       else {
        QMessageBox::warning( this, 
                              tr( "Warning" ), 
-                             tr( QString("%The product %1 %2 required for installation.\n"
-                                         "Please, add this product in config.xml file.").arg(item->text(0)).arg(item->text(1)) ),
+                             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 );
@@ -1070,13 +984,16 @@ bool SALOME_InstallWizard::acceptData( const QString& pageTitle )
   }
   return InstallWizard::acceptData( pageTitle );
 }
+// ================================================================
 /*!
-  Calculates disk space required for the installation
-*/
-void SALOME_InstallWizard::checkSize( long* totSize, long* tempSize )
+ *  SALOME_InstallWizard::checkSize
+ *  Calculates disk space required for the installation
+ */
+// ================================================================
+bool SALOME_InstallWizard::checkSize( long* totSize, long* tempSize )
 {
   long tots = 0, temps = 0;
-  int nativeProd = 0;
+  int nbSelected = 0;
 
   MapProducts::Iterator mapIter;
   for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) {
@@ -1089,65 +1006,81 @@ void SALOME_InstallWizard::checkSize( long* totSize, long* tempSize )
       tots += dep.getSize(true);
       temps = max( temps, dep.getTempSize() );
     }
-    else if ( productsView->isNative( item ) ) {
-      nativeProd++;
-    }
+    if ( !productsView->isNone( item ) )
+      nbSelected++;
   }
  
-  requiredSize->setText( QString::number( tots )  + " Kb");
-  requiredTemp->setText( QString::number( temps ) + " Kb");
   if ( totSize )
     *totSize = tots;
   if ( tempSize )
     *tempSize = temps;
-  setNextEnabled( productsPage, (tots > 0) || (nativeProd > 0));
+  return ( nbSelected > 0 );
 }
+// ================================================================
 /*!
-  Enabled/disables "Next" button for the directory page
-*/
-void SALOME_InstallWizard::checkDirs()
+ *  SALOME_InstallWizard::checkProductPage
+ *  Checks products page validity (directories and products selection) and
+ *  enabled/disables "Next" button for the Products page
+ */
+// ================================================================
+void SALOME_InstallWizard::checkProductPage()
 {
-  // VSR: Temporary folder is used always now and it is not necessary to disable it -->
-  // get disk space required
-  //long totSize, tempSize;
-  //checkSize( &totSize, &tempSize );
-  // enable/disable temp directory controls
-  // tempFolder->setEnabled( tempSize > 0 );
-  // tempBtn->setEnabled( tempSize > 0 );
-  // VSR: <----------------------------------------------------------------------------
-  // get dirs
-  QString targetDir = targetFolder->text().stripWhiteSpace();
+  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");
+
   // enable/disable "Next" button
-  setNextEnabled( productsPage, !targetDir.isEmpty() );
+  setNextEnabled( productsPage, isAnyProductSelected && isTargetDirValid && isTempDirValid );
 }
+// ================================================================
 /*!
-  Sets the product and all products this one depends on to be checked ( recursively )
-*/
-void SALOME_InstallWizard::setProductOn( QCheckListItem* item, int install )
+ *  SALOME_InstallWizard::setPrerequisites
+ *  Sets the product and all products this one depends on to be checked ( recursively )
+ */
+// ================================================================
+void SALOME_InstallWizard::setPrerequisites( QCheckListItem* item )
 {
   if ( !productsMap.contains( item ) )
     return;
-  if ( productsView->isNone( item ) ) {
-    if ( install == 1 )
-      productsView->setBinaries( item );
-    else if ( install == 0 )
-      productsView->setSources( item );
-    else if ( install == 2 )
-      productsView->setNative( item );
-  }
+  if ( productsView->isNone( item ) )
+    return;
   // get all prerequisites
   QStringList dependOn = productsMap[ item ].getDependancies();
   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 ] )
-        setProductOn( itProd.key(), 1 );
+      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() );
+       }
+      }
     }
   }
 }
+// ================================================================
 /*!
-  Runs installation script
-*/
+ *  SALOME_InstallWizard::launchScript
+ *  Runs installation script
+ */
+// ================================================================
 void SALOME_InstallWizard::launchScript()
 {
   // try to find product being processed now
@@ -1183,8 +1116,8 @@ void SALOME_InstallWizard::launchScript()
 
     // ... 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 ) ) {
@@ -1239,7 +1172,39 @@ void SALOME_InstallWizard::launchScript()
 #ifdef DEBUG
   cout << "All products have been installed successfully" << endl;
 #endif
-  // all products installed successfully
+  // all products are installed successfully
+  QString workDir = QDir::cleanDirPath( QFileInfo( "./config_files/" ).absFilePath() );
+  MapProducts::Iterator mapIter;
+#ifdef DEBUG
+  cout << "starting pick-up environment" << endl;
+#endif
+  for ( mapIter = productsMap.begin(); mapIter != productsMap.end(); ++mapIter ) {
+    QCheckListItem* item = mapIter.key();
+    Dependancies dep = mapIter.data();
+    QString depproducts = QUOTE( DefineDependeces(productsMap) ); 
+    if ( dep.pickUpEnvironment() ) {
+#ifdef DEBUG
+      cout << "... for " << dep.getName() << endl;
+#endif
+      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);
+#ifdef DEBUG
+      cout << "... --> " << script.latin1() << endl;
+#endif
+      if ( system( script.latin1() ) ) { 
+#ifdef DEBUG
+       cout << "ERROR" << endl; 
+#endif
+      }
+    }
+  }
   // <Next> button
   nextButton()->setEnabled( true );
   nextButton()->setText( tr( "&Next >" ) );
@@ -1257,9 +1222,12 @@ void SALOME_InstallWizard::launchScript()
     showNormal();
   raise();
 }
+// ================================================================
 /*!
-  <More...> button slot
-*/
+ *  SALOME_InstallWizard::onMoreBtn
+ *  <More...> button slot
+ */
+// ================================================================
 void SALOME_InstallWizard::onMoreBtn()
 {
   if ( moreMode ) {
@@ -1279,47 +1247,57 @@ void SALOME_InstallWizard::onMoreBtn()
     resize( geometry().width(), 0 );
     qApp->processEvents();
   }
+  checkProductPage();
 }
+// ================================================================
 /*!
-  <Launch Salome> button slot
-*/
+ *  SALOME_InstallWizard::onLaunchSalome
+ *  <Launch Salome> button slot
+ */
+// ================================================================
 void SALOME_InstallWizard::onLaunchSalome()
 {
-  QCheckListItem* item = 0;
-  if ( ( item = findItem("SalomePro-Bin" ) ) ) {
-    QFileInfo fi( targetFolder->text() + "/SalomePro-" + item->text(1) + "/salome" );
-    if ( fi.exists() ) {
-      QString script;
-      script += "cd " + targetFolder->text() + "/SalomePro-" + item->text(1) + "; ";
-      script += "source salome.csh; ";
-      //script += "cd bin; ";
-      //script += "runSalome > /dev/null";
-      script += "salome -g > /dev/null";
-      script = "(csh -c '" + script + "')";
+  QString msg = tr( "You don't have SALOME binaries installed in the %1 directory!" ).arg( targetFolder->text() );
+
+  QCheckListItem* item = findItem( "KERNEL-Bin" );
+  if ( item ) {
+    QFileInfo fi( targetFolder->text() + "/KERNEL_" + item->text(1) + "/bin/salome/runSalome" );
+    QFileInfo fienv( targetFolder->text() + "/KERNEL_" + item->text(1) + "/salome.csh" );
+    if ( fienv.exists() ) {
+      if ( fi.exists() ) {
+       QString script;
+       script += "cd " + targetFolder->text() + "/KERNEL_" + item->text(1) + "; ";
+       script += "source salome.csh; ";
+       script += "cd bin/salome; ";
+       script += "runSalome > /dev/null";
+       script = "(csh -c '" + script + "')";
 #ifdef DEBUG
-      cout << script.latin1() << endl;
+       cout << script.latin1() << endl;
 #endif
-      if ( system( script.latin1() ) ){
-       QMessageBox::warning( this, 
-                             tr( "Error" ), 
-                             tr( "Can't launch SALOME" ), 
-                             QMessageBox::Ok, 
-                             QMessageBox::NoButton,
-                             QMessageBox::NoButton );
+       if ( !system( script.latin1() ) )
+         return;
+       else
+         msg = tr( "Can't launch SALOME." );
       }
-      return;
+      else
+       msg = tr( "Can't launch SALOME." ) + "\n" + tr( "runSalome file can not be found." );
     }
+    else
+      msg = tr( "Can't launch SALOME." ) + "\n" + tr( "Can't find environment file." );
   }
   QMessageBox::warning( this, 
                        tr( "Error" ), 
-                       tr( "You don't have SALOME binaries installed in the %1 directory!" ).arg( targetFolder->text() ), 
+                       msg,
                        QMessageBox::Ok, 
                        QMessageBox::NoButton,
                        QMessageBox::NoButton );
 }
+// ================================================================
 /*!
-  Searches product listview item with given symbolic name 
-*/
+ *  SALOME_InstallWizard::findItem
+ *  Searches product listview item with given symbolic name 
+ */
+// ================================================================
 QCheckListItem* SALOME_InstallWizard::findItem( const QString& sName )
 {
   MapProducts::Iterator mapIter;
@@ -1329,9 +1307,12 @@ QCheckListItem* SALOME_InstallWizard::findItem( const QString& sName )
   }
   return 0;
 }
+// ================================================================
 /*!
-  Sets progress state to Aborted
-*/
+ *  SALOME_InstallWizard::abort
+ *  Sets progress state to Aborted
+ */
+// ================================================================
 void SALOME_InstallWizard::abort()
 {
   QString prod = progressView->findStatus( Processing );
@@ -1345,9 +1326,12 @@ void SALOME_InstallWizard::abort()
     prod = progressView->findStatus( Waiting );
   }
 }
+// ================================================================
 /*!
-  Reject slot, clears temporary directory and closes application
-*/
+ *  SALOME_InstallWizard::reject
+ *  Reject slot, clears temporary directory and closes application
+ */
+// ================================================================
 void SALOME_InstallWizard::reject()
 {
 #ifdef DEBUG
@@ -1356,9 +1340,9 @@ void SALOME_InstallWizard::reject()
   if ( !exitConfirmed ) {
     if ( QMessageBox::information( this, 
                                   tr( "Exit" ), 
-                                  tr( "Do you want to quit Installation Wizard?" ), 
-                                  tr( "Yes" ), 
-                                  tr( "No" ),
+                                  tr( "Do you want to quit %1?" ).arg( getIWName() ), 
+                                  tr( "&Yes" ), 
+                                  tr( "&No" ),
                                   QString::null,
                                   0,
                                   1 ) == 1 ) {
@@ -1369,9 +1353,12 @@ void SALOME_InstallWizard::reject()
   clean();
   InstallWizard::reject();
 }
+// ================================================================
 /*!
-  Accept slot, clears temporary directory and closes application
-*/
+ *  SALOME_InstallWizard::accept
+ *  Accept slot, clears temporary directory and closes application
+ */
+// ================================================================
 void SALOME_InstallWizard::accept()
 {
 #ifdef DEBUG
@@ -1380,14 +1367,17 @@ void SALOME_InstallWizard::accept()
   clean();
   InstallWizard::accept();
 }
+// ================================================================
 /*!
-  Clears and removes temporary directory
-*/
+ *  SALOME_InstallWizard::clean
+ *  Clears and removes temporary directory
+ */
+// ================================================================
 void SALOME_InstallWizard::clean()
 {
   // 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";
@@ -1408,9 +1398,12 @@ void SALOME_InstallWizard::clean()
 #endif
   }
 }
+// ================================================================
 /*!
-  Called when user moves from page to page
-*/
+ *  SALOME_InstallWizard::pageChanged
+ *  Called when user moves from page to page
+ */
+// ================================================================
 void SALOME_InstallWizard::pageChanged( const QString & mytitle)
 {
   nextButton()->setText( tr( "&Next >" ) );
@@ -1424,14 +1417,11 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle)
   QWidget* aPage = InstallWizard::page( mytitle );
   if ( !aPage )
     return;
-  setCaption( tr( myCaption ) + tr( " - Step ") + 
-             QString::number( this->indexOf( aPage )+1 ) + 
-             " of " +
-             QString::number( this->pageCount() ) );
+  updateCaption();
   if ( aPage == productsPage ) {
     // products page
-    checkSize();
-    checkDirs();
+    onSelectionChanged();
+    checkProductPage();
   }
   else if ( aPage == prestartPage ) {
     // prestart page
@@ -1445,7 +1435,7 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle)
       passedParams->clear();
       passedParams->setEnabled( false );
       QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
-      nextButton()->setText( tr("&Start") );
+      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
@@ -1458,9 +1448,10 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle)
     }
   }
   else if ( aPage == readmePage ) {
-    QCheckListItem* item = 0;
-    runSalomeBtn->setEnabled( ( item = findItem( "SalomePro-Bin" ) ) && 
-                             QFileInfo( targetFolder->text() + "/SalomePro-" + item->text(1) + "/salome" ).exists() );
+    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() );
     finishButton()->setEnabled( true );
   }
   previousPage = aPage;
@@ -1468,13 +1459,16 @@ void SALOME_InstallWizard::pageChanged( const QString & mytitle)
   cout << "previousPage = " << previousPage << endl;
 #endif
 }
+// ================================================================
 /*!
-  Shows help window
-*/
+ *  SALOME_InstallWizard::helpClicked
+ *  Shows help window
+ */
+// ================================================================
 void SALOME_InstallWizard::helpClicked()
 {
   if ( helpWindow == NULL ) {
-    helpWindow = HelpWindow::openHelp();
+    helpWindow = HelpWindow::openHelp( this );
     if ( helpWindow ) {
       helpWindow->show();
       helpWindow->installEventFilter( this );
@@ -1490,9 +1484,12 @@ void SALOME_InstallWizard::helpClicked()
     helpWindow->setActiveWindow();
   }
 }
+// ================================================================
 /*!
-  Shows directory selection dialog
-*/
+ *  SALOME_InstallWizard::browseDirectory
+ *  Shows directory selection dialog
+ */
+// ================================================================
 void SALOME_InstallWizard::browseDirectory()
 {
   const QObject* theSender = sender();
@@ -1508,18 +1505,24 @@ void SALOME_InstallWizard::browseDirectory()
     theFolder->setText( typedDir );
     theFolder->end( false );
   }
-  checkDirs();
+  checkProductPage();
 }
+// ================================================================
 /*!
-  Called when directory path (target or temp) is changed
-*/
+ *  SALOME_InstallWizard::directoryChanged
+ *  Called when directory path (target or temp) is changed
+ */
+// ================================================================
 void SALOME_InstallWizard::directoryChanged( const QString& /*text*/ )
 {
-  checkDirs();
+  checkProductPage();
 }
+// ================================================================
 /*!
-  <Start> button's slot - runs installation
-*/
+ *  SALOME_InstallWizard::onStart
+ *  <Start> button's slot - runs installation
+ */
+// ================================================================
 void SALOME_InstallWizard::onStart()
 {
   // clear list of products to install ...
@@ -1547,22 +1550,25 @@ void SALOME_InstallWizard::onStart()
       item = findItem( toInstall[ i ] );
       QString type = "";
       if ( productsView->isBinaries( item ) )
-       type = "binaries";
+       type = tr( "binaries" );
       else if ( productsView->isSources( item ) )
-       type = "sources";
+       type = tr( "sources" );
       else if ( productsView->isNative( item ) )
-       type = "native";
+       type = tr( "native" );
       else 
-       type = "not install";
+       type = tr( "not install" );
       progressView->addProduct( item->text(0), type, item->text(2) );
     }
     // launch install script
     launchScript();
   }
 }
+// ================================================================
 /*!
-  Called when users tries to pass parameters for the script
-*/
+ *  SALOME_InstallWizard::onReturnPressed
+ *  Called when users tries to pass parameters for the script
+ */
+// ================================================================
 void SALOME_InstallWizard::onReturnPressed()
 {
   QString txt = passedParams->text();
@@ -1610,17 +1616,20 @@ void SALOME_InstallWizard::productInstalled( )
     backButton()->setEnabled( true );
   }
 }
+// ================================================================
 /*!
-  Slot, called when <Cancel> button is clicked during installation script running
-*/
+ *  SALOME_InstallWizard::tryTerminate
+ *  Slot, called when <Cancel> button is clicked during installation script running
+ */
+// ================================================================
 void SALOME_InstallWizard::tryTerminate()
 {
   if ( shellProcess->isRunning() ) {
     if ( QMessageBox::information( this, 
                                   tr( "Exit" ), 
-                                  tr( "Do you want to quit Installation Wizard?" ), 
-                                  tr( "Yes" ), 
-                                  tr( "No" ),
+                                  tr( "Do you want to quit %1?" ).arg( getIWName() ), 
+                                  tr( "&Yes" ), 
+                                  tr( "&No" ),
                                   QString::null,
                                   0,
                                   1 ) == 1 ) {
@@ -1638,52 +1647,74 @@ void SALOME_InstallWizard::tryTerminate()
     reject();
   }
 }
+// ================================================================
 /*!
-  Kills installation process and quits application
-*/
+ *  SALOME_InstallWizard::onCancel
+ *  Kills installation process and quits application
+ */
+// ================================================================
 void SALOME_InstallWizard::onCancel()
 {
   shellProcess->kill();
   reject();
 }
+// ================================================================
 /*!
-  Called when selection is changed in the products list view
-*/
-void SALOME_InstallWizard::onSelectionChanged( QListViewItem* item )
+ *  SALOME_InstallWizard::onSelectionChanged
+ *  Called when selection is changed in the products list view
+ */
+// ================================================================
+void SALOME_InstallWizard::onSelectionChanged()
 {
   productsInfo->clear();
+  QListViewItem* item = productsView->selectedItem();
+  if ( !item )
+    return;
   if ( item->parent() )
     item = item->parent();
   QCheckListItem* aItem = (QCheckListItem*)item;
   if ( !productsMap.contains( aItem ) )
     return;
   Dependancies dep = productsMap[ aItem ];
-  QString text = "<b>" + aItem->text(0) + "</b>";
-  text += "<br><br>";
+  QString text = "<b>" + aItem->text(0) + "</b>" + "<br>";
   if ( !aItem->text(1).stripWhiteSpace().isEmpty() )
-    text += "version: " + aItem->text(1) + "<br>";
-  if ( productsView->isBinaries( aItem ) )
-    text += "Disk space required: " + QString::number( dep.getSize() ) + " Kb";
-  else
-    text += "Disk space required: " + QString::number( dep.getSize(true) ) + " Kb";
-
+    text += tr( "Version" ) + ": " + aItem->text(1) + "<br>";
   text += "<br>";
-  text += "Disk space for tmp files required: " + QString::number( dep.getTempSize() ) + " Kb";
-  text += "<br><br>";
-  QString req =( dep.getDependancies().count() > 0 ? dep.getDependancies().join(", ") : QString( "none" ) );
-//    if ( item->depth() == 0 && item->childCount() == 0 ) {
-//      if ( dep.getName() == "salomedoc" )
-//        req = "none";          // SALOME docs
-//      else
-//        req = "all products";  // SALOME sources and binaries
-//    }
-  text +=  "Prerequisites: " + req;
+  if ( !dep.getDescription().isEmpty() ) {
+    text += "<i>" + dep.getDescription() + "</i><br><br>";
+  }
+  text += tr( "User choice" ) + ": ";
+  long totSize = 0, tempSize = 0;
+  if ( productsView->isBinaries( aItem ) ) {
+    text += "<b>" + tr( "install binaries" ) + "</b>" + "<br>";
+    totSize = dep.getSize();
+  }
+  else if ( productsView->isSources( aItem ) ) {
+    text += "<b>" + tr( "install sources" ) + "</b>" + "<br>";
+    totSize = dep.getSize( true );
+    tempSize = dep.getTempSize();
+  }
+  else if ( productsView->isNative( aItem ) ) {
+    text += "<b>" + tr( "use native" ) + "</b>" + "<br>";
+  }
+  else {
+    text += "<b>" + tr( "not install" ) + "</b>" + "<br>";
+  }
+  
+  text += tr( "Disk space required" ) + ": " + QString::number( totSize ) + " Kb<br>";
+  text += tr( "Disk space for tmp files required" ) + ": " + QString::number( tempSize ) + " Kb<br>";
+  text += "<br>";
+  QString req = ( dep.getDependancies().count() > 0 ? dep.getDependancies().join(", ") : tr( "none" ) );
+  text +=  tr( "Prerequisites" ) + ": " + req;
   productsInfo->setText( text );
 }
+// ================================================================
 /*!
-  Called when user checks/unchecks any product item
-  Recursively sets all prerequisites and updates "Next" button state
-*/
+ *  SALOME_InstallWizard::onItemToggled
+ *  Called when user checks/unchecks any product item
+ *  Recursively sets all prerequisites and updates "Next" button state
+ */
+// ================================================================
 void SALOME_InstallWizard::onItemToggled( QCheckListItem* item )
 {
   if ( prerequisites->isChecked() ) {
@@ -1691,21 +1722,20 @@ void SALOME_InstallWizard::onItemToggled( QCheckListItem* item )
       item = (QCheckListItem*)( item->parent() );
     if ( productsMap.contains( item ) ) {
       productsView->blockSignals( true );
-      if ( productsView->isNative( item ) )
-       setProductOn( item, 2 );
-      else if ( productsView->isBinaries( item ) )
-       setProductOn( item, 1 );
-      else if ( productsView->isSources( item ) )
-       setProductOn( item, 0 );
+      setPrerequisites( item );
       productsView->blockSignals( false );
     }
   }
-  checkSize();
+  onSelectionChanged();
+  checkProductPage();
 }
+// ================================================================
 /*!
-  This slot is called when user clicks one of <Select Sources>,
-  <Select Binaries>, <Unselect All> buttons ( products page )
-*/
+ *  SALOME_InstallWizard::onProdBtn
+ *  This slot is called when user clicks one of <Select Sources>,
+ *  <Select Binaries>, <Unselect All> buttons ( products page )
+ */
+// ================================================================
 void SALOME_InstallWizard::onProdBtn()
 {
   const QObject* snd = sender();
@@ -1718,20 +1748,27 @@ void SALOME_InstallWizard::onProdBtn()
     }
   }
   productsView->blockSignals( false );
-  checkSize();
+  onSelectionChanged();
+  checkProductPage();
 }
+// ================================================================
 /*!
-  QProcess slot: -->something was written to stdin
-*/
+ *  SALOME_InstallWizard::wroteToStdin
+ *  QProcess slot: -->something was written to stdin
+ */
+// ================================================================
 void SALOME_InstallWizard::wroteToStdin( )
 {
 #ifdef DEBUG
   cout << "Something was sent to stdin" << endl;
 #endif
 }
+// ================================================================
 /*!
-  QProcess slot: -->something was written to stdout
-*/
+ *  SALOME_InstallWizard::readFromStdout
+ *  QProcess slot: -->something was written to stdout
+ */
+// ================================================================
 void SALOME_InstallWizard::readFromStdout( )
 {
 #ifdef DEBUG
@@ -1747,9 +1784,12 @@ void SALOME_InstallWizard::readFromStdout( )
     installInfo->scrollToBottom();
   }
 }
+// ================================================================
 /*!
-  QProcess slot: -->something was written to stderr
-*/
+ *  SALOME_InstallWizard::readFromStderr
+ *  QProcess slot: -->something was written to stderr
+ */
+// ================================================================
 void SALOME_InstallWizard::readFromStderr( )
 {
 #ifdef DEBUG
@@ -1768,177 +1808,39 @@ void SALOME_InstallWizard::readFromStderr( )
   passedParams->setFocus();
   QFont f = parametersLab->font(); f.setBold( true ); parametersLab->setFont( f );
 }
+// ================================================================
 /*!
-  Sets dependancies for the product item
-*/
+ *  SALOME_InstallWizard::setDependancies
+ *  Sets dependancies for the product item
+ */
+// ================================================================
 void SALOME_InstallWizard::setDependancies( QCheckListItem* item, Dependancies dep)
 {
   productsMap[item] = dep;
 }
+// ================================================================
 /*!
-  Polishing of the widget - to set right initial size
-*/
+ *  SALOME_InstallWizard::polish
+ *  Polishing of the widget - to set right initial size
+ */
+// ================================================================
 void SALOME_InstallWizard::polish()
 {
   resize( 0, 0 );
   InstallWizard::polish();
 }
-
-// ###################################### Structure Parser ###########################################
-
+// ================================================================
 /*!
-  Constructor
-*/
-StructureParser::StructureParser()
-                : QXmlDefaultHandler()
+ *  SALOME_InstallWizard::updateCaption
+ *  Updates caption according to the current page number
+ */
+// ================================================================
+void SALOME_InstallWizard::updateCaption()
 {
-  wizard = NULL;
-  tree = NULL;
-}
-/*!
-  Sets install wizard's main window
-*/
-void StructureParser::setWizard( SALOME_InstallWizard* awizard )
-{
-  wizard = awizard;
-}
-/*!
-  Sets products list view
-*/
-void StructureParser::setListView( MyListView * t )
-{
-  tree = t;
-}
-/*!
-  Sets temp directory widget
-*/
-void StructureParser::setTempDir( QLineEdit * dir )
-{
-  tempdir = dir;
-}
-/*!
-  Sets target directory widget
-*/
-void StructureParser::setTargetDir( QLineEdit * dir )
-{
-  targetdir = dir;
-}
-/*!
-  Begins parsing of the xml dom-element
-*/  
-bool StructureParser::startElement( const QString& ,
-                                    const QString& ,
-                                    const QString& qName,
-                                    const QXmlAttributes& attributes)
-{
-#ifdef DEBUG
-  cout << qName << endl;
-  cout << attributes.length() << endl;
-#endif
-  QCheckListItem * element;
-  if (( qName == "config" ) && ( attributes.length() > 0 ) ) {
-    if ( attributes.value( "version" ) )
-      myVersion = attributes.value( "version" ).stripWhiteSpace();
-    if ( attributes.value( "caption" ) && !myCaption.isEmpty() )
-      myCaption = QString(attributes.value( "caption" )).arg(myVersion).stripWhiteSpace();
-    if ( attributes.value( "copyright" ) )
-      myCopyright = attributes.value( "copyright" ).stripWhiteSpace();
-    if ( attributes.value( "license" ) )
-      myLicense = attributes.value( "license" ).stripWhiteSpace();
-    if ( attributes.value( "os" ) )
-      myOS = attributes.value( "os" ).stripWhiteSpace();
-
-#ifdef DEBUG
-    cout << myCaption << endl;
-    cout << myVersion << endl;
-    cout << myCopyright << endl;
-    cout << myLicense << endl;
-#endif
-  } else if (( qName == "product" ) && ( attributes.length() > 0 ) && tree && wizard ) {
-    if (attributes.value("disable") == "true" )
-      return true;
-    
-    QString install = attributes.value( "install" );
-    QStringList supported = QStringList::split(",", attributes.value("supported") );
-    QString script = attributes.value( "script" );
-    element = tree->addItem( attributes.value("name"), attributes.value("version"), install, supported, script );
-    if ( attributes.value("dependancies") == "" ) {
-      QStringList diskspace = QStringList::split(",",attributes.value("installdiskspace"));
-      if (diskspace.count() == 2)
-       wizard->setDependancies( element, 
-                                Dependancies( attributes.value("name"), QStringList(), 
-                                              diskspace[0].toInt(), 
-                                              diskspace[1].toInt(), 
-                                              attributes.value("temporarydiskspace").toInt()) );
-      else
-       wizard->setDependancies( element, 
-                                Dependancies( attributes.value("name"), QStringList(), 
-                                              diskspace[0].toInt(), 
-                                              diskspace[0].toInt(), 
-                                              attributes.value("temporarydiskspace").toInt()) );
-
-    } else {
-      QStringList diskspace = QStringList::split(",",attributes.value("installdiskspace"));
-      if (diskspace.count() == 2)
-       wizard->setDependancies( element, 
-                                Dependancies( attributes.value("name"), 
-                                              QStringList::split(",", attributes.value("dependancies") ), 
-                                              diskspace[0].toInt(), 
-                                              diskspace[1].toInt(), 
-                                              attributes.value("temporarydiskspace").toInt()) );
-      else
-       wizard->setDependancies( element, 
-                                Dependancies( attributes.value("name"), 
-                                              QStringList::split(",", attributes.value("dependancies") ), 
-                                              diskspace[0].toInt(), 
-                                              diskspace[0].toInt(),
-                                              attributes.value("temporarydiskspace").toInt()) );
-    }
-  } else if (( qName == "path" ) && ( attributes.length() > 0 ) && wizard ) {
-    targetdir->setText( attributes.value("targetdir") );
-    
-    if ( attributes.value("tempdir") == "" )
-      tempdir->setText( "/tmp" );
-    else
-      tempdir->setText( attributes.value("tempdir") );
-    }
-  return true;
-}
-/*!
-  Finishes parsing of the xml dom-element
-*/
-bool StructureParser::endElement( const QString&, const QString&,
-                                  const QString& )
-{
-    return true;
-}
-
-// ###################################### Main ###########################################
-
-/*!
-  Program starts here
-*/
-int main( int argc, char **argv )
-{
-  QApplication a( argc, argv );
-  QString xmlFileName( argc == 2 ? argv[1] : "config.xml" );
-  
-  int result = -1;
-  QFile xmlfile(xmlFileName);
-  if ( xmlfile.exists() ) {
-    SALOME_InstallWizard wizard(xmlFileName);
-    a.setMainWidget( &wizard );
-    wizard.show();
-    result = a.exec();
-  }
-  else {
-    QMessageBox::critical( 0, 
-                          QObject::tr( "Error" ), 
-                          QObject::tr( "Can't open config file:\n%1\n\nQuitting...").arg( xmlFileName ), 
-                          QMessageBox::Ok,
-                          QMessageBox::NoButton, 
-                          QMessageBox::NoButton );
-  }
-  return result;
+  QWidget* aPage = InstallWizard::currentPage();
+  if ( !aPage ) 
+    return;
+  InstallWizard::setCaption( tr( myCaption ) + " " +
+                            tr( getIWName() ) + " - " +
+                            tr( "Step %1 of %2").arg( QString::number( this->indexOf( aPage )+1 ) ).arg( QString::number( this->pageCount() ) ) );
 }
-