/*---------------------------------------------------------------------*//** 兄弟ノード取得 **//*---------------------------------------------------------------------*/ MenuTreeNode* Menu::getMenuTreeNodeSibling(MenuTreeNode* mtnode) const { for(TreeIterator<MenuTreeNode> it = _tree->iterator(); it.has(); it.next()) { if(it.object() == mtnode) { TreeNode<MenuTreeNode>* tnodeSibling = it.node()->sibling(); return (tnodeSibling != 0L) ? tnodeSibling->object() : 0L; } } return 0L; }
/*---------------------------------------------------------------------*//** 子ノード取得 **//*---------------------------------------------------------------------*/ MenuTreeNode* Menu::getMenuTreeNodeChild(MenuTreeNode* mtnode) const { for(TreeIterator<MenuTreeNode> it = _tree->iterator(); it.has(); it.next()) { if(it.object() == mtnode) { TreeNode<MenuTreeNode>* tnodeChild = it.node()->child(); return (tnodeChild != 0L) ? tnodeChild->object() : 0L; } } return 0L; }
bool Menu::createFromXml(FileBase* fileXml, MenuFuncTable* functblRef, MenuPanelFactory* pnlfctryRef, void* objCreateParam) { // XML ファイルをバッファに読み込む VcString bufFile; while(true) { const int SIZE_BUF = 100 * 1024; char buf[SIZE_BUF]; int sizeRead = fileXml->read(buf, SIZE_BUF); bufFile.add(buf, sizeRead); if(sizeRead < SIZE_BUF) { break; } } CMXML_TRACE(VcString::format("{Menu::createFromXml} menu xml : size=%d\n", bufFile.getLength())); // XML を解析する XmlParser xmlparser; xmlparser.parseXmlDocument(&bufFile); CMXML_TRACE("{Menu::createFromXml} XmlParser::parseXmlDocument end.\n"); // ツリーを作成する _tree = new Tree<MenuTreeNode>(true); addTreeNode(_tree->addRootNode(), true, xmlparser.getRootNode()); #if defined(_DEBUG) TRACE("{Menu::createFromXml} menu hierarchy\n"); for(TreeIterator<MenuTreeNode> it = _tree->iterator(); it.has(); it.next()) { if(it.object() != 0L) { for(int i = 0; i < it.getDepth(); i++) { CMXML_TRACE(" "); } CMXML_TRACE( *it.object()->getName() + "\n" ); } } #endif // ファンクションテーブルを保存する _functblRef = functblRef; // パネルファクトリを保存する _pnlfctryRef = pnlfctryRef; // パラメータオブジェクトを保存する _objCreateParamRef = objCreateParam; return true; }
/*---------------------------------------------------------------------*//** 破棄 **//*---------------------------------------------------------------------*/ void Menu::destroy() { if(_isShow) { closeMenu(); } // ツリー削除 if(_tree != 0L) { for(TreeIterator<MenuTreeNode> it = _tree->iterator(); it.has(); it.next()) { MenuTreeNode* mtnode = it.object(); if(mtnode != 0L) // ルートは NULL { mtnode->destroy(); } } delete _tree; _tree = 0L; } }