summaryrefslogtreecommitdiff
path: root/svx/source/msfilter/msdffimp.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/msfilter/msdffimp.cxx')
-rw-r--r--svx/source/msfilter/msdffimp.cxx7996
1 files changed, 0 insertions, 7996 deletions
diff --git a/svx/source/msfilter/msdffimp.cxx b/svx/source/msfilter/msdffimp.cxx
index fe00bcebb9..e69de29bb2 100644
--- a/svx/source/msfilter/msdffimp.cxx
+++ b/svx/source/msfilter/msdffimp.cxx
@@ -1,7996 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: msdffimp.cxx,v $
- * $Revision: 1.157 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_svx.hxx"
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
-#include <com/sun/star/embed/Aspects.hpp>
-
-#include <math.h>
-#include <limits.h>
-#include <vector>
-#include <osl/endian.h>
-#include <tools/solar.h> // UINTXX
-#include <rtl/math.hxx>
-
-#include <sot/clsids.hxx>
-#include <toolkit/helper/vclunohelper.hxx>
-#include <unotools/streamwrap.hxx>
-#include <comphelper/processfactory.hxx>
-#include <sot/exchange.hxx>
-#include <sot/storinfo.hxx>
-#include <vcl/cvtgrf.hxx>
-
-#include "viscache.hxx"
-
-// SvxItem-Mapping. Wird benoetigt um die SvxItem-Header erfolgreich zu includen
-#include <svx/eeitem.hxx>
-#ifndef _EDITDATA_HXX
-#include <svx/editdata.hxx>
-#endif
-
-#include <svtools/urihelper.hxx>
-
-// textitem.hxx editdata.hxx
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// paraitem.hxx editdata.hxx
-
-
-#include <tools/stream.hxx>
-#include <tools/debug.hxx>
-#ifndef _TOOLS_ZCODEC_HXX
-#include <tools/zcodec.hxx>
-#endif
-#ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX
-#include <unotools/ucbstreamhelper.hxx>
-#endif
-#include <unotools/localfilehelper.hxx>
-#include <svx/escherex.hxx>
-#include <basegfx/range/b2drange.hxx>
-#include <com/sun/star/container/XIdentifierContainer.hpp>
-#include <com/sun/star/drawing/XGluePointsSupplier.hpp>
-#include <com/sun/star/drawing/Position3D.hpp>
-#include <com/sun/star/drawing/Direction3D.hpp>
-#include <com/sun/star/drawing/GluePoint2.hpp>
-#include <com/sun/star/drawing/XShapes.hpp>
-#include <svx/charscaleitem.hxx>
-#include <svx/kernitem.hxx>
-#include <svtools/filter.hxx>
-#include <tools/string.hxx>
-#ifndef _TOOLS_URLOBJ_HXX
-#include <tools/urlobj.hxx>
-#endif
-#include <vcl/virdev.hxx>
-#include <vcl/bmpacc.hxx>
-#ifndef _SVSTOR_HXX //autogen
-#include <sot/storage.hxx>
-#endif
-#include <sfx2/docfac.hxx>
-#include <sfx2/docfilt.hxx>
-#include <sfx2/docfile.hxx>
-#include <sfx2/fcontnr.hxx>
-#include <sfx2/module.hxx>
-//#ifndef _SFX_INTERNO_HXX
-//#include <sfx2/interno.hxx>
-//#endif
-
-#ifndef _SDGCPITM_HXX
-
-//#endif
-#include <svx/sdgcpitm.hxx>
-#endif
-#include <svx/sdgmoitm.hxx>
-#include <svx/tstpitem.hxx>
-#include <svx/fmmodel.hxx>
-#include <svx/svdmodel.hxx>
-#include <svx/svdobj.hxx>
-#include <svx/svdpage.hxx>
-#include <svx/svdogrp.hxx>
-#include <svx/svdograf.hxx>
-#include <svx/svdotext.hxx>
-#include <svx/svdorect.hxx>
-#ifndef _SVDOCAPT_HXX
-#include <svx/svdocapt.hxx>
-#endif
-#include <svx/svdoedge.hxx>
-#include <svx/svdocirc.hxx>
-#include <svx/svdoutl.hxx>
-#include <svx/svdoole2.hxx>
-#include <svx/svdopath.hxx>
-#include <svx/frmdir.hxx>
-#include <svx/frmdiritem.hxx>
-#include <svx/svdtrans.hxx>
-#include <svx/sxenditm.hxx>
-#include <svx/sdgluitm.hxx>
-#include <svx/fhgtitem.hxx>
-#include <svx/wghtitem.hxx>
-#include <svx/postitem.hxx>
-#include <svx/udlnitem.hxx>
-#include <svx/crsditem.hxx>
-#include <svx/shdditem.hxx>
-#include <fontitem.hxx>
-#include <svx/colritem.hxx>
-#include <svx/sxekitm.hxx>
-#include <bulitem.hxx>
-#include <svx/polysc3d.hxx>
-#include <svx/extrud3d.hxx>
-#include "svditer.hxx"
-#include <svx/xpoly.hxx>
-#include "xattr.hxx"
-
-#ifndef _IMPGRF_HXX //autogen
-#include "impgrf.hxx"
-#endif
-#include <svx/msdffimp.hxx> // extern sichtbare Header-Datei
-#include <svx/outliner.hxx>
-#include <svx/outlobj.hxx>
-#include <svx/editobj.hxx>
-#include <svx/editeng.hxx>
-#include "msashape.hxx"
-#include "msashape3d.hxx"
-#include "gallery.hxx"
-#include <com/sun/star/drawing/ShadeMode.hpp>
-#include <svtools/itempool.hxx>
-#include <vcl/svapp.hxx>
-#include <svx/svx3ditems.hxx>
-#include <svx/svdoashp.hxx>
-#include <svx/sdasaitm.hxx>
-#ifndef _UCBHELPER_CONTENT_HXX_
-#include <ucbhelper/content.hxx>
-#endif
-#ifndef _UCBHELPER_CONTENTBROKER_HXX_
-#include <ucbhelper/contentbroker.hxx>
-#endif
-#include <vos/xception.hxx>
-#ifndef _VOS_NO_NAMESPACE
-using namespace vos;
-#endif
-#include "../customshapes/EnhancedCustomShapeTypeNames.hxx"
-#include "../customshapes/EnhancedCustomShapeGeometry.hxx"
-#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeGluePointType.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeTextFrame.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
-#include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp>
-#ifndef __com_sun_star_beans_PropertyValues_hpp__
-#include <com/sun/star/beans/PropertyValues.hpp>
-#endif
-#include <com/sun/star/drawing/ProjectionMode.hpp>
-#include "../customshapes/EnhancedCustomShape2d.hxx"
-
-using namespace ::com::sun::star ;
-using namespace ::com::sun::star::drawing;
-using namespace uno ;
-using namespace beans ;
-using namespace drawing ;
-using namespace container ;
-
-#define ITEMVALUE(ItemSet,Id,Cast) ((const Cast&)(ItemSet).Get(Id)).GetValue()
-
-// static counter for OLE-Objects
-static sal_uInt32 nMSOleObjCntr = 0;
-#define MSO_OLE_Obj "MSO_OLE_Obj"
-
-
-/*************************************************************************/
-BOOL Impl_OlePres::Read( SvStream & rStm )
-{
- ULONG nBeginPos = rStm.Tell();
- INT32 n;
- rStm >> n;
- if( n != -1 )
- {
- pBmp = new Bitmap;
- rStm >> *pBmp;
- if( rStm.GetError() == SVSTREAM_OK )
- {
- nFormat = FORMAT_BITMAP;
- aSize = pBmp->GetPrefSize();
- MapMode aMMSrc;
- if( !aSize.Width() || !aSize.Height() )
- {
- // letzte Chance
- aSize = pBmp->GetSizePixel();
- aMMSrc = MAP_PIXEL;
- }
- else
- aMMSrc = pBmp->GetPrefMapMode();
- MapMode aMMDst( MAP_100TH_MM );
- aSize = OutputDevice::LogicToLogic( aSize, aMMSrc, aMMDst );
- return TRUE;
- }
- else
- {
- delete pBmp;
- pBmp = NULL;
-
- pMtf = new GDIMetaFile();
- rStm.ResetError();
- rStm >> *pMtf;
- if( rStm.GetError() == SVSTREAM_OK )
- {
- nFormat = FORMAT_GDIMETAFILE;
- aSize = pMtf->GetPrefSize();
- MapMode aMMSrc = pMtf->GetPrefMapMode();
- MapMode aMMDst( MAP_100TH_MM );
- aSize = OutputDevice::LogicToLogic( aSize, aMMSrc, aMMDst );
- return TRUE;
- }
- else
- {
- delete pMtf;
- pMtf = NULL;
- }
- }
-
- }
-
- rStm.ResetError();
- rStm.Seek( nBeginPos );
- nFormat = ReadClipboardFormat( rStm );
- // JobSetup, bzw. TargetDevice ueberlesen
- // Information aufnehmen, um sie beim Schreiben nicht zu verlieren
- nJobLen = 0;
- rStm >> nJobLen;
- if( nJobLen >= 4 )
- {
- nJobLen -= 4;
- if( nJobLen )
- {
- pJob = new BYTE[ nJobLen ];
- rStm.Read( pJob, nJobLen );
- }
- }
- else
- {
- rStm.SetError( SVSTREAM_GENERALERROR );
- return FALSE;
- }
- UINT32 nAsp;
- rStm >> nAsp;
- USHORT nSvAsp = USHORT( nAsp );
- SetAspect( nSvAsp );
- rStm.SeekRel( 4 ); //L-Index ueberlesen
- rStm >> nAdvFlags;
- rStm.SeekRel( 4 ); //Compression
- UINT32 nWidth = 0;
- UINT32 nHeight = 0;
- UINT32 nSize = 0;
- rStm >> nWidth >> nHeight >> nSize;
- aSize.Width() = nWidth;
- aSize.Height() = nHeight;
-
- if( nFormat == FORMAT_GDIMETAFILE )
- {
- pMtf = new GDIMetaFile();
- ReadWindowMetafile( rStm, *pMtf, NULL );
- }
- else if( nFormat == FORMAT_BITMAP )
- {
- pBmp = new Bitmap();
- rStm >> *pBmp;
- }
- else
- {
- BYTE * p = new BYTE[ nSize ];
- rStm.Read( p, nSize );
- delete p;
- return FALSE;
- }
- return TRUE;
-}
-
-/************************************************************************/
-void Impl_OlePres::Write( SvStream & rStm )
-{
- WriteClipboardFormat( rStm, FORMAT_GDIMETAFILE );
- rStm << (INT32)(nJobLen +4); // immer leeres TargetDevice
- if( nJobLen )
- rStm.Write( pJob, nJobLen );
- rStm << (UINT32)nAspect;
- rStm << (INT32)-1; //L-Index immer -1
- rStm << (INT32)nAdvFlags;
- rStm << (INT32)0; //Compression
- rStm << (INT32)aSize.Width();
- rStm << (INT32)aSize.Height();
- ULONG nPos = rStm.Tell();
- rStm << (INT32)0;
-
- if( GetFormat() == FORMAT_GDIMETAFILE && pMtf )
- {
- // Immer auf 1/100 mm, bis Mtf-Loesung gefunden
- // Annahme (keine Skalierung, keine Org-Verschiebung)
- DBG_ASSERT( pMtf->GetPrefMapMode().GetScaleX() == Fraction( 1, 1 ),
- "X-Skalierung im Mtf" );
- DBG_ASSERT( pMtf->GetPrefMapMode().GetScaleY() == Fraction( 1, 1 ),
- "Y-Skalierung im Mtf" );
- DBG_ASSERT( pMtf->GetPrefMapMode().GetOrigin() == Point(),
- "Origin-Verschiebung im Mtf" );
- MapUnit nMU = pMtf->GetPrefMapMode().GetMapUnit();
- if( MAP_100TH_MM != nMU )
- {
- Size aPrefS( pMtf->GetPrefSize() );
- Size aS( aPrefS );
- aS = OutputDevice::LogicToLogic( aS, nMU, MAP_100TH_MM );
-
- pMtf->Scale( Fraction( aS.Width(), aPrefS.Width() ),
- Fraction( aS.Height(), aPrefS.Height() ) );
- pMtf->SetPrefMapMode( MAP_100TH_MM );
- pMtf->SetPrefSize( aS );
- }
- WriteWindowMetafileBits( rStm, *pMtf );
- }
- else
- {
- DBG_ERROR( "unknown format" );
- }
- ULONG nEndPos = rStm.Tell();
- rStm.Seek( nPos );
- rStm << (UINT32)(nEndPos - nPos - 4);
- rStm.Seek( nEndPos );
-}
-
-Impl_OlePres * CreateCache_Impl( SotStorage * pStor )
-{
- SotStorageStreamRef xOleObjStm =pStor->OpenSotStream( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Ole-Object" ) ),
- STREAM_READ | STREAM_NOCREATE );
- if( xOleObjStm->GetError() )
- return NULL;
- SotStorageRef xOleObjStor = new SotStorage( *xOleObjStm );
- if( xOleObjStor->GetError() )
- return NULL;
-
- String aStreamName;
- if( xOleObjStor->IsContained( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "\002OlePres000" ) ) ) )
- aStreamName = String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "\002OlePres000" ) );
- else if( xOleObjStor->IsContained( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "\1Ole10Native" ) ) ) )
- aStreamName = String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "\1Ole10Native" ) );
-
- if( aStreamName.Len() == 0 )
- return NULL;
-
-
- for( USHORT i = 1; i < 10; i++ )
- {
- SotStorageStreamRef xStm = xOleObjStor->OpenSotStream( aStreamName,
- STREAM_READ | STREAM_NOCREATE );
- if( xStm->GetError() )
- break;
-
- xStm->SetBufferSize( 8192 );
- Impl_OlePres * pEle = new Impl_OlePres( 0 );
- if( pEle->Read( *xStm ) && !xStm->GetError() )
- {
- if( pEle->GetFormat() == FORMAT_GDIMETAFILE || pEle->GetFormat() == FORMAT_BITMAP )
- return pEle;
- }
- delete pEle;
- aStreamName = String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "\002OlePres00" ) );
- aStreamName += String( i );
- };
- return NULL;
-}
-
-
-
-//---------------------------------------------------------------------------
-// Hilfs Klassen aus MSDFFDEF.HXX
-//---------------------------------------------------------------------------
-
-SvStream& operator>>( SvStream& rIn, DffRecordHeader& rRec )
-{
- rRec.nFilePos = rIn.Tell();
- UINT16 nTmp(0);
- rIn >> nTmp;
- rRec.nImpVerInst = nTmp;
- rRec.nRecVer = sal::static_int_cast< BYTE >(nTmp & 0x000F);
- rRec.nRecInstance = nTmp >> 4;
- rIn >> rRec.nRecType;
- rIn >> rRec.nRecLen;
- return rIn;
-}
-
-// Masse fuer dashed lines
-#define LLEN_MIDDLE (450)
-#define LLEN_SPACE_MIDDLE (360)
-#define LLEN_LONG (LLEN_MIDDLE * 2)
-#define LLEN_SPACE_LONG (LLEN_SPACE_MIDDLE + 20)
-#define LLEN_POINT (LLEN_MIDDLE / 4)
-#define LLEN_SPACE_POINT (LLEN_SPACE_MIDDLE / 4)
-
-SvStream& operator>>( SvStream& rIn, DffPropSet& rRec )
-{
- rRec.InitializePropSet();
-
- DffRecordHeader aHd;
- rIn >> aHd;
- UINT32 nPropCount = aHd.nRecInstance;
-
- // FilePos der ComplexData merken
- UINT32 nComplexDataFilePos = rIn.Tell() + ( nPropCount * 6 );
-
- for( UINT32 nPropNum = 0; nPropNum < nPropCount; nPropNum++ )
- {
- sal_uInt16 nTmp;
- sal_uInt32 nRecType, nContent, nContentEx = 0xffff0000;
- rIn >> nTmp
- >> nContent;
-
- nRecType = nTmp & 0x3fff;
-
- if ( nRecType > 0x3ff )
- break;
- if ( ( nRecType & 0x3f ) == 0x3f )
- { // clear flags that have to be cleared
- rRec.mpContents[ nRecType ] &= ( ( nContent >> 16 ) ^ 0xffffffff );
- // set flags that have to be set
- rRec.mpContents[ nRecType ] |= nContent;
- nContentEx |= ( nContent >> 16 );
- rRec.Replace( nRecType, (void*)nContentEx );
- }
- else
- {
- DffPropFlags aPropFlag = { 1, 0, 0, 0 };
- if ( nTmp & 0x4000 )
- aPropFlag.bBlip = sal_True;
- if ( nTmp & 0x8000 )
- aPropFlag.bComplex = sal_True;
- if ( aPropFlag.bComplex && nContent && ( nComplexDataFilePos < aHd.GetRecEndFilePos() ) )
- {
- // normally nContent is the complete size of the complex property,
- // but this is not always true for IMsoArrays ( what the hell is a IMsoArray ? )
-
- // I love special threatments :-(
- if ( ( nRecType == DFF_Prop_pVertices ) || ( nRecType == DFF_Prop_pSegmentInfo )
- || ( nRecType == DFF_Prop_fillShadeColors ) || ( nRecType == DFF_Prop_lineDashStyle )
- || ( nRecType == DFF_Prop_pWrapPolygonVertices ) || ( nRecType == DFF_Prop_connectorPoints )
- || ( nRecType == DFF_Prop_Handles ) || ( nRecType == DFF_Prop_pFormulas )
- || ( nRecType == DFF_Prop_textRectangles ) )
- {
- // now check if the current content size is possible, or 6 bytes too small
- sal_uInt32 nOldPos = rIn.Tell();
- sal_Int16 nNumElem, nNumElemReserved, nSize;
-
- rIn.Seek( nComplexDataFilePos );
- rIn >> nNumElem >> nNumElemReserved >> nSize;
- if ( nNumElemReserved >= nNumElem )
- {
- // the size of these array elements is nowhere defined,
- // what if the size is negative ?
- // ok, we will make it positive and shift it.
- // for -16 this works
- if ( nSize < 0 )
- nSize = ( -nSize ) >> 2;
- sal_uInt32 nDataSize = (sal_uInt32)( nSize * nNumElem );
-
- // sometimes the content size is 6 bytes too small (array header information is missing )
- if ( nDataSize == nContent )
- nContent += 6;
-
- // check if array fits into the PropertyContainer
- if ( ( nComplexDataFilePos + nContent ) > aHd.GetRecEndFilePos() )
- nContent = 0;
- }
- else
- nContent = 0;
- rIn.Seek( nOldPos );
- }
- if ( nContent )
- {
- nContentEx = nComplexDataFilePos; // insert the filepos of this property;
- nComplexDataFilePos += nContent; // store filepos, that is used for the next complex property
- }
- else // a complex property needs content
- aPropFlag.bSet = sal_False; // otherwise something is wrong
- }
- rRec.mpContents[ nRecType ] = nContent;
- rRec.mpFlags[ nRecType ] = aPropFlag;
- rRec.Insert( nRecType, (void*)nContentEx );
- }
- }
- aHd.SeekToEndOfRecord( rIn );
- return rIn;
-}
-
-void DffPropSet::InitializePropSet() const
-{
- /*
- cmc:
- " Boolean properties are grouped in bitfields by property set; note that
- the Boolean properties in each property set are contiguous. They are saved
- under the property ID of the last Boolean property in the set, and are
- placed in the value field in reverse order starting with the last property
- in the low bit. "
-
- e.g.
-
- fEditedWrap
- fBehindDocument
- fOnDblClickNotify
- fIsButton
- fOneD
- fHidden
- fPrint
-
- are all part of a group and all are by default false except for fPrint,
- which equates to a default bit sequence for the group of 0000001 -> 0x1
-
- If at a later stage word sets fBehindDocument away from the default it
- will be done by having a property named fPrint whose bitsequence will have
- the fBehindDocument bit set. e.g. a DFF_Prop_fPrint with value 0x200020
- has set bit 6 on so as to enable fBehindDocument (as well as disabling
- everything else)
- */
-
- memset( ( (DffPropSet*) this )->mpFlags, 0, 0x400 * sizeof(DffPropFlags) );
- ( (DffPropSet*) this )->Clear();
-
- DffPropFlags nFlags = { 1, 0, 0, 1 };
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_LockAgainstGrouping ] = 0x0000; //0x01ff0000;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_LockAgainstGrouping ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_LockAgainstGrouping, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_FitTextToShape ] = 0x0010; //0x001f0010;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_FitTextToShape ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_FitTextToShape, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_gtextFStrikethrough ] = 0x0000; //0xffff0000;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_gtextFStrikethrough ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_gtextFStrikethrough, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_pictureActive ] = 0x0000; //0x000f0000;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_pictureActive ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_pictureActive, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fFillOK ] = 0x0039; //0x003f0039;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fFillOK ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fFillOK, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fNoFillHitTest ] = 0x001c; //0x001f001c;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fNoFillHitTest ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fNoFillHitTest, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fNoLineDrawDash ] = 0x001e; //0x001f000e;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fNoLineDrawDash ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fNoLineDrawDash, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fshadowObscured ] = 0x0000; //0x00030000;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fshadowObscured ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fshadowObscured, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fPerspective ] = 0x0000; //0x00010000;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fPerspective ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fPerspective, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fc3DLightFace ] = 0x0001; //0x000f0001;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fc3DLightFace ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fc3DLightFace, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fc3DFillHarsh ] = 0x0016; //0x001f0016;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fc3DFillHarsh ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fc3DFillHarsh, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fBackground ] = 0x0000; //0x001f0000;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fBackground ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fBackground, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fCalloutLengthSpecified ] = 0x0010; //0x00ef0010;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fCalloutLengthSpecified ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fCalloutLengthSpecified, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fPrint ] = 0x0001; //0x00ef0001;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fPrint ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fPrint, (void*)0xffff0000 );
-
- ( (DffPropSet*) this )->mpContents[ DFF_Prop_fillColor ] = 0xffffff;
- ( (DffPropSet*) this )->mpFlags[ DFF_Prop_fillColor ] = nFlags;
- ( (DffPropSet*) this )->Insert( DFF_Prop_fillColor, (void*)0xffff0000 );
-}
-
-void DffPropSet::Merge( DffPropSet& rMaster ) const
-{
- for ( void* pDummy = rMaster.First(); pDummy; pDummy = rMaster.Next() )
- {
- UINT32 nRecType = rMaster.GetCurKey();
- if ( ( nRecType & 0x3f ) == 0x3f ) // this is something called FLAGS
- {
- UINT32 nCurrentFlags = mpContents[ nRecType ];
- UINT32 nMergeFlags = rMaster.mpContents[ nRecType ];
- nMergeFlags &= ( nMergeFlags >> 16 ) | 0xffff0000; // clearing low word
- nMergeFlags &= ( ( nCurrentFlags & 0xffff0000 ) // remove allready hard set
- | ( nCurrentFlags >> 16 ) ) ^ 0xffffffff; // attributes from mergeflags
- nCurrentFlags &= ( ( nMergeFlags & 0xffff0000 ) // apply zero master bits
- | ( nMergeFlags >> 16 ) ) ^ 0xffffffff;
- nCurrentFlags |= (UINT16)nMergeFlags; // apply filled master bits
- ( (DffPropSet*) this )->mpContents[ nRecType ] = nCurrentFlags;
-
-
- sal_uInt32 nNewContentEx = (sal_uInt32)(sal_uIntPtr)rMaster.GetCurObject();
- if ( ((DffPropSet*)this)->Seek( nRecType ) )
- nNewContentEx |= (sal_uInt32)(sal_uIntPtr)GetCurObject();
- ( (DffPropSet*) this )->Replace( nRecType, (void*)nNewContentEx );
- }
- else
- {
- if ( !IsProperty( nRecType ) || !IsHardAttribute( nRecType ) )
- {
- ( (DffPropSet*) this )->mpContents[ nRecType ] = rMaster.mpContents[ nRecType ];
- DffPropFlags nFlags( rMaster.mpFlags[ nRecType ] );
- nFlags.bSoftAttr = TRUE;
- ( (DffPropSet*) this )->mpFlags[ nRecType ] = nFlags;
- ( (DffPropSet*) this )->Insert( nRecType, pDummy );
- }
- }
- }
-}
-
-BOOL DffPropSet::IsHardAttribute( UINT32 nId ) const
-{
- BOOL bRetValue = TRUE;
- nId &= 0x3ff;
- if ( ( nId & 0x3f ) >= 48 ) // is this a flag id
- {
- if ( ((DffPropSet*)this)->Seek( nId | 0x3f ) )
- {
- sal_uInt32 nContentEx = (sal_uInt32)(sal_uIntPtr)GetCurObject();
- bRetValue = ( nContentEx & ( 1 << ( 0xf - ( nId & 0xf ) ) ) ) != 0;
- }
- }
- else
- bRetValue = ( mpFlags[ nId ].bSoftAttr == 0 );
- return bRetValue;
-};
-
-UINT32 DffPropSet::GetPropertyValue( UINT32 nId, UINT32 nDefault ) const
-{
- nId &= 0x3ff;
- return ( mpFlags[ nId ].bSet ) ? mpContents[ nId ] : nDefault;
-};
-
-bool DffPropSet::GetPropertyBool( UINT32 nId, bool bDefault ) const
-{
- UINT32 nBaseId = nId | 31; // base ID to get the UINT32 property value
- UINT32 nMask = 1 << (nBaseId - nId); // bit mask of the boolean property
-
- UINT32 nPropValue = GetPropertyValue( nBaseId, bDefault ? nMask : 0 );
- return (nPropValue & nMask) != 0;
-}
-
-::rtl::OUString DffPropSet::GetPropertyString( UINT32 nId, SvStream& rStrm ) const
-{
- sal_Size nOldPos = rStrm.Tell();
- ::rtl::OUStringBuffer aBuffer;
- sal_uInt32 nBufferSize = GetPropertyValue( nId );
- if( (nBufferSize > 0) && SeekToContent( nId, rStrm ) )
- {
- sal_Int32 nStrLen = static_cast< sal_Int32 >( nBufferSize / 2 );
- aBuffer.ensureCapacity( nStrLen );
- for( sal_Int32 nCharIdx = 0; nCharIdx < nStrLen; ++nCharIdx )
- {
- sal_uInt16 nChar = 0;
- rStrm >> nChar;
- if( nChar > 0 )
- aBuffer.append( static_cast< sal_Unicode >( nChar ) );
- else
- break;
- }
- }
- rStrm.Seek( nOldPos );
- return aBuffer.makeStringAndClear();
-}
-
-void DffPropSet::SetPropertyValue( UINT32 nId, UINT32 nValue ) const
-{
- if ( !mpFlags[ nId ].bSet )
- {
- ( (DffPropSet*) this )->Insert( nId, (void*)nValue );
- ( (DffPropSet*) this )->mpFlags[ nId ].bSet = TRUE;
- }
- ( (DffPropSet*) this )->mpContents[ nId ] = nValue;
-};
-
-BOOL DffPropSet::SeekToContent( UINT32 nRecType, SvStream& rStrm ) const
-{
- nRecType &= 0x3ff;
- if ( mpFlags[ nRecType ].bSet )
- {
- if ( mpFlags[ nRecType ].bComplex )
- {
- if ( ((DffPropSet*)this)->Seek( nRecType ) )
- {
- sal_uInt32 nOffset = (sal_uInt32)(sal_uIntPtr)GetCurObject();
- if ( nOffset && ( ( nOffset & 0xffff0000 ) != 0xffff0000 ) )
- {
- rStrm.Seek( nOffset );
- return TRUE;
- }
- }
- }
- }
- return FALSE;
-}
-
-DffPropertyReader::DffPropertyReader( const SvxMSDffManager& rMan ) :
- rManager( rMan ),
- pDefaultPropSet( NULL )
-{
- InitializePropSet();
-}
-
-void DffPropertyReader::SetDefaultPropSet( SvStream& rStCtrl, UINT32 nOffsDgg ) const
-{
- delete pDefaultPropSet;
- UINT32 nMerk = rStCtrl.Tell();
- rStCtrl.Seek( nOffsDgg );
- DffRecordHeader aRecHd;
- rStCtrl >> aRecHd;
- if ( aRecHd.nRecType == DFF_msofbtDggContainer )
- {
- if ( rManager.SeekToRec( rStCtrl, DFF_msofbtOPT, aRecHd.GetRecEndFilePos() ) )
- {
- ( (DffPropertyReader*) this )->pDefaultPropSet = new DffPropSet;
- rStCtrl >> *pDefaultPropSet;
- }
- }
- rStCtrl.Seek( nMerk );
-}
-
-#ifdef DBG_CUSTOMSHAPE
-void DffPropertyReader::ReadPropSet( SvStream& rIn, void* pClientData, UINT32 nShapeId ) const
-#else
-void DffPropertyReader::ReadPropSet( SvStream& rIn, void* pClientData ) const
-#endif
-{
- ULONG nFilePos = rIn.Tell();
- rIn >> (DffPropertyReader&)*this;
-
- if ( IsProperty( DFF_Prop_hspMaster ) )
- {
- if ( rManager.SeekToShape( rIn, pClientData, GetPropertyValue( DFF_Prop_hspMaster ) ) )
- {
- DffRecordHeader aRecHd;
- rIn >> aRecHd;
- if ( rManager.SeekToRec( rIn, DFF_msofbtOPT, aRecHd.GetRecEndFilePos() ) )
- {
- DffPropSet aMasterPropSet;
- rIn >> aMasterPropSet;
- Merge( aMasterPropSet );
- }
- }
- }
-// if ( pDefaultPropSet )
-// Merge( *( pDefaultPropSet ) );
-
- ( (DffPropertyReader*) this )->mnFix16Angle = Fix16ToAngle( GetPropertyValue( DFF_Prop_Rotation, 0 ) );
-
-#ifdef DBG_CUSTOMSHAPE
-
- String aURLStr;
-
- if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( String( RTL_CONSTASCII_STRINGPARAM( "d:\\ashape.dbg" ) ), aURLStr ) )
- {
- SvStream* pOut = ::utl::UcbStreamHelper::CreateStream( aURLStr, STREAM_WRITE );
-
- if( pOut )
- {
- pOut->Seek( STREAM_SEEK_TO_END );
-
- if ( IsProperty( DFF_Prop_adjustValue ) || IsProperty( DFF_Prop_pVertices ) )
- {
- pOut->WriteLine( "" );
- ByteString aString( "ShapeId: " );
- aString.Append( ByteString::CreateFromInt32( nShapeId ) );
- pOut->WriteLine( aString );
- }
- for ( sal_uInt32 i = DFF_Prop_adjustValue; i <= DFF_Prop_adjust10Value; i++ )
- {
- if ( IsProperty( i ) )
- {
- ByteString aString( "Prop_adjustValue" );
- aString.Append( ByteString::CreateFromInt32( ( i - DFF_Prop_adjustValue ) + 1 ) );
- aString.Append( ":" );
- aString.Append( ByteString::CreateFromInt32( GetPropertyValue( i ) ) );
- pOut->WriteLine( aString );
- }
- }
- sal_Int32 i;
- for ( i = 320; i < 383; i++ )
- {
- if ( ( i >= DFF_Prop_adjustValue ) && ( i <= DFF_Prop_adjust10Value ) )
- continue;
- if ( IsProperty( i ) )
- {
- if ( SeekToContent( i, rIn ) )
- {
- INT32 nLen = (INT32)GetPropertyValue( i );
- if ( nLen )
- {
- pOut->WriteLine( "" );
- ByteString aDesc( "Property:" );
- aDesc.Append( ByteString::CreateFromInt32( i ) );
- aDesc.Append( ByteString( " Size:" ) );
- aDesc.Append( ByteString::CreateFromInt32( nLen ) );
- pOut->WriteLine( aDesc );
- INT16 nNumElem, nNumElemMem, nNumSize;
- rIn >> nNumElem >> nNumElemMem >> nNumSize;
- aDesc = ByteString( "Entries: " );
- aDesc.Append( ByteString::CreateFromInt32( nNumElem ) );
- aDesc.Append( ByteString( " Size:" ) );
- aDesc.Append( ByteString::CreateFromInt32( nNumSize ) );
- pOut->WriteLine( aDesc );
- if ( nNumSize < 0 )
- nNumSize = ( ( -nNumSize ) >> 2 );
- if ( !nNumSize )
- nNumSize = 16;
- nLen -= 6;
- while ( nLen > 0 )
- {
- ByteString aString;
- for ( UINT32 j = 0; nLen && ( j < ( nNumSize >> 1 ) ); j++ )
- {
- for ( UINT32 k = 0; k < 2; k++ )
- {
- if ( nLen )
- {
- BYTE nVal;
- rIn >> nVal;
- if ( ( nVal >> 4 ) > 9 )
- *pOut << (BYTE)( ( nVal >> 4 ) + 'A' - 10 );
- else
- *pOut << (BYTE)( ( nVal >> 4 ) + '0' );
-
- if ( ( nVal & 0xf ) > 9 )
- *pOut << (BYTE)( ( nVal & 0xf ) + 'A' - 10 );
- else
- *pOut << (BYTE)( ( nVal & 0xf ) + '0' );
-
- nLen--;
- }
- }
- *pOut << (char)( ' ' );
- }
- pOut->WriteLine( aString );
- }
- }
- }
- else
- {
- ByteString aString( "Property" );
- aString.Append( ByteString::CreateFromInt32( i ) );
- aString.Append( ":" );
- aString.Append( ByteString::CreateFromInt32( GetPropertyValue( i ) ) );
- pOut->WriteLine( aString );
- }
- }
- }
-
- delete pOut;
- }
- }
-
-#endif
-
- rIn.Seek( nFilePos );
-}
-
-
-INT32 DffPropertyReader::Fix16ToAngle( INT32 nContent ) const
-{
- INT32 nAngle = 0;
- if ( nContent )
- {
- nAngle = ( (INT16)( nContent >> 16) * 100L ) + ( ( ( nContent & 0x0000ffff) * 100L ) >> 16 );
- nAngle = NormAngle360( -nAngle );
- }
- return nAngle;
-}
-
-DffPropertyReader::~DffPropertyReader()
-{
- delete pDefaultPropSet;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-SvStream& operator>>( SvStream& rIn, SvxMSDffConnectorRule& rRule )
-{
- rIn >> rRule.nRuleId
- >> rRule.nShapeA
- >> rRule.nShapeB
- >> rRule.nShapeC
- >> rRule.ncptiA
- >> rRule.ncptiB;
-
- return rIn;
-}
-
-SvxMSDffSolverContainer::SvxMSDffSolverContainer()
-{
-}
-
-SvxMSDffSolverContainer::~SvxMSDffSolverContainer()
-{
- for ( SvxMSDffConnectorRule* pPtr = (SvxMSDffConnectorRule*)aCList.First();
- pPtr; pPtr = (SvxMSDffConnectorRule*)aCList.Next() )
- delete pPtr;
-}
-
-SvStream& operator>>( SvStream& rIn, SvxMSDffSolverContainer& rContainer )
-{
- DffRecordHeader aHd;
- rIn >> aHd;
- if ( aHd.nRecType == DFF_msofbtSolverContainer )
- {
- DffRecordHeader aCRule;
- while ( ( rIn.GetError() == 0 ) && ( rIn.Tell() < aHd.GetRecEndFilePos() ) )
- {
- rIn >> aCRule;
- if ( aCRule.nRecType == DFF_msofbtConnectorRule )
- {
- SvxMSDffConnectorRule* pRule = new SvxMSDffConnectorRule;
- rIn >> *pRule;
- rContainer.aCList.Insert( pRule, LIST_APPEND );
- }
- aCRule.SeekToEndOfRecord( rIn );
- }
- }
- return rIn;
-}
-
-void SvxMSDffManager::SolveSolver( const SvxMSDffSolverContainer& rSolver )
-{
- sal_Int32 i, nCnt;
- for ( i = 0, nCnt = rSolver.aCList.Count(); i < nCnt; i++ )
- {
- SvxMSDffConnectorRule* pPtr = (SvxMSDffConnectorRule*)rSolver.aCList.GetObject( i );
- if ( pPtr->pCObj )
- {
- for ( int nN = 0; nN < 2; nN++ )
- {
- SdrObject* pO;
- sal_uInt32 nC, nSpFlags;
- sal_Bool bTail;
- if ( !nN )
- {
- bTail = sal_True;
- pO = pPtr->pAObj;
- nC = pPtr->ncptiA;
- nSpFlags = pPtr->nSpFlagsA;
- }
- else
- {
- bTail = sal_False;
- pO = pPtr->pBObj;
- nC = pPtr->ncptiB;
- nSpFlags = pPtr->nSpFlagsB;
- }
- if ( pO )
- {
- Any aAny;
- SdrGluePoint aGluePoint;
- Reference< XShape > aXShape( pO->getUnoShape(), UNO_QUERY );
- Reference< XShape > aXConnector( pPtr->pCObj->getUnoShape(), UNO_QUERY );
- SdrGluePointList* pList = pO->ForceGluePointList();
-
- sal_Bool bValidGluePoint = sal_False;
- sal_Int32 nId = nC;
- sal_uInt32 nInventor = pO->GetObjInventor();
-
- if( nInventor == SdrInventor )
- {
- sal_uInt32 nObjId = pO->GetObjIdentifier();
- switch( nObjId )
- {
- case OBJ_GRUP :
- case OBJ_GRAF :
- case OBJ_RECT :
- case OBJ_TEXT :
- case OBJ_PAGE :
- case OBJ_TEXTEXT :
- case OBJ_wegFITTEXT :
- case OBJ_wegFITALLTEXT :
- case OBJ_TITLETEXT :
- case OBJ_OUTLINETEXT :
- {
- if ( nC & 1 )
- {
- if ( nSpFlags & SP_FFLIPH )
- nC ^= 2; // 1 <-> 3
- }
- else
- {
- if ( nSpFlags & SP_FFLIPV )
- nC ^= 1; // 0 <-> 2
- }
- switch( nC )
- {
- case 0 :
- nId = 0; // SDRVERTALIGN_TOP;
- break;
- case 1 :
- nId = 3; // SDRHORZALIGN_RIGHT;
- break;
- case 2 :
- nId = 2; // SDRVERTALIGN_BOTTOM;
- break;
- case 3 :
- nId = 1; // SDRHORZALIGN_LEFT;
- break;
- }
- if ( nId <= 3 )
- bValidGluePoint = sal_True;
- }
- break;
- case OBJ_POLY :
- case OBJ_PLIN :
- case OBJ_LINE :
- case OBJ_PATHLINE :
- case OBJ_PATHFILL :
- case OBJ_FREELINE :
- case OBJ_FREEFILL :
- case OBJ_SPLNLINE :
- case OBJ_SPLNFILL :
- case OBJ_PATHPOLY :
- case OBJ_PATHPLIN :
- {
- if ( pList && ( pList->GetCount() > nC ) )
- {
- bValidGluePoint = sal_True;
- nId = (sal_Int32)((*pList)[ (sal_uInt16)nC].GetId() + 3 );
- }
- else
- {
- sal_Bool bNotFound = sal_True;
-
- PolyPolygon aPolyPoly( EscherPropertyContainer::GetPolyPolygon( aXShape ) );
- sal_uInt16 k, j, nPolySize = aPolyPoly.Count();
- if ( nPolySize )
- {
- sal_uInt32 nPointCount = 0;
- Rectangle aBoundRect( aPolyPoly.GetBoundRect() );
- if ( aBoundRect.GetWidth() && aBoundRect.GetHeight() )
- {
- for ( k = 0; bNotFound && ( k < nPolySize ); k++ )
- {
- const Polygon& rPolygon = aPolyPoly.GetObject( k );
- for ( j = 0; bNotFound && ( j < rPolygon.GetSize() ); j++ )
- {
- PolyFlags eFlags = rPolygon.GetFlags( j );
- if ( eFlags == POLY_NORMAL )
- {
- if ( nC == nPointCount )
- {
- const Point& rPoint = rPolygon.GetPoint( j );
- double fXRel = rPoint.X() - aBoundRect.Left();
- double fYRel = rPoint.Y() - aBoundRect.Top();
- sal_Int32 nWidth = aBoundRect.GetWidth();
- if ( !nWidth )
- nWidth = 1;
- sal_Int32 nHeight= aBoundRect.GetHeight();
- if ( !nHeight )
- nHeight = 1;
- fXRel /= (double)nWidth;
- fXRel *= 10000;
- fYRel /= (double)nHeight;
- fYRel *= 10000;
- aGluePoint.SetPos( Point( (sal_Int32)fXRel, (sal_Int32)fYRel ) );
- aGluePoint.SetPercent( sal_True );
- aGluePoint.SetAlign( SDRVERTALIGN_TOP | SDRHORZALIGN_LEFT );
- aGluePoint.SetEscDir( SDRESC_SMART );
- nId = (sal_Int32)((*pList)[ pList->Insert( aGluePoint ) ].GetId() + 3 );
- bNotFound = sal_False;
- }
- nPointCount++;
- }
- }
- }
- }
- }
- if ( !bNotFound )
- {
- bValidGluePoint = sal_True;
- }
- }
- }
- break;
-
- case OBJ_CUSTOMSHAPE :
- {
- SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)((SdrObjCustomShape*)pO)->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
- const rtl::OUString sPath( RTL_CONSTASCII_USTRINGPARAM ( "Path" ) );
- const rtl::OUString sGluePointType( RTL_CONSTASCII_USTRINGPARAM ( "GluePointType" ) );
- sal_Int16 nGluePointType = EnhancedCustomShapeGluePointType::SEGMENTS;
- com::sun::star::uno::Any* pAny = aGeometryItem.GetPropertyValueByName( sPath, sGluePointType );
- if ( pAny )
- *pAny >>= nGluePointType;
- else
- {
- const rtl::OUString sType( RTL_CONSTASCII_USTRINGPARAM ( "Type" ) );
- rtl::OUString sShapeType;
- pAny = aGeometryItem.GetPropertyValueByName( sType );
- if ( pAny )
- *pAny >>= sShapeType;
- MSO_SPT eSpType = EnhancedCustomShapeTypeNames::Get( sShapeType );
- nGluePointType = GetCustomShapeConnectionTypeDefault( eSpType );
- }
- if ( nGluePointType == EnhancedCustomShapeGluePointType::CUSTOM )
- {
- if ( pList && ( pList->GetCount() > nC ) )
- {
- bValidGluePoint = sal_True;
- nId = (sal_Int32)((*pList)[ (sal_uInt16)nC].GetId() + 3 );
- }
- }
- else if ( nGluePointType == EnhancedCustomShapeGluePointType::RECT )
- {
- if ( nC & 1 )
- {
- if ( nSpFlags & SP_FFLIPH )
- nC ^= 2; // 1 <-> 3
- }
- else
- {
- if ( nSpFlags & SP_FFLIPV )
- nC ^= 1; // 0 <-> 2
- }
- switch( nC )
- {
- case 0 :
- nId = 0; // SDRVERTALIGN_TOP;
- break;
- case 1 :
- nId = 3; // SDRHORZALIGN_RIGHT;
- break;
- case 2 :
- nId = 2; // SDRVERTALIGN_BOTTOM;
- break;
- case 3 :
- nId = 1; // SDRHORZALIGN_LEFT;
- break;
- }
- if ( nId <= 3 )
- bValidGluePoint = sal_True;
- }
- else if ( nGluePointType == EnhancedCustomShapeGluePointType::SEGMENTS )
- {
- const rtl::OUString sSegments( RTL_CONSTASCII_USTRINGPARAM ( "Segments" ) );
- const rtl::OUString sCoordinates( RTL_CONSTASCII_USTRINGPARAM ( "Coordinates" ) );
-
- sal_uInt32 k, nPt = nC;
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeSegment > aSegments;
- pAny = aGeometryItem.GetPropertyValueByName( sPath, sSegments );
- if ( pAny )
- {
- if ( *pAny >>= aSegments )
- {
- for ( nPt = 0, k = 1; nC && ( k < (sal_uInt32)aSegments.getLength() ); k++ )
- {
- sal_Int16 j, nCnt2 = aSegments[ k ].Count;
- if ( aSegments[ k ].Command != EnhancedCustomShapeSegmentCommand::UNKNOWN )
- {
- for ( j = 0; nC && ( j < nCnt2 ); j++ )
- {
- switch( aSegments[ k ].Command )
- {
- case EnhancedCustomShapeSegmentCommand::ENDSUBPATH :
- case EnhancedCustomShapeSegmentCommand::CLOSESUBPATH :
- case EnhancedCustomShapeSegmentCommand::LINETO :
- case EnhancedCustomShapeSegmentCommand::MOVETO :
- {
- nC--;
- nPt++;
- }
- break;
- case EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTX :
- case EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTY :
- break;
-
- case EnhancedCustomShapeSegmentCommand::CURVETO :
- {
- nC--;
- nPt += 3;
- }
- break;
-
- case EnhancedCustomShapeSegmentCommand::ANGLEELLIPSETO :
- case EnhancedCustomShapeSegmentCommand::ANGLEELLIPSE :
- {
- nC--;
- nPt += 3;
- }
- break;
- case EnhancedCustomShapeSegmentCommand::ARCTO :
- case EnhancedCustomShapeSegmentCommand::ARC :
- case EnhancedCustomShapeSegmentCommand::CLOCKWISEARCTO :
- case EnhancedCustomShapeSegmentCommand::CLOCKWISEARC :
- {
- nC--;
- nPt += 4;
- }
- break;
- }
- }
- }
- }
- }
- }
- pAny = aGeometryItem.GetPropertyValueByName( sPath, sCoordinates );
- if ( pAny )
- {
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair > aCoordinates;
- *pAny >>= aCoordinates;
- if ( nPt < (sal_uInt32)aCoordinates.getLength() )
- {
- nId = 4;
- com::sun::star::drawing::EnhancedCustomShapeParameterPair& rPara = aCoordinates[ nPt ];
- sal_Int32 nX = 0, nY = 0;
- if ( ( rPara.First.Value >>= nX ) && ( rPara.Second.Value >>= nY ) )
- {
- const rtl::OUString sGluePoints( RTL_CONSTASCII_USTRINGPARAM ( "GluePoints" ) );
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair > aGluePoints;
- pAny = aGeometryItem.GetPropertyValueByName( sPath, sGluePoints );
- if ( pAny )
- *pAny >>= aGluePoints;
- sal_Int32 nGluePoints = aGluePoints.getLength();
- aGluePoints.realloc( nGluePoints + 1 );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aGluePoints[ nGluePoints ].First, nX );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aGluePoints[ nGluePoints ].Second, nY );
- PropertyValue aProp;
- aProp.Name = sGluePoints;
- aProp.Value <<= aGluePoints;
- aGeometryItem.SetPropertyValue( sPath, aProp );
- bValidGluePoint = sal_True;
- ((SdrObjCustomShape*)pO)->SetMergedItem( aGeometryItem );
- SdrGluePointList* pLst = pO->ForceGluePointList();
- if ( pLst->GetCount() > nGluePoints )
- nId = (sal_Int32)((*pLst)[ (sal_uInt16)nGluePoints ].GetId() + 3 );
- }
- }
- }
- }
- }
- break;
- }
- if ( bValidGluePoint )
- {
- Reference< XPropertySet > xPropSet( aXConnector, UNO_QUERY );
- if ( xPropSet.is() )
- {
- if ( nN )
- {
- String aPropName( RTL_CONSTASCII_USTRINGPARAM( "EndShape" ) );
- aAny <<= aXShape;
- SetPropValue( aAny, xPropSet, aPropName, sal_True );
- aPropName = String( RTL_CONSTASCII_USTRINGPARAM( "EndGluePointIndex" ) );
- aAny <<= nId;
- SetPropValue( aAny, xPropSet, aPropName, sal_True );
- }
- else
- {
- String aPropName( RTL_CONSTASCII_USTRINGPARAM( "StartShape" ) );
- aAny <<= aXShape;
- SetPropValue( aAny, xPropSet, aPropName, sal_True );
- aPropName = String( RTL_CONSTASCII_USTRINGPARAM( "StartGluePointIndex" ) );
- aAny <<= nId;
- SetPropValue( aAny, xPropSet, aPropName, sal_True );
- }
-
- // Not sure what this is good for, repaint or broadcast of object change.
- //( Thus i am adding repaint here
- pO->SetChanged();
- pO->BroadcastObjectChange();
- }
- }
- }
- }
- }
- }
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-static basegfx::B2DPolygon GetLineArrow( const sal_Int32 nLineWidth, const MSO_LineEnd eLineEnd,
- const MSO_LineEndWidth eLineWidth, const MSO_LineEndLength eLineLenght,
- sal_Int32& rnArrowWidth, sal_Bool& rbArrowCenter,
- String& rsArrowName, sal_Bool bScaleArrow )
-{
- basegfx::B2DPolygon aRetval;
- double fLineWidth = nLineWidth < 70 ? 70.0 : nLineWidth;
- double fLenghtMul, fWidthMul;
- sal_Int32 nLineNumber;
- switch( eLineLenght )
- {
- default :
- case mso_lineMediumLenArrow : fLenghtMul = 3.0; nLineNumber = 2; break;
- case mso_lineShortArrow : fLenghtMul = 2.0; nLineNumber = 1; break;
- case mso_lineLongArrow : fLenghtMul = 5.0; nLineNumber = 3; break;
- }
- switch( eLineWidth )
- {
- default :
- case mso_lineMediumWidthArrow : fWidthMul = 3.0; nLineNumber += 3; break;
- case mso_lineNarrowArrow : fWidthMul = 2.0; break;
- case mso_lineWideArrow : fWidthMul = 5.0; nLineNumber += 6; break;
- }
-
- if ( bScaleArrow ) // #i33630 arrows imported from Word are too big
- {
- fWidthMul /= 1.75;
- fLenghtMul/= 1.75;
- }
-
- rbArrowCenter = sal_False;
- switch ( eLineEnd )
- {
- case mso_lineArrowEnd :
- {
- basegfx::B2DPolygon aTriangle;
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.50, 0.0 ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth, fLenghtMul * fLineWidth ));
- aTriangle.append(basegfx::B2DPoint( 0.0, fLenghtMul * fLineWidth ));
- aTriangle.setClosed(true);
- aRetval = aTriangle;
- rsArrowName = String( RTL_CONSTASCII_STRINGPARAM( "msArrowEnd " ), RTL_TEXTENCODING_UTF8 );
- }
- break;
-
- case mso_lineArrowOpenEnd :
- {
- switch( eLineLenght )
- {
- default :
- case mso_lineMediumLenArrow : fLenghtMul = 4.5; break;
- case mso_lineShortArrow : fLenghtMul = 3.5; break;
- case mso_lineLongArrow : fLenghtMul = 6.0; break;
- }
- switch( eLineWidth )
- {
- default :
- case mso_lineMediumWidthArrow : fWidthMul = 4.5; break;
- case mso_lineNarrowArrow : fWidthMul = 3.5; break;
- case mso_lineWideArrow : fWidthMul = 6.0; break;
- }
- basegfx::B2DPolygon aTriangle;
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.50 , 0.0 ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth, fLenghtMul * fLineWidth * 0.91 ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.85, fLenghtMul * fLineWidth ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.50, fLenghtMul * fLineWidth * 0.36 ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.15, fLenghtMul * fLineWidth ));
- aTriangle.append(basegfx::B2DPoint( 0.0, fLenghtMul * fLineWidth * 0.91 ));
- aTriangle.setClosed(true);
- aRetval = aTriangle;
- rsArrowName = String( RTL_CONSTASCII_STRINGPARAM( "msArrowOpenEnd " ), RTL_TEXTENCODING_UTF8 );
- }
- break;
- case mso_lineArrowStealthEnd :
- {
- basegfx::B2DPolygon aTriangle;
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.50 , 0.0 ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth , fLenghtMul * fLineWidth ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.50 , fLenghtMul * fLineWidth * 0.60 ));
- aTriangle.append(basegfx::B2DPoint( 0.0, fLenghtMul * fLineWidth ));
- aTriangle.setClosed(true);
- aRetval = aTriangle;
- rsArrowName = String( RTL_CONSTASCII_STRINGPARAM( "msArrowStealthEnd " ), RTL_TEXTENCODING_UTF8 );
- }
- break;
- case mso_lineArrowDiamondEnd :
- {
- basegfx::B2DPolygon aTriangle;
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.50 , 0.0 ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth , fLenghtMul * fLineWidth * 0.50 ));
- aTriangle.append(basegfx::B2DPoint( fWidthMul * fLineWidth * 0.50 , fLenghtMul * fLineWidth ));
- aTriangle.append(basegfx::B2DPoint( 0.0, fLenghtMul * fLineWidth * 0.50 ));
- aTriangle.setClosed(true);
- aRetval = aTriangle;
- rbArrowCenter = sal_True;
- rsArrowName = String( RTL_CONSTASCII_STRINGPARAM( "msArrowDiamondEnd " ), RTL_TEXTENCODING_UTF8 );
- }
- break;
- case mso_lineArrowOvalEnd :
- {
- aRetval = XPolygon( Point( (sal_Int32)( fWidthMul * fLineWidth * 0.50 ), 0 ),
- (sal_Int32)( fWidthMul * fLineWidth * 0.50 ),
- (sal_Int32)( fLenghtMul * fLineWidth * 0.50 ), 0, 3600 ).getB2DPolygon();
- rbArrowCenter = sal_True;
- rsArrowName = String( RTL_CONSTASCII_STRINGPARAM( "msArrowOvalEnd " ), RTL_TEXTENCODING_UTF8 );
- }
- break;
- default: break;
- }
- rsArrowName.Append( String::CreateFromInt32( nLineNumber ) );
- rnArrowWidth = (sal_Int32)( fLineWidth * fWidthMul );
-
- return aRetval;
-}
-
-void DffPropertyReader::ApplyLineAttributes( SfxItemSet& rSet, const MSO_SPT eShapeType ) const // #i28269#
-{
- UINT32 nLineFlags(GetPropertyValue( DFF_Prop_fNoLineDrawDash ));
-
- if(!IsHardAttribute( DFF_Prop_fLine ) && !IsCustomShapeStrokedByDefault( eShapeType ))
- {
- nLineFlags &= ~0x08;
- }
-
- if ( nLineFlags & 8 )
- {
- // Linienattribute
- sal_Int32 nLineWidth = (INT32)GetPropertyValue( DFF_Prop_lineWidth, 9525 );
-
- MSO_LineDashing eLineDashing = (MSO_LineDashing)GetPropertyValue( DFF_Prop_lineDashing, mso_lineSolid );
- if ( eLineDashing == mso_lineSolid )
- rSet.Put(XLineStyleItem( XLINE_SOLID ) );
- else
- {
-// MSO_LineCap eLineCap = (MSO_LineCap)GetPropertyValue( DFF_Prop_lineEndCapStyle, mso_lineEndCapSquare );
-
- XDashStyle eDash = XDASH_RECT;
- sal_uInt16 nDots = 1;
- sal_uInt32 nDotLen = nLineWidth / 360;
- sal_uInt16 nDashes = 0;
- sal_uInt32 nDashLen = ( 8 * nLineWidth ) / 360;
- sal_uInt32 nDistance = ( 3 * nLineWidth ) / 360;;
-
- switch ( eLineDashing )
- {
- default:
- case mso_lineDotSys :
- {
- nDots = 1;
- nDashes = 0;
- nDistance = nDotLen;
- }
- break;
-
- case mso_lineDashGEL :
- {
- nDots = 0;
- nDashes = 1;
- nDashLen = ( 4 * nLineWidth ) / 360;
- }
- break;
-
- case mso_lineDashDotGEL :
- {
- nDots = 1;
- nDashes = 1;
- nDashLen = ( 4 * nLineWidth ) / 360;
- }
- break;
-
- case mso_lineLongDashGEL :
- {
- nDots = 0;
- nDashes = 1;
- }
- break;
-
- case mso_lineLongDashDotGEL :
- {
- nDots = 1;
- nDashes = 1;
- }
- break;
-
- case mso_lineLongDashDotDotGEL:
- {
- nDots = 2;
- nDashes = 1;
- }
- break;
- }
-
- rSet.Put( XLineDashItem( String(), XDash( eDash, nDots, nDotLen, nDashes, nDashLen, nDistance ) ) );
- rSet.Put( XLineStyleItem( XLINE_DASH ) );
- }
- rSet.Put( XLineColorItem( String(), rManager.MSO_CLR_ToColor( GetPropertyValue( DFF_Prop_lineColor ), DFF_Prop_lineColor ) ) );
- if ( IsProperty( DFF_Prop_lineOpacity ) )
- {
- double nTrans = GetPropertyValue(DFF_Prop_lineOpacity, 0x10000);
- nTrans = (nTrans * 100) / 65536;
- rSet.Put(XLineTransparenceItem(
- sal_uInt16(100 - ::rtl::math::round(nTrans))));
- }
-
- rManager.ScaleEmu( nLineWidth );
- rSet.Put( XLineWidthItem( nLineWidth ) );
-
- // SJ: LineJoint (setting each time a line is set, because our internal joint type has another default)
- MSO_LineJoin eLineJointDefault = mso_lineJoinMiter;
- if ( eShapeType == mso_sptMin )
- eLineJointDefault = mso_lineJoinRound;
- MSO_LineJoin eLineJoint = (MSO_LineJoin)GetPropertyValue( DFF_Prop_lineJoinStyle, eLineJointDefault );
- XLineJoint eXLineJoint( XLINEJOINT_MITER );
- if ( eLineJoint == mso_lineJoinBevel )
- eXLineJoint = XLINEJOINT_BEVEL;
- else if ( eLineJoint == mso_lineJoinRound )
- eXLineJoint = XLINEJOINT_ROUND;
- rSet.Put( XLineJointItem( eXLineJoint ) );
-
- if ( nLineFlags & 0x10 )
- {
- sal_Bool bScaleArrows = rManager.pSdrModel->GetScaleUnit() == MAP_TWIP;
- ///////////////
- // LineStart //
- ///////////////
- if ( IsProperty( DFF_Prop_lineStartArrowhead ) )
- {
- MSO_LineEnd eLineEnd = (MSO_LineEnd)GetPropertyValue( DFF_Prop_lineStartArrowhead );
- MSO_LineEndWidth eWidth = (MSO_LineEndWidth)GetPropertyValue( DFF_Prop_lineStartArrowWidth, mso_lineMediumWidthArrow );
- MSO_LineEndLength eLenght = (MSO_LineEndLength)GetPropertyValue( DFF_Prop_lineStartArrowLength, mso_lineMediumLenArrow );
-
- sal_Int32 nArrowWidth;
- sal_Bool bArrowCenter;
- String aArrowName;
- basegfx::B2DPolygon aPoly(GetLineArrow( nLineWidth, eLineEnd, eWidth, eLenght, nArrowWidth, bArrowCenter, aArrowName, bScaleArrows ));
-
- rSet.Put( XLineStartWidthItem( nArrowWidth ) );
- rSet.Put( XLineStartItem( aArrowName, basegfx::B2DPolyPolygon(aPoly) ) );
- rSet.Put( XLineStartCenterItem( bArrowCenter ) );
- }
- /////////////
- // LineEnd //
- /////////////
- if ( IsProperty( DFF_Prop_lineEndArrowhead ) )
- {
- MSO_LineEnd eLineEnd = (MSO_LineEnd)GetPropertyValue( DFF_Prop_lineEndArrowhead );
- MSO_LineEndWidth eWidth = (MSO_LineEndWidth)GetPropertyValue( DFF_Prop_lineEndArrowWidth, mso_lineMediumWidthArrow );
- MSO_LineEndLength eLenght = (MSO_LineEndLength)GetPropertyValue( DFF_Prop_lineEndArrowLength, mso_lineMediumLenArrow );
-
- sal_Int32 nArrowWidth;
- sal_Bool bArrowCenter;
- String aArrowName;
- basegfx::B2DPolygon aPoly(GetLineArrow( nLineWidth, eLineEnd, eWidth, eLenght, nArrowWidth, bArrowCenter, aArrowName, bScaleArrows ));
-
- rSet.Put( XLineEndWidthItem( nArrowWidth ) );
- rSet.Put( XLineEndItem( aArrowName, basegfx::B2DPolyPolygon(aPoly) ) );
- rSet.Put( XLineEndCenterItem( bArrowCenter ) );
- }
- if ( IsProperty( DFF_Prop_lineEndCapStyle ) )
- {
- MSO_LineCap eLineCap = (MSO_LineCap)GetPropertyValue( DFF_Prop_lineEndCapStyle );
- const SfxPoolItem* pPoolItem = NULL;
- if ( rSet.GetItemState( XATTR_LINEDASH, FALSE, &pPoolItem ) == SFX_ITEM_SET )
- {
- XDashStyle eNewStyle = XDASH_RECT;
- if ( eLineCap == mso_lineEndCapRound )
- eNewStyle = XDASH_ROUND;
- const XDash& rOldDash = ( (const XLineDashItem*)pPoolItem )->GetDashValue();
- if ( rOldDash.GetDashStyle() != eNewStyle )
- {
- XDash aNew( rOldDash );
- aNew.SetDashStyle( eNewStyle );
- rSet.Put( XLineDashItem( XubString(), aNew ) );
- }
- }
- }
- }
- }
- else
- rSet.Put( XLineStyleItem( XLINE_NONE ) );
-}
-
-
-void DffPropertyReader::ApplyFillAttributes( SvStream& rIn, SfxItemSet& rSet, const MSO_SPT eShapeType ) const
-{
- UINT32 nFillFlags(GetPropertyValue( DFF_Prop_fNoFillHitTest ));
-
- if(!IsHardAttribute( DFF_Prop_fFilled ) && !IsCustomShapeFilledByDefault( eShapeType ))
- {
- nFillFlags &= ~0x10;
- }
-
- if ( nFillFlags & 0x10 )
- {
- MSO_FillType eMSO_FillType = (MSO_FillType)GetPropertyValue( DFF_Prop_fillType, mso_fillSolid );
- XFillStyle eXFill = XFILL_NONE;
- switch( eMSO_FillType )
- {
- case mso_fillSolid : // Fill with a solid color
- eXFill = XFILL_SOLID;
- break;
- case mso_fillPattern : // Fill with a pattern (bitmap)
- case mso_fillTexture : // A texture (pattern with its own color map)
- case mso_fillPicture : // Center a picture in the shape
- eXFill = XFILL_BITMAP;
- break;
- case mso_fillShadeShape : // Shade from shape outline to end point
- case mso_fillShade : // Shade from start to end points
- case mso_fillShadeCenter : // Shade from bounding rectangle to end point
- case mso_fillShadeScale : // Similar to mso_fillShade, but the fillAngle
- case mso_fillShadeTitle : // special type - shade to title --- for PP
- eXFill = XFILL_GRADIENT;
- break;
-// case mso_fillBackground : // Use the background fill color/pattern
- default: break;
- }
- rSet.Put( XFillStyleItem( eXFill ) );
-
- if (IsProperty(DFF_Prop_fillOpacity))
- {
- double nTrans = GetPropertyValue(DFF_Prop_fillOpacity);
- nTrans = (nTrans * 100) / 65536;
- rSet.Put(XFillTransparenceItem(
- sal_uInt16(100 - ::rtl::math::round(nTrans))));
- }
-
- if ( eXFill == XFILL_GRADIENT )
- {
- sal_Int32 nAngle = 3600 - ( ( Fix16ToAngle( GetPropertyValue( DFF_Prop_fillAngle, 0 ) ) + 5 ) / 10 );
-
- // Rotationswinkel in Bereich zwingen
- while ( nAngle >= 3600 )
- nAngle -= 3600;
- while ( nAngle < 0 )
- nAngle += 3600;
-
- sal_Int32 nFocus = GetPropertyValue( DFF_Prop_fillFocus, 0 );
- XGradientStyle eGrad = XGRAD_LINEAR;
- sal_Int32 nChgColors = 0;
-
- if ( !nAngle )
- nChgColors ^= 1;
-
- if ( !nFocus )
- nChgColors ^= 1;
- else if ( nFocus < 0 ) // Bei negativem Focus sind die Farben zu tauschen
- {
- nFocus =- nFocus;
- nChgColors ^= 1;
- }
- if( nFocus > 40 && nFocus < 60 )
- {
- eGrad = XGRAD_AXIAL; // Besser gehts leider nicht
- nChgColors ^= 1;
- }
- USHORT nFocusX = (USHORT)nFocus;
- USHORT nFocusY = (USHORT)nFocus;
-
- switch( eMSO_FillType )
- {
- case mso_fillShadeShape :
- {
- eGrad = XGRAD_RECT;
- nFocusY = nFocusX = 50;
- nChgColors ^= 1;
- }
- break;
- case mso_fillShadeCenter :
- {
- eGrad = XGRAD_RECT;
- nFocusX = ( IsProperty( DFF_Prop_fillToRight ) ) ? 100 : 0;
- nFocusY = ( IsProperty( DFF_Prop_fillToBottom ) ) ? 100 : 0;
- nChgColors ^= 1;
- }
- break;
- default: break;
- }
- Color aCol1( rManager.MSO_CLR_ToColor( GetPropertyValue( DFF_Prop_fillColor, COL_WHITE ), DFF_Prop_fillColor ) );
- Color aCol2( rManager.MSO_CLR_ToColor( GetPropertyValue( DFF_Prop_fillBackColor, COL_WHITE ), DFF_Prop_fillBackColor ) );
-
- if ( nChgColors )
- {
- Color aZwi( aCol1 );
- aCol1 = aCol2;
- aCol2 = aZwi;
- }
- if ( ( eShapeType == mso_sptEllipse ) && ( eMSO_FillType == mso_fillShadeShape ) )
- eGrad = XGRAD_ELLIPTICAL;
-
- XGradient aGrad( aCol2, aCol1, eGrad, nAngle, nFocusX, nFocusY );
- aGrad.SetStartIntens( 100 );
- aGrad.SetEndIntens( 100 );
- rSet.Put( XFillGradientItem( String(), aGrad ) );
- }
- else if ( eXFill == XFILL_BITMAP )
- {
- if( IsProperty( DFF_Prop_fillBlip ) )
- {
- Graphic aGraf;
- // first try to get BLIP from cache
- BOOL bOK = rManager.GetBLIP( GetPropertyValue( DFF_Prop_fillBlip ), aGraf, NULL );
- // then try directly from stream (i.e. Excel chart hatches/bitmaps)
- if ( !bOK )
- bOK = SeekToContent( DFF_Prop_fillBlip, rIn ) && rManager.GetBLIPDirect( rIn, aGraf, NULL );
- if ( bOK )
- {
- Bitmap aBmp( aGraf.GetBitmap() );
-
- if ( eMSO_FillType == mso_fillPattern )
- {
- Color aCol1( COL_WHITE ), aCol2( COL_WHITE );
- if ( IsProperty( DFF_Prop_fillColor ) )
- aCol1 = rManager.MSO_CLR_ToColor( GetPropertyValue( DFF_Prop_fillColor ), DFF_Prop_fillColor );
- if ( IsProperty( DFF_Prop_fillBackColor ) )
- aCol2 = rManager.MSO_CLR_ToColor( GetPropertyValue( DFF_Prop_fillBackColor ), DFF_Prop_fillBackColor );
-
- XOBitmap aXOBitmap;
-
- // Bitmap einsetzen
- aXOBitmap.SetBitmap( aBmp );
- aXOBitmap.SetBitmapType( XBITMAP_IMPORT );
-
- if( aBmp.GetSizePixel().Width() == 8 && aBmp.GetSizePixel().Height() == 8 && aBmp.GetColorCount() == 2)
- {
- aXOBitmap.Bitmap2Array();
- aXOBitmap.SetBitmapType( XBITMAP_8X8 );
- aXOBitmap.SetPixelSize( aBmp.GetSizePixel() );
-
- if( aXOBitmap.GetBackgroundColor() == COL_BLACK )
- {
- aXOBitmap.SetPixelColor( aCol1 );
- aXOBitmap.SetBackgroundColor( aCol2 );
- }
- else
- {
- aXOBitmap.SetPixelColor( aCol2 );
- aXOBitmap.SetBackgroundColor( aCol1 );
- }
- }
- rSet.Put( XFillBitmapItem( String(), aXOBitmap ) );
- }
- else if ( eMSO_FillType == mso_fillTexture )
- {
- XOBitmap aXBmp( aBmp, XBITMAP_STRETCH );
- rSet.Put( XFillBmpTileItem( sal_True ) );
- rSet.Put( XFillBitmapItem( String(), aXBmp ) );
- rSet.Put( XFillBmpSizeXItem( GetPropertyValue( DFF_Prop_fillWidth, 0 ) / 360 ) );
- rSet.Put( XFillBmpSizeYItem( GetPropertyValue( DFF_Prop_fillHeight, 0 ) / 360 ) );
- rSet.Put( XFillBmpSizeLogItem( sal_True ) );
- }
- else
- {
- XOBitmap aXBmp( aBmp, XBITMAP_STRETCH );
- rSet.Put( XFillBitmapItem( String(), aXBmp ) );
- rSet.Put( XFillBmpTileItem( sal_False ) );
- }
- }
- }
- }
- }
- else
- rSet.Put( XFillStyleItem( XFILL_NONE ) );
-}
-
-void DffPropertyReader::ApplyCustomShapeTextAttributes( SfxItemSet& rSet ) const
-{
-// sal_uInt32 nTextFlags = aTextObj.GetTextFlags();
- sal_Bool bVerticalText = sal_False;
- sal_Int32 nTextLeft = GetPropertyValue( DFF_Prop_dxTextLeft, 25 * 3600 ) / 360; // 0.25 cm (emu)
- sal_Int32 nTextRight = GetPropertyValue( DFF_Prop_dxTextRight, 25 * 3600 ) / 360; // 0.25 cm (emu)
- sal_Int32 nTextTop = GetPropertyValue( DFF_Prop_dyTextTop, 13 * 3600 ) / 360; // 0.13 cm (emu)
- sal_Int32 nTextBottom = GetPropertyValue( DFF_Prop_dyTextBottom, 13 * 3600 ) /360; // 0.13 cm (emu)
-
- SdrTextVertAdjust eTVA;
- SdrTextHorzAdjust eTHA;
-
- if ( IsProperty( DFF_Prop_txflTextFlow ) )
- {
- MSO_TextFlow eTextFlow = (MSO_TextFlow)( GetPropertyValue( DFF_Prop_txflTextFlow ) & 0xFFFF );
- switch( eTextFlow )
- {
- case mso_txflTtoBA : /* #68110# */ // Top to Bottom @-font, oben -> unten
- case mso_txflTtoBN : // Top to Bottom non-@, oben -> unten
- case mso_txflVertN : // Vertical, non-@, oben -> unten
- bVerticalText = sal_True; // nTextRotationAngle += 27000;
- break;
- default: break;
- }
- }
- sal_Int32 nFontDirection = GetPropertyValue( DFF_Prop_cdirFont, mso_cdir0 );
- if ( ( nFontDirection == 1 ) || ( nFontDirection == 3 ) )
- bVerticalText = !bVerticalText;
-
- if ( bVerticalText )
- {
- eTVA = SDRTEXTVERTADJUST_BLOCK;
- eTHA = SDRTEXTHORZADJUST_CENTER;
-
- // Textverankerung lesen
- MSO_Anchor eTextAnchor = (MSO_Anchor)GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
-
- switch( eTextAnchor )
- {
- case mso_anchorTop:
- case mso_anchorTopCentered:
- case mso_anchorTopBaseline:
- case mso_anchorTopCenteredBaseline:
- eTHA = SDRTEXTHORZADJUST_RIGHT;
- break;
-
- case mso_anchorMiddle :
- case mso_anchorMiddleCentered:
- eTHA = SDRTEXTHORZADJUST_CENTER;
- break;
-
- case mso_anchorBottom:
- case mso_anchorBottomCentered:
- case mso_anchorBottomBaseline:
- case mso_anchorBottomCenteredBaseline:
- eTHA = SDRTEXTHORZADJUST_LEFT;
- break;
- }
- // if there is a 100% use of following attributes, the textbox can been aligned also in vertical direction
- switch ( eTextAnchor )
- {
- case mso_anchorTopCentered :
- case mso_anchorMiddleCentered :
- case mso_anchorBottomCentered :
- case mso_anchorTopCenteredBaseline:
- case mso_anchorBottomCenteredBaseline:
- eTVA = SDRTEXTVERTADJUST_CENTER;
- break;
-
- default :
- eTVA = SDRTEXTVERTADJUST_TOP;
- break;
- }
- }
- else
- {
- eTVA = SDRTEXTVERTADJUST_CENTER;
- eTHA = SDRTEXTHORZADJUST_BLOCK;
-
- // Textverankerung lesen
- MSO_Anchor eTextAnchor = (MSO_Anchor)GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
-
- switch( eTextAnchor )
- {
- case mso_anchorTop:
- case mso_anchorTopCentered:
- case mso_anchorTopBaseline:
- case mso_anchorTopCenteredBaseline:
- eTVA = SDRTEXTVERTADJUST_TOP;
- break;
-
- case mso_anchorMiddle :
- case mso_anchorMiddleCentered:
- eTVA = SDRTEXTVERTADJUST_CENTER;
- break;
-
- case mso_anchorBottom:
- case mso_anchorBottomCentered:
- case mso_anchorBottomBaseline:
- case mso_anchorBottomCenteredBaseline:
- eTVA = SDRTEXTVERTADJUST_BOTTOM;
- break;
- }
- // if there is a 100% usage of following attributes, the textbox can be aligned also in horizontal direction
- switch ( eTextAnchor )
- {
- case mso_anchorTopCentered :
- case mso_anchorMiddleCentered :
- case mso_anchorBottomCentered :
- case mso_anchorTopCenteredBaseline:
- case mso_anchorBottomCenteredBaseline:
- eTHA = SDRTEXTHORZADJUST_CENTER; // the text has to be displayed using the full width;
- break;
-
- default :
- eTHA = SDRTEXTHORZADJUST_LEFT;
- break;
- }
- }
- rSet.Put( SvxFrameDirectionItem( bVerticalText ? FRMDIR_VERT_TOP_RIGHT : FRMDIR_HORI_LEFT_TOP, EE_PARA_WRITINGDIR ) );
-
- rSet.Put( SdrTextVertAdjustItem( eTVA ) );
- rSet.Put( SdrTextHorzAdjustItem( eTHA ) );
-
- rSet.Put( SdrTextLeftDistItem( nTextLeft ) );
- rSet.Put( SdrTextRightDistItem( nTextRight ) );
- rSet.Put( SdrTextUpperDistItem( nTextTop ) );
- rSet.Put( SdrTextLowerDistItem( nTextBottom ) );
-
- rSet.Put( SdrTextWordWrapItem( (MSO_WrapMode)GetPropertyValue( DFF_Prop_WrapText, mso_wrapSquare ) != mso_wrapNone ? sal_True : sal_False ) );
- rSet.Put( SdrTextAutoGrowHeightItem( ( GetPropertyValue( DFF_Prop_FitTextToShape ) & 2 ) != 0 ) );
-
-// rSet.Put( SdrTextAutoGrowWidthItem( (MSO_WrapMode)GetPropertyValue( DFF_Prop_WrapText, mso_wrapSquare ) != mso_wrapNone ? sal_False : sal_True ) );
-// rSet.Put( SdrTextAutoGrowHeightItem( ( GetPropertyValue( DFF_Prop_FitTextToShape ) & 2 ) != 0 ) );
-}
-
-void DffPropertyReader::ApplyCustomShapeGeometryAttributes( SvStream& rIn, SfxItemSet& rSet, const MSO_SPT eShapeType, const sal_uInt32 /* nShapeFlags */ ) const
-{
-
- sal_uInt32 nAdjustmentsWhichNeedsToBeConverted = 0;
-
- ///////////////////////////////////////
- // creating SdrCustomShapeGeometryItem //
- ///////////////////////////////////////
- typedef uno::Sequence< beans::PropertyValue > PropSeq;
- typedef std::vector< beans::PropertyValue > PropVec;
- typedef PropVec::iterator PropVecIter;
- PropVecIter aIter;
- PropVecIter aEnd;
-
-
- // aPropVec will be filled with all PropertyValues
- PropVec aPropVec;
- PropertyValue aProp;
-
- /////////////////////////////////////////////////////////////////////
- // "Type" property, including the predefined CustomShape type name //
- /////////////////////////////////////////////////////////////////////
- const rtl::OUString sType( RTL_CONSTASCII_USTRINGPARAM ( "Type" ) );
- aProp.Name = sType;
- aProp.Value <<= EnhancedCustomShapeTypeNames::Get( eShapeType );
- aPropVec.push_back( aProp );
-
-/*
- /////////////////
- // "MirroredX" //
- /////////////////
- if ( nShapeFlags & SP_FFLIPH )
- {
- const rtl::OUString sMirroredX( RTL_CONSTASCII_USTRINGPARAM ( "MirroredX" ) );
- sal_Bool bMirroredX = sal_True;
- aProp.Name = sMirroredX;
- aProp.Value <<= bMirroredX;
- aPropVec.push_back( aProp );
- }
- /////////////////
- // "MirroredY" //
- /////////////////
- if ( nShapeFlags & SP_FFLIPV )
- {
- const rtl::OUString sMirroredY( RTL_CONSTASCII_USTRINGPARAM ( "MirroredY" ) );
- sal_Bool bMirroredY = sal_True;
- aProp.Name = sMirroredY;
- aProp.Value <<= bMirroredY;
- aPropVec.push_back( aProp );
- }
-*/
- ///////////////
- // "ViewBox" //
- ///////////////
-
- sal_Int32 nCoordWidth = 21600; // needed to replace handle type center with absolute value
- sal_Int32 nCoordHeight= 21600;
- if ( IsProperty( DFF_Prop_geoLeft ) || IsProperty( DFF_Prop_geoTop ) || IsProperty( DFF_Prop_geoRight ) || IsProperty( DFF_Prop_geoBottom ) )
- {
- com::sun::star::awt::Rectangle aViewBox;
- const rtl::OUString sViewBox( RTL_CONSTASCII_USTRINGPARAM ( "ViewBox" ) );
- aViewBox.X = GetPropertyValue( DFF_Prop_geoLeft, 0 );
- aViewBox.Y = GetPropertyValue( DFF_Prop_geoTop, 0 );
- aViewBox.Width = nCoordWidth = ((sal_Int32)GetPropertyValue( DFF_Prop_geoRight, 21600 ) ) - aViewBox.X;
- aViewBox.Height = nCoordHeight = ((sal_Int32)GetPropertyValue( DFF_Prop_geoBottom, 21600 ) ) - aViewBox.Y;
- aProp.Name = sViewBox;
- aProp.Value <<= aViewBox;
- aPropVec.push_back( aProp );
- }
- /////////////////////
- // TextRotateAngle //
- /////////////////////
- if ( IsProperty( DFF_Prop_txflTextFlow ) || IsProperty( DFF_Prop_cdirFont ) )
- {
- sal_Int32 nTextRotateAngle = 0;
- MSO_TextFlow eTextFlow = (MSO_TextFlow)( GetPropertyValue( DFF_Prop_txflTextFlow ) & 0xFFFF );
-/* sal_Int32 nFontDirection = GetPropertyValue( DFF_Prop_cdirFont, mso_cdir0 ); */
-
- if ( eTextFlow == mso_txflBtoT ) // Bottom to Top non-@, unten -> oben
- nTextRotateAngle += 90;
- switch( GetPropertyValue( DFF_Prop_cdirFont, mso_cdir0 ) ) // SJ: mso_cdir90 and mso_cdir270 will be simulated by
- { // activating vertical writing for the text objects
- case mso_cdir90 :
- {
- if ( eTextFlow == mso_txflTtoBA )
- nTextRotateAngle -= 180;
- }
- break;
- case mso_cdir180: nTextRotateAngle -= 180; break;
- case mso_cdir270:
- {
- if ( eTextFlow != mso_txflTtoBA )
- nTextRotateAngle -= 180;
- }
- break;
- default: break;
- }
- if ( nTextRotateAngle )
- {
- double fTextRotateAngle = nTextRotateAngle;
- const rtl::OUString sTextRotateAngle( RTL_CONSTASCII_USTRINGPARAM ( "TextRotateAngle" ) );
- aProp.Name = sTextRotateAngle;
- aProp.Value <<= fTextRotateAngle;
- aPropVec.push_back( aProp );
- }
- }
- //////////////////////////////////////////
- // "Extrusion" PropertySequence element //
- //////////////////////////////////////////
- sal_Bool bExtrusionOn = ( GetPropertyValue( DFF_Prop_fc3DLightFace ) & 8 ) != 0;
- if ( bExtrusionOn )
- {
- PropVec aExtrusionPropVec;
-
- // "Extrusion"
- const rtl::OUString sExtrusionOn( RTL_CONSTASCII_USTRINGPARAM ( "Extrusion" ) );
- aProp.Name = sExtrusionOn;
- aProp.Value <<= bExtrusionOn;
- aExtrusionPropVec.push_back( aProp );
-
- // "Brightness"
- if ( IsProperty( DFF_Prop_c3DAmbientIntensity ) )
- {
- const rtl::OUString sExtrusionBrightness( RTL_CONSTASCII_USTRINGPARAM ( "Brightness" ) );
- double fBrightness = (sal_Int32)GetPropertyValue( DFF_Prop_c3DAmbientIntensity );
- fBrightness /= 655.36;
- aProp.Name = sExtrusionBrightness;
- aProp.Value <<= fBrightness;
- aExtrusionPropVec.push_back( aProp );
- }
- // "Depth" in 1/100mm
- if ( IsProperty( DFF_Prop_c3DExtrudeBackward ) || IsProperty( DFF_Prop_c3DExtrudeForward ) )
- {
- const rtl::OUString sDepth( RTL_CONSTASCII_USTRINGPARAM ( "Depth" ) );
- double fBackDepth = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DExtrudeBackward, 1270 * 360 )) / 360.0;
- double fForeDepth = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DExtrudeForward ), 0 ) / 360.0;
- double fDepth = fBackDepth + fForeDepth;
- double fFraction = fDepth != 0.0 ? fForeDepth / fDepth : 0;
- EnhancedCustomShapeParameterPair aDepthParaPair;
- aDepthParaPair.First.Value <<= fDepth;
- aDepthParaPair.First.Type = EnhancedCustomShapeParameterType::NORMAL;
- aDepthParaPair.Second.Value <<= fFraction;
- aDepthParaPair.Second.Type = EnhancedCustomShapeParameterType::NORMAL;
- aProp.Name = sDepth;
- aProp.Value <<= aDepthParaPair;
- aExtrusionPropVec.push_back( aProp );
- }
- // "Diffusion"
- if ( IsProperty( DFF_Prop_c3DDiffuseAmt ) )
- {
- const rtl::OUString sExtrusionDiffusion( RTL_CONSTASCII_USTRINGPARAM ( "Diffusion" ) );
- double fDiffusion = (sal_Int32)GetPropertyValue( DFF_Prop_c3DDiffuseAmt );
- fDiffusion /= 655.36;
- aProp.Name = sExtrusionDiffusion;
- aProp.Value <<= fDiffusion;
- aExtrusionPropVec.push_back( aProp );
- }
- // "NumberOfLineSegments"
- if ( IsProperty( DFF_Prop_c3DTolerance ) )
- {
- const rtl::OUString sExtrusionNumberOfLineSegments( RTL_CONSTASCII_USTRINGPARAM ( "NumberOfLineSegments" ) );
- aProp.Name = sExtrusionNumberOfLineSegments;
- aProp.Value <<= (sal_Int32)GetPropertyValue( DFF_Prop_c3DTolerance );
- aExtrusionPropVec.push_back( aProp );
- }
- // "LightFace"
- const rtl::OUString sExtrusionLightFace( RTL_CONSTASCII_USTRINGPARAM ( "LightFace" ) );
- sal_Bool bExtrusionLightFace = ( GetPropertyValue( DFF_Prop_fc3DLightFace ) & 1 ) != 0;
- aProp.Name = sExtrusionLightFace;
- aProp.Value <<= bExtrusionLightFace;
- aExtrusionPropVec.push_back( aProp );
- // "FirstLightHarsh"
- const rtl::OUString sExtrusionFirstLightHarsh( RTL_CONSTASCII_USTRINGPARAM ( "FirstLightHarsh" ) );
- sal_Bool bExtrusionFirstLightHarsh = ( GetPropertyValue( DFF_Prop_fc3DFillHarsh ) & 2 ) != 0;
- aProp.Name = sExtrusionFirstLightHarsh;
- aProp.Value <<= bExtrusionFirstLightHarsh;
- aExtrusionPropVec.push_back( aProp );
- // "SecondLightHarsh"
- const rtl::OUString sExtrusionSecondLightHarsh( RTL_CONSTASCII_USTRINGPARAM ( "SecondLightHarsh" ) );
- sal_Bool bExtrusionSecondLightHarsh = ( GetPropertyValue( DFF_Prop_fc3DFillHarsh ) & 1 ) != 0;
- aProp.Name = sExtrusionSecondLightHarsh;
- aProp.Value <<= bExtrusionSecondLightHarsh;
- aExtrusionPropVec.push_back( aProp );
- // "FirstLightLevel"
- if ( IsProperty( DFF_Prop_c3DKeyIntensity ) )
- {
- const rtl::OUString sExtrusionFirstLightLevel( RTL_CONSTASCII_USTRINGPARAM ( "FirstLightLevel" ) );
- double fFirstLightLevel = (sal_Int32)GetPropertyValue( DFF_Prop_c3DKeyIntensity );
- fFirstLightLevel /= 655.36;
- aProp.Name = sExtrusionFirstLightLevel;
- aProp.Value <<= fFirstLightLevel;
- aExtrusionPropVec.push_back( aProp );
- }
- // "SecondLightLevel"
- if ( IsProperty( DFF_Prop_c3DFillIntensity ) )
- {
- const rtl::OUString sExtrusionSecondLightLevel( RTL_CONSTASCII_USTRINGPARAM ( "SecondLightLevel" ) );
- double fSecondLightLevel = (sal_Int32)GetPropertyValue( DFF_Prop_c3DFillIntensity );
- fSecondLightLevel /= 655.36;
- aProp.Name = sExtrusionSecondLightLevel;
- aProp.Value <<= fSecondLightLevel;
- aExtrusionPropVec.push_back( aProp );
- }
- // "FirtstLightDirection"
- if ( IsProperty( DFF_Prop_c3DKeyX ) || IsProperty( DFF_Prop_c3DKeyY ) || IsProperty( DFF_Prop_c3DKeyZ ) )
- {
- double fLightX = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DKeyX, 50000 ));
- double fLightY = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DKeyY, 0 ));
- double fLightZ = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DKeyZ, 10000 ));
- ::com::sun::star::drawing::Direction3D aExtrusionFirstLightDirection( fLightX, fLightY, fLightZ );
- const rtl::OUString sExtrusionFirstLightDirection( RTL_CONSTASCII_USTRINGPARAM ( "FirstLightDirection" ) );
- aProp.Name = sExtrusionFirstLightDirection;
- aProp.Value <<= aExtrusionFirstLightDirection;
- aExtrusionPropVec.push_back( aProp );
- }
- // "SecondLightDirection"
- if ( IsProperty( DFF_Prop_c3DFillX ) || IsProperty( DFF_Prop_c3DFillY ) || IsProperty( DFF_Prop_c3DFillZ ) )
- {
- double fLight2X = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DFillX, (sal_uInt32)-50000 ));
- double fLight2Y = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DFillY, 0 ));
- double fLight2Z = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DFillZ, 10000 ));
- ::com::sun::star::drawing::Direction3D aExtrusionSecondLightDirection( fLight2X, fLight2Y, fLight2Z );
- const rtl::OUString sExtrusionSecondLightDirection( RTL_CONSTASCII_USTRINGPARAM ( "SecondLightDirection" ) );
- aProp.Name = sExtrusionSecondLightDirection;
- aProp.Value <<= aExtrusionSecondLightDirection;
- aExtrusionPropVec.push_back( aProp );
- }
-
-/* LockRotationCenter, OrientationAngle and Orientation needs to be converted to use the properties AngleX, AngleY and RotationAngle instead.
- // "LockRotationCenter"
- const rtl::OUString sExtrusionLockRotationCenter( RTL_CONSTASCII_USTRINGPARAM ( "LockRotationCenter" ) );
- sal_Bool bExtrusionLockRotationCenter = ( GetPropertyValue( DFF_Prop_fc3DFillHarsh ) & 16 ) != 0;
- aProp.Name = sExtrusionLockRotationCenter;
- aProp.Value <<= bExtrusionLockRotationCenter;
- aExtrusionPropVec.push_back( aProp );
-
- // "Orientation"
- if ( IsProperty( DFF_Prop_c3DRotationAxisX ) || IsProperty( DFF_Prop_c3DRotationAxisY ) || IsProperty( DFF_Prop_c3DRotationAxisZ ) )
- {
- double fRotX = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DRotationAxisX, 100 ));
- double fRotY = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DRotationAxisY, 0 ));
- double fRotZ = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DRotationAxisZ, 0 ));
- ::com::sun::star::drawing::Direction3D aExtrusionDirection( fRotX, fRotY, fRotZ );
- const rtl::OUString sExtrusionDirection( RTL_CONSTASCII_USTRINGPARAM ( "Orientation" ) );
- aProp.Name = sExtrusionDirection;
- aProp.Value <<= aExtrusionDirection;
- aExtrusionPropVec.push_back( aProp );
- }
- // "OrientationAngle" in Grad
- if ( IsProperty( DFF_Prop_c3DRotationAngle ) )
- {
- const rtl::OUString sExtrusionOrientationAngle( RTL_CONSTASCII_USTRINGPARAM ( "OrientationAngle" ) );
- double fOrientationAngle = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DRotationAngle )) / 65536.0;
- aProp.Name = sExtrusionOrientationAngle;
- aProp.Value <<= fOrientationAngle;
- aExtrusionPropVec.push_back( aProp );
- }
-*/
-
- // "Metal"
- const rtl::OUString sExtrusionMetal( RTL_CONSTASCII_USTRINGPARAM ( "Metal" ) );
- sal_Bool bExtrusionMetal = ( GetPropertyValue( DFF_Prop_fc3DLightFace ) & 4 ) != 0;
- aProp.Name = sExtrusionMetal;
- aProp.Value <<= bExtrusionMetal;
- aExtrusionPropVec.push_back( aProp );
-// if ( IsProperty( DFF_Prop_c3DExtrudePlane ) )
-// {
-// UPS
-// }
- // "ShadeMode"
- if ( IsProperty( DFF_Prop_c3DRenderMode ) )
- {
- const rtl::OUString sExtrusionShadeMode( RTL_CONSTASCII_USTRINGPARAM ( "ShadeMode" ) );
- sal_uInt32 nExtrusionRenderMode = GetPropertyValue( DFF_Prop_c3DRenderMode );
- com::sun::star::drawing::ShadeMode eExtrusionShadeMode( com::sun::star::drawing::ShadeMode_FLAT );
- if ( nExtrusionRenderMode == mso_Wireframe )
- eExtrusionShadeMode = com::sun::star::drawing::ShadeMode_DRAFT;
-
- aProp.Name = sExtrusionShadeMode;
- aProp.Value <<= eExtrusionShadeMode;
- aExtrusionPropVec.push_back( aProp );
- }
- // "RotateAngle" in Grad
- if ( IsProperty( DFF_Prop_c3DXRotationAngle ) || IsProperty( DFF_Prop_c3DYRotationAngle ) )
- {
- const rtl::OUString sExtrusionAngle( RTL_CONSTASCII_USTRINGPARAM ( "RotateAngle" ) );
- double fAngleX = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DXRotationAngle, 0 )) / 65536.0;
- double fAngleY = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DYRotationAngle, 0 )) / 65536.0;
- EnhancedCustomShapeParameterPair aRotateAnglePair;
- aRotateAnglePair.First.Value <<= fAngleX;
- aRotateAnglePair.First.Type = EnhancedCustomShapeParameterType::NORMAL;
- aRotateAnglePair.Second.Value <<= fAngleY;
- aRotateAnglePair.Second.Type = EnhancedCustomShapeParameterType::NORMAL;
- aProp.Name = sExtrusionAngle;
- aProp.Value <<= aRotateAnglePair;
- aExtrusionPropVec.push_back( aProp );
- }
-
- // "AutoRotationCenter"
- if ( ( GetPropertyValue( DFF_Prop_fc3DFillHarsh ) & 8 ) == 0 )
- {
- // "RotationCenter"
- if ( IsProperty( DFF_Prop_c3DRotationCenterX ) || IsProperty( DFF_Prop_c3DRotationCenterY ) || IsProperty( DFF_Prop_c3DRotationCenterZ ) )
- {
- ::com::sun::star::drawing::Direction3D aRotationCenter(
- (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DRotationCenterX, 0 )) / 360.0,
- (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DRotationCenterY, 0 )) / 360.0,
- (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DRotationCenterZ, 0 )) / 360.0 );
-
- const rtl::OUString sExtrusionRotationCenter( RTL_CONSTASCII_USTRINGPARAM ( "RotationCenter" ) );
- aProp.Name = sExtrusionRotationCenter;
- aProp.Value <<= aRotationCenter;
- aExtrusionPropVec.push_back( aProp );
- }
- }
- // "Shininess"
- if ( IsProperty( DFF_Prop_c3DShininess ) )
- {
- const rtl::OUString sExtrusionShininess( RTL_CONSTASCII_USTRINGPARAM ( "Shininess" ) );
- double fShininess = (sal_Int32)GetPropertyValue( DFF_Prop_c3DShininess );
- fShininess /= 655.36;
- aProp.Name = sExtrusionShininess;
- aProp.Value <<= fShininess;
- aExtrusionPropVec.push_back( aProp );
- }
- // "Skew"
- if ( IsProperty( DFF_Prop_c3DSkewAmount ) || IsProperty( DFF_Prop_c3DSkewAngle ) )
- {
- const rtl::OUString sExtrusionSkew( RTL_CONSTASCII_USTRINGPARAM ( "Skew" ) );
- double fSkewAmount = (sal_Int32)GetPropertyValue( DFF_Prop_c3DSkewAmount, 50 );
- double fSkewAngle = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DSkewAngle, sal::static_int_cast< UINT32 >(-135 * 65536) )) / 65536.0;
-
- EnhancedCustomShapeParameterPair aSkewPair;
- aSkewPair.First.Value <<= fSkewAmount;
- aSkewPair.First.Type = EnhancedCustomShapeParameterType::NORMAL;
- aSkewPair.Second.Value <<= fSkewAngle;
- aSkewPair.Second.Type = EnhancedCustomShapeParameterType::NORMAL;
- aProp.Name = sExtrusionSkew;
- aProp.Value <<= aSkewPair;
- aExtrusionPropVec.push_back( aProp );
- }
- // "Specularity"
- if ( IsProperty( DFF_Prop_c3DSpecularAmt ) )
- {
- const rtl::OUString sExtrusionSpecularity( RTL_CONSTASCII_USTRINGPARAM ( "Specularity" ) );
- double fSpecularity = (sal_Int32)GetPropertyValue( DFF_Prop_c3DSpecularAmt );
- fSpecularity /= 1333;
- aProp.Name = sExtrusionSpecularity;
- aProp.Value <<= fSpecularity;
- aExtrusionPropVec.push_back( aProp );
- }
- // "ProjectionMode"
- const rtl::OUString sExtrusionProjectionMode( RTL_CONSTASCII_USTRINGPARAM ( "ProjectionMode" ) );
- ProjectionMode eProjectionMode = GetPropertyValue( DFF_Prop_fc3DFillHarsh ) & 4 ? ProjectionMode_PARALLEL : ProjectionMode_PERSPECTIVE;
- aProp.Name = sExtrusionProjectionMode;
- aProp.Value <<= eProjectionMode;
- aExtrusionPropVec.push_back( aProp );
-
- // "ViewPoint" in 1/100mm
- if ( IsProperty( DFF_Prop_c3DXViewpoint ) || IsProperty( DFF_Prop_c3DYViewpoint ) || IsProperty( DFF_Prop_c3DZViewpoint ) )
- {
- double fViewX = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DXViewpoint, 1249920 )) / 360.0;
- double fViewY = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DYViewpoint, (sal_uInt32)-1249920 ))/ 360.0;
- double fViewZ = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DZViewpoint, 9000000 )) / 360.0;
- ::com::sun::star::drawing::Position3D aExtrusionViewPoint( fViewX, fViewY, fViewZ );
- const rtl::OUString sExtrusionViewPoint( RTL_CONSTASCII_USTRINGPARAM ( "ViewPoint" ) );
- aProp.Name = sExtrusionViewPoint;
- aProp.Value <<= aExtrusionViewPoint;
- aExtrusionPropVec.push_back( aProp );
- }
- // "Origin"
- if ( IsProperty( DFF_Prop_c3DOriginX ) || IsProperty( DFF_Prop_c3DOriginY ) )
- {
- const rtl::OUString sExtrusionOrigin( RTL_CONSTASCII_USTRINGPARAM ( "Origin" ) );
- double fOriginX = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DOriginX, 0 ));
- double fOriginY = (double)((sal_Int32)GetPropertyValue( DFF_Prop_c3DOriginY, 0 ));
- fOriginX /= 65536;
- fOriginY /= 65536;
- EnhancedCustomShapeParameterPair aOriginPair;
- aOriginPair.First.Value <<= fOriginX;
- aOriginPair.First.Type = EnhancedCustomShapeParameterType::NORMAL;
- aOriginPair.Second.Value <<= fOriginY;
- aOriginPair.Second.Type = EnhancedCustomShapeParameterType::NORMAL;
- aProp.Name = sExtrusionOrigin;
- aProp.Value <<= aOriginPair;
- aExtrusionPropVec.push_back( aProp );
- }
- // "ExtrusionColor"
- const rtl::OUString sExtrusionColor( RTL_CONSTASCII_USTRINGPARAM ( "Color" ) );
- sal_Bool bExtrusionColor = IsProperty( DFF_Prop_c3DExtrusionColor ); // ( GetPropertyValue( DFF_Prop_fc3DLightFace ) & 2 ) != 0;
- aProp.Name = sExtrusionColor;
- aProp.Value <<= bExtrusionColor;
- aExtrusionPropVec.push_back( aProp );
- if ( IsProperty( DFF_Prop_c3DExtrusionColor ) )
- rSet.Put( XSecondaryFillColorItem( String(), rManager.MSO_CLR_ToColor(
- GetPropertyValue( DFF_Prop_c3DExtrusionColor ), DFF_Prop_c3DExtrusionColor ) ) );
- // pushing the whole Extrusion element
- const rtl::OUString sExtrusion( RTL_CONSTASCII_USTRINGPARAM ( "Extrusion" ) );
- PropSeq aExtrusionPropSeq( aExtrusionPropVec.size() );
- aIter = aExtrusionPropVec.begin();
- aEnd = aExtrusionPropVec.end();
- beans::PropertyValue* pExtrusionValues = aExtrusionPropSeq.getArray();
- while ( aIter != aEnd )
- *pExtrusionValues++ = *aIter++;
- aProp.Name = sExtrusion;
- aProp.Value <<= aExtrusionPropSeq;
- aPropVec.push_back( aProp );
- }
-
- /////////////////////////////////////////
- // "Equations" PropertySequence element //
- /////////////////////////////////////////
- if ( IsProperty( DFF_Prop_pFormulas ) )
- {
- sal_uInt16 i;
- sal_uInt16 nNumElem = 0;
- sal_uInt16 nNumElemMem = 0;
- sal_uInt16 nElemSize = 8;
-
- if ( SeekToContent( DFF_Prop_pFormulas, rIn ) )
- rIn >> nNumElem >> nNumElemMem >> nElemSize;
-
- sal_Int16 nP1, nP2, nP3;
- sal_uInt16 nFlags;
-
- uno::Sequence< rtl::OUString > aEquations( nNumElem );
- for ( i = 0; i < nNumElem; i++ )
- {
- rIn >> nFlags >> nP1 >> nP2 >> nP3;
- aEquations[ i ] = EnhancedCustomShape2d::GetEquation( nFlags, nP1, nP2, nP3 );
- }
- // pushing the whole Equations element
- const rtl::OUString sEquations( RTL_CONSTASCII_USTRINGPARAM ( "Equations" ) );
- aProp.Name = sEquations;
- aProp.Value <<= aEquations;
- aPropVec.push_back( aProp );
- }
-
- ////////////////////////////////////////
- // "Handles" PropertySequence element //
- ////////////////////////////////////////
- if ( IsProperty( DFF_Prop_Handles ) )
- {
- sal_uInt16 i;
- sal_uInt16 nNumElem = 0;
- sal_uInt16 nNumElemMem = 0;
- sal_uInt16 nElemSize = 36;
-
- if ( SeekToContent( DFF_Prop_Handles, rIn ) )
- rIn >> nNumElem >> nNumElemMem >> nElemSize;
- if ( nElemSize == 36 )
- {
- uno::Sequence< beans::PropertyValues > aHandles( nNumElem );
- for ( i = 0; i < nNumElem; i++ )
- {
- PropVec aHandlePropVec;
- sal_uInt32 nFlags;
- sal_Int32 nPositionX, nPositionY, nCenterX, nCenterY, nRangeXMin, nRangeXMax, nRangeYMin, nRangeYMax;
- rIn >> nFlags
- >> nPositionX
- >> nPositionY
- >> nCenterX
- >> nCenterY
- >> nRangeXMin
- >> nRangeXMax
- >> nRangeYMin
- >> nRangeYMax;
-
- if ( nPositionX == 2 ) // replacing center position with absolute value
- nPositionX = nCoordWidth / 2;
- if ( nPositionY == 2 )
- nPositionY = nCoordHeight / 2;
- EnhancedCustomShapeParameterPair aPosition;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aPosition.First, nPositionX, sal_True, sal_True );
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aPosition.Second, nPositionY, sal_True, sal_False );
- const rtl::OUString sHandlePosition( RTL_CONSTASCII_USTRINGPARAM ( "Position" ) );
- aProp.Name = sHandlePosition;
- aProp.Value <<= aPosition;
- aHandlePropVec.push_back( aProp );
-
- if ( nFlags & MSDFF_HANDLE_FLAGS_MIRRORED_X )
- {
- sal_Bool bMirroredX = sal_True;
- const rtl::OUString sHandleMirroredX( RTL_CONSTASCII_USTRINGPARAM ( "MirroredX" ) );
- aProp.Name = sHandleMirroredX;
- aProp.Value <<= bMirroredX;
- aHandlePropVec.push_back( aProp );
- }
- if ( nFlags & MSDFF_HANDLE_FLAGS_MIRRORED_Y )
- {
- sal_Bool bMirroredY = sal_True;
- const rtl::OUString sHandleMirroredY( RTL_CONSTASCII_USTRINGPARAM ( "MirroredY" ) );
- aProp.Name = sHandleMirroredY;
- aProp.Value <<= bMirroredY;
- aHandlePropVec.push_back( aProp );
- }
- if ( nFlags & MSDFF_HANDLE_FLAGS_SWITCHED )
- {
- sal_Bool bSwitched = sal_True;
- const rtl::OUString sHandleSwitched( RTL_CONSTASCII_USTRINGPARAM ( "Switched" ) );
- aProp.Name = sHandleSwitched;
- aProp.Value <<= bSwitched;
- aHandlePropVec.push_back( aProp );
- }
- if ( nFlags & MSDFF_HANDLE_FLAGS_POLAR )
- {
- if ( nCenterX == 2 )
- nCenterX = nCoordWidth / 2;
- if ( nCenterY == 2 )
- nCenterY = nCoordHeight / 2;
- if ( ( nPositionY >= 0x256 ) || ( nPositionY <= 0x107 ) ) // position y
- nAdjustmentsWhichNeedsToBeConverted |= ( 1 << i );
- EnhancedCustomShapeParameterPair aPolar;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aPolar.First, nCenterX, ( nFlags & 0x800 ) != 0, sal_True );
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aPolar.Second, nCenterY, ( nFlags & 0x1000 ) != 0, sal_False );
- const rtl::OUString sHandlePolar( RTL_CONSTASCII_USTRINGPARAM ( "Polar" ) );
- aProp.Name = sHandlePolar;
- aProp.Value <<= aPolar;
- aHandlePropVec.push_back( aProp );
- }
- if ( nFlags & MSDFF_HANDLE_FLAGS_MAP )
- {
- if ( nCenterX == 2 )
- nCenterX = nCoordWidth / 2;
- if ( nCenterY == 2 )
- nCenterY = nCoordHeight / 2;
- EnhancedCustomShapeParameterPair aMap;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aMap.First, nCenterX, ( nFlags & 0x800 ) != 0, sal_True );
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aMap.Second, nCenterY, ( nFlags & 0x1000 ) != 0, sal_False );
- const rtl::OUString sHandleMap( RTL_CONSTASCII_USTRINGPARAM ( "Map" ) );
- aProp.Name = sHandleMap;
- aProp.Value <<= aMap;
- aHandlePropVec.push_back( aProp );
- }
- if ( nFlags & MSDFF_HANDLE_FLAGS_RANGE )
- {
- if ( (sal_uInt32)nRangeXMin != 0x80000000 )
- {
- if ( nRangeXMin == 2 )
- nRangeXMin = nCoordWidth / 2;
- EnhancedCustomShapeParameter aRangeXMinimum;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aRangeXMinimum, nRangeXMin,
- ( nFlags & MSDFF_HANDLE_FLAGS_RANGE_X_MIN_IS_SPECIAL ) != 0, sal_True );
- const rtl::OUString sHandleRangeXMinimum( RTL_CONSTASCII_USTRINGPARAM ( "RangeXMinimum" ) );
- aProp.Name = sHandleRangeXMinimum;
- aProp.Value <<= aRangeXMinimum;
- aHandlePropVec.push_back( aProp );
- }
- if ( (sal_uInt32)nRangeXMax != 0x7fffffff )
- {
- if ( nRangeXMax == 2 )
- nRangeXMax = nCoordWidth / 2;
- EnhancedCustomShapeParameter aRangeXMaximum;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aRangeXMaximum, nRangeXMax,
- ( nFlags & MSDFF_HANDLE_FLAGS_RANGE_X_MAX_IS_SPECIAL ) != 0, sal_False );
- const rtl::OUString sHandleRangeXMaximum( RTL_CONSTASCII_USTRINGPARAM ( "RangeXMaximum" ) );
- aProp.Name = sHandleRangeXMaximum;
- aProp.Value <<= aRangeXMaximum;
- aHandlePropVec.push_back( aProp );
- }
- if ( (sal_uInt32)nRangeYMin != 0x80000000 )
- {
- if ( nRangeYMin == 2 )
- nRangeYMin = nCoordHeight / 2;
- EnhancedCustomShapeParameter aRangeYMinimum;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aRangeYMinimum, nRangeYMin,
- ( nFlags & MSDFF_HANDLE_FLAGS_RANGE_Y_MIN_IS_SPECIAL ) != 0, sal_True );
- const rtl::OUString sHandleRangeYMinimum( RTL_CONSTASCII_USTRINGPARAM ( "RangeYMinimum" ) );
- aProp.Name = sHandleRangeYMinimum;
- aProp.Value <<= aRangeYMinimum;
- aHandlePropVec.push_back( aProp );
- }
- if ( (sal_uInt32)nRangeYMax != 0x7fffffff )
- {
- if ( nRangeYMax == 2 )
- nRangeYMax = nCoordHeight / 2;
- EnhancedCustomShapeParameter aRangeYMaximum;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aRangeYMaximum, nRangeYMax,
- ( nFlags & MSDFF_HANDLE_FLAGS_RANGE_Y_MAX_IS_SPECIAL ) != 0, sal_False );
- const rtl::OUString sHandleRangeYMaximum( RTL_CONSTASCII_USTRINGPARAM ( "RangeYMaximum" ) );
- aProp.Name = sHandleRangeYMaximum;
- aProp.Value <<= aRangeYMaximum;
- aHandlePropVec.push_back( aProp );
- }
- }
- if ( nFlags & MSDFF_HANDLE_FLAGS_RADIUS_RANGE )
- {
- if ( (sal_uInt32)nRangeXMin != 0x7fffffff )
- {
- if ( nRangeXMin == 2 )
- nRangeXMin = nCoordWidth / 2;
- EnhancedCustomShapeParameter aRadiusRangeMinimum;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aRadiusRangeMinimum, nRangeXMin,
- ( nFlags & MSDFF_HANDLE_FLAGS_RANGE_X_MIN_IS_SPECIAL ) != 0, sal_True );
- const rtl::OUString sHandleRadiusRangeMinimum( RTL_CONSTASCII_USTRINGPARAM ( "RadiusRangeMinimum" ) );
- aProp.Name = sHandleRadiusRangeMinimum;
- aProp.Value <<= aRadiusRangeMinimum;
- aHandlePropVec.push_back( aProp );
- }
- if ( (sal_uInt32)nRangeXMax != 0x80000000 )
- {
- if ( nRangeXMax == 2 )
- nRangeXMax = nCoordWidth / 2;
- EnhancedCustomShapeParameter aRadiusRangeMaximum;
- EnhancedCustomShape2d::SetEnhancedCustomShapeHandleParameter( aRadiusRangeMaximum, nRangeXMax,
- ( nFlags & MSDFF_HANDLE_FLAGS_RANGE_X_MAX_IS_SPECIAL ) != 0, sal_False );
- const rtl::OUString sHandleRadiusRangeMaximum( RTL_CONSTASCII_USTRINGPARAM ( "RadiusRangeMaximum" ) );
- aProp.Name = sHandleRadiusRangeMaximum;
- aProp.Value <<= aRadiusRangeMaximum;
- aHandlePropVec.push_back( aProp );
- }
- }
- if ( aHandlePropVec.size() )
- {
- PropSeq aHandlePropSeq( aHandlePropVec.size() );
- aIter = aHandlePropVec.begin();
- aEnd = aHandlePropVec.end();
- beans::PropertyValue* pHandleValues = aHandlePropSeq.getArray();
- while ( aIter != aEnd )
- *pHandleValues++ = *aIter++;
- aHandles[ i ] = aHandlePropSeq;
- }
- }
- // pushing the whole Handles element
- const rtl::OUString sHandles( RTL_CONSTASCII_USTRINGPARAM ( "Handles" ) );
- aProp.Name = sHandles;
- aProp.Value <<= aHandles;
- aPropVec.push_back( aProp );
- }
- }
- else
- {
- const mso_CustomShape* pDefCustomShape = GetCustomShapeContent( eShapeType );
- if ( pDefCustomShape && pDefCustomShape->nHandles && pDefCustomShape->pHandles )
- {
- sal_Int32 i, nCnt = pDefCustomShape->nHandles;
- const SvxMSDffHandle* pData = pDefCustomShape->pHandles;
- for ( i = 0; i < nCnt; i++, pData++ )
- {
- if ( pData->nFlags & MSDFF_HANDLE_FLAGS_POLAR )
- {
- if ( ( pData->nPositionY >= 0x256 ) || ( pData->nPositionY <= 0x107 ) )
- nAdjustmentsWhichNeedsToBeConverted |= ( 1 << i );
- }
- }
- }
- }
- /////////////////////////////////////
- // "Path" PropertySequence element //
- /////////////////////////////////////
- {
- PropVec aPathPropVec;
-
- // "Path/ExtrusionAllowed"
- if ( IsHardAttribute( DFF_Prop_f3DOK ) )
- {
- const rtl::OUString sExtrusionAllowed( RTL_CONSTASCII_USTRINGPARAM ( "ExtrusionAllowed" ) );
- sal_Bool bExtrusionAllowed = ( GetPropertyValue( DFF_Prop_fFillOK ) & 16 ) != 0;
- aProp.Name = sExtrusionAllowed;
- aProp.Value <<= bExtrusionAllowed;
- aPathPropVec.push_back( aProp );
- }
- // "Path/ConcentricGradientFillAllowed"
- if ( IsHardAttribute( DFF_Prop_fFillShadeShapeOK ) )
- {
- const rtl::OUString sConcentricGradientFillAllowed( RTL_CONSTASCII_USTRINGPARAM ( "ConcentricGradientFillAllowed" ) );
- sal_Bool bConcentricGradientFillAllowed = ( GetPropertyValue( DFF_Prop_fFillOK ) & 2 ) != 0;
- aProp.Name = sConcentricGradientFillAllowed;
- aProp.Value <<= bConcentricGradientFillAllowed;
- aPathPropVec.push_back( aProp );
- }
- // "Path/TextPathAllowed"
- if ( IsHardAttribute( DFF_Prop_fGtextOK ) || ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x4000 ) )
- {
- const rtl::OUString sTextPathAllowed( RTL_CONSTASCII_USTRINGPARAM ( "TextPathAllowed" ) );
- sal_Bool bTextPathAllowed = ( GetPropertyValue( DFF_Prop_fFillOK ) & 4 ) != 0;
- aProp.Name = sTextPathAllowed;
- aProp.Value <<= bTextPathAllowed;
- aPathPropVec.push_back( aProp );
- }
- // Path/Coordinates
- if ( IsProperty( DFF_Prop_pVertices ) )
- {
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair > aCoordinates;
-
- sal_uInt16 i;
- sal_uInt16 nNumElemVert = 0;
- sal_uInt16 nNumElemMemVert = 0;
- sal_uInt16 nElemSizeVert = 8;
-
- if ( SeekToContent( DFF_Prop_pVertices, rIn ) )
- rIn >> nNumElemVert >> nNumElemMemVert >> nElemSizeVert;
- if ( nNumElemVert )
- {
- sal_Int32 nX, nY;
- sal_Int16 nTmpA, nTmpB;
- aCoordinates.realloc( nNumElemVert );
- for ( i = 0; i < nNumElemVert; i++ )
- {
- if ( nElemSizeVert == 8 )
- {
- rIn >> nX
- >> nY;
- }
- else
- {
- rIn >> nTmpA
- >> nTmpB;
-
- nX = nTmpA;
- nY = nTmpB;
- }
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aCoordinates[ i ].First, nX );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aCoordinates[ i ].Second, nY );
- }
- }
- const rtl::OUString sCoordinates( RTL_CONSTASCII_USTRINGPARAM ( "Coordinates" ) );
- aProp.Name = sCoordinates;
- aProp.Value <<= aCoordinates;
- aPathPropVec.push_back( aProp );
- }
- // Path/Segments
- if ( IsProperty( DFF_Prop_pSegmentInfo ) )
- {
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeSegment > aSegments;
-
- sal_uInt16 i, nTmp;
- sal_uInt16 nNumElemSeg = 0;
- sal_uInt16 nNumElemMemSeg = 0;
- sal_uInt16 nElemSizeSeg = 2;
-
- if ( SeekToContent( DFF_Prop_pSegmentInfo, rIn ) )
- rIn >> nNumElemSeg >> nNumElemMemSeg >> nElemSizeSeg;
- if ( nNumElemSeg )
- {
- sal_Int16 nCommand;
- sal_Int16 nCnt;
- aSegments.realloc( nNumElemSeg );
- for ( i = 0; i < nNumElemSeg; i++ )
- {
- rIn >> nTmp;
- nCommand = EnhancedCustomShapeSegmentCommand::UNKNOWN;
- nCnt = (sal_Int16)( nTmp & 0xfff );
- switch( nTmp >> 12 )
- {
- case 0x0: nCommand = EnhancedCustomShapeSegmentCommand::LINETO; if ( !nCnt ) nCnt = 1; break;
- case 0x1: nCommand = EnhancedCustomShapeSegmentCommand::LINETO; if ( !nCnt ) nCnt = 1; break; // seems to the relative lineto
- case 0x4: nCommand = EnhancedCustomShapeSegmentCommand::MOVETO; if ( !nCnt ) nCnt = 1; break;
- case 0x2: nCommand = EnhancedCustomShapeSegmentCommand::CURVETO; if ( !nCnt ) nCnt = 1; break;
- case 0x3: nCommand = EnhancedCustomShapeSegmentCommand::CURVETO; if ( !nCnt ) nCnt = 1; break; // seems to be the relative curveto
- case 0x8: nCommand = EnhancedCustomShapeSegmentCommand::ENDSUBPATH; nCnt = 0; break;
- case 0x6: nCommand = EnhancedCustomShapeSegmentCommand::CLOSESUBPATH; nCnt = 0; break;
- case 0xa:
- case 0xb:
- {
- switch ( ( nTmp >> 8 ) & 0xf )
- {
- case 0x0:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::LINETO;
- if ( !nCnt )
- nCnt = 1;
- }
- break;
- case 0x1:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::ANGLEELLIPSETO;
- nCnt = ( nTmp & 0xff ) / 3;
- }
- break;
- case 0x2:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::ANGLEELLIPSE;
- nCnt = ( nTmp & 0xff ) / 3;
- }
- break;
- case 0x3:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::ARCTO;
- nCnt = ( nTmp & 0xff ) >> 2;
- };
- break;
- case 0x4:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::ARC;
- nCnt = ( nTmp & 0xff ) >> 2;
- }
- break;
- case 0x5:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::CLOCKWISEARCTO;
- nCnt = ( nTmp & 0xff ) >> 2;
- }
- break;
- case 0x6:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::CLOCKWISEARC;
- nCnt = ( nTmp & 0xff ) >> 2;
- }
- break;
- case 0x7:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTX;
- nCnt = nTmp & 0xff;
- }
- break;
- case 0x8:
- {
- nCommand = EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTY;
- nCnt = nTmp & 0xff;
- }
- break;
- case 0xa: nCommand = EnhancedCustomShapeSegmentCommand::NOFILL; nCnt = 0; break;
- case 0xb: nCommand = EnhancedCustomShapeSegmentCommand::NOSTROKE; nCnt = 0; break;
- }
- }
- break;
- }
- // if the command is unknown, we will store all the data in nCnt, so it will be possible to export without loss
- if ( nCommand == EnhancedCustomShapeSegmentCommand::UNKNOWN )
- nCnt = (sal_Int16)nTmp;
- aSegments[ i ].Command = nCommand;
- aSegments[ i ].Count = nCnt;
- }
- }
- const rtl::OUString sSegments( RTL_CONSTASCII_USTRINGPARAM ( "Segments" ) );
- aProp.Name = sSegments;
- aProp.Value <<= aSegments;
- aPathPropVec.push_back( aProp );
- }
- // Path/StretchX
- if ( IsProperty( DFF_Prop_stretchPointX ) )
- {
- const rtl::OUString sStretchX( RTL_CONSTASCII_USTRINGPARAM ( "StretchX" ) );
- sal_Int32 nStretchX = GetPropertyValue( DFF_Prop_stretchPointX, 0 );
- aProp.Name = sStretchX;
- aProp.Value <<= nStretchX;
- aPathPropVec.push_back( aProp );
- }
- // Path/StretchX
- if ( IsProperty( DFF_Prop_stretchPointY ) )
- {
- const rtl::OUString sStretchY( RTL_CONSTASCII_USTRINGPARAM ( "StretchY" ) );
- sal_Int32 nStretchY = GetPropertyValue( DFF_Prop_stretchPointY, 0 );
- aProp.Name = sStretchY;
- aProp.Value <<= nStretchY;
- aPathPropVec.push_back( aProp );
- }
- // Path/TextFrames
- if ( IsProperty( DFF_Prop_textRectangles ) )
- {
- sal_uInt16 i;
- sal_uInt16 nNumElem = 0;
- sal_uInt16 nNumElemMem = 0;
- sal_uInt16 nElemSize = 16;
-
- if ( SeekToContent( DFF_Prop_textRectangles, rIn ) )
- rIn >> nNumElem >> nNumElemMem >> nElemSize;
- if ( nElemSize == 16 )
- {
- sal_Int32 nLeft, nTop, nRight, nBottom;
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeTextFrame > aTextFrames( nNumElem );
- for ( i = 0; i < nNumElem; i++ )
- {
- rIn >> nLeft
- >> nTop
- >> nRight
- >> nBottom;
-
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrames[ i ].TopLeft.First, nLeft );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrames[ i ].TopLeft.Second, nTop );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrames[ i ].BottomRight.First, nRight );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrames[ i ].BottomRight.Second, nBottom);
- }
- const rtl::OUString sTextFrames( RTL_CONSTASCII_USTRINGPARAM ( "TextFrames" ) );
- aProp.Name = sTextFrames;
- aProp.Value <<= aTextFrames;
- aPathPropVec.push_back( aProp );
- }
- }
- //Path/GluePoints
- if ( IsProperty( DFF_Prop_connectorPoints ) )
- {
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair > aGluePoints;
-
- sal_uInt16 i;
- sal_uInt16 nNumElemVert = 0;
- sal_uInt16 nNumElemMemVert = 0;
- sal_uInt16 nElemSizeVert = 8;
-
- if ( SeekToContent( DFF_Prop_connectorPoints, rIn ) )
- rIn >> nNumElemVert >> nNumElemMemVert >> nElemSizeVert;
-
- sal_Int32 nX, nY;
- sal_Int16 nTmpA, nTmpB;
- aGluePoints.realloc( nNumElemVert );
- for ( i = 0; i < nNumElemVert; i++ )
- {
- if ( nElemSizeVert == 8 )
- {
- rIn >> nX
- >> nY;
- }
- else
- {
- rIn >> nTmpA
- >> nTmpB;
-
- nX = nTmpA;
- nY = nTmpB;
- }
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aGluePoints[ i ].First, nX );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aGluePoints[ i ].Second, nY );
- }
- const rtl::OUString sGluePoints( RTL_CONSTASCII_USTRINGPARAM ( "GluePoints" ) );
- aProp.Name = sGluePoints;
- aProp.Value <<= aGluePoints;
- aPathPropVec.push_back( aProp );
- }
- if ( IsProperty( DFF_Prop_connectorType ) )
- {
- sal_Int16 nGluePointType = (sal_uInt16)GetPropertyValue( DFF_Prop_connectorType );
- const rtl::OUString sGluePointType( RTL_CONSTASCII_USTRINGPARAM ( "GluePointType" ) );
- aProp.Name = sGluePointType;
- aProp.Value <<= nGluePointType;
- aPathPropVec.push_back( aProp );
- }
- // pushing the whole Path element
- if ( aPathPropVec.size() )
- {
- const rtl::OUString sPath( RTL_CONSTASCII_USTRINGPARAM ( "Path" ) );
- PropSeq aPathPropSeq( aPathPropVec.size() );
- aIter = aPathPropVec.begin();
- aEnd = aPathPropVec.end();
- beans::PropertyValue* pPathValues = aPathPropSeq.getArray();
- while ( aIter != aEnd )
- *pPathValues++ = *aIter++;
- aProp.Name = sPath;
- aProp.Value <<= aPathPropSeq;
- aPropVec.push_back( aProp );
- }
- }
- /////////////////////////////////////////
- // "TextPath" PropertySequence element //
- /////////////////////////////////////////
- sal_Bool bTextPathOn = ( GetPropertyValue( DFF_Prop_gtextFStrikethrough ) & 0x4000 ) != 0;
- if ( bTextPathOn )
- {
- PropVec aTextPathPropVec;
-
- // TextPath
- const rtl::OUString sTextPathOn( RTL_CONSTASCII_USTRINGPARAM ( "TextPath" ) );
- aProp.Name = sTextPathOn;
- aProp.Value <<= bTextPathOn;
- aTextPathPropVec.push_back( aProp );
-
- // TextPathMode
- const rtl::OUString sTextPathMode( RTL_CONSTASCII_USTRINGPARAM ( "TextPathMode" ) );
- sal_Bool bTextPathFitPath = ( GetPropertyValue( DFF_Prop_gtextFStrikethrough ) & 0x100 ) != 0;
-
- sal_Bool bTextPathFitShape;
- if ( IsHardAttribute( DFF_Prop_gtextFStretch ) )
- bTextPathFitShape = ( GetPropertyValue( DFF_Prop_gtextFStrikethrough ) & 0x400 ) != 0;
- else
- {
- bTextPathFitShape = true;
- switch( eShapeType )
- {
- case mso_sptTextArchUpCurve :
- case mso_sptTextArchDownCurve :
- case mso_sptTextCircleCurve :
- case mso_sptTextButtonCurve :
- bTextPathFitShape = false;
- default : break;
- }
- }
- EnhancedCustomShapeTextPathMode eTextPathMode( EnhancedCustomShapeTextPathMode_NORMAL );
- if ( bTextPathFitShape )
- eTextPathMode = EnhancedCustomShapeTextPathMode_SHAPE;
- else if ( bTextPathFitPath )
- eTextPathMode = EnhancedCustomShapeTextPathMode_PATH;
- aProp.Name = sTextPathMode;
- aProp.Value <<= eTextPathMode;
- aTextPathPropVec.push_back( aProp );
-
- // ScaleX
- const rtl::OUString sTextPathScaleX( RTL_CONSTASCII_USTRINGPARAM ( "ScaleX" ) );
- sal_Bool bTextPathScaleX = ( GetPropertyValue( DFF_Prop_gtextFStrikethrough ) & 0x40 ) != 0;
- aProp.Name = sTextPathScaleX;
- aProp.Value <<= bTextPathScaleX;
- aTextPathPropVec.push_back( aProp );
- // SameLetterHeights
- const rtl::OUString sSameLetterHeight( RTL_CONSTASCII_USTRINGPARAM ( "SameLetterHeights" ) );
- sal_Bool bSameLetterHeight = ( GetPropertyValue( DFF_Prop_gtextFStrikethrough ) & 0x80 ) != 0;
- aProp.Name = sSameLetterHeight;
- aProp.Value <<= bSameLetterHeight;
- aTextPathPropVec.push_back( aProp );
-
- // pushing the whole TextPath element
- const rtl::OUString sTextPath( RTL_CONSTASCII_USTRINGPARAM ( "TextPath" ) );
- PropSeq aTextPathPropSeq( aTextPathPropVec.size() );
- aIter = aTextPathPropVec.begin();
- aEnd = aTextPathPropVec.end();
- beans::PropertyValue* pTextPathValues = aTextPathPropSeq.getArray();
- while ( aIter != aEnd )
- *pTextPathValues++ = *aIter++;
- aProp.Name = sTextPath;
- aProp.Value <<= aTextPathPropSeq;
- aPropVec.push_back( aProp );
- }
- ////////////////////////
- // "AdjustmentValues" // The AdjustmentValues are imported at last, because depending to the type of the
- //////////////////////// handle (POLAR) we will convert the adjustment value from a fixed float to double
-
- // checking the last used adjustment handle, so we can determine how many handles are to allocate
- sal_Int32 i = DFF_Prop_adjust10Value;
- while ( ( i >= DFF_Prop_adjustValue ) && !IsProperty( i ) )
- i--;
- sal_Int32 nAdjustmentValues = ( i - DFF_Prop_adjustValue ) + 1;
- if ( nAdjustmentValues )
- {
- uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue > aAdjustmentSeq( nAdjustmentValues );
- while( --nAdjustmentValues >= 0 )
- {
- sal_Int32 nValue = 0;
- beans::PropertyState ePropertyState = beans::PropertyState_DEFAULT_VALUE;
- if ( IsProperty( i ) )
- {
- nValue = GetPropertyValue( i );
- ePropertyState = beans::PropertyState_DIRECT_VALUE;
- }
- if ( nAdjustmentsWhichNeedsToBeConverted & ( 1 << ( i - DFF_Prop_adjustValue ) ) )
- {
- double fValue = nValue;
- fValue /= 65536;
- aAdjustmentSeq[ nAdjustmentValues ].Value <<= fValue;
- }
- else
- aAdjustmentSeq[ nAdjustmentValues ].Value <<= nValue;
- aAdjustmentSeq[ nAdjustmentValues ].State = ePropertyState;
- i--;
- }
- const rtl::OUString sAdjustmentValues( RTL_CONSTASCII_USTRINGPARAM ( "AdjustmentValues" ) );
- aProp.Name = sAdjustmentValues;
- aProp.Value <<= aAdjustmentSeq;
- aPropVec.push_back( aProp );
- }
-
- // creating the whole property set
- PropSeq aSeq( aPropVec.size() );
- beans::PropertyValue* pValues = aSeq.getArray();
- aIter = aPropVec.begin();
- aEnd = aPropVec.end();
- while ( aIter != aEnd )
- *pValues++ = *aIter++;
- rSet.Put( SdrCustomShapeGeometryItem( aSeq ) );
-}
-
-void DffPropertyReader::ApplyAttributes( SvStream& rIn, SfxItemSet& rSet, const MSO_SPT eShapeType, const sal_uInt32 nShapeFlags ) const
-{
-// MapUnit eMap( rManager.GetModel()->GetScaleUnit() );
-
- for ( void* pDummy = ((DffPropertyReader*)this)->First(); pDummy; pDummy = ((DffPropertyReader*)this)->Next() )
- {
- UINT32 nRecType = GetCurKey();
- UINT32 nContent = mpContents[ nRecType ];
- switch ( nRecType )
- {
- case DFF_Prop_gtextSize :
- rSet.Put( SvxFontHeightItem( rManager.ScalePt( nContent ), 100, EE_CHAR_FONTHEIGHT ) );
- break;
- // GeoText
- case DFF_Prop_gtextFStrikethrough :
- {
- if ( nContent & 0x20 )
- rSet.Put( SvxWeightItem( nContent ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
- if ( nContent & 0x10 )
- rSet.Put( SvxPostureItem( nContent ? ITALIC_NORMAL : ITALIC_NONE, EE_CHAR_ITALIC ) );
- if ( nContent & 0x08 )
- rSet.Put( SvxUnderlineItem( nContent ? UNDERLINE_SINGLE : UNDERLINE_NONE, EE_CHAR_UNDERLINE ) );
- if ( nContent & 0x40 )
- rSet.Put(SvxShadowedItem( nContent != 0, EE_CHAR_SHADOW ) );
-// if ( nContent & 0x02 )
-// rSet.Put( SvxCaseMapItem( nContent ? SVX_CASEMAP_KAPITAELCHEN : SVX_CASEMAP_NOT_MAPPED ) );
- if ( nContent & 0x01 )
- rSet.Put( SvxCrossedOutItem( nContent ? STRIKEOUT_SINGLE : STRIKEOUT_NONE, EE_CHAR_STRIKEOUT ) );
- }
- break;
-
- case DFF_Prop_fillColor :
- rSet.Put( XFillColorItem( String(), rManager.MSO_CLR_ToColor( nContent, DFF_Prop_fillColor ) ) );
- break;
-
- // ShadowStyle
- case DFF_Prop_shadowType :
- {
- MSO_ShadowType eShadowType = (MSO_ShadowType)nContent;
- if( eShadowType != mso_shadowOffset )
- {
- // mso_shadowDouble
- // mso_shadowRich
- // mso_shadowEmbossOrEngrave
- // koennen wir nicht, kreiere Default-Schatten mit default-
- // Abstand
- rSet.Put( SdrShadowXDistItem( 35 ) ); // 0,35 mm Schattendistanz
- rSet.Put( SdrShadowYDistItem( 35 ) );
- }
- }
- break;
- case DFF_Prop_shadowColor :
- rSet.Put( SdrShadowColorItem( String(), rManager.MSO_CLR_ToColor( nContent, DFF_Prop_shadowColor ) ) );
- break;
- case DFF_Prop_shadowOpacity :
- rSet.Put( SdrShadowTransparenceItem( (sal_uInt16)( ( 0x10000 - nContent ) / 655 ) ) );
- break;
- case DFF_Prop_shadowOffsetX :
- {
- INT32 nVal = (INT32)nContent;
- rManager.ScaleEmu( nVal );
- if ( nVal )
- rSet.Put( SdrShadowXDistItem( nVal ) );
- }
- break;
- case DFF_Prop_shadowOffsetY :
- {
- INT32 nVal = (INT32)nContent;
- rManager.ScaleEmu( nVal );
- if ( nVal )
- rSet.Put( SdrShadowYDistItem( nVal ) );
- }
- break;
- case DFF_Prop_fshadowObscured :
- {
- sal_Bool bHasShadow = ( nContent & 2 ) != 0;
- rSet.Put( SdrShadowItem( bHasShadow ) );
- if ( bHasShadow )
- {
- if ( !IsProperty( DFF_Prop_shadowOffsetX ) )
- rSet.Put( SdrShadowXDistItem( 35 ) );
- if ( !IsProperty( DFF_Prop_shadowOffsetY ) )
- rSet.Put( SdrShadowYDistItem( 35 ) );
- }
- }
- break;
- }
- }
-
- ApplyLineAttributes( rSet, eShapeType ); // #i28269#
- ApplyFillAttributes( rIn, rSet, eShapeType );
- if ( rManager.GetSvxMSDffSettings() & SVXMSDFF_SETTINGS_IMPORT_IAS )
- {
- if ( eShapeType != mso_sptNil )
- {
- ApplyCustomShapeGeometryAttributes( rIn, rSet, eShapeType, nShapeFlags );
- ApplyCustomShapeTextAttributes( rSet );
- }
- }
-}
-
-//---------------------------------------------------------------------------
-//- Record Manager ----------------------------------------------------------
-//---------------------------------------------------------------------------
-
-DffRecordList::DffRecordList( DffRecordList* pList ) :
- nCount ( 0 ),
- nCurrent ( 0 ),
- pPrev ( pList ),
- pNext ( NULL )
-{
- if ( pList )
- pList->pNext = this;
-}
-
-DffRecordList::~DffRecordList()
-{
- delete pNext;
-}
-
-DffRecordManager::DffRecordManager() :
- DffRecordList ( NULL ),
- pCList ( (DffRecordList*)this )
-{
-}
-
-DffRecordManager::DffRecordManager( SvStream& rIn ) :
- DffRecordList ( NULL ),
- pCList ( (DffRecordList*)this )
-{
- Consume( rIn );
-}
-
-DffRecordManager::~DffRecordManager()
-{
-};
-
-
-void DffRecordManager::Consume( SvStream& rIn, BOOL bAppend, UINT32 nStOfs )
-{
- if ( !bAppend )
- Clear();
- UINT32 nOldPos = rIn.Tell();
- if ( !nStOfs )
- {
- DffRecordHeader aHd;
- rIn >> aHd;
- if ( aHd.nRecVer == DFF_PSFLAG_CONTAINER )
- nStOfs = aHd.GetRecEndFilePos();
- }
- if ( nStOfs )
- {
- pCList = (DffRecordList*)this;
- while ( pCList->pNext )
- pCList = pCList->pNext;
- while ( ( rIn.GetError() == 0 ) && ( ( rIn.Tell() + 8 ) <= nStOfs ) )
- {
- if ( pCList->nCount == DFF_RECORD_MANAGER_BUF_SIZE )
- pCList = new DffRecordList( pCList );
- rIn >> pCList->mHd[ pCList->nCount ];
- pCList->mHd[ pCList->nCount++ ].SeekToEndOfRecord( rIn );
- }
- rIn.Seek( nOldPos );
- }
-}
-
-void DffRecordManager::Clear()
-{
- pCList = (DffRecordList*)this;
- delete pNext, pNext = NULL;
- nCurrent = 0;
- nCount = 0;
-}
-
-DffRecordHeader* DffRecordManager::Current()
-{
- DffRecordHeader* pRet = NULL;
- if ( pCList->nCurrent < pCList->nCount )
- pRet = &pCList->mHd[ pCList->nCurrent ];
- return pRet;
-}
-
-DffRecordHeader* DffRecordManager::First()
-{
- DffRecordHeader* pRet = NULL;
- pCList = (DffRecordList*)this;
- if ( pCList->nCount )
- {
- pCList->nCurrent = 0;
- pRet = &pCList->mHd[ 0 ];
- }
- return pRet;
-}
-
-DffRecordHeader* DffRecordManager::Next()
-{
- DffRecordHeader* pRet = NULL;
- UINT32 nC = pCList->nCurrent + 1;
- if ( nC < pCList->nCount )
- {
- pCList->nCurrent++;
- pRet = &pCList->mHd[ nC ];
- }
- else if ( pCList->pNext )
- {
- pCList = pCList->pNext;
- pCList->nCurrent = 0;
- pRet = &pCList->mHd[ 0 ];
- }
- return pRet;
-}
-
-DffRecordHeader* DffRecordManager::Prev()
-{
- DffRecordHeader* pRet = NULL;
- UINT32 nCur = pCList->nCurrent;
- if ( !nCur && pCList->pPrev )
- {
- pCList = pCList->pPrev;
- nCur = pCList->nCount;
- }
- if ( nCur-- )
- {
- pCList->nCurrent = nCur;
- pRet = &pCList->mHd[ nCur ];
- }
- return pRet;
-}
-
-DffRecordHeader* DffRecordManager::Last()
-{
- DffRecordHeader* pRet = NULL;
- while ( pCList->pNext )
- pCList = pCList->pNext;
- UINT32 nCnt = pCList->nCount;
- if ( nCnt-- )
- {
- pCList->nCurrent = nCnt;
- pRet = &pCList->mHd[ nCnt ];
- }
- return pRet;
-}
-
-BOOL DffRecordManager::SeekToContent( SvStream& rIn, UINT16 nRecId, DffSeekToContentMode eMode )
-{
- DffRecordHeader* pHd = GetRecordHeader( nRecId, eMode );
- if ( pHd )
- {
- pHd->SeekToContent( rIn );
- return TRUE;
- }
- else
- return FALSE;
-}
-
-DffRecordHeader* DffRecordManager::GetRecordHeader( UINT16 nRecId, DffSeekToContentMode eMode )
-{
- UINT32 nOldCurrent = pCList->nCurrent;
- DffRecordList* pOldList = pCList;
- DffRecordHeader* pHd;
-
- if ( eMode == SEEK_FROM_BEGINNING )
- pHd = First();
- else
- pHd = Next();
-
- while ( pHd )
- {
- if ( pHd->nRecType == nRecId )
- break;
- pHd = Next();
- }
- if ( !pHd && eMode == SEEK_FROM_CURRENT_AND_RESTART )
- {
- DffRecordHeader* pBreak = &pOldList->mHd[ nOldCurrent ];
- pHd = First();
- if ( pHd )
- {
- while ( pHd != pBreak )
- {
- if ( pHd->nRecType == nRecId )
- break;
- pHd = Next();
- }
- if ( pHd->nRecType != nRecId )
- pHd = NULL;
- }
- }
- if ( !pHd )
- {
- pCList = pOldList;
- pOldList->nCurrent = nOldCurrent;
- }
- return pHd;
-}
-
-//---------------------------------------------------------------------------
-// private Methoden
-//---------------------------------------------------------------------------
-
-struct EscherBlipCacheEntry
-{
- ByteString aUniqueID;
- sal_uInt32 nBlip;
-
- EscherBlipCacheEntry( sal_uInt32 nBlipId, const ByteString& rUniqueID ) :
- aUniqueID( rUniqueID ),
- nBlip( nBlipId ) {}
-};
-
-void SvxMSDffManager::Scale( sal_Int32& rVal ) const
-{
- if ( bNeedMap )
- rVal = BigMulDiv( rVal, nMapMul, nMapDiv );
-}
-
-void SvxMSDffManager::Scale( Point& rPos ) const
-{
- rPos.X() += nMapXOfs;
- rPos.Y() += nMapYOfs;
- if ( bNeedMap )
- {
- rPos.X() = BigMulDiv( rPos.X(), nMapMul, nMapDiv );
- rPos.Y() = BigMulDiv( rPos.Y(), nMapMul, nMapDiv );
- }
-}
-
-void SvxMSDffManager::Scale( Size& rSiz ) const
-{
- if ( bNeedMap )
- {
- rSiz.Width() = BigMulDiv( rSiz.Width(), nMapMul, nMapDiv );
- rSiz.Height() = BigMulDiv( rSiz.Height(), nMapMul, nMapDiv );
- }
-}
-
-void SvxMSDffManager::Scale( Rectangle& rRect ) const
-{
- rRect.Move( nMapXOfs, nMapYOfs );
- if ( bNeedMap )
- {
- rRect.Left() =BigMulDiv( rRect.Left() , nMapMul, nMapDiv );
- rRect.Top() =BigMulDiv( rRect.Top() , nMapMul, nMapDiv );
- rRect.Right() =BigMulDiv( rRect.Right() , nMapMul, nMapDiv );
- rRect.Bottom()=BigMulDiv( rRect.Bottom(), nMapMul, nMapDiv );
- }
-}
-
-void SvxMSDffManager::Scale( Polygon& rPoly ) const
-{
- if ( !bNeedMap )
- return;
- USHORT nPointAnz = rPoly.GetSize();
- for ( USHORT nPointNum = 0; nPointNum < nPointAnz; nPointNum++ )
- Scale( rPoly[ nPointNum ] );
-}
-
-void SvxMSDffManager::Scale( PolyPolygon& rPoly ) const
-{
- if ( !bNeedMap )
- return;
- USHORT nPolyAnz = rPoly.Count();
- for ( USHORT nPolyNum = 0; nPolyNum < nPolyAnz; nPolyNum++ )
- Scale( rPoly[ nPolyNum ] );
-}
-
-void SvxMSDffManager::ScaleEmu( sal_Int32& rVal ) const
-{
- rVal = BigMulDiv( rVal, nEmuMul, nEmuDiv );
-}
-
-UINT32 SvxMSDffManager::ScalePt( UINT32 nVal ) const
-{
- MapUnit eMap = pSdrModel->GetScaleUnit();
- Fraction aFact( GetMapFactor( MAP_POINT, eMap ).X() );
- long aMul = aFact.GetNumerator();
- long aDiv = aFact.GetDenominator() * 65536;
- aFact = Fraction( aMul, aDiv ); // nochmal versuchen zu kuerzen
- return BigMulDiv( nVal, aFact.GetNumerator(), aFact.GetDenominator() );
-}
-
-INT32 SvxMSDffManager::ScalePoint( INT32 nVal ) const
-{
- return BigMulDiv( nVal, nPntMul, nPntDiv );
-};
-
-void SvxMSDffManager::SetModel(SdrModel* pModel, long nApplicationScale)
-{
- pSdrModel = pModel;
- if( pModel && (0 < nApplicationScale) )
- {
- // PPT arbeitet nur mit Einheiten zu 576DPI
- // WW hingegen verwendet twips, dh. 1440DPI.
- MapUnit eMap = pSdrModel->GetScaleUnit();
- Fraction aFact( GetMapFactor(MAP_INCH, eMap).X() );
- long nMul=aFact.GetNumerator();
- long nDiv=aFact.GetDenominator()*nApplicationScale;
- aFact=Fraction(nMul,nDiv); // nochmal versuchen zu kuerzen
- // Bei 100TH_MM -> 2540/576=635/144
- // Bei Twip -> 1440/576=5/2
- nMapMul = aFact.GetNumerator();
- nMapDiv = aFact.GetDenominator();
- bNeedMap = nMapMul!=nMapDiv;
-
- // MS-DFF-Properties sind grossteils in EMU (English Metric Units) angegeben
- // 1mm=36000emu, 1twip=635emu
- aFact=GetMapFactor(MAP_100TH_MM,eMap).X();
- nMul=aFact.GetNumerator();
- nDiv=aFact.GetDenominator()*360;
- aFact=Fraction(nMul,nDiv); // nochmal versuchen zu kuerzen
- // Bei 100TH_MM -> 1/360
- // Bei Twip -> 14,40/(25,4*360)=144/91440=1/635
- nEmuMul=aFact.GetNumerator();
- nEmuDiv=aFact.GetDenominator();
-
- // Und noch was fuer typografische Points
- aFact=GetMapFactor(MAP_POINT,eMap).X();
- nPntMul=aFact.GetNumerator();
- nPntDiv=aFact.GetDenominator();
- }
- else
- {
- pModel = 0;
- nMapMul = nMapDiv = nMapXOfs = nMapYOfs = nEmuMul = nEmuDiv = nPntMul = nPntDiv = 0;
- bNeedMap = FALSE;
- }
-}
-
-BOOL SvxMSDffManager::SeekToShape( SvStream& rSt, void* /* pClientData */, UINT32 nId ) const
-{
- BOOL bRet = FALSE;
- if ( mpFidcls )
- {
- UINT32 nMerk = rSt.Tell();
- UINT32 nShapeId, nSec = ( nId >> 10 ) - 1;
- if ( nSec < mnIdClusters )
- {
- sal_IntPtr nOfs = (sal_IntPtr)maDgOffsetTable.Get( mpFidcls[ nSec ].dgid );
- if ( nOfs )
- {
- rSt.Seek( nOfs );
- DffRecordHeader aEscherF002Hd;
- rSt >> aEscherF002Hd;
- ULONG nEscherF002End = aEscherF002Hd.GetRecEndFilePos();
- DffRecordHeader aEscherObjListHd;
- while ( rSt.Tell() < nEscherF002End )
- {
- rSt >> aEscherObjListHd;
- if ( aEscherObjListHd.nRecVer != 0xf )
- aEscherObjListHd.SeekToEndOfRecord( rSt );
- else if ( aEscherObjListHd.nRecType == DFF_msofbtSpContainer )
- {
- DffRecordHeader aShapeHd;
- if ( SeekToRec( rSt, DFF_msofbtSp, aEscherObjListHd.GetRecEndFilePos(), &aShapeHd ) )
- {
- rSt >> nShapeId;
- if ( nId == nShapeId )
- {
- aEscherObjListHd.SeekToBegOfRecord( rSt );
- bRet = TRUE;
- break;
- }
- }
- aEscherObjListHd.SeekToEndOfRecord( rSt );
- }
- }
- }
- }
- if ( !bRet )
- rSt.Seek( nMerk );
- }
- return bRet;
-}
-
-FASTBOOL SvxMSDffManager::SeekToRec( SvStream& rSt, USHORT nRecId, ULONG nMaxFilePos, DffRecordHeader* pRecHd, ULONG nSkipCount ) const
-{
- FASTBOOL bRet = FALSE;
- ULONG nFPosMerk = rSt.Tell(); // FilePos merken fuer ggf. spaetere Restauration
- DffRecordHeader aHd;
- do
- {
- rSt >> aHd;
- if ( aHd.nRecType == nRecId )
- {
- if ( nSkipCount )
- nSkipCount--;
- else
- {
- bRet = TRUE;
- if ( pRecHd != NULL )
- *pRecHd = aHd;
- else
- aHd.SeekToBegOfRecord( rSt );
- }
- }
- if ( !bRet )
- aHd.SeekToEndOfRecord( rSt );
- }
- while ( rSt.GetError() == 0 && rSt.Tell() < nMaxFilePos && !bRet );
- if ( !bRet )
- rSt.Seek( nFPosMerk ); // FilePos restaurieren
- return bRet;
-}
-
-FASTBOOL SvxMSDffManager::SeekToRec2( USHORT nRecId1, USHORT nRecId2, ULONG nMaxFilePos, DffRecordHeader* pRecHd, ULONG nSkipCount ) const
-{
- FASTBOOL bRet = FALSE;
- ULONG nFPosMerk = rStCtrl.Tell(); // FilePos merken fuer ggf. spaetere Restauration
- DffRecordHeader aHd;
- do
- {
- rStCtrl >> aHd;
- if ( aHd.nRecType == nRecId1 || aHd.nRecType == nRecId2 )
- {
- if ( nSkipCount )
- nSkipCount--;
- else
- {
- bRet = TRUE;
- if ( pRecHd )
- *pRecHd = aHd;
- else
- aHd.SeekToBegOfRecord( rStCtrl );
- }
- }
- if ( !bRet )
- aHd.SeekToEndOfRecord( rStCtrl );
- }
- while ( rStCtrl.GetError() == 0 && rStCtrl.Tell() < nMaxFilePos && !bRet );
- if ( !bRet )
- rStCtrl.Seek( nFPosMerk ); // FilePos restaurieren
- return bRet;
-}
-
-
-FASTBOOL SvxMSDffManager::GetColorFromPalette( USHORT /* nNum */, Color& rColor ) const
-{
- // diese Methode ist in der zum Excel-Import
- // abgeleiteten Klasse zu ueberschreiben...
- rColor.SetColor( COL_WHITE );
- return TRUE;
-}
-
-
-Color SvxMSDffManager::MSO_CLR_ToColor( sal_uInt32 nColorCode, sal_uInt16 nContentProperty ) const
-{
- Color aColor( mnDefaultColor );
-
- // Fuer Textfarben: Header ist 0xfeRRGGBB
- if ( ( nColorCode & 0xfe000000 ) == 0xfe000000 )
- nColorCode &= 0x00ffffff;
-
- sal_uInt8 nUpper = (sal_uInt8)( nColorCode >> 24 );
- if( nUpper & 0x19 ) // if( nUpper & 0x1f )
- {
- if( ( nUpper & 0x08 ) || ( ( nUpper & 0x10 ) == 0 ) )
- {
- // SCHEMECOLOR
- if ( !GetColorFromPalette( ( nUpper & 8 ) ? (sal_uInt16)nColorCode : nUpper, aColor ) )
- {
- switch( nContentProperty )
- {
- case DFF_Prop_pictureTransparent :
- case DFF_Prop_shadowColor :
- case DFF_Prop_fillBackColor :
- case DFF_Prop_fillColor :
- aColor = Color( COL_WHITE );
- break;
- case DFF_Prop_lineColor :
- {
- aColor = Color( COL_BLACK );
- }
- break;
- }
- }
- }
- else // SYSCOLOR
- {
- const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
-
-// UINT16 nParameter = (BYTE)( nColorCode >> 16); // SJ: nice compiler optimization bug on windows, though downcasting
- UINT16 nParameter = sal_uInt16(( nColorCode >> 16 ) & 0x00ff); // the HiByte of nParameter is not zero, an exclusive AND is helping :o
- UINT16 nFunctionBits = (UINT16)( ( nColorCode & 0x00000f00 ) >> 8 );
- UINT16 nAdditionalFlags = (UINT16)( ( nColorCode & 0x0000f000) >> 8 );
- UINT16 nColorIndex = sal_uInt16(nColorCode & 0x00ff);
- UINT32 nPropColor = 0;
-
- sal_uInt16 nCProp = 0;
-
- switch ( nColorIndex )
- {
- case mso_syscolorButtonFace : aColor = rStyleSettings.GetFaceColor(); break;
- case mso_syscolorWindowText : aColor = rStyleSettings.GetWindowTextColor(); break;
- case mso_syscolorMenu : aColor = rStyleSettings.GetMenuColor(); break;
- case mso_syscolor3DLight :
- case mso_syscolorButtonHighlight :
- case mso_syscolorHighlight : aColor = rStyleSettings.GetHighlightColor(); break;
- case mso_syscolorHighlightText : aColor = rStyleSettings.GetHighlightTextColor(); break;
- case mso_syscolorCaptionText : aColor = rStyleSettings.GetMenuTextColor(); break;
- case mso_syscolorActiveCaption : aColor = rStyleSettings.GetHighlightColor(); break;
- case mso_syscolorButtonShadow : aColor = rStyleSettings.GetShadowColor(); break;
- case mso_syscolorButtonText : aColor = rStyleSettings.GetButtonTextColor(); break;
- case mso_syscolorGrayText : aColor = rStyleSettings.GetDeactiveColor(); break;
- case mso_syscolorInactiveCaption : aColor = rStyleSettings.GetDeactiveColor(); break;
- case mso_syscolorInactiveCaptionText : aColor = rStyleSettings.GetDeactiveColor(); break;
- case mso_syscolorInfoBackground : aColor = rStyleSettings.GetFaceColor(); break;
- case mso_syscolorInfoText : aColor = rStyleSettings.GetInfoTextColor(); break;
- case mso_syscolorMenuText : aColor = rStyleSettings.GetMenuTextColor(); break;
- case mso_syscolorScrollbar : aColor = rStyleSettings.GetFaceColor(); break;
- case mso_syscolorWindow : aColor = rStyleSettings.GetWindowColor(); break;
- case mso_syscolorWindowFrame : aColor = rStyleSettings.GetWindowColor(); break;
-
- case mso_colorFillColor :
- {
- nPropColor = GetPropertyValue( DFF_Prop_fillColor, 0xffffff );
- nCProp = DFF_Prop_fillColor;
- }
- break;
- case mso_colorLineOrFillColor : // ( use the line color only if there is a line )
- {
- if ( GetPropertyValue( DFF_Prop_fNoLineDrawDash ) & 8 )
- {
- nPropColor = GetPropertyValue( DFF_Prop_lineColor, 0 );
- nCProp = DFF_Prop_lineColor;
- }
- else
- {
- nPropColor = GetPropertyValue( DFF_Prop_fillColor, 0xffffff );
- nCProp = DFF_Prop_fillColor;
- }
- }
- break;
- case mso_colorLineColor :
- {
- nPropColor = GetPropertyValue( DFF_Prop_lineColor, 0 );
- nCProp = DFF_Prop_lineColor;
- }
- break;
- case mso_colorShadowColor :
- {
- nPropColor = GetPropertyValue( DFF_Prop_shadowColor, 0x808080 );
- nCProp = DFF_Prop_shadowColor;
- }
- break;
- case mso_colorThis : // ( use this color ... )
- {
- nPropColor = GetPropertyValue( DFF_Prop_fillColor, 0xffffff ); //?????????????
- nCProp = DFF_Prop_fillColor;
- }
- break;
- case mso_colorFillBackColor :
- {
- nPropColor = GetPropertyValue( DFF_Prop_fillBackColor, 0xffffff );
- nCProp = DFF_Prop_fillBackColor;
- }
- break;
- case mso_colorLineBackColor :
- {
- nPropColor = GetPropertyValue( DFF_Prop_lineBackColor, 0xffffff );
- nCProp = DFF_Prop_lineBackColor;
- }
- break;
- case mso_colorFillThenLine : // ( use the fillcolor unless no fill and line )
- {
- nPropColor = GetPropertyValue( DFF_Prop_fillColor, 0xffffff ); //?????????????
- nCProp = DFF_Prop_fillColor;
- }
- break;
- case mso_colorIndexMask : // ( extract the color index ) ?
- {
- nPropColor = GetPropertyValue( DFF_Prop_fillColor, 0xffffff ); //?????????????
- nCProp = DFF_Prop_fillColor;
- }
- break;
- }
- if ( nCProp && ( nPropColor & 0x10000000 ) == 0 ) // beware of looping recursive
- aColor = MSO_CLR_ToColor( nPropColor, nCProp );
-
- if( nAdditionalFlags & 0x80 ) // make color gray
- {
- UINT8 nZwi = aColor.GetLuminance();
- aColor = Color( nZwi, nZwi, nZwi );
- }
- switch( nFunctionBits )
- {
- case 0x01 : // darken color by parameter
- {
- aColor.SetRed( sal::static_int_cast< UINT8 >( ( nParameter * aColor.GetRed() ) >> 8 ) );
- aColor.SetGreen( sal::static_int_cast< UINT8 >( ( nParameter * aColor.GetGreen() ) >> 8 ) );
- aColor.SetBlue( sal::static_int_cast< UINT8 >( ( nParameter * aColor.GetBlue() ) >> 8 ) );
- }
- break;
- case 0x02 : // lighten color by parameter
- {
- UINT16 nInvParameter = ( 0x00ff - nParameter ) * 0xff;
- aColor.SetRed( sal::static_int_cast< UINT8 >( ( nInvParameter + ( nParameter * aColor.GetRed() ) ) >> 8 ) );
- aColor.SetGreen( sal::static_int_cast< UINT8 >( ( nInvParameter + ( nParameter * aColor.GetGreen() ) ) >> 8 ) );
- aColor.SetBlue( sal::static_int_cast< UINT8 >( ( nInvParameter + ( nParameter * aColor.GetBlue() ) ) >> 8 ) );
- }
- break;
- case 0x03 : // add grey level RGB(p,p,p)
- {
- INT16 nR = (INT16)aColor.GetRed() + (INT16)nParameter;
- INT16 nG = (INT16)aColor.GetGreen() + (INT16)nParameter;
- INT16 nB = (INT16)aColor.GetBlue() + (INT16)nParameter;
- if ( nR > 0x00ff )
- nR = 0x00ff;
- if ( nG > 0x00ff )
- nG = 0x00ff;
- if ( nB > 0x00ff )
- nB = 0x00ff;
- aColor = Color( (UINT8)nR, (UINT8)nG, (UINT8)nB );
- }
- break;
- case 0x04 : // substract grey level RGB(p,p,p)
- {
- INT16 nR = (INT16)aColor.GetRed() - (INT16)nParameter;
- INT16 nG = (INT16)aColor.GetGreen() - (INT16)nParameter;
- INT16 nB = (INT16)aColor.GetBlue() - (INT16)nParameter;
- if ( nR < 0 )
- nR = 0;
- if ( nG < 0 )
- nG = 0;
- if ( nB < 0 )
- nB = 0;
- aColor = Color( (UINT8)nR, (UINT8)nG, (UINT8)nB );
- }
- break;
- case 0x05 : // substract from grey level RGB(p,p,p)
- {
- INT16 nR = (INT16)nParameter - (INT16)aColor.GetRed();
- INT16 nG = (INT16)nParameter - (INT16)aColor.GetGreen();
- INT16 nB = (INT16)nParameter - (INT16)aColor.GetBlue();
- if ( nR < 0 )
- nR = 0;
- if ( nG < 0 )
- nG = 0;
- if ( nB < 0 )
- nB = 0;
- aColor = Color( (UINT8)nR, (UINT8)nG, (UINT8)nB );
- }
- break;
- case 0x06 : // per component: black if < p, white if >= p
- {
- aColor.SetRed( aColor.GetRed() < nParameter ? 0x00 : 0xff );
- aColor.SetGreen( aColor.GetGreen() < nParameter ? 0x00 : 0xff );
- aColor.SetBlue( aColor.GetBlue() < nParameter ? 0x00 : 0xff );
- }
- break;
- }
- if ( nAdditionalFlags & 0x40 ) // top-bit invert
- aColor = Color( aColor.GetRed() ^ 0x80, aColor.GetGreen() ^ 0x80, aColor.GetBlue() ^ 0x80 );
-
- if ( nAdditionalFlags & 0x20 ) // invert color
- aColor = Color(0xff - aColor.GetRed(), 0xff - aColor.GetGreen(), 0xff - aColor.GetBlue());
- }
- }
- else if ( ( nUpper & 4 ) && ( ( nColorCode & 0xfffff8 ) == 0 ) )
- { // case of nUpper == 4 powerpoint takes this as agrument for a colorschemecolor
- GetColorFromPalette( nUpper, aColor );
- }
- else // hart attributiert, eventuell mit Hinweis auf SYSTEMRGB
- aColor = Color( (BYTE)nColorCode, (BYTE)( nColorCode >> 8 ), (BYTE)( nColorCode >> 16 ) );
- return aColor;
-}
-
-FASTBOOL SvxMSDffManager::ReadDffString(SvStream& rSt, String& rTxt) const
-{
- FASTBOOL bRet=FALSE;
- DffRecordHeader aStrHd;
- if( !ReadCommonRecordHeader(aStrHd, rSt) )
- rSt.Seek( aStrHd.nFilePos );
- else if ( aStrHd.nRecType == DFF_PST_TextBytesAtom || aStrHd.nRecType == DFF_PST_TextCharsAtom )
- {
- FASTBOOL bUniCode=aStrHd.nRecType==DFF_PST_TextCharsAtom;
- bRet=TRUE;
- ULONG nBytes = aStrHd.nRecLen;
- MSDFFReadZString( rSt, rTxt, nBytes, bUniCode );
- if( !bUniCode )
- {
- for ( xub_StrLen n = 0; n < nBytes; n++ )
- {
- if( rTxt.GetChar( n ) == 0x0B )
- rTxt.SetChar( n, ' ' ); // Weicher Umbruch
- // TODO: Zeilenumbruch im Absatz via Outliner setzen.
- }
- }
- aStrHd.SeekToEndOfRecord( rSt );
- }
- else
- aStrHd.SeekToBegOfRecord( rSt );
- return bRet;
-}
-
-// sj: I just want to set a string for a text object that may contain multiple
-// paragraphs. If I now take a look at the follwing code I get the impression that
-// our outliner is too complicate to be used properly,
-void SvxMSDffManager::ReadObjText( const String& rText, SdrObject* pObj ) const
-{
- SdrTextObj* pText = PTR_CAST( SdrTextObj, pObj );
- if ( pText )
- {
- SdrOutliner& rOutliner = pText->ImpGetDrawOutliner();
- rOutliner.Init( OUTLINERMODE_TEXTOBJECT );
-
- BOOL bOldUpdateMode = rOutliner.GetUpdateMode();
- rOutliner.SetUpdateMode( FALSE );
- rOutliner.SetVertical( pText->IsVerticalWriting() );
-
- sal_uInt16 nParaIndex = 0;
- sal_uInt32 nParaSize;
- const sal_Unicode* pCurrent, *pBuf = rText.GetBuffer();
- const sal_Unicode* pEnd = rText.GetBuffer() + rText.Len();
-
- while( pBuf < pEnd )
- {
- pCurrent = pBuf;
-
- for ( nParaSize = 0; pBuf < pEnd; )
- {
- sal_Unicode nChar = *pBuf++;
- if ( nChar == 0xa )
- {
- if ( ( pBuf < pEnd ) && ( *pBuf == 0xd ) )
- pBuf++;
- break;
- }
- else if ( nChar == 0xd )
- {
- if ( ( pBuf < pEnd ) && ( *pBuf == 0xa ) )
- pBuf++;
- break;
- }
- else
- nParaSize++;
- }
- ESelection aSelection( nParaIndex, 0, nParaIndex, 0 );
- String aParagraph( pCurrent, (sal_uInt16)nParaSize );
- if ( !nParaIndex && !aParagraph.Len() ) // SJ: we are crashing if the first paragraph is empty ?
- aParagraph += (sal_Unicode)' '; // otherwise these two lines can be removed.
- rOutliner.Insert( aParagraph, nParaIndex, 0 );
- rOutliner.SetParaAttribs( nParaIndex, rOutliner.GetEmptyItemSet() );
-
- SfxItemSet aParagraphAttribs( rOutliner.GetEmptyItemSet() );
- if ( !aSelection.nStartPos )
- aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE, FALSE ) );
- aSelection.nStartPos = 0;
- rOutliner.QuickSetAttribs( aParagraphAttribs, aSelection );
- nParaIndex++;
- }
- OutlinerParaObject* pNewText = rOutliner.CreateParaObject();
- rOutliner.Clear();
- rOutliner.SetUpdateMode( bOldUpdateMode );
- pText->SetOutlinerParaObject( pNewText );
- }
-}
-
-FASTBOOL SvxMSDffManager::ReadObjText(SvStream& rSt, SdrObject* pObj) const
-{
- FASTBOOL bRet=FALSE;
- SdrTextObj* pText = PTR_CAST(SdrTextObj, pObj);
- if( pText )
- {
- DffRecordHeader aTextHd;
- if( !ReadCommonRecordHeader(aTextHd, rSt) )
- rSt.Seek( aTextHd.nFilePos );
- else if ( aTextHd.nRecType==DFF_msofbtClientTextbox )
- {
- bRet=TRUE;
- ULONG nRecEnd=aTextHd.GetRecEndFilePos();
- DffRecordHeader aHd;
- String aText;
-// UINT32 nInvent=pText->GetObjInventor();
-// UINT16 nIdent=pText->GetObjIdentifier();
-
- SdrOutliner& rOutliner=pText->ImpGetDrawOutliner();
-// sal_Int16 nMinDepth = rOutliner.GetMinDepth();
- USHORT nOutlMode = rOutliner.GetMode();
-
- { // Wohl 'nen kleiner Bug der EditEngine, das die
- // Absastzattribute bei Clear() nicht entfernt werden.
- FASTBOOL bClearParaAttribs = TRUE;
- rOutliner.SetStyleSheet( 0, NULL );
- SfxItemSet aSet(rOutliner.GetEmptyItemSet());
- aSet.Put(SvxColorItem( COL_BLACK ));
- rOutliner.SetParaAttribs(0,aSet);
- pText->SetMergedItemSet(aSet);
-
- bClearParaAttribs = FALSE;
- if( bClearParaAttribs )
- {
- // Wohl 'nen kleiner Bug der EditEngine, dass die
- // Absastzattribute bei Clear() nicht entfernt werden.
- rOutliner.SetParaAttribs(0,rOutliner.GetEmptyItemSet());
- }
- }
- rOutliner.Init( OUTLINERMODE_TEXTOBJECT );
-
-// ULONG nFilePosMerker=rSt.Tell();
- ////////////////////////////////////
- // TextString und MetaChars lesen //
- ////////////////////////////////////
- do
- {
- if( !ReadCommonRecordHeader(aHd, rSt) )
- rSt.Seek( aHd.nFilePos );
- else
- {
- switch (aHd.nRecType)
- {
- //case TextHeaderAtom
- //case TextSpecInfoAtom
- case DFF_PST_TextBytesAtom:
- case DFF_PST_TextCharsAtom:
- {
- aHd.SeekToBegOfRecord(rSt);
- ReadDffString(rSt, aText);
- }
- break;
- case DFF_PST_TextRulerAtom :
- {
- UINT16 nLen = (UINT16)aHd.nRecLen;
- if(nLen)
- {
- UINT16 nVal1, nVal2, nVal3;
- UINT16 nDefaultTab = 2540; // PPT def: 1 Inch //rOutliner.GetDefTab();
- UINT16 nMostrightTab = 0;
- SfxItemSet aSet(rOutliner.GetEmptyItemSet());
- SvxTabStopItem aTabItem(0, 0, SVX_TAB_ADJUST_DEFAULT, EE_PARA_TABS);
-
- rSt >> nVal1;
- rSt >> nVal2;
- nLen -= 4;
-
- // Allg. TAB verstellt auf Wert in nVal3
- if(nLen && (nVal1 & 0x0001))
- {
- rSt >> nVal3;
- nLen -= 2;
- nDefaultTab = (UINT16)(((UINT32)nVal3 * 1000) / 240);
- }
-
- // Weitere, frei gesetzte TABs
- if(nLen && (nVal1 & 0x0004))
- {
- rSt >> nVal1;
- nLen -= 2;
-
- // fest gesetzte TABs importieren
- while(nLen && nVal1--)
- {
- rSt >> nVal2;
- rSt >> nVal3;
- nLen -= 4;
-
- UINT16 nNewTabPos = (UINT16)(((UINT32)nVal2 * 1000) / 240);
- if(nNewTabPos > nMostrightTab)
- nMostrightTab = nNewTabPos;
-
- SvxTabStop aTabStop(nNewTabPos);
- aTabItem.Insert(aTabStop);
- }
- }
-
- // evtl. noch default-TABs ergaenzen (immer)
- UINT16 nObjWidth = sal_uInt16(pObj->GetSnapRect().GetWidth() + 1);
- UINT16 nDefaultTabPos = nDefaultTab;
-
- while(nDefaultTabPos <= nObjWidth && nDefaultTabPos <= nMostrightTab)
- nDefaultTabPos =
- nDefaultTabPos + nDefaultTab;
-
- while(nDefaultTabPos <= nObjWidth)
- {
- SvxTabStop aTabStop(nDefaultTabPos);
- aTabItem.Insert(aTabStop);
- nDefaultTabPos =
- nDefaultTabPos + nDefaultTab;
- }
-
- // Falls TABs angelegt wurden, setze diese
- if(aTabItem.Count())
- {
- aSet.Put(aTabItem);
- rOutliner.SetParaAttribs(0, aSet);
- }
- }
- }
- break;
- }
- aHd.SeekToEndOfRecord( rSt );
- }
- }
- while ( rSt.GetError() == 0 && rSt.Tell() < nRecEnd );
-
- ////////////////////////
- // SHIFT-Ret ersetzen //
- ////////////////////////
- if ( aText.Len() )
- {
- aText += ' ';
- aText.SetChar( aText.Len()-1, 0x0D );
- rOutliner.SetText( aText, rOutliner.GetParagraph( 0 ) );
-
- // SHIFT-Ret ersetzen im Outliner
- if(aText.GetTokenCount(0x0B) > 1)
- {
- UINT32 nParaCount = rOutliner.GetParagraphCount();
- for(UINT16 a=0;a<nParaCount;a++)
- {
- Paragraph* pActPara = rOutliner.GetParagraph(a);
- String aParaText = rOutliner.GetText(pActPara);
- for(UINT16 b=0;b<aParaText.Len();b++)
- {
- if( aParaText.GetChar( b ) == 0x0B)
- {
- ESelection aSelection(a, b, a, b+1);
- rOutliner.QuickInsertLineBreak(aSelection);
- }
- }
- }
- }
- }
- OutlinerParaObject* pNewText=rOutliner.CreateParaObject();
- rOutliner.Init( nOutlMode );
- pText->NbcSetOutlinerParaObject(pNewText);
- }
- else
- aTextHd.SeekToBegOfRecord(rSt);
-
- }
- return bRet;
-}
-
-//static
-void SvxMSDffManager::MSDFFReadZString( SvStream& rIn, String& rStr,
- ULONG nRecLen, FASTBOOL bUniCode )
-{
- sal_uInt16 nLen = (sal_uInt16)nRecLen;
- if( nLen )
- {
- if ( bUniCode )
- nLen >>= 1;
-
- String sBuf;
- sal_Unicode* pBuf = sBuf.AllocBuffer( nLen );
-
- if( bUniCode )
- {
- rIn.Read( (sal_Char*)pBuf, nLen << 1 );
-
-#ifdef OSL_BIGENDIAN
- for( sal_uInt16 n = 0; n < nLen; ++n, ++pBuf )
- *pBuf = SWAPSHORT( *pBuf );
-#endif // ifdef OSL_BIGENDIAN
- }
- else
- {
- // use the String-Data as buffer for the 8bit characters and
- // change then all to unicode
- sal_Char* pReadPos = ((sal_Char*)pBuf) + nLen;
- rIn.Read( (sal_Char*)pReadPos, nLen );
- for( sal_uInt16 n = 0; n < nLen; ++n, ++pBuf, ++pReadPos )
- *pBuf = ByteString::ConvertToUnicode( *pReadPos, RTL_TEXTENCODING_MS_1252 );
- }
-
- rStr = sBuf.EraseTrailingChars( 0 );
- }
- else
- rStr.Erase();
-}
-
-SdrObject* SvxMSDffManager::ImportFontWork( SvStream& rStCt, SfxItemSet& rSet, Rectangle& rBoundRect ) const
-{
- SdrObject* pRet = NULL;
- String aObjectText;
- String aFontName;
- BOOL bTextRotate = FALSE;
-
- ((SvxMSDffManager*)this)->mnFix16Angle = 0; // we don't want to use this property in future
- if ( SeekToContent( DFF_Prop_gtextUNICODE, rStCt ) )
- MSDFFReadZString( rStCt, aObjectText, GetPropertyValue( DFF_Prop_gtextUNICODE ), TRUE );
- if ( SeekToContent( DFF_Prop_gtextFont, rStCt ) )
- MSDFFReadZString( rStCt, aFontName, GetPropertyValue( DFF_Prop_gtextFont ), TRUE );
- if ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x2000 )
- {
- // Text ist senkrecht formatiert, Box Kippen
- INT32 nHalfWidth = ( rBoundRect.GetWidth() + 1) >> 1;
- INT32 nHalfHeight = ( rBoundRect.GetHeight() + 1) >> 1;
- Point aTopLeft( rBoundRect.Left() + nHalfWidth - nHalfHeight,
- rBoundRect.Top() + nHalfHeight - nHalfWidth);
- Size aNewSize( rBoundRect.GetHeight(), rBoundRect.GetWidth() );
- Rectangle aNewRect( aTopLeft, aNewSize );
- rBoundRect = aNewRect;
-
- String aSrcText( aObjectText );
- aObjectText.Erase();
- for( UINT16 a = 0; a < aSrcText.Len(); a++ )
- {
- aObjectText += aSrcText.GetChar( a );
- aObjectText += '\n';
- }
- rSet.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_CENTER ) );
- bTextRotate = TRUE;
- }
- if ( aObjectText.Len() )
- { // FontWork-Objekt Mit dem Text in aObjectText erzeugen
- SdrObject* pNewObj = new SdrRectObj( OBJ_TEXT, rBoundRect );
- if( pNewObj )
- {
- pNewObj->SetModel( pSdrModel );
- ((SdrRectObj*)pNewObj)->SetText( aObjectText );
- SdrFitToSizeType eFTS = SDRTEXTFIT_PROPORTIONAL;
- rSet.Put( SdrTextFitToSizeTypeItem( eFTS ) );
- rSet.Put( SdrTextAutoGrowHeightItem( FALSE ) );
- rSet.Put( SdrTextAutoGrowWidthItem( FALSE ) );
- rSet.Put( SvxFontItem( FAMILY_DONTKNOW, aFontName, String(),
- PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, EE_CHAR_FONTINFO ));
-
- pNewObj->SetMergedItemSet(rSet);
-
- pRet = pNewObj->ConvertToPolyObj( FALSE, FALSE );
- if( !pRet )
- pRet = pNewObj;
- else
- {
- pRet->NbcSetSnapRect( rBoundRect );
- SdrObject::Free( pNewObj );
- }
- if( bTextRotate )
- {
- double a = 9000 * nPi180;
- pRet->NbcRotate( rBoundRect.Center(), 9000, sin( a ), cos( a ) );
- }
- }
- }
- return pRet;
-}
-
-static Size lcl_GetPrefSize(const Graphic& rGraf, MapMode aWanted)
-{
- MapMode aPrefMapMode(rGraf.GetPrefMapMode());
- if (aPrefMapMode == aWanted)
- return rGraf.GetPrefSize();
- Size aRetSize;
- if (aPrefMapMode == MAP_PIXEL)
- {
- aRetSize = Application::GetDefaultDevice()->PixelToLogic(
- rGraf.GetPrefSize(), aWanted);
- }
- else
- {
- aRetSize = Application::GetDefaultDevice()->LogicToLogic(
- rGraf.GetPrefSize(), rGraf.GetPrefMapMode(), aWanted);
- }
- return aRetSize;
-}
-
-// sj: if the parameter pSet is null, then the resulting crop bitmap will be stored in rGraf,
-// otherwise rGraf is untouched and pSet is used to store the corresponding SdrGrafCropItem
-static void lcl_ApplyCropping( const DffPropSet& rPropSet, SfxItemSet* pSet, Graphic& rGraf )
-{
- sal_Int32 nCropTop = (sal_Int32)rPropSet.GetPropertyValue( DFF_Prop_cropFromTop, 0 );
- sal_Int32 nCropBottom = (sal_Int32)rPropSet.GetPropertyValue( DFF_Prop_cropFromBottom, 0 );
- sal_Int32 nCropLeft = (sal_Int32)rPropSet.GetPropertyValue( DFF_Prop_cropFromLeft, 0 );
- sal_Int32 nCropRight = (sal_Int32)rPropSet.GetPropertyValue( DFF_Prop_cropFromRight, 0 );
-
- if( nCropTop || nCropBottom || nCropLeft || nCropRight )
- {
- double fFactor;
- Size aCropSize;
- BitmapEx aCropBitmap;
- sal_uInt32 nTop( 0 ), nBottom( 0 ), nLeft( 0 ), nRight( 0 );
-
- if ( pSet ) // use crop attributes ?
- aCropSize = lcl_GetPrefSize( rGraf, MAP_100TH_MM );
- else
- {
- aCropBitmap = rGraf.GetBitmapEx();
- aCropSize = aCropBitmap.GetSizePixel();
- }
- if ( nCropTop )
- {
- fFactor = (double)nCropTop / 65536.0;
- nTop = (sal_uInt32)( ( (double)( aCropSize.Height() + 1 ) * fFactor ) + 0.5 );
- }
- if ( nCropBottom )
- {
- fFactor = (double)nCropBottom / 65536.0;
- nBottom = (sal_uInt32)( ( (double)( aCropSize.Height() + 1 ) * fFactor ) + 0.5 );
- }
- if ( nCropLeft )
- {
- fFactor = (double)nCropLeft / 65536.0;
- nLeft = (sal_uInt32)( ( (double)( aCropSize.Width() + 1 ) * fFactor ) + 0.5 );
- }
- if ( nCropRight )
- {
- fFactor = (double)nCropRight / 65536.0;
- nRight = (sal_uInt32)( ( (double)( aCropSize.Width() + 1 ) * fFactor ) + 0.5 );
- }
- if ( pSet ) // use crop attributes ?
- pSet->Put( SdrGrafCropItem( nLeft, nTop, nRight, nBottom ) );
- else
- {
- Rectangle aCropRect( nLeft, nTop, aCropSize.Width() - nRight, aCropSize.Height() - nBottom );
- aCropBitmap.Crop( aCropRect );
- rGraf = aCropBitmap;
- }
- }
-}
-
-SdrObject* SvxMSDffManager::ImportGraphic( SvStream& rSt, SfxItemSet& rSet, Rectangle& aBoundRect, const DffObjData& rObjData ) const
-{
- SdrObject* pRet = NULL;
- String aFilename;
- String aLinkFileName, aLinkFilterName;
- Rectangle aVisArea;
-
- MSO_BlipFlags eFlags = (MSO_BlipFlags)GetPropertyValue( DFF_Prop_pibFlags, mso_blipflagDefault );
- sal_uInt32 nBlipId = GetPropertyValue( DFF_Prop_pib, 0 );
- sal_Bool bGrfRead = sal_False,
-
- // Grafik verlinkt
- bLinkGrf = 0 != ( eFlags & mso_blipflagLinkToFile );
- {
- Graphic aGraf; // be sure this graphic is deleted before swapping out
- if( SeekToContent( DFF_Prop_pibName, rSt ) )
- MSDFFReadZString( rSt, aFilename, GetPropertyValue( DFF_Prop_pibName ), TRUE );
-
- // UND, ODER folgendes:
- if( !( eFlags & mso_blipflagDoNotSave ) ) // Grafik embedded
- {
- bGrfRead = GetBLIP( nBlipId, aGraf, &aVisArea );
- if ( !bGrfRead )
- {
- /*
- Still no luck, lets look at the end of this record for a FBSE pool,
- this fallback is a specific case for how word does it sometimes
- */
- rObjData.rSpHd.SeekToEndOfRecord( rSt );
- DffRecordHeader aHd;
- rSt >> aHd;
- if( DFF_msofbtBSE == aHd.nRecType )
- {
- const ULONG nSkipBLIPLen = 20;
- const ULONG nSkipShapePos = 4;
- const ULONG nSkipBLIP = 4;
- const ULONG nSkip =
- nSkipBLIPLen + 4 + nSkipShapePos + 4 + nSkipBLIP;
-
- if (nSkip <= aHd.nRecLen)
- {
- rSt.SeekRel(nSkip);
- if (0 == rSt.GetError())
- bGrfRead = GetBLIPDirect( rSt, aGraf, &aVisArea );
- }
- }
- }
- }
- if ( bGrfRead )
- {
- // the writer is doing it's own cropping, so this part affects only impress and calc
- if ( GetSvxMSDffSettings() & SVXMSDFF_SETTINGS_CROP_BITMAPS )
- lcl_ApplyCropping( *this, ( rObjData.nSpFlags & SP_FOLESHAPE ) == 0 ? &rSet : NULL, aGraf );
-
- if ( IsProperty( DFF_Prop_pictureTransparent ) )
- {
- UINT32 nTransColor = GetPropertyValue( DFF_Prop_pictureTransparent, 0 );
-
- if ( aGraf.GetType() == GRAPHIC_BITMAP )
- {
- BitmapEx aBitmapEx( aGraf.GetBitmapEx() );
- Bitmap aBitmap( aBitmapEx.GetBitmap() );
- Bitmap aMask( aBitmap.CreateMask( MSO_CLR_ToColor( nTransColor, DFF_Prop_pictureTransparent ), 9 ) );
- if ( aBitmapEx.IsTransparent() )
- aMask.CombineSimple( aBitmapEx.GetMask(), BMP_COMBINE_OR );
- aGraf = BitmapEx( aBitmap, aMask );
- }
- }
-
- sal_Int32 nContrast = GetPropertyValue( DFF_Prop_pictureContrast, 0x10000 );
- /*
- 0x10000 is msoffice 50%
- < 0x10000 is in units of 1/50th of 0x10000 per 1%
- > 0x10000 is in units where
- a msoffice x% is stored as 50/(100-x) * 0x10000
-
- plus, a (ui) microsoft % ranges from 0 to 100, OOO
- from -100 to 100, so also normalize into that range
- */
- if ( nContrast > 0x10000 )
- {
- double fX = nContrast;
- fX /= 0x10000;
- fX /= 51; // 50 + 1 to round
- fX = 1/fX;
- nContrast = static_cast<sal_Int32>(fX);
- nContrast -= 100;
- nContrast = -nContrast;
- nContrast = (nContrast-50)*2;
- }
- else if ( nContrast == 0x10000 )
- nContrast = 0;
- else
- {
- nContrast *= 101; //100 + 1 to round
- nContrast /= 0x10000;
- nContrast -= 100;
- }
- sal_Int16 nBrightness = (sal_Int16)( (sal_Int32)GetPropertyValue( DFF_Prop_pictureBrightness, 0 ) / 327 );
- sal_Int32 nGamma = GetPropertyValue( DFF_Prop_pictureGamma, 0x10000 );
- GraphicDrawMode eDrawMode = GRAPHICDRAWMODE_STANDARD;
- switch ( GetPropertyValue( DFF_Prop_pictureActive ) & 6 )
- {
- case 4 : eDrawMode = GRAPHICDRAWMODE_GREYS; break;
- case 6 : eDrawMode = GRAPHICDRAWMODE_MONO; break;
- case 0 :
- {
- //office considers the converted values of (in OOo) 70 to be the
- //"watermark" values, which can vary slightly due to rounding from the
- //above values
- if (( nContrast == -70 ) && ( nBrightness == 70 ))
- {
- nContrast = 0;
- nBrightness = 0;
- eDrawMode = GRAPHICDRAWMODE_WATERMARK;
- };
- }
- break;
- }
-
- if ( nContrast || nBrightness || ( nGamma != 0x10000 ) || ( eDrawMode != GRAPHICDRAWMODE_STANDARD ) )
- {
- if ( ( rObjData.nSpFlags & SP_FOLESHAPE ) == 0 )
- {
- if ( nBrightness )
- rSet.Put( SdrGrafLuminanceItem( nBrightness ) );
- if ( nContrast )
- rSet.Put( SdrGrafContrastItem( (sal_Int16)nContrast ) );
- if ( nGamma != 0x10000 )
- rSet.Put( SdrGrafGamma100Item( nGamma / 655 ) );
- if ( eDrawMode != GRAPHICDRAWMODE_STANDARD )
- rSet.Put( SdrGrafModeItem( eDrawMode ) );
- }
- else
- {
- if ( eDrawMode == GRAPHICDRAWMODE_WATERMARK )
- {
- nContrast = 60;
- nBrightness = 70;
- eDrawMode = GRAPHICDRAWMODE_STANDARD;
- }
- switch ( aGraf.GetType() )
- {
- case GRAPHIC_BITMAP :
- {
- BitmapEx aBitmapEx( aGraf.GetBitmapEx() );
- if ( nBrightness || nContrast || ( nGamma != 0x10000 ) )
- aBitmapEx.Adjust( nBrightness, (sal_Int16)nContrast, 0, 0, 0, (double)nGamma / 0x10000, FALSE );
- if ( eDrawMode == GRAPHICDRAWMODE_GREYS )
- aBitmapEx.Convert( BMP_CONVERSION_8BIT_GREYS );
- else if ( eDrawMode == GRAPHICDRAWMODE_MONO )
- aBitmapEx.Convert( BMP_CONVERSION_1BIT_THRESHOLD );
- aGraf = aBitmapEx;
-
- }
- break;
-
- case GRAPHIC_GDIMETAFILE :
- {
- GDIMetaFile aGdiMetaFile( aGraf.GetGDIMetaFile() );
- if ( nBrightness || nContrast || ( nGamma != 0x10000 ) )
- aGdiMetaFile.Adjust( nBrightness, (sal_Int16)nContrast, 0, 0, 0, (double)nGamma / 0x10000, FALSE );
- if ( eDrawMode == GRAPHICDRAWMODE_GREYS )
- aGdiMetaFile.Convert( MTF_CONVERSION_8BIT_GREYS );
- else if ( eDrawMode == GRAPHICDRAWMODE_MONO )
- aGdiMetaFile.Convert( MTF_CONVERSION_1BIT_THRESHOLD );
- aGraf = aGdiMetaFile;
- }
- break;
- default: break;
- }
- }
- }
- }
-
- // sollte es ein OLE-Object sein?
- if( bGrfRead && !bLinkGrf && IsProperty( DFF_Prop_pictureId ) )
- {
- // TODO/LATER: in future probably the correct aspect should be provided here
- sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
- // --> OD 2004-12-14 #i32596# - pass <nCalledByGroup> to method
- pRet = ImportOLE( GetPropertyValue( DFF_Prop_pictureId ), aGraf, aBoundRect, aVisArea, rObjData.nCalledByGroup, nAspect );
- // <--
- }
- if( !pRet )
- {
- pRet = new SdrGrafObj;
- if( bGrfRead )
- ((SdrGrafObj*)pRet)->SetGraphic( aGraf );
-
- if( bLinkGrf && !bGrfRead ) // sj: #i55484# if the graphic was embedded ( bGrfRead == true ) then
- { // we do not need to set a link. TODO: not to lose the information where the graphic is linked from
- UniString aName( ::URIHelper::SmartRel2Abs( INetURLObject(maBaseURL), aFilename, URIHelper::GetMaybeFileHdl(), true, false,
- INetURLObject::WAS_ENCODED,
- INetURLObject::DECODE_UNAMBIGUOUS ) );
-
- String aFilterName;
- INetURLObject aURLObj( aName );
-
- if( aURLObj.GetProtocol() == INET_PROT_NOT_VALID )
- {
- String aValidURL;
-
- if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aName, aValidURL ) )
- aURLObj = INetURLObject( aValidURL );
- }
-
- if( aURLObj.GetProtocol() != INET_PROT_NOT_VALID )
- {
- GraphicFilter* pGrfFilter = GetGrfFilter();
- aFilterName = pGrfFilter->GetImportFormatName(
- pGrfFilter->GetImportFormatNumberForShortName( aURLObj.getExtension() ) );
- }
-
- aLinkFileName = aName;
- aLinkFilterName = aFilterName;
- }
- }
-
- // set the size from BLIP if there is one
- if ( pRet && bGrfRead && !aVisArea.IsEmpty() )
- pRet->SetBLIPSizeRectangle( aVisArea );
-
- if ( !pRet->GetName().Len() ) // SJ 22.02.00 : PPT OLE IMPORT:
- { // name is already set in ImportOLE !!
- // JP 01.12.99: SetName before SetModel - because in the other order the Bug 70098 is active
- if ( ( eFlags & mso_blipflagType ) != mso_blipflagComment )
- {
- INetURLObject aURL;
- aURL.SetSmartURL( aFilename );
- pRet->SetName( aURL.getBase() );
- }
- else
- pRet->SetName( aFilename );
- }
- }
- pRet->SetModel( pSdrModel ); // fuer GraphicLink erforderlich
- pRet->SetLogicRect( aBoundRect );
-
- if ( pRet->ISA( SdrGrafObj ) )
- {
- if( aLinkFileName.Len() )
- ((SdrGrafObj*)pRet)->SetGraphicLink( aLinkFileName, aLinkFilterName );
-
- if ( bLinkGrf && !bGrfRead )
- {
- ((SdrGrafObj*)pRet)->ForceSwapIn();
- Graphic aGraf(((SdrGrafObj*)pRet)->GetGraphic());
- lcl_ApplyCropping( *this, &rSet, aGraf );
- }
- ((SdrGrafObj*)pRet)->ForceSwapOut();
- }
-
- return pRet;
-}
-
-// PptSlidePersistEntry& rPersistEntry, SdPage* pPage
-SdrObject* SvxMSDffManager::ImportObj( SvStream& rSt, void* pClientData,
- Rectangle& rClientRect, const Rectangle& rGlobalChildRect, int nCalledByGroup, sal_Int32* pShapeId )
-{
- SdrObject* pRet = NULL;
- DffRecordHeader aObjHd;
- rSt >> aObjHd;
- if ( aObjHd.nRecType == DFF_msofbtSpgrContainer )
- {
- pRet = ImportGroup( aObjHd, rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup, pShapeId );
- }
- else if ( aObjHd.nRecType == DFF_msofbtSpContainer )
- {
- pRet = ImportShape( aObjHd, rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup, pShapeId );
- }
- aObjHd.SeekToBegOfRecord( rSt ); // FilePos restaurieren
- return pRet;
-}
-
-SdrObject* SvxMSDffManager::ImportGroup( const DffRecordHeader& rHd, SvStream& rSt, void* pClientData,
- Rectangle& rClientRect, const Rectangle& rGlobalChildRect,
- int nCalledByGroup, sal_Int32* pShapeId )
-{
- SdrObject* pRet = NULL;
-
- if( pShapeId )
- *pShapeId = 0;
-
- rHd.SeekToContent( rSt );
- DffRecordHeader aRecHd; // the first atom has to be the SpContainer for the GroupObject
- rSt >> aRecHd;
- if ( aRecHd.nRecType == DFF_msofbtSpContainer )
- {
- INT32 nGroupRotateAngle = 0;
- INT32 nSpFlags = 0;
- mnFix16Angle = 0;
- aRecHd.SeekToBegOfRecord( rSt );
- pRet = ImportObj( rSt, pClientData, rClientRect, rGlobalChildRect, nCalledByGroup + 1, pShapeId );
- if ( pRet )
- {
- nSpFlags = nGroupShapeFlags;
- nGroupRotateAngle = mnFix16Angle;
-
- Rectangle aClientRect( rClientRect );
-
- Rectangle aGlobalChildRect;
- if ( !nCalledByGroup || rGlobalChildRect.IsEmpty() )
- aGlobalChildRect = GetGlobalChildAnchor( rHd, rSt, aClientRect );
- else
- aGlobalChildRect = rGlobalChildRect;
-
- if ( ( nGroupRotateAngle > 4500 && nGroupRotateAngle <= 13500 )
- || ( nGroupRotateAngle > 22500 && nGroupRotateAngle <= 31500 ) )
- {
- sal_Int32 nHalfWidth = ( aGlobalChildRect.GetWidth() + 1 ) >> 1;
- sal_Int32 nHalfHeight = ( aGlobalChildRect.GetHeight() + 1 ) >> 1;
- Point aTopLeft( aGlobalChildRect.Left() + nHalfWidth - nHalfHeight,
- aGlobalChildRect.Top() + nHalfHeight - nHalfWidth );
- Size aNewSize( aGlobalChildRect.GetHeight(), aGlobalChildRect.GetWidth() );
- Rectangle aNewRect( aTopLeft, aNewSize );
- aGlobalChildRect = aNewRect;
- }
-
- // now importing the inner objects of the group
- aRecHd.SeekToEndOfRecord( rSt );
- while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < rHd.GetRecEndFilePos() ) )
- {
- DffRecordHeader aRecHd2;
- rSt >> aRecHd2;
- if ( aRecHd2.nRecType == DFF_msofbtSpgrContainer )
- {
- Rectangle aGroupClientAnchor, aGroupChildAnchor;
- GetGroupAnchors( aRecHd2, rSt, aGroupClientAnchor, aGroupChildAnchor, aClientRect, aGlobalChildRect );
- aRecHd2.SeekToBegOfRecord( rSt );
- sal_Int32 nShapeId;
- SdrObject* pTmp = ImportGroup( aRecHd2, rSt, pClientData, aGroupClientAnchor, aGroupChildAnchor, nCalledByGroup + 1, &nShapeId );
- if ( pTmp )
- {
- ((SdrObjGroup*)pRet)->GetSubList()->NbcInsertObject( pTmp );
- if( nShapeId )
- insertShapeId( nShapeId, pTmp );
- }
- }
- else if ( aRecHd2.nRecType == DFF_msofbtSpContainer )
- {
- aRecHd2.SeekToBegOfRecord( rSt );
- sal_Int32 nShapeId;
- SdrObject* pTmp = ImportShape( aRecHd2, rSt, pClientData, aClientRect, aGlobalChildRect, nCalledByGroup + 1, &nShapeId );
- if ( pTmp )
- {
- ((SdrObjGroup*)pRet)->GetSubList()->NbcInsertObject( pTmp );
- if( nShapeId )
- insertShapeId( nShapeId, pTmp );
- }
- }
- aRecHd2.SeekToEndOfRecord( rSt );
- }
-
- // pRet->NbcSetSnapRect( aGroupBound );
- if ( nGroupRotateAngle )
- {
- double a = nGroupRotateAngle * nPi180;
- pRet->NbcRotate( aClientRect.Center(), nGroupRotateAngle, sin( a ), cos( a ) );
- }
- if ( nSpFlags & SP_FFLIPV ) // Vertikal gespiegelt?
- { // BoundRect in aBoundRect
- Point aLeft( aClientRect.Left(), ( aClientRect.Top() + aClientRect.Bottom() ) >> 1 );
- Point aRight( aLeft.X() + 1000, aLeft.Y() );
- pRet->NbcMirror( aLeft, aRight );
- }
- if ( nSpFlags & SP_FFLIPH ) // Horizontal gespiegelt?
- { // BoundRect in aBoundRect
- Point aTop( ( aClientRect.Left() + aClientRect.Right() ) >> 1, aClientRect.Top() );
- Point aBottom( aTop.X(), aTop.Y() + 1000 );
- pRet->NbcMirror( aTop, aBottom );
- }
- }
- }
- return pRet;
-}
-
-SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& rSt, void* pClientData,
- Rectangle& rClientRect, const Rectangle& rGlobalChildRect,
- int nCalledByGroup, sal_Int32* pShapeId )
-{
- SdrObject* pRet = NULL;
-
- if( pShapeId )
- *pShapeId = 0;
-
- rHd.SeekToBegOfRecord( rSt );
- Rectangle aBoundRect( rClientRect );
- DffObjData aObjData( rHd, aBoundRect, nCalledByGroup );
- maShapeRecords.Consume( rSt, FALSE );
- aObjData.bShapeType = maShapeRecords.SeekToContent( rSt, DFF_msofbtSp, SEEK_FROM_BEGINNING );
- if ( aObjData.bShapeType )
- {
- rSt >> aObjData.nShapeId
- >> aObjData.nSpFlags;
- aObjData.eShapeType = (MSO_SPT)maShapeRecords.Current()->nRecInstance;
- }
- else
- {
- aObjData.nShapeId = 0;
- aObjData.nSpFlags = 0;
- aObjData.eShapeType = mso_sptNil;
- }
-
- if( pShapeId )
- *pShapeId = aObjData.nShapeId;
-
- if ( mbTracing )
- mpTracer->AddAttribute( aObjData.nSpFlags & SP_FGROUP
- ? rtl::OUString::createFromAscii( "GroupShape" )
- : rtl::OUString::createFromAscii( "Shape" ),
- rtl::OUString::valueOf( (sal_Int32)aObjData.nShapeId ) );
- aObjData.bOpt = maShapeRecords.SeekToContent( rSt, DFF_msofbtOPT, SEEK_FROM_CURRENT_AND_RESTART );
- if ( aObjData.bOpt )
- {
- maShapeRecords.Current()->SeekToBegOfRecord( rSt );
-#ifdef DBG_AUTOSHAPE
- ReadPropSet( rSt, pClientData, (UINT32)aObjData.eShapeType );
-#else
- ReadPropSet( rSt, pClientData );
-#endif
- }
- else
- {
- InitializePropSet(); // get the default PropSet
- ( (DffPropertyReader*) this )->mnFix16Angle = 0;
- }
-
- aObjData.bChildAnchor = maShapeRecords.SeekToContent( rSt, DFF_msofbtChildAnchor, SEEK_FROM_CURRENT_AND_RESTART );
- if ( aObjData.bChildAnchor )
- {
- INT32 l, o, r, u;
- rSt >> l >> o >> r >> u;
- Scale( l );
- Scale( o );
- Scale( r );
- Scale( u );
- aObjData.aChildAnchor = Rectangle( l, o, r, u );
- if ( !rGlobalChildRect.IsEmpty() && !rClientRect.IsEmpty() && rGlobalChildRect.GetWidth() && rGlobalChildRect.GetHeight() )
- {
- double fl = l;
- double fo = o;
- double fWidth = r - l;
- double fHeight= u - o;
- double fXScale = (double)rClientRect.GetWidth() / (double)rGlobalChildRect.GetWidth();
- double fYScale = (double)rClientRect.GetHeight() / (double)rGlobalChildRect.GetHeight();
- fl = ( ( l - rGlobalChildRect.Left() ) * fXScale ) + rClientRect.Left();
- fo = ( ( o - rGlobalChildRect.Top() ) * fYScale ) + rClientRect.Top();
- fWidth *= fXScale;
- fHeight *= fYScale;
- aObjData.aChildAnchor = Rectangle( Point( (sal_Int32)fl, (sal_Int32)fo ), Size( (sal_Int32)( fWidth + 1 ), (sal_Int32)( fHeight + 1 ) ) );
- }
- }
-
- aObjData.bClientAnchor = maShapeRecords.SeekToContent( rSt, DFF_msofbtClientAnchor, SEEK_FROM_CURRENT_AND_RESTART );
- if ( aObjData.bClientAnchor )
- ProcessClientAnchor2( rSt, *maShapeRecords.Current(), pClientData, aObjData );
-
- if ( aObjData.bChildAnchor )
- aBoundRect = aObjData.aChildAnchor;
-
- if ( aObjData.nSpFlags & SP_FBACKGROUND )
- aBoundRect = Rectangle( Point(), Size( 1, 1 ) );
-
- Rectangle aTextRect;
- if ( !aBoundRect.IsEmpty() )
- { // Rotation auf BoundingBox anwenden, BEVOR ien Objekt generiert wurde
- if( mnFix16Angle )
- {
- long nAngle = mnFix16Angle;
- if ( ( nAngle > 4500 && nAngle <= 13500 ) || ( nAngle > 22500 && nAngle <= 31500 ) )
- {
- INT32 nHalfWidth = ( aBoundRect.GetWidth() + 1 ) >> 1;
- INT32 nHalfHeight = ( aBoundRect.GetHeight() + 1 ) >> 1;
- Point aTopLeft( aBoundRect.Left() + nHalfWidth - nHalfHeight,
- aBoundRect.Top() + nHalfHeight - nHalfWidth );
- Size aNewSize( aBoundRect.GetHeight(), aBoundRect.GetWidth() );
- Rectangle aNewRect( aTopLeft, aNewSize );
- aBoundRect = aNewRect;
- }
- }
- aTextRect = aBoundRect;
- FASTBOOL bGraphic = IsProperty( DFF_Prop_pib ) ||
- IsProperty( DFF_Prop_pibName ) ||
- IsProperty( DFF_Prop_pibFlags );
-
- if ( aObjData.nSpFlags & SP_FGROUP )
- {
- pRet = new SdrObjGroup;
- /* After CWS aw033 has been integrated, an empty group object
- cannot store its resulting bounding rectangle anymore. We have
- to return this rectangle via rClientRect now, but only, if
- caller has not passed an own bounding ractangle. */
- if ( rClientRect.IsEmpty() )
- rClientRect = aBoundRect;
- nGroupShapeFlags = aObjData.nSpFlags; // #73013#
- }
- else if ( ( aObjData.eShapeType != mso_sptNil ) || IsProperty( DFF_Prop_pVertices ) || bGraphic )
- {
- SfxItemSet aSet( pSdrModel->GetItemPool() );
-
- sal_Bool bIsConnector = ( ( aObjData.eShapeType >= mso_sptStraightConnector1 ) && ( aObjData.eShapeType <= mso_sptCurvedConnector5 ) );
- sal_Bool bIsCustomShape = sal_False;
- sal_Int32 nObjectRotation = mnFix16Angle;
- sal_uInt32 nSpFlags = aObjData.nSpFlags;
-
- if ( bGraphic )
- pRet = ImportGraphic( rSt, aSet, aBoundRect, aObjData ); // SJ: #68396# is no longer true (fixed in ppt2000)
- else
- {
- // Check if we are using our new as shape type. This is done by
- // the PowerPoint import now. As result nearly each escher object
- // will be imported as customshape, this is also done in the case for
- // simple text objects.
- // The new shape is having the advantage to fully support wordwrapping
- // and autogrow size attributes.
-
- if ( GetSvxMSDffSettings() & SVXMSDFF_SETTINGS_IMPORT_IAS )
- {
- if ( GetCustomShapeContent( aObjData.eShapeType ) || IsProperty( DFF_Prop_pVertices ) )
- {
-
- ApplyAttributes( rSt, aSet, aObjData.eShapeType, aObjData.nSpFlags );
-
-// the com.sun.star.drawing.EnhancedCustomShapeEngine is default, so we do not need to set a hard attribute
-// aSet.Put( SdrCustomShapeEngineItem( String::CreateFromAscii( "com.sun.star.drawing.EnhancedCustomShapeEngine" ) ) );
- pRet = new SdrObjCustomShape();
- pRet->SetModel( pSdrModel );
-
- sal_Bool bIsFontwork = ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x4000 ) != 0;
-
- // in case of a FontWork, the text is set by the escher import
- if ( bIsFontwork )
- {
- String aObjectText;
- String aFontName;
- MSO_GeoTextAlign eGeoTextAlign;
-
- if ( SeekToContent( DFF_Prop_gtextFont, rSt ) )
- {
- SvxFontItem aLatin(EE_CHAR_FONTINFO), aAsian(EE_CHAR_FONTINFO_CJK), aComplex(EE_CHAR_FONTINFO_CTL);
- GetDefaultFonts( aLatin, aAsian, aComplex );
-
- MSDFFReadZString( rSt, aFontName, GetPropertyValue( DFF_Prop_gtextFont ), TRUE );
- aSet.Put( SvxFontItem( aLatin.GetFamily(), aFontName, aLatin.GetStyleName(),
- PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, EE_CHAR_FONTINFO ));
- aSet.Put( SvxFontItem( aLatin.GetFamily(), aFontName, aLatin.GetStyleName(),
- PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, EE_CHAR_FONTINFO_CJK ) );
- aSet.Put( SvxFontItem( aLatin.GetFamily(), aFontName, aLatin.GetStyleName(),
- PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, EE_CHAR_FONTINFO_CTL ) );
- }
-
- // SJ: applying fontattributes for Fontwork :
- if ( IsHardAttribute( DFF_Prop_gtextFItalic ) )
- aSet.Put( SvxPostureItem( ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x0010 ) != 0 ? ITALIC_NORMAL : ITALIC_NONE, EE_CHAR_ITALIC ) );
-
- if ( IsHardAttribute( DFF_Prop_gtextFBold ) )
- aSet.Put( SvxWeightItem( ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x0020 ) != 0 ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
-
- // SJ TODO: Vertical Writing is not correct, instead this should be
- // replaced through "CharacterRotation" by 90°, therefore a new Item has to be
- // supported by svx core, api and xml file format
- ((SdrObjCustomShape*)pRet)->SetVerticalWriting( ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x2000 ) != 0 );
-
- if ( SeekToContent( DFF_Prop_gtextUNICODE, rSt ) )
- {
- MSDFFReadZString( rSt, aObjectText, GetPropertyValue( DFF_Prop_gtextUNICODE ), TRUE );
- ReadObjText( aObjectText, pRet );
- }
-
- eGeoTextAlign = ( (MSO_GeoTextAlign)GetPropertyValue( DFF_Prop_gtextAlign, mso_alignTextCenter ) );
- {
- SdrTextHorzAdjust eHorzAdjust;
- switch( eGeoTextAlign )
- {
- case mso_alignTextLetterJust :
- case mso_alignTextWordJust :
- case mso_alignTextStretch : eHorzAdjust = SDRTEXTHORZADJUST_BLOCK; break;
- default:
- case mso_alignTextInvalid :
- case mso_alignTextCenter : eHorzAdjust = SDRTEXTHORZADJUST_CENTER; break;
- case mso_alignTextLeft : eHorzAdjust = SDRTEXTHORZADJUST_LEFT; break;
- case mso_alignTextRight : eHorzAdjust = SDRTEXTHORZADJUST_RIGHT; break;
- }
- aSet.Put( SdrTextHorzAdjustItem( eHorzAdjust ) );
-
- SdrFitToSizeType eFTS = SDRTEXTFIT_NONE;
- if ( eGeoTextAlign == mso_alignTextStretch )
- eFTS = SDRTEXTFIT_ALLLINES;
- aSet.Put( SdrTextFitToSizeTypeItem( eFTS ) );
- }
- if ( IsProperty( DFF_Prop_gtextSpacing ) )
- {
- sal_Int32 nTextWidth = GetPropertyValue( DFF_Prop_gtextSpacing, 100 < 16 ) / 655;
- if ( nTextWidth != 100 )
- aSet.Put( SvxCharScaleWidthItem( (sal_uInt16)nTextWidth, EE_CHAR_FONTWIDTH ) );
- }
- if ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 ) & 0x1000 ) // SJ: Font Kerning On ?
- aSet.Put( SvxKerningItem( 1, EE_CHAR_KERNING ) );
- }
- pRet->SetMergedItemSet( aSet );
-
- // sj: taking care of rtl, ltr. In case of fontwork mso. seems not to be able to set
- // proper text directions, instead the text default is depending to the string.
- // so we have to calculate the a text direction from string:
- if ( bIsFontwork )
- {
- OutlinerParaObject* pParaObj = ((SdrObjCustomShape*)pRet)->GetOutlinerParaObject();
- if ( pParaObj )
- {
- SdrOutliner& rOutliner = ((SdrObjCustomShape*)pRet)->ImpGetDrawOutliner();
- BOOL bOldUpdateMode = rOutliner.GetUpdateMode();
- SdrModel* pModel = pRet->GetModel();
- if ( pModel )
- rOutliner.SetStyleSheetPool( (SfxStyleSheetPool*)pModel->GetStyleSheetPool() );
- rOutliner.SetUpdateMode( FALSE );
- rOutliner.SetText( *pParaObj );
- VirtualDevice aVirDev( 1 );
- aVirDev.SetMapMode( MAP_100TH_MM );
- sal_uInt32 i, nParagraphs = rOutliner.GetParagraphCount();
- if ( nParagraphs )
- {
- sal_Bool bCreateNewParaObject = sal_False;
- for ( i = 0; i < nParagraphs; i++ )
- {
- BOOL bIsRTL = aVirDev.GetTextIsRTL( rOutliner.GetText( rOutliner.GetParagraph( i ) ), 0, STRING_LEN );
- if ( bIsRTL )
- {
- SfxItemSet aSet2( rOutliner.GetParaAttribs( (USHORT)i ) );
- aSet2.Put( SvxFrameDirectionItem( FRMDIR_HORI_RIGHT_TOP, EE_PARA_WRITINGDIR ) );
- rOutliner.SetParaAttribs( (USHORT)i, aSet2 );
- bCreateNewParaObject = sal_True;
- }
- }
- if ( bCreateNewParaObject )
- {
- OutlinerParaObject* pNewText = rOutliner.CreateParaObject();
- rOutliner.Init( OUTLINERMODE_TEXTOBJECT );
- ((SdrObjCustomShape*)pRet)->NbcSetOutlinerParaObject( pNewText );
- }
- }
- rOutliner.Clear();
- rOutliner.SetUpdateMode( bOldUpdateMode );
- }
- }
-
- // mso_sptArc special treating:
- // sj: since we actually can't render the arc because of its weird SnapRect settings,
- // we will create a new CustomShape, that can be saved/loaded without problems.
- // We will change the shape type, so this code applys only if importing arcs from msoffice.
- if ( aObjData.eShapeType == mso_sptArc )
- {
- const rtl::OUString sAdjustmentValues( RTL_CONSTASCII_USTRINGPARAM ( "AdjustmentValues" ) );
- const rtl::OUString sCoordinates( RTL_CONSTASCII_USTRINGPARAM ( "Coordinates" ) );
- const rtl::OUString sHandles( RTL_CONSTASCII_USTRINGPARAM ( "Handles" ) );
- const rtl::OUString sEquations( RTL_CONSTASCII_USTRINGPARAM ( "Equations" ) );
- const rtl::OUString sViewBox( RTL_CONSTASCII_USTRINGPARAM ( "ViewBox" ) );
- const rtl::OUString sPath( RTL_CONSTASCII_USTRINGPARAM ( "Path" ) );
- const rtl::OUString sTextFrames( RTL_CONSTASCII_USTRINGPARAM ( "TextFrames" ) );
- SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)((SdrObjCustomShape*)pRet)->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair> seqCoordinates;
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue > seqAdjustmentValues;
-
- // before clearing the GeometryItem we have to store the current Coordinates
- const uno::Any* pAny = ((SdrCustomShapeGeometryItem&)aGeometryItem).GetPropertyValueByName( sPath, sCoordinates );
- Rectangle aPolyBoundRect;
- if ( pAny && ( *pAny >>= seqCoordinates ) && ( seqCoordinates.getLength() >= 4 ) )
- {
- sal_Int32 nPtNum, nNumElemVert = seqCoordinates.getLength();
- XPolygon aXP( (sal_uInt16)nNumElemVert );
-// const EnhancedCustomShapeParameterPair* pTmp = seqCoordinates.getArray();
- for ( nPtNum = 0; nPtNum < nNumElemVert; nPtNum++ )
- {
- Point aP;
- sal_Int32 nX = 0, nY = 0;
- seqCoordinates[ nPtNum ].First.Value >>= nX;
- seqCoordinates[ nPtNum ].Second.Value >>= nY;
- aP.X() = nX;
- aP.Y() = nY;
- aXP[ (sal_uInt16)nPtNum ] = aP;
- }
- aPolyBoundRect = Rectangle( aXP.GetBoundRect() );
- }
- else
- aPolyBoundRect = Rectangle( -21600, 0, 21600, 43200 ); // defaulting
-
- // clearing items, so MergeDefaultAttributes will set the corresponding defaults from EnhancedCustomShapeGeometry
- aGeometryItem.ClearPropertyValue( sHandles );
- aGeometryItem.ClearPropertyValue( sEquations );
- aGeometryItem.ClearPropertyValue( sViewBox );
- aGeometryItem.ClearPropertyValue( sPath );
-
- sal_Int32 nEndAngle = 9000;
- sal_Int32 nStartAngle = 0;
- pAny = ((SdrCustomShapeGeometryItem&)aGeometryItem).GetPropertyValueByName( sAdjustmentValues );
- if ( pAny && ( *pAny >>= seqAdjustmentValues ) && seqAdjustmentValues.getLength() > 1 )
- {
- double fNumber;
- if ( seqAdjustmentValues[ 0 ].State == com::sun::star::beans::PropertyState_DIRECT_VALUE )
- {
- seqAdjustmentValues[ 0 ].Value >>= fNumber;
- nEndAngle = NormAngle360( - (sal_Int32)fNumber * 100 );
- }
- else
- {
- fNumber = 270.0;
- seqAdjustmentValues[ 0 ].Value <<= fNumber;
- seqAdjustmentValues[ 0 ].State = com::sun::star::beans::PropertyState_DIRECT_VALUE; // so this value will properly be stored
- }
-
- if ( seqAdjustmentValues[ 1 ].State == com::sun::star::beans::PropertyState_DIRECT_VALUE )
- {
- seqAdjustmentValues[ 1 ].Value >>= fNumber;
- nStartAngle = NormAngle360( - (sal_Int32)fNumber * 100 );
- }
- else
- {
- fNumber = 0.0;
- seqAdjustmentValues[ 0 ].Value <<= fNumber;
- seqAdjustmentValues[ 1 ].State = com::sun::star::beans::PropertyState_DIRECT_VALUE;
- }
-
- PropertyValue aPropVal;
- aPropVal.Name = sAdjustmentValues;
- aPropVal.Value <<= seqAdjustmentValues;
- aGeometryItem.SetPropertyValue( aPropVal ); // storing the angle attribute
- }
- if ( nStartAngle != nEndAngle )
- {
- XPolygon aXPoly( aPolyBoundRect.Center(), aPolyBoundRect.GetWidth() / 2, aPolyBoundRect.GetHeight() / 2,
- (USHORT)nStartAngle / 10, (USHORT)nEndAngle / 10, TRUE );
- Rectangle aPolyPieRect( aXPoly.GetBoundRect() );
-
- double fYScale, fXScale;
- double fYOfs, fXOfs;
-
- Point aP( aBoundRect.Center() );
- Size aS( aBoundRect.GetSize() );
- aP.X() -= aS.Width() / 2;
- aP.Y() -= aS.Height() / 2;
- Rectangle aLogicRect( aP, aS );
-
- fYOfs = fXOfs = 0.0;
-
- if ( aPolyBoundRect.GetWidth() && aPolyPieRect.GetWidth() )
- {
- fXScale = (double)aLogicRect.GetWidth() / (double)aPolyPieRect.GetWidth();
- if ( nSpFlags & SP_FFLIPH )
- fXOfs = ( (double)aPolyPieRect.Right() - (double)aPolyBoundRect.Right() ) * fXScale;
- else
- fXOfs = ( (double)aPolyBoundRect.Left() - (double)aPolyPieRect.Left() ) * fXScale;
- }
- if ( aPolyBoundRect.GetHeight() && aPolyPieRect.GetHeight() )
- {
- fYScale = (double)aLogicRect.GetHeight() / (double)aPolyPieRect.GetHeight();
- if ( nSpFlags & SP_FFLIPV )
- fYOfs = ( (double)aPolyPieRect.Bottom() - (double)aPolyBoundRect.Bottom() ) * fYScale;
- else
- fYOfs = ((double)aPolyBoundRect.Top() - (double)aPolyPieRect.Top() ) * fYScale;
- }
-
- fXScale = (double)aPolyBoundRect.GetWidth() / (double)aPolyPieRect.GetWidth();
- fYScale = (double)aPolyBoundRect.GetHeight() / (double)aPolyPieRect.GetHeight();
-
- Rectangle aOldBoundRect( aBoundRect );
- aBoundRect = Rectangle( Point( aLogicRect.Left() + (sal_Int32)fXOfs, aLogicRect.Top() + (sal_Int32)fYOfs ),
- Size( (sal_Int32)( aLogicRect.GetWidth() * fXScale ), (sal_Int32)( aLogicRect.GetHeight() * fYScale ) ) );
-
- // creating the text frame -> scaling into (0,0),(21600,21600) destination coordinate system
- double fTextFrameScaleX = (double)21600 / (double)aPolyBoundRect.GetWidth();
- double fTextFrameScaleY = (double)21600 / (double)aPolyBoundRect.GetHeight();
- sal_Int32 nLeft = (sal_Int32)(( aPolyPieRect.Left() - aPolyBoundRect.Left() ) * fTextFrameScaleX );
- sal_Int32 nTop = (sal_Int32)(( aPolyPieRect.Top() - aPolyBoundRect.Top() ) * fTextFrameScaleY );
- sal_Int32 nRight = (sal_Int32)(( aPolyPieRect.Right() - aPolyBoundRect.Left() ) * fTextFrameScaleX );
- sal_Int32 nBottom= (sal_Int32)(( aPolyPieRect.Bottom()- aPolyBoundRect.Top() ) * fTextFrameScaleY );
- com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeTextFrame > aTextFrame( 1 );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrame[ 0 ].TopLeft.First, nLeft );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrame[ 0 ].TopLeft.Second, nTop );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrame[ 0 ].BottomRight.First, nRight );
- EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aTextFrame[ 0 ].BottomRight.Second,nBottom );
- PropertyValue aProp;
- aProp.Name = sTextFrames;
- aProp.Value <<= aTextFrame;
- aGeometryItem.SetPropertyValue( sPath, aProp );
-
- // sj: taking care of the different rotation points, since the new arc is having a bigger snaprect
- if ( mnFix16Angle )
- {
- sal_Int32 nAngle = mnFix16Angle;
- if ( nSpFlags & SP_FFLIPH )
- nAngle = 36000 - nAngle;
- if ( nSpFlags & SP_FFLIPV )
- nAngle = -nAngle;
- double a = nAngle * F_PI18000;
- double ss = sin( a );
- double cc = cos( a );
- Point aP1( aOldBoundRect.TopLeft() );
- Point aC1( aBoundRect.Center() );
- Point aP2( aOldBoundRect.TopLeft() );
- Point aC2( aOldBoundRect.Center() );
- RotatePoint( aP1, aC1, ss, cc );
- RotatePoint( aP2, aC2, ss, cc );
- aBoundRect.Move( aP2.X() - aP1.X(), aP2.Y() - aP1.Y() );
- }
- }
- ((SdrObjCustomShape*)pRet)->SetMergedItem( aGeometryItem );
- ((SdrObjCustomShape*)pRet)->MergeDefaultAttributes();
-
- // now setting a new name, so the above correction is only done once when importing from ms
- SdrCustomShapeGeometryItem aGeoName( (SdrCustomShapeGeometryItem&)((SdrObjCustomShape*)pRet)->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
- const rtl::OUString sType( RTL_CONSTASCII_USTRINGPARAM ( "Type" ) );
- const rtl::OUString sName( RTL_CONSTASCII_USTRINGPARAM ( "mso-spt100" ) );
- PropertyValue aPropVal;
- aPropVal.Name = sType;
- aPropVal.Value <<= sName;
- aGeoName.SetPropertyValue( aPropVal );
- ((SdrObjCustomShape*)pRet)->SetMergedItem( aGeoName );
- }
- else
- ((SdrObjCustomShape*)pRet)->MergeDefaultAttributes();
-
- pRet->SetSnapRect( aBoundRect );
- EnhancedCustomShape2d aCustomShape2d( pRet );
- aTextRect = aCustomShape2d.GetTextRect();
-
- bIsCustomShape = TRUE;
-
- if( bIsConnector )
- {
- if( nObjectRotation )
- {
- double a = nObjectRotation * nPi180;
- pRet->NbcRotate( aBoundRect.Center(), nObjectRotation, sin( a ), cos( a ) );
- }
- // Horizontal gespiegelt?
- if ( nSpFlags & SP_FFLIPH )
- {
- Rectangle aBndRect( pRet->GetSnapRect() );
- Point aTop( ( aBndRect.Left() + aBndRect.Right() ) >> 1, aBndRect.Top() );
- Point aBottom( aTop.X(), aTop.Y() + 1000 );
- pRet->NbcMirror( aTop, aBottom );
- }
- // Vertikal gespiegelt?
- if ( nSpFlags & SP_FFLIPV )
- {
- Rectangle aBndRect( pRet->GetSnapRect() );
- Point aLeft( aBndRect.Left(), ( aBndRect.Top() + aBndRect.Bottom() ) >> 1 );
- Point aRight( aLeft.X() + 1000, aLeft.Y() );
- pRet->NbcMirror( aLeft, aRight );
- }
- basegfx::B2DPolyPolygon aPoly( SdrObjCustomShape::GetLineGeometry( (SdrObjCustomShape*)pRet, sal_True ) );
- SdrObject::Free( pRet );
-
- pRet = new SdrEdgeObj();
- pRet->SetLogicRect(aBoundRect);
-
- // Konnektoren
- MSO_ConnectorStyle eConnectorStyle = (MSO_ConnectorStyle)GetPropertyValue( DFF_Prop_cxstyle, mso_cxstyleStraight );
-
- ((SdrEdgeObj*)pRet)->ConnectToNode(TRUE, NULL);
- ((SdrEdgeObj*)pRet)->ConnectToNode(FALSE, NULL);
-
- Point aPoint1( aBoundRect.TopLeft() );
- Point aPoint2( aBoundRect.BottomRight() );
-
- // Rotationen beachten
- if ( nObjectRotation )
- {
- double a = nObjectRotation * nPi180;
- Point aCenter( aBoundRect.Center() );
- double ss = sin(a);
- double cc = cos(a);
-
- RotatePoint(aPoint1, aCenter, ss, cc);
- RotatePoint(aPoint2, aCenter, ss, cc);
- }
-
- // Linie innerhalb des Bereiches zurechtdrehen/spiegeln
- if ( nSpFlags & SP_FFLIPH )
- {
- INT32 n = aPoint1.X();
- aPoint1.X() = aPoint2.X();
- aPoint2.X() = n;
- }
- if ( nSpFlags & SP_FFLIPV )
- {
- INT32 n = aPoint1.Y();
- aPoint1.Y() = aPoint2.Y();
- aPoint2.Y() = n;
- }
- nSpFlags &= ~( SP_FFLIPV | SP_FFLIPH );
-
- pRet->NbcSetPoint(aPoint1, 0L); // Startpunkt
- pRet->NbcSetPoint(aPoint2, 1L); // Endpunkt
-
- sal_Int32 n1HorzDist, n1VertDist, n2HorzDist, n2VertDist;
- n1HorzDist = n1VertDist = n2HorzDist = n2VertDist = 0;
- switch( eConnectorStyle )
- {
- case mso_cxstyleBent:
- {
- aSet.Put( SdrEdgeKindItem( SDREDGE_ORTHOLINES ) );
- n1HorzDist = n1VertDist = n2HorzDist = n2VertDist = 630;
- }
- break;
- case mso_cxstyleCurved:
- aSet.Put( SdrEdgeKindItem( SDREDGE_BEZIER ) );
- break;
- default: // mso_cxstyleStraight || mso_cxstyleNone
- aSet.Put( SdrEdgeKindItem( SDREDGE_ONELINE ) );
- break;
- }
- aSet.Put( SdrEdgeNode1HorzDistItem( n1HorzDist ) );
- aSet.Put( SdrEdgeNode1VertDistItem( n1VertDist ) );
- aSet.Put( SdrEdgeNode2HorzDistItem( n2HorzDist ) );
- aSet.Put( SdrEdgeNode2VertDistItem( n2VertDist ) );
-
- ((SdrEdgeObj*)pRet)->SetEdgeTrackPath( aPoly );
- }
- }
- }
- else
- {
- SvxMSDffCustomShape aCustomShape( *this, rSt, aObjData, aBoundRect, nObjectRotation, mpTracer );
- if ( !aCustomShape.IsEmpty() )
- {
- ApplyAttributes( rSt, aSet, aObjData.eShapeType, aObjData.nSpFlags );
- pRet = aCustomShape.GetObject( pSdrModel, aSet, TRUE );
- aTextRect = aCustomShape.GetTextRect();
- bIsCustomShape = TRUE;
- }
- }
- if ( !bIsCustomShape )
- {
- if ( aObjData.eShapeType == mso_sptTextBox )
- {
- if ( ( GetPropertyValue( DFF_Prop_fNoLineDrawDash ) & 8 )
- || ( GetPropertyValue( DFF_Prop_fNoFillHitTest ) & 0x10 ) )
- {
- pRet = new SdrRectObj( aBoundRect ); // SJ: changed the type from OBJ_TEXT to OBJ_RECT (#88277#)
- }
- }
- else if ( ( ( aObjData.eShapeType >= mso_sptCallout1 ) && ( aObjData.eShapeType <= mso_sptAccentBorderCallout3 ) )
- || ( aObjData.eShapeType == mso_sptCallout90 )
- || ( aObjData.eShapeType == mso_sptAccentCallout90 )
- || ( aObjData.eShapeType == mso_sptBorderCallout90 )
- || ( aObjData.eShapeType == mso_sptAccentBorderCallout90 ) )
- {
- pRet = new SdrCaptionObj( aBoundRect );
- INT32 nAdjust0 = GetPropertyValue( DFF_Prop_adjustValue, 0 );
- INT32 nAdjust1 = GetPropertyValue( DFF_Prop_adjust2Value, 0 );
- if( nAdjust0 | nAdjust1 )
- { // AdjustValues anwenden, nur welche ?!?
- nAdjust0 = ( nAdjust0 * 100 ) / 850;
- nAdjust1 = ( nAdjust1 * 100 ) / 1275;
- Point aTailPos( nAdjust0 + aBoundRect.Left(), nAdjust1 + aBoundRect.Top() );
- ((SdrCaptionObj*)pRet)->NbcSetTailPos( aTailPos );
- }
- }
- else if( ( aObjData.eShapeType >= mso_sptTextPlainText ) && ( aObjData.eShapeType <= mso_sptTextCanDown ) ) // FontWork
- {
- aObjData.bIsAutoText = TRUE;
- if ( mbTracing )
- mpTracer->Trace( rtl::OUString::createFromAscii( "escher1000" ), rtl::OUString::valueOf( (sal_Int32)aObjData.eShapeType ) );
- pRet = ImportFontWork( rSt, aSet, aBoundRect );
- }
- else if ( aObjData.eShapeType == mso_sptLine )
- {
- basegfx::B2DPolygon aPoly;
- aPoly.append(basegfx::B2DPoint(aBoundRect.Left(), aBoundRect.Top()));
- aPoly.append(basegfx::B2DPoint(aBoundRect.Right(), aBoundRect.Bottom()));
- pRet = new SdrPathObj(OBJ_LINE, basegfx::B2DPolyPolygon(aPoly));
- }
- else if ( ( (int)aObjData.eShapeType > (int)mso_sptRectangle ) && ( (int)aObjData.eShapeType < (int)mso_sptHostControl ) )
- {
- pRet = GetAutoForm( aObjData.eShapeType );
- if ( pRet )
- {
- mpTracer->Trace( rtl::OUString::createFromAscii( "escher1001" ), rtl::OUString::valueOf( (sal_Int32)aObjData.eShapeType ) );
- pRet->NbcSetSnapRect( aBoundRect ); // Groesse setzen
- }
- }
- }
- }
- if ( pRet )
- {
- if ( bIsConnector || !bIsCustomShape )
- {
- ApplyAttributes( rSt, aSet, aObjData.eShapeType, aObjData.nSpFlags );
- if ( !GetPropertyValue( DFF_Prop_gtextSize, 0 ) )
- aSet.Put( SvxFontHeightItem( ScalePt( 24 << 16 ), 100, EE_CHAR_FONTHEIGHT ) );
- if ( aObjData.eShapeType == mso_sptTextBox )
- aSet.Put( SdrTextMinFrameHeightItem( aBoundRect.GetHeight() ) );
- pRet->SetModel( pSdrModel );
- pRet->SetMergedItemSet(aSet);
- // Rotieren
- if ( pRet->ISA( SdrCaptionObj ) ) // sj: #96758# SetModel is changing
- pRet->SetSnapRect( aBoundRect ); // the original snaprect
- }
- // FillStyle != XFILL_NONE und nicht geschlossenes Polygon-Objekt?
- if( pRet->ISA( SdrPathObj ) )
- {
- XFillStyle eFillStyle = ITEMVALUE( aSet, XATTR_FILLSTYLE, XFillStyleItem );
- if( eFillStyle != XFILL_NONE )
- {
- // Das Polygon des Objektes muss geschlossen werden
- if(!((SdrPathObj*)pRet)->IsClosed())
- ((SdrPathObj*)pRet)->ToggleClosed(); //0);
- }
- }
- // Handelt es sich um 3D?
- if( GetPropertyValue( DFF_Prop_fc3DLightFace ) & 8 )
- {
- // #81981# not all objects are effected by 3d effects
- if ( !bGraphic )
- {
- SdrObject* p3d = SvxMSDffCustomShape3D::Create3DObject( pRet, *this, aSet, aBoundRect, nSpFlags );
- if ( p3d )
- {
- nSpFlags &= ~( SP_FFLIPV | SP_FFLIPH );
- nObjectRotation = 0;
- SdrObject::Free( pRet );
- pRet = p3d;
- }
- }
- }
- }
- if ( pRet )
- {
- if( nObjectRotation /* && !bIsConnector */ )
- {
- double a = nObjectRotation * nPi180;
- pRet->NbcRotate( aBoundRect.Center(), nObjectRotation, sin( a ), cos( a ) );
- }
- // Horizontal gespiegelt?
- if ( nSpFlags & SP_FFLIPH )
- {
- Rectangle aBndRect( pRet->GetSnapRect() );
- Point aTop( ( aBndRect.Left() + aBndRect.Right() ) >> 1, aBndRect.Top() );
- Point aBottom( aTop.X(), aTop.Y() + 1000 );
- pRet->NbcMirror( aTop, aBottom );
- }
- // Vertikal gespiegelt?
- if ( nSpFlags & SP_FFLIPV )
- {
- Rectangle aBndRect( pRet->GetSnapRect() );
- Point aLeft( aBndRect.Left(), ( aBndRect.Top() + aBndRect.Bottom() ) >> 1 );
- Point aRight( aLeft.X() + 1000, aLeft.Y() );
- pRet->NbcMirror( aLeft, aRight );
- }
- }
- }
- }
-
- // #i51348# #118052# name of the shape
- if( pRet )
- {
- ::rtl::OUString aObjName = GetPropertyString( DFF_Prop_wzName, rSt );
- if( aObjName.getLength() > 0 )
- pRet->SetName( aObjName );
- }
-
- pRet =
- ProcessObj( rSt, aObjData, pClientData, aTextRect, pRet);
-
- if ( mbTracing )
- mpTracer->RemoveAttribute( aObjData.nSpFlags & SP_FGROUP
- ? rtl::OUString::createFromAscii( "GroupShape" )
- : rtl::OUString::createFromAscii( "Shape" ) );
- return pRet;
-}
-
-Rectangle SvxMSDffManager::GetGlobalChildAnchor( const DffRecordHeader& rHd, SvStream& rSt, Rectangle& aClientRect )
-{
- Rectangle aChildAnchor;
- rHd.SeekToContent( rSt );
- while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < rHd.GetRecEndFilePos() ) )
- {
- DffRecordHeader aShapeHd;
- rSt >> aShapeHd;
- if ( ( aShapeHd.nRecType == DFF_msofbtSpContainer ) ||
- ( aShapeHd.nRecType == DFF_msofbtSpgrContainer ) )
- {
- DffRecordHeader aShapeHd2( aShapeHd );
- if ( aShapeHd.nRecType == DFF_msofbtSpgrContainer )
- rSt >> aShapeHd2;
- while( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aShapeHd2.GetRecEndFilePos() ) )
- {
- DffRecordHeader aShapeAtom;
- rSt >> aShapeAtom;
-
- if ( aShapeAtom.nRecType == DFF_msofbtClientAnchor )
- {
- if ( GetSvxMSDffSettings() & SVXMSDFF_SETTINGS_IMPORT_PPT )
- {
- sal_Int32 l, t, r, b;
- if ( aShapeAtom.nRecLen == 16 )
- {
- rSt >> l >> t >> r >> b;
- }
- else
- {
- INT16 ls, ts, rs, bs;
- rSt >> ts >> ls >> rs >> bs; // etwas seltsame Koordinatenreihenfolge ...
- l = ls, t = ts, r = rs, b = bs;
- }
- Scale( l );
- Scale( t );
- Scale( r );
- Scale( b );
- aClientRect = Rectangle( l, t, r, b );
- }
- break;
- }
- else if ( aShapeAtom.nRecType == DFF_msofbtChildAnchor )
- {
- sal_Int32 l, o, r, u;
- rSt >> l >> o >> r >> u;
- Scale( l );
- Scale( o );
- Scale( r );
- Scale( u );
- Rectangle aChild( l, o, r, u );
- aChildAnchor.Union( aChild );
- break;
- }
- aShapeAtom.SeekToEndOfRecord( rSt );
- }
- }
- aShapeHd.SeekToEndOfRecord( rSt );
- }
- return aChildAnchor;
-}
-
-void SvxMSDffManager::GetGroupAnchors( const DffRecordHeader& rHd, SvStream& rSt,
- Rectangle& rGroupClientAnchor, Rectangle& rGroupChildAnchor,
- const Rectangle& rClientRect, const Rectangle& rGlobalChildRect )
-{
- sal_Bool bFirst = sal_True;
- rHd.SeekToContent( rSt );
- DffRecordHeader aShapeHd;
- while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < rHd.GetRecEndFilePos() ) )
- {
- rSt >> aShapeHd;
- if ( ( aShapeHd.nRecType == DFF_msofbtSpContainer ) ||
- ( aShapeHd.nRecType == DFF_msofbtSpgrContainer ) )
- {
- DffRecordHeader aShapeHd2( aShapeHd );
- if ( aShapeHd.nRecType == DFF_msofbtSpgrContainer )
- rSt >> aShapeHd2;
- while( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aShapeHd2.GetRecEndFilePos() ) )
- {
- DffRecordHeader aShapeAtom;
- rSt >> aShapeAtom;
- if ( aShapeAtom.nRecType == DFF_msofbtChildAnchor )
- {
- sal_Int32 l, o, r, u;
- rSt >> l >> o >> r >> u;
- Scale( l );
- Scale( o );
- Scale( r );
- Scale( u );
- Rectangle aChild( l, o, r, u );
-
- if ( bFirst )
- {
- if ( !rGlobalChildRect.IsEmpty() && !rClientRect.IsEmpty() && rGlobalChildRect.GetWidth() && rGlobalChildRect.GetHeight() )
- {
- double fl = l;
- double fo = o;
- double fWidth = r - l;
- double fHeight= u - o;
- double fXScale = (double)rClientRect.GetWidth() / (double)rGlobalChildRect.GetWidth();
- double fYScale = (double)rClientRect.GetHeight() / (double)rGlobalChildRect.GetHeight();
- fl = ( ( l - rGlobalChildRect.Left() ) * fXScale ) + rClientRect.Left();
- fo = ( ( o - rGlobalChildRect.Top() ) * fYScale ) + rClientRect.Top();
- fWidth *= fXScale;
- fHeight *= fYScale;
- rGroupClientAnchor = Rectangle( Point( (sal_Int32)fl, (sal_Int32)fo ), Size( (sal_Int32)( fWidth + 1 ), (sal_Int32)( fHeight + 1 ) ) );
- }
- bFirst = sal_False;
- }
- else
- rGroupChildAnchor.Union( aChild );
- break;
- }
- aShapeAtom.SeekToEndOfRecord( rSt );
- }
- }
- aShapeHd.SeekToEndOfRecord( rSt );
- }
-}
-
-SdrObject* SvxMSDffManager::ProcessObj(SvStream& rSt,
- DffObjData& rObjData,
- void* pData,
- Rectangle& rTextRect,
- SdrObject* pObj
- )
-{
- if( !rTextRect.IsEmpty() )
- {
- SvxMSDffImportData& rImportData = *(SvxMSDffImportData*)pData;
- SvxMSDffImportRec* pImpRec = new SvxMSDffImportRec;
- SvxMSDffImportRec* pTextImpRec = pImpRec;
-
- // fill Import Record with data
- pImpRec->nShapeId = rObjData.nShapeId;
- pImpRec->eShapeType = rObjData.eShapeType;
-
- MSO_WrapMode eWrapMode( (MSO_WrapMode)GetPropertyValue(
- DFF_Prop_WrapText,
- mso_wrapSquare ) );
- rObjData.bClientAnchor = maShapeRecords.SeekToContent( rSt,
- DFF_msofbtClientAnchor,
- SEEK_FROM_CURRENT_AND_RESTART );
- if( rObjData.bClientAnchor )
- ProcessClientAnchor( rSt,
- maShapeRecords.Current()->nRecLen,
- pImpRec->pClientAnchorBuffer, pImpRec->nClientAnchorLen );
-
- rObjData.bClientData = maShapeRecords.SeekToContent( rSt,
- DFF_msofbtClientData,
- SEEK_FROM_CURRENT_AND_RESTART );
- if( rObjData.bClientData )
- ProcessClientData( rSt,
- maShapeRecords.Current()->nRecLen,
- pImpRec->pClientDataBuffer, pImpRec->nClientDataLen );
-
-
- // process user (== Winword) defined parameters in 0xF122 record
- if( maShapeRecords.SeekToContent( rSt,
- DFF_msofbtUDefProp,
- SEEK_FROM_CURRENT_AND_RESTART )
- && maShapeRecords.Current()->nRecLen )
- {
- UINT32 nBytesLeft = maShapeRecords.Current()->nRecLen;
- UINT32 nUDData;
- UINT16 nPID;
- while( 5 < nBytesLeft )
- {
- rSt >> nPID;
- if ( rSt.GetError() != 0 )
- break;
- rSt >> nUDData;
- switch( nPID )
- {
- case 0x038F: pImpRec->nXAlign = nUDData; break;
- case 0x0390: pImpRec->nXRelTo = nUDData; break;
- case 0x0391: pImpRec->nYAlign = nUDData; break;
- case 0x0392: pImpRec->nYRelTo = nUDData; break;
- case 0x03BF: pImpRec->nLayoutInTableCell = nUDData; break;
- }
- if ( rSt.GetError() != 0 )
- break;
- pImpRec->bHasUDefProp = TRUE;
- nBytesLeft -= 6;
- }
- }
-
- // Textrahmen, auch Title oder Outline
- SdrObject* pOrgObj = pObj;
- SdrRectObj* pTextObj = 0;
- UINT32 nTextId = GetPropertyValue( DFF_Prop_lTxid, 0 );
- if( nTextId )
- {
- SfxItemSet aSet( pSdrModel->GetItemPool() );
-
- //Originally anything that as a mso_sptTextBox was created as a
- //textbox, this was changed for #88277# to be created as a simple
- //rect to keep impress happy. For the rest of us we'd like to turn
- //it back into a textbox again.
- FASTBOOL bTextFrame = (pImpRec->eShapeType == mso_sptTextBox);
- if (!bTextFrame)
- {
- //Either
- //a) its a simple text object or
- //b) its a rectangle with text and square wrapping.
- bTextFrame =
- (
- (pImpRec->eShapeType == mso_sptTextSimple) ||
- (
- (pImpRec->eShapeType == mso_sptRectangle)
- && (eWrapMode == mso_wrapSquare)
- && ShapeHasText(pImpRec->nShapeId, rObjData.rSpHd.GetRecBegFilePos() )
- )
- );
- }
-
- if (bTextFrame)
- {
- SdrObject::Free( pObj );
- pObj = pOrgObj = 0;
- }
-
- // Distance of Textbox to it's surrounding Customshape
- INT32 nTextLeft = GetPropertyValue( DFF_Prop_dxTextLeft, 91440L);
- INT32 nTextRight = GetPropertyValue( DFF_Prop_dxTextRight, 91440L );
- INT32 nTextTop = GetPropertyValue( DFF_Prop_dyTextTop, 45720L );
- INT32 nTextBottom = GetPropertyValue( DFF_Prop_dyTextBottom, 45720L );
-
- ScaleEmu( nTextLeft );
- ScaleEmu( nTextRight );
- ScaleEmu( nTextTop );
- ScaleEmu( nTextBottom );
-
- INT32 nTextRotationAngle=0;
- bool bVerticalText = false;
- if ( IsProperty( DFF_Prop_txflTextFlow ) )
- {
- MSO_TextFlow eTextFlow = (MSO_TextFlow)(GetPropertyValue(
- DFF_Prop_txflTextFlow) & 0xFFFF);
- switch( eTextFlow )
- {
- case mso_txflBtoT:
- nTextRotationAngle = 9000;
- break;
- case mso_txflVertN:
- case mso_txflTtoBN:
- nTextRotationAngle = 27000;
- break;
- case mso_txflTtoBA:
- bVerticalText = true;
- break;
- case mso_txflHorzA:
- bVerticalText = true;
- nTextRotationAngle = 9000;
- case mso_txflHorzN:
- default :
- break;
- }
- }
-
- if (nTextRotationAngle)
- {
- while (nTextRotationAngle > 360000)
- nTextRotationAngle-=9000;
- switch (nTextRotationAngle)
- {
- case 9000:
- {
- long nWidth = rTextRect.GetWidth();
- rTextRect.Right() = rTextRect.Left() + rTextRect.GetHeight();
- rTextRect.Bottom() = rTextRect.Top() + nWidth;
-
- INT32 nOldTextLeft = nTextLeft;
- INT32 nOldTextRight = nTextRight;
- INT32 nOldTextTop = nTextTop;
- INT32 nOldTextBottom = nTextBottom;
-
- nTextLeft = nOldTextBottom;
- nTextRight = nOldTextTop;
- nTextTop = nOldTextLeft;
- nTextBottom = nOldTextRight;
- }
- break;
- case 27000:
- {
- long nWidth = rTextRect.GetWidth();
- rTextRect.Right() = rTextRect.Left() + rTextRect.GetHeight();
- rTextRect.Bottom() = rTextRect.Top() + nWidth;
-
- INT32 nOldTextLeft = nTextLeft;
- INT32 nOldTextRight = nTextRight;
- INT32 nOldTextTop = nTextTop;
- INT32 nOldTextBottom = nTextBottom;
-
- nTextLeft = nOldTextTop;
- nTextRight = nOldTextBottom;
- nTextTop = nOldTextRight;
- nTextBottom = nOldTextLeft;
- }
- break;
- default:
- break;
- }
- }
-
- pTextObj = new SdrRectObj(OBJ_TEXT, rTextRect);
- pTextImpRec = new SvxMSDffImportRec(*pImpRec);
-
- // Die vertikalen Absatzeinrueckungen sind im BoundRect mit drin,
- // hier rausrechnen
- Rectangle aNewRect(rTextRect);
- aNewRect.Bottom() -= nTextTop + nTextBottom;
- aNewRect.Right() -= nTextLeft + nTextRight;
-
- // Nur falls es eine einfache Textbox ist, darf der Writer
- // das Objekt durch einen Rahmen ersetzen, ansonsten
- if( bTextFrame )
- {
- SvxMSDffShapeInfo aTmpRec( 0, pImpRec->nShapeId );
- aTmpRec.bSortByShapeId = TRUE;
-
- USHORT nFound;
- if( pShapeInfos->Seek_Entry( &aTmpRec, &nFound ) )
- {
- SvxMSDffShapeInfo& rInfo = *pShapeInfos->GetObject(nFound);
- pTextImpRec->bReplaceByFly = rInfo.bReplaceByFly;
- pTextImpRec->bLastBoxInChain = rInfo.bLastBoxInChain;
- }
- }
-
- if( !pObj )
- ApplyAttributes( rSt, aSet, rObjData.eShapeType, rObjData.nSpFlags );
-
- bool bFitText = false;
- if (GetPropertyValue(DFF_Prop_FitTextToShape) & 2)
- {
- aSet.Put( SdrTextAutoGrowHeightItem( TRUE ) );
- aSet.Put( SdrTextMinFrameHeightItem(
- aNewRect.Bottom() - aNewRect.Top() ) );
- aSet.Put( SdrTextMinFrameWidthItem(
- aNewRect.Right() - aNewRect.Left() ) );
- bFitText = true;
- }
- else
- {
- aSet.Put( SdrTextAutoGrowHeightItem( FALSE ) );
- aSet.Put( SdrTextAutoGrowWidthItem( FALSE ) );
- }
-
- switch ( (MSO_WrapMode)
- GetPropertyValue( DFF_Prop_WrapText, mso_wrapSquare ) )
- {
- case mso_wrapNone :
- aSet.Put( SdrTextAutoGrowWidthItem( TRUE ) );
- if (bFitText)
- {
- //can't do autowidth in flys #i107184#
- pTextImpRec->bReplaceByFly = false;
- }
- break;
- case mso_wrapByPoints :
- aSet.Put( SdrTextContourFrameItem( TRUE ) );
- break;
- default: break;
- }
-
- // Abstaende an den Raendern der Textbox setzen
- aSet.Put( SdrTextLeftDistItem( nTextLeft ) );
- aSet.Put( SdrTextRightDistItem( nTextRight ) );
- aSet.Put( SdrTextUpperDistItem( nTextTop ) );
- aSet.Put( SdrTextLowerDistItem( nTextBottom ) );
- pTextImpRec->nDxTextLeft = nTextLeft;
- pTextImpRec->nDyTextTop = nTextTop;
- pTextImpRec->nDxTextRight = nTextRight;
- pTextImpRec->nDyTextBottom = nTextBottom;
-
- // Textverankerung lesen
- if ( IsProperty( DFF_Prop_anchorText ) )
- {
- MSO_Anchor eTextAnchor =
- (MSO_Anchor)GetPropertyValue( DFF_Prop_anchorText );
-
- SdrTextVertAdjust eTVA = SDRTEXTVERTADJUST_CENTER;
- BOOL bTVASet(FALSE);
- SdrTextHorzAdjust eTHA = SDRTEXTHORZADJUST_CENTER;
- BOOL bTHASet(FALSE);
-
- switch( eTextAnchor )
- {
- case mso_anchorTop:
- {
- eTVA = SDRTEXTVERTADJUST_TOP;
- bTVASet = TRUE;
- }
- break;
- case mso_anchorTopCentered:
- {
- eTVA = SDRTEXTVERTADJUST_TOP;
- bTVASet = TRUE;
- bTHASet = TRUE;
- }
- break;
-
- case mso_anchorMiddle:
- bTVASet = TRUE;
- break;
- case mso_anchorMiddleCentered:
- {
- bTVASet = TRUE;
- bTHASet = TRUE;
- }
- break;
- case mso_anchorBottom:
- {
- eTVA = SDRTEXTVERTADJUST_BOTTOM;
- bTVASet = TRUE;
- }
- break;
- case mso_anchorBottomCentered:
- {
- eTVA = SDRTEXTVERTADJUST_BOTTOM;
- bTVASet = TRUE;
- bTHASet = TRUE;
- }
- break;
- /*
- case mso_anchorTopBaseline:
- case mso_anchorBottomBaseline:
- case mso_anchorTopCenteredBaseline:
- case mso_anchorBottomCenteredBaseline:
- break;
- */
- default : break;
- }
- // Einsetzen
- if ( bTVASet )
- aSet.Put( SdrTextVertAdjustItem( eTVA ) );
- if ( bTHASet )
- aSet.Put( SdrTextHorzAdjustItem( eTHA ) );
- }
-
- pTextObj->SetMergedItemSet(aSet);
- pTextObj->SetModel(pSdrModel);
-
- if (bVerticalText)
- pTextObj->SetVerticalWriting(sal_True);
-
- if (nTextRotationAngle)
- {
- long nMinWH = rTextRect.GetWidth() < rTextRect.GetHeight() ?
- rTextRect.GetWidth() : rTextRect.GetHeight();
- nMinWH /= 2;
- Point aPivot(rTextRect.TopLeft());
- aPivot.X() += nMinWH;
- aPivot.Y() += nMinWH;
- double a = nTextRotationAngle * nPi180;
- pTextObj->NbcRotate(aPivot, nTextRotationAngle, sin(a), cos(a));
- }
-
- // rotate text with shape ?
- if ( mnFix16Angle )
- {
- double a = mnFix16Angle * nPi180;
- pTextObj->NbcRotate( rObjData.rBoundRect.Center(), mnFix16Angle,
- sin( a ), cos( a ) );
- }
-
- if( !pObj )
- {
- pObj = pTextObj;
- }
- else
- {
- if( pTextObj != pObj )
- {
- SdrObject* pGroup = new SdrObjGroup;
- pGroup->GetSubList()->NbcInsertObject( pObj );
- pGroup->GetSubList()->NbcInsertObject( pTextObj );
- if (pOrgObj == pObj)
- pOrgObj = pGroup;
- else
- pOrgObj = pObj;
- pObj = pGroup;
- }
- }
- }
- else if( !pObj )
- {
- // simple rectangular objects are ignored by ImportObj() :-(
- // this is OK for Draw but not for Calc and Writer
- // cause here these objects have a default border
- pObj = new SdrRectObj(rTextRect);
- pOrgObj = pObj;
- pObj->SetModel( pSdrModel );
- SfxItemSet aSet( pSdrModel->GetItemPool() );
- ApplyAttributes( rSt, aSet, rObjData.eShapeType, rObjData.nSpFlags );
-
- const SfxPoolItem* pPoolItem=NULL;
- SfxItemState eState = aSet.GetItemState( XATTR_FILLCOLOR,
- FALSE, &pPoolItem );
- if( SFX_ITEM_DEFAULT == eState )
- aSet.Put( XFillColorItem( String(),
- Color( mnDefaultColor ) ) );
- pObj->SetMergedItemSet(aSet);
- }
-
- //Means that fBehindDocument is set
- if (GetPropertyValue(DFF_Prop_fPrint) & 0x20)
- pImpRec->bDrawHell = TRUE;
- else
- pImpRec->bDrawHell = FALSE;
- if (GetPropertyValue(DFF_Prop_fPrint) & 0x02)
- pImpRec->bHidden = TRUE;
- pTextImpRec->bDrawHell = pImpRec->bDrawHell;
- pTextImpRec->bHidden = pImpRec->bHidden;
- pImpRec->nNextShapeId = GetPropertyValue( DFF_Prop_hspNext, 0 );
- pTextImpRec->nNextShapeId=pImpRec->nNextShapeId;
-
- if ( nTextId )
- {
- pTextImpRec->aTextId.nTxBxS = (UINT16)( nTextId >> 16 );
- pTextImpRec->aTextId.nSequence = (UINT16)nTextId;
- }
-
- pTextImpRec->nDxWrapDistLeft = GetPropertyValue(
- DFF_Prop_dxWrapDistLeft, 114935L ) / 635L;
- pTextImpRec->nDyWrapDistTop = GetPropertyValue(
- DFF_Prop_dyWrapDistTop, 0 ) / 635L;
- pTextImpRec->nDxWrapDistRight = GetPropertyValue(
- DFF_Prop_dxWrapDistRight, 114935L ) / 635L;
- pTextImpRec->nDyWrapDistBottom = GetPropertyValue(
- DFF_Prop_dyWrapDistBottom, 0 ) / 635L;
- // 16.16 fraction times total image width or height, as appropriate.
-
- if (SeekToContent(DFF_Prop_pWrapPolygonVertices, rSt))
- {
- delete pTextImpRec->pWrapPolygon;
- sal_uInt16 nNumElemVert, nNumElemMemVert, nElemSizeVert;
- rSt >> nNumElemVert >> nNumElemMemVert >> nElemSizeVert;
- if (nNumElemVert && ((nElemSizeVert == 8) || (nElemSizeVert == 4)))
- {
- pTextImpRec->pWrapPolygon = new Polygon(nNumElemVert);
- for (sal_uInt16 i = 0; i < nNumElemVert; ++i)
- {
- sal_Int32 nX, nY;
- if (nElemSizeVert == 8)
- rSt >> nX >> nY;
- else
- {
- sal_Int16 nSmallX, nSmallY;
- rSt >> nSmallX >> nSmallY;
- nX = nSmallX;
- nY = nSmallY;
- }
- (*(pTextImpRec->pWrapPolygon))[i].X() = nX;
- (*(pTextImpRec->pWrapPolygon))[i].Y() = nY;
- }
- }
- }
-
- pImpRec->nCropFromTop = GetPropertyValue(
- DFF_Prop_cropFromTop, 0 );
- pImpRec->nCropFromBottom = GetPropertyValue(
- DFF_Prop_cropFromBottom, 0 );
- pImpRec->nCropFromLeft = GetPropertyValue(
- DFF_Prop_cropFromLeft, 0 );
- pImpRec->nCropFromRight = GetPropertyValue(
- DFF_Prop_cropFromRight, 0 );
-
- pImpRec->bVFlip = (rObjData.nSpFlags & SP_FFLIPV) ? true : false;
- pImpRec->bHFlip = (rObjData.nSpFlags & SP_FFLIPH) ? true : false;
-
- UINT32 nLineFlags = GetPropertyValue( DFF_Prop_fNoLineDrawDash );
- pImpRec->eLineStyle = (nLineFlags & 8)
- ? (MSO_LineStyle)GetPropertyValue(
- DFF_Prop_lineStyle,
- mso_lineSimple )
- : (MSO_LineStyle)USHRT_MAX;
- pTextImpRec->eLineStyle = pImpRec->eLineStyle;
-
- if( pImpRec->nShapeId )
- {
- // Import-Record-Liste ergaenzen
- if( pOrgObj )
- {
- pImpRec->pObj = pOrgObj;
- rImportData.aRecords.Insert( pImpRec );
- }
-
- if( pTextObj && (pOrgObj != pTextObj) )
- {
- // Modify ShapeId (must be unique)
- pImpRec->nShapeId |= 0x8000000;
- pTextImpRec->pObj = pTextObj;
- rImportData.aRecords.Insert( pTextImpRec );
- }
-
- // Eintrag in Z-Order-Liste um Zeiger auf dieses Objekt ergaenzen
- /*Only store objects which are not deep inside the tree*/
- if( ( rObjData.nCalledByGroup == 0 )
- ||
- ( (rObjData.nSpFlags & SP_FGROUP)
- && (rObjData.nCalledByGroup < 2) )
- )
- StoreShapeOrder( pImpRec->nShapeId,
- ( ( (ULONG)pImpRec->aTextId.nTxBxS ) << 16 )
- + pImpRec->aTextId.nSequence, pObj );
- }
- else
- delete pImpRec;
- }
-
- return pObj;
-};
-
-void SvxMSDffManager::StoreShapeOrder(ULONG nId,
- ULONG nTxBx,
- SdrObject* pObject,
- SwFlyFrmFmt* pFly,
- short nHdFtSection) const
-{
- USHORT nShpCnt = pShapeOrders->Count();
- for (USHORT nShapeNum=0; nShapeNum < nShpCnt; nShapeNum++)
- {
- SvxMSDffShapeOrder& rOrder
- = *(SvxMSDffShapeOrder*)(pShapeOrders->GetObject( nShapeNum ));
-
- if( rOrder.nShapeId == nId )
- {
- rOrder.nTxBxComp = nTxBx;
- rOrder.pObj = pObject;
- rOrder.pFly = pFly;
- rOrder.nHdFtSection = nHdFtSection;
- }
- }
-}
-
-
-void SvxMSDffManager::ExchangeInShapeOrder( SdrObject* pOldObject,
- ULONG nTxBx,
- SwFlyFrmFmt* pFly,
- SdrObject* pObject) const
-{
- USHORT nShpCnt = pShapeOrders->Count();
- for (USHORT nShapeNum=0; nShapeNum < nShpCnt; nShapeNum++)
- {
- SvxMSDffShapeOrder& rOrder
- = *(SvxMSDffShapeOrder*)(pShapeOrders->GetObject( nShapeNum ));
-
- if( rOrder.pObj == pOldObject )
- {
- rOrder.pFly = pFly;
- rOrder.pObj = pObject;
- rOrder.nTxBxComp = nTxBx;
- }
- }
-}
-
-
-void SvxMSDffManager::RemoveFromShapeOrder( SdrObject* pObject ) const
-{
- USHORT nShpCnt = pShapeOrders->Count();
- for (USHORT nShapeNum=0; nShapeNum < nShpCnt; nShapeNum++)
- {
- SvxMSDffShapeOrder& rOrder
- = *(SvxMSDffShapeOrder*)(pShapeOrders->GetObject( nShapeNum ));
-
- if( rOrder.pObj == pObject )
- {
- rOrder.pObj = 0;
- rOrder.pFly = 0;
- rOrder.nTxBxComp = 0;
- }
- }
-}
-
-
-
-
-//---------------------------------------------------------------------------
-// Hilfs Deklarationen
-//---------------------------------------------------------------------------
-
-/*struct SvxMSDffBLIPInfo -> in's Header-File
-{
- USHORT nBLIPType; // Art des BLIP: z.B. 6 fuer PNG
- ULONG nFilePos; // Offset des BLIP im Daten-Stream
- ULONG nBLIPSize; // Anzahl Bytes, die der BLIP im Stream einnimmt
- SvxMSDffBLIPInfo(USHORT nBType, ULONG nFPos, ULONG nBSize):
- nBLIPType( nBType ), nFilePos( nFPos ), nBLIPSize( nBSize ){}
-};
-*/
-
-SV_IMPL_PTRARR( SvxMSDffBLIPInfos, SvxMSDffBLIPInfo_Ptr );
-
-SV_IMPL_PTRARR( SvxMSDffShapeOrders, SvxMSDffShapeOrder_Ptr );
-
-SV_IMPL_OP_PTRARR_SORT( SvxMSDffShapeInfos, SvxMSDffShapeInfo_Ptr );
-
-SV_IMPL_OP_PTRARR_SORT( SvxMSDffShapeTxBxSort, SvxMSDffShapeOrder_Ptr );
-
-
-// Liste aller SvxMSDffImportRec fuer eine Gruppe
-SV_IMPL_OP_PTRARR_SORT(MSDffImportRecords, MSDffImportRec_Ptr)
-
-//---------------------------------------------------------------------------
-// exportierte Klasse: oeffentliche Methoden
-//---------------------------------------------------------------------------
-
-SvxMSDffManager::SvxMSDffManager(SvStream& rStCtrl_,
- const String& rBaseURL,
- long nOffsDgg_,
- SvStream* pStData_,
- SdrModel* pSdrModel_,// s. unten: SetModel()
- long nApplicationScale,
- ColorData mnDefaultColor_,
- ULONG nDefaultFontHeight_,
- SvStream* pStData2_,
- MSFilterTracer* pTracer )
- :DffPropertyReader( *this ),
- pFormModel( NULL ),
- pBLIPInfos( new SvxMSDffBLIPInfos ),
- pShapeInfos( new SvxMSDffShapeInfos ),
- pShapeOrders( new SvxMSDffShapeOrders ),
- nDefaultFontHeight( nDefaultFontHeight_),
- nOffsDgg( nOffsDgg_ ),
- nBLIPCount( USHRT_MAX ), // mit Error initialisieren, da wir erst pruefen,
- nShapeCount( USHRT_MAX ), // ob Kontroll-Stream korrekte Daten enthaellt
- maBaseURL( rBaseURL ),
- mpFidcls( NULL ),
- rStCtrl( rStCtrl_ ),
- pStData( pStData_ ),
- pStData2( pStData2_ ),
- nSvxMSDffSettings( 0 ),
- nSvxMSDffOLEConvFlags( 0 ),
- pEscherBlipCache( NULL ),
- mnDefaultColor( mnDefaultColor_),
- mpTracer( pTracer ),
- mbTracing( sal_False )
-{
- if ( mpTracer )
- {
- uno::Any aAny( mpTracer->GetProperty( rtl::OUString::createFromAscii( "On" ) ) );
- aAny >>= mbTracing;
- }
- SetModel( pSdrModel_, nApplicationScale );
-
- // FilePos des/der Stream(s) merken
- ULONG nOldPosCtrl = rStCtrl.Tell();
- ULONG nOldPosData = pStData ? pStData->Tell() : nOldPosCtrl;
-
- // Falls kein Datenstream angegeben, gehen wir davon aus,
- // dass die BLIPs im Steuerstream stehen.
- if( !pStData )
- pStData = &rStCtrl;
-
- SetDefaultPropSet( rStCtrl, nOffsDgg );
-
- // Steuer Stream auslesen, im Erfolgsfall nBLIPCount setzen
- GetCtrlData( nOffsDgg );
-
- // Text-Box-Story-Ketten-Infos ueberpruefen
- CheckTxBxStoryChain();
-
- // alte FilePos des/der Stream(s) restaurieren
- rStCtrl.Seek( nOldPosCtrl );
- if( &rStCtrl != pStData )
- pStData->Seek( nOldPosData );
-}
-
-SvxMSDffManager::SvxMSDffManager( SvStream& rStCtrl_, const String& rBaseURL, MSFilterTracer* pTracer )
- :DffPropertyReader( *this ),
- pFormModel( NULL ),
- pBLIPInfos( new SvxMSDffBLIPInfos ),
- pShapeInfos( new SvxMSDffShapeInfos ),
- pShapeOrders( new SvxMSDffShapeOrders ),
- nDefaultFontHeight( 24 ),
- nOffsDgg( 0 ),
- nBLIPCount( USHRT_MAX ), // mit Error initialisieren, da wir erst pruefen,
- nShapeCount( USHRT_MAX ), // ob Kontroll-Stream korrekte Daten enthaellt
- maBaseURL( rBaseURL ),
- mpFidcls( NULL ),
- rStCtrl( rStCtrl_ ),
- pStData( 0 ),
- pStData2( 0 ),
- nSvxMSDffSettings( 0 ),
- nSvxMSDffOLEConvFlags( 0 ),
- pEscherBlipCache( NULL ),
- mnDefaultColor( COL_DEFAULT ),
- mpTracer( pTracer ),
- mbTracing( sal_False )
-{
- if ( mpTracer )
- {
- uno::Any aAny( mpTracer->GetProperty( rtl::OUString::createFromAscii( "On" ) ) );
- aAny >>= mbTracing;
- }
- SetModel( NULL, 0 );
-}
-
-SvxMSDffManager::~SvxMSDffManager()
-{
- if ( pEscherBlipCache )
- {
- void* pPtr;
- for ( pPtr = pEscherBlipCache->First(); pPtr; pPtr = pEscherBlipCache->Next() )
- delete (EscherBlipCacheEntry*)pPtr;
- delete pEscherBlipCache;
- }
- delete pBLIPInfos;
- delete pShapeInfos;
- delete pShapeOrders;
- delete pFormModel;
- delete[] mpFidcls;
-}
-
-void SvxMSDffManager::InitSvxMSDffManager( long nOffsDgg_, SvStream* pStData_, sal_uInt32 nOleConvFlags )
-{
- nOffsDgg = nOffsDgg_;
- pStData = pStData_;
- nSvxMSDffOLEConvFlags = nOleConvFlags;
-
- // FilePos des/der Stream(s) merken
- ULONG nOldPosCtrl = rStCtrl.Tell();
-
- SetDefaultPropSet( rStCtrl, nOffsDgg );
-
- // insert fidcl cluster table
- GetFidclData( nOffsDgg );
-
- // Steuer Stream auslesen, im Erfolgsfall nBLIPCount setzen
- GetCtrlData( nOffsDgg );
-
- // Text-Box-Story-Ketten-Infos ueberpruefen
- CheckTxBxStoryChain();
-
- // alte FilePos des/der Stream(s) restaurieren
- rStCtrl.Seek( nOldPosCtrl );
-}
-
-void SvxMSDffManager::SetDgContainer( SvStream& rSt )
-{
- UINT32 nFilePos = rSt.Tell();
- DffRecordHeader aDgContHd;
- rSt >> aDgContHd;
- // insert this container only if there is also a DgAtom
- if ( SeekToRec( rSt, DFF_msofbtDg, aDgContHd.GetRecEndFilePos() ) )
- {
- DffRecordHeader aRecHd;
- rSt >> aRecHd;
- UINT32 nDrawingId = aRecHd.nRecInstance;
- maDgOffsetTable.Insert( nDrawingId, (void*)nFilePos );
- rSt.Seek( nFilePos );
- }
-}
-
-void SvxMSDffManager::GetFidclData( long nOffsDggL )
-{
- if ( nOffsDggL )
- {
- UINT32 nDummy, nMerk = rStCtrl.Tell();
- rStCtrl.Seek( nOffsDggL );
-
- DffRecordHeader aRecHd;
- rStCtrl >> aRecHd;
-
- DffRecordHeader aDggAtomHd;
- if ( SeekToRec( rStCtrl, DFF_msofbtDgg, aRecHd.GetRecEndFilePos(), &aDggAtomHd ) )
- {
- aDggAtomHd.SeekToContent( rStCtrl );
- rStCtrl >> mnCurMaxShapeId
- >> mnIdClusters
- >> nDummy
- >> mnDrawingsSaved;
-
- if ( mnIdClusters-- > 2 )
- {
- if ( aDggAtomHd.nRecLen == ( mnIdClusters * sizeof( FIDCL ) + 16 ) )
- {
- mpFidcls = new FIDCL[ mnIdClusters ];
- for ( UINT32 i = 0; i < mnIdClusters; i++ )
- {
- rStCtrl >> mpFidcls[ i ].dgid
- >> mpFidcls[ i ].cspidCur;
- }
- }
- }
- }
- rStCtrl.Seek( nMerk );
- }
-}
-
-void SvxMSDffManager::CheckTxBxStoryChain()
-{
- SvxMSDffShapeInfos* pOld = pShapeInfos;
- USHORT nCnt = pOld->Count();
- pShapeInfos = new SvxMSDffShapeInfos( (nCnt < 255)
- ? nCnt
- : 255 );
- // altes Info-Array ueberarbeiten
- // (ist sortiert nach nTxBxComp)
- ULONG nChain = ULONG_MAX;
- USHORT nObjMark = 0;
- BOOL bSetReplaceFALSE = FALSE;
- USHORT nObj;
- for( nObj = 0; nObj < nCnt; ++nObj )
- {
- SvxMSDffShapeInfo* pObj = pOld->GetObject( nObj );
- if( pObj->nTxBxComp )
- {
- pObj->bLastBoxInChain = FALSE;
- // Gruppenwechsel ?
- // --> OD 2008-07-28 #156763#
- // the text id also contains an internal drawing container id
- // to distinguish between text id of drawing objects in different
- // drawing containers.
-// if( nChain != (pObj->nTxBxComp & 0xFFFF0000) )
- if( nChain != pObj->nTxBxComp )
- // <--
- {
- // voriger war letzter seiner Gruppe
- if( nObj )
- pOld->GetObject( nObj-1 )->bLastBoxInChain = TRUE;
- // Merker und Hilfs-Flag zuruecksetzen
- nObjMark = nObj;
- // --> OD 2008-07-28 #156763#
-// nChain = pObj->nTxBxComp & 0xFFFF0000;
- nChain = pObj->nTxBxComp;
- // <--
- bSetReplaceFALSE = !pObj->bReplaceByFly;
- }
- else
- if( !pObj->bReplaceByFly )
- {
- // Objekt, das NICHT durch Rahmen ersetzt werden darf ?
- // Hilfs-Flag setzen
- bSetReplaceFALSE = TRUE;
- // ggfs Flag in Anfang der Gruppe austragen
- for( USHORT nObj2 = nObjMark; nObj2 < nObj; ++nObj2 )
- pOld->GetObject( nObj2 )->bReplaceByFly = FALSE;
- }
-
- if( bSetReplaceFALSE )
- {
- pObj->bReplaceByFly = FALSE;
- }
- }
- // alle Shape-Info-Objekte in pShapeInfos umkopieren
- // (aber nach nShapeId sortieren)
- pObj->bSortByShapeId = TRUE;
- // --> OD 2008-07-28 #156763#
- pObj->nTxBxComp = pObj->nTxBxComp & 0xFFFF0000;
- // <--
- pShapeInfos->Insert( pObj );
- }
- // voriger war letzter seiner Gruppe
- if( nObj )
- pOld->GetObject( nObj-1 )->bLastBoxInChain = TRUE;
- // urspruengliches Array freigeben, ohne Objekte zu zerstoeren
- pOld->Remove((USHORT)0, nCnt);
- delete pOld;
-}
-
-
-/*****************************************************************************
-
- Einlesen der Shape-Infos im Ctor:
- ---------------------------------
- merken der Shape-Ids und zugehoerigen Blip-Nummern und TextBox-Infos
- ========= ============ =============
- und merken des File-Offsets fuer jedes Blip
- ============
-******************************************************************************/
-void SvxMSDffManager::GetCtrlData( long nOffsDgg_ )
-{
- // Start Offset unbedingt merken, falls wir nochmal aufsetzen muessen
- long nOffsDggL = nOffsDgg_;
-
- // Kontroll Stream positionieren
- rStCtrl.Seek( nOffsDggL );
-
- BYTE nVer;
- USHORT nInst;
- USHORT nFbt;
- UINT32 nLength;
- if( !this->ReadCommonRecordHeader( rStCtrl, nVer, nInst, nFbt, nLength ) ) return;
-
- BOOL bOk;
- ULONG nPos = nOffsDggL + DFF_COMMON_RECORD_HEADER_SIZE;
-
- // Fall A: erst Drawing Group Container, dann n Mal Drawing Container
- if( DFF_msofbtDggContainer == nFbt )
- {
- GetDrawingGroupContainerData( rStCtrl, nLength );
-
- rStCtrl.Seek( STREAM_SEEK_TO_END );
- UINT32 nMaxStrPos = rStCtrl.Tell();
-
- nPos += nLength;
- // --> OD 2008-07-28 #156763#
- unsigned long nDrawingContainerId = 1;
- // <--
- do
- {
- rStCtrl.Seek( nPos );
-
- bOk = ReadCommonRecordHeader( rStCtrl, nVer, nInst, nFbt, nLength ) && ( DFF_msofbtDgContainer == nFbt );
-
- if( !bOk )
- {
- nPos++;
- rStCtrl.Seek( nPos );
- bOk = ReadCommonRecordHeader( rStCtrl, nVer, nInst, nFbt, nLength )
- && ( DFF_msofbtDgContainer == nFbt );
- }
- if( bOk )
- {
- // --> OD 2008-07-28 #156763#
- GetDrawingContainerData( rStCtrl, nLength, nDrawingContainerId );
- // <--
- }
- nPos += DFF_COMMON_RECORD_HEADER_SIZE + nLength;
- // --> OD 2008-07-28 #156763#
- ++nDrawingContainerId;
- // <--
- }
- while( nPos < nMaxStrPos && bOk );
- }
-}
-
-
-// ab hier: Drawing Group Container d.h. Dokument - weit gueltige Daten
-// ======================= ========
-//
-void SvxMSDffManager::GetDrawingGroupContainerData( SvStream& rSt, ULONG nLenDgg )
-{
- BYTE nVer;
- USHORT nInst;
- USHORT nFbt;
- UINT32 nLength;
-
- ULONG nLenBStoreCont = 0, nLenFBSE = 0, nRead = 0;
-
- // Nach einem BStore Container suchen
- do
- {
- if(!this->ReadCommonRecordHeader( rSt, nVer, nInst, nFbt, nLength)) return;
- nRead += DFF_COMMON_RECORD_HEADER_SIZE + nLength;
- if( DFF_msofbtBstoreContainer == nFbt )
- {
- nLenBStoreCont = nLength; break;
- }
- rSt.SeekRel( nLength );
- }
- while( nRead < nLenDgg );
-
- if( !nLenBStoreCont ) return;
-
- // Im BStore Container alle Header der Container und Atome auslesen und die
- // relevanten Daten aller enthaltenen FBSEs in unserem Pointer Array ablegen.
- // Dabei zaehlen wir die gefundenen FBSEs im Member nBLIPCount mit.
-
- const ULONG nSkipBLIPLen = 20; // bis zu nBLIPLen zu ueberspringende Bytes
- const ULONG nSkipBLIPPos = 4; // dahinter bis zu nBLIPPos zu skippen
-
- sal_uInt32 nBLIPLen = 0, nBLIPPos = 0;
-
- nRead = 0;
- do
- {
- if(!this->ReadCommonRecordHeader( rSt, nVer, nInst, nFbt, nLength)) return;
- nRead += DFF_COMMON_RECORD_HEADER_SIZE + nLength;
- if( DFF_msofbtBSE == nFbt )
- {
- nLenFBSE = nLength;
- // ist FBSE gross genug fuer unsere Daten
- BOOL bOk = ( nSkipBLIPLen + 4 + nSkipBLIPPos + 4 <= nLenFBSE );
-
- if( bOk )
- {
- rSt.SeekRel( nSkipBLIPLen );
- rSt >> nBLIPLen;
- rSt.SeekRel( nSkipBLIPPos );
- rSt >> nBLIPPos;
- bOk = rSt.GetError() == 0;
-
- nLength -= nSkipBLIPLen+ 4 + nSkipBLIPPos + 4;
- }
-
- if( bOk )
- {
- // Besonderheit:
- // Falls nBLIPLen kleiner ist als nLenFBSE UND nBLIPPos Null ist,
- // nehmen wir an, dass das Bild IM FBSE drin steht!
- if( (!nBLIPPos) && (nBLIPLen < nLenFBSE) )
- nBLIPPos = rSt.Tell() + 4;
-
- // Das hat ja fein geklappt!
- // Wir merken uns, dass wir einen FBSE mehr im Pointer Array haben.
- nBLIPPos = Calc_nBLIPPos(nBLIPPos, rSt.Tell());
-
- if( USHRT_MAX == nBLIPCount )
- nBLIPCount = 1;
- else
- nBLIPCount++;
-
- // Jetzt die Infos fuer spaetere Zugriffe speichern
- pBLIPInfos->Insert( new SvxMSDffBLIPInfo( nInst, nBLIPPos, nBLIPLen ),
- pBLIPInfos->Count() );
- }
- }
- rSt.SeekRel( nLength );
- }
- while( nRead < nLenBStoreCont );
-}
-
-
-// ab hier: Drawing Container d.h. Seiten (Blatt, Dia) - weit gueltige Daten
-// ================= ======
-//
-void SvxMSDffManager::GetDrawingContainerData( SvStream& rSt, ULONG nLenDg,
- const unsigned long nDrawingContainerId )
-{
- BYTE nVer;USHORT nInst;USHORT nFbt;UINT32 nLength;
-
- ULONG nReadDg = 0;
-
- // Wir stehen in einem Drawing Container (je einer pro Seite)
- // und muessen nun
- // alle enthaltenen Shape Group Container abklappern
- do
- {
- if(!this->ReadCommonRecordHeader( rSt, nVer, nInst, nFbt, nLength)) return;
- nReadDg += DFF_COMMON_RECORD_HEADER_SIZE;
- // Patriarch gefunden (der oberste Shape Group Container) ?
- if( DFF_msofbtSpgrContainer == nFbt )
- {
- if(!this->GetShapeGroupContainerData( rSt, nLength, TRUE, nDrawingContainerId )) return;
- }
- else
- // blanker Shape Container ? (ausserhalb vom Shape Group Container)
- if( DFF_msofbtSpContainer == nFbt )
- {
- if(!this->GetShapeContainerData( rSt, nLength, ULONG_MAX, nDrawingContainerId )) return;
- }
- else
- rSt.SeekRel( nLength );
- nReadDg += nLength;
- }
- while( nReadDg < nLenDg );
-}
-
-BOOL SvxMSDffManager::GetShapeGroupContainerData( SvStream& rSt,
- ULONG nLenShapeGroupCont,
- BOOL bPatriarch,
- const unsigned long nDrawingContainerId )
-{
- BYTE nVer;USHORT nInst;USHORT nFbt;UINT32 nLength;
- long nStartShapeGroupCont = rSt.Tell();
- // Wir stehen in einem Shape Group Container (ggfs. mehrere pro Seite)
- // und muessen nun
- // alle enthaltenen Shape Container abklappern
- BOOL bFirst = !bPatriarch;
- ULONG nReadSpGrCont = 0;
- do
- {
- if( !this->ReadCommonRecordHeader( rSt, nVer, nInst, nFbt, nLength ) )
- return FALSE;
- nReadSpGrCont += DFF_COMMON_RECORD_HEADER_SIZE;
- // Shape Container ?
- if( DFF_msofbtSpContainer == nFbt )
- {
- ULONG nGroupOffs = bFirst ? nStartShapeGroupCont - DFF_COMMON_RECORD_HEADER_SIZE : ULONG_MAX;
- if ( !this->GetShapeContainerData( rSt, nLength, nGroupOffs, nDrawingContainerId ) )
- return FALSE;
- bFirst = FALSE;
- }
- else
- // eingeschachtelter Shape Group Container ?
- if( DFF_msofbtSpgrContainer == nFbt )
- {
- if ( !this->GetShapeGroupContainerData( rSt, nLength, FALSE, nDrawingContainerId ) )
- return FALSE;
- }
- else
- rSt.SeekRel( nLength );
- nReadSpGrCont += nLength;
- }
- while( nReadSpGrCont < nLenShapeGroupCont );
- // den Stream wieder korrekt positionieren
- rSt.Seek( nStartShapeGroupCont + nLenShapeGroupCont );
- return TRUE;
-}
-
-BOOL SvxMSDffManager::GetShapeContainerData( SvStream& rSt,
- ULONG nLenShapeCont,
- ULONG nPosGroup,
- const unsigned long nDrawingContainerId )
-{
- BYTE nVer;USHORT nInst;USHORT nFbt;UINT32 nLength;
- long nStartShapeCont = rSt.Tell();
- // Wir stehen in einem Shape Container (ggfs. mehrere pro Sh. Group)
- // und muessen nun
- // die Shape Id und File-Pos (fuer spaetere, erneute Zugriffe)
- // und den ersten BStore Verweis (falls vorhanden) entnehmen
- ULONG nLenShapePropTbl = 0;
- ULONG nReadSpCont = 0;
-
- // File Offset des Shape-Containers bzw. der Gruppe(!) vermerken
- //
- ULONG nStartOffs = (ULONG_MAX > nPosGroup) ?
- nPosGroup : nStartShapeCont - DFF_COMMON_RECORD_HEADER_SIZE;
- SvxMSDffShapeInfo aInfo( nStartOffs );
-
- // duerfte das Shape durch einen Rahmen ersetzt werden ?
- // (vorausgesetzt, es zeigt sich, dass es eine TextBox ist,
- // und der Text nicht gedreht ist)
- BOOL bCanBeReplaced = (ULONG_MAX > nPosGroup) ? FALSE : TRUE;
-
- // wir wissen noch nicht, ob es eine TextBox ist
- MSO_SPT eShapeType = mso_sptNil;
- MSO_WrapMode eWrapMode = mso_wrapSquare;
-// BOOL bIsTextBox = FALSE;
-
- // Shape analysieren
- //
- do
- {
- if(!this->ReadCommonRecordHeader( rSt, nVer, nInst, nFbt, nLength)) return FALSE;
- nReadSpCont += DFF_COMMON_RECORD_HEADER_SIZE;
- // FSP ?
- if( ( DFF_msofbtSp == nFbt ) && ( 4 <= nLength ) )
- {
- // Wir haben den FSP gefunden: Shape Typ und Id vermerken!
- eShapeType = (MSO_SPT)nInst;
- rSt >> aInfo.nShapeId;
- rSt.SeekRel( nLength - 4 );
- nReadSpCont += nLength;
- }
- else if( DFF_msofbtOPT == nFbt ) // Shape Property Table ?
- {
- // Wir haben die Property Table gefunden:
- // nach der Blip Property suchen!
- ULONG nPropRead = 0;
- USHORT nPropId;
- sal_uInt32 nPropVal;
- nLenShapePropTbl = nLength;
-// UINT32 nPropCount = nInst;
- long nStartShapePropTbl = rSt.Tell();
-// UINT32 nComplexDataFilePos = nStartShapePropTbl + (nPropCount * 6);
- do
- {
- rSt >> nPropId
- >> nPropVal;
- nPropRead += 6;
-
- switch( nPropId )
- {
- case DFF_Prop_txflTextFlow :
- //Writer can now handle vertical textflows in its
- //native frames, to only need to do this for the
- //other two formats
-
- //Writer will handle all textflow except BtoT
- if (GetSvxMSDffSettings() &
- (SVXMSDFF_SETTINGS_IMPORT_PPT |
- SVXMSDFF_SETTINGS_IMPORT_EXCEL))
- {
- if( 0 != nPropVal )
- bCanBeReplaced = false;
- }
- else if (
- (nPropVal != mso_txflHorzN) &&
- (nPropVal != mso_txflTtoBA)
- )
- {
- bCanBeReplaced = false;
- }
- break;
- case DFF_Prop_cdirFont :
- //Writer can now handle right to left and left
- //to right in its native frames, so only do
- //this for the other two formats.
- if (GetSvxMSDffSettings() &
- (SVXMSDFF_SETTINGS_IMPORT_PPT |
- SVXMSDFF_SETTINGS_IMPORT_EXCEL))
- {
- if( 0 != nPropVal )
- bCanBeReplaced = FALSE;
- }
- break;
- case DFF_Prop_Rotation :
- if( 0 != nPropVal )
- bCanBeReplaced = FALSE;
- break;
-
- case DFF_Prop_gtextFStrikethrough :
- if( ( 0x20002000 & nPropVal ) == 0x20002000 )
- bCanBeReplaced = FALSE;
- break;
-
- case DFF_Prop_fc3DLightFace :
- if( ( 0x00080008 & nPropVal ) == 0x00080008 )
- bCanBeReplaced = FALSE;
- break;
-
- case DFF_Prop_WrapText :
- eWrapMode = (MSO_WrapMode)nPropVal;
- break;
-
- default:
- {
- // Bit gesetzt und gueltig?
- if( 0x4000 == ( nPropId & 0xC000 ) )
- {
- // Blip Property gefunden: BStore Idx vermerken!
- nPropRead = nLenShapePropTbl;
- }
- else if( 0x8000 & nPropId )
- {
- // komplexe Prop gefunden:
- // Laenge ist immer 6, nur die Laenge der nach der
- // eigentlichen Prop-Table anhaengenden Extra-Daten
- // ist unterschiedlich
- nPropVal = 6;
- }
- }
- break;
- }
-
-/*
-//JP 21.04.99: Bug 64510
-// alte Version, die unter OS/2 zu Compilerfehlern fuehrt und damit arge
-// Performance einbussen hat.
-
- if( 0x4000 == ( nPropId & 0xC000 ) )// Bit gesetzt und gueltig?
- {
- // Blip Property gefunden: BStore Idx vermerken!
- aInfo.nBStoreIdx = nPropVal; // Index im BStore Container
- break;
- }
- else
- if( ( ( (DFF_Prop_txflTextFlow == nPropId)
- || (DFF_Prop_Rotation == nPropId)
- || (DFF_Prop_cdirFont == nPropId) )
- && (0 != nPropVal) )
-
- || ( (DFF_Prop_gtextFStrikethrough == nPropId)
- && ( (0x20002000 & nPropVal) == 0x20002000) ) // also DFF_Prop_gtextFVertical
- || ( (DFF_Prop_fc3DLightFace == nPropId)
- && ( (0x00080008 & nPropVal) == 0x00080008) ) // also DFF_Prop_f3D
- )
- {
- bCanBeReplaced = FALSE; // Mist: gedrehter Text oder 3D-Objekt!
- }
- else
- if( DFF_Prop_WrapText == nPropId )
- {
- eWrapMode = (MSO_WrapMode)nPropVal;
- }
- ////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////
- // keine weitere Property-Auswertung: folge beim Shape-Import //
- ////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////
- else
- if( 0x8000 & nPropId )
- {
- // komplexe Prop gefunden: Laenge lesen und ueberspringen
- if(!SkipBytes( rSt, nPropVal )) return FALSE;
- nPropRead += nPropVal;
- }
-*/
- }
- while( nPropRead < nLenShapePropTbl );
- rSt.Seek( nStartShapePropTbl + nLenShapePropTbl );
- nReadSpCont += nLenShapePropTbl;
- }
- else if( ( DFF_msofbtClientTextbox == nFbt ) && ( 4 == nLength ) ) // Text-Box-Story-Eintrag gefunden
- {
- rSt >> aInfo.nTxBxComp;
- // --> OD 2008-07-28 #156763#
- // Add internal drawing container id to text id.
- // Note: The text id uses the first two bytes, while the internal
- // drawing container id used the second two bytes.
- aInfo.nTxBxComp = ( aInfo.nTxBxComp & 0xFFFF0000 ) +
- nDrawingContainerId;
- DBG_ASSERT( (aInfo.nTxBxComp & 0x0000FFFF) == nDrawingContainerId,
- "<SvxMSDffManager::GetShapeContainerData(..)> - internal drawing container Id could not be correctly merged into DFF_msofbtClientTextbox value." );
- // <--
- }
- else
- {
- rSt.SeekRel( nLength );
- nReadSpCont += nLength;
- }
- }
- while( nReadSpCont < nLenShapeCont );
-
- //
- // Jetzt ggfs. die Infos fuer spaetere Zugriffe auf das Shape speichern
- //
- if( aInfo.nShapeId )
- {
- // fuer Textboxen ggfs. ersetzen durch Rahmen erlauben
- if( bCanBeReplaced
- && aInfo.nTxBxComp
- && (
- ( eShapeType == mso_sptTextSimple )
- || ( eShapeType == mso_sptTextBox )
- || ( ( ( eShapeType == mso_sptRectangle )
- || ( eShapeType == mso_sptRoundRectangle )
- )
- ) ) )
- {
- aInfo.bReplaceByFly = TRUE;
- }
- pShapeInfos->Insert( new SvxMSDffShapeInfo( aInfo ) );
- pShapeOrders->Insert( new SvxMSDffShapeOrder( aInfo.nShapeId ),
- pShapeOrders->Count() );
- }
-
- // und den Stream wieder korrekt positionieren
- rSt.Seek( nStartShapeCont + nLenShapeCont );
- return TRUE;
-}
-
-
-
-/*****************************************************************************
-
- Zugriff auf ein Shape zur Laufzeit (ueber die Shape-Id)
- ----------------------------------
-******************************************************************************/
-BOOL SvxMSDffManager::GetShape(ULONG nId, SdrObject*& rpShape,
- SvxMSDffImportData& rData)
-{
- SvxMSDffShapeInfo aTmpRec(0, nId);
- aTmpRec.bSortByShapeId = TRUE;
-
- USHORT nFound;
- if( pShapeInfos->Seek_Entry(&aTmpRec, &nFound) )
- {
- SvxMSDffShapeInfo& rInfo = *pShapeInfos->GetObject( nFound );
-
- // eventuell altes Errorflag loeschen
- if( rStCtrl.GetError() )
- rStCtrl.ResetError();
- // FilePos des/der Stream(s) merken
- ULONG nOldPosCtrl = rStCtrl.Tell();
- ULONG nOldPosData = pStData ? pStData->Tell() : nOldPosCtrl;
- // das Shape im Steuer Stream anspringen
- rStCtrl.Seek( rInfo.nFilePos );
-
- // Falls missglueckt, den Fehlerstatus zuruecksetzen und Pech gehabt!
- if( rStCtrl.GetError() )
- rStCtrl.ResetError();
- else
- rpShape = ImportObj( rStCtrl, &rData, rData.aParentRect, rData.aParentRect );
-
- // alte FilePos des/der Stream(s) restaurieren
- rStCtrl.Seek( nOldPosCtrl );
- if( &rStCtrl != pStData )
- pStData->Seek( nOldPosData );
- return ( 0 != rpShape );
- }
- return FALSE;
-}
-
-
-
-/* Zugriff auf ein BLIP zur Laufzeit (bei bereits bekannter Blip-Nr)
- ---------------------------------
-******************************************************************************/
-BOOL SvxMSDffManager::GetBLIP( ULONG nIdx_, Graphic& rData, Rectangle* pVisArea ) const
-{
- BOOL bOk = FALSE; // Ergebnisvariable initialisieren
- if ( pStData )
- {
- // check if a graphic for this blipId is already imported
- if ( nIdx_ && pEscherBlipCache )
- {
- EscherBlipCacheEntry* pEntry;
- for ( pEntry = (EscherBlipCacheEntry*)pEscherBlipCache->First(); pEntry;
- pEntry = (EscherBlipCacheEntry*)pEscherBlipCache->Next() )
- {
- if ( pEntry->nBlip == nIdx_ )
- { /* if this entry is available, then it should be possible
- to get the Graphic via GraphicObject */
- GraphicObject aGraphicObject( pEntry->aUniqueID );
- rData = aGraphicObject.GetGraphic();
- if ( rData.GetType() != GRAPHIC_NONE )
- bOk = sal_True;
- else
- delete (EscherBlipCacheEntry*)pEscherBlipCache->Remove();
- break;
- }
- }
- }
- if ( !bOk )
- {
- USHORT nIdx = USHORT( nIdx_ );
- if( !nIdx || (pBLIPInfos->Count() < nIdx) ) return FALSE;
-
- // eventuell alte(s) Errorflag(s) loeschen
- if( rStCtrl.GetError() )
- rStCtrl.ResetError();
- if( ( &rStCtrl != pStData )
- && pStData->GetError() )
- pStData->ResetError();
-
- // FilePos des/der Stream(s) merken
- ULONG nOldPosCtrl = rStCtrl.Tell();
- ULONG nOldPosData = pStData ? pStData->Tell() : nOldPosCtrl;
-
- // passende Info-Struct aus unserem Pointer Array nehmen
- SvxMSDffBLIPInfo& rInfo = *(*pBLIPInfos)[ nIdx-1 ];
-
- // das BLIP Atom im Daten Stream anspringen
- pStData->Seek( rInfo.nFilePos );
- // ggfs. Fehlerstatus zuruecksetzen
- if( pStData->GetError() )
- pStData->ResetError();
- else
- bOk = GetBLIPDirect( *pStData, rData, pVisArea );
- if( pStData2 && !bOk )
- {
- // Fehler, aber zweite Chance: es gibt noch einen zweiten
- // Datenstream, in dem die Grafik liegen koennte!
- if( pStData2->GetError() )
- pStData2->ResetError();
- ULONG nOldPosData2 = pStData2->Tell();
- // das BLIP Atom im zweiten Daten Stream anspringen
- pStData2->Seek( rInfo.nFilePos );
- // ggfs. Fehlerstatus zuruecksetzen
- if( pStData2->GetError() )
- pStData2->ResetError();
- else
- bOk = GetBLIPDirect( *pStData2, rData, pVisArea );
- // alte FilePos des zweiten Daten-Stream restaurieren
- pStData2->Seek( nOldPosData2 );
- }
- // alte FilePos des/der Stream(s) restaurieren
- rStCtrl.Seek( nOldPosCtrl );
- if( &rStCtrl != pStData )
- pStData->Seek( nOldPosData );
-
- if ( bOk )
- {
- // create new BlipCacheEntry for this graphic
- GraphicObject aGraphicObject( rData );
- if ( !pEscherBlipCache )
- const_cast <SvxMSDffManager*> (this)->pEscherBlipCache = new List();
- EscherBlipCacheEntry* pNewEntry = new EscherBlipCacheEntry( nIdx_, aGraphicObject.GetUniqueID() );
- pEscherBlipCache->Insert( pNewEntry, LIST_APPEND );
- }
- }
- }
- return bOk;
-}
-
-/* Zugriff auf ein BLIP zur Laufzeit (mit korrekt positioniertem Stream)
- ---------------------------------
-******************************************************************************/
-BOOL SvxMSDffManager::GetBLIPDirect( SvStream& rBLIPStream, Graphic& rData, Rectangle* pVisArea ) const
-{
- ULONG nOldPos = rBLIPStream.Tell();
-
- int nRes = GRFILTER_OPENERROR; // Fehlervariable initialisieren
-
- // nachschauen, ob es sich auch wirklich um ein BLIP handelt
- UINT32 nLength;
- USHORT nInst, nFbt( 0 );
- BYTE nVer;
- if( ReadCommonRecordHeader( rBLIPStream, nVer, nInst, nFbt, nLength) && ( 0xF018 <= nFbt ) && ( 0xF117 >= nFbt ) )
- {
- Size aMtfSize100;
- BOOL bMtfBLIP = FALSE;
- BOOL bZCodecCompression = FALSE;
- // Nun exakt auf den Beginn der eingebetteten Grafik positionieren
- ULONG nSkip = ( nInst & 0x0001 ) ? 32 : 16;
-
- switch( nInst & 0xFFFE )
- {
- case 0x216 : // Metafile header then compressed WMF
- case 0x3D4 : // Metafile header then compressed EMF
- case 0x542 : // Metafile hd. then compressed PICT
- {
- rBLIPStream.SeekRel( nSkip + 20 );
-
- // read in size of metafile in EMUS
- rBLIPStream >> aMtfSize100.Width() >> aMtfSize100.Height();
-
- // scale to 1/100mm
- aMtfSize100.Width() /= 360, aMtfSize100.Height() /= 360;
-
- if ( pVisArea ) // seem that we currently are skipping the visarea position
- *pVisArea = Rectangle( Point(), aMtfSize100 );
-
- // skip rest of header
- nSkip = 6;
- bMtfBLIP = bZCodecCompression = TRUE;
- }
- break;
- case 0x46A : // One byte tag then JPEG (= JFIF) data
- case 0x6E0 : // One byte tag then PNG data
- case 0x7A8 :
- nSkip += 1; // One byte tag then DIB data
- break;
- }
- rBLIPStream.SeekRel( nSkip );
-
- SvStream* pGrStream = &rBLIPStream;
- SvMemoryStream* pOut = NULL;
- if( bZCodecCompression )
- {
- pOut = new SvMemoryStream( 0x8000, 0x4000 );
- ZCodec aZCodec( 0x8000, 0x8000 );
- aZCodec.BeginCompression();
- aZCodec.Decompress( rBLIPStream, *pOut );
- aZCodec.EndCompression();
- pOut->Seek( STREAM_SEEK_TO_BEGIN );
- pGrStream = pOut;
- }
-
-//#define DBG_EXTRACTGRAPHICS
-#ifdef DBG_EXTRACTGRAPHICS
-
- static sal_Int32 nCount;
-
- String aFileName( String( RTL_CONSTASCII_STRINGPARAM( "dbggfx" ) ) );
- aFileName.Append( String::CreateFromInt32( nCount++ ) );
- switch( nInst &~ 1 )
- {
- case 0x216 : aFileName.Append( String( RTL_CONSTASCII_STRINGPARAM( ".wmf" ) ) ); break;
- case 0x3d4 : aFileName.Append( String( RTL_CONSTASCII_STRINGPARAM( ".emf" ) ) ); break;
- case 0x542 : aFileName.Append( String( RTL_CONSTASCII_STRINGPARAM( ".pct" ) ) ); break;
- case 0x46a : aFileName.Append( String( RTL_CONSTASCII_STRINGPARAM( ".jpg" ) ) ); break;
- case 0x6e0 : aFileName.Append( String( RTL_CONSTASCII_STRINGPARAM( ".png" ) ) ); break;
- case 0x7a8 : aFileName.Append( String( RTL_CONSTASCII_STRINGPARAM( ".bmp" ) ) ); break;
- }
-
- String aURLStr;
-
- if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( Application::GetAppFileName(), aURLStr ) )
- {
- INetURLObject aURL( aURLStr );
-
- aURL.removeSegment();
- aURL.removeFinalSlash();
- aURL.Append( aFileName );
-
- SvStream* pDbgOut = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_TRUNC | STREAM_WRITE );
-
- if( pDbgOut )
- {
- if ( bZCodecCompression )
- {
- pOut->Seek( STREAM_SEEK_TO_END );
- pDbgOut->Write( pOut->GetData(), pOut->Tell() );
- pOut->Seek( STREAM_SEEK_TO_BEGIN );
- }
- else
- {
- sal_Int32 nDbgLen = nLength - nSkip;
- if ( nDbgLen )
- {
- sal_Char* pDat = new sal_Char[ nDbgLen ];
- pGrStream->Read( pDat, nDbgLen );
- pDbgOut->Write( pDat, nDbgLen );
- pGrStream->SeekRel( -nDbgLen );
- delete[] pDat;
- }
- }
-
- delete pDbgOut;
- }
- }
-#endif
-
- if( ( nInst & 0xFFFE ) == 0x7A8 )
- { // DIBs direkt holen
- Bitmap aNew;
- if( aNew.Read( *pGrStream, FALSE ) )
- {
- rData = Graphic( aNew );
- nRes = GRFILTER_OK;
- }
- }
- else
- { // und unsere feinen Filter darauf loslassen
- GraphicFilter* pGF = GetGrfFilter();
- String aEmptyStr;
- nRes = pGF->ImportGraphic( rData, aEmptyStr, *pGrStream, GRFILTER_FORMAT_DONTKNOW );
-
- // SJ: I40472, sometimes the aspect ratio (aMtfSize100) does not match and we get scaling problems,
- // then it is better to use the prefsize that is stored within the metafile. Bug #72846# for what the
- // scaling has been implemented does not happen anymore.
- //
- // For pict graphics we will furthermore scale the metafile, because font scaling leads to error if the
- // dxarray is empty (this has been solved in wmf/emf but not for pict)
- if( bMtfBLIP && ( GRFILTER_OK == nRes ) && ( rData.GetType() == GRAPHIC_GDIMETAFILE ) && ( ( nInst & 0xFFFE ) == 0x542 ) )
- {
- if ( ( aMtfSize100.Width() >= 1000 ) && ( aMtfSize100.Height() >= 1000 ) )
- { // #75956#, scaling does not work properly, if the graphic is less than 1cm
- GDIMetaFile aMtf( rData.GetGDIMetaFile() );
- const Size aOldSize( aMtf.GetPrefSize() );
-
- if( aOldSize.Width() && ( aOldSize.Width() != aMtfSize100.Width() ) &&
- aOldSize.Height() && ( aOldSize.Height() != aMtfSize100.Height() ) )
- {
- aMtf.Scale( (double) aMtfSize100.Width() / aOldSize.Width(),
- (double) aMtfSize100.Height() / aOldSize.Height() );
- aMtf.SetPrefSize( aMtfSize100 );
- aMtf.SetPrefMapMode( MAP_100TH_MM );
- rData = aMtf;
- }
- }
- }
- }
- // ggfs. Fehlerstatus zuruecksetzen
- if ( ERRCODE_IO_PENDING == pGrStream->GetError() )
- pGrStream->ResetError();
- delete pOut;
- }
- rBLIPStream.Seek( nOldPos ); // alte FilePos des Streams restaurieren
-
- return ( GRFILTER_OK == nRes ); // Ergebniss melden
-}
-
-/* static */
-BOOL SvxMSDffManager::ReadCommonRecordHeader(DffRecordHeader& rRec, SvStream& rIn)
-{
- rRec.nFilePos = rIn.Tell();
- return SvxMSDffManager::ReadCommonRecordHeader( rIn,rRec.nRecVer,
- rRec.nRecInstance,
- rRec.nRecType,
- rRec.nRecLen );
-}
-
-
-/* auch static */
-BOOL SvxMSDffManager::ReadCommonRecordHeader( SvStream& rSt,
- BYTE& rVer,
- USHORT& rInst,
- USHORT& rFbt,
- UINT32& rLength )
-{
- sal_uInt16 nTmp;
- rSt >> nTmp >> rFbt >> rLength;
- rVer = sal::static_int_cast< BYTE >(nTmp & 15);
- rInst = nTmp >> 4;
- return rSt.GetError() == 0;
-}
-
-
-
-
-BOOL SvxMSDffManager::ProcessClientAnchor(SvStream& rStData, ULONG nDatLen,
- char*& rpBuff, UINT32& rBuffLen ) const
-{
- if( nDatLen )
- {
- rpBuff = new char[ nDatLen ];
- rBuffLen = nDatLen;
- rStData.Read( rpBuff, nDatLen );
- }
- return TRUE;
-}
-
-BOOL SvxMSDffManager::ProcessClientData(SvStream& rStData, ULONG nDatLen,
- char*& rpBuff, UINT32& rBuffLen ) const
-{
- if( nDatLen )
- {
- rpBuff = new char[ nDatLen ];
- rBuffLen = nDatLen;
- rStData.Read( rpBuff, nDatLen );
- }
- return TRUE;
-}
-
-
-void SvxMSDffManager::ProcessClientAnchor2( SvStream& /* rSt */, DffRecordHeader& /* rHd */ , void* /* pData */, DffObjData& /* rObj */ )
-{
- return; // wird von SJ im Draw ueberladen
-}
-
-ULONG SvxMSDffManager::Calc_nBLIPPos( ULONG nOrgVal, ULONG /* nStreamPos */ ) const
-{
- return nOrgVal;
-}
-
-BOOL SvxMSDffManager::GetOLEStorageName( long /* nOLEId */, String&, SvStorageRef&, uno::Reference < embed::XStorage >& ) const
-{
- return FALSE;
-}
-
-BOOL SvxMSDffManager::ShapeHasText( ULONG /* nShapeId */, ULONG /* nFilePos */ ) const
-{
- return TRUE;
-}
-
-// --> OD 2004-12-14 #i32596# - add new parameter <_nCalledByGroup>
-SdrObject* SvxMSDffManager::ImportOLE( long nOLEId,
- const Graphic& rGrf,
- const Rectangle& rBoundRect,
- const Rectangle& rVisArea,
- const int /* _nCalledByGroup */,
- sal_Int64 nAspect ) const
-// <--
-{
- SdrObject* pRet = 0;
- String sStorageName;
- SvStorageRef xSrcStg;
- ErrCode nError = ERRCODE_NONE;
- uno::Reference < embed::XStorage > xDstStg;
- if( GetOLEStorageName( nOLEId, sStorageName, xSrcStg, xDstStg ))
- pRet = CreateSdrOLEFromStorage( sStorageName, xSrcStg, xDstStg,
- rGrf, rBoundRect, rVisArea, pStData, nError,
- nSvxMSDffOLEConvFlags, nAspect );
- return pRet;
-}
-
-const GDIMetaFile* SvxMSDffManager::lcl_GetMetaFileFromGrf_Impl( const Graphic& rGrf,
- GDIMetaFile& rMtf )
-{
- const GDIMetaFile* pMtf;
- if( GRAPHIC_BITMAP == rGrf.GetType() )
- {
- Point aPt;
- const Size aSz(lcl_GetPrefSize(rGrf, MAP_100TH_MM));
-
- VirtualDevice aVirtDev;
- aVirtDev.EnableOutput( FALSE );
- MapMode aMM(MAP_100TH_MM);
- aVirtDev.SetMapMode( aMM );
-
- rMtf.Record( &aVirtDev );
- rGrf.Draw( &aVirtDev, aPt, aSz );
- rMtf.Stop();
- rMtf.SetPrefMapMode(aMM);
- rMtf.SetPrefSize( aSz );
-
- pMtf = &rMtf;
- }
- else
- pMtf = &rGrf.GetGDIMetaFile();
- return pMtf;
-}
-
-BOOL SvxMSDffManager::MakeContentStream( SotStorage * pStor, const GDIMetaFile & rMtf )
-{
- String aPersistStream( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( SVEXT_PERSIST_STREAM ) ) );
- SotStorageStreamRef xStm = pStor->OpenSotStream( aPersistStream );
- xStm->SetVersion( pStor->GetVersion() );
- xStm->SetBufferSize( 8192 );
-
- USHORT nAspect = ASPECT_CONTENT;
- ULONG nAdviseModes = 2;
-
- Impl_OlePres aEle( FORMAT_GDIMETAFILE );
- // Die Groesse in 1/100 mm umrechnen
- // Falls eine nicht anwendbare MapUnit (Device abhaengig) verwendet wird,
- // versucht SV einen BestMatchden richtigen Wert zu raten.
- Size aSize = rMtf.GetPrefSize();
- MapMode aMMSrc = rMtf.GetPrefMapMode();
- MapMode aMMDst( MAP_100TH_MM );
- aSize = OutputDevice::LogicToLogic( aSize, aMMSrc, aMMDst );
- aEle.SetSize( aSize );
- aEle.SetAspect( nAspect );
- aEle.SetAdviseFlags( nAdviseModes );
- aEle.SetMtf( rMtf );
- aEle.Write( *xStm );
-
- xStm->SetBufferSize( 0 );
- return xStm->GetError() == SVSTREAM_OK;
-}
-
-struct ClsIDs {
- UINT32 nId;
- const sal_Char* pSvrName;
- const sal_Char* pDspName;
-};
-static ClsIDs aClsIDs[] = {
-
- { 0x000212F0, "MSWordArt", "Microsoft Word Art" },
- { 0x000212F0, "MSWordArt.2", "Microsoft Word Art 2.0" },
-
- // MS Apps
- { 0x00030000, "ExcelWorksheet", "Microsoft Excel Worksheet" },
- { 0x00030001, "ExcelChart", "Microsoft Excel Chart" },
- { 0x00030002, "ExcelMacrosheet", "Microsoft Excel Macro" },
- { 0x00030003, "WordDocument", "Microsoft Word Document" },
- { 0x00030004, "MSPowerPoint", "Microsoft PowerPoint" },
- { 0x00030005, "MSPowerPointSho", "Microsoft PowerPoint Slide Show"},
- { 0x00030006, "MSGraph", "Microsoft Graph" },
- { 0x00030007, "MSDraw", "Microsoft Draw" },
- { 0x00030008, "Note-It", "Microsoft Note-It" },
- { 0x00030009, "WordArt", "Microsoft Word Art" },
- { 0x0003000a, "PBrush", "Microsoft PaintBrush Picture" },
- { 0x0003000b, "Equation", "Microsoft Equation Editor" },
- { 0x0003000c, "Package", "Package" },
- { 0x0003000d, "SoundRec", "Sound" },
- { 0x0003000e, "MPlayer", "Media Player" },
- // MS Demos
- { 0x0003000f, "ServerDemo", "OLE 1.0 Server Demo" },
- { 0x00030010, "Srtest", "OLE 1.0 Test Demo" },
- { 0x00030011, "SrtInv", "OLE 1.0 Inv Demo" },
- { 0x00030012, "OleDemo", "OLE 1.0 Demo" },
-
- // Coromandel / Dorai Swamy / 718-793-7963
- { 0x00030013, "CoromandelIntegra", "Coromandel Integra" },
- { 0x00030014, "CoromandelObjServer","Coromandel Object Server" },
-
- // 3-d Visions Corp / Peter Hirsch / 310-325-1339
- { 0x00030015, "StanfordGraphics", "Stanford Graphics" },
-
- // Deltapoint / Nigel Hearne / 408-648-4000
- { 0x00030016, "DGraphCHART", "DeltaPoint Graph Chart" },
- { 0x00030017, "DGraphDATA", "DeltaPoint Graph Data" },
-
- // Corel / Richard V. Woodend / 613-728-8200 x1153
- { 0x00030018, "PhotoPaint", "Corel PhotoPaint" },
- { 0x00030019, "CShow", "Corel Show" },
- { 0x0003001a, "CorelChart", "Corel Chart" },
- { 0x0003001b, "CDraw", "Corel Draw" },
-
- // Inset Systems / Mark Skiba / 203-740-2400
- { 0x0003001c, "HJWIN1.0", "Inset Systems" },
-
- // Mark V Systems / Mark McGraw / 818-995-7671
- { 0x0003001d, "ObjMakerOLE", "MarkV Systems Object Maker" },
-
- // IdentiTech / Mike Gilger / 407-951-9503
- { 0x0003001e, "FYI", "IdentiTech FYI" },
- { 0x0003001f, "FYIView", "IdentiTech FYI Viewer" },
-
- // Inventa Corporation / Balaji Varadarajan / 408-987-0220
- { 0x00030020, "Stickynote", "Inventa Sticky Note" },
-
- // ShapeWare Corp. / Lori Pearce / 206-467-6723
- { 0x00030021, "ShapewareVISIO10", "Shapeware Visio 1.0" },
- { 0x00030022, "ImportServer", "Spaheware Import Server" },
-
- // test app SrTest
- { 0x00030023, "SrvrTest", "OLE 1.0 Server Test" },
-
- // test app ClTest. Doesn't really work as a server but is in reg db
- { 0x00030025, "Cltest", "OLE 1.0 Client Test" },
-
- // Microsoft ClipArt Gallery Sherry Larsen-Holmes
- { 0x00030026, "MS_ClipArt_Gallery", "Microsoft ClipArt Gallery" },
- // Microsoft Project Cory Reina
- { 0x00030027, "MSProject", "Microsoft Project" },
-
- // Microsoft Works Chart
- { 0x00030028, "MSWorksChart", "Microsoft Works Chart" },
-
- // Microsoft Works Spreadsheet
- { 0x00030029, "MSWorksSpreadsheet", "Microsoft Works Spreadsheet" },
-
- // AFX apps - Dean McCrory
- { 0x0003002A, "MinSvr", "AFX Mini Server" },
- { 0x0003002B, "HierarchyList", "AFX Hierarchy List" },
- { 0x0003002C, "BibRef", "AFX BibRef" },
- { 0x0003002D, "MinSvrMI", "AFX Mini Server MI" },
- { 0x0003002E, "TestServ", "AFX Test Server" },
-
- // Ami Pro
- { 0x0003002F, "AmiProDocument", "Ami Pro Document" },
-
- // WordPerfect Presentations For Windows
- { 0x00030030, "WPGraphics", "WordPerfect Presentation" },
- { 0x00030031, "WPCharts", "WordPerfect Chart" },
-
- // MicroGrafx Charisma
- { 0x00030032, "Charisma", "MicroGrafx Charisma" },
- { 0x00030033, "Charisma_30", "MicroGrafx Charisma 3.0" },
- { 0x00030034, "CharPres_30", "MicroGrafx Charisma 3.0 Pres" },
- // MicroGrafx Draw
- { 0x00030035, "Draw", "MicroGrafx Draw" },
- // MicroGrafx Designer
- { 0x00030036, "Designer_40", "MicroGrafx Designer 4.0" },
-
- // STAR DIVISION
-// { 0x000424CA, "StarMath", "StarMath 1.0" },
- { 0x00043AD2, "FontWork", "Star FontWork" },
-// { 0x000456EE, "StarMath2", "StarMath 2.0" },
-
- { 0, "", "" } };
-
-
-BOOL SvxMSDffManager::ConvertToOle2( SvStream& rStm, UINT32 nReadLen,
- const GDIMetaFile * pMtf, const SotStorageRef& rDest )
-{
- BOOL bMtfRead = FALSE;
- SotStorageStreamRef xOle10Stm = rDest->OpenSotStream( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "\1Ole10Native" ) ),
- STREAM_WRITE| STREAM_SHARE_DENYALL );
- if( xOle10Stm->GetError() )
- return FALSE;
-
- UINT32 nType;
- UINT32 nRecType;
- UINT32 nStrLen;
- String aSvrName;
- UINT32 nDummy0;
- UINT32 nDummy1;
- UINT32 nDataLen;
- BYTE * pData;
- UINT32 nBytesRead = 0;
- do
- {
- rStm >> nType;
- rStm >> nRecType;
- rStm >> nStrLen;
- if( nStrLen )
- {
- if( 0x10000L > nStrLen )
- {
- sal_Char * pBuf = new sal_Char[ nStrLen ];
- rStm.Read( pBuf, nStrLen );
- aSvrName.Assign( String( pBuf, (USHORT) nStrLen-1, gsl_getSystemTextEncoding() ) );
- delete[] pBuf;
- }
- else
- break;
- }
- rStm >> nDummy0;
- rStm >> nDummy1;
- rStm >> nDataLen;
-
- nBytesRead += 6 * sizeof( UINT32 ) + nStrLen + nDataLen;
-
- if( !rStm.IsEof() && nReadLen > nBytesRead && nDataLen )
- {
- if( xOle10Stm.Is() )
- {
- pData = new BYTE[ nDataLen ];
- if( !pData )
- return FALSE;
-
- rStm.Read( pData, nDataLen );
-
- // write to ole10 stream
- *xOle10Stm << nDataLen;
- xOle10Stm->Write( pData, nDataLen );
- xOle10Stm = SotStorageStreamRef();
-
- // set the compobj stream
- ClsIDs* pIds;
- for( pIds = aClsIDs; pIds->nId; pIds++ )
- {
- if( COMPARE_EQUAL == aSvrName.CompareToAscii( pIds->pSvrName ) )
- break;
- }
-// SvGlobalName* pClsId = NULL;
- String aShort, aFull;
- if( pIds->nId )
- {
- // gefunden!
- ULONG nCbFmt = SotExchange::RegisterFormatName( aSvrName );
- rDest->SetClass( SvGlobalName( pIds->nId, 0, 0, 0xc0,0,0,0,0,0,0,0x46 ), nCbFmt,
- String( pIds->pDspName, RTL_TEXTENCODING_ASCII_US ) );
- }
- else
- {
- ULONG nCbFmt = SotExchange::RegisterFormatName( aSvrName );
- rDest->SetClass( SvGlobalName(), nCbFmt, aSvrName );
- }
-
- delete[] pData;
- }
- else if( nRecType == 5 && !pMtf )
- {
- ULONG nPos = rStm.Tell();
- UINT16 sz[4];
- rStm.Read( sz, 8 );
- //rStm.SeekRel( 8 );
- Graphic aGraphic;
- if( ERRCODE_NONE == GraphicConverter::Import( rStm, aGraphic ) && aGraphic.GetType() )
- {
- const GDIMetaFile& rMtf = aGraphic.GetGDIMetaFile();
- MakeContentStream( rDest, rMtf );
- bMtfRead = TRUE;
- }
- // set behind the data
- rStm.Seek( nPos + nDataLen );
- }
- else
- rStm.SeekRel( nDataLen );
- }
- } while( !rStm.IsEof() && nReadLen >= nBytesRead );
-
- if( !bMtfRead && pMtf )
- {
- MakeContentStream( rDest, *pMtf );
- return TRUE;
- }
-
- return FALSE;
-}
-
-const char* GetInternalServerName_Impl( const SvGlobalName& aGlobName )
-{
- if ( aGlobName == SvGlobalName( SO3_SW_OLE_EMBED_CLASSID_60 )
- || aGlobName == SvGlobalName( SO3_SW_OLE_EMBED_CLASSID_8 ) )
- return "swriter";
- else if ( aGlobName == SvGlobalName( SO3_SC_OLE_EMBED_CLASSID_60 )
- || aGlobName == SvGlobalName( SO3_SC_OLE_EMBED_CLASSID_8 ) )
- return "scalc";
- else if ( aGlobName == SvGlobalName( SO3_SIMPRESS_OLE_EMBED_CLASSID_60 )
- || aGlobName == SvGlobalName( SO3_SIMPRESS_OLE_EMBED_CLASSID_8 ) )
- return "simpress";
- else if ( aGlobName == SvGlobalName( SO3_SDRAW_OLE_EMBED_CLASSID_60 )
- || aGlobName == SvGlobalName( SO3_SDRAW_OLE_EMBED_CLASSID_8 ) )
- return "sdraw";
- else if ( aGlobName == SvGlobalName( SO3_SM_OLE_EMBED_CLASSID_60 )
- || aGlobName == SvGlobalName( SO3_SM_OLE_EMBED_CLASSID_8 ) )
- return "smath";
- else if ( aGlobName == SvGlobalName( SO3_SCH_OLE_EMBED_CLASSID_60 )
- || aGlobName == SvGlobalName( SO3_SCH_OLE_EMBED_CLASSID_8 ) )
- return "schart";
- return 0;
-}
-
-::rtl::OUString GetFilterNameFromClassID_Impl( const SvGlobalName& aGlobName )
-{
- if ( aGlobName == SvGlobalName( SO3_SW_OLE_EMBED_CLASSID_60 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StarOffice XML (Writer)" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SW_OLE_EMBED_CLASSID_8 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "writer8" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SC_OLE_EMBED_CLASSID_60 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StarOffice XML (Calc)" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SC_OLE_EMBED_CLASSID_8 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "calc8" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SIMPRESS_OLE_EMBED_CLASSID_60 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StarOffice XML (Impress)" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SIMPRESS_OLE_EMBED_CLASSID_8 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "impress8" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SDRAW_OLE_EMBED_CLASSID_60 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StarOffice XML (Draw)" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SDRAW_OLE_EMBED_CLASSID_8 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "draw8" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SM_OLE_EMBED_CLASSID_60 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StarOffice XML (Math)" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SM_OLE_EMBED_CLASSID_8 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "math8" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SCH_OLE_EMBED_CLASSID_60 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StarOffice XML (Chart)" ) );
-
- if ( aGlobName == SvGlobalName( SO3_SCH_OLE_EMBED_CLASSID_8 ) )
- return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "chart8" ) );
-
- return ::rtl::OUString();
-}
-
-com::sun::star::uno::Reference < com::sun::star::embed::XEmbeddedObject > SvxMSDffManager::CheckForConvertToSOObj( UINT32 nConvertFlags,
- SotStorage& rSrcStg, const uno::Reference < embed::XStorage >& rDestStorage,
- const Graphic& rGrf,
- const Rectangle& rVisArea )
-{
- uno::Reference < embed::XEmbeddedObject > xObj;
- SvGlobalName aStgNm = rSrcStg.GetClassName();
- const char* pName = GetInternalServerName_Impl( aStgNm );
- String sStarName;
- if ( pName )
- sStarName = String::CreateFromAscii( pName );
- else if ( nConvertFlags )
- {
- static struct _ObjImpType
- {
- UINT32 nFlag;
- const char* pFactoryNm;
- // GlobalNameId
- UINT32 n1;
- USHORT n2, n3;
- BYTE b8, b9, b10, b11, b12, b13, b14, b15;
- } aArr[] = {
- { OLE_MATHTYPE_2_STARMATH, "smath",
- 0x0002ce02L, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 },
- { OLE_MATHTYPE_2_STARMATH, "smath",
- 0x00021700L, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 },
- { OLE_WINWORD_2_STARWRITER, "swriter",
- 0x00020906L, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 },
- { OLE_EXCEL_2_STARCALC, "scalc", // Excel table
- 0x00020810L, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 },
- { OLE_EXCEL_2_STARCALC, "scalc", // Excel chart
- 0x00020820L, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 },
- // 114465: additional Excel OLE chart classId to above.
- { OLE_EXCEL_2_STARCALC, "scalc",
- 0x00020821L, 0x0000, 0x0000,
- 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 },
- { OLE_POWERPOINT_2_STARIMPRESS, "simpress", // PowerPoint presentation
- 0x64818d10L, 0x4f9b, 0x11cf,
- 0x86,0xea,0x00,0xaa,0x00,0xb9,0x29,0xe8 },
- { OLE_POWERPOINT_2_STARIMPRESS, "simpress", // PowerPoint slide
- 0x64818d11L, 0x4f9b, 0x11cf,
- 0x86,0xea,0x00,0xaa,0x00,0xb9,0x29,0xe8 },
- { 0, 0,
- 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0 }
- };
-
- for( const _ObjImpType* pArr = aArr; pArr->nFlag; ++pArr )
- {
- if( nConvertFlags & pArr->nFlag )
- {
- SvGlobalName aTypeName( pArr->n1, pArr->n2, pArr->n3,
- pArr->b8, pArr->b9, pArr->b10, pArr->b11,
- pArr->b12, pArr->b13, pArr->b14, pArr->b15 );
-
- if ( aStgNm == aTypeName )
- {
- sStarName = String::CreateFromAscii( pArr->pFactoryNm );
- break;
- }
- }
- }
- }
-
- if ( sStarName.Len() )
- {
- //TODO/MBA: check if (and when) storage and stream will be destroyed!
- const SfxFilter* pFilter = 0;
- SvMemoryStream* pStream = new SvMemoryStream;
- if ( pName )
- {
- // TODO/LATER: perhaps we need to retrieve VisArea and Metafile from the storage also
- SotStorageStreamRef xStr = rSrcStg.OpenSotStream( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "package_stream" ) ), STREAM_STD_READ );
- *xStr >> *pStream;
- }
- else
- {
- SfxFilterMatcher aMatch( sStarName );
- SotStorageRef xStorage = new SotStorage( FALSE, *pStream );
- rSrcStg.CopyTo( xStorage );
- xStorage->Commit();
- xStorage.Clear();
- String aType = SfxFilter::GetTypeFromStorage( rSrcStg );
- if ( aType.Len() )
- pFilter = aMatch.GetFilter4EA( aType );
- }
-
- if ( pName || pFilter )
- {
- //Reuse current ole name
- String aDstStgName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(MSO_OLE_Obj)));
- aDstStgName += String::CreateFromInt32(nMSOleObjCntr);
-
- ::rtl::OUString aFilterName;
- if ( pFilter )
- aFilterName = pFilter->GetName();
- else
- aFilterName = GetFilterNameFromClassID_Impl( aStgNm );
-
- uno::Sequence < beans::PropertyValue > aMedium( aFilterName.getLength() ? 3 : 2);
- aMedium[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "InputStream" ) );
- uno::Reference < io::XInputStream > xStream = new ::utl::OSeekableInputStreamWrapper( *pStream );
- aMedium[0].Value <<= xStream;
- aMedium[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
- aMedium[1].Value <<= ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:stream" ) );
-
- if ( aFilterName.getLength() )
- {
- aMedium[2].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterName" ) );
- aMedium[2].Value <<= aFilterName;
- }
-
- ::rtl::OUString aName( aDstStgName );
- comphelper::EmbeddedObjectContainer aCnt( rDestStorage );
- xObj = aCnt.InsertEmbeddedObject( aMedium, aName );
-
- if ( !xObj.is() )
- {
- if( aFilterName.getLength() )
- {
- // throw the filter parameter away as workaround
- aMedium.realloc( 2 );
- xObj = aCnt.InsertEmbeddedObject( aMedium, aName );
- }
-
- if ( !xObj.is() )
- return xObj;
- }
-
- // TODO/LATER: ViewAspect must be passed from outside!
- sal_Int64 nViewAspect = embed::Aspects::MSOLE_CONTENT;
-
- // JP 26.10.2001: Bug 93374 / 91928 the writer
- // objects need the correct visarea needs the
- // correct visarea, but this is not true for
- // PowerPoint (see bugdoc 94908b)
- // SJ: 19.11.2001 bug 94908, also chart objects
- // needs the correct visarea
-
- // If pName is set this is an own embedded object, it should have the correct size internally
- // TODO/LATER: it might make sence in future to set the size stored in internal object
- if( !pName && ( sStarName.EqualsAscii( "swriter" ) || sStarName.EqualsAscii( "scalc" ) ) )
- {
- MapMode aMapMode( VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nViewAspect ) ) );
- Size aSz;
- if ( rVisArea.IsEmpty() )
- aSz = lcl_GetPrefSize(rGrf, aMapMode );
- else
- {
- aSz = rVisArea.GetSize();
- aSz = OutputDevice::LogicToLogic( aSz, MapMode( MAP_100TH_MM ), aMapMode );
- }
-
- // don't modify the object
- //TODO/LATER: remove those hacks, that needs to be done differently!
- //xIPObj->EnableSetModified( FALSE );
- awt::Size aSize;
- aSize.Width = aSz.Width();
- aSize.Height = aSz.Height();
- xObj->setVisualAreaSize( nViewAspect, aSize );
- //xIPObj->EnableSetModified( TRUE );
- }
- else if ( sStarName.EqualsAscii( "smath" ) )
- { // SJ: force the object to recalc its visarea
- //TODO/LATER: wait for PrinterChangeNotification
- //xIPObj->OnDocumentPrinterChanged( NULL );
- }
- }
- }
-
- return xObj;
-}
-
-// TODO/MBA: code review and testing!
-SdrOle2Obj* SvxMSDffManager::CreateSdrOLEFromStorage(
- const String& rStorageName,
- SotStorageRef& rSrcStorage,
- const uno::Reference < embed::XStorage >& xDestStorage,
- const Graphic& rGrf,
- const Rectangle& rBoundRect,
- const Rectangle& rVisArea,
- SvStream* pDataStrm,
- ErrCode& rError,
- UINT32 nConvertFlags,
- sal_Int64 nReccomendedAspect )
-{
- sal_Int64 nAspect = nReccomendedAspect;
- SdrOle2Obj* pRet = 0;
- if( rSrcStorage.Is() && xDestStorage.is() && rStorageName.Len() )
- {
- comphelper::EmbeddedObjectContainer aCnt( xDestStorage );
- // Ist der 01Ole-Stream ueberhaupt vorhanden ?
- // ( ist er z.B. bei FontWork nicht )
- // Wenn nicht -> Einbindung als Grafik
- BOOL bValidStorage = FALSE;
- String aDstStgName( String::CreateFromAscii(
- RTL_CONSTASCII_STRINGPARAM(MSO_OLE_Obj)));
-
- aDstStgName += String::CreateFromInt32( ++nMSOleObjCntr );
-
- {
- SvStorageRef xObjStg = rSrcStorage->OpenSotStorage( rStorageName,
- STREAM_READWRITE| STREAM_SHARE_DENYALL );
- if( xObjStg.Is() )
- {
- {
- BYTE aTestA[10]; // exist the \1CompObj-Stream ?
- SvStorageStreamRef xSrcTst = xObjStg->OpenSotStream(
- String(RTL_CONSTASCII_STRINGPARAM("\1CompObj"),
- RTL_TEXTENCODING_MS_1252 ));
- bValidStorage = xSrcTst.Is() && sizeof( aTestA ) ==
- xSrcTst->Read( aTestA, sizeof( aTestA ) );
- if( !bValidStorage )
- {
- // or the \1Ole-Stream ?
- xSrcTst = xObjStg->OpenSotStream(
- String(RTL_CONSTASCII_STRINGPARAM("\1Ole"),
- RTL_TEXTENCODING_MS_1252 ));
- bValidStorage = xSrcTst.Is() && sizeof(aTestA) ==
- xSrcTst->Read(aTestA, sizeof(aTestA));
- }
- }
-
- if( bValidStorage )
- {
- if ( nAspect != embed::Aspects::MSOLE_ICON )
- {
- // check whether the object is iconified one
- // usually this information is already known, the only exception
- // is a kind of embedded objects in Word documents
- // TODO/LATER: should the caller be notified if the aspect changes in future?
-
- SvStorageStreamRef xObjInfoSrc = xObjStg->OpenSotStream(
- String( RTL_CONSTASCII_STRINGPARAM( "\3ObjInfo" ) ),
- STREAM_STD_READ | STREAM_NOCREATE );
- if ( xObjInfoSrc.Is() && !xObjInfoSrc->GetError() )
- {
- BYTE nByte = 0;
- *xObjInfoSrc >> nByte;
- if ( ( nByte >> 4 ) & embed::Aspects::MSOLE_ICON )
- nAspect = embed::Aspects::MSOLE_ICON;
- }
- }
-
- uno::Reference < embed::XEmbeddedObject > xObj( CheckForConvertToSOObj(
- nConvertFlags, *xObjStg, xDestStorage, rGrf, rVisArea ));
- if ( xObj.is() )
- {
- svt::EmbeddedObjectRef aObj( xObj, nAspect );
-
- // TODO/LATER: need MediaType
- aObj.SetGraphic( rGrf, ::rtl::OUString() );
-
- // TODO/MBA: check setting of PersistName
- pRet = new SdrOle2Obj( aObj, String(), rBoundRect, false);
- // we have the Object, don't create another
- bValidStorage = false;
- }
- }
- }
- }
-
- if( bValidStorage )
- {
- // object is not an own object
- SotStorageRef xObjStor = SotStorage::OpenOLEStorage( xDestStorage, aDstStgName, STREAM_READWRITE );
-
- if ( xObjStor.Is() )
- {
- SotStorageRef xSrcStor = rSrcStorage->OpenSotStorage( rStorageName, STREAM_READ );
- xSrcStor->CopyTo( xObjStor );
-
- if( !xObjStor->GetError() )
- xObjStor->Commit();
-
- if( xObjStor->GetError() )
- {
- rError = xObjStor->GetError();
- bValidStorage = FALSE;
- }
- else if( !xObjStor.Is() )
- bValidStorage = FALSE;
- }
- }
- else if( pDataStrm )
- {
- UINT32 nLen, nDummy;
- *pDataStrm >> nLen >> nDummy;
- if( SVSTREAM_OK != pDataStrm->GetError() ||
- // Id in BugDoc - exist there other Ids?
- // The ConvertToOle2 - does not check for consistent
- 0x30008 != nDummy )
- bValidStorage = FALSE;
- else
- {
- // or is it an OLE-1 Stream in the DataStream?
- SvStorageRef xObjStor = SotStorage::OpenOLEStorage( xDestStorage, aDstStgName );
- //TODO/MBA: remove metafile conversion from ConvertToOle2
- //when is this code used?!
- GDIMetaFile aMtf;
- bValidStorage = ConvertToOle2( *pDataStrm, nLen, &aMtf, xObjStor );
- xObjStor->Commit();
- }
- }
-
- if( bValidStorage )
- {
- uno::Reference < embed::XEmbeddedObject > xObj = aCnt.GetEmbeddedObject( aDstStgName );
- if( xObj.is() )
- {
- // the visual area must be retrieved from the metafile (object doesn't know it so far)
-
- if ( nAspect != embed::Aspects::MSOLE_ICON )
- {
- // working with visual area can switch the object to running state
- awt::Size aAwtSz;
- try
- {
- // the provided visual area should be used, if there is any
- if ( rVisArea.IsEmpty() )
- {
- MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
- Size aSz(lcl_GetPrefSize(rGrf, MapMode(aMapUnit)));
- aAwtSz.Width = aSz.Width();
- aAwtSz.Height = aSz.Height();
- }
- else
- {
- aAwtSz.Width = rVisArea.GetWidth();
- aAwtSz.Height = rVisArea.GetHeight();
- }
- //xInplaceObj->EnableSetModified( FALSE );
- xObj->setVisualAreaSize( nAspect, aAwtSz );
- //xInplaceObj->EnableSetModified( TRUE );*/
- }
- catch( uno::Exception& )
- {
- OSL_ENSURE( sal_False, "Could not set visual area of the object!\n" );
- }
- }
-
- svt::EmbeddedObjectRef aObj( xObj, nAspect );
-
- // TODO/LATER: need MediaType
- aObj.SetGraphic( rGrf, ::rtl::OUString() );
-
- pRet = new SdrOle2Obj( aObj, aDstStgName, rBoundRect, false);
- }
- }
- }
-
- return pRet;
-}
-
-SdrObject* SvxMSDffManager::GetAutoForm( MSO_SPT eTyp ) const
-{
- SdrObject* pRet = NULL;
-
- if(120 >= UINT16(eTyp))
- {
- pRet = new SdrRectObj();
- }
-
- DBG_ASSERT(pRet, "SvxMSDffManager::GetAutoForm -> UNKNOWN AUTOFORM");
-
- return pRet;
-}
-
-sal_Bool SvxMSDffManager::SetPropValue( const uno::Any& rAny, const uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
- const String& rPropName, sal_Bool bTestPropertyAvailability )
-{
- sal_Bool bRetValue = sal_True;
- if ( bTestPropertyAvailability )
- {
- bRetValue = sal_False;
- try
- {
- uno::Reference< beans::XPropertySetInfo >
- aXPropSetInfo( rXPropSet->getPropertySetInfo() );
- if ( aXPropSetInfo.is() )
- bRetValue = aXPropSetInfo->hasPropertyByName( rPropName );
- }
- catch( uno::Exception& )
- {
- bRetValue = sal_False;
- }
- }
- if ( bRetValue )
- {
- try
- {
- rXPropSet->setPropertyValue( rPropName, rAny );
- bRetValue = sal_True;
- }
- catch( uno::Exception& )
- {
- bRetValue = sal_False;
- }
- }
- return bRetValue;
-}
-
-SvxMSDffImportRec::SvxMSDffImportRec()
- : pObj( 0 ),
- pWrapPolygon(0),
- pClientAnchorBuffer( 0 ),
- nClientAnchorLen( 0 ),
- pClientDataBuffer( 0 ),
- nClientDataLen( 0 ),
- nXAlign( 0 ), // position n cm from left
- nXRelTo( 2 ), // relative to column
- nYAlign( 0 ), // position n cm below
- nYRelTo( 2 ), // relative to paragraph
- nLayoutInTableCell( 0 ), // element is laid out in table cell
- nTextRotationAngle( 0 ),
- nDxTextLeft( 144 ),
- nDyTextTop( 72 ),
- nDxTextRight( 144 ),
- nDyTextBottom( 72 ),
- nDxWrapDistLeft( 0 ),
- nDyWrapDistTop( 0 ),
- nDxWrapDistRight( 0 ),
- nDyWrapDistBottom(0 ),
- nCropFromTop( 0 ),
- nCropFromBottom( 0 ),
- nCropFromLeft( 0 ),
- nCropFromRight( 0 ),
- aTextId( 0, 0 ),
- nNextShapeId( 0 ),
- nShapeId( 0 ),
- eShapeType( mso_sptNil )
-{
- eLineStyle = mso_lineSimple; // GPF-Bug #66227#
- bDrawHell = FALSE;
- bHidden = FALSE;
-// bInGroup = FALSE;
- bReplaceByFly = FALSE;
- bLastBoxInChain = TRUE;
- bHasUDefProp = FALSE; // was the DFF_msofbtUDefProp record set?
- bVFlip = FALSE;
- bHFlip = FALSE;
- bAutoWidth = FALSE;
-}
-
-SvxMSDffImportRec::SvxMSDffImportRec(const SvxMSDffImportRec& rCopy)
- : pObj( rCopy.pObj ),
- nXAlign( rCopy.nXAlign ),
- nXRelTo( rCopy.nXRelTo ),
- nYAlign( rCopy.nYAlign ),
- nYRelTo( rCopy.nYRelTo ),
- nLayoutInTableCell( rCopy.nLayoutInTableCell ),
- nTextRotationAngle( rCopy.nTextRotationAngle ),
- nDxTextLeft( rCopy.nDxTextLeft ),
- nDyTextTop( rCopy.nDyTextTop ),
- nDxTextRight( rCopy.nDxTextRight ),
- nDyTextBottom( rCopy.nDyTextBottom ),
- nDxWrapDistLeft( rCopy.nDxWrapDistLeft ),
- nDyWrapDistTop( rCopy.nDyWrapDistTop ),
- nDxWrapDistRight( rCopy.nDxWrapDistRight ),
- nDyWrapDistBottom(rCopy.nDyWrapDistBottom ),
- nCropFromTop( rCopy.nCropFromTop ),
- nCropFromBottom( rCopy.nCropFromBottom ),
- nCropFromLeft( rCopy.nCropFromLeft ),
- nCropFromRight( rCopy.nCropFromRight ),
- aTextId( rCopy.aTextId ),
- nNextShapeId( rCopy.nNextShapeId ),
- nShapeId( rCopy.nShapeId ),
- eShapeType( rCopy.eShapeType )
-{
- eLineStyle = rCopy.eLineStyle; // GPF-Bug #66227#
- bDrawHell = rCopy.bDrawHell;
- bHidden = rCopy.bHidden;
-// bInGroup = rCopy.bInGroup;
- bReplaceByFly = rCopy.bReplaceByFly;
- bAutoWidth = rCopy.bAutoWidth;
- bLastBoxInChain = rCopy.bLastBoxInChain;
- bHasUDefProp = rCopy.bHasUDefProp;
- bVFlip = rCopy.bVFlip;
- bHFlip = rCopy.bHFlip;
- nClientAnchorLen = rCopy.nClientAnchorLen;
- if( rCopy.nClientAnchorLen )
- {
- pClientAnchorBuffer = new char[ nClientAnchorLen ];
- memcpy( pClientAnchorBuffer,
- rCopy.pClientAnchorBuffer,
- nClientAnchorLen );
- }
- else
- pClientAnchorBuffer = 0;
-
- nClientDataLen = rCopy.nClientDataLen;
- if( rCopy.nClientDataLen )
- {
- pClientDataBuffer = new char[ nClientDataLen ];
- memcpy( pClientDataBuffer,
- rCopy.pClientDataBuffer,
- nClientDataLen );
- }
- else
- pClientDataBuffer = 0;
-
- if (rCopy.pWrapPolygon)
- pWrapPolygon = new Polygon(*rCopy.pWrapPolygon);
- else
- pWrapPolygon = 0;
-}
-
-SvxMSDffImportRec::~SvxMSDffImportRec()
-{
- if (pClientAnchorBuffer)
- delete[] pClientAnchorBuffer;
- if (pClientDataBuffer)
- delete[] pClientDataBuffer;
- if (pWrapPolygon)
- delete pWrapPolygon;
-}
-
-/* vi:set tabstop=4 shiftwidth=4 expandtab: */
-
-void SvxMSDffManager::insertShapeId( sal_Int32 nShapeId, SdrObject* pShape )
-{
- maShapeIdContainer[nShapeId] = pShape;
-}
-
-void SvxMSDffManager::removeShapeId( SdrObject* pShape )
-{
- SvxMSDffShapeIdContainer::iterator aIter( maShapeIdContainer.begin() );
- const SvxMSDffShapeIdContainer::iterator aEnd( maShapeIdContainer.end() );
- while( aIter != aEnd )
- {
- if( (*aIter).second == pShape )
- {
- maShapeIdContainer.erase( aIter );
- break;
- }
- }
-}
-
-SdrObject* SvxMSDffManager::getShapeForId( sal_Int32 nShapeId )
-{
- SvxMSDffShapeIdContainer::iterator aIter( maShapeIdContainer.find(nShapeId) );
- return aIter != maShapeIdContainer.end() ? (*aIter).second : 0;
-}