summaryrefslogtreecommitdiffstats
path: root/quanta/plugins/quantaplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'quanta/plugins/quantaplugin.cpp')
-rw-r--r--quanta/plugins/quantaplugin.cpp395
1 files changed, 395 insertions, 0 deletions
diff --git a/quanta/plugins/quantaplugin.cpp b/quanta/plugins/quantaplugin.cpp
new file mode 100644
index 00000000..89cde63f
--- /dev/null
+++ b/quanta/plugins/quantaplugin.cpp
@@ -0,0 +1,395 @@
+/***************************************************************************
+ quantaplugin.cpp - Base class for quanta plugins
+ -------------------
+ begin : Mon Sep 16 2002
+ copyright : (C) 2002 by Marc Britton <consume@optushome.com.au>
+ (C) 2003-2004 by Andras Mantia <amantia@kde.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+/* KDE INCLUDES */
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kaction.h>
+#include <kparts/componentfactory.h>
+#include <kparts/part.h>
+#include <klocale.h>
+#include <kdockwidget.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+
+/* QT INCLUDES */
+#include <qstring.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <qstringlist.h>
+#include <qobject.h>
+
+/* OTHER INCLUDES */
+#include "quantaplugin.h"
+#include "resource.h"
+#include "quanta.h"
+#include "quantaview.h"
+#include "document.h"
+#include "quantacommon.h"
+#include "resource.h"
+#include "messageoutput.h"
+#include "project.h"
+
+#include "viewmanager.h"
+
+
+QuantaPlugin::QuantaPlugin()
+ : m_isRunning(false)
+{
+ m_readOnlyPart = true;
+ m_action = 0L;
+ m_icon = "";
+ m_part = 0L;
+ m_view = 0L;
+ m_pluginToolView = 0L;
+ m_targetWidget = 0L;
+}
+
+QuantaPlugin::~QuantaPlugin()
+{
+ unload();
+}
+
+/** Sets the superficial name of the plugin */
+void QuantaPlugin::setPluginName(const QString &a_name)
+{
+ m_name = a_name;
+ if (!m_action)
+ {
+ m_action = new KToggleAction(i18n(a_name.utf8()), 0, this, SLOT(toggle()), quantaApp->actionCollection(), a_name);
+ }
+ m_action->setText(a_name);
+}
+
+QString QuantaPlugin::pluginName() const
+{
+ return m_name;
+}
+
+void QuantaPlugin::setLocation(const QString &a_location)
+{
+ m_location = a_location;
+}
+
+QString QuantaPlugin::location() const
+{
+ return m_location;
+}
+
+bool QuantaPlugin::load()
+{
+ if(isLoaded())
+ return false;
+
+ QString loc = location();
+ if(loc.isEmpty())
+ {
+ KStandardDirs *dirs = QuantaCommon::pluginDirs("lib");
+ loc = dirs->findResource("lib", fileName());
+ delete dirs;
+ }
+ else
+ {
+ loc += QString("/") + fileName();
+ }
+
+ QFileInfo partInfo(loc);
+ QString ow = outputWindow();
+ m_targetWidget = new QWidget(quantaApp);
+ if (m_readOnlyPart)
+ m_part = KParts::ComponentFactory::createPartInstanceFromLibrary<KParts::ReadOnlyPart>(partInfo.baseName().latin1(), m_targetWidget, 0, m_targetWidget, 0 );
+ else
+ m_part = KParts::ComponentFactory::createPartInstanceFromLibrary<KParts::ReadWritePart>(partInfo.baseName().latin1(), m_targetWidget, 0, m_targetWidget, 0 );
+ if(!m_part)
+ {
+ KMessageBox::error(quantaApp, i18n("<qt>The <b>%1</b> plugin could not be loaded.<br>Possible reasons are:<br> - <b>%2</b> is not installed;<br> - the file <i>%3</i> is not installed or it is not reachable.").arg(m_name).arg(m_name).arg(m_fileName));
+ delete m_targetWidget;
+ m_targetWidget = 0L;
+ return false;
+ }
+ m_part->setName(m_name); // for better debug output
+ m_part->widget()->setName(m_name); //needed to be able to dock the same plugin twice in separate toolviews
+ m_part->widget()->setFocusPolicy(QWidget::ClickFocus);
+ quantaApp->slotNewPart(m_part, false); // register the part in the partmanager
+ return true;
+}
+
+bool QuantaPlugin::run()
+{
+ if(!isLoaded())
+ load();
+
+ if(isLoaded())
+ {
+ bool result = true;
+ QuantaView *view = ViewManager::ref()->activeView();
+ if (view->document())
+ {
+ switch (m_input)
+ {
+ case 1: { result = m_part->openURL(view->document()->url());
+ break;
+ }
+ case 2: { KURL url = view->document()->url();
+ url.setPath(url.directory());
+ url.adjustPath(1);
+ result = m_part->openURL(url);
+ break;
+ }
+ case 3: { KURL url;
+ if ( Project::ref()->hasProject() &&
+ (Project::ref()->contains(view->document()->url()) ||
+ view->document()->isUntitled())
+ )
+ {
+ url = Project::ref()->projectBaseURL();
+ }
+ else
+ {
+ url = view->document()->url();
+ url.setPath(url.directory());
+ url.adjustPath(1);
+ }
+ result = m_part->openURL(url);
+ break;
+ }
+ default: ;
+ }
+ } else
+ {
+ if (m_input == 3 && (Project::ref()->hasProject())) //open project dir
+ result = m_part->openURL(Project::ref()->projectBaseURL());
+ }
+ if (!result)
+ {
+ unload(false);
+ return false;
+ }
+ addWidget();
+ setRunning(true);
+ connect( m_part, SIGNAL(setStatusBarText(const QString &)),
+ quantaApp, SLOT(slotStatusMsg( const QString & )));
+
+
+ emit pluginStarted();
+
+ return true;
+ }
+ return false;
+}
+
+bool QuantaPlugin::toggle()
+{
+ if (isLoaded())
+ {
+ return unload();
+ } else
+ {
+ bool result = run();
+ if (!result)
+ {
+ m_action->blockSignals(true);
+ m_action->setChecked(false);
+ m_action->blockSignals(false);
+ }
+ return result;
+ }
+}
+
+/** Returns the file name of the plugin */
+QString QuantaPlugin::fileName() const
+{
+ return m_fileName;
+}
+
+/** Sets the file name of the plugin */
+void QuantaPlugin::setFileName(const QString &a_fileName)
+{
+ m_fileName = a_fileName;
+}
+
+/** Sets the output window */
+void QuantaPlugin::setOutputWindow(const QString &a_outputWindow)
+{
+ m_outputWindow = a_outputWindow;
+}
+
+/** Gets the output window */
+QString QuantaPlugin::outputWindow() const
+{
+ return m_outputWindow;
+}
+
+bool QuantaPlugin::validatePlugin(QuantaPlugin *a_plugin)
+{
+ if(a_plugin)
+ {
+ return QuantaPlugin::validatePluginInfo(a_plugin->pluginName(),
+ a_plugin->location(), a_plugin->fileName(),
+ a_plugin->outputWindow());
+ }
+ return false;
+}
+
+/** Returns true if the information of a plugin is valid, otherwise false */
+bool QuantaPlugin::validatePluginInfo(const QString & /*a_name*/,
+ const QString &a_location, const QString &a_fileName, const QString &/*a_outputWindow*/)
+{
+ bool valid = true;
+ // look the file up if location is null
+ if(!a_location.isEmpty())
+ {
+ QString path = a_location + QString("/") + a_fileName;
+
+ QFileInfo pluginFile(path);
+ if(!pluginFile.exists())
+ valid = false;
+ /* TODO : What other tests should we perform? Permissions etc? */
+ }
+ else
+ {
+ if (valid)
+ {
+ KStandardDirs *dirs = QuantaCommon::pluginDirs("lib");
+ if(dirs->findResource("lib", a_fileName).isNull())
+ valid = false;
+ delete dirs;
+ }
+ }
+ return valid; // past all tests, valid
+}
+
+/** Returns whether the plugin is loaded or not */
+bool QuantaPlugin::isLoaded()
+{
+ return m_targetWidget != 0L;
+}
+
+bool QuantaPlugin::unload(bool remove)
+{
+ if(!isLoaded())
+ return false;
+
+ disconnect( m_part, SIGNAL(setStatusBarText(const QString &)),
+ quantaApp, SLOT(slotStatusMsg( const QString & )));
+
+ delete (KParts::ReadOnlyPart*) m_part;
+ m_part = 0;
+ delete m_targetWidget;
+ m_targetWidget = 0L;
+ setRunning(false);
+
+ emit pluginStopped();
+
+ m_action->setChecked(false);
+ if (remove)
+ removeWidget();
+ return true;
+}
+
+bool QuantaPlugin::isRunning() const
+{
+ return m_isRunning;
+}
+
+void QuantaPlugin::setRunning(bool a_enable)
+{
+ m_isRunning = a_enable;
+}
+
+/** Sets the plugin's standard attribute */
+void QuantaPlugin::setStandard(bool isStandard)
+{
+ m_standard = isStandard;
+}
+
+/** Gets the plugin's standard attribute */
+bool QuantaPlugin::isStandard() const
+{
+ return m_standard;
+}
+
+/** No descriptions */
+QString QuantaPlugin::standardName()
+{
+ return m_standardName;
+}
+/** No descriptions */
+void QuantaPlugin::setStandardName(const QString& a_stdName)
+{
+ m_standardName = a_stdName;
+}
+/** No descriptions */
+QString QuantaPlugin::icon()
+{
+ return m_icon;
+}
+/** No descriptions */
+void QuantaPlugin::setIcon(const QString& a_icon)
+{
+ m_icon = a_icon;
+ if (m_action) m_action->setIcon(a_icon);
+}
+
+void QuantaPlugin::addWidget()
+{
+ QString ow = outputWindow();
+ if(ow == i18n("Separate Toolview"))
+ {
+ m_part->widget()->setCaption(m_name);
+ m_part->widget()->setIcon(SmallIcon(m_icon));
+ m_pluginToolView = quantaApp->addToolWindow(m_part->widget(), quantaApp->prevDockPosition(m_part->widget(), KDockWidget::DockBottom), quantaApp->getMainDockWidget());
+ m_pluginToolView->show();
+ } else
+ {
+ m_view = ViewManager::ref()->createView();
+ m_view->addPlugin(this);
+ }
+}
+
+void QuantaPlugin::removeWidget()
+{
+ QString ow = outputWindow();
+ if(ow == i18n("Separate Toolview"))
+ {
+ delete m_pluginToolView;
+ m_pluginToolView = 0L;
+ ViewManager::ref()->activeView()->setFocus();
+ } else
+ {
+ ViewManager::ref()->removeView(m_view, true);
+ }
+}
+
+QWidget *QuantaPlugin::widget()
+{
+ if (isLoaded()) {
+ return m_part->widget();
+ } else {
+ return NULL;
+ }
+}
+
+void QuantaPlugin::plugAction(QPopupMenu *menu)
+{
+ m_action->plug(menu);
+}
+
+#include "quantaplugin.moc"