1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_filter.hxx"
26
27 #include <cstdio>
28 #include "svgfilter.hxx"
29 #include <vos/mutex.hxx>
30
31 #include <com/sun/star/drawing/XDrawPage.hpp>
32 #include <com/sun/star/drawing/XDrawView.hpp>
33 #include <com/sun/star/frame/XDesktop.hdl>
34 #include <com/sun/star/frame/XController.hdl>
35 #include <com/sun/star/view/XSelectionSupplier.hpp>
36
37 #define SVG_FILTER_SERVICE_NAME "com.sun.star.comp.Draw.SVGFilter"
38 #define SVG_FILTER_IMPLEMENTATION_NAME SVG_FILTER_SERVICE_NAME
39
40 using ::rtl::OUString;
41 using namespace ::com::sun::star;
42
43 // -------------
44 // - SVGFilter -
45 // -------------
46
SVGFilter(const Reference<XMultiServiceFactory> & rxMSF)47 SVGFilter::SVGFilter( const Reference< XMultiServiceFactory > &rxMSF ) :
48 mxMSF( rxMSF ),
49 mpSVGDoc( NULL ),
50 mpSVGExport( NULL ),
51 mpSVGFontExport( NULL ),
52 mpSVGWriter( NULL ),
53 mpDefaultSdrPage( NULL ),
54 mpSdrModel( NULL ),
55 mbPresentation( sal_False ),
56 mpObjects( NULL ),
57 mxSrcDoc(),
58 #ifdef SOLAR_JAVA
59 mxDstDoc(),
60 #endif
61 mxDefaultPage(),
62 maFilterData(),
63 maShapeSelection(),
64 mbExportSelection(false),
65 maUniqueIdVector(),
66 mnMasterSlideId(0),
67 mnSlideId(0),
68 mnDrawingGroupId(0),
69 mnDrawingId(0),
70 maOldFieldHdl()
71 {
72 }
73
74 // -----------------------------------------------------------------------------
75
~SVGFilter()76 SVGFilter::~SVGFilter()
77 {
78 DBG_ASSERT( mpSVGDoc == NULL, "mpSVGDoc not destroyed" );
79 DBG_ASSERT( mpSVGExport == NULL, "mpSVGExport not destroyed" );
80 DBG_ASSERT( mpSVGFontExport == NULL, "mpSVGFontExport not destroyed" );
81 DBG_ASSERT( mpSVGWriter == NULL, "mpSVGWriter not destroyed" );
82 DBG_ASSERT( mpObjects == NULL, "mpObjects not destroyed" );
83 }
84
85 // -----------------------------------------------------------------------------
86
filter(const Sequence<PropertyValue> & rDescriptor)87 sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescriptor )
88 throw (RuntimeException)
89 {
90 vos::OGuard aGuard( Application::GetSolarMutex() );
91 Window* pFocusWindow = Application::GetFocusWindow();
92 sal_Int16 nCurrentPageNumber = -1;
93 sal_Bool bRet;
94
95 if( pFocusWindow )
96 pFocusWindow->EnterWait();
97
98 #ifdef SOLAR_JAVA
99 if( mxDstDoc.is() )
100 bRet = sal_False;//implImport( rDescriptor );
101 else
102 #endif
103 if( mxSrcDoc.is() )
104 {
105 // #124608# detext selection
106 sal_Bool bSelectionOnly = sal_False;
107 bool bGotSelection(false);
108 Reference< drawing::XShapes > xShapes;
109
110 // #124608# extract Single selection wanted from dialog return values
111 for ( sal_Int32 nInd = 0; nInd < rDescriptor.getLength(); nInd++ )
112 {
113 if ( rDescriptor[nInd].Name.equalsAscii( "SelectionOnly" ) )
114 {
115 rDescriptor[nInd].Value >>= bSelectionOnly;
116 }
117 }
118
119 uno::Reference< frame::XDesktop > xDesktop( mxMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ),
120 uno::UNO_QUERY);
121 if( xDesktop.is() )
122 {
123 uno::Reference< frame::XFrame > xFrame( xDesktop->getCurrentFrame() );
124
125 if( xFrame.is() )
126 {
127 uno::Reference< frame::XController > xController( xFrame->getController() );
128
129 if( xController.is() )
130 {
131 uno::Reference< drawing::XDrawView > xDrawView( xController, uno::UNO_QUERY );
132
133 if( xDrawView.is() )
134 {
135 uno::Reference< drawing::XDrawPage > xDrawPage( xDrawView->getCurrentPage() );
136
137 if( xDrawPage.is() )
138 {
139 uno::Reference< beans::XPropertySet >( xDrawPage, uno::UNO_QUERY )->
140 getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Number" ) ) ) >>= nCurrentPageNumber;
141 }
142 }
143
144 if(bSelectionOnly)
145 {
146 // #124608# when selection only is wanted, get the current object selection
147 // from the DrawView
148 Reference< view::XSelectionSupplier > xSelection (xController, UNO_QUERY);
149
150 if (xSelection.is())
151 {
152 uno::Any aSelection;
153
154 if(xSelection->getSelection() >>= aSelection)
155 {
156 bGotSelection = (sal_True == ( aSelection >>= xShapes ));
157 }
158 }
159 }
160 }
161 }
162 }
163
164 if(bSelectionOnly && bGotSelection && 0 == xShapes->getCount())
165 {
166 // #124608# export selection, got xShapes but no shape selected -> nothing
167 // to export, we are done (maybe return true, but a hint that nothing was done
168 // may be useful; it may have happened by error)
169 bRet = sal_False;
170 }
171 else
172 {
173 Sequence< PropertyValue > aNewDescriptor(rDescriptor);
174 const bool bSinglePage(nCurrentPageNumber > 0);
175
176 if(bSinglePage || bGotSelection)
177 {
178 const sal_uInt32 nOldLength = rDescriptor.getLength();
179 sal_uInt32 nInsert(nOldLength);
180
181 aNewDescriptor.realloc(nOldLength + (bSinglePage ? 1 : 0) + (bGotSelection ? 1 : 0));
182
183 if(bSinglePage)
184 {
185 aNewDescriptor[nInsert].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PagePos"));
186 aNewDescriptor[nInsert].Value <<= static_cast<sal_Int16>(nCurrentPageNumber - 1);
187 nInsert++;
188 }
189
190 if(bGotSelection)
191 {
192 // #124608# add retrieved ShapeSelection if export of only selected shapes is wanted
193 // so that the filter implementation can use it
194 aNewDescriptor[nInsert].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShapeSelection"));
195 aNewDescriptor[nInsert].Value <<= xShapes;
196 // reactivate this when you add other properties to aNewDescriptor
197 // nInsert++;
198 }
199 }
200
201 bRet = implExport(aNewDescriptor);
202 }
203 }
204 else
205 bRet = sal_False;
206
207 if( pFocusWindow )
208 pFocusWindow->LeaveWait();
209
210 return bRet;
211 }
212
213 // -----------------------------------------------------------------------------
214
cancel()215 void SAL_CALL SVGFilter::cancel( ) throw (RuntimeException)
216 {
217 }
218
219 // -----------------------------------------------------------------------------
220
setSourceDocument(const Reference<XComponent> & xDoc)221 void SAL_CALL SVGFilter::setSourceDocument( const Reference< XComponent >& xDoc )
222 throw (IllegalArgumentException, RuntimeException)
223 {
224 mxSrcDoc = xDoc;
225 }
226
227 // -----------------------------------------------------------------------------
228
229 #ifdef SOLAR_JAVA
setTargetDocument(const Reference<XComponent> & xDoc)230 void SAL_CALL SVGFilter::setTargetDocument( const Reference< XComponent >& xDoc )
231 throw (::com::sun::star::lang::IllegalArgumentException, RuntimeException)
232 {
233 mxDstDoc = xDoc;
234 }
235 #endif
236
237 // -----------------------------------------------------------------------------
238
initialize(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Any> &)239 void SAL_CALL SVGFilter::initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& /* aArguments */ )
240 throw (Exception, RuntimeException)
241 {
242 }
243
244 // -----------------------------------------------------------------------------
245
SVGFilter_getImplementationName()246 OUString SVGFilter_getImplementationName ()
247 throw (RuntimeException)
248 {
249 return OUString ( RTL_CONSTASCII_USTRINGPARAM ( SVG_FILTER_IMPLEMENTATION_NAME ) );
250 }
251
252 // -----------------------------------------------------------------------------
253
SVGFilter_supportsService(const OUString & rServiceName)254 sal_Bool SAL_CALL SVGFilter_supportsService( const OUString& rServiceName )
255 throw (RuntimeException)
256 {
257 return( rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SVG_FILTER_SERVICE_NAME ) ) );
258 }
259
260 // -----------------------------------------------------------------------------
261
SVGFilter_getSupportedServiceNames()262 Sequence< OUString > SAL_CALL SVGFilter_getSupportedServiceNames( ) throw (RuntimeException)
263 {
264 Sequence < OUString > aRet(1);
265 OUString* pArray = aRet.getArray();
266 pArray[0] = OUString ( RTL_CONSTASCII_USTRINGPARAM ( SVG_FILTER_SERVICE_NAME ) );
267 return aRet;
268 }
269
270 // -----------------------------------------------------------------------------
271
SVGFilter_createInstance(const Reference<XMultiServiceFactory> & rSMgr)272 Reference< XInterface > SAL_CALL SVGFilter_createInstance( const Reference< XMultiServiceFactory > & rSMgr) throw( Exception )
273 {
274 return (cppu::OWeakObject*) new SVGFilter( rSMgr );
275 }
276
277 // -----------------------------------------------------------------------------
278
getImplementationName()279 OUString SAL_CALL SVGFilter::getImplementationName( )
280 throw (RuntimeException)
281 {
282 return SVGFilter_getImplementationName();
283 }
284
285 // -----------------------------------------------------------------------------
286
supportsService(const OUString & rServiceName)287 sal_Bool SAL_CALL SVGFilter::supportsService( const OUString& rServiceName )
288 throw (RuntimeException)
289 {
290 return SVGFilter_supportsService( rServiceName );
291 }
292
293 // -----------------------------------------------------------------------------
294
getSupportedServiceNames()295 ::com::sun::star::uno::Sequence< OUString > SAL_CALL SVGFilter::getSupportedServiceNames( ) throw (RuntimeException)
296 {
297 return SVGFilter_getSupportedServiceNames();
298 }
299