Files
core/ASCOfficeDocFile/DocDocxConverter/TextboxMapping.cpp
Elen.Subbotina b8fffbf507 DocFormat - bug #31790
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@68598 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-21 00:59:27 +03:00

131 lines
3.9 KiB
C++

#include "Converter.h"
#include "TextboxMapping.h"
namespace DocFileFormat
{
int TextboxMapping::TextboxCount = 0;
TextboxMapping::TextboxMapping (ConversionContext* ctx, int nTBIndex, XmlUtils::CXmlWriter* writer, IMapping* caller ): DocumentMapping( ctx, writer, caller ), m_nTBIndex(0)
{
TextboxCount++;
m_nTBIndex = nTBIndex;
SetInset(-1,-1,-1,-1);
}
TextboxMapping::TextboxMapping (ConversionContext* ctx, XmlUtils::CXmlWriter* writer, IMapping* caller) : DocumentMapping( ctx, writer, caller ), m_nTBIndex(0)
{
TextboxCount++;
m_nTBIndex = TextboxCount - 1;
SetInset(-1,-1,-1,-1);
}
TextboxMapping::~TextboxMapping()
{
//TextboxCount--;
}
}
namespace DocFileFormat
{
void TextboxMapping::SetTextboxStyle(const std::wstring & style)
{
m_sTextBoxStyle = style;
}
void TextboxMapping::SetInset (int nLeft, int nTop, int nRight, int nBottom)
{
//emu to pt (1 pt = 12700)
m_dxTextLeft = nLeft / 12700.;
m_dyTextTop = nTop / 12700.;
m_dxTextRight = nRight / 12700.;
m_dyTextBottom = nBottom / 12700.;
}
void TextboxMapping::Apply (IVisitable* visited)
{
m_document = static_cast<WordDocument*>(visited);
if (m_document)
{
//if (m_nTBIndex < m_document->TextboxBreakPlex->Elements.size())
// return;
m_pXmlWriter->WriteNodeBegin(_T("v:textbox"), true);
if(m_dxTextLeft >= 0 && m_dyTextTop >= 0 && m_dxTextRight >= 0 && m_dyTextBottom >= 0)
{
m_pXmlWriter->WriteAttribute( _T( "inset" ), std_string2string(
FormatUtils::DoubleToWideString(m_dxTextLeft) +
_T("pt,") + FormatUtils::DoubleToWideString(m_dyTextTop) +
_T("pt,") + FormatUtils::DoubleToWideString(m_dxTextRight) +
_T("pt,") + FormatUtils::DoubleToWideString(m_dyTextBottom) + _T("pt")));
}
if (!m_sTextBoxStyle.empty())
{
m_pXmlWriter->WriteAttribute( _T( "style" ), std_string2string(m_sTextBoxStyle));
}
m_pXmlWriter->WriteNodeEnd( _T( "" ), true, false );
m_pXmlWriter->WriteNodeBegin( _T( "w:txbxContent" ) );
int cp = 0;
int cpEnd = 0;
Tbkd* bkd = NULL;
int txtbxSubdocStart =
m_document->FIB->m_RgLw97.ccpText +
m_document->FIB->m_RgLw97.ccpFtn +
m_document->FIB->m_RgLw97.ccpHdr +
m_document->FIB->m_RgLw97.ccpAtn +
m_document->FIB->m_RgLw97.ccpEdn;
if (typeid(*_caller) == typeid(MainDocumentMapping))
{
bkd = static_cast<Tbkd*>(m_document->TextboxBreakPlex->Elements[m_nTBIndex]);
cp = txtbxSubdocStart + m_document->TextboxBreakPlex->CharacterPositions[m_nTBIndex];
cpEnd = txtbxSubdocStart + m_document->TextboxBreakPlex->CharacterPositions[m_nTBIndex + 1];
}
else if ((typeid(*_caller) == typeid(HeaderMapping)) || (typeid(*_caller) == typeid(FooterMapping)))
{
txtbxSubdocStart += m_document->FIB->m_RgLw97.ccpTxbx;
bkd = static_cast<Tbkd*>(m_document->TextboxBreakPlexHeader->Elements[m_nTBIndex]);
cp = txtbxSubdocStart + m_document->TextboxBreakPlexHeader->CharacterPositions[m_nTBIndex];
cpEnd = txtbxSubdocStart + m_document->TextboxBreakPlexHeader->CharacterPositions[m_nTBIndex + 1];
}
//convert the textbox text
_lastValidPapx = (*(m_document->AllPapxFkps->begin()))->grppapx[0];
while (cp < cpEnd)
{
int fc = m_document->FindFileCharPos(cp);
ParagraphPropertyExceptions* papx = findValidPapx( fc );
TableInfo tai( papx );
if ( tai.fInTable )
{
//this PAPX is for a table
//cp = writeTable( cp, tai.iTap );
Table table( this, cp, ( ( tai.iTap > 0 ) ? ( 1 ) : ( 0 ) ) );
table.Convert( this );
cp = table.GetCPEnd();
}
else
{
//this PAPX is for a normal paragraph
cp = writeParagraph( cp );
}
}
m_pXmlWriter->WriteNodeEnd( _T( "w:txbxContent" ) );
m_pXmlWriter->WriteNodeEnd( _T( "v:textbox" ) );
}
}
}