MathCell* GroupCell::Copy() { GroupCell* tmp = new GroupCell(m_groupType); tmp->Hide(m_hide); CopyData(this, tmp); if (m_input) tmp->SetInput(m_input->CopyList()); if (m_output != NULL) tmp->SetOutput(m_output->CopyList()); return tmp; }
MathCell* GroupCell::Copy(bool all) { GroupCell* tmp = new GroupCell(m_groupType); tmp->Hide(m_hide); CopyData(this, tmp); if (m_input) tmp->SetInput(m_input->Copy(true)); if (m_output != NULL) tmp->SetOutput(m_output->Copy(true)); if (all && m_next != NULL) tmp->AppendCell(m_next->Copy(all)); return tmp; }
// ParseCellTag // This function is responsible for creating // a tree of groupcells when loading XML document. // Any changes in GroupCell structure or methods // has to be reflected here in order to ensure proper // loading of WXMX files. MathCell* MathParser::ParseCellTag(wxXmlNode* node) { GroupCell *group = NULL; // read hide status #if wxCHECK_VERSION(2,9,0) bool hide = (node->GetAttribute(wxT("hide"), wxT("false")) == wxT("true")) ? true : false; #else bool hide = (node->GetPropVal(wxT("hide"), wxT("false")) == wxT("true")) ? true : false; #endif // read (group)cell type #if wxCHECK_VERSION(2,9,0) wxString type = node->GetAttribute(wxT("type"), wxT("text")); #else wxString type = node->GetPropVal(wxT("type"), wxT("text")); #endif if (type == wxT("code")) { group = new GroupCell(GC_TYPE_CODE); wxXmlNode *children = node->GetChildren(); while (children) { if (children->GetName() == wxT("input")) { MathCell *editor = ParseTag(children->GetChildren()); group->SetEditableContent(editor->GetValue()); delete editor; } if (children->GetName() == wxT("output")) group->AppendOutput(ParseTag(children->GetChildren())); children = children->GetNext(); } } else if (type == wxT("image")) { group = new GroupCell(GC_TYPE_IMAGE); wxXmlNode *children = node->GetChildren(); while (children) { if (children->GetName() == wxT("editor")) { MathCell *ed = ParseEditorTag(children); group->SetEditableContent(ed->GetValue()); delete ed; } else group->AppendOutput(ParseTag(children)); children = children->GetNext(); } } else if (type == wxT("pagebreak")) { group = new GroupCell(GC_TYPE_PAGEBREAK); } else if (type == wxT("text")) { group = new GroupCell(GC_TYPE_TEXT); MathCell *editor = ParseTag(node->GetChildren()); group->SetEditableContent(editor->GetValue()); delete editor; } else { // text types if (type == wxT("title")) group = new GroupCell(GC_TYPE_TITLE); else if (type == wxT("section")) group = new GroupCell(GC_TYPE_SECTION); else if (type == wxT("subsection")) group = new GroupCell(GC_TYPE_SUBSECTION); else return NULL; wxXmlNode *children = node->GetChildren(); while (children) { if (children->GetName() == wxT("editor")) { MathCell *ed = ParseEditorTag(children); group->SetEditableContent(ed->GetValue()); delete ed; } else if (children->GetName() == wxT("fold")) { // we have folded groupcells wxXmlNode *xmlcells = children->GetChildren(); MathCell *tree = NULL; MathCell *last = NULL; if (xmlcells) { last = tree = ParseTag(xmlcells, false); // first cell while (xmlcells->GetNext()) { xmlcells = xmlcells->GetNext(); MathCell *cell = ParseTag(xmlcells, false); last->m_next = last->m_nextToDraw = cell; last->m_next->m_previous = last->m_next->m_previousToDraw = last; last = last->m_next; } if (tree) group->HideTree((GroupCell *)tree); } } children = children->GetNext(); } } group->SetParent(group, false); group->Hide(hide); return group; }