/***************************************************************************
 *   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 <tqwhatsthis.h>
#include <tqdir.h>
#include <kdebug.h>
#include <tdelocale.h>
#include <tdeaction.h>
#include <kiconloader.h>
#include <tdeparts/part.h>
#include <kdevgenericfactory.h>
#include <kdevplugininfo.h>
#include <tdeapplication.h>

#include "kdevproject.h"
#include "kdevcore.h"
#include "kdevmainwindow.h"
#include "appoutputwidget.h"
#include "kdevpartcontroller.h"
#include "settings.h"

static const KDevPluginInfo pluginData("kdevappoutputview");
typedef KDevGenericFactory< AppOutputViewPart > AppViewFactory;
K_EXPORT_COMPONENT_FACTORY( libkdevappview, AppViewFactory( pluginData ) )

AppOutputViewPart::AppOutputViewPart(TQObject *parent, const char *name, const TQStringList &)
    : KDevAppFrontend(&pluginData, 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"));
    TQWhatsThis::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(), TQ_SIGNAL(stopButtonClicked(KDevPlugin*)),
             this, TQ_SLOT(slotStopButtonClicked(KDevPlugin*)) );
    connect(m_widget, TQ_SIGNAL(processExited(TDEProcess*)), this, TQ_SLOT(slotProcessExited()));
    connect(m_widget, TQ_SIGNAL(processExited(TDEProcess*)), TQ_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 TQString &directory, const TQString &program, bool inTerminal)
{
    TQString 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 += TQString(" --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(TQDir::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 TQCString &line)
{
    m_widget->insertStdoutLine(line);
}


void AppOutputViewPart::insertStderrLine(const TQCString &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 TQCString & line)
{
    m_widget->addPartialStderrLine(line);
}

void AppOutputViewPart::addPartialStdoutLine(const TQCString & line)
{
    m_widget->addPartialStdoutLine(line);
}

#include "appoutputviewpart.moc"
