00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qpainter.h>
00013 #include <qregexp.h>
00014
00015 #include <dcopref.h>
00016 #include <kstatusbar.h>
00017 #include <kdebug.h>
00018 #include <klocale.h>
00019 #include <kmessagebox.h>
00020
00021 #include "kdevpartcontroller.h"
00022 #include "kdevmainwindow.h"
00023 #include "kdevcore.h"
00024
00025 #include "cvspart.h"
00026 #include "cvsprocesswidget.h"
00027 #include "processwidget.h"
00028
00029 #include <cvsjob_stub.h>
00030 #include <cvsservice_stub.h>
00031
00032
00033
00034
00036
00038
00039 #ifdef MYDCOPDEBUG
00040 int g_dcopExitCounter = 0;
00041 int g_dcopOutCounter = 0;
00042 int g_dcopErrCounter = 0;
00043 #endif
00044
00045
00046 CvsProcessWidget::CvsProcessWidget( CvsService_stub *service, CvsServicePart *part, QWidget *parent, const char *name )
00047 : DCOPObject( "CvsProcessWidgetDCOPIface" ),
00048 QTextEdit( parent, name ),
00049 m_part( part ), m_service( service ), m_job( 0 )
00050 {
00051 setReadOnly( true );
00052 setTextFormat( Qt::LogText );
00053
00054 QStyleSheetItem *style = 0;
00055 style = new QStyleSheetItem( styleSheet(), "goodtag" );
00056 style->setColor( "black" );
00057
00058 style = new QStyleSheetItem( styleSheet(), "errortag" );
00059 style->setColor( "red" );
00060 style->setFontWeight( QFont::Bold );
00061
00062 style = new QStyleSheetItem( styleSheet(), "infotag" );
00063 style->setColor( "blue" );
00064
00065 style = new QStyleSheetItem( styleSheet(), "cvs_conflict" );
00066 style->setColor( "red" );
00067
00068 style = new QStyleSheetItem( styleSheet(), "cvs_added" );
00069 style->setColor( "green" );
00070
00071 style = new QStyleSheetItem( styleSheet(), "cvs_removed" );
00072 style->setColor( "yellow" );
00073
00074 style = new QStyleSheetItem( styleSheet(), "cvs_updated" );
00075 style->setColor( "lightblue" );
00076
00077 style = new QStyleSheetItem( styleSheet(), "cvs_modified" );
00078 style->setColor( "darkgreen" );
00079
00080 style = new QStyleSheetItem( styleSheet(), "cvs_unknown" );
00081 style->setColor( "gray" );
00082 }
00083
00085
00086 CvsProcessWidget::~CvsProcessWidget()
00087 {
00088 if (m_job)
00089 {
00090 delete m_job;
00091 }
00092 }
00093
00095
00096 bool CvsProcessWidget::isAlreadyWorking() const
00097 {
00098 if (m_job)
00099 return m_job->isRunning();
00100 else
00101 return false;
00102 }
00103
00105
00106 void CvsProcessWidget::clear()
00107 {
00108 QTextEdit::clear();
00109 this->m_errors = QString::null;
00110 this->m_output = QString::null;
00111 }
00112
00114
00115 bool CvsProcessWidget::startJob( const DCOPRef &aJob )
00116 {
00117 kdDebug(9006) << "CvsProcessWidget::startJob(const DCOPRef &) here!" << endl;
00118
00119 clear();
00120 m_part->mainWindow()->raiseView( this );
00121 m_part->core()->running( m_part, true );
00122
00123
00124 if (m_job)
00125 {
00126 delete m_job;
00127 m_job = 0;
00128 }
00129 m_job = new CvsJob_stub( aJob.app(), aJob.obj() );
00130
00131
00132 connectDCOPSignal( m_job->app(), m_job->obj(), "jobExited(bool, int)", "slotJobExited(bool, int)", true );
00133 connectDCOPSignal( m_job->app(), m_job->obj(), "receivedStdout(QString)", "slotReceivedOutput(QString)", true );
00134 connectDCOPSignal( m_job->app(), m_job->obj(), "receivedStderr(QString)", "slotReceivedErrors(QString)", true );
00135
00136
00137 QString cmdLine = m_job->cvsCommand();
00138 m_part->mainWindow()->statusBar()->message( cmdLine );
00139
00140 kdDebug(9006) << "Running: " << cmdLine << endl;
00141
00142
00143 disconnect( SIGNAL(jobFinished(bool, int)) );
00144
00145 showInfo( i18n("Started job: ") + cmdLine );
00146
00147 #ifdef MYDCOPDEBUG
00148 g_dcopExitCounter = 0;
00149 g_dcopOutCounter = 0;
00150 g_dcopErrCounter = 0;
00151 #endif
00152
00153 return m_job->execute();
00154 }
00155
00157
00158 void CvsProcessWidget::cancelJob()
00159 {
00160 kdDebug(9006) << "CvsProcessWidget::cancelJob() here!" << endl;
00161
00162 if (!m_job || !m_job->isRunning())
00163 return;
00164 m_job->cancel();
00165 delete m_job; m_job = 0;
00166
00167 showInfo( i18n("*** Job canceled by user request ***") );
00168
00169 m_part->core()->running( m_part, false );
00170 }
00171
00173
00174 void CvsProcessWidget::slotJobExited( bool normalExit, int exitStatus )
00175 {
00176 kdDebug(9006) << "CvsProcessWidget::slotJobExited(bool, int) here!" << endl;
00177 #ifdef MYDCOPDEBUG
00178 g_dcopExitCounter++;
00179 kdDebug(9006) << "MYDCOPDEBUG: dcopExitCounter == " << g_dcopExitCounter << endl;
00180 #endif
00181 if (m_job)
00182 {
00183 disconnectDCOPSignal( m_job->app(), m_job->obj(), "jobExited(bool, int)", "slotJobExited(bool, int)" );
00184 disconnectDCOPSignal( m_job->app(), m_job->obj(), "receivedStdout(QString)", "slotReceivedOutput(QString)" );
00185 disconnectDCOPSignal( m_job->app(), m_job->obj(), "receivedStderr(QString)", "slotReceivedErrors(QString)" );
00186 delete m_job;
00187 m_job = 0;
00188 }
00189 QString exitMsg = i18n("Job finished with exitCode == %1");
00190 showInfo( exitMsg.arg( exitStatus) );
00191
00192 m_part->core()->running( m_part, false );
00193 m_part->mainWindow()->statusBar()->message( i18n("Done CVS command ..."), 2000 );
00194
00195 emit jobFinished( normalExit, exitStatus );
00196 }
00197
00199
00200 void CvsProcessWidget::slotReceivedOutput( QString someOutput )
00201 {
00202 kdDebug(9006) << "CvsProcessWidget::slotReceivedOutput(QString) here!" << endl;
00203 #ifdef MYDCOPDEBUG
00204 g_dcopOutCounter++;
00205 kdDebug(9006) << "MYDCOPDEBUG: dcopOutCounter == " << g_dcopOutCounter << endl;
00206 #endif
00207
00208 QStringList strings = m_outputBuffer.process( someOutput );
00209 if (strings.count() > 0)
00210 {
00211 m_output += strings;
00212 showOutput( strings );
00213 scrollToBottom();
00214 }
00215 }
00216
00218
00219 void CvsProcessWidget::slotReceivedErrors( QString someErrors )
00220 {
00221 kdDebug(9006) << "CvsProcessWidget::slotReceivedErrors(QString) here!" << endl;
00222 #ifdef MYDCOPDEBUG
00223 g_dcopErrCounter++;
00224 kdDebug(9006) << "MYDCOPDEBUG: dcopErrCounter == " << g_dcopErrCounter << endl;
00225 #endif
00226
00227 QStringList strings = m_errorBuffer.process( someErrors );
00228 if (strings.count() > 0)
00229 {
00230 m_errors += strings;
00231 showError( strings );
00232 scrollToBottom();
00233 }
00234 }
00235
00237
00238 void CvsProcessWidget::showInfo( const QStringList &msg )
00239 {
00240 for (QStringList::const_iterator it = msg.begin(); it != msg.end(); ++it)
00241 append( "<infotag>" + (*it) + "</infotag>" );
00242 }
00243
00245
00246 void CvsProcessWidget::showError( const QStringList &msg )
00247 {
00248 for (QStringList::const_iterator it = msg.begin(); it != msg.end(); ++it)
00249 append( "<errortag>" + (*it) + "</errortag>" );
00250 }
00251
00253
00254 void CvsProcessWidget::showOutput( const QStringList &msg )
00255 {
00256 for (QStringList::const_iterator it = msg.begin(); it != msg.end(); ++it)
00257 {
00258
00259 const QString &line = (*it);
00260
00261 if (line.startsWith( "C " ))
00262 append( "<cvs_conflict>" + line + "</cvs_conflict>" );
00263 else if (line.startsWith( "M " ))
00264 append( "<cvs_modified>" + line + "</cvs_modified>" );
00265 else if (line.startsWith( "A " ))
00266 append( "<cvs_added>" + line + "</cvs_added>" );
00267 else if (line.startsWith( "R " ))
00268 append( "<cvs_removed>" + line + "</cvs_removed>" );
00269 else if (line.startsWith( "U " ))
00270 append( "<cvs_updated>" + line + "</cvs_updated>" );
00271 else if (line.startsWith( "? " ))
00272 append( "<cvs_unknown>" + line + "</cvs_unknown>" );
00273 else
00274 append( "<goodtag>" + (*it) + "</goodtag>" );
00275 }
00276 }
00277
00278 #include "cvsprocesswidget.moc"