1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
|
/***************************************************************************
*
* Copyright (C) 2005 Elad Lahav (elad_lahav@users.sourceforge.net)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
***************************************************************************/
#ifndef QUERYVIEW_H
#define QUERYVIEW_H
#include <qlistview.h>
#include <qregexp.h>
class QueryResultsMenu;
/**
* Items in a query view.
* The sole purpose for creating a new class is to be able to sort query
* results numerically by line number.
* @author Elad Lahav
*/
class QueryViewItem : public QListViewItem
{
public:
/**
* Class constructor.
* Used for list views.
* @param pView The view widget
* @param pAfter The item to preceed the new one
* @param nLineCol The index of the line column
*/
QueryViewItem(QListView* pView, QListViewItem* pAfter,
int nLineCol) : QListViewItem(pView, pAfter), m_nLineCol(nLineCol)
{}
/**
* Class constructor.
* Used for tree views.
* @param pParent The parent item
* @param pAfter The item to preceed the new one
* @param nLineCol The index of the line column
*/
QueryViewItem(QListViewItem* pParent, QListViewItem* pAfter,
int nLineCol) : QListViewItem(pParent, pAfter), m_nLineCol(nLineCol)
{}
/**
* Compares two items.
* If the given column holds line numbers, than the items are compared
* by their numeric values. Otherwise, a standard text comparison is
* performed.
* @param pItem The item to compare to
* @param nCol The column by which to compare
* @param bAscend Whether sorting in ascending or descending order
* @return 0 if the items are equal, 1 if the current item is greater,
* -1 if the current item is smaller
*/
virtual int compare(QListViewItem* pItem, int nCol, bool bAscend) const {
if (nCol == m_nLineCol) {
uint nLineCur, nLineOther;
int nResult;
// Get the line numbers of each item
nLineCur = text(nCol).toUInt();
nLineOther = pItem->text(nCol).toUInt();
// Compare the line numbers
nResult = nLineCur - nLineOther;
if (nResult == 0)
return 0; // Items are equal
else if (nResult > 0)
return 1; // The first item is greater
else
return -1; // The second item is greater
}
return QListViewItem::compare(pItem, nCol, bAscend);
}
private:
/** The index of the column holding the line numbers. */
int m_nLineCol;
};
/**
* A list view widget for displaying locations in the source code. Each record
* (list item) represents a single line of code.
* The main purpose of this class is for showing query results (@see
* QueryViewDriver), but is can also serve as a base class for any widget
* which needs to refer to locations in the source code (@see
* HistoryView).
* The view has 4 columns, for showing the file path, function name, line
* number and line text of a code location.
* The widget owns a popup menu which allows users to copy information
* from records, filter records, and more.
* @author Elad Lahav
*/
class QueryView : public QListView
{
Q_OBJECT
public:
QueryView(QWidget* pParent = 0, const char* szName = 0);
~QueryView();
virtual void addRecord(const QString&, const QString&, const QString&,
const QString&, QListViewItem* pParent = NULL);
virtual void select(QListViewItem*);
virtual void selectNext();
virtual void selectPrev();
virtual void queryProgress();
virtual void queryFinished(uint, QListViewItem* pParent = NULL);
/**
* Provides an iterator over the list of query results.
* @author Elad Lahav
*/
class Iterator
{
public:
/**
* Default constructor.
*/
Iterator() : m_pItem(NULL) {}
/**
* Copy constructor.
* @param itr The copied object
*/
Iterator(const Iterator& itr) : m_pItem(itr.m_pItem) {}
/**
* @return true if the iterator points _beyond_ the end of the list,
* false otherwise
*/
bool isEOF() { return m_pItem == NULL; }
void next();
QString getFunc();
QString getFile();
QString getLine();
QString getText();
private:
/** Points to the current list item. */
QListViewItem* m_pItem;
/**
* Private constructor used to return initialised iterators.
* This constructor can only be called from within QueryView.
* @param pItem The initial list item
*/
Iterator(QListViewItem* pItem) : m_pItem(pItem) {}
friend class QueryView;
};
Iterator getIterator();
signals:
/**
* Notifies the owner widget that it needs to be visible since some
* information is available to display.
* This information may be an advancement of the progress bar,
* availability of query results, etc.
*/
void needToShow();
/**
* Emitted when a list record is selected.
* Selection is done by either double-clicking a query or by highlighting
* it and then pressing the ENTER key.
* @param sFile The "File" field of the selected record
* @param nLine The "Line" field of the selected record
*/
void lineRequested(const QString& sFile, uint nLine);
protected:
/** A popup-menu for manipulating query result items. */
QueryResultsMenu* m_pQueryMenu;
/** A pointer to the last item (used for appending results). */
QListViewItem* m_pLastItem;
void contentsMouseDoubleClickEvent(QMouseEvent*);
protected slots:
virtual void slotRecordSelected(QListViewItem*);
virtual void slotFindDef(const QString&);
virtual void slotCopy(QListViewItem*, int);
virtual void slotFilter(int);
virtual void slotShowAll();
virtual void slotRemoveItem(QListViewItem*);
};
#endif
|