1
////////////////////////////////////////////////////////////////////////////////
2
/*! @file InstallWizard.cpp ŠŠ°ŃŃŠµŃ ŃŃŃŠ°Š½Š¾Š²ŠŗŠø ŃŠ¾ŃŃŠ°Š²Š½Š¾Š³Š¾ Š“ŠøŃŃŃŠøŠ±ŃŃŠøŠ²Š°.
3
- Uses RAGUI - Research Assistant Graphical User Interface.
4
- Uses QtGui v.4.6 - http://qt.nokia.com/
5
- Uses RANet - Research Assistant Net Library (based on ANSI C++).
6
- Copyright(C) 2011, Viktor E. Bursian, St.Petersburg, Russia.
7
Viktor.Bursian@mail.ioffe.ru
8
*///////////////////////////////////////////////////////////////////////////////
9
#include "InstallWizard.h"
10
#include "../RAGUI/StringsAndQStrings.h"
12
#include <QApplication>
13
namespace RA/*RADist*/ {
14
//------------------------------------------------------------------------------
15
//---------------------------------------------------- sInstallWizard::sData ---
17
sInstallWizard::sData::sData ()
18
:DistributiveDir(qApp->applicationDirPath())
26
System = "unknownsystem";
31
//----------------------------------------------------------- sInstallWizard ---
33
sInstallWizard::sInstallWizard ()
35
,Prj( new sProjectInfo )
38
setWindowTitle(tr("Research Assistant Installation Wizard"));
39
setPixmap(QWizard::LogoPixmap,QPixmap(":/install/ra.png"));
41
if( AnalizeDistributive() ){
42
setPage( IntroPage , new sIntroPage(Prj) );
43
setPage( DirsPage , new sDirsPage(Prj,Data) );
44
setPage( SelectionPage , new sSelectionPage(Prj,Data) );
45
setPage( LicensePage , new sLicensePage() );
46
setPage( ReadyToInstallPage , new sReadyToInstallPage );
47
setPage( InstallationPage , new sInstallationPage(Prj,Data) );
48
setPage( ConclusionPage , new sConclusionPage );
53
bool sInstallWizard::AnalizeDistributive ()
55
foreach( QString FName, Data->DistributiveDir.entryList(QDir::Files) ){
56
if( FName.endsWith(QString(".")+Data->System+".zip") ){
57
if( FName.startsWith("RA.") ){
65
FName=FName.mid(QString("RA.").length());
66
P = FName.indexOf(".");
67
if( P < 0 ) return false;
68
Part = FName.mid(0,P);
71
P = FName.indexOf(".");
72
if( P < 0 ) return false;
73
VerMajor = FName.mid(0,P).toInt(&OK);
74
if( ! OK ) return false;
77
P = FName.indexOf(".");
78
if( P < 0 ) return false;
79
VerMinor = FName.mid(0,P).toInt(&OK);
80
if( ! OK ) return false;
83
P = FName.indexOf(".");
84
if( P < 0 ) return false;
85
VerPatchStr = FromQString(FName.mid(0,P));
89
Prj->Core = new sProjectInfo::sPartInfo
90
(sVersion(VerMajor,VerMinor,VerPatchStr),QString());
93
Prj->Plugin[Part] = new sProjectInfo::sPartInfo
94
(sVersion(VerMajor,VerMinor,VerPatchStr),QString());
97
Data->OtherProgZips << FName;
99
}else if( FName.endsWith(".src.zip") ){
100
Data->Sources << FName;
106
//--------------------------------------------------------------- sIntroPage ---
108
sIntroPage::sIntroPage (psProjectInfo prj)
111
setTitle(tr("Introduction"));
113
setSubTitle(tr("RA distributive, version %1")
114
.arg(ToQString(Prj->Core->Version.Text()))
116
setPixmap(QWizard::WatermarkPixmap,QPixmap(":/install/aboutra.png"));
118
QVBoxLayout * Layout = new QVBoxLayout;
121
QLabel * Label = new QLabel(tr(
122
"This wizard will help you to install or upgrade\n"
123
"the Research Assistant (RA) program and/or its data.\n\n"
124
"On the next few pages you will\n"
125
// "-- read more about RA,\n"
126
"-- select folders for the installation,\n"
127
"-- choose what exactly you wish to install or upgrade,\n"
128
"-- confirm your agreement to the free software license,\n"
129
"-- wait about a minute until everything is done for you,\n"
130
// "-- run RA (optional)."
132
Label->setWordWrap(true);
133
Layout->addWidget(Label);
136
//---------------------------------------------------------------- sDirsPage ---
138
sDirsPage::sDirsPage (psProjectInfo prj
139
,sInstallWizard::psData data)
147
QGridLayout * Layout = new QGridLayout;
151
Label = new QLabel(tr("Program folder:"));
152
Layout->addWidget(Label,Row++,1,1,1);
154
QLineEdit * ProgDirField = new QLineEdit;
155
Layout->addWidget(ProgDirField,Row,1,1,1);
156
// ProgDirField->setText("ResearchAssistant");
157
registerField("ProgDir*",ProgDirField);
158
ProgDirField->setReadOnly(true);
159
// connect(ProgDirField,SIGNAL(textEdited(QString))
160
// ,this,SLOT(ProgDirBrowse()));
162
QPushButton * ProgDirButton = new QPushButton(tr("Browse"));
163
Layout->addWidget(ProgDirButton,Row++,2,1,1);
164
connect(ProgDirButton,SIGNAL(clicked()),this,SLOT(ProgDirBrowse()));
168
void sDirsPage::initializePage ()
170
// qDebug() << "sDirsPage::initializePage";
171
// Data->ProgDirDefaultLocation = "~/ResearchAssistant";
173
// Data->ProgDirDefaultName = QString("RA.")
174
// + Prj->Core->Version.Principal().Text();
176
//// setField("ProgDir",Data->ProgDirDefaultLocation
177
//// +QDir::separator()
178
//// +Data->ProgDirDefaultName);
179
//// Data->ProgDir = QDir( field("ProgDir").toString() );
180
// Data->ProgDir = QDir(Data->ProgDirDefaultLocation
181
// +QDir::separator()
182
// +Data->ProgDirDefaultName);
183
// setField("ProgDir",Data->ProgDir.absolutePath());
187
void sDirsPage::ProgDirBrowse ()
190
D.setWindowTitle(tr("Select program folder"));
191
D.setFileMode(QFileDialog::Directory);
192
if( ! field("ProgDir").toString().simplified().isEmpty() )
193
D.setDirectory(field("ProgDir").toString().simplified());
194
if( D.exec() && ! D.selectedFiles().empty() ){
195
QString FileName(D.selectedFiles().at(0));
197
setField("ProgDir",FileName);
198
emit completeChanged();
203
bool sDirsPage::FindPreviousInstallations ()
209
bool sDirsPage::isComplete () const
211
qDebug() << "sDirsPage::isComplete";
212
if( ! field("ProgDir").toString().simplified().isEmpty() ){
213
Data->ProgDir = QDir( field("ProgDir").toString().simplified() );
214
qDebug() << "ProgDir:" << Data->ProgDir.absolutePath();
215
return Data->ProgDir.exists();
220
//---------------------------------------------------------------- sDirsPage ---
222
sSelectionPage::sSelectionPage (psProjectInfo prj
223
,sInstallWizard::psData data)
227
setTitle("Select program parts");
231
QGridLayout * Layout = new QGridLayout;
237
Chkbox = new QCheckBox(tr("Install RA program"));
238
Layout->addWidget(Chkbox,Row,1,1,2);
239
Chkbox->setChecked(true);
240
registerField(QString("ra_core"),Chkbox);
241
connect(Chkbox,SIGNAL(toggled(bool)),this,SLOT(Validate(bool)));
243
Label = new QLabel(tr("version: %1")
244
.arg(ToQString(Prj->Core->Version.Text())));
245
Layout->addWidget(Label,Row++,3,1,1);
247
Label = new QLabel(tr("with the following plugins:"));
248
Layout->addWidget(Label,Row++,1,1,3,Qt::AlignHCenter);
250
Label = new QLabel(tr("Install the following plugins:"));
251
Layout->addWidget(Label,Row++,1,1,3,Qt::AlignHCenter);
253
for( QStringList::const_iterator P = Prj->Plugins.constBegin()
254
; P != Prj->Plugins.constEnd(); ++P ){
255
Chkbox = new QCheckBox( *P );
256
Layout->addWidget(Chkbox,Row,2,1,1);
257
Chkbox->setChecked(true);
258
registerField(QString("rap_")+(*P),Chkbox);
259
connect(Chkbox,SIGNAL(toggled(bool)),this,SLOT(Validate(bool)));
261
Label = new QLabel(tr("version: %1")
262
.arg(ToQString(Prj->Plugin[*P]
264
Layout->addWidget(Label,Row++,3,1,1);
269
void sSelectionPage::Validate (bool checked)
271
QStringList::const_iterator P;
273
for( P = Prj->Plugins.constBegin() ;
274
P != Prj->Plugins.constEnd(); ++P ){
275
if( field( QString("rap_") + (*P) ).toBool() ){
277
setField(QString("ra_core"),true);
281
if( Prj->Core && ! field( QString("ra_core") ).toBool() ){
282
for( P = Prj->Plugins.constBegin() ;
283
P != Prj->Plugins.constEnd(); ++P ){
284
setField( QString("rap_") + (*P) , false );
290
//------------------------------------------------------------- sLicensePage ---
292
sLicensePage::sLicensePage ()
294
setTitle("License Agreement");
295
setSubTitle("Please read the license.");
297
QVBoxLayout * Layout = new QVBoxLayout;
300
// QTextBrowser * Viewer = new QTextBrowser;
301
// Layout->addWidget(Viewer);
302
// Viewer->setSource(QUrl("ShortLicense.html"));
304
Viewer = new QTextEdit;
305
Viewer->setReadOnly(true);
306
Viewer->setMinimumWidth(600);
307
Viewer->setMinimumHeight(350);
308
Layout->addWidget(Viewer);
310
btnIntro = new QPushButton("Back to the brief license overview");
311
Layout->addWidget(btnIntro);
312
connect(btnIntro,SIGNAL(clicked()) ,this,SLOT(ShowIntro()));
314
btnGPL = new QPushButton("Show me GNU General Public License");
315
Layout->addWidget(btnGPL);
316
connect(btnGPL,SIGNAL(clicked()) ,this,SLOT(ShowGPL()));
318
btnFDL = new QPushButton("Show me GNU Free Documentation License");
319
Layout->addWidget(btnFDL);
320
connect(btnFDL,SIGNAL(clicked()) ,this,SLOT(ShowFDL()));
322
chkboxAgree = new QCheckBox(tr(" I accept the license agreement "));
323
Layout->addWidget(chkboxAgree);
325
connect(chkboxAgree,SIGNAL(clicked())
326
,this,SIGNAL(completeChanged()));
330
void sLicensePage::initializePage ()
336
void sLicensePage::ShowIntro ()
338
QFile file("Licenses(briefly).html");
339
if( ! file.open(QFile::ReadOnly | QFile::Text) ){
340
QMessageBox::warning(this, tr("install")
341
,tr("Cannot read file %1:\n%2.")
342
.arg(file.fileName()).arg(file.errorString()));
344
QTextStream in(&file);
345
in.setCodec("UTF-8"); //QTextCodec::codecForName("utf8") ??
346
QApplication::setOverrideCursor(Qt::WaitCursor);
347
Viewer->setHtml(in.readAll());
348
QApplication::restoreOverrideCursor();
349
btnIntro->setVisible(false);
350
btnGPL->setVisible(true);
351
btnFDL->setVisible(true);
356
void sLicensePage::ShowGPL ()
358
QFile file("GNU_GPL_3_0.html");
359
if( ! file.open(QFile::ReadOnly | QFile::Text) ){
360
QMessageBox::warning(this, tr("install")
361
,tr("Cannot read file %1:\n%2.")
362
.arg(file.fileName()).arg(file.errorString()));
364
QTextStream in(&file);
365
in.setCodec("UTF-8"); //QTextCodec::codecForName("utf8") ??
366
QApplication::setOverrideCursor(Qt::WaitCursor);
367
Viewer->setHtml(in.readAll());
368
QApplication::restoreOverrideCursor();
369
btnIntro->setVisible(true);
370
btnGPL->setVisible(false);
371
btnFDL->setVisible(true);
376
void sLicensePage::ShowFDL ()
378
QFile file("GNU_FDL_1_3.html");
379
if( ! file.open(QFile::ReadOnly | QFile::Text) ){
380
QMessageBox::warning(this, tr("install")
381
,tr("Cannot read file %1:\n%2.")
382
.arg(file.fileName()).arg(file.errorString()));
384
QTextStream in(&file);
385
in.setCodec("UTF-8"); //QTextCodec::codecForName("utf8") ??
386
QApplication::setOverrideCursor(Qt::WaitCursor);
387
Viewer->setHtml(in.readAll());
388
QApplication::restoreOverrideCursor();
389
btnIntro->setVisible(true);
390
btnGPL->setVisible(true);
391
btnFDL->setVisible(false);
396
bool sLicensePage::isComplete () const
398
return chkboxAgree->isChecked();
401
//------------------------------------------------------ sReadyToInstallPage ---
403
sReadyToInstallPage::sReadyToInstallPage ()
404
:sReadyPage("Ready to install","Install")
408
//-------------------------------------------------------- sInstallationPage ---
410
sInstallationPage::sInstallationPage (psProjectInfo prj
411
,sInstallWizard::psData data)
412
:sDoItPage("Installing...","Please, wait...","Done","Thanks","Error")
419
bool sInstallationPage::Job ()
423
if( Data->System == "unix" ){
425
}else if( Data->System == "win32" ){
426
UnzipProg = "7za.exe";
428
if( Prj->Core && field("ra_core").toBool() ){
429
OK = OK && Execute(UnzipProg
430
,QStringList() << "x" << "-y"
431
<< QString("-o")+Data->ProgDir.absolutePath()
432
<< QString("RA.core.")
433
+ ToQString(Prj->Core->Version.Valuable().Text())
434
+ "." + Data->System + ".zip"
435
,qApp->applicationDirPath()
437
OK = OK && Execute(UnzipProg
438
,QStringList() << "x" << "-y"
439
<< QString("-o")+Data->ProgDir.absolutePath()
440
<< QString("Qt_libs")
441
+ "." + Data->System + ".zip"
442
,qApp->applicationDirPath()
445
for( QStringList::const_iterator P = Prj->Plugins.constBegin()
446
; P != Prj->Plugins.constEnd(); ++P ){
447
if( field(QString("rap_")+(*P)).toBool() ){
448
OK = OK && Execute(UnzipProg
449
,QStringList() << "x" << "-y"
450
<< QString("-o")+Data->ProgDir.absolutePath()
451
<< QString("RA.") + *P + "."
452
+ ToQString(Prj->Plugin[*P]->Version.Valuable().Text())
453
+ "." + Data->System + ".zip"
454
,qApp->applicationDirPath()
458
if( Data->System == "unix" ){
459
OK = OK && Execute( QString("./RA.sh")
460
, QStringList() << "install"
461
,Data->ProgDir.absolutePath()
463
}else if( Data->System == "win32" ){
464
OK = OK && Execute( QString("cmd")
465
, QStringList() << "/c" << "ra" << "install"
466
,Data->ProgDir.absoluteFilePath("bin")
473
//void sInstallationPage::Install ()
475
// QProcess * Process;
476
// QString UnzipProgName;
477
// QString UnzipArgumentTemplate;
478
// QString UnzipArgument;
479
// QStringList UnzipArguments;
480
// QString ZipFileName;
483
//// UnzipProgName = "unzip";
484
//// UnzipArgumentTemplate = "-uoq %2 -d %1"; //%1 -destdir, %2 - zip-file
485
// UnzipProgName = QLatin1String("7za");
486
// UnzipArgumentTemplate = "x -o%1 %2"; //%1 -destdir, %2 - zip-file
488
// UnzipProgName = qApp->applicationDirPath()
489
// + QDir::separator()
492
// ZipFileName = QString("RA.")
493
// + QString().setNum(Data->VerMajor)
495
// + QString().setNum(Data->VerMinor)
496
// + QString(".core.")
497
// + QString().setNum(Data->CoreVerPatch)
498
// + QString(".")+Data->System+QString(".zip");
499
// UnzipArgument = UnzipArgumentTemplate.arg( field("ProgDir").toString() )
500
// .arg( ZipFileName );
501
//// UnzipArguments << QString("x")
502
//// << QString("-o") + field("ProgDir").toString()
504
// UnzipArguments << UnzipArgument;
505
// qDebug() << UnzipProgName << UnzipArguments;
506
// qDebug() << qApp->applicationDirPath();
507
// Process = new QProcess;
508
// Process->start(UnzipProgName,UnzipArguments);
509
// if( ! Process->waitForStarted() ){
510
// qDebug() << "cannot start";
512
// qDebug() << "started";
514
// while( ! Process->waitForFinished(100) ){
516
// qDebug() << "working" << t; // << Process->read();
518
// qDebug() << "cannot finish";
522
// qDebug() << "Yahoo!" << Process->readAll();
526
// Process->start(QLatin1String("../bin-debug/RAlgebrad"),UnzipArguments);
527
// if( ! Process->waitForStarted() ){
528
// qDebug() << "cannot start";
530
// qDebug() << "started";
532
// while( ! Process->waitForFinished(1000) ){
534
// qDebug() << "working" << t;
536
// qDebug() << "cannot finish";
540
// qDebug() << "Yahoo!";
544
// Process->start(QLatin1String("../bin-debug/RAlgebrad"),UnzipArguments);
545
// if( ! Process->waitForStarted() )
546
// qDebug() << "cannot start";
547
// if( ! Process->waitForFinished(20000) ){
548
// qDebug() << "cannot finish";
550
// qDebug() << "Yahoo!";
553
// //it works, but the second loop never finishes
554
// Process->start(QLatin1String("/media/data/Vik/Prog/RA/bin-debug/RAlgebrad"),UnzipArguments);
556
// while( ! Process->waitForStarted(10) ){
558
// qDebug() << "starting" << t;
559
// if( t > 8 ) break;
561
// qDebug() << "It took " << t << "cs";
563
// while( Process->state() == QProcess::Running ){
565
// qDebug() << "working" << t;
567
// qDebug() << "It took " << t << "s";
571
// QProcess * TheProcess = new QProcess;
572
// QStringList Arguments;
573
// QString TheQtAssistantProgram;
574
// TheQtAssistantProgram = QLatin1String("assistant");
576
// TheProcess->start(TheQtAssistantProgram, Arguments);
578
// if( ! TheProcess->waitForStarted() ){
579
// TheQtAssistantProgram = QLibraryInfo::location(QLibraryInfo::BinariesPath)
580
// + QDir::separator()
581
// +TheQtAssistantProgram;
583
// if( TheProcess->state() == QProcess::Running ){
584
// TheProcess->terminate();
585
// TheProcess->waitForFinished(3000);
587
// TheProcess->start(TheQtAssistantProgram, Arguments);
589
// if( ! TheProcess->waitForStarted() ){
590
// QMessageBox::critical(NULL
591
// ,tr("Researh Assistant")
592
// ,tr("Unable to launch (%1)")
593
// .arg(TheQtAssistantProgram) );
599
//---------------------------------------------------------- sConclusionPage ---
601
sConclusionPage::sConclusionPage ()
603
setTitle("Conclusion");
605
QVBoxLayout * Layout = new QVBoxLayout;
608
QLabel * Label = new QLabel(tr(
612
Label->setWordWrap(true);
613
Layout->addWidget(Label);
616
//------------------------------------------------------------------------------
617
}; //namespace RA/*RADist*/