Files
sqlitebrowser/src/MainWindow.h
mgrojo 2b15029be5 Button for new Un/Comment Block feature
A new button has been added to the "Execute SQL" toolbar for invoking the
new Un/Comment Block feature.

See issue #1614
2018-11-23 18:35:52 +01:00

318 lines
9.6 KiB
C++

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "sqlitedb.h"
#include "PlotDock.h"
#include "Palette.h"
#include "CondFormat.h"
#include "sql/Query.h"
#include <QMainWindow>
#include <QMap>
class EditDialog;
class SqliteTableModel;
class DbStructureModel;
class RemoteDock;
class RemoteDatabase;
class FindReplaceDialog;
class ExtendedTableWidget;
class QDragEnterEvent;
class QIntValidator;
class QModelIndex;
class QLabel;
class QPersistentModelIndex;
class QToolButton;
namespace Ui {
class MainWindow;
}
struct BrowseDataTableSettings
{
sqlb::Query query; // NOTE: We only store the sort order in here (for now)
QMap<int, int> columnWidths;
QMap<int, QString> filterValues;
QMap<int, QVector<CondFormat>> condFormats;
QMap<int, QString> displayFormats;
bool showRowid;
QString encoding;
QString plotXAxis;
QMap<QString, PlotDock::PlotSettings> plotYAxes;
QString unlockViewPk;
QMap<int, bool> hiddenColumns;
BrowseDataTableSettings() :
showRowid(false)
{
}
friend QDataStream& operator>>(QDataStream& stream, BrowseDataTableSettings& object)
{
int sortOrderIndex, sortOrderMode;
stream >> sortOrderIndex;
stream >> sortOrderMode;
object.query.orderBy().emplace_back(sortOrderIndex, sortOrderMode == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending);
stream >> object.columnWidths;
stream >> object.filterValues;
stream >> object.displayFormats;
stream >> object.showRowid;
stream >> object.encoding;
// Versions pre 3.10.0 didn't store the following information in their project files.
// To be absolutely sure that nothing strange happens when we read past the stream for
// those cases, check for the end of the stream here.
if(stream.atEnd())
return stream;
stream >> object.plotXAxis;
stream >> object.plotYAxes;
stream >> object.unlockViewPk;
// Project files from versions before 3.11.0 didn't have these fields
if(stream.atEnd())
return stream;
stream >> object.hiddenColumns;
return stream;
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget* parent = nullptr);
~MainWindow() override;
DBBrowserDB& getDb() { return db; }
RemoteDatabase& getRemote() { return *m_remoteDb; }
enum Tabs
{
StructureTab,
BrowseTab,
PragmaTab,
ExecuteTab
};
private:
struct PragmaValues
{
int autovacuum;
int automatic_index;
int checkpoint_fullsync;
int foreign_keys;
int fullfsync;
int ignore_check_constraints;
QString journal_mode;
int journal_size_limit;
QString locking_mode;
int max_page_count;
int page_size;
int recursive_triggers;
int secure_delete;
int synchronous;
int temp_store;
int user_version;
int wal_autocheckpoint;
int case_sensitive_like;
} pragmaValues;
enum StatementType
{
SelectStatement,
AlterStatement,
DropStatement,
RollbackStatement,
PragmaStatement,
VacuumStatement,
InsertStatement,
UpdateStatement,
DeleteStatement,
CreateStatement,
AttachStatement,
DetachStatement,
OtherStatement,
};
Ui::MainWindow* ui;
DBBrowserDB db;
/// the table model used in the "Browse Data" page (re-used and
/// re-initialized when switching to another table)
SqliteTableModel* m_browseTableModel;
SqliteTableModel* m_currentTabTableModel;
QMenu* popupTableMenu;
QMenu* popupSchemaDockMenu;
QMenu* recentFilesMenu;
QMenu* popupOpenDbMenu;
QMenu* popupNewRecordMenu;
QMenu* popupSaveSqlFileMenu;
QMenu* popupSaveSqlResultsMenu;
QMenu* popupSaveFilterAsMenu;
QMenu* popupBrowseDataHeaderMenu;
QLabel* statusEncodingLabel;
QLabel* statusEncryptionLabel;
QLabel* statusReadOnlyLabel;
QToolButton* statusStopButton;
QLabel* statusBusyLabel;
DbStructureModel* dbStructureModel;
static const int MaxRecentFiles = 5;
QAction *recentFileActs[MaxRecentFiles];
QAction *recentSeparatorAct;
QMap<sqlb::ObjectIdentifier, BrowseDataTableSettings> browseTableSettings;
RemoteDatabase* m_remoteDb;
EditDialog* editDock;
PlotDock* plotDock;
RemoteDock* remoteDock;
FindReplaceDialog* findReplaceDialog;
QIntValidator* gotoValidator;
QString defaultBrowseTableEncoding;
Palette m_condFormatPalette;
void init();
void clearCompleterModelsFields();
void updateRecentFileActions();
void setCurrentFile(const QString& fileName);
void addToRecentFilesMenu(const QString& filename);
void activateFields(bool enable = true);
void enableEditing(bool enable_edit);
void saveAsView(QString query);
void duplicateRecord(int currentRow);
void selectTableLine(int lineToSelect);
void attachPlot(ExtendedTableWidget* tableWidget, SqliteTableModel* model, BrowseDataTableSettings* settings = nullptr, bool keepOrResetSelection = true);
sqlb::ObjectIdentifier currentlyBrowsedTableName() const;
StatementType getQueryType(const QString& query) const;
void applyBrowseTableSettings(BrowseDataTableSettings storedData, bool skipFilters = false);
protected:
void closeEvent(QCloseEvent *) override;
void dragEnterEvent(QDragEnterEvent *event) override;
void dropEvent(QDropEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void keyPressEvent(QKeyEvent* event) override;
public slots:
bool fileOpen(const QString& fileName = QString(), bool dontAddToRecentFiles = false, bool readOnly = false);
void logSql(const QString &sql, int msgtype);
void dbState(bool dirty);
void refresh();
void jumpToRow(const sqlb::ObjectIdentifier& table, QString column, const QByteArray& value);
void switchToBrowseDataTab(QString tableToBrowse = QString());
void populateStructure(const QString& old_table = QString());
private slots:
void createTreeContextMenu(const QPoint & qPoint);
void createSchemaDockContextMenu(const QPoint & qPoint);
void changeTreeSelection();
void fileNew();
void fileNewInMemoryDatabase();
void populateTable();
void clearTableBrowser();
bool fileClose();
void addRecord();
void insertValues();
void deleteRecord();
void navigatePrevious();
void navigateNext();
void navigateBegin();
void navigateEnd();
void navigateGoto();
void setRecordsetLabel();
void createTable();
void createIndex();
void compact();
void deleteObject();
void editObject();
void helpWhatsThis();
void helpAbout();
void updateRecordText(const QPersistentModelIndex& idx, const QByteArray& text, bool isBlob);
void toggleEditDock(bool visible);
void dataTableSelectionChanged(const QModelIndex& index);
void doubleClickTable(const QModelIndex& index);
void executeQuery();
void importTableFromCSV();
void exportTableToCSV();
void exportTableToJson();
void fileSave();
void fileRevert();
void exportDatabaseToSQL();
void importDatabaseFromSQL();
void openPreferences();
void openRecentFile();
void loadPragmas();
void updatePragmaUi();
void savePragmas();
void mainTabSelected( int tabindex );
void browseTableHeaderClicked(int logicalindex);
unsigned int openSqlTab(bool resetCounter = false);
void closeSqlTab(int index, bool force = false);
void changeSqlTab(int index);
void openSqlFile();
void saveSqlFile();
void saveSqlFileAs();
void saveSqlResultsAsCsv();
void saveSqlResultsAsView();
void loadExtension();
void reloadSettings();
void checkNewVersion(const QString& versionstring, const QString& url);
void on_actionWiki_triggered();
void on_actionBug_report_triggered();
void on_actionFeature_Request_triggered();
void on_actionSqlCipherFaq_triggered();
void on_actionWebsite_triggered();
void on_actionDonatePatreon_triggered();
void updateBrowseDataColumnWidth(int section, int /*old_size*/, int new_size);
bool loadProject(QString filename = QString(), bool readOnly = false);
void saveProject();
void fileAttach();
void updateFilter(int column, const QString& value);
void addCondFormat(int column, const QString& value);
void clearAllCondFormats(int column);
void editEncryption();
void on_buttonClearFilters_clicked();
void copyCurrentCreateStatement();
void showDataColumnPopupMenu(const QPoint& pos);
void showRecordPopupMenu(const QPoint& pos);
void editDataColumnDisplayFormat();
void showRowidColumn(bool show, bool skipFilters = false);
void browseDataSetTableEncoding(bool forAllTables = false);
void browseDataSetDefaultTableEncoding();
void fileOpenReadOnly();
void unlockViewEditing(bool unlock, QString pk = QString());
void hideColumns(int column = -1, bool hide = true);
void on_actionShowAllColumns_triggered();
void requestCollation(const QString& name, int eTextRep);
void renameSqlTab(int index);
void setFindFrameVisibility(bool show);
void openFindReplaceDialog();
void toggleSqlBlockComment();
void openSqlPrintDialog();
void saveFilterAsView();
void exportFilteredTable();
void updateInsertDeleteRecordButton();
void runSqlNewTab(const QString& query, const QString& title);
void printDbStructure();
void updateDatabaseBusyStatus(bool busy, const QString& user);
};
#endif