/************************************************************** * * 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_filter.hxx" #include #include "svgfilter.hxx" #include #include #include #include #include #include #define SVG_FILTER_SERVICE_NAME "com.sun.star.comp.Draw.SVGFilter" #define SVG_FILTER_IMPLEMENTATION_NAME SVG_FILTER_SERVICE_NAME using ::rtl::OUString; using namespace ::com::sun::star; // ------------- // - SVGFilter - // ------------- SVGFilter::SVGFilter( const Reference< XMultiServiceFactory > &rxMSF ) : mxMSF( rxMSF ), mpSVGDoc( NULL ), mpSVGExport( NULL ), mpSVGFontExport( NULL ), mpSVGWriter( NULL ), mpDefaultSdrPage( NULL ), mpSdrModel( NULL ), mbPresentation( sal_False ), mpObjects( NULL ), mxSrcDoc(), #ifdef SOLAR_JAVA mxDstDoc(), #endif mxDefaultPage(), maFilterData(), maShapeSelection(), mbExportSelection(false), maUniqueIdVector(), mnMasterSlideId(0), mnSlideId(0), mnDrawingGroupId(0), mnDrawingId(0), maOldFieldHdl() { } // ----------------------------------------------------------------------------- SVGFilter::~SVGFilter() { DBG_ASSERT( mpSVGDoc == NULL, "mpSVGDoc not destroyed" ); DBG_ASSERT( mpSVGExport == NULL, "mpSVGExport not destroyed" ); DBG_ASSERT( mpSVGFontExport == NULL, "mpSVGFontExport not destroyed" ); DBG_ASSERT( mpSVGWriter == NULL, "mpSVGWriter not destroyed" ); DBG_ASSERT( mpObjects == NULL, "mpObjects not destroyed" ); } // ----------------------------------------------------------------------------- sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescriptor ) throw (RuntimeException) { vos::OGuard aGuard( Application::GetSolarMutex() ); Window* pFocusWindow = Application::GetFocusWindow(); sal_Int16 nCurrentPageNumber = -1; sal_Bool bRet; if( pFocusWindow ) pFocusWindow->EnterWait(); #ifdef SOLAR_JAVA if( mxDstDoc.is() ) bRet = sal_False;//implImport( rDescriptor ); else #endif if( mxSrcDoc.is() ) { // #124608# detext selection sal_Bool bSelectionOnly = sal_False; bool bGotSelection(false); Reference< drawing::XShapes > xShapes; // #124608# extract Single selection wanted from dialog return values for ( sal_Int32 nInd = 0; nInd < rDescriptor.getLength(); nInd++ ) { if ( rDescriptor[nInd].Name.equalsAscii( "SelectionOnly" ) ) { rDescriptor[nInd].Value >>= bSelectionOnly; } } uno::Reference< frame::XDesktop > xDesktop( mxMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ), uno::UNO_QUERY); if( xDesktop.is() ) { uno::Reference< frame::XFrame > xFrame( xDesktop->getCurrentFrame() ); if( xFrame.is() ) { uno::Reference< frame::XController > xController( xFrame->getController() ); if( xController.is() ) { uno::Reference< drawing::XDrawView > xDrawView( xController, uno::UNO_QUERY ); if( xDrawView.is() ) { uno::Reference< drawing::XDrawPage > xDrawPage( xDrawView->getCurrentPage() ); if( xDrawPage.is() ) { uno::Reference< beans::XPropertySet >( xDrawPage, uno::UNO_QUERY )-> getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Number" ) ) ) >>= nCurrentPageNumber; } } if(bSelectionOnly) { // #124608# when selection only is wanted, get the current object selection // from the DrawView Reference< view::XSelectionSupplier > xSelection (xController, UNO_QUERY); if (xSelection.is()) { uno::Any aSelection; if(xSelection->getSelection() >>= aSelection) { bGotSelection = (sal_True == ( aSelection >>= xShapes )); } } } } } } if(bSelectionOnly && bGotSelection && 0 == xShapes->getCount()) { // #124608# export selection, got xShapes but no shape selected -> nothing // to export, we are done (maybe return true, but a hint that nothing was done // may be useful; it may have happened by error) bRet = sal_False; } else { Sequence< PropertyValue > aNewDescriptor(rDescriptor); const bool bSinglePage(nCurrentPageNumber > 0); if(bSinglePage || bGotSelection) { const sal_uInt32 nOldLength = rDescriptor.getLength(); sal_uInt32 nInsert(nOldLength); aNewDescriptor.realloc(nOldLength + (bSinglePage ? 1 : 0) + (bGotSelection ? 1 : 0)); if(bSinglePage) { aNewDescriptor[nInsert].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PagePos")); aNewDescriptor[nInsert].Value <<= static_cast(nCurrentPageNumber - 1); nInsert++; } if(bGotSelection) { // #124608# add retrieved ShapeSelection if export of only selected shapes is wanted // so that the filter implementation can use it aNewDescriptor[nInsert].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShapeSelection")); aNewDescriptor[nInsert].Value <<= xShapes; // reactivate this when you add other properties to aNewDescriptor // nInsert++; } } bRet = implExport(aNewDescriptor); } } else bRet = sal_False; if( pFocusWindow ) pFocusWindow->LeaveWait(); return bRet; } // ----------------------------------------------------------------------------- void SAL_CALL SVGFilter::cancel( ) throw (RuntimeException) { } // ----------------------------------------------------------------------------- void SAL_CALL SVGFilter::setSourceDocument( const Reference< XComponent >& xDoc ) throw (IllegalArgumentException, RuntimeException) { mxSrcDoc = xDoc; } // ----------------------------------------------------------------------------- #ifdef SOLAR_JAVA void SAL_CALL SVGFilter::setTargetDocument( const Reference< XComponent >& xDoc ) throw (::com::sun::star::lang::IllegalArgumentException, RuntimeException) { mxDstDoc = xDoc; } #endif // ----------------------------------------------------------------------------- void SAL_CALL SVGFilter::initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& /* aArguments */ ) throw (Exception, RuntimeException) { } // ----------------------------------------------------------------------------- OUString SVGFilter_getImplementationName () throw (RuntimeException) { return OUString ( RTL_CONSTASCII_USTRINGPARAM ( SVG_FILTER_IMPLEMENTATION_NAME ) ); } // ----------------------------------------------------------------------------- sal_Bool SAL_CALL SVGFilter_supportsService( const OUString& rServiceName ) throw (RuntimeException) { return( rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SVG_FILTER_SERVICE_NAME ) ) ); } // ----------------------------------------------------------------------------- Sequence< OUString > SAL_CALL SVGFilter_getSupportedServiceNames( ) throw (RuntimeException) { Sequence < OUString > aRet(1); OUString* pArray = aRet.getArray(); pArray[0] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( SVG_FILTER_SERVICE_NAME ) ); return aRet; } // ----------------------------------------------------------------------------- Reference< XInterface > SAL_CALL SVGFilter_createInstance( const Reference< XMultiServiceFactory > & rSMgr) throw( Exception ) { return (cppu::OWeakObject*) new SVGFilter( rSMgr ); } // ----------------------------------------------------------------------------- OUString SAL_CALL SVGFilter::getImplementationName( ) throw (RuntimeException) { return SVGFilter_getImplementationName(); } // ----------------------------------------------------------------------------- sal_Bool SAL_CALL SVGFilter::supportsService( const OUString& rServiceName ) throw (RuntimeException) { return SVGFilter_supportsService( rServiceName ); } // ----------------------------------------------------------------------------- ::com::sun::star::uno::Sequence< OUString > SAL_CALL SVGFilter::getSupportedServiceNames( ) throw (RuntimeException) { return SVGFilter_getSupportedServiceNames(); }