summaryrefslogtreecommitdiffstats
path: root/parts/tools/tools_part.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'parts/tools/tools_part.cpp')
-rw-r--r--parts/tools/tools_part.cpp272
1 files changed, 272 insertions, 0 deletions
diff --git a/parts/tools/tools_part.cpp b/parts/tools/tools_part.cpp
new file mode 100644
index 00000000..f4285546
--- /dev/null
+++ b/parts/tools/tools_part.cpp
@@ -0,0 +1,272 @@
+#include "tools_part.h"
+
+#include <qfile.h>
+#include <qpopupmenu.h>
+#include <qregexp.h>
+#include <qtimer.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kdialogbase.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kparts/part.h>
+#include <kprocess.h>
+#include <ktexteditor/document.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevpartcontroller.h"
+#include "kdevappfrontend.h"
+#include "kdevplugininfo.h"
+#include "urlutil.h"
+#include "configwidgetproxy.h"
+#include "kdeveditorutil.h"
+
+#include "toolsconfig.h"
+#include "toolsconfigwidget.h"
+
+#define TOOLSSETTINGS 1
+#define EXTRATOOLSSETTINGS 2
+
+static const KDevPluginInfo data("kdevtools");
+K_EXPORT_COMPONENT_FACTORY( libkdevtools, ToolsFactory( data ) )
+
+QMap<int, QString> externalToolMenuEntries;
+
+ToolsPart::ToolsPart(QObject *parent, const char *name, const QStringList &)
+ : KDevPlugin( &data, parent, name ? name : "ToolsPart")
+{
+ setInstance(ToolsFactory::instance());
+
+ setXMLFile("kdevpart_tools.rc");
+
+ m_configProxy = new ConfigWidgetProxy( core() );
+ m_configProxy->createGlobalConfigPage( i18n("Tools Menu"), TOOLSSETTINGS, info()->icon() );
+ m_configProxy->createGlobalConfigPage( i18n("External Tools"), EXTRATOOLSSETTINGS, info()->icon() );
+ connect( m_configProxy, SIGNAL(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int )),
+ this, SLOT(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int )) );
+
+ connect(core(), SIGNAL(coreInitialized()), this, SLOT(updateMenu()));
+
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+
+ // Apparently action lists can only be plugged after the
+ // xmlgui client has been registered
+ QTimer::singleShot(0, this, SLOT(updateToolsMenu()));
+}
+
+
+ToolsPart::~ToolsPart()
+{
+ delete m_configProxy;
+}
+
+void ToolsPart::insertConfigWidget( const KDialogBase * dlg, QWidget * page, unsigned int pagenumber )
+{
+ if ( pagenumber == TOOLSSETTINGS )
+ {
+ ToolsConfig *w = new ToolsConfig( page, "tools config widget" );
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ connect(dlg, SIGNAL(destroyed()), this, SLOT(updateMenu()));
+ }
+ else if ( pagenumber == EXTRATOOLSSETTINGS )
+ {
+ ToolsConfigWidget *w2 = new ToolsConfigWidget( page, "tools config widget" );
+ connect(dlg, SIGNAL(okClicked()), w2, SLOT(accept()));
+ connect(dlg, SIGNAL(destroyed()), this, SLOT(updateToolsMenu()));
+ }
+}
+
+void ToolsPart::updateMenu()
+{
+ QPtrList<KAction> actions;
+
+ unplugActionList("tools_list");
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tools");
+
+ QStringList list = config->readListEntry("Tools");
+ for (QStringList::Iterator it = list.begin(); it != list.end(); ++it)
+ {
+ QString name = *it;
+
+ KDesktopFile df(name, true);
+ if (df.readName().isNull())
+ continue;
+
+ KAction *action = new KAction(df.readName(), df.readIcon(), 0,
+ this, SLOT(slotToolActivated()), (QObject*)0, name.latin1());
+ actions.append(action);
+ }
+
+ plugActionList("tools_list", actions);
+}
+
+
+void ToolsPart::slotToolActivated()
+{
+ QString df = sender()->name();
+ kapp->startServiceByDesktopPath(df);
+}
+
+void ToolsPart::startCommand(QString cmdline, bool captured, QString fileName)
+{
+ KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( partController()->activePart() );
+
+ if ( fileName.isNull() && doc )
+ fileName = doc->url().path();
+
+ QString projectDirectory;
+ if (project())
+ projectDirectory = project()->projectDirectory();
+
+ QString selection = KDevEditorUtil::currentSelection( doc );
+ if ( !selection.isEmpty() )
+ selection = KShellProcess::quote( selection );
+
+ QString word = KDevEditorUtil::currentWord( doc );
+
+ // This should really be checked before inserting into the popup
+ if (cmdline.contains("%D") && projectDirectory.isNull())
+ return;
+ cmdline.replace(QRegExp("%D"), projectDirectory);
+
+ if (cmdline.contains("%S") && fileName.isNull())
+ return;
+ cmdline.replace(QRegExp("%S"), fileName);
+
+ if (cmdline.contains("%T") && selection.isNull())
+ return;
+ cmdline.replace(QRegExp("%T"), selection);
+
+ if (cmdline.contains("%W") && word.isNull())
+ return;
+ cmdline.replace(QRegExp("%W"), word);
+
+ if (captured)
+ {
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), cmdline, false);
+ }
+ else
+ {
+ KShellProcess proc;
+ proc << cmdline;
+ proc.start(KProcess::DontCare, KProcess::NoCommunication);
+ }
+}
+
+
+void ToolsPart::updateToolsMenu()
+{
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("External Tools");
+ QStringList l = config->readListEntry("Tool Menu");
+
+
+ QPtrList<KAction> actions;
+ QStringList::ConstIterator it;
+ for (it = l.begin(); it != l.end(); ++it) {
+ QString menutext = *it;
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tool Menu " + menutext);
+ bool isdesktopfile = config->readBoolEntry("DesktopFile");
+ KAction *action = new KAction(*it, 0,
+ this, SLOT(toolsMenuActivated()),
+ (QObject*) 0, menutext.utf8());
+ if (isdesktopfile) {
+ KDesktopFile df(config->readPathEntry("CommandLine"));
+ action->setIcon(df.readIcon());
+ }
+ actions.append(action);
+ }
+
+ unplugActionList("tools2_list");
+ plugActionList("tools2_list", actions);
+}
+
+
+void ToolsPart::contextMenu(QPopupMenu *popup, const Context *context)
+{
+ if (!context->hasType( Context::FileContext ))
+ return;
+
+ const FileContext *fcontext = static_cast<const FileContext*>(context);
+ m_contextPopup = popup;
+ m_contextFileName = fcontext->urls().first().path();
+ externalToolMenuEntries.clear();
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("External Tools");
+ QStringList filecontextList = config->readListEntry("File Context");
+
+ if (URLUtil::isDirectory(m_contextFileName)) {
+ QStringList l = config->readListEntry("Dir Context");
+ QStringList::ConstIterator it;
+ for (it = l.begin(); it != l.end(); ++it)
+ externalToolMenuEntries.insert( popup->insertItem( (*it), this, SLOT(dirContextActivated(int)) ), (*it) );
+ } else {
+ QStringList l = config->readListEntry("File Context");
+ QStringList::ConstIterator it;
+ for (it = l.begin(); it != l.end(); ++it)
+ externalToolMenuEntries.insert( popup->insertItem( (*it), this, SLOT(fileContextActivated(int)) ), (*it) );
+ }
+}
+
+
+void ToolsPart::toolsMenuActivated()
+{
+ QString menutext = sender()->name();
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tool Menu " + menutext);
+ QString cmdline = config->readPathEntry("CommandLine");
+ bool isdesktopfile = config->readBoolEntry("DesktopFile");
+ bool captured = config->readBoolEntry("Captured");
+ kdDebug() << "tools:" << "activating " << menutext
+ << "with cmdline " << cmdline
+ << "and desktopfile " << isdesktopfile << endl;
+ if (isdesktopfile)
+ kapp->startServiceByDesktopPath(cmdline);
+ else
+ startCommand(cmdline, captured, QString::null);
+}
+
+
+void ToolsPart::fileContextActivated(int id)
+{
+ QString menutext = externalToolMenuEntries[ id ];
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("File Context " + menutext);
+ QString cmdline = config->readPathEntry("CommandLine");
+ bool captured = config->readBoolEntry("Captured");
+ kdDebug() << "filecontext:" << "activating " << menutext
+ << " with cmdline " << cmdline
+ << " on file " << m_contextFileName << endl;
+ startCommand(cmdline, captured, m_contextFileName);
+}
+
+
+void ToolsPart::dirContextActivated(int id)
+{
+ QString menutext = externalToolMenuEntries[ id ];
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Dir Context " + menutext);
+ QString cmdline = config->readPathEntry("CommandLine");
+ bool captured = config->readBoolEntry("Captured");
+ kdDebug() << "dircontext:" << "activating " << menutext
+ << "with cmdline " << cmdline
+ << " on directory " << m_contextFileName << endl;
+ startCommand(cmdline, captured, m_contextFileName);
+}
+
+#include "tools_part.moc"