]> SALOME platform Git repositories - tools/install.git/blob - src/SALOME_InstallWizard.hxx
Salome HOME
Restore InstallWizard batch mode.
[tools/install.git] / src / SALOME_InstallWizard.hxx
1 //  File      : SALOME_InstallWizard.hxx
2 //  Created   : Thu Dec 18 12:01:00 2002
3 //  Author    : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com)
4 //  Project   : SALOME
5 //  Module    : Installation Wizard
6 //  Copyright : 2002-2007 CEA
7
8 #ifndef __SALOME_InstallWizard
9 #define __SALOME_InstallWizard
10
11 #include "InstallWizard.h"
12
13 #include <qmap.h>
14 #include <qvaluelist.h>
15 #include <qstringlist.h> 
16
17 class QLineEdit;
18 class QPushButton;
19 class QListViewItem;
20 class QCheckListItem;
21 class QLabel;
22 class QTextEdit;
23 class QTextBrowser;
24 class QProcess;
25 class QCheckBox;
26 class QSplitter;
27 class QMyCheckBox;
28 class ProcessThread;
29 class ProductsView;
30 class ProgressView;
31 class HelpWindow;
32 class InstallInfo;
33 class QButton;
34 class QRadioButton;
35 class QButtonGroup;
36
37 // This enum describes the possible types of the SALOME installation
38 enum InstallationType { Binaries, Sources, Compile };
39 // This enum describes the possible states of a tristate parameter
40 enum BoolTristate { False, True, NotDefined };
41
42 /*! 
43   Class Dependancies : Products info
44   This class stores all product dependancies for correct work of installation procedure
45 */
46 class Dependancies
47 {
48  public:
49   // default constructor, necessary for map
50   Dependancies() {}
51   // constructor
52   Dependancies( const QString&     name, 
53                 const QStringList& depend, 
54                 const long         Binsize,  
55                 const long         Sourcessize, 
56                 const long         SrcBuildsize, 
57                 const long         tempsize, 
58                 const QString&     vers = QString::null,
59                 const QString&     descr = QString::null,
60                 const QString&     tp = QString::null,
61                 bool               pickup = false,
62                 BoolTristate       woGui = NotDefined )
63     : smbName( name ), 
64       dependsOn( depend ), 
65       sizeBinaryTotal( Binsize ), 
66       sizeSourcesTotal( Sourcessize ), 
67       sizeSrcBuildTotal( SrcBuildsize ), 
68       sizeTemp( tempsize ),
69       version( vers ),
70       description( descr ),
71       type( tp ),
72       pickupEnv( pickup ),
73       woGuiMode( woGui ) {}
74
75   // gets symbolic name
76   QString     getName() const         { return smbName;   }
77   // gets dependancies
78   QStringList getDependancies() const { return dependsOn; }
79   // gets disk space required
80   long        getSize( InstallationType instType ) const 
81   { 
82     return instType == Binaries ? sizeBinaryTotal : 
83       instType == Sources ? sizeSourcesTotal : 
84       sizeSrcBuildTotal;
85   }
86   // gets temporary disk space required
87   long        getTempSize( InstallationType instType ) const     
88   { 
89     return ( instType == Binaries ? 0 : instType == Sources ? 0 : sizeTemp );
90   }
91   // gets product's version
92   QString     getVersion() const      { return version; }
93   // gets product's description
94   QString     getDescription() const  { return description; }
95   // gets product's type
96   QString     getType() const         { return type; }
97   // returns true if this product needs to pick-up environment
98   bool        pickUpEnvironment()     { return pickupEnv; }
99   // returns true if this product supports installation without GUI mode
100   BoolTristate supportWoGuiMode()     { return woGuiMode; }
101
102  private:
103   QString     smbName;           // symbolic name
104   QStringList dependsOn;         // prerequisites list
105   long        sizeBinaryTotal;   // disk space for binaries required
106   long        sizeSourcesTotal;  // disk space for sources required
107   long        sizeSrcBuildTotal; // disk space for compiled sources required
108   long        sizeTemp;          // disk space for temporary files required
109   QString     version;           // product's version
110   QString     description;       // product's description
111   QString     type;              // product's type (salome sources, binaries or prerequisite)
112   bool        pickupEnv;        // "Pick-up environment" flag
113   BoolTristate woGuiMode;        // support of installation without GUI flag
114 };
115
116 /*! 
117   Class Button : Operation button info
118   This class stores information about the custom operation buttons which appear on
119   the <Finish> page of the Install Wizard.
120 */
121 class Button
122 {
123  public:
124   // default constructor, required for list
125   Button() : myButton( 0 ) {}
126   // constructor
127   Button( const QString& label, const QString& tooltip, const QString& script )
128     : myLabel( label ), myTootip( tooltip ), myScript( script ), myButton( 0 ) {}
129
130   // set operation button
131   void setButton( QButton* btn ) { myButton = btn; }
132
133   // get label
134   QString  label()  const { return myLabel;  } 
135   // get tooltip
136   QString  tootip() const { return myTootip; }
137   // get script name
138   QString  script() const { return myScript; }
139   // get operation button
140   QButton* button() const { return myButton; }
141
142  private:
143   QString  myLabel;    // button label
144   QString  myTootip;   // button tooltip
145   QString  myScript;   // operation script
146   QButton* myButton;   // operation button
147 };
148
149 typedef QMap<QCheckListItem*, Dependancies> MapProducts;
150 typedef QValueList<Button>                  ButtonList;
151 typedef QMap<QString, QString>              MapXmlFiles;
152 typedef QMap<QString, BoolTristate>         MapAttrStates;
153
154 /*!
155   Class SALOME_InstallWizard : Installation Wizard's main window
156 */
157 class SALOME_InstallWizard: public InstallWizard
158 {
159   Q_OBJECT
160     
161  public:
162   // constructor
163   SALOME_InstallWizard( const QString& aXmlFileName = QString::null,
164                         const QString& aTargetDir   = QString::null,
165                         const QString& aTmpDir      = QString::null,
166                         const bool     aForceSrc    = false );
167   // destructor
168   virtual ~SALOME_InstallWizard( );
169
170   // get base platform to install binaries package
171   QString getBasePlatform();
172   // get current platform
173   QString currentPlatform();
174
175   // get binaries path
176   QString getBinPath() { return binPath; }
177   // get sources path
178   QString getSrcPath() { return srcPath; }
179
180   // get map of supported platforms and corresponding XML files
181   MapXmlFiles getXmlMap( const QString& aXmlFileName = QString::null );
182   // check/get XML file and current platform
183   void getXmlAndPlatform();
184
185   // event filter
186   bool eventFilter( QObject* object, QEvent* event );
187
188   // set dependancies
189   void setDependancies( QCheckListItem* item, Dependancies dep);
190
191   // add button for the <Finish> page
192   void addFinishButton( const QString& label, 
193                         const QString& tooltip, 
194                         const QString& script,
195                         bool toClear = false );
196
197   // set version
198   void setVersion( const QString& version ) { myVersion = version; }
199   // set caption
200   void setCaption( const QString& caption ) { myCaption = caption; updateCaption(); }
201   // set copyright
202   void setCopyright( const QString& copyright ) { myCopyright = copyright; }
203   // set license
204   void setLicense( const QString& license ) { myLicense = license; }
205
206   // get version
207   QString getVersion() { return myVersion; }
208   // get caption
209   QString getCaption() { return myCaption; }
210   // get copyright
211   QString getCopyright() { return myCopyright; }
212   // get license
213   QString getLicense() { return myLicense; }
214   // get platform
215   QString getPlatform() { return refPlatform ? refPlatform : curPlatform; }
216   // get InstallWizard's name
217   QString getIWName() { return myIWName; }
218
219   // process validation event (<val> is validation code)
220   void processValidateEvent( const int val, void* data );
221   // get private installation type
222   InstallationType getInstType() { return installType; };
223
224  public slots:
225   // polishing of the widget
226   void polish();
227   
228   // save install log to file
229   void saveLog();
230
231  protected:
232   // updates caption according to the current page number
233   void updateCaption();
234   // close event handler
235   void closeEvent( QCloseEvent* ce );
236   // creates introduction page
237   void setupIntroPage();   
238   // create installation types page
239   void setupTypePage();
240   // create platforms page
241   void setupPlatformPage();
242   // create directories page
243   void setupDirPage();
244   // creates products page
245   void setupProductsPage();
246   // creates prestart page
247   void setupCheckPage();
248   // creates progress page
249   void setupProgressPage();
250   // creates readme page
251   void setupReadmePage();
252   // displays choice info
253   void showChoiceInfo();
254   // validates page when <Next> button is clicked
255   bool acceptData( const QString& );
256   // calculates disk space required for the installation, returns true if any product selected to be installed (src, bin or native)
257   bool checkSize( long* totSize = 0, long* tempSize = 0 );
258   // checks products page validity (directories and products selection)
259   void checkProductPage();
260   // sets the product and all products this one depends on to be checked
261   void setPrerequisites( QCheckListItem* item );
262   // unsets all products which depend of unchecked product ( recursively )
263   void unsetPrerequisites( QCheckListItem* item );
264   // runs installation script
265   void launchScript(); 
266   // searches product listview item with given symbolic name 
267   QCheckListItem* findItem( const QString& sName );
268   // sets progress state to Aborted
269   void abort();
270   // clears and (optionally) removes temporary directory
271   void clean(bool rmDir = false);
272   // Update GUI and check installation errors
273   void completeInstallation();
274   // Run the modification of SALOME *.la files
275   void runModifyLaFiles();
276   // Run the Fortran libraries checking
277   void runCheckFLib();
278
279  protected slots:
280   // reject slot
281   void reject();
282   // accept slot
283   void accept();
284   
285  private slots:
286   // called when user moves from page to page
287   void pageChanged( const QString & mytitle);
288   // called when user selected either installation type or installation platform
289   void onButtonGroup( int index );
290   // invokes Help window
291   void helpClicked();
292   // invokes directory selection dialog box
293   void browseDirectory();
294   // called when directory path (target or temp) is changed
295   void directoryChanged( const QString& text );
296   // <Start> button's slot - runs installation
297   void onStart();
298   // called when users tries to pass parameters for the script
299   void onReturnPressed();
300   // callback function - as response for the script finishing
301   void productInstalled();
302   // called when <Cancel> button is clicked during installation script running
303   void tryTerminate();
304   // kills installation process and quits application
305   void onCancel();
306   // called when selection is changed in the products list view
307   void onSelectionChanged();
308   // called when user checks/unchecks any product item
309   void onItemToggled( QCheckListItem* );
310   // <Installation with GUI> check-box slot
311   void onInstallGuiBtn();
312   // <More...> button slot
313   void onMoreBtn();
314   // Slot to update 'Available disk space' field
315   void updateAvailableSpace();
316   // Slot to take result of modification SALOME *.la files
317   void checkModifyLaResult();
318   // Slot to take result of Fortran libraries checking
319   void checkFLibResult();
320   // Slot to update 'Size' column for modules and prerequisites
321   void updateSizeColumn();
322
323   // <Finish> page buttons slot
324   void onFinishButton();
325
326   // <About> button slot
327   void onAbout();
328
329   // QProcess slots:
330   // -->something was written to stdin
331   void wroteToStdin();
332   // -->something was written to stout
333   void readFromStdout();
334   // -->something was written to stderr
335   void readFromStderr();
336
337  private:
338   QString          myIWName;       // Installation Wizard's name
339   QString          myVersion;      // version info
340   QString          myCaption;      // application name
341   QString          myCopyright;    // copyright info 
342   QString          myLicense;      // license info
343   QString          myTargetPath;   // target directory path
344   QString          myTmpPath;      // temporary directory path
345   
346   HelpWindow*      helpWindow;     // help window
347   QProcess*        shellProcess;   // shell process (install script)
348   QProcess*        diskSpaceProc;  // shell process (to get available disk space script)
349   QProcess*        modifyLaProc;   // shell process (to modify SALOME *.la files script)
350   QProcess*        checkFLibProc;  // shell process (to check Fortran libraries script)
351   MapProducts      productsMap;    // products info (name, dependancies, disk space )
352   MapXmlFiles      extraProducts;  // additional products to be installed
353   QStringList      toInstall;      // list of products being installed
354   QStringList      notInstall;     // list of products being not installed
355   QStringList      prodSequence;   // specified list of products being installed
356   MapAttrStates    woGuiModules;   // map of SALOME modules names, that can support installation without GUI mode
357   InstallationType installType;    // type of the installation
358   QString          curPlatform;    // current operating system
359   QString          refPlatform;    // referenced operating system (selected by user). It is defined, 
360                                    //   if current OS is not determined or not supported only
361   MapXmlFiles      platformsMap;   // supported operating systems and corresponding XML files
362   QString          xmlFileName;    // xml file
363   QString          binPath;        // binaries path
364   QString          srcPath;        // sources path
365   QString          oneModDirName;  // name of the single directory for binaries of SALOME modules
366   QString          oneProdDirName; // name of the single directory for binaries of prerequisites
367   QString          commonPlatform; // platform with universal binaries
368   QStringList      singleBinPlts;  // list of platforms for that the special binary packages are exist
369   bool             moreMode;       // advanced mode flag
370   QWidget*         previousPage;   // previous page
371   QString          tmpCreated;     // created temporary directory
372   bool             stateChanged;   // flag: whether installation type or platform was changed
373   bool             exitConfirmed;  // flag: "Exit confirmed"
374   bool             rmSrcPrevState; // flag: status of "Remove SRC & TMP files" is changed ?
375   // Widgets
376   // --> introduction page
377   QWidget*         introPage;      // page itself
378   QLabel*          logoLab;        // logo pixmap
379   QLabel*          versionLab;     // version info
380   QLabel*          copyrightLab;   // copyright info
381   QLabel*          licenseLab;     // license info
382   QLabel*          info;           // program info
383   // --> installation types page
384   QWidget*         typePage;       // page itself
385   QButtonGroup*    buttonGrp;      // group of the available installation types radio-buttons
386   QRadioButton*    binBtn;         // install binaries button
387   QRadioButton*    srcBtn;         // install sources button
388   QRadioButton*    srcCompileBtn;  // install sources and compile button
389   QCheckBox*       removeSrcBtn;   // <Remove sources & tmp files> checkbox
390   bool             forceSrc;       // Force all products to be compiled from sources
391   // --> installation platform page
392   QWidget*         platformsPage;  // page itself
393   QButtonGroup*    platBtnGrp;     // group of platforms for selection
394   QString          warnMsg;        // warning message
395   QLabel*          warnLab;        // warning label
396   QLabel*          warnLab3;       // additional warning label
397   // --> installation directories page
398   QWidget*         dirPage;        // page itself
399   QLineEdit*       targetFolder;   // target directory for installing of products
400   QPushButton*     targetBtn;      // browse target directory button
401   QLineEdit*       tempFolder;     // directory for the temporary files: /tmp by default
402   QPushButton*     tempBtn;        // browse temp directory button
403   // --> products page
404   QWidget*         productsPage;   // page itself
405   ProductsView*    modulesView;    // modules list view
406   QMyCheckBox*     installGuiBtn;  // <Installation with GUI> checkbox
407   ProductsView*    prereqsView;    // prerequisites list view
408   QMyCheckBox*     oneModDirBtn;   // <Install SALOME modules to a single directory> checkbox
409   QMyCheckBox*     oneProdDirBtn;  // <Install prerequisites to a single directory> checkbox
410   QPushButton*     moreBtn;        // <Show/Hide prerequisites> button
411   QTextBrowser*    productInfo;    // products info box
412   QLabel*          requiredSize;   // <Total disk space required> label
413   QLabel*          requiredTemp;   // <Space required for temporary files> label
414   QLabel*          availableSize;  // <Available disk space> label
415   // --> prestart page
416   QWidget*         prestartPage;   // page itself
417   QTextEdit*       choices;        // choice text view
418   // --> progress page
419   QWidget*         progressPage;   // page itself
420   QSplitter*       splitter;       // splitter window
421   InstallInfo*     installInfo;    // information about running installation scripts
422   QLabel*          parametersLab;  // answer field's label
423   QLineEdit*       passedParams;   // user can pass data to running script
424   QTextEdit*       installProgress;// contains information about progress of installing selected products
425   ProgressView*    progressView;   // displays information about progress of installing selected products
426   QLabel*          statusLab;      // displays currently performed action
427   // --> finish page
428   QWidget*         readmePage;     // page itself
429   QTextEdit*       readme;         // Readme information window
430   ButtonList       buttons;        // operation buttons
431
432   ProcessThread*   myThread;       // validation thread
433   bool             hasErrors;      // flag: if there were any errors or warnings during the installation
434 };
435
436 #endif