/********************************************************************** ** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. ** ** This file is part of Qt Designer. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free Qt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with ** the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #include "sqlformwizardimpl.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef QT_NO_SQL #include #include #include #include #include #include #endif SqlFormWizard::SqlFormWizard( QUnknownInterface *aIface, QWidget *w, QWidget* parent, DesignerFormWindow *fw, const char* name, bool modal, WFlags fl ) : SqlFormWizardBase( parent, name, modal, fl ), widget( w ), appIface( aIface ), mode( None ) { appIface->addRef(); formWindow = fw; setFinishEnabled( finishPage, TRUE ); /* set mode of operation */ if ( ::qt_cast(widget) ) { setCaption( "Data Table Wizard" ); mode = Table; setAppropriate( navigPage, FALSE ); setAppropriate( layoutPage, FALSE ); checkBoxAutoEdit->setChecked( FALSE ); } else if ( ::qt_cast(widget) ) { setCaption( "Data Browser Wizard" ); setAppropriate( tablePropertiesPage, FALSE ); mode = Browser; checkBoxAutoEdit->setChecked( TRUE ); } else if ( ::qt_cast(widget) ) { setCaption( "Data View Wizard" ); setAppropriate( tablePropertiesPage, FALSE ); setAppropriate( navigPage, FALSE ); setAppropriate( sqlPage, FALSE); checkCreateFieldLayout->hide(); checkCreateButtonLayout->hide(); checkBoxAutoEdit->hide(); mode = View; } connect( nextButton(), SIGNAL(clicked()), SLOT(nextPageClicked()) ); setupPage1(); } SqlFormWizard::~SqlFormWizard() { appIface->release(); } void SqlFormWizard::nextPageClicked() { if ( currentPage() == populatePage ) { autoPopulate( TRUE ); } } void SqlFormWizard::connectionSelected( const QString &c ) { if ( !appIface ) return; DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject(); if ( !proIface ) return; listBoxTable->clear(); QPtrList databases = proIface->databaseConnections(); for ( DesignerDatabase *d = databases.first(); d; d = databases.next() ) { if ( d->name() == c || ( d->name() == "(default)" || d->name().isEmpty() ) && c == "(default)") listBoxTable->insertStringList( d->tables() ); } setNextEnabled( databasePage, ( listBoxTable->currentItem() >= 0 ) ); } void SqlFormWizard::tableSelected( const QString & ) { if ( listBoxTable->currentItem() >= 0 ) { setNextEnabled( databasePage, TRUE ); } else { setNextEnabled( databasePage, FALSE ); } } void SqlFormWizard::autoPopulate( bool populate ) { DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject(); if ( !proIface ) return; QPtrList databases = proIface->databaseConnections(); listBoxField->clear(); listBoxSortField->clear(); listBoxSelectedField->clear(); if ( populate ) { for ( DesignerDatabase *d = databases.first(); d; d = databases.next() ) { if ( d->name() == listBoxConnection->currentText() || ( ( d->name() == "(default)" || d->name().isEmpty() ) && listBoxConnection->currentText() == "(default)" ) ) { QStringList lst = *d->fields().find( listBoxTable->currentText() ); // remove primary index fields, if any listBoxSortField->insertStringList( lst ); d->open( FALSE ); #ifndef QT_NO_SQL QSqlCursor tab( listBoxTable->currentText(), TRUE, d->connection() ); QSqlIndex pIdx = tab.primaryIndex(); for ( uint i = 0; i < pIdx.count(); i++ ) { listBoxField->insertItem( pIdx.field( i )->name() ); lst.remove( pIdx.field( i )->name() ); } #endif d->close(); listBoxSelectedField->insertStringList( lst ); } } } } void SqlFormWizard::fieldDown() { if ( listBoxSelectedField->currentItem() == -1 || listBoxSelectedField->currentItem() == (int)listBoxSelectedField->count() - 1 || listBoxSelectedField->count() < 2 ) return; int index = listBoxSelectedField->currentItem() + 1; QListBoxItem *i = listBoxSelectedField->item( listBoxSelectedField->currentItem() ); listBoxSelectedField->takeItem( i ); listBoxSelectedField->insertItem( i, index ); listBoxSelectedField->setCurrentItem( i ); } void SqlFormWizard::fieldUp() { if ( listBoxSelectedField->currentItem() <= 0 || listBoxSelectedField->count() < 2 ) return; int index = listBoxSelectedField->currentItem() - 1; QListBoxItem *i = listBoxSelectedField->item( listBoxSelectedField->currentItem() ); listBoxSelectedField->takeItem( i ); listBoxSelectedField->insertItem( i, index ); listBoxSelectedField->setCurrentItem( i ); } void SqlFormWizard::removeField() { int i = listBoxSelectedField->currentItem(); if ( i != -1 ) { listBoxField->insertItem( listBoxSelectedField->currentText() ); listBoxSelectedField->removeItem( i ); } } void SqlFormWizard::addField() { int i = listBoxField->currentItem(); if ( i == -1 ) return; QString f = listBoxField->currentText(); if ( !f.isEmpty() ) listBoxSelectedField->insertItem( f ); listBoxField->removeItem( i ); } void SqlFormWizard::addSortField() { int i = listBoxSortField->currentItem(); if ( i == -1 ) return; QString f = listBoxSortField->currentText(); if ( !f.isEmpty() ) listBoxSortedField->insertItem( f + " ASC" ); } void SqlFormWizard::reSortSortField() { int i = listBoxSortedField->currentItem(); if ( i != -1 ) { QString text = listBoxSortedField->currentText(); if ( text.mid( text.length() - 3 ) == "ASC" ) text = text.mid( 0, text.length() - 3 ) + "DESC"; else if ( text.mid( text.length() - 4 ) == "DESC" ) text = text.mid( 0, text.length() - 4 ) + "ASC"; listBoxSortedField->removeItem( i ); listBoxSortedField->insertItem( text, i ); listBoxSortedField->setCurrentItem( i ); } } void SqlFormWizard::removeSortField() { int i = listBoxSortedField->currentItem(); if ( i != -1 ) { listBoxSortedField->removeItem( i ); } } void SqlFormWizard::sortFieldUp() { if ( listBoxSortedField->currentItem() <= 0 || listBoxSortedField->count() < 2 ) return; int index = listBoxSortedField->currentItem() - 1; QListBoxItem *i = listBoxSortedField->item( listBoxSortedField->currentItem() ); listBoxSortedField->takeItem( i ); listBoxSortedField->insertItem( i, index ); listBoxSortedField->setCurrentItem( i ); } void SqlFormWizard::sortFieldDown() { if ( listBoxSortedField->currentItem() == -1 || listBoxSortedField->currentItem() == (int)listBoxSortedField->count() - 1 || listBoxSortedField->count() < 2 ) return; int index = listBoxSortedField->currentItem() + 1; QListBoxItem *i = listBoxSortedField->item( listBoxSortedField->currentItem() ); listBoxSortedField->takeItem( i ); listBoxSortedField->insertItem( i, index ); listBoxSortedField->setCurrentItem( i ); } void SqlFormWizard::setupDatabaseConnections() { if ( !appIface ) return; DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject(); if ( !proIface ) return; proIface->setupDatabases(); raise(); setupPage1(); } void SqlFormWizard::setupPage1() { if ( !appIface ) return; DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject(); if ( !proIface ) return; listBoxTable->clear(); listBoxConnection->clear(); QPtrList databases = proIface->databaseConnections(); QStringList lst; for ( DesignerDatabase *d = databases.first(); d; d = databases.next() ) lst << d->name(); listBoxConnection->insertStringList( lst ); if ( lst.count() ) listBoxConnection->setCurrentItem( 0 ); setNextEnabled( databasePage, FALSE ); } static QPushButton *create_widget( QWidget *parent, const char *name, const QString &txt, const QRect &r, DesignerFormWindow *fw ) { QPushButton *pb = (QPushButton*)fw->create( "QPushButton", parent, name ); pb->setText( txt ); pb->setGeometry( r ); fw->setPropertyChanged( pb, "text", TRUE ); fw->setPropertyChanged( pb, "geometry", TRUE ); return pb; } void SqlFormWizard::accept() { if ( !appIface || mode == None ) return; #ifndef QT_NO_SQL DesignerProject *proIface = (DesignerProject*)( (DesignerInterface*)appIface )->currentProject(); if ( !widget || !proIface ) { SqlFormWizardBase::accept(); return; } QString conn = listBoxConnection->currentText(); QString table = listBoxTable->currentText(); QStringList lst; lst << conn << table; if ( !conn.isEmpty() && !table.isEmpty() ) { formWindow->setProperty( widget, "database", lst ); formWindow->setPropertyChanged( widget, "database", TRUE ); } if ( !editFilter->text().isEmpty() ) { widget->setProperty( "filter", editFilter->text() ); formWindow->setPropertyChanged( widget, "filter", TRUE ); } if ( listBoxSortedField->count() ) { QStringList lst; for ( uint i = 0; i < listBoxSortedField->count(); ++i ) lst << listBoxSortedField->text( i ); widget->setProperty( "sort", lst ); formWindow->setPropertyChanged( widget, "sort", TRUE ); } QPtrList databases = proIface->databaseConnections(); DesignerDatabase *database = 0; for ( DesignerDatabase *d = databases.first(); d; d = databases.next() ) { if ( d->name() == listBoxConnection->currentText() || ( d->name() == "(default)" || d->name().isEmpty() ) && listBoxConnection->currentText() == "(default)" ) { database = d; d->open( FALSE ); break; } } if (!database) { return; } QSqlCursor tab( listBoxTable->currentText(), TRUE, database->connection() ); int columns = 2; QSqlEditorFactory * f = QSqlEditorFactory::defaultFactory(); QWidget * editorDummy; QWidget * editor; QLabel * label; int visibleFields = listBoxSelectedField->count(); int numPerColumn = visibleFields / columns; if( (visibleFields % columns) > 0) numPerColumn++; int row = 0; const int SPACING = 25; const int COL_SPACING = SPACING*9; uint j; switch ( mode ) { case None: break; case View: case Browser: { if ( mode == Browser && !checkBoxAutoEdit->isChecked() ) { ((QDataBrowser*)widget)->setAutoEdit( FALSE ); formWindow->setPropertyChanged( widget, "autoEdit", TRUE ); } formWindow->clearSelection(); bool createFieldLayout = checkCreateFieldLayout->isChecked(); bool createButtonLayout = checkCreateButtonLayout->isChecked(); bool createLayouts = checkCreateLayouts->isChecked(); bool labelAbove = radioLabelsTop->isOn(); uint numCols = spinNumberOfColumns->text().toInt(); uint currentCol = 0; uint fieldsPerCol = listBoxSelectedField->count(); uint fieldsInCol = 0; if ( listBoxSelectedField->count() ) fieldsPerCol = listBoxSelectedField->count() / numCols; /* labels and data field editors */ for( j = 0; j < listBoxSelectedField->count(); j++ ){ QSqlField* field = tab.field( listBoxSelectedField->text( j ) ); if ( !field ) continue; /* label */ QString labelName = field->name(); labelName = labelName.mid(0,1).upper() + labelName.mid(1); label = (QLabel*)formWindow->create( "QLabel", widget, QString( "label" + labelName ) ); label->setText( labelName ); label->setGeometry( SPACING + currentCol*COL_SPACING, row+SPACING, SPACING*3, SPACING ); formWindow->setPropertyChanged( label, "geometry", TRUE ); formWindow->setPropertyChanged( label, "text", TRUE ); /* editor */ editorDummy = f->createEditor( widget, field ); editor = formWindow->create( editorDummy->className(), widget, QString( QString( editorDummy->className() ) + labelName) ); delete editorDummy; if ( labelAbove ) { row += SPACING; editor->setGeometry(SPACING + currentCol*COL_SPACING, row+SPACING, SPACING*3, SPACING ); } else { editor->setGeometry(SPACING * 5 + currentCol*COL_SPACING, row+SPACING, SPACING*3, SPACING ); } formWindow->setPropertyChanged( editor, "geometry", TRUE ); if ( QString(editor->className()) == "QLineEdit" && (field->type() == QVariant::Double || field->type() == QVariant::Int || field->type() == QVariant::UInt ) ) { /* default right-align numerics */ //## ((QLineEdit*)editor)->setAlignment( Qt::AlignRight ); formWindow->setPropertyChanged( editor, "alignment", TRUE ); } if ( ::qt_cast(editor) ) { ( (QSpinBox*)editor )->setMaxValue( INT_MAX ); formWindow->setPropertyChanged( editor, "maxValue", TRUE ); } QStringList lst; lst << conn << table << field->name(); formWindow->setProperty( editor, "database", lst ); formWindow->setPropertyChanged( editor, "database", TRUE ); /* geometry */ if ( createFieldLayout ) { formWindow->selectWidget( label ); formWindow->selectWidget( editor ); } row += SPACING + 5; fieldsInCol++; if ( ( fieldsInCol >= fieldsPerCol ) && ( currentCol < numCols-1 ) ) { currentCol++; fieldsInCol = 0; row = 0; } } if ( listBoxSelectedField->count() ) { if ( createFieldLayout ) formWindow->layoutG(); row += SPACING; } if ( mode == Browser ) { if ( checkBoxNavig->isChecked() ) { formWindow->clearSelection(); currentCol = 0; if ( checkBoxFirst->isChecked() ) { QPushButton *pb = create_widget( widget, "PushButtonFirst", "|< &First", QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow ); formWindow->addConnection( pb, "clicked()", widget, "first()" ); formWindow->addConnection( widget, "firstRecordAvailable( bool )", pb, "setEnabled( bool )" ); currentCol++; formWindow->selectWidget( pb ); } if ( checkBoxPrev->isChecked() ) { QPushButton *pb = create_widget( widget, "PushButtonPrev", "<< &Prev", QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow ); formWindow->addConnection( pb, "clicked()", widget, "prev()" ); formWindow->addConnection( widget, "prevRecordAvailable( bool )", pb, "setEnabled( bool )" ); currentCol++; formWindow->selectWidget( pb ); } if ( checkBoxNext->isChecked() ) { QPushButton *pb = create_widget( widget, "PushButtonNext", "&Next >>", QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow ); formWindow->addConnection( pb, "clicked()", widget, "next()" ); formWindow->addConnection( widget, "nextRecordAvailable( bool )", pb, "setEnabled( bool )" ); currentCol++; formWindow->selectWidget( pb ); } if ( checkBoxLast->isChecked() ) { QPushButton *pb = create_widget( widget, "PushButtonLast", "&Last >|", QRect( 3 * SPACING * currentCol, row+SPACING, SPACING*3, SPACING ), formWindow ); formWindow->addConnection( pb, "clicked()", widget, "last()" ); formWindow->addConnection( widget, "lastRecordAvailable( bool )", pb, "setEnabled( bool )" ); currentCol++; formWindow->selectWidget( pb ); } if ( createButtonLayout ) formWindow->layoutH(); } if ( checkBoxEdit->isChecked() ) { formWindow->clearSelection(); row += SPACING; currentCol = 0; if ( checkBoxInsert->isChecked() ) { QPushButton *pb = create_widget( widget, "PushButtonInsert", "&Insert", QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow ); formWindow->addConnection( pb, "clicked()", widget, "insert()" ); currentCol++; formWindow->selectWidget( pb ); } if ( checkBoxUpdate->isChecked() ) { QPushButton *pb = create_widget( widget, "PushButtonUpdate", "&Update", QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow ); formWindow->addConnection( pb, "clicked()", widget, "update()" ); currentCol++; formWindow->selectWidget( pb ); } if ( checkBoxDelete->isChecked() ) { QPushButton *pb = create_widget( widget, "PushButtonDelete", "&Delete", QRect( 3 * SPACING * currentCol, row+SPACING, SPACING * 3, SPACING ), formWindow ); formWindow->addConnection( pb, "clicked()", widget, "del()" ); currentCol++; formWindow->selectWidget( pb ); } if ( createButtonLayout ) formWindow->layoutH(); } } if ( createLayouts ) formWindow->layoutGContainer( widget ); formWindow->clearSelection(); break; } case Table: { QDataTable* sqlTable = ((QDataTable*)widget); if ( checkBoxAutoEdit->isChecked() ) { sqlTable->setAutoEdit( TRUE ); formWindow->setPropertyChanged( sqlTable, "autoEdit", TRUE ); } if ( checkBoxReadOnly->isChecked() ) { sqlTable->setReadOnly( TRUE ); formWindow->setPropertyChanged( sqlTable, "readOnly", TRUE ); } else { if ( checkBoxConfirmInserts->isChecked() ) { sqlTable->setConfirmInsert( TRUE ); formWindow->setPropertyChanged( sqlTable, "confirmInsert", TRUE ); } if ( checkBoxConfirmUpdates->isChecked() ) { sqlTable->setConfirmUpdate( TRUE ); formWindow->setPropertyChanged( sqlTable, "confirmUpdate", TRUE ); } if ( checkBoxConfirmDeletes->isChecked() ) { sqlTable->setConfirmDelete( TRUE ); formWindow->setPropertyChanged( sqlTable, "confirmDelete", TRUE ); } if ( checkBoxConfirmCancels->isChecked() ) { sqlTable->setConfirmCancels( TRUE ); formWindow->setPropertyChanged( sqlTable, "confirmCancels", TRUE ); } } if ( checkBoxSorting->isChecked() ) { sqlTable->setSorting( TRUE ); formWindow->setPropertyChanged( sqlTable, "sorting", TRUE ); } QMap columnFields; sqlTable->setNumCols( listBoxSelectedField->count() ); // no need to change property through mdbIface here, since QDataTable doesn't offer that through Designer for( j = 0; j < listBoxSelectedField->count(); j++ ){ QSqlField* field = tab.field( listBoxSelectedField->text( j ) ); if ( !field ) continue; QString labelName = field->name(); labelName = labelName.mid(0,1).upper() + labelName.mid(1); ((QTable*)widget)->horizontalHeader()->setLabel( j, labelName ); columnFields.insert( labelName, field->name() ); } formWindow->setColumnFields( widget, columnFields ); break; } } database->close(); #endif SqlFormWizardBase::accept(); }