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