--- /dev/null
+// 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
+};