00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "problemreporter.h"
00020 #include "pascalsupport_part.h"
00021 #include "kdevpartcontroller.h"
00022 #include "kdevmainwindow.h"
00023 #include "configproblemreporter.h"
00024 #include "backgroundparser.h"
00025
00026 #include <kdeversion.h>
00027 #include <kparts/part.h>
00028 #include <ktexteditor/editinterface.h>
00029 #include <ktexteditor/document.h>
00030 #include <ktexteditor/markinterface.h>
00031
00032 #if (KDE_VERSION > 305)
00033 # include <ktexteditor/markinterfaceextension.h>
00034 #else
00035 # include "kde30x_markinterfaceextension.h"
00036 #endif
00037
00038 #include <kdebug.h>
00039 #include <klocale.h>
00040 #include <kstatusbar.h>
00041 #include <kurl.h>
00042 #include <kapplication.h>
00043 #include <kiconloader.h>
00044
00045 #include <kconfig.h>
00046
00047 #include <qtimer.h>
00048 #include <qregexp.h>
00049 #include <qvbox.h>
00050 #include <kdialogbase.h>
00051
00052
00053 class ProblemItem: public QListViewItem{
00054 public:
00055 ProblemItem( QListView* parent, const QString& level, const QString& problem,
00056 const QString& file, const QString& line, const QString& column )
00057 : QListViewItem( parent, level, problem, file, line, column ) {}
00058
00059 ProblemItem( QListViewItem* parent, const QString& level, const QString& problem,
00060 const QString& file, const QString& line, const QString& column )
00061 : QListViewItem( parent, level, problem, file, line, column ) {}
00062
00063 int compare( QListViewItem* item, int column, bool ascending ) const {
00064 if( column == 3 || column == 4 ){
00065 int a = text( column ).toInt();
00066 int b = item->text( column ).toInt();
00067 if( a == b )
00068 return 0;
00069 return( a > b ? -1 : 1 );
00070 }
00071 return QListViewItem::compare( item, column, ascending );
00072 }
00073
00074 };
00075
00076 ProblemReporter::ProblemReporter( PascalSupportPart* part, QWidget* parent, const char* name )
00077 : QListView( parent, name ),
00078 m_pascalSupport( part ),
00079 m_editor( 0 ),
00080 m_document( 0 ),
00081 m_markIface( 0 ),
00082 m_bgParser( 0 )
00083 {
00084 addColumn( i18n("Level") );
00085 addColumn( i18n("Problem") );
00086 addColumn( i18n("File") );
00087 addColumn( i18n("Line") );
00088
00089 setAllColumnsShowFocus( TRUE );
00090
00091 m_timer = new QTimer( this );
00092
00093 connect( part->partController(), SIGNAL(activePartChanged(KParts::Part*)),
00094 this, SLOT(slotActivePartChanged(KParts::Part*)) );
00095 connect( part->partController(), SIGNAL(partAdded(KParts::Part*)),
00096 this, SLOT(slotPartAdded(KParts::Part*)) );
00097 connect( part->partController(), SIGNAL(partRemoved(KParts::Part*)),
00098 this, SLOT(slotPartRemoved(KParts::Part*)) );
00099
00100 connect( m_timer, SIGNAL(timeout()), this, SLOT(reparse()) );
00101
00102 connect( this, SIGNAL(doubleClicked(QListViewItem*)),
00103 this, SLOT(slotSelected(QListViewItem*)) );
00104 connect( this, SIGNAL(returnPressed(QListViewItem*)),
00105 this, SLOT(slotSelected(QListViewItem*)) );
00106
00107 configure();
00108 }
00109
00110 ProblemReporter::~ProblemReporter()
00111 {
00112 if( m_bgParser ) {
00113 m_bgParser->wait();
00114 }
00115
00116 delete( m_bgParser );
00117 m_bgParser = 0;
00118 }
00119
00120 void ProblemReporter::slotActivePartChanged( KParts::Part* part )
00121 {
00122 if( !part )
00123 return;
00124
00125 if( m_editor )
00126 reparse();
00127
00128 m_document = dynamic_cast<KTextEditor::Document*>( part );
00129 if( m_document ){
00130 m_filename = m_document->url().path();
00131 }
00132
00133 m_editor = dynamic_cast<KTextEditor::EditInterface*>( part );
00134 if( m_editor )
00135 connect( m_document, SIGNAL(textChanged()), this, SLOT(slotTextChanged()) );
00136
00137 m_markIface = dynamic_cast<KTextEditor::MarkInterface*>( part );
00138
00139 m_timer->changeInterval( m_delay );
00140 }
00141
00142 void ProblemReporter::slotTextChanged()
00143 {
00144 if( m_active )
00145 m_timer->changeInterval( m_delay );
00146 }
00147
00148 void ProblemReporter::reparse()
00149 {
00150 kdDebug(9007) << "ProblemReporter::reparse()" << endl;
00151
00152 kdDebug() << "1" << endl;
00153
00154 if( !m_editor )
00155 return;
00156
00157 kdDebug() << "2" << endl;
00158
00159 m_timer->stop();
00160
00161 kdDebug() << "3" << endl;
00162
00163 if( m_bgParser ) {
00164 if( m_bgParser->running() ) {
00165 m_timer->changeInterval( m_delay );
00166 return;
00167 }
00168
00169 delete( m_bgParser );
00170 m_bgParser = 0;
00171 }
00172
00173 kdDebug() << "4" << endl;
00174
00175 QListViewItem* current = firstChild();
00176 while( current ){
00177 QListViewItem* i = current;
00178 current = current->nextSibling();
00179
00180 if( i->text(2) == m_filename )
00181 delete( i );
00182 }
00183
00184 kdDebug() << "5" << endl;
00185
00186 if( m_markIface ){
00187 QPtrList<KTextEditor::Mark> marks = m_markIface->marks();
00188 QPtrListIterator<KTextEditor::Mark> it( marks );
00189 while( it.current() ){
00190 m_markIface->removeMark( it.current()->line, KTextEditor::MarkInterface::markType07 );
00191 ++it;
00192 }
00193 }
00194
00195 kdDebug() << "6" << endl;
00196
00197 m_bgParser = new BackgroundParser( this, m_editor->text(), m_filename );
00198
00199 kdDebug() << "7" << endl;
00200
00201 m_bgParser->start();
00202
00203 kdDebug() << "8" << endl;
00204 }
00205
00206 void ProblemReporter::slotSelected( QListViewItem* item )
00207 {
00208 KURL url( item->text(2) );
00209 int line = item->text( 3 ).toInt();
00210
00211 m_pascalSupport->partController()->editDocument( url, line-1 );
00212 }
00213
00214 void ProblemReporter::reportError( QString message,
00215 QString filename,
00216 int line, int column )
00217 {
00218 if( m_markIface ){
00219 m_markIface->addMark( line-1, KTextEditor::MarkInterface::markType07 );
00220 }
00221
00222 new ProblemItem( this,
00223 "error",
00224 message.replace( QRegExp("\n"), "" ),
00225 filename,
00226 QString::number( line ),
00227 QString::number( column ) );
00228 }
00229
00230 void ProblemReporter::reportWarning( QString message,
00231 QString filename,
00232 int line, int column )
00233 {
00234 new ProblemItem( this,
00235 "warning",
00236 message.replace( QRegExp("\n"), "" ),
00237 filename,
00238 QString::number( line ),
00239 QString::number( column ) );
00240 }
00241
00242 void ProblemReporter::reportMessage( QString message,
00243 QString filename,
00244 int line, int column )
00245 {
00246 new QListViewItem( this,
00247 "message",
00248 message.replace( QRegExp("\n"), "" ),
00249 filename,
00250 QString::number( line ),
00251 QString::number( column ) );
00252 }
00253
00254 void ProblemReporter::configure()
00255 {
00256 kdDebug(9007) << "ProblemReporter::configure()" << endl;
00257 KConfig* config = kapp->config();
00258 config->setGroup( "General Options" );
00259 m_active = config->readBoolEntry( "EnableCppBgParser", TRUE );
00260 m_delay = config->readNumEntry( "BgParserDelay", 250 );
00261 }
00262
00263 void ProblemReporter::configWidget( KDialogBase* dlg )
00264 {
00266 Q_UNUSED(dlg);
00267
00268
00269
00270
00271 }
00272
00273 void ProblemReporter::slotPartAdded( KParts::Part* part )
00274 {
00275 KTextEditor::MarkInterfaceExtension* iface = dynamic_cast<KTextEditor::MarkInterfaceExtension*>( part );
00276
00277 if( !iface )
00278 return;
00279
00280 iface->setPixmap( KTextEditor::MarkInterface::markType07, SmallIcon("stop") );
00281 }
00282
00283 void ProblemReporter::slotPartRemoved( KParts::Part* part )
00284 {
00285 kdDebug(9007) << "ProblemReporter::slotPartRemoved()" << endl;
00286 if( part == m_document ){
00287 m_document = 0;
00288 m_editor = 0;
00289 m_timer->stop();
00290 }
00291 }
00292
00293 #include "problemreporter.moc"