bool FunctionParsersManager::getFuncListFromXmlTree() { if (!_pXmlFuncListDoc) return false; TiXmlNode *root = _pXmlFuncListDoc->FirstChild(TEXT("NotepadPlus")); if (!root) return false; root = root->FirstChild(TEXT("functionList")); if (!root) return false; TiXmlNode *parserRoot = root->FirstChild(TEXT("parsers")); if (!parserRoot) return false; for (TiXmlNode *childNode = parserRoot->FirstChildElement(TEXT("parser")); childNode; childNode = childNode->NextSibling(TEXT("parser")) ) { const TCHAR *id = (childNode->ToElement())->Attribute(TEXT("id")); if (!id || !id[0]) continue; std::vector<generic_string> classNameExprArray; std::vector<generic_string> functionNameExprArray; const TCHAR *displayName = (childNode->ToElement())->Attribute(TEXT("displayName")); if (!displayName || !displayName[0]) displayName = id; TiXmlNode *classRangeParser = childNode->FirstChild(TEXT("classRange")); TiXmlNode *functionParser = childNode->FirstChild(TEXT("function")); if (classRangeParser && functionParser) { generic_string commentExpr, mainExpr, openSymbole, closeSymbole, functionExpr; getZonePaserParameters(classRangeParser, commentExpr, mainExpr, openSymbole, closeSymbole, classNameExprArray, functionExpr, functionNameExprArray); generic_string commentExpr2, mainExpr2; std::vector<generic_string> classNameExprArray2; std::vector<generic_string> functionNameExprArray2; getUnitPaserParameters(functionParser, commentExpr2, mainExpr2, functionNameExprArray2, classNameExprArray2); FunctionUnitParser *funcUnitPaser = new FunctionUnitParser(id, displayName, commentExpr2.c_str(), mainExpr2.c_str(), functionNameExprArray2, classNameExprArray2); _parsers.push_back(new FunctionMixParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), openSymbole.c_str(), closeSymbole.c_str(), classNameExprArray, functionExpr.c_str(), functionNameExprArray, funcUnitPaser)); } else if (classRangeParser) { generic_string commentExpr, mainExpr, openSymbole, closeSymbole, functionExpr; getZonePaserParameters(classRangeParser, commentExpr, mainExpr, openSymbole, closeSymbole, classNameExprArray, functionExpr, functionNameExprArray); _parsers.push_back(new FunctionZoneParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), openSymbole.c_str(), closeSymbole.c_str(), classNameExprArray, functionExpr.c_str(), functionNameExprArray)); } else if (functionParser) { generic_string commentExpr, mainExpr; getUnitPaserParameters(functionParser, commentExpr, mainExpr, functionNameExprArray, classNameExprArray); _parsers.push_back(new FunctionUnitParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), functionNameExprArray, classNameExprArray)); } } TiXmlNode *associationMapRoot = root->FirstChild(TEXT("associationMap")); if (associationMapRoot) { for (TiXmlNode *childNode = associationMapRoot->FirstChildElement(TEXT("association")); childNode; childNode = childNode->NextSibling(TEXT("association")) ) { int langID; const TCHAR *langIDStr = (childNode->ToElement())->Attribute(TEXT("langID"), &langID); const TCHAR *exts = (childNode->ToElement())->Attribute(TEXT("ext")); const TCHAR *id = (childNode->ToElement())->Attribute(TEXT("id")); if ((langIDStr || (exts && exts[0])) && (id && id[0])) { for (size_t i = 0; i < _parsers.size(); i++) { if (_parsers[i]->_id == id) { _associationMap.push_back(AssociationInfo(i, langID, exts?exts:TEXT(""))); break; } } } } } return (_parsers.size() != 0); }
void FunctionListPanel::reload() { // clean up TreeStateNode currentTree; bool isOK = _treeView.retrieveFoldingStateTo(currentTree, _treeView.getRoot()); if (isOK) { TCHAR text2Search[MAX_PATH]; ::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, (LPARAM)text2Search); bool isSorted = shouldSort(); addInStateArray(currentTree, text2Search, isSorted); } removeAllEntries(); ::SendMessage(_hSearchEdit, WM_SETTEXT, 0, (LPARAM)TEXT("")); setSort(false); vector<foundInfo> fi; const TCHAR *fn = ((*_ppEditView)->getCurrentBuffer())->getFileName(); LangType langID = ((*_ppEditView)->getCurrentBuffer())->getLangType(); const TCHAR *udln = NULL; if (langID == L_USER) { udln = ((*_ppEditView)->getCurrentBuffer())->getUserDefineLangName(); } TCHAR *ext = ::PathFindExtension(fn); if (_funcParserMgr.parse(fi, AssociationInfo(-1, langID, ext, udln))) { _treeView.addItem(fn, NULL, INDEX_ROOT, TEXT("-1")); } for (size_t i = 0, len = fi.size(); i < len; ++i) { // no 2 level bool b = false; if (b) { generic_string entryName = TEXT(""); if (fi[i]._pos2 != -1) { entryName = fi[i]._data2; entryName += TEXT("=>"); } entryName += fi[i]._data; addEntry(NULL, entryName.c_str(), fi[i]._pos); } else { addEntry(fi[i]._data2.c_str(), fi[i]._data.c_str(), fi[i]._pos); } } HTREEITEM root = _treeView.getRoot(); const TCHAR *fullFilePath = ((*_ppEditView)->getCurrentBuffer())->getFullPathName(); if (root) { _treeView.setItemParam(root, fullFilePath); TreeParams *previousParams = getFromStateArray(fullFilePath); if (!previousParams) { ::SendMessage(_hSearchEdit, WM_SETTEXT, 0, (LPARAM)TEXT("")); setSort(false); _treeView.expand(root); } else { ::SendMessage(_hSearchEdit, WM_SETTEXT, 0, (LPARAM)(previousParams->_searchParameters)._text2Find.c_str()); _treeView.restoreFoldingStateFrom(previousParams->_treeState, root); bool isSort = (previousParams->_searchParameters)._doSort; setSort(isSort); if (isSort) _pTreeView->sort(_pTreeView->getRoot()); } } // invalidate the editor rect ::InvalidateRect(_hSearchEdit, NULL, TRUE); }