mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-20 11:00:44 -06:00
When running a SQL statement the column widths of the result table view are set to fit their contents automatically. However, for very long values this makes the table hard to navigate. This is why this commit introduces a maximum column width while still trying to fit each column to its contents. See issue #79, point 2.
109 lines
3.0 KiB
C++
109 lines
3.0 KiB
C++
#include "SqlExecutionArea.h"
|
|
#include "ui_SqlExecutionArea.h"
|
|
#include "sqltextedit.h"
|
|
#include "ExtendedTableWidget.h"
|
|
#include "SQLiteSyntaxHighlighter.h"
|
|
#include "sqlitetablemodel.h"
|
|
#include "sqlitedb.h"
|
|
#include "PreferencesDialog.h"
|
|
#include "ExportCsvDialog.h"
|
|
|
|
#include <QMenu>
|
|
#include <QInputDialog>
|
|
#include <QMessageBox>
|
|
|
|
SqlExecutionArea::SqlExecutionArea(QWidget* parent, DBBrowserDB* _db) :
|
|
QWidget(parent),
|
|
db(_db),
|
|
ui(new Ui::SqlExecutionArea)
|
|
{
|
|
// Create UI
|
|
ui->setupUi(this);
|
|
|
|
// Create syntax highlighter
|
|
highlighter = new SQLiteSyntaxHighlighter(ui->editEditor->document());
|
|
|
|
// Create model
|
|
model = new SqliteTableModel(this, db, PreferencesDialog::getSettingsValue("db", "prefetchsize").toInt());
|
|
ui->tableResult->setModel(model);
|
|
|
|
// Create popup menu for save button
|
|
menuPopupSave = new QMenu(this);
|
|
menuPopupSave->addAction(ui->actionExportCsv);
|
|
menuPopupSave->addAction(ui->actionSaveAsView);
|
|
ui->buttonSave->setMenu(menuPopupSave);
|
|
}
|
|
|
|
SqlExecutionArea::~SqlExecutionArea()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void SqlExecutionArea::setTableNames(const QStringList& tables)
|
|
{
|
|
highlighter->setTableNames(tables);
|
|
}
|
|
|
|
QString SqlExecutionArea::getSql() const
|
|
{
|
|
return ui->editEditor->toPlainText().trimmed();
|
|
}
|
|
|
|
QString SqlExecutionArea::getSelectedSql() const
|
|
{
|
|
return ui->editEditor->textCursor().selectedText().trimmed().replace(QChar(0x2029), '\n');
|
|
}
|
|
|
|
void SqlExecutionArea::finishExecution(const QString& result)
|
|
{
|
|
ui->editErrors->setText(result);
|
|
|
|
// Set column widths according to their contents but make sure they don't exceed a certain size
|
|
ui->tableResult->resizeColumnsToContents();
|
|
for(int i=0;i<model->columnCount();i++)
|
|
{
|
|
if(ui->tableResult->columnWidth(i) > 300)
|
|
ui->tableResult->setColumnWidth(i, 300);
|
|
}
|
|
}
|
|
|
|
SqlTextEdit* SqlExecutionArea::getEditor()
|
|
{
|
|
return ui->editEditor;
|
|
}
|
|
|
|
void SqlExecutionArea::enableSaveButton(bool enable)
|
|
{
|
|
ui->buttonSave->setEnabled(enable);
|
|
}
|
|
|
|
void SqlExecutionArea::saveAsCsv()
|
|
{
|
|
ExportCsvDialog dialog(db, this, model->query());
|
|
dialog.exec();
|
|
}
|
|
|
|
void SqlExecutionArea::saveAsView()
|
|
{
|
|
// Let the user select a name for the new view and make sure it doesn't already exist
|
|
QString name;
|
|
while(true)
|
|
{
|
|
name = QInputDialog::getText(this, qApp->applicationName(), tr("Please specify the view name")).trimmed();
|
|
if(name.isEmpty())
|
|
break;
|
|
if(!db->getObjectByName(name).getname().isEmpty())
|
|
QMessageBox::warning(this, qApp->applicationName(), tr("There is already an object with that name. Please choose a different name."));
|
|
else
|
|
break;
|
|
}
|
|
if(name.isEmpty())
|
|
return;
|
|
|
|
// Create the view
|
|
if(db->executeSQL(QString("CREATE VIEW `%1` AS %2;").arg(name).arg(model->query())))
|
|
QMessageBox::information(this, qApp->applicationName(), tr("View successfully created."));
|
|
else
|
|
QMessageBox::warning(this, qApp->applicationName(), tr("Error creating view: %1").arg(db->lastErrorMessage));
|
|
}
|