core: Fix libdwarf and Qt build failure
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / allwatchbrowser.cpp
CommitLineData
0203b5fd
JPM
1//\r
2// allwatchbrowser.cpp - All Watch\r
3//\r
4// by Jean-Paul Mari\r
5//\r
6// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
7//\r
8// Who When What\r
9// --- ---------- -----------------------------------------------------------\r
10// JPM 12/07/2017 Created this file\r
4873fe0a 11// JPM 09/14/2018 Added a status bar, better status report and set information values in a tab\r
8d705db0 12// JPM April/2019 Added a sorting filter, tableview unique rows creation\r
b53b74f6 13// JPM April/2021 Added a search feature.\r
0203b5fd
JPM
14//\r
15\r
16// STILL TO DO:\r
a4e46c05 17// Better presentation\r
2b91c435 18// To set the information display at the right\r
8d705db0 19// To understand/fix the problem with the sorting filter\r
fe3b257d
JPM
20// Display arrays information\r
21// Display structures information\r
0203b5fd
JPM
22//\r
23\r
8d705db0 24//#define AW_SORTINGFILTER // Authorise the sorting filtes\r
4873fe0a 25//#define AW_DEBUGNUMVARIABLE 4415 // Set the global variable number to debug\r
2b91c435
JPM
26#ifndef AW_DEBUGNUMVARIABLE\r
27#define AW_STARTNUMVARIABLE 0 // Must be kept to 0 in case of no debug is required\r
28#else\r
29#define AW_STARTNUMVARIABLE AW_DEBUGNUMVARIABLE - 1\r
30#endif\r
31\r
32\r
0203b5fd
JPM
33#include "debugger/allwatchbrowser.h"\r
34#include "memory.h"\r
35#include "debugger/DBGManager.h"\r
36\r
37\r
a4e46c05 38// \r
0203b5fd 39AllWatchBrowserWindow::AllWatchBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),\r
2b91c435 40layout(new QVBoxLayout),\r
03458eec
JPM
41symbol(new QLineEdit),\r
42search(new QPushButton(tr("Search"))),\r
2b91c435
JPM
43#ifdef AW_LAYOUTTEXTS\r
44text(new QTextBrowser),\r
45#else\r
46TableView(new QTableView),\r
47model(new QStandardItemModel),\r
48#endif\r
49NbWatch(0),\r
03458eec 50CurrentWatch(0),\r
2b91c435
JPM
51statusbar(new QStatusBar),\r
52PtrWatchInfo(NULL)\r
0203b5fd
JPM
53{\r
54 setWindowTitle(tr("All Watch"));\r
55\r
03458eec 56 // set the font\r
0203b5fd 57 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
0203b5fd 58 fixedFont.setStyleHint(QFont::TypeWriter);\r
0203b5fd 59\r
2b91c435
JPM
60#ifdef AW_LAYOUTTEXTS\r
61 // Set original layout\r
62 text->setFont(fixedFont);\r
0203b5fd 63 layout->addWidget(text);\r
2b91c435
JPM
64#else\r
65 // Set the new layout with proper identation and readibility\r
66 model->setColumnCount(3);\r
67 model->setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));\r
68 model->setHeaderData(1, Qt::Horizontal, QObject::tr("Value"));\r
69 model->setHeaderData(2, Qt::Horizontal, QObject::tr("Type"));\r
70 // Information table\r
71 TableView->setModel(model);\r
72 TableView->setEditTriggers(QAbstractItemView::NoEditTriggers);\r
73 TableView->setShowGrid(0);\r
74 TableView->setFont(fixedFont);\r
75 TableView->verticalHeader()->setDefaultSectionSize(TableView->verticalHeader()->minimumSectionSize());\r
76 TableView->verticalHeader()->setDefaultAlignment(Qt::AlignRight);\r
77 layout->addWidget(TableView);\r
78#endif\r
79\r
03458eec
JPM
80 // search bar\r
81 QHBoxLayout * hbox1 = new QHBoxLayout;\r
82 symbol->setPlaceholderText("symbol name");\r
83 hbox1->addWidget(symbol);\r
84 hbox1->addWidget(search);\r
85 layout->addLayout(hbox1);\r
86\r
87 // status bar\r
2b91c435
JPM
88 layout->addWidget(statusbar);\r
89 setLayout(layout);\r
03458eec
JPM
90\r
91 // connect slot\r
92 connect(search, SIGNAL(clicked()), this, SLOT(SearchSymbol()));\r
93 connect(symbol, SIGNAL(cursorPositionChanged(int, int)), this, SLOT(SelectSearchSymbol()));\r
0203b5fd
JPM
94}\r
95\r
96\r
97//\r
98AllWatchBrowserWindow::~AllWatchBrowserWindow(void)\r
99{\r
a4e46c05
JPM
100 Reset();\r
101}\r
102\r
103\r
03458eec
JPM
104// Search the symbol in the watch list\r
105void AllWatchBrowserWindow::SearchSymbol(void)
106{
107 bool found = false;
108 size_t i;
109
110 // user cannot enter symbol to allow the search
111 symbol->setDisabled(true);
112
113 // look for the symbol in the watch list
114 for (i = AW_STARTNUMVARIABLE; (i < NbWatch) && !found; i++)\r
115 {\r
116 // check symbol presence\r
7512bf05 117 if (!symbol->text().compare(((S_VariablesStruct*)PtrWatchInfo[i])->PtrName, Qt::CaseSensitive))\r
03458eec
JPM
118 {\r
119 found = true;\r
120 }\r
121 }\r
122\r
123 if (found)\r
124 {\r
125 // remove previous highlight\r
126 if (CurrentWatch)\r
127 {\r
128 model->item((int)(CurrentWatch - 1), 0)->setBackground(QColor(255, 255, 255));\r
129 model->item((int)(CurrentWatch - 1), 1)->setBackground(QColor(255, 255, 255));\r
130 model->item((int)(CurrentWatch - 1), 2)->setBackground(QColor(255, 255, 255));\r
131 }\r
132 // Get the slider maximum position\r
133 int MaxSlider = TableView->verticalScrollBar()->maximum(); \r
134 // Number of items displayed in the scroll bar slider\r
135 int DeltaSlider = (int)NbWatch - MaxSlider;\r
136 // set the scroll bar\r
137 TableView->verticalScrollBar()->setSliderPosition((int)i - (DeltaSlider / 2) - 1);\r
138 // highlight watch symbol\r
139 CurrentWatch = i;\r
140 model->item((int)(CurrentWatch - 1), 0)->setBackground(QColor(0xff, 0xfa, 0xcd));\r
141 model->item((int)(CurrentWatch - 1), 1)->setBackground(QColor(0xff, 0xfa, 0xcd));\r
142 model->item((int)(CurrentWatch - 1), 2)->setBackground(QColor(0xff, 0xfa, 0xcd));\r
143 // allow new symbol\r
144 symbol->setText("");\r
145 }\r
146 else\r
147 {\r
148 // invalid symbol\r
149 symbol->setStyleSheet("color: red");\r
150 }\r
151
152 // user can enter a symbol
153 symbol->setEnabled(true);
154 symbol->setFocus();
155}
156
157
158//
159void AllWatchBrowserWindow::SelectSearchSymbol(void)\r
160{\r
161 symbol->setStyleSheet("color: black");\r
162}\r
163\r
164\r
a4e46c05
JPM
165//\r
166void AllWatchBrowserWindow::Reset(void)\r
167{\r
0203b5fd 168 free(PtrWatchInfo);\r
a4e46c05
JPM
169 NbWatch = 0;\r
170 PtrWatchInfo = NULL;\r
0203b5fd
JPM
171}\r
172\r
173\r
174//\r
175void AllWatchBrowserWindow::RefreshContents(void)\r
176{\r
2b91c435
JPM
177 char msg[100];\r
178#ifdef AW_LAYOUTTEXTS\r
0203b5fd 179 char string[1024];\r
2b91c435 180#endif\r
0203b5fd 181 QString WatchAll;\r
2b91c435
JPM
182 size_t Error = AW_NOERROR;\r
183 char *PtrValue;\r
7512bf05 184 //S_VariablesStruct* Var;\r
0203b5fd
JPM
185\r
186 if (isVisible())\r
187 {\r
188 if (!NbWatch)\r
189 {\r
2b91c435 190 // Pre-catch the information for each global variables\r
7512bf05 191 if (NbWatch = DBGManager_GetNbVariables(NULL))\r
0203b5fd 192 {\r
7512bf05 193 PtrWatchInfo = (void**)calloc(NbWatch, sizeof(S_VariablesStruct*));\r
8d705db0
JPM
194#ifndef AW_LAYOUTTEXTS\r
195#ifdef AW_SORTINGFILTER\r
196 TableView->setSortingEnabled(false);\r
197#endif\r
198 model->setRowCount(0);\r
199#endif\r
2b91c435 200 for (uint32_t i = AW_STARTNUMVARIABLE; i < NbWatch; i++)\r
0203b5fd 201 {\r
7512bf05 202 if ((PtrWatchInfo[i] = (void*)DBGManager_GetInfosVariable(NULL, i + 1)))\r
0203b5fd 203 {\r
7512bf05
JPM
204#ifdef AW_LAYOUTTEXTS\r
205 PtrWatchInfo[i].addr = DBGManager_GetGlobalVariableAdr(i + 1);\r
206 if (!strlen(PtrWatchInfo[i].PtrVariableBaseTypeName = DBGManager_GetGlobalVariableTypeName(i + 1)))\r
207 {\r
208 PtrWatchInfo[i].PtrVariableBaseTypeName = (char *)"<font color='#ff0000'>N/A</font>";\r
209 }\r
2b91c435 210#else\r
7512bf05 211 model->insertRow(i);\r
2b91c435 212#endif\r
7512bf05 213 }\r
0203b5fd
JPM
214 }\r
215 }\r
216 }\r
8d705db0 217\r
2b91c435 218 if (NbWatch)\r
0203b5fd 219 {\r
2b91c435 220 for (uint32_t i = AW_STARTNUMVARIABLE; i < NbWatch; i++)\r
0203b5fd 221 {\r
7512bf05 222 if (((S_VariablesStruct*)PtrWatchInfo[i])->TypeTag & (DBG_TAG_TYPE_array | DBG_TAG_TYPE_structure))\r
2b91c435
JPM
223 {\r
224#if defined(AW_SUPPORTARRAY) || defined(AW_SUPPORTSTRUCTURE)\r
225 //PtrValue = (char *)memcpy(Value, &jaguarMainRAM[PtrWatchInfo[i].addr], 20);\r
226 PtrValue = NULL;\r
227#else\r
228 PtrValue = NULL;\r
229#endif\r
230 }\r
231 else\r
232 {\r
7512bf05 233 PtrValue = DBGManager_GetVariableValueFromAdr(((S_VariablesStruct*)PtrWatchInfo[i])->Addr, ((S_VariablesStruct*)PtrWatchInfo[i])->TypeEncoding, ((S_VariablesStruct*)PtrWatchInfo[i])->TypeByteSize);\r
2b91c435
JPM
234 }\r
235#ifdef AW_LAYOUTTEXTS\r
236 if (i)\r
237 {\r
238 WatchAll += QString("<br>");\r
239 }\r
240 sprintf(string, "%i : %s | %s | 0x%06X | %s", (i + 1), PtrWatchInfo[i].PtrVariableBaseTypeName, PtrWatchInfo[i].PtrVariableName, (unsigned int)PtrWatchInfo[i].addr, PtrValue ? PtrValue : (char *)"<font color='#ff0000'>N/A</font>");\r
0203b5fd 241 WatchAll += QString(string);\r
2b91c435 242#else\r
7512bf05 243 model->setItem(i, 0, new QStandardItem(QString("%1").arg(((S_VariablesStruct*)PtrWatchInfo[i])->PtrName)));\r
2b91c435 244 model->setItem(i, 1, new QStandardItem(QString("%1").arg(PtrValue)));\r
7512bf05 245 model->setItem(i, 2, new QStandardItem(QString("%1").arg(((S_VariablesStruct*)PtrWatchInfo[i])->PtrTypeName)));\r
2b91c435 246#endif\r
0203b5fd 247 }\r
2b91c435
JPM
248#ifdef AW_LAYOUTTEXTS\r
249 text->clear();\r
250 text->setText(WatchAll);\r
4873fe0a 251#else\r
8d705db0 252#ifdef AW_SORTINGFILTER\r
4873fe0a 253 TableView->setSortingEnabled(true);\r
8d705db0 254#endif\r
2b91c435
JPM
255#endif\r
256 sprintf(msg, "Ready");\r
257 }\r
258 else\r
259 {\r
260 sprintf(msg, "No watches");\r
261 Error = AW_NOALLWATCH;\r
0203b5fd
JPM
262 }\r
263\r
2b91c435
JPM
264 // Display status bar\r
265 if (Error)\r
266 {\r
267 if ((Error & AW_WARNING))\r
268 {\r
269 statusbar->setStyleSheet("background-color: lightyellow; font: bold");\r
270 }\r
271 else\r
272 {\r
273 statusbar->setStyleSheet("background-color: tomato; font: bold");\r
274 }\r
275 }\r
276 else\r
277 {\r
278 statusbar->setStyleSheet("background-color: lightgreen; font: bold");\r
279 }\r
280 statusbar->showMessage(QString(msg));\r
0203b5fd
JPM
281 }\r
282}\r
283\r
284\r
03458eec 285// Handle keyboard event\r
0203b5fd
JPM
286void AllWatchBrowserWindow::keyPressEvent(QKeyEvent * e)\r
287{\r
03458eec 288 // ESC to close / hide the window\r
0203b5fd 289 if (e->key() == Qt::Key_Escape)\r
0203b5fd 290 {\r
a4e46c05 291 hide();\r
0203b5fd 292 }\r
03458eec
JPM
293 else\r
294 {\r
7512bf05 295 // search symbol\r
03458eec
JPM
296 if (e->key() == Qt::Key_Return)\r
297 {\r
298 SearchSymbol();\r
299 }\r
300 }\r
0203b5fd 301}\r
0203b5fd 302\r