From: <ibr...@us...> - 2013-09-27 10:09:04
|
Revision: 4852 http://sourceforge.net/p/tora/code/4852 Author: ibre5041 Date: 2013-09-27 10:08:59 +0000 (Fri, 27 Sep 2013) Log Message: ----------- Connection change fixes. "description" is no more "unique" toConnection identifier - class toConnectionOptions is used now Modified Paths: -------------- trunk/tora/src/core/tochangeconnection.cpp trunk/tora/src/core/toconnection.cpp trunk/tora/src/core/toconnectionoptions.cpp trunk/tora/src/core/toconnectionoptions.h trunk/tora/src/core/toconnectionregistry.cpp trunk/tora/src/core/toconnectionregistry.h trunk/tora/src/core/tomain.cpp trunk/tora/src/core/tomain.h trunk/tora/src/core/totool.cpp trunk/tora/src/core/totool.h trunk/tora/src/tools/toscriptschemawidget.cpp trunk/tora/src/tools/toscriptschemawidget.h trunk/tora/src/tools/toscripttreemodel.cpp trunk/tora/src/tools/toscripttreemodel.h Modified: trunk/tora/src/core/tochangeconnection.cpp =================================================================== --- trunk/tora/src/core/tochangeconnection.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/tochangeconnection.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -41,6 +41,7 @@ #include "core/tochangeconnection.h" #include "core/toconnection.h" +#include "core/toconnectionoptions.h" #include "core/toconnectionregistry.h" #include "core/tomainwindow.h" #include "core/totool.h" @@ -85,12 +86,13 @@ QList<toConnection*> const& cons = toConnectionRegistrySing::Instance().connections(); foreach(toConnection const * i, cons) { - if (toToolWidget::currentTool(this)->canHandle(toConnectionRegistrySing::Instance().connection(i->description()))) + if (toToolWidget::currentTool(this)->canHandle(*i)) { // TODO use QAbstractListModel QModelIndex data here. display also QPixmap QAction *act = menu()->addAction(i->description()); act->setCheckable(true); - if (conn.description() == i->description()) + act->setData(QVariant::fromValue(i->connectionOptions())); + if (conn.connectionOptions() == i->connectionOptions()) act->setChecked(true); else act->setChecked(false); @@ -108,7 +110,7 @@ try { - toConnection &con = toConnectionRegistrySing::Instance().connection(act->text()); + toConnection &con = toConnectionRegistrySing::Instance().connection(act->data().value<toConnectionOptions>()); toToolWidget *tool = toToolWidget::currentTool(parentWidget()); if (tool) { Modified: trunk/tora/src/core/toconnection.cpp =================================================================== --- trunk/tora/src/core/toconnection.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/toconnection.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -321,8 +321,10 @@ if (this->ConnectionOptions == tool->connection().connectionOptions()) toolCnt++; } - // +1: This widget was not yet regitered with toWorkSpaceSingle. (See: toTool::createWindow()) - Q_ASSERT_X(toolCnt+1 == Widgets.size(), qPrintable(__QHERE__), "Widgets.size() != toolCnt"); + // +1: This widget was not yet regitered with toWorkSpaceSingle(has no parent). (See: toTool::createWindow()) + if (widget->parent() == NULL) + toolCnt++; + Q_ASSERT_X(toolCnt == Widgets.size(), qPrintable(__QHERE__), "Widgets.size() != toolCnt"); #endif } Modified: trunk/tora/src/core/toconnectionoptions.cpp =================================================================== --- trunk/tora/src/core/toconnectionoptions.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/toconnectionoptions.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -89,18 +89,31 @@ return *this; } -bool toConnectionOptions::operator==(const toConnectionOptions &other) +bool toConnectionOptions::operator==(const toConnectionOptions &other) const { - return provider == other.provider - && host == other.host - && database == other.database - && username == other.username - && schema == other.schema - && color == other.color - && schema == other.schema; + if ( provider != other.provider + || host != other.host + || database != other.database + || username != other.username + || schema != other.schema + || color != other.color + || port != other.port) + return false; + + if (options.size() != other.options.size()) + return false; + + QStringList opts1 = options.toList(); qSort(opts1); + QStringList opts2 = other.options.toList(); qSort(opts2); + for(int i = 0; i < opts1.size(); i++) + { + if (opts1.at(i) != opts2.at(i)) + return false; + } + return true; } -bool toConnectionOptions::operator==(const toConnection &conn) +bool toConnectionOptions::operator==(const toConnection &conn) const { return conn.provider() == provider && conn.host() == (host + ":" + QString::number(port)) @@ -109,3 +122,43 @@ && conn.color() == color && (schema.isEmpty() || (conn.schema() == schema)); } + +template<> bool qMapLessThanKey<toConnectionOptions>(const toConnectionOptions &key1, const toConnectionOptions &key2) + +{ + if (key1.provider != key2.provider) + return key1.provider > key2.provider; + if (key1.database != key2.database) + return key1.database > key2.database; + if (key1.port != key2.port) + return key1.port > key2.port; + if (key1.host != key2.host) + return key1.host > key2.host; + if (key1.username != key2.username) + return key1.username > key2.username; + if (key1.schema != key2.schema) + return key1.schema > key2.schema; + if (key1.color != key2.color) + return key1.color > key2.color; + if (key1.options.size() != key2.options.size()) + return key1.options.size() > key2.options.size(); + QStringList opts1 = key1.options.toList(); qSort(opts1); + QStringList opts2 = key2.options.toList(); qSort(opts2); + for(int i = 0; i < opts1.size(); i++) + { + if (opts1.at(i) != opts2.at(i)) + return opts1.at(i) > opts2.at(i); + } + return false; +} + +QString toConnectionOptions::toString() const +{ + return QString("%1/%2@%3s:schema=%4;color=%5;port=%6;options=???") + .arg(username) + .arg(password) + .arg(database) + .arg(schema) + .arg(color) + .arg(port); +} Modified: trunk/tora/src/core/toconnectionoptions.h =================================================================== --- trunk/tora/src/core/toconnectionoptions.h 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/toconnectionoptions.h 2013-09-27 10:08:59 UTC (rev 4852) @@ -45,6 +45,7 @@ #include <QtCore/QMetaType> #include <QtCore/QString> #include <QtCore/QSet> +#include <QtCore/QMap> class toConnection; @@ -72,9 +73,11 @@ toConnectionOptions(toConnectionOptions const& other); toConnectionOptions& operator=(const toConnectionOptions &other); - bool operator==(const toConnectionOptions &other); - bool operator==(const toConnection &conn); + bool operator==(const toConnectionOptions &other) const; + bool operator==(const toConnection &conn) const; + QString toString() const; + QString provider, host, database, username, password, schema, color; quint16 port; QSet<QString> options; @@ -82,5 +85,7 @@ Q_DECLARE_METATYPE(toConnectionOptions) +template<> bool qMapLessThanKey<toConnectionOptions>(const toConnectionOptions &key1, const toConnectionOptions &key2); + #endif Modified: trunk/tora/src/core/toconnectionregistry.cpp =================================================================== --- trunk/tora/src/core/toconnectionregistry.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/toconnectionregistry.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -42,6 +42,7 @@ #include "core/toconnectionregistry.h" #include "core/toconnection.h" #include "core/utils.h" +#include "ts_log/ts_log_utils.h" #include <QtGui/QAction> @@ -56,19 +57,12 @@ return m_ConnectionsList.empty(); } -void toConnectionRegistry::changeConnection(QAction *act) +void toConnectionRegistry::changeConnection(const toConnectionOptions &opts) { - changeConnection(act->text()); -} - -void toConnectionRegistry::changeConnection(QString description) -{ - if (description.isEmpty()) // All connections were closed - m_currentConnectionDescription = description; - else if( m_ConnectionsMap.contains(description)) - m_currentConnectionDescription = description; + if( m_ConnectionsMap.contains(opts)) + m_currentConnection = opts; else - throw QString("Unregistered connection(change): %1").arg(description); + throw QString("Unregistered connection(change): %1").arg(opts.toString()); } int toConnectionRegistry::rowCount(const QModelIndex &) const @@ -78,33 +72,33 @@ void toConnectionRegistry::addConnection(toConnection *conn) { - QString const& description = conn->description(); conn->setParent(this); - if(m_ConnectionsMap.contains(description)) + if(m_ConnectionsMap.contains(conn->connectionOptions())) { + QString opsStr = conn->connectionOptions().toString(); delete conn; - throw QString("Duplicit connection: %1").arg(description); + throw QString("Duplicit connection: %1").arg(opsStr); } if(m_ConnectionsList.empty()) - m_currentConnectionDescription = description; + m_currentConnection = conn->connectionOptions(); beginInsertRows(QModelIndex(), m_ConnectionsList.size(), m_ConnectionsList.size()); - m_ConnectionsMap.insert(description, conn); + m_ConnectionsMap.insert(conn->connectionOptions(), conn); m_ConnectionsList.append(conn); endInsertRows(); } void toConnectionRegistry::removeConnection(toConnection *conn) { - QString const& description = conn->description(); +// QString const& description = conn->description(); - QList<QString> descriptions = m_ConnectionsMap.keys(conn); - if(descriptions.size() != 1 || !m_ConnectionsList.contains(conn)) + QList<toConnectionOptions> conns = m_ConnectionsMap.keys(conn); + if(conns.size() != 1 || !m_ConnectionsList.contains(conn)) { conn->setParent(this); - throw QString("Unregistered connection: %1").arg(description); + throw QString("Unregistered connection for removal: %1").arg(conn->description()); } // TODO if TCP connection is lost this can hang "forever" - preventing application exit // There must be some ugly way of doing this asynchronously in bg thread: @@ -114,8 +108,7 @@ int pos = m_ConnectionsList.indexOf(conn); beginRemoveRows(QModelIndex(), pos, pos); - int mRemoved = m_ConnectionsMap.remove(descriptions.at(0)); - //int lRemoved = + int mRemoved = m_ConnectionsMap.remove(conns.at(0)); m_ConnectionsList.removeAt(pos); endRemoveRows(); } @@ -123,6 +116,9 @@ QVariant toConnectionRegistry::data(const QModelIndex &idx, int role) const { static QVariant nothing; + + Q_ASSERT_X(idx.row() < m_ConnectionsList.size(), qPrintable(__QHERE__), "index out of range"); + switch(role) { case Qt::DisplayRole: @@ -132,6 +128,8 @@ QString const& color = m_ConnectionsList.at(idx.row())->color(); return QVariant(Utils::connectionColorPixmap(color)); } + case Qt::UserRole: + return QVariant::fromValue(m_ConnectionsList.at(idx.row())->connectionOptions()); default: return nothing; } @@ -139,18 +137,34 @@ toConnection& toConnectionRegistry::currentConnection() { - if( m_ConnectionsMap.contains(m_currentConnectionDescription)) - return *m_ConnectionsMap.value(m_currentConnectionDescription); + if( m_ConnectionsMap.contains(m_currentConnection)) + return *m_ConnectionsMap.value(m_currentConnection); throw tr("Can't find active connection"); } -toConnection& toConnectionRegistry::connection(const QString &str) +toConnection& toConnectionRegistry::connection(const toConnectionOptions &opt) { - if( m_ConnectionsMap.contains(str)) - return *m_ConnectionsMap.value(str); - throw tr("Couldn't find specified connectionts (%1)").arg(str); + if( m_ConnectionsMap.contains(opt)) + return *m_ConnectionsMap.value(opt); + throw tr("Couldn't find specified connectionts (%1)").arg(opt.toString()); } +void toConnectionRegistry::currentIndexChanged(int idx) +{ + if (idx == -1) + { + m_currentConnection = toConnectionOptions(); + return; // No connection + } + Q_ASSERT_X(idx < m_ConnectionsList.size(), qPrintable(__QHERE__), qPrintable(QString("Connection index out of range: %1").arg(idx))); + QModelIndex i = index(idx, 0); + QVariant val = data(i, Qt::UserRole); + if (m_ConnectionsMap.contains(val.value<toConnectionOptions>())) + m_currentConnection = val.value<toConnectionOptions>(); + else + throw tr("Can't find active connection"); +} + QList<toConnection*> const& toConnectionRegistry::connections(void) const { return m_ConnectionsList; Modified: trunk/tora/src/core/toconnectionregistry.h =================================================================== --- trunk/tora/src/core/toconnectionregistry.h 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/toconnectionregistry.h 2013-09-27 10:08:59 UTC (rev 4852) @@ -43,6 +43,7 @@ #define TOCONNECTION_REGISTRY_H #include "core/tora_export.h" +#include "core/toconnectionoptions.h" #include "loki/Singleton.h" #include <QtCore/QAbstractListModel> @@ -64,9 +65,7 @@ */ // TODO - duno how to implement this // see void toChangeConnection::changeConnection(QAction *act) - //void changeConnection(void); - void changeConnection(QAction *act); // this one is not used yet - void changeConnection(QString); + void changeConnection(const toConnectionOptions &); /** * Get a list of currently open connections. @@ -78,7 +77,7 @@ * @return A reference to a connection. * @exception QString If connection wasn't found. */ - toConnection& connection(const QString &); + toConnection& connection(const toConnectionOptions &); /** * Get the current database connection @@ -93,10 +92,11 @@ // QAbstractListModel interface int rowCount(const QModelIndex &) const; QVariant data(const QModelIndex &,int) const; - +public slots: + void currentIndexChanged(int); private: - QString m_currentConnectionDescription; - QMap<QString, toConnection *> m_ConnectionsMap; + toConnectionOptions m_currentConnection; + QMap<toConnectionOptions, toConnection *> m_ConnectionsMap; QList<toConnection *> m_ConnectionsList; }; Modified: trunk/tora/src/core/tomain.cpp =================================================================== --- trunk/tora/src/core/tomain.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/tomain.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -48,6 +48,7 @@ #include "core/toraversion.h" #include "core/toconnectionprovider.h" #include "core/toconnectionregistry.h" +#include "core/toconnectionoptions.h" #include "core/tonewconnection.h" #include "core/todockbar.h" #include "core/tomemoeditor.h" @@ -456,10 +457,12 @@ ConnectionSelection->setMinimumWidth(300); ConnectionSelection->setFocusPolicy(Qt::NoFocus); connectionToolbar->addWidget(ConnectionSelection); - connect(ConnectionSelection, SIGNAL(activated(int)), this, SLOT(changeConnection())); - connect(ConnectionSelection, SIGNAL(currentIndexChanged(QString)), this, SLOT(changeConnection(QString))); ConnectionSelection->setModel(&toConnectionRegistrySing::Instance()); + //connect(ConnectionSelection, SIGNAL(activated(int)), this, SLOT(connectionSelectionChanged())); + connect(ConnectionSelection, SIGNAL(currentIndexChanged(QString)), this, SLOT(connectionSelectionChanged())); + connect(ConnectionSelection, SIGNAL(currentIndexChanged(int)), &toConnectionRegistrySing::Instance(), SLOT(currentIndexChanged(int))); + addToolBarBreak(); toolsToolbar = Utils::toAllocBar(this, tr("Tools")); @@ -945,9 +948,7 @@ enableConnectionActions(true); checkCaching(); - - changeConnection(); - + connectionSelectionChanged(); // New connection was added - create a default tool for it createDefault(); } @@ -971,7 +972,7 @@ bool toMain::delCurrentConnection(void) { - toConnection &conn = Connections.connection(ConnectionSelection->currentText()); + toConnection &conn = Connections.currentConnection(); if (conn.needCommit()) { QString str = tr("Commit work in session to %1 before " @@ -1006,7 +1007,7 @@ if (ConnectionSelection->count() == 0) enableConnectionActions(false); else - changeConnection(); + connectionSelectionChanged(); return true; } @@ -1152,16 +1153,11 @@ } } -void toMain::changeConnection(void) +void toMain::connectionSelectionChanged(void) { enableConnectionActions(true); } -void toMain::changeConnection(QString description) -{ - toConnectionRegistrySing::Instance().changeConnection(description); -} - void toMain::editOpenFile(const QString &file) { toWorksheet *sheet = 0; Modified: trunk/tora/src/core/tomain.h =================================================================== --- trunk/tora/src/core/tomain.h 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/tomain.h 2013-09-27 10:08:59 UTC (rev 4852) @@ -190,9 +190,8 @@ /** Change current connection */ - void changeConnection(void); + void connectionSelectionChanged(void); - void changeConnection(QString description); /** Open a file in sql worksheet */ void editOpenFile(const QString &file); Modified: trunk/tora/src/core/totool.cpp =================================================================== --- trunk/tora/src/core/totool.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/totool.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -84,36 +84,39 @@ Connection->addWidget(Widget); } -void toConnectionWidget::setConnection(toConnection &conn) +toConnectionWidget::toConnectionWidget(QWidget *widget) + : Widget(widget) { - if (Connection) - Connection->delWidget(Widget); - Connection = &conn; - Connection->addWidget(Widget); + Connection = &toConnection::currentConnection(widget->parentWidget()); } -toConnectionWidget::toConnectionWidget(QWidget *widget) - : Widget(widget) +void toConnectionWidget::setConnection(toConnection &conn) { - Connection = NULL; + toConnection *oldConnection(Connection); + Connection = &conn; // 1st change "registration" to toConnection + oldConnection->delWidget(Widget); // then notify old connection about the change + Connection->addWidget(Widget); } toConnectionWidget::~toConnectionWidget() { - if (Connection) - Connection->delWidget(Widget); + Connection->delWidget(Widget); } -toConnection &toConnectionWidget::connection() +toConnection& toConnectionWidget::connection() { if (Connection) return *Connection; - QWidget *widget = Widget; - if (!widget) + if (!Widget) throw qApp->translate("toConnectionWidget", "toConnectionWidget not inherited with a QWidget"); - return toConnection::currentConnection(widget->parentWidget()); + return toConnection::currentConnection(Widget->parentWidget()); } +const toConnection& toConnectionWidget::connection() const +{ + return *Connection; +} + toToolWidget::toToolWidget(toTool &tool, const QString &ctx, QWidget *parent, toConnection &conn, const char *name) : QWidget(parent), toHelpContext(ctx), @@ -362,9 +365,6 @@ // Some tools like toOutput return NULL if there is one window for session opened if (newWin) toWorkSpaceSingle::Instance().addToolWidget(newWin); - - // main->windowActivated(newsub); - // main->updateWindowsMenu(); } TOCATCH; Modified: trunk/tora/src/core/totool.h =================================================================== --- trunk/tora/src/core/totool.h 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/core/totool.h 2013-09-27 10:08:59 UTC (rev 4852) @@ -286,13 +286,12 @@ */ class toConnectionWidget { - toConnection *Connection; - QWidget *Widget; public: /** Constructor with the connection it should be set to initially. */ toConnectionWidget(toConnection &conn, QWidget *widget); /** Constructor without a connection. Will inherit the connection from a parent connection widget. + * NOTE: not used yet */ toConnectionWidget(QWidget *widget); /** Destructor. @@ -303,7 +302,11 @@ virtual void setConnection(toConnection &conn); /** Get the connection it is pointed to. */ - virtual toConnection &connection(); + virtual toConnection& connection(); + virtual const toConnection& connection() const; +private: + toConnection *Connection; + QWidget *Widget; }; /** Simple baseclass for widgets defining the main tool widget. It is in Modified: trunk/tora/src/tools/toscriptschemawidget.cpp =================================================================== --- trunk/tora/src/tools/toscriptschemawidget.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/tools/toscriptschemawidget.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -96,7 +96,7 @@ SchemaComboBox->blockSignals(true); SchemaComboBox->clear(); - toConnection &conn = toConnectionRegistrySing::Instance().connection(connectionString()); + toConnection &conn = toConnectionRegistrySing::Instance().connection(this->connectionOptions()); toQList schema = toQuery::readQuery(conn, SQLSchemas, toQueryParams()); SchemaComboBox->addItem(tr("All")); while (schema.size() > 0) @@ -109,9 +109,11 @@ SchemaComboBox->setCurrentIndex(ix); } -QString toScriptSchemaWidget::connectionString() +toConnectionOptions toScriptSchemaWidget::connectionOptions() { - return ConnectionComboBox->currentText(); + QModelIndex i = ConnectionComboBox->model()->index(ConnectionComboBox->currentIndex(), 0); + QVariant data = ConnectionComboBox->model()->data(i, Qt::UserRole); + return data.value<toConnectionOptions>(); } void toScriptSchemaWidget::setConnectionString(const QString & c) @@ -145,7 +147,7 @@ setEnabled(false); WorkingWidget->show(); QCoreApplication::processEvents(); - Model->setupModelData(ConnectionComboBox->currentText(), schema); + Model->setupModelData(this->connectionOptions(), schema); WorkingWidget->hide(); setEnabled(true); } Modified: trunk/tora/src/tools/toscriptschemawidget.h =================================================================== --- trunk/tora/src/tools/toscriptschemawidget.h 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/tools/toscriptschemawidget.h 2013-09-27 10:08:59 UTC (rev 4852) @@ -44,6 +44,8 @@ #include "ui_toscriptschemawidgetui.h" +#include "core/toconnectionoptions.h" + class toScriptTreeModel; @@ -67,8 +69,8 @@ //! Create commin string list with all selected objects for given QTreeView QItemSelectionModel * objectList(); - //! Return current connection string - QString connectionString(); + //! Return current connection options + toConnectionOptions connectionOptions(); /*! Set the connection string from outside of this widget. \param c QString which will be set when its already in the ConnectionComboBox Modified: trunk/tora/src/tools/toscripttreemodel.cpp =================================================================== --- trunk/tora/src/tools/toscripttreemodel.cpp 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/tools/toscripttreemodel.cpp 2013-09-27 10:08:59 UTC (rev 4852) @@ -243,7 +243,7 @@ "", "0703"); -void toScriptTreeModel::setupModelData(const QString & connId, const QString & schema) +void toScriptTreeModel::setupModelData(const toConnectionOptions& connId, const QString & schema) { // TLOG(2,toDecorator,__HERE__) << "void toScriptTreeModel::setupModelData(const QString & schema)" << schema; // clear old contents Modified: trunk/tora/src/tools/toscripttreemodel.h =================================================================== --- trunk/tora/src/tools/toscripttreemodel.h 2013-09-26 14:42:17 UTC (rev 4851) +++ trunk/tora/src/tools/toscripttreemodel.h 2013-09-27 10:08:59 UTC (rev 4852) @@ -46,6 +46,7 @@ class QModelIndex; class toScriptTreeItem; +class toConnectionOptions; /*! \brief A tree model for QTreeView used in toScriptSchemaWidget. @@ -70,11 +71,11 @@ int columnCount(const QModelIndex &parent = QModelIndex()) const; /*! \brief Reset the model with newly readed data from database. - \param connId a connection string indentifier. + \param connId toConnectionOptions key indentifier for toConnectionRegistry \param schema it can be null. When it's given, the SQL statements will use WHERE clause with this string. */ - void setupModelData(const QString & connId, const QString & schema = 0); + void setupModelData(const toConnectionOptions& connId, const QString & schema = 0); private: //! An universal root item. It's deleted and recreated in setupModelData() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |