summaryrefslogtreecommitdiffstats
path: root/kexi/core/kexi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/core/kexi.cpp')
-rw-r--r--kexi/core/kexi.cpp348
1 files changed, 348 insertions, 0 deletions
diff --git a/kexi/core/kexi.cpp b/kexi/core/kexi.cpp
new file mode 100644
index 00000000..74e158f6
--- /dev/null
+++ b/kexi/core/kexi.cpp
@@ -0,0 +1,348 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2005 Jaroslaw Staniek <js@iidea.pl>
+
+ This program 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 program 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 program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include "kexi.h"
+#include "kexiaboutdata.h"
+#include "kexicmdlineargs.h"
+
+#include <kexiutils/identifier.h>
+#include <kexidb/msghandler.h>
+
+#include <qtimer.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qpixmapcache.h>
+#include <qcolor.h>
+#include <qfileinfo.h>
+
+#include <kdebug.h>
+#include <kcursor.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kiconeffect.h>
+#include <ksharedptr.h>
+#include <kmimetype.h>
+#include <kstaticdeleter.h>
+#include <kglobalsettings.h>
+
+using namespace Kexi;
+
+//! used for speedup
+//! @internal
+class KexiInternal : public KShared
+{
+ public:
+ KexiInternal() : KShared()
+ , connset(0)
+ , smallFont(0)
+ {
+ }
+ ~KexiInternal()
+ {
+ delete connset;
+ delete smallFont;
+ }
+ KexiDBConnectionSet* connset;
+ KexiProjectSet recentProjects;
+ KexiDBConnectionSet recentConnections;
+ KexiDB::DriverManager driverManager;
+ KexiPart::Manager partManager;
+ QFont *smallFont;
+};
+
+static KStaticDeleter<KexiInternal> Kexi_intDeleter;
+KexiInternal* _int = 0;
+
+#define _INIT_SHARED { if (!_int) Kexi_intDeleter.setObject( _int, new KexiInternal() ); }
+
+KexiDBConnectionSet& Kexi::connset()
+{
+ _INIT_SHARED;
+ //delayed
+ if (!_int->connset) {
+ //load stored set data, OK?
+ _int->connset = new KexiDBConnectionSet();
+ _int->connset->load();
+ }
+ return *_int->connset;
+}
+
+KexiProjectSet& Kexi::recentProjects() {
+ _INIT_SHARED;
+ return _int->recentProjects;
+}
+
+KexiDB::DriverManager& Kexi::driverManager()
+{
+ _INIT_SHARED;
+ return _int->driverManager;
+}
+
+KexiPart::Manager& Kexi::partManager()
+{
+ _INIT_SHARED;
+ return _int->partManager;
+}
+
+void Kexi::deleteGlobalObjects()
+{
+ delete _int;
+}
+
+//temp
+bool _tempShowForms = true;
+bool& Kexi::tempShowForms() {
+#ifndef KEXI_FORMS_SUPPORT
+ _tempShowForms = false;
+#endif
+ return _tempShowForms;
+}
+
+bool _tempShowReports = true;
+bool& Kexi::tempShowReports() {
+#ifndef KEXI_REPORTS_SUPPORT
+ _tempShowReports = false;
+#endif
+ return _tempShowReports;
+}
+
+bool _tempShowMacros = true;
+bool& Kexi::tempShowMacros() {
+#ifndef KEXI_MACROS_SUPPORT
+ _tempShowMacros = false;
+#endif
+ return _tempShowMacros;
+}
+
+bool _tempShowScripts = true;
+bool& Kexi::tempShowScripts() {
+#ifndef KEXI_SCRIPTS_SUPPORT
+ _tempShowScripts = false;
+#endif
+ return _tempShowScripts;
+}
+
+//--------------------------------------------------------------------------------
+
+QFont Kexi::smallFont(QWidget *init)
+{
+ _INIT_SHARED;
+ if (!_int->smallFont) {
+ _int->smallFont = new QFont( init->font() );
+ const int wdth = KGlobalSettings::desktopGeometry(init).width();
+ int size = 10 + QMAX(0, wdth - 1100) / 100;
+ size = QMIN( init->fontInfo().pixelSize(), size );
+ _int->smallFont->setPixelSize( size );
+ }
+ return *_int->smallFont;
+}
+
+//--------------------------------------------------------------------------------
+QString Kexi::nameForViewMode(int m)
+{
+ if (m==NoViewMode) return i18n("No View");
+ else if (m==DataViewMode) return i18n("Data View");
+ else if (m==DesignViewMode) return i18n("Design View");
+ else if (m==TextViewMode) return i18n("Text View");
+
+ return i18n("Unknown");
+}
+
+//--------------------------------------------------------------------------------
+
+QString Kexi::msgYouCanImproveData() {
+ return i18n("You can correct data in this row or use \"Cancel row changes\" function.");
+}
+
+//--------------------------------------------------------------------------------
+
+ObjectStatus::ObjectStatus()
+: msgHandler(0)
+{
+}
+
+ObjectStatus::ObjectStatus(const QString& message, const QString& description)
+: msgHandler(0)
+{
+ setStatus(message, description);
+}
+
+ObjectStatus::ObjectStatus(KexiDB::Object* dbObject, const QString& message, const QString& description)
+: msgHandler(0)
+{
+ setStatus(dbObject, message, description);
+}
+
+ObjectStatus::~ObjectStatus()
+{
+ delete msgHandler;
+}
+
+const ObjectStatus& ObjectStatus::status() const
+{
+ return *this;
+}
+
+bool ObjectStatus::error() const
+{
+ return !message.isEmpty()
+ || (dynamic_cast<KexiDB::Object*>((QObject*)dbObj) && dynamic_cast<KexiDB::Object*>((QObject*)dbObj)->error());
+}
+
+void ObjectStatus::setStatus(const QString& message, const QString& description)
+{
+ this->dbObj=0;
+ this->message=message;
+ this->description=description;
+}
+
+void ObjectStatus::setStatus(KexiDB::Object* dbObject, const QString& message, const QString& description)
+{
+ if (dynamic_cast<QObject*>(dbObject)) {
+ dbObj = dynamic_cast<QObject*>(dbObject);
+ }
+ this->message=message;
+ this->description=description;
+}
+
+void ObjectStatus::setStatus(KexiDB::ResultInfo* result, const QString& message, const QString& description)
+{
+ if (result) {
+ if (message.isEmpty())
+ this->message = result->msg;
+ else
+ this->message = message + " " + result->msg;
+
+ if (description.isEmpty())
+ this->description = result->desc;
+ else
+ this->description = description + " " + result->desc;
+ }
+ else
+ clearStatus();
+}
+
+void ObjectStatus::setStatus(KexiDB::Object* dbObject, KexiDB::ResultInfo* result,
+ const QString& message, const QString& description)
+{
+ if (!dbObject)
+ setStatus(result, message, description);
+ else if (!result)
+ setStatus(dbObject, message, description);
+ else {
+ setStatus(dbObject, message, description);
+ setStatus(result, this->message, this->description);
+ }
+}
+
+void ObjectStatus::clearStatus()
+{
+ message=QString::null;
+ description=QString::null;
+}
+
+QString ObjectStatus::singleStatusString() const {
+ if (message.isEmpty() || description.isEmpty())
+ return message;
+ return message + " " + description;
+}
+
+void ObjectStatus::append( const ObjectStatus& otherStatus ) {
+ if (message.isEmpty()) {
+ message = otherStatus.message;
+ description = otherStatus.description;
+ return;
+ }
+ const QString s( otherStatus.singleStatusString() );
+ if (s.isEmpty())
+ return;
+ if (description.isEmpty()) {
+ description = s;
+ return;
+ }
+ description = description + " " + s;
+}
+
+//! @internal
+class ObjectStatusMessageHandler : public KexiDB::MessageHandler
+{
+ public:
+ ObjectStatusMessageHandler(ObjectStatus *status)
+ : KexiDB::MessageHandler()
+ , m_status(status)
+ {
+ }
+ virtual ~ObjectStatusMessageHandler()
+ {
+ }
+
+ virtual void showErrorMessage(const QString &title,
+ const QString &details = QString::null)
+ {
+ m_status->setStatus(title, details);
+ }
+
+ virtual void showErrorMessage(KexiDB::Object *obj, const QString& msg = QString::null)
+ {
+ m_status->setStatus(obj, msg);
+ }
+
+ ObjectStatus *m_status;
+};
+
+ObjectStatus::operator KexiDB::MessageHandler*()
+{
+ if (!msgHandler)
+ msgHandler = new ObjectStatusMessageHandler(this);
+ return msgHandler;
+}
+
+void Kexi::initCmdLineArgs(int argc, char *argv[], KAboutData* aboutData)
+{
+ KAboutData *about = aboutData;
+ if (!about)
+ about = Kexi::createAboutData();
+#ifdef CUSTOM_VERSION
+# include "../custom_startup.h"
+#endif
+ KCmdLineArgs::init( argc, argv, about );
+ KCmdLineArgs::addCmdLineOptions( options );
+}
+
+void KEXI_UNFINISHED(const QString& feature_name, const QString& extra_text)
+{
+ QString msg;
+ if (feature_name.isEmpty())
+ msg = i18n("This function is not available for version %1 of %2 application.")
+ .arg(KEXI_VERSION_STRING)
+ .arg(KEXI_APP_NAME);
+ else {
+ QString feature_name_(feature_name);
+ msg = i18n("\"%1\" function is not available for version %2 of %3 application.")
+ .arg(feature_name_.replace("&",""))
+ .arg(KEXI_VERSION_STRING)
+ .arg(KEXI_APP_NAME);
+ }
+
+ QString extra_text_(extra_text);
+ if (!extra_text_.isEmpty())
+ extra_text_.prepend("\n");
+
+ KMessageBox::sorry(0, msg + extra_text_);
+}