1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
#ifndef TABLEWINDOW_H
#define TABLEWINDOW_H
#include "db/db.h"
#include "mdichild.h"
#include "common/extactioncontainer.h"
#include "parser/ast/sqlitecreatetable.h"
#include "parser/ast/sqlitecreateindex.h"
#include "dialogs/constraintdialog.h"
#include "db/chainexecutor.h"
#include "guiSQLiteStudio_global.h"
#include <QPointer>
class TableModifier;
class SqlTableModel;
class ExtLineEdit;
class IntValidator;
class QLabel;
class TableStructureModel;
class TableConstraintsModel;
class QProgressBar;
class WidgetCover;
class SqliteSyntaxHighlighter;
class CenteredIconItemDelegate;
class ConstraintTabModel;
namespace Ui {
class TableWindow;
}
CFG_KEY_LIST(TableWindow, QObject::tr("Table window"),
CFG_KEY_ENTRY(REFRESH_STRUCTURE, Qt::Key_F5, QObject::tr("Refresh table structure"))
CFG_KEY_ENTRY(ADD_COLUMN, Qt::Key_Insert, QObject::tr("Add new column"))
CFG_KEY_ENTRY(EDIT_COLUMN, Qt::Key_Return, QObject::tr("Edit selected column"))
CFG_KEY_ENTRY(DEL_COLUMN, Qt::Key_Delete, QObject::tr("Delete selected column"))
CFG_KEY_ENTRY(EXPORT, Qt::CTRL + Qt::Key_E, QObject::tr("Export table data"))
CFG_KEY_ENTRY(IMPORT, Qt::CTRL + Qt::Key_I, QObject::tr("Import data to the table"))
CFG_KEY_ENTRY(ADD_TABLE_CONSTRAINT, Qt::Key_Insert, QObject::tr("Add new table constraint"))
CFG_KEY_ENTRY(EDIT_TABLE_CONSTRAINT, Qt::Key_Return, QObject::tr("Edit selected table constraint"))
CFG_KEY_ENTRY(DEL_TABLE_CONSTRAINT, Qt::Key_Delete, QObject::tr("Delete selected table constraint"))
CFG_KEY_ENTRY(REFRESH_INDEXES, Qt::Key_F5, QObject::tr("Refresh table index list"))
CFG_KEY_ENTRY(ADD_INDEX, Qt::Key_Insert, QObject::tr("Add new index"))
CFG_KEY_ENTRY(EDIT_INDEX, Qt::Key_Return, QObject::tr("Edit selected index"))
CFG_KEY_ENTRY(DEL_INDEX, Qt::Key_Delete, QObject::tr("Delete selected index"))
CFG_KEY_ENTRY(REFRESH_TRIGGERS, Qt::Key_F5, QObject::tr("Refresh table trigger list"))
CFG_KEY_ENTRY(ADD_TRIGGER, Qt::Key_Insert, QObject::tr("Add new trigger"))
CFG_KEY_ENTRY(EDIT_TRIGGER, Qt::Key_Return, QObject::tr("Edit selected trigger"))
CFG_KEY_ENTRY(DEL_TRIGGER, Qt::Key_Delete, QObject::tr("Delete selected trigger"))
CFG_KEY_ENTRY(NEXT_TAB, Qt::ALT + Qt::Key_Right, QObject::tr("Go to next tab"))
CFG_KEY_ENTRY(PREV_TAB, Qt::ALT + Qt::Key_Left, QObject::tr("Go to previous tab"))
)
class GUI_API_EXPORT TableWindow : public MdiChild
{
Q_OBJECT
Q_ENUMS(Action)
public:
enum Action
{
// Structure tab
REFRESH_STRUCTURE,
COMMIT_STRUCTURE,
ROLLBACK_STRUCTURE,
ADD_COLUMN,
EDIT_COLUMN,
DEL_COLUMN,
MOVE_COLUMN_UP,
MOVE_COLUMN_DOWN,
ADD_TABLE_CONSTRAINT,
EDIT_TABLE_CONSTRAINT,
DEL_TABLE_CONSTRAINT,
ADD_TABLE_PK,
ADD_TABLE_FK,
ADD_TABLE_UNIQUE,
ADD_TABLE_CHECK,
MOVE_CONSTRAINT_UP,
MOVE_CONSTRAINT_DOWN,
EXPORT,
IMPORT,
POPULATE,
CREATE_SIMILAR,
RESET_AUTOINCREMENT,
// Indexes tab
REFRESH_INDEXES,
ADD_INDEX,
EDIT_INDEX,
DEL_INDEX,
// Triggers tab
REFRESH_TRIGGERS,
ADD_TRIGGER,
EDIT_TRIGGER,
DEL_TRIGGER,
// All tabs
NEXT_TAB,
PREV_TAB
};
enum ToolBar
{
TOOLBAR_STRUCTURE,
TOOLBAR_INDEXES,
TOOLBAR_TRIGGERS
};
explicit TableWindow(QWidget *parent = 0);
TableWindow(Db* db, QWidget *parent = 0);
TableWindow(const TableWindow& win);
TableWindow(QWidget *parent, Db* db, const QString& database, const QString& table);
~TableWindow();
static void staticInit();
static void insertAction(ExtActionPrototype* action, ToolBar toolbar = TOOLBAR_STRUCTURE);
static void insertActionBefore(ExtActionPrototype* action, Action beforeAction, ToolBar toolbar = TOOLBAR_STRUCTURE);
static void insertActionAfter(ExtActionPrototype* action, Action afterAction, ToolBar toolbar = TOOLBAR_STRUCTURE);
static void removeAction(ExtActionPrototype* action, ToolBar toolbar = TOOLBAR_STRUCTURE);
QString getTable() const;
Db* getDb() const;
bool handleInitialFocus();
bool isUncommitted() const;
QString getQuitUncommittedConfirmMessage() const;
void useCurrentTableAsBaseForNew();
Db* getAssociatedDb() const;
protected:
void changeEvent(QEvent *e);
QVariant saveSession();
bool restoreSession(const QVariant& sessionValue);
Icon* getIconNameForMdiWindow();
QString getTitleForMdiWindow();
void createActions();
void setupDefShortcuts();
bool restoreSessionNextTime();
QToolBar* getToolBar(int toolbar) const;
private:
void init();
void newTable();
void parseDdl();
void initDbAndTable();
void setupCoverWidget();
void createStructureActions();
void createDataGridActions();
void createDataFormActions();
void createIndexActions();
void createTriggerActions();
void editColumn(const QModelIndex& idx);
void delColumn(const QModelIndex& idx);
void editConstraint(const QModelIndex& idx);
void delConstraint(const QModelIndex& idx);
void executeStructureChanges();
void updateAfterInit();
QModelIndex structureCurrentIndex() const;
void addConstraint(ConstraintDialog::Constraint mode);
bool validate(bool skipWarning = false);
bool isModified() const;
TokenList indexColumnTokens(SqliteCreateIndexPtr index);
QString getCurrentIndex() const;
QString getCurrentTrigger() const;
void applyInitialTab();
void resizeStructureViewColumns();
int getDataTabIdx() const;
int getStructureTabIdx() const;
int newTableWindowNum = 1;
Db* db = nullptr;
QString database;
QString table;
Ui::TableWindow *ui = nullptr;
SqlTableModel* dataModel = nullptr;
bool dataLoaded = false;
bool existingTable = true;
SqliteCreateTablePtr createTable;
SqliteCreateTablePtr originalCreateTable;
TableStructureModel* structureModel = nullptr;
TableConstraintsModel* structureConstraintsModel = nullptr;
ConstraintTabModel* constraintTabModel = nullptr;
WidgetCover* widgetCover = nullptr;
ChainExecutor* structureExecutor = nullptr;
TableModifier* tableModifier = nullptr;
bool modifyingThisTable = false;
CenteredIconItemDelegate* constraintColumnsDelegate = nullptr;
bool tabsMoving = false;
private slots:
void executionSuccessful();
void executionFailed(const QString& errorText);
void dbClosedFinalCleanup();
void checkIfTableDeleted(const QString& database, const QString& object, DbObjectType type);
void checkIfIndexDeleted(const QString& object);
void checkIfTriggerDeleted(const QString& object);
void refreshStructure();
void commitStructure(bool skipWarning = false);
void changesSuccessfullyCommitted();
void changesFailedToCommit(int errorCode, const QString& errorText);
void rollbackStructure();
void resetAutoincrement();
void editColumn();
void delColumn();
void moveColumnUp();
void moveColumnDown();
void addConstraint();
void editConstraint();
void delConstraint();
void moveConstraintUp();
void moveConstraintDown();
void addPk();
void addFk();
void addUnique();
void addCheck();
void exportTable();
void importTable();
void populateTable();
void createSimilarTable();
void tabChanged(int newTab);
void updateStructureToolbarState();
void updateStructureCommitState();
void updateTableConstraintsToolbarState();
void updateDdlTab();
void updateNewTableState();
void structureViewDoubleClicked(const QModelIndex &index);
void constraintsViewDoubleClicked(const QModelIndex &index);
void nameChanged();
void withOutRowIdChanged();
void addIndex();
void editCurrentIndex();
void indexViewDoubleClicked(const QModelIndex& idx);
void triggerViewDoubleClicked(const QModelIndex& idx);
void delIndex();
void addTrigger();
void editTrigger();
void delTrigger();
void updateIndexesState();
void updateTriggersState();
void nextTab();
void prevTab();
void updateTabsOrder();
void updateFont();
public slots:
void updateIndexes();
void updateTriggers();
void addColumn();
void editColumn(const QString& columnName);
void delColumn(const QString& columnName);
signals:
void modifyStatusChanged();
};
#endif // TABLEWINDOW_H
|