1
/***************************************************************************
2
qgsopenvectorlayerdialog.cpp
3
Dialog to select the type and source for ogr vectors, supports
4
file, database, directory and protocol sources.
7
copyright : (C) 2009 by Godofredo Contreras Nava
8
email : frdcn at hotmail.com
9
***************************************************************************/
11
/***************************************************************************
13
* This program is free software; you can redistribute it and/or modify *
14
* it under the terms of the GNU General Public License as published by *
15
* the Free Software Foundation; either version 2 of the License, or *
16
* (at your option) any later version. *
18
***************************************************************************/
21
#include <QFileDialog>
22
#include <QMessageBox>
23
#include <QInputDialog>
25
#include "qgslogger.h"
26
#include "qgsencodingfiledialog.h"
27
#include "qgsopenvectorlayerdialog.h"
29
#include "qgsproviderregistry.h"
30
#include "qgsnewogrconnection.h"
31
#include "qgsogrhelperfunctions.h"
32
#include "qgscontexthelp.h"
34
QgsOpenVectorLayerDialog::QgsOpenVectorLayerDialog( QWidget* parent, Qt::WFlags fl )
35
: QDialog( parent, fl )
39
cmbDatabaseTypes->blockSignals( true );
40
cmbConnections->blockSignals( true );
41
radioSrcFile->setChecked( true );
42
mDataSourceType = "file";
44
// cmbEncodings->setItemText( cmbEncodings->currentIndex(), QString( QTextCodec::codecForLocale()->name() ) );
46
QString enc = settings.value( "/UI/encoding", QString( "System" ) ).toString();
48
// The specified decoding is added if not existing alread, and then set current.
49
// This should select it.
50
int encindex = cmbEncodings->findText( enc );
53
cmbEncodings->insertItem( 0, enc );
56
cmbEncodings->setCurrentIndex( encindex );
58
//add database drivers
59
mVectorFileFilter = QgsProviderRegistry::instance()->fileVectorFilters();
60
QgsDebugMsg( "Database drivers :" + QgsProviderRegistry::instance()->databaseDrivers() );
61
QStringList dbDrivers = QgsProviderRegistry::instance()->databaseDrivers().split( ";" );
63
for ( int i = 0; i < dbDrivers.count(); i++ )
65
QString dbDriver = dbDrivers.at( i );
66
if (( !dbDriver.isEmpty() ) && ( !dbDriver.isNull() ) )
67
cmbDatabaseTypes->addItem( dbDriver.split( "," ).at( 0 ) );
70
//add directory drivers
71
QStringList dirDrivers = QgsProviderRegistry::instance()->directoryDrivers().split( ";" );
72
for ( int i = 0; i < dirDrivers.count(); i++ )
74
QString dirDriver = dirDrivers.at( i );
75
if (( !dirDriver.isEmpty() ) && ( !dirDriver.isNull() ) )
76
cmbDirectoryTypes->addItem( dirDriver.split( "," ).at( 0 ) );
79
//add protocol drivers
80
QStringList proDrivers = QgsProviderRegistry::instance()->protocolDrivers().split( ";" );
81
for ( int i = 0; i < proDrivers.count(); i++ )
83
QString proDriver = proDrivers.at( i );
84
if (( !proDriver.isEmpty() ) && ( !proDriver.isNull() ) )
85
cmbProtocolTypes->addItem( proDriver.split( "," ).at( 0 ) );
87
cmbDatabaseTypes->blockSignals( false );
88
cmbConnections->blockSignals( false );
91
QgsOpenVectorLayerDialog::~QgsOpenVectorLayerDialog()
95
QStringList QgsOpenVectorLayerDialog::openFile()
98
QStringList selectedFiles;
99
QgsDebugMsg( "Vector file filters: " + mVectorFileFilter );
100
QString enc = encoding();
101
QString title = tr( "Open an OGR Supported Vector Layer" );
102
QgisGui::openFilesRememberingFilter( "lastVectorFileFilter", mVectorFileFilter, selectedFiles, enc,
105
return selectedFiles;
108
QString QgsOpenVectorLayerDialog::openDirectory()
112
bool haveLastUsedDir = settings.contains( "/UI/LastUsedDirectory" );
113
QString lastUsedDir = settings.value( "/UI/LastUsedDirectory", QVariant() ).toString();
114
if ( !haveLastUsedDir )
117
QString path = QFileDialog::getExistingDirectory( this,
118
tr( "Open Directory" ), lastUsedDir,
119
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks );
121
settings.setValue( "/UI/LastUsedDirectory", path );
122
//process path if it is grass
123
if ( cmbDirectoryTypes->currentText() == "Grass Vector" )
126
//replace backslashes with forward slashes
127
path.replace( "\\", "/" );
129
path = path + "/head";
134
QStringList QgsOpenVectorLayerDialog::dataSources()
139
QString QgsOpenVectorLayerDialog::encoding()
141
return cmbEncodings->currentText();
144
QString QgsOpenVectorLayerDialog::dataSourceType()
146
return mDataSourceType;
149
void QgsOpenVectorLayerDialog::addNewConnection()
151
QgsNewOgrConnection *nc = new QgsNewOgrConnection( this );
155
populateConnectionList();
158
void QgsOpenVectorLayerDialog::editConnection()
160
QgsNewOgrConnection *nc = new QgsNewOgrConnection( this, cmbDatabaseTypes->currentText(), cmbConnections->currentText() );
164
populateConnectionList();
167
void QgsOpenVectorLayerDialog::deleteConnection()
170
QString key = "/" + cmbDatabaseTypes->currentText() + "/connections/" + cmbConnections->currentText();
171
QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" )
172
.arg( cmbConnections->currentText() );
173
QMessageBox::StandardButton result = QMessageBox::information( this, tr( "Confirm Delete" ), msg, QMessageBox::Ok | QMessageBox::Cancel );
174
if ( result == QMessageBox::Ok )
176
settings.remove( key + "/host" );
177
settings.remove( key + "/database" );
178
settings.remove( key + "/username" );
179
settings.remove( key + "/password" );
180
settings.remove( key + "/port" );
181
settings.remove( key + "/save" );
182
settings.remove( key );
183
cmbConnections->removeItem( cmbConnections->currentIndex() ); // populateConnectionList();
184
setConnectionListPosition();
188
void QgsOpenVectorLayerDialog::populateConnectionList()
191
settings.beginGroup( "/" + cmbDatabaseTypes->currentText() + "/connections" );
192
QStringList keys = settings.childGroups();
193
QStringList::Iterator it = keys.begin();
194
cmbConnections->clear();
195
while ( it != keys.end() )
197
cmbConnections->addItem( *it );
201
setConnectionListPosition();
204
void QgsOpenVectorLayerDialog::setConnectionListPosition()
207
// If possible, set the item currently displayed database
209
QString toSelect = settings.value( "/" + cmbDatabaseTypes->currentText() + "/connections/selected" ).toString();
210
// Does toSelect exist in cmbConnections?
212
for ( int i = 0; i < cmbConnections->count(); ++i )
213
if ( cmbConnections->itemText( i ) == toSelect )
215
cmbConnections->setCurrentIndex( i );
219
// If we couldn't find the stored item, but there are some,
220
// default to the last item (this makes some sense when deleting
221
// items as it allows the user to repeatidly click on delete to
222
// remove a whole lot of items).
223
if ( !set && cmbConnections->count() > 0 )
225
// If toSelect is null, then the selected connection wasn't found
226
// by QSettings, which probably means that this is the first time
227
// the user has used qgis with database connections, so default to
228
// the first in the list of connetions. Otherwise default to the last.
229
if ( toSelect.isNull() )
230
cmbConnections->setCurrentIndex( 0 );
232
cmbConnections->setCurrentIndex( cmbConnections->count() - 1 );
236
void QgsOpenVectorLayerDialog::setConnectionTypeListPosition()
240
QString toSelect = settings.value( "/ogr/connections/selectedtype" ).toString();
242
for ( int i = 0; i < cmbDatabaseTypes->count(); ++i )
243
if ( cmbDatabaseTypes->itemText( i ) == toSelect )
245
cmbDatabaseTypes->setCurrentIndex( i );
251
void QgsOpenVectorLayerDialog::setSelectedConnectionType()
254
QString baseKey = "/ogr/connections/";
255
settings.setValue( baseKey + "selectedtype", cmbDatabaseTypes->currentText() );
256
QgsDebugMsg( "Setting selected type to" + cmbDatabaseTypes->currentText() );
259
void QgsOpenVectorLayerDialog::setSelectedConnection()
262
settings.setValue( "/" + cmbDatabaseTypes->currentText() + "/connections/selected", cmbConnections->currentText() );
263
QgsDebugMsg( "Setting selected connection to " + cmbConnections->currentText() );
267
void QgsOpenVectorLayerDialog::on_buttonSelectSrc_clicked()
269
if ( radioSrcFile->isChecked() )
271
inputSrcDataset->setText( openFile().join( ";" ) );
273
else if ( radioSrcDirectory->isChecked() )
275
inputSrcDataset->setText( openDirectory() );
277
else if ( !radioSrcDatabase->isChecked() )
279
Q_ASSERT( !"SHOULD NEVER GET HERE" );
285
//********************auto connected slots *****************/
286
void QgsOpenVectorLayerDialog::accept()
289
QgsDebugMsg( "dialog button accepted" );
291
mDataSources.clear();
293
if ( radioSrcDatabase->isChecked() )
295
if ( !settings.contains( "/" + cmbDatabaseTypes->currentText()
296
+ "/connections/" + cmbConnections->currentText()
299
QMessageBox::information( this,
300
tr( "Add vector layer" ),
301
tr( "No database selected." ) );
305
QString baseKey = "/" + cmbDatabaseTypes->currentText() + "/connections/";
306
baseKey += cmbConnections->currentText();
307
QString host = settings.value( baseKey + "/host" ).toString();
308
QString database = settings.value( baseKey + "/database" ).toString();
309
QString port = settings.value( baseKey + "/port" ).toString();
310
QString user = settings.value( baseKey + "/username" ).toString();
311
QString pass = settings.value( baseKey + "/password" ).toString();
313
bool makeConnection = false;
314
if ( pass.isEmpty() )
316
pass = QInputDialog::getText( this,
317
tr( "Password for " ) + user,
318
tr( "Please enter your password:" ),
319
QLineEdit::Password, QString::null,
323
if ( makeConnection || !pass.isEmpty() )
325
mDataSources << createDatabaseURI(
326
cmbDatabaseTypes->currentText(),
335
else if ( radioSrcProtocol->isChecked() )
337
if ( protocolURI->text().isEmpty() )
339
QMessageBox::information( this,
340
tr( "Add vector layer" ),
341
tr( "No protocol URI entered." ) );
345
mDataSources << createProtocolURI( cmbProtocolTypes->currentText(), protocolURI->text() );
347
else if ( radioSrcFile->isChecked() )
349
if ( inputSrcDataset->text().isEmpty() )
351
QMessageBox::information( this,
352
tr( "Add vector layer" ),
353
tr( "No layers selected." ) );
357
mDataSources << inputSrcDataset->text().split( ";" );
359
else if ( radioSrcDirectory->isChecked() )
361
if ( inputSrcDataset->text().isEmpty() )
363
QMessageBox::information( this,
364
tr( "Add vector layer" ),
365
tr( "No directory selected." ) );
369
mDataSources << inputSrcDataset->text();
372
// Save the used encoding
373
settings.setValue( "/UI/encoding", encoding() );
378
void QgsOpenVectorLayerDialog::on_radioSrcFile_toggled( bool checked )
382
labelDirectoryType->hide();
383
cmbDirectoryTypes->hide();
384
fileGroupBox->show();
386
protocolGroupBox->hide();
387
layout()->setSizeConstraint( QLayout::SetFixedSize );
388
mDataSourceType = "file";
392
void QgsOpenVectorLayerDialog::on_radioSrcDirectory_toggled( bool checked )
396
labelDirectoryType->show();
397
cmbDirectoryTypes->show();
398
fileGroupBox->show();
400
protocolGroupBox->hide();
401
layout()->setSizeConstraint( QLayout::SetFixedSize );
402
mDataSourceType = "directory";
406
void QgsOpenVectorLayerDialog::on_radioSrcDatabase_toggled( bool checked )
410
layout()->blockSignals( true );
411
fileGroupBox->hide();
412
protocolGroupBox->hide();
414
layout()->blockSignals( false );
415
layout()->setSizeConstraint( QLayout::SetFixedSize );
416
setConnectionTypeListPosition();
417
populateConnectionList();
418
setConnectionListPosition();
419
mDataSourceType = "database";
423
void QgsOpenVectorLayerDialog::on_radioSrcProtocol_toggled( bool checked )
427
fileGroupBox->hide();
429
protocolGroupBox->show();
430
layout()->setSizeConstraint( QLayout::SetFixedSize );
431
mDataSourceType = "protocol";
435
// Slot for adding a new connection
436
void QgsOpenVectorLayerDialog::on_btnNew_clicked()
440
// Slot for deleting an existing connection
441
void QgsOpenVectorLayerDialog::on_btnDelete_clicked()
447
// Slot for editing a connection
448
void QgsOpenVectorLayerDialog::on_btnEdit_clicked()
453
void QgsOpenVectorLayerDialog::on_cmbDatabaseTypes_currentIndexChanged( const QString & text )
455
populateConnectionList();
456
setSelectedConnectionType();
459
void QgsOpenVectorLayerDialog::on_cmbConnections_currentIndexChanged( const QString & text )
461
setSelectedConnection();
463
//********************end auto connected slots *****************/