summaryrefslogtreecommitdiffstats
path: root/languages/perl/perlsupportpart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'languages/perl/perlsupportpart.cpp')
-rw-r--r--languages/perl/perlsupportpart.cpp330
1 files changed, 330 insertions, 0 deletions
diff --git a/languages/perl/perlsupportpart.cpp b/languages/perl/perlsupportpart.cpp
new file mode 100644
index 00000000..4305644e
--- /dev/null
+++ b/languages/perl/perlsupportpart.cpp
@@ -0,0 +1,330 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.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. *
+ * *
+ ***************************************************************************/
+
+#include "perlsupportpart.h"
+
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdevgenericfactory.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <qregexp.h>
+#include <codemodel.h>
+#include <qprogressbar.h>
+#include <kstatusbar.h>
+#include "kdevmainwindow.h"
+
+#include <kprocess.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevpartcontroller.h"
+#include "kdevplugininfo.h"
+#include "kdevappfrontend.h"
+//#include "classstore.h"
+//#include "parsedclass.h"
+//#include "parsedmethod.h"
+//#include "parsedscript.h"
+#include "domutil.h"
+//#include "programmingbycontract.h"
+
+typedef KDevGenericFactory<PerlSupportPart> PerlSupportFactory;
+static const KDevPluginInfo data("kdevperlsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevperlsupport, PerlSupportFactory( data ) )
+
+PerlSupportPart::PerlSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "PerlSupportPart")
+{
+ setInstance(PerlSupportFactory::instance());
+
+ setXMLFile("kdevperlsupport.rc");
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+
+ KAction *action;
+
+ action = new KAction( i18n("Execute Main Program"), "exec", 0,
+ this, SLOT(slotExecute()),
+ actionCollection(), "build_exec" );
+ action->setToolTip( i18n("Runs the Perl program") );
+
+ action = new KAction( i18n("Execute String..."), "exec", 0,
+ this, SLOT(slotExecuteString()),
+ actionCollection(), "build_execstring" );
+ action->setToolTip( i18n("Executes a string as Perl code") );
+
+ action = new KAction( i18n("Start Perl Interpreter"), "exec", 0,
+ this, SLOT(slotStartInterpreter()),
+ actionCollection(), "build_runinterpreter" );
+ action->setToolTip( i18n("Starts the Perl interpreter without a program") );
+
+ action = new KAction( i18n("Find Perl Function Documentation..."), 0,
+ this, SLOT(slotPerldocFunction()),
+ actionCollection(), "help_perldocfunction" );
+ action->setToolTip( i18n("Show the documentation page of a Perl function") );
+
+ action = new KAction( i18n("Find Perl FAQ Entry..."), 0,
+ this, SLOT(slotPerldocFAQ()),
+ actionCollection(), "help_perldocfaq" );
+ action->setToolTip( i18n("Show the FAQ entry for a keyword") );
+
+ //perl parser for codemodel
+ m_parser = new perlparser(core(),codeModel(),interpreter());
+}
+
+
+PerlSupportPart::~PerlSupportPart()
+{
+ if (project())
+ projectClosed();
+
+ delete m_parser;
+ m_parser=0;
+}
+
+
+void PerlSupportPart::projectOpened()
+{
+ kdDebug(9007) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+
+void PerlSupportPart::projectClosed()
+{
+}
+
+void PerlSupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+ QString path = fi.filePath();
+ QString extension = fi.extension();
+ if (extension == "pl" || extension == "pm") {
+ kdDebug(9016) << "maybe " << fileName << endl;
+ removeWithReference(fileName);
+ m_parser->parse(fileName);
+ emit addedSourceInfo( fileName);
+ }
+}
+
+void PerlSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ maybeParse(project()->projectDirectory() + "/" + ( *it ));
+ }
+}
+
+
+void PerlSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "removedFilesFromProject()" << endl;
+ QStringList::ConstIterator it;
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ removeWithReference(fileName);
+ }
+ emit updatedSourceInfo();
+}
+
+
+void PerlSupportPart::savedFile(const KURL &fileName)
+{
+ Q_UNUSED( fileName.path() );
+#if 0 // not needed anymore
+ kdDebug(9016) << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName);
+ emit updatedSourceInfo();
+ }
+#endif
+}
+
+
+KDevLanguageSupport::Features PerlSupportPart::features()
+{
+ return KDevLanguageSupport::Features(Classes | Functions | Variables | Namespaces | /*Scripts | */NewClass | AddMethod | AddAttribute /*| NewScript*/);
+// return Functions;
+}
+
+QString PerlSupportPart::interpreter()
+{
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevperlsupport/run/interpreter");
+ if (prog.isEmpty())
+ prog = "perl";
+
+ return prog;
+}
+
+
+void PerlSupportPart::startApplication(const QString &program)
+{
+ bool inTerminal = DomUtil::readBoolEntry(*projectDom(), "/kdevperlsupport/run/terminal");
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, inTerminal);
+}
+
+
+void PerlSupportPart::slotExecute()
+{
+ QString program = project()->mainProgram();
+ QString cmd = interpreter() + " " + program;
+ startApplication(cmd);
+}
+
+
+void PerlSupportPart::slotStartInterpreter()
+{
+ startApplication(interpreter());
+}
+
+
+void PerlSupportPart::slotExecuteString()
+{
+ bool ok;
+ QString cmd = KInputDialog::getText(i18n("String to Execute"), i18n("String to execute:"), QString::null, &ok, 0);
+ if (ok) {
+ cmd.prepend("'");
+ cmd.append("'");
+ startApplication(cmd);
+ }
+}
+
+
+void PerlSupportPart::slotPerldocFunction()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show Perl Documentation"), i18n("Show Perl documentation for function:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "perldoc:functions/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+
+
+void PerlSupportPart::slotPerldocFAQ()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show FAQ Entry"), i18n("Show FAQ entry for keyword:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "perldoc:faq/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+KMimeType::List PerlSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-perl" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+void PerlSupportPart::initialParse()
+{
+ kdDebug(9016) << "initialParse()" << endl;
+
+ if (project()) {
+ //copy from cpp support : give user some feedback
+ mainWindow()->statusBar()->message( i18n("Updating...") );
+ kapp->processEvents( );
+
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ m_parser->initialParse();
+
+ //progress bar
+ QProgressBar* bar = new QProgressBar( files.count( ), mainWindow( )->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow( )->statusBar( )->addWidget( bar );
+ bar->show( );
+ int n = 0;
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+// kdDebug(9016) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ maybeParse(project()->projectDirectory() + "/" + *it);
+ //update progress bar
+ bar->setProgress( n++ );
+ if( (n%5) == 0 )
+ kapp->processEvents();
+ }
+ parseUseFiles();
+ emit updatedSourceInfo();
+
+ //remove progressbar
+ mainWindow( )->statusBar( )->removeWidget( bar );
+ delete bar;
+ kapp->restoreOverrideCursor();
+ mainWindow()->statusBar()->message( i18n("Done") );
+
+ } else {
+ kdDebug(9016) << "No project" << endl;
+ }
+}
+
+void PerlSupportPart::removeWithReference( const QString & fileName )
+{
+ kdDebug(9016) << "remove with references: " << fileName << endl;
+ //m_timestamp.remove( fileName );
+ if( !codeModel()->hasFile(fileName) )
+ return;
+
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+}
+
+void PerlSupportPart::parseUseFiles()
+{
+ kdDebug(9016) << "parse addional libs" << endl;
+ return;
+ QString filename;
+ QStringList m_usefiles = m_parser->UseFiles();
+
+ //parse addional use files
+ for (QStringList::Iterator it = m_usefiles.begin(); it != m_usefiles.end() ;++it)
+ {
+ filename = m_parser->findLib(*it);
+ //if something found , parse it
+ if (!filename.isEmpty()) {
+ //kdDebug(9016) << "found " << filename << endl;
+ maybeParse(filename);
+ }
+ }
+}
+
+#include "perlsupportpart.moc"