Esempio n. 1
0
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);
    }
  }
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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);
}