Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vector>
21 : #include <com/sun/star/embed/XStorage.hpp>
22 : #include <com/sun/star/embed/ElementModes.hpp>
23 : #include <com/sun/star/embed/XTransactedObject.hpp>
24 : #include <com/sun/star/lang/XServiceInfo.hpp>
25 : #include <com/sun/star/beans/XPropertySet.hpp>
26 : #include <com/sun/star/beans/XMultiPropertySet.hpp>
27 : #include <com/sun/star/i18n/XForbiddenCharacters.hpp>
28 : #include <cppuhelper/implbase3.hxx>
29 : #include <cppuhelper/supportsservice.hxx>
30 : #include <comphelper/propertysethelper.hxx>
31 : #include <comphelper/propertysetinfo.hxx>
32 : #include <tools/urlobj.hxx>
33 : #include <svx/xtable.hxx>
34 : #include <osl/diagnose.h>
35 : #include <osl/mutex.hxx>
36 : #include <vcl/svapp.hxx>
37 :
38 : #include "drawdoc.hxx"
39 : #include "DrawDocShell.hxx"
40 : #include "UnoDocumentSettings.hxx"
41 : #include "unomodel.hxx"
42 :
43 : #include "optsitem.hxx"
44 : #include <sfx2/printer.hxx>
45 : #include "sdattr.hxx"
46 : #include "../inc/ViewShell.hxx"
47 : #include "../inc/FrameView.hxx"
48 : #include "Outliner.hxx"
49 : #include <xmloff/settingsstore.hxx>
50 : #include <editeng/editstat.hxx>
51 : #include <svx/unoapi.hxx>
52 :
53 : using namespace ::comphelper;
54 : using namespace ::osl;
55 : using namespace ::cppu;
56 : using namespace ::com::sun::star;
57 : using namespace ::com::sun::star::uno;
58 : using namespace ::com::sun::star::util;
59 : using namespace ::com::sun::star::container;
60 : using namespace ::com::sun::star::drawing;
61 : using namespace ::com::sun::star::lang;
62 : using namespace ::com::sun::star::document;
63 : using namespace ::com::sun::star::frame;
64 : using namespace ::com::sun::star::beans;
65 : using namespace ::com::sun::star::i18n;
66 :
67 : namespace sd
68 : {
69 : class DocumentSettings : public WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >,
70 : public comphelper::PropertySetHelper,
71 : public DocumentSettingsSerializer
72 : {
73 : public:
74 : DocumentSettings( SdXImpressDocument* pModel );
75 : virtual ~DocumentSettings() throw();
76 :
77 : // XInterface
78 : virtual Any SAL_CALL queryInterface( const Type& aType ) throw (RuntimeException, std::exception) SAL_OVERRIDE;
79 : virtual void SAL_CALL acquire( ) throw () SAL_OVERRIDE;
80 : virtual void SAL_CALL release( ) throw () SAL_OVERRIDE;
81 :
82 : // XPropertySet
83 : virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
84 : virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
85 : virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
86 : virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& xListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
87 : virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
88 : virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
89 : virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
90 :
91 : // XMultiPropertySet
92 : virtual void SAL_CALL setPropertyValues( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues ) throw(::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
93 : virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > SAL_CALL getPropertyValues( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
94 : virtual void SAL_CALL addPropertiesChangeListener( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
95 : virtual void SAL_CALL removePropertiesChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
96 : virtual void SAL_CALL firePropertiesChangeEvent( const ::com::sun::star::uno::Sequence< OUString >& aPropertyNames, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertiesChangeListener >& xListener ) throw(::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
97 :
98 : // XServiceInfo
99 : virtual OUString SAL_CALL getImplementationName( ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
100 : virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
101 : virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw(RuntimeException, std::exception) SAL_OVERRIDE;
102 :
103 : // DocumentSettingsSerializer cf. xmloff
104 : virtual uno::Sequence<beans::PropertyValue>
105 : filterStreamsFromStorage(OUString const & referer,
106 : const uno::Reference< embed::XStorage > &xStorage,
107 : const uno::Sequence<beans::PropertyValue>& aConfigProps ) SAL_OVERRIDE;
108 : virtual uno::Sequence<beans::PropertyValue>
109 : filterStreamsToStorage(const uno::Reference< embed::XStorage > &xStorage,
110 : const uno::Sequence<beans::PropertyValue>& aConfigProps ) SAL_OVERRIDE;
111 :
112 : protected:
113 : virtual void _setPropertyValues( const comphelper::PropertyMapEntry** ppEntries, const ::com::sun::star::uno::Any* pValues ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, RuntimeException, std::exception ) SAL_OVERRIDE;
114 : virtual void _getPropertyValues( const comphelper::PropertyMapEntry** ppEntries, ::com::sun::star::uno::Any* pValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, RuntimeException, std::exception ) SAL_OVERRIDE;
115 :
116 : private:
117 : bool LoadList( XPropertyListType t, const OUString &rPath,
118 : const OUString &rReferer,
119 : const uno::Reference< embed::XStorage > &xStorage );
120 : void AssignURL( XPropertyListType t, const Any* pValue, bool *pOk, bool *pChanged );
121 : void ExtractURL( XPropertyListType t, Any* pValue );
122 : rtl::Reference<SdXImpressDocument> mxModel;
123 : };
124 :
125 125 : Reference< XInterface > SAL_CALL DocumentSettings_createInstance( SdXImpressDocument* pModel )
126 : throw ()
127 : {
128 : DBG_ASSERT( pModel, "I need a model for the DocumentSettings!" );
129 125 : return static_cast<XWeak*>(new DocumentSettings( pModel ));
130 : }
131 :
132 : enum SdDocumentSettingsPropertyHandles
133 : {
134 : HANDLE_PRINTDRAWING, HANDLE_PRINTNOTES, HANDLE_PRINTHANDOUT, HANDLE_PRINTOUTLINE, HANDLE_MEASUREUNIT, HANDLE_SCALE_NUM,
135 : HANDLE_SCALE_DOM, HANDLE_TABSTOP, HANDLE_PRINTPAGENAME, HANDLE_PRINTDATE, HANDLE_PRINTTIME,
136 : HANDLE_PRINTHIDENPAGES, HANDLE_PRINTFITPAGE, HANDLE_PRINTTILEPAGE, HANDLE_PRINTBOOKLET, HANDLE_PRINTBOOKLETFRONT,
137 : HANDLE_PRINTBOOKLETBACK, HANDLE_PRINTQUALITY, HANDLE_COLORTABLEURL, HANDLE_DASHTABLEURL, HANDLE_LINEENDTABLEURL, HANDLE_HATCHTABLEURL,
138 : HANDLE_GRADIENTTABLEURL, HANDLE_BITMAPTABLEURL, HANDLE_FORBIDDENCHARS, HANDLE_APPLYUSERDATA, HANDLE_PAGENUMFMT,
139 : HANDLE_PRINTERNAME, HANDLE_PRINTERJOB, HANDLE_PARAGRAPHSUMMATION, HANDLE_CHARCOMPRESS, HANDLE_ASIANPUNCT, HANDLE_UPDATEFROMTEMPLATE,
140 : HANDLE_PRINTER_INDEPENDENT_LAYOUT
141 : // #i33095#
142 : ,HANDLE_LOAD_READONLY, HANDLE_MODIFY_PASSWD, HANDLE_SAVE_VERSION
143 : ,HANDLE_SLIDESPERHANDOUT, HANDLE_HANDOUTHORIZONTAL, HANDLE_EMBED_FONTS
144 : };
145 :
146 : #define MID_PRINTER 1
147 :
148 125 : PropertySetInfo * createSettingsInfoImpl( bool bIsDraw )
149 : {
150 : static PropertyMapEntry const aImpressSettingsInfoMap[] =
151 : {
152 10 : { OUString("IsPrintDrawing"), HANDLE_PRINTDRAWING, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
153 10 : { OUString("IsPrintNotes"), HANDLE_PRINTNOTES, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
154 10 : { OUString("IsPrintHandout"), HANDLE_PRINTHANDOUT, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
155 10 : { OUString("IsPrintOutline"), HANDLE_PRINTOUTLINE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
156 10 : { OUString("SlidesPerHandout"), HANDLE_SLIDESPERHANDOUT, ::cppu::UnoType<sal_Int16>::get(), 0, MID_PRINTER },
157 10 : { OUString("HandoutsHorizontal"), HANDLE_HANDOUTHORIZONTAL, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
158 : { OUString(), 0, css::uno::Type(), 0, 0 }
159 195 : };
160 :
161 : static PropertyMapEntry const aDrawSettingsInfoMap[] =
162 : {
163 10 : { OUString("MeasureUnit"), HANDLE_MEASUREUNIT, ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
164 10 : { OUString("ScaleNumerator"), HANDLE_SCALE_NUM, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
165 10 : { OUString("ScaleDenominator"), HANDLE_SCALE_DOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
166 : { OUString(), 0, css::uno::Type(), 0, 0 }
167 165 : };
168 :
169 : static PropertyMapEntry const aCommonSettingsInfoMap[] =
170 : {
171 10 : { OUString("DefaultTabStop"), HANDLE_TABSTOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
172 10 : { OUString("PrinterName"), HANDLE_PRINTERNAME, ::cppu::UnoType<OUString>::get(), 0, 0 },
173 10 : { OUString("PrinterSetup"), HANDLE_PRINTERJOB, cppu::UnoType<uno::Sequence < sal_Int8 >>::get(), 0, MID_PRINTER },
174 :
175 10 : { OUString("IsPrintPageName"), HANDLE_PRINTPAGENAME, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
176 10 : { OUString("IsPrintDate"), HANDLE_PRINTDATE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
177 10 : { OUString("IsPrintTime"), HANDLE_PRINTTIME, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
178 10 : { OUString("IsPrintHiddenPages"), HANDLE_PRINTHIDENPAGES, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
179 10 : { OUString("IsPrintFitPage"), HANDLE_PRINTFITPAGE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
180 10 : { OUString("IsPrintTilePage"), HANDLE_PRINTTILEPAGE, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
181 10 : { OUString("IsPrintBooklet"), HANDLE_PRINTBOOKLET, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
182 10 : { OUString("IsPrintBookletFront"), HANDLE_PRINTBOOKLETFRONT, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
183 10 : { OUString("IsPrintBookletBack"), HANDLE_PRINTBOOKLETBACK, cppu::UnoType<bool>::get(), 0, MID_PRINTER },
184 10 : { OUString("PrintQuality"), HANDLE_PRINTQUALITY, ::cppu::UnoType<sal_Int32>::get(), 0, MID_PRINTER },
185 10 : { OUString("ColorTableURL"), HANDLE_COLORTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
186 10 : { OUString("DashTableURL"), HANDLE_DASHTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
187 10 : { OUString("LineEndTableURL"), HANDLE_LINEENDTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
188 10 : { OUString("HatchTableURL"), HANDLE_HATCHTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
189 10 : { OUString("GradientTableURL"), HANDLE_GRADIENTTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
190 10 : { OUString("BitmapTableURL"), HANDLE_BITMAPTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
191 :
192 10 : { OUString("ForbiddenCharacters"), HANDLE_FORBIDDENCHARS, cppu::UnoType<XForbiddenCharacters>::get(), 0, 0 },
193 10 : { OUString("ApplyUserData"), HANDLE_APPLYUSERDATA, cppu::UnoType<bool>::get(), 0, 0 },
194 :
195 10 : { OUString("PageNumberFormat"), HANDLE_PAGENUMFMT, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
196 10 : { OUString("ParagraphSummation"), HANDLE_PARAGRAPHSUMMATION, cppu::UnoType<bool>::get(), 0, 0 },
197 10 : { OUString("CharacterCompressionType"),HANDLE_CHARCOMPRESS, ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
198 10 : { OUString("IsKernAsianPunctuation"),HANDLE_ASIANPUNCT, cppu::UnoType<bool>::get(), 0, 0 },
199 10 : { OUString("UpdateFromTemplate"), HANDLE_UPDATEFROMTEMPLATE, cppu::UnoType<bool>::get(), 0, 0 },
200 10 : { OUString("PrinterIndependentLayout"),HANDLE_PRINTER_INDEPENDENT_LAYOUT,::cppu::UnoType<sal_Int16>::get(), 0, 0 },
201 : // --> #i33095#
202 10 : { OUString("LoadReadonly"), HANDLE_LOAD_READONLY, cppu::UnoType<bool>::get(), 0, 0 },
203 10 : { OUString("ModifyPasswordInfo"), HANDLE_MODIFY_PASSWD, cppu::UnoType<uno::Sequence < beans::PropertyValue >>::get(), 0, 0 },
204 10 : { OUString("SaveVersionOnClose"), HANDLE_SAVE_VERSION, cppu::UnoType<bool>::get(), 0, 0 },
205 10 : { OUString("EmbedFonts"), HANDLE_EMBED_FONTS, cppu::UnoType<bool>::get(), 0, 0 },
206 : { OUString(), 0, css::uno::Type(), 0, 0 }
207 445 : };
208 :
209 125 : PropertySetInfo* pInfo = new PropertySetInfo( aCommonSettingsInfoMap );
210 125 : pInfo->add( bIsDraw ? aDrawSettingsInfoMap : aImpressSettingsInfoMap );
211 :
212 125 : return pInfo;
213 : }
214 : }
215 :
216 : using namespace ::sd;
217 :
218 125 : DocumentSettings::DocumentSettings( SdXImpressDocument* pModel )
219 125 : : PropertySetHelper( createSettingsInfoImpl( !pModel->IsImpressDocument() ) ),
220 250 : mxModel( pModel )
221 : {
222 125 : }
223 :
224 250 : DocumentSettings::~DocumentSettings() throw()
225 : {
226 250 : }
227 :
228 264 : bool DocumentSettings::LoadList( XPropertyListType t, const OUString &rInPath,
229 : const OUString &rReferer,
230 : const uno::Reference< embed::XStorage > &xStorage )
231 : {
232 264 : SdDrawDocument* pDoc = mxModel->GetDoc();
233 :
234 264 : sal_Int32 nSlash = rInPath.lastIndexOf('/');
235 528 : OUString aPath, aName;
236 264 : if (nSlash < -1)
237 0 : aName = rInPath;
238 : else {
239 264 : aName = rInPath.copy( nSlash + 1 );
240 264 : aPath = rInPath.copy( 0, nSlash );
241 : }
242 :
243 : XPropertyListRef pList = XPropertyList::CreatePropertyList(
244 528 : t, aPath, rReferer );
245 264 : pList->SetName( aName );
246 :
247 264 : if( pList->LoadFrom( xStorage, rInPath, rReferer ) )
248 : {
249 0 : pDoc->SetPropertyList( pList );
250 0 : return true;
251 : }
252 :
253 528 : return false;
254 : }
255 :
256 0 : void DocumentSettings::AssignURL( XPropertyListType t, const Any* pValue,
257 : bool *pOk, bool *pChanged )
258 : {
259 0 : OUString aURL;
260 0 : if( !(bool)( *pValue >>= aURL ) )
261 0 : return;
262 :
263 0 : if( LoadList( t, aURL, ""/*TODO?*/, uno::Reference< embed::XStorage >() ) )
264 0 : *pOk = *pChanged = true;
265 : }
266 :
267 : static struct {
268 : const char *pName;
269 : XPropertyListType t;
270 : } aURLPropertyNames[] = {
271 : { "ColorTableURL", XCOLOR_LIST },
272 : { "DashTableURL", XDASH_LIST },
273 : { "LineEndTableURL", XLINE_END_LIST },
274 : { "HatchTableURL", XHATCH_LIST },
275 : { "GradientTableURL", XGRADIENT_LIST },
276 : { "BitmapTableURL", XBITMAP_LIST }
277 : };
278 :
279 1570 : static XPropertyListType getTypeOfName( const OUString &aName )
280 : {
281 10066 : for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ ) {
282 8760 : if( aName.equalsAscii( aURLPropertyNames[i].pName ) )
283 264 : return aURLPropertyNames[i].t;
284 : }
285 1306 : return UNKNOWN_XPROPERTYLISTTYPE;
286 : }
287 :
288 0 : static OUString getNameOfType( XPropertyListType t )
289 : {
290 0 : for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ ) {
291 0 : if( t == aURLPropertyNames[i].t )
292 : return OUString( aURLPropertyNames[i].pName,
293 0 : strlen( aURLPropertyNames[i].pName ) - 3,
294 0 : RTL_TEXTENCODING_UTF8 );
295 : }
296 0 : return OUString();
297 : }
298 :
299 : uno::Sequence<beans::PropertyValue>
300 44 : DocumentSettings::filterStreamsFromStorage(
301 : OUString const & referer,
302 : const uno::Reference< embed::XStorage > &xStorage,
303 : const uno::Sequence<beans::PropertyValue>& aConfigProps )
304 : {
305 44 : uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
306 44 : int nRet = 0;
307 1614 : for( sal_Int32 i = 0; i < aConfigProps.getLength(); i++ )
308 : {
309 1570 : XPropertyListType t = getTypeOfName( aConfigProps[i].Name );
310 1570 : if (t == UNKNOWN_XPROPERTYLISTTYPE)
311 1306 : aRet[nRet++] = aConfigProps[i];
312 : else
313 : {
314 264 : OUString aURL;
315 264 : aConfigProps[i].Value >>= aURL;
316 264 : LoadList( t, aURL, referer, xStorage );
317 : }
318 : }
319 44 : aRet.realloc( nRet );
320 44 : return aRet;
321 : }
322 :
323 : uno::Sequence<beans::PropertyValue>
324 13 : DocumentSettings::filterStreamsToStorage(
325 : const uno::Reference< embed::XStorage > &xStorage,
326 : const uno::Sequence<beans::PropertyValue>& aConfigProps )
327 : {
328 13 : uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
329 :
330 13 : bool bHasEmbed = false;
331 13 : SdDrawDocument* pDoc = mxModel->GetDoc();
332 91 : for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ )
333 : {
334 78 : XPropertyListRef pList = pDoc->GetPropertyList( (XPropertyListType) i );
335 78 : if( ( bHasEmbed = pList.is() && pList->IsEmbedInDocument() ) )
336 0 : break;
337 78 : }
338 13 : if( !bHasEmbed )
339 13 : return aConfigProps;
340 :
341 : try {
342 : // create Settings/ sub storage.
343 0 : uno::Reference< embed::XStorage > xSubStorage;
344 0 : xSubStorage = xStorage->openStorageElement( "Settings" ,
345 0 : embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
346 0 : if( !xSubStorage.is() )
347 0 : return aRet;
348 :
349 : // now populate it
350 0 : for( sal_Int32 i = 0; i < aConfigProps.getLength(); i++ )
351 : {
352 0 : XPropertyListType t = getTypeOfName( aConfigProps[i].Name );
353 0 : aRet[i] = aConfigProps[i];
354 0 : if (t >= 0) {
355 0 : XPropertyListRef pList = pDoc->GetPropertyList( t );
356 0 : if( !pList.is() || !pList->IsEmbedInDocument() )
357 0 : continue; // no change ...
358 : else
359 : {
360 : // Such specific path construction is grim.
361 0 : OUString aValue;
362 0 : aRet[i].Value >>= aValue;
363 :
364 0 : OUStringBuffer aName( getNameOfType( t ) );
365 0 : OUString aResult;
366 0 : if( pList->SaveTo( xSubStorage, aName.makeStringAndClear(), &aResult ) )
367 : {
368 0 : OUString aRealPath( "Settings/" );
369 0 : aRealPath += aResult;
370 0 : aRet[i].Value <<= aRealPath;
371 0 : }
372 0 : }
373 : }
374 : }
375 :
376 : // surprisingly difficult to make it really exist
377 0 : uno::Reference< embed::XTransactedObject > xTrans( xSubStorage, UNO_QUERY );
378 0 : if( xTrans.is() )
379 0 : xTrans->commit();
380 0 : uno::Reference< lang::XComponent > xComp( xSubStorage, UNO_QUERY );
381 0 : if( xComp.is() )
382 0 : xSubStorage->dispose();
383 0 : } catch (const uno::Exception &e) {
384 : (void)e;
385 : // fprintf (stderr, "saving etc. exception '%s'\n",
386 : // OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr());
387 : }
388 :
389 0 : return aRet;
390 : }
391 :
392 : // Most of the code reading/writing UNO document settings is the same in
393 : // sd, sc and sw and it is mostly copy-pasted back and forth.
394 : // TODO: Move _setPropertyValues and _getPropertyValues to some shared
395 : // place, at least for the settings that are common to sd, sc and sw
396 : void
397 1316 : DocumentSettings::_setPropertyValues(const PropertyMapEntry** ppEntries,
398 : const Any* pValues)
399 : throw (UnknownPropertyException, PropertyVetoException,
400 : IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
401 : {
402 1316 : ::SolarMutexGuard aGuard;
403 :
404 1316 : SdDrawDocument* pDoc = mxModel->GetDoc();
405 1316 : ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
406 1316 : if( NULL == pDoc || NULL == pDocSh )
407 : {
408 : throw RuntimeException("Document or Shell missing",
409 0 : static_cast<OWeakObject *>(this));
410 : }
411 :
412 1316 : bool bValue = false;
413 1316 : bool bOk, bChanged = false, bOptionsChanged = false;
414 :
415 2632 : SdOptionsPrintItem aOptionsPrintItem( ATTR_OPTIONS_PRINT );
416 :
417 1316 : SfxPrinter* pPrinter = pDocSh->GetPrinter( false );
418 1316 : if( pPrinter )
419 : {
420 44 : SdOptionsPrintItem const * pPrinterOptions = NULL;
421 44 : if(pPrinter->GetOptions().GetItemState( ATTR_OPTIONS_PRINT, false, reinterpret_cast<const SfxPoolItem**>(&pPrinterOptions)) == SfxItemState::SET)
422 0 : aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
423 : }
424 : else
425 : {
426 1272 : aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
427 : }
428 1316 : SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
429 :
430 2632 : for( ; *ppEntries; ppEntries++, pValues++ )
431 : {
432 1316 : bOk = false;
433 :
434 1316 : switch( (*ppEntries)->mnHandle )
435 : {
436 : case HANDLE_COLORTABLEURL:
437 0 : AssignURL( XCOLOR_LIST, pValues, &bOk, &bChanged );
438 0 : break;
439 :
440 : case HANDLE_DASHTABLEURL:
441 0 : AssignURL( XDASH_LIST, pValues, &bOk, &bChanged );
442 0 : break;
443 :
444 : case HANDLE_LINEENDTABLEURL:
445 0 : AssignURL( XLINE_END_LIST, pValues, &bOk, &bChanged );
446 0 : break;
447 :
448 : case HANDLE_HATCHTABLEURL:
449 0 : AssignURL( XHATCH_LIST, pValues, &bOk, &bChanged );
450 0 : break;
451 :
452 : case HANDLE_GRADIENTTABLEURL:
453 0 : AssignURL( XGRADIENT_LIST, pValues, &bOk, &bChanged );
454 0 : break;
455 :
456 : case HANDLE_BITMAPTABLEURL:
457 0 : AssignURL( XBITMAP_LIST, pValues, &bOk, &bChanged );
458 0 : break;
459 :
460 : case HANDLE_FORBIDDENCHARS:
461 39 : bOk = true;
462 39 : break;
463 :
464 : case HANDLE_APPLYUSERDATA:
465 : {
466 44 : bool bApplyUserData = false;
467 44 : if( *pValues >>= bApplyUserData )
468 : {
469 44 : bChanged = ( bApplyUserData != pDocSh->IsUseUserData() );
470 44 : pDocSh->SetUseUserData( bApplyUserData );
471 44 : bOk = true;
472 : }
473 : }
474 44 : break;
475 : case HANDLE_PRINTDRAWING:
476 42 : if( *pValues >>= bValue )
477 : {
478 42 : if( aPrintOpts.IsDraw() != bValue )
479 : {
480 0 : aPrintOpts.SetDraw( bValue );
481 0 : bOptionsChanged = true;
482 : }
483 :
484 42 : bOk = true;
485 : }
486 42 : break;
487 : case HANDLE_PRINTNOTES:
488 42 : if( *pValues >>= bValue )
489 : {
490 42 : if( aPrintOpts.IsNotes() != bValue )
491 : {
492 0 : aPrintOpts.SetNotes( bValue );
493 0 : bOptionsChanged = true;
494 : }
495 :
496 42 : bOk = true;
497 : }
498 42 : break;
499 : case HANDLE_PRINTHANDOUT:
500 42 : if( *pValues >>= bValue )
501 : {
502 42 : if( aPrintOpts.IsHandout() != bValue)
503 : {
504 0 : aPrintOpts.SetHandout( bValue );
505 0 : bOptionsChanged = true;
506 : }
507 :
508 42 : bOk = true;
509 : }
510 42 : break;
511 : case HANDLE_PRINTOUTLINE:
512 42 : if( *pValues >>= bValue )
513 : {
514 42 : if( aPrintOpts.IsOutline() != bValue)
515 : {
516 0 : aPrintOpts.SetOutline( bValue );
517 0 : bOptionsChanged = true;
518 : }
519 42 : bOk = true;
520 : }
521 42 : break;
522 : case HANDLE_SLIDESPERHANDOUT:
523 : {
524 42 : sal_Int16 nValue = 0;
525 42 : if( (*pValues >>= nValue) && (nValue >= 1) && (nValue <= 9) )
526 : {
527 42 : if( static_cast<sal_Int16>( aPrintOpts.GetHandoutPages() ) != nValue )
528 : {
529 0 : aPrintOpts.SetHandoutPages( static_cast< sal_uInt16 >( nValue ) );
530 0 : bOptionsChanged = true;
531 : }
532 42 : bOk = true;
533 : }
534 : }
535 42 : break;
536 : case HANDLE_HANDOUTHORIZONTAL:
537 42 : if( *pValues >>= bValue )
538 : {
539 42 : if( aPrintOpts.IsHandoutHorizontal() != bValue )
540 : {
541 0 : aPrintOpts.SetHandoutHorizontal( bValue );
542 0 : bOptionsChanged = true;
543 : }
544 42 : bOk = true;
545 : }
546 42 : break;
547 :
548 : case HANDLE_PRINTPAGENAME:
549 44 : if( *pValues >>= bValue )
550 : {
551 44 : if( aPrintOpts.IsPagename() != bValue)
552 : {
553 0 : aPrintOpts.SetPagename( bValue );
554 0 : bOptionsChanged = true;
555 : }
556 44 : bOk = true;
557 : }
558 44 : break;
559 : case HANDLE_PRINTDATE:
560 44 : if( *pValues >>= bValue )
561 : {
562 44 : if( aPrintOpts.IsDate() != bValue)
563 : {
564 0 : aPrintOpts.SetDate( bValue );
565 0 : bOptionsChanged = true;
566 : }
567 44 : bOk = true;
568 : }
569 44 : break;
570 : case HANDLE_PRINTTIME:
571 44 : if( *pValues >>= bValue )
572 : {
573 44 : if( aPrintOpts.IsDate() != bValue)
574 : {
575 0 : aPrintOpts.SetTime( bValue );
576 0 : bOptionsChanged = true;
577 : }
578 44 : bOk = true;
579 : }
580 44 : break;
581 : case HANDLE_PRINTHIDENPAGES:
582 44 : if( *pValues >>= bValue )
583 : {
584 44 : if( aPrintOpts.IsHiddenPages() != bValue)
585 : {
586 0 : aPrintOpts.SetHiddenPages( bValue );
587 0 : bOptionsChanged = true;
588 : }
589 44 : bOk = true;
590 : }
591 44 : break;
592 : case HANDLE_PRINTFITPAGE:
593 44 : if( *pValues >>= bValue )
594 : {
595 44 : if( aPrintOpts.IsPagesize() != bValue)
596 : {
597 0 : aPrintOpts.SetPagesize( bValue );
598 0 : bOptionsChanged = true;
599 : }
600 44 : bOk = true;
601 : }
602 44 : break;
603 : case HANDLE_PRINTTILEPAGE:
604 44 : if( *pValues >>= bValue )
605 : {
606 44 : if( aPrintOpts.IsPagetile() != bValue)
607 : {
608 0 : aPrintOpts.SetPagetile( bValue );
609 0 : bOptionsChanged = true;
610 : }
611 44 : bOk = true;
612 : }
613 44 : break;
614 : case HANDLE_PRINTBOOKLET:
615 44 : if( *pValues >>= bValue )
616 : {
617 44 : if( aPrintOpts.IsBooklet() != bValue)
618 : {
619 0 : aPrintOpts.SetBooklet( bValue );
620 0 : bOptionsChanged = true;
621 : }
622 44 : bOk = true;
623 : }
624 44 : break;
625 : case HANDLE_PRINTBOOKLETFRONT:
626 44 : if( *pValues >>= bValue )
627 : {
628 44 : if( aPrintOpts.IsFrontPage() != bValue)
629 : {
630 0 : aPrintOpts.SetFrontPage( bValue );
631 0 : bOptionsChanged = true;
632 : }
633 44 : bOk = true;
634 : }
635 44 : break;
636 : case HANDLE_PRINTBOOKLETBACK:
637 44 : if( *pValues >>= bValue )
638 : {
639 44 : if( aPrintOpts.IsBackPage() != bValue)
640 : {
641 0 : aPrintOpts.SetBackPage( bValue );
642 0 : bOptionsChanged = true;
643 : }
644 44 : bOk = true;
645 : }
646 44 : break;
647 : case HANDLE_PRINTQUALITY:
648 : {
649 44 : sal_Int32 nValue = 0;
650 44 : if( *pValues >>= nValue )
651 : {
652 44 : if( aPrintOpts.GetOutputQuality() != nValue)
653 : {
654 0 : aPrintOpts.SetOutputQuality( (sal_uInt16)nValue );
655 0 : bOptionsChanged = true;
656 : }
657 44 : bOk = true;
658 : }
659 : }
660 44 : break;
661 : case HANDLE_MEASUREUNIT:
662 : {
663 1 : sal_Int16 nValue = 0;
664 1 : if( *pValues >>= nValue )
665 : {
666 : FieldUnit nFieldUnit;
667 1 : if( SvxMeasureUnitToFieldUnit( nValue, nFieldUnit ) )
668 : {
669 1 : pDoc->SetUIUnit( nFieldUnit );
670 1 : bOk = true;
671 : }
672 : }
673 : }
674 1 : break;
675 : case HANDLE_SCALE_NUM:
676 : {
677 1 : sal_Int32 nValue = 0;
678 1 : if( *pValues >>= nValue )
679 : {
680 1 : Fraction aFract( nValue, pDoc->GetUIScale().GetDenominator() );
681 1 : pDoc->SetUIScale( aFract );
682 1 : bOk = true;
683 1 : bChanged = true;
684 : }
685 : }
686 1 : break;
687 : case HANDLE_SCALE_DOM:
688 : {
689 1 : sal_Int32 nValue = 0;
690 1 : if( *pValues >>= nValue )
691 : {
692 1 : Fraction aFract( pDoc->GetUIScale().GetNumerator(), nValue );
693 1 : pDoc->SetUIScale( aFract );
694 1 : bOk = true;
695 1 : bChanged = true;
696 : }
697 : }
698 1 : break;
699 :
700 : case HANDLE_TABSTOP:
701 : {
702 44 : sal_Int32 nValue = 0;
703 44 : if( (*pValues >>= nValue) && (nValue >= 0) )
704 : {
705 44 : pDoc->SetDefaultTabulator((sal_uInt16)nValue);
706 44 : bOk = true;
707 44 : bChanged = true;
708 : }
709 : }
710 44 : break;
711 : case HANDLE_PAGENUMFMT:
712 : {
713 44 : sal_Int32 nValue = 0;
714 44 : if( (*pValues >>= nValue ) && (nValue >= SVX_CHARS_UPPER_LETTER ) && (nValue <= SVX_PAGEDESC) )
715 : {
716 44 : pDoc->SetPageNumType((SvxNumType)nValue);
717 44 : bOk = true;
718 44 : bChanged = true;
719 : }
720 : }
721 44 : break;
722 : case HANDLE_PRINTERNAME:
723 : {
724 44 : OUString aPrinterName;
725 44 : if( *pValues >>= aPrinterName )
726 : {
727 44 : bOk = true;
728 44 : if( !aPrinterName.isEmpty() && pDocSh->GetCreateMode() != SfxObjectCreateMode::EMBEDDED )
729 : {
730 0 : SfxPrinter *pTempPrinter = pDocSh->GetPrinter( true );
731 0 : if (pTempPrinter)
732 : {
733 0 : VclPtr<SfxPrinter> pNewPrinter = VclPtr<SfxPrinter>::Create( pTempPrinter->GetOptions().Clone(), aPrinterName );
734 0 : pDocSh->SetPrinter( pNewPrinter );
735 : }
736 : }
737 44 : }
738 : }
739 44 : break;
740 : case HANDLE_PRINTERJOB:
741 : {
742 44 : Sequence < sal_Int8 > aSequence;
743 44 : if ( *pValues >>= aSequence )
744 : {
745 44 : bOk = true;
746 44 : sal_uInt32 nSize = aSequence.getLength();
747 44 : if( nSize )
748 : {
749 15 : SvMemoryStream aStream (aSequence.getArray(), nSize, StreamMode::READ );
750 15 : aStream.Seek ( STREAM_SEEK_TO_BEGIN );
751 : SfxItemSet* pItemSet;
752 :
753 15 : if( pPrinter )
754 : {
755 0 : pItemSet = pPrinter->GetOptions().Clone();
756 : }
757 : else
758 : {
759 : pItemSet = new SfxItemSet(pDoc->GetPool(),
760 : SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
761 : SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
762 : ATTR_OPTIONS_PRINT, ATTR_OPTIONS_PRINT,
763 15 : 0 );
764 : }
765 :
766 15 : pPrinter = SfxPrinter::Create ( aStream, pItemSet );
767 :
768 30 : MapMode aMM (pPrinter->GetMapMode());
769 15 : aMM.SetMapUnit(MAP_100TH_MM);
770 15 : pPrinter->SetMapMode(aMM);
771 :
772 15 : pDocSh->SetPrinter( pPrinter );
773 :
774 30 : pPrinter = NULL;
775 : }
776 44 : }
777 : }
778 44 : break;
779 :
780 : case HANDLE_PARAGRAPHSUMMATION :
781 : {
782 44 : bool bIsSummationOfParagraphs = false;
783 44 : if ( *pValues >>= bIsSummationOfParagraphs )
784 : {
785 44 : bOk = true;
786 44 : bChanged = true;
787 44 : if ( pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
788 : {
789 43 : EEControlBits nSum = bIsSummationOfParagraphs ? EEControlBits::ULSPACESUMMATION : EEControlBits::NONE;
790 : EEControlBits nCntrl;
791 :
792 43 : pDoc->SetSummationOfParagraphs( bIsSummationOfParagraphs );
793 43 : SdDrawDocument* pDocument = pDocSh->GetDoc();
794 43 : SdrOutliner& rOutl = pDocument->GetDrawOutliner();
795 43 : nCntrl = rOutl.GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
796 43 : rOutl.SetControlWord( nCntrl | nSum );
797 43 : ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
798 43 : if( pOutl )
799 : {
800 0 : nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
801 0 : pOutl->SetControlWord( nCntrl | nSum );
802 : }
803 43 : pOutl = pDocument->GetInternalOutliner( false );
804 43 : if( pOutl )
805 : {
806 43 : nCntrl = pOutl->GetControlWord() &~ EEControlBits::ULSPACESUMMATION;
807 43 : pOutl->SetControlWord( nCntrl | nSum );
808 : }
809 : }
810 : }
811 : }
812 44 : break;
813 :
814 : case HANDLE_CHARCOMPRESS:
815 : {
816 44 : sal_Int16 nCharCompressType = 0;
817 44 : if( *pValues >>= nCharCompressType )
818 : {
819 44 : bOk = true;
820 :
821 44 : pDoc->SetCharCompressType( (sal_uInt16)nCharCompressType );
822 44 : SdDrawDocument* pDocument = pDocSh->GetDoc();
823 44 : SdrOutliner& rOutl = pDocument->GetDrawOutliner();
824 44 : rOutl.SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
825 44 : ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
826 44 : if( pOutl )
827 : {
828 0 : pOutl->SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
829 : }
830 44 : pOutl = pDocument->GetInternalOutliner( false );
831 44 : if( pOutl )
832 : {
833 44 : pOutl->SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
834 : }
835 : }
836 44 : break;
837 :
838 : }
839 : case HANDLE_ASIANPUNCT:
840 : {
841 44 : bool bAsianPunct = false;
842 44 : if( *pValues >>= bAsianPunct )
843 : {
844 44 : bOk = true;
845 :
846 44 : pDoc->SetKernAsianPunctuation( bAsianPunct );
847 44 : SdDrawDocument* pDocument = pDocSh->GetDoc();
848 44 : SdrOutliner& rOutl = pDocument->GetDrawOutliner();
849 44 : rOutl.SetKernAsianPunctuation( bAsianPunct );
850 44 : ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
851 44 : if( pOutl )
852 : {
853 0 : pOutl->SetKernAsianPunctuation( bAsianPunct );
854 : }
855 44 : pOutl = pDocument->GetInternalOutliner( false );
856 44 : if( pOutl )
857 : {
858 44 : pOutl->SetKernAsianPunctuation( bAsianPunct );
859 : }
860 : }
861 44 : break;
862 :
863 : }
864 : case HANDLE_UPDATEFROMTEMPLATE:
865 : {
866 44 : bool value = false;
867 44 : if( *pValues >>= value )
868 : {
869 44 : bChanged = ( value != pDocSh->IsQueryLoadTemplate() );
870 44 : pDocSh->SetQueryLoadTemplate( value );
871 44 : bOk = true;
872 : }
873 : }
874 44 : break;
875 :
876 : case HANDLE_PRINTER_INDEPENDENT_LAYOUT:
877 : {
878 : // Just propagate the new printer independent layout mode to
879 : // the document and determine it really differs from the old
880 : // one.
881 : sal_Int16 nOldValue =
882 44 : (sal_Int16)pDoc->GetPrinterIndependentLayout ();
883 44 : sal_Int16 nValue = 0;
884 44 : if (*pValues >>= nValue)
885 : {
886 44 : pDoc->SetPrinterIndependentLayout (nValue);
887 44 : bChanged = (nValue != nOldValue);
888 44 : bOk = true;
889 : }
890 : }
891 44 : break;
892 :
893 : // --> #i33095#
894 : case HANDLE_LOAD_READONLY:
895 : {
896 44 : bool bNewValue = false;
897 44 : if ( *pValues >>= bNewValue )
898 : {
899 44 : bChanged = ( pDocSh->IsLoadReadonly() != bNewValue );
900 44 : pDocSh->SetLoadReadonly( bNewValue );
901 44 : bOk = true;
902 : }
903 : }
904 44 : break;
905 :
906 : case HANDLE_MODIFY_PASSWD:
907 : {
908 0 : uno::Sequence< beans::PropertyValue > aInfo;
909 0 : if ( !( *pValues >>= aInfo ) )
910 : throw lang::IllegalArgumentException(
911 : OUString( "Value of type Sequence<PropertyValue> expected!" ),
912 : uno::Reference< uno::XInterface >(),
913 0 : 2 );
914 :
915 0 : if ( !pDocSh->SetModifyPasswordInfo( aInfo ) )
916 : throw beans::PropertyVetoException(
917 0 : "The hash is not allowed to be changed now!" );
918 :
919 : }
920 0 : break;
921 :
922 : case HANDLE_SAVE_VERSION:
923 : {
924 44 : bool bNewValue = false;
925 44 : if ( *pValues >>= bNewValue )
926 : {
927 44 : bChanged = ( pDocSh->IsSaveVersionOnClose() != bNewValue );
928 44 : pDocSh->SetSaveVersionOnClose( bNewValue );
929 44 : bOk = true;
930 : }
931 : }
932 44 : break;
933 :
934 : case HANDLE_EMBED_FONTS:
935 : {
936 54 : bool bNewValue = false;
937 54 : if ( *pValues >>= bNewValue )
938 : {
939 54 : bChanged = ( pDoc->IsUsingEmbededFonts() != bNewValue );
940 54 : pDoc->SetIsUsingEmbededFonts( bNewValue );
941 54 : bOk = true;
942 : }
943 : }
944 54 : break;
945 :
946 : default:
947 0 : throw UnknownPropertyException();
948 : }
949 :
950 1316 : if( !bOk )
951 0 : throw IllegalArgumentException();
952 : }
953 :
954 1316 : if( bOptionsChanged )
955 : {
956 0 : if( !pPrinter )
957 0 : pPrinter = pDocSh->GetPrinter( true );
958 0 : SfxItemSet aNewOptions( pPrinter->GetOptions() );
959 0 : aNewOptions.Put( aOptionsPrintItem );
960 0 : pPrinter->SetOptions( aNewOptions );
961 : }
962 :
963 1316 : if( bChanged || bOptionsChanged )
964 1453 : mxModel->SetModified( true );
965 1316 : }
966 :
967 90 : void DocumentSettings::ExtractURL( XPropertyListType t, Any* pValue )
968 : {
969 90 : XPropertyListRef pList = mxModel->GetDoc()->GetPropertyList( t );
970 90 : if( !pList.is() )
971 90 : return;
972 :
973 180 : INetURLObject aPathURL( pList->GetPath() );
974 90 : aPathURL.insertName( pList->GetName() );
975 90 : aPathURL.setExtension( pList->GetDefaultExt() );
976 180 : OUString aPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
977 180 : *pValue <<= aPath;
978 : }
979 :
980 : void
981 584 : DocumentSettings::_getPropertyValues(
982 : const PropertyMapEntry** ppEntries, Any* pValue)
983 : throw (UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
984 : {
985 584 : ::SolarMutexGuard aGuard;
986 :
987 584 : SdDrawDocument* pDoc = mxModel->GetDoc();
988 584 : ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
989 584 : if( NULL == pDoc || NULL == pDocSh )
990 : {
991 : throw RuntimeException("Document or Shell missing",
992 0 : static_cast<OWeakObject *>(this));
993 : }
994 :
995 1168 : SdOptionsPrintItem aOptionsPrintItem( ATTR_OPTIONS_PRINT );
996 :
997 584 : SfxPrinter* pPrinter = pDocSh->GetPrinter( false );
998 584 : if( pPrinter )
999 : {
1000 114 : SdOptionsPrintItem const * pPrinterOptions = NULL;
1001 114 : if(pPrinter->GetOptions().GetItemState( ATTR_OPTIONS_PRINT, false, reinterpret_cast<const SfxPoolItem**>(&pPrinterOptions)) == SfxItemState::SET)
1002 0 : aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
1003 : }
1004 : else
1005 : {
1006 470 : aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
1007 : }
1008 584 : SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
1009 :
1010 1168 : for( ; *ppEntries; ppEntries++, pValue++ )
1011 : {
1012 584 : switch( (*ppEntries)->mnHandle )
1013 : {
1014 : case HANDLE_COLORTABLEURL:
1015 15 : ExtractURL( XCOLOR_LIST, pValue );
1016 15 : break;
1017 : case HANDLE_DASHTABLEURL:
1018 15 : ExtractURL( XDASH_LIST, pValue );
1019 15 : break;
1020 : case HANDLE_LINEENDTABLEURL:
1021 15 : ExtractURL( XLINE_END_LIST, pValue );
1022 15 : break;
1023 : case HANDLE_HATCHTABLEURL:
1024 15 : ExtractURL( XHATCH_LIST, pValue );
1025 15 : break;
1026 : case HANDLE_GRADIENTTABLEURL:
1027 15 : ExtractURL( XGRADIENT_LIST, pValue );
1028 15 : break;
1029 : case HANDLE_BITMAPTABLEURL:
1030 15 : ExtractURL( XBITMAP_LIST, pValue );
1031 15 : break;
1032 : case HANDLE_FORBIDDENCHARS:
1033 54 : *pValue <<= mxModel->getForbiddenCharsTable();
1034 54 : break;
1035 : case HANDLE_APPLYUSERDATA:
1036 15 : *pValue <<= pDocSh->IsUseUserData();
1037 15 : break;
1038 : case HANDLE_PRINTDRAWING:
1039 7 : *pValue <<= aPrintOpts.IsDraw();
1040 7 : break;
1041 : case HANDLE_PRINTNOTES:
1042 7 : *pValue <<= aPrintOpts.IsNotes();
1043 7 : break;
1044 : case HANDLE_PRINTHANDOUT:
1045 7 : *pValue <<= aPrintOpts.IsHandout();
1046 7 : break;
1047 : case HANDLE_PRINTOUTLINE:
1048 7 : *pValue <<= aPrintOpts.IsOutline();
1049 7 : break;
1050 : case HANDLE_SLIDESPERHANDOUT:
1051 7 : *pValue <<= (sal_Int16)aPrintOpts.GetHandoutPages();
1052 7 : break;
1053 : case HANDLE_HANDOUTHORIZONTAL:
1054 7 : *pValue <<= aPrintOpts.IsHandoutHorizontal();
1055 7 : break;
1056 : case HANDLE_PRINTPAGENAME:
1057 15 : *pValue <<= aPrintOpts.IsPagename();
1058 15 : break;
1059 : case HANDLE_PRINTDATE:
1060 15 : *pValue <<= aPrintOpts.IsDate();
1061 15 : break;
1062 : case HANDLE_PRINTTIME:
1063 15 : *pValue <<= aPrintOpts.IsTime();
1064 15 : break;
1065 : case HANDLE_PRINTHIDENPAGES:
1066 15 : *pValue <<= aPrintOpts.IsHiddenPages();
1067 15 : break;
1068 : case HANDLE_PRINTFITPAGE:
1069 15 : *pValue <<= aPrintOpts.IsPagesize();
1070 15 : break;
1071 : case HANDLE_PRINTTILEPAGE:
1072 15 : *pValue <<= aPrintOpts.IsPagetile();
1073 15 : break;
1074 : case HANDLE_PRINTBOOKLET:
1075 15 : *pValue <<= aPrintOpts.IsBooklet();
1076 15 : break;
1077 : case HANDLE_PRINTBOOKLETFRONT:
1078 15 : *pValue <<= aPrintOpts.IsFrontPage();
1079 15 : break;
1080 : case HANDLE_PRINTBOOKLETBACK:
1081 15 : *pValue <<= aPrintOpts.IsBackPage();
1082 15 : break;
1083 : case HANDLE_PRINTQUALITY:
1084 15 : *pValue <<= (sal_Int32)aPrintOpts.GetOutputQuality();
1085 15 : break;
1086 : case HANDLE_MEASUREUNIT:
1087 : {
1088 : short nMeasure;
1089 8 : SvxFieldUnitToMeasureUnit( pDoc->GetUIUnit(), nMeasure );
1090 8 : *pValue <<= (sal_Int16)nMeasure;
1091 : }
1092 8 : break;
1093 : case HANDLE_SCALE_NUM:
1094 8 : *pValue <<= (sal_Int32)pDoc->GetUIScale().GetNumerator();
1095 8 : break;
1096 : case HANDLE_SCALE_DOM:
1097 8 : *pValue <<= (sal_Int32)pDoc->GetUIScale().GetDenominator();
1098 8 : break;
1099 : case HANDLE_TABSTOP:
1100 15 : *pValue <<= (sal_Int32)pDoc->GetDefaultTabulator();
1101 15 : break;
1102 : case HANDLE_PAGENUMFMT:
1103 15 : *pValue <<= (sal_Int32)pDoc->GetPageNumType();
1104 15 : break;
1105 : case HANDLE_PRINTERNAME:
1106 : {
1107 15 : SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
1108 15 : *pValue <<= pTempPrinter ? OUString ( pTempPrinter->GetName()) : OUString();
1109 : }
1110 15 : break;
1111 : case HANDLE_PRINTERJOB:
1112 : {
1113 15 : SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
1114 15 : if (pTempPrinter)
1115 : {
1116 3 : SvMemoryStream aStream;
1117 3 : pTempPrinter->Store( aStream );
1118 3 : aStream.Seek ( STREAM_SEEK_TO_END );
1119 3 : sal_uInt32 nSize = aStream.Tell();
1120 3 : aStream.Seek ( STREAM_SEEK_TO_BEGIN );
1121 6 : Sequence < sal_Int8 > aSequence ( nSize );
1122 3 : memcpy ( aSequence.getArray(), aStream.GetData(), nSize );
1123 6 : *pValue <<= aSequence;
1124 : }
1125 : else
1126 : {
1127 12 : Sequence < sal_Int8 > aSequence;
1128 12 : *pValue <<= aSequence;
1129 : }
1130 : }
1131 15 : break;
1132 :
1133 : case HANDLE_PARAGRAPHSUMMATION :
1134 : {
1135 15 : bool bIsSummationOfParagraphs = pDoc->IsSummationOfParagraphs();
1136 15 : *pValue <<= bIsSummationOfParagraphs;
1137 : }
1138 15 : break;
1139 :
1140 : case HANDLE_CHARCOMPRESS:
1141 : {
1142 15 : *pValue <<= (sal_Int16)pDoc->GetCharCompressType();
1143 15 : break;
1144 : }
1145 :
1146 : case HANDLE_ASIANPUNCT:
1147 : {
1148 15 : *pValue <<= pDoc->IsKernAsianPunctuation();
1149 15 : break;
1150 : }
1151 :
1152 : case HANDLE_UPDATEFROMTEMPLATE:
1153 : {
1154 15 : *pValue <<= pDocSh->IsQueryLoadTemplate();
1155 : }
1156 15 : break;
1157 :
1158 : case HANDLE_PRINTER_INDEPENDENT_LAYOUT:
1159 : {
1160 : sal_Int16 nPrinterIndependentLayout =
1161 15 : (sal_Int16)pDoc->GetPrinterIndependentLayout();
1162 15 : *pValue <<= nPrinterIndependentLayout;
1163 : }
1164 15 : break;
1165 :
1166 : // --> #i33095#
1167 : case HANDLE_LOAD_READONLY:
1168 : {
1169 15 : *pValue <<= pDocSh->IsLoadReadonly();
1170 : }
1171 15 : break;
1172 :
1173 : case HANDLE_MODIFY_PASSWD:
1174 : {
1175 15 : *pValue <<= pDocSh->GetModifyPasswordInfo();
1176 : }
1177 15 : break;
1178 :
1179 : case HANDLE_SAVE_VERSION:
1180 : {
1181 15 : *pValue <<= pDocSh->IsSaveVersionOnClose();
1182 : }
1183 15 : break;
1184 :
1185 : case HANDLE_EMBED_FONTS:
1186 : {
1187 29 : *pValue <<= pDoc->IsUsingEmbededFonts();
1188 : }
1189 29 : break;
1190 :
1191 : default:
1192 0 : throw UnknownPropertyException();
1193 : }
1194 584 : }
1195 584 : }
1196 :
1197 : // XInterface
1198 125 : Any SAL_CALL DocumentSettings::queryInterface( const Type& aType ) throw (RuntimeException, std::exception)
1199 : {
1200 125 : return WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::queryInterface( aType );
1201 : }
1202 :
1203 250 : void SAL_CALL DocumentSettings::acquire( ) throw ()
1204 : {
1205 250 : WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::acquire();
1206 250 : }
1207 :
1208 250 : void SAL_CALL DocumentSettings::release( ) throw ()
1209 : {
1210 250 : WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::release();
1211 250 : }
1212 :
1213 : // XPropertySet
1214 98 : Reference< XPropertySetInfo > SAL_CALL DocumentSettings::getPropertySetInfo( ) throw(RuntimeException, std::exception)
1215 : {
1216 98 : return PropertySetHelper::getPropertySetInfo();
1217 : }
1218 :
1219 1316 : void SAL_CALL DocumentSettings::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
1220 : {
1221 1316 : PropertySetHelper::setPropertyValue( aPropertyName, aValue );
1222 1316 : }
1223 :
1224 584 : Any SAL_CALL DocumentSettings::getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1225 : {
1226 584 : return PropertySetHelper::getPropertyValue( PropertyName );
1227 : }
1228 :
1229 0 : void SAL_CALL DocumentSettings::addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1230 : {
1231 0 : PropertySetHelper::addPropertyChangeListener( aPropertyName, xListener );
1232 0 : }
1233 :
1234 0 : void SAL_CALL DocumentSettings::removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1235 : {
1236 0 : PropertySetHelper::removePropertyChangeListener( aPropertyName, aListener );
1237 0 : }
1238 :
1239 0 : void SAL_CALL DocumentSettings::addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1240 : {
1241 0 : PropertySetHelper::addVetoableChangeListener( PropertyName, aListener );
1242 0 : }
1243 :
1244 0 : void SAL_CALL DocumentSettings::removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1245 : {
1246 0 : PropertySetHelper::removeVetoableChangeListener( PropertyName, aListener );
1247 0 : }
1248 :
1249 : // XMultiPropertySet
1250 0 : void SAL_CALL DocumentSettings::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues ) throw(PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
1251 : {
1252 0 : PropertySetHelper::setPropertyValues( aPropertyNames, aValues );
1253 0 : }
1254 :
1255 0 : Sequence< Any > SAL_CALL DocumentSettings::getPropertyValues( const Sequence< OUString >& aPropertyNames ) throw(RuntimeException, std::exception)
1256 : {
1257 0 : return PropertySetHelper::getPropertyValues( aPropertyNames );
1258 : }
1259 :
1260 0 : void SAL_CALL DocumentSettings::addPropertiesChangeListener( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener ) throw(RuntimeException, std::exception)
1261 : {
1262 0 : PropertySetHelper::addPropertiesChangeListener( aPropertyNames, xListener );
1263 0 : }
1264 :
1265 0 : void SAL_CALL DocumentSettings::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& xListener ) throw(RuntimeException, std::exception)
1266 : {
1267 0 : PropertySetHelper::removePropertiesChangeListener( xListener );
1268 0 : }
1269 :
1270 0 : void SAL_CALL DocumentSettings::firePropertiesChangeEvent( const Sequence< OUString >& aPropertyNames, const Reference< XPropertiesChangeListener >& xListener ) throw(RuntimeException, std::exception)
1271 : {
1272 0 : PropertySetHelper::firePropertiesChangeEvent( aPropertyNames, xListener );
1273 0 : }
1274 :
1275 : // XServiceInfo
1276 0 : OUString SAL_CALL DocumentSettings::getImplementationName( )
1277 : throw(RuntimeException, std::exception)
1278 : {
1279 0 : return OUString( "com.sun.star.comp.Draw.DocumentSettings" );
1280 : }
1281 :
1282 0 : sal_Bool SAL_CALL DocumentSettings::supportsService( const OUString& ServiceName )
1283 : throw(RuntimeException, std::exception)
1284 : {
1285 0 : return cppu::supportsService(this, ServiceName);
1286 : }
1287 :
1288 0 : Sequence< OUString > SAL_CALL DocumentSettings::getSupportedServiceNames( )
1289 : throw(RuntimeException, std::exception)
1290 : {
1291 0 : Sequence< OUString > aSeq( 2 );
1292 0 : aSeq[0] = "com.sun.star.document.Settings" ;
1293 0 : if( mxModel->IsImpressDocument() )
1294 : {
1295 0 : aSeq[1] = "com.sun.star.presentation.DocumentSettings" ;
1296 : }
1297 : else
1298 : {
1299 0 : aSeq[1] = "com.sun.star.drawing.DocumentSettings" ;
1300 : }
1301 :
1302 0 : return aSeq;
1303 66 : }
1304 :
1305 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|