3
#include <qpopupmenu.h>
5
#include <kparts/part.h>
6
#include <klibloader.h>
11
#include <kstatusbar.h>
14
#include <kdevpartcontroller.h>
15
#include <kdevmainwindow.h>
16
#include <kdevproject.h>
18
#include "valgrind_part.h"
19
#include "valgrind_widget.h"
21
#define VALLISTVIEWITEMRTTI 130977
23
// helper class to sort the ListView by item number instead of the string representation of the item number
24
class ValListViewItem: public QListViewItem
27
ValListViewItem( QListView* parent, int key, int pid, const QString& message ):
28
QListViewItem( parent, QString::number( key ), QString::number( pid ), message ),
29
_key( key ), _pid ( pid ), backtrace( false ), _line( -1 ), _active( false ) {}
31
ValListViewItem( ValListViewItem* parent, int key, int pid, const QString& message, const QString& filename, int line, bool active ):
32
QListViewItem( parent, QString::number( key ), QString::null, message ),
33
_key( key ), _pid( pid ), backtrace( true ), _filename( filename ), _line( line ), _active( active )
35
if ( parent->_pid != _pid && _pid > 0 )
36
setText( 1, QString::number( _pid ) );
39
virtual ~ValListViewItem();
41
static int intCompare( int i1, int i2 )
51
int compare( QListViewItem* i, int col, bool ascending ) const
53
if ( !i || i->rtti() != VALLISTVIEWITEMRTTI )
54
return QListViewItem::compare( i, col, ascending );
56
case 0 : return intCompare( ((ValListViewItem*)i)->_key, _key );
57
case 1 : return intCompare( ((ValListViewItem*)i)->_pid, _pid );
58
default: return QListViewItem::compare( i, col, ascending );
62
void paintCell( QPainter* p, const QColorGroup& cg, int column, int width, int align )
65
QFont fnt = p->font();
69
QListViewItem::paintCell( p, cg, column, width, align );
72
int rtti() const { return VALLISTVIEWITEMRTTI; }
74
QString fileName() const { return _filename; }
75
int line() const { return _line; }
76
QString message() const { return text( 2 ); }
77
bool isHighlighted() const { return _active; }
88
ValListViewItem::~ValListViewItem() {}
90
ValgrindWidget::ValgrindWidget( ValgrindPart *part )
91
: QWidget(0, "valgrind widget"), _part( part )
93
QVBoxLayout* vbl = new QVBoxLayout( this );
94
lv = new KListView( this );
95
lv->addColumn( i18n( "No." ) );
96
lv->addColumn( i18n( "Thread" ) );
97
lv->addColumn( i18n( "Message" ) );
98
lv->setSorting( 0, false );
99
lv->setRootIsDecorated( true );
100
lv->setAllColumnsShowFocus( true );
101
vbl->addWidget( lv );
103
popup = new QPopupMenu( lv, "valPopup" );
104
popup->insertItem( i18n( "&Open Valgrind Output..." ), _part, SLOT(loadOutput()), 0, 0 );
105
popup->insertSeparator();
106
popup->insertItem( i18n( "Expand All Items" ), this, SLOT(expandAll()), 0, 2 );
107
popup->insertItem( i18n( "Collapse All Items" ), this, SLOT(collapseAll()), 0, 3 );
109
connect( popup, SIGNAL(aboutToShow()),
110
this, SLOT(aboutToShowPopup()) );
111
connect( lv, SIGNAL(executed(QListViewItem*)),
112
this, SLOT(executed(QListViewItem*)) );
113
connect( lv, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
114
this, SLOT(slotContextMenu(KListView*, QListViewItem*, const QPoint&)) );
118
ValgrindWidget::~ValgrindWidget()
122
void ValgrindWidget::clear()
128
void ValgrindWidget::addMessage( const ValgrindItem& vi )
130
QStringList projectFiles;
131
QString projectDirectory;
133
ValListViewItem* lvi = new ValListViewItem( lv, msgNumber++, vi.pid(), vi.message() );
134
lvi->setMultiLinesEnabled( true );
135
const ValgrindItem::BacktraceList backtrace = vi.backtrace();
136
if ( !backtrace.isEmpty() )
137
lvi->setExpandable( true );
140
for ( ValgrindItem::BacktraceList::ConstIterator it = backtrace.begin(); it != backtrace.end(); ++it ) {
141
new ValListViewItem( lvi, ++i, (*it).pid(), (*it).message(), (*it).url(), (*it).line(), (*it).isHighlighted() );
145
void ValgrindWidget::executed( QListViewItem* lvi )
148
Q_ASSERT( _part->partController() );
149
Q_ASSERT( _part->mainWindow() );
151
if ( !lvi || lvi->rtti() != VALLISTVIEWITEMRTTI )
153
ValListViewItem* vli = 0;
154
if ( !((ValListViewItem*)lvi)->fileName().isEmpty() ) {
155
vli = (ValListViewItem*)lvi;
156
} else if ( lvi->isExpandable() ) {
157
// find the memleak position
158
QListViewItemIterator it( lv );
159
while ( vli == 0 && it.current() ) {
160
if ( it.current()->rtti() == VALLISTVIEWITEMRTTI && ((ValListViewItem*)it.current())->isHighlighted() )
161
vli = (ValListViewItem*)it.current();
167
_part->partController()->editDocument( KURL( vli->fileName() ), vli->line() - 1 );
168
_part->mainWindow()->statusBar()->message( vli->message(), 10000 );
172
void ValgrindWidget::expandAll()
174
QListViewItem* child = lv->firstChild();
176
child->setOpen( true );
177
child = child->nextSibling();
181
void ValgrindWidget::collapseAll()
183
QListViewItem* child = lv->firstChild();
185
child->setOpen( false );
186
child = child->nextSibling();
190
void ValgrindWidget::aboutToShowPopup()
192
bool en = (lv->firstChild() != 0);
193
popup->setItemEnabled( 2, en );
194
popup->setItemEnabled( 3, en );
197
void ValgrindWidget::slotContextMenu( KListView* l, QListViewItem* /*i*/, const QPoint& p )
205
#include "valgrind_widget.moc"