void Skein::Import(const char* path) { Node* node = m_inst.root; bool added = false; CStdioFile recFile; if (recFile.Open(path,CFile::modeRead|CFile::typeText)) { CString recLine; while (recFile.ReadString(recLine)) { recLine.Trim(); if (recLine.GetLength() > 0) { CStringW recLineW = EscapeLine(CStringW(recLine),UsePrintable); Node* newNode = node->Find(recLineW); if (newNode == NULL) { newNode = new Node(recLineW,L"",L"",L"",false); node->Add(newNode); added = true; } node = newNode; } } if (added) { m_layout = false; NotifyChange(TreeChanged); NotifyEdit(true); } } }
Skein::Node* Skein::AddNewParent(Node* node) { Node* newNode = new Node(L"",L"",L"",L"",false); node->GetParent()->Replace(node,newNode); newNode->Add(node); m_layout = false; NotifyChange(TreeChanged); NotifyEdit(true); return newNode; }
void Skein::Load(const char* path) { if (m_inst.skeinFile.IsEmpty()) { Reset(); return; } CString fileName; fileName.Format("%s\\%s",path,m_inst.skeinFile); // Create an XML document instance CComPtr<IXMLDOMDocument> doc; if (FAILED(doc.CoCreateInstance(CLSID_DOMDocument))) { Reset(); return; } // Load the skein XML into the document VARIANT_BOOL success = 0; if (doc->load(CComVariant(fileName),&success) != S_OK) { CComPtr<IXMLDOMParseError> error; doc->get_parseError(&error); long line = 0; error->get_line(&line); CComBSTR text; error->get_srcText(&text); CComBSTR reason; error->get_reason(&reason); TRACE("Failed to load skein XML\n line: %d\n text: %S\n reason: %S\n", line,text.m_str,reason.m_str); Reset(); return; } // Get all the item nodes CComPtr<IXMLDOMNodeList> items; doc->selectNodes(L"/Skein/item",&items); // Create a node object for each XML item node std::map<CStringW,Node*> nodes; CComPtr<IXMLDOMNode> item; while (items->nextNode(&item) == S_OK) { CStringW id = StringFromXML(item,L"@nodeId"); CStringW command = StringFromXML(item,L"command"); CStringW label = StringFromXML(item,L"annotation"); CStringW result = StringFromXML(item,L"result"); CStringW commentary = StringFromXML(item,L"commentary"); bool played = BoolFromXML(item,L"played/text()",false); bool changed = BoolFromXML(item,L"changed/text()",false); bool temp = BoolFromXML(item,L"temporary/text()",true); int score = IntFromXML(item,L"temporary/@score"); nodes[id] = new Node(command,label,result,commentary,changed); item = NULL; } // Loop through the XML item nodes again, setting up the parent-child links items->reset(); while (items->nextNode(&item) == S_OK) { Node* parentNode = nodes[StringFromXML(item,L"@nodeId").m_str]; CComPtr<IXMLDOMNodeList> children; item->selectNodes(L"children/child",&children); CComPtr<IXMLDOMNode> child; while (children->nextNode(&child) == S_OK) { Node* childNode = nodes[StringFromXML(child,L"@nodeId").m_str]; parentNode->Add(childNode); child = NULL; } item = NULL; } // Get the root and current nodes CStringW root = StringFromXML(doc,L"/Skein/@rootNode"); CStringW current = StringFromXML(doc,L"/Skein/activeNode/@nodeId"); // Discard the current skein and replace with the new delete m_inst.root; m_inst.root = nodes[root]; m_inst.current = nodes[current]; if (m_inst.current == NULL) m_inst.current = m_inst.root; m_played = m_inst.root; m_layout = false; NotifyChange(TreeChanged); NotifyEdit(false); }