2018-11-29 20:21:36 +01:00
|
|
|
|
#include "ColumnPage.h"
|
2019-02-09 14:59:33 +01:00
|
|
|
|
|
2018-11-29 20:21:36 +01:00
|
|
|
|
#include "ColumnTableModel.h"
|
|
|
|
|
|
#include "CustomFilterSortModel.h"
|
|
|
|
|
|
#include "CustomDataRole.h"
|
2019-02-09 14:59:33 +01:00
|
|
|
|
#include "PgLabTableView.h"
|
|
|
|
|
|
#include "ResultTableModelUtil.h"
|
|
|
|
|
|
#include "SqlCodePreview.h"
|
|
|
|
|
|
//#include "PgLabItemDelegate.h"
|
|
|
|
|
|
#include "SqlFormattingUtils.h"
|
|
|
|
|
|
#include "UserConfiguration.h"
|
|
|
|
|
|
#include "catalog/PgClass.h"
|
|
|
|
|
|
#include <QSortFilterProxyModel>
|
2019-07-07 14:37:42 +02:00
|
|
|
|
#include <QStyledItemDelegate>
|
2018-11-29 20:21:36 +01:00
|
|
|
|
#include <QStringBuilder>
|
2018-12-23 08:39:38 +01:00
|
|
|
|
#include <unordered_set>
|
2018-11-29 20:21:36 +01:00
|
|
|
|
|
|
|
|
|
|
ColumnPage::ColumnPage(QWidget *parent)
|
|
|
|
|
|
: QSplitter(Qt::Vertical, parent)
|
|
|
|
|
|
{
|
2018-12-29 17:54:54 +01:00
|
|
|
|
m_tableView = new PgLabTableView(this);
|
2018-11-29 20:21:36 +01:00
|
|
|
|
m_definitionView = new SqlCodePreview(this);
|
|
|
|
|
|
addWidget(m_tableView);
|
|
|
|
|
|
addWidget(m_definitionView);
|
|
|
|
|
|
|
|
|
|
|
|
m_columnModel = new ColumnTableModel(this);
|
2019-02-09 14:59:33 +01:00
|
|
|
|
m_sortFilterProxy = new QSortFilterProxyModel(this);
|
2018-11-29 20:21:36 +01:00
|
|
|
|
m_sortFilterProxy->setSourceModel(m_columnModel);
|
2019-07-07 14:37:42 +02:00
|
|
|
|
m_tableView->setItemDelegateForColumn(ColumnTableModel::TypeCol, new QStyledItemDelegate(this));
|
2018-11-29 20:21:36 +01:00
|
|
|
|
m_tableView->setModel(m_sortFilterProxy);
|
|
|
|
|
|
m_tableView->setSortingEnabled(true);
|
|
|
|
|
|
m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
2018-12-16 12:49:44 +01:00
|
|
|
|
m_sortFilterProxy->sort(ColumnTableModel::AttnumCol, Qt::AscendingOrder);
|
2018-11-29 20:21:36 +01:00
|
|
|
|
|
|
|
|
|
|
connect(m_tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
|
|
|
|
|
|
this, &ColumnPage::tableView_selectionChanged);
|
2019-10-06 13:52:45 +02:00
|
|
|
|
connect(m_columnModel, &ColumnTableModel::modelReset, m_definitionView, &SqlCodePreview::clear);
|
2018-11-29 20:21:36 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ColumnPage::setData(std::shared_ptr<const PgDatabaseCatalog> cat, const std::optional<PgClass> &cls)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_catalog = cat;
|
|
|
|
|
|
m_definitionView->setCatalog(cat);
|
|
|
|
|
|
m_columnModel->setData(cat, cls);
|
|
|
|
|
|
m_Class = cls;
|
2018-12-16 20:38:57 +01:00
|
|
|
|
m_tableView->resizeColumnsToContents();
|
2018-11-29 20:21:36 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ColumnPage::tableView_selectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/)
|
|
|
|
|
|
{
|
|
|
|
|
|
auto&& indexes = m_tableView->selectionModel()->selectedIndexes();
|
2018-12-23 08:39:38 +01:00
|
|
|
|
std::unordered_set<int> rijen;
|
2018-11-29 20:21:36 +01:00
|
|
|
|
for (const auto &e : indexes)
|
|
|
|
|
|
rijen.insert(m_sortFilterProxy->mapToSource(e).row());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QString drops;
|
|
|
|
|
|
QString addsql;
|
|
|
|
|
|
auto iter = rijen.begin();
|
|
|
|
|
|
if (iter != rijen.end()) {
|
|
|
|
|
|
auto && col = m_columnModel->column(*iter);
|
|
|
|
|
|
drops = "ALTER TABLE " % m_Class->fullyQualifiedQuotedObjectName() % "\n DROP COLUMN " % quoteIdent(col.name);
|
|
|
|
|
|
addsql = "ALTER TABLE " % m_Class->fullyQualifiedQuotedObjectName() % "\n ADD COLUMN " % col.columnDefinition(*m_catalog);
|
|
|
|
|
|
for (++iter; iter != rijen.end(); ++iter) {
|
|
|
|
|
|
auto && col = m_columnModel->column(*iter);
|
|
|
|
|
|
drops += ",\n DROP COLUMN " % quoteIdent(col.name);
|
|
|
|
|
|
addsql += ",\n ADD COLUMN " % col.columnDefinition(*m_catalog);
|
|
|
|
|
|
}
|
|
|
|
|
|
drops += ";";
|
|
|
|
|
|
addsql += ";";
|
|
|
|
|
|
m_definitionView->setPlainText(drops % "\n\n" % addsql);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
m_definitionView->setPlainText("");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|