gapMea  1.0-rc1-1.5.3.2
GapMea est un outil visuel écrit en c++ à l'aide de la bibliothèque QT qui sert de base entre autre à l'environnement graphique de KDE.Il permet de dessiner des schémas recueillant et structurant les informations nécessaires à un domaine de gestion. Le schéma obtenu est enregistré dans un fichier texte au format xml.
 All Classes Functions Variables
mainwindow.cpp
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3 #include <QGraphicsTextItem>
4 #include <QWidget>
5 #include <QDebug>
6 #include "entite.h"
7 #include "property.h"
8 #include <QString>
9 #include <QMessageBox>
10 #include "dialogtypejointure.h"
11 #include "ui_dialogtypejointure.h"
12 #include <QDir>
13 #include <QFileDialog>
14 #include <QDesktopServices>
15 #include "xmeawriter.h"
16 #include "xmeareader.h"
17 #include "dialogaboutme.h"
23 MainWindow::MainWindow(QWidget *parent) :
24  QMainWindow(parent),
25  ui(new Ui::MainWindow)
26 {
27  ui->setupUi(this);
28  setDockNestingEnabled(true);
29  maScene=new QCustomGraphicsScene(this);
30  ui->graphicsView->setRenderHint(QPainter::Antialiasing);
31  ui->graphicsView->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
32  ui->graphicsView->setScene(maScene);
33  prochainX=30;
34  //agrandissement de la dernière colonne de tableWidgetProperties
35  ui->tableWidgetProperties->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
36  ui->tableWidgetProperties->horizontalHeader()->setStretchLastSection(true);
37  //placement des dockwidgets
38  ui->dockWidgetProperties->setFloating(false);
39  ui->dockWidgetObjects->setFloating(false);
40  //on donne le focus au lineEdit
41  ui->lineEditObjectName->setFocus();
42  ui->textEditSql->setVisible(false);
43  QPalette* palette = new QPalette();
44  QColor couleurFond(Qt::lightGray);
45  QColor couleurTexte(Qt::black);
46 
47  palette->setColor(QPalette::Base,couleurFond);
48  palette->setColor(QPalette::Text,couleurTexte);
49  ui->textEditSql->setPalette(*palette);
50  //connexion des signaux aux slots
51  connect (ui->graphicsView,SIGNAL(jointureRequise(Entite*,Entite*)),this,SLOT(jointure(Entite*,Entite*)));
52  connect(ui->pushButtonModifyProperty,SIGNAL(clicked()),this,SLOT(on_pushButtonModifyProperty_clicked()));
53  connect(ui->lineEditPropertyName,SIGNAL(textChanged(QString)),this,SLOT(activeDesactiveBoutonApply()));
54  connect(ui->lineEditPropertyRole,SIGNAL(textChanged(QString)),this,SLOT(activeDesactiveBoutonApply()));
55  connect(ui->lineEditTaille,SIGNAL(textChanged(QString)),this,SLOT(activeDesactiveBoutonApply()));
56  connect(ui->comboBoxPropertyType,SIGNAL(currentTextChanged(QString)),this,SLOT(activeDesactiveBoutonApply()));
57  connect(ui->comboBoxPropertyType,SIGNAL(currentTextChanged(QString)),this,SLOT(activeDesactiveInputTaille()));
58  setFileName(tr("New_Model.mea"));
59  setSaved(true);
60 }
62 {
63 
64  qDebug()<<"void MainWindow::effaceTout()";
65  //effacement des entités
66  foreach (Entite* lEntite, vectTable)
67  {
68  //supression sans demander confirmation
69  tableSupprimer(lEntite,false);
70  }
71  //raz de la tableWidget
72  ui->tableWidgetProperties->setRowCount(0);
73  //raz du formulaire de modif des propriétés
74  //debut marche pas
75  maScene->clear();
76 
77  //fin du marche pas
78 }
79 
80 MainWindow::~MainWindow()
81 {
82  delete ui;
83  //effacement des entités
84  effaceTout();
85 }
86 
87 void MainWindow::on_action_quitter_triggered()
88 {
89  close();
90 }
96 void MainWindow::closeEvent(QCloseEvent* event)
97 {
98  if(saved && QMessageBox::question(this,this->windowTitle(),tr("Do you really want to quit gapMea?"),QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
99 
100  event->accept();
101  else
102  {
103  if (!saved && QMessageBox::question(this,this->windowTitle(),tr("Your work is not saved, Are you sure ?"),QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
104  event->accept();
105  else
106  event->ignore();
107  }
108 }
109 
110 void MainWindow::on_action_Add_Entity_triggered()
111 {
112  QStringList listeDesChamps;
113  listeDesChamps<<"numero"<<"libelle";
114  QString nomTable=ui->lineEditObjectName->text();
115  Entite* tableAjoutee=new Entite(this,nomTable,0,0,0,maScene,listeDesChamps,false);
116  tableAjoutee->setPos(QPoint (prochainX,30));
117  ajouteTable(tableAjoutee);
118  maScene->addItem(tableAjoutee);
119  //j'efface la zone de saisie
120  ui->lineEditObjectName->clear();
121  tableAjoutee->redraw();
122  setSaved(false);
123 }
125 {
126  vectTable.append(lEntite);
127  ui->listWidgetObjects->addItem(lEntite);
128  prochainX=lEntite->pos().x()+lEntite->boundingRect().width()+10;
129  lEntite->setFlag(QGraphicsItem::ItemIsSelectable);
130  lEntite->setFlag(QGraphicsItem::ItemIsMovable);
131  setSaved(false);
132 }
133 
134 void MainWindow::tableAjouterChamp(Entite * lEntite,QString nomDuChamp,QString typeDuChamp, QString roleDuChamp,QString tailleDuChamp)
135 {
136  //but:Ajouter une propriété à l'entité
137  qDebug()<<"void MainWindow::tableAjouterChamp()";
138 
139  Property* nouveauChamp=new Property(this,true,maScene,nomDuChamp,typeDuChamp,roleDuChamp,tailleDuChamp,lEntite);
140  //les données du champ
141  nouveauChamp->setData(32,"Field");
142  nouveauChamp->setData(33,lEntite->nomEntite+"."+nomDuChamp);
143  //ajout du nouveau champ au vecteur des champs de l'entité
144  lEntite->vecteurChamps.append(nouveauChamp);
145  lEntite->redraw();
146  setSaved(false);
147 }
148 
149 void MainWindow::setFileName(QString fn)
150 {
151  fileName=fn;
152  setWindowTitle("GapMea "+fileName);
153 }
155 {
156  //selection dans la liste des objets
157  ui->listWidgetObjects->setCurrentItem(lEntite);
158  //on fait comme si l'utilisateur l'avait sélectionné à la main dans la liste
160 
161  //effacer la selection de la grille des pr
162 }
163 
165 {
166  qDebug("void MainWindow::selectionne(Property * laPropriete)");
167  selectionne(laPropriete->lEntite);
168  ui->tableWidgetProperties->selectRow(laPropriete->lEntite->vecteurChamps.indexOf(laPropriete));
169  //desactivation du bouton modifier
170  ui->pushButtonModifyProperty->setEnabled(false);
171 }
172 
174 {
175  ui->lineEditPropertyName->setText(laPropriete->nom);
176  ui->lineEditPropertyRole->setText(laPropriete->role);
177  ui->lineEditTaille->setText(laPropriete->taille);
178  ui->comboBoxPropertyType->setCurrentText(laPropriete->sonType);
179  ui->lineEditPropertyName->setFocus();
180 }
181 
182 void MainWindow::on_pushButtonAddObject_clicked()
183 {
184  //ajout de l'objet à la liste
185  QString leNom=ui->lineEditObjectName->text();
186  //s'il n'est pas vide et qu'il n'existe pas déjà
187  if(leNom!="" && !ui->listWidgetObjects->findItems(leNom,Qt::MatchExactly).count()>0 )
188  {
189  on_action_Add_Entity_triggered();
190  setSaved(false);
191  }
192  else
193  {
194  statusBar()->showMessage(tr("Sorry but Object already exists"),2000);
195  }
196 }
203 void MainWindow::on_action_Object_list_triggered(bool checked)
204 {
205  if(checked)
206  {
207  ui->dockWidgetObjects->show();
208  }
209  else
210  {
211  ui->dockWidgetObjects->hide();
212  }
213 }
214 
222 {
223  Entite* lEntite=(Entite*)item;
224  //affichage du nom de l'entité dans le titre de la groupBoxProperties
225  ui->groupBoxProperties->setTitle(lEntite->nomEntite+'-'+tr("Properties"));
226  //recup et affichage des propriétés de l'entité
227  QVector<Property*>vectChamps=lEntite->vecteurChamps;
228  ui->tableWidgetProperties->setRowCount(vectChamps.size());
229  //affichage dans la table des champs de l'entité
230  for(int no=0;no<vectChamps.size();no++)
231  {
232  ui->tableWidgetProperties->setItem(no,0,new QTableWidgetItem(vectChamps[no]->getNomComplet()));
233  ui->tableWidgetProperties->setItem(no,1,new QTableWidgetItem(vectChamps[no]->sonType));
234  ui->tableWidgetProperties->setItem(no,2,new QTableWidgetItem(vectChamps[no]->taille));
235  ui->tableWidgetProperties->setItem(no,3,new QTableWidgetItem(vectChamps[no]->role));
236  }
237  //met à jour la zone de modif des propriétés
238  on_tableWidgetProperties_itemSelectionChanged();
239  //essais de selection dans la view
240  ((QGraphicsItem*)lEntite)->setSelected(true);
241 }
243 {
244  //click sur apply
245  int index=ui->tableWidgetProperties->currentRow();
246 
247  if(index!=-1)
248  {
249  Property* laPropriete=((Entite*)ui->listWidgetObjects->currentItem())->vecteurChamps[index];
250  //on récupère les informations saisies
251  laPropriete->nom=ui->lineEditPropertyName->text();
252  laPropriete->sonType=ui->comboBoxPropertyType->currentText();
253  laPropriete->role=ui->lineEditPropertyRole->text();
254  laPropriete->taille=ui->lineEditTaille->text();
255  //on fait comme si on avait cliqué sur l'entité de façon à actualiser l'affichage
257  //on redessine l'entité
258  laPropriete->lEntite->redraw();
259  //désactivation du bouton modifier
260  ui->pushButtonModifyProperty->setEnabled(false);
261  setSaved(false);
262  }
263  else
264  {
265  statusBar()->showMessage(tr("Please select an object first"),2000);
266  }
267 }
268 
269 void MainWindow::on_pushButtonAddProperty_clicked()
270 {
271  //ajout de propriété à l'entité en cours d'édition
272  //s'il y a une entité sélectionnée
273  if(ui->listWidgetObjects->selectedItems().count()==1)
274  {
275  Entite* lEntite=(Entite*)(ui->listWidgetObjects->selectedItems()).at(0);
276  //on récupère les informations saisies
277  QString nomDuChamp=ui->lineEditPropertyName->text();
278  QString typeDuChamp=ui->comboBoxPropertyType->currentText();
279  QString roleDuChamp=ui->lineEditPropertyRole->text();
280  QString tailleDuChamp=ui->lineEditTaille->text();
281  tableAjouterChamp(lEntite,nomDuChamp,typeDuChamp,roleDuChamp,tailleDuChamp);
282  //ajout dans la grille
283  int nbChamp=lEntite->vecteurChamps.size();
284  ui->tableWidgetProperties->setRowCount(nbChamp);
285  ui->tableWidgetProperties->setItem(nbChamp-1,0,new QTableWidgetItem(nomDuChamp));
286  ui->tableWidgetProperties->setItem(nbChamp-1,1,new QTableWidgetItem(typeDuChamp));
287  ui->tableWidgetProperties->setItem(nbChamp-1,2,new QTableWidgetItem(tailleDuChamp));
288  ui->tableWidgetProperties->setItem(nbChamp-1,3,new QTableWidgetItem(roleDuChamp));
289  //puis on efface les zones de saisie
290  ui->lineEditPropertyName->clear();
291  ui->lineEditPropertyRole->clear();
292  //ui->comboBoxPropertyType->clear();
293  setSaved(false);
294  }
295  else
296  {
297  statusBar()->showMessage(tr("Please select an object first"),2000);
298  }
299 }
300 
301 void MainWindow::on_tableWidgetProperties_cellChanged(int row, int column)
302 {
303  qDebug()<<"void MainWindow::on_tableWidgetProperties_cellChanged(int row, int column)";
304  //modification du nom du type ou du role du champ
305  if(ui->listWidgetObjects->selectedItems().count()==1)
306  {
307  Entite* lEntite=(Entite*)(ui->listWidgetObjects->selectedItems()).at(0);
308  Property * laPropriete=lEntite->vecteurChamps.at(row);
309  QString nouvelleValeur=ui->tableWidgetProperties->item(row,column)->text();
310 
311  switch(column)
312  {
313  case 0:
314 
315  laPropriete->nom=nouvelleValeur;
316  break;
317  case 1:
318  laPropriete->sonType=nouvelleValeur;
319  break;
320  case 2:
321  laPropriete->taille=nouvelleValeur;
322  break;
323  case 3:
324  laPropriete->role=nouvelleValeur;
325  break;
326  }
327  lEntite->redraw();
328  setSaved(false);
329  }
330  else statusBar()->showMessage(tr("Select an object first"),2000);
331 }
332 void MainWindow::tableSupprimer(Entite* laTableASupprimer,bool demanderConfirmation)
333 {
334  qDebug()<<"void MainWindow::tableSupprimer(Entite* laTableASupprimer)";
335  if(demanderConfirmation && QMessageBox::question(this,this->windowTitle(),tr("Do you confirm deleting Object:")+laTableASupprimer->nomEntite,QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
336  {
337  int no=vectTable.indexOf(laTableASupprimer);
338  vectTable.remove(no,1);
339  //enlever de la liste
340  ui->listWidgetObjects->takeItem(no);
341  //enlever de la scene
342  ui->graphicsView->scene()->removeItem(laTableASupprimer);
343  delete laTableASupprimer;
344 
345  setSaved(false);
346  }
347  else//soit sans confirm soit il a confirmé la supression
348  {
349  //si c'est une supression sans confirmation
350  if(!demanderConfirmation)
351  {
352  int no=vectTable.indexOf(laTableASupprimer);
353  vectTable.remove(no,1);
354  //enlever de la liste
355  ui->listWidgetObjects->takeItem(no);
356  //enlever de la scene
357  ui->graphicsView->scene()->removeItem(laTableASupprimer);
358  delete laTableASupprimer;
359  setSaved(false);
360  }
361  }
362 }
363 
364 void MainWindow::on_lineEditObjectName_textChanged(const QString &arg1)
365 {
366  //activation/desactivation du bouton add
367  ui->pushButtonAddObject->setEnabled(!arg1.isEmpty());
368 }
369 
370 void MainWindow::on_actionMove_triggered()
371 {
372  qDebug()<<"void dialogRelation::on_toolButtonMove_clicked()";
373  //Choix de l'outil move
374  maScene->outil="move";
375  ui->graphicsView->setCursor(QCursor(Qt::ArrowCursor));
376  ui->actionLink->setEnabled(true);
377  ui->actionMove->setEnabled(false);
378 }
379 
380 void MainWindow::on_actionLink_triggered()
381 {
382  qDebug()<<"void dialogRelation::on_toolButtonJoin_clicked()";
383  //choix de l'outil drag
384  maScene->outil="drag";
385  ui->graphicsView->setCursor(QCursor(Qt::PointingHandCursor));
386  ui->actionLink->setEnabled(false);
387  ui->actionMove->setEnabled(true);
388 }
390 {
391  qDebug()<<"void MainWindow::jointure(Entite* t1,Entite* t2)";
392  //j'affiche une boite de dialogue pour saisir le type de jointure
393  DialogTypeJointure dtj;
394  //si t1=t2 df ou assoc elever la CIF et l'entité faible
395  if(t1==t2)
396  {
397  dtj.m_ui->comboBoxType->removeItem(0);//cif
398  dtj.m_ui->comboBoxType->removeItem(1);//leg
399  dtj.m_ui->comboBoxType->removeItem(1);//leak relation
400  }
401 
402 
403  //puis je trouve les deux tables dans le vecteur et ajoute le lien dans la table des liens
404  if(dtj.exec())
405  {
406  QString typ=dtj.m_ui->comboBoxType->currentText();
407  QString relationName=dtj.m_ui->lineEditRelationName->text();
408  if(t1!=t2) //pas de jointure entre une table et elle-même
409  {
410  Lien * nouveauLien=new Lien(t1,t2,0,typ,relationName);
411  maScene->addItem(nouveauLien);
412  }
413  else//reflexive à implémenter
414  {
415  //reflexive donc attention a ne pas ajouter deux fois le lien
416  Lien * nouveauLien=new Lien(t1,t2,0,typ,relationName);
417  maScene->addItem(nouveauLien);
418  }
419  //on a modifié le modèle
420  setSaved(false);
421  }
422 
423 }
424 
425 
427 {
428  qDebug()<<"void dialogRelation::supprimerLien(lien * leLien)";
429  //effacement du lien dans le vecteur central de la mainWindow:
430  int index=vectLiens.indexOf(leLien);
431  if(index!=-1)
432  {
433  leLien->t1->vectLiens.remove(leLien->t1->vectLiens.indexOf(leLien));
434  //version qt supérieure: leLien->t1->vectLiens.removeOne(leLien);
435  leLien->t2->vectLiens.remove(leLien->t2->vectLiens.indexOf(leLien));
436  //version qt supérieureleLien->t2->vectLiens.removeOne(leLien);
437  vectLiens.remove(index,1);
438  }
439  delete leLien;
440  //on a modifié le modèle
441  setSaved(false);
442 }
443 
444 void MainWindow::on_actionSave_triggered()
445 {
446  QString fichierOuvert=fileName;
447  QString nomFichier=QFileDialog::getSaveFileName(this,tr("Save xmea file"),fichierOuvert,tr("MEA Files (*.mea *.xml)"));
448  //sauver dans un fichier xml
449  QFile monFichierXMea(nomFichier);
450  QFileInfo fi(nomFichier);
451  bool ouvertureReussie=monFichierXMea.open(QIODevice::WriteOnly);
452  if(ouvertureReussie)
453  {
454  XMeaWriter* monWriter=new XMeaWriter(this);
455  QString message=tr("Error occured saving file");
456  if(monWriter->writeFile(&monFichierXMea))
457  {
458  message=tr("File was succesfully saved.");
459  setSaved(true);
460  setFileName(fi.fileName());
461  }
462  statusBar()->showMessage(message,2000);
463  delete monWriter;
464  }
465  else
466  {
467  statusBar()->showMessage(tr("Saving is aborted"),2000);
468  }
469 }
470 
471 void MainWindow::on_action_Open_triggered()
472 {
473  //ouverture d'un fichier xml
474  // Look for bookmarks on the same drive where the application is installed to,
475  // if drive is not read only. QDesktopServices::DataLocation does this check,
476  // and returns writable drive.
477  /*QString filesFolder =
478  QDesktopServices::storageLocation(QDesktopServices::DataLocation).left(1);
479  filesFolder.append(":/Data/qt/saxbookmarks");
480  QDir::setCurrent(filesFolder);*/
481 
482  QString fileName =
483  QFileDialog::getOpenFileName(this, tr("Open MEA File"),
484  QDir::currentPath(),
485  tr("MEA Files (*.mea *.xml)"));
486  QFileInfo fi(fileName) ;
487  if (fileName.isEmpty())
488  return;
489 
490  QFile file(fileName);
491  if (!file.open(QFile::ReadOnly | QFile::Text)) {
492  QMessageBox::warning(this, "GAP MEA",
493  tr("Cannot read file %1:\n%2.")
494  .arg(fileName)
495  .arg(file.errorString()));
496  return;
497  }
498  XMeaReader* monMeaReader=new XMeaReader(this);
499  if (monMeaReader->readFile(&file))
500  {
501  statusBar()->showMessage(tr("File loaded"), 2000);
502  setSaved(true);
503  setFileName(fi.fileName());
504  //vider le sql
505  ui->textEditSql->clear();
506  //effacement de la zone du sql
507  ui->textEditSql->setVisible(false);
508  ui->action_sql->setChecked(false);
509  //essais
510  ui->graphicsView->setScene(maScene);
511  ui->graphicsView->showMaximized();
512  }
513  else
514  statusBar()->showMessage(tr("Error reading File"), 2000);
515 }
516 
517 void MainWindow::on_actionZoom_Best_triggered()
518 {
519  ui->graphicsView->fitInView(ui->graphicsView->scene()->itemsBoundingRect(),Qt::KeepAspectRatio);
520 }
521 
522 
523 void MainWindow::on_actionZoom_2_triggered()
524 {
525  ui->graphicsView->zoomOut();
526 }
527 
528 void MainWindow::on_actionZoom_triggered()
529 {
530  ui->graphicsView->zoomIn();
531 }
532 
533 void MainWindow::on_action_sql_triggered(bool checked)
534 {
535  QVector <Entite*> entitesAProbleme;
536  ui->textEditSql->setVisible(checked);
537  ui->action_sql->setChecked(checked);
538  if(checked)
539  {
540  ui->textEditSql->clear();
541  QVector<Entite*>entitesGeneres;
542  int nbDEntites=vectTable.count();
543  int nbEGDsLeTour=180;
544  while(!(entitesGeneres.count()==nbDEntites || nbEGDsLeTour==0))
545  {
546  nbEGDsLeTour=0;
547  foreach(Entite* lEntite ,vectTable)
548  {
549  if(lEntite->canBeWriten(entitesGeneres))
550  {
551  if(!entitesGeneres.contains(lEntite))
552  {
553  ui->textEditSql->append(lEntite->toSql());
554  //plus une ligne vide
555  ui->textEditSql->append("");
556  entitesGeneres.append(lEntite);
557  nbEGDsLeTour++;
558  }
559  }
560  }
561  }
562  if(!(entitesGeneres.count()==nbDEntites))
563  {
564  statusBar()->showMessage(tr("Loop was detected please correct problem first"));
565  //demander à l'utilisateur s'il veut tout de même créer le modèle
566  QMessageBox msg;
567  msg.setText(tr("A loop as been detected while trying to generate SQL"));
568  msg.setInformativeText(tr("Your model may contain error\r\n You can try to correct problem or to force generation\r\nDo you want to force SQL generation?"));
569  msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
570  msg.setDefaultButton(QMessageBox::No);
571  int ret=msg.exec();
572  if(ret==QMessageBox::Yes)
573  {
574  //a implémenter
575  //generation des tables(sans fk) puis des alter pour les foreign keys
576  foreach(Entite* lEntite ,vectTable)
577  {
578 
579  if(!entitesGeneres.contains(lEntite))
580  {
581  entitesAProbleme.push_back(lEntite);
582  ui->textEditSql->append(lEntite->toSql(true));
583  //plus une ligne vide
584  ui->textEditSql->append("");
585  entitesGeneres.append(lEntite);
586 
587  }
588  }//fin fdu foreach
589  //on reprend les entités à problème
590  foreach(Entite* lEntite, entitesAProbleme)
591  {
592  QStringList lesClefsEtrangeres=lEntite->renvoieClefsEtrangeres(false);
593  foreach (QString laClef, lesClefsEtrangeres) {
594  ui->textEditSql->append(laClef);
595  }
596 
597  }
598  }//fin du il veut forcer
599 
600  }//fin du il ya eu un pb de generation
601 
602  else
603  statusBar()->showMessage(tr("SQL was successfully generated."));
604  }//fin du if checked
605 }
606 
607 
609 {
610  int no=0;
611  while(!(no==vectTable.size()|| vectTable.at(no)->nomEntite==nom))
612  {
613  no++;
614  }
615  if(no!=vectTable.size())
616  {
617  return vectTable.at(no);
618  }
619  else
620  return NULL;
621 }
622 
623 
624 
625 void MainWindow::on_actionAbout_Qt_triggered()
626 {
627  QApplication::aboutQt();
628 }
629 
630 void MainWindow::on_action_About_triggered()
631 {
632  DialogAboutMe aboutMe;
633  aboutMe.exec();
634 }
635 
636 
637 
638 void MainWindow::on_action_Properties_triggered(bool checked)
639 {
640  ui->dockWidgetProperties->setVisible(checked);
641 }
642 
643 void MainWindow::setSaved(bool ok)
644 {
645  saved=ok;
646  ui->actionSave->setEnabled(!ok);
647 }
648 
649 void MainWindow::on_tableWidgetProperties_itemSelectionChanged()
650 {
651  qDebug()<<"void MainWindow::on_tableWidgetProperties_itemSelectionChanged()";
652  //si la selection n'est pas vide
653  int numeroDeLigne=ui->tableWidgetProperties->currentRow();
654  if(numeroDeLigne!=-1)
655  {
656  if(ui->listWidgetObjects->currentItem()!=NULL)
657  {
658  editProperty(((Entite*)ui->listWidgetObjects->currentItem())->vecteurChamps[numeroDeLigne]);
659  }
660  }
661 }
662 
663 void MainWindow::on_actionNew_Document_triggered()
664 {
665  //regarder s'il faut sauver
666  if (!saved)
667  {
668  if(QMessageBox::question(this,this->windowTitle(),tr("Your work is not saved, do you want to save it before ?"),QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
669  {
670  on_actionSave_triggered();
671  }
672  }
673  //nouveau document
674  effaceTout();
675  setFileName(tr("New_Model.mea"));
676  setSaved(true);
677  //vider le sql
678  ui->textEditSql->clear();
679  //le rendre invisible
680  on_action_sql_triggered(false);
681 }
682 
684 {
685  bool activer;
686  //comparaison entre ce qu'il y a dans la table et ce qu'il ya dans le formulaire
687  int noLigne=ui->tableWidgetProperties->currentRow();
688  bool nomDif=ui->tableWidgetProperties->itemAt(0,noLigne)->text()!=ui->lineEditPropertyName->text();
689  bool typeDif=ui->tableWidgetProperties->itemAt(1,noLigne)->text()!=ui->comboBoxPropertyType->currentText();
690  bool tailleDif=ui->tableWidgetProperties->itemAt(2,noLigne)->text()!=ui->lineEditTaille->text();
691  bool roleDif=ui->tableWidgetProperties->itemAt(3,noLigne)->text()!=ui->lineEditPropertyRole->text();
692  activer=(!ui->lineEditPropertyName->text().isEmpty())&&(nomDif||typeDif||tailleDif||roleDif);
693  ui->pushButtonModifyProperty->setEnabled(activer);
694 }
696 {
697  QString typ=ui->comboBoxPropertyType->currentText();
698  ui->lineEditTaille->setEnabled(typ=="VARCHAR"|| typ=="NUMERIC");
699 }
700 
701 void MainWindow::on_listWidgetObjects_itemSelectionChanged()
702 {
703  ui->pushButtonAddProperty->setEnabled(ui->listWidgetObjects->selectedItems().count()==1);
704 }
void setFileName(QString fn)
setFileName
Definition: mainwindow.cpp:149
Entite * t2
t2 second object
Definition: lien.h:40
The DialogTypeJointure class This dialog permit to choose relation type.
The QCustomGraphicsScene class This class is designed to deal with mouse events.
QString nomEntite
nomEntite name of entity
Definition: entite.h:58
QString toSql(bool withoutFK=false)
toSql
Definition: entite.cpp:434
void selectionne(Entite *lEntite)
selectionne
Definition: mainwindow.cpp:154
QVector< Entite * > vectTable
vectTable all entities and relations
Definition: mainwindow.h:60
void tableAjouterChamp(Entite *lEntite, QString nomDuChamp="property name", QString typeDuChamp="Son type", QString roleDuChamp="Son rôle dans l'objet", QString tailleDuChamp="")
tableAjouterChamp
Definition: mainwindow.cpp:134
void supprimerLien(Lien *leLien)
supprimerLien
Definition: mainwindow.cpp:426
void activeDesactiveInputTaille()
activeDesactiveInputTaille Somme fields need size as varchar
Definition: mainwindow.cpp:695
The Lien class a link is betwwen to objects it contains a line a role text cardinality ...
Definition: lien.h:17
QString sonType
sonType his type ex varchar(25) ou integer
Definition: property.h:64
Entite * t1
t1 first object
Definition: lien.h:35
QVector< Lien * > vectLiens
vectLiens this vector contains adresses of the links concerning entity
Definition: entite.h:69
void on_listWidgetObjects_itemActivated(QListWidgetItem *item)
on_listWidgetObjects_itemActivated
Definition: mainwindow.cpp:221
Entite * lEntite
lEntite object wich contains it
Definition: property.h:58
QStringList renvoieClefsEtrangeres(bool constraintInsideTable=true)
renvoieClefsEtrangeres
Definition: entite.cpp:284
void on_pushButtonModifyProperty_clicked()
on_pushButtonModifyProperty_clicked whenever modify property is called
Definition: mainwindow.cpp:242
void closeEvent(QCloseEvent *event)
closeEvent
Definition: mainwindow.cpp:96
int prochainX
prochainX when adding entity it will be drawn there left distance from beginning
Definition: mainwindow.h:65
QString role
role his role ex father our chief ...
Definition: property.h:70
bool readFile(QIODevice *device)
readFile
Definition: xmeareader.cpp:10
The XMeaWriter class this class is used to write xml mea file.
Definition: xmeawriter.h:13
bool writeFile(QIODevice *device)
writeFile
Definition: xmeawriter.cpp:13
MainWindow(QWidget *parent=0)
MainWindow::MainWindow.
Definition: mainwindow.cpp:23
void effaceTout()
effaceTout remove all from vectors and scene
Definition: mainwindow.cpp:61
QVector< Property * > vecteurChamps
vecteurChamps container for entity's fields
Definition: entite.h:74
QString taille
taille whenever field type need size
Definition: property.h:75
The Property class property is a field it can be placed into entity or relation.
Definition: field.h:13
void redraw()
redraw
Definition: entite.cpp:52
void jointure(Entite *, Entite *)
jointure jointure demandée entre deux tables de la scene
Definition: mainwindow.cpp:389
Entite * getEntiteByName(QString nom)
getEntiteByName
Definition: mainwindow.cpp:608
void editProperty(Property *laPropriete)
editProperty
Definition: mainwindow.cpp:173
bool canBeWriten(QVector< Entite * > vectEntitesGeneres)
canBeWriten
Definition: entite.cpp:312
void ajouteTable(Entite *t)
ajouteTable
Definition: mainwindow.cpp:124
QString nom
nom his name example weight
Definition: property.h:50
void tableSupprimer(Entite *laTableASupprimer, bool demanderConfirmation=true)
tableSupprimer
Definition: mainwindow.cpp:332
The Entite class Entity is an object we have to deal with.
Definition: entite.h:20
The MainWindow class main code of application.
Definition: mainwindow.h:20
QString outil
outil User Tool it can be move or link
QVector< Lien * > vectLiens
vectLiens all links
Definition: mainwindow.h:55
void activeDesactiveBoutonApply()
activeDesactiveBoutonApply enable or disable apply button regarding ok application state ...
Definition: mainwindow.cpp:683
The XMeaReader class this is to read an xml .mea file.
Definition: xmeareader.h:14