]> AND Private Git Repository - blast.git/blob - MainWindow.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
modified pattern to use only QMap
[blast.git] / MainWindow.cpp
1 #include "MainWindow.h"
2 #include "Dispatcher.h"
3 #include "Parameters.h"
4 #include "BlockLibraryWidget.h"
5 #include "GroupWidget.h"
6 #include "GroupScene.h"
7 #include "BlockWidget.h"
8 #include "AbstractBoxItem.h"
9 #include "Graph.h"
10 #include "GroupItem.h"
11 #include <QDomDocument>
12 #include <QDomElement>
13 #include <QDomText>
14 #include <sstream>
15
16 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
17
18   versionMaj = VERSION_MAJ;
19   versionMin = VERSION_MIN;
20   revision = REVISION;
21
22   // reading parameters
23   params  = new Parameters();
24   try {    
25     params->loadBlastConfiguration("blastconfig.xml");
26
27     if (!QFileInfo::exists(params->refLib)) {
28       params->loadReferencesFromXml();
29       int ret = QMessageBox::question(this,tr("Building references library"),tr("The reference block library does not exists.\n References have been read directly from the xml descriptions of blocks.\n It can be saved into a library in order to start application faster. "), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
30       if (ret == QMessageBox::Ok) {
31         params->saveReferencesToLib();
32       }
33     }
34     else {      
35       params->loadReferencesFromLib();
36     }
37
38     if (!QFileInfo::exists(params->implLib)) {
39       params->loadImplementationsFromXml();
40       int ret = QMessageBox::question(this,tr("Building implementations library"),tr("The block implementations library does not exists.\nImplementations have been read directly from the xml descriptions.\n It can be saved into a library in order to start application faster. "), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
41       if (ret == QMessageBox::Ok) {
42         params->saveImplementationsToLib();
43       }
44     }
45     else {
46       params->loadImplementationsFromLib();
47     }
48   }
49   catch(Exception err) {
50     cerr << qPrintable(err.getDefaultMessage()) << endl;
51     cerr << "Aborting ..." << endl;
52     exit(1);
53   }
54
55   cout << "all references and implementations are loaded" << endl;
56
57   // create the menu, action, ...
58   dispatcher = new Dispatcher(params,this);
59   params->setDispatcher(dispatcher);
60
61   // creating block library
62   library = new BlockLibraryWidget(dispatcher,params);
63   params->isCurrentProject = false;
64
65   QLabel* labDefault = new QLabel("BLAST: BLock ASsembler Tool");
66   stackedWidget = new QStackedWidget;
67   stackedWidget->addWidget(labDefault);
68   stackedWidget->setCurrentIndex(0);
69   this->setCentralWidget(stackedWidget);
70   this->setMinimumSize(800,600);
71
72   createActions();
73   createMenus(); 
74   setWindowTitle("blast - top group");
75   setFocusPolicy(Qt::StrongFocus);
76   setFocus();
77
78   readSettings();
79
80   initialize();
81
82 }
83
84 MainWindow::~MainWindow() {}
85
86 void MainWindow::initialize() {
87
88   projectMenuEnb = 0;
89
90   stackedWidget->setCurrentIndex(0);
91   enableProjectActions(true,PROJECT_NEW | PROJECT_OPEN, OP_RAZ);
92
93   stackedWidget->setCurrentIndex(0);
94
95   resize(500,300);
96 }
97
98 void MainWindow::readSettings() {
99   QSettings settings;
100   settings.beginGroup("init");
101   checkNewVersion = settings.value("check_new_version").toString();
102   settings.endGroup();
103   if (checkNewVersion.isEmpty()) {
104     checkNewVersion = "true";
105   }
106   /*
107   cout << "test nouvelle version : " << qPrintable(checkNewVersion) << endl;
108   QUrl url("http://www.hrafnheim.fr/download/Cartomagic/carto_currentversion.txt");
109   QNetworkRequest request(url);
110   manager = new QNetworkAccessManager(this);
111   connect(manager,SIGNAL(finished(QNetworkReply*)), this, SLOT(slotCheckNewVersion(QNetworkReply*)));
112   manager->get(request);
113   */
114 }
115
116 void MainWindow::writeSettings() {
117   QSettings settings;
118   settings.beginGroup("init");
119   settings.setValue("check_new_version",checkNewVersion);
120   settings.endGroup();
121 }
122
123 void MainWindow::slotCheckNewVersion(QNetworkReply *reply) {
124
125   if (reply->error() == QNetworkReply::NoError) {
126     QString txt = reply->readAll();
127     QString currentVer = QString("%1.%2.%3").arg(versionMaj).arg(versionMin).arg(revision);
128     if (txt.contains(currentVer)) {
129       cout << "a jour" << endl;
130     }
131     else {
132       cout << "dernière version : " << qPrintable(txt) << ", version actuelle = " << qPrintable(currentVer) << endl;
133     }
134   }
135   else {
136     cout << "erreur = " << qPrintable(reply->errorString()) << endl;
137   }
138   reply->deleteLater();
139 }
140
141 void MainWindow::enableProjectActions(bool enbMenu, quint16 mask, quint8 op) {
142   if (enbMenu) {
143     projectMenu->setEnabled(true);
144   }
145   else {
146     projectMenu->setEnabled(false);
147   }
148
149   if (op == OP_ADD) {
150     projectMenuEnb = projectMenuEnb | mask;
151   }
152   else if (op == OP_REM) {
153     projectMenuEnb = (projectMenuEnb | mask) ^ mask;
154   }
155   else if (op == OP_RAZ) {
156     projectMenuEnb = mask;
157   }
158
159
160   if (projectMenuEnb & PROJECT_NEW) {
161     newProject->setEnabled(true);
162   }
163   else {
164     newProject->setEnabled(false);
165   }
166   if (projectMenuEnb & PROJECT_OPEN) {
167     openProject->setEnabled(true);
168   }
169   else {
170     openProject->setEnabled(false);
171   }
172   if (projectMenuEnb & PROJECT_SAVE) {
173     saveProject->setEnabled(true);
174   }
175   else {
176     saveProject->setEnabled(false);
177   }
178   if (projectMenuEnb & PROJECT_SAVEAS) {
179     saveAsProject->setEnabled(true);
180   }
181   else {
182     saveAsProject->setEnabled(false);
183   }
184   if (projectMenuEnb & PROJECT_CLOSE) {
185     closeProject->setEnabled(true);
186   }
187   else {
188     closeProject->setEnabled(false);
189   }
190   if (projectMenuEnb & PROJECT_LIB) {
191     openLibrary->setEnabled(true);
192   }
193   else {
194     openLibrary->setEnabled(false);
195   }
196 }
197
198 void MainWindow::createMenus(){
199
200   allMenuBar = menuBar();
201
202   projectMenu = allMenuBar->addMenu(tr("&Project"));
203   toolsMenu = allMenuBar->addMenu(tr("&Tools"));
204
205   projectMenu->addAction(newProject);
206   projectMenu->addAction(openProject);
207   projectMenu->addAction(saveProject);
208   projectMenu->addAction(saveAsProject);
209   projectMenu->addAction(closeProject);
210   projectMenu->addAction(openLibrary);
211
212   toolsMenu->addAction(newBlockWidgetAct);
213   toolsMenu->addAction(graphValidation);
214
215 }
216
217 void MainWindow::createActions() {
218
219   newProject = new QAction(tr("&New project"), this);
220   newProject->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
221   newProject->setStatusTip(tr("Create a new project"));
222   connect(newProject, SIGNAL(triggered()), this, SLOT(slotNewProject()));
223
224   openProject = new QAction(tr("&Open project"), this);
225   openProject->setIcon(QPixmap::fromImage(QImage("icons/load.png")));
226   openProject->setStatusTip(tr("Open an existing project"));
227   connect(openProject, SIGNAL(triggered()), this, SLOT(slotLoadProject()));
228
229   saveProject = new QAction(tr("&Save project"), this);
230   saveProject->setIcon(QPixmap::fromImage(QImage("icons/save.png")));
231   saveProject->setStatusTip(tr("Save the current project"));
232   connect(saveProject, SIGNAL(triggered()), this, SLOT(slotSaveProject()));
233
234   saveAsProject = new QAction(tr("&Save project as..."), this);
235   saveAsProject->setIcon(QPixmap::fromImage(QImage("icons/save-as.png")));
236   saveAsProject->setStatusTip(tr("Save the current project as..."));
237   connect(saveAsProject, SIGNAL(triggered()), this, SLOT(slotSaveAsProject()));
238
239   closeProject = new QAction(tr("&Close project"), this);
240   closeProject->setIcon(QPixmap::fromImage(QImage("icons/close.png")));
241   closeProject->setStatusTip(tr("Close the current project"));
242   connect(closeProject, SIGNAL(triggered()), this, SLOT(slotCloseProject()));
243
244   openLibrary = new QAction(tr("Open block &Library"), this);
245   openLibrary->setIcon(QPixmap::fromImage(QImage("icons/add_block.png")));
246   openLibrary->setStatusTip(tr("Open block library window"));
247   connect(openLibrary, SIGNAL(triggered()), this, SLOT(slotOpenBlockLibrary()));
248
249   newBlockWidgetAct = new QAction(tr("&XML generator"), this);
250   newBlockWidgetAct->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
251   newBlockWidgetAct->setStatusTip(tr("Create a new XML generator"));
252   connect(newBlockWidgetAct, SIGNAL(triggered()), this, SLOT(slotNewBlockWidget()));
253
254   graphValidation = new QAction(tr("&graph validation"), this);
255   graphValidation->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
256   graphValidation->setStatusTip(tr("validate the graph"));
257   connect(graphValidation, SIGNAL(triggered()), this, SLOT(slotGraphValidation()));
258
259 }
260
261 void MainWindow::save(QString absoluteFilename) {
262   params->save(absoluteFilename);
263 }
264
265 void MainWindow::slotLoadProject(){
266
267   absoluteFilename = QFileDialog::getOpenFileName(0, "select a project file", "save/",tr("sauvegardes (*.xml)"));
268
269   if(! absoluteFilename.isEmpty()){
270     GroupWidget* topGroup = dispatcher->loadProject(absoluteFilename);
271     if (topGroup != NULL) {
272       addTopGroup(topGroup);
273       library->updateComboScene();
274       params->isCurrentProject = true;
275       enableProjectActions(true, PROJECT_CLOSE | PROJECT_SAVE | PROJECT_SAVEAS | PROJECT_LIB, OP_RAZ);
276     }
277     else {
278       QMessageBox msgBox;
279       msgBox.setText("Cannot open the project.");      
280       msgBox.setStandardButtons(QMessageBox::Cancel);
281       msgBox.setDefaultButton(QMessageBox::Cancel);
282
283       int ret = msgBox.exec();
284     }
285   }
286 }
287
288
289 void MainWindow::slotNewProject(){
290
291   enableProjectActions(true, PROJECT_CLOSE | PROJECT_SAVE | PROJECT_SAVEAS | PROJECT_LIB, OP_RAZ);
292   GroupWidget* topGroup = dispatcher->createTopScene();
293   addTopGroup(topGroup);
294   library->updateComboScene();
295   library->show();
296   params->isCurrentProject = true;
297 }
298
299 bool MainWindow::slotCloseProject(){
300
301   bool doClose = false;
302
303   if(params->isCurrentProject) {
304     if (params->unsaveModif) {
305       QMessageBox msgBox;
306       msgBox.setText("The project has been modified.");
307       msgBox.setInformativeText("Do you want to save your changes?");
308       msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
309       msgBox.setDefaultButton(QMessageBox::Save);
310
311       int ret = msgBox.exec();
312
313       switch(ret) {
314       case QMessageBox::Save :
315         slotSaveProject();
316         doClose = true;
317         break;
318       case QMessageBox::Discard :
319         doClose = true;
320         break;
321       }
322     }
323     else {
324       doClose = true;
325     }
326     if (doClose) {
327       // removing the GroupWidget from stack
328       QWidget *widget = stackedWidget->widget(1);
329       stackedWidget->removeWidget(widget);
330       stackedWidget->setCurrentIndex(0);
331
332       dispatcher->closeCurrentProject();
333
334       params->isCurrentProject = false;
335       params->unsaveModif = false;
336       absoluteFilename = QString();
337
338       initialize();
339     }
340   }
341   return doClose;
342 }
343
344
345 void MainWindow::slotNewBlockWidget() {
346   new BlockWidget();
347 }
348
349 void MainWindow::slotSaveProject(){
350   if(absoluteFilename != QString()){
351     save(absoluteFilename);
352   } else {
353     slotSaveAsProject();
354   }
355 }
356
357 void MainWindow::slotSaveAsProject(){
358   if(params->isCurrentProject){
359     QFileDialog dial(0, "Select a file", "save/");
360     dial.setDefaultSuffix(".xml");
361     dial.setAcceptMode(QFileDialog::AcceptSave);
362     if(dial.exec() == QFileDialog::AcceptSave){
363       absoluteFilename = dial.selectedFiles().at(0);
364       if(absoluteFilename != QString())
365         save(absoluteFilename);
366     }
367   }
368 }
369
370 void MainWindow::slotOpenBlockLibrary() {
371   dispatcher->showBlocksLibrary();
372 }
373
374
375 void MainWindow::slotGraphValidation() {
376   params->getGraph()->computeOutputPatterns(5);
377   //params->parametersValidation();
378 }
379
380 void MainWindow::addTopGroup(GroupWidget *_topGroup) {
381   topGroup = _topGroup;
382   stackedWidget->addWidget(topGroup);
383   stackedWidget->setCurrentIndex(1);
384 }
385
386 void MainWindow::removeTopGroup() {
387   stackedWidget->removeWidget(topGroup);
388   topGroup->deleteLater();
389   stackedWidget->setCurrentIndex(0);
390 }
391
392 void MainWindow::closeEvent(QCloseEvent *event) {
393
394   if (params->isCurrentProject) {
395     slotCloseProject();
396     event->ignore();
397   }
398   else {
399     library->deleteLater();
400   }
401
402 }
403
404 void MainWindow::mousePressEvent(QMouseEvent *e) {
405
406   if (dispatcher->getCurrentGroup() != NULL) {
407     dispatcher->setCurrentGroupWidget(dispatcher->getCurrentGroup());
408   }
409   QMainWindow::mousePressEvent(e);
410 }
411
412 void MainWindow::focusInEvent(QFocusEvent *e) {
413 /*
414   if(params->currentWindow != this){
415     params->setCurrentWindow(this);
416     changeConnectionMode(false);
417   }
418   */
419 }