Added a source code files list viewer
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / FilesrcListWin.cpp
diff --git a/src/debugger/FilesrcListWin.cpp b/src/debugger/FilesrcListWin.cpp
new file mode 100644 (file)
index 0000000..8554c0f
--- /dev/null
@@ -0,0 +1,180 @@
+//
+// FilesrcListWin.cpp - List all source code filenames
+//
+// by Jean-Paul Mari
+//
+// JPM = Jean-Paul Mari <djipi.mari@gmail.com>
+//
+// Who  When        What
+// ---  ----------  -----------------------------------------------------------
+// JPM  09/23/2018  Created this file
+//
+
+// STILL TO DO:
+// Remove the 1st information, named '1', at the top
+// To allow source code file opening / viewing
+//
+
+#include "debugger/FilesrcListWin.h"
+//#include "memory.h"
+#include "debugger/DBGManager.h"
+
+
+//
+FilesrcListWindow::FilesrcListWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),
+layout(new QVBoxLayout),
+treeView(new QTreeView),
+standardModel(new QStandardItemModel),
+rootNode(new QStandardItem),
+filesrcItems(NULL),
+statusbar(new QStatusBar),
+nbItem(0)
+{
+       // Setup root
+       rootNode = standardModel->invisibleRootItem();
+       //register the model
+       treeView->setModel(standardModel);
+       treeView->expandAll();
+       layout->addWidget(treeView);
+
+       // Status bar
+       layout->addWidget(statusbar);
+       setLayout(layout);
+}
+
+
+//
+FilesrcListWindow::~FilesrcListWindow(void)
+{
+}
+
+
+//
+void FilesrcListWindow::Reset(void)
+{
+       standardModel->setRowCount(0);
+       free(filesrcItems);
+       filesrcItems = NULL;
+       nbItem = 0;
+}
+
+
+//
+void FilesrcListWindow::RefreshContents(void)
+{
+       size_t Error, Nbr;
+       char msg[1024];
+
+       if (!filesrcItems)
+       {
+               if ((Nbr = UpdateInfos()))
+               {
+                       sprintf(msg, "%i files found", Nbr);
+                       Error = FSL_NOERROR;
+               }
+               else
+               {
+                       sprintf(msg, "No files found");
+                       Error = FSL_NOFILESRCLIST;
+               }
+
+               // Display status bar
+               if (Error)
+               {
+                       if ((Error & FSL_WARNING))
+                       {
+                               statusbar->setStyleSheet("background-color: lightyellow; font: bold");
+                       }
+                       else
+                       {
+                               statusbar->setStyleSheet("background-color: tomato; font: bold");
+                       }
+               }
+               else
+               {
+                       statusbar->setStyleSheet("background-color: lightgreen; font: bold");
+               }
+               statusbar->showMessage(QString(msg));
+       }
+}
+
+
+//
+size_t FilesrcListWindow::UpdateInfos(void)
+{
+       size_t Nbr, i;
+
+       Nbr = DBGManager_GetNbFullSourceFilename();
+
+       for (i = 0; i < Nbr; i++)
+       {
+               AddFilename(DBGManager_GetNumFullSourceFilename(i), rootNode, 0);
+       }
+
+       return Nbr;
+}
+
+
+// Add source code filename in the list
+void FilesrcListWindow::AddFilename(char *FileName, QStandardItem *root, size_t ItemPos)
+{
+       char *Ptr = FileName;
+       Sfilesrcitem *PtrNewFilesrc;
+       char Buffer[255];
+       char a;
+
+#ifdef _MSC_VER
+       while ((a = *Ptr++) && (a != '\\'));
+#else
+       while ((a = *Ptr++) && (a != '/'));
+#endif
+       if (a)
+       {
+               strncpy(Buffer, FileName, (Ptr - FileName - 1));
+               Buffer[(Ptr - FileName - 1)] = 0;
+       }
+       else
+       {
+               strcpy(Buffer, FileName);
+       }
+       PtrNewFilesrc = (Sfilesrcitem *)AddItem(Buffer, ItemPos);
+       if (!PtrNewFilesrc->PreviousItem)
+       {
+               PtrNewFilesrc->PreviousItem = root;
+               root->appendRow(PtrNewFilesrc->Item);
+               PtrNewFilesrc->Item->setEditable(false);
+       }
+
+       if (a)
+       {
+               return (AddFilename(Ptr, PtrNewFilesrc->Item, (ItemPos + 1)));
+       }
+}
+
+
+// Add item to the list
+// Return void * on new item or already existing one
+void *FilesrcListWindow::AddItem(char *ItemName, size_t ItemPos)
+{
+       Sfilesrcitem *Ptr = filesrcItems;
+
+       // Look for already existing item
+       for (size_t i = 0; i < nbItem; i++)
+       {
+               if ((Ptr->column == ItemPos) && !strcmp(Ptr->Item->text().toLocal8Bit().constData(), ItemName))
+               {
+                       return Ptr;
+               }
+               else
+               {
+                       Ptr++;
+               }
+       }
+
+       // Add item in the list
+       filesrcItems = (Sfilesrcitem *)realloc(filesrcItems, (sizeof(Sfilesrcitem) * ++nbItem));
+       (filesrcItems + (nbItem - 1))->column = ItemPos;
+       (filesrcItems + (nbItem - 1))->PreviousItem = NULL;
+       (filesrcItems + (nbItem - 1))->Item = new QStandardItem(ItemName);
+       return (filesrcItems + (nbItem - 1));
+}