KDevelop API Documentation

parts/valgrind/valgrind_widget.cpp

Go to the documentation of this file.
00001 #include <qlayout.h> 00002 #include <qpainter.h> 00003 #include <qpopupmenu.h> 00004 00005 #include <kparts/part.h> 00006 #include <klibloader.h> 00007 #include <kurl.h> 00008 #include <kdebug.h> 00009 #include <klistview.h> 00010 #include <klocale.h> 00011 #include <kstatusbar.h> 00012 00013 #include <kdevcore.h> 00014 #include <kdevpartcontroller.h> 00015 #include <kdevmainwindow.h> 00016 #include <kdevproject.h> 00017 00018 #include "valgrind_part.h" 00019 #include "valgrind_widget.h" 00020 00021 #define VALLISTVIEWITEMRTTI 130977 00022 00023 // helper class to sort the ListView by item number instead of the string representation of the item number 00024 class ValListViewItem: public QListViewItem 00025 { 00026 public: 00027 ValListViewItem( QListView* parent, int key, int pid, const QString& message ): 00028 QListViewItem( parent, QString::number( key ), QString::number( pid ), message ), 00029 _key( key ), _pid ( pid ), backtrace( false ), _line( -1 ), _active( false ) {} 00030 00031 ValListViewItem( ValListViewItem* parent, int key, int pid, const QString& message, const QString& filename, int line, bool active ): 00032 QListViewItem( parent, QString::number( key ), QString::null, message ), 00033 _key( key ), _pid( pid ), backtrace( true ), _filename( filename ), _line( line ), _active( active ) 00034 { 00035 if ( parent->_pid != _pid && _pid > 0 ) 00036 setText( 1, QString::number( _pid ) ); 00037 } 00038 00039 virtual ~ValListViewItem(); 00040 00041 static int intCompare( int i1, int i2 ) 00042 { 00043 if ( i1 > i2 ) 00044 return 1; 00045 else if ( i1 < i2 ) 00046 return -1; 00047 else 00048 return 0; 00049 } 00050 00051 int compare( QListViewItem* i, int col, bool ascending ) const 00052 { 00053 if ( !i || i->rtti() != VALLISTVIEWITEMRTTI ) 00054 return QListViewItem::compare( i, col, ascending ); 00055 switch ( col ) { 00056 case 0 : return intCompare( ((ValListViewItem*)i)->_key, _key ); 00057 case 1 : return intCompare( ((ValListViewItem*)i)->_pid, _pid ); 00058 default: return QListViewItem::compare( i, col, ascending ); 00059 } 00060 } 00061 00062 void paintCell( QPainter* p, const QColorGroup& cg, int column, int width, int align ) 00063 { 00064 if ( _active ) { 00065 QFont fnt = p->font(); 00066 fnt.setBold( true ); 00067 p->setFont( fnt ); 00068 } 00069 QListViewItem::paintCell( p, cg, column, width, align ); 00070 } 00071 00072 int rtti() const { return VALLISTVIEWITEMRTTI; } 00073 00074 QString fileName() const { return _filename; } 00075 int line() const { return _line; } 00076 QString message() const { return text( 2 ); } 00077 bool isHighlighted() const { return _active; } 00078 00079 private: 00080 int _key; 00081 int _pid; 00082 bool backtrace; 00083 QString _filename; 00084 int _line; 00085 bool _active; 00086 }; 00087 00088 ValListViewItem::~ValListViewItem() {} 00089 00090 ValgrindWidget::ValgrindWidget( ValgrindPart *part ) 00091 : QWidget(0, "valgrind widget"), _part( part ) 00092 { 00093 QVBoxLayout* vbl = new QVBoxLayout( this ); 00094 lv = new KListView( this ); 00095 lv->addColumn( i18n( "No." ) ); 00096 lv->addColumn( i18n( "Thread" ) ); 00097 lv->addColumn( i18n( "Message" ) ); 00098 lv->setSorting( 0, false ); 00099 lv->setRootIsDecorated( true ); 00100 lv->setAllColumnsShowFocus( true ); 00101 vbl->addWidget( lv ); 00102 00103 popup = new QPopupMenu( lv, "valPopup" ); 00104 popup->insertItem( i18n( "&Open Valgrind Output..." ), _part, SLOT(loadOutput()), 0, 0 ); 00105 popup->insertSeparator(); 00106 popup->insertItem( i18n( "Expand All Items" ), this, SLOT(expandAll()), 0, 2 ); 00107 popup->insertItem( i18n( "Collapse All Items" ), this, SLOT(collapseAll()), 0, 3 ); 00108 00109 connect( popup, SIGNAL(aboutToShow()), 00110 this, SLOT(aboutToShowPopup()) ); 00111 connect( lv, SIGNAL(executed(QListViewItem*)), 00112 this, SLOT(executed(QListViewItem*)) ); 00113 connect( lv, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)), 00114 this, SLOT(slotContextMenu(KListView*, QListViewItem*, const QPoint&)) ); 00115 } 00116 00117 00118 ValgrindWidget::~ValgrindWidget() 00119 { 00120 } 00121 00122 void ValgrindWidget::clear() 00123 { 00124 lv->clear(); 00125 msgNumber = 1; 00126 } 00127 00128 void ValgrindWidget::addMessage( const ValgrindItem& vi ) 00129 { 00130 QStringList projectFiles; 00131 QString projectDirectory; 00132 00133 ValListViewItem* lvi = new ValListViewItem( lv, msgNumber++, vi.pid(), vi.message() ); 00134 lvi->setMultiLinesEnabled( true ); 00135 const ValgrindItem::BacktraceList backtrace = vi.backtrace(); 00136 if ( !backtrace.isEmpty() ) 00137 lvi->setExpandable( true ); 00138 00139 int i = 0; 00140 for ( ValgrindItem::BacktraceList::ConstIterator it = backtrace.begin(); it != backtrace.end(); ++it ) { 00141 new ValListViewItem( lvi, ++i, (*it).pid(), (*it).message(), (*it).url(), (*it).line(), (*it).isHighlighted() ); 00142 } 00143 } 00144 00145 void ValgrindWidget::executed( QListViewItem* lvi ) 00146 { 00147 Q_ASSERT( _part ); 00148 Q_ASSERT( _part->partController() ); 00149 Q_ASSERT( _part->mainWindow() ); 00150 00151 if ( !lvi || lvi->rtti() != VALLISTVIEWITEMRTTI ) 00152 return; 00153 ValListViewItem* vli = 0; 00154 if ( !((ValListViewItem*)lvi)->fileName().isEmpty() ) { 00155 vli = (ValListViewItem*)lvi; 00156 } else if ( lvi->isExpandable() ) { 00157 // find the memleak position 00158 QListViewItemIterator it( lv ); 00159 while ( vli == 0 && it.current() ) { 00160 if ( it.current()->rtti() == VALLISTVIEWITEMRTTI && ((ValListViewItem*)it.current())->isHighlighted() ) 00161 vli = (ValListViewItem*)it.current(); 00162 ++it; 00163 } 00164 } 00165 if ( vli ) { 00166 // display the file 00167 _part->partController()->editDocument( vli->fileName(), vli->line() - 1 ); 00168 _part->mainWindow()->statusBar()->message( vli->message(), 10000 ); 00169 _part->mainWindow()->lowerView( this ); 00170 } 00171 } 00172 00173 void ValgrindWidget::expandAll() 00174 { 00175 QListViewItem* child = lv->firstChild(); 00176 while ( child ) { 00177 child->setOpen( true ); 00178 child = child->nextSibling(); 00179 } 00180 } 00181 00182 void ValgrindWidget::collapseAll() 00183 { 00184 QListViewItem* child = lv->firstChild(); 00185 while ( child ) { 00186 child->setOpen( false ); 00187 child = child->nextSibling(); 00188 } 00189 } 00190 00191 void ValgrindWidget::aboutToShowPopup() 00192 { 00193 bool en = (lv->firstChild() != 0); 00194 popup->setItemEnabled( 2, en ); 00195 popup->setItemEnabled( 3, en ); 00196 } 00197 00198 void ValgrindWidget::slotContextMenu( KListView* l, QListViewItem* /*i*/, const QPoint& p ) 00199 { 00200 if ( l != lv ) 00201 return; 00202 00203 popup->exec( p ); 00204 } 00205 00206 #include "valgrind_widget.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Oct 6 17:39:13 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003