void IE_Imp_WordPerfect::openTable(const librevenge::RVNGPropertyList &propList) { if (m_bHdrFtrOpenCount) return; // HACK // TODO: handle 'marginLeftOffset' and 'marginRightOffset' UT_DEBUGMSG(("AbiWordPerfect: openTable\n")); UT_String propBuffer; if (propList["table:align"]) { // no need to support left: default behaviour //if (strcmp(propList["table:align"]->getStr().cstr(), "right")) // abiword does not support this I think //if (strcmp(propList["table:align"]->getStr().cstr(), "center")) // abiword does not support this I think //if (strcmp(propList["table:align"]->getStr().cstr(), "margins")) // abiword does not support this I think if (strcmp(propList["table:align"]->getStr().cstr(), "margins")) { if (propList["fo:margin-left"]) UT_String_sprintf(propBuffer, "table-column-leftpos:%s; ", propList["fo:margin-left"]->getStr().cstr()); } } const librevenge::RVNGPropertyListVector *columns = propList.child("librevenge:table-columns"); if (columns) { propBuffer += "table-column-props:"; librevenge::RVNGPropertyListVector::Iter i(*columns); for (i.rewind(); i.next();) { UT_String tmpBuffer; if (i()["style:column-width"]) UT_String_sprintf(tmpBuffer, "%s/", i()["style:column-width"]->getStr().cstr()); propBuffer += tmpBuffer; } } const PP_PropertyVector propsArray = { "props", propBuffer.c_str() }; X_CheckDocumentError(appendStrux(PTX_SectionTable, propsArray)); }
void IE_Imp_WordPerfect::openSection(const librevenge::RVNGPropertyList &propList) { if (m_bHdrFtrOpenCount) return; // HACK UT_DEBUGMSG(("AbiWordPerfect: openSection\n")); float marginLeft = 0.0f, marginRight = 0.0f; const librevenge::RVNGPropertyListVector *columns = propList.child("style:columns"); int columnsCount = ((!columns || !columns->count()) ? 1 : columns->count()); // TODO: support spaceAfter if (propList["fo:start-indent"]) marginLeft = propList["fo:start-indent"]->getDouble(); if (propList["fo:end-indent"]) marginRight = propList["fo:end-indent"]->getDouble(); if (marginLeft != m_leftSectionMargin || marginRight != m_rightSectionMargin || m_sectionColumnsCount != columnsCount) m_bSectionChanged = true; m_leftSectionMargin = marginLeft; m_rightSectionMargin = marginRight; m_sectionColumnsCount = columnsCount; _appendSection(columnsCount, m_leftPageMargin + m_leftSectionMargin, m_rightPageMargin + m_rightSectionMargin); }
void IE_Imp_WordPerfect::openParagraph(const librevenge::RVNGPropertyList &propList) { if (m_bHdrFtrOpenCount) return; // HACK UT_DEBUGMSG(("AbiWordPerfect: openParagraph()\n")); // for now, we always append these options float marginTop = 0.0f, marginBottom = 0.0f; float marginLeft = 0.0f, marginRight = 0.0f, textIndent = 0.0f; if (propList["fo:margin-top"]) marginTop = propList["fo:margin-top"]->getDouble(); if (propList["fo:margin-bottom"]) marginBottom = propList["fo:margin-bottom"]->getDouble(); if (propList["fo:margin-left"]) marginLeft = propList["fo:margin-left"]->getDouble(); if (propList["fo:margin-right"]) marginRight = propList["fo:margin-right"]->getDouble(); if (propList["fo:text-indent"]) textIndent = propList["fo:text-indent"]->getDouble(); m_topMargin = marginTop; m_bottomMargin = marginBottom; m_leftMarginOffset = marginLeft; m_rightMarginOffset = marginRight; m_textIndent = textIndent; UT_String propBuffer; propBuffer += "text-align:"; if (propList["fo:text-align"]) { // AbiWord follows xsl:fo, except here, for some reason.. if (propList["fo:text-align"]->getStr() == "end") propBuffer += "right"; else propBuffer += propList["fo:text-align"]->getStr().cstr(); } else propBuffer += "left"; float lineSpacing = 1.0f; if (propList["fo:line-height"]) lineSpacing = propList["fo:line-height"]->getDouble(); UT_String tmpBuffer; UT_String_sprintf(tmpBuffer, "; margin-top:%dpt; margin-bottom:%dpt; margin-left:%.4fin; margin-right:%.4fin; text-indent:%.4fin; line-height:%.4f", (int)(m_topMargin*72), (int)(m_bottomMargin*72), m_leftMarginOffset, m_rightMarginOffset, m_textIndent, lineSpacing); propBuffer += tmpBuffer; const librevenge::RVNGPropertyListVector *tabStops = propList.child("style:tab-stops"); if (tabStops && tabStops->count()) // Append the tabstop information { propBuffer += "; tabstops:"; tmpBuffer = ""; librevenge::RVNGPropertyListVector::Iter i(*tabStops); for (i.rewind(); i.next();) { propBuffer += tmpBuffer; if (i()["style:position"]) { UT_String_sprintf(tmpBuffer, "%.4fin", i()["style:position"]->getDouble()); propBuffer += tmpBuffer; } if (i()["style:type"]) if (i()["style:type"]->getStr() == "right") propBuffer += "/R"; else if (i()["style:type"]->getStr() == "center") propBuffer += "/C"; else if (i()["style:type"]->getStr() == "char") propBuffer += "/D"; else propBuffer += "/L"; else // Left aligned is default propBuffer += "/L"; if (i()["style:leader-text"]) if (i()["style:leader-text"]->getStr() == "-") propBuffer += "2"; else if (i()["style:leader-text"]->getStr() == "_") propBuffer += "3"; else // default to dot leader if the given leader is dot or is not supported by AbiWord propBuffer += "1"; else propBuffer += "0"; tmpBuffer = ","; } } UT_DEBUGMSG(("AbiWordPerfect: Appending paragraph properties: %s\n", propBuffer.c_str())); const PP_PropertyVector propsArray = { "props", propBuffer.c_str() }; X_CheckDocumentError(appendStrux(PTX_Block, propsArray)); m_bRequireBlock = false; if (propList["fo:break-before"]) { if (strcmp(propList["fo:break-before"]->getStr().cstr(), "page") == 0) { UT_UCS4Char ucs = UCS_FF; X_CheckDocumentError(appendSpan(&ucs,1)); } else if (strcmp(propList["fo:break-before"]->getStr().cstr(), "column") == 0) { UT_UCS4Char ucs = UCS_VTAB; X_CheckDocumentError(appendSpan(&ucs,1)); } } }