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 106 : Reference< XInterface > SAL_CALL DocumentSettings_createInstance( SdXImpressDocument* pModel )
126 : throw ()
127 : {
128 : DBG_ASSERT( pModel, "I need a model for the DocumentSettings!" );
129 106 : return (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 106 : PropertySetInfo * createSettingsInfoImpl( bool bIsDraw )
149 : {
150 : static PropertyMapEntry const aImpressSettingsInfoMap[] =
151 : {
152 16 : { OUString("IsPrintDrawing"), HANDLE_PRINTDRAWING, ::getBooleanCppuType(), 0, MID_PRINTER },
153 16 : { OUString("IsPrintNotes"), HANDLE_PRINTNOTES, ::getBooleanCppuType(), 0, MID_PRINTER },
154 16 : { OUString("IsPrintHandout"), HANDLE_PRINTHANDOUT, ::getBooleanCppuType(), 0, MID_PRINTER },
155 16 : { OUString("IsPrintOutline"), HANDLE_PRINTOUTLINE, ::getBooleanCppuType(), 0, MID_PRINTER },
156 16 : { OUString("SlidesPerHandout"), HANDLE_SLIDESPERHANDOUT, ::cppu::UnoType<sal_Int16>::get(), 0, MID_PRINTER },
157 16 : { OUString("HandoutsHorizontal"), HANDLE_HANDOUTHORIZONTAL, ::getBooleanCppuType(), 0, MID_PRINTER },
158 : { OUString(), 0, css::uno::Type(), 0, 0 }
159 218 : };
160 :
161 : static PropertyMapEntry const aDrawSettingsInfoMap[] =
162 : {
163 16 : { OUString("MeasureUnit"), HANDLE_MEASUREUNIT, ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
164 16 : { OUString("ScaleNumerator"), HANDLE_SCALE_NUM, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
165 16 : { OUString("ScaleDenominator"), HANDLE_SCALE_DOM, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
166 : { OUString(), 0, css::uno::Type(), 0, 0 }
167 170 : };
168 :
169 : static PropertyMapEntry const aCommonSettingsInfoMap[] =
170 : {
171 16 : { OUString("DefaultTabStop"), HANDLE_TABSTOP, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
172 16 : { OUString("PrinterName"), HANDLE_PRINTERNAME, ::cppu::UnoType<OUString>::get(), 0, 0 },
173 16 : { OUString("PrinterSetup"), HANDLE_PRINTERJOB, ::getCppuType((const uno::Sequence < sal_Int8 > *)0), 0, MID_PRINTER },
174 :
175 16 : { OUString("IsPrintPageName"), HANDLE_PRINTPAGENAME, ::getBooleanCppuType(), 0, MID_PRINTER },
176 16 : { OUString("IsPrintDate"), HANDLE_PRINTDATE, ::getBooleanCppuType(), 0, MID_PRINTER },
177 16 : { OUString("IsPrintTime"), HANDLE_PRINTTIME, ::getBooleanCppuType(), 0, MID_PRINTER },
178 16 : { OUString("IsPrintHiddenPages"), HANDLE_PRINTHIDENPAGES, ::getBooleanCppuType(), 0, MID_PRINTER },
179 16 : { OUString("IsPrintFitPage"), HANDLE_PRINTFITPAGE, ::getBooleanCppuType(), 0, MID_PRINTER },
180 16 : { OUString("IsPrintTilePage"), HANDLE_PRINTTILEPAGE, ::getBooleanCppuType(), 0, MID_PRINTER },
181 16 : { OUString("IsPrintBooklet"), HANDLE_PRINTBOOKLET, ::getBooleanCppuType(), 0, MID_PRINTER },
182 16 : { OUString("IsPrintBookletFront"), HANDLE_PRINTBOOKLETFRONT, ::getBooleanCppuType(), 0, MID_PRINTER },
183 16 : { OUString("IsPrintBookletBack"), HANDLE_PRINTBOOKLETBACK, ::getBooleanCppuType(), 0, MID_PRINTER },
184 16 : { OUString("PrintQuality"), HANDLE_PRINTQUALITY, ::cppu::UnoType<sal_Int32>::get(), 0, MID_PRINTER },
185 16 : { OUString("ColorTableURL"), HANDLE_COLORTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
186 16 : { OUString("DashTableURL"), HANDLE_DASHTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
187 16 : { OUString("LineEndTableURL"), HANDLE_LINEENDTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
188 16 : { OUString("HatchTableURL"), HANDLE_HATCHTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
189 16 : { OUString("GradientTableURL"), HANDLE_GRADIENTTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
190 16 : { OUString("BitmapTableURL"), HANDLE_BITMAPTABLEURL, ::cppu::UnoType<OUString>::get(), 0, 0 },
191 :
192 16 : { OUString("ForbiddenCharacters"), HANDLE_FORBIDDENCHARS, cppu::UnoType<XForbiddenCharacters>::get(), 0, 0 },
193 16 : { OUString("ApplyUserData"), HANDLE_APPLYUSERDATA, ::getBooleanCppuType(), 0, 0 },
194 :
195 16 : { OUString("PageNumberFormat"), HANDLE_PAGENUMFMT, ::cppu::UnoType<sal_Int32>::get(), 0, 0 },
196 16 : { OUString("ParagraphSummation"), HANDLE_PARAGRAPHSUMMATION, ::getBooleanCppuType(), 0, 0 },
197 16 : { OUString("CharacterCompressionType"),HANDLE_CHARCOMPRESS, ::cppu::UnoType<sal_Int16>::get(), 0, 0 },
198 16 : { OUString("IsKernAsianPunctuation"),HANDLE_ASIANPUNCT, ::getBooleanCppuType(), 0, 0 },
199 16 : { OUString("UpdateFromTemplate"), HANDLE_UPDATEFROMTEMPLATE, ::getBooleanCppuType(), 0, 0 },
200 16 : { OUString("PrinterIndependentLayout"),HANDLE_PRINTER_INDEPENDENT_LAYOUT,::cppu::UnoType<sal_Int16>::get(), 0, 0 },
201 : // --> #i33095#
202 16 : { OUString("LoadReadonly"), HANDLE_LOAD_READONLY, ::getBooleanCppuType(), 0, 0 },
203 16 : { OUString("ModifyPasswordInfo"), HANDLE_MODIFY_PASSWD, ::getCppuType((uno::Sequence < beans::PropertyValue > *)0), 0, 0 },
204 16 : { OUString("SaveVersionOnClose"), HANDLE_SAVE_VERSION, ::getBooleanCppuType(), 0, 0 },
205 16 : { OUString("EmbedFonts"), HANDLE_EMBED_FONTS, ::getBooleanCppuType(), 0, 0 },
206 : { OUString(), 0, css::uno::Type(), 0, 0 }
207 618 : };
208 :
209 106 : PropertySetInfo* pInfo = new PropertySetInfo( aCommonSettingsInfoMap );
210 106 : pInfo->add( bIsDraw ? aDrawSettingsInfoMap : aImpressSettingsInfoMap );
211 :
212 106 : return pInfo;
213 : }
214 : }
215 :
216 : using namespace ::sd;
217 :
218 106 : DocumentSettings::DocumentSettings( SdXImpressDocument* pModel )
219 106 : : PropertySetHelper( createSettingsInfoImpl( !pModel->IsImpressDocument() ) ),
220 212 : mxModel( pModel )
221 : {
222 106 : }
223 :
224 212 : DocumentSettings::~DocumentSettings() throw()
225 : {
226 212 : }
227 :
228 216 : bool DocumentSettings::LoadList( XPropertyListType t, const OUString &rInPath,
229 : const OUString &rReferer,
230 : const uno::Reference< embed::XStorage > &xStorage )
231 : {
232 216 : SdDrawDocument* pDoc = mxModel->GetDoc();
233 :
234 216 : sal_Int32 nSlash = rInPath.lastIndexOf('/');
235 432 : OUString aPath, aName;
236 216 : if (nSlash < -1)
237 0 : aName = rInPath;
238 : else {
239 216 : aName = rInPath.copy( nSlash + 1 );
240 216 : aPath = rInPath.copy( 0, nSlash );
241 : }
242 :
243 : XPropertyListRef pList = XPropertyList::CreatePropertyList(
244 432 : t, aPath, rReferer );
245 216 : pList->SetName( aName );
246 :
247 216 : if( pList->LoadFrom( xStorage, rInPath, rReferer ) )
248 : {
249 24 : pDoc->SetPropertyList( pList );
250 24 : return true;
251 : }
252 :
253 408 : 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 1270 : static XPropertyListType getTypeOfName( const OUString &aName )
280 : {
281 8134 : for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ ) {
282 7080 : if( aName.equalsAscii( aURLPropertyNames[i].pName ) )
283 216 : return aURLPropertyNames[i].t;
284 : }
285 1054 : 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 36 : DocumentSettings::filterStreamsFromStorage(
301 : OUString const & referer,
302 : const uno::Reference< embed::XStorage > &xStorage,
303 : const uno::Sequence<beans::PropertyValue>& aConfigProps )
304 : {
305 36 : uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
306 36 : int nRet = 0;
307 1306 : for( sal_Int32 i = 0; i < aConfigProps.getLength(); i++ )
308 : {
309 1270 : XPropertyListType t = getTypeOfName( aConfigProps[i].Name );
310 1270 : if (t == UNKNOWN_XPROPERTYLISTTYPE)
311 1054 : aRet[nRet++] = aConfigProps[i];
312 : else
313 : {
314 216 : OUString aURL;
315 216 : aConfigProps[i].Value >>= aURL;
316 216 : LoadList( t, aURL, referer, xStorage );
317 : }
318 : }
319 36 : aRet.realloc( nRet );
320 36 : return aRet;
321 : }
322 :
323 : uno::Sequence<beans::PropertyValue>
324 22 : DocumentSettings::filterStreamsToStorage(
325 : const uno::Reference< embed::XStorage > &xStorage,
326 : const uno::Sequence<beans::PropertyValue>& aConfigProps )
327 : {
328 22 : uno::Sequence<beans::PropertyValue> aRet( aConfigProps.getLength() );
329 :
330 22 : bool bHasEmbed = false;
331 22 : SdDrawDocument* pDoc = mxModel->GetDoc();
332 154 : for( size_t i = 0; i < SAL_N_ELEMENTS( aURLPropertyNames ); i++ )
333 : {
334 132 : XPropertyListRef pList = pDoc->GetPropertyList( (XPropertyListType) i );
335 132 : if( ( bHasEmbed = pList.is() && pList->IsEmbedInDocument() ) )
336 0 : break;
337 132 : }
338 22 : if( !bHasEmbed )
339 22 : 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 1048 : DocumentSettings::_setPropertyValues(const PropertyMapEntry** ppEntries,
398 : const Any* pValues)
399 : throw (UnknownPropertyException, PropertyVetoException,
400 : IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
401 : {
402 1048 : ::SolarMutexGuard aGuard;
403 :
404 1048 : SdDrawDocument* pDoc = mxModel->GetDoc();
405 1048 : ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
406 1048 : if( NULL == pDoc || NULL == pDocSh )
407 : {
408 : throw RuntimeException("Document or Shell missing",
409 0 : static_cast<OWeakObject *>(this));
410 : }
411 :
412 1048 : bool bValue = false;
413 1048 : bool bOk, bChanged = false, bOptionsChanged = false;
414 :
415 2096 : SdOptionsPrintItem aOptionsPrintItem( ATTR_OPTIONS_PRINT );
416 :
417 1048 : SfxPrinter* pPrinter = pDocSh->GetPrinter( false );
418 1048 : if( pPrinter )
419 : {
420 22 : SdOptionsPrintItem* pPrinterOptions = NULL;
421 22 : if(pPrinter->GetOptions().GetItemState( ATTR_OPTIONS_PRINT, false, (const SfxPoolItem**) &pPrinterOptions) == SfxItemState::SET)
422 0 : aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
423 : }
424 : else
425 : {
426 1026 : aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
427 : }
428 1048 : SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
429 :
430 2096 : for( ; *ppEntries; ppEntries++, pValues++ )
431 : {
432 1048 : bOk = false;
433 :
434 1048 : 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 28 : bOk = true;
462 28 : break;
463 :
464 : case HANDLE_APPLYUSERDATA:
465 : {
466 36 : bool bApplyUserData = false;
467 36 : if( *pValues >>= bApplyUserData )
468 : {
469 36 : bChanged = ( bApplyUserData != pDocSh->IsUseUserData() );
470 36 : pDocSh->SetUseUserData( bApplyUserData );
471 36 : bOk = true;
472 : }
473 : }
474 36 : break;
475 : case HANDLE_PRINTDRAWING:
476 32 : if( *pValues >>= bValue )
477 : {
478 32 : if( aPrintOpts.IsDraw() != bValue )
479 : {
480 0 : aPrintOpts.SetDraw( bValue );
481 0 : bOptionsChanged = true;
482 : }
483 :
484 32 : bOk = true;
485 : }
486 32 : break;
487 : case HANDLE_PRINTNOTES:
488 32 : if( *pValues >>= bValue )
489 : {
490 32 : if( aPrintOpts.IsNotes() != bValue )
491 : {
492 0 : aPrintOpts.SetNotes( bValue );
493 0 : bOptionsChanged = true;
494 : }
495 :
496 32 : bOk = true;
497 : }
498 32 : break;
499 : case HANDLE_PRINTHANDOUT:
500 32 : if( *pValues >>= bValue )
501 : {
502 32 : if( aPrintOpts.IsHandout() != bValue)
503 : {
504 0 : aPrintOpts.SetHandout( bValue );
505 0 : bOptionsChanged = true;
506 : }
507 :
508 32 : bOk = true;
509 : }
510 32 : break;
511 : case HANDLE_PRINTOUTLINE:
512 32 : if( *pValues >>= bValue )
513 : {
514 32 : if( aPrintOpts.IsOutline() != bValue)
515 : {
516 0 : aPrintOpts.SetOutline( bValue );
517 0 : bOptionsChanged = true;
518 : }
519 32 : bOk = true;
520 : }
521 32 : break;
522 : case HANDLE_SLIDESPERHANDOUT:
523 : {
524 32 : sal_Int16 nValue = 0;
525 32 : if( (*pValues >>= nValue) && (nValue >= 1) && (nValue <= 9) )
526 : {
527 32 : if( static_cast<sal_Int16>( aPrintOpts.GetHandoutPages() ) != nValue )
528 : {
529 0 : aPrintOpts.SetHandoutPages( static_cast< sal_uInt16 >( nValue ) );
530 0 : bOptionsChanged = true;
531 : }
532 32 : bOk = true;
533 : }
534 : }
535 32 : break;
536 : case HANDLE_HANDOUTHORIZONTAL:
537 32 : if( *pValues >>= bValue )
538 : {
539 32 : if( aPrintOpts.IsHandoutHorizontal() != bValue )
540 : {
541 0 : aPrintOpts.SetHandoutHorizontal( bValue );
542 0 : bOptionsChanged = true;
543 : }
544 32 : bOk = true;
545 : }
546 32 : break;
547 :
548 : case HANDLE_PRINTPAGENAME:
549 36 : if( *pValues >>= bValue )
550 : {
551 36 : if( aPrintOpts.IsPagename() != bValue)
552 : {
553 0 : aPrintOpts.SetPagename( bValue );
554 0 : bOptionsChanged = true;
555 : }
556 36 : bOk = true;
557 : }
558 36 : break;
559 : case HANDLE_PRINTDATE:
560 36 : if( *pValues >>= bValue )
561 : {
562 36 : if( aPrintOpts.IsDate() != bValue)
563 : {
564 0 : aPrintOpts.SetDate( bValue );
565 0 : bOptionsChanged = true;
566 : }
567 36 : bOk = true;
568 : }
569 36 : break;
570 : case HANDLE_PRINTTIME:
571 36 : if( *pValues >>= bValue )
572 : {
573 36 : if( aPrintOpts.IsDate() != bValue)
574 : {
575 0 : aPrintOpts.SetTime( bValue );
576 0 : bOptionsChanged = true;
577 : }
578 36 : bOk = true;
579 : }
580 36 : break;
581 : case HANDLE_PRINTHIDENPAGES:
582 36 : if( *pValues >>= bValue )
583 : {
584 36 : if( aPrintOpts.IsHiddenPages() != bValue)
585 : {
586 0 : aPrintOpts.SetHiddenPages( bValue );
587 0 : bOptionsChanged = true;
588 : }
589 36 : bOk = true;
590 : }
591 36 : break;
592 : case HANDLE_PRINTFITPAGE:
593 36 : if( *pValues >>= bValue )
594 : {
595 36 : if( aPrintOpts.IsPagesize() != bValue)
596 : {
597 0 : aPrintOpts.SetPagesize( bValue );
598 0 : bOptionsChanged = true;
599 : }
600 36 : bOk = true;
601 : }
602 36 : break;
603 : case HANDLE_PRINTTILEPAGE:
604 36 : if( *pValues >>= bValue )
605 : {
606 36 : if( aPrintOpts.IsPagetile() != bValue)
607 : {
608 0 : aPrintOpts.SetPagetile( bValue );
609 0 : bOptionsChanged = true;
610 : }
611 36 : bOk = true;
612 : }
613 36 : break;
614 : case HANDLE_PRINTBOOKLET:
615 36 : if( *pValues >>= bValue )
616 : {
617 36 : if( aPrintOpts.IsBooklet() != bValue)
618 : {
619 0 : aPrintOpts.SetBooklet( bValue );
620 0 : bOptionsChanged = true;
621 : }
622 36 : bOk = true;
623 : }
624 36 : break;
625 : case HANDLE_PRINTBOOKLETFRONT:
626 36 : if( *pValues >>= bValue )
627 : {
628 36 : if( aPrintOpts.IsFrontPage() != bValue)
629 : {
630 0 : aPrintOpts.SetFrontPage( bValue );
631 0 : bOptionsChanged = true;
632 : }
633 36 : bOk = true;
634 : }
635 36 : break;
636 : case HANDLE_PRINTBOOKLETBACK:
637 36 : if( *pValues >>= bValue )
638 : {
639 36 : if( aPrintOpts.IsBackPage() != bValue)
640 : {
641 0 : aPrintOpts.SetBackPage( bValue );
642 0 : bOptionsChanged = true;
643 : }
644 36 : bOk = true;
645 : }
646 36 : break;
647 : case HANDLE_PRINTQUALITY:
648 : {
649 36 : sal_Int32 nValue = 0;
650 36 : if( *pValues >>= nValue )
651 : {
652 36 : if( aPrintOpts.GetOutputQuality() != nValue)
653 : {
654 0 : aPrintOpts.SetOutputQuality( (sal_uInt16)nValue );
655 0 : bOptionsChanged = true;
656 : }
657 36 : bOk = true;
658 : }
659 : }
660 36 : break;
661 : case HANDLE_MEASUREUNIT:
662 : {
663 2 : sal_Int16 nValue = 0;
664 2 : if( *pValues >>= nValue )
665 : {
666 : FieldUnit nFieldUnit;
667 2 : if( SvxMeasureUnitToFieldUnit( nValue, nFieldUnit ) )
668 : {
669 2 : pDoc->SetUIUnit( nFieldUnit );
670 2 : bOk = true;
671 : }
672 : }
673 : }
674 2 : break;
675 : case HANDLE_SCALE_NUM:
676 : {
677 2 : sal_Int32 nValue = 0;
678 2 : if( *pValues >>= nValue )
679 : {
680 2 : Fraction aFract( nValue, pDoc->GetUIScale().GetDenominator() );
681 2 : pDoc->SetUIScale( aFract );
682 2 : bOk = true;
683 2 : bChanged = true;
684 : }
685 : }
686 2 : break;
687 : case HANDLE_SCALE_DOM:
688 : {
689 2 : sal_Int32 nValue = 0;
690 2 : if( *pValues >>= nValue )
691 : {
692 2 : Fraction aFract( pDoc->GetUIScale().GetNumerator(), nValue );
693 2 : pDoc->SetUIScale( aFract );
694 2 : bOk = true;
695 2 : bChanged = true;
696 : }
697 : }
698 2 : break;
699 :
700 : case HANDLE_TABSTOP:
701 : {
702 36 : sal_Int32 nValue = 0;
703 36 : if( (*pValues >>= nValue) && (nValue >= 0) )
704 : {
705 36 : pDoc->SetDefaultTabulator((sal_uInt16)nValue);
706 36 : bOk = true;
707 36 : bChanged = true;
708 : }
709 : }
710 36 : break;
711 : case HANDLE_PAGENUMFMT:
712 : {
713 36 : sal_Int32 nValue = 0;
714 36 : if( (*pValues >>= nValue ) && (nValue >= SVX_CHARS_UPPER_LETTER ) && (nValue <= SVX_PAGEDESC) )
715 : {
716 36 : pDoc->SetPageNumType((SvxNumType)nValue);
717 36 : bOk = true;
718 36 : bChanged = true;
719 : }
720 : }
721 36 : break;
722 : case HANDLE_PRINTERNAME:
723 : {
724 36 : OUString aPrinterName;
725 36 : if( *pValues >>= aPrinterName )
726 : {
727 36 : bOk = true;
728 36 : if( !aPrinterName.isEmpty() && pDocSh->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED )
729 : {
730 0 : SfxPrinter *pTempPrinter = pDocSh->GetPrinter( true );
731 0 : if (pTempPrinter)
732 : {
733 0 : SfxPrinter *pNewPrinter = new SfxPrinter( pTempPrinter->GetOptions().Clone(), aPrinterName );
734 0 : pDocSh->SetPrinter( pNewPrinter );
735 : }
736 : }
737 36 : }
738 : }
739 36 : break;
740 : case HANDLE_PRINTERJOB:
741 : {
742 36 : Sequence < sal_Int8 > aSequence;
743 36 : if ( *pValues >>= aSequence )
744 : {
745 36 : bOk = true;
746 36 : sal_uInt32 nSize = aSequence.getLength();
747 36 : if( nSize )
748 : {
749 8 : SvMemoryStream aStream (aSequence.getArray(), nSize, STREAM_READ );
750 8 : aStream.Seek ( STREAM_SEEK_TO_BEGIN );
751 : SfxItemSet* pItemSet;
752 :
753 8 : 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 8 : 0 );
764 : }
765 :
766 8 : pPrinter = SfxPrinter::Create ( aStream, pItemSet );
767 :
768 16 : MapMode aMM (pPrinter->GetMapMode());
769 8 : aMM.SetMapUnit(MAP_100TH_MM);
770 8 : pPrinter->SetMapMode(aMM);
771 :
772 8 : pDocSh->SetPrinter( pPrinter );
773 :
774 16 : pPrinter = NULL;
775 : }
776 36 : }
777 : }
778 36 : break;
779 :
780 : case HANDLE_PARAGRAPHSUMMATION :
781 : {
782 36 : bool bIsSummationOfParagraphs = false;
783 36 : if ( *pValues >>= bIsSummationOfParagraphs )
784 : {
785 36 : bOk = true;
786 36 : bChanged = true;
787 36 : if ( pDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
788 : {
789 34 : sal_uInt32 nSum = bIsSummationOfParagraphs ? EE_CNTRL_ULSPACESUMMATION : 0;
790 : sal_uInt32 nCntrl;
791 :
792 34 : pDoc->SetSummationOfParagraphs( bIsSummationOfParagraphs );
793 34 : SdDrawDocument* pDocument = pDocSh->GetDoc();
794 34 : SdrOutliner& rOutl = pDocument->GetDrawOutliner();
795 34 : nCntrl = rOutl.GetControlWord() &~ EE_CNTRL_ULSPACESUMMATION;
796 34 : rOutl.SetControlWord( nCntrl | nSum );
797 34 : ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
798 34 : if( pOutl )
799 : {
800 0 : nCntrl = pOutl->GetControlWord() &~ EE_CNTRL_ULSPACESUMMATION;
801 0 : pOutl->SetControlWord( nCntrl | nSum );
802 : }
803 34 : pOutl = pDocument->GetInternalOutliner( false );
804 34 : if( pOutl )
805 : {
806 34 : nCntrl = pOutl->GetControlWord() &~ EE_CNTRL_ULSPACESUMMATION;
807 34 : pOutl->SetControlWord( nCntrl | nSum );
808 : }
809 : }
810 : }
811 : }
812 36 : break;
813 :
814 : case HANDLE_CHARCOMPRESS:
815 : {
816 36 : sal_Int16 nCharCompressType = 0;
817 36 : if( *pValues >>= nCharCompressType )
818 : {
819 36 : bOk = true;
820 :
821 36 : pDoc->SetCharCompressType( (sal_uInt16)nCharCompressType );
822 36 : SdDrawDocument* pDocument = pDocSh->GetDoc();
823 36 : SdrOutliner& rOutl = pDocument->GetDrawOutliner();
824 36 : rOutl.SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
825 36 : ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
826 36 : if( pOutl )
827 : {
828 0 : pOutl->SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
829 : }
830 36 : pOutl = pDocument->GetInternalOutliner( false );
831 36 : if( pOutl )
832 : {
833 36 : pOutl->SetAsianCompressionMode( (sal_uInt16)nCharCompressType );
834 : }
835 : }
836 36 : break;
837 :
838 : }
839 : case HANDLE_ASIANPUNCT:
840 : {
841 36 : bool bAsianPunct = false;
842 36 : if( *pValues >>= bAsianPunct )
843 : {
844 36 : bOk = true;
845 :
846 36 : pDoc->SetKernAsianPunctuation( bAsianPunct );
847 36 : SdDrawDocument* pDocument = pDocSh->GetDoc();
848 36 : SdrOutliner& rOutl = pDocument->GetDrawOutliner();
849 36 : rOutl.SetKernAsianPunctuation( bAsianPunct );
850 36 : ::sd::Outliner* pOutl = pDocument->GetOutliner( false );
851 36 : if( pOutl )
852 : {
853 0 : pOutl->SetKernAsianPunctuation( bAsianPunct );
854 : }
855 36 : pOutl = pDocument->GetInternalOutliner( false );
856 36 : if( pOutl )
857 : {
858 36 : pOutl->SetKernAsianPunctuation( bAsianPunct );
859 : }
860 : }
861 36 : break;
862 :
863 : }
864 : case HANDLE_UPDATEFROMTEMPLATE:
865 : {
866 36 : bool value = false;
867 36 : if( *pValues >>= value )
868 : {
869 36 : bChanged = ( value != pDocSh->IsQueryLoadTemplate() );
870 36 : pDocSh->SetQueryLoadTemplate( value );
871 36 : bOk = true;
872 : }
873 : }
874 36 : 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 36 : (sal_Int16)pDoc->GetPrinterIndependentLayout ();
883 36 : sal_Int16 nValue = 0;
884 36 : if (*pValues >>= nValue)
885 : {
886 36 : pDoc->SetPrinterIndependentLayout (nValue);
887 36 : bChanged = (nValue != nOldValue);
888 36 : bOk = true;
889 : }
890 : }
891 36 : break;
892 :
893 : // --> #i33095#
894 : case HANDLE_LOAD_READONLY:
895 : {
896 36 : bool bNewValue = false;
897 36 : if ( *pValues >>= bNewValue )
898 : {
899 36 : bChanged = ( pDocSh->IsLoadReadonly() != bNewValue );
900 36 : pDocSh->SetLoadReadonly( bNewValue );
901 36 : bOk = true;
902 : }
903 : }
904 36 : 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 36 : bool bNewValue = false;
925 36 : if ( *pValues >>= bNewValue )
926 : {
927 36 : bChanged = ( pDocSh->IsSaveVersionOnClose() != bNewValue );
928 36 : pDocSh->SetSaveVersionOnClose( bNewValue );
929 36 : bOk = true;
930 : }
931 : }
932 36 : break;
933 :
934 : case HANDLE_EMBED_FONTS:
935 : {
936 30 : bool bNewValue = false;
937 30 : if ( *pValues >>= bNewValue )
938 : {
939 30 : bChanged = ( pDoc->IsUsingEmbededFonts() != bNewValue );
940 30 : pDoc->SetIsUsingEmbededFonts( bNewValue );
941 30 : bOk = true;
942 : }
943 : }
944 30 : break;
945 :
946 : default:
947 0 : throw UnknownPropertyException();
948 : }
949 :
950 1048 : if( !bOk )
951 0 : throw IllegalArgumentException();
952 : }
953 :
954 1048 : 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 1048 : if( bChanged || bOptionsChanged )
964 1164 : mxModel->SetModified( true );
965 1048 : }
966 :
967 132 : void DocumentSettings::ExtractURL( XPropertyListType t, Any* pValue )
968 : {
969 132 : XPropertyListRef pList = mxModel->GetDoc()->GetPropertyList( t );
970 132 : if( !pList.is() )
971 132 : return;
972 :
973 264 : INetURLObject aPathURL( pList->GetPath() );
974 132 : aPathURL.insertName( pList->GetName() );
975 132 : aPathURL.setExtension( pList->GetDefaultExt() );
976 264 : OUString aPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
977 264 : *pValue <<= aPath;
978 : }
979 :
980 : void
981 814 : DocumentSettings::_getPropertyValues(
982 : const PropertyMapEntry** ppEntries, Any* pValue)
983 : throw (UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
984 : {
985 814 : ::SolarMutexGuard aGuard;
986 :
987 814 : SdDrawDocument* pDoc = mxModel->GetDoc();
988 814 : ::sd::DrawDocShell* pDocSh = mxModel->GetDocShell();
989 814 : if( NULL == pDoc || NULL == pDocSh )
990 : {
991 : throw RuntimeException("Document or Shell missing",
992 0 : static_cast<OWeakObject *>(this));
993 : }
994 :
995 1628 : SdOptionsPrintItem aOptionsPrintItem( ATTR_OPTIONS_PRINT );
996 :
997 814 : SfxPrinter* pPrinter = pDocSh->GetPrinter( false );
998 814 : if( pPrinter )
999 : {
1000 0 : SdOptionsPrintItem* pPrinterOptions = NULL;
1001 0 : if(pPrinter->GetOptions().GetItemState( ATTR_OPTIONS_PRINT, false, (const SfxPoolItem**) &pPrinterOptions) == SfxItemState::SET)
1002 0 : aOptionsPrintItem.GetOptionsPrint() = pPrinterOptions->GetOptionsPrint();
1003 : }
1004 : else
1005 : {
1006 814 : aOptionsPrintItem.SetOptions( SD_MOD()->GetSdOptions(pDoc->GetDocumentType()) );
1007 : }
1008 814 : SdOptionsPrint& aPrintOpts = aOptionsPrintItem.GetOptionsPrint();
1009 :
1010 1628 : for( ; *ppEntries; ppEntries++, pValue++ )
1011 : {
1012 814 : switch( (*ppEntries)->mnHandle )
1013 : {
1014 : case HANDLE_COLORTABLEURL:
1015 22 : ExtractURL( XCOLOR_LIST, pValue );
1016 22 : break;
1017 : case HANDLE_DASHTABLEURL:
1018 22 : ExtractURL( XDASH_LIST, pValue );
1019 22 : break;
1020 : case HANDLE_LINEENDTABLEURL:
1021 22 : ExtractURL( XLINE_END_LIST, pValue );
1022 22 : break;
1023 : case HANDLE_HATCHTABLEURL:
1024 22 : ExtractURL( XHATCH_LIST, pValue );
1025 22 : break;
1026 : case HANDLE_GRADIENTTABLEURL:
1027 22 : ExtractURL( XGRADIENT_LIST, pValue );
1028 22 : break;
1029 : case HANDLE_BITMAPTABLEURL:
1030 22 : ExtractURL( XBITMAP_LIST, pValue );
1031 22 : break;
1032 : case HANDLE_FORBIDDENCHARS:
1033 50 : *pValue <<= mxModel->getForbiddenCharsTable();
1034 50 : break;
1035 : case HANDLE_APPLYUSERDATA:
1036 22 : *pValue <<= pDocSh->IsUseUserData();
1037 22 : break;
1038 : case HANDLE_PRINTDRAWING:
1039 6 : *pValue <<= aPrintOpts.IsDraw();
1040 6 : break;
1041 : case HANDLE_PRINTNOTES:
1042 6 : *pValue <<= aPrintOpts.IsNotes();
1043 6 : break;
1044 : case HANDLE_PRINTHANDOUT:
1045 6 : *pValue <<= aPrintOpts.IsHandout();
1046 6 : break;
1047 : case HANDLE_PRINTOUTLINE:
1048 6 : *pValue <<= aPrintOpts.IsOutline();
1049 6 : break;
1050 : case HANDLE_SLIDESPERHANDOUT:
1051 6 : *pValue <<= (sal_Int16)aPrintOpts.GetHandoutPages();
1052 6 : break;
1053 : case HANDLE_HANDOUTHORIZONTAL:
1054 6 : *pValue <<= aPrintOpts.IsHandoutHorizontal();
1055 6 : break;
1056 : case HANDLE_PRINTPAGENAME:
1057 22 : *pValue <<= aPrintOpts.IsPagename();
1058 22 : break;
1059 : case HANDLE_PRINTDATE:
1060 22 : *pValue <<= aPrintOpts.IsDate();
1061 22 : break;
1062 : case HANDLE_PRINTTIME:
1063 22 : *pValue <<= aPrintOpts.IsTime();
1064 22 : break;
1065 : case HANDLE_PRINTHIDENPAGES:
1066 22 : *pValue <<= aPrintOpts.IsHiddenPages();
1067 22 : break;
1068 : case HANDLE_PRINTFITPAGE:
1069 22 : *pValue <<= aPrintOpts.IsPagesize();
1070 22 : break;
1071 : case HANDLE_PRINTTILEPAGE:
1072 22 : *pValue <<= aPrintOpts.IsPagetile();
1073 22 : break;
1074 : case HANDLE_PRINTBOOKLET:
1075 22 : *pValue <<= aPrintOpts.IsBooklet();
1076 22 : break;
1077 : case HANDLE_PRINTBOOKLETFRONT:
1078 22 : *pValue <<= aPrintOpts.IsFrontPage();
1079 22 : break;
1080 : case HANDLE_PRINTBOOKLETBACK:
1081 22 : *pValue <<= aPrintOpts.IsBackPage();
1082 22 : break;
1083 : case HANDLE_PRINTQUALITY:
1084 22 : *pValue <<= (sal_Int32)aPrintOpts.GetOutputQuality();
1085 22 : break;
1086 : case HANDLE_MEASUREUNIT:
1087 : {
1088 : short nMeasure;
1089 16 : SvxFieldUnitToMeasureUnit( pDoc->GetUIUnit(), nMeasure );
1090 16 : *pValue <<= (sal_Int16)nMeasure;
1091 : }
1092 16 : break;
1093 : case HANDLE_SCALE_NUM:
1094 16 : *pValue <<= (sal_Int32)pDoc->GetUIScale().GetNumerator();
1095 16 : break;
1096 : case HANDLE_SCALE_DOM:
1097 16 : *pValue <<= (sal_Int32)pDoc->GetUIScale().GetDenominator();
1098 16 : break;
1099 : case HANDLE_TABSTOP:
1100 22 : *pValue <<= (sal_Int32)pDoc->GetDefaultTabulator();
1101 22 : break;
1102 : case HANDLE_PAGENUMFMT:
1103 22 : *pValue <<= (sal_Int32)pDoc->GetPageNumType();
1104 22 : break;
1105 : case HANDLE_PRINTERNAME:
1106 : {
1107 22 : SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
1108 22 : *pValue <<= pTempPrinter ? OUString ( pTempPrinter->GetName()) : OUString();
1109 : }
1110 22 : break;
1111 : case HANDLE_PRINTERJOB:
1112 : {
1113 22 : SfxPrinter *pTempPrinter = pDocSh->GetPrinter( false );
1114 22 : if (pTempPrinter)
1115 : {
1116 0 : SvMemoryStream aStream;
1117 0 : pTempPrinter->Store( aStream );
1118 0 : aStream.Seek ( STREAM_SEEK_TO_END );
1119 0 : sal_uInt32 nSize = aStream.Tell();
1120 0 : aStream.Seek ( STREAM_SEEK_TO_BEGIN );
1121 0 : Sequence < sal_Int8 > aSequence ( nSize );
1122 0 : memcpy ( aSequence.getArray(), aStream.GetData(), nSize );
1123 0 : *pValue <<= aSequence;
1124 : }
1125 : else
1126 : {
1127 22 : Sequence < sal_Int8 > aSequence;
1128 22 : *pValue <<= aSequence;
1129 : }
1130 : }
1131 22 : break;
1132 :
1133 : case HANDLE_PARAGRAPHSUMMATION :
1134 : {
1135 22 : bool bIsSummationOfParagraphs = pDoc->IsSummationOfParagraphs();
1136 22 : *pValue <<= bIsSummationOfParagraphs;
1137 : }
1138 22 : break;
1139 :
1140 : case HANDLE_CHARCOMPRESS:
1141 : {
1142 22 : *pValue <<= (sal_Int16)pDoc->GetCharCompressType();
1143 22 : break;
1144 : }
1145 :
1146 : case HANDLE_ASIANPUNCT:
1147 : {
1148 22 : *pValue <<= pDoc->IsKernAsianPunctuation();
1149 22 : break;
1150 : }
1151 :
1152 : case HANDLE_UPDATEFROMTEMPLATE:
1153 : {
1154 22 : *pValue <<= pDocSh->IsQueryLoadTemplate();
1155 : }
1156 22 : break;
1157 :
1158 : case HANDLE_PRINTER_INDEPENDENT_LAYOUT:
1159 : {
1160 : sal_Int16 nPrinterIndependentLayout =
1161 22 : (sal_Int16)pDoc->GetPrinterIndependentLayout();
1162 22 : *pValue <<= nPrinterIndependentLayout;
1163 : }
1164 22 : break;
1165 :
1166 : // --> #i33095#
1167 : case HANDLE_LOAD_READONLY:
1168 : {
1169 22 : *pValue <<= pDocSh->IsLoadReadonly();
1170 : }
1171 22 : break;
1172 :
1173 : case HANDLE_MODIFY_PASSWD:
1174 : {
1175 22 : *pValue <<= pDocSh->GetModifyPasswordInfo();
1176 : }
1177 22 : break;
1178 :
1179 : case HANDLE_SAVE_VERSION:
1180 : {
1181 22 : *pValue <<= pDocSh->IsSaveVersionOnClose();
1182 : }
1183 22 : break;
1184 :
1185 : case HANDLE_EMBED_FONTS:
1186 : {
1187 42 : *pValue <<= pDoc->IsUsingEmbededFonts();
1188 : }
1189 42 : break;
1190 :
1191 : default:
1192 0 : throw UnknownPropertyException();
1193 : }
1194 814 : }
1195 814 : }
1196 :
1197 : // XInterface
1198 106 : Any SAL_CALL DocumentSettings::queryInterface( const Type& aType ) throw (RuntimeException, std::exception)
1199 : {
1200 106 : return WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::queryInterface( aType );
1201 : }
1202 :
1203 212 : void SAL_CALL DocumentSettings::acquire( ) throw ()
1204 : {
1205 212 : WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::acquire();
1206 212 : }
1207 :
1208 212 : void SAL_CALL DocumentSettings::release( ) throw ()
1209 : {
1210 212 : WeakImplHelper3< XPropertySet, XMultiPropertySet, XServiceInfo >::release();
1211 212 : }
1212 :
1213 : // XPropertySet
1214 86 : Reference< XPropertySetInfo > SAL_CALL DocumentSettings::getPropertySetInfo( ) throw(RuntimeException, std::exception)
1215 : {
1216 86 : return PropertySetHelper::getPropertySetInfo();
1217 : }
1218 :
1219 1048 : void SAL_CALL DocumentSettings::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException, std::exception)
1220 : {
1221 1048 : PropertySetHelper::setPropertyValue( aPropertyName, aValue );
1222 1048 : }
1223 :
1224 814 : Any SAL_CALL DocumentSettings::getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1225 : {
1226 814 : 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 114 : }
1304 :
1305 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|