Files
core/ASCOfficeRtfFile/RtfShape.cpp
Sergey.Konovalov 5aa4232313 (1.0.0.42): ASCOfficeRtfFile
Bug 17786 - Нет заливки ячейки.
Bug 17793 - Толщина линии должна быть 4.5pt.
Bug 17797 - в RTF не подхватился флаг переноса заголовка таблицы.
Bug 17811 - В RTF не протащился параметр автофигуры - положение за текстом.
Bug 17784 - первая ячейка в 5-6 строке неверной высоты.
Bug 18780 - RTF документ открывается без картинок, если она была добавлена через PrintScreen в WordPad.
для бага.Bug 17798 - В таблице не подхватилась нумерация.
Bug 22788 - [RTF] Документ с иероглифами открывается со знаками вопросов

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@56358 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-20 22:55:24 +03:00

1186 lines
52 KiB
C++

#include "stdafx.h"
#include "RtfShape.h"
#include "OOXWriter.h"
#include "RtfOle.h"
CString RtfShape::RenderToRtf(RenderParameter oRenderParameter)
{
CString sResult;
if( PROP_DEF != m_nShapeType && 0 != m_nShapeType )
{
//çàïîìèíàåì êîîðäèíàòû è åñëè íóæíî ïîâîðà÷èâàåì
int nLeft = m_nLeft;
int nTop = m_nTop;
int nRight = m_nRight;
int nBottom = m_nBottom;
int nRotate = m_nRotation;
int nRelLeft = m_nRelLeft;
int nRelTop = m_nRelTop;
int nRelRight = m_nRelRight;
int nRelBottom = m_nRelBottom;
int nRelRotate = m_nRelRotation;
if( PROP_DEF != m_nRotation && PROP_DEF != m_nLeft && PROP_DEF != m_nTop &&
PROP_DEF != m_nRight && PROP_DEF != m_nBottom )
ToRtfRotation( m_nRotation, m_nLeft, m_nTop, m_nRight, m_nBottom );
if( PROP_DEF != m_nRelRotation && PROP_DEF != m_nRelLeft && PROP_DEF != m_nRelTop &&
PROP_DEF != m_nRelRight && PROP_DEF != m_nRelBottom )
ToRtfRotation( m_nRelRotation, m_nRelLeft, m_nRelTop, m_nRelRight, m_nRelBottom );
if( st_inline == m_eShapeType )
{
if( NULL != m_oPicture )
{
if( RtfPicture::dt_wmf == m_oPicture->eDataType )
sResult.Append( m_oPicture->RenderToRtf( oRenderParameter ) );
else
{
sResult.Append( _T("{\\*\\shppict") );
//CString sPictProp = RenderToRtfShapeProperty( oRenderParameter );
//if( false == sPictProp.IsEmpty() )
// sResult.AppendFormat( _T("{\\*\\picprop %s}"), sPictProp );
sResult.Append( m_oPicture->RenderToRtf( oRenderParameter ) );
sResult.Append( _T("}") );
sResult.Append( _T("{\\nonshppict") );
sResult.Append( m_oPicture->GenerateWMF( oRenderParameter ) );
sResult.Append( _T("}") );
}
}
}
else
{
sResult.Append(_T("{\\shp{\\*\\shpinst"));
RENDER_RTF_INT( m_nLeft, sResult, _T("shpleft") );
RENDER_RTF_INT( m_nTop, sResult, _T("shptop") );
RENDER_RTF_INT( m_nBottom, sResult, _T("shpbottom") );
RENDER_RTF_INT( m_nRight, sResult, _T("shpright") );
RENDER_RTF_INT( m_nID, sResult, _T("shplid") );
RENDER_RTF_INT( m_nZOrder, sResult, _T("shpz") );
RENDER_RTF_INT( m_nHeader, sResult, _T("shpfhdr") );
RENDER_RTF_INT( m_nWrapType, sResult, _T("shpwr") );
RENDER_RTF_INT( m_nWrapSideType, sResult, _T("shpwrk") );
RENDER_RTF_BOOL( m_bLockAnchor, sResult, _T("shplockanchor") );
switch(m_eXAnchor)
{
case ax_page: sResult.Append( _T("\\shpbxpage") );break;
case ax_margin: sResult.Append( _T("\\shpbxmargin") );break;
case ax_column: sResult.Append( _T("\\shpbxcolumn") );break;
}
sResult.Append( _T("\\shpbxignore") );
switch(m_eYAnchor)
{
case ay_page: sResult.Append( _T("\\shpbypage") );break;
case ay_margin: sResult.Append( _T("\\shpbymargin") );break;
case ay_Para: sResult.Append( _T("\\shpbypara") );break;
}
sResult.Append( _T("\\shpbyignore") );
RENDER_RTF_INT( m_nZOrderRelative, sResult, _T("shpfblwtxt") );
sResult.Append( RenderToRtfShapeProperty( oRenderParameter ) );
//picture
if( 0 != m_oPicture )
{
sResult.Append( _T("{\\sp{\\sn pib}{\\sv ") );
sResult.Append( m_oPicture->RenderToRtf( oRenderParameter ) );
sResult.Append( _T("}}") );
}
//textbox
if( 0 != m_aTextItems )
{
sResult.Append( _T("{\\shptxt ") );
sResult.Append( m_aTextItems->RenderToRtf( oRenderParameter ) );
sResult.Append( _T("}") );
}
sResult.Append(_T("}"));
if( 0 != m_oPicture )
{
sResult.Append(_T("{\\shprslt\\par\\plain"));
sResult.Append( m_oPicture->GenerateWMF( oRenderParameter ) );
sResult.Append(_T("\\par}"));
}
sResult.Append(_T("}"));
}
//âîññòàíàâëèâàåì êîîðäèíàòû è åñëè íóæíî ïîâîðà÷èâàåì
m_nLeft = nLeft;
m_nTop = nTop;
m_nRight = nRight;
m_nBottom = nBottom;
m_nRotation = nRotate;
m_nRelLeft = nRelLeft;
m_nRelTop = nRelTop;
m_nRelRight = nRelRight;
m_nRelBottom = nRelBottom;
m_nRelRotation = nRelRotate;
}
return sResult;
}
CString RtfShape::RenderToRtfShapeProperty(RenderParameter oRenderParameter)
{
CString sResult;
//Position absolute
if( PROP_DEF != m_nPositionH )
sResult.AppendFormat( _T("{\\sp{\\sn posh}{\\sv %d}}"),m_nPositionH);
if( PROP_DEF != m_nPositionHRelative )
sResult.AppendFormat( _T("{\\sp{\\sn posrelh}{\\sv %d}}"),m_nPositionHRelative);
if( PROP_DEF != m_nPositionV )
sResult.AppendFormat( _T("{\\sp{\\sn posv}{\\sv %d}}"),m_nPositionV);
if( PROP_DEF != m_nPositionVRelative )
sResult.AppendFormat( _T("{\\sp{\\sn posrelv}{\\sv %d}}"),m_nPositionVRelative);
if( PROP_DEF != m_bLayoutInCell )
sResult.AppendFormat( _T("{\\sp{\\sn fLayoutInCell}{\\sv %d}}"),m_bLayoutInCell);
if( PROP_DEF != m_bAllowOverlap )
sResult.AppendFormat( _T("{\\sp{\\sn fAllowOverlap}{\\sv %d}}"),m_bAllowOverlap);
//Position relative
if( PROP_DEF != m_nPositionHPct )
sResult.AppendFormat( _T("{\\sp{\\sn pctHorizPos}{\\sv %d}}"),m_nPositionHPct);
if( PROP_DEF != m_nPositionVPct )
sResult.AppendFormat( _T("{\\sp{\\sn pctVertPos}{\\sv %d}}"),m_nPositionVPct);
if( PROP_DEF != m_nPctWidth )
sResult.AppendFormat( _T("{\\sp{\\sn pctHoriz}{\\sv %d}}"),m_nPctWidth);
if( PROP_DEF != m_nPctHeight )
sResult.AppendFormat( _T("{\\sp{\\sn pctVert}{\\sv %d}}"),m_nPctHeight);
if( PROP_DEF != m_nPctWidthRelative )
sResult.AppendFormat( _T("{\\sp{\\sn sizerelh}{\\sv %d}}"),m_nPctWidthRelative);
if( PROP_DEF != m_nPctHeightRelative )
sResult.AppendFormat( _T("{\\sp{\\sn sizerelv}{\\sv %d}}"),m_nPctHeightRelative);
if( PROP_DEF != m_nColStart )
sResult.AppendFormat( _T("{\\sp{\\sn colStart}{\\sv %d}}"),m_nColStart);
if( PROP_DEF != m_nColSpan )
sResult.AppendFormat( _T("{\\sp{\\sn colSpan}{\\sv %d}}"),m_nColSpan);
//Rehydration
if( _T("") != m_sMetroBlob )
sResult.AppendFormat( _T("{\\sp{\\sn metroBlob}{\\sv %d}}"),m_sMetroBlob);
//Object Type
if( PROP_DEF != m_bIsBullet )
sResult.AppendFormat( _T("{\\sp{\\sn fIsBullet}{\\sv %d}}"),m_bIsBullet);
if( PROP_DEF != m_nRotation )
sResult.AppendFormat( _T("{\\sp{\\sn rotation}{\\sv %d}}"),m_nRotation);
if( PROP_DEF != m_bFlipV )
sResult.AppendFormat( _T("{\\sp{\\sn fFlipV}{\\sv %d}}"),m_bFlipV);
if( PROP_DEF != m_bFlipH )
sResult.AppendFormat( _T("{\\sp{\\sn fFlipH}{\\sv %d}}"),m_bFlipH);
if( PROP_DEF != m_nShapeType )
sResult.AppendFormat( _T("{\\sp{\\sn shapeType}{\\sv %d}}"),m_nShapeType);
if( PROP_DEF != m_nWrapDistLeft )
sResult.AppendFormat( _T("{\\sp{\\sn dxWrapDistLeft}{\\sv %d}}"), RtfUtility::Twips2Emu( m_nWrapDistLeft ));
if( PROP_DEF != m_nWrapDistTop )
sResult.AppendFormat( _T("{\\sp{\\sn dyWrapDistTop}{\\sv %d}}"), RtfUtility::Twips2Emu( m_nWrapDistTop ));
if( PROP_DEF != m_nWrapDistRight )
sResult.AppendFormat( _T("{\\sp{\\sn dxWrapDistRight}{\\sv %d}}"), RtfUtility::Twips2Emu( m_nWrapDistRight ));
if( PROP_DEF != m_nWrapDistBottom )
sResult.AppendFormat( _T("{\\sp{\\sn dyWrapDistBottom}{\\sv %d}}"),RtfUtility::Twips2Emu( m_nWrapDistBottom ));
if( PROP_DEF != m_nZOrderRelative )
sResult.AppendFormat( _T("{\\sp{\\sn fBehindDocument}{\\sv %d}}"),m_nZOrderRelative);
if( PROP_DEF != m_bHidden )
sResult.AppendFormat( _T("{\\sp{\\sn fHidden}{\\sv %d}}"),m_bHidden);
//Geometry
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjustValue}{\\sv %d}}"),m_nAdjustValue );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust2Value}{\\sv %d}}"),m_nAdjustValue2 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust3Value}{\\sv %d}}"),m_nAdjustValue3 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust4Value}{\\sv %d}}"),m_nAdjustValue4 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust5Value}{\\sv %d}}"),m_nAdjustValue5 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust6Value}{\\sv %d}}"),m_nAdjustValue6 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust7Value}{\\sv %d}}"),m_nAdjustValue7 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust8Value}{\\sv %d}}"),m_nAdjustValue8 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust9Value}{\\sv %d}}"),m_nAdjustValue9 );
if( PROP_DEF != m_nAdjustValue )
sResult.AppendFormat( _T("{\\sp{\\sn adjust10Value}{\\sv %d}}"),m_nAdjustValue10 );
//Connectors
if( PROP_DEF != m_nConnectionType )
sResult.AppendFormat( _T("{\\sp{\\sn cxk}{\\sv %d}}"),m_nConnectionType );
if( PROP_DEF != m_nConnectorStyle )
sResult.AppendFormat( _T("{\\sp{\\sn cxstyle}{\\sv %d}}"),m_nConnectorStyle );
//WordArt Effects
if( PROP_DEF != m_nCropFromTop )
sResult.AppendFormat( _T("{\\sp{\\sn cropFromTop}{\\sv %d}}"),m_nCropFromTop );
if( PROP_DEF != m_nCropFromBottom )
sResult.AppendFormat( _T("{\\sp{\\sn cropFromBottom}{\\sv %d}}"),m_nCropFromBottom );
if( PROP_DEF != m_nCropFromLeft )
sResult.AppendFormat( _T("{\\sp{\\sn cropFromLeft}{\\sv %d}}"),m_nCropFromLeft );
if( PROP_DEF != m_nCropFromRight )
sResult.AppendFormat( _T("{\\sp{\\sn cropFromRight}{\\sv %d}}"),m_nCropFromRight );
//Grouped Shapes
if( PROP_DEF != m_nGroupBottom )
sResult.AppendFormat( _T("{\\sp{\\sn groupBottom}{\\sv %d}}"),m_nCropFromRight );
if( PROP_DEF != m_nGroupLeft )
sResult.AppendFormat( _T("{\\sp{\\sn groupLeft}{\\sv %d}}"),m_nGroupLeft );
if( PROP_DEF != m_nGroupRight )
sResult.AppendFormat( _T("{\\sp{\\sn groupRight}{\\sv %d}}"),m_nGroupRight );
if( PROP_DEF != m_nGroupTop )
sResult.AppendFormat( _T("{\\sp{\\sn groupTop}{\\sv %d}}"),m_nGroupTop );
if( PROP_DEF != m_nRelBottom )
sResult.AppendFormat( _T("{\\sp{\\sn relBottom}{\\sv %d}}"),m_nRelBottom );
if( PROP_DEF != m_nRelLeft )
sResult.AppendFormat( _T("{\\sp{\\sn relLeft}{\\sv %d}}"),m_nRelLeft );
if( PROP_DEF != m_nRelRight )
sResult.AppendFormat( _T("{\\sp{\\sn relRight}{\\sv %d}}"),m_nRelRight );
if( PROP_DEF != m_nRelTop )
sResult.AppendFormat( _T("{\\sp{\\sn relTop}{\\sv %d}}"),m_nRelTop );
if( PROP_DEF != m_nRelRotation )
sResult.AppendFormat( _T("{\\sp{\\sn relRotation}{\\sv %d}}"),m_nRelRotation );
if( PROP_DEF != m_nRelZOrder )
sResult.AppendFormat( _T("{\\sp{\\sn dhgt}{\\sv %d}}"),m_nRelZOrder );
//Line
if( PROP_DEF != m_nLineStartArrow )
sResult.AppendFormat( _T("{\\sp{\\sn lineStartArrowhead}{\\sv %d}}"),m_nLineStartArrow );
if( PROP_DEF != m_nLineEndArrow )
sResult.AppendFormat( _T("{\\sp{\\sn lineEndArrowhead}{\\sv %d}}"),m_nLineEndArrow );
if( PROP_DEF != m_nLineStartArrowWidth )
sResult.AppendFormat( _T("{\\sp{\\sn lineStartArrowWidth}{\\sv %d}}"),m_nLineStartArrowWidth );
if( PROP_DEF != m_nLineStartArrowLength )
sResult.AppendFormat( _T("{\\sp{\\sn lineStartArrowLength}{\\sv %d}}"),m_nLineStartArrowLength );
if( PROP_DEF != m_nLineEndArrowWidth )
sResult.AppendFormat( _T("{\\sp{\\sn lineEndArrowWidth}{\\sv %d}}"),m_nLineEndArrowWidth );
if( PROP_DEF != m_nLineEndArrowLength )
sResult.AppendFormat( _T("{\\sp{\\sn lineEndArrowLength}{\\sv %d}}"),m_nLineEndArrowLength );
if( PROP_DEF != m_nLineWidth )
sResult.AppendFormat( _T("{\\sp{\\sn lineWidth}{\\sv %d}}"),m_nLineWidth );
//pWrapPolygonVertices Points of the text wrap polygon.
int nWrapPointCount = (int)m_aWrapPoints.GetCount();
if( nWrapPointCount > 0 )
{
sResult.AppendFormat( _T("{\\sp{\\sn pWrapPolygonVertices}{\\sv 8;%d"), nWrapPointCount / 2 );
for( int i = 0; i < nWrapPointCount - 1; i += 2 )
sResult.AppendFormat( _T(";(%d,%d)"), m_aWrapPoints[i], m_aWrapPoints[ i + 1 ] );
sResult.Append( _T("}}") );
}
return sResult;
}
CString RtfShape::RenderToOOX(RenderParameter oRenderParameter)
{
CString sResult;
RtfDocument* poDocument = static_cast<RtfDocument*>(oRenderParameter.poDocument);
if( PROP_DEF != m_nShapeType && 0 != m_nShapeType )
{
if( false && RENDER_TO_OOX_PARAM_SHAPE_WSHAPE != oRenderParameter.nType && NULL != m_oPicture ) //êàðòèíêè ïèøåì êàê drawing
{
if( st_inline == m_eShapeType )
{
if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nHeightGoal )
{
sResult.Append( _T("<w:r><w:drawing><wp:inline") );
int nDistLeft = 0;
int nDistTop = 0;
int nDistRight = 0;
int nDistBottom = 0;
if( PROP_DEF != m_nWrapDistLeft )
nDistLeft = RtfUtility::Twips2Emu( m_nWrapDistLeft );
if( PROP_DEF != m_nWrapDistTop )
nDistTop = RtfUtility::Twips2Emu( m_nWrapDistTop );
if( PROP_DEF != m_nWrapDistRight )
nDistRight = RtfUtility::Twips2Emu( m_nWrapDistRight );
if( PROP_DEF != m_nWrapDistBottom )
nDistBottom = RtfUtility::Twips2Emu( m_nWrapDistBottom );
RENDER_OOX_INT_ATTRIBUTE( nDistLeft, sResult, _T("distL") )
RENDER_OOX_INT_ATTRIBUTE( nDistTop, sResult, _T("distT") )
RENDER_OOX_INT_ATTRIBUTE( nDistRight, sResult, _T("distR") )
RENDER_OOX_INT_ATTRIBUTE( nDistBottom, sResult, _T("distB") )
sResult.Append( _T(">") );
if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nHeightGoal )
sResult.AppendFormat( _T("<wp:extent cx=\"%d\" cy=\"%d\"/>"), RtfUtility::Twips2Emu( m_oPicture->m_nWidthGoal ), RtfUtility::Twips2Emu( m_oPicture->m_nHeightGoal ) );
int nImageID = poDocument->m_oIdGenerator.Generate_ImagePropId();
sResult.AppendFormat( _T("<wp:docPr id=\"%d\" name=\"\" descr=\"\"/>"), nImageID );
int nCropLeft = PROP_DEF;
int nCropTop = PROP_DEF;
int nCropRight = PROP_DEF;
int nCropBottom = PROP_DEF;
if( PROP_DEF != m_nCropFromLeft )
nCropLeft = (int)( 100000.0 * m_nCropFromLeft / 65536 );
else if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nCropL )
nCropLeft = (int)( 100000.0 * m_oPicture->m_nCropL / m_oPicture->m_nWidthGoal );
if( PROP_DEF != m_nCropFromTop )
nCropTop = (int)( 100000.0 * m_nCropFromTop / 65536 );
else if( PROP_DEF != m_oPicture->m_nHeightGoal && PROP_DEF != m_oPicture->m_nCropT )
nCropTop = (int)( 100000.0 * m_oPicture->m_nCropT / m_oPicture->m_nHeightGoal );
if( PROP_DEF != m_nCropFromRight )
nCropRight = (int)( 100000.0 * m_nCropFromRight / 65536 );
else if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nCropR )
nCropRight = (int)( 100000.0 * m_oPicture->m_nCropR / m_oPicture->m_nWidthGoal );
if( PROP_DEF != m_nCropFromBottom )
nCropBottom = (int)( 100000.0 * m_nCropFromBottom / 65536 );
else if( PROP_DEF != m_oPicture->m_nHeightGoal && PROP_DEF != m_oPicture->m_nCropB )
nCropBottom = (int)( 100000.0 * m_oPicture->m_nCropB / m_oPicture->m_nHeightGoal );
sResult.Append( _T("<a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"));
sResult.Append( _T("<pic:nvPicPr>") );
sResult.AppendFormat( _T("<pic:cNvPr id=\"%d\" name=\"\" descr=\"\"/>"), nImageID );
if( 0 == m_bLockAnchor )
sResult.Append( _T("<pic:cNvPicPr><a:picLocks noChangeAspect=\"0\" noChangeArrowheads=\"1\"/></pic:cNvPicPr>") );
else
sResult.Append( _T("<pic:cNvPicPr><a:picLocks noChangeAspect=\"1\" noChangeArrowheads=\"1\"/></pic:cNvPicPr>") );
sResult.Append( _T("</pic:nvPicPr>") );
sResult.AppendFormat( _T("<pic:blipFill><a:blip r:embed=\"%s\"/>"), m_oPicture->RenderToOOX(oRenderParameter) );
CString sCrop;
if( PROP_DEF != nCropLeft )
sCrop.AppendFormat( _T(" l=\"%d\""), nCropLeft ); //òûñÿ÷íûé äîëè ïðîöåíòà
if( PROP_DEF != nCropTop )
sCrop.AppendFormat( _T(" t=\"%d\""), nCropTop );
if( PROP_DEF != nCropRight )
sCrop.AppendFormat( _T(" r=\"%d\""), nCropRight );
if( PROP_DEF != nCropBottom )
sCrop.AppendFormat( _T(" b=\"%d\""), nCropBottom );
if( false == sCrop.IsEmpty() )
sResult.AppendFormat( _T("<a:srcRect %s/>"), sCrop );
sResult.Append( _T("<a:stretch><a:fillRect/></a:stretch>") );
sResult.Append( _T("</pic:blipFill>") );
if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nHeightGoal )
{
sResult.Append( _T("<pic:spPr bwMode=\"auto\">") );
sResult.Append( _T("<a:xfrm") );
int nRotation = PROP_DEF;
if( PROP_DEF != m_nRotation )
nRotation = m_nRotation;
else
nRotation = m_nRelRotation;
if( PROP_DEF != nRotation )
{
int nOOXRotation = (int)( 60000.0 * nRotation / 0x10000 );//Îïûòíûì ïóòåì 1 ãðàäóñ == 60000
sResult.AppendFormat( _T(" rot=\"%d\""), nOOXRotation );
}
sResult.Append( _T(">") );
sResult.AppendFormat( _T("<a:off x=\"0\" y=\"0\"/><a:ext cx=\"%d\" cy=\"%d\"/>"), m_oPicture->m_nWidthGoal, m_oPicture->m_nHeightGoal );
sResult.Append( _T("</a:xfrm>") );
sResult.Append( _T("<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>") );
sResult.Append( _T("</pic:spPr>") );
}
sResult.Append( _T("</pic:pic></a:graphicData></a:graphic>") );
sResult.Append( _T("</wp:inline></w:drawing></w:r>") );
}
}
else
{
if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nHeightGoal )
{
sResult.Append( _T("<w:r><w:drawing><wp:anchor") );
int nDistLeft = 0;//àòòðèáóòû îáÿçàòåëüíûå
int nDistTop = 0;
int nDistRight = 0;
int nDistBottom = 0;
int nOverlap = 1;
int nBehind = 0;
int nLayout = 1;
int nLocked = 0;
int nZIndex = 100;
if( PROP_DEF != m_nWrapDistLeft )
nDistLeft = RtfUtility::Twips2Emu( m_nWrapDistLeft );
if( PROP_DEF != m_nWrapDistTop )
nDistTop = RtfUtility::Twips2Emu( m_nWrapDistTop );
if( PROP_DEF != m_nWrapDistRight )
nDistRight = RtfUtility::Twips2Emu( m_nWrapDistRight );
if( PROP_DEF != m_nWrapDistBottom )
nDistBottom = RtfUtility::Twips2Emu( m_nWrapDistBottom );
if( PROP_DEF != m_bAllowOverlap )
nOverlap = m_bAllowOverlap;
if( PROP_DEF != m_nZOrderRelative )
nBehind = m_nZOrderRelative;
if( PROP_DEF != m_bLayoutInCell )
nLayout = m_bLayoutInCell;
if( PROP_DEF != m_bLockAnchor )
nLocked = m_bLockAnchor;
if( PROP_DEF != m_nZOrder )
nZIndex = m_nZOrder;
RENDER_OOX_INT_ATTRIBUTE( nDistLeft, sResult, _T("distL") )
RENDER_OOX_INT_ATTRIBUTE( nDistTop, sResult, _T("distT") )
RENDER_OOX_INT_ATTRIBUTE( nDistRight, sResult, _T("distR") )
RENDER_OOX_INT_ATTRIBUTE( nDistBottom, sResult, _T("distB") )
RENDER_OOX_BOOL_ATTRIBUTE( nOverlap, sResult, _T("allowOverlap") )
RENDER_OOX_BOOL_ATTRIBUTE( nBehind, sResult, _T("behindDoc") )
RENDER_OOX_BOOL_ATTRIBUTE( m_bHidden, sResult, _T("hidden") )
RENDER_OOX_BOOL_ATTRIBUTE( nLayout, sResult, _T("layoutInCell") )
RENDER_OOX_BOOL_ATTRIBUTE( nLocked, sResult, _T("locked") )
RENDER_OOX_INT_ATTRIBUTE( nZIndex, sResult, _T("relativeHeight") )
RENDER_OOX_BOOL_ATTRIBUTE( 0, sResult, _T("simplePos") )
sResult.Append( _T(">") );
if( PROP_DEF != m_nLeft && PROP_DEF != m_nTop )
sResult.AppendFormat( _T("<wp:simplePos x=\"%d\" y=\"%d\"/>"),RtfUtility::Twips2Emu(m_nLeft), RtfUtility::Twips2Emu(m_nTop) );
if( ( PROP_DEF != m_nPositionHRelative || ax_none != m_eXAnchor ) && (PROP_DEF != m_nPositionH || PROP_DEF != m_nLeft ) )
{
sResult.Append( _T("<wp:positionH") );
if( PROP_DEF != m_nPositionHRelative )
{
switch( m_nPositionHRelative )
{
case 0: sResult.Append( _T(" relativeFrom=\"margin\"") );break;
case 1: sResult.Append( _T(" relativeFrom=\"page\"") );break;
case 2: sResult.Append( _T(" relativeFrom=\"column\"") );break;
case 3: sResult.Append( _T(" relativeFrom=\"character\"") );break;
case 4: sResult.Append( _T(" relativeFrom=\"leftMargin\"") );break;
case 5: sResult.Append( _T(" relativeFrom=\"rightMargin\"") );break;
case 6: sResult.Append( _T(" relativeFrom=\"insideMargin\"") );break;
case 7: sResult.Append( _T(" relativeFrom=\"outsideMargin\"") );break;
}
}
else
{
switch( m_eXAnchor )
{
case ax_margin: sResult.Append( _T(" relativeFrom=\"margin\"") );break;
case ax_page: sResult.Append( _T(" relativeFrom=\"page\"") );break;
case ax_column: sResult.Append( _T(" relativeFrom=\"column\"") );break;
}
}
sResult.Append( _T(">") );
if( PROP_DEF != m_nPositionH )
{
switch( m_nPositionH )
{
case 1: sResult.Append( _T("<wp:align>left</wp:align>") );break;
case 2: sResult.Append( _T("<wp:align>center</wp:align>") );break;
case 3: sResult.Append( _T("<wp:align>right</wp:align>") );break;
case 4: sResult.Append( _T("<wp:align>inside</wp:align>") );break;
case 5: sResult.Append( _T("<wp:align>outside</wp:align>") );break;
}
}
else
{
sResult.AppendFormat( _T("<wp:posOffset>%d</wp:posOffset>"), RtfUtility::Twips2Emu( m_nLeft ) );
}
sResult.Append( _T("</wp:positionH>") );
}
if( ( PROP_DEF != m_nPositionVRelative || ax_none != m_eYAnchor ) && (PROP_DEF != m_nPositionV || PROP_DEF != m_nTop ) )
{
sResult.Append( _T("<wp:positionV") );
if( PROP_DEF != m_nPositionVRelative )
{
switch( m_nPositionVRelative )
{
case 0: sResult.Append( _T(" relativeFrom=\"margin\"") );break;
case 1: sResult.Append( _T(" relativeFrom=\"page\"") );break;
case 2: sResult.Append( _T(" relativeFrom=\"paragraph\"") );break;
case 3: sResult.Append( _T(" relativeFrom=\"line\"") );break;
case 4: sResult.Append( _T(" relativeFrom=\"topMargin\"") );break;
case 5: sResult.Append( _T(" relativeFrom=\"bottomMargin\"") );break;
case 6: sResult.Append( _T(" relativeFrom=\"insideMargin\"") );break;
case 7: sResult.Append( _T(" relativeFrom=\"outsideMargin\"") );break;
}
}
else
{
switch( m_eYAnchor )
{
case ay_margin: sResult.Append( _T(" relativeFrom=\"margin\"") );break;
case ay_page: sResult.Append( _T(" relativeFrom=\"page\"") );break;
case ay_Para: sResult.Append( _T(" relativeFrom=\"paragraph\"") );break;
}
}
sResult.Append( _T(">") );
if( PROP_DEF != m_nPositionV )
{
switch( m_nPositionV )
{
case 1: sResult.Append( _T("<wp:align>top</wp:align>") );break;
case 2: sResult.Append( _T("<wp:align>center</wp:align>") );break;
case 3: sResult.Append( _T("<wp:align>bottom</wp:align>") );break;
case 4: sResult.Append( _T("<wp:align>inside</wp:align>") );break;
case 5: sResult.Append( _T("<wp:align>outside</wp:align>") );break;
}
}
else
{
sResult.AppendFormat( _T("<wp:posOffset>%d</wp:posOffset>"), RtfUtility::Twips2Emu( m_nTop ) );
}
sResult.Append( _T("</wp:positionV>") );
}
int nWidth;
int nHeight;
if( PROP_DEF != m_nLeft && PROP_DEF != m_nRight && PROP_DEF != m_nTop && PROP_DEF != m_nBottom )
{
nWidth = m_nRight - m_nLeft;
nHeight = m_nBottom - m_nTop;
}
else if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nHeightGoal )
{
nWidth = m_oPicture->m_nWidthGoal;
nHeight = m_oPicture->m_nHeightGoal;
}
if( PROP_DEF != nWidth && PROP_DEF != nHeight )
sResult.AppendFormat( _T("<wp:extent cx=\"%d\" cy=\"%d\"/>"), RtfUtility::Twips2Emu( nWidth ), RtfUtility::Twips2Emu( nHeight ) );
if( PROP_DEF != m_nWrapType && 3 != m_nWrapType)
{
sResult.Append( _T("<") );
CString sTag;
switch( m_nWrapType )
{
case 1:sTag.Append( _T("wp:wrapTopAndBottom") );break;
case 2:sTag.Append( _T("wp:wrapSquare") );break;
case 3:sTag.Append( _T("wp:wrapNone") );break;
case 4:sTag.Append( _T("wp:wrapTight") );break;
case 5:sTag.Append( _T("wp:wrapThrough") );break;
}
sResult.Append( sTag );
switch( m_nWrapSideType )
{
case 0:sResult.Append( _T(" wrapText=\"bothSides\"") );break;
case 1:sResult.Append( _T(" wrapText=\"left\"") );break;
case 2:sResult.Append( _T(" wrapText=\"right\"") );break;
case 3:sResult.Append( _T(" wrapText=\"largest\"") );break;
}
if( m_aWrapPoints.GetCount() == 0 )
sResult.Append( _T("/>") );
else
{
sResult.Append( _T(">") );
sResult.Append( _T("<wp:wrapPolygon>") );
if( m_aWrapPoints.GetCount() > 1 )
sResult.AppendFormat( _T("<wp:start x=\"%d\" y=\"%d\" />"), m_aWrapPoints[0], m_aWrapPoints[1] );
for( int i = 2; i < (int)m_aWrapPoints.GetCount() - 1; i+=2 )
sResult.AppendFormat( _T("<wp:lineTo x=\"%d\" y=\"%d\" />"), m_aWrapPoints[i], m_aWrapPoints[i+1] );
sResult.Append( _T("</wp:wrapPolygon>") );
sResult.AppendFormat( _T("</%s>"), sTag );
}
}
int nImageID = poDocument->m_oIdGenerator.Generate_ImagePropId();
sResult.AppendFormat( _T("<wp:docPr id=\"%d\" name=\"\" descr=\"\"/>"), nImageID );
int nCropLeft = PROP_DEF;
int nCropTop = PROP_DEF;
int nCropRight = PROP_DEF;
int nCropBottom = PROP_DEF;
if( PROP_DEF != m_nCropFromLeft )
nCropLeft = (int)( 100000.0 * m_nCropFromLeft / 65536 );
else if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nCropL )
nCropLeft = (int)( 100000.0 * m_oPicture->m_nCropL / m_oPicture->m_nWidthGoal );
if( PROP_DEF != m_nCropFromTop )
nCropTop = (int)( 100000.0 * m_nCropFromTop / 65536 );
else if( PROP_DEF != m_oPicture->m_nHeightGoal && PROP_DEF != m_oPicture->m_nCropT )
nCropTop = (int)( 100000.0 * m_oPicture->m_nCropT / m_oPicture->m_nHeightGoal );
if( PROP_DEF != m_nCropFromRight )
nCropRight = (int)( 100000.0 * m_nCropFromRight / 65536 );
else if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nCropR )
nCropRight = (int)( 100000.0 * m_oPicture->m_nCropR / m_oPicture->m_nWidthGoal );
if( PROP_DEF != m_nCropFromBottom )
nCropBottom = (int)( 100000.0 * m_nCropFromBottom / 65536 );
else if( PROP_DEF != m_oPicture->m_nHeightGoal && PROP_DEF != m_oPicture->m_nCropB )
nCropBottom = (int)( 100000.0 * m_oPicture->m_nCropB / m_oPicture->m_nHeightGoal );
sResult.Append( _T("<a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"));
sResult.Append( _T("<pic:nvPicPr>") );
sResult.AppendFormat( _T("<pic:cNvPr id=\"%d\" name=\"\" descr=\"\"/>"), nImageID );
if( 0 == m_bLockAnchor )
sResult.Append( _T("<pic:cNvPicPr><a:picLocks noChangeAspect=\"0\" noChangeArrowheads=\"1\"/></pic:cNvPicPr>") );
else
sResult.Append( _T("<pic:cNvPicPr><a:picLocks noChangeAspect=\"1\" noChangeArrowheads=\"1\"/></pic:cNvPicPr>") );
sResult.Append( _T("</pic:nvPicPr>") );
sResult.AppendFormat( _T("<pic:blipFill><a:blip r:embed=\"%s\"/>"), m_oPicture->RenderToOOX(oRenderParameter) );
CString sCrop;
if( PROP_DEF != nCropLeft )
sCrop.AppendFormat( _T(" l=\"%d\""), nCropLeft ); //òûñÿ÷íûé äîëè ïðîöåíòà
if( PROP_DEF != nCropTop )
sCrop.AppendFormat( _T(" t=\"%d\""), nCropTop );
if( PROP_DEF != nCropRight )
sCrop.AppendFormat( _T(" r=\"%d\""), nCropRight );
if( PROP_DEF != nCropBottom )
sCrop.AppendFormat( _T(" b=\"%d\""), nCropBottom );
if( false == sCrop.IsEmpty() )
sResult.AppendFormat( _T("<a:srcRect %s/>"), sCrop );
sResult.Append( _T("<a:stretch><a:fillRect/></a:stretch>") );
sResult.Append( _T("</pic:blipFill>") );
if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nHeightGoal )
{
sResult.Append( _T("<pic:spPr bwMode=\"auto\">") );
sResult.Append( _T("<a:xfrm") );
int nRotation = PROP_DEF;
if( PROP_DEF != m_nRotation )
nRotation = m_nRotation;
else
nRotation = m_nRelRotation;
if( PROP_DEF != nRotation )
{
int nOOXRotation = (int)( 60000.0 * nRotation / 65536 );//Îïûòíûì ïóòåì 1 ãðàäóñ == 60000
sResult.AppendFormat( _T(" rot=\"%d\""), nOOXRotation );
}
sResult.Append( _T(">") );
sResult.AppendFormat( _T("<a:off x=\"0\" y=\"0\"/><a:ext cx=\"%d\" cy=\"%d\"/>"), m_oPicture->m_nWidthGoal, m_oPicture->m_nHeightGoal );
sResult.Append( _T("</a:xfrm>") );
sResult.Append( _T("<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>") );
sResult.Append( _T("</pic:spPr>") );
}
sResult.Append( _T("</pic:pic></a:graphicData></a:graphic>") );
sResult.Append( _T("</wp:anchor></w:drawing></w:r>") );
}
}
}
else
{
TextItemContainerPtr aTempTextItems;
if( 75 == m_nShapeType && 0 != m_aTextItems )
{//Çíà÷èò ýòî Ole îáüåêò ñ anchor, äëÿ íåãî âñå òàêæå òîëüêî TextBox íàäî äåëàòü ïî-äðóãîìó
aTempTextItems = m_aTextItems;
m_aTextItems = TextItemContainerPtr();
m_bIsOle = true;
}
sResult = RenderToOOXBegin(oRenderParameter);
if( _T("") != sResult )
sResult.Append( RenderToOOXEnd(oRenderParameter) );
CString sOle;
if( 0 != aTempTextItems )
{//ïèøåì òîëüêî Ole îáüåêò
//èùåì ïåðâûé ole îáüåêò
RtfOlePtr poFirstOle;
int nTempTextItemsCount = aTempTextItems->GetCount();
for( int i = 0; i < nTempTextItemsCount; i++ )
{
ITextItemPtr piCurTextItem;
aTempTextItems->GetItem( piCurTextItem, i );
if( NULL != piCurTextItem && TYPE_RTF_PARAGRAPH == piCurTextItem->GetType() )
{
RtfParagraphPtr poCurParagraph = boost::shared_static_cast< RtfParagraph, ITextItem >( piCurTextItem );
if( NULL != poCurParagraph )
{
bool bBreak = false;
for( int j = 0; j < poCurParagraph->GetCount(); j++ )
{
IDocumentElementPtr piCurIDocumentElement;
poCurParagraph->GetItem( piCurIDocumentElement, j );
if( NULL != piCurIDocumentElement && TYPE_RTF_OLE == piCurIDocumentElement->GetType() )
{
//ðåíäåðèì òîëüêî Ole ÷àñòü
RenderParameter oNewParam = oRenderParameter;
oNewParam.nType = RENDER_TO_OOX_PARAM_OLE_ONLY;
oNewParam.nValue = m_nID;
RtfOlePtr poCurOle = boost::shared_static_cast< RtfOle, IDocumentElement >( piCurIDocumentElement );
if( NULL != poCurOle )
{
sOle.Append( poCurOle->RenderToOOX( oNewParam ) );
bBreak = true;
break;
}
}
}
if( true == bBreak )
break;
}
}
}
//âîçâðàùàåì text box íà ìåñòî
m_aTextItems = aTempTextItems;
}
if( false == sOle.IsEmpty() )
sResult.Replace( _T("</w:pict>"), sOle + _T("</w:pict>") );
}
}
return sResult;
}
CString RtfShape::RenderToOOXBegin(RenderParameter oRenderParameter)
{
if( false == IsValid() )
return _T("");
RtfDocument* poDocument = static_cast<RtfDocument*>( oRenderParameter.poDocument );
CString sResult;
if( RENDER_TO_OOX_PARAM_SHAPE_WSHAPE2 == oRenderParameter.nType )
;
else if( RENDER_TO_OOX_PARAM_SHAPE_WSHAPE == oRenderParameter.nType )
sResult.Append(_T("<w:pict>"));
else
sResult.Append(_T("<w:r><w:pict>"));//ðàáîòàåò ïî óìîë÷àíèþ
if( _T("") == oRenderParameter.sValue )
sResult.Append( _T("<v:shape") );
else
sResult.AppendFormat( _T("<%s"),oRenderParameter.sValue );
sResult.AppendFormat( _T(" id=\"_x0000_s%d\""), poDocument->GetShapeId( m_nID ) );
if( PROP_DEF != m_nShapeType )
sResult.AppendFormat( _T(" type=\"#_x0000_t%d\""),m_nShapeType );
//Connectors
switch( m_nConnectionType )
{
case 0: sResult.Append(_T(" o:connecttype=\"custom\""));break;
case 1: sResult.Append(_T(" o:connecttype=\"none\""));break;
case 2: sResult.Append(_T(" o:connecttype=\"rect\""));break;
case 3: sResult.Append(_T(" o:connecttype=\"segments\""));break;
}
switch( m_nConnectorStyle )
{
case 0: sResult.Append(_T(" o:connectortype=\"straight\""));break;
case 1: sResult.Append(_T(" o:connectortype=\"elbow\""));break;
case 2: sResult.Append(_T(" o:connectortype=\"curved\""));break;
case 3: sResult.Append(_T(" o:connectortype=\"none\""));break;
}
//Connectors
//Position
CString sStyle ;
if( PROP_DEF != m_nLeft && PROP_DEF != m_nRight && PROP_DEF != m_nTop && PROP_DEF != m_nBottom )
{
//íå ïèøåì åñëè inline
if( 3 != m_nPositionHRelative || 3 != m_nPositionVRelative )
{
sStyle .Append( _T("position:absolute;") );
sStyle.AppendFormat(_T("margin-left:%fpt;"), RtfUtility::Twip2pt(m_nLeft) );
sStyle.AppendFormat(_T("margin-top:%fpt;"), RtfUtility::Twip2pt(m_nTop));
sStyle.AppendFormat(_T("margin-bottom:%fpt;"), RtfUtility::Twip2pt(m_nBottom) );
sStyle.AppendFormat(_T("margin-right:%fpt;"), RtfUtility::Twip2pt(m_nRight));
}
int nWidth = m_nRight - m_nLeft;
int nHeight = m_nBottom - m_nTop;
sStyle.AppendFormat(_T("width:%fpt;height:%fpt;"), RtfUtility::Twip2pt(nWidth), RtfUtility::Twip2pt(nHeight));
}
else if( PROP_DEF != m_nRelLeft && PROP_DEF != m_nRelRight && PROP_DEF != m_nRelTop && PROP_DEF != m_nRelBottom )
{
int nWidth = m_nRelRight - m_nRelLeft;
int nHeight = m_nRelBottom - m_nRelTop;
sStyle .Append( _T("position:absolute;") );
sStyle.AppendFormat(_T("left:%d;"), m_nRelLeft );
sStyle.AppendFormat(_T("top:%d;"), m_nRelTop);
sStyle.AppendFormat(_T("bottom:%d;"), m_nRelBottom );
sStyle.AppendFormat(_T("right:%d;"), m_nRelRight);
sStyle.AppendFormat(_T("width:%d;height:%d;"), nWidth, nHeight);
}
else if( 0 != m_oPicture && PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nHeightGoal && PROP_DEF != (int)m_oPicture->m_dScaleX && PROP_DEF != (int)m_oPicture->m_dScaleY )
{
int nWidth = (int)(m_oPicture->m_nWidthGoal * m_oPicture->m_dScaleX / 100);
if( PROP_DEF != m_oPicture->m_nCropL )
nWidth -= m_oPicture->m_nCropL;
if( PROP_DEF != m_oPicture->m_nCropR )
nWidth -= m_oPicture->m_nCropR;
int nHeight = (int)(m_oPicture->m_nHeightGoal * m_oPicture->m_dScaleY / 100);
if( PROP_DEF != m_oPicture->m_nCropT )
nHeight -= m_oPicture->m_nCropT;
if( PROP_DEF != m_oPicture->m_nCropB )
nHeight -= m_oPicture->m_nCropB;
sStyle.AppendFormat(_T("width:%dpt;height:%dpt;"), (int)RtfUtility::Twip2pt(nWidth), (int)RtfUtility::Twip2pt(nHeight));
}
switch( m_nPositionH )
{
case 0: sStyle.Append(_T("mso-position-horizontal:absolute;"));break;
case 1: sStyle.Append(_T("mso-position-horizontal:left;"));break;
case 2: sStyle.Append(_T("mso-position-horizontal:center;"));break;
case 3: sStyle.Append(_T("mso-position-horizontal:right;"));break;
case 4: sStyle.Append(_T("mso-position-horizontal:inside;"));break;
case 5: sStyle.Append(_T("mso-position-horizontal:outside;"));break;
}
if( PROP_DEF != m_nPositionHPct )//todo
{
sStyle.AppendFormat(_T("mso-left-percent:%d;"), m_nPositionHPct);
}
if( PROP_DEF != m_nPositionH && PROP_DEF == m_nPositionHRelative )
m_nPositionHRelative = 2;
if( PROP_DEF != m_nPositionHRelative )
{
switch( m_nPositionHRelative )
{
case 0: sStyle.Append(_T("mso-position-horizontal-relative:margin;"));break;
case 1: sStyle.Append(_T("mso-position-horizontal-relative:page;"));break;
case 2: sStyle.Append(_T("mso-position-horizontal-relative:text;"));break;
case 3: sStyle.Append(_T("mso-position-horizontal-relative:char;"));break;
case 4: sStyle.Append(_T("mso-position-horizontal-relative:left-margin-area;"));break;
case 5: sStyle.Append(_T("mso-position-horizontal-relative:right-margin-area;"));break;
case 6: sStyle.Append(_T("mso-position-horizontal-relative:inner-margin-area;"));break;
case 7: sStyle.Append(_T("mso-position-horizontal-relative:outer-margin-area;"));break;
}
}
else
{
switch( m_eXAnchor )
{
case ax_page: sStyle.Append(_T("mso-position-horizontal-relative:page;"));break;
case ax_margin: sStyle.Append(_T("mso-position-horizontal-relative:margin;"));break;
//case ax_column: sStyle.Append(_T("mso-position-horizontal-relative:text;"));break;
}
}
switch( m_nPositionV )
{
case 0: sStyle.Append(_T("mso-position-vertical:absolute;"));break;
case 1: sStyle.Append(_T("mso-position-vertical:top;"));break;
case 2: sStyle.Append(_T("mso-position-vertical:center;"));break;
case 3: sStyle.Append(_T("mso-position-vertical:bottom;"));break;
case 4: sStyle.Append(_T("mso-position-vertical:inside;"));break;
case 5: sStyle.Append(_T("mso-position-vertical:outside;"));break;
}
if( PROP_DEF != m_nPositionVPct )
sStyle.AppendFormat(_T("mso-top-percent:%d;"),m_nPositionVPct);
if( PROP_DEF != m_nPositionV && PROP_DEF == m_nPositionVRelative )
m_nPositionVRelative =2;
if( PROP_DEF != m_nPositionVRelative )
{
switch( m_nPositionVRelative )
{
case 0: sStyle.Append(_T("mso-position-vertical-relative:margin;"));break;
case 1: sStyle.Append(_T("mso-position-vertical-relative:page;"));break;
case 2: sStyle.Append(_T("mso-position-vertical-relative:text;"));break;
case 3: sStyle.Append(_T("mso-position-vertical-relative:line;"));break;
case 4: sStyle.Append(_T("mso-position-vertical-relative:top-margin-area;"));break;
case 5: sStyle.Append(_T("mso-position-vertical-relative:bottom-margin-area;"));break;
case 6: sStyle.Append(_T("mso-position-vertical-relative:inner-margin-area;"));break;
case 7: sStyle.Append(_T("mso-position-vertical-relative:outer-margin-area;"));break;
}
}
else
{
switch( m_eYAnchor )
{
case ay_page: sStyle.Append(_T("mso-position-vertical-relative:page;"));break;
case ay_margin: sStyle.Append(_T("mso-position-vertical-relative:margin;"));break;
//case ay_Para: sStyle.Append(_T("mso-position-vertical-relative:text;"));break;
}
}
if( PROP_DEF != m_nPctWidth )
sStyle.AppendFormat(_T("mso-width-percent:%d;"),m_nPctWidth);
switch( m_nPctWidthRelative )
{
case 0:sStyle.Append(_T("mso-width-relative:margin;"));break;
case 1:sStyle.Append(_T("mso-width-relative:page;"));break;
case 2:sStyle.Append(_T("mso-width-relative:left-margin-area;"));break;
case 3:sStyle.Append(_T("mso-width-relative:right-margin-area;"));break;
case 4:sStyle.Append(_T("mso-width-relative:inner-margin-area;"));break;
case 5:sStyle.Append(_T("mso-width-relative:outer-margin-area;"));break;
}
if( PROP_DEF != m_nPctHeight )
sStyle.AppendFormat(_T("mso-height-percent:%d;"),m_nPctHeight);
switch( m_nPctHeightRelative )
{
case 0:sStyle.Append(_T("mso-height-relative:margin;"));break;
case 1:sStyle.Append(_T("mso-height-relative:page;"));break;
case 2:sStyle.Append(_T("mso-height-relative:top-margin-area;"));break;
case 3:sStyle.Append(_T("mso-height-relative:bottom-margin-area;"));break;
case 4:sStyle.Append(_T("mso-height-relative:inner-margin-area;"));break;
case 5:sStyle.Append(_T("mso-height-relative:outer-margin-area;"));break;
}
if( PROP_DEF != m_nRotation )
sStyle.AppendFormat(_T("rotation:%d;"),m_nRotation / 65536 );
else if( PROP_DEF != m_nRelRotation )
sStyle.AppendFormat(_T("rotation:%d;"),m_nRelRotation / 65536 );
int nZIndex = PROP_DEF;
if( PROP_DEF != m_nRelZOrder )
nZIndex = m_nRelZOrder;
else if( PROP_DEF != m_nZOrder )
nZIndex = m_nZOrder;
else
nZIndex = 100; //íà ñâîå óñìîòðåíèå ñòàâëþ 100
if( PROP_DEF != m_nZOrderRelative )
{
//áåðåì áîëüøîå çíà÷åíèå ÷òîáû ñäåëàòü ñòðîãî âûøå èëè íèæå òåêñòà
if( 0 == m_nZOrderRelative )
sStyle.AppendFormat( _T("z-index:%d;"), 10000 + nZIndex );//Text is below shape
else
sStyle.AppendFormat( _T("z-index:%d;"), -10000 + nZIndex );//Shape is below text
}
else
sStyle.AppendFormat( _T("z-index:%d;"), nZIndex );
if( PROP_DEF != m_nWrapDistLeft )
sStyle.AppendFormat( _T("mso-wrap-distance-left:%fpt;"), RtfUtility::Twip2pt( m_nWrapDistLeft ));
if( PROP_DEF != m_nWrapDistTop )
sStyle.AppendFormat( _T("mso-wrap-distance-top:%fpt;"), RtfUtility::Twip2pt( m_nWrapDistTop ));
if( PROP_DEF != m_nWrapDistRight )
sStyle.AppendFormat( _T("mso-wrap-distance-right:%fpt;"), RtfUtility::Twip2pt( m_nWrapDistRight ));
if( PROP_DEF != m_nWrapDistBottom )
sStyle.AppendFormat( _T("mso-wrap-distance-bottom:%fpt;"), RtfUtility::Twip2pt( m_nWrapDistBottom ));
if( false == sStyle.IsEmpty() )
{
sStyle.Delete( sStyle.GetLength() - 1 );
sResult.AppendFormat( _T(" style=\"%s\""),sStyle );
}
if( PROP_DEF != m_bLayoutInCell )
{
if( 0 == m_bLayoutInCell )
sResult.Append( _T(" o:allowincell=\"false\""));
else
sResult.Append( _T(" o:allowincell=\"true\""));
}
if( PROP_DEF != m_bAllowOverlap )
{
if( 0 == m_bAllowOverlap )
sResult.Append( _T(" o:allowoverlap=\"false\""));
else
sResult.Append( _T(" o:allowoverlap=\"true\""));
}
//Position
//Geometry
CString sAdjust;
if( PROP_DEF != m_nAdjustValue )
{
sAdjust.AppendFormat( _T("%d"),m_nAdjustValue);
if( PROP_DEF != m_nAdjustValue2 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue2);
if( PROP_DEF != m_nAdjustValue3 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue3);
if( PROP_DEF != m_nAdjustValue4 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue4);
if( PROP_DEF != m_nAdjustValue5 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue5);
if( PROP_DEF != m_nAdjustValue6 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue6);
if( PROP_DEF != m_nAdjustValue7 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue7);
if( PROP_DEF != m_nAdjustValue8 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue8);
if( PROP_DEF != m_nAdjustValue9 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue9);
if( PROP_DEF != m_nAdjustValue10 )
{
sAdjust.AppendFormat( _T(",%d"),m_nAdjustValue10);
}
}
}
}
}
}
}
}
}
sResult.AppendFormat( _T(" adj=\"%s\""),sAdjust );
}
//Geometry
if( m_aWrapPoints.GetCount() > 0 )
{
sResult.Append( _T(" wrapcoords=\""));
sResult.AppendFormat( _T("%d"), m_aWrapPoints[0]);
for( int i = 1; i < (int)m_aWrapPoints.GetCount(); i++ )
sResult.AppendFormat( _T(" %d"), m_aWrapPoints[i]);
sResult.Append( _T("\""));
}
if( PROP_DEF != m_nGroupLeft && PROP_DEF != m_nGroupTop )
sResult.AppendFormat( _T(" coordorigin=\"%d,%d\""), m_nGroupLeft, m_nGroupTop);
if( PROP_DEF != m_nGroupLeft && PROP_DEF != m_nGroupTop && PROP_DEF != m_nGroupRight && PROP_DEF != m_nGroupBottom)
sResult.AppendFormat( _T(" coordsize=\"%d,%d\""), m_nGroupRight - m_nGroupLeft, m_nGroupBottom - m_nGroupTop );
if( true == m_bIsOle )
sResult.Append( _T(" o:ole=\"\"") );
if( true == m_bFilled )
sResult.Append( _T(" filled=\"t\"") );
else
sResult.Append( _T(" filled=\"f\"") );
if( true == m_bLine )
sResult.Append( _T(" stroked=\"t\"") );
else
sResult.Append( _T(" stroked=\"f\"") );
if(PROP_DEF != m_nLineWidth)
sResult.AppendFormat( _T(" strokeweight=\"%fpt\""), RtfUtility::Emu2Pt(m_nLineWidth) );
sResult.Append( _T(">") );
if( PROP_DEF != m_nWrapType && 3 != m_nWrapType)
{
sResult.Append( _T("<w10:wrap"));
switch( m_nWrapType )
{
case 1:sResult.Append( _T(" type=\"topAndBottom\""));break;
case 2:sResult.Append( _T(" type=\"square\""));break;
case 3:sResult.Append( _T(" type=\"none\""));break;
case 4:sResult.Append( _T(" type=\"tight\""));break;
case 5:sResult.Append( _T(" type=\"through\""));break;
}
switch( m_nWrapSideType )
{
case 0:sResult.Append( _T(" side=\"both\""));break;
case 1:sResult.Append( _T(" side=\"left\""));break;
case 2:sResult.Append( _T(" side=\"right\""));break;
case 3:sResult.Append( _T(" side=\"largest\""));break;
}
sResult.Append( _T("/>"));
}
//Line
CString sStroke;
if( PROP_DEF != m_nLineStartArrow )
{
switch( m_nLineStartArrow )
{
case 0: sStroke.Append( _T(" startarrow=\"none\"") ); break;
case 1: sStroke.Append( _T(" startarrow=\"block\"") ); break;
case 2: sStroke.Append( _T(" startarrow=\"classic\"") ); break;
case 3: sStroke.Append( _T(" startarrow=\"diamond\"") ); break;
case 4: sStroke.Append( _T(" startarrow=\"oval\"") ); break;
case 5: sStroke.Append( _T(" startarrow=\"open\"") ); break;
case 6: sStroke.Append( _T(" startarrow=\"block\"") ); break;
case 7: sStroke.Append( _T(" startarrow=\"block\"") ); break;
}
}
if( PROP_DEF != m_nLineStartArrowLength )
{
switch( m_nLineStartArrowLength )
{
case 0: sStroke.Append( _T(" startarrowlength=\"short\"") ); break;
case 1: sStroke.Append( _T(" startarrowlength=\"medium\"") ); break;
case 2: sStroke.Append( _T(" startarrowlength=\"long\"") ); break;
}
}
if( PROP_DEF != m_nLineStartArrowWidth )
{
switch( m_nLineStartArrowWidth )
{
case 0: sStroke.Append( _T(" startarrowwidth=\"narrow\"") ); break;
case 1: sStroke.Append( _T(" startarrowwidth=\"medium\"") ); break;
case 2: sStroke.Append( _T(" startarrowwidth=\"wide\"") ); break;
}
}
if( PROP_DEF != m_nLineEndArrow )
{
switch( m_nLineEndArrow )
{
case 0: sStroke.Append( _T(" endarrow=\"none\"") ); break;
case 1: sStroke.Append( _T(" endarrow=\"block\"") ); break;
case 2: sStroke.Append( _T(" endarrow=\"classic\"") ); break;
case 3: sStroke.Append( _T(" endarrow=\"diamond\"") ); break;
case 4: sStroke.Append( _T(" endarrow=\"oval\"") ); break;
case 5: sStroke.Append( _T(" endarrow=\"open\"") ); break;
case 6: sStroke.Append( _T(" endarrow=\"block\"") ); break;
case 7: sStroke.Append( _T(" endarrow=\"block\"") ); break;
}
}
if( PROP_DEF != m_nLineEndArrowLength )
{
switch( m_nLineEndArrowLength )
{
case 0: sStroke.Append( _T(" endarrowlength=\"short\"") ); break;
case 1: sStroke.Append( _T(" endarrowlength=\"medium\"") ); break;
case 2: sStroke.Append( _T(" endarrowlength=\"long\"") ); break;
}
}
if( PROP_DEF != m_nLineEndArrowWidth )
{
switch( m_nLineEndArrowWidth )
{
case 0: sStroke.Append( _T(" endarrowwidth=\"narrow\"") ); break;
case 1: sStroke.Append( _T(" endarrowwidth=\"medium\"") ); break;
case 2: sStroke.Append( _T(" endarrowwidth=\"wide\"") ); break;
}
}
if( false == sStroke.IsEmpty() )
sResult.AppendFormat( _T("<v:stroke %s/>"), sStroke );
if( 0 != m_aTextItems )
{
RenderParameter oNewParam = oRenderParameter;
oNewParam.nType = RENDER_TO_OOX_PARAM_UNKNOWN;
sResult.AppendFormat( _T("<v:textbox inset=\"%.2fpt,%.2fpt,%.2fpt,%.2fpt\">"), RtfUtility::Emu2Pt(m_nTexpLeft), RtfUtility::Emu2Pt(m_nTexpTop), RtfUtility::Emu2Pt(m_nTexpRight), RtfUtility::Emu2Pt(m_nTexpBottom) );
sResult.Append( _T("<w:txbxContent>") );
sResult.Append( m_aTextItems->RenderToOOX(oNewParam) );
sResult.Append( _T("</w:txbxContent>") );
sResult.Append( _T("</v:textbox>") );
}
if( m_oPicture != 0 )
{
int nCropLeft = PROP_DEF;
int nCropTop = PROP_DEF;
int nCropRight = PROP_DEF;
int nCropBottom = PROP_DEF;
if( PROP_DEF != m_nCropFromLeft )
nCropLeft = m_nCropFromLeft;
else if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nCropL )
nCropLeft = (int)( 65536 * ( 1.0 * m_oPicture->m_nCropL / m_oPicture->m_nWidthGoal) ); //This numeric value can also be specified in 1/65536-ths if a trailing "f" is supplied
if( PROP_DEF != m_nCropFromTop )
nCropTop = m_nCropFromTop;
else if( PROP_DEF != m_oPicture->m_nHeightGoal && PROP_DEF != m_oPicture->m_nCropT )
nCropTop = (int)( 65536 * ( 1.0 * m_oPicture->m_nCropT / m_oPicture->m_nHeightGoal) );
if( PROP_DEF != m_nCropFromRight )
nCropRight = m_nCropFromRight;
else if( PROP_DEF != m_oPicture->m_nWidthGoal && PROP_DEF != m_oPicture->m_nCropR )
nCropRight = (int)( 65536 * ( 1.0 * m_oPicture->m_nCropR / m_oPicture->m_nWidthGoal) );
if( PROP_DEF != m_nCropFromBottom )
nCropBottom = m_nCropFromBottom;
else if( PROP_DEF != m_oPicture->m_nHeightGoal && PROP_DEF != m_oPicture->m_nCropB )
nCropBottom = (int)( 65536 * ( 1.0 * m_oPicture->m_nCropB / m_oPicture->m_nHeightGoal) );
CString sPicture = m_oPicture->RenderToOOX(oRenderParameter);
if( _T("") == sPicture )//åñëè íå ñîõðàíèëàñü êàðòèíêà, òî âåñü shape áóäåò áåñïîëåçíûì
return _T("");
sResult.AppendFormat( _T("<v:imagedata r:id=\"%s\""), sPicture );
if( PROP_DEF != nCropLeft )
sResult.AppendFormat( _T(" cropleft=\"%df\""), nCropLeft );
if( PROP_DEF != nCropTop )
sResult.AppendFormat( _T(" croptop=\"%df\""), nCropTop );
if( PROP_DEF != nCropRight )
sResult.AppendFormat( _T(" cropright=\"%df\""), nCropRight );
if( PROP_DEF != nCropBottom )
sResult.AppendFormat( _T(" cropbottom=\"%df\""), nCropBottom );
sResult.Append( _T(" o:title=\"\"/>") );
}
return sResult;
}
CString RtfShape::RenderToOOXEnd(RenderParameter oRenderParameter)
{
CString sResult;
if( _T("") == oRenderParameter.sValue )
sResult.Append( _T("</v:shape>") );
else
sResult.AppendFormat( _T("</%s>"), oRenderParameter.sValue );
if( RENDER_TO_OOX_PARAM_SHAPE_WSHAPE2 == oRenderParameter.nType )
;
else if( RENDER_TO_OOX_PARAM_SHAPE_WSHAPE == oRenderParameter.nType )
sResult.Append(_T("</w:pict>"));
else
sResult.Append(_T("</w:pict></w:r>"));//ðàáîòàåò ïî óìîë÷àíèþ
return sResult;
}
CString RtfShapeGroup::RenderToRtf(RenderParameter oRenderParameter)
{
return RtfShape::RenderToRtf( oRenderParameter );
}
CString RtfShapeGroup::RenderToOOX(RenderParameter oRenderParameter)
{
CString sResult;
RenderParameter oNewParamGroup = oRenderParameter;
oNewParamGroup.sValue = _T("v:group");
RenderParameter oNewParamShape = oRenderParameter;
oNewParamShape.sValue = _T("v:shape");
sResult = RenderToOOXBegin( oNewParamGroup );
for( int i = 0; i < (int)m_aArray.GetCount(); i++ )
sResult.Append( m_aArray[i]->RenderToOOX( oNewParamShape ) );
sResult.Append( RenderToOOXEnd( oNewParamGroup ) );
return sResult;
}