From 76d58db87e166aefb2b7edbb387b0ede5ca62c53 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 25 Sep 2003 13:38:53 +0000 Subject: [PATCH] Initial version --- src/SALOME_InstallWizard.hxx | 552 +++++++++++++++++++++++++++++++++++ 1 file changed, 552 insertions(+) create mode 100644 src/SALOME_InstallWizard.hxx diff --git a/src/SALOME_InstallWizard.hxx b/src/SALOME_InstallWizard.hxx new file mode 100644 index 0000000..fb4f295 --- /dev/null +++ b/src/SALOME_InstallWizard.hxx @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#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 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 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 ); + // 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 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* ); + // , buttons slot + void onProdBtn(); + // button slot + void onMoreBtn(); + // 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; // label + QLabel* requiredTemp; // label + QPushButton* moreBtn; // button + QWidget* moreBox; // container for the mode widgets + MyListView* productsView; // products list view + QTextBrowser* productsInfo; // products info box + QCheckBox* prerequisites; // checkbox + QPushButton* selectSrcBtn; // button - NOT USED CURRENTLY + QPushButton* unselectBtn; // 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; // 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 +}; -- 2.39.2