| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sd.hxx" |
| |
| #include <editeng/numitem.hxx> |
| |
| #include <unotools/ucbstreamhelper.hxx> |
| #include <vcl/wrkwin.hxx> |
| #include <svl/urihelper.hxx> |
| #include <svx/svxids.hrc> |
| #include <filter/msfilter/svdfppt.hxx> |
| #include <svx/svditer.hxx> |
| #include <sfx2/docfile.hxx> |
| #include <sfx2/app.hxx> |
| #include <svx/svdograf.hxx> |
| #include <svx/svdlayer.hxx> |
| #include <vcl/msgbox.hxx> |
| #include <svl/style.hxx> |
| #include <svx/xflclit.hxx> |
| #include <editeng/eeitem.hxx> |
| #include <editeng/colritem.hxx> |
| #include <svl/whiter.hxx> |
| #include <svx/xgrad.hxx> |
| #include <svx/xflgrit.hxx> |
| #include <svx/xbtmpit.hxx> |
| #include <svx/xlnclit.hxx> |
| #include <editeng/adjitem.hxx> |
| #include <editeng/editeng.hxx> |
| #include <editeng/bulitem.hxx> |
| #include <editeng/lrspitem.hxx> |
| #include <editeng/lspcitem.hxx> |
| #include <editeng/tstpitem.hxx> |
| |
| #include <sfx2/docinf.hxx> |
| |
| #include "glob.hrc" |
| #include "pptin.hxx" |
| #include "Outliner.hxx" |
| #include "drawdoc.hxx" |
| #include "sdpage.hxx" |
| #include "sdresid.hxx" |
| #include "pres.hxx" |
| #include "sdresid.hxx" |
| #include "stlpool.hxx" |
| #include "anminfo.hxx" |
| #include <svx/gallery.hxx> |
| #include <tools/urlobj.hxx> |
| #include <editeng/numitem.hxx> |
| #include <svl/itempool.hxx> |
| #include <editeng/fhgtitem.hxx> |
| #include <svx/svdopage.hxx> |
| #include <svx/svdomedia.hxx> |
| #include <svx/svdogrp.hxx> |
| #include "propread.hxx" |
| #include <cusshow.hxx> |
| #include <vcl/bmpacc.hxx> |
| |
| #include "../../ui/inc/DrawDocShell.hxx" |
| #include "../../ui/inc/FrameView.hxx" |
| #include "../../ui/inc/optsitem.hxx" |
| |
| #include <unotools/fltrcfg.hxx> |
| #include <sfx2/progress.hxx> |
| #include <unotools/localfilehelper.hxx> |
| #include <editeng/editstat.hxx> |
| #include <unotools/pathoptions.hxx> |
| #include <sfx2/docfac.hxx> |
| #define MAX_USER_MOVE 2 |
| |
| #include "pptinanimations.hxx" |
| #include "ppt97animations.hxx" |
| |
| #include <com/sun/star/document/XDocumentProperties.hpp> |
| #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> |
| |
| |
| using namespace ::com::sun::star; |
| |
| |
| SdPPTImport::SdPPTImport( SdDrawDocument* pDocument, SvStream& rDocStream, SvStorage& rStorage, SfxMedium& rMedium, MSFilterTracer* pTracer ) |
| { |
| |
| sal_uInt32 nImportFlags = 0; |
| |
| #ifdef DBG_UTIL |
| PropRead* pSummaryInformation = new PropRead( rStorage, String( RTL_CONSTASCII_USTRINGPARAM( "\005SummaryInformation" ) ) ); |
| if ( pSummaryInformation->IsValid() ) |
| { |
| pSummaryInformation->Read(); |
| sal_uInt8 aPropSetGUID[ 16 ] = |
| { |
| 0xe0, 0x85, 0x9f, 0xf2, 0xf9, 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9 |
| }; |
| Section* pSection = (Section*)pSummaryInformation->GetSection( aPropSetGUID ); |
| if ( pSection ) |
| { |
| PropItem aPropItem; |
| if ( pSection->GetProperty( PID_COMMENTS, aPropItem ) ) |
| { |
| String aComment; |
| aPropItem.Read( aComment ); |
| if ( aComment.Search( String( RTL_CONSTASCII_USTRINGPARAM( "Applixware" ) ), 0 ) != STRING_NOTFOUND ) |
| { |
| nImportFlags |= PPT_IMPORTFLAGS_NO_TEXT_ASSERT; |
| } |
| } |
| } |
| } |
| delete pSummaryInformation; |
| #endif |
| |
| PowerPointImportParam aParam( rDocStream, nImportFlags, pTracer ); |
| SvStream* pCurrentUserStream = rStorage.OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "Current User" ) ), STREAM_STD_READ ); |
| if( pCurrentUserStream ) |
| { |
| *pCurrentUserStream >> aParam.aCurrentUserAtom; |
| delete pCurrentUserStream; |
| } |
| |
| if( pDocument ) |
| { |
| // iterate over all styles |
| SdStyleSheetPool* pStyleSheetPool = pDocument->GetSdStyleSheetPool(); |
| |
| sal_uInt32 nStyles = pStyleSheetPool ? pStyleSheetPool->GetStyles().size() : 0; |
| for (sal_uInt32 nStyle = 0; nStyle < nStyles; nStyle++) |
| { |
| SfxStyleSheet* pSheet = static_cast<SfxStyleSheet*>( pStyleSheetPool->GetStyles()[nStyle].get() ); |
| SfxItemSet& rSet = pSheet->GetItemSet(); |
| |
| // if autokerning is set in style, override it, ppt has no autokerning |
| if( rSet.GetItemState( EE_CHAR_PAIRKERNING, sal_False ) == SFX_ITEM_SET ) |
| rSet.ClearItem( EE_CHAR_PAIRKERNING ); |
| } |
| } |
| |
| pFilter = new ImplSdPPTImport( pDocument, rStorage, rMedium, aParam ); |
| } |
| |
| sal_Bool SdPPTImport::Import() |
| { |
| return pFilter->Import(); |
| } |
| |
| SdPPTImport::~SdPPTImport() |
| { |
| delete pFilter; |
| } |
| |
| ImplSdPPTImport::ImplSdPPTImport( SdDrawDocument* pDocument, SvStorage& rStorage_, SfxMedium& rMedium, PowerPointImportParam& rParam ) |
| : SdrPowerPointImport ( rParam, rMedium.GetBaseURL() ) |
| , mrMed ( rMedium ) |
| , mrStorage ( rStorage_ ) |
| , mbDocumentFound ( sal_False ) |
| , mnFilterOptions ( 0 ) |
| { |
| mpDoc = pDocument; |
| if ( bOk ) |
| { |
| mbDocumentFound = SeekToDocument( &maDocHd ); // maDocHd = the latest DocumentHeader |
| while ( SeekToRec( rStCtrl, PPT_PST_Document, nStreamLen, &maDocHd ) ) |
| mbDocumentFound = sal_True; |
| |
| sal_uInt32 nDggContainerOfs = 0; |
| |
| if ( mbDocumentFound ) |
| { |
| sal_uLong nPosMerk = rStCtrl.Tell(); |
| |
| pStData = rStorage_.OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "Pictures" ) ), STREAM_STD_READ ); |
| |
| rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); |
| sal_uLong nDocLen = maDocHd.GetRecEndFilePos(); |
| DffRecordHeader aPPDGHd; |
| if ( SeekToRec( rStCtrl, PPT_PST_PPDrawingGroup, nDocLen, &aPPDGHd ) ) |
| { |
| sal_uLong nPPDGLen = aPPDGHd.GetRecEndFilePos(); |
| if ( SeekToRec( rStCtrl, DFF_msofbtDggContainer, nPPDGLen, NULL ) ) |
| nDggContainerOfs = rStCtrl.Tell(); |
| } |
| rStCtrl.Seek( nPosMerk ); |
| } |
| sal_uInt32 nSvxMSDffOLEConvFlags2 = 0; |
| |
| SvtFilterOptions* pBasOpt = SvtFilterOptions::Get(); |
| if ( pBasOpt ) |
| { |
| if ( pBasOpt->IsLoadPPointBasicCode() ) |
| mnFilterOptions |= 1; |
| if ( pBasOpt->IsMathType2Math() ) |
| nSvxMSDffOLEConvFlags2 |= OLE_MATHTYPE_2_STARMATH; |
| if ( pBasOpt->IsWinWord2Writer() ) |
| nSvxMSDffOLEConvFlags2 |= OLE_WINWORD_2_STARWRITER; |
| if ( pBasOpt->IsExcel2Calc() ) |
| nSvxMSDffOLEConvFlags2 |= OLE_EXCEL_2_STARCALC; |
| if ( pBasOpt->IsPowerPoint2Impress() ) |
| nSvxMSDffOLEConvFlags2 |= OLE_POWERPOINT_2_STARIMPRESS; |
| } |
| |
| InitSvxMSDffManager( nDggContainerOfs, pStData, nSvxMSDffOLEConvFlags2 ); |
| SetSvxMSDffSettings( SVXMSDFF_SETTINGS_CROP_BITMAPS |
| | SVXMSDFF_SETTINGS_IMPORT_PPT ); |
| SetModel( mpDoc, 576 ); |
| } |
| } |
| |
| ////////////////////////////////////////////////////////////////////////// |
| // |
| // Dtor |
| // |
| ////////////////////////////////////////////////////////////////////////// |
| |
| ImplSdPPTImport::~ImplSdPPTImport() |
| { |
| for ( void* pPtr = maSlideNameList.First(); pPtr; pPtr = maSlideNameList.Next() ) |
| delete (String*)pPtr; |
| delete pStData; |
| } |
| |
| ////////////////////////////////////////////////////////////////////////// |
| // |
| // Import |
| // |
| ////////////////////////////////////////////////////////////////////////// |
| |
| sal_Bool ImplSdPPTImport::Import() |
| { |
| if ( !bOk ) |
| return sal_False; |
| |
| pSdrModel->setLock( sal_True ); |
| pSdrModel->EnableUndo(false); |
| |
| SdrOutliner& rOutl = mpDoc->GetDrawOutliner(); |
| sal_uInt32 nControlWord = rOutl.GetEditEngine().GetControlWord(); |
| nControlWord |= EE_CNTRL_ULSPACESUMMATION; |
| nControlWord &=~ EE_CNTRL_ULSPACEFIRSTPARA; |
| ((EditEngine&)rOutl.GetEditEngine()).SetControlWord( nControlWord ); |
| |
| SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin(); |
| mnBackgroundLayerID = rAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRND )), sal_False ); |
| mnBackgroundObjectsLayerID = rAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRNDOBJ )), sal_False ); |
| |
| ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh(); |
| if ( pDocShell ) |
| SeekOle( pDocShell, mnFilterOptions ); |
| |
| // hyperlinks |
| PropRead* pDInfoSec2 = new PropRead( mrStorage, String( RTL_CONSTASCII_USTRINGPARAM( "\005DocumentSummaryInformation" ) ) ); |
| if ( pDInfoSec2->IsValid() ) |
| { |
| PropItem aPropItem; |
| |
| sal_uInt32 nType, nPropSize, nPropCount; |
| |
| pDInfoSec2->Read(); |
| |
| sal_uInt8 aPropSetGUID[ 16 ] = |
| { |
| 0x02, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae |
| }; |
| Section* pSection = (Section*)pDInfoSec2->GetSection( aPropSetGUID ); |
| if ( pSection ) |
| { |
| if ( pSection->GetProperty( PID_SLIDECOUNT, aPropItem ) ) |
| { |
| aPropItem >> nType; |
| if ( ( nType == VT_I4 ) || ( nType == VT_UI4 ) ) |
| { |
| // examine PID_HEADINGPAIR to get the correct entry for PID_DOCPARTS |
| sal_uInt32 nSlideCount, nVecCount; |
| aPropItem >> nSlideCount; |
| if ( nSlideCount && pSection->GetProperty( PID_HEADINGPAIR, aPropItem ) ) |
| { |
| sal_uInt32 nSlideTitleIndex = 0, nSlideTitleCount = 0; |
| sal_uInt32 nFontIndex, nFontCount = 0; |
| sal_uInt32 nDesignTemplateIndex, nDesignTemplateCount = 0; |
| sal_uInt32 i, nTemp, nEntryCount = 0; |
| |
| String aUString; |
| |
| aPropItem >> nType |
| >> nVecCount; |
| |
| if ( ( nType == ( VT_VARIANT | VT_VECTOR ) ) && ( nVecCount ^ 1 ) ) |
| { |
| nVecCount >>= 1; |
| |
| for ( i = 0; i < nVecCount; i++ ) |
| { |
| if ( !aPropItem.Read( aUString, VT_EMPTY, sal_False ) ) |
| break; |
| aPropItem >> nType; |
| if ( ( nType != VT_I4 ) && ( nType != VT_UI4 ) ) |
| break; |
| aPropItem >> nTemp; |
| if ( aUString.EqualsAscii("Slide Titles") || aUString.EqualsAscii("Folientitel") ) |
| { |
| nSlideTitleCount = nTemp; |
| nSlideTitleIndex = nEntryCount; |
| } |
| else if ( aUString.EqualsAscii("Fonts Used") ) |
| { |
| nFontCount = nTemp; |
| nFontIndex = nEntryCount; |
| } |
| else if ( aUString.EqualsAscii("Design Template") ) |
| { |
| nDesignTemplateCount = nTemp; |
| nDesignTemplateIndex = nEntryCount; |
| } |
| nEntryCount += nTemp; |
| } |
| } |
| if ( ( nSlideCount == nSlideTitleCount ) && pSection->GetProperty( PID_DOCPARTS, aPropItem ) ) |
| { |
| aPropItem >> nType |
| >> nVecCount; |
| |
| if ( ( nVecCount >= ( nSlideTitleIndex + nSlideTitleCount ) ) |
| && ( nType == ( VT_LPSTR | VT_VECTOR ) ) ) |
| { |
| for ( i = 0; i != nSlideTitleIndex; i++ ) |
| { |
| aPropItem >> nTemp; |
| aPropItem.SeekRel( nTemp ); |
| } |
| for ( i = 0; i < nSlideTitleCount; i++ ) |
| { |
| if ( !aPropItem.Read( aUString, nType, sal_False ) ) |
| break; |
| String* pString = new String( aUString ); |
| if ( pString->EqualsAscii( "No Slide Title" )) |
| *pString = String(); |
| else |
| { |
| void* pPtr; |
| for ( pPtr = maSlideNameList.First(); pPtr; pPtr = maSlideNameList.Next() ) |
| { |
| if ( *((String*)pPtr ) == *pString ) |
| { |
| *pString = String(); |
| break; |
| } |
| } |
| } |
| maSlideNameList.Insert( pString, LIST_APPEND ); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| sal_uInt8 aUserPropSetGUID[ 16 ] = |
| { |
| 0x05, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae |
| }; |
| pSection = (Section*)pDInfoSec2->GetSection( aUserPropSetGUID ); |
| if ( pSection ) |
| { |
| Dictionary aDict; |
| if ( pSection->GetDictionary( aDict ) ) |
| { |
| sal_uInt32 nPropId = aDict.GetProperty( rtl::OUString::createFromAscii("_PID_HLINKS" )); |
| if ( nPropId ) |
| { |
| if ( pSection->GetProperty( nPropId, aPropItem ) ) |
| { |
| aPropItem.Seek( STREAM_SEEK_TO_BEGIN ); |
| aPropItem >> nType; |
| if ( nType == VT_BLOB ) |
| { |
| aPropItem >> nPropSize |
| >> nPropCount; |
| |
| if ( ! ( nPropCount % 6 ) ) |
| { |
| sal_uInt32 i; |
| |
| nPropCount /= 6; // 6 propertys a hyperlink |
| |
| SdHyperlinkEntry* pHyperlink = 0; |
| for ( i = 0; i < nPropCount; i++ ) |
| { |
| pHyperlink = new SdHyperlinkEntry; |
| pHyperlink->nIndex = 0; |
| aPropItem >> nType; |
| if ( nType != VT_I4 ) |
| break; |
| aPropItem >> pHyperlink->nPrivate1 |
| >> nType; |
| if ( nType != VT_I4 ) |
| break; |
| aPropItem >> pHyperlink->nPrivate2 |
| >> nType; |
| if ( nType != VT_I4 ) |
| break; |
| aPropItem >> pHyperlink->nPrivate3 |
| >> nType; |
| if ( nType != VT_I4 ) |
| break; |
| aPropItem >> pHyperlink->nInfo; |
| if ( !aPropItem.Read( pHyperlink->aTarget, VT_EMPTY ) ) |
| break; |
| if ( !aPropItem.Read( pHyperlink->aSubAdress, VT_EMPTY ) ) |
| break; |
| pHyperlink->nStartPos = pHyperlink->nEndPos = -1; |
| |
| if ( pHyperlink->aSubAdress.Len() ) // get the converted subadress |
| { |
| sal_uInt32 nPageNumber = 0; |
| String aString( pHyperlink->aSubAdress ); |
| ByteString aStringAry[ 3 ]; |
| sal_uInt16 nTokenCount = aString.GetTokenCount( ',' ); |
| if ( nTokenCount > 3 ) |
| nTokenCount = 3; |
| sal_uInt16 nToken; |
| for( nToken = 0; nToken < nTokenCount; nToken++ ) |
| aStringAry[ nToken ] = ByteString( aString.GetToken( nToken, (sal_Unicode)',' ), RTL_TEXTENCODING_UTF8 ); |
| |
| sal_Bool bDocInternalSubAddress = sal_False; |
| |
| // first pass, searching for a SlideId |
| for( nToken = 0; nToken < nTokenCount; nToken++ ) |
| { |
| if ( aStringAry[ nToken ].IsNumericAscii() ) |
| { |
| sal_Int32 nNumber = aStringAry[ nToken ].ToInt32(); |
| if ( nNumber & ~0xff ) |
| { |
| PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE ); |
| if ( pPageList ) |
| { |
| sal_uInt16 nPage = pPageList->FindPage( nNumber ); |
| if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND ) |
| { |
| nPageNumber = nPage; |
| bDocInternalSubAddress = sal_True; |
| break; |
| } |
| } |
| } |
| } |
| } |
| if ( !bDocInternalSubAddress ) |
| { // second pass, searching for a SlideName |
| for ( nToken = 0; nToken < nTokenCount; nToken++ ) |
| { |
| for ( void* pPtr = maSlideNameList.First(); pPtr; pPtr = maSlideNameList.Next() ) |
| { |
| if ( ByteString(*(String*)pPtr, RTL_TEXTENCODING_UTF8 ) == aStringAry[ nToken ] ) |
| { |
| nPageNumber = maSlideNameList.GetCurPos(); |
| bDocInternalSubAddress = sal_True; |
| break; |
| } |
| } |
| } |
| } |
| if ( !bDocInternalSubAddress ) |
| { // third pass, searching for a slide number |
| for ( nToken = 0; nToken < nTokenCount; nToken++ ) |
| { |
| if ( aStringAry[ nToken ].IsNumericAscii() ) |
| { |
| sal_Int32 nNumber = aStringAry[ nToken ].ToInt32(); |
| if ( ( nNumber & ~0xff ) == 0 ) |
| { |
| nPageNumber = (sal_uInt32)nNumber - 1; |
| bDocInternalSubAddress = sal_True; |
| break; |
| } |
| } |
| } |
| } |
| // if a document internal sub address |
| if ( bDocInternalSubAddress ) |
| { |
| if ( nPageNumber < maSlideNameList.Count() ) |
| pHyperlink->aConvSubString = *(String*)maSlideNameList.GetObject( nPageNumber ); |
| if ( !pHyperlink->aConvSubString.Len() ) |
| { |
| pHyperlink->aConvSubString = String( SdResId( STR_PAGE ) ); |
| pHyperlink->aConvSubString.Append( sal_Unicode( ' ' ) ); |
| pHyperlink->aConvSubString.Append( mpDoc->CreatePageNumValue( (sal_uInt16)nPageNumber + 1 ) ); |
| } |
| } else { |
| // if sub address is given but not internal, use it as it is |
| if ( !pHyperlink->aConvSubString.Len() ) |
| { |
| pHyperlink->aConvSubString = aString; |
| } |
| } |
| } |
| aHyperList.Insert( pHyperlink, LIST_APPEND ); |
| } |
| if ( i != nPropCount ) |
| delete pHyperlink; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| delete pDInfoSec2; |
| |
| if ( mbDocumentFound ) |
| { |
| rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); |
| // HyperList lesen / Indexe der einzelnen Eintraege setzen |
| DffRecordHeader aHyperHd; |
| if ( SeekToRec( rStCtrl, PPT_PST_ExObjList, maDocHd.GetRecEndFilePos(), &aHyperHd ) ) |
| { |
| sal_uInt32 nExObjHyperListLen = aHyperHd.GetRecEndFilePos(); |
| for ( void* pPtr = aHyperList.First(); pPtr; pPtr = aHyperList.Next() ) |
| { |
| DffRecordHeader aHyperE; |
| if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlink, nExObjHyperListLen, &aHyperE ) ) |
| break; |
| if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlinkAtom, nExObjHyperListLen, NULL, 0 ) ) |
| break; |
| rStCtrl.SeekRel( 8 ); |
| rStCtrl >> ((SdHyperlinkEntry*)pPtr)->nIndex; |
| aHyperE.SeekToEndOfRecord( rStCtrl ); |
| } |
| } |
| } |
| |
| Size aVisAreaSize; |
| switch ( aUserEditAtom.eLastViewType ) |
| { |
| case 5 : // notes master |
| case 3 : // notes |
| aVisAreaSize = aDocAtom.GetNotesPageSize(); |
| break; |
| default : |
| aVisAreaSize = aDocAtom.GetSlidesPageSize(); |
| } |
| Scale( aVisAreaSize ); |
| pDocShell->SetVisArea( Rectangle( Point(), aVisAreaSize ) ); |
| |
| /////////////////////////////////////////////////////////// |
| // create master pages: |
| /////////////////////////////////////////////////////////// |
| SfxProgress* pStbMgr = new SfxProgress( pDocShell, String( SdResId( STR_POWERPOINT_IMPORT ) ), |
| pMasterPages->Count() + pSlidePages->Count() + pNotePages->Count() ); |
| |
| sal_uInt32 nImportedPages = 0; |
| { |
| sal_uInt16 nMasterAnz = GetPageCount( PPT_MASTERPAGE ); |
| |
| for ( sal_uInt16 nMasterNum = 0; nMasterNum < nMasterAnz; nMasterNum++ ) |
| { |
| SetPageNum( nMasterNum, PPT_MASTERPAGE ); |
| SdPage* pPage = (SdPage*)MakeBlancPage( sal_True ); |
| if ( pPage ) |
| { |
| sal_Bool bNotesMaster = (*GetPageList( eAktPageKind ) )[ nAktPageNum ]->bNotesMaster; |
| sal_Bool bStarDrawFiller = (*GetPageList( eAktPageKind ) )[ nAktPageNum ]->bStarDrawFiller; |
| |
| PageKind ePgKind = ( bNotesMaster ) ? PK_NOTES : PK_STANDARD; |
| sal_Bool bHandout = (*GetPageList( eAktPageKind ) )[ nAktPageNum ]->bHandoutMaster; |
| if ( bHandout ) |
| ePgKind = PK_HANDOUT; |
| |
| pPage->SetPageKind( ePgKind ); |
| pSdrModel->InsertMasterPage( (SdrPage*)pPage ); |
| if ( bNotesMaster && bStarDrawFiller ) |
| ((SdPage*)pPage)->SetAutoLayout( AUTOLAYOUT_NOTES, sal_True ); |
| if ( nMasterNum ) |
| { |
| boost::optional< sal_Int16 > oStartNumbering; |
| SfxStyleSheet* pSheet; |
| if ( nMasterNum == 1 ) |
| { |
| /////////////////// |
| // standardsheet // |
| /////////////////// |
| pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( String(SdResId( STR_STANDARD_STYLESHEET_NAME )), SD_STYLE_FAMILY_GRAPHICS ); |
| if ( pSheet ) |
| { |
| SfxItemSet& rItemSet = pSheet->GetItemSet(); |
| PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 ); |
| PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 ); |
| aParagraph.AppendPortion( aPortion ); |
| aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL ); |
| aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff ); |
| } |
| } |
| |
| // PSEUDO |
| pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( String(SdResId( STR_PSEUDOSHEET_BACKGROUNDOBJECTS )), SD_STYLE_FAMILY_PSEUDO ); |
| if ( pSheet ) |
| { |
| SfxItemSet& rItemSet = pSheet->GetItemSet(); |
| PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 ); |
| PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 ); |
| aParagraph.AppendPortion( aPortion ); |
| aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL ); |
| aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff ); |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // create layoutstylesheets, set layoutname and stylesheet |
| // (nur auf Standard- und Notizseiten) |
| /////////////////////////////////////////////////////////// |
| String aLayoutName( SdResId( STR_LAYOUT_DEFAULT_NAME ) ); |
| if ( nMasterNum > 2 ) |
| { |
| if ( ePgKind == PK_STANDARD ) |
| { // Standardseite: Neues Praesentationslayout erzeugen |
| aLayoutName = String( SdResId( STR_LAYOUT_DEFAULT_TITLE_NAME ) ); |
| aLayoutName += String::CreateFromInt32( (sal_Int32)( ( nMasterNum + 1 ) / 2 - 1 ) ); |
| ( (SdStyleSheetPool*)mpDoc->GetStyleSheetPool() )->CreateLayoutStyleSheets( aLayoutName ); |
| } |
| else // Notizseite: Praesentationslayout von der Standardseite verwenden |
| aLayoutName = ( (SdPage*)mpDoc->GetMasterPage( nMasterNum - 1 ) )->GetName(); |
| } |
| pPage->SetName( aLayoutName ); |
| aLayoutName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR )); |
| aLayoutName += String( SdResId( STR_LAYOUT_OUTLINE ) ); |
| pPage->SetLayoutName( aLayoutName ); |
| |
| ///////////////////// |
| // set stylesheets // |
| ///////////////////// |
| if ( pPage->GetPageKind() == PK_STANDARD ) |
| { |
| sal_uInt32 nTitleInstance = TSS_TYPE_PAGETITLE; |
| sal_uInt32 nOutlinerInstance = TSS_TYPE_BODY; |
| const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom(); |
| sal_Bool bSwapStyleSheet = pSlideLayout->eLayout == PPT_LAYOUT_TITLEMASTERSLIDE; |
| if ( bSwapStyleSheet ) |
| { |
| nTitleInstance = TSS_TYPE_TITLE; |
| nOutlinerInstance = TSS_TYPE_SUBTITLE; |
| } |
| ///////////////////// |
| // titelstylesheet // |
| ///////////////////// |
| pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE ); |
| if ( pSheet ) |
| { |
| SfxItemSet& rItemSet = pSheet->GetItemSet(); |
| PPTParagraphObj aParagraph( *pPPTStyleSheet, nTitleInstance, 0 ); |
| PPTPortionObj aPortion( *pPPTStyleSheet, nTitleInstance, 0 ); |
| aParagraph.AppendPortion( aPortion ); |
| aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL ); |
| aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff ); |
| } |
| //////////////////////// |
| // outlinerstylesheet // |
| //////////////////////// |
| sal_uInt16 nLevel; |
| PPTParagraphObj* pParagraphs[ 9 ]; |
| PPTParagraphObj* pPreviousPara = NULL; |
| |
| for ( nLevel = 0; nLevel < 9; nLevel++ ) |
| { |
| String aName( pPage->GetLayoutName() ); |
| aName.Append( (sal_Unicode)( ' ' ) ); |
| aName.Append( String::CreateFromInt32( nLevel + 1 ) ); |
| SfxStyleSheet* pOutlineSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( aName, SD_STYLE_FAMILY_MASTERPAGE ); |
| DBG_ASSERT( pOutlineSheet, "Vorlage fuer Gliederungsobjekt nicht gefunden" ); |
| if ( pOutlineSheet ) |
| { |
| pParagraphs[ nLevel ] = new PPTParagraphObj( *pPPTStyleSheet, nOutlinerInstance, nLevel ); |
| SfxItemSet& rItemSet = pOutlineSheet->GetItemSet(); |
| PPTPortionObj aPortion( *pPPTStyleSheet, nOutlinerInstance, nLevel ); |
| pParagraphs[ nLevel ]->AppendPortion( aPortion ); |
| pParagraphs[ nLevel ]->ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, pPreviousPara ); |
| aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff ); |
| pPreviousPara = pParagraphs[ nLevel ]; |
| } |
| else |
| pParagraphs[ nLevel ] = NULL; |
| } |
| for ( nLevel = 0; nLevel < 9; delete pParagraphs[ nLevel++ ] ) ; |
| ///////////////////////// |
| // subtitle stylesheet // |
| ///////////////////////// |
| pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TEXT ); |
| if ( pSheet ) |
| { |
| SfxItemSet& rItemSet = pSheet->GetItemSet(); |
| PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_SUBTITLE, 0 ); |
| PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_SUBTITLE, 0 ); |
| aParagraph.AppendPortion( aPortion ); |
| aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL ); |
| aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff ); |
| } |
| } |
| else if ( ePgKind == PK_NOTES ) |
| { |
| pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_NOTES ); |
| if ( pSheet ) |
| { |
| SfxItemSet& rItemSet = pSheet->GetItemSet(); |
| PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_NOTES, 0 ); |
| PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_NOTES, 0 ); |
| aParagraph.AppendPortion( aPortion ); |
| aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL ); |
| aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff ); |
| } |
| } |
| } |
| } |
| } |
| } |
| SdPage* pMPage; |
| sal_uInt16 i; |
| for ( i = 0; i < mpDoc->GetMasterPageCount() && ( (pMPage = (SdPage*)mpDoc->GetMasterPage( i )) != 0 ); i++ ) |
| { |
| SetPageNum( i, PPT_MASTERPAGE ); |
| ///////////////////////////////////////////// |
| // importing master page objects // |
| ///////////////////////////////////////////// |
| PptSlidePersistList* pList = GetPageList( eAktPageKind ); |
| PptSlidePersistEntry* pPersist = ( pList && ( nAktPageNum < pList->Count() ) ) |
| ? (*pList)[ nAktPageNum ] : NULL; |
| if ( pPersist ) |
| { |
| if ( pPersist->bStarDrawFiller && pPersist->bNotesMaster && ( nAktPageNum > 2 ) && ( ( nAktPageNum & 1 ) == 0 ) ) |
| { |
| pSdrModel->DeleteMasterPage( nAktPageNum ); |
| SdrPage* pNotesClone = ((SdPage*)pSdrModel->GetMasterPage( 2 ))->Clone(); |
| pSdrModel->InsertMasterPage( pNotesClone, nAktPageNum ); |
| if ( pNotesClone ) |
| { |
| String aLayoutName( ((SdPage*)pSdrModel->GetMasterPage( nAktPageNum - 1 ))->GetLayoutName() ); |
| ((SdPage*)pNotesClone)->SetPresentationLayout( aLayoutName, sal_False, sal_False, sal_False ); |
| ((SdPage*)pNotesClone)->SetLayoutName( aLayoutName ); |
| } |
| } |
| else if ( pPersist->bStarDrawFiller == sal_False ) |
| { |
| PptSlidePersistEntry* pE = pPersist; |
| while( ( pE->aSlideAtom.nFlags & 4 ) && pE->aSlideAtom.nMasterId ) |
| { |
| sal_uInt16 nNextMaster = pMasterPages->FindPage( pE->aSlideAtom.nMasterId ); |
| if ( nNextMaster == PPTSLIDEPERSIST_ENTRY_NOTFOUND ) |
| break; |
| else |
| pE = (*pList)[ nNextMaster ]; |
| } |
| SdrObject* pObj = ImportPageBackgroundObject( *pMPage, pE->nBackgroundOffset, sal_True ); // import background |
| if ( pObj ) |
| pMPage->NbcInsertObject( pObj ); |
| |
| sal_Bool bNewAnimationsUsed = sal_False; |
| ProcessData aProcessData( *(*pList)[ nAktPageNum ], (SdPage*)pMPage ); |
| sal_uInt32 nFPosMerk = rStCtrl.Tell(); |
| DffRecordHeader aPageHd; |
| if ( SeekToAktPage( &aPageHd ) ) |
| { |
| if ( mbTracing ) |
| mpTracer->AddAttribute( rtl::OUString::createFromAscii( "MasterPage" ), rtl::OUString::valueOf( (sal_Int32) (nAktPageNum + 1) ) ); |
| |
| while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPageHd.GetRecEndFilePos() ) ) |
| { |
| DffRecordHeader aHd; |
| rStCtrl >> aHd; |
| switch( aHd.nRecType ) |
| { |
| case PPT_PST_PPDrawing : |
| { |
| aHd.SeekToBegOfRecord( rStCtrl ); |
| DffRecordHeader aPPDrawHd; |
| if ( SeekToRec( rStCtrl, PPT_PST_PPDrawing, aHd.GetRecEndFilePos(), &aPPDrawHd ) ) |
| { |
| sal_uInt32 nPPDrawEnd = aPPDrawHd.GetRecEndFilePos(); |
| DffRecordHeader aEscherF002Hd; |
| if ( SeekToRec( rStCtrl, DFF_msofbtDgContainer, nPPDrawEnd, &aEscherF002Hd ) ) |
| { |
| sal_uInt32 nEscherF002End = aEscherF002Hd.GetRecEndFilePos(); |
| DffRecordHeader aEscherObjListHd; |
| if ( SeekToRec( rStCtrl, DFF_msofbtSpgrContainer, nEscherF002End, &aEscherObjListHd ) ) |
| { |
| sal_uInt32 nObjCount = 0; |
| while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aEscherObjListHd.GetRecEndFilePos() ) ) |
| { |
| DffRecordHeader aHd2; |
| rStCtrl >> aHd2; |
| if ( ( aHd2.nRecType == DFF_msofbtSpContainer ) || ( aHd2.nRecType == DFF_msofbtSpgrContainer ) ) |
| { |
| if ( nObjCount++ ) // skipping the first object |
| { |
| Rectangle aEmpty; |
| aHd2.SeekToBegOfRecord( rStCtrl ); |
| SdrObject* pImpObj = ImportObj( rStCtrl, (void*)&aProcessData, aEmpty, aEmpty ); |
| if ( pImpObj ) |
| { |
| pImpObj->SetLayer( mnBackgroundObjectsLayerID ); |
| pMPage->NbcInsertObject( pImpObj ); |
| } |
| } |
| } |
| aHd2.SeekToEndOfRecord( rStCtrl ); |
| } |
| } |
| } |
| } |
| } |
| break; |
| |
| case PPT_PST_ProgTags : |
| { |
| DffRecordHeader aProgTagHd; |
| if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) ) |
| { |
| while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aProgTagHd.GetRecEndFilePos() ) ) |
| { |
| DffRecordHeader aProgTagContentHd; |
| rStCtrl >> aProgTagContentHd; |
| switch( aProgTagContentHd.nRecType ) |
| { |
| case DFF_msofbtAnimGroup : |
| { |
| ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > xPage( pMPage->getUnoPage(), ::com::sun::star::uno::UNO_QUERY ); |
| ppt::AnimationImporter aImporter( this, rStCtrl ); |
| aImporter.import( xPage, aProgTagContentHd ); |
| bNewAnimationsUsed = sal_True; |
| } |
| break; |
| } |
| aProgTagContentHd.SeekToEndOfRecord( rStCtrl ); |
| } |
| } |
| } |
| break; |
| } |
| aHd.SeekToEndOfRecord( rStCtrl ); |
| } |
| if ( mbTracing ) |
| mpTracer->RemoveAttribute( rtl::OUString::createFromAscii( "MasterPage" ) ); |
| } |
| rStCtrl.Seek( nFPosMerk ); |
| ImportPageEffect( (SdPage*)pMPage, bNewAnimationsUsed ); |
| |
| /////////////////////// |
| // background object // |
| /////////////////////// |
| pObj = pMPage->GetObj( 0 ); |
| if ( pObj && pObj->GetObjIdentifier() == OBJ_RECT ) |
| { |
| if ( pMPage->GetPageKind() == PK_STANDARD ) |
| { |
| // transform data from imported background object to new form |
| // and delete the object. It was used as container to transport |
| // the attributes of the MasterPage background fill |
| SfxStyleSheet* pSheet = pMPage->GetStyleSheetForMasterPageBackground(); |
| |
| if(pSheet) |
| { |
| // if we have a StyleSheet (for Masterpages), set attributes there and use it |
| pSheet->GetItemSet().ClearItem(); |
| pSheet->GetItemSet().Put(pObj->GetMergedItemSet()); |
| pMPage->getSdrPageProperties().ClearItem(); |
| pMPage->getSdrPageProperties().SetStyleSheet(pSheet); |
| } |
| else |
| { |
| // without StyleSheet, set attributes directly. This |
| // should not be done at all and is an error (will be asserted by SdrPage) |
| pMPage->getSdrPageProperties().ClearItem(); |
| pMPage->getSdrPageProperties().PutItemSet(pObj->GetMergedItemSet()); |
| } |
| |
| pMPage->RemoveObject(pObj->GetOrdNum()); |
| SdrObject::Free(pObj); |
| } |
| } |
| } |
| } |
| if( pStbMgr ) |
| pStbMgr->SetState( nImportedPages++ ); |
| } |
| //////////////////////////////////// |
| // importing slide pages // |
| //////////////////////////////////// |
| { |
| sal_uInt32 nFPosMerk = rStCtrl.Tell(); |
| PptPageKind ePageKind = eAktPageKind; |
| sal_uInt16 nPageNum = nAktPageNum; |
| |
| SdPage* pHandoutPage = (SdPage*)MakeBlancPage( sal_False ); |
| pHandoutPage->SetPageKind( PK_HANDOUT ); |
| pSdrModel->InsertPage( pHandoutPage ); |
| |
| sal_uInt16 nPageAnz = GetPageCount( PPT_SLIDEPAGE ); |
| if ( nPageAnz ) |
| { |
| for ( sal_uInt16 nPage = 0; nPage < nPageAnz; nPage++ ) |
| { |
| sal_Bool bNewAnimationsUsed = sal_False; |
| |
| mePresChange = PRESCHANGE_SEMIAUTO; |
| SetPageNum( nPage, PPT_SLIDEPAGE ); |
| SdPage* pPage = (SdPage*)MakeBlancPage( sal_False ); |
| PptSlidePersistEntry* pMasterPersist = NULL; |
| if ( HasMasterPage( nPage, PPT_SLIDEPAGE ) ) // try to get the LayoutName from the masterpage |
| { |
| sal_uInt16 nMasterNum = GetMasterPageIndex( nAktPageNum, eAktPageKind ); |
| pPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nMasterNum)); |
| PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE ); |
| if ( pPageList && nMasterNum < pPageList->Count() ) |
| pMasterPersist = (*pPageList)[ nMasterNum ]; |
| pPage->SetLayoutName(((SdPage&)pPage->TRG_GetMasterPage()).GetLayoutName()); |
| } |
| pPage->SetPageKind( PK_STANDARD ); |
| pSdrModel->InsertPage( pPage ); // SJ: #i29625# because of form controls, the |
| ImportPage( pPage, pMasterPersist ); // page must be inserted before importing |
| SetHeaderFooterPageSettings( pPage, pMasterPersist ); |
| // CWS preseng01: pPage->SetPageKind( PK_STANDARD ); |
| |
| DffRecordHeader aPageHd; |
| if ( SeekToAktPage( &aPageHd ) ) |
| { |
| aPageHd.SeekToContent( rStCtrl ); |
| while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPageHd.GetRecEndFilePos() ) ) |
| { |
| DffRecordHeader aHd; |
| rStCtrl >> aHd; |
| switch ( aHd.nRecType ) |
| { |
| case PPT_PST_ProgTags : |
| { |
| DffRecordHeader aProgTagHd; |
| if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) ) |
| { |
| while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aProgTagHd.GetRecEndFilePos() ) ) |
| { |
| DffRecordHeader aProgTagContentHd; |
| rStCtrl >> aProgTagContentHd; |
| switch( aProgTagContentHd.nRecType ) |
| { |
| /* |
| case PPT_PST_CommentContainer : |
| { |
| |
| } |
| break; |
| */ |
| case DFF_msofbtAnimGroup : |
| { |
| ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > xPage( pPage->getUnoPage(), ::com::sun::star::uno::UNO_QUERY ); |
| ppt::AnimationImporter aImporter( this, rStCtrl ); |
| aImporter.import( xPage, aProgTagContentHd ); |
| bNewAnimationsUsed = sal_True; |
| } |
| break; |
| |
| case PPT_PST_NewlyAddedAtomByXP11008 : // ??? |
| break; |
| |
| case PPT_PST_NewlyAddedAtomByXP12011 : // ??? don't know, this atom is always 8 bytes big |
| break; // and is appearing in nearly every l10 progtag |
| } |
| aProgTagContentHd.SeekToEndOfRecord( rStCtrl ); |
| } |
| } |
| } |
| break; |
| |
| case PPT_PST_HeadersFooters : |
| case PPT_PST_PPDrawing : |
| default: |
| break; |
| } |
| |
| aHd.SeekToEndOfRecord( rStCtrl ); |
| } |
| ImportPageEffect( (SdPage*)pPage, bNewAnimationsUsed ); |
| } |
| |
| // creating the corresponding note page |
| eAktPageKind = PPT_NOTEPAGE; |
| SdPage* pNotesPage = (SdPage*)MakeBlancPage( sal_False ); |
| sal_uInt16 nNotesMasterNum = GetMasterPageIndex( nPage, PPT_SLIDEPAGE ) + 1; |
| sal_uInt32 nNotesPageId = GetNotesPageId( nPage ); |
| if ( nNotesPageId ) |
| { |
| nImportedPages++; |
| sal_uInt16 nNotesPageIndex = pNotePages->FindPage( nNotesPageId ); |
| if ( nNotesPageIndex == PPTSLIDEPERSIST_ENTRY_NOTFOUND ) |
| nNotesPageIndex = 0; |
| SetPageNum( nNotesPageIndex, PPT_NOTEPAGE ); |
| PptSlidePersistEntry* pMasterPersist2 = NULL; |
| if ( HasMasterPage( nNotesPageIndex, PPT_NOTEPAGE ) ) // try to get the LayoutName from the masterpage |
| { |
| pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum)); |
| PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE ); |
| if ( pPageList && nNotesMasterNum < pPageList->Count() ) |
| pMasterPersist2 = (*pPageList)[ nNotesMasterNum ]; |
| pNotesPage->SetLayoutName( ((SdPage&)pNotesPage->TRG_GetMasterPage()).GetLayoutName() ); |
| } |
| pNotesPage->SetPageKind( PK_NOTES ); |
| pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum)); |
| pSdrModel->InsertPage( pNotesPage ); // SJ: #i29625# because of form controls, the |
| ImportPage( pNotesPage, pMasterPersist2 ); // page must be inserted before importing |
| SetHeaderFooterPageSettings( pNotesPage, pMasterPersist2 ); |
| pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES, sal_False ); |
| } |
| else |
| { |
| pNotesPage->SetPageKind( PK_NOTES ); |
| pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum)); |
| pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES, sal_True ); |
| pSdrModel->InsertPage( pNotesPage ); |
| SdrObject* pPageObj = pNotesPage->GetPresObj( PRESOBJ_PAGE, 1 ); |
| if ( pPageObj ) |
| ((SdrPageObj*)pPageObj)->SetReferencedPage(pSdrModel->GetPage(( nPage << 1 ) + 1)); |
| } |
| |
| if( pStbMgr ) |
| pStbMgr->SetState( nImportedPages++ ); |
| } |
| ////////////// |
| } |
| else |
| { |
| // Das kann bei Dokumentvorlagen vorkommen |
| eAktPageKind = PPT_SLIDEPAGE; |
| SdrPage* pPage = MakeBlancPage( sal_False ); |
| pSdrModel->InsertPage( pPage ); |
| |
| // #i37397#, trying to set the title master for the first page |
| sal_uInt16 nMaster, nMasterCount = pSdrModel->GetMasterPageCount(); |
| SdPage* pFoundMaster = NULL; |
| for ( nMaster = 1; nMaster < nMasterCount; nMaster++ ) |
| { |
| SdPage* pMaster = static_cast<SdPage*>( pSdrModel->GetMasterPage( nMaster ) ); |
| if ( pMaster->GetPageKind() == PK_STANDARD ) |
| { |
| SetPageNum( nMaster, PPT_MASTERPAGE ); |
| if ( !pFoundMaster ) |
| pFoundMaster = pMaster; |
| else if ( GetSlideLayoutAtom()->eLayout == PPT_LAYOUT_TITLEMASTERSLIDE ) |
| pFoundMaster = pMaster; |
| if ( GetSlideLayoutAtom()->eLayout == PPT_LAYOUT_TITLEMASTERSLIDE ) |
| break; |
| } |
| } |
| if ( pFoundMaster ) |
| { |
| ((SdPage*)pPage)->TRG_SetMasterPage( *((SdPage*)pFoundMaster) ); |
| ((SdPage*)pPage)->SetLayoutName( ((SdPage*)pFoundMaster)->GetLayoutName() ); |
| } |
| ((SdPage*)pPage)->SetAutoLayout( AUTOLAYOUT_TITLE, sal_True, sal_True ); |
| |
| eAktPageKind = PPT_NOTEPAGE; |
| SdrPage* pNPage = MakeBlancPage( sal_False ); |
| pSdrModel->InsertPage( pNPage ); |
| } |
| SetPageNum( nPageNum, ePageKind ); |
| rStCtrl.Seek( nFPosMerk ); |
| } |
| /////////////////////////////////////////////////////////////////// |
| // Handzettel und Notiz-Seiten erzeugen // |
| /////////////////////////////////////////////////////////////////// |
| bOk = mpDoc->CreateMissingNotesAndHandoutPages(); |
| if ( bOk ) |
| { |
| for ( i = 0; i < mpDoc->GetSdPageCount( PK_STANDARD ); i++ ) |
| { |
| //////////////////// |
| // set AutoLayout // |
| //////////////////// |
| SetPageNum( i, PPT_SLIDEPAGE ); |
| SdPage* pPage = mpDoc->GetSdPage( i, PK_STANDARD ); |
| AutoLayout eAutoLayout = AUTOLAYOUT_NONE; |
| const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom(); |
| if ( pSlideLayout ) |
| { |
| switch ( pSlideLayout->eLayout ) // Praesentationslayouts fuer Standard-Seiten |
| { |
| case PPT_LAYOUT_TITLEANDBODYSLIDE : |
| { |
| eAutoLayout = AUTOLAYOUT_ENUM; |
| sal_uInt16 nID1 = pSlideLayout->aPlaceholderId[ 1 ]; |
| switch ( nID1 ) |
| { |
| case PPT_PLACEHOLDER_BODY : |
| eAutoLayout = AUTOLAYOUT_ENUM; |
| break; |
| case PPT_PLACEHOLDER_TABLE : |
| eAutoLayout = AUTOLAYOUT_TAB; |
| break; |
| case PPT_PLACEHOLDER_ORGANISZATIONCHART : |
| eAutoLayout = AUTOLAYOUT_ORG; |
| break; |
| case PPT_PLACEHOLDER_GRAPH : |
| eAutoLayout = AUTOLAYOUT_CHART; |
| break; |
| case PPT_PLACEHOLDER_OBJECT : |
| eAutoLayout = AUTOLAYOUT_OBJ; |
| break; |
| case PPT_PLACEHOLDER_VERTICALTEXTBODY : |
| eAutoLayout = AUTOLAYOUT_TITLE_VERTICAL_OUTLINE; |
| break; |
| } |
| } |
| break; |
| |
| case PPT_LAYOUT_2COLUMNSANDTITLE : |
| { |
| eAutoLayout = AUTOLAYOUT_2TEXT; |
| sal_uInt16 nID1 = pSlideLayout->aPlaceholderId[ 1 ]; |
| sal_uInt16 nID2 = pSlideLayout->aPlaceholderId[ 2 ]; |
| if ( nID1 == PPT_PLACEHOLDER_BODY && nID2 == PPT_PLACEHOLDER_GRAPH ) |
| eAutoLayout = AUTOLAYOUT_TEXTCHART; |
| else if ( nID1 == PPT_PLACEHOLDER_GRAPH && nID2 == PPT_PLACEHOLDER_BODY ) |
| eAutoLayout = AUTOLAYOUT_CHARTTEXT; |
| else if ( nID1 == PPT_PLACEHOLDER_BODY && nID2 == PPT_PLACEHOLDER_CLIPART ) |
| eAutoLayout = AUTOLAYOUT_TEXTCLIP; |
| else if ( nID1 == PPT_PLACEHOLDER_CLIPART && nID2 == PPT_PLACEHOLDER_BODY ) |
| eAutoLayout = AUTOLAYOUT_CLIPTEXT; |
| else if ( nID1 == PPT_PLACEHOLDER_CLIPART && nID2 == PPT_PLACEHOLDER_VERTICALTEXTBODY ) |
| eAutoLayout = AUTOLAYOUT_TITLE_VERTICAL_OUTLINE_CLIPART; |
| else if ( ( nID1 == PPT_PLACEHOLDER_BODY ) |
| && ( ( nID2 == PPT_PLACEHOLDER_OBJECT ) || ( nID2 == PPT_PLACEHOLDER_MEDIACLIP ) ) ) |
| eAutoLayout = AUTOLAYOUT_TEXTOBJ; |
| else if ( ( nID2 == PPT_PLACEHOLDER_BODY ) |
| && ( ( nID1 == PPT_PLACEHOLDER_OBJECT ) || ( nID1 == PPT_PLACEHOLDER_MEDIACLIP ) ) ) |
| eAutoLayout = AUTOLAYOUT_OBJTEXT; |
| else if ( ( nID1 == PPT_PLACEHOLDER_OBJECT ) && ( nID2 == PPT_PLACEHOLDER_OBJECT ) ) |
| eAutoLayout = AUTOLAYOUT_OBJ; |
| } |
| break; |
| |
| case PPT_LAYOUT_2ROWSANDTITLE : |
| { |
| eAutoLayout = AUTOLAYOUT_2TEXT; |
| sal_uInt16 nID1 = pSlideLayout->aPlaceholderId[ 1 ]; |
| sal_uInt16 nID2 = pSlideLayout->aPlaceholderId[ 2 ]; |
| if ( nID1 == PPT_PLACEHOLDER_BODY && nID2 == PPT_PLACEHOLDER_OBJECT ) |
| eAutoLayout = AUTOLAYOUT_TEXTOVEROBJ; |
| else if ( nID1 == PPT_PLACEHOLDER_OBJECT && nID2 == PPT_PLACEHOLDER_BODY ) |
| eAutoLayout = AUTOLAYOUT_OBJOVERTEXT; |
| } |
| break; |
| |
| case PPT_LAYOUT_TITLESLIDE : |
| eAutoLayout = AUTOLAYOUT_TITLE; |
| break; |
| case PPT_LAYOUT_ONLYTITLE : |
| eAutoLayout = AUTOLAYOUT_ONLY_TITLE; |
| break; |
| case PPT_LAYOUT_RIGHTCOLUMN2ROWS : |
| eAutoLayout = AUTOLAYOUT_TEXT2OBJ; |
| break; |
| case PPT_LAYOUT_LEFTCOLUMN2ROWS : |
| eAutoLayout = AUTOLAYOUT_2OBJTEXT; |
| break; |
| case PPT_LAYOUT_TOPROW2COLUMN : |
| eAutoLayout = AUTOLAYOUT_2OBJOVERTEXT; |
| break; |
| case PPT_LAYOUT_4OBJECTS : |
| eAutoLayout = AUTOLAYOUT_4OBJ; |
| break; |
| case PPT_LAYOUT_BIGOBJECT : |
| eAutoLayout = AUTOLAYOUT_OBJ; |
| break; |
| case PPT_LAYOUT_TITLERIGHTBODYLEFT : |
| eAutoLayout = AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE; // AUTOLAYOUT_ENUM; |
| break; |
| case PPT_LAYOUT_TITLERIGHT2BODIESLEFT : |
| eAutoLayout = AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART; // AUTOLAYOUT_TEXT2OBJ; |
| break; |
| |
| case PPT_LAYOUT_BOTTOMROW2COLUMNS : |
| case PPT_LAYOUT_BLANCSLIDE : |
| case PPT_LAYOUT_MASTERSLIDE : // Layout der Standard- und Titel-MasterPage |
| case PPT_LAYOUT_TITLEMASTERSLIDE : |
| case PPT_LAYOUT_MASTERNOTES : // Layout der Notizen-MasterPage |
| case PPT_LAYOUT_NOTESTITLEBODY : // Praesentationslayout fuer Notiz-Seiten |
| case PPT_LAYOUT_HANDOUTLAYOUT : // Praesentationslayout fuer Handzettelseiten |
| eAutoLayout = AUTOLAYOUT_NONE; |
| break; |
| } |
| if ( eAutoLayout != AUTOLAYOUT_NONE ) |
| pPage->SetAutoLayout( eAutoLayout, sal_False ); |
| } |
| } |
| ////////////////////////////////////////////////////////////// |
| // Handzettel-MasterPage: Autolayout setzen // |
| ////////////////////////////////////////////////////////////// |
| SdPage* pHandoutMPage = mpDoc->GetMasterSdPage( 0, PK_HANDOUT ); |
| pHandoutMPage->SetAutoLayout( AUTOLAYOUT_HANDOUT6, sal_True, sal_True ); |
| } |
| |
| sal_uInt32 nSlideCount = GetPageCount(); |
| for ( i = 0; ( i < nSlideCount) && ( i < maSlideNameList.Count() ); i++ ) |
| { |
| SdPage* pPage = mpDoc->GetSdPage( i, PK_STANDARD ); |
| String* pName = (String*)maSlideNameList.GetObject( i ); |
| if ( pPage && pName ) |
| { |
| if ( pName->Len() ) |
| pPage->SetName( *pName ); |
| else |
| *pName = pPage->GetName(); |
| } |
| } |
| if ( mbDocumentFound ) |
| { |
| mpDoc->SetSummationOfParagraphs( sal_True ); |
| if ( pDocShell ) |
| { |
| ::sd::FrameView* pFrameView = mpDoc->GetFrameView( 0 ); |
| if ( !pFrameView ) |
| { |
| List* pFrameViewList = mpDoc->GetFrameViewList(); |
| if ( pFrameViewList ) |
| { |
| pFrameView = new ::sd::FrameView( mpDoc ); |
| if ( pFrameView ) |
| pFrameViewList->Insert( pFrameView ); |
| } |
| } |
| if ( pFrameView ) |
| { |
| sal_uInt16 nSelectedPage = 0; |
| PageKind ePageKind = PK_STANDARD; |
| EditMode eEditMode = EM_PAGE; |
| |
| switch ( aUserEditAtom.eLastViewType ) |
| { |
| case 7 : // outliner view |
| { |
| SfxItemSet* pSet = mrMed.GetItemSet(); |
| if ( pSet ) |
| pSet->Put( SfxUInt16Item( SID_VIEW_ID, 3 ) ); |
| } |
| break; |
| case 8 : // slide sorter |
| { |
| SfxItemSet* pSet = mrMed.GetItemSet(); |
| if ( pSet ) |
| pSet->Put( SfxUInt16Item( SID_VIEW_ID, 2 ) ); |
| } |
| break; |
| case 10 : // titlemaster |
| nSelectedPage = 1; |
| case 2 : // master |
| { |
| ePageKind = PK_STANDARD; |
| eEditMode = EM_MASTERPAGE; |
| } |
| break; |
| case 5 : // notes master |
| eEditMode = EM_MASTERPAGE; |
| case 3 : // notes |
| ePageKind = PK_NOTES; |
| break; |
| case 4 : // handout |
| ePageKind = PK_HANDOUT; |
| break; |
| default : |
| case 1 : // normal |
| break; |
| } |
| pFrameView->SetPageKind( ePageKind ); |
| pFrameView->SetSelectedPage( nSelectedPage ); |
| pFrameView->SetViewShEditMode( eEditMode, ePageKind ); |
| } |
| } |
| DffRecordHeader aCustomShowHeader; |
| // custom show einlesen und setzen |
| rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); |
| if ( SeekToRec( rStCtrl, PPT_PST_NamedShows, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) ) |
| { |
| DffRecordHeader aCuHeader; |
| while( SeekToRec( rStCtrl, PPT_PST_NamedShow, aCustomShowHeader.GetRecEndFilePos(), &aCuHeader ) ) |
| { |
| DffRecordHeader aContent; |
| if ( SeekToRec( rStCtrl, PPT_PST_CString, aCuHeader.GetRecEndFilePos(), &aContent ) ) |
| { |
| String aCuShow; |
| aContent.SeekToBegOfRecord( rStCtrl ); |
| if ( ReadString( aCuShow ) ) |
| { |
| if ( SeekToRec( rStCtrl, PPT_PST_NamedShowSlides, aCuHeader.GetRecEndFilePos(), &aContent ) ) |
| { |
| PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE ); |
| sal_uInt32 nSCount = aContent.nRecLen >> 2; |
| if ( pPageList && nSCount ) |
| { |
| List* pList = mpDoc->GetCustomShowList( sal_True ); |
| if ( pList ) |
| { |
| SdCustomShow* pSdCustomShow = new SdCustomShow( mpDoc ); |
| if ( pSdCustomShow ) |
| { |
| pSdCustomShow->SetName( aCuShow ); |
| sal_uInt32 nFound = 0; |
| for ( sal_uInt32 nS = 0; nS < nSCount; nS++ ) |
| { |
| sal_uInt32 nPageNumber; |
| rStCtrl >> nPageNumber; |
| sal_uInt16 nPage = pPageList->FindPage( nPageNumber ); |
| if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND ) |
| { |
| SdPage* pPage = mpDoc->GetSdPage( nPage, PK_STANDARD ); |
| if ( pPage ) |
| { |
| pSdCustomShow->Insert( pPage, LIST_APPEND ); |
| nFound++; |
| } |
| } |
| } |
| if ( nFound ) |
| pList->Insert( pSdCustomShow, LIST_APPEND ); |
| else |
| delete pSdCustomShow; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| // this is defaulted, maybe there is no SSDocInfoAtom |
| String aCustomShow; |
| sal_uInt32 nFlags = 1; // Bit 0: Auto advance |
| sal_uInt32 nPenColor = 0x1000000; |
| sal_Int32 nRestartTime = 0x7fffffff; |
| sal_uInt16 nStartSlide = 0; |
| sal_Int16 nEndSlide = 0; |
| |
| // read the pres. configuration |
| rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 ); |
| if ( SeekToRec( rStCtrl, PPT_PST_SSDocInfoAtom, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) ) |
| { |
| rStCtrl >> nPenColor |
| >> nRestartTime |
| >> nStartSlide |
| >> nEndSlide; |
| |
| sal_Unicode nChar; |
| for ( sal_uInt32 i2 = 0; i2 < 32; i2++ ) |
| { |
| rStCtrl >> nChar; |
| if ( nChar ) |
| aCustomShow.Append( nChar ); |
| else |
| { |
| rStCtrl.SeekRel( ( 31 - i2 ) << 1 ); |
| break; |
| } |
| } |
| rStCtrl >> nFlags; |
| } |
| // set the current custom show |
| if ( aCustomShow.Len() ) |
| { |
| void* pPtr; |
| List* pList = mpDoc->GetCustomShowList( sal_False ); |
| if ( pList ) |
| { |
| for ( pPtr = pList->First(); pPtr; pPtr = pList->Next() ) |
| { |
| if ( ((SdCustomShow*)pPtr)->GetName() == aCustomShow ) |
| break; |
| } |
| if ( !pPtr ) |
| pList->First(); |
| } |
| } |
| sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings(); |
| |
| rPresSettings.mbManual = ( nFlags & 1 ) == 0; |
| rPresSettings.mbAnimationAllowed = ( nFlags & 2 ) == 0; |
| rPresSettings.mbAll = ( nFlags & 4 ) == 0; |
| rPresSettings.mbCustomShow = ( nFlags & 8 ) != 0; |
| rPresSettings.mbEndless = ( nFlags & 0x80 ) != 0; |
| rPresSettings.mbFullScreen = ( nFlags & 0x10 ) == 0; |
| // rPresSettings.mnPauseTimeout; |
| // rPresSettings.mbShowLogo; |
| if ( nStartSlide && ( nStartSlide <= GetPageCount() ) ) |
| { |
| SdPage* pPage = mpDoc->GetSdPage( nStartSlide - 1, PK_STANDARD ); |
| if ( pPage ) |
| rPresSettings.maPresPage = pPage->GetName(); |
| } |
| } |
| |
| delete pStbMgr; |
| |
| // read DocumentInfo |
| uno::Reference<document::XDocumentPropertiesSupplier> xDPS( |
| mpDoc->GetObjectShell()->GetModel(), uno::UNO_QUERY_THROW); |
| uno::Reference<document::XDocumentProperties> xDocProps |
| = xDPS->getDocumentProperties(); |
| sfx2::LoadOlePropertySet(xDocProps, &mrStorage); |
| xDocProps->setTemplateName(::rtl::OUString()); |
| |
| pSdrModel->setLock( sal_False ); |
| pSdrModel->EnableUndo(true); |
| return bOk; |
| } |
| |
| void ImplSdPPTImport::SetHeaderFooterPageSettings( SdPage* pPage, const PptSlidePersistEntry* pMasterPersist ) |
| { |
| sal_uInt32 i; |
| PptSlidePersistList* pList = GetPageList( eAktPageKind ); |
| if ( ( !pList ) || ( pList->Count() <= nAktPageNum ) ) |
| return; |
| PptSlidePersistEntry& rSlidePersist = *(*pList)[ nAktPageNum ]; |
| HeaderFooterEntry* pHFE = rSlidePersist.pHeaderFooterEntry; |
| if ( pHFE ) |
| { |
| for ( i = 0; i < 4; i++ ) |
| { |
| bool bVisible = pHFE->IsToDisplay( i ); |
| if ( ( eAktPageKind == PPT_SLIDEPAGE ) |
| && ( rSlidePersist.aSlideAtom.aLayout.eLayout == PPT_LAYOUT_TITLESLIDE ) |
| && ( aDocAtom.bTitlePlaceholdersOmitted == sal_True ) ) |
| { |
| bVisible = sal_False; |
| } |
| if ( bVisible && pMasterPersist ) |
| { |
| sal_uInt32 nPosition = pHFE->NeedToImportInstance( i, rSlidePersist ); |
| if ( nPosition ) |
| { |
| Rectangle aEmpty; |
| bVisible = sal_False; |
| rStCtrl.Seek( nPosition ); |
| ProcessData aProcessData( rSlidePersist, (SdPage*)pPage ); |
| SdrObject* pObj = ImportObj( rStCtrl, (void*)&aProcessData, aEmpty, aEmpty ); |
| if ( pObj ) |
| pPage->NbcInsertObject( pObj, 0 ); |
| } |
| } |
| String aPlaceHolderString; |
| if ( pHFE->pPlaceholder ) |
| aPlaceHolderString = pHFE->pPlaceholder[ i ]; |
| |
| sd::HeaderFooterSettings rHeaderFooterSettings( pPage->getHeaderFooterSettings() ); |
| switch( i ) |
| { |
| case 0 : |
| { |
| rHeaderFooterSettings.mbDateTimeVisible = bVisible; |
| rHeaderFooterSettings.mbDateTimeIsFixed = ( pHFE->nAtom & 0x20000 ) == 0; |
| rHeaderFooterSettings.maDateTimeText = aPlaceHolderString; |
| SvxDateFormat eDateFormat; |
| SvxTimeFormat eTimeFormat; |
| PPTFieldEntry::GetDateTime( pHFE->nAtom & 0xff, eDateFormat, eTimeFormat ); |
| rHeaderFooterSettings.meDateTimeFormat = eDateFormat | ( eTimeFormat << 4 ); |
| } |
| break; |
| case 1 : |
| { |
| rHeaderFooterSettings.mbHeaderVisible = bVisible; |
| rHeaderFooterSettings.maHeaderText = aPlaceHolderString; |
| } |
| break; |
| case 2 : |
| { |
| rHeaderFooterSettings.mbFooterVisible = bVisible; |
| rHeaderFooterSettings.maFooterText = aPlaceHolderString; |
| } |
| break; |
| case 3 : |
| { |
| rHeaderFooterSettings.mbSlideNumberVisible = bVisible; |
| } |
| break; |
| } |
| pPage->setHeaderFooterSettings( rHeaderFooterSettings ); |
| } |
| } |
| } |
| |
| ////////////////////////////////////////////////////////////////////////// |
| // |
| // Import von Seiten |
| // |
| ////////////////////////////////////////////////////////////////////////// |
| |
| struct Ppt97AnimationStlSortHelper |
| { |
| bool operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 ); |
| }; |
| |
| bool Ppt97AnimationStlSortHelper::operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 ) |
| { |
| if( !p1.second.get() || !p2.second.get() ) |
| return true; |
| if( *p1.second < *p2.second ) |
| return true; |
| if( *p1.second > *p2.second ) |
| return false; |
| if( p1.first->GetOrdNum() < p2.first->GetOrdNum() ) |
| return true; |
| return false; |
| } |
| |
| void ImplSdPPTImport::ImportPageEffect( SdPage* pPage, const sal_Bool bNewAnimationsUsed ) |
| { |
| sal_uLong nFilePosMerk = rStCtrl.Tell(); |
| |
| // PageKind an der Seite setzen (bisher nur PK_STANDARD oder PK_NOTES) |
| if ( pPage->GetPageKind() == PK_STANDARD ) |
| { |
| PptSlidePersistList* pPersistList = GetPageList( eAktPageKind ); |
| PptSlidePersistEntry* pActualSlidePersist = ( pPersistList && ( nAktPageNum < pPersistList->Count() ) ) |
| ? (*pPersistList)[ nAktPageNum ] : NULL; |
| |
| if ( pActualSlidePersist && ( eAktPageKind == PPT_SLIDEPAGE ) ) |
| { |
| if ( ! ( pActualSlidePersist->aSlideAtom.nFlags & 1 ) ) // do not follow master objects ? |
| { |
| if(pPage->TRG_HasMasterPage()) |
| { |
| SetOfByte aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers(); |
| aVisibleLayers.Set(mnBackgroundObjectsLayerID, sal_False); |
| pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers); |
| } |
| } |
| } |
| DffRecordHeader aPageRecHd; |
| if ( pPage && SeekToAktPage( &aPageRecHd ) ) |
| { |
| sal_uLong nPageRecEnd = aPageRecHd.GetRecEndFilePos(); |
| |
| sal_Bool bTryTwice = ( eAktPageKind == PPT_SLIDEPAGE ); |
| sal_Bool bSSSlideInfoAtom = sal_False; |
| while ( sal_True ) |
| { |
| while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nPageRecEnd ) ) |
| { |
| DffRecordHeader aHd; |
| rStCtrl >> aHd; |
| switch ( aHd.nRecType ) |
| { |
| case PPT_PST_SSSlideInfoAtom: |
| { |
| bSSSlideInfoAtom = sal_True; |
| if ( eAktPageKind == PPT_MASTERPAGE ) |
| { |
| if ( pActualSlidePersist ) |
| pActualSlidePersist->aPersistAtom.nReserved = aHd.GetRecBegFilePos(); |
| } |
| else |
| { |
| sal_Int8 nDirection, nTransitionType, nByteDummy, nSpeed; |
| sal_Int16 nBuildFlags; |
| sal_Int32 nSlideTime, nSoundRef; |
| rStCtrl >> nSlideTime // Standzeit (in Ticks) |
| >> nSoundRef // Index in SoundCollection |
| >> nDirection // Richtung des Ueberblendeffekts |
| >> nTransitionType // Ueberblendeffekt |
| >> nBuildFlags // Buildflags (s.u.) |
| >> nSpeed // Geschwindigkeit (langsam, mittel, schnell) |
| >> nByteDummy >> nByteDummy >> nByteDummy; |
| |
| switch ( nTransitionType ) |
| { |
| case PPT_TRANSITION_TYPE_BLINDS : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_VERTICAL_STRIPES );// Vertikal blenden |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_HORIZONTAL_STRIPES );// Horizontal blenden |
| } |
| break; |
| case PPT_TRANSITION_TYPE_CHECKER : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_HORIZONTAL_CHECKERBOARD );// Vertikal versetzt einblenden ?? |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_VERTICAL_CHECKERBOARD );// Horizontal versetzt einblenden ?? |
| } |
| break; |
| case PPT_TRANSITION_TYPE_COVER : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_RIGHT ); // Von rechts ueberdecken |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_BOTTOM ); // Von unten ueberdecken |
| else if ( nDirection == 2 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_LEFT ); // Von links ueberdecken |
| else if ( nDirection == 3 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_TOP ); // Von oben ueberdecken |
| else if ( nDirection == 4 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_LOWERRIGHT );// Von rechts unten ueberdecken ?? |
| else if ( nDirection == 5 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_LOWERLEFT ); // Von links unten ueberdecken ?? |
| else if ( nDirection == 6 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_UPPERRIGHT );// Von rechts oben ueberdecken |
| else if ( nDirection == 7 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_UPPERLEFT ); // Von links oben ueberdecken ?? |
| } |
| break; |
| case PPT_TRANSITION_TYPE_NONE : |
| { |
| if ( nBuildFlags ) |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_NONE ); // Direkt |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_NONE ); // Direkt ueber Schwarz |
| } |
| else |
| pPage->setTransitionType( 0 ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_DISSOLVE : |
| pPage->SetFadeEffect(::com::sun::star::presentation::FadeEffect_DISSOLVE); // Aufloesen |
| break; |
| case PPT_TRANSITION_TYPE_RANDOM_BARS : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_HORIZONTAL_LINES ); // Horizontale Linien |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_VERTICAL_LINES ); // Vertikale Linien |
| } |
| break; |
| case PPT_TRANSITION_TYPE_SPLIT : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_OPEN_VERTICAL ); // Horizontal oeffnen |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_CLOSE_VERTICAL ); // Horizontal schliessen |
| else if ( nDirection == 2 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_OPEN_HORIZONTAL ); // Vertikal oeffnen |
| else if ( nDirection == 3 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_CLOSE_HORIZONTAL );// Vertikal schliessen |
| } |
| break; |
| case PPT_TRANSITION_TYPE_STRIPS : |
| { |
| if ( nDirection == 4 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_LOWERRIGHT );// Diagonal nach links oben |
| else if ( nDirection == 5 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_LOWERLEFT ); // Diagonal nach rechts oben |
| else if ( nDirection == 6 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_UPPERRIGHT );// Diagonal nach links unten |
| else if ( nDirection == 7 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_UPPERLEFT ); // Diagonal nach rechts unten |
| } |
| break; |
| case PPT_TRANSITION_TYPE_PULL : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_LEFT ); // Nach links aufdecken |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_TOP ); // Nach oben aufdecken |
| else if ( nDirection == 2 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_RIGHT ); // Nach rechts aufdecken |
| else if ( nDirection == 3 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_BOTTOM ); // Nach unten aufdecken |
| else if ( nDirection == 4 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_UPPERLEFT );// Nach links oben aufdecken |
| else if ( nDirection == 5 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT );// Nach rechts oben aufdecken |
| else if ( nDirection == 6 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_LOWERLEFT );// Nach links unten aufdecken |
| else if ( nDirection == 7 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT );// Nach rechts unten aufdecken |
| } |
| break; |
| case PPT_TRANSITION_TYPE_WIPE : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_RIGHT ); // Von rechts rollen |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_BOTTOM );// Von unten rollen |
| else if ( nDirection == 2 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_LEFT ); // Von links rollen |
| else if ( nDirection == 3 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_TOP ); // Von oben rollen |
| } |
| break; |
| case PPT_TRANSITION_TYPE_RANDOM : |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_RANDOM ); // Automatisch |
| break; |
| case PPT_TRANSITION_TYPE_FADE : |
| { |
| pPage->setTransitionType( animations::TransitionType::FADE ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::FADEOVERCOLOR ); |
| pPage->setTransitionFadeColor( 0 ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_ZOOM : |
| { |
| if ( nDirection == 0 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_CENTER );// Von innen einblenden |
| else if ( nDirection == 1 ) |
| pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_TO_CENTER ); // Von aussen einblenden |
| } |
| break; |
| case PPT_TRANSITION_TYPE_DIAMOND : |
| { |
| pPage->setTransitionType( animations::TransitionType::IRISWIPE ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::DIAMOND ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_PLUS : |
| { |
| pPage->setTransitionType( animations::TransitionType::FOURBOXWIPE ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::CORNERSOUT ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_CIRCLE : |
| { |
| pPage->setTransitionType( animations::TransitionType::ELLIPSEWIPE ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::CIRCLE ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_WEDGE : |
| { |
| pPage->setTransitionType( animations::TransitionType::FANWIPE ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::CENTERTOP ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_WHEEL : |
| { |
| pPage->setTransitionType( animations::TransitionType::PINWHEELWIPE ); |
| sal_Int16 nSubType; |
| switch( nDirection ) |
| { |
| default: |
| case 1 : nSubType = animations::TransitionSubType::ONEBLADE; break; |
| case 2 : nSubType = animations::TransitionSubType::TWOBLADEVERTICAL; break; |
| case 3 : nSubType = animations::TransitionSubType::THREEBLADE; break; |
| case 4 : nSubType = animations::TransitionSubType::FOURBLADE; break; |
| case 8 : nSubType = animations::TransitionSubType::EIGHTBLADE; break; |
| } |
| pPage->setTransitionSubtype( nSubType ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_PUSH : |
| { |
| pPage->setTransitionType( animations::TransitionType::PUSHWIPE ); |
| sal_Int16 nSubType; |
| switch( nDirection ) |
| { |
| default: |
| case 0 : nSubType = animations::TransitionSubType::FROMRIGHT; break; |
| case 1 : nSubType = animations::TransitionSubType::FROMBOTTOM; break; |
| case 2 : nSubType = animations::TransitionSubType::FROMLEFT; break; |
| case 3 : nSubType = animations::TransitionSubType::FROMTOP; break; |
| } |
| pPage->setTransitionSubtype( nSubType ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_COMB : |
| { |
| pPage->setTransitionType( animations::TransitionType::PUSHWIPE ); |
| pPage->setTransitionSubtype( nDirection ? animations::TransitionSubType::COMBVERTICAL : animations::TransitionSubType::COMBHORIZONTAL ); |
| } |
| break; |
| case PPT_TRANSITION_TYPE_NEWSFLASH : |
| { |
| pPage->setTransitionType( animations::TransitionType::FOURBOXWIPE ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::CORNERSOUT ); |
| /* |
| pPage->setTransitionType( animations::TransitionType::ZOOM ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::ROTATEIN ); |
| */ |
| } |
| break; |
| case PPT_TRANSITION_TYPE_SMOOTHFADE : |
| { |
| pPage->setTransitionType( animations::TransitionType::FADE ); |
| pPage->setTransitionSubtype( animations::TransitionSubType::CROSSFADE ); |
| } |
| break; |
| } |
| |
| if ( nSpeed == 0 ) |
| pPage->setTransitionDuration( 3.0 ); // langsam |
| else if ( nSpeed == 1 ) |
| pPage->setTransitionDuration( 2.0 ); // mittel |
| else if ( nSpeed == 2 ) |
| pPage->setTransitionDuration( 1.0 ); // schnell |
| |
| if ( nBuildFlags & 0x400 ) // slidechange by time |
| { // Standzeit (in Ticks) |
| pPage->SetPresChange( PRESCHANGE_AUTO ); |
| pPage->SetTime( nSlideTime / 1000 ); |
| } |
| else |
| pPage->SetPresChange( mePresChange ); |
| |
| // if ( nBuildFlags & 1 ) // slidechange by mouseclick |
| // pPage->SetPresChange( mePresChange ); |
| |
| if ( nBuildFlags & 4 ) |
| pPage->SetExcluded( sal_True ); // Dia nicht anzeigen |
| if ( nBuildFlags & 16 ) |
| { // Dia mit Soundeffekt |
| pPage->SetSound( sal_True ); |
| String aSoundFile( ReadSound( nSoundRef ) ); |
| pPage->SetSoundFile( aSoundFile ); |
| } |
| if ( nBuildFlags & ( 1 << 6 ) ) // Loop until next sound |
| pPage->SetLoopSound( sal_True ); |
| if ( nBuildFlags & ( 1 << 8 ) ) // Stop the previous sound |
| pPage->SetStopSound( sal_True ); |
| break; |
| } |
| } |
| } |
| aHd.SeekToEndOfRecord( rStCtrl ); |
| } |
| if ( bTryTwice && ( bSSSlideInfoAtom == sal_False ) ) |
| { |
| bTryTwice = sal_False; |
| if ( HasMasterPage( nAktPageNum, eAktPageKind ) ) |
| { |
| sal_uInt16 nMasterNum = GetMasterPageIndex( nAktPageNum, eAktPageKind ); |
| PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE ); |
| if ( pPageList && ( nMasterNum < pPageList->Count() ) ) |
| { |
| PptSlidePersistEntry* pE = (*pPageList)[ nMasterNum ]; |
| if ( pE ) |
| { |
| sal_uInt32 nOfs = pE->aPersistAtom.nReserved; |
| if ( nOfs ) |
| { |
| rStCtrl.Seek( nOfs ); |
| nPageRecEnd = nOfs + 16; |
| continue; |
| } |
| } |
| } |
| |
| } |
| } |
| break; |
| } |
| } |
| } |
| |
| if ( !bNewAnimationsUsed ) |
| { |
| tAnimationVector aAnimationsOnThisPage; |
| |
| // add effects from page in correct order |
| SdrObjListIter aSdrIter( *pPage, IM_FLAT ); |
| while ( aSdrIter.IsMore() ) |
| { |
| SdrObject* pObj = aSdrIter.Next(); |
| tAnimationMap::iterator aFound = maAnimations.find( pObj ); |
| if( aFound != maAnimations.end() ) |
| { |
| std::pair< SdrObject*, Ppt97AnimationPtr > aPair( (*aFound).first, (*aFound).second ); |
| aAnimationsOnThisPage.push_back( aPair ); |
| } |
| } |
| |
| Ppt97AnimationStlSortHelper aSortHelper; |
| std::sort( aAnimationsOnThisPage.begin(), aAnimationsOnThisPage.end(), aSortHelper ); |
| |
| tAnimationVector::iterator aIter( aAnimationsOnThisPage.begin() ); |
| const tAnimationVector::iterator aEnd( aAnimationsOnThisPage.end() ); |
| |
| for( ;aIter != aEnd; aIter++ ) |
| { |
| Ppt97AnimationPtr pPpt97Animation = (*aIter).second;; |
| if( pPpt97Animation.get() ) |
| pPpt97Animation->createAndSetCustomAnimationEffect( (*aIter).first ); |
| } |
| } |
| rStCtrl.Seek( nFilePosMerk ); |
| } |
| |
| ////////////////////////////////////////////////////////////////////////// |
| // |
| // Import von Sounds |
| // |
| // Die Sounds werden nicht nur als String importiert sondern auch |
| // in die Gallery einefuegt, falls dort noch nicht vorhanden. |
| // |
| /////////////////////////////////////////////////////////////////////////// |
| |
| String ImplSdPPTImport::ReadSound(sal_uInt32 nSoundRef) const |
| { |
| String aRetval; |
| sal_uInt32 nPosMerk = rStCtrl.Tell(); |
| DffRecordHeader aDocHd; |
| if ( SeekToDocument( &aDocHd ) ) |
| { |
| sal_uInt32 nSoundLen = aDocHd.GetRecEndFilePos(); |
| DffRecordHeader aSoundBlockRecHd; |
| if( SeekToRec( rStCtrl, PPT_PST_SoundCollection, nSoundLen, &aSoundBlockRecHd ) ) |
| { |
| sal_uInt32 nDataLen = aSoundBlockRecHd.GetRecEndFilePos(); |
| DffRecordHeader aSoundRecHd; |
| sal_Bool bRefStrValid = sal_False; |
| sal_Bool bDone = sal_False; |
| |
| while( !bDone && SeekToRec( rStCtrl, PPT_PST_Sound, nDataLen, &aSoundRecHd ) ) |
| { |
| sal_uInt32 nStrLen = aSoundRecHd.GetRecEndFilePos(); |
| String aRefStr; |
| sal_uInt32 nPosMerk2 = rStCtrl.Tell(); |
| if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen, NULL, 2 ) ) |
| { |
| if ( ReadString( aRefStr ) ) |
| bRefStrValid = sal_True; |
| } |
| if ( bRefStrValid ) |
| { |
| if ( UniString::CreateFromInt32( nSoundRef ) == aRefStr ) |
| { |
| rStCtrl.Seek( nPosMerk2 ); |
| if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen, NULL, 0 ) ) |
| { |
| ReadString( aRetval ); |
| bDone = sal_True; |
| } |
| } |
| } |
| if ( bDone ) |
| { |
| // ueberpruefen, ob diese Sound-Datei schon |
| // existiert. Wenn nicht, exportiere diese |
| // in unser lokales Sound-Verzeichnis. |
| sal_Bool bSoundExists = sal_False; |
| List* pSoundList = new List(); |
| |
| GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, *pSoundList ); |
| GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, *pSoundList ); |
| |
| for( sal_uLong n = 0; ( n < pSoundList->Count() ) && !bSoundExists; n++ ) |
| { |
| INetURLObject aURL( *(String*)pSoundList->GetObject( n ) ); |
| String aSoundName( aURL.GetName() ); |
| |
| if( aSoundName == aRetval ) |
| { |
| aRetval = *(String*)pSoundList->GetObject( n ); |
| bSoundExists = sal_True; |
| } |
| } |
| |
| for ( void* pPtr = pSoundList->First(); pPtr; pPtr = pSoundList->Next() ) |
| delete (String*)pPtr; |
| |
| delete pSoundList; |
| |
| if ( !bSoundExists ) |
| { |
| rStCtrl.Seek( nPosMerk2 ); |
| DffRecordHeader aSoundDataRecHd; |
| if ( SeekToRec( rStCtrl, PPT_PST_SoundData, nStrLen, &aSoundDataRecHd, 0 ) ) |
| { |
| String aGalleryDir( SvtPathOptions().GetGalleryPath() ); |
| INetURLObject aGalleryUserSound( aGalleryDir.GetToken( aGalleryDir.GetTokenCount( ';' ) - 1 ) ); |
| |
| aGalleryUserSound.Append( aRetval ); |
| sal_uInt32 nSoundDataLen = aSoundDataRecHd.nRecLen; |
| sal_uInt8* pBuf = new sal_uInt8[ nSoundDataLen ]; |
| |
| rStCtrl.Read( pBuf, nSoundDataLen ); |
| SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aGalleryUserSound.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC ); |
| |
| if( pOStm ) |
| { |
| pOStm->Write( pBuf, nSoundDataLen ); |
| |
| if( pOStm->GetError() == ERRCODE_NONE ) |
| { |
| GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aGalleryUserSound.GetMainURL( INetURLObject::NO_DECODE ) ); |
| aRetval = aGalleryUserSound.GetMainURL( INetURLObject::NO_DECODE ); |
| } |
| |
| delete pOStm; |
| } |
| |
| delete[] pBuf; |
| } |
| } |
| } |
| if ( !bDone ) |
| aSoundRecHd.SeekToEndOfRecord( rStCtrl ); |
| } |
| } |
| } |
| rStCtrl.Seek( nPosMerk ); |
| return aRetval; |
| } |
| |
| ////////////////////////////////////////////////////////////////////////// |
| // |
| // media object import, the return value is the url to the media object |
| // |
| ////////////////////////////////////////////////////////////////////////// |
| |
| String ImplSdPPTImport::ReadMedia( sal_uInt32 nMediaRef ) const |
| { |
| String aRetVal; |
| DffRecordHeader* pHd( const_cast<ImplSdPPTImport*>(this)->aDocRecManager.GetRecordHeader( PPT_PST_ExObjList, SEEK_FROM_BEGINNING ) ); |
| if ( pHd ) |
| { |
| pHd->SeekToContent( rStCtrl ); |
| while ( ( rStCtrl.Tell() < pHd->GetRecEndFilePos() ) && !aRetVal.Len() ) |
| { |
| DffRecordHeader aHdMovie; |
| rStCtrl >> aHdMovie; |
| switch( aHdMovie.nRecType ) |
| { |
| case PPT_PST_ExAviMovie : |
| case PPT_PST_ExMCIMovie : |
| { |
| DffRecordHeader aExVideoHd; |
| if ( SeekToRec( rStCtrl, PPT_PST_ExVideo, aHdMovie.GetRecEndFilePos(), &aExVideoHd ) ) |
| { |
| DffRecordHeader aExMediaAtomHd; |
| if ( SeekToRec( rStCtrl, PPT_PST_ExMediaAtom, aExVideoHd.GetRecEndFilePos(), &aExMediaAtomHd ) ) |
| { |
| sal_uInt32 nRef; |
| rStCtrl >> nRef; |
| if ( nRef == nMediaRef ) |
| { |
| aExVideoHd.SeekToContent( rStCtrl ); |
| while( rStCtrl.Tell() < aExVideoHd.GetRecEndFilePos() ) |
| { |
| DffRecordHeader aHd; |
| rStCtrl >> aHd; |
| switch( aHd.nRecType ) |
| { |
| case PPT_PST_CString : |
| { |
| aHd.SeekToBegOfRecord( rStCtrl ); |
| String aStr; |
| if ( ReadString( aStr ) ) |
| { |
| if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aStr, aRetVal ) ) |
| { |
| aRetVal = INetURLObject( aRetVal ).GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ); |
| }else{ |
| aRetVal = aStr; |
| } |
| } |
| } |
| break; |
| } |
| aHd.SeekToEndOfRecord( rStCtrl ); |
| } |
| break; |
| } |
| } |
| } |
| } |
| break; |
| } |
| aHdMovie.SeekToEndOfRecord( rStCtrl ); |
| } |
| } |
| return aRetVal; |
| } |
| |
| ////////////////////////////////////////////////////////////////////////// |
| // |
| // Import von Objekten |
| // |
| ////////////////////////////////////////////////////////////////////////// |
| |
| void ImplSdPPTImport::FillSdAnimationInfo( SdAnimationInfo* pInfo, PptInteractiveInfoAtom* pIAtom, String aMacroName ) |
| { |
| // Lokale Informationen in pInfo eintragen |
| if( pIAtom->nSoundRef ) |
| { |
| pInfo->SetBookmark( ReadSound( pIAtom->nSoundRef ) ); // Pfad zum Soundfile in MSDOS-Notation |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_SOUND; // RunProgramAction |
| } |
| // if ( nFlags & 0x01 ) // koennen wir nicht ( beim Anklicken markieren ) |
| switch ( pIAtom->nAction ) |
| { |
| // case 0x01 : // MacroAction |
| // { |
| // pInfo->meClickAction = ::com::sun::star::presentation::::com::sun::star::presentation::ClickAction_MACRO; |
| // // aMacro liegt in folgender Form vor: |
| // // "Macroname.Modulname.Libname.Dokumentname" oder |
| // // "Macroname.Modulname.Libname.Applikationsname" |
| // pInfo->maBookmark = aMacroName; |
| // } |
| // break; |
| case 0x02 : // RunProgramAction |
| { |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PROGRAM; |
| pInfo->SetBookmark( aMacroName ); // Programmname in aBookmark |
| } |
| break; |
| case 0x03 : // JumpAction |
| { |
| switch( pIAtom->nJump ) |
| { |
| case 0x01 : |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_NEXTPAGE; // Next slide |
| break; |
| case 0x02 : |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PREVPAGE; // Previous slide |
| break; |
| case 0x03 : |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_FIRSTPAGE; // First slide |
| break; |
| case 0x04 : |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_LASTPAGE; // last Slide |
| break; |
| case 0x05 : |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PREVPAGE; // Last slide viewed |
| break; |
| case 0x06 : |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_STOPPRESENTATION; // End show |
| break; |
| default : |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_NONE; // 0x00: no action, else unknown |
| break; |
| } |
| } |
| break; |
| case 0x04 : |
| { |
| SdHyperlinkEntry* pPtr; |
| for ( pPtr = (SdHyperlinkEntry*)aHyperList.First(); pPtr; pPtr = (SdHyperlinkEntry*)aHyperList.Next() ) |
| { |
| if ( pPtr->nIndex == pIAtom->nExHyperlinkId ) |
| break; |
| } |
| if ( pPtr ) |
| { |
| switch( pIAtom->nHyperlinkType ) |
| { |
| case 9: |
| case 8: // hyperlink : URL |
| { |
| if ( pPtr->aTarget.Len() ) |
| { |
| ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh(); |
| if ( pDocShell ) |
| { |
| String aBaseURL = pDocShell->GetMedium()->GetBaseURL(); |
| String aBookmarkURL( pInfo->GetBookmark() ); |
| INetURLObject aURL( pPtr->aTarget ); |
| if( INET_PROT_NOT_VALID == aURL.GetProtocol() ) |
| utl::LocalFileHelper::ConvertSystemPathToURL( pPtr->aTarget, aBaseURL, aBookmarkURL ); |
| if( !aBookmarkURL.Len() ) |
| aBookmarkURL = URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), pPtr->aTarget, URIHelper::GetMaybeFileHdl(), true ); |
| pInfo->SetBookmark( aBookmarkURL ); |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PROGRAM; |
| } |
| } |
| } |
| break; |
| |
| case 10: |
| break; |
| |
| case 7: // hyperlink auf eine Seite |
| { |
| if ( pPtr->aConvSubString.Len() ) |
| { |
| pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_BOOKMARK; |
| pInfo->SetBookmark( pPtr->aConvSubString ); |
| } |
| } |
| break; |
| } |
| } |
| } |
| break; |
| case 0x05 : // OLEAction ( OLEVerb to use, 0==first, 1==secnd, .. ) |
| case 0x06 : // MediaAction |
| case 0x07 : // CustomShowAction |
| default : // 0x00: no action, else unknown action |
| break; |
| } |
| } |
| |
| SdrObject* ImplSdPPTImport::ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj* pObj, SdPage* pPage, |
| SfxStyleSheet* pSheet, SfxStyleSheet** ppStyleSheetAry ) const |
| { |
| SfxStyleSheet* pStyleSheetAry[ 9 ]; |
| SdrTextObj* pText = pObj; |
| SdrObject* pRet = pText; |
| |
| ppStyleSheetAry = NULL; |
| |
| PresObjKind ePresKind = PRESOBJ_NONE; |
| PptOEPlaceholderAtom* pPlaceHolder = pTextObj->GetOEPlaceHolderAtom(); |
| String aPresentationText; |
| if ( pPlaceHolder ) |
| { |
| switch( pPlaceHolder->nPlaceholderId ) |
| { |
| case PPT_PLACEHOLDER_MASTERNOTESSLIDEIMAGE : |
| case PPT_PLACEHOLDER_MASTERCENTEREDTITLE : |
| case PPT_PLACEHOLDER_MASTERTITLE : |
| { |
| ePresKind = PRESOBJ_TITLE; |
| aPresentationText = pPage->GetPresObjText( ePresKind ); |
| } |
| break; |
| case PPT_PLACEHOLDER_MASTERBODY : |
| { |
| ePresKind = PRESOBJ_OUTLINE; |
| aPresentationText = pPage->GetPresObjText( ePresKind ); |
| } |
| break; |
| case PPT_PLACEHOLDER_MASTERSUBTITLE : |
| { |
| ePresKind = PRESOBJ_TEXT; |
| aPresentationText = pPage->GetPresObjText( ePresKind ); |
| } |
| break; |
| case PPT_PLACEHOLDER_MASTERNOTESBODYIMAGE : |
| { |
| ePresKind = PRESOBJ_NOTES; |
| aPresentationText = pPage->GetPresObjText( ePresKind ); |
| } |
| break; |
| case PPT_PLACEHOLDER_MASTERDATE : ePresKind = PRESOBJ_DATETIME; break; |
| case PPT_PLACEHOLDER_MASTERSLIDENUMBER : ePresKind = PRESOBJ_SLIDENUMBER;break; |
| case PPT_PLACEHOLDER_MASTERFOOTER : ePresKind = PRESOBJ_FOOTER; break; |
| case PPT_PLACEHOLDER_MASTERHEADER : ePresKind = PRESOBJ_HEADER; break; |
| } |
| } |
| switch ( pTextObj->GetDestinationInstance() ) |
| { |
| case TSS_TYPE_PAGETITLE : |
| case TSS_TYPE_TITLE : |
| { |
| pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE ); |
| if ( pSheet ) |
| ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, sal_True ); |
| DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" ); |
| } |
| break; |
| case TSS_TYPE_SUBTITLE : |
| { |
| pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TEXT ); |
| if ( pSheet ) |
| ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, sal_True ); |
| DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for subtitleobject (SJ)" ); |
| } |
| break; |
| case TSS_TYPE_BODY : |
| case TSS_TYPE_HALFBODY : |
| case TSS_TYPE_QUARTERBODY : |
| { |
| for ( sal_uInt16 nLevel = 9; nLevel; nLevel-- ) |
| { |
| String aName( pPage->GetLayoutName() ); |
| aName.Append( (sal_Unicode)( ' ' ) ); |
| aName.Append( String::CreateFromInt32( nLevel ) ); |
| pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( aName, SD_STYLE_FAMILY_MASTERPAGE ); |
| if ( pSheet ) |
| pText->StartListening( *pSheet ); |
| pStyleSheetAry[ nLevel - 1 ] = pSheet; |
| } |
| DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for outlinerobject (SJ)" ); |
| if ( pSheet ) |
| ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, sal_True ); |
| ppStyleSheetAry = &pStyleSheetAry[ 0 ]; |
| } |
| break; |
| case TSS_TYPE_NOTES : |
| { |
| if ( pPlaceHolder && ( ( pPlaceHolder->nPlaceholderId == PPT_PLACEHOLDER_NOTESSLIDEIMAGE ) |
| || ( pPlaceHolder->nPlaceholderId == PPT_PLACEHOLDER_MASTERNOTESSLIDEIMAGE ) ) ) |
| { |
| pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE ); |
| if ( pSheet ) |
| ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, sal_True ); |
| DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" ); |
| } |
| else |
| { |
| pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_NOTES ); |
| DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for notesobj (SJ)" ); |
| if ( pSheet ) |
| ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, sal_True ); |
| } |
| } |
| break; |
| case TSS_TYPE_UNUSED : |
| case TSS_TYPE_TEXT_IN_SHAPE : |
| { |
| switch( ePresKind ) |
| { |
| case PRESOBJ_DATETIME : |
| case PRESOBJ_SLIDENUMBER : |
| case PRESOBJ_FOOTER : |
| case PRESOBJ_HEADER : |
| pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( String(SdResId( STR_PSEUDOSHEET_BACKGROUNDOBJECTS )), SD_STYLE_FAMILY_PSEUDO ); |
| break; |
| default : |
| pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( String(SdResId( STR_STANDARD_STYLESHEET_NAME )), SD_STYLE_FAMILY_GRAPHICS ); |
| } |
| } |
| break; |
| } |
| pText = (SdrTextObj*)SdrPowerPointImport::ApplyTextObj( pTextObj, pText, pPage, pSheet, ppStyleSheetAry ); |
| if ( pPlaceHolder && pPlaceHolder->nPlaceholderId ) |
| { |
| if ( eAktPageKind == PPT_MASTERPAGE ) |
| { |
| sal_Bool bCreatePlaceHolder = ( pTextObj->GetInstance() != TSS_TYPE_UNUSED ); |
| sal_Bool bIsHeaderFooter = ( ePresKind == PRESOBJ_HEADER) || (ePresKind == PRESOBJ_FOOTER) |
| || (ePresKind == PRESOBJ_DATETIME) || (ePresKind == PRESOBJ_SLIDENUMBER); |
| if ( bCreatePlaceHolder && ( pTextObj->GetInstance() == TSS_TYPE_TEXT_IN_SHAPE ) ) |
| bCreatePlaceHolder = bIsHeaderFooter; |
| if ( bCreatePlaceHolder ) |
| { |
| if ( !bIsHeaderFooter ) |
| { |
| pText->SetNotVisibleAsMaster( sal_True ); |
| pText->SetEmptyPresObj( sal_True ); |
| } |
| pText->SetUserCall( pPage ); |
| pPage->InsertPresObj( pText, ePresKind ); |
| SdrOutliner* pOutl = NULL; |
| if ( pTextObj->GetInstance() == TSS_TYPE_NOTES ) |
| pOutl = GetDrawOutliner( pText ); |
| if ( aPresentationText.Len() ) |
| pPage->SetObjText( (SdrTextObj*)pText, pOutl, ePresKind, aPresentationText ); |
| |
| if ( pPage->GetPageKind() != PK_NOTES && pPage->GetPageKind() != PK_HANDOUT) |
| { |
| SfxStyleSheet* pSheet2( pPage->GetStyleSheetForPresObj( ePresKind ) ); |
| if ( pSheet2 ) |
| { |
| SfxItemSet& rItemSet = pSheet2->GetItemSet(); |
| rItemSet.Put( (SdrTextLeftDistItem&)pText->GetMergedItem( SDRATTR_TEXT_LEFTDIST ) ); |
| rItemSet.Put( (SdrTextRightDistItem&)pText->GetMergedItem( SDRATTR_TEXT_RIGHTDIST ) ); |
| rItemSet.Put( (SdrTextUpperDistItem&)pText->GetMergedItem( SDRATTR_TEXT_UPPERDIST ) ); |
| rItemSet.Put( (SdrTextLowerDistItem&)pText->GetMergedItem( SDRATTR_TEXT_LOWERDIST ) ); |
| rItemSet.Put( (SdrTextVertAdjustItem&)pText->GetMergedItem( SDRATTR_TEXT_VERTADJUST ) ); |
| rItemSet.Put( (SdrTextHorzAdjustItem&)pText->GetMergedItem( SDRATTR_TEXT_HORZADJUST ) ); |
| if ( pTextObj->GetInstance() == TSS_TYPE_TITLE |
| || pTextObj->GetInstance() == TSS_TYPE_SUBTITLE) |
| { |
| rItemSet.Put( pText->GetMergedItemSet() ); |
| } |
| } |
| pText->NbcSetStyleSheet( pSheet2, sal_False ); |
| } |
| |
| SfxItemSet aTempAttr( mpDoc->GetPool() ); |
| SdrTextMinFrameHeightItem aMinHeight( pText->GetLogicRect().GetSize().Height() ); |
| aTempAttr.Put( aMinHeight ); |
| SdrTextAutoGrowHeightItem aAutoGrowHeight( sal_False ); |
| aTempAttr.Put( aAutoGrowHeight ); |
| pText->SetMergedItemSet(aTempAttr); |
| } |
| else |
| { |
| pRet = NULL; |
| } |
| } |
| else |
| { |
| const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom(); |
| if ( pSlideLayout || ( eAktPageKind == PPT_NOTEPAGE ) ) |
| { |
| sal_Int16 nPlaceholderId = pPlaceHolder->nPlaceholderId; |
| sal_uInt16 i = 0; |
| if ( eAktPageKind == PPT_SLIDEPAGE ) |
| { |
| for ( ; i < 8; i++ ) |
| { |
| if ( pSlideLayout->aPlaceholderId[ i ] == nPlaceholderId ) |
| break; |
| } |
| } |
| // [Bug 119962] Placeholder in ppt file created by MS 2007 is lost if load in Impress |
| unsigned int nParaCount = pTextObj->Count(); |
| PPTParagraphObj *pFirstPara = nParaCount == 0 ? NULL : pTextObj->First(); |
| unsigned int nFirstParaTextcount = pFirstPara == NULL ? 0 : pFirstPara->GetTextSize(); |
| if ( i < 8 || ((nParaCount == 1 && nFirstParaTextcount == 0) || nParaCount == 0)) |
| { |
| PresObjKind ePresObjKind = PRESOBJ_NONE; |
| sal_Bool bEmptyPresObj = sal_True; |
| sal_Bool bVertical = sal_False; |
| if ( ( pTextObj->GetShapeType() == mso_sptRectangle ) || ( pTextObj->GetShapeType() == mso_sptTextBox ) ) |
| { |
| //if a placeholder with some custom attribute,the pTextObj will keep those attr,whose text size is zero, |
| //so sdPage should renew a PresObj to process placeholder. |
| if ( pTextObj->Count() > 1 || |
| ( pTextObj->Count() == 1 &&(pTextObj->First()) && pTextObj->First()->GetTextSize()>0 )) |
| bEmptyPresObj = sal_False; |
| switch ( nPlaceholderId ) |
| { |
| case PPT_PLACEHOLDER_NOTESBODY : ePresObjKind = PRESOBJ_NOTES; break; |
| case PPT_PLACEHOLDER_VERTICALTEXTTITLE : |
| bVertical = sal_True; // PASSTHROUGH !!! |
| case PPT_PLACEHOLDER_TITLE : ePresObjKind = PRESOBJ_TITLE; break; |
| case PPT_PLACEHOLDER_VERTICALTEXTBODY : |
| bVertical = sal_True; // PASSTHROUGH !!! |
| case PPT_PLACEHOLDER_BODY : ePresObjKind = PRESOBJ_OUTLINE; break; |
| case PPT_PLACEHOLDER_CENTEREDTITLE : ePresObjKind = PRESOBJ_TITLE; break; |
| case PPT_PLACEHOLDER_SUBTITLE : ePresObjKind = PRESOBJ_TEXT; break; // PRESOBJ_OUTLINE |
| |
| default : |
| { |
| if ( !pTextObj->Count() ) |
| { |
| switch ( nPlaceholderId ) |
| { |
| case PPT_PLACEHOLDER_MEDIACLIP : |
| case PPT_PLACEHOLDER_OBJECT : ePresObjKind = PRESOBJ_OBJECT; break; |
| case PPT_PLACEHOLDER_GRAPH : ePresObjKind = PRESOBJ_CHART; break; |
| case PPT_PLACEHOLDER_TABLE : ePresObjKind = PRESOBJ_TABLE; break; |
| case PPT_PLACEHOLDER_CLIPART : ePresObjKind = PRESOBJ_GRAPHIC; break; |
| case PPT_PLACEHOLDER_ORGANISZATIONCHART : ePresObjKind = PRESOBJ_ORGCHART; break; |
| } |
| } |
| }; |
| } |
| } |
| else if ( pTextObj->GetShapeType() == mso_sptPictureFrame ) |
| { |
| if ( !pTextObj->Count() && pObj->ISA( SdrGrafObj ) ) |
| { |
| bEmptyPresObj = sal_False; |
| switch ( nPlaceholderId ) |
| { |
| case PPT_PLACEHOLDER_MEDIACLIP : |
| case PPT_PLACEHOLDER_OBJECT : ePresObjKind = PRESOBJ_OBJECT; break; |
| case PPT_PLACEHOLDER_GRAPH : ePresObjKind = PRESOBJ_CHART; break; |
| case PPT_PLACEHOLDER_TABLE : ePresObjKind = PRESOBJ_CALC; break; |
| case PPT_PLACEHOLDER_CLIPART : ePresObjKind = PRESOBJ_GRAPHIC; break; |
| case PPT_PLACEHOLDER_ORGANISZATIONCHART : ePresObjKind = PRESOBJ_ORGCHART; break; |
| } |
| } |
| } |
| if ( ePresObjKind != PRESOBJ_NONE ) |
| { |
| if ( !bEmptyPresObj ) |
| { |
| pPage->InsertPresObj( pRet, ePresObjKind ); |
| } |
| else |
| { |
| SdrObject* pPresObj = pPage->CreatePresObj( ePresObjKind, bVertical, pText->GetLogicRect(), sal_True ); |
| pPresObj->SetUserCall( pPage ); |
| |
| SfxItemSet aSet( pSdrModel->GetItemPool() ); |
| ApplyAttributes( rStCtrl, aSet ); |
| pPresObj->SetLogicRect(pText->GetLogicRect()); |
| ApplyTextAnchorAttributes( *pTextObj, aSet ); |
| //set custom font attribute of the placeholder |
| if ( pTextObj->Count() == 1 ) |
| { |
| PPTParagraphObj* pPara = pTextObj->First(); |
| PPTPortionObj* pPor = NULL; |
| if ( pPara && pPara->GetTextSize() == 0 && (pPor = pPara->First())) |
| { |
| pPor->ApplyTo(aSet, (SdrPowerPointImport&)*this, pTextObj->GetDestinationInstance()); |
| } |
| } |
| pPresObj->SetMergedItemSet(aSet); |
| |
| if ( ( eAktPageKind != PPT_NOTEPAGE ) && ( pSlideLayout->aPlacementId[ i ] != (sal_uLong)-1 ) ) |
| { |
| SdrObject* pTitleObj = ((SdPage&)pPage->TRG_GetMasterPage()).GetPresObj( PRESOBJ_TITLE ); |
| SdrObject* pOutlineObj = ((SdPage&)pPage->TRG_GetMasterPage()).GetPresObj( PRESOBJ_OUTLINE ); |
| |
| Rectangle aTitleRect; |
| Rectangle aOutlineRect; |
| Size aOutlineSize; |
| |
| if ( pTitleObj ) |
| aTitleRect = pTitleObj->GetLogicRect(); |
| if ( pOutlineObj ) |
| { |
| aOutlineRect = pOutlineObj->GetLogicRect(); |
| aOutlineSize = aOutlineRect.GetSize(); |
| } |
| Rectangle aLogicRect( pPresObj->GetLogicRect() ); |
| Size aLogicSize( aLogicRect.GetSize() ); |
| |
| switch ( pSlideLayout->aPlacementId[ i ] ) |
| { |
| case 0 : // Lage im Titelbereich |
| { |
| if ( aLogicRect != aTitleRect ) |
| pPresObj->SetUserCall( NULL ); |
| } |
| break; |
| |
| case 1: |
| { |
| if ( pSlideLayout->eLayout == PPT_LAYOUT_TITLEANDBODYSLIDE ) |
| { // Lage im Outlinebereich |
| if ( aLogicRect != aOutlineRect ) |
| pPresObj->SetUserCall( NULL ); |
| } |
| else if ( pSlideLayout->eLayout == PPT_LAYOUT_2COLUMNSANDTITLE ) |
| { // Lage im Outlinebereich links |
| if (Abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE || |
| aLogicSize.Width() / aOutlineSize.Width() < 0.48 || |
| aLogicSize.Width() / aOutlineSize.Width() > 0.5) |
| { |
| pPresObj->SetUserCall(NULL); |
| } |
| } |
| else if ( pSlideLayout->eLayout == PPT_LAYOUT_2ROWSANDTITLE ) |
| { // Lage im Outlinebereich oben |
| if (Abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE) |
| { |
| pPresObj->SetUserCall( NULL ); |
| } |
| } |
| else if (Abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE) |
| { // Lage im Outlinebereich links oben |
| pPresObj->SetUserCall( NULL ); |
| } |
| } |
| break; |
| |
| case 2: |
| { |
| if ( pSlideLayout->eLayout == PPT_LAYOUT_2COLUMNSANDTITLE ) |
| { // Lage im Outlinebereich rechts |
| if (Abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE || |
| aLogicSize.Width() / aOutlineSize.Width() < 0.48 || |
| aLogicSize.Width() / aOutlineSize.Width() > 0.5) |
| { |
| pPresObj->SetUserCall( NULL ); |
| } |
| } |
| else if ( pSlideLayout->eLayout == PPT_LAYOUT_2ROWSANDTITLE ) |
| { // Lage im Outlinebereich unten |
| if (Abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE) |
| { |
| pPresObj->SetUserCall( NULL ); |
| } |
| } |
| else if (Abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE) |
| { // Lage im Outlinebereich rechts oben |
| pPresObj->SetUserCall(NULL); |
| } |
| } |
| break; |
| |
| case 3: |
| { // Lage im Outlinebereich links unten |
| if (Abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE) |
| { |
| pPresObj->SetUserCall( NULL ); |
| } |
| } |
| break; |
| |
| case 4: |
| { // Lage im Outlinebereich rechts unten |
| if (Abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE || |
| Abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE) |
| { |
| pObj->SetUserCall( NULL ); |
| } |
| } |
| break; |
| } |
| } |
| pRet = NULL; // return zero cause this obj was already inserted by CreatePresObj |
| } |
| } |
| else if ( !pTextObj->Count() ) |
| pRet = NULL; |
| } |
| } |
| } |
| } |
| if ( pRet != pText ) |
| { |
| SdrObject* pFree( pText ); |
| SdrObject::Free( pFree ); |
| } |
| return pRet; |
| } |
| |
| SdrObject* ImplSdPPTImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, void* pData, Rectangle& rTextRect, SdrObject* pRet ) |
| { |
| SdrObject* pObj = SdrPowerPointImport::ProcessObj( rSt, rObjData, pData, rTextRect, pRet ); |
| |
| // Animationseffekte des Objektes lesen |
| if ( pObj ) |
| { |
| // further setup placeholder objects |
| if( pObj->ISA(SdrPageObj) && pData ) |
| { |
| const ProcessData* pProcessData=(const ProcessData*)pData; |
| if( pProcessData->pPage ) |
| pProcessData->pPage->InsertPresObj( pObj, PRESOBJ_PAGE ); |
| } |
| |
| sal_Bool bInhabitanceChecked = sal_False; |
| sal_Bool bAnimationInfoFound = sal_False; |
| DffRecordHeader aMasterShapeHd; |
| |
| if ( maShapeRecords.SeekToContent( rSt, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) ) |
| { |
| DffRecordHeader& rHdClientData = *maShapeRecords.Current(); |
| while( sal_True ) |
| { |
| sal_uInt32 nClientDataLen = rHdClientData.GetRecEndFilePos(); |
| DffRecordHeader aHd; |
| do |
| { |
| rSt >> aHd; |
| sal_uInt32 nHdRecEnd = aHd.GetRecEndFilePos(); |
| switch ( aHd.nRecType ) |
| { |
| case PPT_PST_AnimationInfo : |
| { |
| DffRecordHeader aHdAnimInfoAtom; |
| if ( SeekToRec( rSt, PPT_PST_AnimationInfoAtom, nHdRecEnd, &aHdAnimInfoAtom ) ) |
| { |
| // read data from stream |
| Ppt97AnimationPtr pAnimation( new Ppt97Animation( rSt ) ); |
| // store animation informations |
| if( pAnimation->HasEffect() ) |
| { |
| // translate color to RGB |
| pAnimation->SetDimColor( MSO_CLR_ToColor(pAnimation->GetDimColor()).GetColor() ); |
| // translate sound bits to file url |
| if( pAnimation->HasSoundEffect() ) |
| pAnimation->SetSoundFileUrl( ReadSound( pAnimation->GetSoundRef() ) ); |
| |
| bool bDontAnimateInvisibleShape = false; |
| { |
| SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj); |
| |
| if( pTextObj && pTextObj->HasText() && |
| !pObj->ISA( SdrObjGroup ) && |
| pAnimation->HasAnimateAssociatedShape() ) |
| { |
| const SfxItemSet& rObjItemSet = pObj->GetMergedItemSet(); |
| |
| XFillStyle eFillStyle = ((XFillStyleItem&)(rObjItemSet.Get(XATTR_FILLSTYLE))).GetValue(); |
| XLineStyle eLineStyle = ((XLineStyleItem&)(rObjItemSet.Get(XATTR_LINESTYLE))).GetValue(); |
| |
| if ( ( eFillStyle == XFILL_NONE ) && ( eLineStyle == XLINE_NONE ) ) |
| bDontAnimateInvisibleShape = true; |
| } |
| } |
| if( bDontAnimateInvisibleShape ) |
| pAnimation->SetAnimateAssociatedShape(false); |
| |
| //maybe some actions necessary to ensure that animations on master pages are played before animations on normal pages |
| ///mabe todo in future: bool bIsEffectOnMasterPage = !bInhabitanceChecked;? |
| |
| maAnimations[pObj] = pAnimation; |
| |
| bAnimationInfoFound = sal_True; |
| } |
| } |
| } |
| break; |
| case PPT_PST_InteractiveInfo: |
| { |
| sal_uInt32 nFilePosMerk2 = rSt.Tell(); |
| String aMacroName; |
| |
| if(SeekToRec( rSt, PPT_PST_CString, nHdRecEnd, NULL, 0 ) ) |
| ReadString(aMacroName); |
| |
| rSt.Seek( nFilePosMerk2 ); |
| DffRecordHeader aHdInteractiveInfoAtom; |
| if ( SeekToRec( rSt, PPT_PST_InteractiveInfoAtom, nHdRecEnd, &aHdInteractiveInfoAtom ) ) |
| { |
| PptInteractiveInfoAtom aInteractiveInfoAtom; |
| rSt >> aInteractiveInfoAtom; |
| |
| // interactive object |
| SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj, true); |
| |
| ( (ImplSdPPTImport*) this )->FillSdAnimationInfo( pInfo, &aInteractiveInfoAtom, aMacroName ); |
| if ( aInteractiveInfoAtom.nAction == 6 ) // Sj -> media action |
| { |
| rHdClientData.SeekToContent( rStCtrl ); |
| DffRecordHeader aObjRefAtomHd; |
| if ( SeekToRec( rSt, PPT_PST_ExObjRefAtom, nHdRecEnd, &aObjRefAtomHd ) ) |
| { |
| sal_uInt32 nRef; |
| rSt >> nRef; |
| String aMediaURL( ReadMedia( nRef ) ); |
| if ( !aMediaURL.Len() ) |
| aMediaURL = ReadSound( nRef ); |
| if ( aMediaURL.Len() ) |
| { |
| SdrMediaObj* pMediaObj = new SdrMediaObj( pObj->GetSnapRect() ); |
| pMediaObj->SetModel( pObj->GetModel() ); |
| pMediaObj->SetMergedItemSet( pObj->GetMergedItemSet() ); |
| |
| //--remove object from maAnimations list and add the new object instead |
| Ppt97AnimationPtr pAnimation; |
| { |
| tAnimationMap::iterator aFound = maAnimations.find( pObj ); |
| if( aFound != maAnimations.end() ) |
| { |
| pAnimation = (*aFound).second; |
| maAnimations.erase(aFound); |
| } |
| maAnimations[pMediaObj] = pAnimation; |
| } |
| //-- |
| |
| SdrObject::Free( pObj ), pObj = pMediaObj; // SJ: hoping that pObj is not inserted in any list |
| pMediaObj->setURL( aMediaURL ); |
| } |
| } |
| } |
| } |
| } |
| break; |
| } |
| aHd.SeekToEndOfRecord( rSt ); |
| } |
| while( ( rSt.GetError() == 0 ) && ( rSt.Tell() < nClientDataLen ) ); |
| |
| if ( bInhabitanceChecked || bAnimationInfoFound ) |
| break; |
| bInhabitanceChecked = sal_True; |
| if ( ! ( IsProperty( DFF_Prop_hspMaster ) && SeekToShape( rSt, pData, GetPropertyValue( DFF_Prop_hspMaster ) ) ) ) |
| break; |
| rSt >> aMasterShapeHd; |
| if ( !SeekToRec( rSt, DFF_msofbtClientData, aMasterShapeHd.GetRecEndFilePos(), &aMasterShapeHd ) ) |
| break; |
| aMasterShapeHd.SeekToContent( rSt ); |
| rHdClientData = aMasterShapeHd; |
| } |
| } |
| } |
| return pObj; |
| } |
| |
| // --------------------- |
| // - exported function - |
| // --------------------- |
| |
| extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL ImportPPT( const ::rtl::OUString& rConfigPath, |
| uno::Sequence< beans::PropertyValue >* pConfigData, |
| SdDrawDocument* pDocument, SvStream& rDocStream, SvStorage& rStorage, SfxMedium& rMedium ) |
| { |
| sal_Bool bRet = sal_False; |
| |
| MSFilterTracer aTracer( rConfigPath, pConfigData ); |
| aTracer.StartTracing(); |
| |
| SdPPTImport* pImport = new SdPPTImport( pDocument, rDocStream, rStorage, rMedium, &aTracer ); |
| bRet = pImport->Import(); |
| |
| aTracer.EndTracing(); |
| delete pImport; |
| |
| return bRet; |
| } |