From feda8a7db8d1d7c5439aa8f8feef7cc0dd2b59a0 Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Fri, 27 Jul 2018 23:51:12 -0400 Subject: New upstream version 3.2.1+dfsg1 --- SQLiteStudio3/guiSQLiteStudio/.DS_Store | Bin 0 -> 8196 bytes SQLiteStudio3/guiSQLiteStudio/common/bindparam.h | 15 + .../guiSQLiteStudio/common/datawidgetmapper.cpp | 2 + .../guiSQLiteStudio/common/extactioncontainer.cpp | 11 +- .../guiSQLiteStudio/common/extactioncontainer.h | 1 + .../guiSQLiteStudio/common/userinputfilter.cpp | 17 +- .../guiSQLiteStudio/common/userinputfilter.h | 6 +- SQLiteStudio3/guiSQLiteStudio/configmapper.cpp | 16 +- .../constraints/columndefaultpanel.cpp | 14 +- .../constraints/columnforeignkeypanel.cpp | 2 +- .../constraints/columnprimarykeypanel.cpp | 6 - .../constraints/tableforeignkeypanel.cpp | 16 +- .../constraints/tablepkanduniquepanel.cpp | 11 +- .../constraints/tableprimarykeypanel.cpp | 3 +- .../guiSQLiteStudio/datagrid/sqlqueryitem.cpp | 4 +- .../datagrid/sqlqueryitemdelegate.cpp | 64 +- .../guiSQLiteStudio/datagrid/sqlquerymodel.cpp | 138 +- .../guiSQLiteStudio/datagrid/sqlquerymodel.h | 53 +- .../datagrid/sqlquerymodelcolumn.cpp | 10 +- .../guiSQLiteStudio/datagrid/sqlqueryview.cpp | 237 +- .../guiSQLiteStudio/datagrid/sqlqueryview.h | 26 +- .../guiSQLiteStudio/datagrid/sqltablemodel.cpp | 95 +- .../guiSQLiteStudio/datagrid/sqltablemodel.h | 8 + SQLiteStudio3/guiSQLiteStudio/dataview.cpp | 292 +- SQLiteStudio3/guiSQLiteStudio/dataview.h | 19 +- SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp | 2 +- SQLiteStudio3/guiSQLiteStudio/dbobjectdialogs.cpp | 4 +- SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp | 309 +- SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.h | 30 +- .../guiSQLiteStudio/dbtree/dbtreemodel.cpp | 44 +- SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.h | 2 +- .../guiSQLiteStudio/dbtree/dbtreeview.cpp | 2 +- .../guiSQLiteStudio/dialogs/aboutdialog.ui | 4 +- .../guiSQLiteStudio/dialogs/bindparamsdialog.cpp | 133 + .../guiSQLiteStudio/dialogs/bindparamsdialog.h | 41 + .../guiSQLiteStudio/dialogs/bindparamsdialog.ui | 97 + .../guiSQLiteStudio/dialogs/bugdialog.cpp | 219 - SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.h | 42 - SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.ui | 208 - .../dialogs/bugreportlogindialog.cpp | 94 - .../guiSQLiteStudio/dialogs/bugreportlogindialog.h | 40 - .../dialogs/bugreportlogindialog.ui | 132 - .../guiSQLiteStudio/dialogs/columndialog.cpp | 43 +- .../guiSQLiteStudio/dialogs/columndialog.h | 3 + .../guiSQLiteStudio/dialogs/configdialog.cpp | 43 +- .../guiSQLiteStudio/dialogs/configdialog.ui | 106 +- SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp | 11 +- .../guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp | 2 +- .../guiSQLiteStudio/dialogs/execfromfiledialog.cpp | 76 + .../guiSQLiteStudio/dialogs/execfromfiledialog.h | 32 + .../guiSQLiteStudio/dialogs/execfromfiledialog.ui | 125 + .../guiSQLiteStudio/dialogs/exportdialog.cpp | 79 +- .../guiSQLiteStudio/dialogs/exportdialog.h | 4 + .../dialogs/fileexecerrorsdialog.cpp | 35 + .../guiSQLiteStudio/dialogs/fileexecerrorsdialog.h | 26 + .../dialogs/fileexecerrorsdialog.ui | 132 + .../guiSQLiteStudio/dialogs/importdialog.cpp | 50 +- .../guiSQLiteStudio/dialogs/importdialog.h | 3 + .../guiSQLiteStudio/dialogs/indexdialog.cpp | 4 +- .../guiSQLiteStudio/dialogs/indexdialog.ui | 4 +- .../guiSQLiteStudio/dialogs/newversiondialog.cpp | 11 +- .../guiSQLiteStudio/dialogs/newversiondialog.ui | 7 +- .../guiSQLiteStudio/dialogs/populatedialog.cpp | 72 +- .../guiSQLiteStudio/dialogs/populatedialog.h | 10 +- .../guiSQLiteStudio/dialogs/triggerdialog.cpp | 6 +- .../guiSQLiteStudio/dialogs/triggerdialog.ui | 6 + SQLiteStudio3/guiSQLiteStudio/formmanager.cpp | 4 +- SQLiteStudio3/guiSQLiteStudio/formview.cpp | 12 +- SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro | 34 +- SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc | 2 + SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp | 4 +- SQLiteStudio3/guiSQLiteStudio/iconmanager.h | 10 + SQLiteStudio3/guiSQLiteStudio/icons.qrc | 10 + SQLiteStudio3/guiSQLiteStudio/img/brick.png | Bin 0 -> 452 bytes SQLiteStudio3/guiSQLiteStudio/img/brick_add.png | Bin 0 -> 729 bytes SQLiteStudio3/guiSQLiteStudio/img/brick_delete.png | Bin 0 -> 745 bytes SQLiteStudio3/guiSQLiteStudio/img/brick_error.png | Bin 0 -> 798 bytes SQLiteStudio3/guiSQLiteStudio/img/brick_folder.png | Bin 0 -> 735 bytes .../guiSQLiteStudio/img/execute_sql_from_file.png | Bin 0 -> 793 bytes SQLiteStudio3/guiSQLiteStudio/img/save_file.png | Bin 0 -> 507 bytes SQLiteStudio3/guiSQLiteStudio/img/zoom.png | Bin 0 -> 692 bytes SQLiteStudio3/guiSQLiteStudio/img/zoom_in.png | Bin 0 -> 725 bytes SQLiteStudio3/guiSQLiteStudio/img/zoom_out.png | Bin 0 -> 708 bytes SQLiteStudio3/guiSQLiteStudio/license.txt | 502 -- SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp | 148 +- SQLiteStudio3/guiSQLiteStudio/mainwindow.h | 13 +- SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp | 16 +- .../guiSQLiteStudio/multieditor/multieditor.cpp | 145 +- .../guiSQLiteStudio/multieditor/multieditor.h | 18 +- .../multieditor/multieditorbool.cpp | 10 +- .../guiSQLiteStudio/multieditor/multieditorbool.h | 2 +- .../multieditor/multieditordate.cpp | 10 +- .../guiSQLiteStudio/multieditor/multieditordate.h | 3 +- .../multieditor/multieditordatetime.cpp | 12 +- .../multieditor/multieditordatetime.h | 2 +- .../guiSQLiteStudio/multieditor/multieditorhex.cpp | 12 +- .../guiSQLiteStudio/multieditor/multieditorhex.h | 2 +- .../multieditor/multieditornumeric.cpp | 12 +- .../multieditor/multieditornumeric.h | 2 +- .../multieditor/multieditortext.cpp | 11 +- .../guiSQLiteStudio/multieditor/multieditortext.h | 2 +- .../multieditor/multieditortime.cpp | 10 +- .../guiSQLiteStudio/multieditor/multieditortime.h | 3 +- .../multieditor/multieditorwidget.cpp | 12 +- .../multieditor/multieditorwidget.h | 7 +- .../multieditor/multieditorwidgetplugin.h | 1 + SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.h | 2 +- SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp | 100 +- SQLiteStudio3/guiSQLiteStudio/sqleditor.h | 17 +- .../guiSQLiteStudio/sqlitesyntaxhighlighter.cpp | 8 +- SQLiteStudio3/guiSQLiteStudio/statusfield.cpp | 6 +- SQLiteStudio3/guiSQLiteStudio/taskbar.cpp | 24 +- .../translations/guiSQLiteStudio_de.qm | Bin 131563 -> 117878 bytes .../translations/guiSQLiteStudio_de.ts | 2065 +++--- .../translations/guiSQLiteStudio_es.ts | 1962 +++--- .../translations/guiSQLiteStudio_fr.qm | Bin 136435 -> 123779 bytes .../translations/guiSQLiteStudio_fr.ts | 2399 ++++--- .../translations/guiSQLiteStudio_it.ts | 1954 +++--- .../translations/guiSQLiteStudio_pl.qm | Bin 163698 -> 170072 bytes .../translations/guiSQLiteStudio_pl.ts | 2049 +++--- .../translations/guiSQLiteStudio_pt_BR.ts | 1962 +++--- .../translations/guiSQLiteStudio_ro_RO.qm | Bin 0 -> 30 bytes .../translations/guiSQLiteStudio_ro_RO.ts | 6612 ++++++++++++++++++++ .../translations/guiSQLiteStudio_ru.qm | Bin 155959 -> 152875 bytes .../translations/guiSQLiteStudio_ru.ts | 2173 ++++--- .../translations/guiSQLiteStudio_sk.qm | Bin 96699 -> 84002 bytes .../translations/guiSQLiteStudio_sk.ts | 2036 +++--- .../translations/guiSQLiteStudio_zh_CN.qm | Bin 52503 -> 43220 bytes .../translations/guiSQLiteStudio_zh_CN.ts | 2075 +++--- SQLiteStudio3/guiSQLiteStudio/uidebug.cpp | 4 +- SQLiteStudio3/guiSQLiteStudio/uiutils.h | 2 + SQLiteStudio3/guiSQLiteStudio/widgetresizer.cpp | 5 + SQLiteStudio3/guiSQLiteStudio/widgetresizer.h | 1 + .../windows/bugreporthistorywindow.cpp | 155 - .../windows/bugreporthistorywindow.h | 65 - .../windows/bugreporthistorywindow.ui | 55 - .../guiSQLiteStudio/windows/collationseditor.cpp | 8 +- .../guiSQLiteStudio/windows/collationseditor.h | 2 +- .../guiSQLiteStudio/windows/collationseditor.ui | 6 +- .../windows/collationseditormodel.cpp | 22 +- .../windows/collationseditormodel.h | 2 +- .../guiSQLiteStudio/windows/constrainttabmodel.cpp | 8 +- .../guiSQLiteStudio/windows/ddlhistorywindow.cpp | 2 +- .../guiSQLiteStudio/windows/editorwindow.cpp | 98 +- .../guiSQLiteStudio/windows/editorwindow.h | 25 +- .../guiSQLiteStudio/windows/editorwindow.ui | 8 +- .../guiSQLiteStudio/windows/functionseditor.cpp | 10 +- .../guiSQLiteStudio/windows/functionseditor.ui | 18 +- .../windows/functionseditormodel.cpp | 18 +- .../windows/sqliteextensioneditor.cpp | 439 ++ .../windows/sqliteextensioneditor.h | 94 + .../windows/sqliteextensioneditor.ui | 191 + .../windows/sqliteextensioneditormodel.cpp | 234 + .../windows/sqliteextensioneditormodel.h | 65 + .../windows/tableconstraintsmodel.cpp | 8 +- .../windows/tablestructuremodel.cpp | 10 +- .../guiSQLiteStudio/windows/tablewindow.cpp | 18 +- .../guiSQLiteStudio/windows/viewwindow.cpp | 14 +- SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.h | 1 + .../guiSQLiteStudio/windows/viewwindow.ui | 8 +- 160 files changed, 21588 insertions(+), 9842 deletions(-) create mode 100644 SQLiteStudio3/guiSQLiteStudio/.DS_Store create mode 100644 SQLiteStudio3/guiSQLiteStudio/common/bindparam.h create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.cpp create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.h create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.ui delete mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp delete mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.h delete mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.ui delete mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.cpp delete mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.h delete mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.ui create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.cpp create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.h create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.ui create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.cpp create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.h create mode 100644 SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.ui create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/brick.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/brick_add.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/brick_delete.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/brick_error.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/brick_folder.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/execute_sql_from_file.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/save_file.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/zoom.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/zoom_in.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/zoom_out.png delete mode 100644 SQLiteStudio3/guiSQLiteStudio/license.txt create mode 100644 SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.qm create mode 100644 SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.ts delete mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.cpp delete mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.h delete mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.ui create mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.cpp create mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.h create mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.ui create mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.cpp create mode 100644 SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.h (limited to 'SQLiteStudio3/guiSQLiteStudio') diff --git a/SQLiteStudio3/guiSQLiteStudio/.DS_Store b/SQLiteStudio3/guiSQLiteStudio/.DS_Store new file mode 100644 index 0000000..74fa124 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/.DS_Store differ diff --git a/SQLiteStudio3/guiSQLiteStudio/common/bindparam.h b/SQLiteStudio3/guiSQLiteStudio/common/bindparam.h new file mode 100644 index 0000000..76cdac1 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/common/bindparam.h @@ -0,0 +1,15 @@ +#ifndef BINDPARAM_H +#define BINDPARAM_H + +#include +#include + +struct BindParam +{ + int position = 0; + QString originalName; + QString newName; + QVariant value; +}; + +#endif // BINDPARAM_H diff --git a/SQLiteStudio3/guiSQLiteStudio/common/datawidgetmapper.cpp b/SQLiteStudio3/guiSQLiteStudio/common/datawidgetmapper.cpp index 655a9aa..35e99c8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/common/datawidgetmapper.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/common/datawidgetmapper.cpp @@ -1,6 +1,7 @@ #include "datawidgetmapper.h" #include #include +#include DataWidgetMapper::DataWidgetMapper(QObject *parent) : QObject(parent) @@ -121,6 +122,7 @@ void DataWidgetMapper::submit() idx = model->index(currentIndex, entry->columnIndex); value = entry->widget->property(entry->propertyName.toLatin1().constData()); + qDebug() << "copying from form view for idx" << idx << "value:" << value; model->setData(idx, value, Qt::EditRole); } } diff --git a/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.cpp b/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.cpp index 8aaeefd..c67cc73 100644 --- a/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.cpp @@ -80,7 +80,7 @@ void ExtActionContainer::defShortcut(int action, CfgStringEntry *cfgEntry) void ExtActionContainer::setShortcutContext(const QList actions, Qt::ShortcutContext context) { - foreach (qint32 act, actions) + for (qint32 act : actions) actionMap[act]->setShortcutContext(context); } @@ -100,6 +100,11 @@ void ExtActionContainer::attachActionInMenu(QAction* parentAction, QAction* chil menu->addAction(childAction); } +void ExtActionContainer::addSeparatorInMenu(int parentAction, QToolBar* toolbar) +{ + addSeparatorInMenu(actionMap[parentAction], toolbar); +} + void ExtActionContainer::addSeparatorInMenu(QAction *parentAction, QToolBar* toolbar) { QMenu* menu = getMenuForAction(parentAction, toolbar); @@ -125,7 +130,7 @@ void ExtActionContainer::createAction(int action, QAction* qAction, const QObjec void ExtActionContainer::deleteActions() { - foreach (QAction* action, actionMap.values()) + for (QAction* action : actionMap.values()) delete action; actionMap.clear(); @@ -133,7 +138,7 @@ void ExtActionContainer::deleteActions() void ExtActionContainer::refreshShortcuts() { - foreach (int action, actionMap.keys()) + for (int action : actionMap.keys()) { if (!shortcuts.contains(action)) continue; diff --git a/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.h b/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.h index 0c860f7..159d4e5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.h +++ b/SQLiteStudio3/guiSQLiteStudio/common/extactioncontainer.h @@ -135,6 +135,7 @@ class GUI_API_EXPORT ExtActionContainer void attachActionInMenu(int parentAction, int childAction, QToolBar* toolbar); void attachActionInMenu(int parentAction, QAction* childAction, QToolBar* toolbar); void attachActionInMenu(QAction* parentAction, QAction* childAction, QToolBar* toolbar); + void addSeparatorInMenu(int parentAction, QToolBar* toolbar); void addSeparatorInMenu(QAction* parentAction, QToolBar *toolbar); void updateShortcutTips(); diff --git a/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.cpp b/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.cpp index 48ea46e..f3539d5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.cpp @@ -1,5 +1,6 @@ #include "userinputfilter.h" #include "common/unused.h" +#include "common/lazytrigger.h" #include #include @@ -7,27 +8,23 @@ UserInputFilter::UserInputFilter(QLineEdit* lineEdit, QObject* filterHandler, co QObject(lineEdit), lineEdit(lineEdit) { - timer = new QTimer(this); - timer->setSingleShot(false); - timer->setInterval(200); - connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterModified(QString))); - connect(timer, SIGNAL(timeout()), this, SLOT(applyFilter())); + trigger = new LazyTrigger(200, this); + connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterModified())); + connect(trigger, SIGNAL(triggered()), this, SLOT(applyFilter())); connect(this, SIGNAL(applyFilter(QString)), filterHandler, handlerSlot); } void UserInputFilter::setDelay(int msecs) { - timer->setInterval(msecs); + trigger->setDelay(msecs); } -void UserInputFilter::filterModified(const QString& newValue) +void UserInputFilter::filterModified() { - UNUSED(newValue); - timer->start(); + trigger->schedule(); } void UserInputFilter::applyFilter() { - timer->stop(); emit applyFilter(lineEdit->text()); } diff --git a/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.h b/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.h index 1b6f7ee..36d54ed 100644 --- a/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.h +++ b/SQLiteStudio3/guiSQLiteStudio/common/userinputfilter.h @@ -4,8 +4,8 @@ #include "guiSQLiteStudio_global.h" #include -class QTimer; class QLineEdit; +class LazyTrigger; class GUI_API_EXPORT UserInputFilter : public QObject { @@ -17,11 +17,11 @@ class GUI_API_EXPORT UserInputFilter : public QObject void setDelay(int msecs); private: - QTimer* timer = nullptr; + LazyTrigger* trigger = nullptr; QLineEdit* lineEdit = nullptr; private slots: - void filterModified(const QString& newValue); + void filterModified(); void applyFilter(); signals: diff --git a/SQLiteStudio3/guiSQLiteStudio/configmapper.cpp b/SQLiteStudio3/guiSQLiteStudio/configmapper.cpp index 8543d37..f4098bc 100644 --- a/SQLiteStudio3/guiSQLiteStudio/configmapper.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/configmapper.cpp @@ -195,12 +195,11 @@ QVariant ConfigMapper::getCommonConfigValueFromWidget(QWidget* widget, CfgEntry* QVariant ConfigMapper::getCustomConfigValueFromWidget(QWidget* widget, CfgEntry* key, bool& ok) { - CustomConfigWidgetPlugin* plugin = nullptr; QList handlers; handlers += internalCustomConfigWidgets; handlers += PLUGINS->getLoadedPlugins(); - foreach (plugin, handlers) + for (CustomConfigWidgetPlugin* plugin : handlers) { if (plugin->isConfigForWidget(key, widget)) return plugin->getWidgetConfigValue(widget, ok); @@ -275,7 +274,7 @@ void ConfigMapper::saveFromWidget(QWidget *widget, bool noTransaction) if (!noTransaction && isPersistant()) CFG->beginMassSave(); - foreach (QWidget* w, allConfigWidgets) + for (QWidget* w : allConfigWidgets) saveWidget(w, allConfigEntries); if (!noTransaction && isPersistant()) @@ -369,12 +368,11 @@ void ConfigMapper::handleConfigComboBox(QWidget* widget, const QHash handlers; handlers += internalCustomConfigWidgets; handlers += PLUGINS->getLoadedPlugins(); - foreach (handler, handlers) + for (CustomConfigWidgetPlugin* handler : handlers) { if (handler->isConfigForWidget(key, widget)) { @@ -387,12 +385,11 @@ bool ConfigMapper::applyCustomConfigToWidget(CfgEntry* key, QWidget* widget, con bool ConfigMapper::connectCustomNotifierToWidget(QWidget* widget, CfgEntry* cfgEntry) { - CustomConfigWidgetPlugin* handler = nullptr; QList handlers; handlers += internalCustomConfigWidgets; handlers += PLUGINS->getLoadedPlugins(); - foreach (handler, handlers) + for (CustomConfigWidgetPlugin* handler : handlers) { if (handler->isConfigForWidget(cfgEntry, widget)) { @@ -429,12 +426,11 @@ void ConfigMapper::saveFromWidget(QWidget* widget, CfgEntry* cfgEntry) bool ConfigMapper::saveCustomConfigFromWidget(QWidget* widget, CfgEntry* key) { - CustomConfigWidgetPlugin* plugin = nullptr; QList handlers; handlers += internalCustomConfigWidgets; handlers += PLUGINS->getLoadedPlugins(); - foreach (plugin, handlers) + for (CustomConfigWidgetPlugin* plugin : handlers) { if (plugin->isConfigForWidget(key, widget)) { @@ -503,7 +499,7 @@ QList ConfigMapper::getAllConfigWidgets(QWidget *parent) { QList results; QWidget* widget = nullptr; - foreach (QObject* obj, parent->children()) + for (QObject* obj : parent->children()) { widget = qobject_cast(obj); if (!widget || widgetsToIgnore.contains(widget)) diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp index 9322117..5759f76 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp @@ -61,9 +61,9 @@ bool ColumnDefaultPanel::validate() if (exprOk) { // Everything looks fine, so lets do the final check - if the value is considered constant by SQLite. - static QString tempDdlLiteralTpl = QStringLiteral("CREATE TABLE temp.%1 (col DEFAULT %2);"); - static QString tempDdlExprTpl = QStringLiteral("CREATE TABLE temp.%1 (col DEFAULT (%2));"); - static QString dropTempDdl = QStringLiteral("DROP TABLE IF EXISTS temp.%1;"); + static QString tempDdlLiteralTpl = QStringLiteral("CREATE TEMP TABLE %1 (col DEFAULT %2);"); + static QString tempDdlExprTpl = QStringLiteral("CREATE TEMP TABLE %1 (col DEFAULT (%2));"); + static QString dropTempDdl = QStringLiteral("DROP TABLE %1;"); QString tableName = getTempTable(); QString tempDdl = tempDdlExprTpl.arg(tableName, ui->exprEdit->toPlainText()); @@ -75,7 +75,8 @@ bool ColumnDefaultPanel::validate() if (res->isError()) { exprOk = false; - exprError = tr("Invalid default value expression: %1").arg(res->getErrorText()); + exprError = tr("Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters.") + .arg(res->getErrorText()); } else currentMode = Mode::LITERAL; @@ -84,7 +85,8 @@ bool ColumnDefaultPanel::validate() currentMode = Mode::EXPR; db->exec(dropTempDdl.arg(tableName)); - } + } else + exprError = tr("Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters."); setValidState(ui->exprEdit, exprOk, exprError); setValidState(ui->namedEdit, nameOk, tr("Enter a name of the constraint.")); @@ -269,7 +271,7 @@ void ColumnDefaultPanel::updateVirtualSql() QString ColumnDefaultPanel::getTempTable() { SchemaResolver resolver(db); - return resolver.getUniqueName("temp", "sqlitestudio_temp_table"); + return resolver.getUniqueName("sqlitestudio_temp_table"); } void ColumnDefaultPanel::updateState() diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp index f4eb3eb..af79331 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp @@ -138,7 +138,7 @@ void ColumnForeignKeyPanel::readConstraint() ui->fkTableCombo->setCurrentText(constr->foreignKey->foreignTable); // Conditions - foreach (SqliteForeignKey::Condition* condition, constr->foreignKey->conditions) + for (SqliteForeignKey::Condition* condition : constr->foreignKey->conditions) readCondition(condition); // Initially, Deferrable diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp index d10b223..f8975d8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.cpp @@ -94,13 +94,7 @@ void ColumnPrimaryKeyPanel::constraintAvailable() if (constraint.isNull()) return; - SqliteCreateTable::Column* column = dynamic_cast(constraint->parent()); ui->autoIncrCheck->setVisible(constraint->dialect == Dialect::Sqlite3); - ui->autoIncrCheck->setEnabled(column->type && - DataType::fromString(column->type->detokenize().trimmed(), Qt::CaseInsensitive) == DataType::INTEGER); - - if (!ui->autoIncrCheck->isEnabled()) - ui->autoIncrCheck->setText(tr("Autoincrement (only for %1 type columns)", "column primary key").arg("INTEGER")); readConstraint(); } diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp index f8390a1..8bc7926 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp @@ -156,7 +156,7 @@ void TableForeignKeyPanel::updateColumnState(int rowIdx, bool tableSelected) if (!wasEnabled && check->isEnabled()) { // Automatically set matching column - int idx = fkColumnsModel.stringList().indexOf(check->text()); + int idx = fkColumnsModel.stringList().indexOf(check->property(UI_PROP_COLUMN).toString()); if (idx > -1) combo->setCurrentIndex(idx); } @@ -191,7 +191,7 @@ void TableForeignKeyPanel::buildColumns() SqliteCreateTable* createTable = dynamic_cast(constraint->parentStatement()); int row = 0; - foreach (SqliteCreateTable::Column* column, createTable->columns) + for (SqliteCreateTable::Column* column : createTable->columns) buildColumn(column, row++); } @@ -200,6 +200,7 @@ void TableForeignKeyPanel::buildColumn(SqliteCreateTable::Column* column, int ro int col = 0; QCheckBox* check = new QCheckBox(column->name); + check->setProperty(UI_PROP_COLUMN, column->name); columnsLayout->addWidget(check, row, col++); columnSignalMapping->setMapping(check, row); connect(check, SIGNAL(toggled(bool)), columnSignalMapping, SLOT(map())); @@ -228,7 +229,7 @@ void TableForeignKeyPanel::readConstraint() if (!constr->foreignKey->foreignTable.isNull()) ui->fkTableCombo->setCurrentText(constr->foreignKey->foreignTable); - foreach (SqliteForeignKey::Condition* condition, constr->foreignKey->conditions) + for (SqliteForeignKey::Condition* condition : constr->foreignKey->conditions) readCondition(condition); ui->deferrableCombo->setCurrentText(sqliteDeferrable(constr->foreignKey->deferrable)); @@ -245,10 +246,9 @@ void TableForeignKeyPanel::readConstraint() int idx; QCheckBox* check = nullptr; QComboBox* combo = nullptr; - SqliteIndexedColumn* localCol = nullptr; SqliteIndexedColumn* foreignCol = nullptr; int i = 0; - foreach (localCol, constr->indexedColumns) + for (SqliteIndexedColumn* localCol : constr->indexedColumns) { // Foreign col if (i < constr->foreignKey->indexedColumns.size()) @@ -312,7 +312,7 @@ void TableForeignKeyPanel::storeConfiguration() if (constr->foreignKey) delete constr->foreignKey; - foreach (SqliteIndexedColumn* idxCol, constr->indexedColumns) + for (SqliteIndexedColumn* idxCol : constr->indexedColumns) delete idxCol; constr->indexedColumns.clear(); @@ -334,7 +334,7 @@ void TableForeignKeyPanel::storeConfiguration() if (!check->isChecked()) continue; - idxCol = new SqliteIndexedColumn(check->text()); + idxCol = new SqliteIndexedColumn(check->property(UI_PROP_COLUMN).toString()); idxCol->setParent(constr); constr->indexedColumns << idxCol; @@ -407,7 +407,7 @@ int TableForeignKeyPanel::getColumnIndex(const QString& colName) { item = columnsLayout->itemAtPosition(i, 0)->widget(); cb = qobject_cast(item); - if (cb->text().compare(colName, Qt::CaseInsensitive) == 0) + if (cb->property(UI_PROP_COLUMN).toString().compare(colName, Qt::CaseInsensitive) == 0) return i; } return -1; diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.cpp index f2a0ada..7c1c359 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.cpp @@ -71,6 +71,7 @@ void TablePrimaryKeyAndUniquePanel::buildColumn(SqliteCreateTable::Column* colum int col = 0; QCheckBox* check = new QCheckBox(column->name); + check->setProperty(UI_PROP_COLUMN, column->name); columnsLayout->addWidget(check, row, col++); columnSignalMapping->setMapping(check, row); connect(check, SIGNAL(toggled(bool)), columnSignalMapping, SLOT(map())); @@ -109,7 +110,7 @@ int TablePrimaryKeyAndUniquePanel::getColumnIndex(const QString& colName) { item = columnsLayout->itemAtPosition(i, 0)->widget(); cb = qobject_cast(item); - if (cb->text().compare(colName, Qt::CaseInsensitive) == 0) + if (cb->property(UI_PROP_COLUMN).toString().compare(colName, Qt::CaseInsensitive) == 0) return i; } return -1; @@ -190,7 +191,7 @@ void TablePrimaryKeyAndUniquePanel::storeConfiguration() constr->onConflict = sqliteConflictAlgo(ui->conflictComboBox->currentText()); // Columns - foreach (SqliteIndexedColumn* idxCol, constr->indexedColumns) + for (SqliteIndexedColumn* idxCol : constr->indexedColumns) delete idxCol; constr->indexedColumns.clear(); @@ -207,7 +208,7 @@ void TablePrimaryKeyAndUniquePanel::storeConfiguration() if (!check->isChecked()) continue; - name = check->text(); + name = check->property(UI_PROP_COLUMN).toString(); if (constr->dialect == Dialect::Sqlite3) { @@ -256,7 +257,7 @@ void TablePrimaryKeyAndUniquePanel::readConstraint() int idx; QCheckBox* check = nullptr; QComboBox* combo = nullptr; - foreach (SqliteIndexedColumn* idxCol, constr->indexedColumns) + for (SqliteIndexedColumn* idxCol : constr->indexedColumns) { idx = getColumnIndex(idxCol->name); if (idx < 0) @@ -294,6 +295,6 @@ void TablePrimaryKeyAndUniquePanel::buildColumns() SqliteCreateTable* createTable = dynamic_cast(constraint->parentStatement()); int row = 0; - foreach (SqliteCreateTable::Column* column, createTable->columns) + for (SqliteCreateTable::Column* column : createTable->columns) buildColumn(column, row++); } diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tableprimarykeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/tableprimarykeypanel.cpp index c538990..bad4910 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tableprimarykeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tableprimarykeypanel.cpp @@ -1,5 +1,6 @@ #include "tableprimarykeypanel.h" #include "ui_tablepkanduniquepanel.h" +#include "uiutils.h" #include TablePrimaryKeyPanel::TablePrimaryKeyPanel(QWidget *parent) : @@ -50,7 +51,7 @@ void TablePrimaryKeyPanel::updateState() item = columnsLayout->itemAtPosition(i, 0)->widget(); cb = qobject_cast(item); if (cb->isChecked()) - columns << cb->text(); + columns << cb->property(UI_PROP_COLUMN).toString(); } if (columns.size() != 1) diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp index 4a04736..b8ebf45 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp @@ -284,7 +284,7 @@ QString SqlQueryItem::getToolTip() const { rows << emptyRow; rows << hdrRowTmp.arg(ICONS.COLUMN_CONSTRAINT.getPath()).arg(tr("Constraints:", "data view tooltip")).arg(""); - foreach (SqlQueryModelColumn::Constraint* constr, col->constraints) + for (SqlQueryModelColumn::Constraint* constr : col->constraints) rows << constrRowTmp.arg(constr->getIcon()->toUrl()).arg(constr->getTypeString()).arg(constr->getDetails()); } @@ -447,7 +447,7 @@ QString SqlQueryItem::loadFullData() // ROWID RowIdConditionBuilder rowIdBuilder; - rowIdBuilder.setRowId(getRowId()); + rowIdBuilder.setRowId(getRowId(), dialect); QString rowId = rowIdBuilder.build(); queryArgs = rowIdBuilder.getQueryArgs(); diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp index 74a82ca..64d37e4 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitemdelegate.cpp @@ -85,7 +85,6 @@ QString SqlQueryItemDelegate::displayText(const QVariant& value, const QLocale& void SqlQueryItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { // No need to check or load full data, it is already preloaded if necessary in createEditor(). - QComboBox* cb = dynamic_cast(editor); QLineEdit* le = dynamic_cast(editor); if (cb) { @@ -102,17 +101,29 @@ void SqlQueryItemDelegate::setEditorDataForFk(QComboBox* cb, const QModelIndex& const SqlQueryModel* queryModel = dynamic_cast(index.model()); SqlQueryItem* item = queryModel->itemFromIndex(index); QVariant modelData = item->getValue(); - int idx = cb->findData(modelData, Qt::UserRole); - if (idx == -1 ) + + SqlQueryModel* cbModel = dynamic_cast(cb->model()); + SqlQueryItem* foundItem = cbModel->findAnyInColumn(0, SqlQueryItem::DataRole::VALUE, modelData); + int idx = -1; + if (foundItem) + idx = foundItem->index().row(); + + if (idx == -1 && modelData.isValid()) { - cb->addItem(modelData.toString(), modelData); - idx = cb->count() - 1; + idx = 0; + QList values; + values << modelData; + for (int i = 1; i < cbModel->columnCount(); i++) + values << QVariant(); + + cbModel->insertCustomRow(values, idx); SqlQueryView* view = dynamic_cast(cb->view()); view->resizeColumnsToContents(); view->setMinimumWidth(view->horizontalHeader()->length()); } cb->setCurrentIndex(idx); + cb->lineEdit()->selectAll(); } void SqlQueryItemDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const @@ -171,21 +182,26 @@ void SqlQueryItemDelegate::setModelDataForLineEdit(QLineEdit* editor, QAbstractI if (CFG_UI.General.KeepNullWhenEmptyValue.get() && model->data(index, Qt::EditRole).isNull() && value.isEmpty()) return; - bool ok; - QVariant variant = value.toLongLong(&ok); - if (ok) - { - model->setData(index, variant, Qt::EditRole); - return; - } + const SqlQueryModel* queryModel = dynamic_cast(model); + SqlQueryItem* item = queryModel->itemFromIndex(index); - variant = value.toDouble(&ok); - if (ok) + if (item->getColumn()->dataType.isNumeric()) { - model->setData(index, variant, Qt::EditRole); - return; - } + bool ok; + QVariant variant = value.toLongLong(&ok); + if (ok) + { + model->setData(index, variant, Qt::EditRole); + return; + } + variant = value.toDouble(&ok); + if (ok) + { + model->setData(index, variant, Qt::EditRole); + return; + } + } model->setData(index, value, Qt::EditRole); } @@ -262,7 +278,7 @@ QString SqlQueryItemDelegate::getSqlForFkEditor(SqlQueryItem* item) const if (fk->foreignColumn.compare(srcCol, Qt::CaseInsensitive) == 0) continue; // Exclude matching column. We don't want the same column several times. - fullSrcCol = src + "." + srcCol; + fullSrcCol = src + "." + wrapObjIfNeeded(srcCol, dialect); selectedCols << srcColTpl.arg(cellLimitTpl.arg(CELL_LENGTH_LIMIT).arg(fullSrcCol), wrapObjName(fullSrcCol, dialect)); } @@ -318,22 +334,21 @@ void SqlQueryItemDelegate::fkDataReady() // Set selected combo value to initial value from the cell QComboBox* cb = modelToFkCombo[model]; - QVariant value = modelToFkInitialValue[model]; + QVariant valueFromQueryModel = modelToFkInitialValue[model]; + if (model->rowCount() > 0) { QModelIndex startIdx = model->index(0, 0); QModelIndex endIdx = model->index(model->rowCount() - 1, 0); - QModelIndexList idxList = model->findIndexes(startIdx, endIdx, SqlQueryItem::DataRole::VALUE, value, 1); + QModelIndexList idxList = model->findIndexes(startIdx, endIdx, SqlQueryItem::DataRole::VALUE, valueFromQueryModel, 1); if (idxList.size() > 0) cb->setCurrentIndex(idxList.first().row()); else - cb->setCurrentText(value.toString()); + cb->setCurrentText(valueFromQueryModel.toString()); } else - { - cb->setCurrentText(value.toString()); - } + cb->setCurrentText(valueFromQueryModel.toString()); } void SqlQueryItemDelegate::fkDataFailed(const QString &errorText) @@ -401,6 +416,7 @@ QWidget* SqlQueryItemDelegate::getFkEditor(SqlQueryItem* item, QWidget* parent, queryModel->setHardRowLimit(MAX_ROWS_FOR_FK); queryModel->setDb(db); queryModel->setQuery(sql); + queryModel->setAsyncMode(false); queryModel->executeQuery(); queryView->verticalHeader()->setVisible(false); diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp index 009b05a..ff025df 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp @@ -68,6 +68,16 @@ void SqlQueryModel::setExplainMode(bool explain) this->explain = explain; } +void SqlQueryModel::setParams(const QHash& params) +{ + queryParams = params; +} + +void SqlQueryModel::setAsyncMode(bool enabled) +{ + queryExecutor->setAsyncMode(enabled); +} + void SqlQueryModel::executeQuery() { if (queryExecutor->isExecutionInProgress()) @@ -121,6 +131,7 @@ void SqlQueryModel::executeQueryInternal() emit executionStarted(); queryExecutor->setQuery(query); + queryExecutor->setParams(queryParams); queryExecutor->setResultsPerPage(getRowsPerPage()); queryExecutor->setExplainMode(explain); queryExecutor->setPreloadResults(true); @@ -224,6 +235,15 @@ QList SqlQueryModel::findItems(const QModelIndex& start, const QM return toItemList(findIndexes(start, end, role, value, hits)); } +SqlQueryItem* SqlQueryModel::findAnyInColumn(int column, int role, const QVariant &value) const +{ + QList itemList = toItemList(findIndexes(index(0, column), index(rowCount() - 1, column), role, value, 1)); + if (itemList.isEmpty()) + return nullptr; + + return itemList[0]; +} + QList SqlQueryModel::getUncommittedItems() const { return findItems(SqlQueryItem::DataRole::UNCOMMITTED, true); @@ -242,7 +262,7 @@ QHash > SqlQueryModel::groupItemsByTable(cons { QHash> itemsByTable; AliasedTable table; - foreach (SqlQueryItem* item, items) + for (SqlQueryItem* item : items) { if (item->getColumn()) { @@ -264,7 +284,7 @@ QList SqlQueryModel::filterOutCommittedItems(const QList newList; - foreach (SqlQueryItem* item, items) + for (SqlQueryItem* item : items) if (item->isUncommitted()) newList << item; @@ -288,7 +308,7 @@ SqlQueryModel::Features SqlQueryModel::features() const QList SqlQueryModel::toItemList(const QModelIndexList& indexes) const { QList list; - foreach (const QModelIndex& idx, indexes) + for (const QModelIndex& idx : indexes) list << itemFromIndex(idx); return list; @@ -452,7 +472,7 @@ void SqlQueryModel::commitInternal(const QList& items) void SqlQueryModel::rollbackInternal(const QList& items) { QList > groupedItems = groupItemsByRows(items); - foreach (const QList& itemsInRow, groupedItems) + for (const QList& itemsInRow : groupedItems) rollbackRow(itemsInRow); emit commitStatusChanged(getUncommittedItems().size() > 0); @@ -611,7 +631,7 @@ bool SqlQueryModel::commitEditedRow(const QList& itemsInRow) // RowId queryBuilder.clear(); rowId = items.first()->getRowId(); - queryBuilder.setRowId(rowId); + queryBuilder.setRowId(rowId, dialect); newRowId = getNewRowId(rowId, items); // if any of item updates any of rowid columns, then this will be different than initial rowid // Database and table @@ -692,13 +712,13 @@ void SqlQueryModel::rollbackAddedRow(const QList& itemsInRow) void SqlQueryModel::rollbackEditedRow(const QList& itemsInRow) { - foreach (SqlQueryItem* item, itemsInRow) + for (SqlQueryItem* item : itemsInRow) item->rollback(); } void SqlQueryModel::rollbackDeletedRow(const QList& itemsInRow) { - foreach (SqlQueryItem* item, itemsInRow) + for (SqlQueryItem* item : itemsInRow) item->rollback(); } @@ -719,7 +739,7 @@ SqlQueryModelColumnPtr SqlQueryModel::getColumnModel(const QString& table, const QList SqlQueryModel::getTableColumnModels(const QString& database, const QString& table) { QList results; - foreach (SqlQueryModelColumnPtr modelColumn, columns) + for (SqlQueryModelColumnPtr modelColumn : columns) { if (modelColumn->database.compare(database, Qt::CaseInsensitive) != 0) continue; @@ -788,7 +808,7 @@ QList SqlQueryModel::loadRow(SqlResultsRowPtr row) SqlQueryItem* item = nullptr; RowId rowId; int colIdx = 0; - foreach (const QVariant& value, row->valueList().mid(0, resultColumnCount)) + for (const QVariant& value : row->valueList().mid(0, resultColumnCount)) { item = new SqlQueryItem(); rowId = getRowIdValue(row, colIdx); @@ -931,7 +951,7 @@ void SqlQueryModel::readColumns() int totalRowIdCols = 0; AliasedTable aliasedTable; DbAndTable dbAndTable; - foreach (const QueryExecutor::ResultRowIdColumnPtr& resCol, queryExecutor->getRowIdResultColumns()) + for (const QueryExecutor::ResultRowIdColumnPtr& resCol : queryExecutor->getRowIdResultColumns()) { if (resCol->dbName.isEmpty() || resCol->dbName.toLower() == "main" || resCol->dbName.toLower() == "temp") dbAndTable.setDb(db); @@ -957,6 +977,16 @@ void SqlQueryModel::readColumns() tablesForColumns = getTablesForColumns(); columnEditionStatus = getColumnEditionEnabledList(); + // Rows limit to avoid out of memory problems + columnRatioBasedRowLimit = -1; + int rowsPerPage = getRowsPerPage(); + if (!columns.isEmpty()) + columnRatioBasedRowLimit = 150000 / columns.size(); + + if (columnRatioBasedRowLimit > -1 && columnRatioBasedRowLimit < rowsPerPage) + NOTIFY_MANAGER->info(tr("Number of rows per page was decreased to %1 due to number of columns (%2) in the data view.") + .arg(columnRatioBasedRowLimit).arg(columns.size())); + // We have fresh info about columns structureOutOfDate = false; } @@ -965,7 +995,7 @@ void SqlQueryModel::readColumnDetails() { // Preparing global (table oriented) edition forbidden reasons QSet editionForbiddenGlobalReasons; - foreach (QueryExecutor::EditionForbiddenReason reason, queryExecutor->getEditionForbiddenGlobalReasons()) + for (QueryExecutor::EditionForbiddenReason reason : queryExecutor->getEditionForbiddenGlobalReasons()) editionForbiddenGlobalReasons << SqlQueryModelColumn::convert(reason); // Reading all the details from query executor source tables @@ -981,7 +1011,7 @@ void SqlQueryModel::readColumnDetails() SqliteColumnTypePtr modelColumnType; SqlQueryModelColumn::Constraint* modelConstraint = nullptr; - foreach (const QueryExecutor::ResultColumnPtr& resCol, queryExecutor->getResultColumns()) + for (const QueryExecutor::ResultColumnPtr& resCol : queryExecutor->getResultColumns()) { // Creating new column for the model (this includes column oriented forbidden reasons) modelColumn = SqlQueryModelColumnPtr::create(resCol); @@ -1002,7 +1032,7 @@ void SqlQueryModel::readColumnDetails() modelColumn->dataType = DataType(modelColumnType->name, modelColumnType->precision, modelColumnType->scale); // Column constraints - foreach (SqliteCreateTable::Column::ConstraintPtr constrPtr, colDetails.constraints) + for (SqliteCreateTable::Column::ConstraintPtr constrPtr : colDetails.constraints) { modelConstraint = SqlQueryModelColumn::Constraint::create(constrPtr); if (modelConstraint) @@ -1010,7 +1040,7 @@ void SqlQueryModel::readColumnDetails() } // Table constraints - foreach (SqliteCreateTable::ConstraintPtr constrPtr, details.constraints) + for (SqliteCreateTable::ConstraintPtr constrPtr : details.constraints) { modelConstraint = SqlQueryModelColumn::Constraint::create(modelColumn->column, constrPtr); if (modelConstraint) @@ -1036,7 +1066,7 @@ QHash SqlQueryModel::readTableDetails AliasedTable table; QString columnName; - foreach (const QueryExecutor::SourceTablePtr& srcTable, queryExecutor->getSourceTables()) + for (const QueryExecutor::SourceTablePtr& srcTable : queryExecutor->getSourceTables()) { database = srcTable->database.isEmpty() ? "main" : srcTable->database; @@ -1054,11 +1084,11 @@ QHash SqlQueryModel::readTableDetails table = {database, srcTable->table, srcTable->alias}; // Table constraints - foreach (SqliteCreateTable::Constraint* tableConstr, createTable->constraints) + for (SqliteCreateTable::Constraint* tableConstr : createTable->constraints) tableDetails.constraints << tableConstr->detach(); // Table columns - foreach (SqliteCreateTable::Column* columnStmt, createTable->columns) + for (SqliteCreateTable::Column* columnStmt : createTable->columns) { // Column details TableDetails::ColumnDetails columnDetails; @@ -1071,7 +1101,7 @@ QHash SqlQueryModel::readTableDetails columnDetails.type = SqliteColumnTypePtr(); // Column constraints - foreach (SqliteCreateTable::Column::Constraint* columnConstr, columnStmt->constraints) + for (SqliteCreateTable::Column::Constraint* columnConstr : columnStmt->constraints) columnDetails.constraints << columnConstr->detach(); tableDetails.columns[columnName] = columnDetails; @@ -1088,7 +1118,7 @@ QList SqlQueryModel::getTablesForColumns() { QList columnTables; AliasedTable table; - foreach (SqlQueryModelColumnPtr column, columns) + for (SqlQueryModelColumnPtr column : columns) { if (column->editionForbiddenReason.size() > 0) { @@ -1104,7 +1134,7 @@ QList SqlQueryModel::getTablesForColumns() QList SqlQueryModel::getColumnEditionEnabledList() { QList columnEditionEnabled; - foreach (SqlQueryModelColumnPtr column, columns) + for (SqlQueryModelColumnPtr column : columns) columnEditionEnabled << (column->editionForbiddenReason.size() == 0); return columnEditionEnabled; @@ -1120,7 +1150,7 @@ void SqlQueryModel::updateColumnsHeader() void SqlQueryModel::updateColumnHeaderLabels() { headerColumns.clear(); - foreach (SqlQueryModelColumnPtr column, columns) + for (SqlQueryModelColumnPtr column : columns) { headerColumns << column->displayName; } @@ -1399,7 +1429,7 @@ void SqlQueryModel::updateSelectiveCommitRollbackActions(const QItemSelection& s bool result = false; if (selectedItems.size() > 0) { - foreach (SqlQueryItem* item, selectedItems) + for (SqlQueryItem* item : selectedItems) { if (item->isUncommitted()) { @@ -1542,6 +1572,9 @@ int SqlQueryModel::getRowsPerPage() const if (hardRowLimit > -1) rowsPerPage = hardRowLimit; + if (columnRatioBasedRowLimit > -1 && columnRatioBasedRowLimit < rowsPerPage) + rowsPerPage = columnRatioBasedRowLimit; + return rowsPerPage; } @@ -1555,6 +1588,46 @@ void SqlQueryModel::setQueryCountLimitForSmartMode(int value) queryExecutor->setQueryCountLimitForSmartMode(value); } +void SqlQueryModel::insertCustomRow(const QList &values, int insertionIndex) +{ + SqlQueryItem* cellItem = nullptr; + int colIdx = 0; + QList row; + for (const QVariant& value : values) + { + cellItem = new SqlQueryItem(); + updateItem(cellItem, value, colIdx++, RowId()); + row << cellItem; + } + insertRow(insertionIndex, row); +} + +void SqlQueryModel::setDesiredColumnWidth(int colIdx, int width) +{ + SqlQueryModelColumnPtr columnModel = columns[colIdx]; + if (!columnModel) + { + qWarning() << "Missing column model for column with index" << colIdx << "while resizing column."; + return; + } + + Column column(columnModel->database, columnModel->table, columnModel->column); + columnWidths[column] = width; +} + +int SqlQueryModel::getDesiredColumnWidth(int colIdx) +{ + SqlQueryModelColumnPtr columnModel = columns[colIdx]; + if (!columnModel) + return -1; + + Column column(columnModel->database, columnModel->table, columnModel->column); + if (!columnWidths.contains(column)) + return -1; + + return columnWidths[column]; +} + bool SqlQueryModel::isStructureOutOfDate() const { return structureOutOfDate; @@ -1610,7 +1683,7 @@ void SqlQueryModel::deleteSelectedRows() { QList selectedItems = view->getSelectedItems(); QSet rows; - foreach (SqlQueryItem* item, selectedItems) + for (SqlQueryItem* item : selectedItems) rows << item->index().row(); QList rowList = rows.toList(); @@ -1618,7 +1691,7 @@ void SqlQueryModel::deleteSelectedRows() QList newItemsToDelete; int cols = columnCount(); - foreach (int row, rowList) + for (int row : rowList) { for (int colIdx = 0; colIdx < cols; colIdx++) { @@ -1634,7 +1707,7 @@ void SqlQueryModel::deleteSelectedRows() } } - foreach (SqlQueryItem* item, newItemsToDelete) + for (SqlQueryItem* item : newItemsToDelete) removeRow(item->index().row()); emit commitStatusChanged(getUncommittedItems().size() > 0); @@ -1675,6 +1748,18 @@ void SqlQueryModel::applyRegExpFilter(const QString& value) // For custom query this is not supported. } +void SqlQueryModel::applyStringFilter(const QStringList& values) +{ + UNUSED(values); + // For custom query this is not supported. +} + +void SqlQueryModel::applyRegExpFilter(const QStringList& values) +{ + UNUSED(values); + // For custom query this is not supported. +} + void SqlQueryModel::resetFilter() { // For custom query this is not supported. @@ -1719,6 +1804,9 @@ QVariant SqlQueryModel::headerData(int section, Qt::Orientation orientation, int if (role == Qt::FontRole) return CFG_UI.Fonts.DataView.get(); + if (role == Qt::TextAlignmentRole && orientation == Qt::Horizontal) + return Qt::AlignLeft; + return QAbstractItemModel::headerData(section, orientation, role); } diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h index 7a4c282..6c17740 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h @@ -42,6 +42,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel QString getQuery() const; void setQuery(const QString &value); void setExplainMode(bool explain); + void setParams(const QHash& params); Db* getDb() const; void setDb(Db* value); qint64 getExecutionTime(); @@ -55,6 +56,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel QModelIndexList findIndexes(const QModelIndex &start, const QModelIndex& end, int role, const QVariant &value, int hits = -1) const; QList findItems(int role, const QVariant &value, int hits = -1) const; QList findItems(const QModelIndex &start, const QModelIndex& end, int role, const QVariant &value, int hits = -1) const; + SqlQueryItem* findAnyInColumn(int column, int role, const QVariant &value) const; QList getUncommittedItems() const; QList getRow(int row); int columnCount(const QModelIndex& parent = QModelIndex()) const; @@ -63,6 +65,16 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel void loadFullDataForEntireRow(int row); StrHash attachDependencyTables(); void detachDependencyTables(); + + /** + * @brief Disables or re-enables async query execution + * @param enabled True to set async mode enabled, false to set synchronous mode. + * + * This option is forwarded directly to the query executor. + * + * By default mode is asynchronous, but in some cases synchronous mode may be useful (like in FK combobox). + */ + void setAsyncMode(bool enabled); virtual QString generateSelectQueryForItems(const QList& items); virtual QString generateInsertQueryForItems(const QList& items); virtual QString generateUpdateQueryForItems(const QList& items); @@ -71,7 +83,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel virtual Features features() const; /** - * @brief applySqlFilter + * @brief Request for applying SQL expression filtering on a dataset. * @param value Filter expression. * Default implementation does nothing. Working implementation (i.e. for a table) * should set the query to temporary value which respects given filter and reload the data. @@ -80,7 +92,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel virtual void applySqlFilter(const QString& value); /** - * @brief applyStringFilter + * @brief Request for applying "LIKE" filtering on a dataset. * @param value Filter expression. * Default implementation does nothing. Working implementation (i.e. for a table) * should set the query to temporary value which respects given filter and reload the data. @@ -89,7 +101,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel virtual void applyStringFilter(const QString& value); /** - * @brief applyStringFilter + * @brief Request for applying Regular Expression filtering on a dataset. * @param value Filter expression. * Default implementation does nothing. Working implementation (i.e. for a table) * should set the query to temporary value which respects given filter and reload the data. @@ -97,6 +109,22 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel */ virtual void applyRegExpFilter(const QString& value); + /** + * @brief Request for applying "LIKE" filtering on a dataset. + * @param values Filter expressions per column. + * This is the same as applyStringFilter(const QString&), but is used for per-column filtering, + * when user enters filtering expressions for each column sparately. + */ + virtual void applyStringFilter(const QStringList& values); + + /** + * @brief Request for applying Regular Expression filtering on a dataset. + * @param values Filter expressions per column. + * This is the same as applyRegExpFilter(const QString&), but is used for per-column filtering, + * when user enters filtering expressions for each column sparately. + */ + virtual void applyRegExpFilter(const QStringList& values); + /** * @brief resetFilter * Default implementation does nothing. Working implementation (i.e. for a table) @@ -145,10 +173,15 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel int getQueryCountLimitForSmartMode() const; void setQueryCountLimitForSmartMode(int value); + void insertCustomRow(const QList& values, int insertionIndex); + + void setDesiredColumnWidth(int colIdx, int width); + int getDesiredColumnWidth(int colIdx); + protected: class CommitUpdateQueryBuilder : public RowIdConditionBuilder { - public: + public: void clear(); void setDatabase(const QString& database); @@ -302,6 +335,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel int getRowsPerPage() const; QString query; + QHash queryParams; bool explain = false; bool simpleExecutionMode = false; @@ -366,6 +400,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel QueryExecutor::SortList sortOrder; QHash columnMap; + QHash columnWidths; QHash> tableToRowIdColumn; QStringList headerColumns; int rowNumBase = 0; @@ -382,6 +417,16 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel */ int hardRowLimit = -1; + /** + * @brief Limit for rows in case there is many columns. + * + * -1 to not apply the limit. This is set during reading columns. If there is many columns, + * we need to keep maximum limit of rows at pace, so we don't overuse the RAM. + * This limit is soft, meaning it applies only if it's smaller than configured limit or hardRowLimit. + * If any of two limits mentioned above are smaller, this limit will not come to the play. + */ + int columnRatioBasedRowLimit = -1; + int resultColumnCount = 0; /** diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp index 3a2457c..688e05a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp @@ -9,13 +9,13 @@ SqlQueryModelColumn::SqlQueryModelColumn(const QueryExecutor::ResultColumnPtr& r table = resultColumn->table; tableAlias = resultColumn->tableAlias; database = resultColumn->database.isEmpty() ? "main": resultColumn->database; - foreach (QueryExecutor::ColumnEditionForbiddenReason reason, resultColumn->editionForbiddenReasons) + for (QueryExecutor::ColumnEditionForbiddenReason reason : resultColumn->editionForbiddenReasons) editionForbiddenReason << SqlQueryModelColumn::convert(reason); } SqlQueryModelColumn::~SqlQueryModelColumn() { - foreach (Constraint* constr, constraints) + for (Constraint* constr : constraints) delete constr; constraints.clear(); @@ -116,7 +116,7 @@ bool SqlQueryModelColumn::isRowIdPk() const if (dataType.getType() != DataType::INTEGER) return false; - foreach (ConstraintPk* pk, getConstraints()) + for (ConstraintPk* pk : getConstraints()) if (pk->scope == Constraint::Scope::COLUMN) return true; @@ -125,7 +125,7 @@ bool SqlQueryModelColumn::isRowIdPk() const bool SqlQueryModelColumn::isAutoIncr() const { - foreach (ConstraintPk* pk, getConstraints()) + for (ConstraintPk* pk : getConstraints()) if (pk->autoIncrement) return true; @@ -334,7 +334,7 @@ template QList SqlQueryModelColumn::getConstraints() const { QList results; - foreach (Constraint* constr, constraints) + for (Constraint* constr : constraints) if (dynamic_cast(constr)) results << dynamic_cast(constr); diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp index 9f58fd2..4364986 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp @@ -17,7 +17,6 @@ #include "common/utils_sql.h" #include "querygenerator.h" #include "services/codeformatter.h" -#include #include #include #include @@ -29,6 +28,8 @@ #include #include #include +#include +#include CFG_KEYS_DEFINE(SqlQueryView) @@ -55,9 +56,18 @@ void SqlQueryView::init() contextMenu = new QMenu(this); referencedTablesMenu = new QMenu(tr("Go to referenced row in..."), contextMenu); + setHorizontalHeader(new Header(this)); + connect(this, &QWidget::customContextMenuRequested, this, &SqlQueryView::customContextMenuRequested); connect(CFG_UI.Fonts.DataView, SIGNAL(changed(QVariant)), this, SLOT(updateFont())); connect(this, SIGNAL(activated(QModelIndex)), this, SLOT(itemActivated(QModelIndex))); + connect(horizontalHeader(), &QHeaderView::sectionResized, [this](int section, int, int newSize) + { + if (ignoreColumnWidthChanges) + return; + + getModel()->setDesiredColumnWidth(section, newSize); + }); horizontalHeader()->setSortIndicatorShown(false); horizontalHeader()->setSectionsClickable(true); @@ -77,12 +87,13 @@ void SqlQueryView::setupWidgetCover() void SqlQueryView::createActions() { createAction(COPY, ICONS.ACT_COPY, tr("Copy"), this, SLOT(copy()), this); + createAction(COPY_WITH_HEADER, ICONS.ACT_COPY, tr("Copy with headers"), this, SLOT(copyWithHeader()), this); createAction(COPY_AS, ICONS.ACT_COPY, tr("Copy as..."), this, SLOT(copyAs()), this); createAction(PASTE, ICONS.ACT_PASTE, tr("Paste"), this, SLOT(paste()), this); createAction(PASTE_AS, ICONS.ACT_PASTE, tr("Paste as..."), this, SLOT(pasteAs()), this); createAction(SET_NULL, ICONS.SET_NULL, tr("Set NULL values"), this, SLOT(setNull()), this); createAction(ERASE, ICONS.ERASE, tr("Erase values"), this, SLOT(erase()), this); - createAction(OPEN_VALUE_EDITOR, ICONS.OPEN_VALUE_EDITOR, tr("Edit value in editor"), this, SLOT(openValueEditor()), this); + createAction(OPEN_VALUE_EDITOR, ICONS.OPEN_VALUE_EDITOR, "", this, SLOT(openValueEditor()), this); // actual label is set dynamically in setupActionsForMenu() createAction(COMMIT, ICONS.COMMIT, tr("Commit"), this, SLOT(commit()), this); createAction(ROLLBACK, ICONS.ROLLBACK, tr("Rollback"), this, SLOT(rollback()), this); createAction(SELECTIVE_COMMIT, ICONS.COMMIT, tr("Commit selected cells"), this, SLOT(selectiveCommit()), this); @@ -119,9 +130,17 @@ void SqlQueryView::setupActionsForMenu(SqlQueryItem* currentItem, const QList uncommittedItems = getModel()->getUncommittedItems(); int uncommittedCount = uncommittedItems.size(); + // How many of selected items is editable + int editableSelCount = selCount; + for (SqlQueryItem* selItem : getSelectedItems()) + if (selItem->getColumn()->editionForbiddenReason.size() > 0) + editableSelCount--; + + bool currentItemEditable = (getCurrentItem()->getColumn()->editionForbiddenReason.size() == 0); + // Uncommitted & selected items count int uncommittedSelCount = 0; - foreach (SqlQueryItem* item, uncommittedItems) + for (SqlQueryItem* item : uncommittedItems) if (selectedItems.contains(item)) uncommittedSelCount++; @@ -140,10 +159,16 @@ void SqlQueryView::setupActionsForMenu(SqlQueryItem* currentItem, const QList 0 && selCount > 0) contextMenu->addSeparator(); + // Edit/show label for "open in editor" action + actionMap[OPEN_VALUE_EDITOR]->setText(currentItemEditable ? tr("Edit value in editor") : tr("Show value in a viewer")); + if (selCount > 0) { - contextMenu->addAction(actionMap[ERASE]); - contextMenu->addAction(actionMap[SET_NULL]); + if (editableSelCount > 0) + { + contextMenu->addAction(actionMap[ERASE]); + contextMenu->addAction(actionMap[SET_NULL]); + } contextMenu->addAction(actionMap[OPEN_VALUE_EDITOR]); contextMenu->addSeparator(); } @@ -165,6 +190,7 @@ void SqlQueryView::setupActionsForMenu(SqlQueryItem* currentItem, const QListaddSeparator(); contextMenu->addAction(actionMap[COPY]); + contextMenu->addAction(actionMap[COPY_WITH_HEADER]); //contextMenu->addAction(actionMap[COPY_AS]); // TODO uncomment when implemented contextMenu->addAction(actionMap[PASTE]); //contextMenu->addAction(actionMap[PASTE_AS]); // TODO uncomment when implemented @@ -172,7 +198,7 @@ void SqlQueryView::setupActionsForMenu(SqlQueryItem* currentItem, const QList 0) { contextMenu->addSeparator(); - foreach (QAction* action, additionalActions) + for (QAction* action : additionalActions) contextMenu->addAction(action); } } @@ -199,7 +225,7 @@ QList SqlQueryView::getSelectedItems() qSort(idxList); const SqlQueryModel* model = dynamic_cast(idxList.first().model()); - foreach (const QModelIndex& idx, idxList) + for (const QModelIndex& idx : idxList) items << model->itemFromIndex(idx); return items; @@ -314,7 +340,15 @@ void SqlQueryView::paste(const QList >& data) return; } - qSort(selectedItems); + if (data.size() == 1 && data[0].size() == 1) + { + QVariant theValue = data[0][0]; + for (SqlQueryItem* item : selectedItems) + item->setValue(theValue, false, false); + + return; + } + SqlQueryItem* topLeft = selectedItems.first(); int columnCount = getModel()->columnCount(); @@ -324,7 +358,7 @@ void SqlQueryView::paste(const QList >& data) SqlQueryItem* item = nullptr; - foreach (const QList& cells, data) + for (const QList& cells : data) { // Check if we're out of rows range if (rowIdx >= rowCount) @@ -334,7 +368,7 @@ void SqlQueryView::paste(const QList >& data) break; } - foreach (const QVariant& cell, cells) + for (const QVariant& cell : cells) { // Get current cell if (colIdx >= columnCount) @@ -408,6 +442,78 @@ void SqlQueryView::goToReferencedRow(const QString& table, const QString& column win->execute(); } +void SqlQueryView::copy(bool withHeader) +{ + if (simpleBrowserMode) + return; + + QList selectedItems = getSelectedItems(); + QList > groupedItems = SqlQueryModel::groupItemsByRows(selectedItems); + + if (selectedItems.isEmpty()) + return; + + QVariant itemValue; + QStringList cells; + QList rows; + + QPair>> theDataPair; + QList> theData; + QList theDataRow; + + // Header + if (withHeader) + { + for (SqlQueryModelColumnPtr col : getModel()->getColumns().mid(0, groupedItems.first().size())) + { + theDataRow << col->displayName; + cells << col->displayName; + } + + rows << cells; + cells.clear(); + + theData << theDataRow; + theDataRow.clear(); + } + + // Data + for (const QList& itemsInRows : groupedItems) + { + for (SqlQueryItem* item : itemsInRows) + { + itemValue = item->getFullValue(); + if (itemValue.userType() == QVariant::Double) + cells << doubleToString(itemValue); + else + cells << itemValue.toString(); + + theDataRow << itemValue; + } + + rows << cells; + cells.clear(); + + theData << theDataRow; + theDataRow.clear(); + } + + QMimeData* mimeData = new QMimeData(); + QString tsv = TsvSerializer::serialize(rows); + mimeData->setText(tsv); + + QString md5 = QCryptographicHash::hash(tsv.toUtf8(), QCryptographicHash::Md5); + theDataPair.first = md5; + theDataPair.second = theData; + + QByteArray serializedData; + QDataStream stream(&serializedData, QIODevice::WriteOnly); + stream << theDataPair; + mimeData->setData(mimeDataId, serializedData); + + qApp->clipboard()->setMimeData(mimeData); +} + bool SqlQueryView::getSimpleBrowserMode() const { return simpleBrowserMode; @@ -418,6 +524,22 @@ void SqlQueryView::setSimpleBrowserMode(bool value) simpleBrowserMode = value; } +void SqlQueryView::setIgnoreColumnWidthChanges(bool ignore) +{ + ignoreColumnWidthChanges = ignore; +} + +QMenu* SqlQueryView::getHeaderContextMenu() const +{ + return headerContextMenu; +} + +void SqlQueryView::scrollContentsBy(int dx, int dy) +{ + QTableView::scrollContentsBy(dx, dy); + emit scrolledBy(dx, dy); +} + void SqlQueryView::updateCommitRollbackActions(bool enabled) { actionMap[COMMIT]->setEnabled(enabled); @@ -485,11 +607,18 @@ void SqlQueryView::updateFont() void SqlQueryView::executionStarted() { + beforeExecutionHorizontalPosition = horizontalScrollBar()->sliderPosition(); widgetCover->show(); } void SqlQueryView::executionEnded() { + if (beforeExecutionHorizontalPosition > -1) + { + horizontalScrollBar()->setSliderPosition(beforeExecutionHorizontalPosition); + emit scrolledBy(beforeExecutionHorizontalPosition, 0); + } + widgetCover->hide(); } @@ -500,54 +629,12 @@ void SqlQueryView::setCurrentRow(int row) void SqlQueryView::copy() { - if (simpleBrowserMode) - return; - - QList selectedItems = getSelectedItems(); - QList > groupedItems = SqlQueryModel::groupItemsByRows(selectedItems); - - QVariant itemValue; - QStringList cells; - QList rows; - - QPair>> theDataPair; - QList> theData; - QList theDataRow; - - foreach (const QList& itemsInRows, groupedItems) - { - foreach (SqlQueryItem* item, itemsInRows) - { - itemValue = item->getFullValue(); - if (itemValue.userType() == QVariant::Double) - cells << doubleToString(itemValue); - else - cells << itemValue.toString(); - - theDataRow << itemValue; - } - - rows << cells; - cells.clear(); - - theData << theDataRow; - theDataRow.clear(); - } - - QMimeData* mimeData = new QMimeData(); - QString tsv = TsvSerializer::serialize(rows); - mimeData->setText(tsv); - - QString md5 = QCryptographicHash::hash(tsv.toUtf8(), QCryptographicHash::Md5); - theDataPair.first = md5; - theDataPair.second = theData; - - QByteArray serializedData; - QDataStream stream(&serializedData, QIODevice::WriteOnly); - stream << theDataPair; - mimeData->setData(mimeDataId, serializedData); + copy(false); +} - qApp->clipboard()->setMimeData(mimeData); +void SqlQueryView::copyWithHeader() +{ + copy(true); } void SqlQueryView::paste() @@ -574,13 +661,30 @@ void SqlQueryView::paste() } QList deserializedRows = TsvSerializer::deserialize(mimeData->text()); + bool trimOnPaste = false; + bool trimOnPasteAsked = false; QList dataRow; QList> dataToPaste; for (const QStringList& cells : deserializedRows) { for (const QString& cell : cells) - dataRow << cell; + { +#if QT_VERSION >= 0x050A00 + if ((cell.front().isSpace() || cell.back().isSpace()) && !trimOnPasteAsked) +#else + if ((cell.at(0).isSpace() || cell.at(cell.size() - 1).isSpace()) && !trimOnPasteAsked) +#endif + { + QMessageBox::StandardButton choice; + choice = QMessageBox::question(this, tr("Trim pasted text?"), + tr("The pasted text contains leading or trailing white space. Trim it automatically?")); + trimOnPasteAsked = true; + trimOnPaste = (choice == QMessageBox::Yes); + } + + dataRow << (trimOnPaste ? cell.trimmed() : cell); + } dataToPaste << dataRow; dataRow.clear(); @@ -689,3 +793,20 @@ int qHash(SqlQueryView::Action action) { return static_cast(action); } + +SqlQueryView::Header::Header(SqlQueryView* parent) : + QHeaderView(Qt::Horizontal, parent) +{ +} + +QSize SqlQueryView::Header::sectionSizeFromContents(int section) const +{ + QSize originalSize = QHeaderView::sectionSizeFromContents(section); + int colCount = dynamic_cast(parent())->getModel()->columnCount(); + if (colCount <= 5) + return originalSize; + + int wd = minHeaderWidth; + wd = qMin((wd + wd * 20 / colCount), originalSize.width()); + return QSize(wd, originalSize.height()); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h index b0df4d7..98e2783 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h @@ -7,6 +7,7 @@ #include "guiSQLiteStudio_global.h" #include "common/table.h" #include +#include class SqlQueryItemDelegate; class SqlQueryItem; @@ -19,9 +20,10 @@ class QMenu; CFG_KEY_LIST(SqlQueryView, QObject::tr("Data grid view"), CFG_KEY_ENTRY(COPY, Qt::CTRL + Qt::Key_C, QObject::tr("Copy cell(s) contents to clipboard")) -// CFG_KEY_ENTRY(COPY_AS, Qt::CTRL + Qt::SHIFT + Qt::Key_C, QObject::tr("")) + CFG_KEY_ENTRY(COPY_WITH_HEADER, Qt::CTRL + Qt::SHIFT + Qt::Key_C, QObject::tr("Copy cell(s) contents together with header to clipboard")) +// CFG_KEY_ENTRY(COPY_AS, Qt::CTRL + Qt::ALT + Qt::Key_C, QObject::tr("")) CFG_KEY_ENTRY(PASTE, Qt::CTRL + Qt::Key_V, QObject::tr("Paste cell(s) contents from clipboard")) -// CFG_KEY_ENTRY(PASTE_AS, Qt::CTRL + Qt::SHIFT + Qt::Key_V, QObject::tr("")) +// CFG_KEY_ENTRY(PASTE_AS, Qt::CTRL + Qt::ALT + Qt::Key_V, QObject::tr("")) CFG_KEY_ENTRY(ERASE, Qt::ALT + Qt::Key_Backspace, QObject::tr("Set empty value to selected cell(s)")) CFG_KEY_ENTRY(SET_NULL, Qt::Key_Backspace, QObject::tr("Set NULL value to selected cell(s)")) CFG_KEY_ENTRY(COMMIT, Qt::CTRL + Qt::Key_Return, QObject::tr("Commit changes to cell(s) contents")) @@ -40,6 +42,7 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer enum Action { COPY, + COPY_WITH_HEADER, COPY_AS, PASTE, PASTE_AS, @@ -77,8 +80,21 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer QModelIndex getCurrentIndex() const; bool getSimpleBrowserMode() const; void setSimpleBrowserMode(bool value); + void setIgnoreColumnWidthChanges(bool ignore); + QMenu* getHeaderContextMenu() const; + + protected: + void scrollContentsBy(int dx, int dy); private: + class Header : public QHeaderView + { + public: + explicit Header(SqlQueryView* parent); + + QSize sectionSizeFromContents(int section) const; + }; + void init(); void setupWidgetCover(); void createActions(); @@ -90,8 +106,10 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer void paste(const QList>& data); void addFkActionsToContextMenu(SqlQueryItem* currentItem); void goToReferencedRow(const QString& table, const QString& column, const QVariant& value); + void copy(bool withHeaders); constexpr static const char* mimeDataId = "application/x-sqlitestudio-data-view-data"; + constexpr static const int minHeaderWidth = 15; SqlQueryItemDelegate* itemDelegate = nullptr; QMenu* contextMenu = nullptr; @@ -102,6 +120,8 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer QProgressBar* busyBar = nullptr; QList additionalActions; bool simpleBrowserMode = false; + bool ignoreColumnWidthChanges = false; + int beforeExecutionHorizontalPosition = -1; private slots: void updateCommitRollbackActions(bool enabled); @@ -122,6 +142,7 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer void executionEnded(); void setCurrentRow(int row); void copy(); + void copyWithHeader(); void paste(); void copyAs(); void pasteAs(); @@ -139,6 +160,7 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer void requestForRowInsert(); void requestForMultipleRowInsert(); void requestForRowDelete(); + void scrolledBy(int dx, int dy); }; GUI_API_EXPORT int qHash(SqlQueryView::Action action); diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.cpp index 3a9f0b0..ed9a3a4 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.cpp @@ -76,7 +76,7 @@ bool SqlTableModel::commitAddedRow(const QList& itemsInRow) // Handle error if (result->isError()) { - foreach (SqlQueryItem* item, itemsInRow) + for (SqlQueryItem* item : itemsInRow) item->setCommittingError(true); notifyError(tr("Error while committing new row: %1").arg(result->getErrorText())); @@ -129,7 +129,7 @@ bool SqlTableModel::commitDeletedRow(const QList& itemsInRow) CommitDeleteQueryBuilder queryBuilder; queryBuilder.setTable(wrapObjIfNeeded(table, dialect)); - queryBuilder.setRowId(rowId); + queryBuilder.setRowId(rowId, dialect); QString sql = queryBuilder.build(); QHash args = queryBuilder.getQueryArgs(); @@ -147,41 +147,73 @@ bool SqlTableModel::commitDeletedRow(const QList& itemsInRow) return true; } -bool SqlTableModel::supportsModifyingQueriesInMenu() const +void SqlTableModel::applyFilter(const QString& value, FilterValueProcessor valueProc) { - return true; -} + static_qstring(sql, "SELECT * FROM %1 WHERE %2"); -void SqlTableModel::applySqlFilter(const QString& value) -{ if (value.isEmpty()) { resetFilter(); return; } - setQuery("SELECT * FROM "+getDataSource()+" WHERE "+value); + Dialect dialect = db->getDialect(); + QStringList conditions; + for (SqlQueryModelColumnPtr column : columns) + conditions << wrapObjIfNeeded(column->column, dialect)+" "+valueProc(value); + + setQuery(sql.arg(getDataSource(), conditions.join(" OR "))); executeQuery(); } -void SqlTableModel::applyStringFilter(const QString& value) +void SqlTableModel::applyFilter(const QStringList& values, FilterValueProcessor valueProc) { - if (value.isEmpty()) + static_qstring(sql, "SELECT * FROM %1 WHERE %2"); + if (values.isEmpty()) { resetFilter(); return; } + if (values.size() != columns.size()) + { + qCritical() << "Asked to per-column filter, but number columns" + << columns.size() << "is different than number of values" << values.size(); + return; + } + Dialect dialect = db->getDialect(); QStringList conditions; - foreach (SqlQueryModelColumnPtr column, columns) - conditions << wrapObjIfNeeded(column->column, dialect)+" LIKE '%"+escapeString(value)+"%'"; + for (int i = 0, total = columns.size(); i < total; ++i) + { + if (values[i].isEmpty()) + continue; - setQuery("SELECT * FROM "+getDataSource()+" WHERE "+conditions.join(" OR ")); + conditions << wrapObjIfNeeded(columns[i]->column, dialect)+" "+valueProc(values[i]); + } + + setQuery(sql.arg(getDataSource(), conditions.join(" AND "))); executeQuery(); } -void SqlTableModel::applyRegExpFilter(const QString& value) +QString SqlTableModel::stringFilterValueProcessor(const QString& value) +{ + static_qstring(pattern, "LIKE '%%1%'"); + return pattern.arg(escapeString(value)); +} + +QString SqlTableModel::regExpFilterValueProcessor(const QString& value) +{ + static_qstring(pattern, "REGEXP '%1'"); + return pattern.arg(escapeString(value)); +} + +bool SqlTableModel::supportsModifyingQueriesInMenu() const +{ + return true; +} + +void SqlTableModel::applySqlFilter(const QString& value) { if (value.isEmpty()) { @@ -189,15 +221,30 @@ void SqlTableModel::applyRegExpFilter(const QString& value) return; } - Dialect dialect = db->getDialect(); - QStringList conditions; - foreach (SqlQueryModelColumnPtr column, columns) - conditions << wrapObjIfNeeded(column->column, dialect)+" REGEXP '"+escapeString(value)+"'"; - - setQuery("SELECT * FROM "+getDataSource()+" WHERE "+conditions.join(" OR ")); + setQuery("SELECT * FROM "+getDataSource()+" WHERE "+value); executeQuery(); } +void SqlTableModel::applyStringFilter(const QString& value) +{ + applyFilter(value, &stringFilterValueProcessor); +} + +void SqlTableModel::applyStringFilter(const QStringList& values) +{ + applyFilter(values, &stringFilterValueProcessor); +} + +void SqlTableModel::applyRegExpFilter(const QString& value) +{ + applyFilter(value, ®ExpFilterValueProcessor); +} + +void SqlTableModel::applyRegExpFilter(const QStringList& values) +{ + applyFilter(values, ®ExpFilterValueProcessor); +} + void SqlTableModel::resetFilter() { setQuery("SELECT * FROM "+getDataSource()); @@ -296,7 +343,7 @@ void SqlTableModel::updateRowAfterInsert(const QList& itemsInRow, static_qstring(limitedColTpl, "substr(%1, 1, %2)"); SelectColumnsQueryBuilder queryBuilder; queryBuilder.setTable(wrapObjIfNeeded(table, dialect)); - queryBuilder.setRowId(rowId); + queryBuilder.setRowId(rowId, dialect); QList columnKeys = columnsToReadFromDb.keys(); for (const SqlQueryModelColumnPtr& modelColumn : columnKeys) queryBuilder.addColumn(limitedColTpl.arg(wrapObjIfNeeded(modelColumn->column, dialect), QString::number(cellDataLengthLimit))); @@ -394,7 +441,7 @@ void SqlTableModel::updateColumnsAndValues(const QList& itemsInRo SqlQueryItem* item = nullptr; int i = 0; - foreach (SqlQueryModelColumnPtr modelColumn, modelColumns) + for (SqlQueryModelColumnPtr modelColumn : modelColumns) { item = itemsInRow[i++]; if (item->getValue().isNull()) @@ -421,7 +468,7 @@ void SqlTableModel::updateColumnsAndValuesWithDefaultValues(const QListgetDialect(); // First try to find the one with DEFAULT value - foreach (SqlQueryModelColumnPtr modelColumn, modelColumns) + for (SqlQueryModelColumnPtr modelColumn : modelColumns) { if (modelColumn->isDefault()) { @@ -433,7 +480,7 @@ void SqlTableModel::updateColumnsAndValuesWithDefaultValues(const QListisPk() && modelColumn->isAutoIncr()) { diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.h index da43b03..b904343 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqltablemodel.h @@ -17,7 +17,9 @@ class GUI_API_EXPORT SqlTableModel : public SqlQueryModel Features features() const; void applySqlFilter(const QString& value); void applyStringFilter(const QString& value); + void applyStringFilter(const QStringList& values); void applyRegExpFilter(const QString& value); + void applyRegExpFilter(const QStringList& values); void resetFilter(); QString generateSelectQueryForItems(const QList& items); QString generateInsertQueryForItems(const QList& items); @@ -43,7 +45,13 @@ class GUI_API_EXPORT SqlTableModel : public SqlQueryModel void addColumn(const QString& col); }; + typedef std::function FilterValueProcessor; + static QString stringFilterValueProcessor(const QString& value); + static QString regExpFilterValueProcessor(const QString& value); + + void applyFilter(const QString& value, FilterValueProcessor valueProc); + void applyFilter(const QStringList& values, FilterValueProcessor valueProc); void updateColumnsAndValuesWithDefaultValues(const QList& modelColumns, QStringList& colNameList, QStringList& sqlValues, QList& args); void updateColumnsAndValues(const QList& itemsInRow, const QList& modelColumns, diff --git a/SQLiteStudio3/guiSQLiteStudio/dataview.cpp b/SQLiteStudio3/guiSQLiteStudio/dataview.cpp index 6666834..9012c1c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dataview.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dataview.cpp @@ -13,6 +13,7 @@ #include "uiconfig.h" #include "datagrid/sqlqueryitem.h" #include "common/widgetcover.h" +#include "common/unused.h" #include #include #include @@ -21,12 +22,15 @@ #include #include #include +#include +#include +#include CFG_KEYS_DEFINE(DataView) -DataView::FilterMode DataView::filterMode; DataView::TabsPosition DataView::tabsPosition; QHash DataView::staticActions; QHash DataView::staticActionGroups; +static const char* DATA_VIEW_FILTER_PROP = "filter"; DataView::DataView(QWidget *parent) : QTabWidget(parent) @@ -76,6 +80,8 @@ void DataView::initSlots() connect(gridView->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(columnsHeaderClicked(int))); connect(this, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); connect(model, SIGNAL(itemEditionEnded(SqlQueryItem*)), this, SLOT(adjustColumnWidth(SqlQueryItem*))); + connect(gridView, SIGNAL(scrolledBy(int, int)), this, SLOT(syncFilterScrollPosition())); + connect(gridView->horizontalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(resizeFilter(int, int, int))); } void DataView::initFormView() @@ -119,6 +125,9 @@ void DataView::createContents() gridWidget->layout()->addWidget(gridToolBar); formWidget->layout()->addWidget(formToolBar); + createFilterPanel(); + gridWidget->layout()->addWidget(perColumnAreaParent); + THEME_TUNER->manageCompactLayout({ gridWidget, formWidget @@ -136,6 +145,37 @@ void DataView::createContents() gridWidget->layout()->addWidget(gridView); } +void DataView::createFilterPanel() +{ + perColumnAreaParent = new QWidget(); + perColumnAreaParent->setVisible(false); + perColumnAreaParent->setLayout(new QHBoxLayout()); + perColumnAreaParent->layout()->setSpacing(0); + perColumnAreaParent->layout()->setMargin(0); + perColumnAreaParent->setFixedHeight(0); + + filterLeftSpacer = new QWidget(); + perColumnAreaParent->layout()->addWidget(filterLeftSpacer); + + perColumnFilterArea = new QScrollArea(); + perColumnFilterArea->setFixedHeight(0); + perColumnFilterArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + perColumnFilterArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + perColumnFilterArea->setFrameShape(QFrame::NoFrame); + perColumnWidget = new QWidget(); + perColumnWidget->setLayout(new QHBoxLayout()); + perColumnWidget->layout()->setSizeConstraint(QLayout::SetFixedSize); + perColumnWidget->layout()->setSpacing(0); + perColumnWidget->layout()->setMargin(0); + perColumnWidget->setAutoFillBackground(true); + perColumnWidget->setBackgroundRole(QPalette::Window); + perColumnFilterArea->setWidget(perColumnWidget); + perColumnAreaParent->layout()->addWidget(perColumnFilterArea); + + filterRightSpacer = new QWidget(); + perColumnAreaParent->layout()->addWidget(filterRightSpacer); +} + void DataView::initPageEdit() { pageEdit = new ExtLineEdit(); @@ -187,19 +227,8 @@ void DataView::createActions() createAction(LAST_PAGE, ICONS.PAGE_LAST, tr("Last page", "data view"), this, SLOT(lastPage()), gridToolBar); gridToolBar->addSeparator(); if (model->features().testFlag(SqlQueryModel::FILTERING)) - { - actionMap[FILTER_VALUE] = gridToolBar->addWidget(filterEdit); - createAction(FILTER, tr("Apply filter", "data view"), this, SLOT(applyFilter()), gridToolBar); - attachActionInMenu(FILTER, staticActions[FILTER_STRING], gridToolBar); - attachActionInMenu(FILTER, staticActions[FILTER_REGEXP], gridToolBar); - attachActionInMenu(FILTER, staticActions[FILTER_SQL], gridToolBar); - gridToolBar->addSeparator(); - updateFilterIcon(); - - connect(staticActions[FILTER_STRING], SIGNAL(triggered()), this, SLOT(filterModeSelected())); - connect(staticActions[FILTER_REGEXP], SIGNAL(triggered()), this, SLOT(filterModeSelected())); - connect(staticActions[FILTER_SQL], SIGNAL(triggered()), this, SLOT(filterModeSelected())); - } + createFilteringActions(); + actionMap[GRID_TOTAL_ROWS] = gridToolBar->addWidget(rowCountLabel); noConfigShortcutActions << GRID_TOTAL_ROWS << FILTER_VALUE; @@ -264,55 +293,33 @@ void DataView::setupDefShortcuts() void DataView::resizeColumnsInitiallyToContents() { - int cols = gridView->model()->columnCount(); + SqlQueryModel *model = gridView->getModel(); + int cols = model->columnCount(); + gridView->setIgnoreColumnWidthChanges(true); gridView->resizeColumnsToContents(); int wd; + int desiredWidth = -1; for (int i = 0; i < cols ; i++) { + desiredWidth = model->getDesiredColumnWidth(i); wd = gridView->columnWidth(i); + + if (desiredWidth > -1 && wd != desiredWidth) + { + gridView->setColumnWidth(i, desiredWidth); + continue; + } + if (wd > CFG_UI.General.MaxInitialColumnWith.get()) gridView->setColumnWidth(i, CFG_UI.General.MaxInitialColumnWith.get()); else if (wd < 60) gridView->setColumnWidth(i, 60); - } + gridView->setIgnoreColumnWidthChanges(false); } void DataView::createStaticActions() { - // Filtering actions - staticActions[FILTER_STRING] = new ExtAction(ICONS.APPLY_FILTER_TXT, tr("Filter by text", "data view"), MainWindow::getInstance()); - staticActions[FILTER_REGEXP] = new ExtAction(ICONS.APPLY_FILTER_RE, tr("Filter by the Regular Expression", "data view"), MainWindow::getInstance()); - staticActions[FILTER_SQL] = new ExtAction(ICONS.APPLY_FILTER_SQL, tr("Filter by SQL expression", "data view"), MainWindow::getInstance()); - - staticActionGroups[ActionGroup::FILTER_MODE] = new QActionGroup(MainWindow::getInstance()); - staticActionGroups[ActionGroup::FILTER_MODE]->addAction(staticActions[FILTER_STRING]); - staticActionGroups[ActionGroup::FILTER_MODE]->addAction(staticActions[FILTER_SQL]); - staticActionGroups[ActionGroup::FILTER_MODE]->addAction(staticActions[FILTER_REGEXP]); - - connect(staticActions[FILTER_STRING], &QAction::triggered, [=]() - { - filterMode = FilterMode::STRING; - }); - connect(staticActions[FILTER_SQL], &QAction::triggered, [=]() - { - filterMode = FilterMode::SQL; - }); - connect(staticActions[FILTER_REGEXP], &QAction::triggered, [=]() - { - filterMode = FilterMode::REGEXP; - }); - - staticActions[FILTER_STRING]->setCheckable(true); - staticActions[FILTER_REGEXP]->setCheckable(true); - staticActions[FILTER_SQL]->setCheckable(true); - if (filterMode == FilterMode::STRING) - staticActions[FILTER_STRING]->setChecked(true); - else if (filterMode == FilterMode::REGEXP) - staticActions[FILTER_REGEXP]->setChecked(true); - else - staticActions[FILTER_SQL]->setChecked(true); - // Tabs position actions staticActions[TABS_ON_TOP] = new ExtAction(ICONS.TABS_ON_TOP, tr("Tabs on top", "data view"), MainWindow::getInstance()); staticActions[TABS_AT_BOTTOM] = new ExtAction(ICONS.TABS_AT_BOTTOM, tr("Tabs at bottom", "data view"), MainWindow::getInstance()); @@ -499,6 +506,7 @@ void DataView::updateTabsMode() void DataView::filterModeSelected() { QAction* modeAction = dynamic_cast(sender()); + filterMode = static_cast(modeAction->property(DATA_VIEW_FILTER_PROP).toInt()); actionMap[FILTER]->setIcon(modeAction->icon()); } @@ -541,6 +549,41 @@ void DataView::adjustColumnWidth(SqlQueryItem* item) gridView->setColumnWidth(col, CFG_UI.General.MaxInitialColumnWith.get()); } +void DataView::syncFilterScrollPosition() +{ + perColumnFilterArea->horizontalScrollBar()->setValue(gridView->horizontalScrollBar()->value()); +} + +void DataView::resizeFilter(int section, int oldSize, int newSize) +{ + UNUSED(oldSize); + if (filterInputs.isEmpty()) + return; + + if (filterInputs.size() <= section) + { + qCritical() << "Tried to adjust per-column filter input edit according to resized value, but section index is out of bounds:" + << section << ", while edit widgets count is:" << filterInputs.size(); + return; + } + + filterInputs[section]->setFixedWidth(newSize); +} + +void DataView::togglePerColumnFiltering() +{ + bool enable = actionMap[FILTER_PER_COLUMN]->isChecked(); + + filterEdit->setEnabled(!enable); + if (actionMap[FILTER_SQL]->isChecked()) + actionMap[FILTER_STRING]->setChecked(true); + + actionMap[FILTER_SQL]->setEnabled(!enable); + perColumnAreaParent->setVisible(enable); + + recreateFilterInputs(); +} + void DataView::updateCommitRollbackActions(bool enabled) { gridView->getAction(SqlQueryView::COMMIT)->setEnabled(enabled); @@ -638,18 +681,6 @@ void DataView::readData() model->executeQuery(); } -void DataView::updateFilterIcon() -{ - for (Action act : {FILTER_STRING, FILTER_SQL, FILTER_REGEXP}) - { - if (staticActions[act]->isChecked()) - { - actionMap[FILTER]->setIcon(staticActions[act]->icon()); - break; - } - } -} - bool DataView::isUncommitted() const { return uncommittedGrid || uncommittedForm; @@ -661,6 +692,7 @@ void DataView::dataLoadingEnded(bool successful) { updatePageEdit(); resizeColumnsInitiallyToContents(); + recreateFilterInputs(); } setNavigationState(true); @@ -778,18 +810,47 @@ void DataView::applyFilter() return; } - QString value = filterEdit->text(); - switch (filterMode) + if (actionMap[FILTER_PER_COLUMN]->isChecked()) { - case DataView::FilterMode::STRING: - model->applyStringFilter(value); - break; - case DataView::FilterMode::SQL: - model->applySqlFilter(value); - break; - case DataView::FilterMode::REGEXP: - model->applyRegExpFilter(value); - break; + filterValues.clear(); + for (QLineEdit* edit : filterInputs) + filterValues << edit->text(); + + if (filterValues.join("").isEmpty()) + { + model->resetFilter(); + return; + } + + switch (filterMode) + { + case DataView::FilterMode::STRING: + model->applyStringFilter(filterValues); + break; + case DataView::FilterMode::SQL: + // Should never happen. + qWarning() << "Requested to filter by SQL for filtering per-column. This should not be possible."; + break; + case DataView::FilterMode::REGEXP: + model->applyRegExpFilter(filterValues); + break; + } + } + else + { + QString value = filterEdit->text(); + switch (filterMode) + { + case DataView::FilterMode::STRING: + model->applyStringFilter(value); + break; + case DataView::FilterMode::SQL: + model->applySqlFilter(value); + break; + case DataView::FilterMode::REGEXP: + model->applyRegExpFilter(value); + break; + } } } @@ -854,7 +915,12 @@ void DataView::initFormViewForNewRow() int row = gridView->getCurrentIndex().row(); for (SqlQueryItem* item : getModel()->getRow(row)) + { + if (item->getColumn()->isAutoIncr()) + continue; + item->setValue(""); + } } void DataView::formViewFocusFirstEditor() @@ -863,6 +929,87 @@ void DataView::formViewFocusFirstEditor() formView->focusFirstEditor(); } +void DataView::recreateFilterInputs() +{ + qApp->processEvents(); + + for (QLineEdit* edit : filterInputs) + delete edit; + + filterInputs.clear(); + + filterLeftSpacer->setFixedSize(gridView->verticalHeader()->width() + 1, 1); + + QLineEdit* edit = nullptr; + for (int i = 0, total = gridView->horizontalHeader()->count(); i < total; ++i) + { + edit = new QLineEdit(perColumnWidget); + edit->setPlaceholderText(tr("Filter")); + edit->setClearButtonEnabled(true); + edit->setFixedWidth(gridView->columnWidth(i)); + edit->setToolTip(tr("Hit Enter key or press \"Apply filter\" button on toolbar to apply new value.")); + if (filterValues.size() > i) + edit->setText(filterValues[i]); + + connect(edit, SIGNAL(returnPressed()), this, SLOT(applyFilter())); + perColumnWidget->layout()->addWidget(edit); + filterInputs << edit; + } + + int rightSpacerWd = gridView->verticalScrollBar()->isVisible() ? gridView->verticalScrollBar()->width() : 0; + filterRightSpacer->setFixedSize(rightSpacerWd + 1, 1); + + perColumnAreaParent->setFixedWidth(gridView->width()); + + if (edit) + { + int hg = edit->sizeHint().height(); + perColumnFilterArea->setFixedHeight(hg); + perColumnAreaParent->setFixedHeight(hg); + } + + qApp->processEvents(); + + syncFilterScrollPosition(); +} + +void DataView::createFilteringActions() +{ + createAction(FILTER_STRING, ICONS.APPLY_FILTER_TXT, tr("Filter by text", "data view"), this, SLOT(filterModeSelected()), this); + createAction(FILTER_REGEXP, ICONS.APPLY_FILTER_RE, tr("Filter by the Regular Expression", "data view"), this, SLOT(filterModeSelected()), this); + createAction(FILTER_SQL, ICONS.APPLY_FILTER_SQL, tr("Filter by SQL expression", "data view"), this, SLOT(filterModeSelected()), this); + + actionMap[FILTER_STRING]->setProperty(DATA_VIEW_FILTER_PROP, static_cast(FilterMode::STRING)); + actionMap[FILTER_REGEXP]->setProperty(DATA_VIEW_FILTER_PROP, static_cast(FilterMode::REGEXP)); + actionMap[FILTER_SQL]->setProperty(DATA_VIEW_FILTER_PROP, static_cast(FilterMode::SQL)); + + QActionGroup* filterGroup = new QActionGroup(gridToolBar); + filterGroup->addAction(actionMap[FILTER_STRING]); + filterGroup->addAction(actionMap[FILTER_SQL]); + filterGroup->addAction(actionMap[FILTER_REGEXP]); + + actionMap[FILTER_STRING]->setCheckable(true); + actionMap[FILTER_REGEXP]->setCheckable(true); + actionMap[FILTER_SQL]->setCheckable(true); + actionMap[FILTER_STRING]->setChecked(true); + + createAction(FILTER_PER_COLUMN, tr("Show filter inputs per column", "data view"), this, SLOT(togglePerColumnFiltering()), this); + actionMap[FILTER_PER_COLUMN]->setCheckable(true); + + actionMap[FILTER_VALUE] = gridToolBar->addWidget(filterEdit); + createAction(FILTER, tr("Apply filter", "data view"), this, SLOT(applyFilter()), gridToolBar); + attachActionInMenu(FILTER, actionMap[FILTER_STRING], gridToolBar); + attachActionInMenu(FILTER, actionMap[FILTER_REGEXP], gridToolBar); + attachActionInMenu(FILTER, actionMap[FILTER_SQL], gridToolBar); + addSeparatorInMenu(FILTER, gridToolBar); + attachActionInMenu(FILTER, actionMap[FILTER_PER_COLUMN], gridToolBar); + gridToolBar->addSeparator(); + + actionMap[FILTER]->setIcon(actionMap[FILTER_STRING]->icon()); + + gridView->getHeaderContextMenu()->addAction(actionMap[FILTER_PER_COLUMN]); +} + void DataView::columnsHeaderClicked(int columnIdx) { model->changeSorting(columnIdx); @@ -916,7 +1063,6 @@ QToolBar* DataView::getToolBar(int toolbar) const void DataView::staticInit() { - filterMode = FilterMode::STRING; tabsPosition = TabsPosition::TOP; loadTabsMode(); createStaticActions(); diff --git a/SQLiteStudio3/guiSQLiteStudio/dataview.h b/SQLiteStudio3/guiSQLiteStudio/dataview.h index 73ccfe7..55c7895 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dataview.h +++ b/SQLiteStudio3/guiSQLiteStudio/dataview.h @@ -15,6 +15,8 @@ class ExtLineEdit; class QLabel; class IntValidator; class WidgetCover; +class QScrollArea; +class QLineEdit; CFG_KEY_LIST(DataView, QObject::tr("Data view (both grid and form)"), CFG_KEY_ENTRY(REFRESH_DATA, Qt::Key_F5, QObject::tr("Refresh data")) @@ -46,6 +48,7 @@ class GUI_API_EXPORT DataView : public QTabWidget, public ExtActionContainer FILTER_STRING, FILTER_SQL, FILTER_REGEXP, + FILTER_PER_COLUMN, GRID_TOTAL_ROWS, SELECTIVE_COMMIT, SELECTIVE_ROLLBACK, @@ -123,6 +126,7 @@ class GUI_API_EXPORT DataView : public QTabWidget, public ExtActionContainer void initPageEdit(); void initWidgetCover(); void createContents(); + void createFilterPanel(); void goToFormRow(IndexModifier idxMod); void setNavigationState(bool enabled); void updateNavigationState(); @@ -133,15 +137,16 @@ class GUI_API_EXPORT DataView : public QTabWidget, public ExtActionContainer void updateCurrentFormViewRow(); void setFormViewEnabled(bool enabled); void readData(); - void updateFilterIcon(); void initFormViewForNewRow(); void formViewFocusFirstEditor(); + void recreateFilterInputs(); + void createFilteringActions(); - static FilterMode filterMode; static TabsPosition tabsPosition; static QHash staticActions; static QHash staticActionGroups; + FilterMode filterMode = FilterMode::STRING; QToolBar* gridToolBar = nullptr; QToolBar* formToolBar = nullptr; SqlQueryView* gridView = nullptr; @@ -149,6 +154,9 @@ class GUI_API_EXPORT DataView : public QTabWidget, public ExtActionContainer FormView* formView = nullptr; QWidget* gridWidget = nullptr; QWidget* formWidget = nullptr; + QScrollArea* perColumnFilterArea = nullptr; + QWidget* perColumnWidget = nullptr; + QWidget* perColumnAreaParent = nullptr; ExtLineEdit* filterEdit = nullptr; QLabel* rowCountLabel = nullptr; QLabel* formViewRowCountLabel = nullptr; @@ -161,6 +169,10 @@ class GUI_API_EXPORT DataView : public QTabWidget, public ExtActionContainer bool uncommittedGrid = false; bool uncommittedForm = false; WidgetCover* widgetCover = nullptr; + QList filterInputs; + QStringList filterValues; + QWidget* filterLeftSpacer = nullptr; + QWidget* filterRightSpacer = nullptr; signals: @@ -205,6 +217,9 @@ class GUI_API_EXPORT DataView : public QTabWidget, public ExtActionContainer void updateGridCommitCover(int value); void hideGridCommitCover(); void adjustColumnWidth(SqlQueryItem* item); + void syncFilterScrollPosition(); + void resizeFilter(int section, int oldSize, int newSize); + void togglePerColumnFiltering(); }; int qHash(DataView::ActionGroup action); diff --git a/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp b/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp index 8153fed..b6203da 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp @@ -179,7 +179,7 @@ DbListModel::DbTreeComparer::DbTreeComparer() // TODO when sorting or D&D databases in the tree, this should be updated QList allItems = DBTREE->getModel()->getAllItemsAsFlatList(); dbTreeOrder.clear(); - foreach (DbTreeItem* item, allItems) + for (DbTreeItem* item : allItems) { if (item->getType() != DbTreeItem::Type::DB) continue; diff --git a/SQLiteStudio3/guiSQLiteStudio/dbobjectdialogs.cpp b/SQLiteStudio3/guiSQLiteStudio/dbobjectdialogs.cpp index 43af10e..7dd45fd 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbobjectdialogs.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dbobjectdialogs.cpp @@ -97,7 +97,7 @@ ViewWindow* DbObjectDialogs::addView(const QString &initialSelect) ViewWindow* DbObjectDialogs::editView(const QString& database, const QString& view) { ViewWindow* win = nullptr; - foreach (MdiWindow* mdiWin, mdiArea->getWindows()) + for (MdiWindow* mdiWin : mdiArea->getWindows()) { win = dynamic_cast(mdiWin->getMdiChild()); if (!win) @@ -376,7 +376,7 @@ void DbObjectDialogs::setNoConfirmation(bool value) TableWindow* DbObjectDialogs::editTable(const QString& database, const QString& table) { TableWindow* win = nullptr; - foreach (MdiWindow* mdiWin, mdiArea->getWindows()) + for (MdiWindow* mdiWin : mdiArea->getWindows()) { win = dynamic_cast(mdiWin->getMdiChild()); if (!win) diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp index 018eeb6..ba8ccc1 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.cpp @@ -3,6 +3,7 @@ #include "ui_dbtree.h" #include "actionentry.h" #include "common/utils_sql.h" +#include "common/utils.h" #include "dbtreemodel.h" #include "dialogs/dbdialog.h" #include "services/dbmanager.h" @@ -27,6 +28,8 @@ #include "themetuner.h" #include "dialogs/dbconverterdialog.h" #include "querygenerator.h" +#include "dialogs/execfromfiledialog.h" +#include "dialogs/fileexecerrorsdialog.h" #include #include #include @@ -38,6 +41,10 @@ #include #include #include +#include +#include +#include +#include CFG_KEYS_DEFINE(DbTree) QHash> DbTree::allowedTypesInside; @@ -70,10 +77,33 @@ void DbTree::init() ui->nameFilter->setClearButtonEnabled(true); - widgetCover = new WidgetCover(this); - widgetCover->initWithInterruptContainer(); - widgetCover->hide(); - connect(widgetCover, SIGNAL(cancelClicked()), this, SLOT(interrupt())); + treeRefreshWidgetCover = new WidgetCover(this); + treeRefreshWidgetCover->initWithInterruptContainer(); + treeRefreshWidgetCover->hide(); + connect(treeRefreshWidgetCover, SIGNAL(cancelClicked()), this, SLOT(interrupt())); + + fileExecWidgetCover = new WidgetCover(this); + fileExecWidgetCover->initWithInterruptContainer(); + fileExecWidgetCover->displayProgress(100); + fileExecWidgetCover->hide(); + connect(fileExecWidgetCover, &WidgetCover::cancelClicked, [this]() + { + if (!this->executingQueriesFromFile) + return; + + this->executingQueriesFromFile = 0; + + if (this->executingQueriesFromFileDb) // should always be there, but just in case + { + this->executingQueriesFromFileDb->interrupt(); + this->executingQueriesFromFileDb->rollback(); + this->executingQueriesFromFileDb = nullptr; + notifyWarn(tr("Execution from file cancelled. Any queries executed so far have been rolled back.")); + } + }); + connect(this, &DbTree::updateFileExecProgress, this, &DbTree::setFileExecProgress, Qt::QueuedConnection); + connect(this, &DbTree::fileExecCoverToBeClosed, this, &DbTree::hideFileExecCover, Qt::QueuedConnection); + connect(this, &DbTree::fileExecErrors, this, &DbTree::showFileExecErrors, Qt::QueuedConnection); treeModel = new DbTreeModel(); treeModel->setTreeView(ui->treeView); @@ -107,45 +137,47 @@ void DbTree::createActions() createAction(CREATE_GROUP, ICONS.DIRECTORY_ADD, tr("Create a group"), this, SLOT(createGroup()), this); createAction(DELETE_GROUP, ICONS.DIRECTORY_DEL, tr("Delete the group"), this, SLOT(deleteGroup()), this); createAction(RENAME_GROUP, ICONS.DIRECTORY_EDIT, tr("Rename the group"), this, SLOT(renameGroup()), this); - createAction(ADD_DB, ICONS.DATABASE_ADD, tr("Add a database"), this, SLOT(addDb()), this); - createAction(EDIT_DB, ICONS.DATABASE_EDIT, tr("Edit the database"), this, SLOT(editDb()), this); - createAction(DELETE_DB, ICONS.DATABASE_DEL, tr("Remove the database"), this, SLOT(removeDb()), this); - createAction(CONNECT_TO_DB, ICONS.DATABASE_CONNECT, tr("Connect to the database"), this, SLOT(connectToDb()), this); - createAction(DISCONNECT_FROM_DB, ICONS.DATABASE_DISCONNECT, tr("Disconnect from the database"), this, SLOT(disconnectFromDb()), this); + createAction(ADD_DB, ICONS.DATABASE_ADD, tr("&Add a database"), this, SLOT(addDb()), this); + createAction(EDIT_DB, ICONS.DATABASE_EDIT, tr("&Edit the database"), this, SLOT(editDb()), this); + createAction(DELETE_DB, ICONS.DATABASE_DEL, tr("&Remove the database"), this, SLOT(removeDb()), this); + createAction(CONNECT_TO_DB, ICONS.DATABASE_CONNECT, tr("&Connect to the database"), this, SLOT(connectToDb()), this); + createAction(DISCONNECT_FROM_DB, ICONS.DATABASE_DISCONNECT, tr("&Disconnect from the database"), this, SLOT(disconnectFromDb()), this); createAction(IMPORT_INTO_DB, ICONS.IMPORT, tr("Import"), this, SLOT(import()), this); - createAction(EXPORT_DB, ICONS.DATABASE_EXPORT, tr("Export the database"), this, SLOT(exportDb()), this); - createAction(CONVERT_DB, ICONS.CONVERT_DB, tr("Convert database type"), this, SLOT(convertDb()), this); - createAction(VACUUM_DB, ICONS.VACUUM_DB, tr("Vacuum"), this, SLOT(vacuumDb()), this); - createAction(INTEGRITY_CHECK, ICONS.INTEGRITY_CHECK, tr("Integrity check"), this, SLOT(integrityCheck()), this); - createAction(ADD_TABLE, ICONS.TABLE_ADD, tr("Create a table"), this, SLOT(addTable()), this); - createAction(EDIT_TABLE, ICONS.TABLE_EDIT, tr("Edit the table"), this, SLOT(editTable()), this); - createAction(DEL_TABLE, ICONS.TABLE_DEL, tr("Delete the table"), this, SLOT(delTable()), this); + createAction(EXPORT_DB, ICONS.DATABASE_EXPORT, tr("&Export the database"), this, SLOT(exportDb()), this); + createAction(CONVERT_DB, ICONS.CONVERT_DB, tr("Con&vert database type"), this, SLOT(convertDb()), this); + createAction(VACUUM_DB, ICONS.VACUUM_DB, tr("Vac&uum"), this, SLOT(vacuumDb()), this); + createAction(INTEGRITY_CHECK, ICONS.INTEGRITY_CHECK, tr("&Integrity check"), this, SLOT(integrityCheck()), this); + createAction(ADD_TABLE, ICONS.TABLE_ADD, tr("Create a &table"), this, SLOT(addTable()), this); + createAction(EDIT_TABLE, ICONS.TABLE_EDIT, tr("Edit the t&able"), this, SLOT(editTable()), this); + createAction(DEL_TABLE, ICONS.TABLE_DEL, tr("Delete the ta&ble"), this, SLOT(delTable()), this); createAction(EXPORT_TABLE, ICONS.TABLE_EXPORT, tr("Export the table"), this, SLOT(exportTable()), this); createAction(IMPORT_TABLE, ICONS.TABLE_IMPORT, tr("Import into the table"), this, SLOT(importTable()), this); createAction(POPULATE_TABLE, ICONS.TABLE_POPULATE, tr("Populate table"), this, SLOT(populateTable()), this); createAction(CREATE_SIMILAR_TABLE, ICONS.TABLE_CREATE_SIMILAR, tr("Create similar table"), this, SLOT(createSimilarTable()), this); createAction(RESET_AUTOINCREMENT, ICONS.RESET_AUTOINCREMENT, tr("Reset autoincrement sequence"), this, SLOT(resetAutoincrement()), this); - createAction(ADD_INDEX, ICONS.INDEX_ADD, tr("Create an index"), this, SLOT(addIndex()), this); - createAction(EDIT_INDEX, ICONS.INDEX_EDIT, tr("Edit the index"), this, SLOT(editIndex()), this); - createAction(DEL_INDEX, ICONS.INDEX_DEL, tr("Delete the index"), this, SLOT(delIndex()), this); - createAction(ADD_TRIGGER, ICONS.TRIGGER_ADD, tr("Create a trigger"), this, SLOT(addTrigger()), this); - createAction(EDIT_TRIGGER, ICONS.TRIGGER_EDIT, tr("Edit the trigger"), this, SLOT(editTrigger()), this); - createAction(DEL_TRIGGER, ICONS.TRIGGER_DEL, tr("Delete the trigger"), this, SLOT(delTrigger()), this); - createAction(ADD_VIEW, ICONS.VIEW_ADD, tr("Create a view"), this, SLOT(addView()), this); - createAction(EDIT_VIEW, ICONS.VIEW_EDIT, tr("Edit the view"), this, SLOT(editView()), this); - createAction(DEL_VIEW, ICONS.VIEW_DEL, tr("Delete the view"), this, SLOT(delView()), this); + createAction(ADD_INDEX, ICONS.INDEX_ADD, tr("Create an &index"), this, SLOT(addIndex()), this); + createAction(EDIT_INDEX, ICONS.INDEX_EDIT, tr("Edit the i&ndex"), this, SLOT(editIndex()), this); + createAction(DEL_INDEX, ICONS.INDEX_DEL, tr("Delete the in&dex"), this, SLOT(delIndex()), this); + createAction(ADD_TRIGGER, ICONS.TRIGGER_ADD, tr("Create a trig&ger"), this, SLOT(addTrigger()), this); + createAction(EDIT_TRIGGER, ICONS.TRIGGER_EDIT, tr("Edit the trigg&er"), this, SLOT(editTrigger()), this); + createAction(DEL_TRIGGER, ICONS.TRIGGER_DEL, tr("Delete the trigge&r"), this, SLOT(delTrigger()), this); + createAction(ADD_VIEW, ICONS.VIEW_ADD, tr("Create a &view"), this, SLOT(addView()), this); + createAction(EDIT_VIEW, ICONS.VIEW_EDIT, tr("Edit the v&iew"), this, SLOT(editView()), this); + createAction(DEL_VIEW, ICONS.VIEW_DEL, tr("Delete the vi&ew"), this, SLOT(delView()), this); createAction(ADD_COLUMN, ICONS.TABLE_COLUMN_ADD, tr("Add a column"), this, SLOT(addColumn()), this); createAction(EDIT_COLUMN, ICONS.TABLE_COLUMN_EDIT, tr("Edit the column"), this, SLOT(editColumn()), this); createAction(DEL_COLUMN, ICONS.TABLE_COLUMN_DELETE, tr("Delete the column"), this, SLOT(delColumn()), this); createAction(DEL_SELECTED, ICONS.DELETE_SELECTED, tr("Delete selected items"), this, SLOT(deleteSelected()), this); createAction(CLEAR_FILTER, tr("Clear filter"), ui->nameFilter, SLOT(clear()), this); - createAction(REFRESH_SCHEMAS, ICONS.DATABASE_RELOAD, tr("Refresh all database schemas"), this, SLOT(refreshSchemas()), this); - createAction(REFRESH_SCHEMA, ICONS.DATABASE_RELOAD, tr("Refresh selected database schema"), this, SLOT(refreshSchema()), this); + createAction(REFRESH_SCHEMAS, ICONS.DATABASE_RELOAD, tr("&Refresh all database schemas"), this, SLOT(refreshSchemas()), this); + createAction(REFRESH_SCHEMA, ICONS.DATABASE_RELOAD, tr("Re&fresh selected database schema"), this, SLOT(refreshSchema()), this); createAction(ERASE_TABLE_DATA, ICONS.ERASE_TABLE_DATA, tr("Erase table data"), this, SLOT(eraseTableData()), this); createAction(GENERATE_SELECT, "SELECT", this, SLOT(generateSelectForTable()), this); createAction(GENERATE_INSERT, "INSERT", this, SLOT(generateInsertForTable()), this); createAction(GENERATE_UPDATE, "UPDATE", this, SLOT(generateUpdateForTable()), this); createAction(GENERATE_DELETE, "DELETE", this, SLOT(generateDeleteForTable()), this); + createAction(OPEN_DB_DIRECTORY, ICONS.DIRECTORY_OPEN_WITH_DB, tr("Open file's directory"), this, SLOT(openDbDirectory()), this); + createAction(EXEC_SQL_FROM_FILE, ICONS.EXEC_SQL_FROM_FILE, tr("Execute SQL from file"), this, SLOT(execSqlFromFile()), this); } void DbTree::updateActionStates(const QStandardItem *item) @@ -161,7 +193,7 @@ void DbTree::updateActionStates(const QStandardItem *item) // Add database should always be available, as well as a copy of an item enabled << ADD_DB << COPY; - if (isMimeDataValidForItem(QApplication::clipboard()->mimeData(), dbTreeItem)) + if (isMimeDataValidForItem(QApplication::clipboard()->mimeData(), dbTreeItem, true)) enabled << PASTE; enabled << CLEAR_FILTER; @@ -181,6 +213,10 @@ void DbTree::updateActionStates(const QStandardItem *item) } else enabled << CONNECT_TO_DB; + + QUrl url = QUrl::fromLocalFile(dbTreeItem->getDb()->getPath()); + if (url.isValid()) + enabled << OPEN_DB_DIRECTORY; } if (isDbOpen) @@ -193,7 +229,7 @@ void DbTree::updateActionStates(const QStandardItem *item) // It's handled outside of "item with db", above break; case DbTreeItem::Type::DB: - enabled << CREATE_GROUP << DELETE_DB << EDIT_DB; + enabled << CREATE_GROUP << DELETE_DB << EDIT_DB << EXEC_SQL_FROM_FILE; break; case DbTreeItem::Type::TABLES: break; @@ -308,7 +344,7 @@ void DbTree::updateActionStates(const QStandardItem *item) enabled << REFRESH_SCHEMAS; - foreach (int action, actionMap.keys()) + for (int action : actionMap.keys()) setActionEnabled(action, enabled.contains(action)); } @@ -380,6 +416,8 @@ void DbTree::setupActionsForMenu(DbTreeItem* currItem, QMenu* contextMenu) actions += ActionEntry(CONVERT_DB); actions += ActionEntry(VACUUM_DB); actions += ActionEntry(INTEGRITY_CHECK); + actions += ActionEntry(EXEC_SQL_FROM_FILE); + actions += ActionEntry(OPEN_DB_DIRECTORY); actions += ActionEntry(_separator); } else @@ -559,7 +597,7 @@ void DbTree::setupActionsForMenu(DbTreeItem* currItem, QMenu* contextMenu) actions += ActionEntry(REFRESH_SCHEMAS); QMenu* subMenu = nullptr; - foreach (ActionEntry actionEntry, actions) + for (ActionEntry actionEntry : actions) { switch (actionEntry.type) { @@ -576,7 +614,7 @@ void DbTree::setupActionsForMenu(DbTreeItem* currItem, QMenu* contextMenu) case ActionEntry::Type::SUB_MENU: { subMenu = contextMenu->addMenu(actionEntry.subMenuIcon, actionEntry.subMenuLabel); - foreach (Action action, actionEntry.actions) + for (Action action : actionEntry.actions) { if (action == DbTree::_separator) { @@ -624,10 +662,10 @@ DbTreeView*DbTree::getView() const return ui->treeView; } -bool DbTree::isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item) +bool DbTree::isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item, bool forPasting) { if (mimeData->formats().contains(DbTreeModel::MIMETYPE)) - return areDbTreeItemsValidForItem(getModel()->getDragItems(mimeData), item); + return areDbTreeItemsValidForItem(getModel()->getDragItems(mimeData), item, forPasting); else if (mimeData->hasUrls()) return areUrlsValidForItem(mimeData->urls(), item); @@ -639,7 +677,7 @@ bool DbTree::isItemDraggable(const DbTreeItem* item) return item && draggableTypes.contains(item->getType()); } -bool DbTree::areDbTreeItemsValidForItem(QList srcItems, const DbTreeItem* dstItem) +bool DbTree::areDbTreeItemsValidForItem(QList srcItems, const DbTreeItem* dstItem, bool forPasting) { QSet srcDbs; QList srcTypes; @@ -647,6 +685,9 @@ bool DbTree::areDbTreeItemsValidForItem(QList srcItems, const DbTre if (dstItem) dstType = dstItem->getType(); + if (dstType == DbTreeItem::Type::DB && !dstItem->getDb()->isOpen()) + return false; + for (DbTreeItem* srcItem : srcItems) { if (!srcItem) @@ -664,9 +705,6 @@ bool DbTree::areDbTreeItemsValidForItem(QList srcItems, const DbTre { if (!allowedTypesInside[dstType].contains(srcType)) return false; - - if (dstType == DbTreeItem::Type::DB && !dstItem->getDb()->isOpen()) - return false; } // Support for d&d reordering of db objects @@ -677,7 +715,8 @@ bool DbTree::areDbTreeItemsValidForItem(QList srcItems, const DbTre {DbTreeItem::Type::INDEX, DbTreeItem::Type::INDEXES} }; - if (srcTypes.toSet().size() == 1 && srcDbs.size() == 1 && dstItem && *(srcDbs.begin()) == dstItem->getDb() && reorderingTypeToParent[srcTypes.first()] == dstType) + if (!forPasting && srcTypes.toSet().size() == 1 && srcDbs.size() == 1 && dstItem && + *(srcDbs.begin()) == dstItem->getDb() && reorderingTypeToParent[srcTypes.first()] == dstType) return true; // No other d&d within same db @@ -698,14 +737,14 @@ bool DbTree::areUrlsValidForItem(const QList& srcUrls, const DbTreeItem* d return true; } -void DbTree::showWidgetCover() +void DbTree::showRefreshWidgetCover() { - widgetCover->show(); + treeRefreshWidgetCover->show(); } -void DbTree::hideWidgetCover() +void DbTree::hideRefreshWidgetCover() { - widgetCover->hide(); + treeRefreshWidgetCover->hide(); } void DbTree::setSelectedItem(DbTreeItem *item) @@ -861,11 +900,10 @@ void DbTree::filterItemsWithParentInList(QList& items) { QMutableListIterator it(items); DbTreeItem* item = nullptr; - DbTreeItem* pathItem = nullptr; while (it.hasNext()) { item = it.next(); - foreach (pathItem, item->getPathToRoot().mid(1)) + for (DbTreeItem* pathItem : item->getPathToRoot().mid(1)) { if (items.contains(pathItem) && pathItem->getType() != DbTreeItem::Type::DIR) { @@ -1627,7 +1665,6 @@ QList DbTree::getSelectedItems(DbTree::ItemFilterFunc filterFunc) return items; } - void DbTree::deleteItems(const QList& itemsToDelete) { QList items = itemsToDelete; @@ -1642,7 +1679,7 @@ void DbTree::deleteItems(const QList& itemsToDelete) QStringList databasesToRemove; QString itemStr; int groupItems = 0; - foreach (DbTreeItem* item, items) + for (DbTreeItem* item : items) { itemStr = itemTmp.arg(item->getIcon()->toUrl()).arg(item->text().left(ITEM_TEXT_LIMIT)); @@ -1694,7 +1731,7 @@ void DbTree::deleteItems(const QList& itemsToDelete) void DbTree::refreshSchemas() { - foreach (Db* db, DBLIST->getDbList()) + for (Db* db : DBLIST->getDbList()) treeModel->refreshSchema(db); updateActionsForCurrent(); @@ -1716,6 +1753,22 @@ void DbTree::updateActionsForCurrent() updateActionStates(ui->treeView->currentItem()); } +void DbTree::setFileExecProgress(int newValue) +{ + fileExecWidgetCover->setProgress(newValue); +} + +void DbTree::hideFileExecCover() +{ + fileExecWidgetCover->hide(); +} + +void DbTree::showFileExecErrors(const QList >& errors, bool rolledBack) +{ + FileExecErrorsDialog dialog(errors, rolledBack, MAINWINDOW); + dialog.exec(); +} + void DbTree::dbConnected(Db* db) { updateActionsForCurrent(); @@ -1780,6 +1833,166 @@ void DbTree::generateDeleteForTable() MAINWINDOW->openSqlEditor(db, sql); } +void DbTree::openDbDirectory() +{ + Db* db = getSelectedDb(); + if (!db) + return; + + QFileInfo fi(db->getPath()); + if (!fi.exists()) + return; + + QUrl url = QUrl::fromLocalFile(fi.dir().path()); + if (url.isValid()) + QDesktopServices::openUrl(url); +} + +void DbTree::execSqlFromFile() +{ + Db* db = getSelectedDb(); + if (!db || !db->isOpen()) + return; + + ExecFromFileDialog dialog(MAINWINDOW); + int res = dialog.exec(); + if (res != QDialog::Accepted) + return; + + if (executingQueriesFromFile) + return; + + // Exec file + executingQueriesFromFile = 1; + executingQueriesFromFileDb = db; + fileExecWidgetCover->setProgress(0); + fileExecWidgetCover->show(); + if (!db->begin()) + { + notifyError(tr("Could not execute SQL, because application has failed to start transaction: %1").arg(db->getErrorText())); + fileExecWidgetCover->hide(); + return; + } + + QtConcurrent::run(this, &DbTree::execFromFileAsync, dialog.filePath(), db, dialog.ignoreErrors(), dialog.codec()); +} + +void DbTree::execFromFileAsync(const QString& path, Db* db, bool ignoreErrors, const QString& codec) +{ + // Open file + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + notifyError(tr("Could not open file '%1' for reading: %2").arg(path).arg(file.errorString())); + executingQueriesFromFile = 0; + emit fileExecCoverToBeClosed(); + return; + } + + + QTextStream stream(&file); + stream.setCodec(codec.toLatin1().constData()); + + qint64 fileSize = file.size(); + int attemptedExecutions = 0; + int executed = 0; + bool ok = true; + + QTime timer; + timer.start(); + QList> errors = executeFileQueries(db, stream, executed, attemptedExecutions, ok, ignoreErrors, fileSize); + int millis = timer.elapsed(); + if (executingQueriesFromFile.loadAcquire()) + { + handleFileQueryExecution(db, executed, attemptedExecutions, ok, ignoreErrors, millis); + if (!errors.isEmpty()) + emit fileExecErrors(errors, !ok && !ignoreErrors); + } + + file.close(); + emit fileExecCoverToBeClosed(); + executingQueriesFromFile = 0; +} + +QList> DbTree::executeFileQueries(Db* db, QTextStream& stream, int& executed, int& attemptedExecutions, bool& ok, bool ignoreErrors, qint64 fileSize) +{ + QList> errors; + qint64 pos = 0; + QChar c; + QString sql; + sql.reserve(10000); + SqlQueryPtr results; + while (!stream.atEnd() && executingQueriesFromFile.loadAcquire()) + { + while (!db->isComplete(sql) && !stream.atEnd()) + { + stream >> c; + sql.append(c); + while (c != ';' && !stream.atEnd()) + { + stream >> c; + sql.append(c); + } + } + + if (sql.trimmed().isEmpty()) + continue; + + results = db->exec(sql); + attemptedExecutions++; + if (results->isError()) + { + ok = false; + errors << QPair(sql, results->getErrorText()); + + if (!ignoreErrors) + break; + } + else + executed++; + + sql.clear(); + if (attemptedExecutions % 100 == 0) + { + pos = stream.device()->pos(); + emit updateFileExecProgress(static_cast(100 * pos / fileSize)); + } + } + return errors; +} + +void DbTree::handleFileQueryExecution(Db* db, int executed, int attemptedExecutions, bool ok, bool ignoreErrors, int millis) +{ + bool doCommit = ok ? true : ignoreErrors; + if (doCommit) + { + if (!db->commit()) + { + db->rollback(); + notifyError(tr("Could not execute SQL, because application has failed to commit the transaction: %1").arg(db->getErrorText())); + } + else if (!ok) // committed with errors + { + notifyInfo(tr("Finished executing %1 queries in %2 seconds. %3 were not executed due to errors.") + .arg(executed).arg(millis / 1000.0).arg(attemptedExecutions - executed)); + } + else + { + notifyInfo(tr("Finished executing %1 queries in %2 seconds.").arg(executed).arg(millis / 1000.0)); + } + } + else + { + db->rollback(); + notifyError(tr("Could not execute SQL due to error.")); + } +} + +bool DbTree::execQueryFromFile(Db* db, const QString& sql) +{ + return !db->exec(sql)->isError(); +} + void DbTree::setupDefShortcuts() { setShortcutContext({ diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.h b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.h index f97e5eb..f72ebda 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.h +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.h @@ -8,6 +8,7 @@ #include "guiSQLiteStudio_global.h" #include #include +#include class WidgetCover; class QAction; @@ -90,6 +91,8 @@ class GUI_API_EXPORT DbTree : public QDockWidget, public ExtActionContainer GENERATE_UPDATE, GENERATE_INSERT, GENERATE_DELETE, + OPEN_DB_DIRECTORY, + EXEC_SQL_FROM_FILE, _separator // Never use it directly, it's just for menu setup }; @@ -109,10 +112,10 @@ class GUI_API_EXPORT DbTree : public QDockWidget, public ExtActionContainer void restoreSession(const QVariant& sessionValue); DbTreeModel* getModel() const; DbTreeView* getView() const; - void showWidgetCover(); - void hideWidgetCover(); + void showRefreshWidgetCover(); + void hideRefreshWidgetCover(); void setSelectedItem(DbTreeItem* item); - bool isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item); + bool isMimeDataValidForItem(const QMimeData* mimeData, const DbTreeItem* item, bool forPasting = false); QToolBar* getToolBar(int toolbar) const; Db* getSelectedDb(); Db* getSelectedOpenDb(); @@ -149,14 +152,21 @@ class GUI_API_EXPORT DbTree : public QDockWidget, public ExtActionContainer QString getSelectedViewName() const; QList getSelectedItems(DbTreeItem::Type itemType); QList getSelectedItems(ItemFilterFunc filterFunc = nullptr); + void execFromFileAsync(const QString& path, Db* db, bool ignoreErrors, const QString& codec); + bool execQueryFromFile(Db* db, const QString& sql); + void handleFileQueryExecution(Db* db, int executed, int attemptedExecutions, bool ok, bool ignoreErrors, int millis); + QList> executeFileQueries(Db* db, QTextStream& stream, int& executed, int& attemptedExecutions, bool& ok, bool ignoreErrors, qint64 fileSize); - static bool areDbTreeItemsValidForItem(QList srcItems, const DbTreeItem* dstItem); + static bool areDbTreeItemsValidForItem(QList srcItems, const DbTreeItem* dstItem, bool forPasting = false); static bool areUrlsValidForItem(const QList& srcUrls, const DbTreeItem* dstItem); static void initDndTypes(); Ui::DbTree *ui = nullptr; DbTreeModel* treeModel = nullptr; - WidgetCover* widgetCover = nullptr; + WidgetCover* treeRefreshWidgetCover = nullptr; + WidgetCover* fileExecWidgetCover = nullptr; + QAtomicInt executingQueriesFromFile = 0; + Db* executingQueriesFromFileDb = nullptr; static QHash> allowedTypesInside; static QSet draggableTypes; @@ -221,6 +231,16 @@ class GUI_API_EXPORT DbTree : public QDockWidget, public ExtActionContainer void generateInsertForTable(); void generateUpdateForTable(); void generateDeleteForTable(); + void openDbDirectory(); + void execSqlFromFile(); + void setFileExecProgress(int newValue); + void hideFileExecCover(); + void showFileExecErrors(const QList>& errors, bool rolledBack); + + signals: + void updateFileExecProgress(int value); + void fileExecCoverToBeClosed(); + void fileExecErrors(const QList>& errors, bool rolledBack); }; int qHash(DbTree::Action action); diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp index 9fe88c2..123c4df 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp @@ -99,7 +99,7 @@ void DbTreeModel::deleteGroup(QStandardItem *groupItem) if (!parentItem) parentItem = root(); - foreach (QStandardItem* child, dynamic_cast(groupItem)->childs()) + for (QStandardItem* child : dynamic_cast(groupItem)->childs()) move(child, parentItem); parentItem->removeRow(groupItem->row()); @@ -163,12 +163,12 @@ void DbTreeModel::storeGroups() void DbTreeModel::readGroups(QList dbList) { QList groups = CFG->getGroups(); - foreach (const Config::DbGroupPtr& group, groups) + for (const Config::DbGroupPtr& group : groups) restoreGroup(group, &dbList); // Add rest of databases, not mentioned in groups Config::DbGroupPtr group; - foreach (Db* db, dbList) + for (Db* db : dbList) { group = Config::DbGroupPtr::create(); group->referencedDbName = db->getName(); @@ -243,7 +243,7 @@ void DbTreeModel::restoreGroup(const Config::DbGroupPtr& group, QList* dbLi if (item->getType() == DbTreeItem::Type::DIR) { - foreach (const Config::DbGroupPtr& childGroup, group->childs) + for (const Config::DbGroupPtr& childGroup : group->childs) restoreGroup(childGroup, dbList, item); } @@ -538,7 +538,7 @@ QList DbTreeModel::refreshSchemaTables(const QStringList &table sortedTables.sort(Qt::CaseInsensitive); QList items; - foreach (const QString& table, sortedTables) + for (const QString& table : sortedTables) { if (virtualTables.contains(table)) items += DbTreeItemFactory::createVirtualTable(table, this); @@ -605,7 +605,7 @@ QList DbTreeModel::refreshSchemaViews(const QStringList &views, sortedViews.sort(Qt::CaseInsensitive); QList items; - foreach (const QString& view, sortedViews) + for (const QString& view : sortedViews) items += DbTreeItemFactory::createView(view, this); return items; @@ -638,7 +638,7 @@ void DbTreeModel::refreshSchemaBuild(QStandardItem *dbItem, DbTreeItem* columnsItem = nullptr; DbTreeItem* indexesItem = nullptr; DbTreeItem* triggersItem = nullptr; - foreach (QStandardItem* tableItem, tables) + for (QStandardItem* tableItem : tables) { tablesItem->appendRow(tableItem); @@ -650,22 +650,22 @@ void DbTreeModel::refreshSchemaBuild(QStandardItem *dbItem, tableItem->appendRow(indexesItem); tableItem->appendRow(triggersItem); - foreach (QStandardItem* columnItem, allTableColumns[tableItem->text()]) + for (QStandardItem* columnItem : allTableColumns[tableItem->text()]) columnsItem->appendRow(columnItem); - foreach (QStandardItem* indexItem, indexes[tableItem->text()]) + for (QStandardItem* indexItem : indexes[tableItem->text()]) indexesItem->appendRow(indexItem); - foreach (QStandardItem* triggerItem, triggers[tableItem->text()]) + for (QStandardItem* triggerItem : triggers[tableItem->text()]) triggersItem->appendRow(triggerItem); } - foreach (QStandardItem* viewItem, views) + for (QStandardItem* viewItem : views) { viewsItem->appendRow(viewItem); triggersItem = DbTreeItemFactory::createTriggers(this); viewItem->appendRow(triggersItem); - foreach (QStandardItem* triggerItem, triggers[viewItem->text()]) + for (QStandardItem* triggerItem : triggers[viewItem->text()]) triggersItem->appendRow(triggerItem); } } @@ -677,7 +677,7 @@ void DbTreeModel::restoreExpandedState(const QHash& expandedState if (expandedState.contains(sig) && expandedState[sig]) treeView->expand(parentItem->index()); - foreach (QStandardItem* child, parentDbTreeItem->childs()) + for (QStandardItem* child : parentDbTreeItem->childs()) restoreExpandedState(expandedState, child); } @@ -965,7 +965,7 @@ bool DbTreeModel::pasteData(const QMimeData* data, int row, int column, const QM } if (data->formats().contains(MIMETYPE)) - return dropDbTreeItem(getDragItems(data), dstItem, defaultAction, *invokeStdAction); + return dropDbTreeItem(getDragItems(data), dstItem, defaultAction, invokeStdAction); else if (data->hasUrls()) return dropUrls(data->urls()); else @@ -975,7 +975,7 @@ bool DbTreeModel::pasteData(const QMimeData* data, int row, int column, const QM void DbTreeModel::interruptableStarted(Interruptable* obj) { if (interruptables.size() == 0) - treeView->getDbTree()->showWidgetCover(); + treeView->getDbTree()->showRefreshWidgetCover(); interruptables << obj; } @@ -984,7 +984,7 @@ void DbTreeModel::interruptableFinished(Interruptable* obj) { interruptables.removeOne(obj); if (interruptables.size() == 0) - treeView->getDbTree()->hideWidgetCover(); + treeView->getDbTree()->hideRefreshWidgetCover(); } QList DbTreeModel::getDragItems(const QMimeData* data) @@ -1025,7 +1025,7 @@ void DbTreeModel::staticInit() { } -bool DbTreeModel::dropDbTreeItem(const QList& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool& invokeStdDropAction) +bool DbTreeModel::dropDbTreeItem(const QList& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool *invokeStdDropAction) { // The result means: do we want the old item to be removed from the tree? if (srcItems.size() == 0) @@ -1040,9 +1040,9 @@ bool DbTreeModel::dropDbTreeItem(const QList& srcItems, DbTreeItem* if (!dstItem) return false; - if (srcItem->getDb() == dstItem->getDb()) + if (srcItem->getDb() == dstItem->getDb() && invokeStdDropAction) { - invokeStdDropAction = true; + *invokeStdDropAction = true; return true; } @@ -1050,8 +1050,12 @@ bool DbTreeModel::dropDbTreeItem(const QList& srcItems, DbTreeItem* } case DbTreeItem::Type::DB: case DbTreeItem::Type::DIR: - invokeStdDropAction = true; + { + if (invokeStdDropAction) + *invokeStdDropAction = true; + break; + } case DbTreeItem::Type::COLUMN: case DbTreeItem::Type::TABLES: case DbTreeItem::Type::INDEXES: diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.h b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.h index 50b080d..9ba0d82 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.h @@ -81,7 +81,7 @@ class GUI_API_EXPORT DbTreeModel : public QStandardItemModel QString getDbToolTip(DbTreeItem *item) const; QString getTableToolTip(DbTreeItem *item) const; QList getChildsAsFlatList(QStandardItem* item) const; - bool dropDbTreeItem(const QList& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool &invokeStdDropAction); + bool dropDbTreeItem(const QList& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction, bool* invokeStdDropAction); bool dropDbObjectItem(const QList& srcItems, DbTreeItem* dstItem, Qt::DropAction defaultAction); QCheckBox* createCopyOrMoveMenuCheckBox(QMenu* menu, const QString& label); bool dropUrls(const QList& urls); diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp index 7785b8f..9382d7c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreeview.cpp @@ -54,7 +54,7 @@ QList DbTreeView::selectionItems() { QList items; QModelIndexList selectedIndexes = selectionModel()->selectedIndexes(); - foreach (QModelIndex modIdx, selectedIndexes) + for (QModelIndex modIdx : selectedIndexes) items += dynamic_cast(model()->itemFromIndex(modIdx)); return items; diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/aboutdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/aboutdialog.ui index 179ee3b..16a6e1f 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/aboutdialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/aboutdialog.ui @@ -17,7 +17,7 @@ - 2 + 0 @@ -27,7 +27,7 @@ - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> true diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.cpp new file mode 100644 index 0000000..1d7ba66 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.cpp @@ -0,0 +1,133 @@ +#include "bindparamsdialog.h" +#include "ui_bindparamsdialog.h" +#include "common/bindparam.h" +#include "multieditor/multieditor.h" +#include "widgetresizer.h" +#include "services/pluginmanager.h" +#include "multieditor/multieditorwidgetplugin.h" +#include "multieditor/multieditorwidget.h" +#include + +BindParamsDialog::BindParamsDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::BindParamsDialog) +{ + init(); +} + +BindParamsDialog::~BindParamsDialog() +{ + delete ui; +} + +void BindParamsDialog::setBindParams(const QVector& params) +{ + bindParams = params; + initEditors(); +} + +void BindParamsDialog::init() +{ + ui->setupUi(this); + + contents = new QWidget(); + QVBoxLayout *contentsLayout = new QVBoxLayout(); + contentsLayout->setSpacing(spacing); + contentsLayout->setMargin(margins); + contentsLayout->setAlignment(Qt::AlignTop); + contents->setLayout(contentsLayout); + + ui->scrollArea->setWidget(contents); + ui->scrollArea->setAlignment(Qt::AlignTop); +} + +void BindParamsDialog::initEditors() +{ + QStringList paramNames; + for (BindParam* param : bindParams) + paramNames << param->originalName; + + MultiEditor* firstEditor = nullptr; + MultiEditor* multiEditor = nullptr; + QVector> paramHistory = CFG->getBindParamHistory(paramNames); + for (BindParam* param : bindParams) + { + multiEditor = initEditor(param, paramHistory.size() > param->position ? paramHistory[param->position].second : QVariant()); + if (firstEditor == nullptr) + firstEditor = multiEditor; + } + + firstEditor->focusThisEditor(); +} + +MultiEditor* BindParamsDialog::initEditor(BindParam* param, const QVariant& cachedValue) +{ + // Label + static_qstring(nameTpl, "[%1] %2"); + QString label = nameTpl.arg(param->position + 1).arg(param->originalName); + + // MultiEditor + MultiEditor* multiEditor = new MultiEditor(this, MultiEditor::DYNAMIC); + multiEditor->setReadOnly(false); + multiEditor->setCornerLabel(label); + contents->layout()->addWidget(multiEditor); + contents->layout()->setAlignment(multiEditor, Qt::AlignTop); + editors[param] = multiEditor; + + // MultiEditor editors + MultiEditorWidgetPlugin* plugin = dynamic_cast(PLUGINS->getLoadedPlugin("MultiEditorNumericPlugin")); + MultiEditorWidget* editor = plugin->getInstance(); + editor->setTabLabel(plugin->getTabLabel()); + multiEditor->addEditor(editor); + + plugin = dynamic_cast(PLUGINS->getLoadedPlugin("MultiEditorTextPlugin")); + editor = plugin->getInstance(); + editor->setTabLabel(plugin->getTabLabel()); + multiEditor->addEditor(editor); + + // Resizer + WidgetResizer* resizer = new WidgetResizer(Qt::Vertical); + resizer->setWidget(multiEditor); + resizer->setWidgetMinimumSize(0, minimumFieldHeight); + contents->layout()->addWidget(resizer); + resizer->minimizeHeight(); + + if (cachedValue.isValid()) + { + switch (cachedValue.type()) + { + case QVariant::LongLong: + case QVariant::ULongLong: + case QVariant::Int: + case QVariant::UInt: + case QVariant::Double: + multiEditor->showTab(0); + break; + default: + multiEditor->showTab(1); + break; + } + + multiEditor->setValue(cachedValue); + } + + return multiEditor; +} + +void BindParamsDialog::accept() +{ + QVector> paramHistory; + paramHistory.reserve(bindParams.size()); + bool rememberValue = false; + QVariant emptyValue; + for (BindParam* param : bindParams) + { + param->value = editors[param]->getValue(); + rememberValue = (param->value.type() != QVariant::ByteArray || param->value.toByteArray().size() <= 102400); + paramHistory << QPair(param->originalName, rememberValue ? param->value : emptyValue); + } + + CFG->addBindParamHistory(paramHistory); + + QDialog::accept(); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.h new file mode 100644 index 0000000..666ffc4 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.h @@ -0,0 +1,41 @@ +#ifndef BINDPARAMSDIALOG_H +#define BINDPARAMSDIALOG_H + +#include + +namespace Ui { + class BindParamsDialog; +} + +struct BindParam; +class MultiEditor; + +class BindParamsDialog : public QDialog +{ + Q_OBJECT + + public: + explicit BindParamsDialog(QWidget *parent = nullptr); + ~BindParamsDialog(); + + void setBindParams(const QVector& params); + + private: + void init(); + void initEditors(); + MultiEditor* initEditor(BindParam* param, const QVariant& cachedValue); + + static const int margins = 2; + static const int spacing = 2; + static const int minimumFieldHeight = 80; + + Ui::BindParamsDialog *ui; + QVector bindParams; + QHash editors; + QWidget* contents = nullptr; + + public slots: + void accept(); +}; + +#endif // BINDPARAMSDIALOG_H diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.ui new file mode 100644 index 0000000..b6af05a --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/bindparamsdialog.ui @@ -0,0 +1,97 @@ + + + BindParamsDialog + + + Qt::WindowModal + + + + 0 + 0 + 576 + 420 + + + + Query parameters + + + true + + + + + + Please provide values for query parameters + + + Qt::AlignCenter + + + + + + + true + + + + + 0 + 0 + 556 + 352 + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Abort|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + BindParamsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + BindParamsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp deleted file mode 100644 index 59a2ec6..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include "bugdialog.h" -#include "ui_bugdialog.h" -#include "iconmanager.h" -#include "uiutils.h" -#include "common/utils.h" -#include "sqlitestudio.h" -#include "mainwindow.h" -#include "bugreportlogindialog.h" -#include "services/pluginmanager.h" -#include "services/bugreporter.h" -#include "services/notifymanager.h" -#include -#include -#include - -BugDialog::BugDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::BugDialog) -{ - init(); -} - -BugDialog::~BugDialog() -{ - delete ui; -} - -void BugDialog::setFeatureRequestMode(bool feature) -{ - bugMode = !feature; - updateState(); -} - -void BugDialog::init() -{ - ui->setupUi(this); - resize(width(), height() - 50); - - ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Send")); - - connect(ui->moreDetailsGroup, SIGNAL(toggled(bool)), this, SLOT(updateState())); - connect(ui->shortDescriptionEdit, SIGNAL(textChanged(QString)), this, SLOT(validate())); - connect(ui->longDescriptionEdit, SIGNAL(textChanged()), this, SLOT(validate())); - connect(ui->emailEdit, SIGNAL(textChanged(QString)), this, SLOT(validate())); - connect(ui->helpButton, SIGNAL(clicked()), this, SLOT(help())); - connect(ui->loginButton, SIGNAL(clicked()), this, SLOT(logIn())); - - ui->versionEdit->setText(SQLITESTUDIO->getVersionString()); - ui->osEdit->setText(getOsString()); - ui->pluginsEdit->setText(PLUGINS->getLoadedPluginNames().join(", ")); - - user = CFG_CORE.Internal.BugReportUser.get(); - - if (CFG_CORE.Internal.BugReportRecentError.get()) - { - ui->shortDescriptionEdit->setText(CFG_CORE.Internal.BugReportRecentTitle.get()); - ui->longDescriptionEdit->setPlainText(CFG_CORE.Internal.BugReportRecentContents.get()); - } - - updateState(); - validate(); -} - -QString BugDialog::getMessageAboutReportHistory() -{ - return tr("You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'.").arg(MAINWINDOW->getSQLiteStudioMenu()->title()) - .arg(MAINWINDOW->getAction(MainWindow::BUG_REPORT_HISTORY)->text()); -} - -void BugDialog::finishedBugReport(bool success, const QString& errorMsg) -{ - if (success) - { - notifyInfo(tr("A bug report sent successfully.") + " " + getMessageAboutReportHistory()); - } - else - { - CFG_CORE.Internal.BugReportRecentError.set(true); - notifyError(tr("An error occurred while sending a bug report: %1\n%2").arg(errorMsg, - tr("You can retry sending. The contents will be restored when you open a report dialog after an error like this."))); - } -} - -void BugDialog::finishedFeatureRequest(bool success, const QString& errorMsg) -{ - if (success) - { - notifyInfo(tr("An idea proposal sent successfully.") + " " + getMessageAboutReportHistory()); - } - else - { - CFG_CORE.Internal.BugReportRecentError.set(true); - notifyError(tr("An error occurred while sending an idea proposal: %1\n%2").arg(errorMsg, - tr("You can retry sending. The contents will be restored when you open a report dialog after an error like this."))); - } -} - -void BugDialog::updateState() -{ - ui->scrollArea->setVisible(ui->moreDetailsGroup->isChecked()); - - ui->moreDetailsGroup->setVisible(bugMode); - if (bugMode) - { - setWindowTitle(tr("A bug report")); - ui->shortDescriptionEdit->setPlaceholderText(tr("Describe problem in few words")); - ui->longDescriptionEdit->setPlaceholderText(tr("Describe problem and how to reproduce it")); - } - else - { - setWindowTitle(tr("A new feature idea")); - ui->shortDescriptionEdit->setPlaceholderText(tr("A title for your idea")); - ui->longDescriptionEdit->setPlaceholderText(tr("Describe your idea in more details")); - } - - if (user.isNull()) - { - ui->currentLoginLabel->setToolTip(tr("Reporting as an unregistered user, using e-mail address.")); - ui->currentLoginLabel->setPixmap(ICONS.USER_UNKNOWN); - ui->emailEdit->setEnabled(true); - ui->loginButton->setText(tr("Log in")); - ui->loginButton->setIcon(ICONS.USER); - validate(); - } - else - { - ui->currentLoginLabel->setToolTip(tr("Reporting as a registered user.")); - ui->currentLoginLabel->setPixmap(ICONS.USER); - ui->emailEdit->setText(user); - ui->emailEdit->setEnabled(false); - ui->loginButton->setText(tr("Log out")); - ui->loginButton->setIcon(ICONS.USER_UNKNOWN); - } -} - -void BugDialog::validate() -{ - bool emailOk = !user.isNull() || validateEmail(ui->emailEdit->text()); - int shortSize = ui->shortDescriptionEdit->text().trimmed().size(); - int longSize = ui->longDescriptionEdit->toPlainText().trimmed().size(); - bool shortOk = shortSize >= 10 && shortSize <= 100; - bool longOk = longSize >= 30; - - setValidStateWihtTooltip(ui->emailEdit, tr("Providing true email address will make it possible to contact you regarding your report. " - "To learn more, press 'help' button on the right side."), - emailOk, tr("Enter vaild e-mail address, or log in.")); - - setValidState(ui->shortDescriptionEdit, shortOk, tr("Short description requires at least 10 characters, but not more than 100. " - "Longer description can be entered in the field below.")); - - setValidState(ui->longDescriptionEdit, longOk, tr("Long description requires at least 30 characters.")); - - bool valid = shortOk && longOk && emailOk; - ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid); -} - -void BugDialog::help() -{ - if (user.isNull()) - QDesktopServices::openUrl(QUrl(BUGS->getReporterEmailHelpUrl())); - else - QDesktopServices::openUrl(QUrl(BUGS->getReporterUserAndPasswordHelpUrl())); -} - -void BugDialog::logIn() -{ - if (!user.isNull()) - { - // Log out - user = QString(); - updateState(); - BUGS->clearBugReportCredentials(); - return; - } - - BugReportLoginDialog dialog(this); - if (dialog.exec() != QDialog::Accepted) - return; - - if (!dialog.isValid()) - return; - - BUGS->useBugReportCredentials(dialog.getLogin(), dialog.getPassword()); - user = dialog.getLogin(); - updateState(); -} - -void BugDialog::accept() -{ - CFG_CORE.Internal.BugReportRecentError.set(false); - CFG_CORE.Internal.BugReportRecentTitle.set(ui->shortDescriptionEdit->text()); - CFG_CORE.Internal.BugReportRecentContents.set(ui->longDescriptionEdit->toPlainText()); - - if (bugMode) - { - if (user.isNull()) - { - BUGS->reportBug(ui->emailEdit->text(), ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), ui->versionEdit->text(), - ui->osEdit->text(), ui->pluginsEdit->text(), BugDialog::finishedBugReport); - } - else - { - BUGS->reportBug(ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), ui->versionEdit->text(), ui->osEdit->text(), ui->pluginsEdit->text(), - BugDialog::finishedFeatureRequest); - } - } - else - { - if (user.isNull()) - { - BUGS->requestFeature(ui->emailEdit->text(), ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), BugDialog::finishedFeatureRequest); - } - else - { - BUGS->requestFeature(ui->shortDescriptionEdit->text(), ui->longDescriptionEdit->toPlainText(), BugDialog::finishedFeatureRequest); - } - } - QDialog::accept(); -} diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.h deleted file mode 100644 index bf60104..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef BUGDIALOG_H -#define BUGDIALOG_H - -#include "guiSQLiteStudio_global.h" -#include - -namespace Ui { - class BugDialog; -} - -class GUI_API_EXPORT BugDialog : public QDialog -{ - Q_OBJECT - - public: - explicit BugDialog(QWidget *parent = 0); - ~BugDialog(); - - void setFeatureRequestMode(bool feature); - - private: - void init(); - - static QString getMessageAboutReportHistory(); - static void finishedBugReport(bool success, const QString& errorMsg); - static void finishedFeatureRequest(bool success, const QString& errorMsg); - - Ui::BugDialog *ui = nullptr; - bool bugMode = true; - QString user; - - private slots: - void updateState(); - void validate(); - void help(); - void logIn(); - - public slots: - void accept(); -}; - -#endif // BUGDIALOG_H diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.ui deleted file mode 100644 index 3871436..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugdialog.ui +++ /dev/null @@ -1,208 +0,0 @@ - - - BugDialog - - - - 0 - 0 - 516 - 421 - - - - Bugs and ideas - - - - - - Reporter - - - - - - - - - :/icons/img/user_unknown.png - - - - - - - E-mail address - - - - - - - Log in - - - - :/icons/img/user.png:/icons/img/user.png - - - - - - - ... - - - - :/icons/img/help.png:/icons/img/help.png - - - - - - - - - - Short description - - - - - - - - - - - - Detailed description - - - - - - - - - - - - Show more details - - - true - - - false - - - - - - true - - - - - 0 - 0 - 462 - 209 - - - - - - - SQLiteStudio version - - - - - - - - - - - - Operating system - - - - - - - - - - - - Loaded plugins - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - - buttonBox - accepted() - BugDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - BugDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.cpp deleted file mode 100644 index 19727fe..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "bugreportlogindialog.h" -#include "ui_bugreportlogindialog.h" -#include "uiutils.h" -#include "services/bugreporter.h" -#include "iconmanager.h" -#include "common/widgetcover.h" -#include - -BugReportLoginDialog::BugReportLoginDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::BugReportLoginDialog) -{ - init(); -} - -BugReportLoginDialog::~BugReportLoginDialog() -{ - delete ui; -} - -bool BugReportLoginDialog::isValid() const -{ - return validCredentials; -} - -QString BugReportLoginDialog::getLogin() const -{ - return ui->loginEdit->text(); -} - -QString BugReportLoginDialog::getPassword() const -{ - return ui->passwordEdit->text(); -} - -void BugReportLoginDialog::init() -{ - ui->setupUi(this); - connect(ui->loginEdit, SIGNAL(textChanged(QString)), this, SLOT(credentialsChanged())); - connect(ui->passwordEdit, SIGNAL(textChanged(QString)), this, SLOT(credentialsChanged())); - connect(ui->validationButton, SIGNAL(clicked()), this, SLOT(remoteValidation())); - connect(BUGS, SIGNAL(credentialsValidationResult(bool,QString)), this, SLOT(remoteValidationResult(bool,QString))); - - widgetCover = new WidgetCover(this); - widgetCover->initWithInterruptContainer(tr("Abort")); - connect(widgetCover, SIGNAL(cancelClicked()), this, SLOT(abortRemoteValidation())); - - validate(); -} - -void BugReportLoginDialog::credentialsChanged() -{ - validCredentials = false; - validate(); -} - -void BugReportLoginDialog::validate() -{ - QString login = ui->loginEdit->text(); - QString pass = ui->passwordEdit->text(); - - bool loginOk = login.size() >= 2; - bool passOk = pass.size() >= 5; - - setValidState(ui->loginEdit, loginOk, tr("A login must be at least 2 characters long.")); - setValidState(ui->passwordEdit, passOk, tr("A password must be at least 5 characters long.")); - - bool credentialsOk = loginOk && passOk; - ui->validationButton->setEnabled(credentialsOk); - ui->validationLabel->setEnabled(credentialsOk); - - bool valid = credentialsOk && validCredentials; - ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid); -} - -void BugReportLoginDialog::abortRemoteValidation() -{ - BUGS->abortCredentialsValidation(); -} - -void BugReportLoginDialog::remoteValidation() -{ - widgetCover->show(); - BUGS->validateBugReportCredentials(ui->loginEdit->text(), ui->passwordEdit->text()); -} - -void BugReportLoginDialog::remoteValidationResult(bool success, const QString& errorMessage) -{ - validCredentials = success; - ui->validationButton->setIcon(success ? ICONS.TEST_CONN_OK : ICONS.TEST_CONN_ERROR); - ui->validationLabel->setText(success ? tr("Valid") : errorMessage); - validate(); - widgetCover->hide(); -} diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.h deleted file mode 100644 index 131ba3d..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef BUGREPORTLOGINDIALOG_H -#define BUGREPORTLOGINDIALOG_H - -#include "guiSQLiteStudio_global.h" -#include - -namespace Ui { - class BugReportLoginDialog; -} - -class WidgetCover; - -class GUI_API_EXPORT BugReportLoginDialog : public QDialog -{ - Q_OBJECT - - public: - explicit BugReportLoginDialog(QWidget *parent = 0); - ~BugReportLoginDialog(); - - bool isValid() const; - QString getLogin() const; - QString getPassword() const; - - private: - void init(); - - Ui::BugReportLoginDialog *ui = nullptr; - bool validCredentials = false; - WidgetCover* widgetCover = nullptr; - - private slots: - void credentialsChanged(); - void validate(); - void abortRemoteValidation(); - void remoteValidation(); - void remoteValidationResult(bool success, const QString& errorMessage); -}; - -#endif // BUGREPORTLOGINDIALOG_H diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.ui deleted file mode 100644 index d1d26e6..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/bugreportlogindialog.ui +++ /dev/null @@ -1,132 +0,0 @@ - - - BugReportLoginDialog - - - - 0 - 0 - 343 - 197 - - - - Log in - - - - - - Credentials - - - - - - Login: - - - - - - - - - - Password: - - - - - - - QLineEdit::Password - - - - - - - - - - Validation - - - - - - Validate - - - - :/icons/img/test_conn_error.png:/icons/img/test_conn_error.png - - - Qt::ToolButtonTextBesideIcon - - - - - - - Validation result message - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - - buttonBox - accepted() - BugReportLoginDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - BugReportLoginDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp index 14cb06b..8bf1698 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp @@ -37,7 +37,7 @@ void ColumnDialog::init() ui->precision->setStrict(true, true); ui->typeCombo->addItem(""); - foreach (DataType::Enum type, DataType::getAllTypes()) + for (DataType::Enum type : DataType::getAllTypes()) ui->typeCombo->addItem(DataType::toString(type)); connect(ui->typeCombo, SIGNAL(currentTextChanged(QString)), this, SLOT(updateDataType())); @@ -149,6 +149,7 @@ void ColumnDialog::addConstraint(ConstraintDialog::Constraint mode) constraintsModel->appendConstraint(constr); ui->constraintsView->resizeColumnToContents(0); ui->constraintsView->resizeColumnToContents(1); + updateTypeForAutoIncr(); } void ColumnDialog::setupConstraintCheckBoxes() @@ -218,6 +219,7 @@ void ColumnDialog::editConstraint(SqliteCreateTable::Column::Constraint* constra ui->constraintsView->resizeColumnToContents(0); ui->constraintsView->resizeColumnToContents(1); updateValidations(); + updateTypeForAutoIncr(); } void ColumnDialog::delConstraint(const QModelIndex& idx) @@ -384,6 +386,8 @@ void ColumnDialog::updateTypeValidations() { QString scaleErrorMsg = tr("Scale is not allowed for INTEGER PRIMARY KEY columns."); QString precisionErrorMsg = tr("Precision cannot be defined without the scale."); + QString typeErrorMsg = tr("Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY."); + QString integerEnforcedMsg = tr("INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY."); QVariant scale = ui->scale->getValue(); QVariant precision = ui->precision->getValue(); @@ -393,6 +397,7 @@ void ColumnDialog::updateTypeValidations() bool precisionOk = !(precisionDefined && !scaleDefined); bool scaleOk = true; + bool typeOk = true; bool hasPk = column->getConstraint(SqliteCreateTable::Column::Constraint::PRIMARY_KEY) != nullptr; bool isInteger = ui->typeCombo->currentText().toUpper() == "INTEGER"; @@ -408,16 +413,48 @@ void ColumnDialog::updateTypeValidations() } } + if (!isInteger && hasAutoIncr()) + typeOk = false; + setValidState(ui->scale, scaleOk, scaleErrorMsg); setValidState(ui->precision, precisionOk, precisionErrorMsg); + setValidState(ui->typeCombo, typeOk, typeErrorMsg); + + if (typeOk && integerTypeEnforced) + setValidStateTooltip(ui->typeCombo, integerEnforcedMsg); - if (!scaleOk || !precisionOk) + if (!scaleOk || !precisionOk || !typeOk) { QPushButton* btn = ui->buttonBox->button(QDialogButtonBox::Ok); btn->setEnabled(false); } } +void ColumnDialog::updateTypeForAutoIncr() +{ + bool hasAuto = hasAutoIncr(); + if (hasAuto && ui->typeCombo->currentText().toUpper() != "INTEGER") + { + ui->typeCombo->setCurrentText("INTEGER"); + integerTypeEnforced = true; + } + else if (!hasAuto) + integerTypeEnforced = false; + + updateTypeValidations(); +} + +bool ColumnDialog::hasAutoIncr() const +{ + for (SqliteCreateTable::Column::Constraint* constr : column->getConstraints(SqliteCreateTable::Column::Constraint::PRIMARY_KEY)) + { + if (constr->autoincrKw) + return true; + } + + return false; +} + void ColumnDialog::moveConstraintUp() { QModelIndex idx = ui->constraintsView->currentIndex(); @@ -509,6 +546,7 @@ void ColumnDialog::configureDefault() void ColumnDialog::pkToggled(bool enabled) { constraintToggled(SqliteCreateTable::Column::Constraint::PRIMARY_KEY, enabled); + updateTypeForAutoIncr(); } void ColumnDialog::fkToggled(bool enabled) @@ -630,6 +668,7 @@ void ColumnDialog::updateDataType() if (!column) return; + integerTypeEnforced = false; QString typeTxt = ui->typeCombo->currentText(); QString scaleTxt = ui->scale->getValue().toString(); QString precisionTxt = ui->precision->getValue().toString(); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h index 596441c..47615e8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h @@ -68,12 +68,15 @@ class GUI_API_EXPORT ColumnDialog : public QDialog, public ExtActionContainer QToolButton* getToolButtonForConstraint(SqliteCreateTable::Column::Constraint* constraint); bool isUnofficialSqlite2Constraint(SqliteCreateTable::Column::Constraint* constraint); void updateTypeValidations(); + void updateTypeForAutoIncr(); + bool hasAutoIncr() const; Ui::ColumnDialog *ui = nullptr; SqliteCreateTable::ColumnPtr column; ColumnDialogConstraintsModel* constraintsModel = nullptr; QCheckBox* modeCheckBox = nullptr; Db* db = nullptr; + bool integerTypeEnforced = false; private slots: void updateConstraintsToolbarState(); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp index 85ae12d..63af58a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp @@ -63,7 +63,7 @@ ConfigDialog::~ConfigDialog() // Notify plugins about dialog being closed UiConfiguredPlugin* cfgPlugin = nullptr; - foreach (Plugin* plugin, PLUGINS->getLoadedPlugins()) + for (Plugin* plugin : PLUGINS->getLoadedPlugins()) { cfgPlugin = dynamic_cast(plugin); if (!cfgPlugin) @@ -133,7 +133,7 @@ QString ConfigDialog::getFilterString(QTreeWidget *widget) { QList items = widget->findItems("*", Qt::MatchWildcard|Qt::MatchRecursive); QStringList strList; - foreach (QTreeWidgetItem* item, items) + for (QTreeWidgetItem* item : items) for (int i = 0; i < widget->columnCount(); i++) strList << item->text(i) + " " + item->toolTip(0); @@ -144,7 +144,7 @@ QString ConfigDialog::getFilterString(QListWidget *widget) { QList items = widget->findItems("*", Qt::MatchWildcard|Qt::MatchRecursive); QStringList strList; - foreach (QListWidgetItem* item, items) + for (QListWidgetItem* item : items) strList << item->text() + " " + item->toolTip(); return strList.join(" "); @@ -154,7 +154,7 @@ QString ConfigDialog::getFilterString(QTableWidget *widget) { QList items = widget->findItems("*", Qt::MatchWildcard|Qt::MatchRecursive); QStringList strList; - foreach (QTableWidgetItem* item, items) + for (QTableWidgetItem* item : items) strList << item->text() + " " + item->toolTip(); return strList.join(" "); @@ -299,7 +299,7 @@ void ConfigDialog::applyFilter(const QString &filter) QColor disabledColor = ui->categoriesTree->palette().color(QPalette::Disabled, QPalette::WindowText); if (filter.isEmpty()) { - foreach (QTreeWidgetItem* item, getAllCategoryItems()) + for (QTreeWidgetItem* item : getAllCategoryItems()) item->setForeground(0, normalColor); return; @@ -307,7 +307,7 @@ void ConfigDialog::applyFilter(const QString &filter) QList widgets = ui->stackedWidget->findChildren(); QList matchedWidgets; - foreach (QWidget* widget, widgets) + for (QWidget* widget : widgets) { if (getFilterString(widget).contains(filter, Qt::CaseInsensitive)) matchedWidgets << widget; @@ -315,9 +315,9 @@ void ConfigDialog::applyFilter(const QString &filter) QHash pageToCategoryItem = buildPageToCategoryItemMap(); QSet matchedCategories; - foreach (QWidget* page, pageToCategoryItem.keys()) + for (QWidget* page : pageToCategoryItem.keys()) { - foreach (QWidget* matched, matchedWidgets) + for (QWidget* matched : matchedWidgets) { if (page->isAncestorOf(matched)) { @@ -333,10 +333,10 @@ void ConfigDialog::applyFilter(const QString &filter) } } - foreach (QTreeWidgetItem* item, getAllCategoryItems()) + for (QTreeWidgetItem* item : getAllCategoryItems()) item->setForeground(0, disabledColor); - foreach (QTreeWidgetItem* item, matchedCategories) + for (QTreeWidgetItem* item : matchedCategories) { item->setForeground(0, normalColor); while ((item = item->parent()) != nullptr) @@ -347,7 +347,7 @@ void ConfigDialog::applyFilter(const QString &filter) QHash ConfigDialog::buildPageToCategoryItemMap() const { QHash pageNameToCategoryItem; - foreach (QTreeWidgetItem* item, getAllCategoryItems()) + for (QTreeWidgetItem* item : getAllCategoryItems()) pageNameToCategoryItem[item->statusTip(0)] = item; QWidget* page = nullptr; @@ -486,7 +486,14 @@ void ConfigDialog::addDataTypeEditor(const QString& pluginName) void ConfigDialog::addDataTypeEditor(MultiEditorWidgetPlugin* plugin) { MultiEditorWidget* editor = plugin->getInstance(); + editor->setTabLabel(plugin->getTabLabel()); ui->dataEditorsSelectedTabs->addTab(editor, editor->getTabLabel().replace("&", "&&")); + + connect(editor, &MultiEditorWidget::aboutToBeDeleted, [this, editor]() + { + int idx = ui->dataEditorsSelectedTabs->indexOf(editor); + ui->dataEditorsSelectedTabs->removeTab(idx); + }); } void ConfigDialog::removeDataTypeEditor(QListWidgetItem* item, const QString& pluginName) @@ -704,7 +711,7 @@ void ConfigDialog::delDataType() void ConfigDialog::dataTypesHelp() { - static const QString url = QStringLiteral("http://wiki.sqlitestudio.pl/index.php/User_Manual#Customizing_data_type_editors"); + static const QString url = QStringLiteral("https://github.com/pawelsalawa/sqlitestudio/wiki/User_Manual#customizing-data-type-editors"); QDesktopServices::openUrl(QUrl(url, QUrl::StrictMode)); } @@ -1085,7 +1092,7 @@ void ConfigDialog::refreshFormattersPage() void ConfigDialog::applyStyle(QWidget *widget, QStyle *style) { widget->setStyle(style); - foreach (QObject* child, widget->children()) + for (QObject* child : widget->children()) { if (!qobject_cast(child)) continue; @@ -1184,7 +1191,7 @@ void ConfigDialog::initPlugins() // Recreate QTreeWidgetItem *typeItem = nullptr; - foreach (PluginType* pluginType, PLUGINS->getPluginTypes()) + for (PluginType* pluginType : PLUGINS->getPluginTypes()) { typeItem = createPluginsTypeItem(pluginType->getConfigUiForm(), pluginType->getTitle()); if (!typeItem) @@ -1193,7 +1200,7 @@ void ConfigDialog::initPlugins() item->addChild(typeItem); pluginTypeToItemMap[pluginType] = typeItem; - foreach (Plugin* plugin, pluginType->getLoadedPlugins()) + for (Plugin* plugin : pluginType->getLoadedPlugins()) pluginLoaded(plugin, pluginType, true); } @@ -1244,7 +1251,7 @@ void ConfigDialog::initPluginsPage() categoryRow = 0; QList pluginTypes = PLUGINS->getPluginTypes(); qSort(pluginTypes.begin(), pluginTypes.end(), PluginType::nameLessThan); - foreach (PluginType* pluginType, pluginTypes) + for (PluginType* pluginType : pluginTypes) { category = new QTreeWidgetItem({pluginType->getTitle()}); font.setItalic(false); @@ -1264,7 +1271,7 @@ void ConfigDialog::initPluginsPage() itemRow = 0; pluginNames = pluginType->getAllPluginNames(); qSort(pluginNames); - foreach (const QString& pluginName, pluginNames) + for (const QString& pluginName : pluginNames) { builtIn = PLUGINS->isBuiltIn(pluginName); title = PLUGINS->getTitle(pluginName); @@ -1497,7 +1504,7 @@ void ConfigDialog::initShortcuts(CfgCategory *cfgCategory) int itemRow = 0; QStringList entryNames = cfgCategory->getEntries().keys(); qSort(entryNames); - foreach (const QString& entryName, entryNames) + for (const QString& entryName : entryNames) { // Title title = cfgCategory->getEntries()[entryName]->getTitle(); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.ui index 6bedd25..fe0b772 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.ui @@ -229,7 +229,7 @@ - 1 + 3 @@ -407,8 +407,8 @@ 0 0 - 564 - 580 + 577 + 472 @@ -418,17 +418,30 @@ Data browsing and editing - - + + - <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> - Limit initial data column width to (in pixels): + Number of memorized table populating configurations - + + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + 999999 + + + General.PopulateHistorySize + + + + @@ -447,7 +460,7 @@ - + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> @@ -466,27 +479,37 @@ - - + + - <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> - Show column and row details tooltip in data view - - - General.ShowDataViewTooltips + Limit initial data column width to (in pixels): - + Number of data rows per page: - + + + + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> + + + Show column and row details tooltip in data view + + + General.ShowDataViewTooltips + + + + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> @@ -499,7 +522,7 @@ - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> @@ -837,8 +860,21 @@ - - + + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + 999999 + + + General.BindParamsCacheSize + + + + + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> @@ -850,6 +886,16 @@ + + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + Number of memorized query parameters + + + @@ -1027,8 +1073,8 @@ 0 0 - 447 - 307 + 335 + 237 @@ -1448,8 +1494,8 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Abcdefgh</span></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Abcdefgh</span></p></body></html> @@ -1539,8 +1585,8 @@ p, li { white-space: pre-wrap; } 0 0 - 268 - 328 + 196 + 263 @@ -1661,8 +1707,8 @@ p, li { white-space: pre-wrap; } 0 0 - 331 - 829 + 247 + 701 @@ -2237,7 +2283,7 @@ p, li { white-space: pre-wrap; } ddlHistorySizeSpin dontShowDdlPreview queryHistorySizeSpin - checkBox + execQueryUnderCursorCheck expandTablesCheck activeStyleCombo previewTabs diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp index 781e25e..183f8dd 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp @@ -144,7 +144,7 @@ void DbDialog::updateOptions() setUpdatesEnabled(false); // Remove olds - foreach (QWidget* w, optionWidgets) + for (QWidget* w : optionWidgets) { ui->optionsGrid->removeWidget(w); delete w; @@ -481,7 +481,7 @@ bool DbDialog::validate() if (nameState) { if (nameManuallyEdited) - setValidStateInfo(ui->nameEdit, tr("

Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.

")); + setValidStateInfo(ui->nameEdit, tr("

Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.

")); else setValidState(ui->nameEdit, true); } @@ -560,14 +560,13 @@ void DbDialog::valueForNameGenerationChanged() return; QString generatedName; - if (dbPlugins.count() > 0) - { - DbPlugin* plugin = dbPlugins[ui->typeCombo->currentText()]; + DbPlugin* plugin = dbPlugins.count() > 0 ? dbPlugins[ui->typeCombo->currentText()] : nullptr; + if (plugin) generatedName = DBLIST->generateUniqueDbName(plugin, ui->fileEdit->text()); - } else generatedName = DBLIST->generateUniqueDbName(ui->fileEdit->text()); + ui->nameEdit->setText(generatedName); } diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp index e86f9cd..3af221f 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp @@ -28,7 +28,7 @@ void DdlPreviewDialog::setDdl(const QStringList& ddlList) { QStringList fixedList; QString newDdl; - foreach (const QString& ddl, ddlList) + for (const QString& ddl : ddlList) { newDdl = ddl.trimmed(); if (!newDdl.endsWith(";")) diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.cpp new file mode 100644 index 0000000..3ecae39 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.cpp @@ -0,0 +1,76 @@ +#include "execfromfiledialog.h" +#include "ui_execfromfiledialog.h" +#include "common/utils.h" +#include "uiconfig.h" +#include "uiutils.h" +#include + +ExecFromFileDialog::ExecFromFileDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::ExecFromFileDialog) +{ + init(); +} + +ExecFromFileDialog::~ExecFromFileDialog() +{ + delete ui; +} + +bool ExecFromFileDialog::ignoreErrors() const +{ + return ui->skipErrorsCheck->isChecked(); +} + +QString ExecFromFileDialog::filePath() const +{ + return ui->fileEdit->text(); +} + +QString ExecFromFileDialog::codec() const +{ + return ui->encodingCombo->currentText(); +} + +void ExecFromFileDialog::init() +{ + ui->setupUi(this); + + connect(ui->fileBrowse, SIGNAL(clicked()), this, SLOT(browseForInputFile())); + connect(ui->fileEdit, SIGNAL(textChanged(const QString&)), this, SLOT(updateState())); + + ui->encodingCombo->addItems(textCodecNames()); + ui->encodingCombo->setCurrentText(defaultCodecName()); +} + +void ExecFromFileDialog::browseForInputFile() +{ + QString dir = getFileDialogInitPath(); + QString filters = tr("SQL scripts (*.sql);;All files (*)"); + QString path = QFileDialog::getOpenFileName(nullptr, tr("Execute SQL file"), dir, filters); + if (path.isNull()) + return; + + setFileDialogInitPathByFile(path); + ui->fileEdit->setText(path); + updateState(); +} + +void ExecFromFileDialog::updateState() +{ + QString path = ui->fileEdit->text(); + if (path.isEmpty()) + { + setValidState(ui->fileEdit, false, tr("Please provide file to be executed.")); + return; + } + + QFileInfo fi(path); + if (!fi.exists() || !fi.isReadable()) + { + setValidState(ui->fileEdit, false, tr("Provided file does not exist or cannot be read.")); + return; + } + + setValidState(ui->fileEdit, true); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.h new file mode 100644 index 0000000..27751d4 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.h @@ -0,0 +1,32 @@ +#ifndef EXECFROMFILEDIALOG_H +#define EXECFROMFILEDIALOG_H + +#include + +namespace Ui { + class ExecFromFileDialog; +} + +class ExecFromFileDialog : public QDialog +{ + Q_OBJECT + + public: + explicit ExecFromFileDialog(QWidget *parent = nullptr); + ~ExecFromFileDialog(); + + bool ignoreErrors() const; + QString filePath() const; + QString codec() const; + + private: + void init(); + + Ui::ExecFromFileDialog *ui; + + private slots: + void browseForInputFile(); + void updateState(); +}; + +#endif // EXECFROMFILEDIALOG_H diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.ui new file mode 100644 index 0000000..6a24e51 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/execfromfiledialog.ui @@ -0,0 +1,125 @@ + + + ExecFromFileDialog + + + + 0 + 0 + 400 + 203 + + + + Execute SQL from file + + + true + + + + + + Input file + + + + + + Path to file + + + + + + + Browse for file + + + + + + + :/icons/img/directory_open.png:/icons/img/directory_open.png + + + + + + + + + + Options + + + + + + File encoding + + + + + + + + + + Skip failing SQL statements + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + ExecFromFileDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ExecFromFileDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp index 91b4087..7b6a4d0 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp @@ -23,6 +23,15 @@ #include #include +static const QString EXPORT_DIALOG_CFG_GROUP = "ExportDialog"; +static const QString EXPORT_DIALOG_CFG_CODEC = "codec"; +static const QString EXPORT_DIALOG_CFG_FILE = "outputFileName"; +static const QString EXPORT_DIALOG_CFG_CLIP = "intoClipboard"; +static const QString EXPORT_DIALOG_CFG_DATA = "exportData"; +static const QString EXPORT_DIALOG_CFG_IDX = "exportTableIndexes"; +static const QString EXPORT_DIALOG_CFG_TRIG = "exportTableTriggers"; +static const QString EXPORT_DIALOG_CFG_FORMAT = "format"; + ExportDialog::ExportDialog(QWidget *parent) : QWizard(parent), ui(new Ui::ExportDialog) @@ -362,7 +371,10 @@ void ExportDialog::formatPageDisplayed() formatPageVisited = true; } + readStdConfigForLastPage(); pluginSelected(); + + emit formatPageCompleteChanged(); } ExportPlugin* ExportDialog::getSelectedPlugin() const @@ -443,9 +455,6 @@ void ExportDialog::pluginSelected() updateExportOutputOptions(); updateOptions(); - - if (currentPlugin->getConfig() && !currentPlugin->getConfig()->isPersistable()) - currentPlugin->getConfig()->reset(); } void ExportDialog::updateExportOutputOptions() @@ -470,8 +479,18 @@ void ExportDialog::updateExportOutputOptions() ui->encodingLabel->setVisible(displayCodec); if (displayCodec) { - QString codec = currentPlugin->getDefaultEncoding(); + QString codec = CFG->get(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_CODEC).toString(); + QString defaultCodec = currentPlugin->getDefaultEncoding(); + if (codec.isNull()) + codec = defaultCodec; + int idx = ui->encodingCombo->findText(codec); + if (idx == -1 && codec != defaultCodec) + { + codec = defaultCodec; + idx = ui->encodingCombo->findText(codec); + } + if (idx > -1) ui->encodingCombo->setCurrentIndex(idx); } @@ -555,6 +574,12 @@ void ExportDialog::accept() doExport(); } +int ExportDialog::exec() +{ + readStdConfigForFirstPage(); + return QDialog::exec(); +} + void ExportDialog::updatePluginOptions(ExportPlugin* plugin, int& optionsRow) { safe_delete(pluginOptionsWidget); @@ -596,6 +621,46 @@ void ExportDialog::updatePluginOptions(ExportPlugin* plugin, int& optionsRow) plugin->validateOptions(); } +void ExportDialog::storeStdConfig(const ExportManager::StandardExportConfig &stdConfig) +{ + CFG->begin(); + CFG->set(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_CODEC, stdConfig.codec); + CFG->set(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_FILE, stdConfig.outputFileName); + CFG->set(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_CLIP, stdConfig.intoClipboard); + CFG->set(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_DATA, stdConfig.exportData); + CFG->set(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_IDX, stdConfig.exportTableIndexes); + CFG->set(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_TRIG, stdConfig.exportTableTriggers); + CFG->set(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_FORMAT, currentPlugin->getFormatName()); + CFG->commit(); +} + +void ExportDialog::readStdConfigForFirstPage() +{ + bool exportData = CFG->get(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_DATA, true).toBool(); + if (exportMode == ExportManager::DATABASE) + ui->exportDbDataCheck->setChecked(exportData); + else if (exportMode == ExportManager::TABLE) + ui->exportTableDataCheck->setChecked(exportData); + + ui->exportTableIndexesCheck->setChecked(CFG->get(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_IDX, true).toBool()); + ui->exportTableTriggersCheck->setChecked(CFG->get(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_TRIG, true).toBool()); +} + +void ExportDialog::readStdConfigForLastPage() +{ + QString format = CFG->get(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_FORMAT).toString(); + int idx = ui->formatCombo->findText(format); + if (idx > -1) + ui->formatCombo->setCurrentIndex(idx); + + bool useClipboard = CFG->get(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_CLIP, false).toBool(); + ui->exportFileRadio->setChecked(!useClipboard); + ui->exportClipboardRadio->setChecked(useClipboard); + ui->exportFileEdit->setText(CFG->get(EXPORT_DIALOG_CFG_GROUP, EXPORT_DIALOG_CFG_FILE, QString()).toString()); + + // Codec is read within updateExportOutputOptions() +} + void ExportDialog::updateValidation() { if (!currentPlugin) @@ -610,6 +675,9 @@ void ExportDialog::doExport() widgetCover->show(); ExportManager::StandardExportConfig stdConfig = getExportConfig(); + storeStdConfig(stdConfig); + configMapper->saveFromWidget(pluginOptionsWidget); + QString format = ui->formatCombo->currentText(); switch (exportMode) { @@ -684,6 +752,9 @@ ExportManager::StandardExportConfig ExportDialog::getExportConfig() const else stdConfig.exportData = false; + stdConfig.exportTableIndexes = ui->exportTableIndexesCheck->isChecked(); + stdConfig.exportTableTriggers = ui->exportTableTriggersCheck->isChecked(); + if (ui->encodingCombo->isVisible() && ui->encodingCombo->currentIndex() > -1) stdConfig.codec = ui->encodingCombo->currentText(); else diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h index 0471172..c2f6d7e 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h @@ -45,6 +45,9 @@ class GUI_API_EXPORT ExportDialog : public QWizard void formatPageDisplayed(); ExportPlugin* getSelectedPlugin() const; void updatePluginOptions(ExportPlugin* plugin, int& optionsRow); + void storeStdConfig(const ExportManager::StandardExportConfig& stdConfig); + void readStdConfigForFirstPage(); + void readStdConfigForLastPage(); void doExport(); void exportDatabase(const ExportManager::StandardExportConfig& stdConfig, const QString& format); void exportTable(const ExportManager::StandardExportConfig& stdConfig, const QString& format); @@ -96,6 +99,7 @@ class GUI_API_EXPORT ExportDialog : public QWizard public slots: void accept(); + int exec(); signals: void formatPageCompleteChanged(); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.cpp new file mode 100644 index 0000000..916c8af --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.cpp @@ -0,0 +1,35 @@ +#include "fileexecerrorsdialog.h" +#include "ui_fileexecerrorsdialog.h" + +FileExecErrorsDialog::FileExecErrorsDialog(const QList>& errors, bool rolledBack, QWidget *parent) : + QDialog(parent), + ui(new Ui::FileExecErrorsDialog) +{ + ui->setupUi(this); + + ui->committedLabel->setVisible(!rolledBack); + ui->rolledBackLabel->setVisible(rolledBack); + + ui->tableWidget->setRowCount(errors.size()); + int row = 0; + for (const QPair& err : errors) + { + ui->tableWidget->setItem(row, 0, item(err.first)); + ui->tableWidget->setItem(row, 1, item(err.second)); + row++; + } + ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + ui->tableWidget->resizeRowsToContents(); +} + +FileExecErrorsDialog::~FileExecErrorsDialog() +{ + delete ui; +} + +QTableWidgetItem* FileExecErrorsDialog::item(const QString& text) +{ + QTableWidgetItem* item = new QTableWidgetItem(text); + item->setFlags(Qt::ItemIsEnabled); + return item; +} diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.h new file mode 100644 index 0000000..2b474ce --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.h @@ -0,0 +1,26 @@ +#ifndef FILEEXECERRORSDIALOG_H +#define FILEEXECERRORSDIALOG_H + +#include + +namespace Ui { + class FileExecErrorsDialog; +} + +class QTableWidgetItem; + +class FileExecErrorsDialog : public QDialog +{ + Q_OBJECT + + public: + explicit FileExecErrorsDialog(const QList >& errors, bool rolledBack, QWidget *parent = nullptr); + ~FileExecErrorsDialog(); + + private: + QTableWidgetItem* item(const QString& text); + + Ui::FileExecErrorsDialog *ui; +}; + +#endif // FILEEXECERRORSDIALOG_H diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.ui new file mode 100644 index 0000000..4ad6d6c --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/fileexecerrorsdialog.ui @@ -0,0 +1,132 @@ + + + FileExecErrorsDialog + + + + 0 + 0 + 720 + 436 + + + + Execution errors + + + + + + + 75 + true + + + + Following errors were encountered during execution of SQL statements from the file: + + + true + + + + + + + false + + + false + + + QAbstractItemView::NoSelection + + + 100 + + + + SQL + + + + + Error + + + + + + + + + 75 + true + + + + Statements that were executed successfully were commited. + + + + + + + + 75 + true + + + + Statements that were executed successfully were rolled back. + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + accepted() + FileExecErrorsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + FileExecErrorsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp index 2f52396..ddb443d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp @@ -6,7 +6,6 @@ #include "common/widgetcover.h" #include "services/dbmanager.h" #include "services/pluginmanager.h" -#include "services/importmanager.h" #include "sqlitestudio.h" #include "plugins/importplugin.h" #include "ui_importdialog.h" @@ -19,6 +18,12 @@ #include #include +static const QString IMPORT_DIALOG_CFG_GROUP = "ImportDialog"; +static const QString IMPORT_DIALOG_CFG_CODEC = "codec"; +static const QString IMPORT_DIALOG_CFG_FILE = "inputFileName"; +static const QString IMPORT_DIALOG_CFG_IGNORE_ERR = "ignoreErrors"; +static const QString IMPORT_DIALOG_CFG_FORMAT = "format"; + ImportDialog::ImportDialog(QWidget *parent) : QWizard(parent), ui(new Ui::ImportDialog) @@ -55,6 +60,43 @@ bool ImportDialog::isPluginConfigValid() const return pluginConfigOk.size() == 0; } +void ImportDialog::storeStdConfig(ImportManager::StandardImportConfig &stdConfig) +{ + CFG->begin(); + CFG->set(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_CODEC, stdConfig.codec); + CFG->set(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_FILE, stdConfig.inputFileName); + CFG->set(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_IGNORE_ERR, stdConfig.ignoreErrors); + CFG->set(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_FORMAT, currentPlugin->getDataSourceTypeName()); + CFG->commit(); +} + +void ImportDialog::readStdConfig() +{ + QString format = CFG->get(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_FORMAT).toString(); + int idx = ui->dsTypeCombo->findText(format); + if (idx > -1) + ui->dsTypeCombo->setCurrentIndex(idx); + + ui->inputFileEdit->setText(CFG->get(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_FILE, QString()).toString()); + ui->ignoreErrorsCheck->setChecked(CFG->get(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_IGNORE_ERR, false).toBool()); + + // Encoding + QString codec = CFG->get(IMPORT_DIALOG_CFG_GROUP, IMPORT_DIALOG_CFG_CODEC).toString(); + QString defaultCodec = defaultCodecName(); + if (codec.isNull()) + codec = defaultCodec; + + int codecIdx = ui->codecCombo->findText(codec); + if (codecIdx == -1 && codec != defaultCodec) + { + codec = defaultCodec; + codecIdx = ui->codecCombo->findText(codec); + } + + if (codecIdx > -1) + ui->codecCombo->setCurrentIndex(codecIdx); +} + void ImportDialog::init() { ui->setupUi(this); @@ -303,7 +345,10 @@ void ImportDialog::updateValidation() void ImportDialog::pageChanged() { if (currentPage() == ui->dsPage) + { + readStdConfig(); updateValidation(); + } } void ImportDialog::browseForInputFile() @@ -351,6 +396,9 @@ void ImportDialog::accept() stdConfig.ignoreErrors = ui->ignoreErrorsCheck->isChecked(); + storeStdConfig(stdConfig); + configMapper->saveFromWidget(pluginOptionsWidget); + Db* db = DBLIST->getByName(ui->dbNameCombo->currentText());; if (!db) { diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.h index b4c2883..48402ae 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.h +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.h @@ -2,6 +2,7 @@ #define IMPORTDIALOG_H #include "guiSQLiteStudio_global.h" +#include "services/importmanager.h" #include namespace Ui { @@ -39,6 +40,8 @@ class GUI_API_EXPORT ImportDialog : public QWizard void updateStandardOptions(); void updatePluginOptions(int& rows); bool isPluginConfigValid() const; + void storeStdConfig(ImportManager::StandardImportConfig& stdConfig); + void readStdConfig(); Ui::ImportDialog *ui = nullptr; DbListModel* dbListModel = nullptr; diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp index c5da317..e3e7701 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp @@ -106,13 +106,13 @@ void IndexDialog::init() connect(ui->partialIndexEdit, SIGNAL(textChanged()), this, SLOT(updateValidation())); ui->partialIndexEdit->setVirtualSqlExpression("SELECT %1"); updatePartialConditionState(); - ui->columnsTable->setColumnHidden(1, false); + ui->columnsTable->setColumnHidden(2, false); } else { ui->partialIndexCheck->setVisible(false); ui->partialIndexEdit->setVisible(false); - ui->columnsTable->setColumnHidden(1, true); + ui->columnsTable->setColumnHidden(2, true); ui->addExprColumnButton->setVisible(false); ui->editExprColumnButton->setVisible(false); ui->delExprColumnButton->setVisible(false); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.ui index 36066c5..5b07d45 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.ui @@ -72,12 +72,12 @@ - Collation + Sort - Sort + Collation diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.cpp index d0976a3..020cfef 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.cpp @@ -22,24 +22,15 @@ NewVersionDialog::~NewVersionDialog() void NewVersionDialog::setUpdates(const QList& updates) { QTableWidgetItem* item = nullptr; - QString currVersion; int row = 0; ui->updateList->setRowCount(updates.size()); for (const UpdateManager::UpdateEntry& entry : updates) { - if (entry.compontent == "SQLiteStudio") - currVersion = SQLITESTUDIO->getVersionString(); - else - currVersion = PLUGINS->getPrintableVersion(entry.compontent); - item = new QTableWidgetItem(entry.compontent); ui->updateList->setItem(row, 0, item); - item = new QTableWidgetItem(currVersion); - ui->updateList->setItem(row, 1, item); - item = new QTableWidgetItem(entry.version); - ui->updateList->setItem(row, 2, item); + ui->updateList->setItem(row, 1, item); row++; } diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.ui index 6f50e7f..d5468b3 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/newversiondialog.ui @@ -70,11 +70,6 @@ Component - - - Current version - - Update version @@ -111,7 +106,7 @@ - The update will be automatically downloaded and installed. This will also restart application at the end. + This application will be closed and the update installer will start to download and install all the updates. diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp index 7861ff0..7f4ec20 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp @@ -48,7 +48,10 @@ void PopulateDialog::init() }); for (PopulatePlugin* plugin : plugins) + { + pluginByName[plugin->getName()] = plugin; pluginTitles << plugin->getTitle(); + } widgetCover = new WidgetCover(this); widgetCover->initWithInterruptContainer(tr("Abort")); @@ -94,12 +97,29 @@ void PopulateDialog::deleteEngines(const QList& engines) delete engine; } -void PopulateDialog::rebuildEngines() +void PopulateDialog::rebuildEngines(const QHash>& columnConfig) { int row = 0; + QVariant config; + QString pluginName; for (const ColumnEntry& entry : columnEntries) { - pluginSelected(entry.combo, entry.combo->currentIndex()); + pluginName.clear(); + if (columnConfig.contains(entry.column)) + pluginName = columnConfig[entry.column].first; + + if (pluginName.isNull()) + { + pluginName = plugins[entry.combo->currentIndex()]->getName(); + config = CFG->getPopulateHistory(pluginName); + } + else + { + entry.combo->setCurrentIndex(plugins.indexOf(pluginByName[pluginName])); + config = columnConfig[entry.column].second; + } + + pluginSelected(entry.combo, entry.combo->currentIndex(), config); updateColumnState(row++, false); } } @@ -135,6 +155,8 @@ void PopulateDialog::refreshColumns() return; } + QString table = ui->tableCombo->currentText(); + buttonMapper = new QSignalMapper(this); connect(buttonMapper, SIGNAL(mapped(int)), this, SLOT(configurePlugin(int))); @@ -142,14 +164,23 @@ void PopulateDialog::refreshColumns() connect(checkMapper, SIGNAL(mapped(int)), this, SLOT(updateColumnState(int))); SchemaResolver resolver(db); - QStringList columns = resolver.getTableColumns(ui->tableCombo->currentText()); + QStringList columns = resolver.getTableColumns(table); QCheckBox* check = nullptr; QComboBox* combo = nullptr; QToolButton* btn = nullptr; + + int rows = -1; + QHash> columnConfig = CFG->getPopulateHistory(db->getName(), table, rows); + if (rows > -1) + ui->rowsSpin->setValue(rows); + int row = 0; for (const QString& column : columns) { check = new QCheckBox(column); + if (columnConfig.contains(column)) + check->setChecked(true); + connect(check, SIGNAL(toggled(bool)), checkMapper, SLOT(map())); checkMapper->setMapping(check, row); @@ -165,11 +196,11 @@ void PopulateDialog::refreshColumns() ui->columnsLayout->addWidget(check, row, 0); ui->columnsLayout->addWidget(combo, row, 1); ui->columnsLayout->addWidget(btn, row, 2); - columnEntries << ColumnEntry(check, combo, btn); + columnEntries << ColumnEntry(column, check, combo, btn); row++; } - rebuildEngines(); + rebuildEngines(columnConfig); QSpacerItem* spacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding); ui->columnsLayout->addItem(spacer, row, 0, 1, 3); @@ -179,11 +210,15 @@ void PopulateDialog::refreshColumns() void PopulateDialog::pluginSelected(int index) { + QVariant config; + if (index >= 0 && index < plugins.size()) + config = CFG->getPopulateHistory(plugins[index]->getName()); + QComboBox* cb = dynamic_cast(sender()); - pluginSelected(cb, index); + pluginSelected(cb, index, config); } -void PopulateDialog::pluginSelected(QComboBox* combo, int index) +void PopulateDialog::pluginSelected(QComboBox* combo, int index, const QVariant& config) { if (!combo) return; @@ -209,7 +244,11 @@ void PopulateDialog::pluginSelected(QComboBox* combo, int index) if (index < 0 || index >= plugins.size()) return; - entry->engine = plugins[index]->createEngine(); + entry->plugin = plugins[index]; + entry->engine = entry->plugin->createEngine(); + if (config.isValid()) + entry->engine->getConfig()->setValuesFromQVariant(config); + updateColumnState(columnIndex); } @@ -230,7 +269,8 @@ void PopulateDialog::configurePlugin(int index) engine->getConfig()->savepoint(); - PopulateConfigDialog dialog(engine, columnEntries[index].check->text(), columnEntries[index].combo->currentText(), this); + QString colName = columnEntries[index].column; + PopulateConfigDialog dialog(engine, colName, columnEntries[index].combo->currentText(), this); if (dialog.exec() != QDialog::Accepted) engine->getConfig()->restore(); @@ -304,6 +344,7 @@ void PopulateDialog::accept() if (!db) return; + QHash> configForHistory; QHash engines; for (ColumnEntry& entry : columnEntries) { @@ -313,16 +354,19 @@ void PopulateDialog::accept() if (!entry.engine) return; - engines[entry.check->text()] = entry.engine; -// entry.engine = nullptr; // to avoid deleting it in the entry's destructor - worker will delete it after it's done + engines[entry.column] = entry.engine; + // entry.engine = nullptr; // to avoid deleting it in the entry's destructor - worker will delete it after it's done + + configForHistory[entry.column] = QPair(entry.plugin->getName(), entry.engine->getConfig()->toQVariant()); } QString table = ui->tableCombo->currentText(); - qint64 rows = ui->rowsSpin->value(); + int rows = ui->rowsSpin->value(); started = true; widgetCover->displayProgress(rows, "%v / %m"); widgetCover->show(); + CFG->addPopulateHistory(db->getName(), table, rows, configForHistory); POPULATE_MANAGER->populate(db, table, engines, rows); } @@ -334,8 +378,8 @@ void PopulateDialog::reject() QDialog::reject(); } -PopulateDialog::ColumnEntry::ColumnEntry(QCheckBox* check, QComboBox* combo, QToolButton* button) : - check(check), combo(combo), button(button) +PopulateDialog::ColumnEntry::ColumnEntry(const QString& column, QCheckBox* check, QComboBox* combo, QToolButton* button) : + column(column), check(check), combo(combo), button(button) { } diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.h index 948d6ce..404b9e2 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.h +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.h @@ -3,6 +3,7 @@ #include "guiSQLiteStudio_global.h" #include +#include namespace Ui { class PopulateDialog; @@ -32,19 +33,21 @@ class GUI_API_EXPORT PopulateDialog : public QDialog private: struct GUI_API_EXPORT ColumnEntry { - ColumnEntry(QCheckBox* check, QComboBox* combo, QToolButton* button); + ColumnEntry(const QString& column, QCheckBox* check, QComboBox* combo, QToolButton* button); ~ColumnEntry(); + QString column; QCheckBox* check = nullptr; QComboBox* combo = nullptr; QToolButton* button = nullptr; PopulateEngine* engine = nullptr; + PopulatePlugin* plugin = nullptr; }; void init(); PopulateEngine* getEngine(int selectedPluginIndex); void deleteEngines(const QList& engines); - void rebuildEngines(); + void rebuildEngines(const QHash >& columnConfig); Ui::PopulateDialog *ui = nullptr; QGridLayout* columnsGrid = nullptr; @@ -53,6 +56,7 @@ class GUI_API_EXPORT PopulateDialog : public QDialog Db* db = nullptr; QStringList pluginTitles; QList plugins; + QHash pluginByName; QList columnEntries; QSignalMapper* checkMapper = nullptr; QSignalMapper* buttonMapper = nullptr; @@ -64,7 +68,7 @@ class GUI_API_EXPORT PopulateDialog : public QDialog void refreshTables(); void refreshColumns(); void pluginSelected(int index); - void pluginSelected(QComboBox* combo, int index); + void pluginSelected(QComboBox* combo, int index, const QVariant& config); void configurePlugin(int index); void updateColumnState(int index, bool updateGlobalState = true); void updateState(); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp index 3254f26..255694c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp @@ -214,7 +214,7 @@ void TriggerDialog::readTrigger() if (createTrigger->queries.size() > 0) { QStringList sqls; - foreach (SqliteQuery* query, createTrigger->queries) + for (SqliteQuery* query : createTrigger->queries) sqls << query->detokenize(); ui->codeEdit->setPlainText(sqls.join(";\n")+";"); @@ -307,7 +307,7 @@ void TriggerDialog::rebuildTrigger() if (actionType == SqliteCreateTrigger::Event::UPDATE_OF) { QStringList colNames; - foreach (const QString& colName, selectedColumns) + for (const QString& colName : selectedColumns) colNames << wrapObjIfNeeded(colName, dialect); columns = " "+colNames.join(", "); @@ -363,7 +363,7 @@ void TriggerDialog::showColumnsDialog() QPoint topRight = ui->actionColumns->mapToGlobal(ui->actionColumns->rect().topRight()); TriggerColumnsDialog dialog(this, topRight.x(), topRight.y()); - foreach (const QString& colName, targetColumns) + for (const QString& colName : targetColumns) dialog.addColumn(colName, selectedColumns.contains(colName, Qt::CaseInsensitive)); if (dialog.exec() != QDialog::Accepted) diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.ui index 723f903..d25b2c0 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.ui @@ -110,6 +110,9 @@ Trigger statements to be executed. + + QPlainTextEdit::NoWrap + @@ -123,6 +126,9 @@ <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> + + QPlainTextEdit::NoWrap +
diff --git a/SQLiteStudio3/guiSQLiteStudio/formmanager.cpp b/SQLiteStudio3/guiSQLiteStudio/formmanager.cpp index 0ee7d43..735fb5d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/formmanager.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/formmanager.cpp @@ -123,7 +123,7 @@ void FormManager::load() formDirs += STRINGIFY(FORMS_DIR); #endif - foreach (QString dirPath, formDirs) + for (QString dirPath : formDirs) loadRecurently(dirPath, ""); } @@ -134,7 +134,7 @@ void FormManager::loadRecurently(const QString& path, const QString& prefix) QDir dir(path); QString fullPath; QString widgetName; - foreach (QFileInfo entry, dir.entryInfoList(fileExtensions, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot|QDir::Readable)) + for (const QFileInfo& entry : dir.entryInfoList(fileExtensions, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot|QDir::Readable)) { fullPath = entry.absoluteFilePath(); if (entry.isDir()) diff --git a/SQLiteStudio3/guiSQLiteStudio/formview.cpp b/SQLiteStudio3/guiSQLiteStudio/formview.cpp index 0ebb9aa..575c2de 100644 --- a/SQLiteStudio3/guiSQLiteStudio/formview.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/formview.cpp @@ -85,7 +85,7 @@ void FormView::reloadInternal() { // Cleanup dataMapper->clearMapping(); - foreach (QWidget* widget, widgets) + for (QWidget* widget : widgets) { contents->layout()->removeWidget(widget); delete widget; @@ -97,7 +97,7 @@ void FormView::reloadInternal() // Recreate dataMapper->setModel(model.data()); int i = 0; - foreach (SqlQueryModelColumnPtr column, model->getColumns()) + for (SqlQueryModelColumnPtr column : model->getColumns()) addColumn(i++, column->displayName, column->dataType, (column->editionForbiddenReason.size() > 0)); } @@ -150,12 +150,18 @@ void FormView::updateDeletedState() { SqlQueryItem* item = model->itemFromIndex(dataMapper->getCurrentIndex(), 0); if (!item) + { + for (MultiEditor* editor : editors) + editor->setEnabled(false); + return; + } bool deleted = item->isDeletedRow(); int i = 0; - foreach (MultiEditor* editor, editors) + for (MultiEditor* editor : editors) { + editor->setEnabled(true); editor->setDeletedRow(deleted); editor->setReadOnly(readOnly[i++] || deleted); } diff --git a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro index 60a85ff..d603f87 100644 --- a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro +++ b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro @@ -31,7 +31,8 @@ QMAKE_CXXFLAGS += -pedantic DEFINES += GUISQLITESTUDIO_LIBRARY -TRANSLATIONS += translations/guiSQLiteStudio_de.ts \ +TRANSLATIONS += translations/guiSQLiteStudio_ro_RO.ts \ + translations/guiSQLiteStudio_de.ts \ translations/guiSQLiteStudio_it.ts \ translations/guiSQLiteStudio_zh_CN.ts \ translations/guiSQLiteStudio_sk.ts \ @@ -172,10 +173,7 @@ SOURCES +=\ uidebug.cpp \ debugconsole.cpp \ common/extactionprototype.cpp \ - dialogs/bugdialog.cpp \ dialogs/aboutdialog.cpp \ - dialogs/bugreportlogindialog.cpp \ - windows/bugreporthistorywindow.cpp \ dialogs/newversiondialog.cpp \ dialogs/quitconfirmdialog.cpp \ common/datawidgetmapper.cpp \ @@ -187,7 +185,12 @@ SOURCES +=\ common/centerediconitemdelegate.cpp \ datagrid/sqlviewmodel.cpp \ common/exttableview.cpp \ - common/exttablewidget.cpp + common/exttablewidget.cpp \ + windows/sqliteextensioneditor.cpp \ + windows/sqliteextensioneditormodel.cpp \ + dialogs/bindparamsdialog.cpp \ + dialogs/execfromfiledialog.cpp \ + dialogs/fileexecerrorsdialog.cpp HEADERS += mainwindow.h \ iconmanager.h \ @@ -323,10 +326,7 @@ HEADERS += mainwindow.h \ uidebug.h \ debugconsole.h \ common/extactionprototype.h \ - dialogs/bugdialog.h \ dialogs/aboutdialog.h \ - dialogs/bugreportlogindialog.h \ - windows/bugreporthistorywindow.h \ dialogs/newversiondialog.h \ guiSQLiteStudio_global.h \ dialogs/quitconfirmdialog.h \ @@ -339,7 +339,13 @@ HEADERS += mainwindow.h \ common/centerediconitemdelegate.h \ datagrid/sqlviewmodel.h \ common/exttableview.h \ - common/exttablewidget.h + common/exttablewidget.h \ + windows/sqliteextensioneditor.h \ + windows/sqliteextensioneditormodel.h \ + dialogs/bindparamsdialog.h \ + common/bindparam.h \ + dialogs/execfromfiledialog.h \ + dialogs/fileexecerrorsdialog.h FORMS += mainwindow.ui \ dbtree/dbtree.ui \ @@ -381,15 +387,16 @@ FORMS += mainwindow.ui \ dialogs/dbconverterdialog.ui \ dialogs/dbdialog.ui \ debugconsole.ui \ - dialogs/bugdialog.ui \ dialogs/aboutdialog.ui \ - dialogs/bugreportlogindialog.ui \ - windows/bugreporthistorywindow.ui \ dialogs/newversiondialog.ui \ dialogs/quitconfirmdialog.ui \ dialogs/languagedialog.ui \ dialogs/cssdebugdialog.ui \ - dialogs/indexexprcolumndialog.ui + dialogs/indexexprcolumndialog.ui \ + windows/sqliteextensioneditor.ui \ + dialogs/bindparamsdialog.ui \ + dialogs/execfromfiledialog.ui \ + dialogs/fileexecerrorsdialog.ui RESOURCES += \ icons.qrc \ @@ -420,3 +427,4 @@ DISTFILES += \ + diff --git a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc index 0970b86..56db5ac 100644 --- a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc +++ b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc @@ -1,5 +1,6 @@ + translations/guiSQLiteStudio_ro_RO.qm translations/guiSQLiteStudio_pl.qm translations/guiSQLiteStudio_ru.qm translations/guiSQLiteStudio_fr.qm @@ -14,3 +15,4 @@ + diff --git a/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp b/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp index 3d6c5f2..8610dbf 100644 --- a/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/iconmanager.cpp @@ -48,7 +48,7 @@ void IconManager::init() iconFileExtensions << "*.png" << "*.PNG" << "*.jpg" << "*.JPG" << "*.svg" << "*.SVG"; movieFileExtensions << "*.gif" << "*.GIF" << "*.mng" << "*.MNG"; - foreach (QString dirPath, iconDirs) + for (QString dirPath : iconDirs) { loadRecurently(dirPath, "", false); loadRecurently(dirPath, "", true); @@ -115,7 +115,7 @@ void IconManager::loadRecurently(QString dirPath, const QString& prefix, bool mo QString path; QString name; QDir dir(dirPath); - foreach (QFileInfo entry, dir.entryInfoList(extensions, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot|QDir::Readable)) + for (QFileInfo entry : dir.entryInfoList(extensions, QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot|QDir::Readable)) { if (entry.isDir()) { diff --git a/SQLiteStudio3/guiSQLiteStudio/iconmanager.h b/SQLiteStudio3/guiSQLiteStudio/iconmanager.h index 2bc63a2..6034de1 100644 --- a/SQLiteStudio3/guiSQLiteStudio/iconmanager.h +++ b/SQLiteStudio3/guiSQLiteStudio/iconmanager.h @@ -109,9 +109,15 @@ class GUI_API_EXPORT IconManager : public QObject DEF_ICON(ERASE, "erase") DEF_ICON(ERASE_TABLE_DATA, "erase_table_data") DEF_ICON(EXEC_QUERY, "exec_query") + DEF_ICON(EXEC_SQL_FROM_FILE, "execute_sql_from_file") DEF_ICON(EXPLAIN_QUERY, "explain_query") DEF_ICON(EXPORT, "export") DEF_ICON(EXPORT_FILE_BROWSE, "export_file_browse") + DEF_ICON(EXTENSION, "brick") + DEF_ICON(EXTENSION_ADD, "brick_add") + DEF_ICON(EXTENSION_DELETE, "brick_delete") + DEF_ICON(EXTENSION_EDITOR, "brick_folder") + DEF_ICON(EXTENSION_ERROR, "brick_error") DEF_ICON(FEATURE_REQUEST, "feature_request") DEF_ICON(FONT_BROWSE, "font_browse") DEF_ICON(FORMAT_SQL, "format_sql") @@ -167,6 +173,7 @@ class GUI_API_EXPORT IconManager : public QObject DEF_ICON(RESULTS_BELOW, "results_below") DEF_ICON(RESULTS_IN_TAB, "results_in_tab") DEF_ICON(ROLLBACK, "rollback") + DEF_ICON(SAVE_FILE, "save_file") DEF_ICON(SAVE_SQL_FILE, "save_sql_file") DEF_ICON(SEARCH, "search") DEF_ICON(SEARCH_AND_REPLACE, "search_and_replace") @@ -248,6 +255,9 @@ class GUI_API_EXPORT IconManager : public QObject DEF_ICON(WIN_CLOSE_OTHER, "window_close_other") DEF_ICON(WIN_RESTORE, "window_restore") DEF_ICON(WIN_RENAME, "window_rename") + DEF_ICON(ZOOM_RESET, "zoom") + DEF_ICON(ZOOM_IN, "zoom_in") + DEF_ICON(ZOOM_OUT, "zoom_out") ) static IconManager* getInstance(); diff --git a/SQLiteStudio3/guiSQLiteStudio/icons.qrc b/SQLiteStudio3/guiSQLiteStudio/icons.qrc index 8819276..b656f25 100644 --- a/SQLiteStudio3/guiSQLiteStudio/icons.qrc +++ b/SQLiteStudio3/guiSQLiteStudio/icons.qrc @@ -201,5 +201,15 @@ img/wand.png img/search_and_replace.png img/search.png + img/zoom.png + img/zoom_in.png + img/zoom_out.png + img/save_file.png + img/brick.png + img/brick_add.png + img/brick_delete.png + img/brick_error.png + img/brick_folder.png + img/execute_sql_from_file.png diff --git a/SQLiteStudio3/guiSQLiteStudio/img/brick.png b/SQLiteStudio3/guiSQLiteStudio/img/brick.png new file mode 100644 index 0000000..7851cf3 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/brick.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/brick_add.png b/SQLiteStudio3/guiSQLiteStudio/img/brick_add.png new file mode 100644 index 0000000..fac186b Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/brick_add.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/brick_delete.png b/SQLiteStudio3/guiSQLiteStudio/img/brick_delete.png new file mode 100644 index 0000000..3a8c373 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/brick_delete.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/brick_error.png b/SQLiteStudio3/guiSQLiteStudio/img/brick_error.png new file mode 100644 index 0000000..18ab01e Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/brick_error.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/brick_folder.png b/SQLiteStudio3/guiSQLiteStudio/img/brick_folder.png new file mode 100644 index 0000000..5dea976 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/brick_folder.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/execute_sql_from_file.png b/SQLiteStudio3/guiSQLiteStudio/img/execute_sql_from_file.png new file mode 100644 index 0000000..806d7e6 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/execute_sql_from_file.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/save_file.png b/SQLiteStudio3/guiSQLiteStudio/img/save_file.png new file mode 100644 index 0000000..c619461 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/save_file.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/zoom.png b/SQLiteStudio3/guiSQLiteStudio/img/zoom.png new file mode 100644 index 0000000..908612e Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/zoom.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/zoom_in.png b/SQLiteStudio3/guiSQLiteStudio/img/zoom_in.png new file mode 100644 index 0000000..cdf0a52 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/zoom_in.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/zoom_out.png b/SQLiteStudio3/guiSQLiteStudio/img/zoom_out.png new file mode 100644 index 0000000..07bf98a Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/zoom_out.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/license.txt b/SQLiteStudio3/guiSQLiteStudio/license.txt deleted file mode 100644 index f166cc5..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/license.txt +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! \ No newline at end of file diff --git a/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp index f7bcb83..2b6463a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp @@ -9,6 +9,7 @@ #include "windows/functionseditor.h" #include "windows/collationseditor.h" #include "windows/ddlhistorywindow.h" +#include "windows/sqliteextensioneditor.h" #include "mdiarea.h" #include "statusfield.h" #include "uiconfig.h" @@ -32,8 +33,6 @@ #include "services/dbmanager.h" #include "services/updatemanager.h" #include "dialogs/aboutdialog.h" -#include "dialogs/bugdialog.h" -#include "windows/bugreporthistorywindow.h" #include "dialogs/newversiondialog.h" #include "dialogs/quitconfirmdialog.h" #include "common/widgetcover.h" @@ -47,6 +46,8 @@ #include #include #include +#include +#include CFG_KEYS_DEFINE(MainWindow) MainWindow* MainWindow::instance = nullptr; @@ -65,7 +66,7 @@ MainWindow::~MainWindow() void MainWindow::init() { ui->setupUi(this); - connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(cleanUp())); + connect(SQLITESTUDIO, SIGNAL(aboutToQuit()), this, SLOT(cleanUp())); #ifdef Q_OS_WIN setWindowIcon(ICONS.SQLITESTUDIO_APP.toQIcon().pixmap(256, 256)); @@ -130,32 +131,6 @@ void MainWindow::init() #endif connect(statusField, SIGNAL(linkActivated(QString)), this, SLOT(statusFieldLinkClicked(QString))); - // Widget cover - widgetCover = new WidgetCover(this); - widgetCover->setVisible(false); - - updatingBusyBar = new QProgressBar(); - updatingBusyBar->setRange(0, 100); - updatingBusyBar->setTextVisible(true); - updatingBusyBar->setValue(0); - updatingBusyBar->setFixedWidth(300); - - updatingSubBar = new QProgressBar(); - updatingSubBar->setRange(0, 100); - updatingSubBar->setTextVisible(true); - updatingSubBar->setValue(0); - updatingSubBar->setFixedWidth(300); - - updatingLabel = new QLabel(); - - widgetCover->getContainerLayout()->addWidget(updatingLabel, 0, 0); - widgetCover->getContainerLayout()->addWidget(updatingBusyBar, 1, 0); - widgetCover->getContainerLayout()->addWidget(updatingSubBar, 2, 0); -#ifdef PORTABLE_CONFIG - connect(UPDATES, SIGNAL(updatingProgress(QString,int,int)), this, SLOT(handleUpdatingProgress(QString,int,int))); - connect(UPDATES, SIGNAL(updatingError(QString)), this, SLOT(handleUpdatingError())); -#endif - connect(CFG_CORE.General.Language, SIGNAL(changed(QVariant)), this, SLOT(notifyAboutLanguageChange())); fixFonts(); @@ -166,6 +141,7 @@ void MainWindow::cleanUp() if (SQLITESTUDIO->getImmediateQuit()) return; +// qDebug() << "MainWindow::cleanUp()"; for (MdiWindow* win : getMdiArea()->getWindows()) delete win; @@ -254,42 +230,43 @@ void MainWindow::closeEvent(QCloseEvent* event) void MainWindow::createActions() { - createAction(OPEN_SQL_EDITOR, ICONS.OPEN_SQL_EDITOR, tr("Open SQL editor"), this, SLOT(openSqlEditorSlot()), ui->mainToolBar); - createAction(OPEN_DDL_HISTORY, ICONS.DDL_HISTORY, tr("Open DDL history"), this, SLOT(openDdlHistorySlot()), ui->mainToolBar); - createAction(OPEN_FUNCTION_EDITOR, ICONS.FUNCTION, tr("Open SQL functions editor"), this, SLOT(openFunctionEditorSlot()), ui->mainToolBar); - createAction(OPEN_COLLATION_EDITOR, ICONS.CONSTRAINT_COLLATION, tr("Open collations editor"), this, SLOT(openCollationEditorSlot()), ui->mainToolBar); - createAction(IMPORT, ICONS.IMPORT, tr("Import"), this, SLOT(importAnything()), ui->mainToolBar); - createAction(EXPORT, ICONS.EXPORT, tr("Export"), this, SLOT(exportAnything()), ui->mainToolBar); + createAction(OPEN_SQL_EDITOR, ICONS.OPEN_SQL_EDITOR, tr("Open SQL &editor"), this, SLOT(openSqlEditorSlot()), ui->mainToolBar); + createAction(OPEN_DDL_HISTORY, ICONS.DDL_HISTORY, tr("Open DDL &history"), this, SLOT(openDdlHistorySlot()), ui->mainToolBar); + createAction(OPEN_FUNCTION_EDITOR, ICONS.FUNCTION, tr("Open SQL &functions editor"), this, SLOT(openFunctionEditorSlot()), ui->mainToolBar); + createAction(OPEN_COLLATION_EDITOR, ICONS.CONSTRAINT_COLLATION, tr("Open &collations editor"), this, SLOT(openCollationEditorSlot()), ui->mainToolBar); + createAction(OPEN_EXTENSION_MANAGER, ICONS.EXTENSION, tr("Open ex&tension manager"), this, SLOT(openExtensionManagerSlot()), ui->mainToolBar); + createAction(IMPORT, ICONS.IMPORT, tr("&Import"), this, SLOT(importAnything()), ui->mainToolBar); + createAction(EXPORT, ICONS.EXPORT, tr("E&xport"), this, SLOT(exportAnything()), ui->mainToolBar); ui->mainToolBar->addSeparator(); - createAction(OPEN_CONFIG, ICONS.CONFIGURE, tr("Open configuration dialog"), this, SLOT(openConfig()), ui->mainToolBar); + createAction(OPEN_CONFIG, ICONS.CONFIGURE, tr("Open confi&guration dialog"), this, SLOT(openConfig()), ui->mainToolBar); - createAction(MDI_TILE, ICONS.WIN_TILE, tr("Tile windows"), ui->mdiArea, SLOT(tileSubWindows()), ui->viewToolbar); - createAction(MDI_TILE_HORIZONTAL, ICONS.WIN_TILE_HORIZONTAL, tr("Tile windows horizontally"), ui->mdiArea, SLOT(tileHorizontally()), ui->viewToolbar); - createAction(MDI_TILE_VERTICAL, ICONS.WIN_TILE_VERTICAL, tr("Tile windows vertically"), ui->mdiArea, SLOT(tileVertically()), ui->viewToolbar); - createAction(MDI_CASCADE, ICONS.WIN_CASCADE, tr("Cascade windows"), ui->mdiArea, SLOT(cascadeSubWindows()), ui->viewToolbar); + createAction(MDI_TILE, ICONS.WIN_TILE, tr("&Tile windows"), ui->mdiArea, SLOT(tileSubWindows()), ui->viewToolbar); + createAction(MDI_TILE_HORIZONTAL, ICONS.WIN_TILE_HORIZONTAL, tr("Tile windows &horizontally"), ui->mdiArea, SLOT(tileHorizontally()), ui->viewToolbar); + createAction(MDI_TILE_VERTICAL, ICONS.WIN_TILE_VERTICAL, tr("Tile windows &vertically"), ui->mdiArea, SLOT(tileVertically()), ui->viewToolbar); + createAction(MDI_CASCADE, ICONS.WIN_CASCADE, tr("&Cascade windows"), ui->mdiArea, SLOT(cascadeSubWindows()), ui->viewToolbar); createAction(NEXT_TASK, tr("Next window"), ui->taskBar, SLOT(nextTask()), this); createAction(PREV_TASK, tr("Previous window"), ui->taskBar, SLOT(prevTask()), this); createAction(HIDE_STATUS_FIELD, tr("Hide status field"), this, SLOT(hideStatusField()), this); - createAction(CLOSE_WINDOW, ICONS.WIN_CLOSE, tr("Close selected window"), this, SLOT(closeSelectedWindow()), this); - createAction(CLOSE_OTHER_WINDOWS, ICONS.WIN_CLOSE_OTHER, tr("Close all windows but selected"), this, SLOT(closeAllWindowsButSelected()), this); - createAction(CLOSE_ALL_WINDOWS, ICONS.WIN_CLOSE_ALL, tr("Close all windows"), this, SLOT(closeAllWindows()), this); - createAction(RESTORE_WINDOW, ICONS.WIN_RESTORE, tr("Restore recently closed window"), this, SLOT(restoreLastClosedWindow()), this); - createAction(RENAME_WINDOW, ICONS.WIN_RENAME, tr("Rename selected window"), this, SLOT(renameWindow()), this); + createAction(CLOSE_WINDOW, ICONS.WIN_CLOSE, tr("Close selected &window"), this, SLOT(closeSelectedWindow()), this); + createAction(CLOSE_OTHER_WINDOWS, ICONS.WIN_CLOSE_OTHER, tr("Close all windows &but selected"), this, SLOT(closeAllWindowsButSelected()), this); + createAction(CLOSE_ALL_WINDOWS, ICONS.WIN_CLOSE_ALL, tr("Close &all windows"), this, SLOT(closeAllWindows()), this); + createAction(RESTORE_WINDOW, ICONS.WIN_RESTORE, tr("Re&store recently closed window"), this, SLOT(restoreLastClosedWindow()), this); + createAction(RENAME_WINDOW, ICONS.WIN_RENAME, tr("&Rename selected window"), this, SLOT(renameWindow()), this); createAction(OPEN_DEBUG_CONSOLE, tr("Open Debug Console"), this, SLOT(openDebugConsole()), this); createAction(OPEN_CSS_CONSOLE, tr("Open CSS Console"), this, SLOT(openCssConsole()), this); - createAction(REPORT_BUG, ICONS.BUG, tr("Report a bug"), this, SLOT(reportBug()), this); - createAction(FEATURE_REQUEST, ICONS.FEATURE_REQUEST, tr("Propose a new feature"), this, SLOT(requestFeature()), this); - createAction(ABOUT, ICONS.SQLITESTUDIO_APP16, tr("About"), this, SLOT(aboutSqlitestudio()), this); - createAction(LICENSES, ICONS.LICENSES, tr("Licenses"), this, SLOT(licenses()), this); - createAction(HOMEPAGE, ICONS.HOMEPAGE, tr("Open home page"), this, SLOT(homepage()), this); - createAction(FORUM, ICONS.OPEN_FORUM, tr("Open forum page"), this, SLOT(forum()), this); - createAction(USER_MANUAL, ICONS.USER_MANUAL, tr("User Manual"), this, SLOT(userManual()), this); - createAction(SQLITE_DOCS, ICONS.SQLITE_DOCS, tr("SQLite documentation"), this, SLOT(sqliteDocs()), this); - createAction(BUG_REPORT_HISTORY, ICONS.BUG_LIST, tr("Report history"), this, SLOT(reportHistory()), this); + createAction(REPORT_BUG, ICONS.BUG, tr("Report a &bug"), this, SLOT(reportBug()), this); + createAction(FEATURE_REQUEST, ICONS.FEATURE_REQUEST, tr("Propose a new &feature"), this, SLOT(requestFeature()), this); + createAction(ABOUT, ICONS.SQLITESTUDIO_APP16, tr("&About"), this, SLOT(aboutSqlitestudio()), this); + createAction(LICENSES, ICONS.LICENSES, tr("&Licenses"), this, SLOT(licenses()), this); + createAction(HOMEPAGE, ICONS.HOMEPAGE, tr("Open home &page"), this, SLOT(homepage()), this); + createAction(FORUM, ICONS.OPEN_FORUM, tr("Open fo&rum page"), this, SLOT(forum()), this); + createAction(USER_MANUAL, ICONS.USER_MANUAL, tr("User &Manual"), this, SLOT(userManual()), this); + createAction(SQLITE_DOCS, ICONS.SQLITE_DOCS, tr("SQLite &documentation"), this, SLOT(sqliteDocs()), this); + createAction(BUG_REPORT_HISTORY, ICONS.BUG_LIST, tr("Bugs and feature &requests"), this, SLOT(reportHistory()), this); #ifdef PORTABLE_CONFIG - createAction(CHECK_FOR_UPDATES, ICONS.GET_UPDATE, tr("Check for updates"), this, SLOT(checkForUpdates()), this); + createAction(CHECK_FOR_UPDATES, ICONS.GET_UPDATE, tr("Check for &updates"), this, SLOT(checkForUpdates()), this); #endif actionMap[ABOUT]->setMenuRole(QAction::AboutRole); @@ -327,7 +304,7 @@ void MainWindow::initMenuBar() { // Database menu dbMenu = new QMenu(this); - dbMenu->setTitle(tr("Database", "menubar")); + dbMenu->setTitle(tr("&Database", "menubar")); menuBar()->addMenu(dbMenu); dbMenu->addAction(dbTree->getAction(DbTree::CONNECT_TO_DB)); @@ -347,7 +324,7 @@ void MainWindow::initMenuBar() // Structure menu structMenu = new QMenu(this); - structMenu->setTitle(tr("Structure", "menubar")); + structMenu->setTitle(tr("&Structure", "menubar")); menuBar()->addMenu(structMenu); structMenu->addAction(dbTree->getAction(DbTree::ADD_TABLE)); @@ -368,7 +345,7 @@ void MainWindow::initMenuBar() // View menu viewMenu = createPopupMenu(); - viewMenu->setTitle(tr("View", "menubar")); + viewMenu->setTitle(tr("&View", "menubar")); menuBar()->addMenu(viewMenu); mdiMenu = new QMenu(viewMenu); @@ -393,13 +370,14 @@ void MainWindow::initMenuBar() // Tools menu toolsMenu = new QMenu(this); - toolsMenu->setTitle(tr("Tools", "menubar")); + toolsMenu->setTitle(tr("&Tools", "menubar")); menuBar()->addMenu(toolsMenu); toolsMenu->addAction(actionMap[OPEN_SQL_EDITOR]); toolsMenu->addAction(actionMap[OPEN_DDL_HISTORY]); toolsMenu->addAction(actionMap[OPEN_FUNCTION_EDITOR]); toolsMenu->addAction(actionMap[OPEN_COLLATION_EDITOR]); + toolsMenu->addAction(actionMap[OPEN_EXTENSION_MANAGER]); toolsMenu->addAction(actionMap[IMPORT]); toolsMenu->addAction(actionMap[EXPORT]); toolsMenu->addSeparator(); @@ -407,7 +385,7 @@ void MainWindow::initMenuBar() // Help menu sqlitestudioMenu = new QMenu(this); - sqlitestudioMenu->setTitle(tr("Help")); + sqlitestudioMenu->setTitle(tr("&Help")); menuBar()->addMenu(sqlitestudioMenu); if (isDebugEnabled() && isDebugConsoleEnabled()) { @@ -447,7 +425,7 @@ void MainWindow::saveSession(MdiWindow* currWindow) if (CFG_UI.General.RestoreSession.get()) { QList windowSessions; - foreach (MdiWindow* window, ui->mdiArea->getWindows()) + for (MdiWindow* window : ui->mdiArea->getWindows()) if (window->restoreSessionNextTime()) windowSessions << window->saveSession(); @@ -515,7 +493,7 @@ void MainWindow::restoreWindowSessions(const QList& windowSessions) if (windowSessions.size() == 0) return; - foreach (const QVariant& winSession, windowSessions) + for (const QVariant& winSession : windowSessions) restoreWindowSession(winSession); } @@ -597,7 +575,7 @@ EditorWindow* MainWindow::openSqlEditor(Db* dbToSet, const QString& sql) void MainWindow::closeNonSessionWindows() { - foreach (MdiWindow* window, ui->mdiArea->getWindows()) + for (MdiWindow* window : ui->mdiArea->getWindows()) if (!window->restoreSessionNextTime()) window->close(); } @@ -662,6 +640,11 @@ void MainWindow::openCollationEditorSlot() openCollationEditor(); } +void MainWindow::openExtensionManagerSlot() +{ + openExtensionManager(); +} + void MainWindow::exportAnything() { if (!ExportManager::isAnyPluginAvailable()) @@ -736,15 +719,12 @@ void MainWindow::openCssConsole() void MainWindow::reportBug() { - BugDialog dialog(this); - dialog.exec(); + QDesktopServices::openUrl(QUrl(SQLITESTUDIO->getNewIssuePage())); } void MainWindow::requestFeature() { - BugDialog dialog(this); - dialog.setFeatureRequestMode(true); - dialog.exec(); + QDesktopServices::openUrl(QUrl(SQLITESTUDIO->getNewIssuePage())); } void MainWindow::aboutSqlitestudio() @@ -781,7 +761,7 @@ void MainWindow::sqliteDocs() void MainWindow::reportHistory() { - openReportHistory(); + QDesktopServices::openUrl(QUrl(SQLITESTUDIO->getIssuesPage())); } void MainWindow::statusFieldLinkClicked(const QString& link) @@ -816,23 +796,9 @@ void MainWindow::noUpdatesAvailable() void MainWindow::checkForUpdates() { manualUpdatesChecking = true; - UPDATES->checkForUpdates(true); -} - -void MainWindow::handleUpdatingProgress(const QString& jobTitle, int jobPercent, int totalPercent) -{ - if (!widgetCover->isVisible()) - widgetCover->show(); - - updatingLabel->setText(jobTitle); - updatingBusyBar->setValue(totalPercent); - updatingSubBar->setValue(jobPercent); + UPDATES->checkForUpdates(); } -void MainWindow::handleUpdatingError() -{ - widgetCover->hide(); -} #endif void MainWindow::updateCornerDocking() @@ -850,6 +816,16 @@ void MainWindow::updateCornerDocking() } } +void MainWindow::messageFromSecondaryInstance(quint32 instanceId, QByteArray message) +{ + UNUSED(instanceId); + QApplication::setActiveWindow(this); + raise(); + QString dbToOpen = deserializeFromBytes(message).toString(); + if (!dbToOpen.isNull()) + openDb(dbToOpen); +} + DdlHistoryWindow* MainWindow::openDdlHistory() { return openMdiWindow(); @@ -865,9 +841,9 @@ CollationsEditor* MainWindow::openCollationEditor() return openMdiWindow(); } -BugReportHistoryWindow* MainWindow::openReportHistory() +SqliteExtensionEditor* MainWindow::openExtensionManager() { - return openMdiWindow(); + return openMdiWindow(); } void MainWindow::fixFonts() diff --git a/SQLiteStudio3/guiSQLiteStudio/mainwindow.h b/SQLiteStudio3/guiSQLiteStudio/mainwindow.h index be96af1..fbc3317 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mainwindow.h +++ b/SQLiteStudio3/guiSQLiteStudio/mainwindow.h @@ -31,6 +31,7 @@ class WidgetCover; class QProgressBar; class QLabel; class ThemeTuner; +class SqliteExtensionEditor; #ifdef Q_OS_MACX #define PREV_TASK_KEY_SEQ Qt::CTRL + Qt::ALT + Qt::Key_Left @@ -70,6 +71,7 @@ class GUI_API_EXPORT MainWindow : public QMainWindow, public ExtActionContainer OPEN_DDL_HISTORY, OPEN_FUNCTION_EDITOR, OPEN_COLLATION_EDITOR, + OPEN_EXTENSION_MANAGER, EXPORT, IMPORT, CLOSE_WINDOW, @@ -140,7 +142,7 @@ class GUI_API_EXPORT MainWindow : public QMainWindow, public ExtActionContainer DdlHistoryWindow* openDdlHistory(); FunctionsEditor* openFunctionEditor(); CollationsEditor* openCollationEditor(); - BugReportHistoryWindow* openReportHistory(); + SqliteExtensionEditor* openExtensionManager(); void fixFonts(); template @@ -168,15 +170,13 @@ class GUI_API_EXPORT MainWindow : public QMainWindow, public ExtActionContainer QPointer newVersionDialog; #endif WidgetCover* widgetCover = nullptr; - QLabel* updatingLabel = nullptr; - QProgressBar* updatingBusyBar = nullptr; - QProgressBar* updatingSubBar = nullptr; bool manualUpdatesChecking = false; public slots: EditorWindow* openSqlEditor(); void updateWindowActions(); void updateCornerDocking(); + void messageFromSecondaryInstance(quint32 instanceId, QByteArray message); private slots: void notifyAboutLanguageChange(); @@ -188,6 +188,7 @@ class GUI_API_EXPORT MainWindow : public QMainWindow, public ExtActionContainer void openDdlHistorySlot(); void openFunctionEditorSlot(); void openCollationEditorSlot(); + void openExtensionManagerSlot(); void exportAnything(); void importAnything(); void closeAllWindows(); @@ -210,8 +211,6 @@ class GUI_API_EXPORT MainWindow : public QMainWindow, public ExtActionContainer void updatesAvailable(const QList& updates); void noUpdatesAvailable(); void checkForUpdates(); - void handleUpdatingProgress(const QString& jobTitle, int jobPercent, int totalPercent); - void handleUpdatingError(); #endif void statusFieldLinkClicked(const QString& link); }; @@ -220,7 +219,7 @@ template T* MainWindow::openMdiWindow() { T* win = nullptr; - foreach (MdiWindow* mdiWin, ui->mdiArea->getWindows()) + for (MdiWindow* mdiWin : ui->mdiArea->getWindows()) { win = dynamic_cast(mdiWin->getMdiChild()); if (win) diff --git a/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp b/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp index 0d07bcb..8f8521d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp @@ -72,7 +72,7 @@ QAction* MdiArea::getTaskByWindow(MdiWindow* window) QList MdiArea::getWindows() const { QList windowList; - foreach(QAction* action, taskBar->getTasks()) + for (QAction* action : taskBar->getTasks()) windowList << actionToWinMap[action]; return windowList; @@ -90,7 +90,7 @@ QList MdiArea::getMdiChilds() const QList MdiArea::getWindowsToTile() const { QList list; - foreach (MdiWindow *window, getWindows()) + for (MdiWindow *window : getWindows()) { if (window->isMinimized()) continue; @@ -162,7 +162,7 @@ void MdiArea::tileHorizontally() QPoint position(0, 0); QList windowsToTile = getWindowsToTile(); int winCnt = windowsToTile.count(); - foreach (MdiWindow *window, windowsToTile) + for (MdiWindow *window : windowsToTile) { if (window->isMaximized()) window->showNormal(); @@ -189,7 +189,7 @@ void MdiArea::tileVertically() QPoint position(0, 0); QList windowsToTile = getWindowsToTile(); int winCnt = windowsToTile.count(); - foreach (MdiWindow *window, windowsToTile) + for (MdiWindow *window : windowsToTile) { if (window->isMaximized()) window->showNormal(); @@ -212,7 +212,7 @@ void MdiArea::closeAllButActive() QList allButActive = subWindowList(); allButActive.removeOne(activeSubWindow()); - foreach (QMdiSubWindow *window, allButActive) + for (QMdiSubWindow *window : allButActive) window->close(); } @@ -221,7 +221,7 @@ MdiWindow* MdiArea::getWindowByChild(MdiChild *child) if (!child) return nullptr; - foreach (QMdiSubWindow *window, subWindowList()) + for (QMdiSubWindow *window : subWindowList()) if (window->widget() == child) return dynamic_cast(window); @@ -261,7 +261,7 @@ bool MdiArea::isActiveSubWindow(MdiChild *child) QStringList MdiArea::getWindowTitles() { QStringList titles; - foreach (QMdiSubWindow *subWin, subWindowList()) + for (QMdiSubWindow *subWin : subWindowList()) titles << subWin->windowTitle(); return titles; @@ -269,7 +269,7 @@ QStringList MdiArea::getWindowTitles() MdiWindow *MdiArea::getWindowByTitle(const QString &title) { - foreach (QMdiSubWindow *subWin, subWindowList()) + for (QMdiSubWindow *subWin : subWindowList()) { QString t = subWin->windowTitle(); if (subWin->windowTitle() == title) diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.cpp index c99b774..d766738 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.cpp @@ -30,13 +30,13 @@ static QHash missingEditorPluginsAlreadyWarned; -MultiEditor::MultiEditor(QWidget *parent) : +MultiEditor::MultiEditor(QWidget *parent, TabsMode tabsMode) : QWidget(parent) { - init(); + init(tabsMode); } -void MultiEditor::init() +void MultiEditor::init(TabsMode tabsMode) { QVBoxLayout* vbox = new QVBoxLayout(); vbox->setMargin(margins); @@ -73,14 +73,39 @@ void MultiEditor::init() layout()->addWidget(tabs); tabs->tabBar()->installEventFilter(this); - configBtn = new QToolButton(); - configBtn->setToolTip(tr("Configure editors for this data type")); - configBtn->setIcon(ICONS.CONFIGURE); - configBtn->setFocusPolicy(Qt::NoFocus); - configBtn->setAutoRaise(true); - configBtn->setEnabled(false); - connect(configBtn, SIGNAL(clicked()), this, SLOT(configClicked())); - tabs->setCornerWidget(configBtn); + switch (tabsMode) + { + case CONFIGURABLE: + { + configBtn = new QToolButton(); + configBtn->setToolTip(tr("Configure editors for this data type")); + configBtn->setIcon(ICONS.CONFIGURE); + configBtn->setFocusPolicy(Qt::NoFocus); + configBtn->setAutoRaise(true); + configBtn->setEnabled(false); + connect(configBtn, SIGNAL(clicked()), this, SLOT(configClicked())); + tabs->setCornerWidget(configBtn); + break; + } + case DYNAMIC: + { + initAddTabMenu(); + addTabBtn = new QToolButton(); + addTabBtn->setToolTip(tr("Open another tab")); + addTabBtn->setIcon(ICONS.PLUS); + addTabBtn->setFocusPolicy(Qt::NoFocus); + addTabBtn->setAutoRaise(true); + addTabBtn->setEnabled(true); + addTabBtn->setPopupMode(QToolButton::InstantPopup); + addTabBtn->setMenu(addTabMenu); + tabs->setCornerWidget(addTabBtn); + tabs->setTabsClosable(true); + connect(tabs, &QTabWidget::tabCloseRequested, this, &MultiEditor::removeTab); + break; + } + case PRECONFIGURED: + break; + } QGraphicsColorizeEffect* effect = new QGraphicsColorizeEffect(); effect->setColor(Qt::black); @@ -167,6 +192,25 @@ void MultiEditor::addEditor(MultiEditorWidget* editorWidget) tabs->addTab(editorWidget, editorWidget->getTabLabel().replace("&", "&&")); THEME_TUNER->manageCompactLayout(editorWidget); editorWidget->installEventFilter(this); + + connect(editorWidget, &MultiEditorWidget::aboutToBeDeleted, [this, editorWidget]() + { + int idx = tabs->indexOf(editorWidget); + tabs->removeTab(idx); + }); + + if (addTabMenu) + { + QAction* addTabAction = findFirst(addTabMenu->actions(), [editorWidget](QAction* a) + { + return a->data().toString() == editorWidget->getTabLabel(); + }); + + if (addTabAction) + addTabMenu->removeAction(addTabAction); + else + qWarning() << "Could not find action associated with added MultiEditorWidget:" << editorWidget->getTabLabel(); + } } void MultiEditor::showTab(int idx) @@ -235,11 +279,12 @@ void MultiEditor::setDataType(const DataType& dataType) { this->dataType = dataType; - foreach (MultiEditorWidget* editorWidget, getEditorTypes(dataType)) + for (MultiEditorWidget* editorWidget : getEditorTypes(dataType)) addEditor(editorWidget); showTab(0); - configBtn->setEnabled(true); + if (configBtn) + configBtn->setEnabled(true); } void MultiEditor::focusThisEditor() @@ -271,6 +316,7 @@ void MultiEditor::loadBuiltInEditors() QList MultiEditor::getEditorTypes(const DataType& dataType) { QList editors; + MultiEditorWidget* editor = nullptr; QString typeStr = dataType.toString().trimmed().toUpper(); QHash editorsOrder = CFG_UI.General.DataEditorsOrder.get(); @@ -290,7 +336,9 @@ QList MultiEditor::getEditorTypes(const DataType& dataType) continue; } - editors << plugin->getInstance(); + editor = plugin->getInstance(); + editor->setTabLabel(plugin->getTabLabel()); + editors << editor; } } @@ -313,6 +361,7 @@ QList MultiEditor::getEditorTypes(const DataType& dataType) editorWithPrio.first = plugin->getPriority(dataType); editorWithPrio.second = plugin->getInstance(); + editorWithPrio.second->setTabLabel(plugin->getTabLabel()); sortedEditors << editorWithPrio; } @@ -360,12 +409,17 @@ void MultiEditor::updateValue(const QVariant& newValue) for (int i = 0; i < tabs->count(); i++) { editorWidget = dynamic_cast(tabs->widget(i)); - editorWidget->setValue(newValue); - editorWidget->setUpToDate(true); + setValueToWidget(editorWidget, newValue); } invalidatingDisabled = false; } +void MultiEditor::setValueToWidget(MultiEditorWidget* editorWidget, const QVariant& newValue) +{ + editorWidget->setValue(newValue); + editorWidget->setUpToDate(true); +} + void MultiEditor::updateLabel() { if (deleted) @@ -380,3 +434,62 @@ QVariant MultiEditor::getValueOmmitNull() const { return dynamic_cast(tabs->currentWidget())->getValue(); } + +void MultiEditor::initAddTabMenu() +{ + addTabMenu = new QMenu(addTabBtn); + for (MultiEditorWidgetPlugin* plugin : PLUGINS->getLoadedPlugins()) + addPluginToMenu(plugin); + + sortAddTabMenu(); +} + +void MultiEditor::addPluginToMenu(MultiEditorWidgetPlugin* plugin) +{ + QAction* addTabAction = addTabMenu->addAction(plugin->getTabLabel()); + addTabAction->setData(plugin->getTabLabel()); // for display-independent identification of action to avoid ampersand issue + connect(addTabAction, &QAction::triggered, [plugin, this]() + { + MultiEditorWidget* editor = plugin->getInstance(); + editor->setTabLabel(plugin->getTabLabel()); + addEditor(editor); + setValueToWidget(editor, valueBeforeNull); + showTab(tabs->count() - 1); + }); +} + +void MultiEditor::sortAddTabMenu() +{ + QList editorActions = addTabMenu->actions(); + std::sort(editorActions.begin(), editorActions.end(), [](QAction* a1, QAction* a2) + { + return a1->data().toString().compare(a2->data().toString(), Qt::CaseInsensitive) < 0; + }); + + for (QAction* action : editorActions) + addTabMenu->removeAction(action); + + addTabMenu->insertActions(nullptr, editorActions); +} + +void MultiEditor::removeTab(int idx) +{ + MultiEditorWidget* editor = dynamic_cast(tabs->widget(idx)); + QString label = editor->getTabLabel(); + tabs->removeTab(idx); + + // Re-add it to menu + MultiEditorWidgetPlugin* plugin = findFirst( + PLUGINS->getLoadedPlugins(), + [label](MultiEditorWidgetPlugin* p) {return p->getTabLabel() == label;} + ); + + if (!plugin) + { + qWarning() << "Missing MultiEditorWidgetPlugin after removing its tab for label:" << label; + return; + } + + addPluginToMenu(plugin); + sortAddTabMenu(); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.h index 04b9af7..55d7f2e 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditor.h @@ -12,6 +12,7 @@ class MultiEditorWidget; class QLabel; class MultiEditorWidgetPlugin; class QToolButton; +class QMenu; class GUI_API_EXPORT MultiEditor : public QWidget { @@ -31,7 +32,13 @@ class GUI_API_EXPORT MultiEditor : public QWidget HEX }; - explicit MultiEditor(QWidget *parent = 0); + enum TabsMode { + CONFIGURABLE, /**< Tabs are loaded from datatype and also have configure button visible. */ + PRECONFIGURED, /**< Tabs are loaded from datatype. No config button is present. */ + DYNAMIC /**< No tabs are loaded, but user has button to add new tabs, can close them and reorder them. */ + }; + + explicit MultiEditor(QWidget *parent = nullptr, TabsMode tabsMode = CONFIGURABLE); void addEditor(MultiEditorWidget* editorWidget); void showTab(int idx); @@ -50,12 +57,16 @@ class GUI_API_EXPORT MultiEditor : public QWidget static void loadBuiltInEditors(); private: - void init(); + void init(TabsMode tabsMode); void updateVisibility(); void updateNullEffect(); void updateValue(const QVariant& newValue); + void setValueToWidget(MultiEditorWidget* editorWidget, const QVariant& newValue); void updateLabel(); QVariant getValueOmmitNull() const; + void initAddTabMenu(); + void addPluginToMenu(MultiEditorWidgetPlugin* plugin); + void sortAddTabMenu(); static QList getEditorTypes(const DataType& dataType); @@ -74,6 +85,8 @@ class GUI_API_EXPORT MultiEditor : public QWidget bool valueModified = false; QVariant valueBeforeNull; QToolButton* configBtn = nullptr; + QToolButton* addTabBtn = nullptr; + QMenu* addTabMenu = nullptr; DataType dataType; /** @@ -90,6 +103,7 @@ class GUI_API_EXPORT MultiEditor : public QWidget void nullStateChanged(int state); void invalidateValue(); void setModified(); + void removeTab(int idx); signals: void modified(); diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.cpp index ed7c260..1882335 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.cpp @@ -125,11 +125,6 @@ QList MultiEditorBool::getNoScrollWidgets() return list; } -QString MultiEditorBool::getTabLabel() -{ - return tr("Boolean"); -} - void MultiEditorBool::focusThisWidget() { checkBox->setFocus(); @@ -213,3 +208,8 @@ int MultiEditorBoolPlugin::getPriority(const DataType& dataType) } return 100; } + +QString MultiEditorBoolPlugin::getTabLabel() +{ + return tr("Boolean"); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.h index f328cf0..6aa11d5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorbool.h @@ -22,7 +22,6 @@ class GUI_API_EXPORT MultiEditorBool : public MultiEditorWidget QVariant getValue(); void setReadOnly(bool boolValue); QList getNoScrollWidgets(); - QString getTabLabel(); void focusThisWidget(); private: @@ -63,6 +62,7 @@ class GUI_API_EXPORT MultiEditorBoolPlugin : public BuiltInPlugin, public MultiE MultiEditorWidget* getInstance(); bool validFor(const DataType& dataType); int getPriority(const DataType& dataType); + QString getTabLabel(); }; #endif // MULTIEDITORBOOL_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.cpp index 44178f8..4059f96 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.cpp @@ -9,11 +9,6 @@ MultiEditorDate::MultiEditorDate(QWidget* parent) setDisplayFormat(formats.first()); } -QString MultiEditorDate::getTabLabel() -{ - return tr("Date"); -} - void MultiEditorDate::staticInit() { formats << "yyyy-MM-dd"; @@ -85,3 +80,8 @@ int MultiEditorDatePlugin::getPriority(const DataType& dataType) } return 10; } + +QString MultiEditorDatePlugin::getTabLabel() +{ + return tr("Date"); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.h index d51150b..3b53c32 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordate.h @@ -10,8 +10,6 @@ class GUI_API_EXPORT MultiEditorDate : public MultiEditorDateTime public: explicit MultiEditorDate(QWidget *parent = 0); - QString getTabLabel(); - static void staticInit(); protected: @@ -34,6 +32,7 @@ class GUI_API_EXPORT MultiEditorDatePlugin : public BuiltInPlugin, public MultiE MultiEditorWidget* getInstance(); bool validFor(const DataType& dataType); int getPriority(const DataType& dataType); + QString getTabLabel(); }; #endif // MULTIEDITORDATE_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp index bd1e244..99053b0 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp @@ -106,7 +106,7 @@ QList MultiEditorDateTime::getNoScrollWidgets() QDateTime MultiEditorDateTime::fromString(const QString& value) { QDateTime dateTime; - foreach (const QString& format, getParsingFormats()) + for (const QString& format : getParsingFormats()) { dateTime = QDateTime::fromString(value, format); if (dateTime.isValid()) @@ -176,11 +176,6 @@ void MultiEditorDateTime::setReadOnly(bool value) updateReadOnlyDisplay(); } -QString MultiEditorDateTime::getTabLabel() -{ - return tr("Date & time"); -} - void MultiEditorDateTime::focusThisWidget() { dateTimeEdit->setFocus(); @@ -273,3 +268,8 @@ int MultiEditorDateTimePlugin::getPriority(const DataType& dataType) } return 10; } + +QString MultiEditorDateTimePlugin::getTabLabel() +{ + return tr("Date & time"); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.h index 59bd111..9038ede 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.h @@ -27,7 +27,6 @@ class GUI_API_EXPORT MultiEditorDateTime : public MultiEditorWidget bool getReadOnly() const; void setReadOnly(bool value); - QString getTabLabel(); void focusThisWidget(); protected: @@ -79,6 +78,7 @@ class GUI_API_EXPORT MultiEditorDateTimePlugin : public BuiltInPlugin, public Mu MultiEditorWidget* getInstance(); bool validFor(const DataType& dataType); int getPriority(const DataType& dataType); + QString getTabLabel(); }; #endif // MULTIEDITORDATETIME_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.cpp index 5a3cd28..a959e53 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.cpp @@ -9,8 +9,6 @@ MultiEditorHex::MultiEditorHex() hexEdit = new QHexEdit(); layout()->addWidget(hexEdit); - //hexEdit->setTabChangesFocus(true); - connect(hexEdit, SIGNAL(dataChanged()), this, SLOT(modificationChanged())); setFocusProxy(hexEdit); } @@ -34,11 +32,6 @@ void MultiEditorHex::setReadOnly(bool value) hexEdit->setReadOnly(value); } -QString MultiEditorHex::getTabLabel() -{ - return tr("Hex"); -} - void MultiEditorHex::focusThisWidget() { hexEdit->setFocus(); @@ -92,3 +85,8 @@ int MultiEditorHexPlugin::getPriority(const DataType& dataType) } return 100; } + +QString MultiEditorHexPlugin::getTabLabel() +{ + return tr("Hex"); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.h index 5fd32a0..e647f12 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorhex.h @@ -20,7 +20,6 @@ class GUI_API_EXPORT MultiEditorHex : public MultiEditorWidget void setValue(const QVariant& value); QVariant getValue(); void setReadOnly(bool value); - QString getTabLabel(); void focusThisWidget(); QList getNoScrollWidgets(); @@ -45,6 +44,7 @@ class GUI_API_EXPORT MultiEditorHexPlugin : public BuiltInPlugin, public MultiEd MultiEditorWidget* getInstance(); bool validFor(const DataType& dataType); int getPriority(const DataType& dataType); + QString getTabLabel(); }; #endif // MULTIEDITORHEX_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.cpp index 526f5c4..6b1dd09 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.cpp @@ -18,7 +18,7 @@ MultiEditorNumeric::MultiEditorNumeric(QWidget* parent) void MultiEditorNumeric::setValue(const QVariant& value) { - spinBox->setValue(value); + spinBox->setValue(value, false); } QVariant MultiEditorNumeric::getValue() @@ -31,11 +31,6 @@ void MultiEditorNumeric::setReadOnly(bool value) spinBox->setReadOnly(value); } -QString MultiEditorNumeric::getTabLabel() -{ - return tr("Number", "numeric multi editor tab name"); -} - void MultiEditorNumeric::focusThisWidget() { spinBox->setFocus(); @@ -108,3 +103,8 @@ int MultiEditorNumericPlugin::getPriority(const DataType& dataType) } return 10; } + +QString MultiEditorNumericPlugin::getTabLabel() +{ + return tr("Number", "numeric multi editor tab name"); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.h index c74d27a..224c6d4 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditornumeric.h @@ -17,7 +17,6 @@ class GUI_API_EXPORT MultiEditorNumeric : public MultiEditorWidget void setValue(const QVariant& value); QVariant getValue(); void setReadOnly(bool value); - QString getTabLabel(); void focusThisWidget(); QList getNoScrollWidgets(); @@ -39,6 +38,7 @@ class GUI_API_EXPORT MultiEditorNumericPlugin : public BuiltInPlugin, public Mul MultiEditorWidget* getInstance(); bool validFor(const DataType& dataType); int getPriority(const DataType& dataType); + QString getTabLabel(); }; #endif // MULTIEDITORNUMERIC_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.cpp index 05db8e0..0d963a5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.cpp @@ -5,6 +5,7 @@ #include #include #include +#include CFG_KEYS_DEFINE(MultiEditorText) @@ -40,11 +41,6 @@ void MultiEditorText::setReadOnly(bool value) textEdit->setReadOnly(value); } -QString MultiEditorText::getTabLabel() -{ - return tr("Text"); -} - QToolBar* MultiEditorText::getToolBar(int toolbar) const { UNUSED(toolbar); @@ -182,3 +178,8 @@ int MultiEditorTextPlugin::getPriority(const DataType& dataType) } return 1; } + +QString MultiEditorTextPlugin::getTabLabel() +{ + return tr("Text"); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.h index bd814ce..59d2a44 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortext.h @@ -44,7 +44,6 @@ class GUI_API_EXPORT MultiEditorText : public MultiEditorWidget, public ExtActio void setValue(const QVariant& value); QVariant getValue(); void setReadOnly(bool value); - QString getTabLabel(); QToolBar* getToolBar(int toolbar) const; void focusThisWidget(); QList getNoScrollWidgets(); @@ -82,6 +81,7 @@ class GUI_API_EXPORT MultiEditorTextPlugin : public BuiltInPlugin, public MultiE MultiEditorWidget* getInstance(); bool validFor(const DataType& dataType); int getPriority(const DataType& dataType); + QString getTabLabel(); }; #endif // MULTIEDITORTEXT_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.cpp index 8b49715..35800ce 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.cpp @@ -11,11 +11,6 @@ MultiEditorTime::MultiEditorTime(QWidget *parent) setDisplayFormat(formats.first()); } -QString MultiEditorTime::getTabLabel() -{ - return tr("Time"); -} - void MultiEditorTime::staticInit() { formats << "hh:mm:ss" @@ -88,3 +83,8 @@ int MultiEditorTimePlugin::getPriority(const DataType& dataType) } return 10; } + +QString MultiEditorTimePlugin::getTabLabel() +{ + return tr("Time"); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.h index 1fb05f3..e5b64a8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditortime.h @@ -11,8 +11,6 @@ class GUI_API_EXPORT MultiEditorTime : public MultiEditorDateTime public: explicit MultiEditorTime(QWidget *parent = 0); - QString getTabLabel(); - static void staticInit(); protected: @@ -35,6 +33,7 @@ class GUI_API_EXPORT MultiEditorTimePlugin : public BuiltInPlugin, public MultiE MultiEditorWidget* getInstance(); bool validFor(const DataType& dataType); int getPriority(const DataType& dataType); + QString getTabLabel(); }; #endif // MULTIEDITORTIME_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.cpp index caea9a5..826728a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.cpp @@ -8,10 +8,20 @@ MultiEditorWidget::MultiEditorWidget(QWidget *parent) : void MultiEditorWidget::installEventFilter(QObject* filterObj) { QObject::installEventFilter(filterObj); - foreach (QWidget* w, getNoScrollWidgets()) + for (QWidget* w : getNoScrollWidgets()) w->installEventFilter(filterObj); } +void MultiEditorWidget::setTabLabel(const QString& value) +{ + tabLabel = value; +} + +QString MultiEditorWidget::getTabLabel() +{ + return tabLabel; +} + bool MultiEditorWidget::isUpToDate() const { return upToDate; diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.h index 14bac26..dc98b1a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidget.h @@ -9,25 +9,28 @@ class GUI_API_EXPORT MultiEditorWidget : public QWidget Q_OBJECT public: - explicit MultiEditorWidget(QWidget *parent = 0); + explicit MultiEditorWidget(QWidget *parent = nullptr); virtual void setValue(const QVariant& value) = 0; virtual QVariant getValue() = 0; virtual void setReadOnly(bool value) = 0; virtual QList getNoScrollWidgets() = 0; - virtual QString getTabLabel() = 0; virtual void focusThisWidget() = 0; void installEventFilter(QObject* filterObj); + void setTabLabel(const QString& value); + QString getTabLabel(); bool isUpToDate() const; void setUpToDate(bool value); private: bool upToDate = true; + QString tabLabel; signals: void valueModified(); + void aboutToBeDeleted(); }; #endif // MULTIEDITORWIDGET_H diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidgetplugin.h b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidgetplugin.h index 011bde5..7426006 100644 --- a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidgetplugin.h +++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditorwidgetplugin.h @@ -12,6 +12,7 @@ class GUI_API_EXPORT MultiEditorWidgetPlugin : public virtual Plugin virtual MultiEditorWidget* getInstance() = 0; virtual bool validFor(const DataType& dataType) = 0; virtual int getPriority(const DataType& dataType) = 0; + virtual QString getTabLabel() = 0; }; #endif // MULTIEDITORWIDGETPLUGIN_H diff --git a/SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.h b/SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.h index bbae582..f33e413 100644 --- a/SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/selectabledbmodel.h @@ -11,7 +11,7 @@ class DbTreeItem; class GUI_API_EXPORT SelectableDbModel : public QSortFilterProxyModel { public: - explicit SelectableDbModel(QObject *parent = 0); + explicit SelectableDbModel(QObject *parent = nullptr); QVariant data(const QModelIndex& index, int role) const; bool setData(const QModelIndex& index, const QVariant& value, int role); diff --git a/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp b/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp index c3fd257..b3656a6 100644 --- a/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/sqleditor.cpp @@ -20,6 +20,7 @@ #include "dbtree/dbtreeitem.h" #include "dbtree/dbtree.h" #include "dbtree/dbtreemodel.h" +#include "common/lazytrigger.h" #include #include #include @@ -66,8 +67,9 @@ void SqlEditor::init() connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth())); connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int))); - connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); + connect(this, SIGNAL(textChanged()), this, SLOT(checkContentSize())); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(cursorMoved())); + connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); updateLineNumberAreaWidth(); highlightCurrentLine(); @@ -79,15 +81,14 @@ void SqlEditor::init() connect(completer, SIGNAL(leftPressed()), this, SLOT(completerLeftPressed())); connect(completer, SIGNAL(rightPressed()), this, SLOT(completerRightPressed())); - autoCompleteTimer = new QTimer(this); - autoCompleteTimer->setSingleShot(true); - autoCompleteTimer->setInterval(autoCompleterDelay); - connect(autoCompleteTimer, SIGNAL(timeout()), this, SLOT(checkForAutoCompletion())); + autoCompleteTrigger = new LazyTrigger(autoCompleterDelay, + [this]() -> bool {return autoCompletion && !deletionKeyPressed;}, + this); + connect(autoCompleteTrigger, SIGNAL(triggered()), this, SLOT(checkForAutoCompletion())); + + queryParserTrigger = new LazyTrigger(queryParserDelay, this); + connect(autoCompleteTrigger, SIGNAL(triggered()), this, SLOT(parseContents())); - queryParserTimer = new QTimer(this); - queryParserTimer->setSingleShot(true); - queryParserTimer->setInterval(queryParserDelay); - connect(queryParserTimer, SIGNAL(timeout()), this, SLOT(parseContents())); connect(this, SIGNAL(textChanged()), this, SLOT(scheduleQueryParser())); queryParser = new Parser(Dialect::Sqlite3); @@ -502,17 +503,9 @@ void SqlEditor::completeSelected() insertPlainText(value); } -void SqlEditor::scheduleAutoCompletion() -{ - autoCompleteTimer->stop(); - - if (autoCompletion && !deletionKeyPressed) - autoCompleteTimer->start(); -} - void SqlEditor::checkForAutoCompletion() { - if (!db || !autoCompletion || deletionKeyPressed) + if (!db || !autoCompletion || deletionKeyPressed || !richFeaturesEnabled) return; Lexer lexer(getDialect()); @@ -545,7 +538,7 @@ void SqlEditor::refreshValidObjects() QSet databases = resolver.getDatabases(); databases << "main"; QStringList objects; - foreach (const QString& dbName, databases) + for (const QString& dbName : databases) { objects = resolver.getAllObjects(dbName); objectsInNamedDb[dbName] << objects; @@ -623,6 +616,9 @@ int SqlEditor::lineNumberAreaWidth() void SqlEditor::highlightParenthesis() { + if (!richFeaturesEnabled) + return; + // Clear extra selections QList selections = extraSelections(); @@ -703,6 +699,14 @@ void SqlEditor::indentSelected(bool shiftPressed) QTextDocument* doc = document(); QTextBlock startBlock = doc->findBlock(cursor.selectionStart()); QTextBlock endBlock = doc->findBlock(cursor.selectionEnd()); + + if (cursor.selectionEnd() > endBlock.position()) + { + QTextBlock afterEndBlock = endBlock.next(); + if (afterEndBlock.isValid()) + endBlock = afterEndBlock; + } + for (QTextBlock it = startBlock; it != endBlock; it = it.next()) { if (shiftPressed) @@ -834,18 +838,8 @@ void SqlEditor::completerRightPressed() void SqlEditor::parseContents() { - if (document()->characterCount() > SqliteSyntaxHighlighter::MAX_QUERY_LENGTH) - { - if (richFeaturesEnabled) - notifyWarn(tr("Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled.")); - - richFeaturesEnabled = false; + if (!richFeaturesEnabled) return; - } - else if (!richFeaturesEnabled) - { - richFeaturesEnabled = true; - } // Updating dialect according to current database (if any) Dialect dialect = Dialect::Sqlite3; @@ -880,9 +874,9 @@ void SqlEditor::checkForSyntaxErrors() // Marking invalid tokens, like in "SELECT * from test] t" - the "]" token is invalid. // Such tokens don't cause parser to fail. - foreach (SqliteQueryPtr query, queryParser->getQueries()) + for (SqliteQueryPtr query : queryParser->getQueries()) { - foreach (TokenPtr token, query->tokens) + for (TokenPtr token : query->tokens) { if (token->type == Token::INVALID) markErrorAt(token->start, token->end, true); @@ -896,7 +890,7 @@ void SqlEditor::checkForSyntaxErrors() } // Setting new markers when errors were detected - foreach (ParserError* error, queryParser->getErrors()) + for (ParserError* error : queryParser->getErrors()) markErrorAt(sqlIndex(error->getFrom()), sqlIndex(error->getTo())); emit errorsChecked(true); @@ -912,10 +906,10 @@ void SqlEditor::checkForValidObjects() Dialect dialect = db->getDialect(); QList fullObjects; QString dbName; - foreach (SqliteQueryPtr query, queryParser->getQueries()) + for (SqliteQueryPtr query : queryParser->getQueries()) { fullObjects = query->getContextFullObjects(); - foreach (const SqliteStatement::FullObject& fullObj, fullObjects) + for (const SqliteStatement::FullObject& fullObj : fullObjects) { dbName = fullObj.database ? stripObjName(fullObj.database->value, dialect) : "main"; if (!objectsInNamedDb.contains(dbName)) @@ -945,10 +939,8 @@ void SqlEditor::scheduleQueryParser(bool force) syntaxValidated = false; document()->setModified(false); - queryParserTimer->stop(); - queryParserTimer->start(); - - scheduleAutoCompletion(); + queryParserTrigger->schedule(); + autoCompleteTrigger->schedule(); } int SqlEditor::sqlIndex(int idx) @@ -1053,6 +1045,21 @@ void SqlEditor::cursorMoved() } } +void SqlEditor::checkContentSize() +{ + if (document()->characterCount() > SqliteSyntaxHighlighter::MAX_QUERY_LENGTH) + { + if (richFeaturesEnabled) + notifyWarn(tr("Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled.")); + + richFeaturesEnabled = false; + } + else if (!richFeaturesEnabled) + { + richFeaturesEnabled = true; + } +} + void SqlEditor::formatSql() { QString sql = hasSelection() ? getSelectedText() : toPlainText(); @@ -1094,17 +1101,14 @@ void SqlEditor::loadFromFile() setFileDialogInitPathByFile(fName); - QFile file(fName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + QString err; + QString sql = readFileContents(fName, &err); + if (sql.isNull() && !err.isNull()) { - notifyError(tr("Could not open file '%1' for reading: %2").arg(fName).arg(file.errorString())); + notifyError(tr("Could not open file '%1' for reading: %2").arg(fName).arg(err)); return; } - QTextStream stream(&file); - stream.setCodec("UTF-8"); - QString sql = stream.readAll(); - file.close(); setPlainText(sql); loadedFile = fName; @@ -1556,7 +1560,7 @@ void SqlEditor::setShowLineNumbers(bool value) void SqlEditor::checkSyntaxNow() { - queryParserTimer->stop(); + queryParserTrigger->cancel(); parseContents(); } @@ -1617,7 +1621,7 @@ const SqlEditor::DbObject* SqlEditor::getValidObjectForPosition(const QPoint& po const SqlEditor::DbObject* SqlEditor::getValidObjectForPosition(int position, bool movedLeft) { - foreach (const DbObject& obj, validDbObjects) + for (const DbObject& obj : validDbObjects) { if ((!movedLeft && position > obj.from && position-1 <= obj.to) || (movedLeft && position >= obj.from && position <= obj.to)) diff --git a/SQLiteStudio3/guiSQLiteStudio/sqleditor.h b/SQLiteStudio3/guiSQLiteStudio/sqleditor.h index 1c98682..c56492c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/sqleditor.h +++ b/SQLiteStudio3/guiSQLiteStudio/sqleditor.h @@ -13,11 +13,17 @@ #include class CompleterWindow; -class QTimer; class Parser; class SqlEditor; class SearchTextDialog; class SearchTextLocator; +class LazyTrigger; + +#ifdef Q_OS_OSX +# define COMPLETE_REQ_KEY Qt::META +#else +# define COMPLETE_REQ_KEY Qt::CTRL +#endif CFG_KEY_LIST(SqlEditor, QObject::tr("SQL editor input field"), CFG_KEY_ENTRY(CUT, QKeySequence::Cut, QObject::tr("Cut selected text")) @@ -34,7 +40,7 @@ CFG_KEY_LIST(SqlEditor, QObject::tr("SQL editor input field"), CFG_KEY_ENTRY(FIND_PREV, QKeySequence::FindPrevious, QObject::tr("Find previous")) CFG_KEY_ENTRY(REPLACE, QKeySequence::Replace, QObject::tr("Replace in text")) CFG_KEY_ENTRY(DELETE_LINE, Qt::CTRL + Qt::Key_D, QObject::tr("Delete current line")) - CFG_KEY_ENTRY(COMPLETE, Qt::CTRL + Qt::Key_Space, QObject::tr("Request code assistant")) + CFG_KEY_ENTRY(COMPLETE, COMPLETE_REQ_KEY + Qt::Key_Space, QObject::tr("Request code assistant")) CFG_KEY_ENTRY(FORMAT_SQL, Qt::CTRL + Qt::Key_T, QObject::tr("Format contents")) CFG_KEY_ENTRY(MOVE_BLOCK_DOWN, Qt::ALT + Qt::Key_Down, QObject::tr("Move selected block of text one line down")) CFG_KEY_ENTRY(MOVE_BLOCK_UP, Qt::ALT + Qt::Key_Up, QObject::tr("Move selected block of text one line up")) @@ -199,10 +205,10 @@ class GUI_API_EXPORT SqlEditor : public QPlainTextEdit, public ExtActionContaine QMenu* validObjContextMenu = nullptr; Db* db = nullptr; CompleterWindow* completer = nullptr; - QTimer* autoCompleteTimer = nullptr; + LazyTrigger* autoCompleteTrigger = nullptr; bool autoCompletion = true; bool deletionKeyPressed = false; - QTimer* queryParserTimer = nullptr; + LazyTrigger* queryParserTrigger = nullptr; Parser* queryParser = nullptr; QHash objectsInNamedDb; QMutex objectsInNamedDbMutex; @@ -254,7 +260,7 @@ class GUI_API_EXPORT SqlEditor : public QPlainTextEdit, public ExtActionContaine void backspacePressed(); void complete(); void completeSelected(); - void scheduleAutoCompletion(); +// void scheduleAutoCompletion(); void checkForAutoCompletion(); void completerTypedText(const QString& text); void completerBackspacePressed(); @@ -266,6 +272,7 @@ class GUI_API_EXPORT SqlEditor : public QPlainTextEdit, public ExtActionContaine void highlightCurrentLine(); void updateLineNumberArea(const QRect&rect, int dy); void cursorMoved(); + void checkContentSize(); void formatSql(); void saveToFile(); void saveAsToFile(); diff --git a/SQLiteStudio3/guiSQLiteStudio/sqlitesyntaxhighlighter.cpp b/SQLiteStudio3/guiSQLiteStudio/sqlitesyntaxhighlighter.cpp index ac8d6cf..55ccc08 100644 --- a/SQLiteStudio3/guiSQLiteStudio/sqlitesyntaxhighlighter.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/sqlitesyntaxhighlighter.cpp @@ -279,7 +279,7 @@ bool SqliteSyntaxHighlighter::isError(int start, int lgt, bool* limitedDamage) { start += currentBlock().position(); int end = start + lgt - 1; - foreach (const Error& error, errors) + for (const Error& error : errors) { if (error.from <= start && error.to >= end) { @@ -294,7 +294,7 @@ bool SqliteSyntaxHighlighter::isValid(int start, int lgt) { start += currentBlock().position(); int end = start + lgt - 1; - foreach (const DbObject& obj, dbObjects) + for (const DbObject& obj : dbObjects) { if (obj.from <= start && obj.to >= end) return true; @@ -379,7 +379,7 @@ SqliteSyntaxHighlighter::DbObject::DbObject(int from, int to) : QList TextBlockData::parentheses() { QList list; - foreach (const TextBlockData::Parenthesis& par, parData) + for (const TextBlockData::Parenthesis& par : parData) list << ∥ return list; @@ -395,7 +395,7 @@ void TextBlockData::insertParenthesis(int pos, char c) const TextBlockData::Parenthesis* TextBlockData::parenthesisForPosision(int pos) { - foreach (const Parenthesis& par, parData) + for (const Parenthesis& par : parData) { if (par.position == pos) return ∥ diff --git a/SQLiteStudio3/guiSQLiteStudio/statusfield.cpp b/SQLiteStudio3/guiSQLiteStudio/statusfield.cpp index 4acd1a6..571fcba 100644 --- a/SQLiteStudio3/guiSQLiteStudio/statusfield.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/statusfield.cpp @@ -178,13 +178,13 @@ void StatusField::setupMenu() void StatusField::readRecentMessages() { noFlashing = true; - foreach (const QString& msg, NotifyManager::getInstance()->getRecentInfos()) + for (const QString& msg : NotifyManager::getInstance()->getRecentInfos()) info(msg); - foreach (const QString& msg, NotifyManager::getInstance()->getRecentWarnings()) + for (const QString& msg : NotifyManager::getInstance()->getRecentWarnings()) warn(msg); - foreach (const QString& msg, NotifyManager::getInstance()->getRecentErrors()) + for (const QString& msg : NotifyManager::getInstance()->getRecentErrors()) error(msg); noFlashing = false; diff --git a/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp b/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp index b63c58d..fd0c338 100644 --- a/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp @@ -158,7 +158,7 @@ QAction* TaskBar::getNextClosestAction(const QPoint& position) QToolButton* btn = nullptr; if (orientation() == Qt::Horizontal) { - foreach (QAction* action, tasks) + for (QAction* action : tasks) { btn = getToolButton(action); if (btn && btn->x() >= position.x()) @@ -167,7 +167,7 @@ QAction* TaskBar::getNextClosestAction(const QPoint& position) } else { - foreach (QAction* action, tasks) + for (QAction* action : tasks) { btn = getToolButton(action); if (btn && btn->y() >= position.y()) @@ -260,15 +260,33 @@ void TaskBar::dragTaskTo(QAction* task, int positionIndex) if (positionIndex < 0) return; + dragCurrentIndex = positionIndex; + removeAction(task); if (positionIndex >= tasks.size()) + { addAction(task); + tasks.removeOne(task); + tasks << task; + } else + { + int oldIdx = tasks.indexOf(task); + + // If we move from left to right, the positionIndex actually points to 1 position after, + // so insertAction() can expect its "before action" first argument. + // Although at this step we want precise position index to move the task on the list, + // so if this is movement from left to right, we deduct 1 from the index. + int newTaskIdx = (positionIndex > oldIdx) ? (positionIndex - 1) : positionIndex; + if (oldIdx == newTaskIdx) + return; + insertAction(tasks.at(positionIndex), task); + tasks.move(oldIdx, newTaskIdx); + } connect(getToolButton(task), SIGNAL(pressed()), this, SLOT(mousePressed())); - dragCurrentIndex = positionIndex; } QMimeData* TaskBar::generateMimeData() diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.qm index f1dac43..3f118d1 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts index c597ce1..0047f6c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts @@ -14,9 +14,8 @@ Über SQLiteStudio - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Freier, open-source, multiplattformfähiger SQLite Datenbankmanager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor und aktiver Verantwortlicher:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Freier, open-source, multiplattformfähiger SQLite Datenbankmanager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor und aktiver Verantwortlicher:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> @@ -58,6 +57,11 @@ Configuration directory Konfigurationsverzeichnis + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + + Qt version: @@ -91,261 +95,221 @@ <h3>Inhaltsverzeichnis:</h3><ol>%2</ol> + + BindParamsDialog + + + Query parameters + + + + + Please provide values for query parameters + + + BugDialog - Bugs and ideas - Fehler und Anregungen + Fehler und Anregungen - Reporter - Gemeldet von + Gemeldet von - E-mail address - Ihre E-mail Adresse oder Ihr 'bugtracker' Login + Ihre E-mail Adresse oder Ihr 'bugtracker' Login - - Log in - Anmelden + Anmelden - Short description - Kurzbeschreibung + Kurzbeschreibung - Detailed description - Ausführliche Fehlerbeschreibung + Ausführliche Fehlerbeschreibung - Show more details - Mehr Details + Mehr Details - SQLiteStudio version - SQLiteStudio Version + SQLiteStudio Version - Operating system - Betriebssystem + Betriebssystem - Loaded plugins - Geladene Plugins + Geladene Plugins - Send - Absenden + Absenden - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - Sie können Ihre gemeldeten Fehler und Anregungen sehen, wenn Sie im Menü '%1' den Eintrag '%2' auswählen. + Sie können Ihre gemeldeten Fehler und Anregungen sehen, wenn Sie im Menü '%1' den Eintrag '%2' auswählen. - A bug report sent successfully. - Ihr Fehlerbericht wurde erfolgreich versendet. + Ihr Fehlerbericht wurde erfolgreich versendet. - An error occurred while sending a bug report: %1 %2 - Beim Absenden des Fehlerberichts ist ein Fehler aufgetreten: %1 %2 + Beim Absenden des Fehlerberichts ist ein Fehler aufgetreten: %1 %2 - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - Sie können versuchen den Bericht erneut abzusenden. Ihr eingegebener Text wird nach einem Fehler wie diesem wieder hergestellt. + Sie können versuchen den Bericht erneut abzusenden. Ihr eingegebener Text wird nach einem Fehler wie diesem wieder hergestellt. - An idea proposal sent successfully. - Ihre Anregung wurde erfolgreich versendet. + Ihre Anregung wurde erfolgreich versendet. - An error occurred while sending an idea proposal: %1 %2 - Beim Absenden der Anregung ist ein Fehler aufgetreten: %1 %2 + Beim Absenden der Anregung ist ein Fehler aufgetreten: %1 %2 - A bug report - Fehlerbericht erfassen + Fehlerbericht erfassen - Describe problem in few words - Beschreiben Sie das Problem mit wenigen Worten + Beschreiben Sie das Problem mit wenigen Worten - Describe problem and how to reproduce it - Beschreiben Sie das Problem hier genauer und die Schritte, um es zu reproduzieren + Beschreiben Sie das Problem hier genauer und die Schritte, um es zu reproduzieren - A new feature idea - Anregung zu einer neuen Funktion erfassen + Anregung zu einer neuen Funktion erfassen - A title for your idea - Ein kurzer Titel für ihre Anregung + Ein kurzer Titel für ihre Anregung - Describe your idea in more details - Beschreiben Sie hier Ihre Anregung ausführlich + Beschreiben Sie hier Ihre Anregung ausführlich - Reporting as an unregistered user, using e-mail address. - Versenden als nicht registrierter Benutzer mittels E-mail Adresse. + Versenden als nicht registrierter Benutzer mittels E-mail Adresse. - Reporting as a registered user. - Versenden als registrierter Benutzer. + Versenden als registrierter Benutzer. - Log out - Abmelden + Abmelden - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - Die Angabe Ihrer echten E-mail Adresse ermöglicht es uns Sie bzgl. Ihres Berichts zu kontaktieren. Erfahren Sie mehr dazu und klicken Sie den 'Hilfe' Knopf auf der rechtehn Seite. + Die Angabe Ihrer echten E-mail Adresse ermöglicht es uns Sie bzgl. Ihres Berichts zu kontaktieren. Erfahren Sie mehr dazu und klicken Sie den 'Hilfe' Knopf auf der rechtehn Seite. - Enter vaild e-mail address, or log in. - Geben Sie Ihre gültige E-mail Adresse oder Ihre Anmeldedaten an. + Geben Sie Ihre gültige E-mail Adresse oder Ihre Anmeldedaten an. - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - Eine Kurzbeschreibung benötigt mindestens 10 Zeichen, maximal jedoch 100 Zeichen. Eine ausführlichere Beschreibung kann in dem Feld unten erfasst werden. + Eine Kurzbeschreibung benötigt mindestens 10 Zeichen, maximal jedoch 100 Zeichen. Eine ausführlichere Beschreibung kann in dem Feld unten erfasst werden. - Long description requires at least 30 characters. - Eine ausführliche Beschreibung benötigt mindestens 30 Zeichen. + Eine ausführliche Beschreibung benötigt mindestens 30 Zeichen. BugReportHistoryWindow - - Title - Titel + Titel - - Reported at - Gemeldet am + Gemeldet am - - URL - URL + URL - Reports history - Berichtsverlauf + Berichtsverlauf - Clear reports history - Lösche Berichtsverlauf + Lösche Berichtsverlauf - Delete selected entry - Gewählten Eintrag löschen + Gewählten Eintrag löschen - Invalid response from server. - Ungültige Antwort vom Server. + Ungültige Antwort vom Server. BugReportLoginDialog - Log in - Anmelden + Anmelden - Credentials Hier fehlt mir der Kontext!!! - Überprüfung + Überprüfung - Login: - Login: + Login: - Password: - Passwort: + Passwort: - Validation - Überprüfung + Überprüfung - Validate - Überprüfe + Überprüfe - Validation result message - Ergebnis der Überprüfung + Ergebnis der Überprüfung - Abort - Abbrechen + Abbrechen - A login must be at least 2 characters long. - Ein Login Kürzel muss mindestens 2 Zeichen lang sein. + Ein Login Kürzel muss mindestens 2 Zeichen lang sein. - A password must be at least 5 characters long. - Ein Passwort muss mindestens 5 Zeichen lang sein. + Ein Passwort muss mindestens 5 Zeichen lang sein. - Valid - Gültig + Gültig @@ -356,12 +320,12 @@ Kollationen filtern - + Collation name: Kollationsname: - + Implementation language: Sprache: @@ -490,11 +454,20 @@ + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. + + + Invalid default value expression: %1 - Ungültiger Standardwert für Ausdruck: %1 + Ungültiger Standardwert für Ausdruck: %1 - + Enter a name of the constraint. Geben Sie einen Namen für die Bedingung ein. @@ -606,7 +579,7 @@ - + Delete constraint column dialog Bedingung löschen @@ -666,34 +639,44 @@ Standardbedingung hinzufügen - + Are you sure you want to delete constraint '%1'? column dialog Sind Sie sicher, dass Sie die folgende Bedingung löschen wollen: '%1'? - + Correct the constraint's configuration. Korrigiert die Konfiguration der Bedingung. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. Diese Bedingung wird von SQLite 2 offiziell nicht unterstützt, aber sie kann dennoch benutzt werden. - + Scale is not allowed for INTEGER PRIMARY KEY columns. Für INTEGER PRIMARY KEY ist eine Skalierung nicht erlaubt. - + Precision cannot be defined without the scale. Die Präzision kann ohne Skalierung nicht definiert werden. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. Für INTEGER PRIMARY KEY ist eine Präzision nicht erlaubt. @@ -795,10 +778,9 @@ but it's okay to use it. Geben Sie einen Namen für die Bedingung ein. - Autoincrement (only for %1 type columns) column primary key - Automatische Zählung (nur für %1 Spaltentypen) + Automatische Zählung (nur für %1 Spaltentypen) @@ -910,7 +892,7 @@ but it's okay to use it. ConfigDialog - + Configuration Konfiguration @@ -1001,128 +983,139 @@ but it's okay to use it. Datenbearbeitung - + Number of data rows per page: Anzahl an Datenzeilen pro Seite: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> <p>Wenn Daten in das Ergebnisfenster eingelesen werden, dann wird die Breite der Spalten dabei automatisch angepasst. Dieser Wert begrenzt maximale Breite für die automatische Breitenanpassung. Der Anwender kann die Spaltenbreite jedoch manuell über dieses Limit verbreitern.</p> - + Limit initial data column width to (in pixels): Begrenze die initiale Spaltenbreite im Ergebnisfenster auf (Pixel): - + Keep NULL value when entering empty value - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> - + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + + + Number of memorized table populating configurations + + + + Show column and row details tooltip in data view - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value - + Inserting new row in data grid Neue Zeile im Gitternetz des Datenfensters hinzufügen - + Before currently selected row Vor der derzeitig ausgewählten Zeile - + After currently selected row Nach der derzeitig ausgewählten Zeile - + At the end of data view Am Ende der Datenfensters - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> <p>Wenn aktiviert, wird der Reiter "Daten" anstelle des Reiters "Struktur" angezeigt beim öffnen eines Tabellenfensters angezeigt.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> <p>Wenn aktiviert, wird der Reiter "Daten" als erster Reiter angezeigt für jedes Tabellenfenster, anstelle an zweiter Stelle.</p> - + Place data tab as first tab in a Table Window Den Reiter Daten als ersten Reiter im Tabellenfenster anzeigen - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> - + Place data tab as first tab in a View Window Den Reiter Daten als ersten Reiter im View-Fenster anzeigen - + Data types Datentypen - + Available editors: Verfügbare Editoren: - + Editors selected for this data type: Für diesen Datentyp ausgewählte Editoren: - + Schema editing Schema - + Number of DDL changes kept in history. Maximale Anzahl an DDL Änderungen im Verlauf. - + DDL history size: DDL Verlaufsgröße: @@ -1131,104 +1124,104 @@ but it's okay to use it. Zeige keine DDL Vorschau, wenn Schemaänderungen committed werden - + SQL queries SQL Abfragen - - + + Number of queries kept in the history. Maximale Anzahl an SQL Abfragen im Verlauf. - + History size: Verlaufsgröße: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>Wenn diese Option aktiviert ist und sich mehrere SQL Abfragen im Editorfenster befinden, dann wird nur die SQL Abfrage ausgeführt, in der sich der Cursor befindet. Ist diese Option nicht gesetzt, dann werden alle SQL Abfragen ausgeführt. Sie können die auszuführenden SQL Abfragen selbst bestimmen, indem Sie diese vor der Ausführung mit der Maus oder Tastatur markieren.</p> - + Execute only the query under the cursor Führt nur die Abfrage unter dem Cursor aus - + Updates Updates - + Automatically check for updates at startup Prüfe vor dem Start automatisch auf Updates - + Session Sitzung - + Restore last session (active MDI windows) after startup Stelle letzte Sitzung nach dem Start wieder her (aktive MDI Fenster) - + Status Field Statusfeld - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> - + Always open Status panel when new message is printed Den Panel Status immer öffnen, wenn eine neue Meldung ausgegeben wird - + Filter shortcuts by name or key combination Filtere Tastaturkürzel nach Name oder Tastenkombination - + Action Aktion - + Key combination Tastenkombination - - + + Language Sprache - + Changing language requires application restart to take effect. Die Änderung der Sprache erfordert einen Neustart des Programms. - + Compact layout Kompaktes Layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> <p>Das kompakte Layout reduziert alle Lücken und Abstände der Oberfläche auf ein Minimum, um mehr Platz für die Darstellung der Daten zu schaffen. Die Oberfläche sieht dann zwar nicht mehr sehr ästhetisch aus, aber man hat mehr Daten im Überblick.</p> - + Use compact layout Benutze kompaktes Layout @@ -1308,7 +1301,7 @@ but it's okay to use it. Zeige Systemtabellen und Indizes in der Liste an - + Table windows Tabellenfenster @@ -1317,12 +1310,12 @@ but it's okay to use it. Wenn die Option aktiviert ist, dann wird im Tabellenfenster der Reiter "Daten" angezeigt statt "Strukturen". - + Open Table Windows with the data tab for start Öffnet das Tabellenfenster mit dem Reiter "Daten" im Vordergrund - + View windows Viewfenster @@ -1331,182 +1324,193 @@ but it's okay to use it. Wenn die Option aktiviert ist, dann wird im Viewfenster der Reiter "Daten" angezeigt statt "Strukturen". - + Open View Windows with the data tab for start Öffnet das Viewfenster mit dem Reiter "Daten" im Vordergrund - + Don't show DDL preview dialog when committing schema changes - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters + + + + Main window dock areas Dockingbereiche des Hauptfensters - + Left and right areas occupy corners Linke und rechte Bereiche belegen die Ecken - + Top and bottom areas occupy corners Obere und untere Bereiche belegen die Ecken - + Hide built-in plugins Verberge eingebaute Plugins - + Current style: Aktueller Stil: - + Preview Vorschau - + Enabled Aktiviert - + Disabled Deaktiviert - + Active formatter plugin Aktives Formatierungsplugin - + SQL editor font Schriftart des SQL Editors - + Database list font Schriftart der Datenbankliste - + Database list additional label font Zusätzliche Bezeichnungen in der Datenbankliste - + Data view font Schriftart der Ergebnisansicht - + Status field font Schriftart des Statusfelds - + SQL editor colors Farben des SQL Editors - + Current line background Hintergrundfarbe der aktuellen Zeile - + <p>SQL strings are enclosed with single quote characters.</p> <p>SQL Zeichenketten sind mit einfachen Anführungszeichen umschlossen.</p> - + String foreground Vordergrundfarbe von Zeichenketten - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> <p>Bind Parameter sind Platzhalter für Werte, die der Anwender eingibt. Sie haben dabei eine der folgenden Formen:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground Vordergrundfarbe von Bind Parametern - + Highlighted parenthesis background Hintergrundfarbe von hervorgehobener Klammern - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> <p>BLOB Werte sind hexadezimale Werte wie z.B.:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground Vordergrundfarbe von BLOB Werten - + Regular foreground Reguläre Vordergrundfarbe - + Line numbers area background Hintergrundfarbe der Zeilennummernleiste - + Keyword foreground Vordergrundfarbe von Schlüsselwörtern - + Number foreground Vordergrundfarbe von Ziffern - + Comment foreground Vordergrundfarbe von Kommentaren - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> <p>Gültige Objekte sind Namen von Tabellen, Indizes, Triggern oder Views die in der SQLite Datenbank existieren.</p> - + Valid objects foreground Vordergrundfarbe von gültigen Objekten - + Data view colors Farben der Ergebnisansicht - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + Uncommitted data outline color - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> @@ -1523,140 +1527,140 @@ but it's okay to use it. <p>Tritt beim Speichern einer Änderung ein Problem auf, dann wird die problematische Zelle mit dieser Farbe markiert.</p> - + Commit error outline color Rahmenfarbe für fehlerhafte Daten - + NULL value foreground Vordergrundfarbe für NULL Werte - + Deleted row background Hintergrundfarbe von gelöschten Zeilen - + Database list colors Farben der Datenbankliste - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> <p>Zusätzliche Bezeichnungen sind solche, die z.B. die SQLite Version oder die Anzahl an Einträgen in einer Baumliste usw. anzeigen.</p> - + Additional labels foreground Vordergrundfarbe für zusätzliche Bezeichnungen - + Status field colors Farben des Statusfelds - + Information message foreground Vordergrundfarbe für Infomeldungen - + Warning message foreground Vordergrundfarbe für Warnmeldungen - + Error message foreground Vordergrundfarbe für Fehlermeldungen - + Description: plugin details Bezeichnung: - + Category: plugin details Kategorie: - + Version: plugin details Version: - + Author: plugin details Autor: - + Internal name: plugin details Interner Name: - + Dependencies: plugin details Abhängigkeiten: - + Conflicts: plugin details Konflikte: - + Plugin details Plugin Details - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. Plugins werden direkt beim Aktivieren/Deaktivieren geladen bzw. entfernt, die modifizierte Pluginliste wird jedoch erst beim Bestätigen und Schließen des Konfigurationsfensters gespeichert. - + %1 (built-in) plugins manager in configuration dialog %1 (eingebaut) - + Details Details - + No plugins in this category. Keine Plugins in dieser Kategorie. - + Add new data type Neuen Datentypen zufügen - + Rename selected data type Markierten Datentypen umbenennen - + Delete selected data type Markierten Datentypen löschen - + Help for configuring data type editors Hilfe zur Konfiguration des Datentypen Editors @@ -1808,138 +1812,154 @@ but it's okay to use it. DataView - + Filter data data view Daten filtern - + Grid view Gitteransicht - + Form view Formularansicht - + Refresh table data data view Aktualisiere Tabellendaten - + First page data view Erste Seite - + Previous page data view Vorherige Seite - + Next page data view Nächste Seite - + Last page data view Letzte Seite - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view Filter anwenden - + Commit changes for selected cells data view Änderungen für die selektierten Zellen speichern - + Rollback changes for selected cells data view Änderungen für die selektierten Zellen zurücknehmen - + Show grid view of results sql editor Zeige Ergebnismenge in der Gitteransicht - + Show form view of results sql editor Zeige Ergebnismenge in der Formularansicht - + Filter by text data view Nach Text filtern - + Filter by the Regular Expression data view Nach regulärem Ausdruck filtern - + Filter by SQL expression data view Nach einem SQL Ausdruck filtern - + Tabs on top data view Reiterleiste oben - + Tabs at bottom data view Reiterleiste unten - + Place new rows above selected row data view Neue Zeilen über der ausgewählten Zeile einfügen - + Place new rows below selected row data view Neue Zeilen nach der ausgewählten Zeile einfügen - + Place new rows at the end of the data view data view Neue Zeilen am Ende des Datenfensters einfügen - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Gesamtanzahl der Zeilen wird ermittelt. Das Aufrufen anderer Seiten ist erst nach Abschluss der Zählung möglich. - + Row: %1 Zeile: %1 @@ -2126,7 +2146,7 @@ Das Aufrufen anderer Seiten ist erst nach Abschluss der Zählung möglich. - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> @@ -2237,288 +2257,425 @@ Das Aufrufen anderer Seiten ist erst nach Abschluss der Zählung möglich.Nach Name filtern - + Copy Kopieren - + Paste Einfügen - + Select all Alles auswählen - + Create a group Gruppe erstellen - + Delete the group Diese Gruppe löschen - + Rename the group Gruppe umbenennen - Add a database - Datenbank hinzufügen + Datenbank hinzufügen - Edit the database - Datenbank editieren + Datenbank editieren - Remove the database - Datenbank entfernen + Datenbank entfernen - Connect to the database - Mit der Datenbank verbinden + Mit der Datenbank verbinden - Disconnect from the database - Verbindung zur Datenbank trennen + Verbindung zur Datenbank trennen - + Import Import - Export the database - Datenbank exportieren + Datenbank exportieren - Convert database type - Datenbanktyp konvertieren + Datenbanktyp konvertieren - Vacuum ??? - Vakuum + Vakuum - Integrity check - Integritätsprüfung + Integritätsprüfung - Create a table - Tabelle erstellen + Tabelle erstellen - Edit the table - Tabelle editieren + Tabelle editieren - Delete the table - Tabelle löschen + Tabelle löschen - + Export the table Tabelle exportieren - + Import into the table In die Tabelle importieren - + Populate table Tabelle füllen - + Create similar table Erzeuge identische Tabelle - + Reset autoincrement sequence Automatischen Zähler zurücksetzen - Create an index - Index erstellen + Index erstellen - Edit the index - Index editieren + Index editieren - Delete the index - Index löschen + Index löschen - Create a trigger - Trigger erstellen + Trigger erstellen - Edit the trigger - Trigger editieren + Trigger editieren - Delete the trigger - Trigger löschen + Trigger löschen - Create a view - View erstellen + View erstellen - Edit the view - View editieren + View editieren - Delete the view - View löschen + View löschen - + Add a column Spalte zufügen - + Edit the column Spalte editieren - + Delete the column Spalte löschen - + Delete selected items Gewählte Einträge löschen - + Clear filter Filter zurücksetzen - Refresh all database schemas - Alle Datenbankschemen aktualisieren + Alle Datenbankschemen aktualisieren - Refresh selected database schema - Alle markierten Datenbankschemen aktualisieren + Alle markierten Datenbankschemen aktualisieren + + + + Execution from file cancelled. Any queries executed so far have been rolled back. + + + + + &Add a database + + + + + &Edit the database + + + + + &Remove the database + + + + + &Connect to the database + - + &Disconnect from the database + + + + + &Export the database + + + + + Con&vert database type + + + + + Vac&uum + + + + + &Integrity check + + + + + Create a &table + + + + + Edit the t&able + + + + + Delete the ta&ble + + + + + Create an &index + + + + + Edit the i&ndex + + + + + Delete the in&dex + + + + + Create a trig&ger + + + + + Edit the trigg&er + + + + + Delete the trigge&r + + + + + Create a &view + + + + + Edit the v&iew + + + + + Delete the vi&ew + + + + + &Refresh all database schemas + + + + + Re&fresh selected database schema + + + + + Erase table data Tabellendaten löschen - - + + Open file's directory + + + + + Execute SQL from file + + + + + Database Datenbank - + Grouping Gruppieren - + Generate query for table Abfrage für Tabelle generieren - - + + Create group Gruppe erstellen - + Group name Gruppenname - + Entry with name %1 already exists in group %2. Der Eintrag mit Namen %1 existiert bereits in der Gruppe %2. - + Delete group Gruppe löschen - + Are you sure you want to delete group %1? All objects from this group will be moved to parent group. Sind Sie sicher, dass Sie die Gruppe %1 löschen möchten? Alle Objekte in dieser Gruppe werden in die übergeordnete Gruppe verschoben. - + Are you sure you want to remove database '%1' from the list? Sind Sie sicher, dass Sie die Datenbank '%1' aus der Liste entfernen möchten? - + Are you sure you want to remove following databases from the list: %1 Sind Sie sicher, dass Sie folgende Datenbanken aus der Liste entfernen möchten: %1 - + Remove database Datenbank entfernen - + Vacuum (%1) Vacuum (%1) - + Autoincrement value for table '%1' has been reset successfully. - + Are you sure you want to delete all data from table(s): %1? + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + Die Datei '%1' kann nicht für Lesezugriffe geöffnet werden: %2 + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + Delete database Datenbank löschen @@ -2529,14 +2686,14 @@ Alle Objekte in dieser Gruppe werden in die übergeordnete Gruppe verschoben.
Sind Sie sicher, dass Sie die Datenbank '%1' entfernen möchten? - - + + Cannot import, because no import plugin is loaded. Der Import kann nicht durchgeführt werden, da kein Import Plugin geladen ist. - - + + Cannot export, because no export plugin is loaded. Export fehlgeschlagen, da kein Export Plugins geladen sind. @@ -2549,22 +2706,22 @@ Alle Objekte in dieser Gruppe werden in die übergeordnete Gruppe verschoben.
VACUUM erfolgreich abgeschlossen. - + Integrity check (%1) Integritätsprüfung (%1) - + Reset autoincrement Autoincrement zurücksetzen - + Are you sure you want to reset autoincrement value for table '%1'? Sind Sie sicher, dass Sie den Autoincrement Wert für die Tabelle '%1' zurücksetzen möchten? - + An error occurred while trying to reset autoincrement value for table '%1': %2 Ein Fehler ist aufgetreten beim Zurücksetzen des Autoincrementwertes für die Tabelle '%1': %2 @@ -2577,37 +2734,37 @@ Alle Objekte in dieser Gruppe werden in die übergeordnete Gruppe verschoben.
Sind Sie sicher, dass Sie alle Daten der Tabelle '%1' löschen möchten? - + An error occurred while trying to delete data from table '%1': %2 Beim Löschen der Daten aus Tabelle '%1' ist folgender Fehler aufgetreten: %2 - + All data has been deleted for table '%1'. Es wurden alle Daten aus Tabelle '%1' gelöscht. - + Following objects will be deleted: %1. Folgende Objekte werden gelöscht: %1. - + Following databases will be removed from list: %1. Folgende Datenbanken werden aus der Liste entfernt: %1. - + Remainig objects from deleted group will be moved in place where the group used to be. Die aus der gelöschten Gruppe verbleibenden Objekte werden an die Position der gelöschten Gruppe verschoben. - + %1<br><br>Are you sure you want to continue? %1<br><br>Sind Sie sicher, dass Sie fortfahren möchten? - + Delete objects Objekte löschen @@ -2696,75 +2853,75 @@ Alle Objekte in dieser Gruppe werden in die übergeordnete Gruppe verschoben.
Trigger (%1): - + Copy Kopieren - + Move Verschieben - + Include data Inklusive Daten - + Include indexes Inklusive Indizes - + Include triggers Inklusive Trigger - + Abort Abbrechen - + Could not add dropped database file '%1' automatically. Manual setup is necessary. - + Referenced tables Referenzierte Tabellen - + Do you want to include following referenced tables as well: %1 Möchten Sie die folgenden referenzierten Tabellen mit einbeziehen? %1 - + Name conflict Namenskonflikt - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: Folgende Objekte existieren bereits in der Datenbank. Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den Vorgang abzubrechen: - + SQL statements conversion SQL Statement Konvertierung - + Following error occurred while converting SQL statements to the target SQLite version: Folgender Fehler trat auf bei der Konvertierung von SQL Statements in die SQLite Zielversion: - + Would you like to ignore those errors and proceed? Möchten Sie diese Fehler ignorieren und fortfahren? @@ -2820,130 +2977,136 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Abfrage - + History Verlauf - + Results in the separate tab Ergebnisse in separatem Reiter - + Results below the query Ergebnisse unter der Abfrage - - + + SQL editor %1 SQL Editor %1 - + Results Ergebnisse - + Execute query Abfrage ausführen - + Explain query Abfrage ausführen (explain) - + Clear execution history sql editor Ausführungsverlauf löschen - + Export results sql editor Ergebnisse exportieren - + Create view from query sql editor View aus der Abfrage erstellen - + Previous database Vorherige Datenbank - + Next database Nächste Datenbank - + Show next tab sql editor Nächsten Reiter zeigen - + Show previous tab sql editor Vorherigen Reiter zeigen - + Focus results below sql editor Fokus auf die Ergebnisse unten - + Focus SQL editor above sql editor Fokus auf den SQL Editor oben - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) Aktive Datenbank (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 Abfrage in %1 Sekunde(n) abgeschlossen. %2 Zeile(n) betroffen - + Query finished in %1 second(s). Abfrage in %1 Sekunde(n) abgeschlossen. - + Clear execution history Lösche Ausführungsverlauf - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. Sind Sie sicher, dass Sie den gesamten SQL Ausführungsverlauf löschen möchten? Dieser Vorgang kann nicht rückgängig gemacht werden. - + Cannot export, because no export plugin is loaded. Es kann nicht exportiert werden, da kein Export Plugin geladen ist. - + No database selected in the SQL editor. Cannot create a view for unknown database. Es ist keine Datenbank im SQL Editor selektiert. Für eine unbekannte Datenbank kann kein View erzeugt werden. - + Editor window "%1" has uncommitted data. @@ -2970,6 +3133,64 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Möchten Sie fortsetzen? + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + Optionen + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + SQL Skripte (*.sql);;Alle Dateien (*) + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + ExportDialog @@ -3121,79 +3342,112 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Optionen des Exportformats - + Cancel Abbrechen - - - + + + Select database to export. Wählen Sie die zu exportierenden Datebank aus. - + Select table to export. Wählen Sie die zu exportierenden Tabellen aus. - + Enter valid query to export. ??? Geben Sie eine gültige Abfrage für den Export an. - + Select at least one object to export. Wählen Sie ein zu exportierendes Datebankobjekt aus. - + You must provide a file name to export to. Sie müssen einen Namen für die Exportdatei angeben. - + Path you provided is an existing directory. You cannot overwrite it. Das von Ihnen angegebene Verzeichnis existiert bereits. Es kann nicht überschrieben werden. - + The directory '%1' does not exist. Das Verzeichnis '%1' existiert nicht. - + The file '%1' exists and will be overwritten. Die Datei '%1' existiert bereits und wird überschrieben werden. - + All files (*) Alle Dateien (*) - + Pick file to export to Wählen Sie eine Datei aus in die exportiert werden soll - + Internal error during export. This is a bug. Please report it. Es trat ein interner Fehler während des Exportvorgangs auf. Dies ist ein Fehler, bitte melden Sie ihn dem Programmautor. - FontEdit + FileExecErrorsDialog - - Choose font - font configuration - Schriftart auswählen + + Execution errors + - - + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + Fehler + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + + + FontEdit + + + Choose font + font configuration + Schriftart auswählen + + + Form @@ -3204,49 +3458,49 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V FormView - + Commit row form view Zeile speichern (Commit) - + Rollback row form view Zeile rückgängig (Rollback) - + First row form view Erste Zeile - + Previous row form view Vorherige Zeile - + Next row form view Nächste Zeile - + Last row form view Letzte Zeile - + Insert new row form view Neue Zeile einfügen - + Delete current row form view Aktuelle Zeile löschen @@ -3305,13 +3559,13 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Initialisierungsanweisungen: - + Function implementation code: Funktionsanweisungen: - + Final step implementation code: Abschlussanweisungen: @@ -3480,42 +3734,42 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Datenquellenoptionen - + Cancel Abbrechen - + If you type table name that doesn't exist, it will be created. Wenn Sie einen Tabellenname eingeben, der noch nicht existiert, dann wird diese neue Tabelle erzeugt werden. - + Enter the table name Datenbankname eingeben - + Select import plugin. Importplugin auswählen - + You must provide a file to import from. Sie müssen den Namen der Importdatei angeben. - + The file '%1' does not exist. Die Datei '%1' existiert nicht. - + Path you provided is a directory. A regular file is required. Der von Ihnen angegebene Pfad ist ein Verzeichnis. Es wird jedoch eine Datei benötigt. - + Pick file to import from Wählen Sie eine Datei aus von der importiert werden soll. @@ -3554,12 +3808,12 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Spalte - + Collation Kollation - + Sort Sortierung @@ -3739,273 +3993,402 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Ansichtenleiste - + Configuration widgets Konfigurationshelfer - + Syntax highlighting engines Syntaxhervorhebungen - + Data editors Dateneditoren - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. Ablauf im Debugmodus. Zum Öffnen der Debugkonsole drücken Sie %1 oder wählen Menü 'Hilfe' den Eintrag 'Debugkonsole öffnen' aus. - + Running in debug mode. Debug messages are printed to the standard output. Ablauf im Debugmodus. Debugmeldungen werden in der Standardausgabe angezeigt.. - + You need to restart application to make the language change take effect. Das Programm muss neu gestartet werden, damit die Änderung der Sprache wirksam wird. - Open SQL editor - SQL Editor öffnen + SQL Editor öffnen - Open DDL history - DDL Verlauf öffnen - - - - Open SQL functions editor - + DDL Verlauf öffnen - Open collations editor - Editor für Kollationen öffnen + Editor für Kollationen öffnen - Import - Importieren + Importieren - Export - Exportieren + Exportieren - Open configuration dialog - Einstellungen + Einstellungen - Tile windows - Alle Fenster aufteilen + Alle Fenster aufteilen - Tile windows horizontally - Alle Fenster horizontal aufteilen + Alle Fenster horizontal aufteilen - Tile windows vertically - Alle Fenster vertikal aufteilen + Alle Fenster vertikal aufteilen - Cascade windows - Alle Fenster kaskadiert aufteilen + Alle Fenster kaskadiert aufteilen - + Next window Nächstes Fenster - + Previous window Vorheriges Fenster - + Hide status field Statusfeld verbergen - Close selected window - Ausgewähltes Fenster schließen + Ausgewähltes Fenster schließen - Close all windows but selected - Alle anderen Fenster schließen + Alle anderen Fenster schließen - Close all windows - Alle Fenster schließen + Alle Fenster schließen - Restore recently closed window - Zuletzt geöffnetes Fenster wiederherstellen + Zuletzt geöffnetes Fenster wiederherstellen - Rename selected window - Ausgewähltes Fenster umbenennen + Ausgewähltes Fenster umbenennen - + Open Debug Console Debug Konsole öffnen - + Open CSS Console CSS Konsole öffnen - Report a bug - Fehler melden + Fehler melden - Propose a new feature - Eine neue Programmfunktion vorschlagen + Eine neue Programmfunktion vorschlagen - About - Über SQLiteStudio + Über SQLiteStudio - Licenses - Lizenzen + Lizenzen - Open home page - Homepage aufrufen + Homepage aufrufen - Open forum page - Forum aufrufen + Forum aufrufen - User Manual - Bedienungsanleitung + Bedienungsanleitung - SQLite documentation - SQLite Dokumentation + SQLite Dokumentation - Report history - Verlauf gemeldeter Fehler + Verlauf gemeldeter Fehler - Check for updates - Auf Updates prüfen + Auf Updates prüfen - Database menubar - Datenbank + Datenbank - Structure menubar - Struktur + Struktur - View menubar - Ansicht + Ansicht - + Window list menubar view menu Fensterliste - Tools menubar - Werkzeuge + Werkzeuge - Help - Hilfe + Hilfe + + + + Open SQL &editor + + + + + Open DDL &history + + + + + Open SQL &functions editor + + + + + Open &collations editor + + + + + Open ex&tension manager + + + + + &Import + + + + + E&xport + + + + + Open confi&guration dialog + + + + + &Tile windows + + + + + Tile windows &horizontally + + + + + Tile windows &vertically + + + + + &Cascade windows + + + + + Close selected &window + + + + + Close all windows &but selected + + + + + Close &all windows + + + + + Re&store recently closed window + + + + + &Rename selected window + + + + + Report a &bug + + + + + Propose a new &feature + - + + &About + + + + + &Licenses + + + + + Open home &page + + + + + Open fo&rum page + + + + + User &Manual + + + + + SQLite &documentation + + + + + Bugs and feature &requests + + + + + Check for &updates + + + + + &Database + menubar + + + + + &Structure + menubar + + + + + &View + menubar + + + + + &Tools + menubar + + + + + &Help + + + + Could not set style: %1 main window Der folgende Stil kann nicht gesetzt werden: %1 - + Cannot export, because no export plugin is loaded. Es kann nicht exportiert werden, da kein Export Plugin geladen ist. - + Cannot import, because no import plugin is loaded. Es kann nicht importiert werden, da kein Import Plugin geladen ist. - + Rename window Fenster umbenennen - + Enter new name for the window: Neuen Namen für das Fenster eingeben: - + New updates are available. <a href="%1">Click here for details</a>. Neues Update verfügbar. <a href="%1">Weitere Details</a>. - + You're running the most recent version. No updates are available. Sie haben bereits die aktuellste Version. Keine Update verfügbar. - + Database passed in command line parameters (%1) was already on the list under name: %2 Die Datenbank, die mittels Programmparameter übergeben wurde (%1), war bereits in der Liste unter dem Namen %2 vorhanden. - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 Die Datenbank, die mittels Programmparameter übergeben wurde (%1), wurde in der Liste termporär unter dem Namen %2 zugefügt. - + Could not add database %1 to list. Die Datenbank %1 konnte nicht hinzugefügt werden. @@ -4041,23 +4424,28 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V NULL Wert - + Configure editors for this data type Konfigurationseditoren für diesen Datentyp - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. Das Dateneditor Plugin '%1' ist nicht geladen, obwohl es für den '%1' Datentypen als Editor definiert ist. - + Deleted multieditor Gelöscht - + Read only multieditor Nur lesend @@ -4066,94 +4454,144 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V MultiEditorBool - Boolean - Boolean + Boolean + + + + MultiEditorBoolPlugin + + + Boolean + Boolean MultiEditorDate - Date - Datum + Datum + + + + MultiEditorDatePlugin + + + Date + Datum MultiEditorDateTime - Date & time - Datum & Zeit + Datum & Zeit + + + + MultiEditorDateTimePlugin + + + Date & time + Datum & Zeit MultiEditorHex - Hex - Hexadezimal + Hexadezimal + + + + MultiEditorHexPlugin + + + Hex + Hexadezimal MultiEditorNumeric - Number numeric multi editor tab name - Nummer + Nummer + + + + MultiEditorNumericPlugin + + + Number + numeric multi editor tab name + Nummer MultiEditorText - Text - Text + Text - + Tab changes focus Hier fehlt mir der Kontext... Nacharbeiten nötig. Reiter Änderungen Fokus - + Cut Ausschneiden - + Copy Kopieren - + Paste Einfügen - + Delete Löschen - + Undo Rückgängig - + Redo Wiederholen + + MultiEditorTextPlugin + + + Text + Text + + MultiEditorTime - Time - Zeit + Zeit + + + + MultiEditorTimePlugin + + + Time + Zeit @@ -4228,37 +4666,40 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Komponente - + + This application will be closed and the update installer will start to download and install all the updates. + + + Current version - Derzeitige Version + Derzeitige Version - + Update version Neue Version - + Check for updates on startup Beim Programmstart auf Updates prüfen - + Update to new version! Auf neue Version aktualisieren! - The update will be automatically downloaded and installed. This will also restart application at the end. - Das Update wird automatisch heruntergeladen und installiert. Die Anwendung wird daraufhin neugestartet. + Das Update wird automatisch heruntergeladen und installiert. Die Anwendung wird daraufhin neugestartet. - + Not now. Nicht jetzt. - + Don't install the update and close this window. Update nicht installieren und Fenster schließen. @@ -4310,32 +4751,32 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Füllen - + Abort Abbrechen - + Configure Konfigurieren - + Populating configuration for this column is invalid or incomplete. Die Konfigurationsauffüllung für diese Spalte ist ungültig oder unvollständig. - + Select database with table to populate Wählen Sie die Datebank und Tabelle zum Auffüllen aus - + Select table to populate Wählen Sie die Tabelle zum Auffüllen aus - + You have to select at least one column. Sie müssen mindestens eine Spalte auswählen. @@ -4410,129 +4851,134 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Name der Kollation: %1 - + Data grid view Ergebnisansicht - + Copy cell(s) contents to clipboard Kopiert Zelleninhalt(e) in die Zwischenablage + Copy cell(s) contents together with header to clipboard + + + + Paste cell(s) contents from clipboard Fügt Zelleninhalt(e) von der Zwischenablage ein - + Set empty value to selected cell(s) Fügt einen leeren Wert in die selektierte(n) Zelle(n) ein - + Set NULL value to selected cell(s) Fügt den NULL Wert in die selektierte(n) Zelle(n) ein - + Commit changes to cell(s) contents Änderungen der Zellenninhalte speichern - + Rollback changes to cell(s) contents Änderungen der Zelleninhalte zurücknehmen - + Delete selected data row Markierte Datenzeile löschen - + Insert new data row Neue Datenzeile einfügen - + Open contents of selected cell in a separate editor Inhalt der markierten Zelle im separaten Editor öffnen - + Total pages available: %1 Verfügbare Gesamtseiten: %1 - + Total rows loaded: %1 Insgesamt geladene Zeilen: %1 - + Data view (both grid and form) Ergebnisansicht (tabellarisch und Formular) - + Refresh data Daten aktualisieren - + Switch to grid view of the data Zur tabellarischen Ergebnisansicht wechseln - + Switch to form view of the data Zur Formularansicht wechseln - + Database list Liste der Datenbanken - + Delete selected item Gewählten Eintrag löschen - + Clear filter contents Filter zurücksetzen - + Refresh schema Schema aktualisieren - + Refresh all schemas Alle Schemas aktualisieren - + Add database Datenbank hinzufügen - + Select all items Alles auswählen - + Copy selected item(s) Gewählte Einträge kopieren - + - + Paste from clipboard Von der Zwischenablage einfügen @@ -4607,42 +5053,42 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Derzeitige Zeile löschen - + Main window Hauptfenster - + Open SQL editor SQL Editor öffnen - + Previous window Vorheriges Fenster - + Next window Nächstes Fenster - + Hide status area Statusfeld verbergen - + Open configuration dialog Konfigurationsdialog öffnen - + Open Debug Console Debug Konsole öffnen - + Open CSS Console CSS Konsole öffnen @@ -4653,111 +5099,111 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V - + Cut selected text Gewählten Text ausschneiden - + Copy selected text Gewählten Text kopieren - + Delete selected text Gewählten Text löschen - + Undo Rückgängig - + Redo Wiederholen - + SQL editor input field SQL Editor Eingabefeld - + Select whole editor contents Gesamten Editorinhalt auswählen - + Save contents into a file Inhalte in eine Datei speichern - + Load contents from a file Inhalte aus einer Datei laden - + Find in text Suche im Text - + Find next Nächster Fund - + Find previous Vorheriger Fund - + Replace in text Ersetze im Text - + Delete current line Aktuelle Zeile löschen - + Request code assistant Code-Assistenten anfordern - + Format contents Format-Inhalte - + Move selected block of text one line down Selektierten Textblock eine Zeile nach unten verschieben - + Move selected block of text one line up Selektierten Textblock eine Zeile nach oben verschieben - + Copy selected block of text and paste it a line below Selektierten Textblock kopieren und unterhalb einfügen - + Copy selected block of text and paste it a line above Selektierten Textblock kopieren und oberhalb einfügen - + Toggle comment Kommentar umschalten @@ -4778,15 +5224,13 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Datenbankdatei - Reports history window Diese Übersetzung muss noch einmal geprüft werden, wenn ich den Kontext dazu kenne. - Report-Verlaufsfenster + Report-Verlaufsfenster - Delete selected entry - Gewählten Eintrag löschen + Gewählten Eintrag löschen @@ -4833,6 +5277,11 @@ Bitte geben Sie einen neuen, eindeutigen Namen an oder drücken Sie %1, um den V Move keyboard input focus to the SQL editor above Tastatureingabe-Fokus in das obere SQL Editorfenster setzen + + + Delete selected SQL history entries + + Table window @@ -5059,180 +5508,180 @@ find next SqlEditor - + Cut sql editor Ausschneiden - + Copy sql editor Kopieren - + Paste sql editor Einfügen - + Delete sql editor Löschen - + Select all sql editor Alles auswählen - + Undo sql editor Rückgängig - + Redo sql editor Wiederholen - + Complete sql editor Komplett - + Format SQL sql editor SQL formatieren - + Save SQL to file sql editor SQL in Datei speichern - + Select file to save SQL sql editor SQL aus Datei laden - + Load SQL from file sql editor Zeile löschen - + Delete line sql editor Zeile löschen - + Move block down sql editor Block nach unten verschieben - + Move block up sql editor Block nach oben verschieben - + Copy block down sql editor Block nach unten kopieren - + Copy up down sql editor "up down" ??? Muss geklärt werden! Kopiere auf ab - + Find sql editor Finden - + Find next sql editor Nächster Fund - + Find previous sql editor Vorheriger Fund - + Replace sql editor Ersetzen - + Toggle comment sql editor Kommentar umschalten - + Saved SQL contents to file: %1 SQL Inhalte in Datei speichern: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. Die Funktion Autovervollständigung kann nur genutzt werden, wenn eine gültige Datenbank für den SQL Editor gewählt wurde. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. Der Text im SQL Editor ist sehr groß, daher wurde die Syntaxkontrolle und die farbliche Hervorhebung von Objekten vorübergehend deaktiviert. - + Save to file In Datei speichern - + Could not open file '%1' for writing: %2 Die Datei '%1' kann nicht für Schreibzugriffe geöffnet werden: %2 - + SQL scripts (*.sql);;All files (*) SQL Skripte (*.sql);;Alle Dateien (*) - + Open file Datei öffnen - + Could not open file '%1' for reading: %2 Die Datei '%1' kann nicht für Lesezugriffe geöffnet werden: %2 - + Reached the end of document. Hit the find again to restart the search. Das Dokumentenende wurde erreicht. Drücken Sie 'Nächster Fund', um die Suche am Dokumentenanfang fortzusetzen. @@ -5288,24 +5737,24 @@ find next - - + + Cannot edit this cell. Details: %1 Die Zelle kann nicht editiert. Details: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. @@ -5313,8 +5762,8 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. Es kann nur eine Abfrage gleichzeitig ausgeführt werden. @@ -5327,12 +5776,12 @@ find next Es gibt ungespeicherte Änderungen. Möchten Sie wirklich fortfahren? Alle Änderungen werden dann verloren gehen. - + Cannot commit the data for a cell that refers to the already closed database. Es können keine Daten für eine Zelle gespeichert werden, die eine bereits geschlossene Datenbank referenziert. - + Could not begin transaction on the database. Details: %1 Es kann keine Transaktion auf der Datenbank gestartet werden. Details: %1 @@ -5341,12 +5790,12 @@ find next Fehler beim Committen der Transaktion: %1 - + An error occurred while rolling back the transaction: %1 Fehler beim Rollback der Transaktion: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Es wurde versucht eine nicht editierbare Zelle zu committen (derzeit modifiziert und auf das Commit wartend)! Dies ist ein Fehler den Sie melden sollten. @@ -5355,43 +5804,48 @@ find next Fehler beim Committen der Daten: %1 - + Uncommitted data - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + An error occurred while committing the transaction: %1 - + An error occurred while committing the data: %1 - - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + Error while executing SQL query on database '%1': %2 Fehler beim Ausführen der SQL-Abfrage auf der Datenbank '%1': %2 - + Error while loading query results: %1 Fehler beim Laden der Abfrageergebnisse: %1 - + Insert multiple rows Mehrere Zeilen einfügen - + Number of rows to insert: Anzahl an Zeilen zum Einfügen: @@ -5399,117 +5853,137 @@ find next SqlQueryView - + Go to referenced row in... - + Copy Kopieren - + Copy as... Kopieren als... - + Paste Einfügen - + Paste as... Einfügen als... - + Set NULL values NULL Wert setzen - + Erase values Werte löschen - + Edit value in editor Wert im Editor bearbeiten - + Commit Commit - + + Copy with headers + + + + Rollback Rollback - + Commit selected cells Gewählte Zellen speichern - + Rollback selected cells Gewählte Zellen wiederherstellen - + Define columns to sort by Sortierspalten definieren - + Remove custom sorting Benutzerdefinierte Sortierung entfernen - + Insert row Zeile einfügen - + Insert multiple rows Mehrere Zeilen einfügen - + Delete selected row Gewählte Zeile löschen - + + Show value in a viewer + + + + Generate query for selected cells - + No items selected to paste clipboard contents to. Es sind keine Elemente selektiert in die der Inhalt der Zwischenablage eingefügt werden könnte. - + Go to referenced row in table '%1' - + table '%1' - + Referenced row (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value Werte editieren @@ -5531,6 +6005,119 @@ find next Fehler beim Löschen der Zeile aus Tabelle %1: %2 + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + Datenbanken + + + + Register in all databases + In allen Datenbanken registrieren + + + + Register in following databases: + In den folgenden Datenbanken registrieren: + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + Alle Dateien (*) + + + + Open file + Datei öffnen + + StatusField @@ -5639,7 +6226,7 @@ but it's okay to use them anyway. Geben Sie einen Namen für die Bedingung ein. - + Foreign column table constraints @@ -5693,24 +6280,24 @@ but it's okay to use them anyway. Bei Konflikt - + Collate table constraints - + Sort order table constraints Sortierung - + Select at least one column. Mindestens eine Spalte auswählen. - + Enter a name of the constraint. Geben Sie einen Namen für die Bedingung ein. @@ -6269,7 +6856,7 @@ Are you sure you want to create a table with blank name? - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> @@ -6314,7 +6901,7 @@ Are you sure you want to create a table with blank name? - + DDL DDL @@ -6393,18 +6980,18 @@ Are you sure you want to create a table with blank name? - - + + Data - + Triggers Trigger - + DDL DDL @@ -6436,125 +7023,125 @@ Are you sure you want to create a table with blank name? - + Refresh the view view window - + Commit the view changes view window - + Rollback the view changes view window - + Explicit column names - + Generate output column names automatically basing on result columns of the view. - + Add column view window - + Edit column view window - + Delete column view window - + Move column up view window Spalte nach oben verschieben - + Move column down view window Spalte nach unten verschieben - + Refresh trigger list view window Trigger Liste aktualisieren - + Create new trigger view window Trigger erstellen - + Edit selected trigger view window Trigger editieren - + Delete selected trigger view window Trigger löschen - + View window "%1" has uncommitted structure modifications and data. - + View window "%1" has uncommitted data. - + View window "%1" has uncommitted structure modifications. - + Uncommitted changes - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Committed changes for view '%1' successfully. - + Committed changes for view '%1' (named before '%2') successfully. - + Could not load data for view %1. Error details: %2 @@ -6563,101 +7150,101 @@ Do you want to commit the structure, or do you want to go back to the structure Nicht gespeicherte Änderungen - + Go back to structure tab - + Commit modifications and browse data. - + Could not commit view changes. Error message: %1 view window - + Override columns - + Currently defined columns will be overriden. Do you want to continue? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. - + Name view window triggers Name - + Instead of view window triggers - + Condition view window triggers - + Details table window triggers Details - + Could not process the %1 view correctly. Unable to open a view window. - + Empty name - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. - + Following problems will take place while modifying the view. Would you like to proceed? view window - + View modification view window diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts index 2771e77..fc3f218 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts @@ -13,11 +13,6 @@ About - - - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - - Licenses @@ -58,6 +53,11 @@ Configuration directory + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + + Qt version: @@ -90,258 +90,15 @@ - BugDialog - - - Bugs and ideas - - - - - Reporter - - - - - E-mail address - - - - - - Log in - - - - - Short description - - - - - Detailed description - - - - - Show more details - - - - - SQLiteStudio version - - - - - Operating system - - - - - Loaded plugins - - - - - Send - - - - - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - - - - - A bug report sent successfully. - - - - - An error occurred while sending a bug report: %1 -%2 - - - - - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - - - - - An idea proposal sent successfully. - - - - - An error occurred while sending an idea proposal: %1 -%2 - - - - - A bug report - - - - - Describe problem in few words - - - - - Describe problem and how to reproduce it - - - - - A new feature idea - - - - - A title for your idea - - - - - Describe your idea in more details - - - - - Reporting as an unregistered user, using e-mail address. - - - - - Reporting as a registered user. - - - - - Log out - - - - - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - - - - - Enter vaild e-mail address, or log in. - - - - - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - - - - - Long description requires at least 30 characters. - - - - - BugReportHistoryWindow + BindParamsDialog - - - Title + + Query parameters - - - Reported at - - - - - - URL - - - - - Reports history - - - - - Clear reports history - - - - - Delete selected entry - - - - - Invalid response from server. - - - - - BugReportLoginDialog - - - Log in - - - - - Credentials - - - - - Login: - - - - - Password: - - - - - Validation - - - - - Validate - - - - - Validation result message - - - - - Abort - - - - - A login must be at least 2 characters long. - - - - - A password must be at least 5 characters long. - - - - - Valid + + Please provide values for query parameters @@ -353,12 +110,12 @@ - + Collation name: - + Implementation language: @@ -483,11 +240,16 @@ - Invalid default value expression: %1 + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. - + Enter a name of the constraint. @@ -599,7 +361,7 @@ - + Delete constraint column dialog @@ -659,34 +421,44 @@ - + Are you sure you want to delete constraint '%1'? column dialog - + Correct the constraint's configuration. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. - + Scale is not allowed for INTEGER PRIMARY KEY columns. - + Precision cannot be defined without the scale. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. @@ -787,12 +559,6 @@ but it's okay to use it. Enter a name of the constraint. - - - Autoincrement (only for %1 type columns) - column primary key - - ColumnUniqueAndNotNullPanel @@ -903,7 +669,7 @@ but it's okay to use it. ConfigDialog - + Configuration @@ -993,215 +759,215 @@ but it's okay to use it. - + Number of data rows per page: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> - + Limit initial data column width to (in pixels): - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> - + Show column and row details tooltip in data view - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> - + Inserting new row in data grid - + Before currently selected row - + After currently selected row - + At the end of data view - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> - + Place data tab as first tab in a Table Window - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> - + Place data tab as first tab in a View Window - + Data types - + Available editors: - + Editors selected for this data type: - + Schema editing - + Number of DDL changes kept in history. - + DDL history size: - + SQL queries - - + + Number of queries kept in the history. - + History size: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + Execute only the query under the cursor - + Updates - + Automatically check for updates at startup - + Session - + Restore last session (active MDI windows) after startup - + Status Field - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> - + Always open Status panel when new message is printed - + Filter shortcuts by name or key combination - + Action - + Key combination - - + + Language - + Changing language requires application restart to take effect. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout @@ -1277,350 +1043,372 @@ but it's okay to use it. - + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + + + Number of memorized table populating configurations + + + + Keep NULL value when entering empty value - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value - + Table windows - + Open Table Windows with the data tab for start - + View windows - + Open View Windows with the data tab for start - + Don't show DDL preview dialog when committing schema changes - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters + + + + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins - + Current style: - + Preview - + Enabled - + Disabled - + Active formatter plugin - + SQL editor font - + Database list font - + Database list additional label font - + Data view font - + Status field font - + SQL editor colors - + Current line background - + <p>SQL strings are enclosed with single quote characters.</p> - + String foreground - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - + Regular foreground - + Line numbers area background - + Keyword foreground - + Number foreground - + Comment foreground - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + Uncommitted data outline color - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> - + Commit error outline color - + NULL value foreground - + Deleted row background - + Database list colors - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground - + Status field colors - + Information message foreground - + Warning message foreground - + Error message foreground - + Description: plugin details - + Category: plugin details - + Version: plugin details - + Author: plugin details - + Internal name: plugin details - + Dependencies: plugin details - + Conflicts: plugin details - + Plugin details - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. - + %1 (built-in) plugins manager in configuration dialog - + Details - + No plugins in this category. - + Add new data type - + Rename selected data type - + Delete selected data type - + Help for configuring data type editors @@ -1772,137 +1560,153 @@ but it's okay to use it. DataView - + Filter data data view - + Grid view - + Form view - + Refresh table data data view - + First page data view - + Previous page data view - + Next page data view - + Last page data view - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view - + Commit changes for selected cells data view - + Rollback changes for selected cells data view - + Show grid view of results sql editor - + Show form view of results sql editor - + Filter by text data view - + Filter by the Regular Expression data view - + Filter by SQL expression data view - + Tabs on top data view - + Tabs at bottom data view - + Place new rows above selected row data view - + Place new rows below selected row data view - + Place new rows at the end of the data view data view - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Row: %1 @@ -2081,7 +1885,7 @@ Browsing other pages will be possible after the row counting is done. - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> @@ -2183,352 +1987,397 @@ Browsing other pages will be possible after the row counting is done. - + Copy - + Paste - + Select all - + Create a group - + Delete the group - + Rename the group - - Add a database + + Import - - Edit the database + + Export the table - - Remove the database + + Import into the table - - Connect to the database + + Populate table - - Disconnect from the database + + Create similar table - - Import + + Reset autoincrement sequence - - Export the database + + Add a column - - Convert database type + + Edit the column - - Vacuum + + Delete the column - - Integrity check + + Delete selected items - - Create a table + + Clear filter - - Edit the table + + + Erase table data - - Delete the table + + + Database - - Export the table + + Grouping - - Import into the table + + Generate query for table - - Populate table + + + Create group - - Create similar table + + Group name - - Reset autoincrement sequence + + Entry with name %1 already exists in group %2. - - Create an index + + Delete group - - Edit the index + + Are you sure you want to delete group %1? +All objects from this group will be moved to parent group. - - Delete the index + + Are you sure you want to remove database '%1' from the list? - - Create a trigger + + Are you sure you want to remove following databases from the list: +%1 - - Edit the trigger + + Remove database - - Delete the trigger + + Vacuum (%1) - - Create a view + + Autoincrement value for table '%1' has been reset successfully. - - Edit the view + + Are you sure you want to delete all data from table(s): %1? - - Delete the view + + + Cannot import, because no import plugin is loaded. - - Add a column + + Execution from file cancelled. Any queries executed so far have been rolled back. - - Edit the column + + &Add a database - - Delete the column + + &Edit the database - - Delete selected items + + &Remove the database - - Clear filter + + &Connect to the database - - Refresh all database schemas + + &Disconnect from the database - - Refresh selected database schema + + &Export the database - - - Erase table data + + Con&vert database type - - - Database + + Vac&uum - - Grouping + + &Integrity check - - Generate query for table + + Create a &table - - - Create group + + Edit the t&able - - Group name + + Delete the ta&ble - - Entry with name %1 already exists in group %2. + + Create an &index - - Delete group + + Edit the i&ndex - - Are you sure you want to delete group %1? -All objects from this group will be moved to parent group. + + Delete the in&dex - - Are you sure you want to remove database '%1' from the list? + + Create a trig&ger - - Are you sure you want to remove following databases from the list: -%1 + + Edit the trigg&er - - Remove database + + Delete the trigge&r - - Vacuum (%1) + + Create a &view - - Autoincrement value for table '%1' has been reset successfully. + + Edit the v&iew - - Are you sure you want to delete all data from table(s): %1? + + Delete the vi&ew - - - Cannot import, because no import plugin is loaded. + + &Refresh all database schemas + + + + + Re&fresh selected database schema - - + + Open file's directory + + + + + Execute SQL from file + + + + + Cannot export, because no export plugin is loaded. - + Integrity check (%1) - + Reset autoincrement - + Are you sure you want to reset autoincrement value for table '%1'? - + An error occurred while trying to reset autoincrement value for table '%1': %2 - + An error occurred while trying to delete data from table '%1': %2 - + All data has been deleted for table '%1'. - + Following objects will be deleted: %1. - + Following databases will be removed from list: %1. - + Remainig objects from deleted group will be moved in place where the group used to be. - + %1<br><br>Are you sure you want to continue? - + Delete objects + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + DbTreeItemDelegate @@ -2614,74 +2463,74 @@ All objects from this group will be moved to parent group. - + Copy - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + Could not add dropped database file '%1' automatically. Manual setup is necessary. - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2735,130 +2584,136 @@ Please enter new, unique name, or press '%1' to abort the operation: - + History - + Results in the separate tab - + Results below the query - - + + SQL editor %1 - + Results - + Execute query - + Explain query - + Clear execution history sql editor - + Export results sql editor - + Create view from query sql editor - + Previous database - + Next database - + Show next tab sql editor - + Show previous tab sql editor - + Focus results below sql editor - + Focus SQL editor above sql editor - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 - + Query finished in %1 second(s). - + Clear execution history - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. - + Cannot export, because no export plugin is loaded. - + No database selected in the SQL editor. Cannot create a view for unknown database. - + Editor window "%1" has uncommitted data. @@ -2881,6 +2736,64 @@ Please enter new, unique name, or press '%1' to abort the operation: + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + ExportDialog @@ -3030,68 +2943,101 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - - - + + + Select database to export. - + Select table to export. - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. + + FileExecErrorsDialog + + + Execution errors + + + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + FontEdit @@ -3112,49 +3058,49 @@ Please enter new, unique name, or press '%1' to abort the operation: FormView - + Commit row form view - + Rollback row form view - + First row form view - + Previous row form view - + Next row form view - + Last row form view - + Insert new row form view - + Delete current row form view @@ -3213,13 +3159,13 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Function implementation code: - + Final step implementation code: @@ -3383,42 +3329,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3457,12 +3403,12 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Collation - + Sort @@ -3641,273 +3587,278 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Configuration widgets - + Syntax highlighting engines - + Data editors - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. - + Running in debug mode. Debug messages are printed to the standard output. - + You need to restart application to make the language change take effect. - - Open SQL editor + + Next window - - Open DDL history + + Previous window - - Open SQL functions editor + + Hide status field - - Open collations editor + + Open Debug Console - - Import + + Open CSS Console - - Export + + Bugs and feature &requests - - Open configuration dialog + + Window list + menubar view menu - - Tile windows + + Open SQL &editor - - Tile windows horizontally + + Open DDL &history - - Tile windows vertically + + Open SQL &functions editor - - Cascade windows + + Open &collations editor - - Next window + + Open ex&tension manager - - Previous window + + &Import - - Hide status field + + E&xport - - Close selected window + + Open confi&guration dialog - - Close all windows but selected + + &Tile windows - - Close all windows + + Tile windows &horizontally - - Restore recently closed window + + Tile windows &vertically - - Rename selected window + + &Cascade windows - - Open Debug Console + + Close selected &window - - Open CSS Console + + Close all windows &but selected - - Report a bug + + Close &all windows - - Propose a new feature + + Re&store recently closed window - - About + + &Rename selected window - - Licenses + + Report a &bug + + + + + Propose a new &feature - - Open home page + + &About - - Open forum page + + &Licenses - - User Manual + + Open home &page - - SQLite documentation + + Open fo&rum page - - Report history + + User &Manual - - Check for updates + + SQLite &documentation - - Database - menubar + + Check for &updates - - Structure + + &Database menubar - - View + + &Structure menubar - - Window list - menubar view menu + + &View + menubar - - Tools + + &Tools menubar - - Help + + &Help - + Could not set style: %1 main window - + Cannot export, because no export plugin is loaded. - + Cannot import, because no import plugin is loaded. - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -3939,64 +3890,69 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Configure editors for this data type - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. - + Deleted multieditor - + Read only multieditor - MultiEditorBool + MultiEditorBoolPlugin - + Boolean - MultiEditorDate + MultiEditorDatePlugin - + Date - MultiEditorDateTime + MultiEditorDateTimePlugin - + Date & time - MultiEditorHex + MultiEditorHexPlugin - + Hex - MultiEditorNumeric + MultiEditorNumericPlugin - + Number numeric multi editor tab name @@ -4005,50 +3961,53 @@ Please enter new, unique name, or press '%1' to abort the operation: MultiEditorText - - Text - - - - + Tab changes focus - + Cut - + Copy - + Paste - + Delete - - Undo + + Undo + + + + + Redo + + + MultiEditorTextPlugin - - Redo + + Text - MultiEditorTime + MultiEditorTimePlugin - + Time @@ -4125,37 +4084,32 @@ Please enter new, unique name, or press '%1' to abort the operation: - - Current version + + This application will be closed and the update installer will start to download and install all the updates. - + Update version - + Check for updates on startup - + Update to new version! - - The update will be automatically downloaded and installed. This will also restart application at the end. - - - - + Not now. - + Don't install the update and close this window. @@ -4207,32 +4161,32 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Abort - + Configure - + Populating configuration for this column is invalid or incomplete. - + Select database with table to populate - + Select table to populate - + You have to select at least one column. @@ -4307,129 +4261,134 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Data grid view - + Copy cell(s) contents to clipboard - Paste cell(s) contents from clipboard + Copy cell(s) contents together with header to clipboard + Paste cell(s) contents from clipboard + + + + Set empty value to selected cell(s) - + Set NULL value to selected cell(s) - + Commit changes to cell(s) contents - + Rollback changes to cell(s) contents - + Delete selected data row - + Insert new data row - + Open contents of selected cell in a separate editor - + Total pages available: %1 - + Total rows loaded: %1 - + Data view (both grid and form) - + Refresh data - + Switch to grid view of the data - + Switch to form view of the data - + Database list - + Delete selected item - + Clear filter contents - + Refresh schema - + Refresh all schemas - + Add database - + Select all items - + Copy selected item(s) - + - + Paste from clipboard @@ -4504,42 +4463,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Main window - + Open SQL editor - + Previous window - + Next window - + Hide status area - + Open configuration dialog - + Open Debug Console - + Open CSS Console @@ -4550,111 +4509,111 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text - + Copy selected text - + Delete selected text - + Undo - + Redo - + SQL editor input field - + Select whole editor contents - + Save contents into a file - + Load contents from a file - + Find in text - + Find next - + Find previous - + Replace in text - + Delete current line - + Request code assistant - + Format contents - + Move selected block of text one line down - + Move selected block of text one line up - + Copy selected block of text and paste it a line below - + Copy selected block of text and paste it a line above - + Toggle comment @@ -4674,16 +4633,6 @@ Please enter new, unique name, or press '%1' to abort the operation:Database file - - - Reports history window - - - - - Delete selected entry - - SQL editor window @@ -4729,6 +4678,11 @@ Please enter new, unique name, or press '%1' to abort the operation:Move keyboard input focus to the SQL editor above + + + Delete selected SQL history entries + + Table window @@ -4947,179 +4901,179 @@ find next SqlEditor - + Cut sql editor - + Copy sql editor - + Paste sql editor - + Delete sql editor - + Select all sql editor - + Undo sql editor - + Redo sql editor - + Complete sql editor - + Format SQL sql editor - + Save SQL to file sql editor - + Select file to save SQL sql editor - + Load SQL from file sql editor - + Delete line sql editor - + Move block down sql editor - + Move block up sql editor - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor - + Find next sql editor - + Find previous sql editor - + Replace sql editor - + Toggle comment sql editor - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file - + Could not open file '%1' for writing: %2 - + SQL scripts (*.sql);;All files (*) - + Open file - + Could not open file '%1' for reading: %2 - + Reached the end of document. Hit the find again to restart the search. @@ -5167,24 +5121,24 @@ find next - - + + Cannot edit this cell. Details: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. @@ -5192,69 +5146,74 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + Uncommitted data - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + An error occurred while committing the transaction: %1 - + An error occurred while committing the data: %1 - - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows - + Number of rows to insert: @@ -5262,117 +5221,137 @@ find next SqlQueryView - + Go to referenced row in... - + Copy - + Copy as... - + Paste - + Paste as... - + Set NULL values - + Erase values - + Edit value in editor - + Commit - + + Copy with headers + + + + Rollback - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row - + Insert multiple rows - + Delete selected row - + + Show value in a viewer + + + + Generate query for selected cells - + No items selected to paste clipboard contents to. - + Go to referenced row in table '%1' - + table '%1' - + Referenced row (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value @@ -5390,6 +5369,119 @@ find next + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + + + + + Open file + + + StatusField @@ -5498,7 +5590,7 @@ but it's okay to use them anyway. - + Foreign column table constraints @@ -5552,24 +5644,24 @@ but it's okay to use them anyway. - + Collate table constraints - + Sort order table constraints - + Select at least one column. - + Enter a name of the constraint. @@ -6120,7 +6212,7 @@ Are you sure you want to create a table with blank name? - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> @@ -6165,7 +6257,7 @@ Are you sure you want to create a table with blank name? - + DDL @@ -6243,18 +6335,18 @@ Are you sure you want to create a table with blank name? - - + + Data - + Triggers - + DDL @@ -6286,224 +6378,224 @@ Are you sure you want to create a table with blank name? - + Refresh the view view window - + Commit the view changes view window - + Rollback the view changes view window - + Explicit column names - + Generate output column names automatically basing on result columns of the view. - + Add column view window - + Edit column view window - + Delete column view window - + Move column up view window - + Move column down view window - + Refresh trigger list view window - + Create new trigger view window - + Edit selected trigger view window - + Delete selected trigger view window - + View window "%1" has uncommitted structure modifications and data. - + View window "%1" has uncommitted data. - + View window "%1" has uncommitted structure modifications. - + Uncommitted changes - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Committed changes for view '%1' successfully. - + Committed changes for view '%1' (named before '%2') successfully. - + Could not load data for view %1. Error details: %2 - + Go back to structure tab - + Commit modifications and browse data. - + Could not commit view changes. Error message: %1 view window - + Override columns - + Currently defined columns will be overriden. Do you want to continue? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. - + Name view window triggers - + Instead of view window triggers - + Condition view window triggers - + Details table window triggers - + Could not process the %1 view correctly. Unable to open a view window. - + Empty name - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. - + Following problems will take place while modifying the view. Would you like to proceed? view window - + View modification view window diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm index 71a632e..0f02e29 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts index 8a46630..aec2cac 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts @@ -6,7 +6,7 @@ About SQLiteStudio and licenses - À propos de SQLiteStudio et ses licences + À propos de SQLiteStudio et des licences @@ -14,9 +14,13 @@ À propos de… - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Libre, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Auteur et maintenance:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Libre, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Auteur et maintenance:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + @@ -51,7 +55,7 @@ SQLite 3 version: - + Version de SQLite 3 : SQLite 3 version : @@ -70,7 +74,7 @@ Portable distribution. - Version portable + Version portable. @@ -80,7 +84,7 @@ Operating system managed distribution. - Operating system managed distribution + Distribution gérée par le système d'exploitation. @@ -93,261 +97,221 @@ <h3>Table des matières : </h3><ol>%2</ol> + + BindParamsDialog + + + Query parameters + + + + + Please provide values for query parameters + + + BugDialog - Bugs and ideas - Bugs et idées + Bugs et idées - Reporter - Rapport + Rapport - E-mail address - Adresse électronique + Adresse électronique - - Log in - S’identifier + S’identifier - Short description - Description brève + Description brève - Detailed description - Description détaillée + Description détaillée - Show more details - Montrer plus de détails + Montrer plus de détails - SQLiteStudio version - Version SQLiteStudio + Version de SQLiteStudio - Operating system - Système d’exploitation + Système d’exploitation - Loaded plugins - Plugins chargés + Plugins chargés - Send - Envoyez + Envoyer - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - Vous pouvez voir tous bugs et idées que vous avez rapportées en sélectionnant le menu « %1 » puis « %2 ». + Vous pouvez voir tous bugs et idées que vous avez rapportées en sélectionnant le menu « %1 » puis « %2 ». - A bug report sent successfully. - Rapport de bogue envoyé avec succès + Rapport de bogue envoyé avec succès - An error occurred while sending a bug report: %1 %2 - Une erreur est survenue lors de l’envoi du rapport de bogue : %1 + Une erreur est survenue lors de l’envoi du rapport de bogue : %1 %2 - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - Vous pouvez réexpédier. Le contenu sera restoré lorsque vous ouvrirez le dialogue du rapport après une telle erreur. + Vous pouvez essayer à nouveau. Le contenu sera restauré lorsque vous ouvrirez le dialogue du rapport après une telle erreur. - An idea proposal sent successfully. - L’idée proposée à été envoyée avec succès. + L’idée proposée à été envoyée avec succès. - An error occurred while sending an idea proposal: %1 %2 - Une erreeur est survenu lors de l’envoi de l’idée proposée : %1 %2 + Une erreeur est survenu lors de l’envoi de l’idée proposée : %1 %2 - A bug report - Rapport de bug + Rapport de bug - Describe problem in few words - Décrivez le problème en queques mots + Décrivez le problème en queques mots - Describe problem and how to reproduce it - Décriver le problem et comment le reproduire + Décrivez le problème et comment le reproduire - A new feature idea - Une nouvelle idée de fonctionalité + Une nouvelle idée de fonctionalité - A title for your idea - Un titre pour votre idée + Un titre pour votre idée - Describe your idea in more details - Décrivez votre idée avec plus de détails + Décrivez votre idée avec plus de détails - Reporting as an unregistered user, using e-mail address. - Rapport comme nouvel utilisateur, avec une adresse mail. + Envoyer le rapport comme nouvel utilisateur, avec une adresse mail. - Reporting as a registered user. - Rapport comme utilisateur enregistré. + Envoyer le rapport comme utilisateur enregistré. - Log out - Déconnexion + Déconnexion - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - En fournissant un mail existant il sera possible de vous contacterau sujet du rapport. Pour en savoir plus, clic sur le bouton « help » sur le coté droit. + En fournissant un mail existant il sera possible de vous contacter au sujet du rapport. Pour en savoir plus, clic sur le bouton « help » sur le coté droit. - Enter vaild e-mail address, or log in. - Entrez un email valide ou connectez-vous. + Entrez un email valide ou connectez-vous. - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - Une description courte nécessite au moins 10 caractères, mais pas plus de 100. La longueur de la description ne peut être contenue dans ce champ. + Une description courte nécessite au moins 10 caractères, mais pas plus de 100. La longueur de la description ne peut être contenue dans ce champ. - Long description requires at least 30 characters. - Une descption longue require au moins 30 caractères. + Une descption longue requiert au moins 30 caractères. BugReportHistoryWindow - - Title - Titre + Titre - - Reported at - Reporté à + Rapport envoyé à - - URL - URL + URL - Reports history - Historique de rapports + Historique de rapports - Clear reports history - Vider l’historique de rapports + Vider l’historique des rapports - Delete selected entry - Supprimer l’entrée sélectionnée + Supprimer l’entrée sélectionnée - Invalid response from server. - Réponse invalide du serveur. + Réponse invalide du serveur. BugReportLoginDialog - Log in - Connexion + Connexion - Credentials - Certifications + Identités - Login: - Identification : + Identification : - Password: - Mot de passe : + Mot de passe : - Validation - Validation + Validation - Validate - Valider + Valider - Validation result message - Message de validation + Message de validation - Abort - Abandonner + Abandonner - A login must be at least 2 characters long. - Un identifiant dois avoir au moins 2 caractères. + Un identifiant doit avoir au moins 2 caractères. - A password must be at least 5 characters long. - Un mot de passe doit avoir au moins 5 caractères. + Un mot de passe doit avoir au moins 5 caractères. - Valid - Valide + Valide @@ -355,15 +319,15 @@ Filter collations - Filtre de regroupements + Filtre de collation - + Collation name: - Nom de regroupements : + Nom de collation : - + Implementation language: Language d’implémentation : @@ -375,7 +339,7 @@ Register in all databases - Inscrire daans toutes les bases de données + Inscrire dans toutes les bases de données @@ -385,61 +349,57 @@ Implementation code: - Code d’inplémentation : + Code d’implémentation : Collations editor - Éditeur de regroupement + Éditeur de collation Commit all collation changes - Enregistrer les motifications de regroupement + Enregistrer les motifications de collation Rollback all collation changes - Annuler toutes les modifications de regroupement + Annuler toutes les modifications de collation Create new collation - Création de regroupement + Création de collation Delete selected collation - Supprimer le regroupement sélectionné + Supprimer la collation sélectionnée Editing collations manual - Modification manuelle de regroupement + Manuel pour l'édition de collations Enter a non-empty, unique name of the collation. - Saississez un nom unique, non vide, de regroupement. + Saisissez un nom unique, non vide, de regroupement. Pick the implementation language. - Prendre le language d’inplémentation. + Choisir le language d’implémentation. Enter a non-empty implementation code. - Saississez un nom, non vide, de language d’implémentation. + Saisissez un nom, non vide, de language d’implémentation. Collations editor window has uncommitted modifications. - - - - Collations editor window has uncommited modifications. - L’éditeur de regroupement n’as pas enregistré les modifications. + L’éditeur de collations a des modifications non enregistrées. @@ -447,7 +407,7 @@ Pick a color - Coisir une couleur + Choisir une couleur @@ -455,12 +415,12 @@ Collation name: - Nom de la jointure : + Nom de la collation : Named constraint: - Constante nommée : + Contrainte nommée : @@ -470,7 +430,7 @@ Enter a collation name. - Saisir le nom de la jointure. + Saisir le nom de la collation. @@ -488,17 +448,26 @@ Enter a default value expression. - Saississez l’expression d’une valeur par défaut. + Saisissez l’expression d’une valeur par défaut. + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. + + + Invalid default value expression: %1 - Invalide expression d’une valeur par défaut : %1 + Expression invalide pour une valeur par défaut : %1 - + Enter a name of the constraint. - Saississez un nom de contrainte. + Saisir un nom de contrainte. @@ -567,7 +536,7 @@ Collate - Jointure + Collation @@ -577,7 +546,7 @@ Check condition - Vérifiez la contition + Vérifier la condition @@ -608,7 +577,7 @@ - + Delete constraint column dialog Supprimer la contrainte @@ -641,13 +610,13 @@ Add an unique constraint column dialog - Ajouter une contrainte unique + Ajouter une contrainte d'unicité Add a check constraint column dialog - Ajouter un contrôle de la contrainte + Ajouter une contrainte de contrôle @@ -668,35 +637,45 @@ Ajouter une contrainte par défaut - + Are you sure you want to delete constraint '%1'? column dialog Êtes-vous sûr de vouloir supprimer la contrainte « %1 » ? - + Correct the constraint's configuration. Corrigez la configuration de la contrainte. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. Cette contrainte n’est pas supportée officiellement par SQLite 2, mais c’est OK pour l’utiliser. - + Scale is not allowed for INTEGER PRIMARY KEY columns. - + Precision cannot be defined without the scale. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. @@ -719,7 +698,7 @@ mais c’est OK pour l’utiliser. Details column dialog constraints - Details + Détails @@ -757,17 +736,17 @@ mais c’est OK pour l’utiliser. Pick the foreign table. - Sélectionner une table étrangère. + Sélectionner la table étrangère. Pick the foreign column. - Séléctionner une colonne étrangère. + Sélectionner la colonne étrangère. Enter a name of the constraint. - Saississez un nom de contraite. + Saisir un nom de contraite. @@ -790,18 +769,17 @@ mais c’est OK pour l’utiliser. On conflict: - Sur conflit : + En cas de conflit : Enter a name of the constraint. - Saississez le nom d’une contrainte. + Saisissez le nom d’une contrainte. - Autoincrement (only for %1 type columns) column primary key - Auto-incrémentation (seulement pour %1 colonne type) + Auto-incrémentation (seulement pour %1 colonne type) @@ -814,12 +792,12 @@ mais c’est OK pour l’utiliser. On conflict: - Sur conflit : + En cas de conflit : Enter a name of the constraint. - Saississez un nom de contrainte. + Saisissez un nom de contrainte. @@ -852,7 +830,7 @@ mais c’est OK pour l’utiliser. View: %1 completer statusbar - Vue %1 + Vue : %1 @@ -894,13 +872,13 @@ mais c’est OK pour l’utiliser. Binary data completer statusbar - Données binaire + Données binaires Collation: %1 completer statusbar - Regroupement : %1 + Collation : %1 @@ -913,7 +891,7 @@ mais c’est OK pour l’utiliser. ConfigDialog - + Configuration Configuration @@ -935,7 +913,7 @@ mais c’est OK pour l’utiliser. Look & feel - Aspet + Apparence @@ -960,17 +938,17 @@ mais c’est OK pour l’utiliser. Code formatters - Formatage code + Formateurs de code Data browsing - Navigation données + Navigation de données Data editors - Éditeur de données + Éditeurs de données @@ -978,201 +956,193 @@ mais c’est OK pour l’utiliser. Navigateur et éditeur de données - + Number of data rows per page: Nombre de lignes de données par page : - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> <p>Lorsque les données sont lues dans le tableau, la largeur est automatiquement ajustée. Cette valeur limite la largeur initiale pour l’ajustement, mais l’utilisateur peut recadrer les colonnes manuellement au-dessus de cette limite.</p> - + Limit initial data column width to (in pixels): Limite initiale de la largeur de la colonne de données (en pixel) : - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value - + Inserting new row in data grid - + Insertion d'une nouvelle ligne dans la grille de données - + Before currently selected row - + Avant la ligne courante - + After currently selected row - + Après la ligne courante - + At the end of data view - + À la fin de la vue de données - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> - + Place data tab as first tab in a Table Window - + Placer l'onglet Données en premier dans les fenêtres de tables - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> - + Data types Types de données - + Available editors: Éditeurs disponibles : - + Editors selected for this data type: Éditeur sélectionné pour ce type de données : - + Schema editing Edition de schéma - + Number of DDL changes kept in history. Nombre de DDL modifiés gardés dans l’historique. - + DDL history size: Dimension de l’historique DDL : - Don't show DDL preview dialog when commiting schema changes - Ne pas montrer la présualisation DDL pendant l’enregistrement du schéma modifié - - - + SQL queries Requêtes SQL - - + + Number of queries kept in the history. Nombre de requêtes gardées dans l’historique. - + History size: Dimension de l’historique : - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>S’il y a plus d’une requête dans l’éditeur SQL, alors (si cette option est permise) seulement une seule requête sera exécutée -cellesous le curseur d’insertion. Autrement toutes les requêtes seront exécutées. Vous pouvez limiter le nombre de requêtes devant être exécutées en sélectionnant ces requêtes avant leur exécution.</p> - + Execute only the query under the cursor Exécuter seulement la requête sous le curseur - + Updates Mises à jour - + Automatically check for updates at startup Contrôle automatique des mises à jour au lancement - + Session Session - + Restore last session (active MDI windows) after startup Restaurer la dernière session (Fenêtre MDI active) après lancement - + Filter shortcuts by name or key combination Filtre par nom raccourci ou combinaison de touches - + Action Action - + Key combination Combinaison de touches - - + + Language Langage - + Changing language requires application restart to take effect. - Le changement de langage requiére le redemarrage de l’application pour prendre effet. + Le changement de langage requiert le redémarrage de l’application pour prendre effet. - + Compact layout Présentation compacte - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout Utiliser la présentation compacte - - General.CompactLayout - Général.PrésentationCompacte - @@ -1192,7 +1162,7 @@ mais c’est OK pour l’utiliser. Expand tables node when connected to a database - Déployez le noeud des tables lors de la connexion de la base de données + Développer le nœud des tables lors de la connexion de la base de données @@ -1202,7 +1172,7 @@ mais c’est OK pour l’utiliser. Display additional labels on the list - Afficher des labels supplémentaires à la liste + Afficher des labels supplémentaires dans la liste @@ -1227,12 +1197,12 @@ mais c’est OK pour l’utiliser. Expand views node when connected to a database - Etendre le noeud des vues lorsque la base de données est connectée + Développer le nœud des vues lorsque la base de données est connectée If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) - Si cette option est déactivée, les objets seront triés pour qu’ ils apparaissent dans la table sqlite_master (dans l’ordre de création) + Si cette option est désactivée, les objets seront triés pour qu’ ils apparaissent dans la table sqlite_master (dans l’ordre de création) @@ -1270,395 +1240,397 @@ mais c’est OK pour l’utiliser. - + Keep NULL value when entering empty value - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> - - Show column and row details tooltip in data view + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> - - Table windows - Fenêtre de ta table + + Number of memorized table populating configurations + + + + + Show column and row details tooltip in data view + - When enabled, Table Windows will show up with the data tab, instead of the structure tab. - Lorsque c’est permis, la fenêtre des tables sera affichée avec l’onglet des données, à la place de l’onglet structure. + + Table windows + Fenêtres de tables - + Open Table Windows with the data tab for start - Ourerture la fenêtre de table avec l’onglet des données au départ + Sélectionner l'onglet de données lors de l'ouverture d'une fenêtre de table - + View windows Fenêtre de vue - When enabled, View Windows will show up with the data tab, instead of the structure tab. - Lorsque c’est permis, la fenêtre des vues sera affichée avec l’onglet des données, à la place de l’onglet structure. - - - + Open View Windows with the data tab for start - Ourerture la fenêtre de vue avec l’onglet des données au départ + Sélectionner l'onglet de données lors de l'ouverture d'une fenêtre de vue - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> - + Place data tab as first tab in a View Window - + Don't show DDL preview dialog when committing schema changes - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters + + + + Status Field - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> - + Always open Status panel when new message is printed - + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins Cacher des plugins incorporés - + Current style: Style actuel : - + Preview Aperçu - + Enabled En service - + Disabled Hors service - + Active formatter plugin Plugin de formattage actif - + SQL editor font Police de caractères de l’éditeur SQL - + Database list font Liste des polices de caractères de base de données - + Database list additional label font Police de caractères additionelle de la liste des bases de données - + Data view font Police de caractères des données de vue - + Status field font Police de caractères du champ d’état - + SQL editor colors Couleurs de l’éditeur SQL - + Current line background - Fond actuel de la ligne + Arrière plan pour la ligne courante - + <p>SQL strings are enclosed with single quote characters.</p> <p>Les chaines SQL sont encadrées avec de caractères simple quote.</p> - + String foreground Avant plan chaine - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> <p>Les paramètres fournis par l’utilisateur sont passés par valeur. Ils ont l’une de ces formes : </p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - Premier plan de paramètre de lien + Premier plan pour les paramètres de lien - + Highlighted parenthesis background Parenthèses surlignées - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> <p>les valeurs BLOB sont binaire représentés comme nombres hexadécimaux, comme : </p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - Premier plan de valeur BLOB + Premier plan pour les valeurs BLOB - + Regular foreground - Avant plan courant + Avant plan par défaut - + Line numbers area background - Zone des numéros de ligne en arrière plan + Arrière plan pour la zone des numéros de ligne - + Keyword foreground - Mot-clef en avant plan + Premier plan pour les mots-cléfs - + Number foreground - Nombre en avant plan + Premier plan pour les nombres - + Comment foreground - Commentaire en avant plan + Premier plan pour les commentaires - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> <p>Les objets valides sont les nom de tables, index, déclencheurs, ou vues qui existent dans la base de données SQLite.</p> - + Valid objects foreground - Objets valides en avant plan + Premier plan pour les objets valides - + Data view colors Couleurs de vue de données - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + Uncommitted data outline color - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> - <p>Any data changes will be outlined with this color, until they're commited to the database.</p> - <p>Toutes les modifications de données seront écrits avec cette couleur, à l’enregistrement de la base de données.</p> - - - Uncommited data outline color - Annulation de la couleur des données - - - <p>In case of error while commiting data changes, the problematic cell will be outlined with this color.</p> - <p>En cas de l’erreur à l’enregistrement des modifications de données, la cellule problématique sera indiquée avec cette couleur.</p> - - - + Commit error outline color - Erreur d’enregistrement du surlignage + Surlignage pour les erreurs de commit - + NULL value foreground - Valeur NULL au premier plan + Premier plan pour la valeur NULL - + Deleted row background - Ligne supprimée en arrier plan + Arrière-plan pour une ligne supprimée - + Database list colors - Liste de couleurs des bases de données + Couleurs pour la liste des bases de données - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> <p>Des labels supplémentaires indique la version SQLITE, le nombre d’objets au nievau inférieur, etc.</p> - + Additional labels foreground - Labels additionels en avant plan + Premier plan pour les labels additionnels - + Status field colors Couleurs du champ d’état - + Information message foreground - Message d’information devant + Premier plan pour les messages d’information - + Warning message foreground - Warning devant + Premier plan pour les avertissements - + Error message foreground - Message d’erreur devant + Premier plan pour les erreurs - + Description: plugin details Description : - + Category: plugin details - Catégories : + Catégorie : - + Version: plugin details Version : - + Author: plugin details Auteur : - + Internal name: plugin details Nom interne : - + Dependencies: plugin details Dépendances : - + Conflicts: plugin details - Conflicts : + Conflits : - + Plugin details - Détails plugins + Détails du plugin - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. Les plugins sont chargés/déchargés immédiatement avec vérifié/non vérifié, mais les modifications de la liste de plugins à charger au lancement ne sont pas enregistrées avant l’enregistrement de la configuration entière. - + %1 (built-in) plugins manager in configuration dialog %1 (intégré) - + Details Détails - + No plugins in this category. Pas de plugins dans cette catégorie. - + Add new data type Ajouter un nouveau type de données - + Rename selected data type Renommer le type de données sélectionné - + Delete selected data type - Supprimez le type de données sélectionnées + Supprimer le type de données sélectionnées - + Help for configuring data type editors Aide à la configuration des éditeurs de type de données @@ -1810,137 +1782,153 @@ mais c’est OK pour l’utiliser. DataView - + Filter data data view Filtre de données - + Grid view Table - + Form view Formulaire - + Refresh table data data view Actualiser les données de la table - + First page data view Première page - + Previous page data view Page précédente - + Next page data view Page suivante - + Last page data view Dernière page - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view Appliquer le filtre - + Commit changes for selected cells data view Enregistrer les modifications des cellules sélectionnées - + Rollback changes for selected cells data view Annuler les modifications des celulles sélectionnées - + Show grid view of results sql editor Affichage des résultats en tableau - + Show form view of results sql editor Affichage des résultat en formulaire - + Filter by text data view Filtrer par texte - + Filter by the Regular Expression data view Filtrer par une expression standard - + Filter by SQL expression data view Filtrer par une expression SQL - + Tabs on top data view Onglets en haut - + Tabs at bottom data view Onglet en bas - + Place new rows above selected row data view - + Place new rows below selected row data view - + Place new rows at the end of the data view data view - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Le total des lignes en cours de comptage. La navigation d’autres pages à la fin du comptage. - + Row: %1 Lignes : %1 @@ -2060,10 +2048,6 @@ Browsing other pages will be possible after the row counting is done. Database driver Pilote de base de données - - Generate automatically - Générer automatiquement - Options @@ -2079,14 +2063,6 @@ Browsing other pages will be possible after the row counting is done. Test connection Tester la connexion - - Name - Nom - - - Type - Type - Browse for database file on local computer Navigation de la base de données en local @@ -2107,24 +2083,12 @@ Browsing other pages will be possible after the row counting is done. Name (on the list) Nom (dans la liste) - - Generate name basing on file path - Génération du nom basé sur le chemin du fichier - - - Permanent - Permanent - <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd <p>Autorisez-ceci si vous voulez que la base de données soit stockée dans le fichier de configuration et restauré chaque fois SQLiteStudio est lancé.</p> - - Test database connection - Test de connexion - Browse for existing database file on local computer @@ -2147,7 +2111,7 @@ Browsing other pages will be possible after the row counting is done. - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> @@ -2165,14 +2129,6 @@ Browsing other pages will be possible after the row counting is done. Select a database type. - - The name will be auto-generated - Le non sera généré automatiquement - - - Type the name - Saississez le nom - DbObjectDialogs @@ -2257,373 +2213,490 @@ Browsing other pages will be possible after the row counting is done. Filtre par nom - + Copy Copier - + Paste Coller - + Select all Tout sélectionner - + Create a group Créer un groupe - + Delete the group Supprimer le groupe - + Rename the group Renommer le groupe - Add a database - Attacher une base de données + Attacher une base de données - Edit the database - Modifier la base de données + Modifier la base de données - Remove the database - Déatcher la base de données + Déatcher la base de données - Connect to the database - Connecter une base de données + Connecter une base de données - Disconnect from the database - Déconnecter la base de données + Déconnecter la base de données - + Import Importer - Export the database - Exporter la base de données + Exporter la base de données - Convert database type - Type de base de données à convertir + Convertir le format de base de données - Vacuum - Vaccum + Vaccum - Integrity check - Contrôle d’intégrité + Contrôler l’intégrité - Create a table - Créer une table + Créer une table - Edit the table - Modifier la table + Modifier la table - Delete the table - Supprimer la table + Supprimer la table - + Export the table Exporter la table - + Import into the table Importer dans la table - + Populate table Peupler une table - + Create similar table Créer une table identique - + Reset autoincrement sequence Réinitialise l’auto-incrémentation - Create an index - Créer un index + Créer un index - Edit the index - Modifier l’index + Modifier l’index - Delete the index - Supprimer l’index + Supprimer l’index - Create a trigger - Créer un déclencheur + Créer un déclencheur - Edit the trigger - Modifier le déclencheur + Modifier le déclencheur - Delete the trigger - Supprimer le déclencheur + Supprimer le déclencheur - Create a view - Créer une vue + Créer une vue - Edit the view - Modier la vue + Modier la vue - Delete the view - Supprimer la vue + Supprimer la vue - + Add a column Ajouter une colonne - + Edit the column Modifier la colonne - + Delete the column Supprimer la colonne - + Delete selected items Supprimer les objets sélectionnés - + Clear filter Vider le filtre - Refresh all database schemas - Actualiser tous les schémas de la base de données + Actualiser tous les schémas de base de données - Refresh selected database schema - Actualiser les schémas sélectionné de la base de données + Actualiser le schéma de base de données sélectionné - - + + Erase table data - - + + Database Base de données - + Grouping Groupement - + Generate query for table - - + + Create group Créer un groupe - + Group name Nom du groupe - + Entry with name %1 already exists in group %2. L’entrée nommée %1 existe déjà dans le groupe %2. - + Delete group Supprimer le groupe - + Are you sure you want to delete group %1? All objects from this group will be moved to parent group. Êtes-vous certain de supprimer le groupe %1 ? Tous les objets de ce groupe seront déplacés dans le groupe parent. - + Are you sure you want to remove database '%1' from the list? - + Are you sure you want to remove following databases from the list: %1 - + Remove database - + Vacuum (%1) - + Autoincrement value for table '%1' has been reset successfully. - + Are you sure you want to delete all data from table(s): %1? - Delete database - Suppression de la base de données + + + Cannot import, because no import plugin is loaded. + Import impossible, car aucun plugin d’import n’est chargé. - Are you sure you want to delete database '%1'? - Êtes-vous certain de vouloir supprimer la base de données : « %1 » ? + + Execution from file cancelled. Any queries executed so far have been rolled back. + - - - Cannot import, because no import plugin is loaded. - Import impossible, car aucun plugin d’import n’est chargé. + + &Add a database + - - - Cannot export, because no export plugin is loaded. - Export impossible, car aucun plugin d’import n’est chargé. + + &Edit the database + + + + + &Remove the database + + + + + &Connect to the database + + + + + &Disconnect from the database + + + + + &Export the database + + + + + Con&vert database type + + + + + Vac&uum + + + + + &Integrity check + + + + + Create a &table + + + + + Edit the t&able + + + + + Delete the ta&ble + + + + + Create an &index + + + + + Edit the i&ndex + + + + + Delete the in&dex + + + + + Create a trig&ger + + + + + Edit the trigg&er + + + + + Delete the trigge&r + + + + + Create a &view + + + + + Edit the v&iew + - Error while executing VACUUM on the database %1: %2 - Erreur pendant l’exécution de VACCUM sur la base de données %1 : %2 + + Delete the vi&ew + + + + + &Refresh all database schemas + + + + + Re&fresh selected database schema + + + + + Open file's directory + + + + + Execute SQL from file + - VACUUM execution finished successfully. - Exécution de VACCUM terminé avec succès. + + + Cannot export, because no export plugin is loaded. + Export impossible, car aucun plugin d’import n’est chargé. - + Integrity check (%1) Contrôle d’intégrité (%1) - + Reset autoincrement Remise à zéro de l’auto-incrément - + Are you sure you want to reset autoincrement value for table '%1'? Êtes-vous certain de vouloir réinitialiser l’auto-incrémentation de la table « %1 » ? - + An error occurred while trying to reset autoincrement value for table '%1': %2 Une erreur est survenue pendant la réinitialisation de la valeur de l’auto-incrémentation de la table « %1 » : %2 - Autoincrement value for table '%1' has been reset successfly. - La valeur de l’auto-incrémentation de la table %1 a été réinitialisé avec succès. - - - + An error occurred while trying to delete data from table '%1': %2 - + All data has been deleted for table '%1'. - + Following objects will be deleted: %1. Les objets suivant vont être supprimés : %1. - + Following databases will be removed from list: %1. Les bases de données suivantes seront enlevées de la liste : %1. - + Remainig objects from deleted group will be moved in place where the group used to be. Les objets restants du groupe supprimé seront déplacés où le groupe a eu l’habitude d’être. - + %1<br><br>Are you sure you want to continue? %1<br><br>Êtes-vous certain de vouloir continuer ? - + Delete objects Objets supprimés + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + Impossible d’ouvrir en lecture le fichier « %1 » : %2 + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + DbTreeItemDelegate @@ -2678,11 +2751,6 @@ Tous les objets de ce groupe seront déplacés dans le groupe parent.dbtree tooltip Codage : - - Error details: - dbtree tooltip - Détails de l’erreur : - Error: @@ -2714,76 +2782,76 @@ Tous les objets de ce groupe seront déplacés dans le groupe parent.Déclencheurs (%1) : - + Copy Copier - + Move Déplacer - + Include data Données incluses - + Include indexes Index inclus - + Include triggers Déclencheurs inclus - + Abort Abandonner - + Could not add dropped database file '%1' automatically. Manual setup is necessary. - + Referenced tables Tables référencées - + Do you want to include following referenced tables as well: %1 Vous voulez inclure des tables référencées suivantes aussi : %1 - + Name conflict Conflit de nom - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: L’objet suivant existe déjà dans la base de données cible. Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’opération : - + SQL statements conversion Conversion des déclarations SQL - + Following error occurred while converting SQL statements to the target SQLite version: L’erreur suivante est survenue en convertissant des déclarations de SQL de la version cible SQLite : - + Would you like to ignore those errors and proceed? Voulez-vous ignorer ces erreurs et procéder ? @@ -2839,137 +2907,139 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Requête - + History Historique - + Results in the separate tab Résultats dans un onglet séparé - + Results below the query Résultats après la requête - - + + SQL editor %1 Éditeur SQL %1 - + Results Résultats - + Execute query Exécuter la requête - + Explain query Explication de la requête - + Clear execution history sql editor Vider l’historique d’exécution - + Export results sql editor Exporter résultats - + Create view from query sql editor Créer une vue à partir d’une requête - + Previous database Base de données précédente - + Next database Base de données suivante - + Show next tab sql editor Afficher l’onglet suivant - + Show previous tab sql editor Afficher l’onget précédent - + Focus results below sql editor - + Focus SQL editor above sql editor Focus sur l’éditeur SQL ci-dessus - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) Base de données active (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 Requête terminée en %1 secondes. Nombre de lignes : %2 - + Query finished in %1 second(s). Requête terminée en %1 seconde(s). - + Clear execution history Supprimer l’historique d’exécution - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. Êtes vous certain de vouloir supprimer la totalité de l’historique d’exécution SQL ? Aucun retour possible. - + Cannot export, because no export plugin is loaded. Impossible d’exporter, car aucun plugin d’expertation n’est chargés. - + No database selected in the SQL editor. Cannot create a view for unknown database. Aucune base de données den sélectionnée dans l’éditeur SQL. Impossible de créer une vue sur une base de données inconnue. - + Editor window "%1" has uncommitted data. - - Editor window "%1" has uncommited data. - Fenêtre d’éditeur "%1" n’a pas enregistrer les données. - ErrorsConfirmDialog @@ -2989,6 +3059,64 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Désirez-vous traiter ? + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + Options + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + Scripts SQL (*.sql);;Tous les fichiers (*) + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + ExportDialog @@ -3138,68 +3266,101 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Exporter options de format - + Cancel Annuler - - - + + + Select database to export. Sélecctionnez la base de données à exporter. - + Select table to export. Sélectionnez la table à exporter. - + Enter valid query to export. Saississez une requête valide à exporter. - + Select at least one object to export. Sélectionnez au moins un objet à exporter. - + You must provide a file name to export to. Vous devez fournir le nom d’un fichier à exporter. - + Path you provided is an existing directory. You cannot overwrite it. Le chemin fourni est un répertoire existant. Vous ne pouvez pas l’écraser. - + The directory '%1' does not exist. Le répertoire « %1 » n’existe pas. - + The file '%1' exists and will be overwritten. Le fichier « %1 » existe et sera écrasé. - + All files (*) Tous les fichiers(*) - + Pick file to export to Sélectionnez un fichier à exporter - + Internal error during export. This is a bug. Please report it. Erreur interne pendant l’exportation. c’est un bug. SVP veuillez le reporter. + + FileExecErrorsDialog + + + Execution errors + + + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + Erreur + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + FontEdit @@ -3220,49 +3381,49 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ FormView - + Commit row form view Enregistrer ligne - + Rollback row form view Annuler ligne - + First row form view Première ligne - + Previous row form view Ligne précédente - + Next row form view Ligne suivante - + Last row form view Dernière ligne - + Insert new row form view Insérer une nouvelle ligne - + Delete current row form view Supprimer la ligne courante @@ -3321,13 +3482,13 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Code d’initialisation : - + Function implementation code: Fonction de code d’implémentation : - + Final step implementation code: Etape finale de code d’implémentaion : @@ -3427,10 +3588,6 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Functions editor window has uncommitted modifications. - - Functions editor window has uncommited modifications. - L’éditeur de fonction n’a pas enregistré les modifications. - ImportDialog @@ -3495,42 +3652,42 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Optrions de source de données - + Cancel Annuler - + If you type table name that doesn't exist, it will be created. Si vous saississez un nom de table inexistant, celle-ci sera créée. - + Enter the table name Saississez un nom de table - + Select import plugin. Sélectionnez un plugin d’importation. - + You must provide a file to import from. Vous devez fournir un fichier à importer. - + The file '%1' does not exist. Le fichier « %1 » n’existe pas. - + Path you provided is a directory. A regular file is required. Le chemin indiqué est un répertoire. Un fichier est requis. - + Pick file to import from Sélectionnez le fichier d’importation @@ -3569,12 +3726,12 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Colonne - + Collation Regroupement - + Sort Tri @@ -3754,283 +3911,412 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Barre d’outils de fenêtrage - + Configuration widgets Configuration widgets - + Syntax highlighting engines Syntaxe surlignée des moteurs - + Data editors Éditeurs de données - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. Passage en mode débogue. Cliquez %1 ou utilisez l’entrée du menu « l’Aide / Ouvrir la console de débogage ». - + Running in debug mode. Debug messages are printed to the standard output. Passage en mode débogue. Les messages de débogage sont imprimés dans la sortie standard. - + You need to restart application to make the language change take effect. Vous devez relancer l’application pour que le langage prenne effet. - Open SQL editor - Ouvrir l’éditeur SQL + Ouvrir l’éditeur SQL - Open DDL history - Ouvrir l’historique DDL + Ouvrir l’historique DDL - Open SQL functions editor - Éditeur de fonctions SQL + Éditeur de fonctions SQL - Open collations editor - Ouvrir l’éditeur de collections + Ouvrir l’éditeur de collections - Import - Importer + Importer - Export - Exporter + Exporter - Open configuration dialog - Préférences + Préférences - Tile windows - Organisation des fenêtres en grille + Organisation des fenêtres en grille - Tile windows horizontally - Organisation horizontale des fenêtres + Organisation horizontale des fenêtres - Tile windows vertically - Organisation verticale des fenêtres + Organisation verticale des fenêtres - Cascade windows - Organisation des fenêtres en cascade + Organisation des fenêtres en cascade - + Next window Fenêtre suivante - + Previous window Fenêtre précédante - + Hide status field Cacher le champ d’état - Close selected window - Fermer la fenêtre sélectionnée + Fermer la fenêtre sélectionnée - Close all windows but selected - Fermer toutes les fenêtres sélectionnées + Fermer toutes les fenêtres sélectionnées - Close all windows - Fermer toutes les fenêtres + Fermer toutes les fenêtres - Restore recently closed window - Restaurer la dernière fenêtre fermée + Restaurer la dernière fenêtre fermée - Rename selected window - Renommer la fenêtre sélectionnée + Renommer la fenêtre sélectionnée - + Open Debug Console Ouvrir la console de debogage - + Open CSS Console Ouvrir la console CSS - Report a bug - Rapporter un bogue + Rapporter un bogue - Propose a new feature - Proposer une fonctionnalité + Proposer une fonctionnalité - About - À propos de… + À propos de… - Licenses - Licences + Licences - Open home page - Page d’accueil web + Site web de l’application - Open forum page - Forum d’aide + Forum d’aide - User Manual - Manuel utilisateurs en ligne + Manuel utilisateur en ligne - SQLite documentation - Documentation en ligne de SQLite + Documentation en ligne de SQLite - Report history - Historique + Historique - Check for updates - Vérifier les mises à jour + Vérifier les mises à jour - Database menubar - Base de données + Base de données - Structure menubar - Structure + Structure - View menubar - Vue + Vue - + Window list menubar view menu Liste des fenêtres - Tools menubar - Outils + Outils - Help - Aide + Aide + + + + Open SQL &editor + + + + + Open DDL &history + + + + + Open SQL &functions editor + + + + + Open &collations editor + + + + + Open ex&tension manager + + + + + &Import + + + + + E&xport + + + + + Open confi&guration dialog + + + + + &Tile windows + + + + + Tile windows &horizontally + + + + + Tile windows &vertically + + + + + &Cascade windows + + + + + Close selected &window + + + + + Close all windows &but selected + + + + + Close &all windows + + + + + Re&store recently closed window + + + + + &Rename selected window + - + + Report a &bug + + + + + Propose a new &feature + + + + + &About + + + + + &Licenses + + + + + Open home &page + + + + + Open fo&rum page + + + + + User &Manual + + + + + SQLite &documentation + + + + + Bugs and feature &requests + + + + + Check for &updates + + + + + &Database + menubar + + + + + &Structure + menubar + + + + + &View + menubar + + + + + &Tools + menubar + + + + + &Help + + + + Could not set style: %1 main window Impossible de positionner le style : %1 - + Cannot export, because no export plugin is loaded. Exportation impossible, aucun plugin d’exportation n’est chargé. - + Cannot import, because no import plugin is loaded. Importation impossible, aucun plugin d’importation n’est chargé. - + Rename window Renommer la fenêtre - + Enter new name for the window: Saississez un nouveau nom de fenêtre : - + New updates are available. <a href="%1">Click here for details</a>. Une nouvelle mise à jour est disponible. <a href="%1"> cliquez ici pour détails</a>. - + You're running the most recent version. No updates are available. Vous utilisez la dernière version. Aucune mise à jour de disponible. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 La base de données passée en paramètre dans la ligne de commande (%1)a été temporaire ajoutée à la liste sous le nom : %2 - + Could not add database %1 to list. Impossible d’ajouter la base de données %1 à la liste. MdiWindow - - Uncommited changes - Modification non enregistrées - Uncommitted changes @@ -4056,23 +4342,28 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Valeur NULL - + Configure editors for this data type Configurer l’éditeur pour ce type de données - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. Plugin d"éditeur de données « %1 » non chargé, ausii il n’ai pas défini pour le type de données « %1 ». - + Deleted multieditor Suppression - + Read only multieditor Lecture seule @@ -4081,93 +4372,143 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ MultiEditorBool - Boolean - booleen + booleen + + + + MultiEditorBoolPlugin + + + Boolean + booleen MultiEditorDate - Date - Date + Date + + + + MultiEditorDatePlugin + + + Date + Date MultiEditorDateTime - Date & time - date & heure + date & heure + + + + MultiEditorDateTimePlugin + + + Date & time + date & heure MultiEditorHex - Hex - Hex + Hex + + + + MultiEditorHexPlugin + + + Hex + Hex MultiEditorNumeric - Number numeric multi editor tab name - Nombre + Nombre + + + + MultiEditorNumericPlugin + + + Number + numeric multi editor tab name + Nombre MultiEditorText - Text - Texte + Texte - + Tab changes focus Tab modifie le focus - + Cut Couper - + Copy Copier - + Paste Coller - + Delete Supprimer - + Undo Annuler - + Redo Rétablir + + MultiEditorTextPlugin + + + Text + Texte + + MultiEditorTime - Time - Heure + Heure + + + + MultiEditorTimePlugin + + + Time + Heure @@ -4242,37 +4583,40 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Composant - + + This application will be closed and the update installer will start to download and install all the updates. + + + Current version - Version courante + Version courante - + Update version Version de mise à jour - + Check for updates on startup Contrôle de nouvelles version au lancement - + Update to new version! Mettre à jour la nouvelle version ! - The update will be automatically downloaded and installed. This will also restart application at the end. - La mise à jour sera automatiquement téléchargée et installée. Un redémarrage de l’application sera aussi effectué à la fin. + La mise à jour sera automatiquement téléchargée et installée. Un redémarrage de l’application sera aussi effectué à la fin. - + Not now. Paas maintenant. - + Don't install the update and close this window. Ne pas installer la mise à jour maintenant et fermer cette fenêtre. @@ -4324,32 +4668,32 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Peupler - + Abort Abandonner - + Configure Configurer - + Populating configuration for this column is invalid or incomplete. La configuration du peuplement pour cette colonne est invalide ou incomplète. - + Select database with table to populate Sélectionner la base de données avec la table à peupler - + Select table to populate Sélectionner la table à peupler - + You have to select at least one column. Vous devez sélectionner au moins une colonne. @@ -4424,129 +4768,134 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Nom de collation : %1 - + Data grid view Vue de tableau de données - + Copy cell(s) contents to clipboard Copie le contenu de cellule(s) dans le presse-papier + Copy cell(s) contents together with header to clipboard + + + + Paste cell(s) contents from clipboard Colle - + Set empty value to selected cell(s) Efface le contenu de cellule(s) - + Set NULL value to selected cell(s) Met à NULL les cellules séléctionnées - + Commit changes to cell(s) contents Enregistre les modifications de cellule(s) - + Rollback changes to cell(s) contents Annule les modifications de cellule(s) - + Delete selected data row Supprime les données de la ligne sélectionnée - + Insert new data row Insére une nouvelle ligne de données - + Open contents of selected cell in a separate editor Contenu ouvert de cellule choisie dans un éditeur séparé - + Total pages available: %1 Nombre de pages disponibles : %1 - + Total rows loaded: %1 Nombre de lignes chargées : %1 - + Data view (both grid and form) Vue des données (tableau et formulaire) - + Refresh data Actualisation des données - + Switch to grid view of the data Basculer sur la vue des données en table - + Switch to form view of the data Basculer sur la vue des données en formulaire - + Database list Liste de bases de données - + Delete selected item Suppression de l’item sélectionné - + Clear filter contents Effacer le contenu du filtre - + Refresh schema Actualiser le schéma - + Refresh all schemas Actualiser tous les schémas - + Add database Ajouter une base de données - + Select all items Séléctionner tous les éléments - + Copy selected item(s) Copie d’item(s) sélectionné(s) - + - + Paste from clipboard Collé dans le presse-papier @@ -4621,42 +4970,42 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Supprimer la ligne courante - + Main window Fenêtre principale - + Open SQL editor Ouvrir l’éditeur SQL - + Previous window Fenêtre précédente - + Next window Fenêtre suivante - + Hide status area Cacher la barre d’état - + Open configuration dialog Préférences - + Open Debug Console Ouvrir la console de débogage - + Open CSS Console Ouvrir la console CSS @@ -4667,111 +5016,111 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ - + Cut selected text Couper le texte sélectionné - + Copy selected text Copie du texte sélectionné - + Delete selected text Suppression du texte sélectionné - + Undo Annuler - + Redo Rétablir - + SQL editor input field Éditeur SQL saisie de champ - + Select whole editor contents Sélectionnez le contenu entier de l’éditeur - + Save contents into a file Sauver le contenu dans un fichier - + Load contents from a file Charger le contenu d’un fichier - + Find in text Rechercher un texte - + Find next Occurence suivante - + Find previous Occurence précédente - + Replace in text Remplacer dans le texte - + Delete current line Supprimer la ligne courante - + Request code assistant Assistant de code nécessaire - + Format contents Format de contenu - + Move selected block of text one line down Déplacer le bloc de texte sélectionné à la ligne inférieure - + Move selected block of text one line up Déplacer le bloc de texte sélectionné à la ligne supérieure - + Copy selected block of text and paste it a line below Copier le bloc de texte sélectionné à la ligne au-dessus - + Copy selected block of text and paste it a line above Copier le bloc de texte sélectionné à la ligne au-dessous - + Toggle comment @@ -4792,14 +5141,12 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Fichier base de données - Reports history window - Fenêtre d’historique + Fenêtre d’historique - Delete selected entry - Effacer l’entrée sélectionnée + Effacer l’entrée sélectionnée @@ -4846,6 +5193,11 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ Move keyboard input focus to the SQL editor above Déplacement au-dessous du focus des résultats de vue par les touches + + + Delete selected SQL history entries + + Table window @@ -4964,10 +5316,6 @@ Entrez SVP un nouveau nom, unique, ou cliquez « %1 » pour d’interrompre l’ QuitConfirmDialog - - Uncommited changes - modifications non enregistrées - Uncommitted changes @@ -5069,179 +5417,179 @@ recherche suivant SqlEditor - + Cut sql editor Couper - + Copy sql editor Copier - + Paste sql editor Coller - + Delete sql editor Supprimer - + Select all sql editor Tout sélectionner - + Undo sql editor Annuler - + Redo sql editor Rétablir - + Complete sql editor Complet - + Format SQL sql editor Format SQL - + Save SQL to file sql editor Enregistrer le SQL - + Select file to save SQL sql editor - + Load SQL from file sql editor Charger le SQL - + Delete line sql editor Ligne suppimée - + Move block down sql editor Descendre le bloc - + Move block up sql editor Monter le bloc - + Copy block down sql editor Copier bloc au-dessus - + Copy up down sql editor Copier bloc au-dessous - + Find sql editor Chercher - + Find next sql editor Chercher suivant - + Find previous sql editor Chercher précédent - + Replace sql editor Remplacer - + Toggle comment sql editor - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. L’achèvement de syntaxe peut être utilisé seulement quand une base de données valable est utilisée dans l’éditeur SQL. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. Le contenu l’éditeur SQL est important, aussi la détectiond’objets en erreur est temporairement mise hors de service. - + Save to file Sauvegarder - + Could not open file '%1' for writing: %2 Impossible d’ouvrir en écriture le fichier « %1 » : %2 - + SQL scripts (*.sql);;All files (*) Scripts SQL (*.sql);;Tous les fichiers (*) - + Open file Fichier ouvert - + Could not open file '%1' for reading: %2 Impossible d’ouvrir en lecture le fichier « %1 » : %2 - + Reached the end of document. Hit the find again to restart the search. Fin de document atteint. Saississez de nouveau la recherche pour relancer la recherche. @@ -5272,10 +5620,6 @@ recherche suivant data view tooltip Contrainte : - - This cell is not editable, because: %1 - Cette cellule n’est pas modifiable : %1 - Cannot load the data for a cell that refers to the already closed database. @@ -5284,10 +5628,6 @@ recherche suivant SqlQueryItemDelegate - - Cannot edit this cell. Details: %2 - Impossible de modifier cette cellule. Détails : %2 - The row is marked for deletion. @@ -5297,24 +5637,24 @@ recherche suivant - - + + Cannot edit this cell. Details: %1 Impossible de modifier cette cellule. Détails : %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. @@ -5322,81 +5662,74 @@ recherche suivant SqlQueryModel - - + + Only one query can be executed simultaneously. Uniquement une seule requête peut être exécutée à la fois. - Uncommited data - Données non enregistrées - - - + Cannot commit the data for a cell that refers to the already closed database. Impossible d’enregistrer les données pour la celle qui référe à une base de données déjà fermée. - + Could not begin transaction on the database. Details: %1 Impossible de lancer la transaction sur la base de données. Détails : %1 - An error occurred while commiting the transaction: %1 - Une erreur est survenuelors de l’enregistrement de la transaction : %1 - - - + An error occurred while rolling back the transaction: %1 Une erreur est survenuelors de l’annulation de la transaction : %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Tentative d’enregistrement d’une une cellule qui n’est pas modifiable ! Ceci est un bogue. Rapportez-le SVP. - An error occurred while commiting the data: %1 - Une erreur est survenuelors de l’enregistrement des données : %1 - - - + Uncommitted data - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + An error occurred while committing the transaction: %1 - + An error occurred while committing the data: %1 - - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + Error while executing SQL query on database '%1': %2 Erreur pendant l’exécution de la requête sur la base de données « %1 » : %2 - + Error while loading query results: %1 Erreur lors du chargement des résultats de la requête : %1 - + Insert multiple rows Insérer plusieurs lignes - + Number of rows to insert: Nombre de lignes à inserer : @@ -5404,127 +5737,143 @@ recherche suivant SqlQueryView - + Go to referenced row in... - + Copy Copier - + Copy as... Copier comme… - + Paste Coller - + Paste as... Coller comme… - + Set NULL values Valeurs NULL positionnées - + Erase values valeurs écrasées - + Edit value in editor Valeur modifiée par l’éditeur - + Commit Enregistrer - + + Copy with headers + + + + Rollback Annuler - + Commit selected cells Enregistrer les cellules sélectionnées - + Rollback selected cells Annuler les modifications des cellules sélectionnées - + Define columns to sort by Définit les colonnes triées par - + Remove custom sorting Enléve le tri personnalisé - + Insert row Insérer une ligne - + Insert multiple rows Insérer plusieurs lignes - + Delete selected row Supprimer les lignes sélectionnées - + + Show value in a viewer + + + + Generate query for selected cells - + No items selected to paste clipboard contents to. - + Go to referenced row in table '%1' - + table '%1' - + Referenced row (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value Modifier la valeur SqlTableModel - - Error while commiting new row: %1 - Erreur à l’enregistrement d’une nouvelle ligne : %1 - Error while committing new row: %1 @@ -5536,6 +5885,119 @@ recherche suivant Erreur à la suppression d’une ligne de la table %1 : %2 + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + Tous les fichiers(*) + + + + Open file + Fichier ouvert + + StatusField @@ -5644,7 +6106,7 @@ but it's okay to use them anyway. Saisissez un nom de contrainte. - + Foreign column table constraints Colonne étrangère @@ -5698,24 +6160,24 @@ but it's okay to use them anyway. Sur conflit - + Collate table constraints Collationne - + Sort order table constraints Ordre de tri - + Select at least one column. Sélectionnez au moins une colonne. - + Enter a name of the constraint. Saisissez le nom de la contrainte. @@ -6090,14 +6552,6 @@ Do you want to commit the structure, or do you want to go back to the structure Table window "%1" has uncommitted structure modifications. - - Could not restore window, because database %1 could not be resolved. - Impossible de restaurer la fenêtre, car la base de données %1 ne peut ëtre résolue. - - - Could not restore window, because the table %1 doesn't exist in the database %2. - Impossible de restaurer la fenêtre, car la vue %1 n’existe pas dans la base de données %2.. - @@ -6125,10 +6579,6 @@ Do you want to commit the structure, or do you want to go back to the structure An error occurred while trying to reset autoincrement value for table '%1': %2 Une erreur est survenue pendant la réinitialisation de la valeur de l’auto-incrémentation de la table « %1 » : %2 - - Autoincrement value for table '%1' has been reset successfly. - La valeur de l’auto-incrémentaion de la table %1 a été réinitialisé avec succès. - Empty name @@ -6178,16 +6628,6 @@ Are you sure you want to create a table with blank name? Cannot import, because no import plugin is loaded. Import impossible, car aucun plugin d’import n’est chargé. - - Uncommited changes - Modification non enregistrées - - - There are uncommited structure modifications. You cannot browse or edit data until you have table structure settled. -Do you want to commit the structure, or do you want to go back to the structure tab? - Il ya des modifications de structure non enregistrées. Vous ne pouvez pas naviguer ou modifier des données jusqu’à ce que vous ailliez installer la structure de table. -Voulez-vous enregistrer la structure, ou voulez-vous retourner à l’onglet de structure ? - Go back to structure tab @@ -6246,18 +6686,6 @@ Voulez-vous enregistrer la structure, ou voulez-vous retourner à l’onglet de table window triggers Details - - Table window "%1" has uncommited structure modifications and data. - La fenêtre de table "%1" n’a pas enregistré les modifications de structure et de données. - - - Table window "%1" has uncommited data. - La fenêtre de table "%1" n’a pas enregistrer les données. - - - Table window "%1" has uncommited structure modifications. - La fenêtre de table "%1" n’a pas enregistré les modifications de structure. - TriggerColumnsDialog @@ -6302,7 +6730,7 @@ Voulez-vous enregistrer la structure, ou voulez-vous retourner à l’onglet de - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> <p> La condition SQL sera évaluée avant le code du déclencheur réel. Dans le cas où le retour de condition est faux, le déclencheur ne sera pas utilisé pour cette ligne.</p > @@ -6347,7 +6775,7 @@ Voulez-vous enregistrer la structure, ou voulez-vous retourner à l’onglet de Déclaration du déclencheur devant être exécutée. - + DDL DDL @@ -6425,33 +6853,21 @@ Voulez-vous enregistrer la structure, ou voulez-vous retourner à l’onglet de - - + + Data Données - + Triggers Déclencheur - + DDL DDL - - Could not restore window, because database %1 could not be resolved. - Impossible de restaurer la fenêtre, car la base de données %1 ne peut ëtre résolue. - - - Could not restore window, because database %1 could not be open. - Impossible de restaurer la fenêtre, car la base de données %1 ne peut ëtre ouverte. - - - Could not restore window, because the view %1 doesn't exist in the database %2. - Impossible de restaurer la fenêtre, car la vue %1 n’existe pas dans la base de données %2.. - @@ -6480,246 +6896,219 @@ Voulez-vous enregistrer la structure, ou voulez-vous retourner à l’onglet de Nouvelle vue %1 - + Refresh the view view window Actualisation de la vue - + Commit the view changes view window Enregistrement des changements dans la vue - + Rollback the view changes view window Annulation des changements dans la vue - + Explicit column names - + Generate output column names automatically basing on result columns of the view. - + Add column view window Ajouter une colonne - + Edit column view window Modifier une colonne - + Delete column view window Supprimer une colonne - + Move column up view window - + Move column down view window - + Refresh trigger list view window Actualisation de la liste des déclencheurs - + Create new trigger view window Création d’un nouveau déclencheur - + Edit selected trigger view window Modification du déclencheur sélectionné - + Delete selected trigger view window Suppression du déclencheur sélectionné - + View window "%1" has uncommitted structure modifications and data. - + View window "%1" has uncommitted data. - + View window "%1" has uncommitted structure modifications. - + Uncommitted changes - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Committed changes for view '%1' successfully. - + Committed changes for view '%1' (named before '%2') successfully. - View window "%1" has uncommited structure modifications and data. - La fenêtre de la vue "%1" n’a pas enregistré les modifications de structure et de données. - - - View window "%1" has uncommited data. - La fenêtre de la vue "%1" n’a pas enregistré les modifications de données. - - - View window "%1" has uncommited structure modifications. - La fenêtre de la vue "%1" n’a pas enregistré les modifications de structure. - - - + Could not load data for view %1. Error details: %2 Impossible de charher les données de vue %1. Détails d’ erreur : %2 - Uncommited changes - Modifications non enregistrées - - - There are uncommited structure modifications. You cannot browse or edit data until you have the view structure settled. -Do you want to commit the structure, or do you want to go back to the structure tab? - Des modifications de structure n’ont pa été enregistrées. - Vous ne pouvez pas naviguer ou éditer des données jusqu’à ce que vous installliez la structure de vue. -Voulez-vous enregistrer la structure, ou voulez-vous retourner à l’onglet de structure ? - - - + Go back to structure tab Retour à l’onlet de structure - + Commit modifications and browse data. Enregistrement des modifications et navigation des données. - + Could not commit view changes. Error message: %1 view window Impossible d’enregistrer les modifications de vue. Message d’erreur : %1 - + Override columns - + Currently defined columns will be overriden. Do you want to continue? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. - + Name view window triggers Nom - + Instead of view window triggers À la place de - + Condition view window triggers Condition - + Details table window triggers Détails - + Could not process the %1 view correctly. Unable to open a view window. Impossible de lancer correctement la vue %1. Impossible d’ouvrir la fenêtre de vue. - + Empty name Nom absent - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? Un nom vide pour la vue dans SQLITE est admis, mais on ne le recommande pas. Êtes-vous sûrs que vous voulez créer une vue avec le nom vide ? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 La déclaration SELECT ne peut être analysé. Veuillez corriger la requête et réessayer. Details : %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! La vue ne peut être modifiée a cause d’une erreur interne de SQLiteStudio. SVP repportez l’erreur ! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. - The view code could not be parsed properly for execution. This is a SQLiteStudio’s bug. Please report it. - La vue ne peut être correctement analysée avant exécution. Cest un bug SQLiteStudio. Veuillez le signaler. - - - + Following problems will take place while modifying the view. Would you like to proceed? view window @@ -6727,7 +7116,7 @@ Would you like to proceed? Veulez-vous continuer ? - + View modification view window Fenêtre vue diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts index aaac2b6..e1651a8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_it.ts @@ -15,7 +15,7 @@ - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> @@ -90,258 +90,15 @@ - BugDialog + BindParamsDialog - - Bugs and ideas + + Query parameters - - Reporter - - - - - E-mail address - - - - - - Log in - - - - - Short description - - - - - Detailed description - - - - - Show more details - - - - - SQLiteStudio version - - - - - Operating system - - - - - Loaded plugins - - - - - Send - - - - - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - - - - - A bug report sent successfully. - - - - - An error occurred while sending a bug report: %1 -%2 - - - - - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - - - - - An idea proposal sent successfully. - - - - - An error occurred while sending an idea proposal: %1 -%2 - - - - - A bug report - - - - - Describe problem in few words - - - - - Describe problem and how to reproduce it - - - - - A new feature idea - - - - - A title for your idea - - - - - Describe your idea in more details - - - - - Reporting as an unregistered user, using e-mail address. - - - - - Reporting as a registered user. - - - - - Log out - - - - - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - - - - - Enter vaild e-mail address, or log in. - - - - - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - - - - - Long description requires at least 30 characters. - - - - - BugReportHistoryWindow - - - - Title - - - - - - Reported at - - - - - - URL - - - - - Reports history - - - - - Clear reports history - - - - - Delete selected entry - - - - - Invalid response from server. - - - - - BugReportLoginDialog - - - Log in - - - - - Credentials - - - - - Login: - - - - - Password: - - - - - Validation - - - - - Validate - - - - - Validation result message - - - - - Abort - - - - - A login must be at least 2 characters long. - - - - - A password must be at least 5 characters long. - - - - - Valid + + Please provide values for query parameters @@ -373,12 +130,12 @@ - + Collation name: - + Implementation language: @@ -483,11 +240,16 @@ - Invalid default value expression: %1 + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. - + Enter a name of the constraint. @@ -599,7 +361,7 @@ - + Delete constraint column dialog @@ -659,34 +421,44 @@ - + Are you sure you want to delete constraint '%1'? column dialog - + Correct the constraint's configuration. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. - + Scale is not allowed for INTEGER PRIMARY KEY columns. - + Precision cannot be defined without the scale. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. @@ -787,12 +559,6 @@ but it's okay to use it. Enter a name of the constraint. - - - Autoincrement (only for %1 type columns) - column primary key - - ColumnUniqueAndNotNullPanel @@ -903,7 +669,7 @@ but it's okay to use it. ConfigDialog - + Configuration @@ -993,215 +759,215 @@ but it's okay to use it. - + Number of data rows per page: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> - + Limit initial data column width to (in pixels): - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> - + Show column and row details tooltip in data view - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> - + Inserting new row in data grid - + Before currently selected row - + After currently selected row - + At the end of data view - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> - + Place data tab as first tab in a Table Window - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> - + Place data tab as first tab in a View Window - + Data types - + Available editors: - + Editors selected for this data type: - + Schema editing - + Number of DDL changes kept in history. - + DDL history size: - + SQL queries - - + + Number of queries kept in the history. - + History size: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + Execute only the query under the cursor - + Updates - + Automatically check for updates at startup - + Session - + Restore last session (active MDI windows) after startup - + Status Field - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> - + Always open Status panel when new message is printed - + Filter shortcuts by name or key combination - + Action - + Key combination - - + + Language - + Changing language requires application restart to take effect. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout @@ -1277,350 +1043,372 @@ but it's okay to use it. - + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + + + Number of memorized table populating configurations + + + + Keep NULL value when entering empty value - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value - + Table windows - + Open Table Windows with the data tab for start - + View windows - + Open View Windows with the data tab for start - + Don't show DDL preview dialog when committing schema changes - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters + + + + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins - + Current style: - + Preview - + Enabled - + Disabled - + Active formatter plugin - + SQL editor font - + Database list font - + Database list additional label font - + Data view font - + Status field font - + SQL editor colors - + Current line background - + <p>SQL strings are enclosed with single quote characters.</p> - + String foreground - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - + Regular foreground - + Line numbers area background - + Keyword foreground - + Number foreground - + Comment foreground - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + Uncommitted data outline color - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> - + Commit error outline color - + NULL value foreground - + Deleted row background - + Database list colors - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground - + Status field colors - + Information message foreground - + Warning message foreground - + Error message foreground - + Description: plugin details - + Category: plugin details - + Version: plugin details - + Author: plugin details - + Internal name: plugin details - + Dependencies: plugin details - + Conflicts: plugin details - + Plugin details - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. - + %1 (built-in) plugins manager in configuration dialog - + Details - + No plugins in this category. - + Add new data type - + Rename selected data type - + Delete selected data type - + Help for configuring data type editors @@ -1772,137 +1560,153 @@ but it's okay to use it. DataView - + Filter data data view - + Grid view - + Form view - + Refresh table data data view - + First page data view - + Previous page data view - + Next page data view - + Last page data view - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view - + Commit changes for selected cells data view - + Rollback changes for selected cells data view - + Show grid view of results sql editor - + Show form view of results sql editor - + Filter by text data view - + Filter by the Regular Expression data view - + Filter by SQL expression data view - + Tabs on top data view - + Tabs at bottom data view - + Place new rows above selected row data view - + Place new rows below selected row data view - + Place new rows at the end of the data view data view - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Row: %1 @@ -2081,7 +1885,7 @@ Browsing other pages will be possible after the row counting is done. - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> @@ -2183,352 +1987,397 @@ Browsing other pages will be possible after the row counting is done. - + Copy - + Paste - + Select all - + Create a group - + Delete the group - + Rename the group - - Add a database + + Import - - Edit the database + + Export the table - - Remove the database + + Import into the table - - Connect to the database + + Populate table - - Disconnect from the database + + Create similar table - - Import + + Reset autoincrement sequence - - Export the database + + Add a column - - Convert database type + + Edit the column - - Vacuum + + Delete the column - - Integrity check + + Delete selected items - - Create a table + + Clear filter - - Edit the table + + + Erase table data - - Delete the table + + + Database - - Export the table + + Grouping - - Import into the table + + Generate query for table - - Populate table + + + Create group - - Create similar table + + Group name - - Reset autoincrement sequence + + Entry with name %1 already exists in group %2. - - Create an index + + Delete group - - Edit the index + + Are you sure you want to delete group %1? +All objects from this group will be moved to parent group. - - Delete the index + + Are you sure you want to remove database '%1' from the list? - - Create a trigger + + Are you sure you want to remove following databases from the list: +%1 - - Edit the trigger + + Remove database - - Delete the trigger + + Vacuum (%1) - - Create a view + + Autoincrement value for table '%1' has been reset successfully. - - Edit the view + + Are you sure you want to delete all data from table(s): %1? - - Delete the view + + + Cannot import, because no import plugin is loaded. - - Add a column + + Execution from file cancelled. Any queries executed so far have been rolled back. - - Edit the column + + &Add a database - - Delete the column + + &Edit the database - - Delete selected items + + &Remove the database - - Clear filter + + &Connect to the database - - Refresh all database schemas + + &Disconnect from the database - - Refresh selected database schema + + &Export the database - - - Erase table data + + Con&vert database type - - - Database + + Vac&uum - - Grouping + + &Integrity check - - Generate query for table + + Create a &table - - - Create group + + Edit the t&able - - Group name + + Delete the ta&ble - - Entry with name %1 already exists in group %2. + + Create an &index - - Delete group + + Edit the i&ndex - - Are you sure you want to delete group %1? -All objects from this group will be moved to parent group. + + Delete the in&dex - - Are you sure you want to remove database '%1' from the list? + + Create a trig&ger - - Are you sure you want to remove following databases from the list: -%1 + + Edit the trigg&er - - Remove database + + Delete the trigge&r - - Vacuum (%1) + + Create a &view - - Autoincrement value for table '%1' has been reset successfully. + + Edit the v&iew - - Are you sure you want to delete all data from table(s): %1? + + Delete the vi&ew - - - Cannot import, because no import plugin is loaded. + + &Refresh all database schemas + + + + + Re&fresh selected database schema + + + + + Open file's directory - - + + Execute SQL from file + + + + + Cannot export, because no export plugin is loaded. - + Integrity check (%1) - + Reset autoincrement - + Are you sure you want to reset autoincrement value for table '%1'? - + An error occurred while trying to reset autoincrement value for table '%1': %2 - + An error occurred while trying to delete data from table '%1': %2 - + All data has been deleted for table '%1'. - + Following objects will be deleted: %1. - + Following databases will be removed from list: %1. - + Remainig objects from deleted group will be moved in place where the group used to be. - + %1<br><br>Are you sure you want to continue? - + Delete objects + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + DbTreeItemDelegate @@ -2614,74 +2463,74 @@ All objects from this group will be moved to parent group. - + Copy - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + Could not add dropped database file '%1' automatically. Manual setup is necessary. - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2735,130 +2584,136 @@ Please enter new, unique name, or press '%1' to abort the operation: - + History - + Results in the separate tab - + Results below the query - - + + SQL editor %1 - + Results - + Execute query - + Explain query - + Clear execution history sql editor - + Export results sql editor - + Create view from query sql editor - + Previous database - + Next database - + Show next tab sql editor - + Show previous tab sql editor - + Focus results below sql editor - + Focus SQL editor above sql editor - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 - + Query finished in %1 second(s). - + Clear execution history - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. - + Cannot export, because no export plugin is loaded. - + No database selected in the SQL editor. Cannot create a view for unknown database. - + Editor window "%1" has uncommitted data. @@ -2881,6 +2736,64 @@ Please enter new, unique name, or press '%1' to abort the operation: + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + ExportDialog @@ -3030,68 +2943,101 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - - - + + + Select database to export. - + Select table to export. - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. + + FileExecErrorsDialog + + + Execution errors + + + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + FontEdit @@ -3112,49 +3058,49 @@ Please enter new, unique name, or press '%1' to abort the operation: FormView - + Commit row form view - + Rollback row form view - + First row form view - + Previous row form view - + Next row form view - + Last row form view - + Insert new row form view - + Delete current row form view @@ -3213,13 +3159,13 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Function implementation code: - + Final step implementation code: @@ -3383,42 +3329,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3457,12 +3403,12 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Collation - + Sort @@ -3641,273 +3587,278 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Configuration widgets - + Syntax highlighting engines - + Data editors - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. - + Running in debug mode. Debug messages are printed to the standard output. - + You need to restart application to make the language change take effect. - - Open SQL editor + + Next window - - Open DDL history + + Previous window - - Open SQL functions editor + + Hide status field - - Open collations editor + + Open Debug Console - - Import + + Open CSS Console - - Export + + Bugs and feature &requests - - Open configuration dialog + + Window list + menubar view menu - - Tile windows + + Open SQL &editor - - Tile windows horizontally + + Open DDL &history - - Tile windows vertically + + Open SQL &functions editor - - Cascade windows + + Open &collations editor - - Next window + + Open ex&tension manager - - Previous window + + &Import - - Hide status field + + E&xport - - Close selected window + + Open confi&guration dialog - - Close all windows but selected + + &Tile windows - - Close all windows + + Tile windows &horizontally - - Restore recently closed window + + Tile windows &vertically - - Rename selected window + + &Cascade windows - - Open Debug Console + + Close selected &window - - Open CSS Console + + Close all windows &but selected - - Report a bug + + Close &all windows - - Propose a new feature + + Re&store recently closed window - - About + + &Rename selected window - - Licenses + + Report a &bug - - Open home page + + Propose a new &feature - - Open forum page + + &About - - User Manual + + &Licenses - - SQLite documentation + + Open home &page - - Report history + + Open fo&rum page - - Check for updates + + User &Manual - - Database - menubar + + SQLite &documentation - - Structure + + Check for &updates + + + + + &Database menubar - - View + + &Structure menubar - - Window list - menubar view menu + + &View + menubar - - Tools + + &Tools menubar - - Help + + &Help - + Could not set style: %1 main window - + Cannot export, because no export plugin is loaded. - + Cannot import, because no import plugin is loaded. - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -3939,64 +3890,69 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Configure editors for this data type - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. - + Deleted multieditor - + Read only multieditor - MultiEditorBool + MultiEditorBoolPlugin - + Boolean - MultiEditorDate + MultiEditorDatePlugin - + Date - MultiEditorDateTime + MultiEditorDateTimePlugin - + Date & time - MultiEditorHex + MultiEditorHexPlugin - + Hex - MultiEditorNumeric + MultiEditorNumericPlugin - + Number numeric multi editor tab name @@ -4005,50 +3961,53 @@ Please enter new, unique name, or press '%1' to abort the operation: MultiEditorText - - Text - - - - + Tab changes focus - + Cut - + Copy - + Paste - + Delete - - Undo + + Undo + + + + + Redo + + + MultiEditorTextPlugin - - Redo + + Text - MultiEditorTime + MultiEditorTimePlugin - + Time @@ -4125,37 +4084,32 @@ Please enter new, unique name, or press '%1' to abort the operation: - - Current version + + This application will be closed and the update installer will start to download and install all the updates. - + Update version - + Check for updates on startup - + Update to new version! - - The update will be automatically downloaded and installed. This will also restart application at the end. - - - - + Not now. - + Don't install the update and close this window. @@ -4207,32 +4161,32 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Abort - + Configure - + Populating configuration for this column is invalid or incomplete. - + Select database with table to populate - + Select table to populate - + You have to select at least one column. @@ -4307,129 +4261,134 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Data grid view - + Copy cell(s) contents to clipboard - Paste cell(s) contents from clipboard + Copy cell(s) contents together with header to clipboard + Paste cell(s) contents from clipboard + + + + Set empty value to selected cell(s) - + Set NULL value to selected cell(s) - + Commit changes to cell(s) contents - + Rollback changes to cell(s) contents - + Delete selected data row - + Insert new data row - + Open contents of selected cell in a separate editor - + Total pages available: %1 - + Total rows loaded: %1 - + Data view (both grid and form) - + Refresh data - + Switch to grid view of the data - + Switch to form view of the data - + Database list - + Delete selected item - + Clear filter contents - + Refresh schema - + Refresh all schemas - + Add database - + Select all items - + Copy selected item(s) - + - + Paste from clipboard @@ -4504,42 +4463,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Main window - + Open SQL editor - + Previous window - + Next window - + Hide status area - + Open configuration dialog - + Open Debug Console - + Open CSS Console @@ -4550,111 +4509,111 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text - + Copy selected text - + Delete selected text - + Undo - + Redo - + SQL editor input field - + Select whole editor contents - + Save contents into a file - + Load contents from a file - + Find in text - + Find next - + Find previous - + Replace in text - + Delete current line - + Request code assistant - + Format contents - + Move selected block of text one line down - + Move selected block of text one line up - + Copy selected block of text and paste it a line below - + Copy selected block of text and paste it a line above - + Toggle comment @@ -4674,16 +4633,6 @@ Please enter new, unique name, or press '%1' to abort the operation:Database file - - - Reports history window - - - - - Delete selected entry - - SQL editor window @@ -4729,6 +4678,11 @@ Please enter new, unique name, or press '%1' to abort the operation:Move keyboard input focus to the SQL editor above + + + Delete selected SQL history entries + + Table window @@ -4947,179 +4901,179 @@ find next SqlEditor - + Cut sql editor - + Copy sql editor - + Paste sql editor - + Delete sql editor - + Select all sql editor - + Undo sql editor - + Redo sql editor - + Complete sql editor - + Format SQL sql editor - + Save SQL to file sql editor - + Select file to save SQL sql editor - + Load SQL from file sql editor - + Delete line sql editor - + Move block down sql editor - + Move block up sql editor - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor - + Find next sql editor - + Find previous sql editor - + Replace sql editor - + Toggle comment sql editor - + Could not open file '%1' for writing: %2 - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file - + SQL scripts (*.sql);;All files (*) - + Open file - + Could not open file '%1' for reading: %2 - + Reached the end of document. Hit the find again to restart the search. @@ -5167,24 +5121,24 @@ find next - - + + Cannot edit this cell. Details: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. @@ -5192,69 +5146,74 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + Uncommitted data - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + An error occurred while committing the transaction: %1 - + An error occurred while committing the data: %1 - - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows - + Number of rows to insert: @@ -5262,117 +5221,137 @@ find next SqlQueryView - + Go to referenced row in... - + Copy - + Copy as... - + Paste - + Paste as... - + Set NULL values - + Erase values - + Edit value in editor - + Commit - + + Copy with headers + + + + Rollback - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row - + Insert multiple rows - + Delete selected row - + + Show value in a viewer + + + + Generate query for selected cells - + No items selected to paste clipboard contents to. - + Go to referenced row in table '%1' - + table '%1' - + Referenced row (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value @@ -5390,6 +5369,119 @@ find next + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + + + + + Open file + + + StatusField @@ -5498,7 +5590,7 @@ but it's okay to use them anyway. - + Foreign column table constraints @@ -5552,24 +5644,24 @@ but it's okay to use them anyway. - + Collate table constraints - + Sort order table constraints - + Select at least one column. - + Enter a name of the constraint. @@ -6120,7 +6212,7 @@ Are you sure you want to create a table with blank name? - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> @@ -6165,7 +6257,7 @@ Are you sure you want to create a table with blank name? - + DDL @@ -6243,18 +6335,18 @@ Are you sure you want to create a table with blank name? - - + + Data - + Triggers - + DDL @@ -6286,224 +6378,224 @@ Are you sure you want to create a table with blank name? - + Refresh the view view window - + Commit the view changes view window - + Rollback the view changes view window - + Explicit column names - + Generate output column names automatically basing on result columns of the view. - + Add column view window - + Edit column view window - + Delete column view window - + Move column up view window - + Move column down view window - + Refresh trigger list view window - + Create new trigger view window - + Edit selected trigger view window - + Delete selected trigger view window - + View window "%1" has uncommitted structure modifications and data. - + View window "%1" has uncommitted data. - + View window "%1" has uncommitted structure modifications. - + Uncommitted changes - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Committed changes for view '%1' successfully. - + Committed changes for view '%1' (named before '%2') successfully. - + Could not load data for view %1. Error details: %2 - + Go back to structure tab - + Commit modifications and browse data. - + Could not commit view changes. Error message: %1 view window - + Override columns - + Currently defined columns will be overriden. Do you want to continue? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. - + Name view window triggers - + Instead of view window triggers - + Condition view window triggers - + Details table window triggers - + Could not process the %1 view correctly. Unable to open a view window. - + Empty name - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. - + Following problems will take place while modifying the view. Would you like to proceed? view window - + View modification view window diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm index 0adb64a..5740bcd 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts index ad6aaf3..e144d8b 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts @@ -14,9 +14,8 @@ O programie - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Darmowy, otwartoźródłowy, wieloplatformowy menadżer baz danych SQLite.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor i aktywny opiekun:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Darmowy, otwartoźródłowy, wieloplatformowy menadżer baz danych SQLite.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor i aktywny opiekun:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> @@ -58,6 +57,11 @@ Configuration directory Katalog konfiguracji + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Darmowy, otwartoźródłowy, wieloplatformowy menadżer baz danych SQLite.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor i aktywny opiekun:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + Qt version: @@ -89,262 +93,222 @@ <h3>Zawartość:</h3><ol>%2</ol> + + BindParamsDialog + + + Query parameters + Parametry zapytania + + + + Please provide values for query parameters + Proszę podać wartości dla parametrów zapytania + + BugDialog - Bugs and ideas - Błędy i pomysły + Błędy i pomysły - Reporter - Zgłaszający + Zgłaszający - E-mail address - Adres e-mail + Adres e-mail - - Log in - Zaloguj + Zaloguj - Short description - Krótki opis + Krótki opis - Detailed description - Opis szczegółowy + Opis szczegółowy - Show more details - Pokaż więcej szczegółów + Pokaż więcej szczegółów - SQLiteStudio version - Wersja SQLiteStudio + Wersja SQLiteStudio - Operating system - System operacyjny + System operacyjny - Loaded plugins - Załadowane wtyczki + Załadowane wtyczki - Send - Wyślij + Wyślij - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - Możesz zobaczyć wszystkie błędy i pomysły zgłoszone przez ciebie wybierając menu '%1' i dalej '%2'. + Możesz zobaczyć wszystkie błędy i pomysły zgłoszone przez ciebie wybierając menu '%1' i dalej '%2'. - A bug report sent successfully. - Błąd został zgłoszony pomyślnie. + Błąd został zgłoszony pomyślnie. - An error occurred while sending a bug report: %1 %2 - Wystąpił błąd podczas zgłaszania błędu: %1 + Wystąpił błąd podczas zgłaszania błędu: %1 %2 - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - Możesz spróbować powtórzyć wysyłkę. Zawartość będzie przywrócona, kiedy otworzysz okno zgłaszania po błędzie takim jak ten. + Możesz spróbować powtórzyć wysyłkę. Zawartość będzie przywrócona, kiedy otworzysz okno zgłaszania po błędzie takim jak ten. - An idea proposal sent successfully. - Pomysł został zgłoszony pomyślnie. + Pomysł został zgłoszony pomyślnie. - An error occurred while sending an idea proposal: %1 %2 - Wystąpił błąd podczas zgłaszania pomysłu: %1 + Wystąpił błąd podczas zgłaszania pomysłu: %1 %2 - A bug report - Zgłoś błąd + Zgłoś błąd - Describe problem in few words - Opisz problem w kilku słowach + Opisz problem w kilku słowach - Describe problem and how to reproduce it - Opisz problem, oraz jak go powtórzyć + Opisz problem, oraz jak go powtórzyć - A new feature idea - Zgłoś pomysł + Zgłoś pomysł - A title for your idea - Tytuł twojego pomysłu + Tytuł twojego pomysłu - Describe your idea in more details - Opisz twój pomysł szerzej + Opisz twój pomysł szerzej - Reporting as an unregistered user, using e-mail address. - Zgłaszanie jako niezarejestrowany użytkownik, używając adresu e-mail. + Zgłaszanie jako niezarejestrowany użytkownik, używając adresu e-mail. - Reporting as a registered user. - Zgłaszanie jako zarejestrowany użytkownik. + Zgłaszanie jako zarejestrowany użytkownik. - Log out - Wyloguj + Wyloguj - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - Podanie prawdziwego adresu e-mail pozwoli na skontaktowanie się z tobą w związku z twoim zgłoszeniem. Aby dowiedzieć się więcej, kliknij przycisk 'pomoc' po prawej stronie. + Podanie prawdziwego adresu e-mail pozwoli na skontaktowanie się z tobą w związku z twoim zgłoszeniem. Aby dowiedzieć się więcej, kliknij przycisk 'pomoc' po prawej stronie. - Enter vaild e-mail address, or log in. - Wpisz poprawny adres e-mail, lub zaloguj się. + Wpisz poprawny adres e-mail, lub zaloguj się. - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - Krótki opis wymaga przynajmniej 10 znaków, ale nie więcej niż 100. Dłuższy opis może być wpisany w polu poniżej. + Krótki opis wymaga przynajmniej 10 znaków, ale nie więcej niż 100. Dłuższy opis może być wpisany w polu poniżej. - Long description requires at least 30 characters. - Długi opis wymaga przynajmniej 30 znaków. + Długi opis wymaga przynajmniej 30 znaków. BugReportHistoryWindow - - Title - Tytuł + Tytuł - - Reported at - Zgłoszony dnia + Zgłoszony dnia - - URL - URL + URL - Reports history - Historia zgłoszeń + Historia zgłoszeń - Clear reports history - Wyczyść historię zgłoszeń + Wyczyść historię zgłoszeń - Delete selected entry - Usuń wybraną pozycję + Usuń wybraną pozycję - Invalid response from server. - Niepoprawna odpowiedź z serwera. + Niepoprawna odpowiedź z serwera. BugReportLoginDialog - Log in - Zaloguj + Zaloguj - Credentials - Dane do logowania + Dane do logowania - Login: - Login: + Login: - Password: - Hasło: + Hasło: - Validation - Walidacja + Walidacja - Validate - Sprawdź + Sprawdź - Validation result message - Treść wyniku walidacji + Treść wyniku walidacji - Abort - Przerwij + Przerwij - A login must be at least 2 characters long. - Login musi mieć przynajmniej 2 znaki. + Login musi mieć przynajmniej 2 znaki. - A password must be at least 5 characters long. - Hasło musi mieć przynajmniej 5 znaków. + Hasło musi mieć przynajmniej 5 znaków. - Valid - Poprawne + Poprawne @@ -355,12 +319,12 @@ Filtruj zestawienia - + Collation name: Nazwa zestawienia: - + Implementation language: Język implementacji: @@ -489,11 +453,20 @@ + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + Niepoprawne wyrażenie wartości domyślnej: %1. Jeśli chcesz użyć zwykłego tekstu jako wartość, pamiętaj o zamknięciu go w znakach apostrofu. + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. + Niepoprawne wyrażenie wartości domyślnej. Jeśli chcesz użyć zwykłego tekstu jako wartość, pamiętaj o zamknięciu go w znakach apostrofu. + + Invalid default value expression: %1 - Niepoprawna wartość wyrażenia domyślnego: %1 + Niepoprawna wartość wyrażenia domyślnego: %1 - + Enter a name of the constraint. Wprowadź nazwę ograniczenia. @@ -605,7 +578,7 @@ - + Delete constraint column dialog Usuń ograniczenie @@ -665,35 +638,45 @@ Dodaj ograniczenie wartości domyślnej - + Are you sure you want to delete constraint '%1'? column dialog Czy na pewno chcesz usunąć ograniczenie '%1'? - + Correct the constraint's configuration. Popraw konfigurację ograniczenia. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. To ograniczenie nie jest oficjalnie wspireane przez SQLite 2, ale można go używać. - + Scale is not allowed for INTEGER PRIMARY KEY columns. Skala nie jest dozwolona dla kolumn INTEGER PRIMARY KEY. - + Precision cannot be defined without the scale. Precyzja nie może być zdefiniowana bez skali. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + Nie można użyć innego typu niż INTEGER, jeśli opcja AUTOINCREMENT jest wybrana w PRIMARY KEY. + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + Typ INTEGER został wymuszony w związku z wybraną opcją AUTOINCREMENT w PRIMARY KEY. + + + Precision is not allowed for INTEGER PRIMARY KEY columns. Precyzja nie jest dozwolona dla kolumn INTEGER PRIMARY KEY. @@ -795,10 +778,9 @@ ale można go używać. Wprowadź nazwę ograniczenia. - Autoincrement (only for %1 type columns) column primary key - Autoinkrementacja (tylko dla kolumn o typie %1) + Autoinkrementacja (tylko dla kolumn o typie %1) @@ -910,7 +892,7 @@ ale można go używać. ConfigDialog - + Configuration Konfiguracja @@ -975,68 +957,68 @@ ale można go używać. Przeglądanie i edycja danych - + Number of data rows per page: Liczba wierszy danych na stronie: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> <p>Kiedy dane są wczytane do widoku siatki, szerokość kolumn jest automatycznie dostosowywana. Ta wartość ogranicza początkową szerokość tego dostosowywania, ale użytkownik nadal może rozszerzać kolumnę ręcznie poza ten limit.</p> - + Limit initial data column width to (in pixels): Ogranicz początkową szerokość kolumn danych (w pikselach): - + Inserting new row in data grid Wstawianie nowego wiersza w widoku siatki danych. - + Before currently selected row Przed aktualnie wybranym wierszem - + After currently selected row Po aktualnie wybranym wierszu. - + At the end of data view Na końcu widoku siatki danych - + Data types Type danych - + Available editors: Dostępne edytory: - + Editors selected for this data type: Edytory wybrane dla tego typu danych: - + Schema editing Edycja schematu - + Number of DDL changes kept in history. Liczba zmian DDL trzymanych w historii. - + DDL history size: Rozmiar historii DDL: @@ -1045,83 +1027,83 @@ ale można go używać. Nie pokazuj okna podglądu DDL podczas zatwierdzania zmian schematu - + SQL queries Zapytania SQL - - + + Number of queries kept in the history. Liczba zapytań trzymana w historii. - + History size: Rozmiar historii: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>Jeśli w oknie edytora SQL jest więcej niż jedno zapytanie, to (jeśli ta opcja jest włączona) tylko jedno zapytanie będzie wykonana - to, które znajduje się pod kursorem pisania. W przeciwnym wypadku wszystkie zapytania będą wykonywane. Zawsze możesz ograniczyć zapytania do wywołania przez zaznaczenie tych zapytań, które chcesz wywołać.</p> - + Execute only the query under the cursor Wykonuj tylko zapytania będące pod kursorem - + Updates Aktualizacje - + Automatically check for updates at startup Sprawdzaj aktualizacje automatycznie przy starcie - + Session Sesje - + Restore last session (active MDI windows) after startup Przywróć ostatnią sesję (aktywne okna MDI) po starcie - + Filter shortcuts by name or key combination Filtruj skróty po nazwie, lub kombinacji klawiszy - + Action Akcja - + Key combination Kombinacja klawiszy - + Changing language requires application restart to take effect. Zmiana języka wymaga restartu aplikacji, aby zadziałać. - + Compact layout Układ kompaktowy - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> <p>Układ kompaktowy zmniejsza wszystkie marginesy i odstępy na interfejsie do minimum, robiąc więcej miejsca na wyświetlanie danych. Powoduje to, że interfejs jest nieco mniej estetyczny, ale pozwala to na prezentację większej ilości danych naraz.</p> - + Use compact layout Użyj układu kompaktowego @@ -1197,7 +1179,7 @@ ale można go używać. Wyświetlaj tabele i indeksy systemowe na liście - + Table windows Okna tabel @@ -1206,12 +1188,12 @@ ale można go używać. Gdy włączone, Okna Tabel będą się pokazywać z zakładką danych, zamiast z zakładką struktury. - + Open Table Windows with the data tab for start Otwieraj Okna Tabeli z zakładką danych na początek - + View windows Okna Widoków @@ -1220,42 +1202,42 @@ ale można go używać. Gdy włączone, Okna Widoków będą się pokazywać z zakładką danych, zamiast z zakładką struktury. - + Open View Windows with the data tab for start Otwieraj Okna Widoku z zakładką danych na początek - + Main window dock areas Strefy dokowania głównego okna - + Left and right areas occupy corners Lewa i prawa strefa zajmują rogi - + Top and bottom areas occupy corners Górna i dolna strefa zajmują rogi - + Hide built-in plugins Ukryj wtyczki wbudowane - + Current style: Aktualny styl: - + Preview Podgląd - + Enabled Włączone @@ -1264,13 +1246,13 @@ ale można go używać. Kolumna - + Disabled Wyłączone - - + + Language Język @@ -1300,212 +1282,234 @@ ale można go używać. Próbuj całkowicie pomijać dialog podczas upuszczania pliku bazy na listę - + Keep NULL value when entering empty value Zachowaj wartość NULL gdy wstawiania jest pusta wartość - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> <p>Gdy to jest włączone i użytkownik zatrzyma kursor myszy nad komórką w widoku siatki danych (wyniki zapytania, dane tabeli, dane widoku), to pojawi się podpowiedź ze szczegółami odnośnie komórki - zawiera ona szczegóły , jak typ danych kolumny, ograniczenia, ROWID i inne.</p> - + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + <p>Maksymalna liczba konfiguracji w oknie dialogowym zaludniania tabeli, która ma być trzymana w konfiguracji. Wartość 100 powinna być wystarczająca.</p> + + + + Number of memorized table populating configurations + Liczba zapamiętanych konfiguracji zaludniania tabeli + + + Show column and row details tooltip in data view Pokazuj podpowiedź ze szczegółami o kolumnie i wierszu w widoku siatki danych - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> <p>Kiedy edytowana jest komórka, która miała wartość NULL, a nowa wartość wprowadzona jest pusta, to ta opcja decyduje o tym, czy wartość powinna pozostać NULL (gdy ta opcja jest włączona), czy powinna być nadpisana pustym łańcuchem znaków (gdy ta opcja wyłączona).</p> - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> <html><head/><body><p>Włącz to, aby wymusić wartość DEFAULT podczas zatwierdzania wartości NULL dla kolumn, które mają zdefiniowaną wartość DEFAULT, nawet jeśli kolumna dopuszcza wartości NULL.</p><p>Wyłącz tą opcję aby używać wartości DEFAULT tylko i wyłącznie, gdy wartość NULL jest zatwierdzana dla kolumny z ograniczeniem NOT NULL.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value Używaj wartości DEFAULT (jeśli zdefiniowana), gdy zatwierdzana jest wartość NULL - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> <p>Gdy włączone, Okna Tabeli będą się otwierać na zakładce danych, zamiast na zakładce struktury.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> <p>Gdy włączone, to zakładka "Dane" będzie umieszczona jako pierwsza w każdym Oknie Tabeli, zamiast jako druga.</p> - + Place data tab as first tab in a Table Window Ustaw zakładkę danych jako pierwszą w Oknie Tabeli - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> <p>Gdy włączone, Okna Widoku będą się otwierać na zakładce danych, zamiast na zakładce struktury.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> <p>Gdy włączone, to zakładka "Dane" będzie umieszczona jako pierwsza w każdym Oknie Widoku, zamiast jako druga.</p> - + Place data tab as first tab in a View Window Ustaw zakładkę danych jako pierwszą w Oknie Widoku - + Don't show DDL preview dialog when committing schema changes Nie pokazuj okna podglądu DDL podczas zatwierdzania zmian struktury - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + <p>Maksymalna liczba parametrów zapytania (:param, @param, $param, ?) trzymanych w historii. Kiedy ponownie użyjesz parametru o tej samej nazwie/pozycji, SQLiteStudio wstępnie uzupełni go używając ostatniej zapamiętanej wartości (nadal będzie można ją zmienić). Wartość 100 powinna być wystarczająca.</p> + + + + Number of memorized query parameters + Liczba zapamiętanych parametrów zapytania + + + Status Field Pole Statusu - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> <p>Kiedy użytkownik ręcznie zamyka panel Statusu, ta opcja zapewnia, że zostanie ono otwarte ponownie, gdy jest wyświetlona nowa wiadomość. Jeśli jest ona wyłączona, to panel Statusu może być otwarte tylko ręcznie z menu "Widok".</p> - + Always open Status panel when new message is printed Zawsze otwieraj panel Statusu, gdy wyświetlona jest nowa wiadomość - + Active formatter plugin Aktywna wtyczka formatera - + SQL editor font Czcionka edytora SQL - + Database list font Czcionka listy baz danych - + Database list additional label font Czcionka dodatkowych etykiety listy baz danych - + Data view font Czcionka widoku danych - + Status field font Czcionka pola statusu - + SQL editor colors Kolory edytora SQL - + Current line background Tło bieżącej linii - + <p>SQL strings are enclosed with single quote characters.</p> <p>Łańcuchy znaków SQL są zamknięte pomiędzy znakami apostrofu.</p> - + String foreground Czcionka łańcucha znaków - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> <b>Parametry wiążące to wyrażenia zastępcze dla wartości, które mają być dopiero dostarczone przez użytkownika. Mają one jedną z form: </p><ul><li>:nazwa_parametru</li><li>$nazwa_parametru</li><li>@nazwa_parametru</li><li>?</li></ul> - + Bind parameter foreground Czcionka parametru wiążącego - + Highlighted parenthesis background Tło podświetlonych nawiasów - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> <p>Wartości BLOB są wartościami binarnymi, reprezentowanymi jako liczby heksadecymalne, jak np:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - + Regular foreground Standardowa czcionka - + Line numbers area background Tło obszaru numerów linii - + Keyword foreground Czcionka słowa kluczowego - + Number foreground Czcionka liczby - + Comment foreground Czcionka komentarza - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> <p>Poprawne obiekty to nazwy tabel, indekstów, wyzwalaczy i widoków, które istnieją w basie SQLite.</p> - + Valid objects foreground Czcionka poprawnych obiektów - + Data view colors Kolory widoku danych - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> <p>Jakiekolwiek zmiany danych będą otoczone ramką w tym kolorze, dopóki nie zostaną zatwierdzone do bazy.</p> - + Uncommitted data outline color Kolor obramowania niezatwierdzonych danych - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> <p>W razie błędu podczas zatwierdzania zmian w danych, komórki sprawiające problem będą obramowane tym kolorem.</p> @@ -1522,140 +1526,140 @@ ale można go używać. <p>W przypadku błędu podczas zatwierdzania zmian danych, komórka będąca przyczyną problemu zostanie obrysowana tym kolorem.</p> - + Commit error outline color Kolor obrysu błędu zatwierdzania - + NULL value foreground Kolor czcionki wartości NULL - + Deleted row background Tło wiersza usuniętego - + Database list colors Kolory listy baz danych - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> <p>Dodatkowe etykiety to te, które mówią o wersji SQLite, liczbie obiektów w głębszych częściach drzewa, itp.</p> - + Additional labels foreground Czcionka dodatkowych etykiet - + Status field colors Kolory pola statusu - + Information message foreground Czcionka wiadomości informującej - + Warning message foreground Czcionka wiadomości ostrzegającej - + Error message foreground Czcionka wiadomości błędu - + Description: plugin details Opis: - + Category: plugin details Kategoria: - + Version: plugin details Wersja: - + Author: plugin details Autor: - + Internal name: plugin details Nazwa wewnętrzna: - + Dependencies: plugin details Zależności: - + Conflicts: plugin details Konflikty: - + Plugin details Szczegóły wtyczki - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. Wtyczki są ładowane/wyładowywane natychmiast po zaznaczeniu/odznaczeniu, ale zmodyfikowana lista wtyczek, które należy załadować przy starcie nie jest zapisana, dopóki nie zatwierdzisz całego okna configuracji. - + %1 (built-in) plugins manager in configuration dialog %1 (wbudowany) - + Details Szczegóły - + No plugins in this category. Brak wtyczek w tej kategorii. - + Add new data type Dodaj nowy typ danych - + Rename selected data type Zmień nazwę wybranego typu danych - + Delete selected data type Usuń wybrany typ danych - + Help for configuring data type editors Pomoc w konfiguracji edytorów typów danych @@ -1807,138 +1811,154 @@ ale można go używać. DataView - + Filter data data view Filtruj dane - + Grid view Widok siatki - + Form view Widok formularza - + Refresh table data data view Odśwież dane tabeli - + First page data view Pierwsza strona - + Previous page data view Poprzednia strona - + Next page data view Następna strona - + Last page data view Ostatnia strona - + + Filter + Filtruj + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + Wciśnij Enter lub naciśnij przycisk "Zastosuj filtr", aby zastosować nową wartość. + + + + Show filter inputs per column + data view + Pokaż filtr dla każdej kolumny + + + Apply filter data view Zastosuj filtr - + Commit changes for selected cells data view Zatwierdź zmiany dla wybranych komórek - + Rollback changes for selected cells data view Wycofaj zmiany dla wybranych komórek - + Show grid view of results sql editor Pokaż widok siatki dla wyników - + Show form view of results sql editor Pokaż widok formularza dla wyników - + Filter by text data view Filtruj po tekście - + Filter by the Regular Expression data view Filtruj używając Wyrażeń Regularnych - + Filter by SQL expression data view Filtruj używając wyrażenia SQL - + Tabs on top data view Karty na górze - + Tabs at bottom data view Karty na dole - + Place new rows above selected row data view Wstawiaj nowe wiersze nad aktualnie wybranym wierszem - + Place new rows below selected row data view Wstawiaj nowe wiersze pod aktualnie wybranym wierszem - + Place new rows at the end of the data view data view Wstawiaj nowe wiersze na końcu widoku siatki danych - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Całkowita liczba wierszy jest liczona. Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostanie zakończone. - + Row: %1 Wiersz: %1 @@ -2145,9 +2165,13 @@ Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostani - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> <p>Automatyczne generowanie nazwy zostało wyłączone, ponieważ nazwa była edytowana ręcznie. Aby przywrócić automatyczne generowanie, proszę wyczyścić pole nazwy.</p> + + <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatyczne generowanie nazwy zostało wyłączone, ponieważ nazwa była edytowana ręcznie. Aby przywrócić automatyczne generowanie, proszę wyczyścić pole nazwy.</p> + Enter a database file path. @@ -2260,298 +2284,435 @@ Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostani Filtruj po nazwie - + Copy Kopiuj - + Paste Wklej - + Select all Zaznacz wszystko - + Create a group Utwórz grupę - + Delete the group Usuń grupę - + Rename the group Zmień nazwę grupy - Add a database - Dodaj bazę danych + Dodaj bazę danych - Edit the database - Edytuj bazę danych + Edytuj bazę danych - Remove the database - Usuń bazę danych + Usuń bazę danych - Connect to the database - Połącz z bazą danych + Połącz z bazą danych - Disconnect from the database - Rozłącz się z bazą danych + Rozłącz się z bazą danych - + Import Importuj - Export the database - Eksportuj bazę danych + Eksportuj bazę danych - Convert database type - Konwertuj typ bazy danych + Konwertuj typ bazy danych - Vacuum - Odkurz + Odkurz - Integrity check - Sprawdź spójność + Sprawdź spójność - Create a table - Utwórz tabelę + Utwórz tabelę - Edit the table - Edytuj tabelę + Edytuj tabelę + + + + Execution from file cancelled. Any queries executed so far have been rolled back. + Wykonywanie z pliku przerwane. Jakiekolwiek wykonane zapytania zostały wycofane. + + + + &Add a database + Dod&aj bazę danych + + + + &Edit the database + &Edytuj bazę danych + + + + &Remove the database + U&suń bazę danych + + + + &Connect to the database + &Połącz z bazą danych + + + + &Disconnect from the database + &Rozłącz się z bazą danych + + + + &Export the database + &Eksportuj bazę danych + + + + Con&vert database type + Kon&wertuj typ bazy danych + + + + Vac&uum + Odk&urz + + + + &Integrity check + Sprawdź spó&jność + + + + Create a &table + Utwórz &tabelę + + + + Edit the t&able + Edytuj t&abelę + + + + Delete the ta&ble + Usuń ta&belę + + + + Create an &index + Utwórz &indeks + + + + Edit the i&ndex + Edytuj i&ndeks + + + + Delete the in&dex + Usuń in&deks + + + + Create a trig&ger + Utwórz wyz&walacz + + + + Edit the trigg&er + Edytuj wyzw&alacz + + + + Delete the trigge&r + Usuń wyzwa&lacz + + + + Create a &view + Utwórz &widok + + + + Edit the v&iew + Edytuj w&idok + + + + Delete the vi&ew + Usuń wi&dok + + + + &Refresh all database schemas + &Odśwież schematy wszystkich baz danych + + + + Re&fresh selected database schema + Odśwież schemat wy&branej bazy danych + + + + Open file's directory + Otwórz katalog pliku + + + + Execute SQL from file + Wykonaj SQL z pliku - + Generate query for table Generuj zapytanie dla tabeli - + Entry with name %1 already exists in group %2. Pozycja o nazwie %1 istnieje już w grupie %2. - + Are you sure you want to remove database '%1' from the list? Czy napewno chcesz wycofać bazę '%1' z listy? - + Are you sure you want to remove following databases from the list: %1 Czy na pewno chcesz wycofać następujące bazy z listy: %1 - + Remove database Wycofaj bazę - + Vacuum (%1) Odkurz (%1) - + Autoincrement value for table '%1' has been reset successfully. Wartość automatycznej inkrementacji dla tabeli '%1' została zresetowana. - + Are you sure you want to delete all data from table(s): %1? Czy na pewno chcesz usunąć wszystkie dane z tabel(i): %1? + + + Could not execute SQL, because application has failed to start transaction: %1 + Nie można wykonać SQLa, ponieważ aplikacja nie mogła rozpocząć transakcji: %1 + + + + Could not open file '%1' for reading: %2 + Nie udało się otworzyć pliku '%1' do odczytu: %2 + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + Nie można wykonać SQLa, ponieważ aplikacja nie mogła zatwierdzić transakcji: %1 + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + Zakończono wykonywanie %1 zapytań w %2 sekund(y). %3 nie zostały wykonane w zwiążku z błędami. + + + + Finished executing %1 queries in %2 seconds. + Zakończono wykonywanie %1 zapytań w %2 sekund(y). + + + + Could not execute SQL due to error. + Nie można wykonać SQL w związku z błędem. + Drop the table Porzuć tabelę - + Export the table Eksportuj tabelę - + Import into the table Importuj do tabeli - + Populate table Zaludnij tabelę - + Create similar table Utwórz podobną tabelę - Create an index - Utwórz indeks + Utwórz indeks - Edit the index - Edytuj indeks + Edytuj indeks Drop the index Porzuć indeks - Create a trigger - Utwórz wyzwalacz + Utwórz wyzwalacz - Edit the trigger - Edytuj wyzwalacz + Edytuj wyzwalacz Drop the trigger Porzuć wyzwalacz - Create a view - Utwórz widok + Utwórz widok - Edit the view - Edytuj widok + Edytuj widok Drop the view Porzuć widok - + Add a column Dodaj kolumnę - + Edit the column Edytuj kolumnę - + Delete the column Usuń kolumnę - + Delete selected items Usuń wybrane elementy - + Clear filter Wyczyść filtr - Refresh all database schemas - Odśwież schematy wszystkich baz danych + Odśwież schematy wszystkich baz danych - Refresh selected database schema - Odśwież schemat wybranej bazy danych + Odśwież schemat wybranej bazy danych - Delete the table - Usuń tabelę + Usuń tabelę - + Reset autoincrement sequence Wyzeruj sekwencję autoinkrementacji - Delete the index - Usuń indeks + Usuń indeks - Delete the trigger - Usuń wyzwalacz + Usuń wyzwalacz - Delete the view - Usuń widok + Usuń widok - - + + Erase table data Wymaż dane tabeli - - + + Database Baza danych - + Grouping Grupowanie - - + + Create group Utwórz grupę - + Group name Nazwa grupy - + Delete group Usuń grupę - + Are you sure you want to delete group %1? All objects from this group will be moved to parent group. Czy na pewno chcesz usunąć grupę %1? @@ -2566,14 +2727,14 @@ Wszystkie obiekty z tej grupy zostaną przeniesione do nadrzędnej grupy.Czy na pewno chcesz usunąć bazę danych '%1'? - - + + Cannot import, because no import plugin is loaded. Nie można zaimportować, ponieważ żadna wtyczka importu nie została załadowana. - - + + Cannot export, because no export plugin is loaded. Nie można wyeksportować, ponieważ żadna wtyczka eksportu nie została załadowana. @@ -2586,22 +2747,22 @@ Wszystkie obiekty z tej grupy zostaną przeniesione do nadrzędnej grupy.Wykonanie VACUUM przebiegło pomyślnie. - + Integrity check (%1) Sprawdzanie spójności (%1) - + Reset autoincrement Wyzeruj autoinkrementację - + Are you sure you want to reset autoincrement value for table '%1'? Czy na pewno chcesz wyzerować wartość autoinkrementacji dla tabeli '%1'? - + An error occurred while trying to reset autoincrement value for table '%1': %2 Wystąpił błąd podczas próby wyzerowania wartości autoinkrementacji dla tabeli '%1': %2 @@ -2614,37 +2775,37 @@ Wszystkie obiekty z tej grupy zostaną przeniesione do nadrzędnej grupy.Czy na pewno chcesz usunąć wszystkie dane z tabeli '%1'? - + An error occurred while trying to delete data from table '%1': %2 Wystąpił błąd podczas próby usunięcia danych z tabeli '%1': %2 - + All data has been deleted for table '%1'. Wszystkie dane z tabeli '%1' zostały usunięte. - + Following objects will be deleted: %1. Następujące obiekty zostaną usunięte: %1 - + Following databases will be removed from list: %1. Następujące bazy danych zostaną usunięte z listy: %1 - + Remainig objects from deleted group will be moved in place where the group used to be. Pozostałe obiekty z usuniętej grupy będą przeniesione w miejsce, gdzie dotychczas była ta grupa. - + %1<br><br>Are you sure you want to continue? %1<br><br>Czy na pewno chcesz kontynuować? - + Delete objects Usuń obiekty @@ -2738,76 +2899,76 @@ Wszystkie obiekty z tej grupy zostaną przeniesione do nadrzędnej grupy.Wyzwalacze (%1): - + Copy Kopiuj - + Move Przenieś - + Include data Również dane - + Include indexes Również indeksy - + Include triggers Również wyzwalacze - + Abort Przerwij - + Could not add dropped database file '%1' automatically. Manual setup is necessary. Nie udało się automatycznie dodać upuszczonego pliku bazy '%1'. Niezbędna ręczna ingerencja. - + Referenced tables Tabele powiązane - + Do you want to include following referenced tables as well: %1 Czy chcesz zawrzeć również powiązane tabele: %1 - + Name conflict Konflikt nazwy - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: Następująy obiekt istnieje już w docelowej bazie danych. Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przerwać operację. - + SQL statements conversion Konwersja zapytań SQL - + Following error occurred while converting SQL statements to the target SQLite version: Następujące błędy wystąpiły podczas konwersji zapytań SQL do docelowej wersji SQLite: - + Would you like to ignore those errors and proceed? Czy chcesz zignorować te błędy i kontynuować? @@ -2863,110 +3024,116 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Zapytanie - + History Historia - + Results in the separate tab Wyniki w osobnej karcie - + Results below the query Wyniki pod zapytaniem - - + + SQL editor %1 Edytor SQL %1 - + Results Wyniki - + Execute query Wykonaj zapytanie - + Explain query Wytłumacz zapytanie - + Clear execution history sql editor Wymaż historię zapytań - + Export results sql editor Wyeksportuj wyniki - + Create view from query sql editor Utwórz widok z zapytania - + Previous database Poprzednia baza danych - + Next database Następna baza danych - + Show next tab sql editor Pokaż następną kartę - + Show previous tab sql editor Pokaż poprzednią kartę - + Focus results below sql editor Aktywuj wyniki poniżej - + Focus SQL editor above sql editor Aktywuj edytor SQL powyżej - + + Delete selected SQL history entries + sql editor + Usuń wybrane wpisy z historii SQL + + + Active database (%1/%2) Aktywna baza danych (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 Zapytanie ukończone w %1 sekund(y). Liczba przetworzonych wierszy: %2 - + Query finished in %1 second(s). Zapytanie ukończone w %1 sekund(y). - + Editor window "%1" has uncommitted data. Okno edytora "%1" ma niezatwierdzone dane. @@ -2975,22 +3142,22 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Zapytanie ukończone w %2 sekund(y). - + Clear execution history Wymaż historię zapytań - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. Czy na pewno chcesz wymazać całą historię zapytań SQL? Tego nie można odwrócić. - + Cannot export, because no export plugin is loaded. Nie można wyeksportować, ponieważ żadna wtyczka eksportu nie została załadowana. - + No database selected in the SQL editor. Cannot create a view for unknown database. Nie wybrano bazdy danych w edytorze SQL. Nie można utworzyć widoku dla nieznanej bazy. @@ -3017,6 +3184,64 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Czy chcesz kontynuować? + + ExecFromFileDialog + + + Execute SQL from file + Wykonaj SQL z pliku + + + + Input file + Plik wejściowy + + + + Path to file + Ścieżka do pliku + + + + Browse for file + Przeglądaj pliki + + + + Options + Opcje + + + + File encoding + Kodowanie pliku + + + + Skip failing SQL statements + Pomiń zapytania z błędami + + + + SQL scripts (*.sql);;All files (*) + Skrypty SQL (*.sql);;Wszystkie pliki (*) + + + + Execute SQL file + Wykonaj plik SQL + + + + Please provide file to be executed. + Proszę podać plik do wykonania + + + + Provided file does not exist or cannot be read. + Podany plik nie istnieje, lub nie można go odczytać. + + ExportDialog @@ -3166,68 +3391,101 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Opcje formatu eksportowania - + Cancel Anuluj - - - + + + Select database to export. Wybierz bazę do eksportu. - + Select table to export. Wybierz tabelę do eksportu. - + Enter valid query to export. Wprowadź poprawne zapytanie do eksportu. - + Select at least one object to export. Wybierz przynajmniej jeden obiekt do eksportu. - + You must provide a file name to export to. Musisz podać nazwę pliku do którego należy wyeksportować. - + Path you provided is an existing directory. You cannot overwrite it. Ścieżka którą podałeś jest istniejącym katalogiem. Nie można go nadpisać. - + The directory '%1' does not exist. Katalog '%1' nie istnieje. - + The file '%1' exists and will be overwritten. Plik '%1' istnieje i zostanie nadpisany. - + All files (*) Wszystkie pliki (*) - + Pick file to export to Wybierz plik do eksportu - + Internal error during export. This is a bug. Please report it. Wystąpił wewnętrzny błąd podczas eksportu. To jest błąd programu. Proszę to zgłosić. + + FileExecErrorsDialog + + + Execution errors + Błędy wykonywania + + + + Following errors were encountered during execution of SQL statements from the file: + Następujące błędy wystąpiły podczas wykonywania zapytań SQL z pliku: + + + + SQL + SQL + + + + Error + Błąd + + + + Statements that were executed successfully were commited. + Wyniki zapytań, które zostały wykonane, zostały zatwierdzone. + + + + Statements that were executed successfully were rolled back. + Wyniki zapytań, które zostały wykonane zostały wycofane. + + FontEdit @@ -3248,49 +3506,49 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer FormView - + Commit row form view Zatwierdź wiersz - + Rollback row form view Wycofaj wiersz - + First row form view Pierwszy wiersz - + Previous row form view Poprzedni wiersz - + Next row form view Następny wiersz - + Last row form view Ostatni wiersz - + Insert new row form view Wstaw nowy wiersz - + Delete current row form view Usuń bieżący wiersz @@ -3349,13 +3607,13 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Kod inicjalizacji: - + Function implementation code: Kod implementacji funkcji: - + Final step implementation code: Kod implementacji ostatniego kroku: @@ -3495,7 +3753,7 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Options - OOpcje + Opcje @@ -3523,42 +3781,42 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Opcje źródła danych - + Cancel Anuluj - + If you type table name that doesn't exist, it will be created. Jeśli wpiszesz nazwę tabeli, która nie istnieje, to zostanie ona stworzona. - + Enter the table name Wprowadź nazwę tabeli - + Select import plugin. Wybierz wtyczkę importu - + You must provide a file to import from. Musisz podać plik z którego należy zaimportować. - + The file '%1' does not exist. Plik '%1' nie istnieje. - + Path you provided is a directory. A regular file is required. Ścieżka którą podałeś jest katalogiem. Wymagany jest zwykły plik. - + Pick file to import from Wybierz plik do importu @@ -3597,12 +3855,12 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Kolumna - + Collation Zestawienie - + Sort Sortowanie @@ -3782,273 +4040,406 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Pasek narzędzi widoku - + Configuration widgets Kontrolki konfiguracji - + Syntax highlighting engines Silniki podświetlania składni - + Data editors Edytory danych - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. Uruchomiono tryb debugowania. Wciśnij %1 lub wybierz menu 'Pomoc / Otwórz konsolę debugowania' aby otworzyć konsolę debugowania. - + Running in debug mode. Debug messages are printed to the standard output. Uruchomiono tryb debugowania. Wiadomości debugujące są wyświetlane na standardowym wyjściu. - + You need to restart application to make the language change take effect. Należy zrestartować aplikację, aby nastąpiła zmiana języka. - Open SQL editor - Otwórz edytor SQL + Otwórz edytor SQL - Open DDL history - Otwórz historię DDL + Otwórz historię DDL - Open SQL functions editor - Otwórz edytor funkcji SQL + Otwórz edytor funkcji SQL - Open collations editor - Otwórz edytor zestawień + Otwórz edytor zestawień - Import - Importuj + Importuj - Export - Eksportuj + Eksportuj - Open configuration dialog - Otwórz okno konfiguracji + Otwórz okno konfiguracji - Tile windows - Ustaw okna w płytki + Ustaw okna w płytki - Tile windows horizontally - Ustaw okno poziomo + Ustaw okno poziomo - Tile windows vertically - Ustaw okna pionowo + Ustaw okna pionowo - Cascade windows - Ustaw okna caskadowo + Ustaw okna kaskadowo - + Next window Następne okno - + Previous window Poprzednie okno - + Hide status field Ukryj pole statusu - Close selected window - Zamknij wybrane okno + Zamknij wybrane okno - Close all windows but selected - Zamknij wszystkie okna, oprócz wybranego + Zamknij wszystkie okna, oprócz wybranego - Close all windows - Zamknij wszystkie okna + Zamknij wszystkie okna - Restore recently closed window - Przywróć ostatnio zamknięte okno + Przywróć ostatnio zamknięte okno - Rename selected window - Zmień nazwę wybranego okna + Zmień nazwę wybranego okna - + Open Debug Console Otwórz Konsolę Debugowania - + Open CSS Console Otwórz konsolę CSS - Report a bug - Zgłoś błąd + Zgłoś błąd - Propose a new feature - Zgłoś pomysł + Zgłoś pomysł - About - O programie + O programie - Licenses - Licencje + Licencje - Open home page - Otwórz stronę domową + Otwórz stronę domową - Open forum page - Otwórz stronę forum + Otwórz stronę forum - User Manual - Podręcznik Użytkownika + Podręcznik Użytkownika - SQLite documentation - Dokumentacja SQLite + Dokumentacja SQLite - Report history - Historia zgłoszeń + Historia zgłoszeń - Check for updates - Sprawdź aktualizacje + Sprawdź aktualizacje - Database menubar - Baza danych + Baza danych - Structure menubar - Struktura + Struktura - View menubar - Widok + Widok - + Window list menubar view menu Lista okien - Tools menubar - Narzędzia + Narzędzia - Help - Pomoc + Pomoc - - Could not set style: %1 - main window + + Open SQL &editor + Otwórz &edytor SQL + + + + Open DDL &history + Otwórz &historię DDL + + + + Open SQL &functions editor + Otwórz edytor &funkcji SQL + + + + Open &collations editor + Otwórz edytor &zestawień + + + + Open ex&tension manager + O&twórzy menadżera rozszerzeń + + + + &Import + &Importuj + + + + E&xport + E&ksportuj + + + + Open confi&guration dialog + Otwórz okno konfi&guracji + + + + &Tile windows + Ustaw okna w pły&tki + + + + Tile windows &horizontally + Ustaw okno po&ziomo + + + + Tile windows &vertically + Ustaw okna pio&nowo + + + + &Cascade windows + Ustaw okna &kaskadowo + + + + Close selected &window + Zamknij &wybrane okno + + + + Close all windows &but selected + Zamknij wszystkie okna, &oprócz wybranego + + + + Close &all windows + Z&amknij wszystkie okna + + + + Re&store recently closed window + Przywróć o&statnio zamknięte okno + + + + &Rename selected window + Zmień nazwę wyb&ranego okna + + + + Report a &bug + Zgłoś &błąd + + + + Propose a new &feature + Zgłoś &pomysł + + + + &About + O progra&mie + + + + &Licenses + &Licencje + + + + Open home &page + Otwórz stronę &domową + + + + Open fo&rum page + Otwórz stronę &forum + + + + User &Manual + &Podręcznik Użytkownika + + + + SQLite &documentation + &Dokumentacja SQLite + + + + Bugs and feature &requests + Błęd&y i pomysły + + + + Check for &updates + Sprawdź akt&ualizacje + + + + &Database + menubar + Bazy &danych + + + + &Structure + menubar + &Struktura + + + + &View + menubar + &Widoki + + + + &Tools + menubar + &Narzędzia + + + + &Help + &Pomoc + + + + Could not set style: %1 + main window Nie udało się ustawić stylu: %1 - + Cannot export, because no export plugin is loaded. Nie można wyeksportować, ponieważ żadna wtyczka eksportu nie została załadowana. - + Cannot import, because no import plugin is loaded. Nie można zaimportować, ponieważ żadna wtyczka importu nie została załadowana. - + Rename window Zmień nazwę okna - + Enter new name for the window: Wprowadź nową nazwę dla okna: - + New updates are available. <a href="%1">Click here for details</a>. Nowe aktualizacje są dostępne: <a href="%1">Kliknij aby poznać szczegóły</a>. - + You're running the most recent version. No updates are available. Uruchomiona jest najnowsza wersja. Nie ma dostępnych aktualizacji. - + Database passed in command line parameters (%1) was already on the list under name: %2 Baza danych podana w parametrach linii poleceń (%1) była już na liście pod nazwą: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 Baza danych podana w linii poleceń (%1) jest tymczasowo dodana do listy pod nazwą: %2 - + Could not add database %1 to list. Nie udało się dodać bazy danych %1 do listy. @@ -4084,23 +4475,28 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Wartość null - + Configure editors for this data type Skonfiguruj edytory dla tego typu danych - + + Open another tab + Otwórz kolejną zakładkę + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. Wtyczka edytora danych '%1' nie jest załadowana, podczas gdy jest ona zdefiniowana do edycji typu danych '%1'. - + Deleted multieditor Usunięto - + Read only multieditor Tylko do odczytu @@ -4109,7 +4505,14 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer MultiEditorBool - + Boolean + Logiczna + + + + MultiEditorBoolPlugin + + Boolean Logiczna @@ -4117,7 +4520,14 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer MultiEditorDate - + Date + Data + + + + MultiEditorDatePlugin + + Date Data @@ -4125,7 +4535,14 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer MultiEditorDateTime - + Date & time + Data i czas + + + + MultiEditorDateTimePlugin + + Date & time Data i czas @@ -4133,7 +4550,14 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer MultiEditorHex - + Hex + Heks + + + + MultiEditorHexPlugin + + Hex Heks @@ -4145,7 +4569,15 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Liczba - + Number + numeric multi editor tab name + Liczba + + + + MultiEditorNumericPlugin + + Number numeric multi editor tab name Liczba @@ -4154,50 +4586,64 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer MultiEditorText - Text - Tekst + Tekst - + Tab changes focus Tabulator zmienia aktywność - + Cut Wytnij - + Copy Kopiuj - + Paste Wklej - + Delete Usuń - + Undo Cofnij - + Redo Przywróć + + MultiEditorTextPlugin + + + Text + Tekst + + MultiEditorTime - + Time + Czas + + + + MultiEditorTimePlugin + + Time Czas @@ -4274,37 +4720,40 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Komponent - + + This application will be closed and the update installer will start to download and install all the updates. + Aplikacja zostanie zamknięta i uruchomiony zostanie instalator aktualizacji, który ściągnie i zainstaluje wszystkie aktualizacje. + + Current version - Obecna wersja + Obecna wersja - + Update version Wersja aktualizacji - + Check for updates on startup Sprawdzaj aktualizacje na starcie - + Update to new version! Aktualizuj do nowej wersji! - The update will be automatically downloaded and installed. This will also restart application at the end. - Aktualizacja będzie pobrana i zainstalowana automatycznie. Spowoduje to również na końcu restart aplikacji. + Aktualizacja będzie pobrana i zainstalowana automatycznie. Spowoduje to również na końcu restart aplikacji. - + Not now. Nie teraz. - + Don't install the update and close this window. Nie instaluj aktualizacji i zamknij to okno. @@ -4356,32 +4805,32 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Zaludnij - + Abort Przerwij - + Configure Konfiguruj - + Populating configuration for this column is invalid or incomplete. Konfiguracja zaludniania dla tej kolumny jest niepoprawna lub niekompletna. - + Select database with table to populate Wybierz bazę danych z tabelą do zaludnienia - + Select table to populate Wybierz tabelę do zaludnienia - + You have to select at least one column. Musisz zaznaczyć przynajmniej jedną kolumnę. @@ -4456,129 +4905,134 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer nazwa zestawienia: %1 - + Data grid view Widok siatki danych - + Copy cell(s) contents to clipboard Skopiuj zawartość komórek do schowka. + Copy cell(s) contents together with header to clipboard + Skopiuj zawartość komórek z z nagłówkiem do schowka + + + Paste cell(s) contents from clipboard Wklej zawartość komórkek ze schowka. - + Set empty value to selected cell(s) Ustaw pustą wartość dla wybranych komórek - + Set NULL value to selected cell(s) Ustaw wartość NULL dla wybranych komórek - + Commit changes to cell(s) contents Zatwierdź zmiany dla zawartości komórek - + Rollback changes to cell(s) contents Wycofaj zmiany dla zawartości komórek - + Delete selected data row Usuń wybrane wiersze danych - + Insert new data row Wstaw nowy wiersz danych - + Open contents of selected cell in a separate editor Otwórz zawartość wybranej komórki w osobnym edytorze - + Total pages available: %1 Liczba dostępnych stron: %1 - + Total rows loaded: %1 Liczba załadowanych wierszy: %1 - + Data view (both grid and form) Widok danych (zarówno siatki i formularza) - + Refresh data Odśwież dane - + Switch to grid view of the data Przełącz do widoku siatki danych - + Switch to form view of the data Przełącz do widoku formularza danych - + Database list Lista baz - + Delete selected item Usuń zaznaczony element - + Clear filter contents Wyczyść zawartość filtra - + Refresh schema Odśwież schemat - + Refresh all schemas Odśwież wszystkie schematy - + Add database Dodaj bazę danych - + Select all items Zaznacz wszystkie elementy - + Copy selected item(s) Kopiuj zaznaczone elementy - + - + Paste from clipboard Wklej ze schowka @@ -4653,42 +5107,42 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Usuń bieżący wiersz - + Main window Okno główne - + Open SQL editor Otwórz edytor SQL - + Previous window Poprzednie okno - + Next window Następne okno - + Hide status area Ukryj pole statusu - + Open configuration dialog Otwórz okno konfiguracji - + Open Debug Console Otwórz Konsolę Debugowania - + Open CSS Console Otwórz konsolę CSS @@ -4699,111 +5153,111 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer - + Cut selected text Wytnij wybrany tekst - + Copy selected text Skopiuj wybrany tekst - + Delete selected text Usuń wybrany tekst - + Undo Cofnij - + Redo Przywróć - + SQL editor input field Pole wprowadzania edytora SQL - + Select whole editor contents Zaznacz całą zawartość edytora - + Save contents into a file Zapisz zawartość do pliku - + Load contents from a file Wczytaj zawartość z pliku - + Find in text Znajdź w tekście - + Find next Znajdź następny - + Find previous Znajdź poprzedni - + Replace in text Zmień w tekście - + Delete current line Usuń bieżącą linię - + Request code assistant Wywołaj asystenta kodu - + Format contents Formatuj zawartość - + Move selected block of text one line down Przenieś wybrany blok tekstu o jedną linię w dół - + Move selected block of text one line up Przenieś wybrany blok tekstu o jedną linię w górę - + Copy selected block of text and paste it a line below Skopiuj wybrany blok tekstu i wklej go poniżej - + Copy selected block of text and paste it a line above Skopiuj wybrany blok tekstu i wklej go powyżej - + Toggle comment Przełącz komentarz @@ -4824,14 +5278,12 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Plik bazy danych - Reports history window - Okno history zgłoszeń + Okno history zgłoszeń - Delete selected entry - Usuń wybraną pozycję + Usuń wybraną pozycję @@ -4878,6 +5330,11 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Move keyboard input focus to the SQL editor above Przenieś aktywność klawiatury do edytora SQL powyżej + + + Delete selected SQL history entries + Usuń wybrane wpisy z historii SQL + Table window @@ -5103,179 +5560,179 @@ znajdź następny SqlEditor - + Cut sql editor Wytnij - + Copy sql editor Kopiuj - + Paste sql editor Wklej - + Delete sql editor Usuń - + Select all sql editor Zaznacz wszystko - + Undo sql editor Cofnij - + Redo sql editor Przywróć - + Complete sql editor Dopełnij - + Format SQL sql editor Formatuj SQL - + Save SQL to file sql editor Zapisz SQL do pliku - + Select file to save SQL sql editor Wybierz plik do zapisu SQL - + Load SQL from file sql editor Wczytaj SQL z pliku - + Delete line sql editor Usuń linię - + Move block down sql editor Przesuń blok w dół - + Move block up sql editor Przesuń blok w górę - + Copy block down sql editor Skopiuj blok w dół - + Copy up down sql editor Skopiuj blok w górę - + Find sql editor Znajdź - + Find next sql editor Znajdź następny - + Find previous sql editor Znajdź poprzedni - + Replace sql editor Zastąp - + Toggle comment sql editor Przełącz komentarz - + Saved SQL contents to file: %1 Zapisano zawartość SQL do pliku: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. Dopełnianie składni może być użyte tylko wtedy, gdy poprawna baza danych jest ustawiona w edytorze SQL. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. Zawartość edytora SQL jest ogromna, więc sprawdzanie błędów i podświetlanie istniejących obiektów zostało tymczasowo wyłączone. - + Save to file Zapisz do pliku - + Could not open file '%1' for writing: %2 Nie udało się otworzyć pliku '%1' do zapisu: %2 - + SQL scripts (*.sql);;All files (*) Skrypty SQL (*.sql);;Wszystkie pliki (*) - + Open file Otwórz plik - + Could not open file '%1' for reading: %2 Nie udało się otworzyć pliku '%1' do odczytu: %2 - + Reached the end of document. Hit the find again to restart the search. Osiągnięto koniec dokumentu. Wciśnij szukanie ponownie, aby zrestartować szukanie. @@ -5331,24 +5788,24 @@ znajdź następny - - + + Cannot edit this cell. Details: %1 Nie można edytować tej komórki. Szczegóły: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. Struktura tej tabeli zmieniła się od ostatniego ładowania danych. Przeładuj dane, aby kontynuować. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). Edytowanie ogromnych ilości danych w podręcznym edytorze nie jest dobrym pomysłem. Może być on powolny i nieporęczny. Lepiej edytować takie duże ilości danych w Widoku Formularza, lub w osobnym oknie edytora (dostępnym w menu prawego kliknięcia myszy). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. Klucz obcy dla kolumny %2 ma więcej niż %1 możliwych wartości. To zbyt wiele, by wyświetlić w liście rozwijanej. Musisz edytować wartość ręcznie. @@ -5356,8 +5813,8 @@ znajdź następny SqlQueryModel - - + + Only one query can be executed simultaneously. Tylko jedno zapytanie może być wykonywane w danym momencie. @@ -5370,12 +5827,12 @@ znajdź następny Niektóre zmiany w danych nie zostały zatwierdzone. Czy na pewno chcesz kontynuować? Wszystkie niezatwierdzone zmiany zostaną utracone. - + Cannot commit the data for a cell that refers to the already closed database. Nie można zatwierdzić danych dla komórki, która odnosi się do zamkniętej już bazy danych. - + Could not begin transaction on the database. Details: %1 Nie udało się rozpocząć transakcji na bazie danych. Szczegóły: %1 @@ -5384,12 +5841,12 @@ znajdź następny Wystąpił błąd podczas zatwierdzania transakcji: %1 - + An error occurred while rolling back the transaction: %1 Wystąpił błąd podczas wycofywania transakcji: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Próbowano zatwierdzić komórkę, której nie można edytować (a mimo to została zmodyfikowana i czeka na zatwierdzenie)! To jest błąd. Proszę to zgłosić. @@ -5398,8 +5855,8 @@ znajdź następny Wystąpił błąd podczas zatwierdzania danych: %1 - - + + Error while executing SQL query on database '%1': %2 Błąd podczas wykonywania zapytania SQL na bazie '%1': %2 @@ -5408,37 +5865,42 @@ znajdź następny Błąd podczas wykonywania zapytania SQL: %1 - + Uncommitted data Niezatwierdzone dane - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. Niektóre zmiany w danych nie zostały zatwierdzone. Czy na pewno chcesz kontynuować? Wszystkie niezatwierdzone zmiany zostaną utracone. - + An error occurred while committing the transaction: %1 Wystąpił błąd podczas zatwierdzania transakcji: %1 - + An error occurred while committing the data: %1 Wystąpił błąd podczas zatwierdzania danych: %1 - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + Liczba wierszy na stronę została zmniejszona do %1, w związku z liczbą kolumn (%2) w widoku danych. + + + Error while loading query results: %1 Błąd podczas wczytywania wyników zapytania: %1 - + Insert multiple rows Wstaw wiele wierszy - + Number of rows to insert: Liczba wierszy do wstawienia: @@ -5446,117 +5908,137 @@ znajdź następny SqlQueryView - + Go to referenced row in... Idź do powiązanego wiersza w... - + Copy Kopiuj - + Copy as... Kopiuj jako... - + Paste Wklej - + Paste as... Wklej jako... - + Set NULL values Ustaw wartości NULL - + Erase values Wymaż wartości - + Edit value in editor Edytuj wartość w edytorze - + Commit Zatwierdź - + + Copy with headers + Kopiuj z nagłówkami + + + Rollback Wycofaj - + Commit selected cells Zatwierdź zaznaczone komórki - + Rollback selected cells Wycofaj zaznaczone komórki - + Define columns to sort by Zdefiniuj kolumny po których sortować - + Remove custom sorting Wycofaj własne sortowanie - + Insert row Wstaw wiersz - + Insert multiple rows Wstaw wiele wierszy - + Delete selected row Usuń zaznaczony wiersz - + + Show value in a viewer + Pokaż wartość w przeglądarce + + + Generate query for selected cells Generuj zapytanie dla wybranych komórek - + No items selected to paste clipboard contents to. Nie wybrano elementów do których należy wkleić zawartość schowka. - + Go to referenced row in table '%1' Idź do powiązanego wiersza w tabeli '%1' - + table '%1' tabela '%1' - + Referenced row (%1) Powiązany wiersz (%1) - + + Trim pasted text? + Przyciąć wklejany tekst? + + + + The pasted text contains leading or trailing white space. Trim it automatically? + Wklejany tekst zawiera spacje na początku lub końcu. Czy przyciąć go automatycznie? + + + Edit value Edytuj wartość @@ -5578,6 +6060,119 @@ znajdź następny Błąd podczas usuwania wiersza z tabeli %1: %2 + + SqliteExtensionEditor + + + Filter extensions + Filtruj rozszerzenia + + + + Leave empty to use default function + Pozostaw puste, aby użyć domyślnej funkcji + + + + Extension file + Plik rozszerzenia + + + + Initialization function + Funkcja inicjalizująca + + + + Databases + Bazy danych + + + + Register in all databases + Zarejestruj we wszystkich bazach danych + + + + Register in following databases: + Zarejestruj w następujących bazach danych: + + + + Extension manager window has uncommitted modifications. + Okno menadżera rozszerzeń ma niezatwierdzone modyfikacje. + + + + Extension manager + Menadżer rozszerzeń + + + + Commit all extension changes + Zatwierdź wszystkie zmiany w rozszerzeniach + + + + Rollback all extension changes + Wycofaj wszystkie zmiany w rozszerzeniach + + + + Add new extension + Dodaj nowe rozszerzenie + + + + Remove selected extension + Usuń wybrane rozszerzenie + + + + Editing extensions manual + Podręcznik edytowania rozszerzeń + + + + File with given path does not exist or is not readable. + Plik o podanej ścieżce nie istnieje lub nie można go odczytać. + + + + Unable to load extension: %1 + Nie można załadować rozszerzenia: %1 + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + Niepoprawna nazwa funkcji inicjalizującej. Nazwa funkcji może zawierać jedynie znaki alfanumeryczne i znak podkreślenia. + + + + Dynamic link libraries (*.dll);;All files (*) + Biblioteki linkowania dynamicznego (*.dll);;Wszystkie pliki (*) + + + + Shared objects (*.so);;All files (*) + Obiekty wspóldzielone (*.so);;Wszystkie pliki (*) + + + + Dynamic libraries (*.dylib);;All files (*) + Biblioteki dynamiczne (*.dylib);;Wszystkie pliki (*) + + + + All files (*) + Wszystkie pliki (*) + + + + Open file + Otwórz plik + + StatusField @@ -5687,7 +6282,7 @@ ale można ich używać. Wprowadź nazwę ograniczenia. - + Foreign column table constraints Kolumna obca @@ -5741,24 +6336,24 @@ ale można ich używać. W razie konfliktu - + Collate table constraints Zestawienie - + Sort order table constraints Kierunek sortowania - + Select at least one column. Zaznacz przynajmniej jedną kolumnę. - + Enter a name of the constraint. Wprowadź nazwę ograniczenia. @@ -6357,7 +6952,7 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> <p>Warunek SQL, który będzie wykonany przed właściwym kodem wyzwalacza. W przypadku gdy warunek zwróci fałsz, wyzwalacz nie zostanie uruchomiony dla tego wiersza.</p> @@ -6402,7 +6997,7 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur Zapytania wyzwalacz do wykonania. - + DDL DDL @@ -6481,18 +7076,18 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur Nazwy kolumn wyjściowych - - + + Data Dane - + Triggers Wyzwalacze - + DDL DDL @@ -6536,121 +7131,121 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur Nowy widok %1 - + Refresh the view view window Odśwież widok - + Commit the view changes view window Zatwierdź zmiany w widoku - + Rollback the view changes view window Wycofaj zmiany w widoku - + Explicit column names Jawne nazwy kolumn - + Generate output column names automatically basing on result columns of the view. Generuj automatycznie nazwy kolumn wyjściowych bazując na kolumnach wynikowych widoku. - + Add column view window Dodaj kolumnę - + Edit column view window Edytuj kolumnę - + Delete column view window Usuń kolumnę - + Move column up view window Przesuń kolumnę w górę - + Move column down view window Przesuń kolumnę w dół - + Refresh trigger list view window Odśwież listę wyzwalaczy - + Create new trigger view window Utwórz nowy wyzwalacz - + Edit selected trigger view window Edytuj wybrany wyzwalacz - + Delete selected trigger view window Usuń wybrany wyzwalacz - + View window "%1" has uncommitted structure modifications and data. Okno widoku "%1" ma niezatwierdzone modyfikacje struktury i danych. - + View window "%1" has uncommitted data. Okno widoku "%1" ma niezatwierdzone dane. - + View window "%1" has uncommitted structure modifications. Okno widoku "%1" ma niezatwierdzone modyfikacje struktury. - + Uncommitted changes Niezatwierdzone zmiany - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? Zmiany w strukturze nie zostały zatwierdzone. Nie można przeglądać, ani edytować danych, dopóki struktura widoku nie zostanie ustalona. Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktury? - + Committed changes for view '%1' successfully. Pomyślnie zatwierdzono zmiany dla widoku '%1'. - + Committed changes for view '%1' (named before '%2') successfully. Pomyślnie zatwierdzono zmiany dla tabeli '%1' (nazwanej wcześniej '%2'). @@ -6667,7 +7262,7 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur Okno widoku "%1" ma niezatwierdzone modyfikacje struktury. - + Could not load data for view %1. Error details: %2 Nie udało się załadować danych dla widoku %1. Szczegóły błędu: %2 @@ -6682,12 +7277,12 @@ Do you want to commit the structure, or do you want to go back to the structure Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktury? - + Go back to structure tab Wróć do karty struktury - + Commit modifications and browse data. Zatwierdź modyfikacje i przeglądaj dane. @@ -6700,86 +7295,86 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur Pomyślnie zatwierdzono zmiany dla widoku '%1' (nazwanego wcześniej '%2'). - + Could not commit view changes. Error message: %1 view window Nie udało się zatwierdzić widoku. Treść błędu: %1 - + Override columns Nadpisz kolumny - + Currently defined columns will be overriden. Do you want to continue? Aktualnie zdefiniowane kolumny zostaną nadpisane. Czy chcesz kontynuować? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. Nie udało się ustalić kolumn zwracanych z widoku. Zapytanie jest prawdopodobnie niekompletne lub zawiera błędy. - + Name view window triggers Nazwa - + Instead of view window triggers Zamiast - + Condition view window triggers Warunek - + Details table window triggers Szczegóły - + Could not process the %1 view correctly. Unable to open a view window. Nie udało się przetworzyć poprawnie widoku %1. Nie można otworzyć okna widoku. - + Empty name Pusta nazwa - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? Pusta nazwa dla widoku jest dozwolona w SQLite, ale nie jest zalecana. Czy na pewno chcesz utworzyć widok o pustej nazwie? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 Zapytanie SELECT nie mogło być poprawnie przeanalizowane. Proszę poprawić zapytanie i spróbować ponownie. Szczegóły: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! Widok nie mógł być zmodyfikowany w związku z wewnętrznym błędem SQLiteStudio. Proszę to zgłosić! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. Kod widok nie mógł być poprawnie przeanalizowany. To jest błąd SQLiteStudio Proszę to zgłosić! - + Following problems will take place while modifying the view. Would you like to proceed? view window @@ -6787,7 +7382,7 @@ Would you like to proceed? Czy chcesz kontynuować? - + View modification view window Modyfikacja widoku diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts index 4d51bcb..0d15aa6 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts @@ -13,11 +13,6 @@ About - - - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - - Licenses @@ -58,6 +53,11 @@ Configuration directory + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + + Qt version: @@ -90,258 +90,15 @@ - BugDialog - - - Bugs and ideas - - - - - Reporter - - - - - E-mail address - - - - - - Log in - - - - - Short description - - - - - Detailed description - - - - - Show more details - - - - - SQLiteStudio version - - - - - Operating system - - - - - Loaded plugins - - - - - Send - - - - - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - - - - - A bug report sent successfully. - - - - - An error occurred while sending a bug report: %1 -%2 - - - - - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - - - - - An idea proposal sent successfully. - - - - - An error occurred while sending an idea proposal: %1 -%2 - - - - - A bug report - - - - - Describe problem in few words - - - - - Describe problem and how to reproduce it - - - - - A new feature idea - - - - - A title for your idea - - - - - Describe your idea in more details - - - - - Reporting as an unregistered user, using e-mail address. - - - - - Reporting as a registered user. - - - - - Log out - - - - - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - - - - - Enter vaild e-mail address, or log in. - - - - - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - - - - - Long description requires at least 30 characters. - - - - - BugReportHistoryWindow + BindParamsDialog - - - Title + + Query parameters - - - Reported at - - - - - - URL - - - - - Reports history - - - - - Clear reports history - - - - - Delete selected entry - - - - - Invalid response from server. - - - - - BugReportLoginDialog - - - Log in - - - - - Credentials - - - - - Login: - - - - - Password: - - - - - Validation - - - - - Validate - - - - - Validation result message - - - - - Abort - - - - - A login must be at least 2 characters long. - - - - - A password must be at least 5 characters long. - - - - - Valid + + Please provide values for query parameters @@ -353,12 +110,12 @@ - + Collation name: - + Implementation language: @@ -483,11 +240,16 @@ - Invalid default value expression: %1 + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. - + Enter a name of the constraint. @@ -599,7 +361,7 @@ - + Delete constraint column dialog @@ -659,34 +421,44 @@ - + Are you sure you want to delete constraint '%1'? column dialog - + Correct the constraint's configuration. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. - + Scale is not allowed for INTEGER PRIMARY KEY columns. - + Precision cannot be defined without the scale. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. @@ -787,12 +559,6 @@ but it's okay to use it. Enter a name of the constraint. - - - Autoincrement (only for %1 type columns) - column primary key - - ColumnUniqueAndNotNullPanel @@ -903,7 +669,7 @@ but it's okay to use it. ConfigDialog - + Configuration @@ -993,215 +759,215 @@ but it's okay to use it. - + Number of data rows per page: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> - + Limit initial data column width to (in pixels): - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> - + Show column and row details tooltip in data view - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> - + Inserting new row in data grid - + Before currently selected row - + After currently selected row - + At the end of data view - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> - + Place data tab as first tab in a Table Window - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> - + Place data tab as first tab in a View Window - + Data types - + Available editors: - + Editors selected for this data type: - + Schema editing - + Number of DDL changes kept in history. - + DDL history size: - + SQL queries - - + + Number of queries kept in the history. - + History size: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + Execute only the query under the cursor - + Updates - + Automatically check for updates at startup - + Session - + Restore last session (active MDI windows) after startup - + Status Field - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> - + Always open Status panel when new message is printed - + Filter shortcuts by name or key combination - + Action - + Key combination - - + + Language - + Changing language requires application restart to take effect. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout @@ -1277,350 +1043,372 @@ but it's okay to use it. - + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + + + Number of memorized table populating configurations + + + + Keep NULL value when entering empty value - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value - + Table windows - + Open Table Windows with the data tab for start - + View windows - + Open View Windows with the data tab for start - + Don't show DDL preview dialog when committing schema changes - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters + + + + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins - + Current style: - + Preview - + Enabled - + Disabled - + Active formatter plugin - + SQL editor font - + Database list font - + Database list additional label font - + Data view font - + Status field font - + SQL editor colors - + Current line background - + <p>SQL strings are enclosed with single quote characters.</p> - + String foreground - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground - + Regular foreground - + Line numbers area background - + Keyword foreground - + Number foreground - + Comment foreground - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + Uncommitted data outline color - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> - + Commit error outline color - + NULL value foreground - + Deleted row background - + Database list colors - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground - + Status field colors - + Information message foreground - + Warning message foreground - + Error message foreground - + Description: plugin details - + Category: plugin details - + Version: plugin details - + Author: plugin details - + Internal name: plugin details - + Dependencies: plugin details - + Conflicts: plugin details - + Plugin details - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. - + %1 (built-in) plugins manager in configuration dialog - + Details - + No plugins in this category. - + Add new data type - + Rename selected data type - + Delete selected data type - + Help for configuring data type editors @@ -1772,137 +1560,153 @@ but it's okay to use it. DataView - + Filter data data view - + Grid view - + Form view - + Refresh table data data view - + First page data view - + Previous page data view - + Next page data view - + Last page data view - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view - + Commit changes for selected cells data view - + Rollback changes for selected cells data view - + Show grid view of results sql editor - + Show form view of results sql editor - + Filter by text data view - + Filter by the Regular Expression data view - + Filter by SQL expression data view - + Tabs on top data view - + Tabs at bottom data view - + Place new rows above selected row data view - + Place new rows below selected row data view - + Place new rows at the end of the data view data view - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Row: %1 @@ -2081,7 +1885,7 @@ Browsing other pages will be possible after the row counting is done. - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> @@ -2183,352 +1987,397 @@ Browsing other pages will be possible after the row counting is done. - + Copy - + Paste - + Select all - + Create a group - + Delete the group - + Rename the group - - Add a database + + Import - - Edit the database + + Export the table - - Remove the database + + Import into the table - - Connect to the database + + Populate table - - Disconnect from the database + + Create similar table - - Import + + Reset autoincrement sequence - - Export the database + + Add a column - - Convert database type + + Edit the column - - Vacuum + + Delete the column - - Integrity check + + Delete selected items - - Create a table + + Clear filter - - Edit the table + + + Erase table data - - Delete the table + + + Database - - Export the table + + Grouping - - Import into the table + + Generate query for table - - Populate table + + + Create group - - Create similar table + + Group name - - Reset autoincrement sequence + + Entry with name %1 already exists in group %2. - - Create an index + + Delete group - - Edit the index + + Are you sure you want to delete group %1? +All objects from this group will be moved to parent group. - - Delete the index + + Are you sure you want to remove database '%1' from the list? - - Create a trigger + + Are you sure you want to remove following databases from the list: +%1 - - Edit the trigger + + Remove database - - Delete the trigger + + Vacuum (%1) - - Create a view + + Autoincrement value for table '%1' has been reset successfully. - - Edit the view + + Are you sure you want to delete all data from table(s): %1? - - Delete the view + + + Cannot import, because no import plugin is loaded. - - Add a column + + Execution from file cancelled. Any queries executed so far have been rolled back. - - Edit the column + + &Add a database - - Delete the column + + &Edit the database - - Delete selected items + + &Remove the database - - Clear filter + + &Connect to the database - - Refresh all database schemas + + &Disconnect from the database - - Refresh selected database schema + + &Export the database - - - Erase table data + + Con&vert database type - - - Database + + Vac&uum - - Grouping + + &Integrity check - - Generate query for table + + Create a &table - - - Create group + + Edit the t&able - - Group name + + Delete the ta&ble - - Entry with name %1 already exists in group %2. + + Create an &index - - Delete group + + Edit the i&ndex - - Are you sure you want to delete group %1? -All objects from this group will be moved to parent group. + + Delete the in&dex - - Are you sure you want to remove database '%1' from the list? + + Create a trig&ger - - Are you sure you want to remove following databases from the list: -%1 + + Edit the trigg&er - - Remove database + + Delete the trigge&r - - Vacuum (%1) + + Create a &view - - Autoincrement value for table '%1' has been reset successfully. + + Edit the v&iew - - Are you sure you want to delete all data from table(s): %1? + + Delete the vi&ew - - - Cannot import, because no import plugin is loaded. + + &Refresh all database schemas + + + + + Re&fresh selected database schema - - + + Open file's directory + + + + + Execute SQL from file + + + + + Cannot export, because no export plugin is loaded. - + Integrity check (%1) - + Reset autoincrement - + Are you sure you want to reset autoincrement value for table '%1'? - + An error occurred while trying to reset autoincrement value for table '%1': %2 - + An error occurred while trying to delete data from table '%1': %2 - + All data has been deleted for table '%1'. - + Following objects will be deleted: %1. - + Following databases will be removed from list: %1. - + Remainig objects from deleted group will be moved in place where the group used to be. - + %1<br><br>Are you sure you want to continue? - + Delete objects + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + DbTreeItemDelegate @@ -2614,74 +2463,74 @@ All objects from this group will be moved to parent group. - + Copy - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + Could not add dropped database file '%1' automatically. Manual setup is necessary. - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2735,130 +2584,136 @@ Please enter new, unique name, or press '%1' to abort the operation: - + History - + Results in the separate tab - + Results below the query - - + + SQL editor %1 - + Results - + Execute query - + Explain query - + Clear execution history sql editor - + Export results sql editor - + Create view from query sql editor - + Previous database - + Next database - + Show next tab sql editor - + Show previous tab sql editor - + Focus results below sql editor - + Focus SQL editor above sql editor - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 - + Query finished in %1 second(s). - + Clear execution history - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. - + Cannot export, because no export plugin is loaded. - + No database selected in the SQL editor. Cannot create a view for unknown database. - + Editor window "%1" has uncommitted data. @@ -2881,6 +2736,64 @@ Please enter new, unique name, or press '%1' to abort the operation: + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + ExportDialog @@ -3030,68 +2943,101 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - - - + + + Select database to export. - + Select table to export. - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. + + FileExecErrorsDialog + + + Execution errors + + + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + FontEdit @@ -3112,49 +3058,49 @@ Please enter new, unique name, or press '%1' to abort the operation: FormView - + Commit row form view - + Rollback row form view - + First row form view - + Previous row form view - + Next row form view - + Last row form view - + Insert new row form view - + Delete current row form view @@ -3213,13 +3159,13 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Function implementation code: - + Final step implementation code: @@ -3383,42 +3329,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cancel - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3457,12 +3403,12 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Collation - + Sort @@ -3641,273 +3587,278 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Configuration widgets - + Syntax highlighting engines - + Data editors - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. - + Running in debug mode. Debug messages are printed to the standard output. - + You need to restart application to make the language change take effect. - - Open SQL editor + + Next window - - Open DDL history + + Previous window - - Open SQL functions editor + + Hide status field - - Open collations editor + + Open Debug Console - - Import + + Open CSS Console - - Export + + Bugs and feature &requests - - Open configuration dialog + + Window list + menubar view menu - - Tile windows + + Open SQL &editor - - Tile windows horizontally + + Open DDL &history - - Tile windows vertically + + Open SQL &functions editor - - Cascade windows + + Open &collations editor - - Next window + + Open ex&tension manager - - Previous window + + &Import - - Hide status field + + E&xport - - Close selected window + + Open confi&guration dialog - - Close all windows but selected + + &Tile windows - - Close all windows + + Tile windows &horizontally - - Restore recently closed window + + Tile windows &vertically - - Rename selected window + + &Cascade windows - - Open Debug Console + + Close selected &window - - Open CSS Console + + Close all windows &but selected - - Report a bug + + Close &all windows - - Propose a new feature + + Re&store recently closed window - - About + + &Rename selected window - - Licenses + + Report a &bug + + + + + Propose a new &feature - - Open home page + + &About - - Open forum page + + &Licenses - - User Manual + + Open home &page - - SQLite documentation + + Open fo&rum page - - Report history + + User &Manual - - Check for updates + + SQLite &documentation - - Database - menubar + + Check for &updates - - Structure + + &Database menubar - - View + + &Structure menubar - - Window list - menubar view menu + + &View + menubar - - Tools + + &Tools menubar - - Help + + &Help - + Could not set style: %1 main window - + Cannot export, because no export plugin is loaded. - + Cannot import, because no import plugin is loaded. - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -3939,64 +3890,69 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Configure editors for this data type - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. - + Deleted multieditor - + Read only multieditor - MultiEditorBool + MultiEditorBoolPlugin - + Boolean - MultiEditorDate + MultiEditorDatePlugin - + Date - MultiEditorDateTime + MultiEditorDateTimePlugin - + Date & time - MultiEditorHex + MultiEditorHexPlugin - + Hex - MultiEditorNumeric + MultiEditorNumericPlugin - + Number numeric multi editor tab name @@ -4005,50 +3961,53 @@ Please enter new, unique name, or press '%1' to abort the operation: MultiEditorText - - Text - - - - + Tab changes focus - + Cut - + Copy - + Paste - + Delete - - Undo + + Undo + + + + + Redo + + + MultiEditorTextPlugin - - Redo + + Text - MultiEditorTime + MultiEditorTimePlugin - + Time @@ -4125,37 +4084,32 @@ Please enter new, unique name, or press '%1' to abort the operation: - - Current version + + This application will be closed and the update installer will start to download and install all the updates. - + Update version - + Check for updates on startup - + Update to new version! - - The update will be automatically downloaded and installed. This will also restart application at the end. - - - - + Not now. - + Don't install the update and close this window. @@ -4207,32 +4161,32 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Abort - + Configure - + Populating configuration for this column is invalid or incomplete. - + Select database with table to populate - + Select table to populate - + You have to select at least one column. @@ -4307,129 +4261,134 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Data grid view - + Copy cell(s) contents to clipboard - Paste cell(s) contents from clipboard + Copy cell(s) contents together with header to clipboard + Paste cell(s) contents from clipboard + + + + Set empty value to selected cell(s) - + Set NULL value to selected cell(s) - + Commit changes to cell(s) contents - + Rollback changes to cell(s) contents - + Delete selected data row - + Insert new data row - + Open contents of selected cell in a separate editor - + Total pages available: %1 - + Total rows loaded: %1 - + Data view (both grid and form) - + Refresh data - + Switch to grid view of the data - + Switch to form view of the data - + Database list - + Delete selected item - + Clear filter contents - + Refresh schema - + Refresh all schemas - + Add database - + Select all items - + Copy selected item(s) - + - + Paste from clipboard @@ -4504,42 +4463,42 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Main window - + Open SQL editor - + Previous window - + Next window - + Hide status area - + Open configuration dialog - + Open Debug Console - + Open CSS Console @@ -4550,111 +4509,111 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text - + Copy selected text - + Delete selected text - + Undo - + Redo - + SQL editor input field - + Select whole editor contents - + Save contents into a file - + Load contents from a file - + Find in text - + Find next - + Find previous - + Replace in text - + Delete current line - + Request code assistant - + Format contents - + Move selected block of text one line down - + Move selected block of text one line up - + Copy selected block of text and paste it a line below - + Copy selected block of text and paste it a line above - + Toggle comment @@ -4674,16 +4633,6 @@ Please enter new, unique name, or press '%1' to abort the operation:Database file - - - Reports history window - - - - - Delete selected entry - - SQL editor window @@ -4729,6 +4678,11 @@ Please enter new, unique name, or press '%1' to abort the operation:Move keyboard input focus to the SQL editor above + + + Delete selected SQL history entries + + Table window @@ -4947,179 +4901,179 @@ find next SqlEditor - + Cut sql editor - + Copy sql editor - + Paste sql editor - + Delete sql editor - + Select all sql editor - + Undo sql editor - + Redo sql editor - + Complete sql editor - + Format SQL sql editor - + Save SQL to file sql editor - + Select file to save SQL sql editor - + Load SQL from file sql editor - + Delete line sql editor - + Move block down sql editor - + Move block up sql editor - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor - + Find next sql editor - + Find previous sql editor - + Replace sql editor - + Toggle comment sql editor - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file - + Could not open file '%1' for writing: %2 - + SQL scripts (*.sql);;All files (*) - + Open file - + Could not open file '%1' for reading: %2 - + Reached the end of document. Hit the find again to restart the search. @@ -5167,24 +5121,24 @@ find next - - + + Cannot edit this cell. Details: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. @@ -5192,69 +5146,74 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + Uncommitted data - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + An error occurred while committing the transaction: %1 - + An error occurred while committing the data: %1 - - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows - + Number of rows to insert: @@ -5262,117 +5221,137 @@ find next SqlQueryView - + Go to referenced row in... - + Copy - + Copy as... - + Paste - + Paste as... - + Set NULL values - + Erase values - + Edit value in editor - + Commit - + + Copy with headers + + + + Rollback - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row - + Insert multiple rows - + Delete selected row - + + Show value in a viewer + + + + Generate query for selected cells - + No items selected to paste clipboard contents to. - + Go to referenced row in table '%1' - + table '%1' - + Referenced row (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value @@ -5390,6 +5369,119 @@ find next + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + + + + + Open file + + + StatusField @@ -5498,7 +5590,7 @@ but it's okay to use them anyway. - + Foreign column table constraints @@ -5552,24 +5644,24 @@ but it's okay to use them anyway. - + Collate table constraints - + Sort order table constraints - + Select at least one column. - + Enter a name of the constraint. @@ -6120,7 +6212,7 @@ Are you sure you want to create a table with blank name? - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> @@ -6165,7 +6257,7 @@ Are you sure you want to create a table with blank name? - + DDL @@ -6243,18 +6335,18 @@ Are you sure you want to create a table with blank name? - - + + Data - + Triggers - + DDL @@ -6286,224 +6378,224 @@ Are you sure you want to create a table with blank name? - + Refresh the view view window - + Commit the view changes view window - + Rollback the view changes view window - + Explicit column names - + Generate output column names automatically basing on result columns of the view. - + Add column view window - + Edit column view window - + Delete column view window - + Move column up view window - + Move column down view window - + Refresh trigger list view window - + Create new trigger view window - + Edit selected trigger view window - + Delete selected trigger view window - + View window "%1" has uncommitted structure modifications and data. - + View window "%1" has uncommitted data. - + View window "%1" has uncommitted structure modifications. - + Uncommitted changes - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Committed changes for view '%1' successfully. - + Committed changes for view '%1' (named before '%2') successfully. - + Could not load data for view %1. Error details: %2 - + Go back to structure tab - + Commit modifications and browse data. - + Could not commit view changes. Error message: %1 view window - + Override columns - + Currently defined columns will be overriden. Do you want to continue? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. - + Name view window triggers - + Instead of view window triggers - + Condition view window triggers - + Details table window triggers - + Could not process the %1 view correctly. Unable to open a view window. - + Empty name - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. - + Following problems will take place while modifying the view. Would you like to proceed? view window - + View modification view window diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.qm new file mode 100644 index 0000000..2856eb9 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.ts new file mode 100644 index 0000000..5df742d --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ro_RO.ts @@ -0,0 +1,6612 @@ + + + + + AboutDialog + + + About SQLiteStudio and licenses + + + + + About + + + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + + + + + Licenses + + + + + Environment + + + + + Icon directories + + + + + Form directories + + + + + Plugin directories + + + + + Configuration directory + + + + + Application directory + + + + + Qt version: + + + + + SQLite 3 version: + + + + + Portable distribution. + + + + + MacOS X application boundle distribution. + + + + + Operating system managed distribution. + + + + + Copy + + + + + <h3>Table of contents:</h3><ol>%2</ol> + + + + + BindParamsDialog + + + Query parameters + + + + + Please provide values for query parameters + + + + + CollationsEditor + + + Filter collations + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Implementation code: + + + + + Collation name: + + + + + Implementation language: + + + + + Collations editor + + + + + Commit all collation changes + + + + + Rollback all collation changes + + + + + Create new collation + + + + + Delete selected collation + + + + + Editing collations manual + + + + + Enter a non-empty, unique name of the collation. + + + + + Pick the implementation language. + + + + + Enter a non-empty implementation code. + + + + + Collations editor window has uncommitted modifications. + + + + + ColorButton + + + Pick a color + + + + + ColumnCollatePanel + + + Collation name: + + + + + Named constraint: + + + + + Enter a name of the constraint. + + + + + Enter a collation name. + + + + + ColumnDefaultPanel + + + Default value: + + + + + Named constraint: + + + + + Enter a default value expression. + + + + + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Enter a name of the constraint. + + + + + ColumnDialog + + + Column + + + + + Name and type + + + + + Scale + + + + + Precision + + + + + Data type: + + + + + Column name: + + + + + Size: + + + + + Constraints + + + + + Unique + + + + + + + + + + + Configure + + + + + Foreign Key + + + + + Collate + + + + + Not NULL + + + + + Check condition + + + + + Primary Key + + + + + Default + + + + + Advanced mode + + + + + Add constraint + column dialog + + + + + Edit constraint + column dialog + + + + + + Delete constraint + column dialog + + + + + Move constraint up + column dialog + + + + + Move constraint down + column dialog + + + + + Add a primary key + column dialog + + + + + Add a foreign key + column dialog + + + + + Add an unique constraint + column dialog + + + + + Add a check constraint + column dialog + + + + + Add a not null constraint + column dialog + + + + + Add a collate constraint + column dialog + + + + + Add a default constraint + column dialog + + + + + Are you sure you want to delete constraint '%1'? + column dialog + + + + + Correct the constraint's configuration. + + + + + This constraint is not officially supported by SQLite 2, +but it's okay to use it. + + + + + Scale is not allowed for INTEGER PRIMARY KEY columns. + + + + + Precision cannot be defined without the scale. + + + + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. + + + + + ColumnDialogConstraintsModel + + + Type + column dialog constraints + + + + + Name + column dialog constraints + + + + + Details + column dialog constraints + + + + + ColumnForeignKeyPanel + + + Foreign table: + + + + + Foreign column: + + + + + Reactions + + + + + Deferred foreign key + + + + + Named constraint + + + + + Constraint name + + + + + Pick the foreign table. + + + + + Pick the foreign column. + + + + + Enter a name of the constraint. + + + + + ColumnPrimaryKeyPanel + + + Autoincrement + + + + + Sort order: + + + + + Named constraint: + + + + + On conflict: + + + + + Enter a name of the constraint. + + + + + ColumnUniqueAndNotNullPanel + + + Named constraint: + + + + + On conflict: + + + + + Enter a name of the constraint. + + + + + CompleterWindow + + + Column: %1 + completer statusbar + + + + + Table: %1 + completer statusbar + + + + + Index: %1 + completer statusbar + + + + + Trigger: %1 + completer statusbar + + + + + View: %1 + completer statusbar + + + + + Database: %1 + completer statusbar + + + + + Keyword: %1 + completer statusbar + + + + + Function: %1 + completer statusbar + + + + + Operator: %1 + completer statusbar + + + + + String + completer statusbar + + + + + Number + completer statusbar + + + + + Binary data + completer statusbar + + + + + Collation: %1 + completer statusbar + + + + + Pragma function: %1 + completer statusbar + + + + + ConfigDialog + + + + Configuration + + + + + Search + + + + + General + + + + + Keyboard shortcuts + + + + + Look & feel + + + + + Style + + + + + Fonts + + + + + Colors + + + + + + Database list + + + + + Data browsing + + + + + Data editors + + + + + Plugins + + + + + Code formatters + + + + + If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. + + + + + Sort table columns alphabetically + + + + + Expand tables node when connected to a database + + + + + <p>Additional labels are those displayed next to the names on the databases list (they are blue, unless configured otherwise). Enabling this option will result in labels for databases, invalid databases and aggregated nodes (column group, index group, trigger group). For more labels see options below.<p> + + + + + Display additional labels on the list + + + + + For regular tables labels will show number of columns, indexes and triggers for each of tables. + + + + + Display labels for regular tables + + + + + Virtual tables will be marked with a 'virtual' label. + + + + + Display labels for virtual tables + + + + + Expand views node when connected to a database + + + + + If this option is switched off, then objects will be sorted in order they appear in sqlite_master table (which is in order they were created) + + + + + Sort objects (tables, indexes, triggers and views) alphabetically + + + + + Display system tables and indexes on the list + + + + + Database dialog window + + + + + <p>When adding new database it is marked to be "permanent" (stored in configuration) by default. Checking this option makes every new database to NOT be "permanent" by default.</p> + + + + + Do not mark database to be "permanent" by default + + + + + <p>When this option is enabled, then files dropped from file manager onto database list will be automatically added to the list, bypassing standard database dialog. If for various reasons automatic process fails, then standard dialog will be presented to the user.</p> + + + + + Try to bypass dialog completly when dropping database file onto the list + + + + + Data browsing and editing + + + + + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> + + + + + Limit initial data column width to (in pixels): + + + + + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> + + + + + Show column and row details tooltip in data view + + + + + Number of data rows per page: + + + + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + + + Number of memorized table populating configurations + + + + + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> + + + + + Keep NULL value when entering empty value + + + + + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> + + + + + Use DEFAULT value (if defined), when committing NULL value + + + + + Inserting new row in data grid + + + + + Before currently selected row + + + + + After currently selected row + + + + + At the end of data view + + + + + Table windows + + + + + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> + + + + + Open Table Windows with the data tab for start + + + + + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> + + + + + Place data tab as first tab in a Table Window + + + + + View windows + + + + + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> + + + + + Open View Windows with the data tab for start + + + + + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> + + + + + Place data tab as first tab in a View Window + + + + + Data types + + + + + Available editors: + + + + + Editors selected for this data type: + + + + + Schema editing + + + + + Number of DDL changes kept in history. + + + + + DDL history size: + + + + + Don't show DDL preview dialog when committing schema changes + + + + + SQL queries + + + + + + Number of queries kept in the history. + + + + + History size: + + + + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> + + + + + Execute only the query under the cursor + + + + + Number of memorized query parameters + + + + + Updates + + + + + Automatically check for updates at startup + + + + + Session + + + + + Restore last session (active MDI windows) after startup + + + + + Status Field + + + + + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> + + + + + Always open Status panel when new message is printed + + + + + Filter shortcuts by name or key combination + + + + + Action + + + + + Key combination + + + + + + Language + + + + + Changing language requires application restart to take effect. + + + + + Compact layout + + + + + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> + + + + + Use compact layout + + + + + Main window dock areas + + + + + Left and right areas occupy corners + + + + + Top and bottom areas occupy corners + + + + + Hide built-in plugins + + + + + Current style: + + + + + Preview + + + + + Enabled + + + + + Disabled + + + + + Active formatter plugin + + + + + SQL editor font + + + + + Database list font + + + + + Database list additional label font + + + + + Data view font + + + + + Status field font + + + + + SQL editor colors + + + + + Current line background + + + + + <p>SQL strings are enclosed with single quote characters.</p> + + + + + String foreground + + + + + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> + + + + + Bind parameter foreground + + + + + Highlighted parenthesis background + + + + + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> + + + + + BLOB value foreground + + + + + Regular foreground + + + + + Line numbers area background + + + + + Keyword foreground + + + + + Number foreground + + + + + Comment foreground + + + + + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> + + + + + Valid objects foreground + + + + + Data view colors + + + + + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> + + + + + Uncommitted data outline color + + + + + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> + + + + + Commit error outline color + + + + + NULL value foreground + + + + + Deleted row background + + + + + Database list colors + + + + + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> + + + + + Additional labels foreground + + + + + Status field colors + + + + + Information message foreground + + + + + Warning message foreground + + + + + Error message foreground + + + + + Description: + plugin details + + + + + Category: + plugin details + + + + + Version: + plugin details + + + + + Author: + plugin details + + + + + Internal name: + plugin details + + + + + Dependencies: + plugin details + + + + + Conflicts: + plugin details + + + + + Plugin details + + + + + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. + + + + + %1 (built-in) + plugins manager in configuration dialog + + + + + Details + + + + + No plugins in this category. + + + + + Add new data type + + + + + Rename selected data type + + + + + Delete selected data type + + + + + Help for configuring data type editors + + + + + ConstraintCheckPanel + + + The condition + + + + + Named constraint: + + + + + On conflict + + + + + Enter a valid condition. + + + + + Enter a name of the constraint. + + + + + ConstraintDialog + + + New constraint + constraint dialog + + + + + Create + constraint dialog + + + + + Edit constraint + dialog window + + + + + Apply + constraint dialog + + + + + Primary key + table constraints + + + + + Foreign key + table constraints + + + + + Unique + table constraints + + + + + Not NULL + table constraints + + + + + Check + table constraints + + + + + Collate + table constraints + + + + + Default + table constraints + + + + + ConstraintTabModel + + + Table + table constraints + + + + + Column (%1) + table constraints + + + + + Scope + table constraints + + + + + Type + table constraints + + + + + Details + table constraints + + + + + Name + table constraints + + + + + CssDebugDialog + + + SQLiteStudio CSS console + + + + + DataView + + + Filter data + data view + + + + + Grid view + + + + + Form view + + + + + Refresh table data + data view + + + + + First page + data view + + + + + Previous page + data view + + + + + Next page + data view + + + + + Last page + data view + + + + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + + Apply filter + data view + + + + + Commit changes for selected cells + data view + + + + + Rollback changes for selected cells + data view + + + + + Show grid view of results + sql editor + + + + + Show form view of results + sql editor + + + + + Filter by text + data view + + + + + Filter by the Regular Expression + data view + + + + + Filter by SQL expression + data view + + + + + Tabs on top + data view + + + + + Tabs at bottom + data view + + + + + Place new rows above selected row + data view + + + + + Place new rows below selected row + data view + + + + + Place new rows at the end of the data view + data view + + + + + Total number of rows is being counted. +Browsing other pages will be possible after the row counting is done. + + + + + Row: %1 + + + + + DbConverterDialog + + + Convert database + + + + + Source database + + + + + Source database version: + + + + + Target database + + + + + Target version: + + + + + This is the file that will be created as a result of the conversion. + + + + + Target file: + + + + + Name of the new database: + + + + + This is the name that the converted database will be added to SQLiteStudio with. + + + + + Select source database + + + + + Enter valid and writable file path. + + + + + Entered file exists and will be overwritten. + + + + + Enter a not empty, unique name (as in the list of databases on the left). + + + + + No valid target dialect available. Conversion not possible. + + + + + Select valid target dialect. + + + + + Database %1 has been successfully converted and now is available under new name: %2 + + + + + SQL statements conversion + + + + + Following error occurred while converting SQL statements to the target SQLite version: + + + + + Would you like to ignore those errors and proceed? + + + + + DbDialog + + + Database + + + + + Database type + + + + + Database driver + + + + + + File + + + + + Create new database file + + + + + Name (on the list) + + + + + Options + + + + + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> + aasfd + + + + + Permanent (keep it in configuration) + + + + + Test connection + + + + + Browse for existing database file on local computer + + + + + Browse + + + + + Enter an unique database name. + + + + + This name is already in use. Please enter unique name. + + + + + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + + + + + Enter a database file path. + + + + + This database is already on the list under name: %1 + + + + + Select a database type. + + + + + DbObjectDialogs + + + Delete table + + + + + Are you sure you want to delete table %1? + + + + + Delete index + + + + + Are you sure you want to delete index %1? + + + + + Delete trigger + + + + + Are you sure you want to delete trigger %1? + + + + + Delete view + + + + + Are you sure you want to delete view %1? + + + + + + Error while dropping %1: %2 + + + + + Delete objects + + + + + Are you sure you want to delete following objects: +%1 + + + + + Cannot start transaction. Details: %1 + + + + + Cannot commit transaction. Details: %1 + + + + + DbTree + + + Databases + + + + + Filter by name + + + + + Copy + + + + + Paste + + + + + Select all + + + + + Create a group + + + + + Delete the group + + + + + Rename the group + + + + + Import + + + + + Export the table + + + + + Import into the table + + + + + Populate table + + + + + Create similar table + + + + + Reset autoincrement sequence + + + + + Add a column + + + + + Edit the column + + + + + Delete the column + + + + + Delete selected items + + + + + Clear filter + + + + + &Add a database + + + + + Execution from file cancelled. Any queries executed so far have been rolled back. + + + + + &Edit the database + + + + + &Remove the database + + + + + &Connect to the database + + + + + &Disconnect from the database + + + + + &Export the database + + + + + Con&vert database type + + + + + Vac&uum + + + + + &Integrity check + + + + + Create a &table + + + + + Edit the t&able + + + + + Delete the ta&ble + + + + + Create an &index + + + + + Edit the i&ndex + + + + + Delete the in&dex + + + + + Create a trig&ger + + + + + Edit the trigg&er + + + + + Delete the trigge&r + + + + + Create a &view + + + + + Edit the v&iew + + + + + Delete the vi&ew + + + + + &Refresh all database schemas + + + + + Re&fresh selected database schema + + + + + + Erase table data + + + + + Open file's directory + + + + + Execute SQL from file + + + + + + Database + + + + + Grouping + + + + + Generate query for table + + + + + + Create group + + + + + Group name + + + + + Entry with name %1 already exists in group %2. + + + + + Delete group + + + + + Are you sure you want to delete group %1? +All objects from this group will be moved to parent group. + + + + + Are you sure you want to remove database '%1' from the list? + + + + + Are you sure you want to remove following databases from the list: +%1 + + + + + Remove database + + + + + + Cannot import, because no import plugin is loaded. + + + + + + Cannot export, because no export plugin is loaded. + + + + + Vacuum (%1) + + + + + Integrity check (%1) + + + + + Reset autoincrement + + + + + Are you sure you want to reset autoincrement value for table '%1'? + + + + + An error occurred while trying to reset autoincrement value for table '%1': %2 + + + + + Autoincrement value for table '%1' has been reset successfully. + + + + + Are you sure you want to delete all data from table(s): %1? + + + + + An error occurred while trying to delete data from table '%1': %2 + + + + + All data has been deleted for table '%1'. + + + + + Following objects will be deleted: %1. + + + + + Following databases will be removed from list: %1. + + + + + Remainig objects from deleted group will be moved in place where the group used to be. + + + + + %1<br><br>Are you sure you want to continue? + + + + + Delete objects + + + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + + + + DbTreeItemDelegate + + + error + dbtree labels + + + + + (system table) + database tree label + + + + + (virtual) + virtual table label + + + + + (system index) + database tree label + + + + + DbTreeModel + + + Database: %1 + dbtree tooltip + + + + + Version: + dbtree tooltip + + + + + File size: + dbtree tooltip + + + + + Encoding: + dbtree tooltip + + + + + Error: + dbtree tooltip + + + + + Table : %1 + dbtree tooltip + + + + + Columns (%1): + dbtree tooltip + + + + + Indexes (%1): + dbtree tooltip + + + + + Triggers (%1): + dbtree tooltip + + + + + Copy + + + + + Move + + + + + Include data + + + + + Include indexes + + + + + Include triggers + + + + + Abort + + + + + Could not add dropped database file '%1' automatically. Manual setup is necessary. + + + + + Referenced tables + + + + + Do you want to include following referenced tables as well: +%1 + + + + + Name conflict + + + + + Following object already exists in the target database. +Please enter new, unique name, or press '%1' to abort the operation: + + + + + SQL statements conversion + + + + + Following error occurred while converting SQL statements to the target SQLite version: + + + + + Would you like to ignore those errors and proceed? + + + + + DdlHistoryWindow + + + Filter by database: + + + + + -- Queries executed on database %1 (%2) +-- Date and time of execution: %3 +%4 + + + + + DDL history + + + + + DdlPreviewDialog + + + Queries to be executed + + + + + Don't show again + + + + + DebugConsole + + + SQLiteStudio Debug Console + + + + + EditorWindow + + + Query + + + + + History + + + + + Results in the separate tab + + + + + Results below the query + + + + + + SQL editor %1 + + + + + Results + + + + + Execute query + + + + + Explain query + + + + + Clear execution history + sql editor + + + + + Export results + sql editor + + + + + Create view from query + sql editor + + + + + Previous database + + + + + Next database + + + + + Show next tab + sql editor + + + + + Show previous tab + sql editor + + + + + Focus results below + sql editor + + + + + Focus SQL editor above + sql editor + + + + + Delete selected SQL history entries + sql editor + + + + + Active database (%1/%2) + + + + + Query finished in %1 second(s). Rows affected: %2 + + + + + Query finished in %1 second(s). + + + + + Clear execution history + + + + + Are you sure you want to erase the entire SQL execution history? This cannot be undone. + + + + + Cannot export, because no export plugin is loaded. + + + + + No database selected in the SQL editor. Cannot create a view for unknown database. + + + + + Editor window "%1" has uncommitted data. + + + + + ErrorsConfirmDialog + + + Errors + + + + + Following errors occured: + + + + + Would you like to proceed? + + + + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + + + ExportDialog + + + Export + + + + + What do you want to export? + + + + + A database + + + + + A single table + + + + + Query results + + + + + Table to export + + + + + Database + + + + + Table + + + + + Options + + + + + When this option is unchecked, then only table DDL (CREATE TABLE statement) is exported. + + + + + Export table data + + + + + Export table indexes + + + + + Export table triggers + + + + + Note, that exporting table indexes and triggers may be unsupported by some output formats. + + + + + Select database objects to export + + + + + Export data from tables + + + + + Select all + + + + + Deselect all + + + + + + Database: + + + + + Query to export results for + + + + + Query to be executed for results: + + + + + Export format and options + + + + + Export format + + + + + Output + + + + + Exported file path + + + + + Clipboard + + + + + File + + + + + Exported text encoding: + + + + + Export format options + + + + + Cancel + + + + + + + Select database to export. + + + + + Select table to export. + + + + + Enter valid query to export. + + + + + Select at least one object to export. + + + + + You must provide a file name to export to. + + + + + Path you provided is an existing directory. You cannot overwrite it. + + + + + The directory '%1' does not exist. + + + + + The file '%1' exists and will be overwritten. + + + + + All files (*) + + + + + Pick file to export to + + + + + Internal error during export. This is a bug. Please report it. + + + + + FileExecErrorsDialog + + + Execution errors + + + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + + + FontEdit + + + Choose font + font configuration + + + + + Form + + + Active SQL formatter plugin + + + + + FormView + + + Commit row + form view + + + + + Rollback row + form view + + + + + First row + form view + + + + + Previous row + form view + + + + + Next row + form view + + + + + Last row + form view + + + + + Insert new row + form view + + + + + Delete current row + form view + + + + + FunctionsEditor + + + Filter funtions + + + + + Input arguments + + + + + Undefined + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Type: + + + + + Function name: + + + + + Implementation language: + + + + + Initialization code: + + + + + + Function implementation code: + + + + + Final step implementation code: + + + + + SQL function editor + + + + + Commit all function changes + + + + + Rollback all function changes + + + + + Create new function + + + + + Delete selected function + + + + + Custom SQL functions manual + + + + + Add function argument + + + + + Rename function argument + + + + + Delete function argument + + + + + Move function argument up + + + + + Move function argument down + + + + + Scalar + + + + + Aggregate + + + + + Enter a non-empty, unique name of the function. + + + + + Pick the implementation language. + + + + + Per step code: + + + + + Enter a non-empty implementation code. + + + + + argument + new function argument name in function editor window + + + + + Functions editor window has uncommitted modifications. + + + + + ImportDialog + + + Import data + + + + + Table to import to + + + + + Table + + + + + Database + + + + + Data source to import from + + + + + Data source type + + + + + Options + + + + + Text encoding: + + + + + Input file: + + + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + + + Ignore errors + + + + + Data source options + + + + + Cancel + + + + + If you type table name that doesn't exist, it will be created. + + + + + Enter the table name + + + + + Select import plugin. + + + + + You must provide a file to import from. + + + + + The file '%1' does not exist. + + + + + Path you provided is a directory. A regular file is required. + + + + + Pick file to import from + + + + + IndexDialog + + + + Index + + + + + Column + + + + + Collation + + + + + Sort + + + + + On table: + + + + + Delete selected indexed expression + + + + + Moves selected index column up in the order, making it more significant in the index. + + + + + Moves selected index column down in the order, making it less significant in the index. + + + + + Partial index condition + + + + + Unique index + + + + + Index name: + + + + + Edit selected indexed expression + + + + + Add indexed expression + + + + + DDL + + + + + Tried to open index dialog for closed or inexisting database. + + + + + Could not process index %1 correctly. Unable to open an index dialog. + + + + + Unique index cannot have indexed expressions. Either remove expressions from list below, or uncheck this option. + + + + + Pick the table for the index. + + + + + Select at least one column. + + + + + Enter a valid condition. + + + + + default + index dialog + + + + + Sort order + table constraints + + + + + + Error + index dialog + + + + + Cannot create unique index, because values in selected columns are not unique. Would you like to execute SELECT query to see problematic values? + + + + + An error occurred while executing SQL statements: +%1 + + + + + IndexExprColumnDialog + + + Indexed expression + + + + + Expression to index + + + + + This expression is already indexed by the index. + + + + + Column should be indexed directly, not by expression. Either extend this expression to contain something more than just column name, or abort and select this column in index dialog directly. + + + + + Column '%1' does not belong to the table covered by this index. Indexed expressions can refer only to columns from the indexed table. + + + + + It's forbidden to use 'SELECT' statements in indexed expressions. + + + + + Enter an indexed expression. + + + + + Invalid expression. + + + + + LanguageDialog + + + Language + + + + + Please choose language: + + + + + MainWindow + + + Database toolbar + + + + + Structure toolbar + + + + + Tools + + + + + Window list + + + + + View toolbar + + + + + Configuration widgets + + + + + Syntax highlighting engines + + + + + Data editors + + + + + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. + + + + + Running in debug mode. Debug messages are printed to the standard output. + + + + + You need to restart application to make the language change take effect. + + + + + Next window + + + + + Previous window + + + + + Hide status field + + + + + Open Debug Console + + + + + Open CSS Console + + + + + Bugs and feature &requests + + + + + Window list + menubar view menu + + + + + Open SQL &editor + + + + + Open DDL &history + + + + + Open SQL &functions editor + + + + + Open &collations editor + + + + + Open ex&tension manager + + + + + &Import + + + + + E&xport + + + + + Open confi&guration dialog + + + + + &Tile windows + + + + + Tile windows &horizontally + + + + + Tile windows &vertically + + + + + &Cascade windows + + + + + Close selected &window + + + + + Close all windows &but selected + + + + + Close &all windows + + + + + Re&store recently closed window + + + + + &Rename selected window + + + + + Report a &bug + + + + + Propose a new &feature + + + + + &About + + + + + &Licenses + + + + + Open home &page + + + + + Open fo&rum page + + + + + User &Manual + + + + + SQLite &documentation + + + + + Check for &updates + + + + + &Database + menubar + + + + + &Structure + menubar + + + + + &View + menubar + + + + + &Tools + menubar + + + + + &Help + + + + + Could not set style: %1 + main window + + + + + Cannot export, because no export plugin is loaded. + + + + + Cannot import, because no import plugin is loaded. + + + + + Rename window + + + + + Enter new name for the window: + + + + + New updates are available. <a href="%1">Click here for details</a>. + + + + + You're running the most recent version. No updates are available. + + + + + Database passed in command line parameters (%1) was already on the list under name: %2 + + + + + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 + + + + + Could not add database %1 to list. + + + + + MdiWindow + + + Uncommitted changes + + + + + Close anyway + + + + + Don't close + + + + + MultiEditor + + + Null value + multieditor + + + + + Configure editors for this data type + + + + + Open another tab + + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. + + + + + Deleted + multieditor + + + + + Read only + multieditor + + + + + MultiEditorBoolPlugin + + + Boolean + + + + + MultiEditorDatePlugin + + + Date + + + + + MultiEditorDateTimePlugin + + + Date & time + + + + + MultiEditorHexPlugin + + + Hex + + + + + MultiEditorNumericPlugin + + + Number + numeric multi editor tab name + + + + + MultiEditorText + + + Tab changes focus + + + + + Cut + + + + + Copy + + + + + Paste + + + + + Delete + + + + + Undo + + + + + Redo + + + + + MultiEditorTextPlugin + + + Text + + + + + MultiEditorTimePlugin + + + Time + + + + + NewConstraintDialog + + + New constraint + + + + + + Primary Key + new constraint dialog + + + + + + Foreign Key + new constraint dialog + + + + + + Unique + new constraint dialog + + + + + + Check + new constraint dialog + + + + + Not NULL + new constraint dialog + + + + + Collate + new constraint dialog + + + + + Default + new constraint dialog + + + + + NewVersionDialog + + + SQLiteStudio updates + + + + + New updates are available! + + + + + Component + + + + + This application will be closed and the update installer will start to download and install all the updates. + + + + + Update version + + + + + Check for updates on startup + + + + + Update to new version! + + + + + Not now. + + + + + Don't install the update and close this window. + + + + + PopulateConfigDialog + + + Populating configuration + + + + + Configuring <b>%1</b> for column <b>%2</b> + + + + + PopulateDialog + + + Populate table + + + + + Database + + + + + Table + + + + + Columns + + + + + Number of rows to populate: + + + + + Populate + populate dialog button + + + + + Abort + + + + + Configure + + + + + Populating configuration for this column is invalid or incomplete. + + + + + Select database with table to populate + + + + + Select table to populate + + + + + You have to select at least one column. + + + + + QObject + + + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). + + + + + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. + + + + + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. + + + + + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. + + + + + Cannot edit results of query other than %1. + + + + + Cannot edit columns that are result of aggregated %1 statements. + + + + + Cannot edit columns that are result of %1 statement. + + + + + Cannot edit columns that are result of common table expression statement (%1). + + + + + + + + on conflict: %1 + data view tooltip + + + + + references table %1, column %2 + data view tooltip + + + + + condition: %1 + data view tooltip + + + + + collation name: %1 + data view tooltip + + + + + Data grid view + + + + + Copy cell(s) contents to clipboard + + + + + Copy cell(s) contents together with header to clipboard + + + + + Paste cell(s) contents from clipboard + + + + + Set empty value to selected cell(s) + + + + + Set NULL value to selected cell(s) + + + + + Commit changes to cell(s) contents + + + + + Rollback changes to cell(s) contents + + + + + Delete selected data row + + + + + Insert new data row + + + + + Open contents of selected cell in a separate editor + + + + + Total pages available: %1 + + + + + Total rows loaded: %1 + + + + + Data view (both grid and form) + + + + + Refresh data + + + + + Switch to grid view of the data + + + + + Switch to form view of the data + + + + + Database list + + + + + Delete selected item + + + + + Clear filter contents + + + + + Refresh schema + + + + + Refresh all schemas + + + + + Add database + + + + + Select all items + + + + + Copy selected item(s) + + + + + + + Paste from clipboard + + + + + Tables + + + + + Indexes + + + + + Triggers + + + + + Views + + + + + Columns + + + + + Data form view + + + + + Commit changes for current row + + + + + Rollback changes for current row + + + + + Go to first row on current page + + + + + Go to next row + + + + + Go to previous row + + + + + Go to last row on current page + + + + + Insert new row + + + + + Delete current row + + + + + Main window + + + + + Open SQL editor + + + + + Previous window + + + + + Next window + + + + + Hide status area + + + + + Open configuration dialog + + + + + Open Debug Console + + + + + Open CSS Console + + + + + Cell text value editor + + + + + + Cut selected text + + + + + + Copy selected text + + + + + + Delete selected text + + + + + + Undo + + + + + + Redo + + + + + SQL editor input field + + + + + Select whole editor contents + + + + + Save contents into a file + + + + + Load contents from a file + + + + + Find in text + + + + + Find next + + + + + Find previous + + + + + Replace in text + + + + + Delete current line + + + + + Request code assistant + + + + + Format contents + + + + + Move selected block of text one line down + + + + + Move selected block of text one line up + + + + + Copy selected block of text and paste it a line below + + + + + Copy selected block of text and paste it a line above + + + + + Toggle comment + + + + + All SQLite databases + + + + + All files + + + + + + Database file + + + + + SQL editor window + + + + + Execute query + + + + + Execute "%1" query + + + + + Switch current working database to previous on the list + + + + + Switch current working database to next on the list + + + + + Go to next editor tab + + + + + Go to previous editor tab + + + + + Move keyboard input focus to the results view below + + + + + Move keyboard input focus to the SQL editor above + + + + + Delete selected SQL history entries + + + + + Table window + + + + + Refresh table structure + + + + + Add new column + + + + + Edit selected column + + + + + Delete selected column + + + + + Export table data + + + + + Import data to the table + + + + + Add new table constraint + + + + + Edit selected table constraint + + + + + Delete selected table constraint + + + + + Refresh table index list + + + + + Add new index + + + + + Edit selected index + + + + + Delete selected index + + + + + Refresh table trigger list + + + + + + Add new trigger + + + + + + Edit selected trigger + + + + + + Delete selected trigger + + + + + + Go to next tab + + + + + + Go to previous tab + + + + + A view window + + + + + Refresh view trigger list + + + + + QuitConfirmDialog + + + Uncommitted changes + + + + + Are you sure you want to quit the application? + +Following items are pending: + + + + + SearchTextDialog + + + Find or replace + + + + + Find: + + + + + Case sensitive + + + + + Search backwards + + + + + Regular expression matching + + + + + Replace && +find next + + + + + Replace with: + + + + + Replace all + + + + + Find + + + + + SortDialog + + + Sort by columns + + + + + + Column + + + + + + Order + + + + + Sort by: %1 + + + + + Move column up + + + + + Move column down + + + + + SqlEditor + + + Cut + sql editor + + + + + Copy + sql editor + + + + + Paste + sql editor + + + + + Delete + sql editor + + + + + Select all + sql editor + + + + + Undo + sql editor + + + + + Redo + sql editor + + + + + Complete + sql editor + + + + + Format SQL + sql editor + + + + + Save SQL to file + sql editor + + + + + Select file to save SQL + sql editor + + + + + Load SQL from file + sql editor + + + + + Delete line + sql editor + + + + + Move block down + sql editor + + + + + Move block up + sql editor + + + + + Copy block down + sql editor + + + + + Copy up down + sql editor + + + + + Find + sql editor + + + + + Find next + sql editor + + + + + Find previous + sql editor + + + + + Replace + sql editor + + + + + Toggle comment + sql editor + + + + + Could not open file '%1' for writing: %2 + + + + + Saved SQL contents to file: %1 + + + + + Syntax completion can be used only when a valid database is set for the SQL editor. + + + + + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. + + + + + Save to file + + + + + SQL scripts (*.sql);;All files (*) + + + + + Open file + + + + + Could not open file '%1' for reading: %2 + + + + + Reached the end of document. Hit the find again to restart the search. + + + + + SqlQueryItem + + + Column: + data view tooltip + + + + + Data type: + data view + + + + + Table: + data view tooltip + + + + + Constraints: + data view tooltip + + + + + Cannot load the data for a cell that refers to the already closed database. + + + + + SqlQueryItemDelegate + + + + + + + Cannot edit this cell. Details: %1 + + + + + The row is marked for deletion. + + + + + + Structure of this table has changed since last data was loaded. Reload the data to proceed. + + + + + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). + + + + + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. + + + + + SqlQueryModel + + + + Only one query can be executed simultaneously. + + + + + Uncommitted data + + + + + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. + + + + + Cannot commit the data for a cell that refers to the already closed database. + + + + + Could not begin transaction on the database. Details: %1 + + + + + An error occurred while committing the transaction: %1 + + + + + An error occurred while rolling back the transaction: %1 + + + + + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. + + + + + An error occurred while committing the data: %1 + + + + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + + Error while executing SQL query on database '%1': %2 + + + + + Error while loading query results: %1 + + + + + Insert multiple rows + + + + + Number of rows to insert: + + + + + SqlQueryView + + + Go to referenced row in... + + + + + Copy + + + + + Copy as... + + + + + Paste + + + + + Paste as... + + + + + Set NULL values + + + + + Erase values + + + + + Edit value in editor + + + + + Commit + + + + + Copy with headers + + + + + Rollback + + + + + Commit selected cells + + + + + Rollback selected cells + + + + + Define columns to sort by + + + + + Remove custom sorting + + + + + Insert row + + + + + Insert multiple rows + + + + + Delete selected row + + + + + Show value in a viewer + + + + + Generate query for selected cells + + + + + No items selected to paste clipboard contents to. + + + + + Go to referenced row in table '%1' + + + + + table '%1' + + + + + Referenced row (%1) + + + + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + + Edit value + + + + + SqlTableModel + + + Error while committing new row: %1 + + + + + Error while deleting row from table %1: %2 + + + + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + + + + + Register in all databases + + + + + Register in following databases: + + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + + + + + Open file + + + + + StatusField + + + Status + + + + + Copy + + + + + Clear + + + + + TableConstraintsModel + + + Type + table constraints + + + + + Details + table constraints + + + + + Name + table constraints + + + + + TableForeignKeyPanel + + + Foreign table: + + + + + SQLite 2 does not support foreign keys officially, +but it's okay to use them anyway. + + + + + Columns + + + + + Local column + + + + + Foreign column + + + + + Reactions + + + + + Deferred foreign key + + + + + Named constraint + + + + + Constraint name + + + + + Pick the foreign column. + + + + + Pick the foreign table. + + + + + Select at least one foreign column. + + + + + Enter a name of the constraint. + + + + + Foreign column + table constraints + + + + + TablePrimaryKeyAndUniquePanel + + + Columns + + + + + Column + + + + + Collation + + + + + Sort + + + + + Valid only for a single column with INTEGER data type + + + + + Autoincrement + + + + + Named constraint + + + + + Constraint name + + + + + On conflict + + + + + Collate + table constraints + + + + + Sort order + table constraints + + + + + Select at least one column. + + + + + Enter a name of the constraint. + + + + + TableStructureModel + + + Name + table structure columns + + + + + Data type + table structure columns + + + + + Primary +Key + table structure columns + + + + + Foreign +Key + table structure columns + + + + + Unique + table structure columns + + + + + Check + table structure columns + + + + + Not +NULL + table structure columns + + + + + Collate + table structure columns + + + + + Default value + table structure columns + + + + + TableWindow + + + Structure + + + + + Table name: + + + + + + Data + + + + + Constraints + + + + + Indexes + + + + + Triggers + + + + + DDL + + + + + Export table + table window + + + + + Import data to table + table window + + + + + Populate table + table window + + + + + Refresh structure + table window + + + + + Commit structure changes + table window + + + + + Rollback structure changes + table window + + + + + Add column + table window + + + + + Edit column + table window + + + + + + Delete column + table window + + + + + Move column up + table window + + + + + Move column down + table window + + + + + Create similar table + table window + + + + + Reset autoincrement value + table window + + + + + Add table constraint + table window + + + + + Edit table constraint + table window + + + + + Delete table constraint + table window + + + + + Move table constraint up + table window + + + + + Move table constraint down + table window + + + + + Add table primary key + table window + + + + + Add table foreign key + table window + + + + + Add table unique constraint + table window + + + + + Add table check constraint + table window + + + + + Refresh index list + table window + + + + + Create index + table window + + + + + Edit index + table window + + + + + Delete index + table window + + + + + Refresh trigger list + table window + + + + + Create trigger + table window + + + + + Edit trigger + table window + + + + + Delete trigger + table window + + + + + Are you sure you want to delete column '%1'? + table window + + + + + Following problems will take place while modifying the table. +Would you like to proceed? + table window + + + + + Table modification + table window + + + + + Could not load data for table %1. Error details: %2 + + + + + Could not process the %1 table correctly. Unable to open a table window. + + + + + Could not restore window %1, because no database or table was stored in session for this window. + + + + + Could not restore window '%1', because no database or table was stored in session for this window. + + + + + Could not restore window '%1', because database %2 could not be resolved. + + + + + Could not restore window '%1'', because the table %2 doesn't exist in the database %3. + + + + + + New table %1 + + + + + Committed changes for table '%1' successfully. + + + + + Committed changes for table '%1' (named before '%2') successfully. + + + + + Could not commit table structure. Error message: %1 + table window + + + + + Reset autoincrement + + + + + Are you sure you want to reset autoincrement value for table '%1'? + + + + + An error occurred while trying to reset autoincrement value for table '%1': %2 + + + + + Autoincrement value for table '%1' has been reset successfully. + + + + + Empty name + + + + + A blank name for the table is allowed in SQLite, but it is not recommended. +Are you sure you want to create a table with blank name? + + + + + Cannot create a table without at least one column. + + + + + Cannot create table %1, if it has no primary key defined. Either uncheck the %2, or define a primary key. + + + + + Cannot use autoincrement for primary key when %1 clause is used. Either uncheck the %2, or the autoincrement in a primary key. + + + + + Are you sure you want to delete table constraint '%1'? + table window + + + + + Delete constraint + table window + + + + + Cannot export, because no export plugin is loaded. + + + + + Cannot import, because no import plugin is loaded. + + + + + Uncommitted changes + + + + + There are uncommitted structure modifications. You cannot browse or edit data until you have table structure settled. +Do you want to commit the structure, or do you want to go back to the structure tab? + + + + + Go back to structure tab + + + + + Commit modifications and browse data. + + + + + Name + table window indexes + + + + + Unique + table window indexes + + + + + Columns + table window indexes + + + + + Partial index condition + table window indexes + + + + + Name + table window triggers + + + + + Event + table window triggers + + + + + Condition + table window triggers + + + + + Details + table window triggers + + + + + Table window "%1" has uncommitted structure modifications and data. + + + + + Table window "%1" has uncommitted data. + + + + + Table window "%1" has uncommitted structure modifications. + + + + + TriggerColumnsDialog + + + Trigger columns + + + + + Triggering columns: + + + + + Select all + + + + + Deselect all + + + + + TriggerDialog + + + + Trigger + + + + + On table: + + + + + Action: + + + + + + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> + + + + + Pre-condition: + + + + + The scope is still not fully supported by the SQLite database. + + + + + Trigger name: + + + + + When: + + + + + List of columns for UPDATE OF action. + + + + + Scope: + + + + + Code: + + + + + Trigger statements to be executed. + + + + + DDL + + + + + On view: + + + + + Could not process trigger %1 correctly. Unable to open a trigger dialog. + + + + + Enter a valid condition. + + + + + Enter a valid trigger code. + + + + + Error + trigger dialog + + + + + An error occurred while executing SQL statements: +%1 + + + + + VersionConvertSummaryDialog + + + Database version convert + + + + + Following changes to the SQL statements will be made: + + + + + Before + + + + + After + + + + + ViewWindow + + + Query + + + + + View name: + + + + + Output column names + + + + + + Data + + + + + Triggers + + + + + DDL + + + + + + Could not restore window '%1', because no database or view was stored in session for this window. + + + + + Could not restore window '%1', because database %2 could not be resolved. + + + + + Could not restore window '%1', because database %2 could not be open. + + + + + Could not restore window '%1', because the view %2 doesn't exist in the database %3. + + + + + + New view %1 + + + + + Refresh the view + view window + + + + + Commit the view changes + view window + + + + + Rollback the view changes + view window + + + + + Explicit column names + + + + + Generate output column names automatically basing on result columns of the view. + + + + + Add column + view window + + + + + Edit column + view window + + + + + Delete column + view window + + + + + Move column up + view window + + + + + Move column down + view window + + + + + Refresh trigger list + view window + + + + + Create new trigger + view window + + + + + Edit selected trigger + view window + + + + + Delete selected trigger + view window + + + + + View window "%1" has uncommitted structure modifications and data. + + + + + View window "%1" has uncommitted data. + + + + + View window "%1" has uncommitted structure modifications. + + + + + Could not load data for view %1. Error details: %2 + + + + + Uncommitted changes + + + + + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. +Do you want to commit the structure, or do you want to go back to the structure tab? + + + + + Go back to structure tab + + + + + Commit modifications and browse data. + + + + + Committed changes for view '%1' successfully. + + + + + Committed changes for view '%1' (named before '%2') successfully. + + + + + Could not commit view changes. Error message: %1 + view window + + + + + Override columns + + + + + Currently defined columns will be overriden. Do you want to continue? + + + + + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. + + + + + Name + view window triggers + + + + + Instead of + view window triggers + + + + + Condition + view window triggers + + + + + Details + table window triggers + + + + + Could not process the %1 view correctly. Unable to open a view window. + + + + + Empty name + + + + + A blank name for the view is allowed in SQLite, but it is not recommended. +Are you sure you want to create a view with blank name? + + + + + The SELECT statement could not be parsed. Please correct the query and retry. +Details: %1 + + + + + The view could not be modified due to internal SQLiteStudio error. Please report this! + + + + + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. + + + + + Following problems will take place while modifying the view. +Would you like to proceed? + view window + + + + + View modification + view window + + + + + WidgetCover + + + Interrupt + + + + diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm index 7a4d27a..4a142a7 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts index 4b135af..ebd49cf 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts @@ -14,9 +14,8 @@ О программе - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Бесплатный кроссплатформенный менеджер баз данных SQLite с открытым исходным кодом.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Автор и активный разработчик:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Бесплатный кроссплатформенный менеджер баз данных SQLite с открытым исходным кодом.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Автор и активный разработчик:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> @@ -58,6 +57,11 @@ Configuration directory Каталог конфигурации + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + + Qt version: @@ -89,262 +93,222 @@ <h3>Содержание:</h3><ol>%2</ol> + + BindParamsDialog + + + Query parameters + + + + + Please provide values for query parameters + + + BugDialog - Bugs and ideas - Ошибки и предложения + Ошибки и предложения - Reporter - Отправитель + Отправитель - E-mail address - Адрес e-mail + Адрес e-mail - - Log in - Вход + Вход - Short description - Краткое описание + Краткое описание - Detailed description - Подробное описание + Подробное описание - Show more details - Показать дополнительную информацию + Показать дополнительную информацию - SQLiteStudio version - Версия SQLiteStudio + Версия SQLiteStudio - Operating system - Операционная система + Операционная система - Loaded plugins - Загруженные модули + Загруженные модули - Send - Отправить + Отправить - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - Вы можете просмотреть все отправленные вами отчёты об ошибках и предложения, выбрав в меню '%1' пункт '%2'. + Вы можете просмотреть все отправленные вами отчёты об ошибках и предложения, выбрав в меню '%1' пункт '%2'. - A bug report sent successfully. - Отчёт об ошибке успешно отправлен. + Отчёт об ошибке успешно отправлен. - An error occurred while sending a bug report: %1 %2 - При отправке отчёта об ошибке возникла проблема: %1 + При отправке отчёта об ошибке возникла проблема: %1 %2 - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - Вы можете повторить отправку. После такой ошибки содержимое полей окна отправки отчёта будет восстановлено при повторном открытии. + Вы можете повторить отправку. После такой ошибки содержимое полей окна отправки отчёта будет восстановлено при повторном открытии. - An idea proposal sent successfully. - Предложение по улучшению было успешно отправлено. + Предложение по улучшению было успешно отправлено. - An error occurred while sending an idea proposal: %1 %2 - При отправке предложения по улучшению возникла проблема: %1 + При отправке предложения по улучшению возникла проблема: %1 %2 - A bug report - Отчёт об ошибке + Отчёт об ошибке - Describe problem in few words - Опишите проблему в нескольких словах + Опишите проблему в нескольких словах - Describe problem and how to reproduce it - Опишите проблему и шаги для её воспроизведения + Опишите проблему и шаги для её воспроизведения - A new feature idea - Предложение по улучшению функционала + Предложение по улучшению функционала - A title for your idea - Название для вашего предложения + Название для вашего предложения - Describe your idea in more details - Опишите ваше предложение более подробно + Опишите ваше предложение более подробно - Reporting as an unregistered user, using e-mail address. - Отправка от незарегистрированного пользователя, используя адрес e-mail + Отправка от незарегистрированного пользователя, используя адрес e-mail - Reporting as a registered user. - Отправка от зарегистрированного пользователя + Отправка от зарегистрированного пользователя - Log out - Выход + Выход - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - Указание действительного адреса e-mail поможет связаться с вами касательно вашего отчёта. Для подробной информации нажмите кнопку Помощь справа. + Указание действительного адреса e-mail поможет связаться с вами касательно вашего отчёта. Для подробной информации нажмите кнопку Помощь справа. - Enter vaild e-mail address, or log in. - Введите действительный адрес e-mail либо выполните вход. + Введите действительный адрес e-mail либо выполните вход. - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - Краткое описание должно содержать от 10 до 100 символов. Более подробное описание можно ввести в поле ниже. + Краткое описание должно содержать от 10 до 100 символов. Более подробное описание можно ввести в поле ниже. - Long description requires at least 30 characters. - Детальное описание должно содержать как минимум 30 символов. + Детальное описание должно содержать как минимум 30 символов. BugReportHistoryWindow - - Title - Заголовок + Заголовок - - Reported at - Дата отправки + Дата отправки - - URL - URL + URL - Reports history - История отчётов + История отчётов - Clear reports history - Очистить историю отчётов + Очистить историю отчётов - Delete selected entry - Удалить выбранную запись + Удалить выбранную запись - Invalid response from server. - Некорректный ответ сервера. + Некорректный ответ сервера. BugReportLoginDialog - Log in - Вход + Вход - Credentials - Данные для входа + Данные для входа - Login: - Имя пользователя: + Имя пользователя: - Password: - Пароль: + Пароль: - Validation - Проверка + Проверка - Validate - Проверить + Проверить - Validation result message - Статус проверки + Статус проверки - Abort - Прервать + Прервать - A login must be at least 2 characters long. - Имя пользователя должно состоять как минимум из двух символов. + Имя пользователя должно состоять как минимум из двух символов. - A password must be at least 5 characters long. - Пароль должен состоять как минимум из пяти символов. + Пароль должен состоять как минимум из пяти символов. - Valid - Верно + Верно @@ -355,12 +319,12 @@ Отфильтровать сравнения - + Collation name: Имя сравнения: - + Implementation language: Язык реализации: @@ -432,7 +396,7 @@ Collations editor window has uncommitted modifications. - + В редакторе сравнений имеются неподтверждённые изменения. Collations editor window has uncommited modifications. @@ -489,11 +453,20 @@ + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. + + + Invalid default value expression: %1 - Некорректное выражение для значения по умолчанию: %1 + Некорректное выражение для значения по умолчанию: %1 - + Enter a name of the constraint. Введите имя ограничения. @@ -605,7 +578,7 @@ - + Delete constraint column dialog @@ -665,34 +638,44 @@ Добавить ограничение на значение по умочанию - + Are you sure you want to delete constraint '%1'? column dialog Вы действительно хотите удалить ограничение '%1'? - + Correct the constraint's configuration. Исправьте конфигурацию ограничения. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. Это ограничение официально не поддерживается SQLite 2, но его использование допустимо. - + Scale is not allowed for INTEGER PRIMARY KEY columns. Указание размера данных недопустимо для столбцов с типом INTEGER PRIMARY KEY. - + Precision cannot be defined without the scale. Точность не может быть задана без указания размера данных. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. Указание точности недопустимо для столбцов с типом INTEGER PRIMARY KEY. @@ -794,10 +777,9 @@ but it's okay to use it. Введите имя ограничения. - Autoincrement (only for %1 type columns) column primary key - Автоинкремент (только для столбцов типа %1) + Автоинкремент (только для столбцов типа %1) @@ -909,7 +891,7 @@ but it's okay to use it. ConfigDialog - + Configuration Конфигурация @@ -999,18 +981,18 @@ but it's okay to use it. Просмотр и редактирование данных - + Number of data rows per page: Количество строк данных на странице: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> <p>При загрузке даных в табличный вид ширина столбцов автоматически подстраивается. Этот параметр ограничивает начальную ширину для подстройки, при этом пользователь может вручную изменить ширину столбца сверх данного лимита.</p> - + Limit initial data column width to (in pixels): Ограничить начальную ширину столбца данных (в пикселях): @@ -1019,7 +1001,7 @@ but it's okay to use it. <html><head/><body><p>&lt;p&gt;Если редактируется ячейка, содержащая NULL, и вводится пустая строка в качестве значения, то эта опция определяет, останется ли в качестве значения ячейки NULL (если опция активирована), или значение будет заменено на пустую строку (если эта опция деактивирована).&lt;/p&gt;</p></body></html> - + Keep NULL value when entering empty value Сохранять значение NULL при вводе пустой тсроки @@ -1028,22 +1010,22 @@ but it's okay to use it. General.KeepNullWhenEmptyValue - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> <p>Если данная опция активирована и пользователь наводит указатель мыши на ячейку в любом режиме просмотра данных (результаты запроса, данные таблицы, данные представления), то будет отображена всплывающая подсказка с информацией о ячейке, в том числе информация о типе данных столбца, ограничениях, значение ROWID и прочее.</p> - + Show column and row details tooltip in data view Показывать всплывающую подсказку с информацией о столбце и строке при просмотре данных - + Inserting new row in data grid Вставка новой строки в таблице данных - + Before currently selected row Перед текущей выделенной строкой @@ -1052,72 +1034,72 @@ but it's okay to use it. General.InsertRowPlacement - + After currently selected row После текущей выделенной строки - + At the end of data view В конец области просмотра данных - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> <p>Если опция активирована, окна таблиц будут открываться на вкладке данных вместо вкладки со структурой.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> <p>Если опция активирована, вкладка "Данные" в окнах таблиц будет первой, а не второй по порядку.</p> - + Place data tab as first tab in a Table Window Помещать вкладку данных в окнах таблиц первой - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> <p>Если опция активирована, окна представлений будут открываться на вкладке данных вместо вкладки со структурой.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> <p>Если опция активирована, вкладка "Данные" в окнах представлений будет первой, а не второй по порядку.</p> - + Place data tab as first tab in a View Window Помещать вкладку данных в окнах представлений первой - + Data types Типы данных - + Available editors: Доступные редакторы: - + Editors selected for this data type: Выбранные редакторы для этого типа данных: - + Schema editing Редактирование схемы - + Number of DDL changes kept in history. Количество сохраняемых в истории изменений DDL. - + DDL history size: Размер истории DDL: @@ -1126,104 +1108,104 @@ but it's okay to use it. Не показывать диалог предпросмотра DDL при подтверждении изменений схемы - + SQL queries SQL запросы - - + + Number of queries kept in the history. Количество сохраняемых в истории запросов. - + History size: Размер истории: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>Если в окне редактора SQL введено более одного запроса, то (если данная опция активирована) будет выполнен лишь один запрос - тот, который находится под текстовым курсором. В противном случае будут исполнены все запросы. Вы можете ограничить выполняемые запросы, выделив их перед вызовом выполнения.</p> - + Execute only the query under the cursor Выполнять только запрос под курсором - + Updates Обновления - + Automatically check for updates at startup Автоматически проверять обновления при запуске - + Session Сессия - + Restore last session (active MDI windows) after startup Восстановить предыдущую сессию (активные MDI окна) после запуска - + Status Field Окно статуса - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> <p>Если пользователь вручную закрыл окно статуса, включение данной опции гарантирует, что при появлении новых сообщений окно статуса будет автоматически открыто. Если опция отключена, окно статуса может быть заново открыто только пользователем вручную через меню "Вид".</p> - + Always open Status panel when new message is printed Всегда открывать окно статуса при появлении нового сообщения - + Filter shortcuts by name or key combination Фильтруйте горячие клавиши по имени или комбинации клавиш - + Action Действие - + Key combination Комбинация клавиш - - + + Language Язык - + Changing language requires application restart to take effect. Для смены языка потребуется перезапустить приложение. - + Compact layout Компактный режим - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> <p>В компактном режиме все поля и отступы в интерфейсе минимизированы для отображения большего количества данных. Интерфейс станет чуть менее эстетичным, однако это позволит уместить больше данных на экране.</p> - + Use compact layout Включить компактный режим @@ -1303,22 +1285,33 @@ but it's okay to use it. Отображать в списке системные таблицы и индексы - - <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> - - <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> + + Number of memorized table populating configurations - + + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> + <p>Если редактируется ячейка, содержащая NULL, и вводится пустая строка в качестве значения, то эта опция определяет, останется ли в качестве значения ячейки NULL (если опция активирована), или значение будет заменено на пустую строку (если эта опция деактивирована).</p> + + + + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> + <html><head/><body><p>Активируйте эту опцию, чтобы всегда подставлять значение DEFAULT (значение по умолчанию) при записи NULL в столбец, у которого определено значение DEFAULT, даже если столбец может содержать NULL.</p><p>Отключите эту опцию для подстановки значения DEFAULT только в случае записи NULL в столбец с ограничением NOT NULL.</p></body></html> + + + Use DEFAULT value (if defined), when committing NULL value - + Использовать значение DEFAULT (если оно определено) при записи NULL - + Table windows Окна таблиц @@ -1327,12 +1320,12 @@ but it's okay to use it. Если опция активирована, окно таблицы будет открыто на вкладке данных вместо вкладки структуры. - + Open Table Windows with the data tab for start Открывать окна таблиц на вкладке данных - + View windows Окна представлений @@ -1341,184 +1334,195 @@ but it's okay to use it. Если опция активирована, окно представления будет открыто на вкладке данных вместо вкладки структуры. - + Open View Windows with the data tab for start Открывать окна представлений на вкладке данных - + Don't show DDL preview dialog when committing schema changes + Не показывать диалог предпросмотра DDL при подтверждении изменений схемы + + + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters - + Main window dock areas Области прикрепления вокруг главного окна - + Left and right areas occupy corners Углы занимают правая и левая области - + Top and bottom areas occupy corners Углы занимают верхняя и нижняя области - + Hide built-in plugins Скрыть встроенные модули - + Current style: Текущий стиль: - + Preview Предпросмотр - + Enabled Активно - + Disabled Неактивно - + Active formatter plugin Активный модуль форматирования - + SQL editor font Шрифт редактора SQL - + Database list font Шрифт списка баз данных - + Database list additional label font Шрифт дополнительных меток в списке баз данных - + Data view font Шрифт просмотра данных - + Status field font Шрифт окна статуса - + SQL editor colors Цвета редактора SQL - + Current line background Фон текущей строки - + <p>SQL strings are enclosed with single quote characters.</p> <p>Строки SQL обрамляются в одинарные кавычки.</p> - + String foreground Цвет строки - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> <p>Подстановочные параметры предназначены для значений, которые будут в дальнейшем указаны пользователем. Они определяются одним из следующих способов:</p><ul><li>:имя_параметра</li><li>$имя_параметра</li><li>@имя_параметра</li><li>?</li></ul> - + Bind parameter foreground Цвет подстановочных параметров - + Highlighted parenthesis background Фон подсвечиваемых скобок - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> <p>Данные типа BLOB — это бинарные данные, представляемые в виде шестнадцатеричных чисел, например:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground Цвет данных типа BLOB - + Regular foreground Стандартный цвет - + Line numbers area background Фон области нумерации строк - + Keyword foreground Цвет ключевого слова - + Number foreground Цвет числа - + Comment foreground Цвет комментария - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> <p>Распознаваемыми объектами являются имена талиц, индексов, триггеров и представлений, существующих в базе данных SQLite.</p> - + Valid objects foreground Цвет распознанных объектов - + Data view colors Цвета в окне просмотра данных - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + <p>Все изменения данных будут обрамлены этим цветом, пока не будут записаны в базу данных.</p> - + Uncommitted data outline color - + Цвет обрамления неподтверждённых изменений - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> - + <p>В случае ошибки при подтверждении изменений данных, этим цветом будут обрамлены проблемные ячейки.</p> <p>Any data changes will be outlined with this color, until they're commited to the database.</p> @@ -1533,140 +1537,140 @@ but it's okay to use it. <p>В случае ошибки при подтверждении изменений данных, этим цветом будут обрамлены проблемные ячейки.</p> - + Commit error outline color Цвет обрамления ошибочных ячеек - + NULL value foreground Цвет значений NULL - + Deleted row background Фон удалённых строк - + Database list colors Цвета списка баз данных - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> <p>Дополнительные метки содержат информацию о версии SQLite, о количестве объектов в глубине дерева и т.д.</p> - + Additional labels foreground Цвет дополнительных меток - + Status field colors Цвета в окне Статуса - + Information message foreground Цвет информационного сообщения - + Warning message foreground Цвет предупреждения - + Error message foreground Цвет ошибки - + Description: plugin details Описание: - + Category: plugin details Категория: - + Version: plugin details Версия: - + Author: plugin details Автор: - + Internal name: plugin details Внутреннее имя: - + Dependencies: plugin details Зависимости: - + Conflicts: plugin details Конфликты: - + Plugin details Сведения о модуле - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. Модули загружаются и выгружаются сразу после активации/деактивации, однако изменения в списке загружаемых при старте модулей не будут сохранены пока вы не примените изменения в окне конфигурации. - + %1 (built-in) plugins manager in configuration dialog %1 (встроенный) - + Details Сведения - + No plugins in this category. В этой категории модулей нет. - + Add new data type Добавить новый тип данных - + Rename selected data type Переименовать выбранный тип данных - + Delete selected data type Удалить выбранный тип данных - + Help for configuring data type editors Справка по настройке редакторов типов данных @@ -1818,138 +1822,154 @@ but it's okay to use it. DataView - + Filter data data view Отфильтровать данные - + Grid view Табличный вид - + Form view Форма - + Refresh table data data view Обновить данные таблицы - + First page data view Первая страница - + Previous page data view Предыдущая страница - + Next page data view Следующая страница - + Last page data view Последняя страница - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view Применить фильтр - + Commit changes for selected cells data view Подтвердить изменения для выбранных ячеек - + Rollback changes for selected cells data view Откатить изменения для выбранных ячеек - + Show grid view of results sql editor Показать результаты в виде таблицы - + Show form view of results sql editor Показать результаты в виде формы - + Filter by text data view Текстовый фильтр - + Filter by the Regular Expression data view Фильтр по регулярному выражению - + Filter by SQL expression data view Фильтр по выражению SQL - + Tabs on top data view Вкладки сверху - + Tabs at bottom data view Вкладки снизу - + Place new rows above selected row data view Поместить новые строки перед выделенной строкой - + Place new rows below selected row data view Поместить новые строки после выделенной строки - + Place new rows at the end of the data view data view Поместить новые строки в конец области просмотра данных - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Идёт подсчёт общего числа строк. Переключение на другие страницы станет возможным после окончания подсчёта. - + Row: %1 Строка: %1 @@ -2156,8 +2176,12 @@ Browsing other pages will be possible after the row counting is done. + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + + + <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> - <p>Автоматическая генерация имени отключена, так как имя было задано вручную. Для автоматической генерации необходимо удалить содержимое из поля имени.</p> + <p>Автоматическая генерация имени отключена, так как имя было задано вручную. Для автоматической генерации необходимо удалить содержимое из поля имени.</p> @@ -2271,283 +2295,420 @@ Browsing other pages will be possible after the row counting is done. Фильтр по имени - + Copy Копировать - + Paste Вставить - + Select all Выделить всё - + Create a group Создать группу - + Delete the group Удалить группу - + Rename the group Переименовать группу - Add a database - Добавить базу данных + Добавить базу данных - Edit the database - Редактировать базу данных + Редактировать базу данных - Remove the database - Удалить базу данных + Удалить базу данных - Connect to the database - Подключиться к базе данных + Подключиться к базе данных - Disconnect from the database - Отключиться от базы данных + Отключиться от базы данных - + Import Импорт - Export the database - Экспортировать базу данных + Экспортировать базу данных - Convert database type - Сконвертировать тип базы данных + Сконвертировать тип базы данных - Vacuum - Выполнить VACUUM + Выполнить VACUUM - Integrity check - Проверить целостность + Проверить целостность - Create a table - Создать таблицу + Создать таблицу - Edit the table - Редактировать таблицу + Редактировать таблицу - Delete the table - Удалить таблицу + Удалить таблицу - + Export the table Экспортировать таблицу - + Import into the table Импортировать данные в таблицу - + Populate table Заполнить таблицу - + Create similar table Создать подобную таблицу - + Reset autoincrement sequence Сбросить счётчик автоинкремента - Create an index - Создать индекс + Создать индекс - Edit the index - Редактировать индекс + Редактировать индекс - Delete the index - Удалить индекс + Удалить индекс - Create a trigger - Создать триггер + Создать триггер - Edit the trigger - Редактировать триггер + Редактировать триггер - Delete the trigger - Удалить триггер + Удалить триггер - Create a view - Создать представление + Создать представление - Edit the view - Редактировать представление + Редактировать представление - Delete the view - Удалить представление + Удалить представление - + Add a column Добавить столбец - + Edit the column Редактировать столбец - + Delete the column Удалить столбец - + Delete selected items Удалить выбранные элементы - + Clear filter Сбросить фильтр - Refresh all database schemas - Обновить структуры всех баз данных + Обновить структуры всех баз данных - Refresh selected database schema - Обновить структуру выбранной базы данных + Обновить структуру выбранной базы данных + + + + Execution from file cancelled. Any queries executed so far have been rolled back. + + + + + &Add a database + + + + + &Edit the database + + + + + &Remove the database + + + + + &Connect to the database + - + &Disconnect from the database + + + + + &Export the database + + + + + Con&vert database type + + + + + Vac&uum + + + + + &Integrity check + + + + + Create a &table + + + + + Edit the t&able + + + + + Delete the ta&ble + + + + + Create an &index + + + + + Edit the i&ndex + + + + + Delete the in&dex + + + + + Create a trig&ger + + + + + Edit the trigg&er + + + + + Delete the trigge&r + + + + + Create a &view + + + + + Edit the v&iew + + + + + Delete the vi&ew + + + + + &Refresh all database schemas + + + + + Re&fresh selected database schema + + + + + Erase table data Удалить данные из таблицы - - + + Open file's directory + + + + + Execute SQL from file + + + + + Database База данных - + Grouping Группировка - + Generate query for table Сгенерировать запрос для этой таблицы - - + + Create group Создать группу - + Group name Имя группы - + Entry with name %1 already exists in group %2. Элемент с именем %1 уже входит в группу %2. - + Delete group Удалить группу - + Are you sure you want to delete group %1? All objects from this group will be moved to parent group. Вы действительно хотите удалить группу %1? Все объекты из данной группы будут перемещены в родительскую группу. - + Are you sure you want to remove database '%1' from the list? Вы действительно хотите удалить базу данных '%1' из списка? - + Are you sure you want to remove following databases from the list: %1 Вы действительно хотите удалить следующие базы данных из списка: %1 - + Remove database Удалить базу данных - + Vacuum (%1) Операция VACUUM (%1) - + Autoincrement value for table '%1' has been reset successfully. - + Сброс счётчика автоинкремента у таблицы '%1' успешно выполнен. - + Are you sure you want to delete all data from table(s): %1? + Вы действительно хотите удалить все данные из таблицы (таблиц): '%1'? + + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + Невозможно открыть файл '%1' для чтения: %2 + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. @@ -2559,14 +2720,14 @@ All objects from this group will be moved to parent group. Вы действительно хотите удалить базу данных '%1'? - - + + Cannot import, because no import plugin is loaded. Невозможно произвести импорт, т.к. не загружено ни одного модуля импорта. - - + + Cannot export, because no export plugin is loaded. Невозможно произвести экспорт, т.к. не загружено ни одного модуля экспорта. @@ -2579,22 +2740,22 @@ All objects from this group will be moved to parent group. Выполнение команды VACUUM успешно завершено. - + Integrity check (%1) Проверка целостности (%1) - + Reset autoincrement Сброс счётчика автоинкремента - + Are you sure you want to reset autoincrement value for table '%1'? Вы действительно хотите сбросить счётчик автоинкремента у таблицы '%1'? - + An error occurred while trying to reset autoincrement value for table '%1': %2 При попытке сброса счётчика автоинкремента у таблицы '%1' произошла ошибка: %2 @@ -2607,37 +2768,37 @@ All objects from this group will be moved to parent group. Вы действительно хотите удалить все данные из таблицы '%1'? - + An error occurred while trying to delete data from table '%1': %2 При попытке удаления данных из таблицы '%1' произошла ошибка: %2 - + All data has been deleted for table '%1'. Из таблицы '%1' были удалены все данные. - + Following objects will be deleted: %1. Будут удалены следующие объекты: %1. - + Following databases will be removed from list: %1. Из списка будут удалены следующие базы данных: %1. - + Remainig objects from deleted group will be moved in place where the group used to be. Оставшиеся после удаления группы объекты будут перемещены туда, где ранее располагалась группа. - + %1<br><br>Are you sure you want to continue? %11<br><br>Вы действительно хотите продолжить? - + Delete objects Удалить объекты @@ -2731,76 +2892,76 @@ All objects from this group will be moved to parent group. Триггеры (%1): - + Copy Копировать - + Move Переместить - + Include data Включая данные - + Include indexes Включая индексы - + Include triggers Включая триггеры - + Abort Прервать - + Could not add dropped database file '%1' automatically. Manual setup is necessary. Невозможно автоматически добавить перетянутый файл базы данных '%1'. Необходима ручная настройка. - + Referenced tables Связанные таблицы - + Do you want to include following referenced tables as well: %1 Вы хотите также включить следующие связанные таблицы: %1 - + Name conflict Конфликт имён - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: Данный объект уже существует в целевой базе данных. Пожалуйста введите новое уникальное имя или нажмите %1 для прерывания операции: - + SQL statements conversion Конвертация конструкций SQL - + Following error occurred while converting SQL statements to the target SQLite version: При конвертации конструкций SQL в новую версию SQLite произошла ошибка: - + Would you like to ignore those errors and proceed? Вы хотите проигнорировать эти ошибки и продолжить? @@ -2856,132 +3017,138 @@ Please enter new, unique name, or press '%1' to abort the operation:Запрос - + History История - + Results in the separate tab Результаты в отдельной вкладке - + Results below the query Результаты под запросом - - + + SQL editor %1 Редактор SQL %1 - + Results Результаты - + Execute query Выполнить запрос - + Explain query План запроса - + Clear execution history sql editor Очистить историю запросов - + Export results sql editor Экспортировать результаты - + Create view from query sql editor Создать представление из запроса - + Previous database Предыдущая база данных - + Next database Следующая база данных - + Show next tab sql editor Открыть следующую вкладку - + Show previous tab sql editor Открыть предыдущую вкладку - + Focus results below sql editor Фокус на результатах внизу - + Focus SQL editor above sql editor Фокус на редакторе SQL сверху - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) Текущая база данных (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 Запрос выполнен за %1 секунд. Затронуто строк: %2 - + Query finished in %1 second(s). Запрос выполнен за %1 секунд. - + Clear execution history Очистка истории запросов - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. Вы действительно хотите удалить всю историю выполнения SQL запросов? Операцию невозможно отменить. - + Cannot export, because no export plugin is loaded. Невозможно произвести экспорт, т.к. не загружено ни одного модуля экспорта. - + No database selected in the SQL editor. Cannot create a view for unknown database. В редакторе SQL не выбрана база данных. Невозможно создать представление в неизвестной базе данных. - + Editor window "%1" has uncommitted data. - + В окне редактора "%1" имеются неподтверждённые данные. Editor window "%1" has uncommited data. @@ -3007,41 +3174,99 @@ Please enter new, unique name, or press '%1' to abort the operation: - ExportDialog + ExecFromFileDialog - - Export - Экспорт + + Execute SQL from file + - - What do you want to export? - Что вы хотите экспортировать? + + Input file + - - A database - Базу данных + + Path to file + - - A single table - Одну таблицу + + Browse for file + - - Query results - Результаты запроса + + Options + Опции - - Table to export - Экспортируемая таблица + + File encoding + - - Database - База данных + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + Скрипты SQL (*.sql);;Все файлы (*) + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + + + ExportDialog + + + Export + Экспорт + + + + What do you want to export? + Что вы хотите экспортировать? + + + + A database + Базу данных + + + + A single table + Одну таблицу + + + + Query results + Результаты запроса + + + + Table to export + Экспортируемая таблица + + + + Database + База данных @@ -3155,68 +3380,101 @@ Please enter new, unique name, or press '%1' to abort the operation:Опции формата экспорта - + Cancel Отмена - - - + + + Select database to export. Выберите базу данных для экспорта. - + Select table to export. Выберите таблицу для экспорта. - + Enter valid query to export. Введи корректный запрос для экспорта. - + Select at least one object to export. Выберите хотя бы один объект для экспорта. - + You must provide a file name to export to. Необходимо указать имя файла, в который будет произведён экспорт. - + Path you provided is an existing directory. You cannot overwrite it. Указанный путь является существующим каталогом. Его невозможно перезаписать. - + The directory '%1' does not exist. Каталог '%1' не существует. - + The file '%1' exists and will be overwritten. Файл '%1' существует и будет перезаписан. - + All files (*) Все файлы (*) - + Pick file to export to Выберите файл для экспорта - + Internal error during export. This is a bug. Please report it. Внутренняя ошибка во время экспорта. Пожалуйста, вышлите отчёт об этой ошибке. + + FileExecErrorsDialog + + + Execution errors + + + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + Ошибка + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + FontEdit @@ -3237,49 +3495,49 @@ Please enter new, unique name, or press '%1' to abort the operation: FormView - + Commit row form view Подтвердить строку - + Rollback row form view Откатить строку - + First row form view Первая строка - + Previous row form view Предыдущая строка - + Next row form view Следующая строка - + Last row form view Последняя строка - + Insert new row form view Вставить новую строку - + Delete current row form view Удалить текущую строку @@ -3338,13 +3596,13 @@ Please enter new, unique name, or press '%1' to abort the operation:Код инициализации: - + Function implementation code: Код реализации функции: - + Final step implementation code: Код реализации последнего шага: @@ -3442,7 +3700,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Functions editor window has uncommitted modifications. - + В окне редактора функций имеются неподтверждённые изменения. Functions editor window has uncommited modifications. @@ -3512,42 +3770,42 @@ Please enter new, unique name, or press '%1' to abort the operation:Опции источника данных - + Cancel Отмена - + If you type table name that doesn't exist, it will be created. Если вы введёте несуществующее имя таблицы, она будет создана. - + Enter the table name Введите имя таблицы - + Select import plugin. Выберите модуль импорта. - + You must provide a file to import from. Необходимо указать файл, из которого осуществляется импорт. - + The file '%1' does not exist. Файл '%1' не существует. - + Path you provided is a directory. A regular file is required. Указанный путь является каталогом. Необходимо указать файл. - + Pick file to import from Выберите файл для импорта @@ -3586,12 +3844,12 @@ Please enter new, unique name, or press '%1' to abort the operation:Столбец - + Collation Сравнение - + Sort Сортировка @@ -3771,273 +4029,406 @@ Please enter new, unique name, or press '%1' to abort the operation:Панель отображения - + Configuration widgets Виджеты конфигурации - + Syntax highlighting engines Движки синтаксической подсветки - + Data editors Редакторы данных - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. Отладочный режим. Нажмите %1 или воспользуйтесь пунктом меню 'Справка / Открыть отладочную консоль' для открытия отладочной консоли. - + Running in debug mode. Debug messages are printed to the standard output. Отладочный режим. Отладочные сообщения выводятся в стандартный выходной поток. - + You need to restart application to make the language change take effect. Для смены языка необходимо перезапустить приложение. - Open SQL editor - Открыть редактор SQL + Открыть редактор SQL - Open DDL history - Открыть историю DDL + Открыть историю DDL - Open SQL functions editor - Открыть редактор функций SQL + Открыть редактор функций SQL - Open collations editor - Открыть редактор сравнений + Открыть редактор сравнений - Import - Импорт + Импорт - Export - Экспорт + Экспорт - Open configuration dialog - Открыть диалог конфигурации + Открыть диалог конфигурации - Tile windows - Расположить окна плиткой + Расположить окна плиткой - Tile windows horizontally - Расположить окна по горизонтали + Расположить окна по горизонтали - Tile windows vertically - Расположить окна по вертикали + Расположить окна по вертикали - Cascade windows - Расположить окна каскадом + Расположить окна каскадом - + Next window Следующее окно - + Previous window Предыдущее окно - + Hide status field Скрыть окно статуса - Close selected window - Закрыть выбранное окно + Закрыть выбранное окно - Close all windows but selected - Закрыть все окна, кроме выбранного + Закрыть все окна, кроме выбранного - Close all windows - Закрыть все окна + Закрыть все окна - Restore recently closed window - Восстановить недавно закрытые окна + Восстановить недавно закрытые окна - Rename selected window - Переименовать выбранное окно + Переименовать выбранное окно - + Open Debug Console Открыть отладочную консоль - + Open CSS Console Открыть консоль CSS - Report a bug - Сообщить об ошибке + Сообщить об ошибке - Propose a new feature - Предложить новый функционал + Предложить новый функционал - About - О программе + О программе - Licenses - Лицензии + Лицензии - Open home page - Открыть домашнюю страницу + Открыть домашнюю страницу - Open forum page - Открыть страницу форума + Открыть страницу форума - User Manual - Руководство пользователя + Руководство пользователя - SQLite documentation - Документация по SQLite + Документация по SQLite - Report history - История отчётов + История отчётов - Check for updates - Проверить обновления + Проверить обновления - Database menubar - База данных + База данных - Structure menubar - Структура + Структура - View menubar - Вид + Вид - + Window list menubar view menu Окна - Tools menubar - Инструменты + Инструменты - Help - Справка + Справка + + + + Open SQL &editor + + + + + Open DDL &history + + + + + Open SQL &functions editor + + + + + Open &collations editor + + + + + Open ex&tension manager + + + + + &Import + + + + + E&xport + + + + + Open confi&guration dialog + + + + + &Tile windows + + + + + Tile windows &horizontally + - + + Tile windows &vertically + + + + + &Cascade windows + + + + + Close selected &window + + + + + Close all windows &but selected + + + + + Close &all windows + + + + + Re&store recently closed window + + + + + &Rename selected window + + + + + Report a &bug + + + + + Propose a new &feature + + + + + &About + + + + + &Licenses + + + + + Open home &page + + + + + Open fo&rum page + + + + + User &Manual + + + + + SQLite &documentation + + + + + Bugs and feature &requests + + + + + Check for &updates + + + + + &Database + menubar + + + + + &Structure + menubar + + + + + &View + menubar + + + + + &Tools + menubar + + + + + &Help + + + + Could not set style: %1 main window Невозможно применить стиль: %1 - + Cannot export, because no export plugin is loaded. Невозможно произвести экспорт, т.к. не загружено ни одного модуля экспорта. - + Cannot import, because no import plugin is loaded. Невозможно произвести импорт, т.к. не загружено ни одного модуля импорта. - + Rename window Переименовать окно - + Enter new name for the window: Введите новое имя для окна: - + New updates are available. <a href="%1">Click here for details</a>. Доступны обновления. <a href="%1">Нажмите здесь для подробностей</a>. - + You're running the most recent version. No updates are available. Установлена последняя версия. Обновлений нет. - + Database passed in command line parameters (%1) was already on the list under name: %2 База данных, переданная через аргументы командной строки (%1), уже находится в списке под именем %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 База данных, переданная через аргументы командной строки (%1), была временно добавлена в список под именем %2 - + Could not add database %1 to list. Невозможно добавить базу данных %1 в список. @@ -4051,7 +4442,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Uncommitted changes - + Неподтверждённые изменения @@ -4073,23 +4464,28 @@ Please enter new, unique name, or press '%1' to abort the operation:Значение Null - + Configure editors for this data type Настройте редакторы для этого типа данных - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. Модуль редактора данных '%1' не загружен, хотя указан для редактирования типа данных '%1' - + Deleted multieditor Удалено - + Read only multieditor Только для чтения @@ -4098,93 +4494,143 @@ Please enter new, unique name, or press '%1' to abort the operation: MultiEditorBool - Boolean - Логическое + Логическое + + + + MultiEditorBoolPlugin + + + Boolean + Логическое MultiEditorDate - Date - Дата + Дата + + + + MultiEditorDatePlugin + + + Date + Дата MultiEditorDateTime - Date & time - Дата и время + Дата и время + + + + MultiEditorDateTimePlugin + + + Date & time + Дата и время MultiEditorHex - Hex - Шестнадцатеричное + Шестнадцатеричное + + + + MultiEditorHexPlugin + + + Hex + Шестнадцатеричное MultiEditorNumeric - Number numeric multi editor tab name - Число + Число + + + + MultiEditorNumericPlugin + + + Number + numeric multi editor tab name + Число MultiEditorText - Text - Текст + Текст - + Tab changes focus Tab перемещает фокус - + Cut Вырезать - + Copy Копировать - + Paste Вставить - + Delete Удалить - + Undo Отменить - + Redo Повторить + + MultiEditorTextPlugin + + + Text + Текст + + MultiEditorTime - Time - Время + Время + + + + MultiEditorTimePlugin + + + Time + Время @@ -4259,37 +4705,40 @@ Please enter new, unique name, or press '%1' to abort the operation:Компонент - + + This application will be closed and the update installer will start to download and install all the updates. + + + Current version - Текущая версия + Текущая версия - + Update version Новая версия - + Check for updates on startup Проверять обновления при запуске - + Update to new version! Обновить до новой версии! - The update will be automatically downloaded and installed. This will also restart application at the end. - Обновление будет автоматически загружено и установлено. В конце процесса приложение будет перезапущено. + Обновление будет автоматически загружено и установлено. В конце процесса приложение будет перезапущено. - + Not now. Не сейчас. - + Don't install the update and close this window. Не устанавливать обновление и закрыть данное окно. @@ -4341,32 +4790,32 @@ Please enter new, unique name, or press '%1' to abort the operation:Заполнить - + Abort Прервать - + Configure Настроить - + Populating configuration for this column is invalid or incomplete. Настройка заполнения для данного столбца некорректна или незавершена. - + Select database with table to populate Выберите базу данных с таблицей для заполнения - + Select table to populate Выберите таблицу для заполнения - + You have to select at least one column. Необходимо выбрать хотя бы один столбец. @@ -4441,129 +4890,134 @@ Please enter new, unique name, or press '%1' to abort the operation:имя сравнения: %1 - + Data grid view Табличный вид данных - + Copy cell(s) contents to clipboard Копировать содержимое ячеек в буфер обмена - + + Copy cell(s) contents together with header to clipboard + + + + Paste cell(s) contents from clipboard Вставить содержимое ячеек из буфера обмена - + Set empty value to selected cell(s) Установить пустое значение для выбранных ячеек - + Set NULL value to selected cell(s) Установить для выбранных ячеек значение NULL - + Commit changes to cell(s) contents Подтвердить изменение содержимого ячеек - + Rollback changes to cell(s) contents Откатить изменения содержимого ячеек - + Delete selected data row Удалить выбранную строку данных - + Insert new data row Вставить новую строку данных - + Open contents of selected cell in a separate editor Открыть содержимое выбранной ячейки в отдельном редакторе - + Total pages available: %1 Всего доступно страниц: %1 - + Total rows loaded: %1 Всего загружено строк: %1 - + Data view (both grid and form) Окно данных (и табличный вид, и форма) - + Refresh data Обновить данные - + Switch to grid view of the data Переключиться с табличного вида на форму - + Switch to form view of the data Переключиться из формы на табличный вид - + Database list Список баз данных - + Delete selected item Удалить выбранный элемент - + Clear filter contents Сбросить содержимое фильтра - + Refresh schema Обновить структуру - + Refresh all schemas Обновить структуры всех баз данных - + Add database Добавить базу данных - + Select all items Выделить все элементы - + Copy selected item(s) Копировать выбранные элементы - + - + Paste from clipboard Вставить из буфера обмена @@ -4638,42 +5092,42 @@ Please enter new, unique name, or press '%1' to abort the operation:Удалить текущую строку - + Main window Главное окно - + Open SQL editor Открыть редактор SQL - + Previous window Предыдущее окно - + Next window Следующее окно - + Hide status area Скрыть область статуса - + Open configuration dialog Открыть диалог конфигурации - + Open Debug Console Открыть отладочную консоль - + Open CSS Console Открыть консоль CSS @@ -4684,111 +5138,111 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text Вырезать выбранный текст - + Copy selected text Копировать выбранный текст - + Delete selected text Удалить выбранный текст - + Undo Отменить - + Redo Повторить - + SQL editor input field Поле ввода редактора SQL - + Select whole editor contents Выбрать всё содержимое редактора - + Save contents into a file Сохранить содержимое в файл - + Load contents from a file Загрузить содержимое из файла - + Find in text Найти в тексте - + Find next Найти далее - + Find previous Найти предыдущее - + Replace in text Замена в тексте - + Delete current line Удалить текущую строчку - + Request code assistant Вызвать автодополнение - + Format contents Форматировать содержимое - + Move selected block of text one line down Переместить выбранный блок текста на строчку вниз - + Move selected block of text one line up Переместить выбранный блок текста на строчку вверх - + Copy selected block of text and paste it a line below Скопировать блок текста и вставить его строчкой ниже - + Copy selected block of text and paste it a line above Скопировать блок текста и вставить его строчкой выше - + Toggle comment Комментировать/раскомментировать @@ -4809,14 +5263,12 @@ Please enter new, unique name, or press '%1' to abort the operation:Файл баз данных - Reports history window - Окно истории отчётов + Окно истории отчётов - Delete selected entry - Удалить выбранную запись + Удалить выбранную запись @@ -4863,6 +5315,11 @@ Please enter new, unique name, or press '%1' to abort the operation:Move keyboard input focus to the SQL editor above Переместить фокус ввода в окно редактора SQL вверху + + + Delete selected SQL history entries + + Table window @@ -4988,7 +5445,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Uncommitted changes - + Неподтверждённые изменения @@ -5087,179 +5544,179 @@ find next SqlEditor - + Cut sql editor Вырезать - + Copy sql editor Копировать - + Paste sql editor Вставить - + Delete sql editor Удалить - + Select all sql editor Выделить всё - + Undo sql editor Отменить - + Redo sql editor Повторить - + Complete sql editor Завершить - + Format SQL sql editor Форматировать SQL - + Save SQL to file sql editor Сохранить SQL в файл - + Select file to save SQL sql editor Выбрать файл для сохранения SQL - + Load SQL from file sql editor Загрузить SQL из файла - + Delete line sql editor Удалить строчку - + Move block down sql editor Переместить блок вниз - + Move block up sql editor Переместить блок вверх - + Copy block down sql editor Копировать блок вниз - + Copy up down sql editor Копировать блок вверх - + Find sql editor Найти - + Find next sql editor Найти далее - + Find previous sql editor Найти предыдущее - + Replace sql editor Заменить - + Toggle comment sql editor Комментировать/раскомментировать - + Saved SQL contents to file: %1 SQL-код сохранён в файле %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. Дополнение синтаксиса может быть использовано только после назначения корректной базы данных редактору SQL. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. Размер содержимого редактора SQL слишком велико, поэтому обнаружение ошибок и подсветка существующих объектов временно отключена. - + Save to file Сохранить в файл - + Could not open file '%1' for writing: %2 Невозможно открыть файл '%1' для записи: %2 - + SQL scripts (*.sql);;All files (*) Скрипты SQL (*.sql);;Все файлы (*) - + Open file Открыть файл - + Could not open file '%1' for reading: %2 Невозможно открыть файл '%1' для чтения: %2 - + Reached the end of document. Hit the find again to restart the search. Достигнут конец документа. Нажмите Найти снова для перезапуска поиска. @@ -5315,24 +5772,24 @@ find next - - + + Cannot edit this cell. Details: %1 - Невозможно редактировать данную ячейку. Подробности: %1 + Невозможно редактировать данную ячейку. Подробности: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Структура этой таблицы изменилась с момента последней загрузки данных. Перезагрузите данные для продолжения. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Редактирование значений большой длины непосредственно в табличном режиме не рекомендуется. Возможны проблемы с производительностью и удобством работы. Для работы с такими большими значениями рекомендуется использовать режим формы либо отдельное окно редактирования значения (доступно в контекстном меню по щелчку правой кнопкой мыши). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. Внешний ключ для столбца %2 имеет более чем %1 возможных значений. Это слишком много для отображения в выпадающем списке. Вам необходимо ввести значение вручную. @@ -5340,8 +5797,8 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. Одновременно может быть выполнен только один запрос. @@ -5354,12 +5811,12 @@ find next Имеются неподтверждённые изменения данных. Вы действительно хотите продолжить? Все неподтверждённые изменения будут утеряны. - + Cannot commit the data for a cell that refers to the already closed database. Невозможно подтвердить данные для ячейки, которая ссылается на уже закрытую базу данных. - + Could not begin transaction on the database. Details: %1 Невозможно начать транзакцию в базе данных. Подробности: %1 @@ -5368,12 +5825,12 @@ find next При завершении транзакции возникла ошибка: %1 - + An error occurred while rolling back the transaction: %1 При отмене транзакции возникла ошибка: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Попытка подтверждения данных для нередактируемой ячейки (которая тем не менее была изменена и ожидает подтверждения). Это программная ошибка. Пожалуйста, отправьте о ней отчёт. @@ -5382,43 +5839,48 @@ find next При подтверждении данных произошла ошибка: %1 - + Uncommitted data - + Неподтверждённые данные - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + Имеются неподтверждённые изменения данных. Вы действительно хотите продолжить? Все неподтверждённые изменения будут утеряны. - + An error occurred while committing the transaction: %1 - + При завершении транзакции возникла ошибка: %1 - + An error occurred while committing the data: %1 + При подтверждении данных произошла ошибка: %1 + + + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. - - + + Error while executing SQL query on database '%1': %2 Ошибка при выполнении SQL запроса к базе данных '%1': %2 - + Error while loading query results: %1 Ошибка при загрузке результатов запроса: %1 - + Insert multiple rows Вставить несколько строк - + Number of rows to insert: Количество вставляемых строк: @@ -5426,117 +5888,137 @@ find next SqlQueryView - + Go to referenced row in... Перейти к связанной строке в... - + Copy Копировать - + Copy as... Копировать как... - + Paste Вставить - + Paste as... Вставить как... - + Set NULL values Установить значения на NULL - + Erase values Стереть содержимое - + Edit value in editor Править содержимое в редакторе - + Commit Подтвердить - + + Copy with headers + + + + Rollback Откатить - + Commit selected cells Подтвердить выбранные ячейки - + Rollback selected cells Откатить выбранные ячейки - + Define columns to sort by Определить столбцы для сортировки - + Remove custom sorting Сбросить указанную сортировку - + Insert row Вставить строку - + Insert multiple rows Вставить несколько строк - + Delete selected row Удалить выбранную строку - + + Show value in a viewer + + + + Generate query for selected cells Сгенерировать запрос для выбранных ячеек - + No items selected to paste clipboard contents to. Не выбраны элементы для вставки в них содержимого буфера обмена. - + Go to referenced row in table '%1' Перейти к связанной строке в таблице '%1' - + table '%1' таблица '%1' - + Referenced row (%1) Связанная строка (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value Править содержимое @@ -5550,7 +6032,7 @@ find next Error while committing new row: %1 - + Ошибка при подтверждении новой строки: %1 @@ -5558,6 +6040,119 @@ find next Ошибка при удалении строки из таблицы %1: %2 + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + Базы данных + + + + Register in all databases + Зарегистрировать во всех базах данных + + + + Register in following databases: + Зарегистрировать в следующих базах данных: + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + Все файлы (*) + + + + Open file + Открыть файл + + StatusField @@ -5667,7 +6262,7 @@ but it's okay to use them anyway. Введите имя ограничения. - + Foreign column table constraints Внешний столбец @@ -5721,24 +6316,24 @@ but it's okay to use them anyway. При конфликте - + Collate table constraints Сравнение - + Sort order table constraints Порядок сортировки - + Select at least one column. Выберите хотя бы один столбец. - + Enter a name of the constraint. Введите имя ограничения. @@ -6078,43 +6673,44 @@ Would you like to proceed? Committed changes for table '%1' successfully. - + Изменения в таблицу '%1' внесены успешно. Committed changes for table '%1' (named before '%2') successfully. - + Изменения в таблицу '%1' (предыдущее название '%2') внесены успешно. Autoincrement value for table '%1' has been reset successfully. - + Сброс счётчика автоинкремента у таблицы '%1' успешно выполнен. Uncommitted changes - + Неподтверждённые изменения There are uncommitted structure modifications. You cannot browse or edit data until you have table structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Имеются неподтверждённые изменения структуры. Невозможно просматривать или редактировать данные, пока структура таблицы не подтверждена. +Подтвердить структуру таблицы или вернуться на вкладку структуры? Table window "%1" has uncommitted structure modifications and data. - + В окне таблицы "%1" имеются неподтверждённые изменения структуры и данных. Table window "%1" has uncommitted data. - + В окне таблицы "%1" имеются неподтверждённые изменения данных. Table window "%1" has uncommitted structure modifications. - + В окне таблицы "%1" имеются неподтверждённые изменения структуры. Could not restore window, because database %1 could not be resolved. @@ -6308,12 +6904,12 @@ Do you want to commit the structure, or do you want to go back to the structure Select all - + Выделить всё Deselect all - Снять выделение + Снять выделение @@ -6336,7 +6932,7 @@ Do you want to commit the structure, or do you want to go back to the structure - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> <p>SQL-условие для проверки перед запуском кода триггера. Если условие не выполнено, для текущей строки триггер вызван не будет.</p> @@ -6381,7 +6977,7 @@ Do you want to commit the structure, or do you want to go back to the structure Выполняемые конструкции триггера. - + DDL DDL @@ -6460,18 +7056,18 @@ Do you want to commit the structure, or do you want to go back to the structure Отображаемые имена столбцов - - + + Data Данные - + Triggers Триггеры - + DDL DDL @@ -6515,122 +7111,123 @@ Do you want to commit the structure, or do you want to go back to the structure Новое представление %1 - + Refresh the view view window Обновить представление - + Commit the view changes view window Подтвердить изменения представления - + Rollback the view changes view window Откатить изменения представления - + Explicit column names Явные имена столбцов - + Generate output column names automatically basing on result columns of the view. Сгенерировать отображаемые имена столбцов на основе результирующих столбцов представления. - + Add column view window Добавить столбец - + Edit column view window Редактировать столбец - + Delete column view window Удалить столбец - + Move column up view window Переместить столбец вверх - + Move column down view window Переместить столбец вниз - + Refresh trigger list view window Обновить список триггеров - + Create new trigger view window Создать новый триггер - + Edit selected trigger view window Редактировать выбранный триггер - + Delete selected trigger view window Удалить выбранный триггер - + View window "%1" has uncommitted structure modifications and data. - + В окне представления "%1" имеются неподтверждённые изменения структуры и данных. - + View window "%1" has uncommitted data. - + В окне представления "%1" имеются неподтверждённые изменения данных. - + View window "%1" has uncommitted structure modifications. - + В окне представления "%1" имеются неподтверждённые изменения структуры. - + Uncommitted changes - + Неподтверждённые изменения - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Имеются неподтверждённые изменения структуры. Невозможно просматривать или редактировать данные, пока структура представления не подтверждена. +Подтвердить структуру представления или вернуться на вкладку структуры? - + Committed changes for view '%1' successfully. - + Изменения в представление '%1' внесены успешно. - + Committed changes for view '%1' (named before '%2') successfully. - + Изменения в таблицу '%1' (предыдущее название '%2') внесены успешно. View window "%1" has uncommited structure modifications and data. @@ -6645,7 +7242,7 @@ Do you want to commit the structure, or do you want to go back to the structure В окне представления "%1" имеются неподтверждённые изменения структуры. - + Could not load data for view %1. Error details: %2 Невозможно загрузить данные представления %1. Подробности ошибки: %2 @@ -6660,12 +7257,12 @@ Do you want to commit the structure, or do you want to go back to the structure Подтвердить структуру представления или вернуться на вкладку структуры? - + Go back to structure tab Вернуться на вкладку структуры - + Commit modifications and browse data. Подтвердить изменения и перейти к данным. @@ -6678,86 +7275,86 @@ Do you want to commit the structure, or do you want to go back to the structure Изменения в представление '%1' (предыдущее название '%2') внесены успешно. - + Could not commit view changes. Error message: %1 view window Невозможно подтвердить изменения представления. Сообщение об ошибке: %1 - + Override columns Перезапись столбцов - + Currently defined columns will be overriden. Do you want to continue? Заданные столбцы будут перезаписаны. Вы хотите продолжить? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. Невозможно определить столбцы, возвращаемые представлением. Вероятно запрос неполон или содержит ошибки. - + Name view window triggers Имя - + Instead of view window triggers Вместо - + Condition view window triggers Условие - + Details table window triggers Подробности - + Could not process the %1 view correctly. Unable to open a view window. Не удалось корректно обработать представление %1. Невозможно открыть окно представления. - + Empty name Пустое имя - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? SQLite позволяет представлению иметь пустое имя, хотя это не рекомендуется. Вы действительно хотите создать представление с пустым именем? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 Невозможно проанализировать структуру конструкции SELECT. Пожалуйста, исправьте запрос и повторите попытку. Подробности: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! Невозможно изменить представление из-за внутренней ошибки SQLiteStudio. Пожалуйста, сообщите о ней! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. Невозможно корректно проанализировать структуру представления для выполнения. Это ошибка SQLiteStudio. Пожалуйста, сообщите о ней. - + Following problems will take place while modifying the view. Would you like to proceed? view window @@ -6765,7 +7362,7 @@ Would you like to proceed? Вы хотите продолжить? - + View modification view window Изменение представления diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm index 6490cf2..c3c6d5f 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts index 8703dc7..aeb372d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts @@ -14,9 +14,8 @@ O programe - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Slobodný, open-source, multi-platformový SQLite databázový manažér.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor a aktívny správca:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Slobodný, open-source, multi-platformový SQLite databázový manažér.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor a aktívny správca:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> @@ -58,6 +57,11 @@ Configuration directory Adresár s konfiguráciou + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + + Qt version: @@ -89,262 +93,222 @@ <h3>Tabuľka obsahu:</h3><ol>%2</ol> + + BindParamsDialog + + + Query parameters + + + + + Please provide values for query parameters + + + BugDialog - Bugs and ideas - Chyby a nápady + Chyby a nápady - Reporter - Reportér + Reportér - E-mail address - emailová adresa + emailová adresa - - Log in - Prihlásenie + Prihlásenie - Short description - Krátky popis + Krátky popis - Detailed description - Detailný popis + Detailný popis - Show more details - Zobraziť viacej detailov + Zobraziť viacej detailov - SQLiteStudio version - Verzia SQLiteStudio + Verzia SQLiteStudio - Operating system - Operačný systém + Operačný systém - Loaded plugins - Načítané pluginy + Načítané pluginy - Send - Odoslať + Odoslať - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - Všetky svoje nahlásené chyby a nápady môžte vidieť výberom '%1' a následne '%2'. + Všetky svoje nahlásené chyby a nápady môžte vidieť výberom '%1' a následne '%2'. - A bug report sent successfully. - Správa o chybe bola úspešne odoslaná. + Správa o chybe bola úspešne odoslaná. - An error occurred while sending a bug report: %1 %2 - Vyskytol sa problém pri posielaní správy o chybe: %1 + Vyskytol sa problém pri posielaní správy o chybe: %1 %2 - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - Môžte zopakovať odoslanie. Keď otvoríte nahlasovacie okno po takejto chybe, obsah bude obnovený. + Môžte zopakovať odoslanie. Keď otvoríte nahlasovacie okno po takejto chybe, obsah bude obnovený. - An idea proposal sent successfully. - Nahlásenie prebehlo úspešne. + Nahlásenie prebehlo úspešne. - An error occurred while sending an idea proposal: %1 %2 - Vyskytla sa chyba pri odoslieaní: %1 + Vyskytla sa chyba pri odoslieaní: %1 %2 - A bug report - Nahlásenie chyby + Nahlásenie chyby - Describe problem in few words - Popíšte problém niekoľkými slovami + Popíšte problém niekoľkými slovami - Describe problem and how to reproduce it - Popíšte problém a spôsob ako ho reprodukovať + Popíšte problém a spôsob ako ho reprodukovať - A new feature idea - Nová funkcia + Nová funkcia - A title for your idea - Titulok novej funkcie + Titulok novej funkcie - Describe your idea in more details - Detailnejšie popíšte svoj návrh na funkciu + Detailnejšie popíšte svoj návrh na funkciu - Reporting as an unregistered user, using e-mail address. - Nahlásenie ako neregistrovaný používateľ pomocou emailovej adresy. + Nahlásenie ako neregistrovaný používateľ pomocou emailovej adresy. - Reporting as a registered user. - Nahlásenie ako registrovaný používateľ. + Nahlásenie ako registrovaný používateľ. - Log out - Odhlásiť sa + Odhlásiť sa - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - Zadaním reálnej emailovej adresy umožníte kontaktovať vás ohľadom vášho nahlásenia. Pre zistenie bližších detailov, kliknite na tlačitko 'i' na pravej strane okna. + Zadaním reálnej emailovej adresy umožníte kontaktovať vás ohľadom vášho nahlásenia. Pre zistenie bližších detailov, kliknite na tlačitko 'i' na pravej strane okna. - Enter vaild e-mail address, or log in. - Zadajte platný email alebo sa prihláste. + Zadajte platný email alebo sa prihláste. - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - Krátky popis by mal obsahovať minimálne 10 znakov ale nie viacej ako 100. Dlhší popis môžte zadať v poli nižšie. + Krátky popis by mal obsahovať minimálne 10 znakov ale nie viacej ako 100. Dlhší popis môžte zadať v poli nižšie. - Long description requires at least 30 characters. - Dlhší popis by mal obsahovať minimálne 30 znakov. + Dlhší popis by mal obsahovať minimálne 30 znakov. BugReportHistoryWindow - - Title - Titulok + Titulok - - Reported at - Nahlásené + Nahlásené - - URL - URL + URL - Reports history - História hlásení + História hlásení - Clear reports history - Vymazať históriu hlásení + Vymazať históriu hlásení - Delete selected entry - Vymazať vybranú položku + Vymazať vybranú položku - Invalid response from server. - Neplatná odpoveď zo servera. + Neplatná odpoveď zo servera. BugReportLoginDialog - Log in - Prihlásenie + Prihlásenie - Credentials - Prihlasovacie údaje + Prihlasovacie údaje - Login: - Meno: + Meno: - Password: - Heslo: + Heslo: - Validation - Overenie + Overenie - Validate - Overiť + Overiť - Validation result message - Výsledok overenia + Výsledok overenia - Abort - Zrušiť + Zrušiť - A login must be at least 2 characters long. - meno musí mať dĺžku minimálne 2 znaky. + meno musí mať dĺžku minimálne 2 znaky. - A password must be at least 5 characters long. - Heslo musí mať dĺžku minimálne 5 znakov. + Heslo musí mať dĺžku minimálne 5 znakov. - Valid - Úspešné overenie + Úspešné overenie @@ -355,12 +319,12 @@ Filtrovať porovnávania - + Collation name: Názov porovnánavania: - + Implementation language: Implementačný jazyk: @@ -489,11 +453,16 @@ - Invalid default value expression: %1 + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. - + Enter a name of the constraint. Zadajte názov obmedzenia. @@ -605,7 +574,7 @@ - + Delete constraint column dialog Vymazať obmedzenie @@ -665,34 +634,44 @@ - + Are you sure you want to delete constraint '%1'? column dialog Ste si istý, že chcete vymazať obmedzenie '%1'? - + Correct the constraint's configuration. - + This constraint is not officially supported by SQLite 2, but it's okay to use it. - + Scale is not allowed for INTEGER PRIMARY KEY columns. - + Precision cannot be defined without the scale. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. @@ -794,10 +773,9 @@ but it's okay to use it. Zadajte názov obmedzenia. - Autoincrement (only for %1 type columns) column primary key - Autoinkrement (iba pre stĺpec typu %1) + Autoinkrement (iba pre stĺpec typu %1) @@ -909,7 +887,7 @@ but it's okay to use it. ConfigDialog - + Configuration Konfigurácia @@ -999,128 +977,139 @@ but it's okay to use it. Prezeranie a úprava dát - + Number of data rows per page: Počet data riadkov na stranu: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> - + Limit initial data column width to (in pixels): - + Keep NULL value when entering empty value - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> - + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + + + Number of memorized table populating configurations + + + + Show column and row details tooltip in data view - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value - + Inserting new row in data grid - + Before currently selected row - + After currently selected row - + At the end of data view - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> - + Place data tab as first tab in a Table Window - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> - + Place data tab as first tab in a View Window - + Data types Datové typy - + Available editors: Dostupné editory: - + Editors selected for this data type: - + Schema editing Úprava schémy - + Number of DDL changes kept in history. Počet DDL zmien uchovávaných v histórii. - + DDL history size: Veľkosť DDL histórie: @@ -1129,104 +1118,104 @@ but it's okay to use it. Nezobrazovať náhľad DDL pri potvrdzovaní zmien v schéme - + SQL queries SQL dotazy - - + + Number of queries kept in the history. Počet dotazov uchovávaných v histórii. - + History size: Veľkosť SQL histórie: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>Ak je v SQL editore viacej ako jeden dotaz, potom(ak je táto voľba zapnutá) bude vykonaný iba jeden dotaz - ten, na ktorom je kurzor. Ináč budú vykonané všetky dotazy. Vždy si viete vybrať ktoré dotazy budú vykonané a to ich výberom\označením.</p> - + Execute only the query under the cursor Vykonať len dotaz, na ktorom stojí kurzor - + Updates Aktualizácie - + Automatically check for updates at startup Kontrolovať aktualizácie pri štarte - + Session Sedenie - + Restore last session (active MDI windows) after startup Obnoviť posledné sedenie (aktívne okná) pri štarte - + Status Field - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> - + Always open Status panel when new message is printed - + Filter shortcuts by name or key combination Filtrovať podľa názvu alebo klávesovej skratky - + Action Akcia - + Key combination Klávesová skratka - - + + Language Jazyk - + Changing language requires application restart to take effect. Je potrebné reštartovať aplikáciu aby sa zmena jazyka prejavila. - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout @@ -1302,7 +1291,7 @@ but it's okay to use it. Zobraziť systémové tabuľky a indexy v zozname - + Table windows Okná tabuľky @@ -1311,12 +1300,12 @@ but it's okay to use it. Ak je táto možnosť zaškrtnutá, tak sa v okne zobrazia dáta a nie štruktúra tabuľky. - + Open Table Windows with the data tab for start Zobraziť dáta po otvorení tabuľky - + View windows Okná pohľadov @@ -1325,182 +1314,193 @@ but it's okay to use it. Ak je táto možnosť zaškrtnutá, tak sa v okne zobrazia dáta a nie SQL dotaz. - + Open View Windows with the data tab for start Zobraziť dáta po otvorení pohľadu - + Don't show DDL preview dialog when committing schema changes - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters + + + + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins Nezobrazovať interné pluginy - + Current style: Aktuálny štýl: - + Preview Náhľad - + Enabled Zapnutý - + Disabled Vypnutý - + Active formatter plugin Aktívny formátovací plugin - + SQL editor font Písmo SQL editora - + Database list font Font zoznamu databáz - + Database list additional label font Font doplnkového popisku - + Data view font Font dát - + Status field font Font status okna - + SQL editor colors Farby SQL editora - + Current line background - + <p>SQL strings are enclosed with single quote characters.</p> - + String foreground - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground Farba BLOB hodnoty - + Regular foreground - + Line numbers area background - + Keyword foreground - + Number foreground - + Comment foreground - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors Farby dát - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + Uncommitted data outline color - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> @@ -1517,140 +1517,140 @@ but it's okay to use it. <p>V prípade chyby pri potvrdzovaní zmien dát, budú problematické bunky ohraničené touto farbou.</p> - + Commit error outline color Farba rámčeka s chybou potvrdenia dát - + NULL value foreground Farba NULL hodnoty - + Deleted row background Pozadie vymazaného riadka - + Database list colors Farby zoznamu databáz - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground Farba doplnkového popisku - + Status field colors Farby status okna - + Information message foreground Farba informačnej správy - + Warning message foreground Farba upozornenia - + Error message foreground Farba chybovej správy - + Description: plugin details Popis: - + Category: plugin details Kategória: - + Version: plugin details Verzia: - + Author: plugin details Autor: - + Internal name: plugin details Interný názov: - + Dependencies: plugin details Závislosti: - + Conflicts: plugin details Konflikty: - + Plugin details Detaily pluginu - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. Pluginy sú načítané/uvoľnené okamžite pri zaškrtnutí/odškrtnutí ale midifikovaný zoznam pluginov načítaných pri štarte nieje uložený až kým nepotvrdíte celý konfiguračný dialóg. - + %1 (built-in) plugins manager in configuration dialog %1 (interný) - + Details Detaily - + No plugins in this category. - + Add new data type Pridať nový datový typ - + Rename selected data type Premenovať vybraný datový typ - + Delete selected data type Vymazať vybraný datový typ - + Help for configuring data type editors @@ -1802,138 +1802,154 @@ but it's okay to use it. DataView - + Filter data data view Filtrovať - + Grid view Tabuľkové zobrazenie - + Form view Formulárové zobrazenie - + Refresh table data data view Obnoviť dáta v tabuľke - + First page data view Prvá strana - + Previous page data view Predchádzajúca strana - + Next page data view Nasledujúca strana - + Last page data view Posledná strana - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view Aplikovať filter - + Commit changes for selected cells data view Potvrdiť zmeny pre vybrané bunky - + Rollback changes for selected cells data view Vrátiť späť zmeny pre vybrané bunky - + Show grid view of results sql editor Výsledky zobraziť v tabuľke - + Show form view of results sql editor Výsledky zobraziť vo formulári - + Filter by text data view Filtrovať pomocou textu - + Filter by the Regular Expression data view Filtrovať pomocou regulárneho výrazu - + Filter by SQL expression data view Filtrovať pomocou SQL výrazu - + Tabs on top data view Záložky hore - + Tabs at bottom data view Záložky dole - + Place new rows above selected row data view - + Place new rows below selected row data view - + Place new rows at the end of the data view data view - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. Spočítava sa celkový počet riadkov. Prezeranie ďalších strán bude možné až po dokončení spočítavania. - + Row: %1 Riadok:%1 @@ -2140,7 +2156,7 @@ Prezeranie ďalších strán bude možné až po dokončení spočítavania. - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> @@ -2255,286 +2271,423 @@ Prezeranie ďalších strán bude možné až po dokončení spočítavania.Filtrovať podľa názvu - + Copy Kopírovať - + Paste Vložiť - + Select all Vybrať všetko - + Create a group Vytvoriť skupinu - + Delete the group Vymazať skupinu - + Rename the group Premenovať skupinu - Add a database - Pridať databázu + Pridať databázu - Edit the database - Upraviť databázu + Upraviť databázu - Remove the database - Odstrániť databázu + Odstrániť databázu - Connect to the database - Pripojiť sa k databáze + Pripojiť sa k databáze - Disconnect from the database - Odpojiť sa od databázy + Odpojiť sa od databázy - + Import Importovať - Export the database - Exportovať databázu + Exportovať databázu - Convert database type - Konvertovať databázu + Konvertovať databázu - Vacuum - Vacuum + Vacuum - Integrity check - Kontrola integrity + Kontrola integrity - Create a table - Vytvoriť tabuľku + Vytvoriť tabuľku - Edit the table - Upraviť tabuľku + Upraviť tabuľku - Delete the table - Vymazať tabuľku + Vymazať tabuľku - + Export the table Exportovať tabuľku - + Import into the table Importovať do tabuľky - + Populate table Naplniť tabuľku - + Create similar table Vytvoriť rovnakú tabuľku - + Reset autoincrement sequence Resetovať sekvenciu autoinkrementu - Create an index - Vytvoriť index + Vytvoriť index - Edit the index - Upraviť index + Upraviť index - Delete the index - Vymazať index + Vymazať index - Create a trigger - Vytvoriť spúšťač + Vytvoriť spúšťač - Edit the trigger - Upraviť spúšťač + Upraviť spúšťač - Delete the trigger - Vymazať spúšťač + Vymazať spúšťač - Create a view - Vytvoriť pohľad + Vytvoriť pohľad - Edit the view - Upraviť pohľad + Upraviť pohľad - Delete the view - Vymazať pohľad + Vymazať pohľad - + Add a column Pridať stĺpec - + Edit the column Upraviť stĺpec - + Delete the column Vymazať stĺpec - + Delete selected items Vymazať vybrané položky - + Clear filter Zrušiť filter - Refresh all database schemas - Obnoviť všetky databázové schémy + Obnoviť všetky databázové schémy - Refresh selected database schema - Obnoviť vybranú databázovú schému + Obnoviť vybranú databázovú schému + + + + Execution from file cancelled. Any queries executed so far have been rolled back. + + + + + &Add a database + + + + + &Edit the database + + + + + &Remove the database + + + + + &Connect to the database + - + &Disconnect from the database + + + + + &Export the database + + + + + Con&vert database type + + + + + Vac&uum + + + + + &Integrity check + + + + + Create a &table + + + + + Edit the t&able + + + + + Delete the ta&ble + + + + + Create an &index + + + + + Edit the i&ndex + + + + + Delete the in&dex + + + + + Create a trig&ger + + + + + Edit the trigg&er + + + + + Delete the trigge&r + + + + + Create a &view + + + + + Edit the v&iew + + + + + Delete the vi&ew + + + + + &Refresh all database schemas + + + + + Re&fresh selected database schema + + + + + Erase table data Vymazať dáta z tabuľky - - + + Open file's directory + + + + + Execute SQL from file + + + + + Database Databáza - + Grouping Zoskupovanie - + Generate query for table - - + + Create group Vytvoriť skupinu - + Group name Názov skupiny - + Entry with name %1 already exists in group %2. Položka s názvom %1 už existuje v skupine %2. - + Delete group Vymazať skupinu - + Are you sure you want to delete group %1? All objects from this group will be moved to parent group. Ste si istý, že chcete vymazať skupinu %1? Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny. - + Are you sure you want to remove database '%1' from the list? - + Are you sure you want to remove following databases from the list: %1 - + Remove database - + Vacuum (%1) - + Autoincrement value for table '%1' has been reset successfully. - + Are you sure you want to delete all data from table(s): %1? + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + Nemôžem otvoriť súbor '%1' na čítanie: %2 + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + Delete database Odstrániť databázu @@ -2544,14 +2697,14 @@ Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny.Ste si istý, že chcete odstrániť databázu '%1'? - - + + Cannot import, because no import plugin is loaded. Nemôžem importovať, lebo nebol načítaný žiaden plugin na import. - - + + Cannot export, because no export plugin is loaded. Nemôžem exportovať, lebo nebol načítaný žiaden plugin na export. @@ -2564,22 +2717,22 @@ Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny.VACUUM úspešne skončilo. - + Integrity check (%1) Kontrola integrity (%1) - + Reset autoincrement Resetovať autoinkrement - + Are you sure you want to reset autoincrement value for table '%1'? Ste si istý, že chcete zresetovať hodnotu autoinkrementu pre tabuľku %1 ? - + An error occurred while trying to reset autoincrement value for table '%1': %2 Vyskytla sa chyba pri pokuse o zresetovanie hodnoty autoinkrementu pre tebuľku '%1': %2 @@ -2588,37 +2741,37 @@ Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny.Ste si istý, že chcete vymazať všetky dáta z tabuľky '%1'? - + An error occurred while trying to delete data from table '%1': %2 Vyskytla sa chyba pri pokuse vymazať dáta z tabuľky '%1': %2 - + All data has been deleted for table '%1'. Všetky dáta z tabuľky '%1' boli vymazané. - + Following objects will be deleted: %1. Nasledujúce objekty budú odstránené: %1. - + Following databases will be removed from list: %1. Nasledujúce databázy budú odstránené zo zoznamu: %1. - + Remainig objects from deleted group will be moved in place where the group used to be. - + %1<br><br>Are you sure you want to continue? %1<br><br>Ste si istý, že chcete pokračovať? - + Delete objects Odstránenie objektov @@ -2712,74 +2865,74 @@ Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny.Spúšťače (%1): - + Copy Kopírovať - + Move - + Include data - + Include indexes - + Include triggers - + Abort Zrušiť - + Could not add dropped database file '%1' automatically. Manual setup is necessary. - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2833,130 +2986,136 @@ Please enter new, unique name, or press '%1' to abort the operation:Dotaz - + History História - + Results in the separate tab Výsledky zobraziť v samostatnej záložke - + Results below the query Výsledky zobraziť pod dotaz - - + + SQL editor %1 SQL editor %1 - + Results Výsledky - + Execute query Vykonať dotaz - + Explain query Vysvetliť dotaz - + Clear execution history sql editor Vymazať históriu dotazov - + Export results sql editor Vyexportovať výsledky - + Create view from query sql editor Vytvoriť pohľad z dotazu - + Previous database Predchádzajúca databáza - + Next database Nasledujúca databáza - + Show next tab sql editor Zobraziť nasledujúcu záložku - + Show previous tab sql editor Zobraziť predchádzajúcu záložku - + Focus results below sql editor - + Focus SQL editor above sql editor - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) Aktívna databáza (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 Dotaz trval %1 sekúnd. Počet dotknutých riadkov: %2 - + Query finished in %1 second(s). Dotaz trval %1 sekúnd. - + Clear execution history Vymazať históriu dotazov - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. Ste si istý, že chete vymazať celú históriu SQL dotazov? Túto operáciu nieje možné vrátiť späť. - + Cannot export, because no export plugin is loaded. Nemôžem exportovať, lebo nebol načítaný žiaden plugin na export. - + No database selected in the SQL editor. Cannot create a view for unknown database. Nebola vybraná žiadna databáza v SQL editore. Nemôžem vytvoriť view pre neznámu databázu. - + Editor window "%1" has uncommitted data. @@ -2983,6 +3142,64 @@ Please enter new, unique name, or press '%1' to abort the operation: + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + Voľby + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + ExportDialog @@ -3132,78 +3349,111 @@ Please enter new, unique name, or press '%1' to abort the operation:Možnosti formátu exportu - + Cancel Zrušiť - - - + + + Select database to export. Vyberte databázu, ktorú chcete exportovať. - + Select table to export. Vyberte tabuľku, ktorú chcete exportovať. - + Enter valid query to export. Zadajte platný dotaz pre export. - + Select at least one object to export. Vyberte aspoň jeden objekt pre export. - + You must provide a file name to export to. Musíte zadať názov súboru, do ktorého sa budú exportovať dáta. - + Path you provided is an existing directory. You cannot overwrite it. Cesta, ktorú ste zadali je existujúci adresár. Nemôžte ho prepísať. - + The directory '%1' does not exist. Adresár %1 neexistuje. - + The file '%1' exists and will be overwritten. Súbor %1 už existuje a bude prepísaný. - + All files (*) Všetky súbory (*) - + Pick file to export to Výber súboru do ktorého sa budú exportovať dáta - + Internal error during export. This is a bug. Please report it. Počas exportu sa vyskytla interná chyba. Toto je chyba v programe. Prosím nahláste ju. - FontEdit + FileExecErrorsDialog - - Choose font - font configuration + + Execution errors - - + + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + Chyba + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + + + FontEdit + + + Choose font + font configuration + + + + Form @@ -3214,49 +3464,49 @@ Please enter new, unique name, or press '%1' to abort the operation: FormView - + Commit row form view Potvrdiť riadok - + Rollback row form view Vrátiť späť riadok - + First row form view Prvý riadok - + Previous row form view Predchádzajúci riadok - + Next row form view Nasledujúci riadok - + Last row form view Posledný riadok - + Insert new row form view Vložiť nový riadok - + Delete current row form view Vymazať aktuálny riadok @@ -3315,13 +3565,13 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Function implementation code: - + Final step implementation code: @@ -3485,42 +3735,42 @@ Please enter new, unique name, or press '%1' to abort the operation:Nastavenia dátového zdroja - + Cancel Zrušiť - + If you type table name that doesn't exist, it will be created. Ak zadáte názov neexistujúcej tabuľky, tak bude vytvorená. - + Enter the table name Zadajte názov tabuľky - + Select import plugin. Vyberte importný plugin. - + You must provide a file to import from. Musíte zadať súbor, z ktorého sa budú importovať dáta. - + The file '%1' does not exist. Súbor %1 neexistuje. - + Path you provided is a directory. A regular file is required. Cesta, ktorú ste zadali je adresár. Prosím zadajte celú cestu. - + Pick file to import from Výber súboru, z ktorého sa budú importovať dáta @@ -3559,12 +3809,12 @@ Please enter new, unique name, or press '%1' to abort the operation:Stĺpec - + Collation Porovnávanie - + Sort Zoradiť @@ -3743,273 +3993,406 @@ Please enter new, unique name, or press '%1' to abort the operation:Lišta pohľadov - + Configuration widgets - + Syntax highlighting engines - + Data editors Editory dát - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. - + Running in debug mode. Debug messages are printed to the standard output. Beží v ladiacom móde. Ladiace správy sú vypisované na štandardný výstup. - + You need to restart application to make the language change take effect. Je potrebné reštartovať aplikáciu aby sa zmena jazyka prejavila. - Open SQL editor - Otvoriť SQL editor + Otvoriť SQL editor - Open DDL history - Otvoriť DDL históriu + Otvoriť DDL históriu - Open SQL functions editor - Otvoriť editor SQL funkcií + Otvoriť editor SQL funkcií - Open collations editor - Otvoriť editor porovnávaní + Otvoriť editor porovnávaní - Import - Import + Import - Export - Export + Export - Open configuration dialog - Konfigurácia + Konfigurácia - Tile windows - Oddeliť okná + Oddeliť okná - Tile windows horizontally - Oddeliť okná horizontálne + Oddeliť okná horizontálne - Tile windows vertically - Oddeliť okná vertikálne + Oddeliť okná vertikálne - Cascade windows - Okná kaskádovito + Okná kaskádovito - + Next window Nasledujúce okno - + Previous window Predchádzajúce okno - + Hide status field - Close selected window - Zatvoriť vybrané okno + Zatvoriť vybrané okno - Close all windows but selected - Zatvoriť všetky okná okrem vybraného + Zatvoriť všetky okná okrem vybraného - Close all windows - Zatvoriť všetky okná + Zatvoriť všetky okná - Restore recently closed window - Obnoviť posledné zatvorené okno + Obnoviť posledné zatvorené okno - Rename selected window - Premenovať vybrané okno + Premenovať vybrané okno - + Open Debug Console Otvoriť ladiacu konzolu - + Open CSS Console Otvoriť CSS konzolu - Report a bug - Nahlásiť chybu + Nahlásiť chybu - Propose a new feature - Navrhnúť novú funkciu + Navrhnúť novú funkciu - About - O programe + O programe - Licenses - Licencie + Licencie - Open home page - Otvoriť domovskú stránku + Otvoriť domovskú stránku - Open forum page - Otvoriť fórum + Otvoriť fórum - User Manual - Používateľský manuál + Používateľský manuál - SQLite documentation - Dokumentácia SQLite + Dokumentácia SQLite - Report history - História hlásení + História hlásení - Check for updates - Skontrolovať akutalizácie + Skontrolovať akutalizácie - Database menubar - Databázy + Databázy - Structure menubar - Štruktúry + Štruktúry - View menubar - Zobrazenie + Zobrazenie - + Window list menubar view menu Lišta okien - Tools menubar - Nástroje + Nástroje - Help - Pomoc + Pomoc + + + + Open SQL &editor + + + + + Open DDL &history + + + + + Open SQL &functions editor + + + + + Open &collations editor + - + + Open ex&tension manager + + + + + &Import + + + + + E&xport + + + + + Open confi&guration dialog + + + + + &Tile windows + + + + + Tile windows &horizontally + + + + + Tile windows &vertically + + + + + &Cascade windows + + + + + Close selected &window + + + + + Close all windows &but selected + + + + + Close &all windows + + + + + Re&store recently closed window + + + + + &Rename selected window + + + + + Report a &bug + + + + + Propose a new &feature + + + + + &About + + + + + &Licenses + + + + + Open home &page + + + + + Open fo&rum page + + + + + User &Manual + + + + + SQLite &documentation + + + + + Bugs and feature &requests + + + + + Check for &updates + + + + + &Database + menubar + + + + + &Structure + menubar + + + + + &View + menubar + + + + + &Tools + menubar + + + + + &Help + + + + Could not set style: %1 main window Nemôžem nastaviť štýl: %1 - + Cannot export, because no export plugin is loaded. Nemôžem exportovať, lebo nebol načítaný žiaden plugin na export. - + Cannot import, because no import plugin is loaded. Nemôžem importovať, lebo nebol načítaný žiaden plugin na import. - + Rename window Premenovať okno - + Enter new name for the window: Zadajte nový názov pre okno: - + New updates are available. <a href="%1">Click here for details</a>. Nové aktualizácie sú dostupné. <a href="%1">Kliknite sem pre zobrazenie detailov</a>. - + You're running the most recent version. No updates are available. Niesú dostupné žiadne aktualizácie. Používate aktuálnu verziu. - + Database passed in command line parameters (%1) was already on the list under name: %2 Databáza prebratá z príkazového riadka (%1) už je v zozname pod názvom: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 Databáza prebratá z príkazového riadka (%1) bola dočasne pridaná do zoznamu pod názvom: %2 - + Could not add database %1 to list. Nemôžem pridať databázu %1 do zoznamu. @@ -4045,32 +4428,37 @@ Please enter new, unique name, or press '%1' to abort the operation:Hodnota null - + Configure editors for this data type - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. - + Deleted multieditor - + Read only multieditor Iba na čítanie - MultiEditorBool + MultiEditorBoolPlugin - + Boolean @@ -4078,23 +4466,37 @@ Please enter new, unique name, or press '%1' to abort the operation: MultiEditorDate - Date - Dátum + Dátum + + + + MultiEditorDatePlugin + + + Date + Dátum MultiEditorDateTime - Date & time - Dátum a čas + Dátum a čas - MultiEditorHex + MultiEditorDateTimePlugin - + + Date & time + Dátum a čas + + + + MultiEditorHexPlugin + + Hex @@ -4102,59 +4504,70 @@ Please enter new, unique name, or press '%1' to abort the operation: MultiEditorNumeric - Number numeric multi editor tab name - Číslo + Číslo - MultiEditorText + MultiEditorNumericPlugin - - Text - + + Number + numeric multi editor tab name + Číslo + + + MultiEditorText - + Tab changes focus - + Cut Vystrihnúť - + Copy Kopírovať - + Paste Vložiť - + Delete Vymazať - + Undo - + Redo - MultiEditorTime + MultiEditorTextPlugin - + + Text + + + + + MultiEditorTimePlugin + + Time @@ -4231,37 +4644,40 @@ Please enter new, unique name, or press '%1' to abort the operation:Komponenta - + + This application will be closed and the update installer will start to download and install all the updates. + + + Current version - Nainštalovaná verzia + Nainštalovaná verzia - + Update version Dostupná verzia - + Check for updates on startup Kontrolovať aktualizácie pri štarte - + Update to new version! Aktualizovať na novú verziu! - The update will be automatically downloaded and installed. This will also restart application at the end. - Aktualizácie budú automaticky stiahnuté a nainštalované. Na konci sa aplikácia reštartuje. + Aktualizácie budú automaticky stiahnuté a nainštalované. Na konci sa aplikácia reštartuje. - + Not now. Nie teraz. - + Don't install the update and close this window. Neinštalovať aktializácie a zatvoriť toto okno. @@ -4313,32 +4729,32 @@ Please enter new, unique name, or press '%1' to abort the operation:Naplniť - + Abort Zrušiť - + Configure Konfigurovať - + Populating configuration for this column is invalid or incomplete. - + Select database with table to populate Vyberte databázu s tabuľkou na naplnenie - + Select table to populate Vyberte tabuľku na naplnenie - + You have to select at least one column. Musíte vybrať minimálne jeden stĺpec. @@ -4413,129 +4829,134 @@ Please enter new, unique name, or press '%1' to abort the operation:Názov porovnánavania: %1 - + Data grid view Tabuľkové zobrazenie dát - + Copy cell(s) contents to clipboard Kopírovať obsah buniek do schránky + Copy cell(s) contents together with header to clipboard + + + + Paste cell(s) contents from clipboard Vložiť obsah buniek zo schránky - + Set empty value to selected cell(s) Vymazať hodnoty z vybraných buniek - + Set NULL value to selected cell(s) Nastaviť NULL hodnotu vo vybraných bunkách - + Commit changes to cell(s) contents Potvrdiť zmeny v bunkách - + Rollback changes to cell(s) contents Vrátiť späť zmeny v bunkách - + Delete selected data row Vymazať vybraný riadok - + Insert new data row Vložiť nový riadok - + Open contents of selected cell in a separate editor Otvoriť obsah vybranej bunky v samostatnom editore - + Total pages available: %1 Celkový počet strán: %1 - + Total rows loaded: %1 Celkový počet riadkov: %1 - + Data view (both grid and form) Zobrazenie dát (tabuľka a formulár) - + Refresh data Obnoviť dáta - + Switch to grid view of the data Prepnúť na tabuľkové zobrazenie dát - + Switch to form view of the data Prepnúť na formulárové zobrazenie dát - + Database list Zoznam databáz - + Delete selected item Vymazať vybranú položku - + Clear filter contents Vymazať filter - + Refresh schema Obnoviť schému - + Refresh all schemas Obnoviť všetky schémy - + Add database Pridať databázu - + Select all items Vybrať všetky položky - + Copy selected item(s) Kopírovať vybrané položky - + - + Paste from clipboard Vložiť zo schránky @@ -4610,42 +5031,42 @@ Please enter new, unique name, or press '%1' to abort the operation:Vymazať aktuálny riadok - + Main window Hlavné okno - + Open SQL editor Otvoriť SQL editor - + Previous window Predchádzajúce okno - + Next window Nasledujúce okno - + Hide status area Skryť status okno - + Open configuration dialog Otvoriť konfiguračné okno - + Open Debug Console Otvoriť ladiacu konzolu - + Open CSS Console Otvoriť CSS konzolu @@ -4656,111 +5077,111 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text Vystrihnúť vybraný text - + Copy selected text Kopírovať vybraný text - + Delete selected text Vymazať vybraný text - + Undo - + Redo - + SQL editor input field - + Select whole editor contents Označiť všetko - + Save contents into a file Uložiť SQL do súboru - + Load contents from a file Načítať SQL zo súboru - + Find in text Nájsť v SQL - + Find next Nájsť ďalší - + Find previous Nájsť predchádzajúci - + Replace in text Nahradiť v SQL - + Delete current line Vymazať aktuálny riadok - + Request code assistant Otvoriť SQL pomocníka - + Format contents Formátovať SQL - + Move selected block of text one line down Presunúť blok kódu o riadok nižšie - + Move selected block of text one line up Presunúť blok kódu o riadok vyššie - + Copy selected block of text and paste it a line below Kopírovať blok kódu a vložiť ho na riadok nižšie - + Copy selected block of text and paste it a line above Kopírovať blok kódu a vložiť ho na riadok vyššie - + Toggle comment @@ -4781,14 +5202,12 @@ Please enter new, unique name, or press '%1' to abort the operation:Databázový súbor - Reports history window - Okno histórie hlásení + Okno histórie hlásení - Delete selected entry - Vymazať vybranú položku + Vymazať vybranú položku @@ -4835,6 +5254,11 @@ Please enter new, unique name, or press '%1' to abort the operation:Move keyboard input focus to the SQL editor above Prepnúť kurzor do editora + + + Delete selected SQL history entries + + Table window @@ -5058,179 +5482,179 @@ nájsť ďalší SqlEditor - + Cut sql editor Vystrihnúť - + Copy sql editor Kopírovať - + Paste sql editor Vložiť - + Delete sql editor Vymazať - + Select all sql editor Vybrať všetko - + Undo sql editor - + Redo sql editor - + Complete sql editor - + Format SQL sql editor Formátovať SQL - + Save SQL to file sql editor Uložiť SQL do súboru - + Select file to save SQL sql editor - + Load SQL from file sql editor Načítať SQL zo súboru - + Delete line sql editor Vymazať riadok - + Move block down sql editor - + Move block up sql editor - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor Nájsť - + Find next sql editor Nájsť ďalší - + Find previous sql editor Nájsť predchádzajúci - + Replace sql editor Nahradiť - + Toggle comment sql editor - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file Uložiť do súboru - + Could not open file '%1' for writing: %2 Nemôžem otvoriť súbor '%1' pre zápis: %2 - + SQL scripts (*.sql);;All files (*) - + Open file Otvoriť súbor - + Could not open file '%1' for reading: %2 Nemôžem otvoriť súbor '%1' na čítanie: %2 - + Reached the end of document. Hit the find again to restart the search. Dosiahnutý koniec súboru. Kliknite na tlačidlo Nájsť pre hľadanie od začiatku súboru. @@ -5282,24 +5706,24 @@ nájsť ďalší - - + + Cannot edit this cell. Details: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. @@ -5307,8 +5731,8 @@ nájsť ďalší SqlQueryModel - - + + Only one query can be executed simultaneously. Nemôže byť spustených viacero dotazov súčasne. @@ -5321,12 +5745,12 @@ nájsť ďalší Sú tu nepotvrdené zmeny. Chcete aj napriek tomu pokračovať? Všetky nepotvrdené zmeny budú stratené. - + Cannot commit the data for a cell that refers to the already closed database. Nemôžem potrdiť dáta bunky, ktorá odkazuje na už uzatvorenú databázu. - + Could not begin transaction on the database. Details: %1 Nemôžem začať tranzakciu na databáze. Detaily: %1 @@ -5335,12 +5759,12 @@ nájsť ďalší Vyskytla sa chyba počas potvrdzovania tranzakcie: %1 - + An error occurred while rolling back the transaction: %1 Vyskytla sa chyba počas vracania späť tranzakcie: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Nastal pokus o potvrdenie zmien v bunke, ktorú nieje možné upravovať (napriek tomu bola upravená a čaká na potvrdenie)! Toto je chyba. Prosím nahláste ju. @@ -5349,43 +5773,48 @@ nájsť ďalší Vyskytla sa chyba počas potvrdzovania dát: %1 - + Uncommitted data - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + An error occurred while committing the transaction: %1 - + An error occurred while committing the data: %1 - - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + Error while executing SQL query on database '%1': %2 Vyskytla sa chyba počas vykonávania SQL dotazu na databáze '%1': %2 - + Error while loading query results: %1 Vyskytla sa chyba počas načítavania výsledkov dotazu: %1 - + Insert multiple rows Vložiť viacero riadkov - + Number of rows to insert: Počet vkládaných riadkov: @@ -5393,117 +5822,137 @@ nájsť ďalší SqlQueryView - + Go to referenced row in... - + Copy Kopírovať - + Copy as... Kopírovať ako... - + Paste Vložiť - + Paste as... Vložiť ako... - + Set NULL values Nastaviť null hodnoty - + Erase values Vymazať hodnoty - + Edit value in editor Upraviť hodnotu v editory - + Commit Potvrdiť - + + Copy with headers + + + + Rollback Vrátiť späť - + Commit selected cells Potvrdiť vybrané bunky - + Rollback selected cells Vrátiť späť vybrané bunky - + Define columns to sort by Vybrať stĺpce na zoradenie podľa - + Remove custom sorting Odstrániť užívateľské triedenie - + Insert row Vložiť riadok - + Insert multiple rows Vložiť viacero riadkov - + Delete selected row Vymazať viacero riadkov - + + Show value in a viewer + + + + Generate query for selected cells - + No items selected to paste clipboard contents to. Neboli vybrané žiadne položky na vloženie obsahu schránky. - + Go to referenced row in table '%1' - + table '%1' - + Referenced row (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value Upraviť hodnotu @@ -5525,6 +5974,119 @@ nájsť ďalší Vyskytla sa chyba počas mazania riadka z tabuľky %1: %2 + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + Databázy + + + + Register in all databases + Registrovať vo všetkých databázach + + + + Register in following databases: + Registrovať v nasledujúcich databázach: + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + Všetky súbory (*) + + + + Open file + Otvoriť súbor + + StatusField @@ -5633,7 +6195,7 @@ but it's okay to use them anyway. Zadajte názov obmedzenia. - + Foreign column table constraints Cudzí stĺpec @@ -5687,24 +6249,24 @@ but it's okay to use them anyway. Pri konflikte - + Collate table constraints Porovnať - + Sort order table constraints Zoradiť - + Select at least one column. Vyberte minimálne jeden stĺpec. - + Enter a name of the constraint. Zadajte názov obmedzenia. @@ -6277,7 +6839,7 @@ Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr? - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> @@ -6322,7 +6884,7 @@ Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr? - + DDL DDL @@ -6400,18 +6962,18 @@ Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr? - - + + Data Dáta - + Triggers Spúšťače - + DDL DDL @@ -6443,120 +7005,120 @@ Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr?Nový pohľad %1 - + Refresh the view view window Obnoviť pohľad - + Commit the view changes view window Potvrdiť zmeny v pohľade - + Rollback the view changes view window Vrátiť späť zmeny v pohľade - + Explicit column names - + Generate output column names automatically basing on result columns of the view. - + Add column view window Pridať stĺpec - + Edit column view window Upraviť stĺpec - + Delete column view window Vymazať stĺpec - + Move column up view window Posunúť stĺpec hore - + Move column down view window Posunúť stĺpec dole - + Refresh trigger list view window Obnoviť zoznam spúšťačov - + Create new trigger view window Vytvoriť nový spúšťač - + Edit selected trigger view window Upraviť vybraný spúšťač - + Delete selected trigger view window Vymazať vybraný spúšťač - + View window "%1" has uncommitted structure modifications and data. - + View window "%1" has uncommitted data. - + View window "%1" has uncommitted structure modifications. - + Uncommitted changes - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Committed changes for view '%1' successfully. - + Committed changes for view '%1' (named before '%2') successfully. @@ -6573,7 +7135,7 @@ Do you want to commit the structure, or do you want to go back to the structure Okno pohľadu "%1" obsahuje nepotrdené zmeny štruktúr. - + Could not load data for view %1. Error details: %2 Nemôžem načítať dáta z pohľadu %1. Detaily chyby: %2 @@ -6588,102 +7150,102 @@ Do you want to commit the structure, or do you want to go back to the structure Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr? - + Go back to structure tab Choď späť na záložku štruktúr - + Commit modifications and browse data. Potvrdiť zmeny a prezerať dáta. - + Could not commit view changes. Error message: %1 view window Nemôžem potvrdiť zmeny v pohľade. Chyba: %1 - + Override columns - + Currently defined columns will be overriden. Do you want to continue? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. - + Name view window triggers Názov - + Instead of view window triggers - + Condition view window triggers Podmienka - + Details table window triggers Detaily - + Could not process the %1 view correctly. Unable to open a view window. - + Empty name - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 SELECT nemôže byť analyzovaný. Prosím opravte dotaz a skúste to znovu. Detaily: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. - + Following problems will take place while modifying the view. Would you like to proceed? view window - + View modification view window diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm index 3201eff..98db9d2 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts index 53cd968..cbfc48e 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts @@ -14,9 +14,8 @@ 关于 - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">自由,开源,跨平台的 SQLite 数据库管理工具。<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">作者和活跃维护人:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">自由,开源,跨平台的 SQLite 数据库管理工具。<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">作者和活跃维护人:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> @@ -58,6 +57,11 @@ Configuration directory 配置文件目录 + + + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="https://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="https://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">https://salsoft.com.pl</span></a>)<br/></p></body></html> + + Qt version: @@ -89,264 +93,224 @@ <h3>目录:</h3><ol>%2</ol> + + BindParamsDialog + + + Query parameters + + + + + Please provide values for query parameters + + + BugDialog - Bugs and ideas - Bugs 和想法 + Bugs 和想法 - Reporter - 报告者 + 报告者 - E-mail address - E-mail 地址 + E-mail 地址 - - Log in - 登录 + 登录 - Short description - 简要描述 + 简要描述 - Detailed description - 详细描述 + 详细描述 - Show more details - 更多详细信息 + 更多详细信息 - SQLiteStudio version - SQLiteStudio 版本 + SQLiteStudio 版本 - Operating system - 操作系统 + 操作系统 - Loaded plugins - 已加载插件 + 已加载插件 - Send - 发送 + 发送 - You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - 您可以通过选择菜单 “1%”下的“%2”来查看全部您报告的bugs和想法。 + 您可以通过选择菜单 “1%”下的“%2”来查看全部您报告的bugs和想法。 - A bug report sent successfully. - Bug报告提交成功。 + Bug报告提交成功。 - An error occurred while sending a bug report: %1 %2 - 提交bug报告时发生了错误:%1 + 提交bug报告时发生了错误:%1 %2 - - You can retry sending. The contents will be restored when you open a report dialog after an error like this. - 您可以重新发送试试。当你在发生错误后重新打开上报对话框时,你之前输入的内容将会恢复。 + 您可以重新发送试试。当你在发生错误后重新打开上报对话框时,你之前输入的内容将会恢复。 - An idea proposal sent successfully. - 提交建议成功。 + 提交建议成功。 - An error occurred while sending an idea proposal: %1 %2 - 在提交建议时发生错误:%1 + 在提交建议时发生错误:%1 %2 - A bug report - Bug报告 + Bug报告 - Describe problem in few words - 简要描述一下问题 + 简要描述一下问题 - Describe problem and how to reproduce it - 描述一下问题,怎么复现问题 + 描述一下问题,怎么复现问题 - A new feature idea - 新功能建议 + 新功能建议 - A title for your idea - 您的建议题目 + 您的建议题目 - Describe your idea in more details - 仔细描述一下您的想法 + 仔细描述一下您的想法 - Reporting as an unregistered user, using e-mail address. - 使用e-mail地址以未注册用户身份上报。 + 使用e-mail地址以未注册用户身份上报。 - Reporting as a registered user. - 作为已注册用户报告。 + 作为已注册用户报告。 - Log out - 退出 + 退出 - Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - 使用真实email地址有助于您上报后联系到您。如果想了解更多,请点击右方的“帮助”按钮。 + 使用真实email地址有助于您上报后联系到您。如果想了解更多,请点击右方的“帮助”按钮。 - Enter vaild e-mail address, or log in. - 输入正确的e-mail地址,或者登录。 + 输入正确的e-mail地址,或者登录。 - Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - 简要描述至少10个字符,但不超过100个字符。更详细的描述内容请在下面的区域填写。 + 简要描述至少10个字符,但不超过100个字符。更详细的描述内容请在下面的区域填写。 - Long description requires at least 30 characters. - 详细描述内容至少30个字符。 + 详细描述内容至少30个字符。 BugReportHistoryWindow - - Title - 标题 + 标题 - - Reported at - 报告时间 + 报告时间 - - URL - URL + URL - Reports history - 报告历史 + 报告历史 - Clear reports history - 清空报告历史 + 清空报告历史 - Delete selected entry - 删除选中项 + 删除选中项 - Invalid response from server. - 无效的服务器回应。 + 无效的服务器回应。 BugReportLoginDialog - Log in - 登录 + 登录 - Credentials - 认证信息 + 认证信息 - Login: - 登录名: + 登录名: - Password: - 密码: + 密码: - Validation 这里不是很确认。Not sure about this translation. - 确认 + 确认 - Validate not sure about this translation - 确认 + 确认 - Validation result message - 验证信息 + 验证信息 - Abort - 中止 + 中止 - A login must be at least 2 characters long. - 登录名至少2个字符。 + 登录名至少2个字符。 - A password must be at least 5 characters long. - 密码至少5个字符。 + 密码至少5个字符。 - Valid - 已验证 + 已验证 @@ -357,12 +321,12 @@ 过滤器排序规则 - + Collation name: 排序规则名称: - + Implementation language: 实现语言: @@ -491,11 +455,20 @@ + Invalid default value expression: %1. If you want to use simple string as value, remember to surround it with quote characters. + + + + + Invalid default value expression. If you want to use simple string as value, remember to surround it with quote characters. + + + Invalid default value expression: %1 - 无效的默认值表达式:%1 + 无效的默认值表达式:%1 - + Enter a name of the constraint. 输入约束名: @@ -607,7 +580,7 @@ - + Delete constraint column dialog 删除约束 @@ -667,34 +640,44 @@ 添加默认约束 - + Are you sure you want to delete constraint '%1'? column dialog 您确定要删除约束“%1”吗? - + Correct the constraint's configuration. 修正约束配置。 - + This constraint is not officially supported by SQLite 2, but it's okay to use it. SQLite2没有官方支持该约束,但是可以使用。 - + Scale is not allowed for INTEGER PRIMARY KEY columns. - + Precision cannot be defined without the scale. - + + Cannot use type other than INTEGER if AUTOINCREMENT is enabled in PRIMARY KEY. + + + + + INTEGER type was enforced due to enabled AUTOINCREMENT in PRIMARY KEY. + + + + Precision is not allowed for INTEGER PRIMARY KEY columns. @@ -796,10 +779,9 @@ but it's okay to use it. - Autoincrement (only for %1 type columns) column primary key - Autoincrement (只能%1类型的字段才能有该属性) + Autoincrement (只能%1类型的字段才能有该属性) @@ -911,7 +893,7 @@ but it's okay to use it. ConfigDialog - + Configuration 配置 @@ -1001,113 +983,113 @@ but it's okay to use it. 流量和编辑数据 - + Number of data rows per page: 每页的行数: - - + + <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> <p>在以列表方式显示数据时,列宽度会自动调整。该值控制初始列宽度,之后您可以手动调整列宽度,不受此限制。</p> - + Limit initial data column width to (in pixels): 限制宽度(单位:像素): - + <p>When this is enabled and user holds mouse pointer over a cell in any data view (query results, a table data, a view data) a tooltip will appear with details about the cell - it includes details like column data type, constraints, ROWID and others.</p> - + Show column and row details tooltip in data view - + <p>When editing a cell which used to have NULL value and entering empty string as new value, then this option determinates whether the new value should remain NULL (have this option enabled), or should it be overwritten with empty string value (have this option disabled).</p> - + Inserting new row in data grid - + Before currently selected row 在已选列之前 - + After currently selected row 在已选列之后 - + At the end of data view 在数据显示区域的末尾 - + <p>When enabled, Table Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every Table Window, instead of being at second place.</p> - + Place data tab as first tab in a Table Window - + <p>When enabled, View Windows will show up with the data tab, instead of the structure tab.</p> - + <p>When enabled the "Data" tab will be placed as first tab in every View Window, instead of being at second place.</p> - + Place data tab as first tab in a View Window - + Data types 数据类型 - + Available editors: 可用的编辑器: - + Editors selected for this data type: 已选的该数据类型编辑器: - + Schema editing 架构编辑 - + Number of DDL changes kept in history. 数据库定义(DDL)的更改历史记录数量。 - + DDL history size: 数据库定义(DDL)历史大小: @@ -1116,104 +1098,104 @@ but it's okay to use it. 当提交schema变动时不显示数据库定义(DDL)预览对话框 - + SQL queries SQL查询 - - + + Number of queries kept in the history. 查询历史记录数量。 - + History size: 历史大小: - + <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> <p>如果SQL编辑器中有多个语句,如果启用该选项,只执行光标下的语句;反之则执行全部语句。另外您可以选择需要执行的语句来执行</p> - + Execute only the query under the cursor 只执行光标下的语句 - + Updates 更新 - + Automatically check for updates at startup 在启动时自己检查更新 - + Session 会话 - + Restore last session (active MDI windows) after startup 启动后恢复上一次会话。 - + Status Field - + <p>When user manually closes the Status panel, this option makes sure that if any new message is printed in the Status panel it will be reopened. If it's disabled, then Status panel can only be open manually by the user from the "View" menu.</p> - + Always open Status panel when new message is printed - + Filter shortcuts by name or key combination - + Action - + Key combination 按键编定 - - + + Language 语言 - + Changing language requires application restart to take effect. 更改语言后,重启程序生效。 - + Compact layout - + <p>Compact layout reduces all margins and spacing on the UI to minimum, making space for displaying more data. It makes the interface a little bit less aesthetic, but allows to display more data at once.</p> - + Use compact layout @@ -1289,350 +1271,372 @@ but it's okay to use it. - + + + <p>Maximum number of configurations of Populate Table dialog stored in configuration. Value of 100 should be sufficient.</p> + + + + + Number of memorized table populating configurations + + + + Keep NULL value when entering empty value - + <html><head/><body><p>Enable this to always enforce DEFAULT value when committing a NULL value for a column that has DEFAULT value defined, even though the column is allowed to contain NULL values.</p><p>Disable this option to use DEFAULT value exclusively when NULL value is committed for column with NOT NULL constraint.</p></body></html> - + Use DEFAULT value (if defined), when committing NULL value - + Table windows - + Open Table Windows with the data tab for start - + View windows - + Open View Windows with the data tab for start - + Don't show DDL preview dialog when committing schema changes - + + + <p>Maximum number of query parameters (:param, @param, $param, ?) stored in history. When you re-use parameter with the same name/position, SQLiteStudio will pre-initialize it with most recent memorized value (you will still be able to change it). Value of 1000 should be sufficient.</p> + + + + + Number of memorized query parameters + + + + Main window dock areas - + Left and right areas occupy corners - + Top and bottom areas occupy corners - + Hide built-in plugins - + Current style: 当前风格: - + Preview 预览 - + Enabled 已启用 - + Disabled 已禁用 - + Active formatter plugin 启用格式化插件 - + SQL editor font SQL编辑器字体 - + Database list font 数据库字体 - + Database list additional label font 数据库额外标签字体 - + Data view font 数据浏览字体 - + Status field font 状态栏字体 - + SQL editor colors SQL编辑器颜色 - + Current line background 当前行的背景色 - + <p>SQL strings are enclosed with single quote characters.</p> <p>单引号内的SQL字符串</p> - + String foreground 字符串颜色 - + <p>Bind parameters are placeholders for values yet to be provided by the user. They have one of the forms:</p><ul><li>:param_name</li><li>$param_name</li><li>@param_name</li><li>?</li></ul> - + Bind parameter foreground - + Highlighted parenthesis background - + <p>BLOB values are binary values represented as hexadecimal numbers, like:</p><ul><li>X'12B4'</li><li>x'46A2F4'</li></ul> - + BLOB value foreground BLOB值的颜色 - + Regular foreground 背景色 - + Line numbers area background 行号的背景色 - + Keyword foreground 关键字的颜色 - + Number foreground 数字颜色 - + Comment foreground 注释颜色 - + <p>Valid objects are name of tables, indexes, triggers, or views that exist in the SQLite database.</p> - + Valid objects foreground - + Data view colors - + <p>Any data changes will be outlined with this color, until they're committed to the database.</p> - + Uncommitted data outline color - + <p>In case of error while committing data changes, the problematic cell will be outlined with this color.</p> - + Commit error outline color - + NULL value foreground NULL值的颜色 - + Deleted row background 已删除行的背景色 - + Database list colors 数据库列表颜色 - + <p>Additional labels are those which tell you SQLite version, number of objects deeper in the tree, etc.</p> - + Additional labels foreground - + Status field colors - + Information message foreground 信息颜色 - + Warning message foreground 警告信息颜色 - + Error message foreground 错误信息颜色 - + Description: plugin details 描述: - + Category: plugin details 分类: - + Version: plugin details 版本: - + Author: plugin details 作者: - + Internal name: plugin details 内部名字: - + Dependencies: plugin details 依赖: - + Conflicts: plugin details - + Plugin details 插件详情 - + Plugins are loaded/unloaded immediately when checked/unchecked, but modified list of plugins to load at startup is not saved until you commit the whole configuration dialog. - + %1 (built-in) plugins manager in configuration dialog %1 (内建) - + Details 详情 - + No plugins in this category. 该分类下没有插件。 - + Add new data type 添加新的数据类型 - + Rename selected data type 重命名选择的数据类型 - + Delete selected data type 删除已选数据类型 - + Help for configuring data type editors @@ -1784,137 +1788,153 @@ but it's okay to use it. DataView - + Filter data data view - + Grid view - + Form view - + Refresh table data data view - + First page data view 首页 - + Previous page data view 上一页 - + Next page data view 下一页 - + Last page data view 末页 - + + Filter + + + + + Hit Enter key or press "Apply filter" button on toolbar to apply new value. + + + + + Show filter inputs per column + data view + + + + Apply filter data view - + Commit changes for selected cells data view - + Rollback changes for selected cells data view - + Show grid view of results sql editor - + Show form view of results sql editor - + Filter by text data view - + Filter by the Regular Expression data view - + Filter by SQL expression data view - + Tabs on top data view - + Tabs at bottom data view - + Place new rows above selected row data view - + Place new rows below selected row data view - + Place new rows at the end of the data view data view - + Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Row: %1 行:%1 @@ -2101,7 +2121,7 @@ Browsing other pages will be possible after the row counting is done. - <p>Automatic name generation was disabled, becuase the name was edited manually. To restore automatic generation please erase contents of the name field.</p> + <p>Automatic name generation was disabled, because the name was edited manually. To restore automatic generation please erase contents of the name field.</p> @@ -2211,286 +2231,423 @@ Browsing other pages will be possible after the row counting is done. 过滤名 - + Copy 复制 - + Paste 粘贴 - + Select all 全选 - + Create a group 创建分组 - + Delete the group 删除分组 - + Rename the group 重命名分组 - Add a database - 添加数据库 + 添加数据库 - Edit the database - 编辑数据库 + 编辑数据库 - Remove the database - 移除数据库 + 移除数据库 - Connect to the database - 连接到数据库 + 连接到数据库 - Disconnect from the database - 断开数据库连接 + 断开数据库连接 - + Import 导入 - Export the database - 导数该数据库 + 导数该数据库 - Convert database type - 转换数据库类型 + 转换数据库类型 - Vacuum - 清理 + 清理 - Integrity check - 检查完整性 + 检查完整性 - Create a table - 新建表 + 新建表 - Edit the table - 编辑该表 + 编辑该表 - Delete the table - 删除该表 + 删除该表 - + Export the table 导出该表 - + Import into the table 导入到该表 - + Populate table 填充表 - + Create similar table 创建一个相似的表 - + Reset autoincrement sequence 重设 autoincrement - Create an index - 创建索引 + 创建索引 - Edit the index - 编辑该索引 + 编辑该索引 - Delete the index - 删除该索引 + 删除该索引 - Create a trigger - 创建触发器 + 创建触发器 - Edit the trigger - 编辑该触发器 + 编辑该触发器 - Delete the trigger - 删除该触发器 + 删除该触发器 - Create a view - 创建视图 + 创建视图 - Edit the view - 编辑该视图 + 编辑该视图 - Delete the view - 删除该视图 + 删除该视图 - + Add a column 添加字段 - + Edit the column 编辑该字段 - + Delete the column 删除该字段 - + Delete selected items 删除已选项目 - + Clear filter 清除过滤器 - Refresh all database schemas - 刷新全部数据库的结构 + 刷新全部数据库的结构 - Refresh selected database schema - 刷新已选数据库的结构 + 刷新已选数据库的结构 + + + + Execution from file cancelled. Any queries executed so far have been rolled back. + + + + + &Add a database + + + + + &Edit the database + + + + + &Remove the database + + + + + &Connect to the database + - + &Disconnect from the database + + + + + &Export the database + + + + + Con&vert database type + + + + + Vac&uum + + + + + &Integrity check + + + + + Create a &table + + + + + Edit the t&able + + + + + Delete the ta&ble + + + + + Create an &index + + + + + Edit the i&ndex + + + + + Delete the in&dex + + + + + Create a trig&ger + + + + + Edit the trigg&er + + + + + Delete the trigge&r + + + + + Create a &view + + + + + Edit the v&iew + + + + + Delete the vi&ew + + + + + &Refresh all database schemas + + + + + Re&fresh selected database schema + + + + + Erase table data 擦除该表的数据 - - + + Open file's directory + + + + + Execute SQL from file + + + + + Database 数据库 - + Grouping 分组 - + Generate query for table - - + + Create group 创建分组 - + Group name 分组名 - + Entry with name %1 already exists in group %2. - + Delete group 删除分组 - + Are you sure you want to delete group %1? All objects from this group will be moved to parent group. 确认删除组 %1 吗? 删除后该组下的全部内容将被移动到其所属的父分组中。 - + Are you sure you want to remove database '%1' from the list? - + Are you sure you want to remove following databases from the list: %1 - + Remove database - + Vacuum (%1) - + Autoincrement value for table '%1' has been reset successfully. - + Are you sure you want to delete all data from table(s): %1? + + + Could not execute SQL, because application has failed to start transaction: %1 + + + + + Could not open file '%1' for reading: %2 + + + + + Could not execute SQL, because application has failed to commit the transaction: %1 + + + + + Finished executing %1 queries in %2 seconds. %3 were not executed due to errors. + + + + + Finished executing %1 queries in %2 seconds. + + + + + Could not execute SQL due to error. + + Delete database 删除数据库 @@ -2500,14 +2657,14 @@ All objects from this group will be moved to parent group. 您确定要删除数据库“%1”吗? - - + + Cannot import, because no import plugin is loaded. 未能导入,因为没有导入插件被加载。 - - + + Cannot export, because no export plugin is loaded. 未能导出,因为没有导出插件被加载。 @@ -2520,22 +2677,22 @@ All objects from this group will be moved to parent group. VACUUM 命令执行完成。 - + Integrity check (%1) 完整性检查(%1) - + Reset autoincrement 重置autoincrement - + Are you sure you want to reset autoincrement value for table '%1'? 您确定要重设“%1”的autoincrement吗? - + An error occurred while trying to reset autoincrement value for table '%1': %2 在重设表“%1”的autoincrement时出现错误:%2 @@ -2548,37 +2705,37 @@ All objects from this group will be moved to parent group. 您确定要删除表“%1”中的全部数据吗? - + An error occurred while trying to delete data from table '%1': %2 删除表“%1”中的数据时出错:%2 - + All data has been deleted for table '%1'. 表“%1”中的数据全部被删除。 - + Following objects will be deleted: %1. 以下内容将被删除:%1。 - + Following databases will be removed from list: %1. 以下数据库将从列表中移除:%1。 - + Remainig objects from deleted group will be moved in place where the group used to be. - + %1<br><br>Are you sure you want to continue? %1<br><br>继续? - + Delete objects 删除对象 @@ -2667,74 +2824,74 @@ All objects from this group will be moved to parent group. 触发器(%1) - + Copy 复制 - + Move 移动 - + Include data 包含数据 - + Include indexes 包含索引 - + Include triggers 包含触发器 - + Abort 中止 - + Could not add dropped database file '%1' automatically. Manual setup is necessary. - + Referenced tables 参照表 - + Do you want to include following referenced tables as well: %1 - + Name conflict 名字冲突 - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? 忽略错误并继续? @@ -2788,130 +2945,136 @@ Please enter new, unique name, or press '%1' to abort the operation: - + History 历史 - + Results in the separate tab 结果在新标签中打开 - + Results below the query 结果在当前页打开 - - + + SQL editor %1 SQL编辑器 %1 - + Results 结果 - + Execute query 执行语句 - + Explain query - + Clear execution history sql editor 清除执行历史 - + Export results sql editor 导出结果 - + Create view from query sql editor 从query中创建视图 - + Previous database 前一个数据库 - + Next database 下一个数据库 - + Show next tab sql editor 显示下一个标签 - + Show previous tab sql editor 显示上一个标签 - + Focus results below sql editor - + Focus SQL editor above sql editor - + + Delete selected SQL history entries + sql editor + + + + Active database (%1/%2) - + Query finished in %1 second(s). Rows affected: %2 - + Query finished in %1 second(s). - + Clear execution history 清除执行历史 - + Are you sure you want to erase the entire SQL execution history? This cannot be undone. 确定要删除全部的SQL执行历史吗?删除后不能恢复。 - + Cannot export, because no export plugin is loaded. 未能导出,因为没有导出插件被加载。 - + No database selected in the SQL editor. Cannot create a view for unknown database. - + Editor window "%1" has uncommitted data. @@ -2938,6 +3101,64 @@ Please enter new, unique name, or press '%1' to abort the operation:仍然继续吗? + + ExecFromFileDialog + + + Execute SQL from file + + + + + Input file + + + + + Path to file + + + + + Browse for file + + + + + Options + 选项 + + + + File encoding + + + + + Skip failing SQL statements + + + + + SQL scripts (*.sql);;All files (*) + SQL文件 (*.sql);;所有文件 (*) + + + + Execute SQL file + + + + + Please provide file to be executed. + + + + + Provided file does not exist or cannot be read. + + + ExportDialog @@ -3087,131 +3308,164 @@ Please enter new, unique name, or press '%1' to abort the operation:导出格式选项 - + Cancel 取消 - - - + + + Select database to export. 选择要导出的数据库。 - + Select table to export. 选择要导出的表。 - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) 所有文件 (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. - FontEdit + FileExecErrorsDialog - - Choose font - font configuration - 字体选择 + + Execution errors + - - - Form - - Active SQL formatter plugin - 激活SQL语句格式化插件 + + Following errors were encountered during execution of SQL statements from the file: + + + + + SQL + + + + + Error + 错误 + + + + Statements that were executed successfully were commited. + + + + + Statements that were executed successfully were rolled back. + + + + + FontEdit + + + Choose font + font configuration + 字体选择 + + + + Form + + + Active SQL formatter plugin + 激活SQL语句格式化插件 FormView - + Commit row form view 提交 - + Rollback row form view 回滚 - + First row form view 首行 - + Previous row form view 前一行 - + Next row form view 下一行 - + Last row form view 末行 - + Insert new row form view 新插入行 - + Delete current row form view 删除当前行 @@ -3270,13 +3524,13 @@ Please enter new, unique name, or press '%1' to abort the operation:初始化代码: - + Function implementation code: - + Final step implementation code: @@ -3440,42 +3694,42 @@ Please enter new, unique name, or press '%1' to abort the operation:数据源选项 - + Cancel 取消 - + If you type table name that doesn't exist, it will be created. 如果输入的表不存在,则新建该表。 - + Enter the table name 输入表名 - + Select import plugin. 选择导入插件。 - + You must provide a file to import from. 必须提供一个导入文件。 - + The file '%1' does not exist. 文件“%1”不存在。 - + Path you provided is a directory. A regular file is required. 你提供的是一个目录。我们需要的是文件。 - + Pick file to import from 选择要导入的文件 @@ -3514,12 +3768,12 @@ Please enter new, unique name, or press '%1' to abort the operation:字段 - + Collation - + Sort 排序 @@ -3698,273 +3952,402 @@ Please enter new, unique name, or press '%1' to abort the operation:查看工具栏 - + Configuration widgets 配置部件 - + Syntax highlighting engines 语法高亮引擎 - + Data editors 数据编辑器 - + Running in debug mode. Press %1 or use 'Help / Open debug console' menu entry to open the debug console. - + Running in debug mode. Debug messages are printed to the standard output. - + You need to restart application to make the language change take effect. 更改语言后重启程序生效。 - Open SQL editor - 打开SQL编辑器 + 打开SQL编辑器 - Open DDL history - 打开数据库定义(DDL)历史 + 打开数据库定义(DDL)历史 - Open SQL functions editor - 打开SQL函数编辑器 + 打开SQL函数编辑器 - - Open collations editor - - - - Import - 导入 + 导入 - Export - 导出 + 导出 - Open configuration dialog - 打开配置对话框 + 打开配置对话框 - Tile windows - 平铺窗口 + 平铺窗口 - Tile windows horizontally - 水平排列窗口 + 水平排列窗口 - Tile windows vertically - 垂直排列窗口 + 垂直排列窗口 - Cascade windows - 层叠窗口 + 层叠窗口 - + Next window 下一个窗口 - + Previous window 上一个窗口 - + Hide status field 隐藏状态栏 - Close selected window - 关闭当前窗口 + 关闭当前窗口 - Close all windows but selected - 关闭其它窗口 + 关闭其它窗口 - Close all windows - 关闭全部窗口 + 关闭全部窗口 - Restore recently closed window - 恢复最近关闭的窗口 + 恢复最近关闭的窗口 - Rename selected window - 重命名当前窗口 + 重命名当前窗口 - + Open Debug Console 打开调试终端 - + Open CSS Console 打开CSS控制台 - Report a bug - 提交Bug + 提交Bug - Propose a new feature - 提交新功能建议 + 提交新功能建议 - About - 关于 + 关于 - Licenses - 许可 + 许可 - Open home page - 访问主页 + 访问主页 - Open forum page - 访问论坛 + 访问论坛 - User Manual - 用户手册 + 用户手册 - SQLite documentation - SQLite文档 + SQLite文档 - Report history - 报告历史 + 报告历史 - Check for updates - 检查更新 + 检查更新 - Database menubar - 数据库 + 数据库 - Structure menubar - 结构 + 结构 - View menubar - 查看 + 查看 - + Window list menubar view menu 窗口列表 - Tools menubar - 工具 + 工具 - Help - 帮助 + 帮助 + + + + Open SQL &editor + + + + + Open DDL &history + + + + + Open SQL &functions editor + + + + + Open &collations editor + + + + + Open ex&tension manager + + + + + &Import + + + + + E&xport + + + + + Open confi&guration dialog + + + + + &Tile windows + + + + + Tile windows &horizontally + + + + + Tile windows &vertically + + + + + &Cascade windows + + + + + Close selected &window + + + + + Close all windows &but selected + + + + + Close &all windows + + + + + Re&store recently closed window + + + + + &Rename selected window + + + + + Report a &bug + + + + + Propose a new &feature + + + + + &About + + + + + &Licenses + + + + + Open home &page + + + + + Open fo&rum page + + + + + User &Manual + + + + + SQLite &documentation + + + + + Bugs and feature &requests + + + + + Check for &updates + + + + + &Database + menubar + + + + + &Structure + menubar + - + + &View + menubar + + + + + &Tools + menubar + + + + + &Help + + + + Could not set style: %1 main window 未能设置风格:%1 - + Cannot export, because no export plugin is loaded. 未能导出,因为没有导出插件被加载。 - + Cannot import, because no import plugin is loaded. 未能导入,因为没有导入插件被加载。 - + Rename window 重命名窗口 - + Enter new name for the window: 窗口的新名称: - + New updates are available. <a href="%1">Click here for details</a>. 有新更新 <a href="%1">点此查看更新详情</a>. - + You're running the most recent version. No updates are available. 您使用的是最新版,不需要更新。 - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. 未能将数据%1添加到列表 @@ -4000,23 +4383,28 @@ Please enter new, unique name, or press '%1' to abort the operation:Null 值 - + Configure editors for this data type - + + Open another tab + + + + Data editor plugin '%1' not loaded, while it is defined for editing '%1' data type. - + Deleted multieditor 已删除 - + Read only multieditor 只读 @@ -4025,93 +4413,143 @@ Please enter new, unique name, or press '%1' to abort the operation: MultiEditorBool - Boolean - 布尔 + 布尔 + + + + MultiEditorBoolPlugin + + + Boolean + 布尔 MultiEditorDate - Date - 日期 + 日期 + + + + MultiEditorDatePlugin + + + Date + 日期 MultiEditorDateTime - Date & time - 日期和时间 + 日期和时间 + + + + MultiEditorDateTimePlugin + + + Date & time + 日期和时间 MultiEditorHex - Hex - 十六进制 + 十六进制 + + + + MultiEditorHexPlugin + + + Hex + 十六进制 MultiEditorNumeric - Number numeric multi editor tab name - 数值 + 数值 + + + + MultiEditorNumericPlugin + + + Number + numeric multi editor tab name + 数值 MultiEditorText - Text - 文本 + 文本 - + Tab changes focus - + Cut 剪切 - + Copy 复制 - + Paste 粘贴 - + Delete 删除 - + Undo 撤销 - + Redo 恢复 + + MultiEditorTextPlugin + + + Text + 文本 + + MultiEditorTime - Time - 时间 + 时间 + + + + MultiEditorTimePlugin + + + Time + 时间 @@ -4186,37 +4624,40 @@ Please enter new, unique name, or press '%1' to abort the operation:组件 - + + This application will be closed and the update installer will start to download and install all the updates. + + + Current version - 当年版本 + 当年版本 - + Update version 可更新版本 - + Check for updates on startup 在启动时检查更新 - + Update to new version! 更新到新版本! - The update will be automatically downloaded and installed. This will also restart application at the end. - 本次更新将会自动下载和安装。在更新后会重启程序。 + 本次更新将会自动下载和安装。在更新后会重启程序。 - + Not now. 现在不更新。 - + Don't install the update and close this window. 不安装更新并关闭本窗口。 @@ -4268,32 +4709,32 @@ Please enter new, unique name, or press '%1' to abort the operation:填充 - + Abort 中止 - + Configure 配置 - + Populating configuration for this column is invalid or incomplete. - + Select database with table to populate - + Select table to populate 选择要填充的表 - + You have to select at least one column. 您至少得选择一个字段。 @@ -4368,129 +4809,134 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Data grid view - + Copy cell(s) contents to clipboard - Paste cell(s) contents from clipboard + Copy cell(s) contents together with header to clipboard + Paste cell(s) contents from clipboard + + + + Set empty value to selected cell(s) - + Set NULL value to selected cell(s) - + Commit changes to cell(s) contents - + Rollback changes to cell(s) contents - + Delete selected data row - + Insert new data row - + Open contents of selected cell in a separate editor - + Total pages available: %1 - + Total rows loaded: %1 - + Data view (both grid and form) - + Refresh data - + Switch to grid view of the data - + Switch to form view of the data - + Database list 数据库列表 - + Delete selected item - + Clear filter contents - + Refresh schema - + Refresh all schemas - + Add database - + Select all items - + Copy selected item(s) - + - + Paste from clipboard @@ -4565,42 +5011,42 @@ Please enter new, unique name, or press '%1' to abort the operation:删除当前行 - + Main window - + Open SQL editor 打开SQL编辑器 - + Previous window 上一个窗口 - + Next window 下一个窗口 - + Hide status area - + Open configuration dialog 打开配置对话框 - + Open Debug Console 打开调试终端 - + Open CSS Console 打开CSS控制台 @@ -4611,111 +5057,111 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cut selected text - + Copy selected text - + Delete selected text - + Undo 撤销 - + Redo 恢复 - + SQL editor input field - + Select whole editor contents - + Save contents into a file - + Load contents from a file - + Find in text - + Find next 查找下一个 - + Find previous 查找上一个 - + Replace in text - + Delete current line - + Request code assistant - + Format contents - + Move selected block of text one line down - + Move selected block of text one line up - + Copy selected block of text and paste it a line below - + Copy selected block of text and paste it a line above - + Toggle comment @@ -4736,14 +5182,8 @@ Please enter new, unique name, or press '%1' to abort the operation: - - Reports history window - - - - Delete selected entry - 删除选中项 + 删除选中项 @@ -4790,6 +5230,11 @@ Please enter new, unique name, or press '%1' to abort the operation:Move keyboard input focus to the SQL editor above + + + Delete selected SQL history entries + + Table window @@ -5012,179 +5457,179 @@ find next SqlEditor - + Cut sql editor 剪切 - + Copy sql editor 复制 - + Paste sql editor 粘贴 - + Delete sql editor 删除 - + Select all sql editor 全选 - + Undo sql editor 撤销 - + Redo sql editor 恢复 - + Complete sql editor 完成 - + Format SQL sql editor 格式化SQL - + Save SQL to file sql editor 保存SQL到文件 - + Select file to save SQL sql editor - + Load SQL from file sql editor 从文件加载SQL - + Delete line sql editor 删除行 - + Move block down sql editor 整块下移 - + Move block up sql editor 整块上移 - + Copy block down sql editor - + Copy up down sql editor - + Find sql editor 查找 - + Find next sql editor 查找下一个 - + Find previous sql editor 查找上一个 - + Replace sql editor 替换 - + Toggle comment sql editor - + Saved SQL contents to file: %1 - + Syntax completion can be used only when a valid database is set for the SQL editor. - + Contents of the SQL editor are huge, so errors detecting and existing objects highlighting are temporarily disabled. - + Save to file 保存到文件 - + Could not open file '%1' for writing: %2 - + SQL scripts (*.sql);;All files (*) SQL文件 (*.sql);;所有文件 (*) - + Open file 打开文件 - + Could not open file '%1' for reading: %2 - + Reached the end of document. Hit the find again to restart the search. 已搜索到文档底部。点击查找从头程序开始搜索。 @@ -5232,24 +5677,24 @@ find next - - + + Cannot edit this cell. Details: %1 - + Structure of this table has changed since last data was loaded. Reload the data to proceed. - + Editing a huge contents in an inline cell editor is not a good idea. It can become slow and inconvenient. It's better to edit such big contents in a Form View, or in popup editor (available under rick-click menu). - + Foreign key for column %2 has more than %1 possible values. It's too much to display in drop down list. You need to edit value manually. @@ -5257,69 +5702,74 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + Uncommitted data - + There are uncommitted data changes. Do you want to proceed anyway? All uncommitted changes will be lost. - + An error occurred while committing the transaction: %1 - + An error occurred while committing the data: %1 - - + + Number of rows per page was decreased to %1 due to number of columns (%2) in the data view. + + + + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows 插入多行 - + Number of rows to insert: @@ -5327,117 +5777,137 @@ find next SqlQueryView - + Go to referenced row in... - + Copy 复制 - + Copy as... 复制为... - + Paste 粘贴 - + Paste as... 粘贴为... - + Set NULL values 设置为NULL - + Erase values 擦除 - + Edit value in editor - + Commit 提交 - + + Copy with headers + + + + Rollback 回滚 - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row 插入行 - + Insert multiple rows 插入多行 - + Delete selected row 删除已选行 - + + Show value in a viewer + + + + Generate query for selected cells - + No items selected to paste clipboard contents to. - + Go to referenced row in table '%1' - + table '%1' - + Referenced row (%1) - + + Trim pasted text? + + + + + The pasted text contains leading or trailing white space. Trim it automatically? + + + + Edit value 编辑值 @@ -5459,6 +5929,119 @@ find next 删除行时发生了错误 %1:%2 + + SqliteExtensionEditor + + + Filter extensions + + + + + Leave empty to use default function + + + + + Extension file + + + + + Initialization function + + + + + Databases + 数据库 + + + + Register in all databases + 在所有数据库中注册 + + + + Register in following databases: + 在下列数据库中注册: + + + + Extension manager window has uncommitted modifications. + + + + + Extension manager + + + + + Commit all extension changes + + + + + Rollback all extension changes + + + + + Add new extension + + + + + Remove selected extension + + + + + Editing extensions manual + + + + + File with given path does not exist or is not readable. + + + + + Unable to load extension: %1 + + + + + Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore. + + + + + Dynamic link libraries (*.dll);;All files (*) + + + + + Shared objects (*.so);;All files (*) + + + + + Dynamic libraries (*.dylib);;All files (*) + + + + + All files (*) + 所有文件 (*) + + + + Open file + 打开文件 + + StatusField @@ -5567,7 +6150,7 @@ but it's okay to use them anyway. - + Foreign column table constraints @@ -5621,24 +6204,24 @@ but it's okay to use them anyway. - + Collate table constraints 排序规则 - + Sort order table constraints 排序 - + Select at least one column. 至少选择一列。 - + Enter a name of the constraint. @@ -6197,7 +6780,7 @@ Are you sure you want to create a table with blank name? - + <p>SQL condition that will be evaluated before the actual trigger code. In case the condition returns false, the trigger will not be fired for that row.</p> @@ -6242,7 +6825,7 @@ Are you sure you want to create a table with blank name? - + DDL DDL @@ -6320,18 +6903,18 @@ Are you sure you want to create a table with blank name? - - + + Data 数据 - + Triggers 触发器 - + DDL DDL @@ -6363,125 +6946,125 @@ Are you sure you want to create a table with blank name? - + Refresh the view view window - + Commit the view changes view window - + Rollback the view changes view window - + Explicit column names - + Generate output column names automatically basing on result columns of the view. - + Add column view window - + Edit column view window - + Delete column view window - + Move column up view window - + Move column down view window - + Refresh trigger list view window - + Create new trigger view window - + Edit selected trigger view window - + Delete selected trigger view window - + View window "%1" has uncommitted structure modifications and data. - + View window "%1" has uncommitted data. - + View window "%1" has uncommitted structure modifications. - + Uncommitted changes - + There are uncommitted structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Committed changes for view '%1' successfully. - + Committed changes for view '%1' (named before '%2') successfully. - + Could not load data for view %1. Error details: %2 @@ -6490,101 +7073,101 @@ Do you want to commit the structure, or do you want to go back to the structure 未提交的更改 - + Go back to structure tab - + Commit modifications and browse data. - + Could not commit view changes. Error message: %1 view window - + Override columns - + Currently defined columns will be overriden. Do you want to continue? - + Could not determinate columns returned from the view. The query is problably incomplete or contains errors. - + Name view window triggers 名称 - + Instead of view window triggers - + Condition view window triggers - + Details table window triggers 详情 - + Could not process the %1 view correctly. Unable to open a view window. - + Empty name - + A blank name for the view is allowed in SQLite, but it is not recommended. Are you sure you want to create a view with blank name? - + The SELECT statement could not be parsed. Please correct the query and retry. Details: %1 - + The view could not be modified due to internal SQLiteStudio error. Please report this! - + The view code could not be parsed properly for execution. This is a SQLiteStudio's bug. Please report it. - + Following problems will take place while modifying the view. Would you like to proceed? view window - + View modification view window diff --git a/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp b/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp index 6448259..9473ab5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp @@ -40,9 +40,9 @@ void uiMessageHandler(QtMsgType type, const QMessageLogContext &context, const Q case QtFatalMsg: msgHandlerThreadProxy->fatal(fatMsg.arg(time, msg)); abort(); -#if QT_VERSION >= 0x050300 +#if QT_VERSION >= 0x050500 case QtInfoMsg: - msgHandlerThreadProxy->fatal(fatMsg.arg(time, msg)); + msgHandlerThreadProxy->debug(fatMsg.arg(time, msg)); break; #endif } diff --git a/SQLiteStudio3/guiSQLiteStudio/uiutils.h b/SQLiteStudio3/guiSQLiteStudio/uiutils.h index 01652b7..455d97c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/uiutils.h +++ b/SQLiteStudio3/guiSQLiteStudio/uiutils.h @@ -20,4 +20,6 @@ GUI_API_EXPORT QPixmap addOpacity(const QPixmap& input, float opacity); GUI_API_EXPORT void limitDialogWidth(QDialog* dialog); GUI_API_EXPORT void fixTextCursorSelectedText(QString& text); +#define UI_PROP_COLUMN "column_name" + #endif // UIUTILS_H diff --git a/SQLiteStudio3/guiSQLiteStudio/widgetresizer.cpp b/SQLiteStudio3/guiSQLiteStudio/widgetresizer.cpp index 4602050..180eb16 100644 --- a/SQLiteStudio3/guiSQLiteStudio/widgetresizer.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/widgetresizer.cpp @@ -135,3 +135,8 @@ void WidgetResizer::setWidgetMinimumSize(int width, int height) { widgetMinimumSize = QSize(width, height); } + +void WidgetResizer::minimizeHeight() +{ + widget->setFixedHeight(widgetMinimumSize.height()); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/widgetresizer.h b/SQLiteStudio3/guiSQLiteStudio/widgetresizer.h index 29e380b..40d1502 100644 --- a/SQLiteStudio3/guiSQLiteStudio/widgetresizer.h +++ b/SQLiteStudio3/guiSQLiteStudio/widgetresizer.h @@ -24,6 +24,7 @@ class GUI_API_EXPORT WidgetResizer : public QWidget QSize getWidgetMinimumSize() const; void setWidgetMinimumSize(const QSize& value); void setWidgetMinimumSize(int width, int height); + void minimizeHeight(); protected: void mouseMoveEvent(QMouseEvent* event); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.cpp deleted file mode 100644 index 7632c8f..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "bugreporthistorywindow.h" -#include "ui_bugreporthistorywindow.h" -#include "common/unused.h" -#include "services/config.h" -#include -#include - -CFG_KEYS_DEFINE(BugReportHistoryWindow) - -BugReportHistoryWindow::BugReportHistoryWindow(QWidget *parent) : - MdiChild(parent), - ui(new Ui::BugReportHistoryWindow) -{ - init(); -} - -BugReportHistoryWindow::~BugReportHistoryWindow() -{ - delete ui; -} - -bool BugReportHistoryWindow::restoreSessionNextTime() -{ - return false; -} - -QVariant BugReportHistoryWindow::saveSession() -{ - return QVariant(); -} - -bool BugReportHistoryWindow::restoreSession(const QVariant& sessionValue) -{ - UNUSED(sessionValue); - return false; -} - -Icon* BugReportHistoryWindow::getIconNameForMdiWindow() -{ - return ICONS.BUG_LIST; -} - -QString BugReportHistoryWindow::getTitleForMdiWindow() -{ - return tr("Reports history"); -} - -void BugReportHistoryWindow::createActions() -{ - createAction(CLEAR_HISTORY, ICONS.CLEAR_HISTORY, tr("Clear reports history"), this, SLOT(clearHistory()), ui->toolBar); - createAction(DELETE_SELECTED, ICONS.DELETE_ROW, tr("Delete selected entry"), this, SLOT(deleteSelected()), ui->toolBar); -} - -void BugReportHistoryWindow::setupDefShortcuts() -{ - setShortcutContext({ - DELETE_SELECTED - }, - Qt::WidgetWithChildrenShortcut); - - BIND_SHORTCUTS(BugReportHistoryWindow, Action); -} - -QToolBar* BugReportHistoryWindow::getToolBar(int toolbar) const -{ - UNUSED(toolbar); - return ui->toolBar; -} - -void BugReportHistoryWindow::init() -{ - ui->setupUi(this); - initActions(); - - reload(); - connect(ui->reportsList->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(updateState())); - connect(CFG, SIGNAL(reportsHistoryRefreshNeeded()), this, SLOT(reload())); - - updateState(); -} - -void BugReportHistoryWindow::updateState() -{ - actionMap[DELETE_SELECTED]->setEnabled(ui->reportsList->selectedItems().size() > 0); -} - -void BugReportHistoryWindow::reload() -{ - static_qstring(urlTpl, "%2"); - QString invalidUrlTpl = tr("Invalid response from server."); - - QList entries = CFG->getReportHistory(); - ui->reportsList->clear(); - ui->reportsList->setRowCount(entries.size()); - - QTableWidgetItem* item = nullptr; - QLabel* urlLabel = nullptr; - int row = 0; - for (const Config::ReportHistoryEntryPtr& entry : entries) - { - item = new QTableWidgetItem((entry->isFeatureRequest ? ICONS.FEATURE_REQUEST : ICONS.BUG), entry->title); - item->setData(ENTRY_ID, entry->id); - ui->reportsList->setItem(row, 0, item); - - item = new QTableWidgetItem(QDateTime::fromTime_t(entry->timestamp).toString("yyyy-MM-dd HH:mm:ss")); - ui->reportsList->setItem(row, 1, item); - - if (entry->url.startsWith("http://")) - urlLabel = new QLabel(urlTpl.arg(entry->url, entry->url)); - else - urlLabel = new QLabel(invalidUrlTpl); - - urlLabel->setOpenExternalLinks(true); - ui->reportsList->setCellWidget(row, 2, urlLabel); - - row++; - } - - ui->reportsList->setHorizontalHeaderLabels({tr("Title"), tr("Reported at"), tr("URL")}); - ui->reportsList->resizeColumnsToContents(); -} - -void BugReportHistoryWindow::clearHistory() -{ - CFG->clearReportHistory(); -} - -void BugReportHistoryWindow::deleteSelected() -{ - QList items = ui->reportsList->selectedItems(); - if (items.size() == 0) - { - qDebug() << "Called BugReportHistoryWindow::deleteSelected(), but there's no row selected."; - return; - } - - int id = items.first()->data(ENTRY_ID).toInt(); - if (id == 0) - { - qDebug() << "Called BugReportHistoryWindow::deleteSelected(), but there's no ID in selected row."; - return; - } - - CFG->deleteReport(id); -} - -bool BugReportHistoryWindow::isUncommitted() const -{ - return false; -} - -QString BugReportHistoryWindow::getQuitUncommittedConfirmMessage() const -{ - return QString(); -} diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.h b/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.h deleted file mode 100644 index 42e518a..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef BUGREPORTHISTORYWINDOW_H -#define BUGREPORTHISTORYWINDOW_H - -#include "mdichild.h" -#include - -namespace Ui { - class BugReportHistoryWindow; -} - -CFG_KEY_LIST(BugReportHistoryWindow, QObject::tr("Reports history window"), - CFG_KEY_ENTRY(DELETE_SELECTED, Qt::Key_Delete, QObject::tr("Delete selected entry")) -) - -class GUI_API_EXPORT BugReportHistoryWindow : public MdiChild -{ - Q_OBJECT - Q_ENUMS(Action) - - public: - enum Action - { - DELETE_SELECTED, - CLEAR_HISTORY - }; - - enum ToolBar - { - TOOLBAR - }; - - explicit BugReportHistoryWindow(QWidget *parent = 0); - ~BugReportHistoryWindow(); - - bool restoreSessionNextTime(); - bool isUncommitted() const; - QString getQuitUncommittedConfirmMessage() const; - - protected: - QVariant saveSession(); - bool restoreSession(const QVariant &sessionValue); - Icon* getIconNameForMdiWindow(); - QString getTitleForMdiWindow(); - void createActions(); - void setupDefShortcuts(); - QToolBar* getToolBar(int toolbar) const; - - private: - enum UserRole - { - ENTRY_ID = Qt::UserRole + 1 - }; - - void init(); - - Ui::BugReportHistoryWindow *ui = nullptr; - - private slots: - void updateState(); - void reload(); - void clearHistory(); - void deleteSelected(); -}; - -#endif // BUGREPORTHISTORYWINDOW_H diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.ui b/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.ui deleted file mode 100644 index 2211ec2..0000000 --- a/SQLiteStudio3/guiSQLiteStudio/windows/bugreporthistorywindow.ui +++ /dev/null @@ -1,55 +0,0 @@ - - - BugReportHistoryWindow - - - - 0 - 0 - 400 - 300 - - - - Form - - - - - - - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - QAbstractItemView::ScrollPerPixel - - - true - - - - Title - - - - - Reported at - - - - - URL - - - - - - - - - diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.cpp index 286924b..5d36683 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.cpp @@ -106,11 +106,11 @@ void CollationsEditor::init() connect(CFG_UI.Fonts.SqlEditor, SIGNAL(changed(QVariant)), this, SLOT(changeFont(QVariant))); // Language plugins - foreach (ScriptingPlugin* plugin, PLUGINS->getLoadedPlugins()) + for (ScriptingPlugin* plugin : PLUGINS->getLoadedPlugins()) ui->langCombo->addItem(plugin->getLanguage()); // Syntax highlighting plugins - foreach (SyntaxHighlighterPlugin* plugin, PLUGINS->getLoadedPlugins()) + for (SyntaxHighlighterPlugin* plugin : PLUGINS->getLoadedPlugins()) highlighterPlugins[plugin->getLanguageName()] = plugin; updateState(); @@ -156,7 +156,7 @@ void CollationsEditor::collationSelected(int row) ui->selectedDatabasesRadio->setChecked(true); updatesForSelection = false; - currentModified = false; + currentModified = model->isModified(row); updateCurrentCollationState(); } @@ -190,7 +190,7 @@ void CollationsEditor::setFont(const QFont& font) void CollationsEditor::help() { - static const QString url = QStringLiteral("http://wiki.sqlitestudio.pl/index.php/User_Manual#Custom_collations"); + static const QString url = QStringLiteral("https://github.com/pawelsalawa/sqlitestudio/wiki/User_Manual#custom-collations"); QDesktopServices::openUrl(QUrl(url, QUrl::StrictMode)); } diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.h b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.h index a75e66b..7b2e469 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.h +++ b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.h @@ -36,7 +36,7 @@ class GUI_API_EXPORT CollationsEditor : public MdiChild TOOLBAR }; - explicit CollationsEditor(QWidget *parent = 0); + explicit CollationsEditor(QWidget *parent = nullptr); ~CollationsEditor(); bool restoreSessionNextTime(); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.ui b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.ui index 97c4e0a..454c12a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.ui +++ b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditor.ui @@ -167,7 +167,11 @@ - + + + QPlainTextEdit::NoWrap + + diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp index 05ca4e1..f04e023 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.cpp @@ -27,7 +27,7 @@ CollationsEditorModel::CollationsEditorModel(QObject *parent) : void CollationsEditorModel::clearModified() { beginResetModel(); - foreach (Collation* coll, collationList) + for (Collation* coll : collationList) coll->modified = false; listModified = false; @@ -41,7 +41,7 @@ bool CollationsEditorModel::isModified() const if (collationList != originalCollationList) return true; - foreach (Collation* coll, collationList) + for (Collation* coll : collationList) { if (coll->modified) return true; @@ -121,7 +121,7 @@ void CollationsEditorModel::setValid(int row, bool valid) bool CollationsEditorModel::isValid() const { - foreach (Collation* coll, collationList) + for (Collation* coll : collationList) { if (!coll->valid) return false; @@ -133,13 +133,12 @@ void CollationsEditorModel::setData(const QList& { beginResetModel(); - Collation* collationPtr = nullptr; - foreach (collationPtr, collationList) + for (Collation* collationPtr : collationList) delete collationPtr; collationList.clear(); - foreach (const CollationManager::CollationPtr& coll, collations) + for (const CollationManager::CollationPtr& coll : collations) collationList << new Collation(coll); listModified = false; @@ -178,8 +177,7 @@ void CollationsEditorModel::deleteCollation(int row) QList CollationsEditorModel::getCollations() const { QList results; - - foreach (Collation* coll, collationList) + for (Collation* coll : collationList) results << coll->data; return results; @@ -188,7 +186,7 @@ QList CollationsEditorModel::getCollations() con QStringList CollationsEditorModel::getCollationNames() const { QStringList names; - foreach (Collation* coll, collationList) + for (Collation* coll : collationList) names << coll->data->name; return names; @@ -199,7 +197,7 @@ void CollationsEditorModel::validateNames() StrHash> counter; int row = 0; - foreach (Collation* coll, collationList) + for (Collation* coll : collationList) { coll->valid &= true; counter[coll->data->name] << row++; @@ -211,7 +209,7 @@ void CollationsEditorModel::validateNames() cntIt.next(); if (cntIt.value().size() > 1) { - foreach (int cntRow, cntIt.value()) + for (int cntRow : cntIt.value()) setValid(cntRow, false); } } @@ -265,7 +263,7 @@ QVariant CollationsEditorModel::data(const QModelIndex& index, int role) const void CollationsEditorModel::init() { - foreach (ScriptingPlugin* plugin, PLUGINS->getLoadedPlugins()) + for (ScriptingPlugin* plugin : PLUGINS->getLoadedPlugins()) langToIcon[plugin->getLanguage()] = QIcon(plugin->getIconPath()); } diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.h b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.h index 0c17c5b..46f7ab5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/windows/collationseditormodel.h @@ -13,7 +13,7 @@ class GUI_API_EXPORT CollationsEditorModel : public QAbstractListModel public: using QAbstractItemModel::setData; - explicit CollationsEditorModel(QObject *parent = 0); + explicit CollationsEditorModel(QObject *parent = nullptr); void clearModified(); bool isModified() const; diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/constrainttabmodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/constrainttabmodel.cpp index 2d8897b..1144fda 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/constrainttabmodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/constrainttabmodel.cpp @@ -16,7 +16,7 @@ int ConstraintTabModel::rowCount(const QModelIndex& parent) const return 0; int cnt = 0; - foreach (SqliteCreateTable::Column* col, createTable->columns) + for (SqliteCreateTable::Column* col : createTable->columns) cnt += col->constraints.size(); cnt += createTable->constraints.size(); @@ -36,9 +36,9 @@ QVariant ConstraintTabModel::data(const QModelIndex& index, int role) const int constrIdx = index.row(); int currIdx = -1; - foreach (SqliteCreateTable::Column* column, createTable->columns) + for (SqliteCreateTable::Column* column : createTable->columns) { - foreach (SqliteCreateTable::Column::Constraint* constr, column->constraints) + for (SqliteCreateTable::Column::Constraint* constr : column->constraints) { currIdx++; @@ -47,7 +47,7 @@ QVariant ConstraintTabModel::data(const QModelIndex& index, int role) const } } - foreach (SqliteCreateTable::Constraint* constr, createTable->constraints) + for (SqliteCreateTable::Constraint* constr : createTable->constraints) { currIdx++; diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/ddlhistorywindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/ddlhistorywindow.cpp index 15b49e5..795158a 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/ddlhistorywindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/ddlhistorywindow.cpp @@ -76,7 +76,7 @@ void DdlHistoryWindow::activated(const QModelIndex& current, const QModelIndex& QStringList contentEntries; QList entries = CFG->getDdlHistoryFor(dbName, dbFile, date); - foreach (Config::DdlHistoryEntryPtr entry, entries) + for (Config::DdlHistoryEntryPtr entry : entries) { contentEntries << templ.arg(entry->dbName).arg(entry->dbFile) .arg(entry->timestamp.toString("yyyy-MM-dd HH:mm:ss")) diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp index 56ab6fe..cd3e135 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp @@ -19,12 +19,14 @@ #include "parser/parser.h" #include "dbobjectdialogs.h" #include "dialogs/exportdialog.h" +#include "themetuner.h" +#include "dialogs/bindparamsdialog.h" +#include "common/bindparam.h" #include #include #include #include #include -#include CFG_KEYS_DEFINE(EditorWindow) EditorWindow::ResultsDisplayMode EditorWindow::resultsDisplayMode; @@ -100,6 +102,7 @@ void EditorWindow::init() createDbCombo(); initActions(); updateShortcutTips(); + setupSqlHistoryMenu(); Db* treeSelectedDb = DBTREE->getSelectedOpenDb(); if (treeSelectedDb) @@ -115,10 +118,12 @@ void EditorWindow::init() // SQL history list ui->historyList->setModel(CFG->getSqlHistoryModel()); + ui->historyList->hideColumn(0); ui->historyList->resizeColumnToContents(1); connect(ui->historyList->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), this, SLOT(historyEntrySelected(QModelIndex,QModelIndex))); connect(ui->historyList, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(historyEntryActivated(QModelIndex))); + connect(ui->historyList, &QWidget::customContextMenuRequested, this, &EditorWindow::sqlHistoryContextMenuRequested); updateState(); } @@ -390,6 +395,7 @@ void EditorWindow::createActions() createAction(SHOW_PREV_TAB, tr("Show previous tab", "sql editor"), this, SLOT(showPrevTab()), this); createAction(FOCUS_RESULTS_BELOW, tr("Focus results below", "sql editor"), this, SLOT(focusResultsBelow()), this); createAction(FOCUS_EDITOR_ABOVE, tr("Focus SQL editor above", "sql editor"), this, SLOT(focusEditorAbove()), this); + createAction(DELETE_SINGLE_HISTORY_SQL, tr("Delete selected SQL history entries", "sql editor"), this, SLOT(deleteSelectedSqlHistory()), ui->historyList); // Static action triggers connect(staticActions[RESULTS_IN_TAB], SIGNAL(triggered()), this, SLOT(updateResultsDisplayMode())); @@ -470,9 +476,15 @@ void EditorWindow::updateShortcutTips() void EditorWindow::execQuery(bool explain) { QString sql = getQueryToExecute(true); + QHash bindParams; + bool proceed = processBindParams(sql, bindParams); + if (!proceed) + return; + resultsModel->setDb(getCurrentDb()); resultsModel->setExplainMode(explain); resultsModel->setQuery(sql); + resultsModel->setParams(bindParams); resultsModel->setQueryCountLimitForSmartMode(queryLimitForSmartExecution); ui->dataView->refreshData(); updateState(); @@ -490,6 +502,61 @@ void EditorWindow::explainQuery() execQuery(true); } +bool EditorWindow::processBindParams(QString& sql, QHash& queryParams) +{ + // Determin dialect + Dialect dialect = Dialect::Sqlite3; + Db* db = getCurrentDb(); + if (db && db->isValid()) + dialect = db->getDialect(); + + // Get all bind parameters from the query + TokenList tokens = Lexer::tokenize(sql, dialect); + TokenList bindTokens = tokens.filter(Token::BIND_PARAM); + + // No bind tokens? Return fast. + if (bindTokens.isEmpty()) + return true; + + // Process bind tokens, prepare list for a dialog. + static_qstring(paramTpl, ":arg%1"); + QString arg; + QVector bindParams; + BindParam* bindParam = nullptr; + int i = 0; + for (const TokenPtr& token : bindTokens) + { + bindParam = new BindParam(); + bindParam->position = i; + bindParam->originalName = token->value; + bindParam->newName = paramTpl.arg(i); + bindParams << bindParam; + i++; + + token->value = bindParam->newName; + } + + // Show dialog to query user for values + BindParamsDialog dialog(MAINWINDOW); + dialog.setBindParams(bindParams); + bool accepted = (dialog.exec() == QDialog::Accepted); + + // Transfer values from dialog to arguments for query + if (accepted) + { + for (BindParam* bindParam : bindParams) + queryParams[bindParam->newName] = bindParam->value; + + sql = tokens.detokenize(); + } + + // Cleanup + for (BindParam* bindParam : bindParams) + delete bindParam; + + return accepted; +} + void EditorWindow::dbChanged() { Db* currentDb = getCurrentDb(); @@ -597,17 +664,29 @@ void EditorWindow::focusEditorAbove() void EditorWindow::historyEntrySelected(const QModelIndex& current, const QModelIndex& previous) { UNUSED(previous); - QString sql = ui->historyList->model()->index(current.row(), 4).data().toString(); + QString sql = ui->historyList->model()->index(current.row(), 5).data().toString(); ui->historyContents->setPlainText(sql); } void EditorWindow::historyEntryActivated(const QModelIndex& current) { - QString sql = ui->historyList->model()->index(current.row(), 4).data().toString(); + QString sql = ui->historyList->model()->index(current.row(), 5).data().toString(); ui->sqlEdit->setPlainText(sql); ui->tabWidget->setCurrentIndex(0); } +void EditorWindow::deleteSelectedSqlHistory() +{ + if (ui->historyList->selectionModel()->selectedIndexes().isEmpty()) + return; + + QList ids; + for (const QModelIndex& idx : ui->historyList->selectionModel()->selectedRows(0)) + ids += idx.data().toLongLong(); + + CFG->deleteSqlHistory(ids); +} + void EditorWindow::clearHistory() { QMessageBox::StandardButton res = QMessageBox::question(this, tr("Clear execution history"), tr("Are you sure you want to erase the entire SQL execution history? " @@ -618,6 +697,19 @@ void EditorWindow::clearHistory() CFG->clearSqlHistory(); } +void EditorWindow::sqlHistoryContextMenuRequested(const QPoint &pos) +{ + actionMap[DELETE_SINGLE_HISTORY_SQL]->setEnabled(!ui->historyList->selectionModel()->selectedIndexes().isEmpty()); + + sqlHistoryMenu->popup(ui->historyList->mapToGlobal(pos)); +} + +void EditorWindow::setupSqlHistoryMenu() +{ + sqlHistoryMenu = new QMenu(this); + sqlHistoryMenu->addAction(actionMap[DELETE_SINGLE_HISTORY_SQL]); +} + void EditorWindow::exportResults() { if (!ExportManager::isAnyPluginAvailable()) diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h index 12486a8..296a9e2 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h +++ b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h @@ -24,14 +24,15 @@ class SqlQueryItem; class SqlEditor; CFG_KEY_LIST(EditorWindow, QObject::tr("SQL editor window"), - CFG_KEY_ENTRY(EXEC_QUERY, Qt::Key_F9, QObject::tr("Execute query")) - CFG_KEY_ENTRY(EXPLAIN_QUERY, Qt::Key_F8, QObject::tr("Execute \"%1\" query").arg("EXPLAIN")) - CFG_KEY_ENTRY(PREV_DB, Qt::CTRL + Qt::Key_Up, QObject::tr("Switch current working database to previous on the list")) - CFG_KEY_ENTRY(NEXT_DB, Qt::CTRL + Qt::Key_Down, QObject::tr("Switch current working database to next on the list")) - CFG_KEY_ENTRY(SHOW_NEXT_TAB, Qt::ALT + Qt::Key_Right, QObject::tr("Go to next editor tab")) - CFG_KEY_ENTRY(SHOW_PREV_TAB, Qt::ALT + Qt::Key_Left, QObject::tr("Go to previous editor tab")) - CFG_KEY_ENTRY(FOCUS_RESULTS_BELOW, Qt::ALT + Qt::Key_PageDown, QObject::tr("Move keyboard input focus to the results view below")) - CFG_KEY_ENTRY(FOCUS_EDITOR_ABOVE, Qt::ALT + Qt::Key_PageUp, QObject::tr("Move keyboard input focus to the SQL editor above")) + CFG_KEY_ENTRY(EXEC_QUERY, Qt::Key_F9, QObject::tr("Execute query")) + CFG_KEY_ENTRY(EXPLAIN_QUERY, Qt::Key_F8, QObject::tr("Execute \"%1\" query").arg("EXPLAIN")) + CFG_KEY_ENTRY(PREV_DB, Qt::CTRL + Qt::Key_Up, QObject::tr("Switch current working database to previous on the list")) + CFG_KEY_ENTRY(NEXT_DB, Qt::CTRL + Qt::Key_Down, QObject::tr("Switch current working database to next on the list")) + CFG_KEY_ENTRY(SHOW_NEXT_TAB, Qt::ALT + Qt::Key_Right, QObject::tr("Go to next editor tab")) + CFG_KEY_ENTRY(SHOW_PREV_TAB, Qt::ALT + Qt::Key_Left, QObject::tr("Go to previous editor tab")) + CFG_KEY_ENTRY(FOCUS_RESULTS_BELOW, Qt::ALT + Qt::Key_PageDown, QObject::tr("Move keyboard input focus to the results view below")) + CFG_KEY_ENTRY(FOCUS_EDITOR_ABOVE, Qt::ALT + Qt::Key_PageUp, QObject::tr("Move keyboard input focus to the SQL editor above")) + CFG_KEY_ENTRY(DELETE_SINGLE_HISTORY_SQL, QKeySequence::Delete, QObject::tr("Delete selected SQL history entries")) ) class GUI_API_EXPORT EditorWindow : public MdiChild @@ -61,7 +62,8 @@ class GUI_API_EXPORT EditorWindow : public MdiChild FOCUS_EDITOR_ABOVE, CLEAR_HISTORY, EXPORT_RESULTS, - CREATE_VIEW_FROM_QUERY + CREATE_VIEW_FROM_QUERY, + DELETE_SINGLE_HISTORY_SQL }; enum ToolBar @@ -114,6 +116,8 @@ class GUI_API_EXPORT EditorWindow : public MdiChild void setupDefShortcuts(); void selectCurrentQuery(bool fallBackToPreviousIfNecessary = false); void updateShortcutTips(); + void setupSqlHistoryMenu(); + bool processBindParams(QString& sql, QHash& queryParams); static const int queryLimitForSmartExecution = 100; @@ -129,6 +133,7 @@ class GUI_API_EXPORT EditorWindow : public MdiChild int sqlEditorNum = 1; qint64 lastQueryHistoryId = 0; QString lastSuccessfulQuery; + QMenu* sqlHistoryMenu = nullptr; private slots: void execQuery(bool explain = false); @@ -146,7 +151,9 @@ class GUI_API_EXPORT EditorWindow : public MdiChild void focusEditorAbove(); void historyEntrySelected(const QModelIndex& current, const QModelIndex& previous); void historyEntryActivated(const QModelIndex& current); + void deleteSelectedSqlHistory(); void clearHistory(); + void sqlHistoryContextMenuRequested(const QPoint &pos); void exportResults(); void createViewFromQuery(); void updateState(); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.ui b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.ui index 924f895..f3f44e3 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.ui +++ b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.ui @@ -51,6 +51,9 @@ Qt::CustomContextMenu + + QPlainTextEdit::NoWrap + @@ -118,11 +121,14 @@ Qt::Vertical + + Qt::CustomContextMenu + true - QAbstractItemView::SingleSelection + QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.cpp index 1bfd1f7..9894098 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.cpp @@ -140,13 +140,13 @@ void FunctionsEditor::init() model->setData(FUNCTIONS->getAllScriptFunctions()); // Language plugins - foreach (ScriptingPlugin* plugin, PLUGINS->getLoadedPlugins()) + for (ScriptingPlugin* plugin : PLUGINS->getLoadedPlugins()) scriptingPlugins[plugin->getLanguage()] = plugin; ui->langCombo->addItems(scriptingPlugins.keys()); // Syntax highlighting plugins - foreach (SyntaxHighlighterPlugin* plugin, PLUGINS->getLoadedPlugins()) + for (SyntaxHighlighterPlugin* plugin : PLUGINS->getLoadedPlugins()) highlighterPlugins[plugin->getLanguageName()] = plugin; updateState(); @@ -204,7 +204,7 @@ void FunctionsEditor::functionSelected(int row) // Arguments ui->argsList->clear(); QListWidgetItem* item = nullptr; - foreach (const QString& arg, model->getArguments(row)) + for (const QString& arg : model->getArguments(row)) { item = new QListWidgetItem(arg); item->setFlags(item->flags() | Qt::ItemIsEditable); @@ -232,7 +232,7 @@ void FunctionsEditor::functionSelected(int row) } updatesForSelection = false; - currentModified = false; + currentModified = model->isModified(row); updateCurrentFunctionState(); } @@ -606,7 +606,7 @@ void FunctionsEditor::applyFilter(const QString& value) void FunctionsEditor::help() { - static const QString url = QStringLiteral("http://wiki.sqlitestudio.pl/index.php/User_Manual#Custom_SQL_functions"); + static const QString url = QStringLiteral("https://github.com/pawelsalawa/sqlitestudio/wiki/User_Manual#custom-sql-functions"); QDesktopServices::openUrl(QUrl(url, QUrl::StrictMode)); } diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.ui b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.ui index b99efe1..17c3859 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.ui +++ b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditor.ui @@ -294,7 +294,11 @@ - + + + QPlainTextEdit::NoWrap + + @@ -310,7 +314,11 @@ - + + + QPlainTextEdit::NoWrap + + @@ -326,7 +334,11 @@ - + + + QPlainTextEdit::NoWrap + + diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp index cf7efdf..623ebd8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/functionseditormodel.cpp @@ -28,7 +28,7 @@ FunctionsEditorModel::FunctionsEditorModel(QObject *parent) : void FunctionsEditorModel::clearModified() { beginResetModel(); - foreach (Function* func, functionList) + for (Function* func : functionList) func->modified = false; listModified = false; @@ -42,7 +42,7 @@ bool FunctionsEditorModel::isModified() const if (functionList != originalFunctionList) return true; - foreach (Function* func, functionList) + for (Function* func : functionList) { if (func->modified) return true; @@ -62,7 +62,7 @@ void FunctionsEditorModel::setModified(int row, bool modified) bool FunctionsEditorModel::isValid() const { - foreach (Function* func, functionList) + for (Function* func : functionList) { if (!func->valid) return false; @@ -199,7 +199,7 @@ void FunctionsEditorModel::setData(const QList functionList.clear(); - foreach (FunctionManager::ScriptFunction* func, functions) + for (FunctionManager::ScriptFunction* func : functions) functionList << new Function(func); listModified = false; @@ -239,7 +239,7 @@ QList FunctionsEditorModel::generateFunctions( { QList results; - foreach (Function* func, functionList) + for (Function* func : functionList) results << new FunctionManager::ScriptFunction(func->data); return results; @@ -248,7 +248,7 @@ QList FunctionsEditorModel::generateFunctions( QStringList FunctionsEditorModel::getFunctionNames() const { QStringList names; - foreach (Function* func, functionList) + for (Function* func : functionList) names << func->data.name; return names; @@ -259,7 +259,7 @@ void FunctionsEditorModel::validateNames() StrHash> counter; int row = 0; - foreach (Function* func, functionList) + for (Function* func : functionList) { func->valid &= true; counter[func->data.name] << row++; @@ -271,7 +271,7 @@ void FunctionsEditorModel::validateNames() cntIt.next(); if (cntIt.value().size() > 1) { - foreach (int cntRow, cntIt.value()) + for (int cntRow : cntIt.value()) setValid(cntRow, false); } } @@ -322,7 +322,7 @@ QVariant FunctionsEditorModel::data(const QModelIndex& index, int role) const void FunctionsEditorModel::init() { - foreach (ScriptingPlugin* plugin, PLUGINS->getLoadedPlugins()) + for (ScriptingPlugin* plugin : PLUGINS->getLoadedPlugins()) langToIcon[plugin->getLanguage()] = QIcon(plugin->getIconPath()); } diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.cpp new file mode 100644 index 0000000..ca45eff --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.cpp @@ -0,0 +1,439 @@ +#include "sqliteextensioneditor.h" +#include "sqliteextensioneditormodel.h" +#include "ui_sqliteextensioneditor.h" +#include "selectabledbmodel.h" +#include "dbtree/dbtree.h" +#include "dbtree/dbtreemodel.h" +#include "common/unused.h" +#include "uiutils.h" +#include "uiconfig.h" +#include "db/db.h" +#include "services/dbmanager.h" +#include "services/notifymanager.h" +#include "common/lazytrigger.h" +#include +#include +#include + +SqliteExtensionEditor::SqliteExtensionEditor(QWidget *parent) : + MdiChild(parent), + ui(new Ui::SqliteExtensionEditor) +{ + init(); +} + +SqliteExtensionEditor::~SqliteExtensionEditor() +{ + delete ui; + probingDb->closeQuiet(); +} + +bool SqliteExtensionEditor::restoreSessionNextTime() +{ + return false; +} + +bool SqliteExtensionEditor::isUncommitted() const +{ + return model->isModified(); +} + +QString SqliteExtensionEditor::getQuitUncommittedConfirmMessage() const +{ + return tr("Extension manager window has uncommitted modifications."); +} + +QVariant SqliteExtensionEditor::saveSession() +{ + return QVariant(); +} + +bool SqliteExtensionEditor::restoreSession(const QVariant& sessionValue) +{ + UNUSED(sessionValue); + return true; +} + +Icon*SqliteExtensionEditor::getIconNameForMdiWindow() +{ + return ICONS.EXTENSION; +} + +QString SqliteExtensionEditor::getTitleForMdiWindow() +{ + return tr("Extension manager"); +} + +void SqliteExtensionEditor::createActions() +{ + createAction(COMMIT, ICONS.COMMIT, tr("Commit all extension changes"), this, SLOT(commit()), ui->toolbar); + createAction(ROLLBACK, ICONS.ROLLBACK, tr("Rollback all extension changes"), this, SLOT(rollback()), ui->toolbar); + ui->toolbar->addSeparator(); + createAction(ADD, ICONS.EXTENSION_ADD, tr("Add new extension"), this, SLOT(newExtension()), ui->toolbar); + createAction(DELETE, ICONS.EXTENSION_DELETE, tr("Remove selected extension"), this, SLOT(deleteExtension()), ui->toolbar); + ui->toolbar->addSeparator(); + createAction(HELP, ICONS.HELP, tr("Editing extensions manual"), this, SLOT(help()), ui->toolbar); +} + +void SqliteExtensionEditor::setupDefShortcuts() +{ +} + +QToolBar* SqliteExtensionEditor::getToolBar(int toolbar) const +{ + UNUSED(toolbar); + return ui->toolbar; +} + +void SqliteExtensionEditor::init() +{ + ui->setupUi(this); + initActions(); + + statusUpdateTrigger = new LazyTrigger(500, this, SLOT(updateCurrentExtensionState())); + + model = new SqliteExtensionEditorModel(this); + extensionFilterModel = new QSortFilterProxyModel(this); + extensionFilterModel->setSourceModel(model); + ui->extensionList->setModel(extensionFilterModel); + + dbListModel = new SelectableDbModel(this); + dbListModel->setDisabledVersion(2); + dbListModel->setSourceModel(DBTREE->getModel()); + ui->databaseList->setModel(dbListModel); + ui->databaseList->expandAll(); + + model->setData(SQLITE_EXTENSIONS->getAllExtensions()); + + connect(ui->extensionList->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(extensionSelected(QItemSelection,QItemSelection))); + connect(ui->extensionList->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(updateState())); + connect(ui->fileEdit, SIGNAL(textChanged(QString)), this, SLOT(updateModified())); + connect(ui->initEdit, SIGNAL(textChanged(QString)), this, SLOT(updateModified())); + connect(ui->allDatabasesRadio, SIGNAL(clicked()), this, SLOT(updateModified())); + connect(ui->selectedDatabasesRadio, SIGNAL(clicked()), this, SLOT(updateModified())); + connect(ui->fileBrowse, SIGNAL(clicked()), this, SLOT(browseForFile())); + connect(ui->fileEdit, SIGNAL(textChanged(QString)), statusUpdateTrigger, SLOT(schedule())); + connect(ui->fileEdit, SIGNAL(textChanged(QString)), this, SLOT(generateName())); + connect(ui->initEdit, SIGNAL(textChanged(QString)), statusUpdateTrigger, SLOT(schedule())); + connect(dbListModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(updateModified())); + + probingDb = DBLIST->createInMemDb(true); + if (!probingDb->openQuiet()) + qWarning() << "Could not open in-memory dtabase for Extension manager window. Probing files will be impossible."; + + initStateForAll(); + updateState(); + updateCurrentExtensionState(); +} + +int SqliteExtensionEditor::getCurrentExtensionRow() const +{ + QModelIndexList idxList = ui->extensionList->selectionModel()->selectedIndexes(); + if (idxList.size() == 0) + return -1; + + return idxList.first().row(); +} + +void SqliteExtensionEditor::extensionDeselected(int row) +{ + statusUpdateTrigger->cancel(); + + model->setFilePath(row, ui->fileEdit->text()); + model->setInitFunction(row, ui->initEdit->text()); + model->setAllDatabases(row, ui->allDatabasesRadio->isChecked()); + model->setModified(row, currentModified); + + if (ui->selectedDatabasesRadio->isChecked()) + model->setDatabases(row, getCurrentDatabases()); + + model->setValid(row, validateExtension(row)); +} + +void SqliteExtensionEditor::extensionSelected(int row) +{ + updatesForSelection = true; + ui->fileEdit->setText(model->getFilePath(row)); + ui->initEdit->setText(model->getInitFunction(row)); + + // Databases + dbListModel->setDatabases(model->getDatabases(row)); + ui->databaseList->expandAll(); + + if (model->getAllDatabases(row)) + ui->allDatabasesRadio->setChecked(true); + else + ui->selectedDatabasesRadio->setChecked(true); + + updatesForSelection = false; + currentModified = model->isModified(row); + + updateCurrentExtensionState(); +} + +void SqliteExtensionEditor::clearEdits() +{ + ui->fileEdit->setText(QString::null); + ui->initEdit->setText(QString::null); + ui->allDatabasesRadio->setChecked(true); +} + +void SqliteExtensionEditor::selectExtension(int row) +{ + if (!model->isValidRowIndex(row)) + return; + + ui->extensionList->selectionModel()->setCurrentIndex(model->index(row), QItemSelectionModel::Clear|QItemSelectionModel::SelectCurrent); +} + +QStringList SqliteExtensionEditor::getCurrentDatabases() const +{ + return dbListModel->getDatabases(); +} + +bool SqliteExtensionEditor::tryToLoad(const QString& filePath, const QString& initFunc, QString* resultError) +{ + if (!probingDb->isOpen()) + { + qWarning() << "Probing database is closed. Cannot evaluate if file" << filePath << "is loadable."; + return true; + } + + bool loadedOk = probingDb->loadExtension(filePath, initFunc.isEmpty() ? QString() : initFunc); + if (!loadedOk && resultError) + *resultError = probingDb->getErrorText(); + + probingDb->closeQuiet(); + probingDb->openQuiet(); + + return loadedOk; +} + +bool SqliteExtensionEditor::validateExtension(bool* fileOk, bool* initOk, QString* fileError) +{ + QString filePath = ui->fileEdit->text(); + QString initFunc = ui->initEdit->text(); + return validateExtension(filePath, initFunc, fileOk, initOk, fileError); +} + +bool SqliteExtensionEditor::validateExtension(int row) +{ + QString filePath = model->getFilePath(row); + QString initFunc = model->getInitFunction(row); + return validateExtension(filePath, initFunc); +} + +bool SqliteExtensionEditor::validateExtension(const QString& filePath, const QString& initFunc, bool* fileOk, bool* initOk, QString* fileError) +{ + bool localFileOk = true; + bool localInitOk = true; + + QFileInfo fileInfo(filePath); + if (!fileInfo.exists() || !fileInfo.isReadable()) + { + localFileOk = false; + *fileError = tr("File with given path does not exist or is not readable."); + } + else + localFileOk = tryToLoad(filePath, initFunc, fileError); + + if (!localFileOk && fileError && fileError->isEmpty()) + *fileError = tr("Unable to load extension: %1").arg(filePath); + + static const QRegularExpression initFuncRegExp("^[a-zA-Z0-9_]*$"); + localInitOk = initFuncRegExp.match(initFunc).hasMatch(); + + if (fileOk) + *fileOk = localFileOk; + + if (initOk) + *initOk = localInitOk; + + return localFileOk && localInitOk; +} + +void SqliteExtensionEditor::initStateForAll() +{ + for (int i = 0, total = model->rowCount(); i < total; ++i) + { + model->setName(i, QFileInfo(model->getFilePath(i)).baseName()); + model->setValid(i, validateExtension(i)); + } +} + +void SqliteExtensionEditor::help() +{ + static const QString url = QStringLiteral("https://github.com/pawelsalawa/sqlitestudio/wiki/User_Manual#sqlite-extensions"); + QDesktopServices::openUrl(QUrl(url, QUrl::StrictMode)); +} + +void SqliteExtensionEditor::commit() +{ + int row = getCurrentExtensionRow(); + if (model->isValidRowIndex(row)) + extensionDeselected(row); + + QList extensions = model->getExtensions(); + + SQLITE_EXTENSIONS->setExtensions(extensions); + model->clearModified(); + currentModified = false; + + if (model->isValidRowIndex(row)) + selectExtension(row); + + updateState(); +} + +void SqliteExtensionEditor::rollback() +{ + int selectedBefore = getCurrentExtensionRow(); + + model->setData(SQLITE_EXTENSIONS->getAllExtensions()); + currentModified = false; + clearEdits(); + + if (model->isValidRowIndex(selectedBefore)) + selectExtension(selectedBefore); + + updateState(); +} + +void SqliteExtensionEditor::newExtension() +{ + model->addExtension(SqliteExtensionManager::ExtensionPtr::create()); + selectExtension(model->rowCount() - 1); +} + +void SqliteExtensionEditor::deleteExtension() +{ + nameGenerationActive = false; + int row = getCurrentExtensionRow(); + model->deleteExtension(row); + clearEdits(); + + row = getCurrentExtensionRow(); + if (model->isValidRowIndex(row)) + extensionSelected(row); + else + updateCurrentExtensionState(); + + nameGenerationActive = true; + updateState(); +} + +void SqliteExtensionEditor::updateState() +{ + bool modified = model->isModified() || currentModified; + bool valid = model->isValid(); + + actionMap[COMMIT]->setEnabled(modified && valid); + actionMap[ROLLBACK]->setEnabled(modified); + actionMap[DELETE]->setEnabled(ui->extensionList->selectionModel()->selectedIndexes().size() > 0); + ui->databaseList->setEnabled(ui->selectedDatabasesRadio->isChecked()); +} + +void SqliteExtensionEditor::updateCurrentExtensionState() +{ + int row = getCurrentExtensionRow(); + bool validRow = model->isValidRowIndex(row); + ui->rightWidget->setEnabled(validRow); + if (!validRow) + { + setValidState(ui->fileEdit, true); + setValidState(ui->initEdit, true); + return; + } + + bool fileOk = true; + bool initOk = true; + QString fileError; + bool allOk = validateExtension(&fileOk, &initOk, &fileError); + + // Display results + setValidState(ui->fileEdit, fileOk, fileError); + setValidState(ui->initEdit, initOk, tr("Invalid initialization function name. Function name can contain only alpha-numeric characters and underscore.")); + ui->databasesGroup->setEnabled(allOk); + model->setValid(row, allOk); + + updateState(); +} + +void SqliteExtensionEditor::extensionSelected(const QItemSelection& selected, const QItemSelection& deselected) +{ + int deselCnt = deselected.indexes().size(); + int selCnt = selected.indexes().size(); + + if (deselCnt > 0) + extensionDeselected(deselected.indexes().first().row()); + + if (selCnt > 0) + extensionSelected(selected.indexes().first().row()); + + if (deselCnt > 0 && selCnt == 0) + { + currentModified = false; + clearEdits(); + } +} + +void SqliteExtensionEditor::updateModified() +{ + if (updatesForSelection) + return; + + int row = getCurrentExtensionRow(); + if (model->isValidRowIndex(row)) + { + bool fileDiff = model->getFilePath(row) != ui->fileEdit->text(); + bool initDiff = model->getInitFunction(row) != ui->initEdit->text(); + bool allDatabasesDiff = model->getAllDatabases(row) != ui->allDatabasesRadio->isChecked(); + bool dbDiff = getCurrentDatabases().toSet() != model->getDatabases(row).toSet(); // QSet to ignore order + + currentModified = (fileDiff || initDiff || allDatabasesDiff || dbDiff); + } + + statusUpdateTrigger->schedule(); +} + +void SqliteExtensionEditor::generateName() +{ + if (!nameGenerationActive) + return; + + int row = getCurrentExtensionRow(); + if (model->isValidRowIndex(row)) + model->setName(row, QFileInfo(ui->fileEdit->text()).baseName()); +} + +void SqliteExtensionEditor::applyFilter(const QString& value) +{ + int row = getCurrentExtensionRow(); + ui->extensionList->selectionModel()->clearSelection(); + + extensionFilterModel->setFilterFixedString(value); + + selectExtension(row); +} + +void SqliteExtensionEditor::browseForFile() +{ + QString dir = getFileDialogInitPath(); + QString filter = +#if defined(Q_OS_WIN) + tr("Dynamic link libraries (*.dll);;All files (*)"); +#elif defined(Q_OS_LINUX) + tr("Shared objects (*.so);;All files (*)"); +#elif defined(Q_OS_OSX) + tr("Dynamic libraries (*.dylib);;All files (*)"); +#else + tr("All files (*)"); +#endif + QString filePath = QFileDialog::getOpenFileName(this, tr("Open file"), dir, filter); + if (filePath.isNull()) + return; + + setFileDialogInitPathByFile(filePath); + + ui->fileEdit->setText(filePath); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.h b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.h new file mode 100644 index 0000000..c8ea3d0 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.h @@ -0,0 +1,94 @@ +#ifndef SQLITEEXTENSIONEDITOR_H +#define SQLITEEXTENSIONEDITOR_H + +#include "icon.h" +#include "mdichild.h" +#include +#include + +namespace Ui { + class SqliteExtensionEditor; +} + +class QToolBar; +class SqliteExtensionEditorModel; +class QSortFilterProxyModel; +class SelectableDbModel; +class Db; +class LazyTrigger; + +class SqliteExtensionEditor : public MdiChild +{ + Q_OBJECT + + public: + enum Action + { + COMMIT, + ROLLBACK, + ADD, + DELETE, + HELP + }; + + enum ToolBar + { + TOOLBAR + }; + + explicit SqliteExtensionEditor(QWidget *parent = nullptr); + ~SqliteExtensionEditor(); + + bool restoreSessionNextTime(); + bool isUncommitted() const; + QString getQuitUncommittedConfirmMessage() const; + + protected: + QVariant saveSession(); + bool restoreSession(const QVariant &sessionValue); + Icon* getIconNameForMdiWindow(); + QString getTitleForMdiWindow(); + void createActions(); + void setupDefShortcuts(); + QToolBar* getToolBar(int toolbar) const; + + private: + void init(); + int getCurrentExtensionRow() const; + void extensionDeselected(int row); + void extensionSelected(int row); + void clearEdits(); + void selectExtension(int row); + QStringList getCurrentDatabases() const; + bool tryToLoad(const QString& filePath, const QString& initFunc, QString* resultError); + bool validateExtension(bool* fileOk = nullptr, bool* initOk = nullptr, QString* fileError = nullptr); + bool validateExtension(int row); + bool validateExtension(const QString& filePath, const QString& initFunc, bool* fileOk = nullptr, bool* initOk = nullptr, QString* fileError = nullptr); + void initStateForAll(); + + Ui::SqliteExtensionEditor *ui; + SqliteExtensionEditorModel* model = nullptr; + QSortFilterProxyModel* extensionFilterModel = nullptr; + SelectableDbModel* dbListModel = nullptr; + bool currentModified = false; + bool updatesForSelection = false; + Db* probingDb = nullptr; + LazyTrigger* statusUpdateTrigger = nullptr; + bool nameGenerationActive = true; + + private slots: + void help(); + void commit(); + void rollback(); + void newExtension(); + void deleteExtension(); + void updateState(); + void updateCurrentExtensionState(); + void extensionSelected(const QItemSelection& selected, const QItemSelection& deselected); + void updateModified(); + void generateName(); + void applyFilter(const QString& value); + void browseForFile(); +}; + +#endif // SQLITEEXTENSIONEDITOR_H diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.ui b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.ui new file mode 100644 index 0000000..747aa7f --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditor.ui @@ -0,0 +1,191 @@ + + + SqliteExtensionEditor + + + + 0 + 0 + 980 + 659 + + + + Form + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + 1 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Filter extensions + + + + + + + + + + + + 4 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + + + Leave empty to use default function + + + + + + + + + + + + + + :/icons/img/directory_open.png:/icons/img/directory_open.png + + + + + + + Extension file + + + + + + + Initialization function + + + + + + + + + + + 0 + 1 + + + + Databases + + + + + + Register in all databases + + + + + + + Register in following databases: + + + + + + + false + + + + + + + + + + + + + + + + + + + + diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.cpp new file mode 100644 index 0000000..6e94a64 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.cpp @@ -0,0 +1,234 @@ +#include "sqliteextensioneditormodel.h" +#include "iconmanager.h" +#include "common/unused.h" + +#include + +#define SETTER(X, Y) \ + if (!isValidRowIndex(row) || X == Y) \ + return; \ + \ + X = Y; \ + emitDataChanged(row); + +#define GETTER(X, Y) \ + if (!isValidRowIndex(row)) \ + return Y; \ + \ + return X; + +SqliteExtensionEditorModel::SqliteExtensionEditorModel(QObject* parent) : + QAbstractListModel(parent) +{ +} + +void SqliteExtensionEditorModel::clearModified() +{ + beginResetModel(); + for (Extension* ext : extensionList) + ext->modified = false; + + listModified = false; + originalExtensionList = extensionList; + endResetModel(); +} + +bool SqliteExtensionEditorModel::isModified() const +{ + if (extensionList != originalExtensionList) + return true; + + for (Extension* ext : extensionList) + { + if (ext->modified) + return true; + } + return false; +} + +bool SqliteExtensionEditorModel::isModified(int row) const +{ + GETTER(extensionList[row]->modified, false); +} + +void SqliteExtensionEditorModel::setModified(int row, bool modified) +{ + SETTER(extensionList[row]->modified, modified); +} + +QString SqliteExtensionEditorModel::getName(int row) const +{ + GETTER(extensionList[row]->name, QString()); +} + +void SqliteExtensionEditorModel::setName(int row, const QString& name) +{ + SETTER(extensionList[row]->name, name); + + QModelIndex idx = index(0); + emit dataChanged(idx, idx, {Qt::DisplayRole}); +} + +void SqliteExtensionEditorModel::setFilePath(int row, const QString& filePath) +{ + SETTER(extensionList[row]->data->filePath, filePath); +} + +QString SqliteExtensionEditorModel::getFilePath(int row) const +{ + GETTER(extensionList[row]->data->filePath, QString()); +} + +void SqliteExtensionEditorModel::setInitFunction(int row, const QString& initFunc) +{ + SETTER(extensionList[row]->data->initFunc, initFunc); +} + +QString SqliteExtensionEditorModel::getInitFunction(int row) const +{ + GETTER(extensionList[row]->data->initFunc, QString()); +} + +void SqliteExtensionEditorModel::setAllDatabases(int row, bool allDatabases) +{ + SETTER(extensionList[row]->data->allDatabases, allDatabases); +} + +bool SqliteExtensionEditorModel::getAllDatabases(int row) const +{ + GETTER(extensionList[row]->data->allDatabases, true); +} + +void SqliteExtensionEditorModel::setDatabases(int row, const QStringList& databases) +{ + SETTER(extensionList[row]->data->databases, databases); +} + +QStringList SqliteExtensionEditorModel::getDatabases(int row) +{ + GETTER(extensionList[row]->data->databases, QStringList()); +} + +bool SqliteExtensionEditorModel::isValid(int row) const +{ + GETTER(extensionList[row]->valid, true); +} + +void SqliteExtensionEditorModel::setValid(int row, bool valid) +{ + SETTER(extensionList[row]->valid, valid); + + QModelIndex idx = index(0); + emit dataChanged(idx, idx, {Qt::DecorationRole}); +} + +bool SqliteExtensionEditorModel::isValid() const +{ + for (Extension* ext : extensionList) + { + if (!ext->valid) + return false; + } + return true; +} + +void SqliteExtensionEditorModel::setData(const QList& extensions) +{ + beginResetModel(); + + for (Extension* extPtr : extensionList) + delete extPtr; + + extensionList.clear(); + + for (const SqliteExtensionManager::ExtensionPtr& ext : extensions) + extensionList << new Extension(ext); + + listModified = false; + originalExtensionList = extensionList; + + endResetModel(); +} + +void SqliteExtensionEditorModel::addExtension(const SqliteExtensionManager::ExtensionPtr& extension) +{ + int row = extensionList.size(); + + beginInsertRows(QModelIndex(), row, row); + + extensionList << new Extension(extension); + listModified = true; + + endInsertRows(); +} + +void SqliteExtensionEditorModel::deleteExtension(int row) +{ + if (!isValidRowIndex(row)) + return; + + beginRemoveRows(QModelIndex(), row, row); + + delete extensionList[row]; + extensionList.removeAt(row); + + listModified = true; + + endRemoveRows(); +} + +QList SqliteExtensionEditorModel::getExtensions() const +{ + QList results; + for (Extension* ext : extensionList) + results << ext->data; + + return results; +} + +bool SqliteExtensionEditorModel::isValidRowIndex(int row) const +{ + return (row >= 0 && row < extensionList.size()); +} + +int SqliteExtensionEditorModel::rowCount(const QModelIndex& parent) const +{ + UNUSED(parent); + return extensionList.size(); +} + +QVariant SqliteExtensionEditorModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid() || !isValidRowIndex(index.row())) + return QVariant(); + + if (role == Qt::DisplayRole) + return getName(index.row()); + + if (role == Qt::DecorationRole) + { + QIcon icon = ICONS.EXTENSION; + if (!isValid(index.row())) + icon = Icon::merge(icon, Icon::ERROR); + + return icon; + } + + return QVariant(); +} + +void SqliteExtensionEditorModel::emitDataChanged(int row) +{ + QModelIndex idx = index(row); + emit dataChanged(idx, idx); +} + +SqliteExtensionEditorModel::Extension::Extension() +{ + data = SqliteExtensionManager::ExtensionPtr::create(); +} + +SqliteExtensionEditorModel::Extension::Extension(const SqliteExtensionManager::ExtensionPtr& other) +{ + data = SqliteExtensionManager::ExtensionPtr::create(*other); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.h b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.h new file mode 100644 index 0000000..085edd9 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/windows/sqliteextensioneditormodel.h @@ -0,0 +1,65 @@ +#ifndef SQLITEEXTENSIONEDITORMODEL_H +#define SQLITEEXTENSIONEDITORMODEL_H + +#include "guiSQLiteStudio_global.h" +#include "services/sqliteextensionmanager.h" +#include +#include +#include + +class GUI_API_EXPORT SqliteExtensionEditorModel : public QAbstractListModel +{ + Q_OBJECT + + public: + using QAbstractItemModel::setData; + + explicit SqliteExtensionEditorModel(QObject* parent = nullptr); + + void clearModified(); + bool isModified() const; + bool isModified(int row) const; + void setModified(int row, bool modified); + QString getName(int row) const; + void setName(int row, const QString& name); + void setFilePath(int row, const QString& filePath); + QString getFilePath(int row) const; + void setInitFunction(int row, const QString& initFunc); + QString getInitFunction(int row) const; + void setAllDatabases(int row, bool allDatabases); + bool getAllDatabases(int row) const; + void setDatabases(int row, const QStringList& databases); + QStringList getDatabases(int row); + bool isValid(int row) const; + void setValid(int row, bool valid); + bool isValid() const; + void setData(const QList& extensions); + void addExtension(const SqliteExtensionManager::ExtensionPtr& extension); + void deleteExtension(int row); + QList getExtensions() const; + bool isValidRowIndex(int row) const; + + int rowCount(const QModelIndex& parent = QModelIndex()) const; + QVariant data(const QModelIndex& index, int role) const; + + private: + struct Extension + { + Extension(); + Extension(const SqliteExtensionManager::ExtensionPtr& other); + + SqliteExtensionManager::ExtensionPtr data; + QString name; + bool modified = false; + bool valid = true; + }; + + void emitDataChanged(int row); + + QList extensionList; + QList originalExtensionList; + QHash langToIcon; + bool listModified = false; +}; + +#endif // SQLITEEXTENSIONEDITORMODEL_H diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/tableconstraintsmodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/tableconstraintsmodel.cpp index 850d8a7..0f95a98 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/tableconstraintsmodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/tableconstraintsmodel.cpp @@ -395,7 +395,7 @@ QString TableConstraintsModel::getConstrDetails(SqliteCreateTable::Constraint* c void TableConstraintsModel::columnRenamed(SqliteCreateTable::Constraint* constr, const QString& oldColumn, const QString& newColumn) { - foreach (SqliteIndexedColumn* idxCol, constr->indexedColumns) + for (SqliteIndexedColumn* idxCol : constr->indexedColumns) { if (idxCol->name.compare(oldColumn, Qt::CaseInsensitive) == 0) { @@ -444,7 +444,7 @@ void TableConstraintsModel::columnModified(const QString& oldColumn, SqliteCreat return; int idx = 0; - foreach (SqliteCreateTable::Constraint* constr, createTable->constraints) + for (SqliteCreateTable::Constraint* constr : createTable->constraints) { if (constr->doesAffectColumn(oldColumn)) { @@ -461,7 +461,7 @@ void TableConstraintsModel::columnDeleted(const QString& column) { QList toDelete; int idx = 0; - foreach (SqliteCreateTable::Constraint* constr, createTable->constraints) + for (SqliteCreateTable::Constraint* constr : createTable->constraints) { if (constr->doesAffectColumn(column)) { @@ -477,6 +477,6 @@ void TableConstraintsModel::columnDeleted(const QString& column) idx++; } - foreach (int idx, toDelete) + for (int idx : toDelete) delConstraint(idx); } diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/tablestructuremodel.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/tablestructuremodel.cpp index 1c817de..62b6613 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/tablestructuremodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/tablestructuremodel.cpp @@ -283,7 +283,7 @@ void TableStructureModel::moveColumnTo(int colIdx, int newIdx) QModelIndex TableStructureModel::findColumn(const QString& columnName, Qt::CaseSensitivity cs) const { int row = 0; - foreach (SqliteCreateTable::Column* col, createTable->columns) + for (SqliteCreateTable::Column* col : createTable->columns) { if (col->name.compare(columnName, cs) == 0) return createIndex(row, 0); @@ -432,7 +432,7 @@ bool TableStructureModel::isColumnPk(SqliteCreateTable::Column* column) const return true; QList constraints = createTable->getConstraints(SqliteCreateTable::Constraint::PRIMARY_KEY); - foreach (SqliteCreateTable::Constraint* constr, constraints) + for (SqliteCreateTable::Constraint* constr : constraints) if (constr->doesAffectColumn(column->name)) return true; @@ -445,7 +445,7 @@ bool TableStructureModel::isColumnFk(SqliteCreateTable::Column* column) const return true; QList constraints = createTable->getConstraints(SqliteCreateTable::Constraint::FOREIGN_KEY); - foreach (SqliteCreateTable::Constraint* constr, constraints) + for (SqliteCreateTable::Constraint* constr : constraints) if (constr->doesAffectColumn(column->name)) return true; @@ -458,7 +458,7 @@ bool TableStructureModel::isColumnUnique(SqliteCreateTable::Column* column) cons return true; QList constraints = createTable->getConstraints(SqliteCreateTable::Constraint::UNIQUE); - foreach (SqliteCreateTable::Constraint* constr, constraints) + for (SqliteCreateTable::Constraint* constr : constraints) if (constr->doesAffectColumn(column->name)) return true; @@ -471,7 +471,7 @@ bool TableStructureModel::isColumnCheck(SqliteCreateTable::Column* column) const return true; QList constraints = createTable->getConstraints(SqliteCreateTable::Constraint::CHECK); - foreach (SqliteCreateTable::Constraint* constr, constraints) + for (SqliteCreateTable::Constraint* constr : constraints) if (constr->expr->getContextColumns(false).contains(column->name, Qt::CaseInsensitive)) return true; diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp index 286aad7..526ae1b 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp @@ -338,10 +338,10 @@ void TableWindow::executeStructureChanges() MessageListDialog dialog(tr("Following problems will take place while modifying the table.\n" "Would you like to proceed?", "table window")); dialog.setWindowTitle(tr("Table modification", "table window")); - foreach (const QString& error, tableModifier->getErrors()) + for (const QString& error : tableModifier->getErrors()) dialog.addError(error); - foreach (const QString& warn, tableModifier->getWarnings()) + for (const QString& warn : tableModifier->getWarnings()) dialog.addWarning(warn); if (dialog.exec() != QDialog::Accepted) @@ -844,9 +844,9 @@ void TableWindow::changesSuccessfullyCommitted() tableModifier->getModifiedTriggers(), tableModifier->getModifiedViews() }; - foreach (const QStringList& objList, modifiedObjects) + for (const QStringList& objList : modifiedObjects) { - foreach (const QString& obj, objList) + for (const QString& obj : objList) { if (obj.compare(oldTable, Qt::CaseInsensitive) == 0) continue; @@ -996,7 +996,7 @@ bool TableWindow::validate(bool skipWarning) hasPk = true; SqliteCreateTable::Column::Constraint* colConstraint = nullptr; - foreach (SqliteCreateTable::Column* column, createTable->columns) + for (SqliteCreateTable::Column* column : createTable->columns) { colConstraint = column->getConstraint(SqliteCreateTable::Column::Constraint::PRIMARY_KEY); if (colConstraint) @@ -1112,8 +1112,8 @@ void TableWindow::updateDdlTab() void TableWindow::updateNewTableState() { - for (int i = 1; i < 5; i++) - ui->tabWidget->setTabEnabled(i, existingTable); + for (QWidget* tab : {ui->dataTab, ui->constraintsTab, ui->indexesTab, ui->triggersTab}) + ui->tabWidget->setTabEnabled(ui->tabWidget->indexOf(tab), existingTable); actionMap[EXPORT]->setEnabled(existingTable); actionMap[IMPORT]->setEnabled(existingTable); @@ -1466,7 +1466,7 @@ void TableWindow::updateIndexes() QTableWidgetItem* item = nullptr; int row = 0; - foreach (SqliteCreateIndexPtr index, indexes) + for (SqliteCreateIndexPtr index : indexes) { item = new QTableWidgetItem(index->index); item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); @@ -1518,7 +1518,7 @@ void TableWindow::updateTriggers() QTableWidgetItem* item = nullptr; QString timeAndEvent; int row = 0; - foreach (SqliteCreateTriggerPtr trig, triggers) + for (SqliteCreateTriggerPtr trig : triggers) { item = new QTableWidgetItem(trig->trigger); item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.cpp index be805af..c7ec7d8 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.cpp @@ -259,6 +259,13 @@ void ViewWindow::init() updateQueryToolbarStatus(); updateTriggersState(); updateColumnButtons(); + updateAfterInit(); +} + +void ViewWindow::updateAfterInit() +{ + for (QWidget* tab : {ui->dataTab, ui->triggersTab}) + ui->tabWidget->setTabEnabled(ui->tabWidget->indexOf(tab), existingView); } void ViewWindow::newView() @@ -624,6 +631,7 @@ void ViewWindow::changesSuccessfullyCommitted() initView(); updateQueryToolbarStatus(); updateWindowTitle(); + updateAfterInit(); if (oldView.compare(view, Qt::CaseInsensitive) == 0) notifyInfo(tr("Committed changes for view '%1' successfully.").arg(view)); @@ -874,7 +882,7 @@ void ViewWindow::refreshTriggers() QTableWidgetItem* item = nullptr; QString event; int row = 0; - foreach (SqliteCreateTriggerPtr trig, triggers) + for (SqliteCreateTriggerPtr trig : triggers) { item = new QTableWidgetItem(trig->trigger); item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); @@ -1017,10 +1025,10 @@ void ViewWindow::executeStructureChanges() MessageListDialog dialog(tr("Following problems will take place while modifying the view.\n" "Would you like to proceed?", "view window")); dialog.setWindowTitle(tr("View modification", "view window")); - foreach (const QString& error, viewModifier->getErrors()) + for (const QString& error : viewModifier->getErrors()) dialog.addError(error); - foreach (const QString& warn, viewModifier->getWarnings()) + for (const QString& warn : viewModifier->getWarnings()) dialog.addWarning(warn); if (dialog.exec() != QDialog::Accepted) diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.h b/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.h index 6144ad8..1a8b5b3 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.h +++ b/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.h @@ -96,6 +96,7 @@ class GUI_API_EXPORT ViewWindow : public MdiChild private: void init(); + void updateAfterInit(); void newView(); void initView(); void setupCoverWidget(); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.ui b/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.ui index 9112280..8c17205 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.ui +++ b/SQLiteStudio3/guiSQLiteStudio/windows/viewwindow.ui @@ -29,7 +29,7 @@ - 2 + 0 @@ -143,7 +143,11 @@ - + + + QPlainTextEdit::NoWrap + + -- cgit v1.2.3