2626#include " FilterTableHeader.h"
2727#include " SqlExecutionArea.h"
2828#include " VacuumDialog.h"
29+ #include " DbStructureModel.h"
2930
3031MainWindow::MainWindow (QWidget* parent)
3132 : QMainWindow(parent),
@@ -54,16 +55,19 @@ void MainWindow::init()
5455 // Init the SQL log dock
5556 db.mainWindow = this ;
5657
57- // Set up the db tree widget
58- ui->dbTreeWidget ->setColumnHidden (1 , true );
59- ui->dbTreeWidget ->setColumnWidth (0 , 300 );
60-
6158 // Set the validator for the goto line edit
6259 ui->editGoto ->setValidator (gotoValidator);
6360
6461 // Set up DB models
6562 ui->dataTable ->setModel (m_browseTableModel);
6663
64+ // Set up DB structure tab
65+ dbStructureModel = new DbStructureModel (ui->dbTreeWidget );
66+ ui->dbTreeWidget ->setModel (dbStructureModel);
67+ ui->dbTreeWidget ->setColumnHidden (1 , true );
68+ ui->dbTreeWidget ->setColumnWidth (0 , 300 );
69+
70+ // Set up filter row
6771 FilterTableHeader* tableHeader = new FilterTableHeader (ui->dataTable );
6872 connect (tableHeader, SIGNAL (filterChanged (int ,QString)), m_browseTableModel, SLOT (updateFilter (int ,QString)));
6973 connect (tableHeader, SIGNAL (filterChanged (int ,QString)), this , SLOT (setRecordsetLabel ()));
@@ -103,6 +107,7 @@ void MainWindow::init()
103107 connect (ui->dataTable ->verticalScrollBar (), SIGNAL (valueChanged (int )), this , SLOT (setRecordsetLabel ()));
104108 connect (editWin, SIGNAL (goingAway ()), this , SLOT (editWinAway ()));
105109 connect (editWin, SIGNAL (updateRecordText (int , int , QByteArray)), this , SLOT (updateRecordText (int , int , QByteArray)));
110+ connect (ui->dbTreeWidget ->selectionModel (), SIGNAL (currentChanged (QModelIndex,QModelIndex)), this , SLOT (changeTreeSelection ()));
106111
107112 // Load window settings
108113 restoreGeometry (PreferencesDialog::getSettingsValue (" MainWindow" , " geometry" ).toByteArray ());
@@ -175,10 +180,8 @@ void MainWindow::fileNew()
175180 }
176181}
177182
178- // ** Populate DbTree Structure
179183void MainWindow::populateStructure ()
180184{
181- ui->dbTreeWidget ->model ()->removeRows (0 , ui->dbTreeWidget ->model ()->rowCount ());
182185 completerModelTables.clear ();
183186 completerModelsFields.clear ();
184187 if (!db.isOpen ())
@@ -229,51 +232,9 @@ void MainWindow::populateStructure()
229232 sqlarea->getEditor ()->insertFieldCompleterModels (completerModelsFields);
230233 }
231234
232- // fill the structure tab
233- QMap<QString, QTreeWidgetItem*> typeToParentItem;
234- QTreeWidgetItem* itemTables = new QTreeWidgetItem (ui->dbTreeWidget );
235- itemTables->setIcon (0 , QIcon (QString (" :/icons/table" )));
236- itemTables->setText (0 , tr (" Tables (%1)" ).arg (db.objMap .values (" table" ).count ()));
237- typeToParentItem.insert (" table" , itemTables);
238- QTreeWidgetItem* itemIndices = new QTreeWidgetItem (ui->dbTreeWidget );
239- itemIndices->setIcon (0 , QIcon (QString (" :/icons/index" )));
240- itemIndices->setText (0 , tr (" Indices (%1)" ).arg (db.objMap .values (" index" ).count ()));
241- typeToParentItem.insert (" index" , itemIndices);
242- QTreeWidgetItem* itemViews = new QTreeWidgetItem (ui->dbTreeWidget );
243- itemViews->setIcon (0 , QIcon (QString (" :/icons/view" )));
244- itemViews->setText (0 , tr (" Views (%1)" ).arg (db.objMap .values (" view" ).count ()));
245- typeToParentItem.insert (" view" , itemViews);
246- QTreeWidgetItem* itemTriggers = new QTreeWidgetItem (ui->dbTreeWidget );
247- itemTriggers->setIcon (0 , QIcon (QString (" :/icons/trigger" )));
248- itemTriggers->setText (0 , tr (" Triggers (%1)" ).arg (db.objMap .values (" trigger" ).count ()));
249- typeToParentItem.insert (" trigger" , itemTriggers);
250- ui->dbTreeWidget ->setItemExpanded (itemTables, true );
251- ui->dbTreeWidget ->setItemExpanded (itemIndices, true );
252- ui->dbTreeWidget ->setItemExpanded (itemViews, true );
253- ui->dbTreeWidget ->setItemExpanded (itemTriggers, true );
254-
255- for (objectMap::ConstIterator it=db.objMap .begin ();it!=db.objMap .end ();++it)
256- {
257- // Object node
258- QTreeWidgetItem *tableItem = new QTreeWidgetItem (typeToParentItem.value ((*it).gettype ()));
259- tableItem->setIcon (0 , QIcon (QString (" :/icons/%1" ).arg ((*it).gettype ())));
260- tableItem->setText (0 , (*it).getname ());
261- tableItem->setText (1 , (*it).gettype ());
262- tableItem->setText (3 , (*it).getsql ());
263-
264- // If it is a table add the field Nodes
265- if ((*it).gettype () == " table" || (*it).gettype () == " view" )
266- {
267- for (int i=0 ;i<(*it).fldmap .size ();i++)
268- {
269- QTreeWidgetItem *fldItem = new QTreeWidgetItem (tableItem);
270- fldItem->setText (0 , (*it).fldmap .at (i)->name ());
271- fldItem->setText (1 , " field" );
272- fldItem->setText (2 , (*it).fldmap .at (i)->type ());
273- fldItem->setIcon (0 , QIcon (" :/icons/field" ));
274- }
275- }
276- }
235+ // Refresh the structure tab
236+ dbStructureModel->reloadData (&db);
237+ ui->dbTreeWidget ->expandToDepth (0 );
277238}
278239
279240void MainWindow::populateTable ( const QString & tablename)
@@ -517,9 +478,9 @@ void MainWindow::compact()
517478
518479void MainWindow::deleteObject ()
519480{
520- // Get name of table to delete
521- QString table = ui->dbTreeWidget ->currentItem ()->text ( 0 );
522- QString type = ui->dbTreeWidget ->currentItem ()->text ( 1 );
481+ // Get name and type of object to delete
482+ QString table = ui->dbTreeWidget ->model ()->data (ui-> dbTreeWidget -> currentIndex (). sibling (ui-> dbTreeWidget -> currentIndex (). row (), 0 )). toString ( );
483+ QString type = ui->dbTreeWidget ->model ()->data (ui-> dbTreeWidget -> currentIndex (). sibling (ui-> dbTreeWidget -> currentIndex (). row (), 1 )). toString ( );
523484
524485 // Ask user if he really wants to delete that table
525486 if (QMessageBox::warning (this , QApplication::applicationName (), tr (" Are you sure you want to delete the %1 '%2'?\n All data associated with the %1 will be lost." ).arg (type).arg (table),
@@ -547,7 +508,7 @@ void MainWindow::editTable()
547508 if (!ui->dbTreeWidget ->selectionModel ()->hasSelection ()){
548509 return ;
549510 }
550- QString tableToEdit = ui->dbTreeWidget ->currentItem ()->text ( 0 );
511+ QString tableToEdit = ui->dbTreeWidget ->model ()->data (ui-> dbTreeWidget -> currentIndex (). sibling (ui-> dbTreeWidget -> currentIndex (). row (), 0 )). toString ( );
551512
552513 EditTableDialog dialog (&db, tableToEdit, this );
553514 if (dialog.exec ())
@@ -867,9 +828,9 @@ void MainWindow::createTreeContextMenu(const QPoint &qPoint)
867828 if (!ui->dbTreeWidget ->selectionModel ()->hasSelection ())
868829 return ;
869830
870- QTreeWidgetItem *cItem = ui->dbTreeWidget ->currentItem ();
831+ QString type = ui->dbTreeWidget ->model ()-> data (ui-> dbTreeWidget -> currentIndex (). sibling (ui-> dbTreeWidget -> currentIndex (). row (), 1 )). toString ();
871832
872- if (cItem-> text ( 1 ) == " table" || cItem-> text ( 1 ) == " view" || cItem-> text ( 1 ) == " trigger" || cItem-> text ( 1 ) == " index" )
833+ if (type == " table" || type == " view" || type == " trigger" || type == " index" )
873834 popupTableMenu->exec (ui->dbTreeWidget ->mapToGlobal (qPoint));
874835}
875836// ** Tree selection changed
@@ -879,26 +840,27 @@ void MainWindow::changeTreeSelection()
879840 ui->editDeleteObjectAction ->setEnabled (false );
880841 ui->editModifyTableAction ->setEnabled (false );
881842
882- if (ui->dbTreeWidget ->currentItem () == 0 )
843+ if (! ui->dbTreeWidget ->currentIndex (). isValid () )
883844 return ;
884845
885846 // Change the text of the actions
886- ui->editDeleteObjectAction ->setIcon (QIcon (QString (" :icons/%1_delete" ).arg (ui->dbTreeWidget ->currentItem ()->text (1 ))));
887- if (ui->dbTreeWidget ->currentItem ()->text (1 ) == " view" )
847+ QString type = ui->dbTreeWidget ->model ()->data (ui->dbTreeWidget ->currentIndex ().sibling (ui->dbTreeWidget ->currentIndex ().row (), 1 )).toString ();
848+ ui->editDeleteObjectAction ->setIcon (QIcon (QString (" :icons/%1_delete" ).arg (type)));
849+ if (type == " view" )
888850 ui->editDeleteObjectAction ->setText (tr (" Delete View" ));
889- else if (ui-> dbTreeWidget -> currentItem ()-> text ( 1 ) == " trigger" )
851+ else if (type == " trigger" )
890852 ui->editDeleteObjectAction ->setText (tr (" Delete Trigger" ));
891- else if (ui-> dbTreeWidget -> currentItem ()-> text ( 1 ) == " index" )
853+ else if (type == " index" )
892854 ui->editDeleteObjectAction ->setText (tr (" Delete Index" ));
893855 else
894856 ui->editDeleteObjectAction ->setText (tr (" Delete Table" ));
895857
896858 // Activate actions
897- if (ui-> dbTreeWidget -> currentItem ()-> text ( 1 ) == " table" )
859+ if (type == " table" )
898860 {
899861 ui->editDeleteObjectAction ->setEnabled (true );
900862 ui->editModifyTableAction ->setEnabled (true );
901- } else if (ui-> dbTreeWidget -> currentItem ()-> text ( 1 ) == " view" || ui-> dbTreeWidget -> currentItem ()-> text ( 1 ) == " trigger" || ui-> dbTreeWidget -> currentItem ()-> text ( 1 ) == " index" ) {
863+ } else if (type == " view" || type == " trigger" || type == " index" ) {
902864 ui->editDeleteObjectAction ->setEnabled (true );
903865 }
904866}
0 commit comments