void GroupCell::AppendOutput(MathCell *cell) { if (m_output == NULL) { m_output = cell; if (m_groupType == GC_TYPE_CODE && m_input->m_next != NULL) ((EditorCell *)(m_input->m_next))->ContainsChanges(false); m_lastInOutput = m_output; while (m_lastInOutput->m_next != NULL) m_lastInOutput = m_lastInOutput->m_next; } else { MathCell *tmp = m_lastInOutput; if (tmp == NULL) tmp = m_output; while (tmp->m_next != NULL) tmp = tmp->m_next; tmp->AppendCell(cell); while (m_lastInOutput->m_next != NULL) m_lastInOutput = m_lastInOutput->m_next; } if (m_appendedCells == NULL) m_appendedCells = cell; }
MathCell *MathCell::CopyList() { MathCell *dest = Copy(); MathCell *src = this->m_next; MathCell *ret = dest; while(src != NULL) { dest->AppendCell(src->Copy()); src = src->m_next; dest = dest->m_next; } return ret; }
MathCell* MathParser::ParseTag(wxXmlNode* node, bool all) { // wxYield(); MathCell* tmp = NULL; MathCell* cell = NULL; bool warning = all; wxString altCopy; while (node) { // Parse tags if (node->GetType() == wxXML_ELEMENT_NODE) { wxString tagName(node->GetName()); if (tagName == wxT("v")) { // Variables (atoms) if (cell == NULL) cell = ParseText(node->GetChildren(), TS_VARIABLE); else cell->AppendCell(ParseText(node->GetChildren(), TS_VARIABLE)); } else if (tagName == wxT("t")) { // Other text if (cell == NULL) cell = ParseText(node->GetChildren(), TS_DEFAULT); else cell->AppendCell(ParseText(node->GetChildren(), TS_DEFAULT)); } else if (tagName == wxT("n")) { // Numbers if (cell == NULL) cell = ParseText(node->GetChildren(), TS_NUMBER); else cell->AppendCell(ParseText(node->GetChildren(), TS_NUMBER)); } else if (tagName == wxT("h")) { // Hidden cells (*) MathCell* tmp = ParseText(node->GetChildren()); tmp->m_isHidden = true; if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("p")) { // Parenthesis if (cell == NULL) cell = ParseParenTag(node); else cell->AppendCell(ParseParenTag(node)); } else if (tagName == wxT("f")) { // Fractions if (cell == NULL) cell = ParseFracTag(node); else cell->AppendCell(ParseFracTag(node)); } else if (tagName == wxT("e")) { // Exponentials if (cell == NULL) cell = ParseSupTag(node); else cell->AppendCell(ParseSupTag(node)); } else if (tagName == wxT("i")) { // Subscripts if (cell == NULL) cell = ParseSubTag(node); else cell->AppendCell(ParseSubTag(node)); } else if (tagName == wxT("fn")) { // Functions if (cell == NULL) cell = ParseFunTag(node); else cell->AppendCell(ParseFunTag(node)); } else if (tagName == wxT("g")) { // Greek constants MathCell* tmp = ParseText(node->GetChildren(), TS_GREEK_CONSTANT); if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("s")) { // Special constants %e,... MathCell* tmp = ParseText(node->GetChildren(), TS_SPECIAL_CONSTANT); if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("fnm")) { // Function names MathCell* tmp = ParseText(node->GetChildren(), TS_FUNCTION); if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("q")) { // Square roots if (cell == NULL) cell = ParseSqrtTag(node); else cell->AppendCell(ParseSqrtTag(node)); } else if (tagName == wxT("d")) { // Differentials if (cell == NULL) cell = ParseDiffTag(node); else cell->AppendCell(ParseDiffTag(node)); } else if (tagName == wxT("sm")) { // Sums if (cell == NULL) cell = ParseSumTag(node); else cell->AppendCell(ParseSumTag(node)); } else if (tagName == wxT("in")) { // integrals if (cell == NULL) cell = ParseIntTag(node); else cell->AppendCell(ParseIntTag(node)); } else if (tagName == wxT("mspace")) { if (cell == NULL) cell = new TextCell(wxT(" ")); else cell->AppendCell(new TextCell(wxT(" "))); } else if (tagName == wxT("at")) { if (cell == NULL) cell = ParseAtTag(node); else cell->AppendCell(ParseAtTag(node)); } else if (tagName == wxT("a")) { if (cell == NULL) cell = ParseAbsTag(node); else cell->AppendCell(ParseAbsTag(node)); } else if (tagName == wxT("ie")) { if (cell == NULL) cell = ParseSubSupTag(node); else cell->AppendCell(ParseSubSupTag(node)); } else if (tagName == wxT("lm")) { if (cell == NULL) cell = ParseLimitTag(node); else cell->AppendCell(ParseLimitTag(node)); } else if (tagName == wxT("r")) { if (cell == NULL) cell = ParseTag(node->GetChildren()); else cell->AppendCell(ParseTag(node->GetChildren())); } else if (tagName == wxT("tb")) { if (cell == NULL) cell = ParseTableTag(node); else cell->AppendCell(ParseTableTag(node)); } else if ((tagName == wxT("mth")) || (tagName == wxT("line"))) { MathCell *tmp = ParseTag(node->GetChildren()); if (tmp != NULL) tmp->ForceBreakLine(true); else tmp = new TextCell(wxT(" ")); if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("lbl")) { MathCell* tmp = ParseText(node->GetChildren(), TS_LABEL); tmp->ForceBreakLine(true); if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("st")) { MathCell* tmp = ParseText(node->GetChildren(), TS_STRING); if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("hl")) { bool highlight = m_highlight; m_highlight = true; MathCell* tmp = ParseTag(node->GetChildren()); m_highlight = highlight; if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("img")) { wxString filename(node->GetChildren()->GetContent()); #if !wxUSE_UNICODE wxString filename1(filename.wc_str(wxConvUTF8), *wxConvCurrent); filename = filename1; #endif ImgCell *tmp; if (m_fileSystem) // loading from zip tmp = new ImgCell(filename, false, m_fileSystem); #if wxCHECK_VERSION(2,9,0) else if (node->GetAttribute(wxT("del"), wxT("yes")) != wxT("no")) #else else if (node->GetPropVal(wxT("del"), wxT("yes")) != wxT("no")) #endif tmp = new ImgCell(filename, true, NULL); else tmp = new ImgCell(filename, false, NULL); #if wxCHECK_VERSION(2,9,0) if (node->GetAttribute(wxT("rect"), wxT("true")) == wxT("false")) tmp->DrawRectangle(false); #else if (node->GetPropVal(wxT("rect"), wxT("true")) == wxT("false")) tmp->DrawRectangle(false); #endif if (cell == NULL) cell = tmp; else cell->AppendCell(tmp); } else if (tagName == wxT("slide"))