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.
tdesdk/cervisia/protocolview.cpp

197 lines
5.0 KiB

/*
* Copyright (C) 1999-2002 Bernd Gehrmann
* bernd@physik.hu-berlin.de
* Copyright (c) 2003-2004 Christian Loose <christian.loose@kdemail.net>
*
* 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "protocolview.h"
#include <qdir.h>
#include <qpopupmenu.h>
#include <dcopref.h>
#include <kconfig.h>
#include <klocale.h>
#include <kmessagebox.h>
#include "cervisiapart.h"
#include "cvsjob_stub.h"
ProtocolView::ProtocolView(const QCString& appId, QWidget *parent, const char *name)
: QTextEdit(parent, name)
, job(0)
, m_isUpdateJob(false)
{
setReadOnly(true);
setUndoRedoEnabled(false);
setTabChangesFocus(true);
setTextFormat(Qt::LogText);
KConfig *config = CervisiaPart::config();
config->setGroup("LookAndFeel");
setFont(config->readFontEntry("ProtocolFont"));
config->setGroup("Colors");
QColor defaultColor = QColor(255, 130, 130);
conflictColor=config->readColorEntry("Conflict",&defaultColor);
defaultColor=QColor(130, 130, 255);
localChangeColor=config->readColorEntry("LocalChange",&defaultColor);
defaultColor=QColor(70, 210, 70);
remoteChangeColor=config->readColorEntry("RemoteChange",&defaultColor);
// create a DCOP stub for the non-concurrent cvs job
job = new CvsJob_stub(appId, "NonConcurrentJob");
// establish connections to the signals of the cvs job
connectDCOPSignal(job->app(), job->obj(), "jobExited(bool, int)",
"slotJobExited(bool, int)", true);
connectDCOPSignal(job->app(), job->obj(), "receivedStdout(QString)",
"slotReceivedOutput(QString)", true);
connectDCOPSignal(job->app(), job->obj(), "receivedStderr(QString)",
"slotReceivedOutput(QString)", true);
}
ProtocolView::~ProtocolView()
{
delete job;
}
bool ProtocolView::startJob(bool isUpdateJob)
{
m_isUpdateJob = isUpdateJob;
// get command line and add it to output buffer
QString cmdLine = job->cvsCommand();
buf += cmdLine;
buf += '\n';
processOutput();
// disconnect 3rd party slots from our signals
disconnect( SIGNAL(receivedLine(QString)) );
disconnect( SIGNAL(jobFinished(bool, int)) );
return job->execute();
}
QPopupMenu* ProtocolView::createPopupMenu(const QPoint &pos)
{
QPopupMenu* menu = QTextEdit::createPopupMenu(pos);
int id = menu->insertItem(i18n("Clear"), this, SLOT( clear() ), 0, -1, 0);
if( length() == 0 )
menu->setItemEnabled(id, false);
return menu;
}
void ProtocolView::cancelJob()
{
job->cancel();
}
void ProtocolView::slotReceivedOutput(QString buffer)
{
buf += buffer;
processOutput();
}
void ProtocolView::slotJobExited(bool normalExit, int exitStatus)
{
QString msg;
if( normalExit )
{
if( exitStatus )
msg = i18n("[Exited with status %1]\n").arg(exitStatus);
else
msg = i18n("[Finished]\n");
}
else
msg = i18n("[Aborted]\n");
buf += '\n';
buf += msg;
processOutput();
emit jobFinished(normalExit, exitStatus);
}
void ProtocolView::processOutput()
{
int pos;
while ( (pos = buf.find('\n')) != -1)
{
QString line = buf.left(pos);
if (!line.isEmpty())
{
appendLine(line);
emit receivedLine(line);
}
buf = buf.right(buf.length()-pos-1);
}
}
void ProtocolView::appendLine(const QString &line)
{
// Escape output line, so that html tags in commit
// messages aren't interpreted
const QString escapedLine = QStyleSheet::escape(line);
// When we don't get the output from an update job then
// just add it to the text edit.
if( !m_isUpdateJob )
{
append(escapedLine);
return;
}
QColor color;
// Colors are the same as in UpdateViewItem::paintCell()
if (line.startsWith("C "))
color = conflictColor;
else if (line.startsWith("M ")
|| line.startsWith("A ") || line.startsWith("R "))
color = localChangeColor;
else if (line.startsWith("P ") || line.startsWith("U "))
color = remoteChangeColor;
append(color.isValid()
? QString("<font color=\"%1\"><b>%2</b></font>").arg(color.name())
.arg(escapedLine)
: escapedLine);
}
#include "protocolview.moc"
// Local Variables:
// c-basic-offset: 4
// End: