You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/parts/outputviews/appoutputviewpart.cpp

179 lines
5.2 KiB

/***************************************************************************
* Copyright (C) 1999-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 "appoutputviewpart.h"
#include <qwhatsthis.h>
#include <qdir.h>
#include <kdebug.h>
#include <klocale.h>
#include <kaction.h>
#include <kiconloader.h>
#include <kparts/part.h>
#include <kdevgenericfactory.h>
#include <kdevplugininfo.h>
#include <kapplication.h>
#include "kdevproject.h"
#include "kdevcore.h"
#include "kdevmainwindow.h"
#include "appoutputwidget.h"
#include "kdevpartcontroller.h"
#include "settings.h"
static const KDevPluginInfo data("kdevappoutputview");
typedef KDevGenericFactory< AppOutputViewPart > AppViewFactory;
K_EXPORT_COMPONENT_FACTORY( libkdevappview, AppViewFactory( data ) )
AppOutputViewPart::AppOutputViewPart(QObject *parent, const char *name, const QStringList &)
: KDevAppFrontend(&data, parent, name ? name : "AppOutputViewPart")
{
setInstance(AppViewFactory::instance());
m_dcop = new KDevAppFrontendIface(this);
m_widget = new AppOutputWidget(this);
m_widget->setIcon( SmallIcon("openterm") );
m_widget->setCaption(i18n("Application Output"));
QWhatsThis::add(m_widget, i18n("<b>Application output</b><p>"
"The stdout/stderr output window is a replacement for "
"terminal-based application communication. Running terminal "
"applications use this instead of a terminal window."));
mainWindow()->embedOutputView(m_widget, i18n("Application"), i18n("Output of the executed user program"));
hideView();
connect( core(), SIGNAL(stopButtonClicked(KDevPlugin*)),
this, SLOT(slotStopButtonClicked(KDevPlugin*)) );
connect(m_widget, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcessExited()));
connect(m_widget, SIGNAL(processExited(KProcess*)), SIGNAL(processExited()));
}
AppOutputViewPart::~AppOutputViewPart()
{
if ( m_widget )
mainWindow()->removeView( m_widget );
delete m_widget;
delete m_dcop;
}
void AppOutputViewPart::slotStopButtonClicked( KDevPlugin* which )
{
if ( which != 0 && which != this )
return;
stopApplication();
}
void AppOutputViewPart::stopApplication()
{
m_widget->killJob();
core()->running( this, false );
}
void AppOutputViewPart::slotProcessExited()
{
core()->running( this, false );
if ( partController()->activePart() && partController()->activePart()->widget() )
partController()->activePart()->widget()->setFocus();
}
/**
* If directory is empty it will use the user's home directory.
* If inTerminal is true, the program is started in an external
* konsole.
*/
void AppOutputViewPart::startAppCommand(const QString &directory, const QString &program, bool inTerminal)
{
QString cmd;
if (inTerminal) {
cmd = Settings::terminalEmulatorName( *kapp->config() );
if ( cmd == "konsole" && !directory.isNull() ) { // isn't setting the working directory below enough?
// If a directory was specified, use it
cmd += QString(" --workdir '%1'").arg(directory);
}
cmd += " -e /bin/sh -c '";
cmd += program;
cmd += "; echo \"";
cmd += i18n("Press Enter to continue!");
cmd += "\";read dummy'";
} else
cmd = program;
m_widget->clearViewAndContents();
if ( directory.isNull() )
// use the user's home directory
m_widget->startJob(QDir::homeDirPath(), cmd);
else
// use the supplied directory
m_widget->startJob(directory, cmd);
core()->running( this, true );
showView();
mainWindow()->raiseView(m_widget);
}
bool AppOutputViewPart::isRunning()
{
return m_widget->isRunning();
}
void AppOutputViewPart::insertStdoutLine(const QCString &line)
{
m_widget->insertStdoutLine(line);
}
void AppOutputViewPart::insertStderrLine(const QCString &line)
{
m_widget->insertStderrLine(line);
}
void AppOutputViewPart::clearView()
{
m_widget->clearViewAndContents();
}
void AppOutputViewPart::hideView()
{
m_viewIsVisible = false;
mainWindow()->setViewAvailable( m_widget, m_viewIsVisible );
}
void AppOutputViewPart::showView()
{
m_viewIsVisible = true;
mainWindow()->setViewAvailable( m_widget, m_viewIsVisible );
}
bool AppOutputViewPart::isViewVisible()
{
return m_viewIsVisible;
}
void AppOutputViewPart::addPartialStderrLine(const QCString & line)
{
m_widget->addPartialStderrLine(line);
}
void AppOutputViewPart::addPartialStdoutLine(const QCString & line)
{
m_widget->addPartialStdoutLine(line);
}
#include "appoutputviewpart.moc"