You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by cl...@apache.org on 2014/03/13 10:05:31 UTC
svn commit: r1577071 [2/2] - in /openoffice/branches/ooxml/main:
filter/inc/filter/msfilter/ filter/source/msfilter/ oox/inc/oox/export/
oox/source/export/ sc/inc/ sc/source/filter/excel/ sc/source/filter/inc/
sc/source/filter/xcl97/
Modified: openoffice/branches/ooxml/main/sc/source/filter/xcl97/xcl97rec.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/ooxml/main/sc/source/filter/xcl97/xcl97rec.cxx?rev=1577071&r1=1577070&r2=1577071&view=diff
==============================================================================
--- openoffice/branches/ooxml/main/sc/source/filter/xcl97/xcl97rec.cxx (original)
+++ openoffice/branches/ooxml/main/sc/source/filter/xcl97/xcl97rec.cxx Thu Mar 13 09:05:31 2014
@@ -19,8 +19,6 @@
*
*************************************************************/
-
-
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
@@ -86,17 +84,17 @@ using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::beans::XPropertySet;
using ::com::sun::star::drawing::XShape;
-
+using oox::vml::VMLExport;
using ::oox::drawingml::ShapeExport;
using ::oox::drawingml::DrawingML;
-int XclExpObjList::mnDrawingMLCount=0;
-int XclExpObjList::mnVmlCount=0;
+sal_uInt32 XclExpObjList::mnDrawingMLCount = 0;
+sal_uInt32 XclExpObjList::mnVmlCount = 0;
void XclExpObjList::ResetCounters()
{
- mnDrawingMLCount = 0;
- mnVmlCount = 0;
+ mnDrawingMLCount = 0;
+ mnVmlCount = 0;
}
// ============================================================================
@@ -175,11 +173,24 @@ static bool IsVmlObject( const XclObj& r
}
}
-static void SaveDrawingMLObjects( XclExpObjList& rList, XclExpXmlStream& rStrm, int& nDrawingMLCount )
+static sal_Int32 GetVmlObjectCount( XclExpObjList& rList )
{
-
+ sal_Int32 nNumVml = 0;
+
+ for ( XclObj* p = rList.First(); p; p = rList.Next() )
+ if( IsVmlObject( *p ) )
+ ++nNumVml;
+
+ return nNumVml;
+}
- sal_Int32 nDrawing = ++nDrawingMLCount;
+static void SaveDrawingMLObjects( XclExpObjList& rList, XclExpXmlStream& rStrm, sal_uInt32& nDrawingMLCount )
+{
+ sal_uInt32 nVmlObjects = GetVmlObjectCount( rList );
+ if ( (rList.Count() - nVmlObjects) == 0 )
+ return;
+
+ sal_uInt32 nDrawing = ++nDrawingMLCount;
OUString sId;
sax_fastparser::FSHelperPtr pDrawing = rStrm.CreateOutputStream(
XclXmlUtils::GetStreamName( "xl/", "drawings/drawing", nDrawing ),
@@ -202,8 +213,7 @@ static void SaveDrawingMLObjects( XclExp
for ( XclObj* p = rList.First(); p; p = rList.Next() )
{
- // if( p->GetObjType() != 0 ) //zhaosz_xml, obj is a group
- if( IsVmlObject( *p ) || p->GetObjType()==0)
+ if( p->GetObjType() != 0 )
continue;
p->SaveXml( rStrm );
}
@@ -213,9 +223,46 @@ static void SaveDrawingMLObjects( XclExp
rStrm.PopStream();
}
+static void SaveVmlObjects( XclExpObjList& rList, XclExpXmlStream& rStrm, sal_uInt32& nVmlCount )
+{
+ if( GetVmlObjectCount( rList ) == 0 )
+ return;
+
+ sal_uInt32 nDrawing = ++nVmlCount;
+ OUString sId;
+ sax_fastparser::FSHelperPtr pVmlDrawing = rStrm.CreateOutputStream(
+ XclXmlUtils::GetStreamName( "xl/", "drawings/vmlDrawing", nDrawing ),
+ XclXmlUtils::GetStreamName( "../", "drawings/vmlDrawing", nDrawing ),
+ rStrm.GetCurrentStream()->getOutputStream(),
+ "application/vnd.openxmlformats-officedocument.vmlDrawing",
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
+ &sId );
+
+ rStrm.GetCurrentStream()->singleElement( XML_legacyDrawing,
+ FSNS( XML_r, XML_id ), XclXmlUtils::ToOString( sId ).getStr(),
+ FSEND );
+
+ rStrm.PushStream( pVmlDrawing );
+ pVmlDrawing->startElement( XML_xml,
+ FSNS( XML_xmlns, XML_v ), "urn:schemas-microsoft-com:vml",
+ FSNS( XML_xmlns, XML_o ), "urn:schemas-microsoft-com:office:office",
+ FSNS( XML_xmlns, XML_x ), "urn:schemas-microsoft-com:office:excel",
+ FSEND );
+
+ for ( XclObj* p = rList.First(); p; p = rList.Next() )
+ {
+ if( !IsVmlObject( *p ) )
+ continue;
+ p->SaveXml( rStrm );
+ }
+
+ pVmlDrawing->endElement( XML_xml );
+
+ rStrm.PopStream();
+}
+
void XclExpObjList::SaveXml( XclExpXmlStream& rStrm )
{
-
if( pSolverContainer )
pSolverContainer->SaveXml( rStrm );
@@ -223,8 +270,7 @@ void XclExpObjList::SaveXml( XclExpXmlSt
return;
SaveDrawingMLObjects( *this, rStrm, mnDrawingMLCount );
- //SaveVmlObjects( *this, rStrm, mnVmlCount );
-
+ SaveVmlObjects( *this, rStrm, mnVmlCount );
}
// --- class XclObj --------------------------------------------------
@@ -366,11 +412,16 @@ void XclObj::SaveTextRecs( XclExpStream&
// --- class XclObjComment -------------------------------------------
-XclObjComment::XclObjComment( XclExpObjectManager& rObjMgr, const Rectangle& rRect, const EditTextObject& rEditObj, SdrObject* pCaption, bool bVisible ) :
- XclObj( rObjMgr, EXC_OBJTYPE_NOTE, true )
+XclObjComment::XclObjComment( XclExpObjectManager& rObjMgr, const Rectangle& rRect, const EditTextObject& rEditObj,
+ SdrObject* pCaption, bool bVisible, const ScAddress& rAddress, Rectangle &rStart, Rectangle &rEnd )
+ : XclObj( rObjMgr, EXC_OBJTYPE_NOTE, true )
+ , maAnchorCell( rAddress )
+ , mpCaption( static_cast<SdrCaptionObj*>(pCaption->Clone()) )
+ , mbVisible( bVisible )
+ , maStart( rStart )
+ , maEnd( rEnd )
{
- ProcessEscherObj( rObjMgr.GetRoot(), rRect, pCaption, bVisible);
- // TXO
+ // TXO
pTxo = new XclTxo( rObjMgr.GetRoot(), rEditObj, pCaption );
}
@@ -379,7 +430,7 @@ void XclObjComment::ProcessEscherObj( co
Reference<XShape> aXShape;
EscherPropertyContainer aPropOpt;
- if(pCaption)
+ if ( pCaption )
{
aXShape = GetXShapeForSdrObject(pCaption);
Reference< XPropertySet > aXPropSet( aXShape, UNO_QUERY );
@@ -388,20 +439,20 @@ void XclObjComment::ProcessEscherObj( co
aPropOpt.CreateFillProperties( aXPropSet, sal_True);
aPropOpt.AddOpt( ESCHER_Prop_lTxid, 0 ); // undocumented
- aPropOpt.AddOpt( 0x0158, 0x00000000 ); // undocumented
+ aPropOpt.AddOpt( 0x0158, 0x00000000 ); // undocumented
sal_uInt32 nValue = 0;
- if(!aPropOpt.GetOpt( ESCHER_Prop_FitTextToShape, nValue ))
- aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x00080008 ); // bool field
+ if( !aPropOpt.GetOpt( ESCHER_Prop_FitTextToShape, nValue ) )
+ aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x00080008 ); // bool field
- if(aPropOpt.GetOpt( ESCHER_Prop_fillColor, nValue ))
+ if( aPropOpt.GetOpt( ESCHER_Prop_fillColor, nValue ) )
{
// If the Colour is the same as the 'ToolTip' System colour then
// use the default rather than the explicit colour value. This will
// be incorrect where user has chosen to use this colour explicity.
Color aColor = Color( (sal_uInt8)nValue, (sal_uInt8)( nValue >> 8 ), (sal_uInt8)( nValue >> 16 ) );
const StyleSettings& rSett = Application::GetSettings().GetStyleSettings();
- if(aColor == rSett.GetHelpColor().GetColor())
+ if( aColor == rSett.GetHelpColor().GetColor() )
{
aPropOpt.AddOpt( ESCHER_Prop_fillColor, 0x08000050 );
aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x08000050 );
@@ -412,11 +463,11 @@ void XclObjComment::ProcessEscherObj( co
if(!aPropOpt.GetOpt( ESCHER_Prop_fillBackColor, nValue ))
aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x08000050 );
- if(!aPropOpt.GetOpt( ESCHER_Prop_fNoFillHitTest, nValue ))
+ if(!aPropOpt.GetOpt( ESCHER_Prop_fNoFillHitTest, nValue ) )
aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x00110010 ); // bool field
- if(!aPropOpt.GetOpt( ESCHER_Prop_shadowColor, nValue ))
+ if(!aPropOpt.GetOpt( ESCHER_Prop_shadowColor, nValue ) )
aPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x00000000 );
- if(!aPropOpt.GetOpt( ESCHER_Prop_fshadowObscured, nValue )) // bool field
+ if(!aPropOpt.GetOpt( ESCHER_Prop_fshadowObscured, nValue ) ) // bool field
aPropOpt.AddOpt( ESCHER_Prop_fshadowObscured, 0x00030003 ); // bool field
}
}
@@ -448,8 +499,168 @@ XclObjComment::~XclObjComment()
void XclObjComment::Save( XclExpStream& rStrm )
{
- // content of this record
- XclObj::Save( rStrm );
+ // content of this record
+ XclObj::Save( rStrm );
+}
+
+class OoxmlCommentExporter : public VMLExport
+{
+ ScAddress maCellAddr;
+ SdrCaptionObj* mpCapObj;
+ sal_Bool mbVisible;
+ Rectangle maStart;
+ Rectangle maEnd;
+ sal_uInt8 mnTHA; /// text horizontal adjust
+ sal_uInt8 mnTVA; /// text vertical adjust
+ sal_Bool mbLocked; /// Text box locked or not. Not for text
+
+public:
+ OoxmlCommentExporter ( sax_fastparser::FSHelperPtr p, ScAddress aScPos, SdrCaptionObj* pCaption,
+ const XclTxo* pTxo, sal_Bool bVisible, Rectangle &aStart, Rectangle &aEnd );
+protected:
+ virtual void Commit( EscherPropertyContainer& rPropOpt, const Rectangle& rRect );
+using VMLExport::StartShape;
+ virtual sal_Int32 StartShape();
+using VMLExport::EndShape;
+ virtual void EndShape( sal_Int32 nShapeElement );
+};
+
+OoxmlCommentExporter::OoxmlCommentExporter( sax_fastparser::FSHelperPtr p, ScAddress aCellAddr,
+ SdrCaptionObj* pCaption, const XclTxo* pTxo, sal_Bool bVisible,
+ Rectangle &aStart, Rectangle &aEnd )
+ // Pass the shape type and flay to VMLExport. Will be used on exporting(VMLExport::StartShape)
+ : VMLExport( p, ESCHER_ShpInst_TextBox, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ),
+ maCellAddr( aCellAddr ),
+ mpCapObj( pCaption ),
+ mbVisible( bVisible ),
+ maStart( aStart ),
+ maEnd( aEnd ),
+ mnTHA( pTxo ? pTxo->GetHorAlign() : 0 ),
+ mnTVA( pTxo ? pTxo->GetVerAlign() : 0 ),
+ mbLocked(sal_False)
+{
+}
+
+void OoxmlCommentExporter::Commit( EscherPropertyContainer& rPropOpt, const Rectangle& rRect )
+{
+ if ( mpCapObj )
+ {
+ Reference< XShape > aXShape = GetXShapeForSdrObject( mpCapObj );
+ Reference< XPropertySet > aXPropSet( aXShape, UNO_QUERY );
+ if ( aXPropSet.is() )
+ {
+ rPropOpt.CreateFillProperties( aXPropSet, sal_True, sal_False, sal_False );
+ rPropOpt.CreateProtectionProperties( aXPropSet );
+ rPropOpt.CreateTextProperties( aXPropSet, 0, sal_False, sal_False, sal_False );
+ // If not visible, add hidden property below. If not added, default is visible.
+ if ( !mbVisible )
+ rPropOpt.AddOpt( ESCHER_Prop_fHidden, 1 );
+
+ rPropOpt.AddOpt( ESCHER_Prop_lTxid, 0 );
+ rPropOpt.AddOpt( 0x0158, 0x00000000 );
+
+ sal_uInt32 nValue = 0;
+ if( !rPropOpt.GetOpt( ESCHER_Prop_FitTextToShape, nValue ) )
+ rPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x00080008 );
+ if( !rPropOpt.GetOpt( ESCHER_Prop_fillBackColor, nValue ) )
+ rPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x08000050 );
+ if( !rPropOpt.GetOpt( ESCHER_Prop_fNoFillHitTest, nValue ) )
+ rPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x00110010 );
+ if( !rPropOpt.GetOpt( ESCHER_Prop_shadowColor, nValue ) )
+ rPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x00000000 );
+ if( !rPropOpt.GetOpt( ESCHER_Prop_fshadowObscured, nValue ) )
+ rPropOpt.AddOpt( ESCHER_Prop_fshadowObscured, 0x00030003 );
+ }
+ }
+
+ sal_uInt32 nFlags = 0x000A0000;
+ ::set_flag( nFlags, sal_uInt32(2), !mbVisible );
+ rPropOpt.AddOpt( ESCHER_Prop_fPrint, nFlags );
+
+ // aoo size lock + pos lock = Excel Lock
+ // Hesitate to add "mbLocked" to VmlExporter or not. Seems all client(EndShape) info will be kept by self.
+ sal_uInt32 nPosLock = 0, nSizeLock = 0;
+ rPropOpt.GetOpt( ESCHER_Prop_LockAdjustHandles, nSizeLock );
+ rPropOpt.GetOpt( ESCHER_Prop_LockPosition, nPosLock );
+ mbLocked = nPosLock && nSizeLock;
+
+ VMLExport::Commit( rPropOpt, rRect );
+}
+
+sal_Int32 OoxmlCommentExporter::StartShape()
+{
+ sal_Int32 nId = VMLExport::StartShape();
+ return nId;
+}
+
+void OoxmlCommentExporter::EndShape( sal_Int32 nShapeElement )
+{
+ char pAnchorPos[128];
+ sax_fastparser::FSHelperPtr pVmlDrawing = GetFS();
+ // add a fixed shadow for Excel comments
+ pVmlDrawing->singleElement( FSNS( XML_v, XML_shadow ),
+ XML_on, "t", XML_color, "black", XML_obscured, "t", FSEND );
+
+ snprintf( pAnchorPos, 128, "%ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld",
+ maStart.Left(), maStart.Top(), maStart.Right(), maStart.Bottom(),
+ maEnd.Left(), maEnd.Top(), maEnd.Right(), maEnd.Bottom() );
+
+ pVmlDrawing->startElement( FSNS( XML_x, XML_ClientData ), XML_ObjectType, "Note", FSEND );
+ pVmlDrawing->singleElement( FSNS( XML_x, XML_MoveWithCells ), FSEND );
+ pVmlDrawing->singleElement( FSNS( XML_x, XML_SizeWithCells ), FSEND );
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_Anchor ), pAnchorPos );
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_AutoFill ), "False" );
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_Row ), maCellAddr.Row() );
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_Column ), sal_Int32( maCellAddr.Col() ) );
+ // Text cannot be locked. If omitting this prop, text will be locked defaultly.
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_LockText ), "False" );
+ // for this text box lock. Default is true
+ if( !mbLocked ) //Only if position and size lock both be set, it will be true.
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_Locked ), "False" );
+ switch(mnTHA)
+ {
+ case EXC_OBJ_HOR_CENTER:
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_TextHAlign), "Center" );
+ break;
+ case EXC_OBJ_HOR_RIGHT:
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_TextHAlign), "Right" );
+ break;
+ case EXC_OBJ_HOR_JUSTIFY:
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_TextHAlign), "Justify" );
+ break;
+ case EXC_OBJ_HOR_LEFT://default is break
+ default:
+ break;
+ }
+ switch( mnTVA )
+ {
+ case EXC_OBJ_VER_CENTER:
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_TextVAlign), "Center" );
+ break;
+ case EXC_OBJ_VER_BOTTOM:
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_TextVAlign), "Bottom" );
+ break;
+ case EXC_OBJ_VER_JUSTIFY:
+ XclXmlUtils::WriteElement( pVmlDrawing, FSNS( XML_x, XML_TextVAlign), "Justify" );
+ break;
+ case EXC_OBJ_VER_TOP://default is break
+ default:
+ break;
+ }
+ // If omitted, the comment is assumed to be invisible. If this
+ // element is specified without a value, it is assumed to be true. cannot write true for this element.
+ // Or 2007 will hide it on right-clicking the cell
+ if( mbVisible )
+ pVmlDrawing->singleElement( FSNS( XML_x, XML_Visible ), FSEND );
+ pVmlDrawing->endElement( FSNS( XML_x, XML_ClientData ) );
+
+ VMLExport::EndShape( nShapeElement );
+}
+
+void XclObjComment::SaveXml( XclExpXmlStream& rStrm )
+{
+ OoxmlCommentExporter aCommentExporter( rStrm.GetCurrentStream(), maAnchorCell, mpCaption.get(), pTxo, mbVisible, maStart, maEnd );
+ aCommentExporter.AddSdrObject( *mpCaption );
}
// --- class XclObjDropDown ------------------------------------------