diff options
Diffstat (limited to 'parts/tools/tools_part.cpp')
-rw-r--r-- | parts/tools/tools_part.cpp | 272 |
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" |