]> SALOME platform Git repositories - tools/install.git/commitdiff
Salome HOME
Initial version
authoradmin <salome-admin@opencascade.com>
Thu, 25 Sep 2003 13:38:53 +0000 (13:38 +0000)
committeradmin <salome-admin@opencascade.com>
Thu, 25 Sep 2003 13:38:53 +0000 (13:38 +0000)
src/SALOME_InstallWizard.hxx [new file with mode: 0644]

diff --git a/src/SALOME_InstallWizard.hxx b/src/SALOME_InstallWizard.hxx
new file mode 100644 (file)
index 0000000..fb4f295
--- /dev/null
@@ -0,0 +1,552 @@
+//  File      : SALOME_InstallWizard.h
+//  Created   : Thu Dec 18 12:01:00 2002
+//  Author    : Vadim SANDLER
+//  Project   : SALOME Professional
+//  Module    : InstallWizard
+//  Copyright : 2003 CEA/DEN, EDF R&D
+//  $Header$ 
+
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qwidget.h>
+#include <qlistview.h> 
+#include <qlabel.h>
+#include <qtextedit.h> 
+#include <qprocess.h> 
+#include <qlineedit.h> 
+#include <qcheckbox.h>
+#include <qheader.h>
+#include <qsplitter.h>
+
+#include <qmap.h>
+#include <qstringlist.h> 
+#include <qxml.h>
+
+#include "InstallWizard.h"
+#include "helpwindow.h"
+
+/*! 
+  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
+{
+ public:
+  // default constructor, necessary for map
+  Dependancies() {}
+  // constructor
+  Dependancies( const QString& name, const QStringList& depend, const long Binsize,  const long Sourcessize, const long tempsize )
+    : smbName( name ), dependsOn( depend ), sizeSourcesTotal( Sourcessize ), sizeBinaryTotal( Binsize ), sizeTemp( tempsize ) {}
+
+  // 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         { 
+    if (sources) 
+      return sizeSourcesTotal;
+    else
+      return sizeBinaryTotal;
+  }
+  // gets temporary disk space required
+  long        getTempSize() const     { return sizeTemp;  }
+
+ 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
+};
+typedef QMap<QCheckListItem*, Dependancies> MapProducts;
+
+class MyListView;
+class ProgressView;
+/*!
+  Class SALOME_InstallWizard : Installation Wizard's main window
+*/
+class SALOME_InstallWizard: public InstallWizard
+{
+  Q_OBJECT
+    
+ public:
+  // constructor
+  SALOME_InstallWizard(QString aXmlFileName);
+  // destructor
+  virtual ~SALOME_InstallWizard( );
+
+  // event filter
+  bool eventFilter( QObject* object, QEvent* event );
+
+  // set dependancies
+  void setDependancies( QCheckListItem* item, Dependancies dep);
+
+ public slots:
+  // polishing of the widget
+  void polish();
+
+ protected:
+  // close event handler
+  void closeEvent( QCloseEvent* ce );
+  // creates introduction page
+  void setupIntroPage();   
+  // creates products page
+  void setupProductsPage();
+  // creates directories page
+  void setupDirPage();
+  // creates prestart page
+  void setupCheckPage();
+  // creates progress page
+  void setupProgressPage();
+  // creates readme page
+  void setupReadmePage();
+  // displays choice info
+  void showChoiceInfo();
+  // validates page when <Next> button is clicked
+  bool acceptData( const QString& ); 
+  // calculates disk space required for the installation
+  void checkSize( long* totSize = 0, long* tempSize = 0 );
+  // checks directories validity
+  void checkDirs();
+  // sets the product and all products this one depends on to be checked ( recursively )
+  void setProductOn( QCheckListItem* item, int install = 1 );
+  // runs installation script
+  void launchScript(); 
+  // searches product listview item with given symbolic name 
+  QCheckListItem* findItem( const QString& sName );
+  // sets progress state to Aborted
+  void abort();
+  // clears and removes temporary directory
+  void clean();
+
+ protected slots:
+  // reject slot
+  void reject();
+  // accept slot
+  void accept();
+  
+ private slots:
+  // called when user moves from page to page
+  void pageChanged( const QString & mytitle);
+  // invokes Help window
+  void helpClicked();
+  // invokes directory selection dialog box
+  void browseDirectory();
+  // called when directory path (target or temp) is changed
+  void directoryChanged( const QString& text );
+  // <Start> button's slot - runs installation
+  void onStart();
+  // called when users tries to pass parameters for the script
+  void onReturnPressed();
+  // callback function - as response for the script finishing
+  void productInstalled();
+  // called when <Cancel> button is clicked during installation script running
+  void tryTerminate();
+  // kills installation process and quits application
+  void onCancel();
+  // called when selection is changed in the products list view
+  void onSelectionChanged( QListViewItem* );
+  // called when user checks/unchecks any product item
+  void onItemToggled( QCheckListItem* );
+  // <Select Sources>, <Select Binaries>, <Unselect All> buttons slot
+  void onProdBtn();
+  // <More...> button slot
+  void onMoreBtn();
+  // <Launch Salome> button slot
+  void onLaunchSalome();
+
+  // QProcess slots:
+  // -->something was written to stdin
+  void wroteToStdin();
+  // -->something was written to stout
+  void readFromStdout();
+  // -->something was written to stderr
+  void readFromStderr();
+
+ private:
+  HelpWindow*   helpWindow;     // help window
+  QProcess*     shellProcess;   // shell process (install script)
+  MapProducts   productsMap;    // products info (name, dependancies, disk space )
+  QStringList   toInstall;      // list of products being installed
+  QString       xmlFileName;    // xml file
+  bool          moreMode;       // advanced mode flag
+  QWidget*      previousPage;   // previous page
+  QString       tmpCreated;     // created temporary directory
+  bool          exitConfirmed;  // flag: "Exit confirmed"
+  // Widgets
+  // --> introduction page
+  QWidget*      introPage;      // page itself
+  QLabel*       logoLab;        // SALOME PRO logo
+  QLabel*       versionLab;     // vesrsion info
+  QLabel*       copyrightLab;   // copyright info
+  QLabel*       licenseLab;     // license info
+  QLabel*       info;           // program info
+  // --> products page
+  QWidget*      productsPage;   // 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
+  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
+  MyListView*   productsView;   // products list view
+  QTextBrowser* productsInfo;   // products info box
+  QCheckBox*    prerequisites;  // <Auto check prerequisites products> checkbox
+  QPushButton*  selectSrcBtn;   // <Select Sources> button - NOT USED CURRENTLY
+  QPushButton*  selectBinBtn;   // <Select Binaries> button - NOT USED CURRENTLY
+  QPushButton*  unselectBtn;    // <Unselect All> button
+  // --> prestart page
+  QWidget*      prestartPage;   // page itself
+  QTextEdit*    choices;        // choice text view
+  // --> progress page
+  QWidget*      progressPage;   // page itself
+  QSplitter*    splitter;       // splitter window
+  QTextEdit*    installInfo;    // information about running installation scripts
+  QLabel*       parametersLab;  // answer field's label
+  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
+  QWidget*      readmePage;     // page itself
+  QTextEdit*    readme;         // Readme information window
+  QPushButton*  runSalomeBtn;   // <Launch Salome> buttnon
+};
+
+/*! 
+  Class MyListView : Products list view
+*/
+class MyListView : public QListView 
+{
+  Q_OBJECT
+  
+  // Class MyListViewItem: to define custom products list view item
+  class MyListViewItem : public QCheckListItem 
+  {
+  public:
+    // constructor
+    MyListViewItem( MyListView* parent, const QString& text, Type tt ) : QCheckListItem( parent, text, tt ) {}
+    // other constructor
+    MyListViewItem( QCheckListItem* parent, const QString& text, Type tt ) : QCheckListItem( parent, text, tt ) {}
+  protected:
+    // called when users switches item on/off
+    void stateChange( bool on ) {
+      QCheckListItem::stateChange( on );
+      ((MyListView*)listView())->itemActivated( (QCheckListItem*)this );
+    }
+  };
+
+public:
+  // constructor
+  MyListView( QWidget* parent ) : QListView( parent )
+  {
+    setRootIsDecorated( false );
+    addColumn( "Products" );
+    addColumn( "Version" );
+    setResizeMode( LastColumn );
+    setSorting( -1, false );
+  }
+  // adds product item(s) into the list
+  QCheckListItem* addItem( const QString& name, 
+                          const QString& version, 
+                          const QString& install, 
+                          const QStringList& supported, 
+                          const QString& script )
+  {
+    QCheckListItem* item = 0;
+    QListViewItem* lItem = this->firstChild();
+    while( lItem && lItem->nextSibling() )
+      lItem = lItem->nextSibling();
+
+    if ( install.isNull() || install.isEmpty() ) {
+      item = new MyListViewItem( this, name, QCheckListItem::CheckBox );
+      item->setText( 1, version );
+      item->setText( 2, script );
+      item->moveItem( lItem );
+    } else {
+      item = new MyListViewItem( this, name, QCheckListItem::Controller );
+      item->setText( 1, version );
+      item->setText( 2, script );
+
+      QCheckListItem* subitem  = 0;
+      subitem = new MyListViewItem( item, tr( "not install" ), QCheckListItem::RadioButton );
+      subitem->setOn( true );
+      QCheckListItem* previtem = subitem;
+      subitem->moveItem( previtem );
+      for ( int i = 0; i < (int)supported.count(); i++ ) {
+       subitem = new MyListViewItem( item, supported[ i ], QCheckListItem::RadioButton );
+       if ( supported[i] == install )
+         subitem->setOn( true );
+       subitem->moveItem( previtem );
+       previtem = subitem;
+      }
+      item->moveItem( lItem );
+      item->setOpen( true );
+    }
+    return item;
+  }
+  // event filter - prevents collapsing/expanding of items
+  bool eventFilter( QObject* o, QEvent* e )
+  {
+    if ( o == viewport() && e->type() == QEvent::MouseButtonDblClick )
+      return true;
+    return QListView::eventFilter(o, e);
+  }
+  // emits signal when checkbox or radiobutton is switched
+  void itemActivated( QCheckListItem* item ) {
+    emit itemToggled( item );
+  }
+  // returns true if "install binaries" is on for the item
+  bool isBinaries( QCheckListItem* item )
+  {
+    if ( item->childCount() > 0 ) {
+      // not SALOME sources, binaries or docs
+      QCheckListItem* subItem = (QCheckListItem*)(item->firstChild());
+      while( subItem ) {
+        if ( subItem->isOn() )
+          return subItem->text() == tr( "install binaries" );
+        subItem = (QCheckListItem*)(subItem->nextSibling());
+      }
+    }
+    // for SALOME sources, binaries and docs return false
+    return false;
+  }
+  // returns true if "install sources" is on for the item
+  bool isSources( QCheckListItem* item )
+  {
+    if ( item->childCount() > 0 ) {
+      // not SALOME sources, binaries or docs item
+      QCheckListItem* subItem = (QCheckListItem*)(item->firstChild());
+      while( subItem ) {
+        if ( subItem->isOn() )
+          return subItem->text() == tr( "install sources" );
+        subItem = (QCheckListItem*)(subItem->nextSibling());
+      }
+    }
+    else {
+      // for SALOME sources, binaries or docs item return true if checked
+      return item->isOn();
+    }
+    return false;
+  }
+  // returns true if "use native" is on for the item
+  bool isNative( QCheckListItem* item )
+  {
+    if ( item->childCount() > 0 ) {
+      // not SALOME sources, binaries or docs item
+      QCheckListItem* subItem = (QCheckListItem*)(item->firstChild());
+      while( subItem ) {
+        if ( subItem->isOn() )
+          return subItem->text() == tr( "use native" );
+        subItem = (QCheckListItem*)(subItem->nextSibling());
+      }
+    }
+    return false;
+  }
+  // returns true if "not install" is on for the item
+  bool isNone(  QCheckListItem* item )
+  {
+    return !isBinaries( item ) && !isSources( item ) && !isNative( item );
+  }
+  // sets "install binaries" on for the item; if "binaries" item is absent, set "install sources" on if it is present 
+  void setBinaries( QCheckListItem* item ) {
+    if ( item->childCount() > 0 ) {
+      // not SALOME sources, binaries or docs item
+      QCheckListItem* subItem = (QCheckListItem*)(item->firstChild());
+      QCheckListItem* srcItem = 0;
+      QCheckListItem* nativeItem = 0;
+      while( subItem ) {
+        if ( subItem->text() == tr( "install sources" ) )
+          srcItem = subItem;
+        if ( subItem->text() == tr( "use native" ) )
+          nativeItem = subItem;
+        if ( subItem->text() == tr( "install binaries" ) ) {
+          subItem->setOn( true );
+          return;
+        }
+        subItem = (QCheckListItem*)(subItem->nextSibling());
+      }
+      if ( srcItem )
+        srcItem->setOn( true );
+      if ( nativeItem )
+        nativeItem->setOn( true );
+    }
+    else {
+      // for SALOME sources, binaries and docs items set true
+      item->setOn( true );
+    }
+  }
+  // sets "install sources" on for the item; if "sources" item is absent, set "install binaries" on if it is present 
+  void setSources( QCheckListItem* item )  {
+    if ( item->childCount() > 0 ) {
+      // not SALOME sources, binaries or docs item
+      QCheckListItem* subItem = (QCheckListItem*)(item->firstChild());
+      QCheckListItem* binItem = 0;
+      while( subItem ) {
+        if ( subItem->text() == tr( "install binaries" ) )
+          binItem = binItem;
+        if ( subItem->text() == tr( "install sources" ) ) {
+          subItem->setOn( true );
+          return;
+        }
+        subItem = (QCheckListItem*)(subItem->nextSibling());
+      }
+      if ( binItem )
+        binItem->setOn( true );
+    }
+    else {
+      // for SALOME sources, binaries and docs items set true
+      item->setOn( true );
+    }
+  }
+  // sets "use native" on for the item; if "sources" item is absent, set "install binaries" on if it is present 
+  void setNative( QCheckListItem* item )  {
+    if ( item->childCount() > 0 ) {
+      // not SALOME sources, binaries or docs item
+      QCheckListItem* subItem = (QCheckListItem*)(item->firstChild());
+      QCheckListItem* binItem = 0;
+      while( subItem ) {
+        if ( subItem->text() == tr( "install binaries" ) )
+          binItem = binItem;
+        if ( subItem->text() == tr( "use native" ) ) {
+          subItem->setOn( true );
+          return;
+        }
+        subItem = (QCheckListItem*)(subItem->nextSibling());
+      }
+      if ( binItem )
+        binItem->setOn( true );
+    }
+    else {
+      // for SALOME sources, binaries and docs items set true
+      item->setOn( true );
+    }
+  }
+  // sets "not install" on for the item
+  void setNone( QCheckListItem* item )  {
+    if ( item->childCount() > 0 ) {
+      // not SALOME sources, binaries or docs item
+      QCheckListItem* subItem = (QCheckListItem*)(item->firstChild());
+      while( subItem ) {
+        if ( subItem->text() == tr( "not install" ) ) {
+          subItem->setOn( true );
+          return;
+        }
+        subItem = (QCheckListItem*)(subItem->nextSibling());
+      }
+    }
+    else {
+      // for SALOME sources, binaries and docs items set false
+      item->setOn( false );
+    }
+  }
+signals:
+  // emitted when checkbox or radiobutton is switched
+  void itemToggled( QCheckListItem* item );
+};
+
+/*!
+  Class ProgressViewItem: Progress list view item
+*/
+enum Status { Waiting, Processing, Completed, Aborted };
+class ProgressView;
+class ProgressViewItem : public QListViewItem
+{
+public:
+  // constructor
+  ProgressViewItem( ProgressView* parent, 
+                   QString       productName, 
+                   const QString installType, 
+                   const QString scriptName, 
+                   Status        status = Waiting );
+  
+  // sets product status
+  void    setStatus( Status status );
+  // gets product status
+  Status  getStatus()  const { return myStatus; }
+  // gets product name
+  QString getProduct() const { return text( 0 ); }
+  // gets product script
+  QString getScript()   const { return myScript; }
+  // gets type of the installation: 'binaries', 'source', 'native' or 'not install'
+  QString getInstallType() const { return text( 1 ); }
+
+protected:
+  // paints cell of the item
+  void paintCell( QPainter* painter, const QColorGroup& cg, int column, int width, int align );
+
+private:
+  Status  myStatus;       // status
+  QString myScript;       // alias
+};
+
+/*!
+  Class ProgressView: Progress list view
+*/
+class ProgressView : public QListView
+{
+public:
+  // constructor
+  ProgressView( QWidget* parent );
+
+  // sets/gets status colors
+  void    setColors( QColor wColor, QColor pColor, QColor cColor );
+  QColor  getWaitingColor()     { return myWaitingColor;    }
+  QColor  getProcessingColor()  { return myProcessingColor; }
+  QColor  getCompletedColor()   { return myCompletedColor;  }
+
+  // adds product item
+  void    addProduct( const QString smbName, const QString type, const QString product );
+  // finds the first item with given status
+  QString findStatus( Status status );
+  // sets new status for the product item
+  void    setStatus( const QString product, Status status );
+  // scrolls the view to make item visible if necessary
+  void    ensureVisible( const QString product );
+  // gets the product script
+  QString getScript( const QString product );
+
+protected:
+  // finds the item by the product name
+  ProgressViewItem* findItem( const QString product );
+
+private:
+  QColor myWaitingColor;     // 'Waiting' color
+  QColor myProcessingColor;  // 'Processing' color
+  QColor myCompletedColor;   // 'Completed' color
+};
+
+/*!
+  Class StructureParser: parses xml-description file and populates the list of the products
+*/
+class StructureParser: public QXmlDefaultHandler
+{
+public:
+  // constructor
+  StructureParser();
+  // begins parsing of the xml dom-element
+  bool startElement( const QString&, const QString&, const QString& ,
+                    const QXmlAttributes& );
+  // finishes parsing of the xml dom-element of the xml dom-element
+  bool endElement( const QString&, const QString&, const QString& );
+  // set control widgets
+  void setListView ( MyListView* view );
+  void setWizard   ( SALOME_InstallWizard* wiz );
+  void setTargetDir( QLineEdit* dir );
+  void setTempDir  ( QLineEdit* dir );
+
+private:
+  MyListView*           tree;      // products list view
+  SALOME_InstallWizard* wizard;    // Salome Pro installation wizard's main window
+  QLineEdit*            targetdir; // target directory widget
+  QLineEdit*            tempdir;   // temp directory widget
+};