HRESULT ParseNode ( IXmlReader * pReader, Node ** ppNode ) { HRESULT hr; XmlNodeType nodeType; Char * nodeName = nullptr; Attribute * attrList = nullptr; Node * childList = nullptr; Node * childLast = nullptr; const WCHAR * tmpString; #define APPEND_CHILD(childNode) \ if (childLast == nullptr) \ { \ childList = childLast = childNode; \ } \ else \ { \ childLast->Next = childNode; \ childLast = childNode; \ } // This call won't fail we make sure the reader is positioned at a valid // node before ParseNode() is called. pReader->GetNodeType(&nodeType); do { switch (nodeType) { case XmlNodeType_Element: { bool inOpenElement = nodeName != nullptr; if (inOpenElement) { Node * childNode; hr = ParseNode(pReader, &childNode); if (hr == S_OK) { APPEND_CHILD(childNode); } else { return hr; } } else { pReader->GetLocalName(&tmpString, nullptr); nodeName = ConvertWCHAR(tmpString); hr = ParseAttributes(pReader, &attrList); if (FAILED(hr)) { *ppNode = nullptr; return hr; } *ppNode = new Node(nodeName, attrList); if (pReader->IsEmptyElement()) { return S_OK; } } break; } case XmlNodeType_EndElement: { Node * node = *ppNode; // If we have a single child with data called "#text", then pull the data up to this node. if (childList != nullptr && childList == childLast && (childList->Data != nullptr) && (_stricmp(childList->Name, "#text") == 0)) { node->Data = childList->Data; node->ChildList = nullptr; } else { node->ChildList = childList; } return S_OK; } case XmlNodeType_Attribute: // Need to manually move to attributes when at an element node. break; case XmlNodeType_CDATA: case XmlNodeType_Text: { pReader->GetValue(&tmpString, nullptr); Node * node = new Node("#text", nullptr); node->Data = ConvertWCHAR(tmpString); APPEND_CHILD(node); break; } case XmlNodeType_Comment: case XmlNodeType_DocumentType: case XmlNodeType_None: case XmlNodeType_ProcessingInstruction: case XmlNodeType_Whitespace: case XmlNodeType_XmlDeclaration: // Ignored. break; } } while (S_OK == (hr = pReader->Read(&nodeType))); return hr; #undef APPEND_CHILD }
// refresh using projectPath void ProjectView::refresh() { m_model->clear(); QStringList header; header << tr("Content of %1").arg(m_projName) << tr("Note"); m_model->setHorizontalHeaderLabels(header); APPEND_ROW(m_model, tr("Datasets") ); APPEND_ROW(m_model, tr("Data Displays")); APPEND_ROW(m_model, tr("Verilog") ); APPEND_ROW(m_model, tr("Verilog-A") ); APPEND_ROW(m_model, tr("VHDL") ); APPEND_ROW(m_model, tr("Octave") ); APPEND_ROW(m_model, tr("Schematics") ); APPEND_ROW(m_model, tr("Others") ); setExpanded(m_model->index(6, 0), true); if (!m_valid) { return; } // put all files into "Content"-ListView QDir workPath(m_projPath); QStringList files = workPath.entryList("*", QDir::Files, QDir::Name); QStringList::iterator it; QString extName, fileName; QList<QStandardItem *> columnData; #define APPEND_CHILD(category, data) \ m_model->item(category, 0)->appendRow(data); for(it = files.begin(); it != files.end(); ++it) { fileName = (*it).toAscii(); extName = QFileInfo(workPath.filePath(fileName)).suffix(); columnData.clear(); columnData.append(new QStandardItem(fileName)); if(extName == "dat") { APPEND_CHILD(0, columnData); } else if(extName == "dpl") { APPEND_CHILD(1, columnData); } else if(extName == "v") { APPEND_CHILD(2, columnData); } else if(extName == "va") { APPEND_CHILD(3, columnData); } else if((extName == "vhdl") || (extName == "vhd")) { APPEND_CHILD(4, columnData); } else if((extName == "m") || (extName == "oct")) { APPEND_CHILD(5, columnData); } else if(extName == "sch") { int n = Schematic::testFile(workPath.filePath(fileName)); if(n >= 0) { if(n > 0) { columnData.append(new QStandardItem(QString::number(n)+tr("-port"))); } } APPEND_CHILD(6, columnData); } else { APPEND_CHILD(7, columnData); } } resizeColumnToContents(0); }