Salome HOME
Minor fixes
[tools/install.git] / src / SALOME_InstallWizard.hxx
index 37800cdc8b7f6d7a2155ee45cd70ebd844b7728d..94a6c9345aefd25b90363d255211b61fe9d92eed 100644 (file)
@@ -1,9 +1,9 @@
 //  File      : SALOME_InstallWizard.hxx
 //  Created   : Thu Dec 18 12:01:00 2002
-//  Author    : Vadim SANDLER
+//  Author    : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com)
 //  Project   : SALOME
 //  Module    : Installation Wizard
-//  Copyright : 2004-2005 CEA
+//  Copyright : 2002-2009 CEA
 
 #ifndef __SALOME_InstallWizard
 #define __SALOME_InstallWizard
 #include "InstallWizard.h"
 
 #include <qmap.h>
+#include <qvaluelist.h>
 #include <qstringlist.h> 
 
+class QLineEdit;
+class QPushButton;
+class QListViewItem;
+class QCheckListItem;
+class QLabel;
+class QTextEdit;
+class QTextBrowser;
+class QProcess;
+class QCheckBox;
+class QSplitter;
+class QMyCheckBox;
+class ProcessThread;
+class ProductsView;
+class ProgressView;
+class HelpWindow;
+class InstallInfo;
+class QButton;
+class QRadioButton;
+class QButtonGroup;
+
+// This enum describes the possible types of the SALOME installation
+enum InstallationType { Binaries, Sources, Compile };
+// This enum describes the possible states of a tristate parameter
+enum BoolTristate { False, True, NotDefined };
+
 /*! 
   Class Dependancies : Products info
   This class stores all product dependancies for correct work of installation procedure
-     smbName   - parameter for launching install shell script (e.g. cas for CASCADE4.0).
-     dependsOn - list of products needed for correct installation of product
-                 (e.g tcl is checked during installation of CASCADE 4).
-     sizeTotal - amount of disk space in Kbytes required for installation 
-                 of this product
-     sizeTemp  - amount of disk space in Kbytes required for the temporary files
 */
 class Dependancies
 {
@@ -33,77 +53,103 @@ class Dependancies
                 const QStringList& depend, 
                 const long         Binsize,  
                 const long         Sourcessize, 
+                const long         SrcBuildsize, 
                 const long         tempsize, 
-                const QString&     def = QString::null,
+                const QString&     vers = QString::null,
                 const QString&     descr = QString::null,
-                const QString&     ctx = QString::null,
-                bool               pickup = false )
+                const QString&     tp = QString::null,
+                bool               pickup = false,
+               BoolTristate       woGui = NotDefined )
     : smbName( name ), 
       dependsOn( depend ), 
-      sizeSourcesTotal( Sourcessize ), 
       sizeBinaryTotal( Binsize ), 
+      sizeSourcesTotal( Sourcessize ), 
+      sizeSrcBuildTotal( SrcBuildsize ), 
       sizeTemp( tempsize ),
-      defaultMode( def ),
+      version( vers ),
       description( descr ),
-      context( ctx ),
-      pickupEnv( pickup ) {}
+      type( tp ),
+      pickupEnv( pickup ),
+      woGuiMode( woGui ) {}
 
   // gets symbolic name
   QString     getName() const         { return smbName;   }
   // gets dependancies
   QStringList getDependancies() const { return dependsOn; }
   // gets disk space required
-  long        getSize(bool sources = false) const 
+  long        getSize( InstallationType instType ) const 
   { 
-    return ( sources ? sizeSourcesTotal : sizeBinaryTotal ); 
+    return instType == Binaries ? sizeBinaryTotal : 
+      instType == Sources ? sizeSourcesTotal : 
+      sizeSrcBuildTotal;
   }
   // gets temporary disk space required
-  long        getTempSize() const     { return sizeTemp;   }
+  long        getTempSize( InstallationType instType ) const     
+  { 
+    return ( instType == Binaries ? 0 : instType == Sources ? 0 : sizeTemp );
+  }
+  // gets product's version
+  QString     getVersion() const      { return version; }
   // gets product's description
   QString     getDescription() const  { return description; }
