143 lines
3.1 KiB
C++
143 lines
3.1 KiB
C++
#include "SqlDocument.h"
|
|
#include "util/SqlSyntaxHighlighter.h"
|
|
#include <QFile>
|
|
#include <QFileDialog>
|
|
#include <QFileInfo>
|
|
#include <QStandardPaths>
|
|
#include <QStringConverter>
|
|
#include <QPlainTextDocumentLayout>
|
|
#include <QTextDocument>
|
|
#include <QTextStream>
|
|
|
|
SqlDocument::SqlDocument(QObject *parent)
|
|
: QObject(parent)
|
|
, m_document(new QTextDocument(this))
|
|
, m_highlighter(new SqlSyntaxHighlighter(m_document))
|
|
{
|
|
// QPlainTextEdit only accepts documents that use a QPlainTextDocumentLayout
|
|
m_document->setDocumentLayout(new QPlainTextDocumentLayout(m_document));
|
|
connect(m_document, &QTextDocument::modificationChanged, this, &SqlDocument::modifiedChanged);
|
|
setFileName(tr("new"));
|
|
}
|
|
|
|
SqlDocument::~SqlDocument() = default;
|
|
|
|
bool SqlDocument::isModified() const
|
|
{
|
|
return m_document->isModified();
|
|
}
|
|
|
|
void SqlDocument::setModified(bool modified)
|
|
{
|
|
m_document->setModified(modified);
|
|
}
|
|
|
|
void SqlDocument::clear()
|
|
{
|
|
m_document->clear();
|
|
setFileName(tr("new"));
|
|
m_new = true;
|
|
setModified(false);
|
|
}
|
|
|
|
bool SqlDocument::load(const QString &filename)
|
|
{
|
|
bool result = false;
|
|
QFile file(filename);
|
|
if (file.open(QIODevice::ReadOnly)) {
|
|
QByteArray ba = file.readAll();
|
|
auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
|
|
QString text = toUtf16(ba);
|
|
if (toUtf16.hasError()) {
|
|
file.reset();
|
|
QTextStream stream(&file);
|
|
text = stream.readAll();
|
|
}
|
|
|
|
m_document->setPlainText(text);
|
|
setModified(false);
|
|
setFileName(filename);
|
|
m_new = false;
|
|
result = true;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool SqlDocument::save(QWidget *parent)
|
|
{
|
|
bool result;
|
|
if (m_fileName.isEmpty() || m_new) {
|
|
result = saveAs(parent);
|
|
}
|
|
else {
|
|
result = saveSqlTo(m_fileName);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool SqlDocument::saveAs(QWidget *parent)
|
|
{
|
|
bool result = false;
|
|
QString filename = promptUserForSaveSqlFilename(parent);
|
|
if (!filename.isEmpty()) {
|
|
result = saveSqlTo(filename);
|
|
if (result) {
|
|
setFileName(filename);
|
|
m_new = false;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool SqlDocument::saveCopyAs(QWidget *parent)
|
|
{
|
|
bool result = false;
|
|
QString filename = promptUserForSaveSqlFilename(parent);
|
|
if (!filename.isEmpty()) {
|
|
result = saveSqlTo(filename);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void SqlDocument::addEditor(QWidget *editor)
|
|
{
|
|
if (!m_editors.contains(editor))
|
|
m_editors.append(editor);
|
|
}
|
|
|
|
void SqlDocument::removeEditor(QWidget *editor)
|
|
{
|
|
m_editors.removeAll(editor);
|
|
}
|
|
|
|
void SqlDocument::setFileName(const QString &filename)
|
|
{
|
|
m_fileName = filename;
|
|
emit fileNameChanged();
|
|
}
|
|
|
|
bool SqlDocument::saveSqlTo(const QString &filename)
|
|
{
|
|
bool result = false;
|
|
|
|
QFile file(filename);
|
|
if (file.open(QIODevice::WriteOnly)) {
|
|
QTextStream stream(&file);
|
|
stream.setEncoding(QStringConverter::Utf8);
|
|
QString text = m_document->toPlainText();
|
|
stream << text;
|
|
|
|
stream.flush();
|
|
if (stream.status() == QTextStream::Ok) {
|
|
setModified(false);
|
|
result = true;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
QString SqlDocument::promptUserForSaveSqlFilename(QWidget *parent)
|
|
{
|
|
QString home_dir = QStandardPaths::locate(QStandardPaths::HomeLocation, "", QStandardPaths::LocateDirectory);
|
|
return QFileDialog::getSaveFileName(parent, tr("Save query"), home_dir, tr("SQL file (*.sql)"));
|
|
}
|