1
2 /*
3 * CodeQuery
4 * Copyright (C) 2013-2017 ruben2020 https://github.com/ruben2020/
5 *
6 * This Source Code Form is subject to the terms of the Mozilla Public
7 * License, v. 2.0. If a copy of the MPL was not distributed with this
8 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 *
10 */
11
12
13 #include "listhandler.h"
14
listhandler(mainwindow * pmw)15 listhandler::listhandler(mainwindow* pmw)
16 :mw(pmw)
17 ,m_treeWidgetSearchResults(NULL)
18 ,m_pushButtonUp(NULL)
19 ,m_pushButtonDown(NULL)
20 ,m_noclick(false)
21 {
22 }
23
~listhandler()24 listhandler::~listhandler()
25 {
26 disconnect();
27 }
28
prepareToExit(void)29 void listhandler::prepareToExit(void)
30 {
31 disconnect();
32 m_noclick = true;
33 m_treeWidgetSearchResults->clear();
34 m_sqlist.resultlist.clear();
35 }
36
init(void)37 void listhandler::init(void)
38 {
39 connect(m_treeWidgetSearchResults, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
40 this, SLOT(listItemClicked(QTreeWidgetItem *, QTreeWidgetItem *)));
41 connect(m_pushButtonUp, SIGNAL(clicked(bool)),
42 this, SLOT(Up_ButtonClick(bool)));
43 connect(m_pushButtonDown, SIGNAL(clicked(bool)),
44 this, SLOT(Down_ButtonClick(bool)));
45 m_pushButtonUp->setEnabled(false);
46 m_pushButtonDown->setEnabled(false);
47 m_treeWidgetSearchResults->setSelectionMode(QAbstractItemView::SingleSelection);
48 m_sqlist.resultlist.clear();
49 m_sqlist.result_type = sqlqueryresultlist::sqlresultFULL;
50 m_noclick = true;
51 updateListHeaders();
52 m_noclick = false;
53 m_sqlist.result_type = sqlqueryresultlist::sqlresultERROR;
54 }
55
populateList(sqlqueryresultlist resultlist,int selectitem)56 void listhandler::populateList(sqlqueryresultlist resultlist, int selectitem)
57 {
58 bool headersChanged = (m_sqlist.result_type != resultlist.result_type);
59 m_sqlist = resultlist;
60 m_noclick = true;
61 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
62 clearList();
63 if (headersChanged) updateListHeaders();
64 updateList();
65 resizeColumns();
66 QApplication::restoreOverrideCursor();
67 m_noclick = false;
68 m_treeWidgetSearchResults->setCurrentItem(m_treeWidgetSearchResults->topLevelItem(selectitem));
69 emit listRowNumUpdated(selectitem);
70 }
71
listItemClicked(QTreeWidgetItem * current,QTreeWidgetItem * previous)72 void listhandler::listItemClicked(QTreeWidgetItem * current, QTreeWidgetItem * previous)
73 {
74 if (current == NULL) return;
75 if (m_noclick) return;
76 checkUpDown();
77 emit listRowNumUpdated(m_treeWidgetSearchResults->indexOfTopLevelItem(current));
78 emit openFile(m_sqlist.resultlist[current->data(0,Qt::UserRole).toLongLong()].filepath,
79 m_sqlist.resultlist[current->data(0,Qt::UserRole).toLongLong()].linenum,
80 m_sqlist.resultlist[current->data(0,Qt::UserRole).toLongLong()].fileid);
81 }
82
requestToProvideResultCurrentListItemSymbolName()83 void listhandler::requestToProvideResultCurrentListItemSymbolName()
84 {
85 QString symName("");
86 if (m_treeWidgetSearchResults->topLevelItemCount() > 0)
87 {
88 QTreeWidgetItem* current = m_treeWidgetSearchResults->currentItem();
89 symName = m_sqlist.resultlist[current->data(0,Qt::UserRole).toLongLong()].symname;
90 }
91 emit sendResultCurrentListItemSymbolName(symName);
92 }
93
updateList(void)94 void listhandler::updateList(void)
95 {
96 if (m_sqlist.resultlist.empty()) return;
97 qlonglong i = 0;
98 int col;
99 QList<QTreeWidgetItem*> treeitemlist;
100 treeitemlist.reserve(m_sqlist.resultlist.size());
101 for(std::vector<sqlqueryresult>::iterator it = m_sqlist.resultlist.begin();
102 it != m_sqlist.resultlist.end(); it++)
103 {
104 col = 0;
105 treeitemlist += new QTreeWidgetItem(m_treeWidgetSearchResults);
106 if (m_sqlist.result_type == sqlqueryresultlist::sqlresultFULL)
107 treeitemlist.last()->setText(col++, it->symname);
108 treeitemlist.last()->setText(col++, it->filename);
109 if ((m_sqlist.result_type == sqlqueryresultlist::sqlresultFULL)||
110 (m_sqlist.result_type == sqlqueryresultlist::sqlresultFILE_LINE))
111 {
112 treeitemlist.last()->setText(col++, it->linenum);
113 treeitemlist.last()->setText(col++, it->linetext);
114 }
115 treeitemlist.last()->setData(0, Qt::UserRole, QVariant(i++));
116 }
117 m_treeWidgetSearchResults->addTopLevelItems(treeitemlist);
118 }
119
updateListHeaders(void)120 void listhandler::updateListHeaders(void)
121 {
122 QStringList headers;
123 if (m_sqlist.result_type == sqlqueryresultlist::sqlresultFULL)
124 headers += tr("Symbol");
125 headers += tr("File");
126 if ((m_sqlist.result_type == sqlqueryresultlist::sqlresultFULL)||
127 (m_sqlist.result_type == sqlqueryresultlist::sqlresultFILE_LINE))
128 headers << tr("Line") << tr("Preview");
129 m_treeWidgetSearchResults->setHeaderLabels(headers);
130 if (m_sqlist.result_type == sqlqueryresultlist::sqlresultFULL)
131 {
132 m_treeWidgetSearchResults->setColumnCount(4);
133 }
134 else if (m_sqlist.result_type == sqlqueryresultlist::sqlresultFILE_LINE)
135 {
136 m_treeWidgetSearchResults->setColumnCount(3);
137 }
138 else if (m_sqlist.result_type == sqlqueryresultlist::sqlresultFILE_ONLY)
139 {
140 m_treeWidgetSearchResults->setColumnCount(1);
141 }
142 }
143
resizeColumns(void)144 void listhandler::resizeColumns(void)
145 {
146 int n = m_treeWidgetSearchResults->columnCount();
147 if (n > 1) n--;
148 for(int i=0; i < n; i++)
149 {m_treeWidgetSearchResults->resizeColumnToContents(i);}
150 }
151
clearList()152 void listhandler::clearList()
153 {
154 bool noclick = m_noclick;
155 m_pushButtonUp->setEnabled(false);
156 m_pushButtonDown->setEnabled(false);
157 m_noclick = true;
158 m_treeWidgetSearchResults->clear();
159 m_noclick = noclick;
160 }
161
retranslateUi(void)162 void listhandler::retranslateUi(void)
163 {
164 m_noclick = true;
165 if (m_treeWidgetSearchResults->topLevelItemCount() <= 0)
166 {
167 m_sqlist.result_type = sqlqueryresultlist::sqlresultFULL;
168 updateListHeaders();
169 m_noclick = false;
170 }
171 else
172 {
173 int curItemIdx = m_treeWidgetSearchResults->indexOfTopLevelItem(m_treeWidgetSearchResults->currentItem());
174 clearList();
175 updateListHeaders();
176 updateList();
177 resizeColumns();
178 m_treeWidgetSearchResults->setCurrentItem(m_treeWidgetSearchResults->topLevelItem(curItemIdx));
179 m_noclick = false;
180 listItemClicked(m_treeWidgetSearchResults->topLevelItem(curItemIdx), NULL);
181 }
182 }
183
Up_ButtonClick(bool checked)184 void listhandler::Up_ButtonClick(bool checked)
185 {
186 QTreeWidgetItem *item = NULL;
187 tStr curFilepath;
188 tStr itemFilepath;
189 if ((!checked)&&(m_treeWidgetSearchResults->topLevelItemCount() > 0))
190 {
191 item = m_treeWidgetSearchResults->currentItem();
192 if (item != NULL)
193 curFilepath = m_sqlist.resultlist[item->data(0,Qt::UserRole).toLongLong()].filepath;
194 while (item != NULL)
195 {
196 item = m_treeWidgetSearchResults->itemAbove(item);
197 if (item == NULL) break;
198 itemFilepath = m_sqlist.resultlist[item->data(0,Qt::UserRole).toLongLong()].filepath;
199 if (strrevcmp(curFilepath, itemFilepath))
200 {
201 m_treeWidgetSearchResults->setCurrentItem(item);
202 break;
203 }
204 }
205 }
206 }
207
Down_ButtonClick(bool checked)208 void listhandler::Down_ButtonClick(bool checked)
209 {
210 QTreeWidgetItem *item = NULL;
211 tStr curFilepath;
212 tStr itemFilepath;
213 if ((!checked)&&(m_treeWidgetSearchResults->topLevelItemCount() > 0))
214 {
215 item = m_treeWidgetSearchResults->currentItem();
216 if (item != NULL)
217 curFilepath = m_sqlist.resultlist[item->data(0,Qt::UserRole).toLongLong()].filepath;
218 while (item != NULL)
219 {
220 item = m_treeWidgetSearchResults->itemBelow(item);
221 if (item == NULL) break;
222 itemFilepath = m_sqlist.resultlist[item->data(0,Qt::UserRole).toLongLong()].filepath;
223 if (strrevcmp(curFilepath, itemFilepath))
224 {
225 m_treeWidgetSearchResults->setCurrentItem(item);
226 break;
227 }
228 }
229 }
230 }
231
checkUpDown(void)232 void listhandler::checkUpDown(void)
233 {
234 QTreeWidgetItem *item = NULL;
235 QTreeWidgetItem *curItem = NULL;
236 tStr curFilepath, itemFilepath;
237 bool upArrow=false, downArrow=false;
238 if (m_treeWidgetSearchResults->topLevelItemCount() <= 0) return;
239 item = m_treeWidgetSearchResults->currentItem();
240 curItem = item;
241 if (item != NULL)
242 curFilepath = m_sqlist.resultlist[item->data(0,Qt::UserRole).toLongLong()].filepath;
243
244 while (item != NULL)
245 {
246 item = m_treeWidgetSearchResults->itemAbove(item);
247 if (item == NULL) break;
248 itemFilepath = m_sqlist.resultlist[item->data(0,Qt::UserRole).toLongLong()].filepath;
249 if (strrevcmp(curFilepath, itemFilepath))
250 {
251 upArrow = true;
252 break;
253 }
254
255 // for now, assume items with same file path are grouped together
256 // This is to speed up the search
257 else break;
258 }
259
260 item = curItem;
261 while (item != NULL)
262 {
263 item = m_treeWidgetSearchResults->itemBelow(item);
264 if (item == NULL) break;
265 itemFilepath = m_sqlist.resultlist[item->data(0,Qt::UserRole).toLongLong()].filepath;
266 if (strrevcmp(curFilepath, itemFilepath))
267 {
268 downArrow = true;
269 break;
270 }
271
272 // for now, assume items with same file path are grouped together
273 // This is to speed up the search
274 else break;
275 }
276
277 m_pushButtonUp->setEnabled(upArrow);
278 m_pushButtonDown->setEnabled(downArrow);
279 }
280
281