-  // gets product's context
-  QString     getContext() const      { return context; }
-  // returns true if product supports given context
-  bool        hasContext( const QString& ctx ) const
-  {
-    QStringList cl = QStringList::split(",",context);
-    return cl.find( ctx ) != cl.end();
-  }
-  // gets default mode
-  QString     getDefault() const      { return defaultMode; }
+  // gets product's type
+  QString     getType() const         { return type; }
   // returns true if this product needs to pick-up environment
   bool        pickUpEnvironment()     { return pickupEnv; }
+  // returns true if this product supports installation without GUI mode
+  BoolTristate supportWoGuiMode()     { return woGuiMode; }
 
  private:
-  QString     smbName;          // symbolic name
-  QStringList dependsOn;        // prerequisites list
-  long        sizeSourcesTotal; // disk space required
-  long        sizeBinaryTotal;  // disk space required
-  long        sizeTemp;         // disk space for temporary files required
-  QString     defaultMode;      // default installation mode
-  QString     description;      // product's description
-  QString     context;          // product's context (salome sources, binaries or prerequisite)
+  QString     smbName;           // symbolic name
+  QStringList dependsOn;         // prerequisites list
+  long        sizeBinaryTotal;   // disk space for binaries required
+  long        sizeSourcesTotal;  // disk space for sources required
+  long        sizeSrcBuildTotal; // disk space for compiled sources required
+  long        sizeTemp;          // disk space for temporary files required
+  QString     version;           // product's version
+  QString     description;       // product's description
+  QString     type;              // product's type (salome sources, binaries or prerequisite)
   bool        pickupEnv;        // "Pick-up environment" flag
+  BoolTristate woGuiMode;        // support of installation without GUI flag
 };
 
-class QLineEdit;
-class QPushButton;
-class QListViewItem;
-class QCheckListItem;
-class QLabel;
-class QTextEdit;
-class QTextBrowser;
-class QProcess;
-class QCheckBox;
-class QSplitter;
-class QMyCheckBox;
-class ProcessThread;
-class ProductsView;
-class ProgressView;
-class HelpWindow;
-class InstallInfo;
+/*! 
+  Class Button : Operation button info
+  This class stores information about the custom operation buttons which appear on
+  the <Finish> page of the Install Wizard.
+*/
+class Button
+{
+ public:
+  // default constructor, required for list
+  Button() : myButton( 0 ) {}
+  // constructor
+  Button( const QString& label, const QString& tooltip, const QString& script )
+    : myLabel( label ), myTootip( tooltip ), myScript( script ), myButton( 0 ) {}
+
+  // set operation button
+  void setButton( QButton* btn ) { myButton = btn; }
+
+  // get label
+  QString  label()  const { return myLabel;  } 
+  // get tooltip
+  QString  tootip() const { return myTootip; }
+  // get script name
+  QString  script() const { return myScript; }
+  // get operation button
+  QButton* button() const { return myButton; }
+
+ private:
+  QString  myLabel;    // button label
+  QString  myTootip;   // button tooltip
+  QString  myScript;   // operation script
+  QButton* myButton;   // operation button
+};
 
 typedef QMap<QCheckListItem*, Dependancies> MapProducts;
