#include "SqlDocument.h" #include "util/SqlSyntaxHighlighter.h" #include #include #include #include #include #include #include #include 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)")); }