summaryrefslogtreecommitdiffstats
path: root/kexi/core/kexipartmanager.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
commit8362bf63dea22bbf6736609b0f49c152f975eb63 (patch)
tree0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kexi/core/kexipartmanager.cpp
downloadkoffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz
koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kexi/core/kexipartmanager.cpp')
-rw-r--r--kexi/core/kexipartmanager.cpp280
1 files changed, 280 insertions, 0 deletions
diff --git a/kexi/core/kexipartmanager.cpp b/kexi/core/kexipartmanager.cpp
new file mode 100644
index 00000000..8525c2d7
--- /dev/null
+++ b/kexi/core/kexipartmanager.cpp
@@ -0,0 +1,280 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Lucijan Busch <lucijan@kde.org>
+ Copyright (C) 2003-2005 Jaroslaw Staniek <js@iidea.pl>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <klibloader.h>
+#include <ktrader.h>
+#include <kdebug.h>
+#include <kconfig.h>
+#include <kparts/componentfactory.h>
+
+#include "kexipartmanager.h"
+#include "kexipart.h"
+#include "kexipartinfo.h"
+#include "kexistaticpart.h"
+#include "kexi_version.h"
+
+#include <kexidb/connection.h>
+#include <kexidb/cursor.h>
+
+using namespace KexiPart;
+
+Manager::Manager(QObject *parent)
+ : QObject(parent)
+{
+ m_lookupDone = false;
+ m_partlist.setAutoDelete(true);
+ m_partsByMime.setAutoDelete(false);
+ m_parts.setAutoDelete(false);//KApp will remove parts
+ m_nextTempProjectPartID = -1;
+}
+
+void
+Manager::lookup()
+{
+//js: TODO: allow refreshing!!!! (will need calling removeClient() by Part objects)
+ if (m_lookupDone)
+ return;
+ m_lookupDone = true;
+ m_partlist.clear();
+ m_partsByMime.clear();
+ m_parts.clear();
+ KTrader::OfferList tlist = KTrader::self()->query("Kexi/Handler",
+ "[X-Kexi-PartVersion] == " + QString::number(KEXI_PART_VERSION));
+
+ KConfig conf("kexirc", true);
+ conf.setGroup("Parts");
+ QStringList sl_order = QStringList::split( ",", conf.readEntry("Order") );//we'll set parts in defined order
+ const int size = QMAX( tlist.count(), sl_order.count() );
+ QPtrVector<KService> ordered( size*2 );
+ int offset = size; //we will insert not described parts from #offset
+
+ //compute order
+ for(KTrader::OfferList::ConstIterator it(tlist.constBegin()); it != tlist.constEnd(); ++it)
+ {
+ KService::Ptr ptr = (*it);
+ QCString mime = ptr->property("X-Kexi-TypeMime").toCString();
+ kdDebug() << "Manager::lookup(): " << mime << endl;
+//<TEMP>: disable some parts if needed
+ if (!Kexi::tempShowForms() && mime=="kexi/form")
+ continue;
+ if (!Kexi::tempShowReports() && mime=="kexi/report")
+ continue;
+ if (!Kexi::tempShowMacros() && mime=="kexi/macro")
+ continue;
+ if (!Kexi::tempShowScripts() && mime=="kexi/script")
+ continue;
+//</TEMP>
+ int idx = sl_order.findIndex( ptr->library() );
+ if (idx!=-1)
+ ordered.insert(idx, ptr);
+ else //add to end
+ ordered.insert(offset++, ptr);
+ }
+ //fill final list using computed order
+ for (int i = 0; i< (int)ordered.size(); i++) {
+ KService::Ptr ptr = ordered[i];
+ if (ptr) {
+ Info *info = new Info(ptr);
+ info->setProjectPartID(m_nextTempProjectPartID--); // temp. part id are -1, -2, and so on,
+ // to avoid duplicates
+ if (!info->mimeType().isEmpty()) {
+ m_partsByMime.insert(info->mimeType(), info);
+ kdDebug() << "Manager::lookup(): inserting info to " << info->mimeType() << endl;
+ }
+ m_partlist.append(info);
+ }
+ }
+}
+
+Manager::~Manager()
+{
+}
+
+Part *
+Manager::part(Info *i)
+{
+ clearError();
+ if(!i)
+ return 0;
+
+// kdDebug() << "Manager::part( id = " << i->projectPartID() << " )" << endl;
+
+ if (i->isBroken()) {
+ setError(i->errorMessage());
+ return 0;
+ }
+
+ Part *p = m_parts[i->projectPartID()];
+
+ if(!p) {
+// kdDebug() << "Manager::part().." << endl;
+ int error=0;
+ p = KParts::ComponentFactory::createInstanceFromService<Part>(i->ptr(), this,
+ QString(i->objectName()+"_part").latin1(), QStringList(), &error);
+ if(!p) {
+ kdDebug() << "Manager::part(): failed :( (ERROR #" << error << ")" << endl;
+ kdDebug() << " " << KLibLoader::self()->lastErrorMessage() << endl;
+ i->setBroken(true, i18n("Error while loading plugin \"%1\"").arg(i->objectName()));
+ setError(i->errorMessage());
+ return 0;
+ }
+ if (p->m_registeredPartID>0) {
+ i->setProjectPartID( p->m_registeredPartID );
+ }
+
+ p->setInfo(i);
+ m_parts.insert(i->projectPartID(),p);
+ emit partLoaded(p);
+ }
+ else {
+// kdDebug() << "Manager::part(): cached: " << i->groupName() << endl;
+ }
+
+// kdDebug() << "Manager::part(): fine!" << endl;
+ return p;
+}
+
+#if 0
+void
+Manager::unloadPart(Info *i)
+{
+ m_parts.setAutoDelete(true);
+ m_parts.remove(i->projectPartID());
+ m_parts.setAutoDelete(false);
+/* if (!p)
+ return;
+ m_partsByMime.take(i->mime());
+ m_partlist.removeRef(p);*/
+}
+
+void
+Manager::unloadAllParts()
+{
+// m_partsByMime.clear();
+ m_parts.setAutoDelete(true);
+ m_parts.clear();
+ m_parts.setAutoDelete(false);
+// m_partlist.clear();
+}
+#endif
+
+/*void
+Manager::removeClients( KexiMainWindow *win )
+{
+ if (!win)
+ return;
+ QIntDictIterator<Part> it(m_parts);
+ for (;i.current();++it) {
+ i.current()->removeClient(win->guiFactory());
+ }
+}*/
+
+Part *
+Manager::partForMimeType(const QString &mimeType)
+{
+ return mimeType.isEmpty() ? 0 : part(m_partsByMime[mimeType.latin1()]);
+}
+
+Info *
+Manager::infoForMimeType(const QString &mimeType)
+{
+ Info *i = mimeType.isEmpty() ? 0 : m_partsByMime[mimeType.latin1()];
+ if (i)
+ return i;
+ setError(i18n("No plugin for mime type \"%1\"").arg(mimeType));
+ return 0;
+}
+
+
+bool
+Manager::checkProject(KexiDB::Connection *conn)
+{
+ clearError();
+// QString errmsg = i18n("Invalid project contents.");
+
+//TODO: catch errors!
+ if(!conn->isDatabaseUsed()) {
+ setError(conn);
+ return false;
+ }
+
+ KexiDB::Cursor *cursor = conn->executeQuery("SELECT * FROM kexi__parts");//, KexiDB::Cursor::Buffered);
+ if(!cursor) {
+ setError(conn);
+ return false;
+ }
+
+// int id=0;
+// QStringList parts_found;
+ for(cursor->moveFirst(); !cursor->eof(); cursor->moveNext())
+ {
+// id++;
+ Info *i = infoForMimeType(cursor->value(2).toCString());
+ if(!i)
+ {
+ Missing m;
+ m.name = cursor->value(1).toString();
+ m.mime = cursor->value(2).toCString();
+ m.url = cursor->value(3).toString();
+
+ m_missing.append(m);
+ }
+ else
+ {
+ i->setProjectPartID(cursor->value(0).toInt());
+ i->setIdStoredInPartDatabase(true);
+// parts_found+=cursor->value(2).toString();
+ }
+ }
+
+ conn->deleteCursor(cursor);
+
+#if 0 //js: moved to Connection::createDatabase()
+ //add missing default part entries
+ KexiDB::TableSchema *ts = conn->tableSchema("kexi__parts");
+ if (!ts)
+ return false;
+ KexiDB::FieldList *fl = ts->subList("p_id", "p_name", "p_mime", "p_url");
+ if (!fl)
+ return false;
+ if (!parts_found.contains("kexi/table")) {
+ if (!conn->insertRecord(*fl, QVariant(1), QVariant("Tables"), QVariant("kexi/table"), QVariant("http://")))
+ return false;
+ }
+ if (!parts_found.contains("kexi/query")) {
+ if (!conn->insertRecord(*fl, QVariant(2), QVariant("Queries"), QVariant("kexi/query"), QVariant("http://")))
+ return false;
+ }
+#endif
+ return true;
+}
+
+void Manager::insertStaticPart(StaticPart* part)
+{
+ if (!part)
+ return;
+ part->info()->setProjectPartID(m_nextTempProjectPartID--); // temp. part id are -1, -2, and so on,
+ m_partlist.append(part->info());
+ if (!part->info()->mimeType().isEmpty())
+ m_partsByMime.insert(part->info()->mimeType(), part->info());
+ m_parts.insert(part->info()->projectPartID(), part);
+}
+
+#include "kexipartmanager.moc"