+typedef QValueList<Button>                  ButtonList;
+typedef QMap<QString, QString>              MapXmlFiles;
+typedef QMap<QString, BoolTristate>         MapAttrStates;
 
 /*!
   Class SALOME_InstallWizard : Installation Wizard's main window
@@ -114,23 +160,49 @@ class SALOME_InstallWizard: public InstallWizard
     
  public:
   // constructor
-  SALOME_InstallWizard(QString aXmlFileName);
+  SALOME_InstallWizard( const QString& aXmlFileName = QString::null,
+                       const QString& aTargetDir   = QString::null,
+                       const QString& aTmpDir      = QString::null,
+                       const bool     aForceSrc    = false,
+                       const bool     aSingleDir   = false );
   // destructor
   virtual ~SALOME_InstallWizard( );
 
+  // get base platform to install binaries package
+  QString getBasePlatform();
+  // get current platform
+  static QStringList currentPlatform();
+  // get application root dir
+  static QString     rootDirPath();
+
+  // get binaries path
+  QString getBinPath() const { return binPath; }
+  // get sources path
+  QString getSrcPath() const { return srcPath; }
+  // get platform binaries path
+  QString getPlatformBinPath( const QString& ) const;
+
+  // get map of supported platforms and corresponding XML files
+  MapXmlFiles getXmlMap( const QString& aXmlFileName = QString::null );
+  // check/get XML file and current platform
+  void getXmlAndPlatform();
+
   // event filter
   bool eventFilter( QObject* object, QEvent* event );
 
   // set dependancies
   void setDependancies( QCheckListItem* item, Dependancies dep);
 
-  // process validation event (<val> is validation code)
-  void processValidateEvent( const int val, void* data );
+  // executes some actions after finish of installation process (successful or not)
+  void doPostActions( const QString& btnText,
+                     const QString& btnAboutInfo );
+
+  // add button for the <Finish> page
+  void addFinishButton( const QString& label, 
+                       const QString& tooltip, 
+                       const QString& script,
+                       bool toClear = false );
 
- public slots:
-  // polishing of the widget
-  void polish();
-  
   // set version
   void setVersion( const QString& version ) { myVersion = version; }
   // set caption
@@ -139,8 +211,8 @@ class SALOME_InstallWizard: public InstallWizard
   void setCopyright( const QString& copyright ) { myCopyright = copyright; }
   // set license
   void setLicense( const QString& license ) { myLicense = license; }
-  // set OS
-  void setOS( const QString& OS ) { myOS = OS; }
+  // set list of optional libraries
+  void setOptionalLibs( const QString& optlibs ) { myOptLibs = QStringList::split( ",", optlibs ); }
 
   // get version
   QString getVersion() { return myVersion; }
@@ -150,10 +222,27 @@ class SALOME_InstallWizard: public InstallWizard
   QString getCopyright() { return myCopyright; }
   // get license
   QString getLicense() { return myLicense; }
-  // get OS
-  QString getOS() { return myOS; }
+  // get list of optional libraries
+  QStringList getOptionalLibs() { return myOptLibs; }
+  // get platform
+  QString getPlatform() { return !refPlatform.isEmpty() ? refPlatform : curPlatform; }
+  // get corresponding XML file
+  QString getXmlFile( const QString& platform ) {
+    return (platformsMap.find( platform ) != platformsMap.end() ) ? 
+      platformsMap[ platform ] : 
+      QString("");
+  }
   // get InstallWizard's name
   QString getIWName() { return myIWName; }
+
+  // process validation event (<val> is validation code)
+  void processValidateEvent( const int val, void* data );
+  // get private installation type
+  InstallationType getInstType() { return installType; };
+
+ public slots:
+  // polishing of the widget
+  void polish();
   
   // save install log to file
   void saveLog();
@@ -165,10 +254,14 @@ class SALOME_InstallWizard: public InstallWizard
   void closeEvent( QCloseEvent* ce );
   // creates introduction page
   void setupIntroPage();   
+  // create installation types page
+  void setupTypePage();
+  // create platforms page
+  void setupPlatformPage();
+  // create directories page
+  void setupDirPage();
   // creates products page
   void setupProductsPage();
-  // creates directories page
-  void setupDirPage();
   // creates prestart page
   void setupCheckPage();
   // creates progress page
@@ -178,13 +271,15 @@ class SALOME_InstallWizard: public InstallWizard
   // displays choice info
   void showChoiceInfo();
   // validates page when <Next> button is clicked
-  bool acceptData( const QString& ); 
+  bool acceptData( const QString& );
   // calculates disk space required for the installation, returns true if any product selected to be installed (src, bin or native)
   bool checkSize( long* totSize = 0, long* tempSize = 0 );
   // checks products page validity (directories and products selection)
   void checkProductPage();
-  // sets the product and all products this one depends on to be checked ( recursively )
+  // sets the product and all products this one depends on to be checked
   void setPrerequisites( QCheckListItem* item );
+  // unsets all products which depend of unchecked product ( recursively )
+  void unsetPrerequisites( QCheckListItem* item );
   // runs installation script
   void launchScript(); 
   // searches product listview item with given symbolic name 
@@ -193,6 +288,12 @@ class SALOME_InstallWizard: public InstallWizard
   void abort();
   // clears and (optionally) removes temporary directory
   void clean(bool rmDir = false);
+  // Update GUI and check installation errors
+  void completeInstallation();
+  // Run the modification of SALOME *.la files
+  void runModifyLaFiles();
+  // Run the Fortran libraries checking
+  void runCheckFLib();
 
  protected slots:
   // reject slot
@@ -203,6 +304,8 @@ class SALOME_InstallWizard: public InstallWizard
  private slots:
   // called when user moves from page to page
   void pageChanged( const QString & mytitle);
+  // called when user selected either installation type or installation platform
+  void onButtonGroup( int index );
   // invokes Help window
   void helpClicked();
   // invokes directory selection dialog box
@@ -223,12 +326,24 @@ class SALOME_InstallWizard: public InstallWizard
   void onSelectionChanged();
   // called when user checks/unchecks any product item
   void onItemToggled( QCheckListItem* );
-  // <SALOME sources>, <SALOME binaries>, <Unselect All> buttons slot
-  void onProdBtn();
+  // <Installation with GUI> check-box slot
+  void onInstallGuiBtn();
   // <More...> button slot
   void onMoreBtn();
-  // <Launch Salome> button slot
-  void onLaunchSalome();
+  // Slot to update 'Available disk space' field
+  void updateAvailableSpace();
+  // Slot to take result of modification SALOME *.la files
+  void checkModifyLaResult();
+  // Slot to take result of Fortran libraries checking
+  void checkFLibResult();
+  // Slot to update 'Size' column for modules and prerequisites
+  void updateSizeColumn();
+
+  // <Finish> page buttons slot
+  void onFinishButton();
+
+  // <About> button slot
+  void onAbout();
 
   // QProcess slots:
   // -->something was written to stdin
@@ -237,6 +352,8 @@ class SALOME_InstallWizard: public InstallWizard
   void readFromStdout();
   // -->something was written to stderr
   void readFromStderr();
+  // -->stop installation process if there is an error in stderr
+  void manageInstProc();
 
  private:
   QString          myIWName;       // Installation Wizard's name
@@ -244,41 +361,78 @@ class SALOME_InstallWizard: public InstallWizard
   QString          myCaption;      // application name
   QString          myCopyright;    // copyright info 
   QString          myLicense;      // license info
-  QString          myOS;           // operation system
+  QString          myTargetPath;   // target directory path
+  QString          myTmpPath;      // temporary directory path
+  QStringList      myOptLibs;      // list of optional libraries
   
   HelpWindow*      helpWindow;     // help window
   QProcess*        shellProcess;   // shell process (install script)
+  QProcess*        diskSpaceProc;  // shell process (to get available disk space script)
+  QProcess*        modifyLaProc;   // shell process (to modify SALOME *.la files script)
+  QProcess*        checkFLibProc;  // shell process (to check Fortran libraries script)
   MapProducts      productsMap;    // products info (name, dependancies, disk space )
+  MapXmlFiles      extraProducts;  // additional products to be installed
   QStringList      toInstall;      // list of products being installed
+  QStringList      notInstall;     // list of products being not installed
+  QStringList      prodSequence;   // specified list of products being installed
+  MapAttrStates    woGuiModules;   // map of SALOME modules names, that can support installation without GUI mode
+  InstallationType installType;    // type of the installation
+  QString          curPlatform;    // current operating system
+  QString          refPlatform;    // referenced operating system (selected by user). It is defined, 
+                                   //   if current OS is not determined or not supported only
+  MapXmlFiles      platformsMap;   // supported operating systems and corresponding XML files
   QString          xmlFileName;    // xml file
+  QString          binPath;        // binaries path
+  QString          srcPath;        // sources path
+  QString          oneProdDirName; // name of the single directory for binaries of prerequisites
+  QString          commonPlatform; // platform with universal binaries
   bool             moreMode;       // advanced mode flag
   QWidget*         previousPage;   // previous page
   QString          tmpCreated;     // created temporary directory
+  bool             stateChanged;   // flag: whether installation type or platform was changed
   bool             exitConfirmed;  // flag: "Exit confirmed"
+  bool             rmSrcPrevState; // flag: status of "Remove SRC & TMP files" is changed ?
   // Widgets
   // --> introduction page
   QWidget*         introPage;      // page itself
   QLabel*          logoLab;        // logo pixmap
-  QLabel*          versionLab;     // vesrsion info
+  QLabel*          versionLab;     // version info
   QLabel*          copyrightLab;   // copyright info
   QLabel*          licenseLab;     // license info
   QLabel*          info;           // program info
-  // --> products page
-  QWidget*         productsPage;   // page itself
+  // --> installation types page
+  QWidget*         typePage;       // page itself
+  QButtonGroup*    buttonGrp;      // group of the available installation types radio-buttons
+  QRadioButton*    binBtn;         // install binaries button
+  QRadioButton*    srcBtn;         // install sources button
+  QRadioButton*    srcCompileBtn;  // install sources and compile button
+  QCheckBox*       removeSrcBtn;   // <Remove sources & tmp files> checkbox
+  bool             forceSrc;       // Force all products to be compiled from sources
+  // --> installation platform page
+  QWidget*         platformsPage;  // page itself
+  QButtonGroup*    platBtnGrp;     // group of platforms for selection
+  QString          warnMsg;        // warning message
+  QLabel*          warnLab;        // warning label
+  QLabel*          warnLab3;       // additional warning label
+  // --> installation directories page
+  QWidget*         dirPage;        // page itself
   QLineEdit*       targetFolder;   // target directory for installing of products
   QPushButton*     targetBtn;      // browse target directory button
   QLineEdit*       tempFolder;     // directory for the temporary files: /tmp by default
   QPushButton*     tempBtn;        // browse temp directory button
+  // --> products page
+  QWidget*         productsPage;   // page itself
+  ProductsView*    modulesView;    // modules list view
+  QMyCheckBox*     installGuiBtn;  // <Installation with GUI> checkbox
+  ProductsView*    prereqsView;    // prerequisites list view
+  QMyCheckBox*     oneModDirBtn;   // <Install SALOME modules to a single directory> checkbox
+  QMyCheckBox*     oneProdDirBtn;  // <Install prerequisites to a single directory> checkbox
+  QPushButton*     moreBtn;        // <Show/Hide prerequisites> button
+  QTextBrowser*    productInfo;    // products info box
   QLabel*          requiredSize;   // <Total disk space required> label
   QLabel*          requiredTemp;   // <Space required for temporary files> label
-  QPushButton*     moreBtn;        // <More...> button
-  QWidget*         moreBox;        // container for the <More...> mode widgets
-  ProductsView*    productsView;   // products list view
-  QTextBrowser*    productsInfo;   // products info box
-  QCheckBox*       prerequisites;  // <Auto check prerequisites products> checkbox
-  QMyCheckBox*     selectSrcBtn;   // <SALOME sources> check box 
-  QMyCheckBox*     selectBinBtn;   // <SALOME binaries> check box 
-  QPushButton*     unselectBtn;    // <Unselect All> button
+  QLabel*          availableSize;  // <Available disk space> label
+  bool             singleDir;      // Force all SALOME modules to be installed into single directory
   // --> prestart page
   QWidget*         prestartPage;   // page itself
   QTextEdit*       choices;        // choice text view
@@ -290,12 +444,15 @@ class SALOME_InstallWizard: public InstallWizard
   QLineEdit*       passedParams;   // user can pass data to running script
   QTextEdit*       installProgress;// contains information about progress of installing selected products
   ProgressView*    progressView;   // displays information about progress of installing selected products
-  // --> readme page
+  QCheckBox*       ignoreErrCBox;  // checkbox to ignore installation errors
+  QLabel*          statusLab;      // displays currently performed action
+  // --> finish page
   QWidget*         readmePage;     // page itself
   QTextEdit*       readme;         // Readme information window
-  QPushButton*     runSalomeBtn;   // <Launch Salome> buttnon
+  ButtonList       buttons;        // operation buttons
 
   ProcessThread*   myThread;       // validation thread
+  bool             hasErrors;      // flag: if there were any errors or warnings during the installation
 };
 
 #endif