xref: /AOO41X/main/sd/source/ui/unoidl/unopage.cxx (revision 28cce2f197ad7d42937bbbffa13c6d7274afcb2a)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sd.hxx"
24 
25 #include <com/sun/star/lang/DisposedException.hpp>
26 #include <com/sun/star/presentation/ClickAction.hpp>
27 #include <com/sun/star/presentation/FadeEffect.hpp>
28 #include <com/sun/star/presentation/AnimationEffect.hpp>
29 #include <com/sun/star/presentation/PresentationRange.hpp>
30 #include <com/sun/star/presentation/AnimationSpeed.hpp>
31 #include <com/sun/star/view/PaperOrientation.hpp>
32 #include <com/sun/star/animations/AnimationNodeType.hpp>
33 #include <com/sun/star/presentation/EffectNodeType.hpp>
34 #include <com/sun/star/lang/DisposedException.hpp>
35 #include <comphelper/processfactory.hxx>
36 #include <rtl/ustrbuf.hxx>
37 #include <vcl/bitmapex.hxx>
38 #include <vcl/metaact.hxx>
39 #include <toolkit/unohlp.hxx>
40 #include <vcl/svapp.hxx>
41 #include <vcl/settings.hxx>
42 #include <unomodel.hxx>
43 #include <unopage.hxx>
44 #include <svx/svxids.hrc>
45 #include <svl/itemset.hxx>
46 #include <svx/svdmodel.hxx>
47 #include <sdresid.hxx>
48 #include <glob.hrc>
49 #include <sdpage.hxx>
50 #include <unoprnms.hxx>
51 #include <sdattr.hxx>
52 #include <drawdoc.hxx>
53 #include <svx/unoshape.hxx>
54 #include <com/sun/star/style/XStyle.hpp>
55 #include <svx/svdorect.hxx>
56 #include <vos/mutex.hxx>
57 #include <svl/style.hxx>
58 #include <rtl/uuid.h>
59 #include <rtl/memory.h>
60 #include <comphelper/serviceinfohelper.hxx>
61 #include <comphelper/extract.hxx>
62 #include <list>
63 #include <svx/svditer.hxx>
64 #include <svtools/wmf.hxx>
65 #include <svx/svdoole2.hxx>
66 #include <svx/svdpool.hxx>
67 #include <svx/svdview.hxx>
68 #include "misc.hxx"
69 #include "View.hxx"
70 #include "DrawDocShell.hxx"
71 #include "ViewShell.hxx"
72 #include "DrawViewShell.hxx"
73 #include "unoobj.hxx"
74 #include "res_bmp.hrc"
75 #include "unokywds.hxx"
76 #include "unopback.hxx"
77 #include "unohelp.hxx"
78 #include <vcl/dibtools.hxx>
79 #include <svx/svdograf.hxx>
80 
81 using ::com::sun::star::animations::XAnimationNode;
82 using ::com::sun::star::animations::XAnimationNodeSupplier;
83 using ::rtl::OUString;
84 using ::rtl::OUStringBuffer;
85 
86 using namespace ::vos;
87 using namespace ::osl;
88 using namespace ::com::sun::star;
89 using namespace ::com::sun::star::uno;
90 using namespace ::com::sun::star::lang;
91 using namespace ::com::sun::star::container;
92 using namespace ::com::sun::star::drawing;
93 using namespace ::com::sun::star::office;
94 
95 namespace sd {
96 extern Reference< XAnnotation > createAnnotation( const Reference< XComponentContext >& xContext, SdPage* );
97 extern Reference< XAnnotationEnumeration > createAnnotationEnumeration( const sd::AnnotationVector& );
98 }
99 
100 /* this are the ids for page properties */
101 enum WID_PAGE
102 {
103     WID_PAGE_LEFT, WID_PAGE_RIGHT, WID_PAGE_TOP, WID_PAGE_BOTTOM, WID_PAGE_WIDTH,
104     WID_PAGE_HEIGHT, WID_PAGE_EFFECT, WID_PAGE_CHANGE, WID_PAGE_SPEED, WID_PAGE_NUMBER,
105     WID_PAGE_ORIENT, WID_PAGE_LAYOUT, WID_PAGE_DURATION, WID_PAGE_LDNAME, WID_PAGE_LDBITMAP,
106     WID_PAGE_BACK, WID_PAGE_PREVIEW, WID_PAGE_PREVIEWBITMAP, WID_PAGE_VISIBLE, WID_PAGE_SOUNDFILE, WID_PAGE_BACKFULL,
107     WID_PAGE_BACKVIS, WID_PAGE_BACKOBJVIS, WID_PAGE_USERATTRIBS, WID_PAGE_BOOKMARK, WID_PAGE_ISDARK,
108     WID_PAGE_HEADERVISIBLE, WID_PAGE_HEADERTEXT, WID_PAGE_FOOTERVISIBLE, WID_PAGE_FOOTERTEXT,
109     WID_PAGE_PAGENUMBERVISIBLE, WID_PAGE_DATETIMEVISIBLE, WID_PAGE_DATETIMEFIXED,
110     WID_PAGE_DATETIMETEXT, WID_PAGE_DATETIMEFORMAT, WID_TRANSITION_TYPE, WID_TRANSITION_SUBTYPE,
111     WID_TRANSITION_DIRECTION, WID_TRANSITION_FADE_COLOR, WID_TRANSITION_DURATION, WID_LOOP_SOUND,
112     WID_NAVORDER
113 };
114 
115 #ifndef SEQTYPE
116  #if defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500)
117   #define SEQTYPE(x) (new ::com::sun::star::uno::Type( x ))
118  #else
119   #define SEQTYPE(x) &(x)
120  #endif
121 #endif
122 
123 static sal_Char __FAR_DATA sEmptyPageName[sizeof("page")] = "page";
124 
125 /** this function stores the property maps for draw pages in impress and draw */
ImplGetDrawPagePropertySet(sal_Bool bImpress,PageKind ePageKind)126 const SvxItemPropertySet* ImplGetDrawPagePropertySet( sal_Bool bImpress, PageKind ePageKind )
127 {
128     static const SfxItemPropertyMapEntry aDrawPagePropertyMap_Impl[] =
129     {
130         { MAP_CHAR_LEN(UNO_NAME_PAGE_BACKGROUND),       WID_PAGE_BACK,      &ITYPE( beans::XPropertySet ),                  beans::PropertyAttribute::MAYBEVOID,0},
131         { MAP_CHAR_LEN(UNO_NAME_PAGE_BOTTOM),           WID_PAGE_BOTTOM,    &::getCppuType((const sal_Int32*)0),            0,  0},
132         { MAP_CHAR_LEN(UNO_NAME_PAGE_LEFT),             WID_PAGE_LEFT,      &::getCppuType((const sal_Int32*)0),            0,  0},
133         { MAP_CHAR_LEN(UNO_NAME_PAGE_RIGHT),            WID_PAGE_RIGHT,     &::getCppuType((const sal_Int32*)0),            0,  0},
134         { MAP_CHAR_LEN(UNO_NAME_PAGE_TOP),              WID_PAGE_TOP,       &::getCppuType((const sal_Int32*)0),            0,  0},
135         { MAP_CHAR_LEN(UNO_NAME_PAGE_CHANGE),           WID_PAGE_CHANGE,    &::getCppuType((const sal_Int32*)0),            0,  0},
136         { MAP_CHAR_LEN(UNO_NAME_PAGE_DURATION),         WID_PAGE_DURATION,  &::getCppuType((const sal_Int32*)0),            0,  0},
137         { MAP_CHAR_LEN(UNO_NAME_PAGE_EFFECT),           WID_PAGE_EFFECT,    &::getCppuType((const presentation::FadeEffect*)0),     0,  0},
138         { MAP_CHAR_LEN(UNO_NAME_PAGE_HEIGHT),           WID_PAGE_HEIGHT,    &::getCppuType((const sal_Int32*)0),            0,  0},
139         { MAP_CHAR_LEN(UNO_NAME_PAGE_LAYOUT),           WID_PAGE_LAYOUT,    &::getCppuType((const sal_Int16*)0),            0,  0},
140         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYBITMAP),     WID_PAGE_LDBITMAP,  &ITYPE( awt::XBitmap),                          beans::PropertyAttribute::READONLY, 0},
141         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYNAME),       WID_PAGE_LDNAME,    &::getCppuType((const OUString*)0),             beans::PropertyAttribute::READONLY, 0},
142         { MAP_CHAR_LEN(UNO_NAME_PAGE_NUMBER),           WID_PAGE_NUMBER,    &::getCppuType((const sal_Int16*)0),            beans::PropertyAttribute::READONLY, 0},
143         { MAP_CHAR_LEN(UNO_NAME_PAGE_ORIENTATION),      WID_PAGE_ORIENT,    &::getCppuType((const view::PaperOrientation*)0),0, 0},
144         { MAP_CHAR_LEN(UNO_NAME_PAGE_SPEED),            WID_PAGE_SPEED,     &::getCppuType((const presentation::AnimationSpeed*)0), 0,  0},
145         { MAP_CHAR_LEN(UNO_NAME_PAGE_WIDTH),            WID_PAGE_WIDTH,     &::getCppuType((const sal_Int32*)0),            0,  0},
146         { MAP_CHAR_LEN(UNO_NAME_PAGE_PREVIEW),          WID_PAGE_PREVIEW,   SEQTYPE(::getCppuType((::com::sun::star::uno::Sequence<sal_Int8>*)0)), ::com::sun::star::beans::PropertyAttribute::READONLY, 0},
147         { MAP_CHAR_LEN(UNO_NAME_PAGE_PREVIEWBITMAP),    WID_PAGE_PREVIEWBITMAP, SEQTYPE(::getCppuType((::com::sun::star::uno::Sequence<sal_Int8>*)0)), ::com::sun::star::beans::PropertyAttribute::READONLY, 0},
148         { MAP_CHAR_LEN(UNO_NAME_PAGE_VISIBLE),          WID_PAGE_VISIBLE,   &::getBooleanCppuType(),                        0, 0},
149         { MAP_CHAR_LEN(UNO_NAME_OBJ_SOUNDFILE),         WID_PAGE_SOUNDFILE, &::getCppuType((const Any*)0),              0, 0},
150         { MAP_CHAR_LEN(sUNO_Prop_IsBackgroundVisible),  WID_PAGE_BACKVIS,   &::getBooleanCppuType(),                        0, 0},
151         { MAP_CHAR_LEN(sUNO_Prop_IsBackgroundObjectsVisible),   WID_PAGE_BACKOBJVIS,    &::getBooleanCppuType(),                        0, 0},
152         { MAP_CHAR_LEN(sUNO_Prop_UserDefinedAttributes),WID_PAGE_USERATTRIBS, &::getCppuType((const Reference< ::com::sun::star::container::XNameContainer >*)0)  ,         0,     0},
153         { MAP_CHAR_LEN(sUNO_Prop_BookmarkURL),          WID_PAGE_BOOKMARK,  &::getCppuType((const OUString*)0),             0,  0},
154         { MAP_CHAR_LEN("IsBackgroundDark" ),            WID_PAGE_ISDARK,    &::getBooleanCppuType(),                        beans::PropertyAttribute::READONLY, 0},
155         { MAP_CHAR_LEN("IsFooterVisible"),              WID_PAGE_FOOTERVISIBLE, &::getBooleanCppuType(),                    0, 0},
156         { MAP_CHAR_LEN("FooterText"),                   WID_PAGE_FOOTERTEXT, &::getCppuType((const OUString*)0),                0,  0},
157         { MAP_CHAR_LEN("IsPageNumberVisible"),          WID_PAGE_PAGENUMBERVISIBLE, &::getBooleanCppuType(),                    0, 0},
158         { MAP_CHAR_LEN("IsDateTimeVisible"),            WID_PAGE_DATETIMEVISIBLE, &::getBooleanCppuType(),                  0, 0},
159         { MAP_CHAR_LEN("IsDateTimeFixed"),              WID_PAGE_DATETIMEFIXED, &::getBooleanCppuType(),                    0, 0},
160         { MAP_CHAR_LEN("DateTimeText"),                 WID_PAGE_DATETIMETEXT, &::getCppuType((const OUString*)0),              0,  0},
161         { MAP_CHAR_LEN("DateTimeFormat"),               WID_PAGE_DATETIMEFORMAT, &::getCppuType((const sal_Int32*)0),           0,  0},
162         { MAP_CHAR_LEN("TransitionType"),               WID_TRANSITION_TYPE, &::getCppuType((const sal_Int16*)0),           0,  0},
163         { MAP_CHAR_LEN("TransitionSubtype"),            WID_TRANSITION_SUBTYPE, &::getCppuType((const sal_Int16*)0),            0,  0},
164         { MAP_CHAR_LEN("TransitionDirection"),          WID_TRANSITION_DIRECTION, &::getCppuType((const sal_Bool*)0),           0,  0},
165         { MAP_CHAR_LEN("TransitionFadeColor"),          WID_TRANSITION_FADE_COLOR, &::getCppuType((const sal_Int32*)0),         0,  0},
166         { MAP_CHAR_LEN("TransitionDuration"),           WID_TRANSITION_DURATION, &::getCppuType((const double*)0),          0,  0},
167         { MAP_CHAR_LEN("LoopSound"),                    WID_LOOP_SOUND, &::getBooleanCppuType(),                    0, 0},
168         { MAP_CHAR_LEN("NavigationOrder"),              WID_NAVORDER, &::com::sun::star::container::XIndexAccess::static_type(),0,  0},
169         {0,0,0,0,0,0}
170     };
171 
172 #define DRAW_PAGE_NOTES_PROPERTIES \
173         { MAP_CHAR_LEN(UNO_NAME_PAGE_BOTTOM),           WID_PAGE_BOTTOM,    &::getCppuType((const sal_Int32*)0),            0,  0},                                                                \
174         { MAP_CHAR_LEN(UNO_NAME_PAGE_LEFT),             WID_PAGE_LEFT,      &::getCppuType((const sal_Int32*)0),            0,  0},                                                                \
175         { MAP_CHAR_LEN(UNO_NAME_PAGE_RIGHT),            WID_PAGE_RIGHT,     &::getCppuType((const sal_Int32*)0),            0,  0},                                                                \
176         { MAP_CHAR_LEN(UNO_NAME_PAGE_TOP),              WID_PAGE_TOP,       &::getCppuType((const sal_Int32*)0),            0,  0},                                                                \
177         { MAP_CHAR_LEN(UNO_NAME_PAGE_HEIGHT),           WID_PAGE_HEIGHT,    &::getCppuType((const sal_Int32*)0),            0,  0},                                                                \
178         { MAP_CHAR_LEN(UNO_NAME_PAGE_LAYOUT),           WID_PAGE_LAYOUT,    &::getCppuType((const sal_Int16*)0),            0,  0},                                                                \
179         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYBITMAP),     WID_PAGE_LDBITMAP,  &ITYPE( awt::XBitmap),                          beans::PropertyAttribute::READONLY, 0},                                \
180         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYNAME),       WID_PAGE_LDNAME,    &::getCppuType((const OUString*)0),             beans::PropertyAttribute::READONLY, 0},                                \
181         { MAP_CHAR_LEN(UNO_NAME_PAGE_NUMBER),           WID_PAGE_NUMBER,    &::getCppuType((const sal_Int16*)0),            beans::PropertyAttribute::READONLY, 0},                                \
182         { MAP_CHAR_LEN(UNO_NAME_PAGE_ORIENTATION),      WID_PAGE_ORIENT,    &::getCppuType((const view::PaperOrientation*)0),0, 0},                                                                \
183         { MAP_CHAR_LEN(UNO_NAME_PAGE_WIDTH),            WID_PAGE_WIDTH,     &::getCppuType((const sal_Int32*)0),            0,  0},                                                                \
184         { MAP_CHAR_LEN(sUNO_Prop_UserDefinedAttributes),WID_PAGE_USERATTRIBS, &::getCppuType((const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >*)0)  ,      0,     0},\
185         { MAP_CHAR_LEN("IsHeaderVisible"),              WID_PAGE_HEADERVISIBLE, &::getBooleanCppuType(),                    0, 0},                                                                 \
186         { MAP_CHAR_LEN("HeaderText"),                   WID_PAGE_HEADERTEXT, &::getCppuType((const OUString*)0),                0,  0},                                                            \
187         { MAP_CHAR_LEN("IsBackgroundDark" ),            WID_PAGE_ISDARK,    &::getBooleanCppuType(),                        beans::PropertyAttribute::READONLY, 0},                                \
188         { MAP_CHAR_LEN("IsFooterVisible"),              WID_PAGE_FOOTERVISIBLE, &::getBooleanCppuType(),                    0, 0},                                                                 \
189         { MAP_CHAR_LEN("FooterText"),                   WID_PAGE_FOOTERTEXT, &::getCppuType((const OUString*)0),                0,  0},                                                            \
190         { MAP_CHAR_LEN("IsPageNumberVisible"),          WID_PAGE_PAGENUMBERVISIBLE, &::getBooleanCppuType(),                    0, 0},                                                             \
191         { MAP_CHAR_LEN("IsDateTimeVisible"),            WID_PAGE_DATETIMEVISIBLE, &::getBooleanCppuType(),                  0, 0},                                                                 \
192         { MAP_CHAR_LEN("IsDateTimeFixed"),              WID_PAGE_DATETIMEFIXED, &::getBooleanCppuType(),                    0, 0},                                                                 \
193         { MAP_CHAR_LEN("DateTimeText"),                 WID_PAGE_DATETIMETEXT, &::getCppuType((const OUString*)0),              0,  0},                                                            \
194         { MAP_CHAR_LEN("DateTimeFormat"),               WID_PAGE_DATETIMEFORMAT, &::getCppuType((const sal_Int32*)0),           0,  0},                                                            \
195         { MAP_CHAR_LEN("NavigationOrder"),              WID_NAVORDER, &::com::sun::star::container::XIndexAccess::static_type(),0,  0},                                                            \
196         {0,0,0,0,0,0}
197 
198     static const SfxItemPropertyMapEntry aDrawPageNotesHandoutPropertyMap_Impl[] =
199     {
200         // this must be the first two entries so they can be excluded for PK_STANDARD
201         { MAP_CHAR_LEN(UNO_NAME_PAGE_BACKGROUND),       WID_PAGE_BACK,      &ITYPE( beans::XPropertySet ),                  beans::PropertyAttribute::MAYBEVOID,0},
202         DRAW_PAGE_NOTES_PROPERTIES
203     };
204     static const SfxItemPropertyMapEntry aDrawPageNotesHandoutPropertyNoBackMap_Impl[] =
205     {
206         DRAW_PAGE_NOTES_PROPERTIES
207     };
208 
209 #define GRAPHIC_PAGE_PROPERTIES \
210         { MAP_CHAR_LEN(UNO_NAME_PAGE_BOTTOM),           WID_PAGE_BOTTOM,    &::getCppuType((const sal_Int32*)0),            0,  0},                                                                             \
211         { MAP_CHAR_LEN(UNO_NAME_PAGE_LEFT),             WID_PAGE_LEFT,      &::getCppuType((const sal_Int32*)0),            0,  0},                                                                             \
212         { MAP_CHAR_LEN(UNO_NAME_PAGE_RIGHT),            WID_PAGE_RIGHT,     &::getCppuType((const sal_Int32*)0),            0,  0},                                                                             \
213         { MAP_CHAR_LEN(UNO_NAME_PAGE_TOP),              WID_PAGE_TOP,       &::getCppuType((const sal_Int32*)0),            0,  0},                                                                             \
214         { MAP_CHAR_LEN(UNO_NAME_PAGE_HEIGHT),           WID_PAGE_HEIGHT,    &::getCppuType((const sal_Int32*)0),            0,  0},                                                                             \
215         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYBITMAP),     WID_PAGE_LDBITMAP,  &ITYPE(awt::XBitmap),                           beans::PropertyAttribute::READONLY, 0},                                             \
216         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYNAME),       WID_PAGE_LDNAME,    &::getCppuType((const OUString*)0),             beans::PropertyAttribute::READONLY, 0},                                             \
217         { MAP_CHAR_LEN(UNO_NAME_PAGE_NUMBER),           WID_PAGE_NUMBER,    &::getCppuType((const sal_Int16*)0),            beans::PropertyAttribute::READONLY, 0},                                             \
218         { MAP_CHAR_LEN(UNO_NAME_PAGE_ORIENTATION),      WID_PAGE_ORIENT,    &::getCppuType((const view::PaperOrientation*)0),0, 0},                                                                             \
219         { MAP_CHAR_LEN(UNO_NAME_PAGE_WIDTH),            WID_PAGE_WIDTH,     &::getCppuType((const sal_Int32*)0),            0,  0},                                                                             \
220         { MAP_CHAR_LEN(UNO_NAME_PAGE_PREVIEW),          WID_PAGE_PREVIEW,   SEQTYPE(::getCppuType((::com::sun::star::uno::Sequence<sal_Int8>*)0)), ::com::sun::star::beans::PropertyAttribute::READONLY, 0},    \
221         { MAP_CHAR_LEN(UNO_NAME_PAGE_PREVIEWBITMAP),    WID_PAGE_PREVIEWBITMAP, SEQTYPE(::getCppuType((::com::sun::star::uno::Sequence<sal_Int8>*)0)), ::com::sun::star::beans::PropertyAttribute::READONLY, 0},\
222         { MAP_CHAR_LEN(sUNO_Prop_UserDefinedAttributes),WID_PAGE_USERATTRIBS, &::getCppuType((const Reference< ::com::sun::star::container::XNameContainer >*)0)  ,         0,     0},                          \
223         { MAP_CHAR_LEN(sUNO_Prop_BookmarkURL),          WID_PAGE_BOOKMARK,  &::getCppuType((const OUString*)0),             0,  0},                                                                             \
224         { MAP_CHAR_LEN("IsBackgroundDark" ),            WID_PAGE_ISDARK,    &::getBooleanCppuType(),                        beans::PropertyAttribute::READONLY, 0},                                             \
225         { MAP_CHAR_LEN("NavigationOrder"),              WID_NAVORDER, &::com::sun::star::container::XIndexAccess::static_type(),0,  0},                                                                         \
226         {0,0,0,0,0,0}
227 
228     static const SfxItemPropertyMapEntry aGraphicPagePropertyMap_Impl[] =
229     {
230         { MAP_CHAR_LEN(UNO_NAME_PAGE_BACKGROUND),       WID_PAGE_BACK,      &ITYPE( beans::XPropertySet),                   beans::PropertyAttribute::MAYBEVOID,0},
231         GRAPHIC_PAGE_PROPERTIES
232     };
233     static const SfxItemPropertyMapEntry aGraphicPagePropertyNoBackMap_Impl[] =
234     {
235         GRAPHIC_PAGE_PROPERTIES
236     };
237 
238     //
239     bool bWithoutBackground = ePageKind != PK_STANDARD && ePageKind != PK_HANDOUT;
240     const SvxItemPropertySet* pRet = 0;
241     if( bImpress )
242     {
243         if( ePageKind == PK_STANDARD )
244         {
245             //PK_STANDARD always has a background property
246             static SvxItemPropertySet aDrawPagePropertySet_Impl( aDrawPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
247             pRet = &aDrawPagePropertySet_Impl;
248         }
249         else
250         {
251             if(bWithoutBackground)
252             {
253                 static SvxItemPropertySet aDrawPageNotesHandoutPropertyNoBackSet_Impl( aDrawPageNotesHandoutPropertyNoBackMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
254                 pRet = &aDrawPageNotesHandoutPropertyNoBackSet_Impl;
255             }
256             else
257             {
258                 static SvxItemPropertySet aDrawPageNotesHandoutPropertySet_Impl( aDrawPageNotesHandoutPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
259                 pRet = &aDrawPageNotesHandoutPropertySet_Impl;
260             }
261         }
262     }
263     else
264     {
265             if(bWithoutBackground)
266             {
267                 static SvxItemPropertySet aGraphicPagePropertyNoBackSet_Impl( aGraphicPagePropertyNoBackMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
268                 pRet = &aGraphicPagePropertyNoBackSet_Impl;
269             }
270             else
271             {
272                 static SvxItemPropertySet aGraphicPagePropertySet_Impl( aGraphicPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
273                 pRet = &aGraphicPagePropertySet_Impl;
274             }
275     }
276     return pRet;
277 }
278 
279 /** this function stores the property map for master pages in impress and draw */
ImplGetMasterPagePropertySet(PageKind ePageKind)280 const SvxItemPropertySet* ImplGetMasterPagePropertySet( PageKind ePageKind )
281 {
282     static const SfxItemPropertyMapEntry aMasterPagePropertyMap_Impl[] =
283     {
284         { MAP_CHAR_LEN(UNO_NAME_PAGE_BACKGROUND),       WID_PAGE_BACK,      &ITYPE(beans::XPropertySet),                    0,  0},
285         { MAP_CHAR_LEN(UNO_NAME_PAGE_BOTTOM),           WID_PAGE_BOTTOM,    &::getCppuType((const sal_Int32*)0),            0,  0},
286         { MAP_CHAR_LEN(UNO_NAME_PAGE_LEFT),             WID_PAGE_LEFT,      &::getCppuType((const sal_Int32*)0),            0,  0},
287         { MAP_CHAR_LEN(UNO_NAME_PAGE_RIGHT),            WID_PAGE_RIGHT,     &::getCppuType((const sal_Int32*)0),            0,  0},
288         { MAP_CHAR_LEN(UNO_NAME_PAGE_TOP),              WID_PAGE_TOP,       &::getCppuType((const sal_Int32*)0),            0,  0},
289         { MAP_CHAR_LEN(UNO_NAME_PAGE_HEIGHT),           WID_PAGE_HEIGHT,    &::getCppuType((const sal_Int32*)0),            0,  0},
290         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYBITMAP),     WID_PAGE_LDBITMAP,  &ITYPE(awt::XBitmap),                           beans::PropertyAttribute::READONLY, 0},
291         { MAP_CHAR_LEN(UNO_NAME_LINKDISPLAYNAME),       WID_PAGE_LDNAME,    &::getCppuType((const OUString*)0),             beans::PropertyAttribute::READONLY, 0},
292         { MAP_CHAR_LEN(UNO_NAME_PAGE_NUMBER),           WID_PAGE_NUMBER,    &::getCppuType((const sal_Int16*)0),            beans::PropertyAttribute::READONLY, 0},
293         { MAP_CHAR_LEN(UNO_NAME_PAGE_ORIENTATION),      WID_PAGE_ORIENT,    &::getCppuType((const view::PaperOrientation*)0),0, 0},
294         { MAP_CHAR_LEN(UNO_NAME_PAGE_WIDTH),            WID_PAGE_WIDTH,     &::getCppuType((const sal_Int32*)0),            0,  0},
295         { MAP_CHAR_LEN("BackgroundFullSize"),           WID_PAGE_BACKFULL,  &::getBooleanCppuType(),                        0, 0},
296         { MAP_CHAR_LEN(sUNO_Prop_UserDefinedAttributes),WID_PAGE_USERATTRIBS, &::getCppuType((const Reference< ::com::sun::star::container::XNameContainer >*)0)  ,         0,     0},
297         { MAP_CHAR_LEN("IsBackgroundDark" ),            WID_PAGE_ISDARK,    &::getBooleanCppuType(),                        beans::PropertyAttribute::READONLY, 0},
298         {0,0,0,0,0,0}
299     };
300 
301     static const SfxItemPropertyMapEntry aHandoutMasterPagePropertyMap_Impl[] =
302     {
303         { MAP_CHAR_LEN(UNO_NAME_PAGE_BOTTOM),           WID_PAGE_BOTTOM,    &::getCppuType((const sal_Int32*)0),            0,  0},
304         { MAP_CHAR_LEN(UNO_NAME_PAGE_LEFT),             WID_PAGE_LEFT,      &::getCppuType((const sal_Int32*)0),            0,  0},
305         { MAP_CHAR_LEN(UNO_NAME_PAGE_RIGHT),            WID_PAGE_RIGHT,     &::getCppuType((const sal_Int32*)0),            0,  0},
306         { MAP_CHAR_LEN(UNO_NAME_PAGE_TOP),              WID_PAGE_TOP,       &::getCppuType((const sal_Int32*)0),            0,  0},
307         { MAP_CHAR_LEN(UNO_NAME_PAGE_HEIGHT),           WID_PAGE_HEIGHT,    &::getCppuType((const sal_Int32*)0),            0,  0},
308         { MAP_CHAR_LEN(UNO_NAME_PAGE_ORIENTATION),      WID_PAGE_ORIENT,    &::getCppuType((const view::PaperOrientation*)0),0, 0},
309         { MAP_CHAR_LEN(UNO_NAME_PAGE_NUMBER),           WID_PAGE_NUMBER,    &::getCppuType((const sal_Int16*)0),            beans::PropertyAttribute::READONLY, 0},
310         { MAP_CHAR_LEN(UNO_NAME_PAGE_WIDTH),            WID_PAGE_WIDTH,     &::getCppuType((const sal_Int32*)0),            0,  0},
311         { MAP_CHAR_LEN(UNO_NAME_PAGE_LAYOUT),           WID_PAGE_LAYOUT,    &::getCppuType((const sal_Int16*)0),            0,  0},
312         { MAP_CHAR_LEN(sUNO_Prop_UserDefinedAttributes),WID_PAGE_USERATTRIBS, &::getCppuType((const Reference< ::com::sun::star::container::XNameContainer >*)0)  ,         0,     0},
313         { MAP_CHAR_LEN("IsBackgroundDark" ),            WID_PAGE_ISDARK,    &::getBooleanCppuType(),                        beans::PropertyAttribute::READONLY, 0},
314         { MAP_CHAR_LEN("IsHeaderVisible"),              WID_PAGE_HEADERVISIBLE, &::getBooleanCppuType(),                    0, 0},
315         { MAP_CHAR_LEN("HeaderText"),                   WID_PAGE_HEADERTEXT, &::getCppuType((const OUString*)0),                0,  0},
316         { MAP_CHAR_LEN("IsFooterVisible"),              WID_PAGE_FOOTERVISIBLE, &::getBooleanCppuType(),                    0, 0},
317         { MAP_CHAR_LEN("FooterText"),                   WID_PAGE_FOOTERTEXT, &::getCppuType((const OUString*)0),                0,  0},
318         { MAP_CHAR_LEN("IsPageNumberVisible"),          WID_PAGE_PAGENUMBERVISIBLE, &::getBooleanCppuType(),                    0, 0},
319         { MAP_CHAR_LEN("IsDateTimeVisible"),            WID_PAGE_DATETIMEVISIBLE, &::getBooleanCppuType(),                  0, 0},
320         { MAP_CHAR_LEN("IsDateTimeFixed"),              WID_PAGE_DATETIMEFIXED, &::getBooleanCppuType(),                    0, 0},
321         { MAP_CHAR_LEN("DateTimeText"),                 WID_PAGE_DATETIMETEXT, &::getCppuType((const OUString*)0),              0,  0},
322         { MAP_CHAR_LEN("DateTimeFormat"),               WID_PAGE_DATETIMEFORMAT, &::getCppuType((const sal_Int32*)0),           0,  0},
323         {0,0,0,0,0,0}
324     };
325 
326     const SvxItemPropertySet* pRet = 0;
327     if( ePageKind == PK_HANDOUT )
328     {
329         static SvxItemPropertySet aHandoutMasterPagePropertySet_Impl( aHandoutMasterPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
330         pRet = &aHandoutMasterPagePropertySet_Impl;
331     }
332     else
333     {
334         static SvxItemPropertySet aMasterPagePropertySet_Impl( aMasterPagePropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
335         pRet = &aMasterPagePropertySet_Impl;
336     }
337     return pRet;
338 }
339 
getUnoTunnelId()340 const ::com::sun::star::uno::Sequence< sal_Int8 > & SdGenericDrawPage::getUnoTunnelId() throw()
341 {
342         static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = 0;
343         if( !pSeq )
344         {
345                 ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() );
346                 if( !pSeq )
347                 {
348                         static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 );
349                         rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
350                         pSeq = &aSeq;
351                 }
352         }
353         return *pSeq;
354 }
355 
getSomething(const::com::sun::star::uno::Sequence<sal_Int8> & rId)356 sal_Int64 SAL_CALL SdGenericDrawPage::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw(::com::sun::star::uno::RuntimeException)
357 {
358         if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
359             rId.getConstArray(), 16 ) )
360         {
361                 return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
362         }
363         else
364         {
365                 return SvxFmDrawPage::getSomething( rId );
366         }
367 }
368 
369 /***********************************************************************
370 *                                                                      *
371 ***********************************************************************/
SdGenericDrawPage(SdXImpressDocument * _pModel,SdPage * pInPage,const SvxItemPropertySet * _pSet)372 SdGenericDrawPage::SdGenericDrawPage( SdXImpressDocument* _pModel, SdPage* pInPage, const SvxItemPropertySet* _pSet ) throw()
373 :       SvxFmDrawPage( (SdrPage*) pInPage ),
374         SdUnoSearchReplaceShape(this),
375         mpModel     ( _pModel ),
376         mpSdrModel(0),
377         mnTempPageNumber(0),
378         mpPropSet   ( _pSet ),
379         mbIsImpressDocument(false)
380 {
381     mpSdrModel = SvxFmDrawPage::mpModel;
382     if( mpModel )
383         mbIsImpressDocument = mpModel->IsImpressDocument() ? true : false;
384 
385 }
386 
~SdGenericDrawPage()387 SdGenericDrawPage::~SdGenericDrawPage() throw()
388 {
389 }
390 
throwIfDisposed() const391 void SdGenericDrawPage::throwIfDisposed() const throw (::com::sun::star::uno::RuntimeException )
392 {
393     if( (SvxFmDrawPage::mpModel == 0) || (mpModel == 0) || (SvxFmDrawPage::mpPage == 0) )
394         throw lang::DisposedException();
395 }
396 
GetModel() const397 SdXImpressDocument* SdGenericDrawPage::GetModel() const
398 {
399     if( mpSdrModel != SvxFmDrawPage::mpModel )
400     {
401         const_cast< SdGenericDrawPage* >(this)->mpSdrModel = SvxFmDrawPage::mpModel;
402         if( mpSdrModel )
403         {
404             uno::Reference< uno::XInterface > xModel( SvxFmDrawPage::mpModel->getUnoModel() );
405             const_cast< SdGenericDrawPage*>(this)->mpModel = SdXImpressDocument::getImplementation( xModel );
406             if( mpModel )
407                 const_cast< SdGenericDrawPage*>(this)->mbIsImpressDocument = mpModel->IsImpressDocument() ? true : false;
408         }
409         else
410         {
411             const_cast< SdGenericDrawPage* >(this)->mpModel = 0;
412         }
413     }
414 
415     return mpModel;
416 }
417 
418 // this is called whenever a SdrObject must be created for a empty api shape wrapper
_CreateSdrObject(const Reference<drawing::XShape> & xShape)419 SdrObject * SdGenericDrawPage::_CreateSdrObject( const Reference< drawing::XShape >& xShape ) throw()
420 {
421     if( NULL == SvxFmDrawPage::mpPage || !xShape.is() )
422         return NULL;
423 
424     String aType( xShape->getShapeType() );
425     const String aPrefix( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.") );
426     if( aType.CompareTo( aPrefix, aPrefix.Len() ) != 0 )
427     {
428         SdrObject* pObj = SvxFmDrawPage::_CreateSdrObject( xShape );
429         if( pObj && ( (pObj->GetObjInventor() != SdrInventor) || (pObj->GetObjIdentifier() != OBJ_PAGE) ) )
430         {
431             SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
432             if( pDoc )
433             {
434                 // #119287# similar to the code in the SdrObject methods the graphic and ole
435                 // SdrObjects need another default style than the rest, see task. Adding here, too.
436                 // TTTT: Same as for #119287#: Can be removed in branch aw080 again
437                 const bool bIsSdrGrafObj(0 != dynamic_cast< SdrGrafObj* >(pObj));
438                 const bool bIsSdrOle2Obj(0 != dynamic_cast< SdrOle2Obj* >(pObj));
439 
440                 if(bIsSdrGrafObj || bIsSdrOle2Obj)
441                 {
442                     pObj->NbcSetStyleSheet(pDoc->GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(), sal_True);
443                 }
444                 else
445                 {
446                     pObj->NbcSetStyleSheet(pDoc->GetDefaultStyleSheet(), sal_True);
447                 }
448             }
449         }
450         return pObj;
451     }
452 
453     aType = aType.Copy( aPrefix.Len() );
454 
455     PresObjKind eObjKind = PRESOBJ_NONE;
456 
457     if( aType.EqualsAscii( "TitleTextShape" ) )
458     {
459         eObjKind = PRESOBJ_TITLE;
460     }
461     else if( aType.EqualsAscii( "OutlinerShape" ) )
462     {
463         eObjKind = PRESOBJ_OUTLINE;
464     }
465     else if( aType.EqualsAscii( "SubtitleShape" ) )
466     {
467         eObjKind = PRESOBJ_TEXT;
468     }
469     else if( aType.EqualsAscii( "OLE2Shape" ) )
470     {
471         eObjKind = PRESOBJ_OBJECT;
472     }
473     else if( aType.EqualsAscii( "ChartShape" ) )
474     {
475         eObjKind = PRESOBJ_CHART;
476     }
477     else if( aType.EqualsAscii( "CalcShape" ) )
478     {
479         eObjKind = PRESOBJ_CALC;
480     }
481     else if( aType.EqualsAscii( "TableShape" ) )
482     {
483         eObjKind = PRESOBJ_TABLE;
484     }
485     else if( aType.EqualsAscii( "GraphicObjectShape" ) )
486     {
487 #ifdef STARIMAGE_AVAILABLE
488         eObjKind = PRESOBJ_IMAGE;
489 #else
490         eObjKind = PRESOBJ_GRAPHIC;
491 #endif
492     }
493     else if( aType.EqualsAscii( "OrgChartShape" ) )
494     {
495         eObjKind = PRESOBJ_ORGCHART;
496     }
497     else if( aType.EqualsAscii( "PageShape" ) )
498     {
499         if( GetPage()->GetPageKind() == PK_NOTES && GetPage()->IsMasterPage() )
500             eObjKind = PRESOBJ_TITLE;
501         else
502             eObjKind = PRESOBJ_PAGE;
503     }
504     else if( aType.EqualsAscii( "NotesShape" ) )
505     {
506         eObjKind = PRESOBJ_NOTES;
507     }
508     else if( aType.EqualsAscii( "HandoutShape" ) )
509     {
510         eObjKind = PRESOBJ_HANDOUT;
511     }
512     else if( aType.EqualsAscii( "FooterShape" ) )
513     {
514         eObjKind = PRESOBJ_FOOTER;
515     }
516     else if( aType.EqualsAscii( "HeaderShape" ) )
517     {
518         eObjKind = PRESOBJ_HEADER;
519     }
520     else if( aType.EqualsAscii( "SlideNumberShape" ) )
521     {
522         eObjKind = PRESOBJ_SLIDENUMBER;
523     }
524     else if( aType.EqualsAscii( "DateTimeShape" ) )
525     {
526         eObjKind = PRESOBJ_DATETIME;
527     }
528     else if( aType.EqualsAscii( "MediaShape" ) )
529     {
530         eObjKind = PRESOBJ_MEDIA;
531     }
532 
533     Rectangle aRect( eObjKind == PRESOBJ_TITLE ? GetPage()->GetTitleRect() : GetPage()->GetLayoutRect()  );
534 
535     const awt::Point aPos( aRect.Left(), aRect.Top() );
536     xShape->setPosition( aPos );
537 
538     const awt::Size aSize( aRect.GetWidth(), aRect.GetHeight() );
539     xShape->setSize( aSize );
540 
541     SdrObject *pPresObj = 0;
542     if( (eObjKind == PRESOBJ_TABLE) || (eObjKind == PRESOBJ_MEDIA) )
543     {
544         pPresObj = SvxFmDrawPage::_CreateSdrObject( xShape );
545         if( pPresObj )
546         {
547             SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
548             if( pDoc )
549                 pPresObj->NbcSetStyleSheet( pDoc->GetDefaultStyleSheet(), sal_True );
550             GetPage()->InsertPresObj( pPresObj, eObjKind );
551         }
552     }
553     else
554     {
555         pPresObj = GetPage()->CreatePresObj( eObjKind, sal_False, aRect, sal_True );
556     }
557 
558     if( pPresObj )
559         pPresObj->SetUserCall( GetPage() );
560 
561     return pPresObj;
562 }
563 
564 // XInterface
queryInterface(const uno::Type & rType)565 Any SAL_CALL SdGenericDrawPage::queryInterface( const uno::Type & rType )
566     throw(uno::RuntimeException)
567 {
568     Any aAny;
569 
570     QUERYINT( beans::XPropertySet );
571     else QUERYINT( container::XNamed );
572     else QUERYINT( util::XReplaceable );
573     else QUERYINT( util::XSearchable );
574     else QUERYINT( document::XLinkTargetSupplier );
575     else QUERYINT( drawing::XShapeCombiner );
576     else QUERYINT( drawing::XShapeBinder );
577     else QUERYINT( beans::XMultiPropertySet );
578     else if( rType == ITYPE( office::XAnnotationAccess ) )
579     {
580         return Any( Reference< office::XAnnotationAccess >( this ) );
581     }
582     else if( rType == ITYPE( XAnimationNodeSupplier ) )
583     {
584         if( mbIsImpressDocument )
585         {
586             const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PK_STANDARD;
587 
588             if( ePageKind == PK_STANDARD )
589                 return makeAny( Reference< XAnimationNodeSupplier >( this ) );
590         }
591     }
592     else
593         return SvxDrawPage::queryInterface( rType );
594 
595     return aAny;
596 }
597 
598 // XPropertySet
getPropertySetInfo()599 Reference< beans::XPropertySetInfo > SAL_CALL SdGenericDrawPage::getPropertySetInfo()
600     throw(uno::RuntimeException)
601 {
602     OGuard aGuard( Application::GetSolarMutex() );
603     throwIfDisposed();
604     return mpPropSet->getPropertySetInfo();
605 }
606 
setPropertyValue(const OUString & aPropertyName,const Any & aValue)607 void SAL_CALL SdGenericDrawPage::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
608     throw(beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
609 {
610     OGuard aGuard( Application::GetSolarMutex() );
611 
612     throwIfDisposed();
613 
614     const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName);
615 
616     switch( pEntry ? pEntry->nWID : -1 )
617     {
618         case WID_NAVORDER:
619             setNavigationOrder( aValue );
620             break;
621         case WID_PAGE_LEFT:
622         case WID_PAGE_RIGHT:
623         case WID_PAGE_TOP:
624         case WID_PAGE_BOTTOM:
625         case WID_PAGE_LAYOUT:
626         case WID_PAGE_DURATION:
627         case WID_PAGE_CHANGE:
628         {
629             sal_Int32 nValue = 0;
630             if(!(aValue >>= nValue))
631                 throw lang::IllegalArgumentException();
632 
633             switch( pEntry->nWID )
634             {
635             case WID_PAGE_LEFT:
636                 SetLftBorder(nValue);
637                 break;
638             case WID_PAGE_RIGHT:
639                 SetRgtBorder( nValue );
640                 break;
641             case WID_PAGE_TOP:
642                 SetUppBorder( nValue );
643                 break;
644             case WID_PAGE_BOTTOM:
645                 SetLwrBorder( nValue );
646                 break;
647             case WID_PAGE_CHANGE:
648                 GetPage()->SetPresChange( (PresChange)nValue );
649                 break;
650             case WID_PAGE_LAYOUT:
651                 GetPage()->SetAutoLayout( (AutoLayout)nValue, sal_True );
652                 break;
653             case WID_PAGE_DURATION:
654                 GetPage()->SetTime((sal_uInt32)nValue);
655                 break;
656             }
657             break;
658         }
659         case WID_PAGE_WIDTH:
660         {
661             sal_Int32 nWidth = 0;
662             if(!(aValue >>= nWidth))
663                 throw lang::IllegalArgumentException();
664 
665             SetWidth( nWidth );
666             break;
667         }
668         case WID_PAGE_HEIGHT:
669         {
670             sal_Int32 nHeight = 0;
671             if(!(aValue >>= nHeight))
672                 throw lang::IllegalArgumentException();
673 
674             SetHeight( nHeight );
675             break;
676         }
677         case WID_PAGE_ORIENT:
678         {
679             sal_Int32 nEnum = 0;
680             if(!::cppu::enum2int( nEnum, aValue ))
681                 throw lang::IllegalArgumentException();
682 
683             Orientation eOri = (((view::PaperOrientation)nEnum) == view::PaperOrientation_PORTRAIT)?ORIENTATION_PORTRAIT:ORIENTATION_LANDSCAPE;
684 
685             if( eOri != GetPage()->GetOrientation() )
686             {
687                 SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
688                 const PageKind ePageKind = GetPage()->GetPageKind();
689 
690                 sal_uInt16 i, nPageCnt = pDoc->GetMasterSdPageCount(ePageKind);
691                 for (i = 0; i < nPageCnt; i++)
692                 {
693                     SdPage* pPage = pDoc->GetMasterSdPage(i, ePageKind);
694                     pPage->SetOrientation( eOri );
695                 }
696 
697                 nPageCnt = pDoc->GetSdPageCount(ePageKind);
698 
699                 for (i = 0; i < nPageCnt; i++)
700                 {
701                     SdPage* pPage = pDoc->GetSdPage(i, ePageKind);
702                     pPage->SetOrientation( eOri );
703                 }
704             }
705             break;
706         }
707         case WID_PAGE_EFFECT:
708         {
709             sal_Int32 nEnum = 0;
710             if(!::cppu::enum2int( nEnum, aValue ))
711                 throw lang::IllegalArgumentException();
712 
713             GetPage()->SetFadeEffect( (presentation::FadeEffect)nEnum );
714             break;
715         }
716         case WID_PAGE_BACK:
717             setBackground( aValue );
718             break;
719         case WID_PAGE_SPEED:
720         {
721             sal_Int32 nEnum = 0;
722             if(!::cppu::enum2int( nEnum, aValue ))
723                 throw lang::IllegalArgumentException();
724 
725             GetPage()->setTransitionDuration( nEnum == 0 ? 3.0 : (nEnum == 1 ? 2.0 : 1.0 )  );
726             break;
727         }
728         case WID_PAGE_VISIBLE :
729         {
730             sal_Bool    bVisible = sal_False;
731             if( ! ( aValue >>= bVisible ) )
732                 throw lang::IllegalArgumentException();
733             GetPage()->SetExcluded( bVisible == sal_False );
734             break;
735         }
736         case WID_PAGE_SOUNDFILE :
737         {
738             OUString aURL;
739             if( aValue >>= aURL )
740             {
741                 GetPage()->SetSoundFile( aURL );
742                 GetPage()->SetSound( aURL.getLength() != 0 ? sal_True : sal_False );
743                 break;
744             }
745             else
746             {
747                 sal_Bool bStopSound = sal_False;
748                 if( aValue >>= bStopSound )
749                 {
750                     GetPage()->SetStopSound( bStopSound ? true : false );
751                     break;
752                 }
753             }
754 
755 
756             throw lang::IllegalArgumentException();
757         }
758         case WID_LOOP_SOUND:
759         {
760             sal_Bool bLoop = sal_False;
761             if( ! (aValue >>= bLoop) )
762                 throw lang::IllegalArgumentException();
763 
764             GetPage()->SetLoopSound( bLoop ? true : false );
765             break;
766         }
767         case WID_PAGE_BACKFULL:
768         {
769             sal_Bool    bFullSize = sal_False;
770             if( ! ( aValue >>= bFullSize ) )
771                 throw lang::IllegalArgumentException();
772             GetPage()->SetBackgroundFullSize( bFullSize );
773             break;
774         }
775         case WID_PAGE_BACKVIS:
776         {
777             sal_Bool bVisible = sal_False;
778             if( ! ( aValue >>= bVisible ) )
779                 throw lang::IllegalArgumentException();
780 
781             SdrPage* pPage = GetPage();
782             if( pPage )
783             {
784                 SdDrawDocument* pDoc = (SdDrawDocument*)pPage->GetModel();
785                 if( pDoc->GetMasterPageCount() )
786                 {
787                     SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin();
788                     SetOfByte aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
789                     aVisibleLayers.Set(rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), sal_False), bVisible);
790                     pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
791                 }
792             }
793             break;
794         }
795         case WID_PAGE_BACKOBJVIS:
796         {
797             sal_Bool bVisible = sal_False;
798             if( ! ( aValue >>= bVisible ) )
799                 throw lang::IllegalArgumentException();
800 
801             SdrPage* pPage = GetPage();
802             if( pPage )
803             {
804                 SdDrawDocument* pDoc = (SdDrawDocument*)pPage->GetModel();
805                 if( pDoc->GetMasterPageCount() )
806                 {
807                     SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin();
808                     SetOfByte aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
809                     aVisibleLayers.Set(rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False), bVisible);
810                     pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
811                 }
812             }
813 
814             break;
815         }
816         case WID_PAGE_USERATTRIBS:
817         {
818             if( !GetPage()->setAlienAttributes( aValue ) )
819                 throw lang::IllegalArgumentException();
820             break;
821         }
822         case WID_PAGE_BOOKMARK:
823         {
824             OUString aBookmarkURL;
825             if( ! ( aValue >>= aBookmarkURL ) )
826                 throw lang::IllegalArgumentException();
827 
828             setBookmarkURL( aBookmarkURL );
829             break;
830         }
831 
832         case WID_PAGE_HEADERVISIBLE:
833         case WID_PAGE_HEADERTEXT:
834         case WID_PAGE_FOOTERVISIBLE:
835         case WID_PAGE_FOOTERTEXT:
836         case WID_PAGE_PAGENUMBERVISIBLE:
837         case WID_PAGE_DATETIMEVISIBLE:
838         case WID_PAGE_DATETIMEFIXED:
839         case WID_PAGE_DATETIMETEXT:
840         case WID_PAGE_DATETIMEFORMAT:
841         {
842             sd::HeaderFooterSettings aHeaderFooterSettings( GetPage()->getHeaderFooterSettings() );
843 
844             switch( pEntry->nWID )
845             {
846             case WID_PAGE_HEADERVISIBLE:
847             {
848                 sal_Bool bVisible = sal_False;
849                 if( ! ( aValue >>= bVisible ) )
850                     throw lang::IllegalArgumentException();
851 
852                 aHeaderFooterSettings.mbHeaderVisible = bVisible;
853                 break;
854             }
855             case WID_PAGE_HEADERTEXT:
856             {
857                 OUString aText;
858                 if( ! ( aValue >>= aText ) )
859                     throw lang::IllegalArgumentException();
860 
861                 aHeaderFooterSettings.maHeaderText = aText;
862                 break;
863             }
864             case WID_PAGE_FOOTERVISIBLE:
865             {
866                 sal_Bool bVisible = sal_False;
867                 if( ! ( aValue >>= bVisible ) )
868                     throw lang::IllegalArgumentException();
869 
870                 aHeaderFooterSettings.mbFooterVisible = bVisible;
871                 break;
872             }
873             case WID_PAGE_FOOTERTEXT:
874             {
875                 OUString aText;
876                 if( ! ( aValue >>= aText ) )
877                     throw lang::IllegalArgumentException();
878 
879                 aHeaderFooterSettings.maFooterText = aText;
880                 break;
881             }
882             case WID_PAGE_PAGENUMBERVISIBLE:
883             {
884                 sal_Bool bVisible = sal_False;
885                 if( ! ( aValue >>= bVisible ) )
886                     throw lang::IllegalArgumentException();
887 
888                 aHeaderFooterSettings.mbSlideNumberVisible = bVisible;
889                 break;
890             }
891             case WID_PAGE_DATETIMEVISIBLE:
892             {
893                 sal_Bool bVisible = sal_False;
894                 if( ! ( aValue >>= bVisible ) )
895                     throw lang::IllegalArgumentException();
896 
897                 aHeaderFooterSettings.mbDateTimeVisible = bVisible;
898                 break;
899             }
900             case WID_PAGE_DATETIMEFIXED:
901             {
902                 sal_Bool bVisible = sal_False;
903                 if( ! ( aValue >>= bVisible ) )
904                     throw lang::IllegalArgumentException();
905 
906                 aHeaderFooterSettings.mbDateTimeIsFixed = bVisible;
907                 break;
908             }
909             case WID_PAGE_DATETIMETEXT:
910             {
911                 OUString aText;
912                 if( ! ( aValue >>= aText ) )
913                     throw lang::IllegalArgumentException();
914 
915                 aHeaderFooterSettings.maDateTimeText = aText;
916                 break;
917             }
918             case WID_PAGE_DATETIMEFORMAT:
919             {
920                 sal_Int32 nValue = 0;
921                 if( ! ( aValue >>= nValue ) )
922                     throw lang::IllegalArgumentException();
923 
924                 aHeaderFooterSettings.meDateTimeFormat = nValue;
925                 break;
926             }
927             }
928 
929             if( !(aHeaderFooterSettings == GetPage()->getHeaderFooterSettings()) )
930                 GetPage()->setHeaderFooterSettings( aHeaderFooterSettings );
931 
932             break;
933         }
934 
935         case WID_PAGE_NUMBER:
936             if( (GetPage()->GetPageKind() == PK_HANDOUT) && !GetPage()->IsMasterPage() )
937             {
938                 if( !(aValue >>= mnTempPageNumber) )
939                     throw lang::IllegalArgumentException();
940 
941                 break;
942             }
943             throw beans::PropertyVetoException();
944 
945         case WID_PAGE_LDBITMAP:
946         case WID_PAGE_LDNAME:
947         case WID_PAGE_ISDARK:
948             throw beans::PropertyVetoException();
949 
950         case WID_TRANSITION_TYPE:
951         {
952             sal_Int16 nValue = 0;
953             if( ! ( aValue >>= nValue ) )
954                 throw lang::IllegalArgumentException();
955 
956             GetPage()->setTransitionType( nValue );
957             break;
958         }
959 
960         case WID_TRANSITION_SUBTYPE:
961         {
962             sal_Int16 nValue = 0;
963             if( ! ( aValue >>= nValue ) )
964                 throw lang::IllegalArgumentException();
965 
966             GetPage()->setTransitionSubtype( nValue );
967             break;
968         }
969 
970         case WID_TRANSITION_DIRECTION:
971         {
972             sal_Bool bValue = sal_False;
973             if( ! ( aValue >>= bValue ) )
974                 throw lang::IllegalArgumentException();
975 
976             GetPage()->setTransitionDirection( bValue );
977             break;
978         }
979 
980         case WID_TRANSITION_FADE_COLOR:
981         {
982             sal_Int32 nValue = 0;
983             if( ! ( aValue >>= nValue ) )
984                 throw lang::IllegalArgumentException();
985 
986             GetPage()->setTransitionFadeColor( nValue );
987             break;
988         }
989 
990         case WID_TRANSITION_DURATION:
991         {
992             double fValue = 0.0;
993             if( ! ( aValue >>= fValue ) )
994                 throw lang::IllegalArgumentException();
995 
996             GetPage()->setTransitionDuration( fValue );
997             break;
998         }
999 
1000         default:
1001             throw beans::UnknownPropertyException();
1002     }
1003 
1004     GetModel()->SetModified();
1005 }
1006 
1007 /***********************************************************************
1008 *                                                                      *
1009 ***********************************************************************/
getPropertyValue(const OUString & PropertyName)1010 Any SAL_CALL SdGenericDrawPage::getPropertyValue( const OUString& PropertyName )
1011     throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
1012 {
1013     OGuard aGuard( Application::GetSolarMutex() );
1014 
1015     throwIfDisposed();
1016 
1017     uno::Any aAny;
1018 
1019     const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName);
1020 
1021     switch( pEntry ? pEntry->nWID : -1 )
1022     {
1023     case WID_NAVORDER:
1024         aAny = getNavigationOrder();
1025         break;
1026     case WID_PAGE_LEFT:
1027         aAny <<= (sal_Int32)( GetPage()->GetLftBorder() );
1028         break;
1029     case WID_PAGE_RIGHT:
1030         aAny <<= (sal_Int32)( GetPage()->GetRgtBorder() );
1031         break;
1032     case WID_PAGE_TOP:
1033         aAny <<= (sal_Int32)( GetPage()->GetUppBorder() );
1034         break;
1035     case WID_PAGE_BOTTOM:
1036         aAny <<= (sal_Int32)( GetPage()->GetLwrBorder() );
1037         break;
1038     case WID_PAGE_WIDTH:
1039         aAny <<= (sal_Int32)( GetPage()->GetSize().getWidth() );
1040         break;
1041     case WID_PAGE_HEIGHT:
1042         aAny <<= (sal_Int32)( GetPage()->GetSize().getHeight() );
1043         break;
1044     case WID_PAGE_ORIENT:
1045         aAny = ::cppu::int2enum( (sal_Int32)((GetPage()->GetOrientation() == ORIENTATION_PORTRAIT)? view::PaperOrientation_PORTRAIT: view::PaperOrientation_LANDSCAPE), ::getCppuType((const view::PaperOrientation*)0) );
1046         break;
1047     case WID_PAGE_EFFECT:
1048         aAny = ::cppu::int2enum( (sal_Int32)GetPage()->GetFadeEffect(), ::getCppuType((const presentation::FadeEffect*)0) );
1049         break;
1050     case WID_PAGE_CHANGE:
1051         aAny <<= (sal_Int32)( GetPage()->GetPresChange() );
1052         break;
1053     case WID_PAGE_SPEED:
1054         {
1055             const double fDuration = GetPage()->getTransitionDuration();
1056             aAny = ::cppu::int2enum( fDuration < 2.0 ? 2 : (fDuration > 2.0 ? 0 : 1), ::getCppuType((const presentation::AnimationSpeed*)0) );
1057         }
1058         break;
1059     case WID_PAGE_LAYOUT:
1060         aAny <<= (sal_Int16)( GetPage()->GetAutoLayout() );
1061         break;
1062     case WID_PAGE_NUMBER:
1063         {
1064             const sal_uInt16 nPageNumber(GetPage()->GetPageNum());
1065 
1066             if(nPageNumber > 0)
1067             {
1068                 // for all other pages calculate the number
1069                 aAny <<= (sal_Int16)((sal_uInt16)((nPageNumber-1)>>1) + 1);
1070             }
1071             else
1072             {
1073                 aAny <<= mnTempPageNumber;
1074             }
1075         }
1076         break;
1077     case WID_PAGE_DURATION:
1078         aAny <<= (sal_Int32)(GetPage()->GetTime());
1079         break;
1080     case WID_PAGE_LDNAME:
1081     {
1082         const OUString aName( GetPage()->GetName() );
1083         aAny <<= aName;
1084         break;
1085     }
1086     case WID_PAGE_LDBITMAP:
1087         {
1088             sal_Bool bHC = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
1089             Reference< awt::XBitmap > xBitmap(
1090                 VCLUnoHelper::CreateBitmap( BitmapEx( SdResId( bHC ? BMP_PAGE_H : BMP_PAGE ) ) ) );
1091             aAny <<= xBitmap;
1092         }
1093         break;
1094     case WID_PAGE_BACK:
1095         getBackground( aAny );
1096         break;
1097     case WID_PAGE_PREVIEW :
1098         {
1099             SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1100             if ( pDoc )
1101             {
1102                 ::sd::DrawDocShell* pDocShell = pDoc->GetDocSh();
1103                 if ( pDocShell )
1104                 {
1105                     sal_uInt16 nPgNum = 0;
1106                     sal_uInt16 nPageCount = pDoc->GetSdPageCount( PK_STANDARD );
1107                     sal_uInt16 nPageNumber = (sal_uInt16)( ( GetPage()->GetPageNum() - 1 ) >> 1 );
1108                     while( nPgNum < nPageCount )
1109                     {
1110                         pDoc->SetSelected( pDoc->GetSdPage( nPgNum, PK_STANDARD ), nPgNum == nPageNumber );
1111                         nPgNum++;
1112                     }
1113                     ::boost::shared_ptr<GDIMetaFile> pMetaFile =
1114                         pDocShell->GetPreviewMetaFile();
1115                     if ( pMetaFile )
1116                     {
1117                         Point   aPoint;
1118                         Size    aSize( GetPage()->GetSize() );
1119                         pMetaFile->AddAction( (MetaAction*) new MetaFillColorAction( COL_WHITE, sal_True ), 0 );
1120                         pMetaFile->AddAction( (MetaAction*) new MetaRectAction( Rectangle( aPoint, aSize ) ), 1 );
1121                         pMetaFile->SetPrefMapMode( MAP_100TH_MM );
1122                         pMetaFile->SetPrefSize( aSize );
1123 
1124                         SvMemoryStream aDestStrm( 65535, 65535 );
1125                         ConvertGDIMetaFileToWMF( *pMetaFile, aDestStrm, NULL, sal_False );
1126                         Sequence<sal_Int8> aSeq( (sal_Int8*)aDestStrm.GetData(), aDestStrm.Tell() );
1127                         aAny <<= aSeq;
1128                     }
1129                 }
1130             }
1131         }
1132         break;
1133 
1134     case WID_PAGE_PREVIEWBITMAP :
1135         {
1136             SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1137             if ( pDoc )
1138             {
1139                 ::sd::DrawDocShell* pDocShell = pDoc->GetDocSh();
1140                 if ( pDocShell )
1141                 {
1142                     sal_uInt16 nPgNum = 0;
1143                     sal_uInt16 nPageCount = pDoc->GetSdPageCount( PK_STANDARD );
1144                     sal_uInt16 nPageNumber = (sal_uInt16)( ( GetPage()->GetPageNum() - 1 ) >> 1 );
1145                     while( nPgNum < nPageCount )
1146                     {
1147                         pDoc->SetSelected( pDoc->GetSdPage( nPgNum, PK_STANDARD ), nPgNum == nPageNumber );
1148                         nPgNum++;
1149                     }
1150                     ::boost::shared_ptr<GDIMetaFile> pMetaFile =
1151                         pDocShell->GetPreviewMetaFile();
1152                     BitmapEx aBitmap;
1153                     if ( pMetaFile && pMetaFile->CreateThumbnail( 160, /* magic value taken from GraphicHelper::getThumbnailFormatFromGDI_Impl() */
1154                                                                   aBitmap ) )
1155                     {
1156                         SvMemoryStream aMemStream;
1157                         WriteDIB(aBitmap.GetBitmap(), aMemStream, false, false);
1158                         uno::Sequence<sal_Int8> aSeq( (sal_Int8*)aMemStream.GetData(), aMemStream.Tell() );
1159                         aAny <<= aSeq;
1160                     }
1161                 }
1162             }
1163         }
1164         break;
1165 
1166     case WID_PAGE_VISIBLE :
1167     {
1168         sal_Bool bVisible = GetPage()->IsExcluded() == sal_False;
1169         aAny <<= Any( &bVisible, ::getBooleanCppuType() );
1170         break;
1171     }
1172 
1173     case WID_PAGE_SOUNDFILE :
1174     {
1175         if( GetPage()->IsStopSound() )
1176         {
1177             aAny <<= sal_True;
1178         }
1179         else
1180         {
1181             OUString aURL;
1182             if( GetPage()->IsSoundOn() )
1183                 aURL = GetPage()->GetSoundFile();
1184             aAny <<= aURL;
1185         }
1186         break;
1187     }
1188     case WID_LOOP_SOUND:
1189     {
1190         aAny <<= (sal_Bool)GetPage()->IsLoopSound();
1191         break;
1192     }
1193     case WID_PAGE_BACKFULL:
1194     {
1195         sal_Bool bFullSize = GetPage()->IsBackgroundFullSize();
1196         aAny = Any( &bFullSize, ::getBooleanCppuType() );
1197         break;
1198     }
1199     case WID_PAGE_BACKVIS:
1200     {
1201         SdrPage* pPage = GetPage();
1202         if( pPage )
1203         {
1204             SdDrawDocument* pDoc = (SdDrawDocument*)pPage->GetModel();
1205             if( pDoc->GetMasterPageCount() )
1206             {
1207                 SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin();
1208                 SetOfByte aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
1209                 aAny <<= (sal_Bool)aVisibleLayers.IsSet(rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), sal_False));
1210             }
1211             else
1212             {
1213                 aAny <<= (sal_Bool)sal_False;
1214             }
1215         }
1216         break;
1217     }
1218     case WID_PAGE_BACKOBJVIS:
1219     {
1220         SdrPage* pPage = GetPage();
1221         if( pPage )
1222         {
1223             SdDrawDocument* pDoc = (SdDrawDocument*)pPage->GetModel();
1224             if( pDoc->GetMasterPageCount() )
1225             {
1226                 SdrLayerAdmin& rLayerAdmin = pDoc->GetLayerAdmin();
1227                 SetOfByte aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
1228                 aAny <<= (sal_Bool)aVisibleLayers.IsSet(rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), sal_False));
1229             }
1230             else
1231             {
1232                 aAny <<= (sal_Bool)sal_False;
1233             }
1234         }
1235         break;
1236     }
1237     case WID_PAGE_USERATTRIBS:
1238     {
1239         GetPage()->getAlienAttributes( aAny );
1240         break;
1241     }
1242     case WID_PAGE_BOOKMARK:
1243     {
1244         aAny <<= getBookmarkURL();
1245         break;
1246     }
1247     case WID_PAGE_ISDARK:
1248     {
1249         aAny <<= (sal_Bool)GetPage()->GetPageBackgroundColor().IsDark();
1250         break;
1251     }
1252     case WID_PAGE_HEADERVISIBLE:
1253         aAny <<= (sal_Bool)GetPage()->getHeaderFooterSettings().mbHeaderVisible;
1254         break;
1255     case WID_PAGE_HEADERTEXT:
1256         {
1257             const OUString aText( GetPage()->getHeaderFooterSettings().maHeaderText );
1258             aAny <<= aText;
1259         }
1260         break;
1261     case WID_PAGE_FOOTERVISIBLE:
1262         aAny <<= (sal_Bool)GetPage()->getHeaderFooterSettings().mbFooterVisible;
1263         break;
1264     case WID_PAGE_FOOTERTEXT:
1265         {
1266             const OUString aText( GetPage()->getHeaderFooterSettings().maFooterText );
1267             aAny <<= aText;
1268         }
1269         break;
1270     case WID_PAGE_PAGENUMBERVISIBLE:
1271         aAny <<= (sal_Bool)GetPage()->getHeaderFooterSettings().mbSlideNumberVisible;
1272         break;
1273     case WID_PAGE_DATETIMEVISIBLE:
1274         aAny <<= (sal_Bool)GetPage()->getHeaderFooterSettings().mbDateTimeVisible;
1275         break;
1276     case WID_PAGE_DATETIMEFIXED:
1277         aAny <<= (sal_Bool)GetPage()->getHeaderFooterSettings().mbDateTimeIsFixed;
1278         break;
1279     case WID_PAGE_DATETIMETEXT:
1280         {
1281             const OUString aText( GetPage()->getHeaderFooterSettings().maDateTimeText );
1282             aAny <<= aText;
1283         }
1284         break;
1285     case WID_PAGE_DATETIMEFORMAT:
1286         aAny <<= (sal_Int32)GetPage()->getHeaderFooterSettings().meDateTimeFormat;
1287         break;
1288 
1289     case WID_TRANSITION_TYPE:
1290         aAny <<= GetPage()->getTransitionType();
1291         break;
1292 
1293     case WID_TRANSITION_SUBTYPE:
1294         aAny <<= GetPage()->getTransitionSubtype();
1295         break;
1296 
1297     case WID_TRANSITION_DIRECTION:
1298         aAny <<= GetPage()->getTransitionDirection();
1299         break;
1300 
1301     case WID_TRANSITION_FADE_COLOR:
1302         aAny <<= GetPage()->getTransitionFadeColor();
1303         break;
1304 
1305     case WID_TRANSITION_DURATION:
1306         aAny <<= GetPage()->getTransitionDuration();
1307         break;
1308 
1309     default:
1310         throw beans::UnknownPropertyException();
1311     }
1312     return aAny;
1313 }
1314 
addPropertyChangeListener(const OUString &,const Reference<beans::XPropertyChangeListener> &)1315 void SAL_CALL SdGenericDrawPage::addPropertyChangeListener( const OUString& , const Reference< beans::XPropertyChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
removePropertyChangeListener(const OUString &,const Reference<beans::XPropertyChangeListener> &)1316 void SAL_CALL SdGenericDrawPage::removePropertyChangeListener( const OUString& , const Reference< beans::XPropertyChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
addVetoableChangeListener(const OUString &,const Reference<beans::XVetoableChangeListener> &)1317 void SAL_CALL SdGenericDrawPage::addVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
removeVetoableChangeListener(const OUString &,const Reference<beans::XVetoableChangeListener> &)1318 void SAL_CALL SdGenericDrawPage::removeVetoableChangeListener( const OUString& , const Reference< beans::XVetoableChangeListener >&  ) throw(beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) {}
1319 
1320 // XMultiPropertySet
setPropertyValues(const Sequence<OUString> & aPropertyNames,const Sequence<Any> & aValues)1321 void SAL_CALL SdGenericDrawPage::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues ) throw (beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, RuntimeException )
1322 {
1323     if( aPropertyNames.getLength() != aValues.getLength() )
1324         throw lang::IllegalArgumentException();
1325 
1326     const OUString* pNames = aPropertyNames.getConstArray();
1327     const Any* pValues = aValues.getConstArray();
1328     sal_uInt32 nCount = aValues.getLength();
1329     while( nCount-- )
1330     {
1331         try
1332         {
1333             setPropertyValue( *pNames++, *pValues++ );
1334         }
1335         catch( beans::UnknownPropertyException& )
1336         {
1337             // ignore for multi property set
1338             // todo: optimize this!
1339         }
1340     }
1341 }
1342 
getPropertyValues(const Sequence<OUString> & aPropertyNames)1343 Sequence< Any > SAL_CALL SdGenericDrawPage::getPropertyValues( const Sequence< OUString >& aPropertyNames ) throw (RuntimeException)
1344 {
1345     const OUString* pNames = aPropertyNames.getConstArray();
1346     sal_uInt32 nCount = aPropertyNames.getLength();
1347     Sequence< Any > aValues( nCount );
1348     Any* pValues = aValues.getArray();
1349     while( nCount-- )
1350     {
1351         Any aValue;
1352         try
1353         {
1354             aValue = getPropertyValue( *pNames++ );
1355         }
1356         catch( beans::UnknownPropertyException& )
1357         {
1358             // ignore for multi property set
1359             // todo: optimize this!
1360         }
1361         *pValues++ = aValue;
1362     }
1363     return aValues;
1364 }
1365 
addPropertiesChangeListener(const Sequence<OUString> &,const Reference<beans::XPropertiesChangeListener> &)1366 void SAL_CALL SdGenericDrawPage::addPropertiesChangeListener( const Sequence< OUString >& , const Reference< beans::XPropertiesChangeListener >&  ) throw (RuntimeException)
1367 {
1368 }
1369 
removePropertiesChangeListener(const Reference<beans::XPropertiesChangeListener> &)1370 void SAL_CALL SdGenericDrawPage::removePropertiesChangeListener( const Reference< beans::XPropertiesChangeListener >&  ) throw (RuntimeException)
1371 {
1372 }
1373 
firePropertiesChangeEvent(const Sequence<OUString> &,const Reference<beans::XPropertiesChangeListener> &)1374 void SAL_CALL SdGenericDrawPage::firePropertiesChangeEvent( const Sequence< OUString >& , const Reference< beans::XPropertiesChangeListener >&  ) throw (RuntimeException)
1375 {
1376 }
1377 
_CreateShape(SdrObject * pObj) const1378 Reference< drawing::XShape >  SdGenericDrawPage::_CreateShape( SdrObject *pObj ) const throw()
1379 {
1380     DBG_ASSERT( GetPage(), "SdGenericDrawPage::_CreateShape(), can't create shape for disposed page!" );
1381     DBG_ASSERT( pObj, "SdGenericDrawPage::_CreateShape(), invalid call with pObj == 0!" );
1382 
1383     if( GetPage() && pObj )
1384     {
1385         PresObjKind eKind = GetPage()->GetPresObjKind(pObj);
1386 
1387         SvxShape* pShape = NULL;
1388 
1389         if(pObj->GetObjInventor() == SdrInventor)
1390         {
1391             sal_uInt32 nInventor = pObj->GetObjIdentifier();
1392             switch( nInventor )
1393             {
1394             case OBJ_TITLETEXT:
1395                 pShape = new SvxShapeText( pObj );
1396                 if( GetPage()->GetPageKind() == PK_NOTES && GetPage()->IsMasterPage() )
1397                 {
1398                     // fake a empty PageShape if its a title shape on the master page
1399                     pShape->SetShapeType(OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PageShape")));
1400                 }
1401                 else
1402                 {
1403                     pShape->SetShapeType(OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TitleTextShape")));
1404                 }
1405                 eKind = PRESOBJ_NONE;
1406                 break;
1407             case OBJ_OUTLINETEXT:
1408                 pShape = new SvxShapeText( pObj );
1409                 pShape->SetShapeType(OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.OutlinerShape")));
1410                 eKind = PRESOBJ_NONE;
1411                 break;
1412             }
1413         }
1414 
1415         Reference< drawing::XShape >  xShape( pShape );
1416 
1417         if(!xShape.is())
1418             xShape = SvxFmDrawPage::_CreateShape( pObj );
1419 
1420 
1421         if( eKind != PRESOBJ_NONE )
1422         {
1423             String aShapeType( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation."));
1424 
1425             switch( eKind )
1426             {
1427             case PRESOBJ_TITLE:
1428                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("TitleTextShape") );
1429                 break;
1430             case PRESOBJ_OUTLINE:
1431                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("OutlinerShape") );
1432                 break;
1433             case PRESOBJ_TEXT:
1434                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("SubtitleShape") );
1435                 break;
1436             case PRESOBJ_GRAPHIC:
1437                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("GraphicObjectShape") );
1438                 break;
1439             case PRESOBJ_OBJECT:
1440                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("OLE2Shape") );
1441                 break;
1442             case PRESOBJ_CHART:
1443                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("ChartShape") );
1444                 break;
1445             case PRESOBJ_ORGCHART:
1446                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("OrgChartShape") );
1447                 break;
1448             case PRESOBJ_CALC:
1449                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("CalcShape") );
1450                 break;
1451             case PRESOBJ_TABLE:
1452                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("TableShape") );
1453                 break;
1454             case PRESOBJ_MEDIA:
1455                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("MediaShape") );
1456                 break;
1457             case PRESOBJ_PAGE:
1458                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("PageShape") );
1459                 break;
1460             case PRESOBJ_HANDOUT:
1461                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("HandoutShape") );
1462                 break;
1463             case PRESOBJ_NOTES:
1464                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("NotesShape") );
1465                 break;
1466             case PRESOBJ_FOOTER:
1467                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("FooterShape") );
1468                 break;
1469             case PRESOBJ_HEADER:
1470                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("HeaderShape") );
1471                 break;
1472             case PRESOBJ_SLIDENUMBER:
1473                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("SlideNumberShape") );
1474                 break;
1475             case PRESOBJ_DATETIME:
1476                 aShapeType += String( RTL_CONSTASCII_USTRINGPARAM("DateTimeShape") );
1477                 break;
1478             case PRESOBJ_NONE:
1479             case PRESOBJ_IMAGE:
1480             case PRESOBJ_MAX:
1481                 break;
1482             }
1483 
1484             if( !pShape )
1485                 pShape = SvxShape::getImplementation( xShape );
1486 
1487             if( pShape )
1488                 pShape->SetShapeType( aShapeType );
1489         }
1490 
1491         // SdXShape aggregiert SvxShape
1492         new SdXShape( SvxShape::getImplementation( xShape ), GetModel() );
1493         return xShape;
1494     }
1495     else
1496     {
1497         return SvxFmDrawPage::_CreateShape( pObj );
1498     }
1499 
1500 }
1501 
1502 //----------------------------------------------------------------------
1503 
1504 // XServiceInfo
getSupportedServiceNames()1505 Sequence< OUString > SAL_CALL SdGenericDrawPage::getSupportedServiceNames()
1506     throw(uno::RuntimeException)
1507 {
1508     Sequence< OUString > aSeq( SvxFmDrawPage::getSupportedServiceNames() );
1509     comphelper::ServiceInfoHelper::addToSequence( aSeq, 3, "com.sun.star.drawing.GenericDrawPage",
1510                                                   "com.sun.star.document.LinkTarget",
1511                                                   "com.sun.star.document.LinkTargetSupplier");
1512     return aSeq;
1513 }
1514 
1515 //----------------------------------------------------------------------
1516 
1517 // XLinkTargetSupplier
getLinks()1518 Reference< container::XNameAccess > SAL_CALL SdGenericDrawPage::getLinks(  )
1519     throw(uno::RuntimeException)
1520 {
1521     return new SdPageLinkTargets( (SdGenericDrawPage*)this );
1522 }
1523 
1524 //----------------------------------------------------------------------
1525 
setBackground(const Any &)1526 void SdGenericDrawPage::setBackground( const Any& ) throw(lang::IllegalArgumentException)
1527 {
1528     DBG_ERROR( "Don't call me, I'm useless!" );
1529 }
1530 
1531 //----------------------------------------------------------------------
1532 
getBackground(Any &)1533 void SdGenericDrawPage::getBackground( Any& ) throw()
1534 {
1535     DBG_ERROR( "Don't call me, I'm useless!" );
1536 }
1537 
1538 //----------------------------------------------------------------------
1539 
getBookmarkURL() const1540 OUString SdGenericDrawPage::getBookmarkURL() const
1541 {
1542     OUStringBuffer aRet;
1543     if( SvxFmDrawPage::mpPage )
1544     {
1545         OUString aFileName( static_cast<SdPage*>(SvxFmDrawPage::mpPage)->GetFileName() );
1546         if( aFileName.getLength() )
1547         {
1548             const OUString aBookmarkName( SdDrawPage::getPageApiNameFromUiName( static_cast<SdPage*>(SvxFmDrawPage::mpPage)->GetBookmarkName() ) );
1549             aRet.append( aFileName );
1550             aRet.append( (sal_Unicode)'#' );
1551             aRet.append( aBookmarkName );
1552         }
1553     }
1554 
1555     return aRet.makeStringAndClear();
1556 }
1557 
1558 //----------------------------------------------------------------------
setBookmarkURL(rtl::OUString & rURL)1559 void SdGenericDrawPage::setBookmarkURL( rtl::OUString& rURL )
1560 {
1561     if( SvxFmDrawPage::mpPage )
1562     {
1563         sal_Int32 nIndex = rURL.indexOf( (sal_Unicode)'#' );
1564         if( nIndex != -1 )
1565         {
1566             const String aFileName( rURL.copy( 0, nIndex ) );
1567             const String aBookmarkName( SdDrawPage::getUiNameFromPageApiName( rURL.copy( nIndex+1 )  ) );
1568 
1569             if( aFileName.Len() && aBookmarkName.Len() )
1570             {
1571                 static_cast<SdPage*>(SvxFmDrawPage::mpPage)->DisconnectLink();
1572                 static_cast<SdPage*>(SvxFmDrawPage::mpPage)->SetFileName( aFileName );
1573                 static_cast<SdPage*>(SvxFmDrawPage::mpPage)->SetBookmarkName( aBookmarkName );
1574                 static_cast<SdPage*>(SvxFmDrawPage::mpPage)->ConnectLink();
1575             }
1576         }
1577     }
1578 }
1579 
1580 //----------------------------------------------------------------------
combine(const Reference<drawing::XShapes> & xShapes)1581 Reference< drawing::XShape > SAL_CALL SdGenericDrawPage::combine( const Reference< drawing::XShapes >& xShapes )
1582     throw( uno::RuntimeException )
1583 {
1584     OGuard aGuard( Application::GetSolarMutex() );
1585 
1586     throwIfDisposed();
1587 
1588     DBG_ASSERT(SvxFmDrawPage::mpPage,"SdrPage ist NULL! [CL]");
1589     DBG_ASSERT(mpView, "SdrView ist NULL! [CL]");
1590 
1591     Reference< drawing::XShape > xShape;
1592     if(mpView==NULL||!xShapes.is()||GetPage()==NULL)
1593         return xShape;
1594 
1595     SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
1596 
1597     _SelectObjectsInView( xShapes, pPageView );
1598 
1599     mpView->CombineMarkedObjects( sal_False );
1600 
1601     mpView->AdjustMarkHdl();
1602     const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
1603     if( rMarkList.GetMarkCount() == 1 )
1604     {
1605         SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
1606         if( pObj )
1607             xShape = Reference< drawing::XShape >::query( pObj->getUnoShape() );
1608     }
1609 
1610     mpView->HideSdrPage();
1611 
1612     GetModel()->SetModified();
1613 
1614     return xShape;
1615 }
1616 
1617 //----------------------------------------------------------------------
split(const Reference<drawing::XShape> & xGroup)1618 void SAL_CALL SdGenericDrawPage::split( const Reference< drawing::XShape >& xGroup )
1619     throw( uno::RuntimeException )
1620 {
1621     OGuard aGuard( Application::GetSolarMutex() );
1622 
1623     throwIfDisposed();
1624 
1625     if(mpView==NULL||!xGroup.is()||GetPage()==NULL)
1626         return;
1627 
1628     SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
1629     _SelectObjectInView( xGroup, pPageView );
1630     mpView->DismantleMarkedObjects( sal_False );
1631     mpView->HideSdrPage();
1632 
1633     GetModel()->SetModified();
1634 }
1635 
1636 //----------------------------------------------------------------------
bind(const Reference<drawing::XShapes> & xShapes)1637 Reference< drawing::XShape > SAL_CALL SdGenericDrawPage::bind( const Reference< drawing::XShapes >& xShapes )
1638     throw( uno::RuntimeException )
1639 {
1640     OGuard aGuard( Application::GetSolarMutex() );
1641 
1642     throwIfDisposed();
1643 
1644     uno::Reference< drawing::XShape > xShape;
1645     if(mpView==NULL||!xShapes.is()||GetPage()==NULL)
1646         return xShape;
1647 
1648     SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
1649 
1650     _SelectObjectsInView( xShapes, pPageView );
1651 
1652     mpView->CombineMarkedObjects( sal_True );
1653 
1654     mpView->AdjustMarkHdl();
1655     const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
1656     if( rMarkList.GetMarkCount() == 1 )
1657     {
1658         SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
1659         if( pObj )
1660             xShape = Reference< drawing::XShape >::query( pObj->getUnoShape() );
1661     }
1662 
1663     mpView->HideSdrPage();
1664 
1665     GetModel()->SetModified();
1666 
1667     return xShape;
1668 }
1669 
1670 //----------------------------------------------------------------------
unbind(const Reference<drawing::XShape> & xShape)1671 void SAL_CALL SdGenericDrawPage::unbind( const Reference< drawing::XShape >& xShape )
1672     throw( uno::RuntimeException )
1673 {
1674     OGuard aGuard( Application::GetSolarMutex() );
1675 
1676     throwIfDisposed();
1677 
1678     if(mpView==NULL||!xShape.is()||GetPage()==NULL)
1679         return;
1680 
1681     SdrPageView* pPageView = mpView->ShowSdrPage( GetPage() );
1682     _SelectObjectInView( xShape, pPageView );
1683     mpView->DismantleMarkedObjects( sal_True );
1684     mpView->HideSdrPage();
1685 
1686     GetModel()->SetModified();
1687 }
1688 
SetLftBorder(sal_Int32 nValue)1689 void SdGenericDrawPage::SetLftBorder( sal_Int32 nValue )
1690 {
1691     if( nValue != GetPage()->GetLftBorder() )
1692     {
1693         SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1694         const PageKind ePageKind = GetPage()->GetPageKind();
1695 
1696         sal_uInt16 i, nPageCnt = pDoc->GetMasterSdPageCount(ePageKind);
1697         for (i = 0; i < nPageCnt; i++)
1698         {
1699             SdPage* pPage = pDoc->GetMasterSdPage(i, ePageKind);
1700             pPage->SetLftBorder( nValue );
1701         }
1702 
1703         nPageCnt = pDoc->GetSdPageCount(ePageKind);
1704 
1705         for (i = 0; i < nPageCnt; i++)
1706         {
1707             SdPage* pPage = pDoc->GetSdPage(i, ePageKind);
1708             pPage->SetLftBorder( nValue );
1709         }
1710     }
1711 }
1712 
SetRgtBorder(sal_Int32 nValue)1713 void SdGenericDrawPage::SetRgtBorder( sal_Int32 nValue )
1714 {
1715     if( nValue != GetPage()->GetRgtBorder() )
1716     {
1717         SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1718         const PageKind ePageKind = GetPage()->GetPageKind();
1719 
1720         sal_uInt16 i, nPageCnt = pDoc->GetMasterSdPageCount(ePageKind);
1721         for (i = 0; i < nPageCnt; i++)
1722         {
1723             SdPage* pPage = pDoc->GetMasterSdPage(i, ePageKind);
1724             pPage->SetRgtBorder( nValue );
1725         }
1726 
1727         nPageCnt = pDoc->GetSdPageCount(ePageKind);
1728 
1729         for (i = 0; i < nPageCnt; i++)
1730         {
1731             SdPage* pPage = pDoc->GetSdPage(i, ePageKind);
1732             pPage->SetRgtBorder( nValue );
1733         }
1734     }
1735 }
1736 
SetUppBorder(sal_Int32 nValue)1737 void SdGenericDrawPage::SetUppBorder( sal_Int32 nValue )
1738 {
1739     if( nValue != GetPage()->GetUppBorder() )
1740     {
1741         SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1742         const PageKind ePageKind = GetPage()->GetPageKind();
1743 
1744         sal_uInt16 i, nPageCnt = pDoc->GetMasterSdPageCount(ePageKind);
1745         for (i = 0; i < nPageCnt; i++)
1746         {
1747             SdPage* pPage = pDoc->GetMasterSdPage(i, ePageKind);
1748             pPage->SetUppBorder( nValue );
1749         }
1750 
1751         nPageCnt = pDoc->GetSdPageCount(ePageKind);
1752 
1753         for (i = 0; i < nPageCnt; i++)
1754         {
1755             SdPage* pPage = pDoc->GetSdPage(i, ePageKind);
1756             pPage->SetUppBorder( nValue );
1757         }
1758     }
1759 }
1760 
SetLwrBorder(sal_Int32 nValue)1761 void SdGenericDrawPage::SetLwrBorder( sal_Int32 nValue )
1762 {
1763     if( nValue != GetPage()->GetLwrBorder() )
1764     {
1765         SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1766         const PageKind ePageKind = GetPage()->GetPageKind();
1767 
1768         sal_uInt16 i, nPageCnt = pDoc->GetMasterSdPageCount(ePageKind);
1769         for (i = 0; i < nPageCnt; i++)
1770         {
1771             SdPage* pPage = pDoc->GetMasterSdPage(i, ePageKind);
1772             pPage->SetLwrBorder( nValue );
1773         }
1774 
1775         nPageCnt = pDoc->GetSdPageCount(ePageKind);
1776 
1777         for (i = 0; i < nPageCnt; i++)
1778         {
1779             SdPage* pPage = pDoc->GetSdPage(i, ePageKind);
1780             pPage->SetLwrBorder( nValue );
1781         }
1782     }
1783 }
1784 
refreshpage(SdDrawDocument * pDoc,const PageKind ePageKind)1785 static void refreshpage( SdDrawDocument* pDoc, const PageKind ePageKind )
1786 {
1787     ::sd::DrawDocShell* pDocShell = pDoc->GetDocSh();
1788     if ( pDocShell )
1789     {
1790         ::sd::ViewShell* pViewSh = pDocShell->GetViewShell();
1791 
1792         if( pViewSh )
1793         {
1794             if( pViewSh->ISA(::sd::DrawViewShell ) )
1795                 static_cast< ::sd::DrawViewShell*>(pViewSh)->ResetActualPage();
1796 
1797             Size aPageSize = pDoc->GetSdPage(0, ePageKind)->GetSize();
1798             const long nWidth = aPageSize.Width();
1799             const long nHeight = aPageSize.Height();
1800 
1801             Point aPageOrg = Point(nWidth, nHeight / 2);
1802             Size aViewSize = Size(nWidth * 3, nHeight * 2);
1803 
1804             pDoc->SetMaxObjSize(aViewSize);
1805 
1806             pViewSh->InitWindows(aPageOrg, aViewSize, Point(-1, -1), sal_True);
1807 
1808             pViewSh->UpdateScrollBars();
1809         }
1810     }
1811 }
1812 
SetWidth(sal_Int32 nWidth)1813 void SdGenericDrawPage::SetWidth( sal_Int32 nWidth )
1814 {
1815     Size aSize( GetPage()->GetSize() );
1816     if( aSize.getWidth() != nWidth )
1817     {
1818         aSize.setWidth( nWidth );
1819 
1820         SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1821         const PageKind ePageKind = GetPage()->GetPageKind();
1822 
1823         sal_uInt16 i, nPageCnt = pDoc->GetMasterSdPageCount(ePageKind);
1824         for (i = 0; i < nPageCnt; i++)
1825         {
1826             SdPage* pPage = pDoc->GetMasterSdPage(i, ePageKind);
1827             pPage->SetSize(aSize);
1828         }
1829 
1830         nPageCnt = pDoc->GetSdPageCount(ePageKind);
1831 
1832         for (i = 0; i < nPageCnt; i++)
1833         {
1834             SdPage* pPage = pDoc->GetSdPage(i, ePageKind);
1835             pPage->SetSize(aSize);
1836         }
1837 
1838         refreshpage( pDoc, ePageKind );
1839     }
1840 }
1841 
SetHeight(sal_Int32 nHeight)1842 void SdGenericDrawPage::SetHeight( sal_Int32 nHeight )
1843 {
1844     Size aSize( GetPage()->GetSize() );
1845     if( aSize.getHeight() != nHeight )
1846     {
1847         aSize.setHeight( nHeight );
1848 
1849         SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel();
1850         const PageKind ePageKind = GetPage()->GetPageKind();
1851 
1852         sal_uInt16 i, nPageCnt = pDoc->GetMasterSdPageCount(ePageKind);
1853         for (i = 0; i < nPageCnt; i++)
1854         {
1855             SdPage* pPage = pDoc->GetMasterSdPage(i, ePageKind);
1856             pPage->SetSize(aSize);
1857         }
1858 
1859         nPageCnt = pDoc->GetSdPageCount(ePageKind);
1860 
1861         for (i = 0; i < nPageCnt; i++)
1862         {
1863             SdPage* pPage = pDoc->GetSdPage(i, ePageKind);
1864             pPage->SetSize(aSize);
1865         }
1866 
1867         refreshpage( pDoc, ePageKind );
1868     }
1869 }
1870 
1871 // XInterface
release()1872 void SdGenericDrawPage::release() throw()
1873 {
1874 
1875     OWeakAggObject::release();
1876 }
1877 
1878 // XComponent
disposing()1879 void SdGenericDrawPage::disposing() throw()
1880 {
1881     mpModel = 0;
1882     SvxFmDrawPage::disposing();
1883 }
1884 
1885 // XAnimationNodeSupplier
getAnimationNode()1886 Reference< XAnimationNode > SAL_CALL SdGenericDrawPage::getAnimationNode() throw (uno::RuntimeException)
1887 {
1888     OGuard aGuard( Application::GetSolarMutex() );
1889 
1890     throwIfDisposed();
1891 
1892     SdPage *pSdPage = static_cast<SdPage*>(SvxFmDrawPage::mpPage);
1893 
1894 
1895     return pSdPage->getAnimationNode();
1896 }
1897 
1898 //========================================================================
1899 // SdPageLinkTargets
1900 //========================================================================
1901 
SdPageLinkTargets(SdGenericDrawPage * pUnoPage)1902 SdPageLinkTargets::SdPageLinkTargets( SdGenericDrawPage* pUnoPage ) throw()
1903 {
1904     mxPage = pUnoPage;
1905     mpUnoPage = pUnoPage;
1906 }
1907 
~SdPageLinkTargets()1908 SdPageLinkTargets::~SdPageLinkTargets() throw()
1909 {
1910 }
1911 
1912     // XElementAccess
getElementType()1913 uno::Type SAL_CALL SdPageLinkTargets::getElementType()
1914     throw(uno::RuntimeException)
1915 {
1916     return ITYPE(beans::XPropertySet);
1917 }
1918 
hasElements()1919 sal_Bool SAL_CALL SdPageLinkTargets::hasElements()
1920     throw(uno::RuntimeException)
1921 {
1922     OGuard aGuard( Application::GetSolarMutex() );
1923 
1924     SdPage* pPage = mpUnoPage->GetPage();
1925     if( pPage != NULL )
1926     {
1927         SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
1928 
1929         while( aIter.IsMore() )
1930         {
1931             SdrObject* pObj = aIter.Next();
1932             String aStr( pObj->GetName() );
1933             if( !aStr.Len() && pObj->ISA( SdrOle2Obj ) )
1934                 aStr = static_cast< const SdrOle2Obj* >( pObj )->GetPersistName();
1935             if( aStr.Len() )
1936                 return sal_True;
1937         }
1938     }
1939 
1940     return sal_False;
1941 }
1942 
1943 // container::XNameAccess
1944 
1945 // XNameAccess
getByName(const OUString & aName)1946 Any SAL_CALL SdPageLinkTargets::getByName( const OUString& aName )
1947     throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
1948 {
1949     OGuard aGuard( Application::GetSolarMutex() );
1950 
1951     SdPage* pPage = mpUnoPage->GetPage();
1952     if( pPage != NULL )
1953     {
1954         SdrObject* pObj = FindObject( aName );
1955         if( pObj )
1956         {
1957             Reference< beans::XPropertySet > aRef( pObj->getUnoShape(), uno::UNO_QUERY );
1958             return makeAny( aRef );
1959         }
1960     }
1961 
1962     throw container::NoSuchElementException();
1963 }
1964 
getElementNames()1965 Sequence< OUString > SAL_CALL SdPageLinkTargets::getElementNames()
1966     throw(uno::RuntimeException)
1967 {
1968     OGuard aGuard( Application::GetSolarMutex() );
1969 
1970     sal_uInt32 nObjCount = 0;
1971 
1972     SdPage* pPage = mpUnoPage->GetPage();
1973     if( pPage != NULL )
1974     {
1975         SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
1976         while( aIter.IsMore() )
1977         {
1978             SdrObject* pObj = aIter.Next();
1979             String aStr( pObj->GetName() );
1980             if( !aStr.Len() && pObj->ISA( SdrOle2Obj ) )
1981                 aStr = static_cast< const SdrOle2Obj* >( pObj )->GetPersistName();
1982             if( aStr.Len() )
1983                 nObjCount++;
1984         }
1985     }
1986 
1987     Sequence< OUString > aSeq( nObjCount );
1988     if( nObjCount > 0 )
1989     {
1990         OUString* pStr = aSeq.getArray();
1991 
1992         SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
1993         while( aIter.IsMore() )
1994         {
1995             SdrObject* pObj = aIter.Next();
1996             String aStr( pObj->GetName() );
1997             if( !aStr.Len() && pObj->ISA( SdrOle2Obj ) )
1998                 aStr = static_cast< const SdrOle2Obj* >( pObj )->GetPersistName();
1999             if( aStr.Len() )
2000                 *pStr++ = aStr;
2001         }
2002     }
2003 
2004     return aSeq;
2005 }
2006 
hasByName(const OUString & aName)2007 sal_Bool SAL_CALL SdPageLinkTargets::hasByName( const OUString& aName )
2008     throw(uno::RuntimeException)
2009 {
2010     OGuard aGuard( Application::GetSolarMutex() );
2011 
2012     return FindObject( aName ) != NULL;
2013 }
2014 
2015 /***********************************************************************
2016 *                                                                      *
2017 ***********************************************************************/
FindObject(const String & rName) const2018 SdrObject* SdPageLinkTargets::FindObject( const String& rName ) const throw()
2019 {
2020     SdPage* pPage = mpUnoPage->GetPage();
2021     if( pPage == NULL )
2022         return NULL;
2023 
2024     SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS );
2025 
2026     while( aIter.IsMore() )
2027     {
2028         SdrObject* pObj = aIter.Next();
2029         String aStr( pObj->GetName() );
2030         if( !aStr.Len() && pObj->ISA( SdrOle2Obj ) )
2031             aStr = static_cast< const SdrOle2Obj* >( pObj )->GetPersistName();
2032         if( aStr.Len() && (aStr == rName) )
2033             return pObj;
2034     }
2035 
2036     return NULL;
2037 }
2038 
2039 // XServiceInfo
getImplementationName()2040 OUString SAL_CALL SdPageLinkTargets::getImplementationName()
2041     throw(uno::RuntimeException)
2042 {
2043     return OUString( RTL_CONSTASCII_USTRINGPARAM("SdPageLinkTargets") );
2044 }
2045 
supportsService(const OUString & ServiceName)2046 sal_Bool SAL_CALL SdPageLinkTargets::supportsService( const OUString& ServiceName )
2047     throw(uno::RuntimeException)
2048 {
2049     return comphelper::ServiceInfoHelper::supportsService( ServiceName, getSupportedServiceNames() );
2050 }
2051 
getSupportedServiceNames()2052 Sequence< OUString > SAL_CALL SdPageLinkTargets::getSupportedServiceNames()
2053     throw(uno::RuntimeException)
2054 {
2055     const OUString aSN( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.LinkTargets") );
2056     Sequence< OUString > aSeq( &aSN, 1);
2057     return aSeq;
2058 }
2059 
2060 //========================================================================
2061 // SdDrawPage
2062 //========================================================================
2063 
SdDrawPage(SdXImpressDocument * pModel,SdPage * pPage)2064 SdDrawPage::SdDrawPage(  SdXImpressDocument* pModel, SdPage* pPage ) throw()
2065 : SdGenericDrawPage( pModel, pPage, ImplGetDrawPagePropertySet( pModel->IsImpressDocument(), pPage->GetPageKind() ) )
2066 {
2067 }
2068 
~SdDrawPage()2069 SdDrawPage::~SdDrawPage() throw()
2070 {
2071 }
2072 
2073 // XInterface
queryInterface(const uno::Type & rType)2074 Any SAL_CALL SdDrawPage::queryInterface( const uno::Type & rType )
2075     throw(uno::RuntimeException)
2076 {
2077     if( rType == ITYPE( drawing::XMasterPageTarget ) )
2078     {
2079         return makeAny( Reference< drawing::XMasterPageTarget >( this ) );
2080     }
2081     else
2082     {
2083         if( mbIsImpressDocument )
2084         {
2085             const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PK_STANDARD;
2086 
2087             if( ePageKind != PK_HANDOUT && rType == ITYPE( presentation::XPresentationPage ) )
2088             {
2089                 return makeAny( Reference< presentation::XPresentationPage >( this ) );
2090             }
2091         }
2092     }
2093 
2094     return SdGenericDrawPage::queryInterface( rType );
2095 }
2096 
acquire()2097 void SAL_CALL SdDrawPage::acquire() throw()
2098 {
2099     SvxDrawPage::acquire();
2100 }
2101 
release()2102 void SAL_CALL SdDrawPage::release() throw()
2103 {
2104     SvxDrawPage::release();
2105 }
2106 
2107 UNO3_GETIMPLEMENTATION2_IMPL( SdDrawPage, SdGenericDrawPage );
2108 
2109 // XTypeProvider
getTypes()2110 Sequence< uno::Type > SAL_CALL SdDrawPage::getTypes() throw(uno::RuntimeException)
2111 {
2112     OGuard aGuard( Application::GetSolarMutex() );
2113 
2114     throwIfDisposed();
2115 
2116     if( maTypeSequence.getLength() == 0 )
2117     {
2118         const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PK_STANDARD;
2119         sal_Bool bPresPage = mbIsImpressDocument && ePageKind != PK_HANDOUT;
2120 
2121         // Collect the types of this class.
2122         ::std::vector<uno::Type> aTypes;
2123         aTypes.reserve(13);
2124         aTypes.push_back(ITYPE(drawing::XDrawPage));
2125         aTypes.push_back(ITYPE(beans::XPropertySet));
2126         aTypes.push_back(ITYPE(container::XNamed));
2127         aTypes.push_back(ITYPE(drawing::XMasterPageTarget));
2128         aTypes.push_back(ITYPE(lang::XServiceInfo));
2129         aTypes.push_back(ITYPE(util::XReplaceable));
2130         aTypes.push_back(ITYPE(document::XLinkTargetSupplier));
2131         aTypes.push_back(ITYPE( drawing::XShapeCombiner ));
2132         aTypes.push_back(ITYPE( drawing::XShapeBinder ));
2133         aTypes.push_back(ITYPE( office::XAnnotationAccess ));
2134         aTypes.push_back(ITYPE( beans::XMultiPropertySet ));
2135         if( bPresPage )
2136             aTypes.push_back(ITYPE(presentation::XPresentationPage));
2137         if( bPresPage && ePageKind == PK_STANDARD )
2138             aTypes.push_back(ITYPE(XAnimationNodeSupplier));
2139 
2140         // Get types of base class.
2141         const Sequence< uno::Type > aBaseTypes( SdGenericDrawPage::getTypes() );
2142         const sal_Int32 nBaseTypes = aBaseTypes.getLength();
2143         const uno::Type* pBaseTypes = aBaseTypes.getConstArray();
2144 
2145         // Join those types in a sequence.
2146         maTypeSequence.realloc(aTypes.size() + nBaseTypes);
2147         uno::Type* pTypes = maTypeSequence.getArray();
2148         ::std::vector<uno::Type>::const_iterator iType;
2149         for (iType=aTypes.begin(); iType!=aTypes.end(); ++iType)
2150             *pTypes++ = *iType;
2151         for( sal_Int32 nType = 0; nType < nBaseTypes; nType++ )
2152             *pTypes++ = *pBaseTypes++;
2153     }
2154 
2155     return maTypeSequence;
2156 }
2157 
getImplementationId()2158 Sequence< sal_Int8 > SAL_CALL SdDrawPage::getImplementationId() throw(uno::RuntimeException)
2159 {
2160     OGuard aGuard( Application::GetSolarMutex() );
2161 
2162     throwIfDisposed();
2163 
2164     static Sequence< sal_Int8 > aId;
2165     if( aId.getLength() == 0 )
2166     {
2167         aId.realloc( 16 );
2168         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
2169     }
2170     return aId;
2171 }
2172 
getPageApiName(SdPage * pPage)2173 OUString SdDrawPage::getPageApiName( SdPage* pPage )
2174 {
2175     return ::getPageApiName( pPage );
2176 }
2177 
getPageApiName(SdPage * pPage)2178 OUString getPageApiName( SdPage* pPage )
2179 {
2180     OUString aPageName;
2181 
2182     if(pPage)
2183     {
2184         aPageName = pPage->GetRealName();
2185 
2186         if( aPageName.getLength() == 0 )
2187         {
2188             OUStringBuffer sBuffer;
2189             sBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( sEmptyPageName ) );
2190             const sal_Int32 nPageNum = ( ( pPage->GetPageNum() - 1 ) >> 1 ) + 1;
2191             sBuffer.append( nPageNum );
2192             aPageName = sBuffer.makeStringAndClear();
2193         }
2194     }
2195 
2196     return aPageName;
2197 }
2198 
2199 
getPageApiNameFromUiName(const String & rUIName)2200 OUString getPageApiNameFromUiName( const String& rUIName )
2201 {
2202     OUString aApiName;
2203 
2204     String aDefPageName(SdResId(STR_PAGE));
2205     aDefPageName += sal_Unicode( ' ' );
2206 
2207     if( rUIName.Equals( aDefPageName, 0, aDefPageName.Len() ) )
2208     {
2209         aApiName = OUString( RTL_CONSTASCII_USTRINGPARAM( sEmptyPageName ) );
2210         aApiName += rUIName.Copy( aDefPageName.Len() );
2211     }
2212     else
2213     {
2214         aApiName = rUIName;
2215     }
2216 
2217     return aApiName;
2218 }
2219 
getPageApiNameFromUiName(const String & rUIName)2220 OUString SdDrawPage::getPageApiNameFromUiName( const String& rUIName )
2221 {
2222     return ::getPageApiNameFromUiName( rUIName );
2223 }
2224 
getUiNameFromPageApiNameImpl(const OUString & rApiName)2225 String getUiNameFromPageApiNameImpl( const OUString& rApiName )
2226 {
2227     const String aDefPageName(RTL_CONSTASCII_USTRINGPARAM( sEmptyPageName ));
2228     if( rApiName.compareTo( aDefPageName, aDefPageName.Len() ) == 0 )
2229     {
2230         OUString aNumber( rApiName.copy( sizeof( sEmptyPageName ) - 1 ) );
2231 
2232         // create the page number
2233         sal_Int32 nPageNumber = aNumber.toInt32();
2234 
2235         // check if there are non number characters in the number part
2236         const sal_Int32 nChars = aNumber.getLength();
2237         const sal_Unicode* pString = aNumber.getStr();
2238         sal_Int32 nChar;
2239         for( nChar = 0; nChar < nChars; nChar++, pString++ )
2240         {
2241             if((*pString < sal_Unicode('0')) || (*pString > sal_Unicode('9')))
2242             {
2243                 // found a non number character, so this is not the default
2244                 // name for this page
2245                 nPageNumber = -1;
2246                 break;
2247             }
2248         }
2249 
2250         if( nPageNumber != -1)
2251         {
2252             OUStringBuffer sBuffer;
2253             sBuffer.append( String(SdResId(STR_PAGE)) );
2254             sBuffer.append( sal_Unicode( ' ' ) );
2255             sBuffer.append( aNumber );
2256             return sBuffer.makeStringAndClear();
2257         }
2258     }
2259 
2260     return rApiName;
2261 }
2262 
getUiNameFromPageApiName(const OUString & rApiName)2263 String SdDrawPage::getUiNameFromPageApiName( const OUString& rApiName )
2264 {
2265     return getUiNameFromPageApiNameImpl( rApiName );
2266 }
2267 
2268 // XServiceInfo
getImplementationName()2269 OUString SAL_CALL SdDrawPage::getImplementationName() throw(uno::RuntimeException)
2270 {
2271     return OUString( RTL_CONSTASCII_USTRINGPARAM("SdDrawPage") );
2272 }
2273 
getSupportedServiceNames()2274 Sequence< OUString > SAL_CALL SdDrawPage::getSupportedServiceNames() throw(uno::RuntimeException)
2275 {
2276     OGuard aGuard( Application::GetSolarMutex() );
2277 
2278     throwIfDisposed();
2279 
2280     Sequence< OUString > aSeq( SdGenericDrawPage::getSupportedServiceNames() );
2281     comphelper::ServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.drawing.DrawPage" );
2282 
2283     if( mbIsImpressDocument )
2284         comphelper::ServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.presentation.DrawPage" );
2285 
2286     return aSeq;
2287 }
2288 
supportsService(const OUString & ServiceName)2289 sal_Bool SAL_CALL SdDrawPage::supportsService( const OUString& ServiceName )
2290     throw(uno::RuntimeException)
2291 {
2292     return SdGenericDrawPage::supportsService( ServiceName );
2293 }
2294 
2295 // XNamed
setName(const OUString & rName)2296 void SAL_CALL SdDrawPage::setName( const OUString& rName )
2297     throw(uno::RuntimeException)
2298 {
2299     OGuard aGuard( Application::GetSolarMutex() );
2300 
2301     throwIfDisposed();
2302 
2303     DBG_ASSERT( GetPage() && !GetPage()->IsMasterPage(), "Don't call base implementation for masterpages!" );
2304 
2305     OUString aName( rName );
2306 
2307     if(GetPage() && GetPage()->GetPageKind() != PK_NOTES)
2308     {
2309         // check if this is the default 'page1234' name
2310         if(aName.compareToAscii( sEmptyPageName, sizeof( sEmptyPageName ) - 1 ) == 0)
2311         {
2312             // ok, it maybe is, first get the number part after 'page'
2313             OUString aNumber( aName.copy( sizeof( sEmptyPageName ) - 1 ) );
2314 
2315             // create the page number
2316             sal_Int32 nPageNumber = aNumber.toInt32();
2317 
2318             // check if there are non number characters in the number part
2319             const sal_Int32 nChars = aNumber.getLength();
2320             const sal_Unicode* pString = aNumber.getStr();
2321             sal_Int32 nChar;
2322             for( nChar = 0; nChar < nChars; nChar++, pString++ )
2323             {
2324                 if((*pString < '0') || (*pString > '9'))
2325                 {
2326                     // found a non number character, so this is not the default
2327                     // name for this page
2328                     nPageNumber = -1;
2329                     break;
2330                 }
2331             }
2332 
2333             if( nPageNumber == ( ( GetPage()->GetPageNum() - 1 ) >> 1 ) + 1 )
2334                 aName = OUString();
2335         }
2336         else
2337         {
2338             String aDefaultPageName( SdResId(STR_PAGE) );
2339             aDefaultPageName += sal_Unicode( ' ' );
2340             if( aName.compareTo( aDefaultPageName, aDefaultPageName.Len() ) == 0 )
2341                 aName = OUString();
2342         }
2343 
2344         GetPage()->SetName( aName );
2345 
2346         sal_uInt16 nNotesPageNum = (GetPage()->GetPageNum()-1)>>1;
2347         if( GetModel()->GetDoc()->GetSdPageCount( PK_NOTES ) > nNotesPageNum )
2348         {
2349             SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( nNotesPageNum, PK_NOTES );
2350             if( pNotesPage )
2351                 pNotesPage->SetName(aName);
2352         }
2353 
2354         // fake a mode change to repaint the page tab bar
2355         ::sd::DrawDocShell* pDocSh = GetModel()->GetDocShell();
2356         ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : NULL;
2357         if( pViewSh && pViewSh->ISA(::sd::DrawViewShell))
2358         {
2359             ::sd::DrawViewShell* pDrawViewSh = static_cast<
2360                   ::sd::DrawViewShell*>(pViewSh);
2361 
2362             EditMode eMode = pDrawViewSh->GetEditMode();
2363             if( eMode == EM_PAGE )
2364             {
2365                 sal_Bool bLayer = pDrawViewSh->IsLayerModeActive();
2366 
2367                 pDrawViewSh->ChangeEditMode( eMode, !bLayer );
2368                 pDrawViewSh->ChangeEditMode( eMode, bLayer );
2369             }
2370         }
2371 
2372         GetModel()->SetModified();
2373     }
2374 }
2375 
getName()2376 OUString SAL_CALL SdDrawPage::getName()
2377     throw(uno::RuntimeException)
2378 {
2379     OGuard aGuard( Application::GetSolarMutex() );
2380 
2381     throwIfDisposed();
2382 
2383     return getPageApiName( GetPage() );
2384 }
2385 
2386 // XMasterPageTarget
getMasterPage()2387 Reference< drawing::XDrawPage > SAL_CALL SdDrawPage::getMasterPage(  )
2388     throw(uno::RuntimeException)
2389 {
2390     OGuard aGuard( Application::GetSolarMutex() );
2391 
2392     throwIfDisposed();
2393 
2394     if(GetPage())
2395     {
2396         Reference< drawing::XDrawPages >    xPages( GetModel()->getMasterPages() );
2397         Reference< drawing::XDrawPage > xPage;
2398 
2399         if(SvxFmDrawPage::mpPage->TRG_HasMasterPage())
2400         {
2401             SdrPage& rMasterPage = SvxFmDrawPage::mpPage->TRG_GetMasterPage();
2402             xPage = uno::Reference< drawing::XDrawPage >( rMasterPage.getUnoPage(), uno::UNO_QUERY );
2403         }
2404 
2405         return xPage;
2406     }
2407     return NULL;
2408 }
2409 
setMasterPage(const Reference<drawing::XDrawPage> & xMasterPage)2410 void SAL_CALL SdDrawPage::setMasterPage( const Reference< drawing::XDrawPage >& xMasterPage )
2411     throw(uno::RuntimeException)
2412 {
2413     OGuard aGuard( Application::GetSolarMutex() );
2414 
2415     throwIfDisposed();
2416 
2417     if(SvxFmDrawPage::mpPage)
2418     {
2419         SdMasterPage* pMasterPage = SdMasterPage::getImplementation( xMasterPage );
2420         if( pMasterPage && pMasterPage->isValid() )
2421         {
2422             SvxFmDrawPage::mpPage->TRG_ClearMasterPage();
2423 
2424             SdPage* pSdPage = (SdPage*) pMasterPage->GetSdrPage();
2425             SvxFmDrawPage::mpPage->TRG_SetMasterPage(*pSdPage);
2426 
2427             SvxFmDrawPage::mpPage->SetBorder(pSdPage->GetLftBorder(),pSdPage->GetUppBorder(),
2428                               pSdPage->GetRgtBorder(),pSdPage->GetLwrBorder() );
2429 
2430             SvxFmDrawPage::mpPage->SetSize( pSdPage->GetSize() );
2431             SvxFmDrawPage::mpPage->SetOrientation( pSdPage->GetOrientation() );
2432             ((SdPage*)SvxFmDrawPage::mpPage)->SetLayoutName( ( (SdPage*)pSdPage )->GetLayoutName() );
2433 
2434             // set notes master also
2435             SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( (SvxFmDrawPage::mpPage->GetPageNum()-1)>>1, PK_NOTES );
2436 
2437             pNotesPage->TRG_ClearMasterPage();
2438             sal_uInt16 nNum = (SvxFmDrawPage::mpPage->TRG_GetMasterPage()).GetPageNum() + 1;
2439             pNotesPage->TRG_SetMasterPage(*SvxFmDrawPage::mpPage->GetModel()->GetMasterPage(nNum));
2440             pNotesPage->SetLayoutName( ( (SdPage*)pSdPage )->GetLayoutName() );
2441 
2442             GetModel()->SetModified();
2443         }
2444 
2445     }
2446 }
2447 
2448 // XPresentationPage
getNotesPage()2449 Reference< drawing::XDrawPage > SAL_CALL SdDrawPage::getNotesPage()
2450     throw(uno::RuntimeException)
2451 {
2452     OGuard aGuard( Application::GetSolarMutex() );
2453 
2454     throwIfDisposed();
2455 
2456     if(SvxFmDrawPage::mpPage && GetModel()->GetDoc() && SvxFmDrawPage::mpPage->GetPageNum() )
2457     {
2458         SdPage* pNotesPage = GetModel()->GetDoc()->GetSdPage( (SvxFmDrawPage::mpPage->GetPageNum()-1)>>1, PK_NOTES );
2459         if( pNotesPage )
2460         {
2461             Reference< drawing::XDrawPage > xPage( pNotesPage->getUnoPage(), uno::UNO_QUERY );
2462             return xPage;
2463         }
2464     }
2465     return NULL;
2466 }
2467 
2468 
2469 // XIndexAccess
getCount()2470 sal_Int32 SAL_CALL SdDrawPage::getCount()
2471     throw(uno::RuntimeException)
2472 {
2473     return SdGenericDrawPage::getCount();
2474 }
2475 
getByIndex(sal_Int32 Index)2476 Any SAL_CALL SdDrawPage::getByIndex( sal_Int32 Index )
2477     throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
2478 {
2479     return SdGenericDrawPage::getByIndex( Index );
2480 }
2481 
2482 // XElementAccess
getElementType()2483 uno::Type SAL_CALL SdDrawPage::getElementType()
2484     throw(uno::RuntimeException)
2485 {
2486     return SdGenericDrawPage::getElementType();
2487 }
2488 
hasElements()2489 sal_Bool SAL_CALL SdDrawPage::hasElements()
2490     throw(uno::RuntimeException)
2491 {
2492     return SdGenericDrawPage::hasElements();
2493 }
2494 
2495 // XShapes
add(const Reference<drawing::XShape> & xShape)2496 void SAL_CALL SdDrawPage::add( const Reference< drawing::XShape >& xShape ) throw(uno::RuntimeException)
2497 {
2498     SdGenericDrawPage::add( xShape );
2499 }
2500 
remove(const Reference<drawing::XShape> & xShape)2501 void SAL_CALL SdDrawPage::remove( const Reference< drawing::XShape >& xShape ) throw(uno::RuntimeException)
2502 {
2503     OGuard aGuard( Application::GetSolarMutex() );
2504 
2505     throwIfDisposed();
2506 
2507     SvxShape* pShape = SvxShape::getImplementation( xShape );
2508     if( pShape )
2509     {
2510         SdrObject* pObj = pShape->GetSdrObject();
2511         if( pObj )
2512         {
2513             GetPage()->RemovePresObj(pObj);
2514             pObj->SetUserCall(NULL);
2515         }
2516     }
2517 
2518     SdGenericDrawPage::remove( xShape );
2519 }
2520 
setBackground(const Any & rValue)2521 void SdDrawPage::setBackground( const Any& rValue )
2522     throw( lang::IllegalArgumentException )
2523 {
2524     Reference< beans::XPropertySet > xSet;
2525 
2526     if( !(rValue >>= xSet) && !rValue.hasValue() )
2527         throw lang::IllegalArgumentException();
2528 
2529     if( !xSet.is() )
2530     {
2531         // the easy case, no background set. Set XFILL_NONE to represent this
2532         GetPage()->getSdrPageProperties().PutItem(XFillStyleItem(XFILL_NONE));
2533         return;
2534     }
2535 
2536     // is it our own implementation?
2537     SdUnoPageBackground* pBack = SdUnoPageBackground::getImplementation( xSet );
2538 
2539     SfxItemSet aSet( GetModel()->GetDoc()->GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST );
2540 
2541     if( pBack )
2542     {
2543         pBack->fillItemSet( (SdDrawDocument*)GetPage()->GetModel(), aSet );
2544     }
2545     else
2546     {
2547         SdUnoPageBackground* pBackground = new SdUnoPageBackground();
2548 
2549         Reference< beans::XPropertySetInfo >  xSetInfo( xSet->getPropertySetInfo() );
2550         Reference< beans::XPropertySet >  xDestSet( (beans::XPropertySet*)pBackground );
2551         Reference< beans::XPropertySetInfo >  xDestSetInfo( xDestSet->getPropertySetInfo() );
2552 
2553         Sequence< beans::Property > aProperties( xDestSetInfo->getProperties() );
2554         sal_Int32 nCount = aProperties.getLength();
2555         beans::Property* pProp = aProperties.getArray();
2556 
2557         while( nCount-- )
2558         {
2559             const OUString aPropName( pProp->Name );
2560             if( xSetInfo->hasPropertyByName( aPropName ) )
2561                 xDestSet->setPropertyValue( aPropName,
2562                         xSet->getPropertyValue( aPropName ) );
2563 
2564             pProp++;
2565         }
2566 
2567         pBackground->fillItemSet( (SdDrawDocument*)GetPage()->GetModel(), aSet );
2568     }
2569 
2570 //-/    pObj->NbcSetAttributes( aSet, sal_False );
2571     if( aSet.Count() == 0 )
2572     {
2573         // no background fill, represent by setting XFILL_NONE
2574         GetPage()->getSdrPageProperties().PutItem(XFillStyleItem(XFILL_NONE));
2575     }
2576     else
2577     {
2578         // background fill, set at page (not sure if ClearItem is needed)
2579         GetPage()->getSdrPageProperties().ClearItem();
2580         GetPage()->getSdrPageProperties().PutItemSet(aSet);
2581     }
2582 
2583     // repaint only
2584     SvxFmDrawPage::mpPage->ActionChanged();
2585     // pPage->SendRepaintBroadcast();
2586 }
2587 
2588 // XAnnotationAccess:
createAndInsertAnnotation()2589 Reference< XAnnotation > SAL_CALL SdGenericDrawPage::createAndInsertAnnotation() throw (RuntimeException)
2590 {
2591     if( !GetPage() )
2592         throw DisposedException();
2593 
2594     Reference< XAnnotation > xRet;
2595     GetPage()->createAnnotation(xRet);
2596     return xRet;
2597 }
2598 
removeAnnotation(const Reference<XAnnotation> & annotation)2599 void SAL_CALL SdGenericDrawPage::removeAnnotation(const Reference< XAnnotation > & annotation) throw (RuntimeException, IllegalArgumentException)
2600 {
2601     GetPage()->removeAnnotation(annotation);
2602 }
2603 
createAnnotationEnumeration()2604 Reference< XAnnotationEnumeration > SAL_CALL SdGenericDrawPage::createAnnotationEnumeration() throw (RuntimeException)
2605 {
2606     return ::sd::createAnnotationEnumeration( GetPage()->getAnnotations() );
2607 }
2608 
getBackground(Any & rValue)2609 void SdDrawPage::getBackground( Any& rValue ) throw()
2610 {
2611     const SfxItemSet& rFillAttributes = GetPage()->getSdrPageProperties().GetItemSet();
2612 
2613     if(XFILL_NONE == ((const XFillStyleItem&)rFillAttributes.Get(XATTR_FILLSTYLE)).GetValue())
2614     {
2615         // no fill set (switched off by XFILL_NONE), clear rValue to represent this
2616         rValue.clear();
2617     }
2618     else
2619     {
2620         // there is a fill set, export to rValue
2621         Reference< beans::XPropertySet > xSet(new SdUnoPageBackground(
2622             GetModel()->GetDoc(),
2623             &GetPage()->getSdrPageProperties().GetItemSet()));
2624         rValue <<= xSet;
2625     }
2626 }
2627 
setNavigationOrder(const Any & rValue)2628 void SdGenericDrawPage::setNavigationOrder( const Any& rValue )
2629 {
2630     Reference< XIndexAccess > xIA( rValue, UNO_QUERY );
2631     if( xIA.is() )
2632     {
2633         if( dynamic_cast< SdDrawPage* >( xIA.get() ) == this )
2634         {
2635             if( GetPage()->HasObjectNavigationOrder() )
2636                 GetPage()->ClearObjectNavigationOrder();
2637 
2638             return;
2639         }
2640         else if( xIA->getCount() == static_cast< sal_Int32 >( GetPage()->GetObjCount() ) )
2641         {
2642             GetPage()->SetNavigationOrder(xIA);
2643             return;
2644         }
2645     }
2646     throw IllegalArgumentException();
2647 }
2648 
2649 class NavigationOrderAccess : public ::cppu::WeakImplHelper1< XIndexAccess >
2650 {
2651 public:
2652     NavigationOrderAccess( SdrPage* pPage );
2653 
2654     // XIndexAccess
2655     virtual sal_Int32 SAL_CALL getCount(  ) throw (RuntimeException);
2656     virtual Any SAL_CALL getByIndex( sal_Int32 Index ) throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException);
2657 
2658     // XElementAccess
2659     virtual Type SAL_CALL getElementType(  ) throw (RuntimeException);
2660     virtual sal_Bool SAL_CALL hasElements(  ) throw (RuntimeException);
2661 
2662 private:
2663     std::vector< Reference< XShape > > maShapes;
2664 };
2665 
NavigationOrderAccess(SdrPage * pPage)2666 NavigationOrderAccess::NavigationOrderAccess( SdrPage* pPage )
2667 : maShapes( static_cast< sal_uInt32 >( pPage ? pPage->GetObjCount() : 0 ) )
2668 {
2669     if( pPage )
2670     {
2671         sal_uInt32 nIndex;
2672         const sal_uInt32 nCount = static_cast< sal_uInt32 >( pPage->GetObjCount() );
2673         for( nIndex = 0; nIndex < nCount; ++nIndex )
2674         {
2675             SdrObject* pObj = pPage->GetObj( nIndex );
2676             sal_uInt32 nNavPos = pObj->GetNavigationPosition();
2677             DBG_ASSERT( !maShapes[nNavPos].is(), "sd::NavigationOrderAccess::NavigationOrderAccess(), duplicate navigation positions from core!" );
2678             maShapes[nNavPos] = Reference< XShape >( pObj->getUnoShape(), UNO_QUERY );
2679         }
2680     }
2681 }
2682 
2683 // XIndexAccess
getCount()2684 sal_Int32 SAL_CALL NavigationOrderAccess::getCount(  ) throw (RuntimeException)
2685 {
2686     return static_cast< sal_Int32 >( maShapes.size() );
2687 }
2688 
getByIndex(sal_Int32 Index)2689 Any SAL_CALL NavigationOrderAccess::getByIndex( sal_Int32 Index ) throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
2690 {
2691     if( (Index < 0) || (Index > getCount()) )
2692         throw IndexOutOfBoundsException();
2693 
2694     return Any( maShapes[Index] );
2695 }
2696 
2697 // XElementAccess
getElementType()2698 Type SAL_CALL NavigationOrderAccess::getElementType(  ) throw (RuntimeException)
2699 {
2700     return XShape::static_type();
2701 }
2702 
hasElements()2703 sal_Bool SAL_CALL NavigationOrderAccess::hasElements(  ) throw (RuntimeException)
2704 {
2705     return maShapes.empty() ? sal_False : sal_True;
2706 }
2707 
getNavigationOrder()2708 Any SdGenericDrawPage::getNavigationOrder()
2709 {
2710     if( GetPage()->HasObjectNavigationOrder() )
2711     {
2712         return Any( Reference< XIndexAccess >( new NavigationOrderAccess( GetPage() ) ) );
2713     }
2714     else
2715     {
2716         return Any( Reference< XIndexAccess >( this ) );
2717     }
2718 }
2719 
2720 //========================================================================
2721 // class SdMasterPage
2722 //========================================================================
2723 
SdMasterPage(SdXImpressDocument * pModel,SdPage * pPage)2724 SdMasterPage::SdMasterPage( SdXImpressDocument* pModel, SdPage* pPage ) throw()
2725 : SdGenericDrawPage( pModel, pPage, ImplGetMasterPagePropertySet( pPage ? pPage->GetPageKind() : PK_STANDARD ) )
2726 {
2727 }
2728 
~SdMasterPage()2729 SdMasterPage::~SdMasterPage() throw()
2730 {
2731 }
2732 
2733 // XInterface
queryInterface(const uno::Type & rType)2734 Any SAL_CALL SdMasterPage::queryInterface( const uno::Type & rType )
2735     throw(uno::RuntimeException)
2736 {
2737     OGuard aGuard( Application::GetSolarMutex() );
2738 
2739     throwIfDisposed();
2740 
2741     uno::Any aAny;
2742 
2743     if( rType == ITYPE( container::XIndexAccess ) )
2744         aAny <<= Reference< container::XIndexAccess >((presentation::XPresentationPage*)(this));
2745     else if( rType == ITYPE( container::XElementAccess ) )
2746         aAny <<=  Reference< container::XElementAccess >((presentation::XPresentationPage*)(this));
2747     else if( rType == ITYPE( container::XNamed ) )
2748         aAny <<=  Reference< container::XNamed >(this);
2749     else if( rType == ITYPE( presentation::XPresentationPage ) &&
2750              ( mbIsImpressDocument &&
2751                GetPage()  && GetPage()->GetPageKind() != PK_HANDOUT) )
2752         aAny <<= Reference< presentation::XPresentationPage >( this );
2753     else
2754         return SdGenericDrawPage::queryInterface( rType );
2755 
2756     return aAny;
2757 }
2758 
acquire()2759 void SAL_CALL SdMasterPage::acquire() throw()
2760 {
2761     SvxDrawPage::acquire();
2762 }
2763 
release()2764 void SAL_CALL SdMasterPage::release() throw()
2765 {
2766     SvxDrawPage::release();
2767 }
2768 
2769 UNO3_GETIMPLEMENTATION2_IMPL( SdMasterPage, SdGenericDrawPage );
2770 
2771 // XTypeProvider
getTypes()2772 Sequence< uno::Type > SAL_CALL SdMasterPage::getTypes() throw(uno::RuntimeException)
2773 {
2774     OGuard aGuard( Application::GetSolarMutex() );
2775 
2776     throwIfDisposed();
2777 
2778     if( maTypeSequence.getLength() == 0 )
2779     {
2780         const PageKind ePageKind = GetPage() ? GetPage()->GetPageKind() : PK_STANDARD;
2781         sal_Bool bPresPage = mbIsImpressDocument && SvxFmDrawPage::mpPage && ePageKind != PK_HANDOUT;
2782 
2783         // Collect the types of this class.
2784         ::std::vector<uno::Type> aTypes;
2785         aTypes.reserve(12);
2786         aTypes.push_back(ITYPE(drawing::XDrawPage));
2787         aTypes.push_back(ITYPE(beans::XPropertySet));
2788         aTypes.push_back(ITYPE(container::XNamed));
2789         aTypes.push_back(ITYPE(lang::XServiceInfo));
2790         aTypes.push_back(ITYPE(util::XReplaceable));
2791         aTypes.push_back(ITYPE(document::XLinkTargetSupplier));
2792         aTypes.push_back(ITYPE( drawing::XShapeCombiner ));
2793         aTypes.push_back(ITYPE( drawing::XShapeBinder ));
2794         aTypes.push_back(ITYPE( office::XAnnotationAccess ));
2795         aTypes.push_back(ITYPE( beans::XMultiPropertySet ));
2796         if( bPresPage )
2797             aTypes.push_back(ITYPE(presentation::XPresentationPage));
2798         if( bPresPage && ePageKind == PK_STANDARD )
2799             aTypes.push_back(ITYPE(XAnimationNodeSupplier));
2800 
2801         // Get types of base class.
2802         const Sequence< uno::Type > aBaseTypes( SdGenericDrawPage::getTypes() );
2803         const sal_Int32 nBaseTypes = aBaseTypes.getLength();
2804         const uno::Type* pBaseTypes = aBaseTypes.getConstArray();
2805 
2806         // Join those types in a sequence.
2807         maTypeSequence.realloc(aTypes.size() + nBaseTypes);
2808         uno::Type* pTypes = maTypeSequence.getArray();
2809         ::std::vector<uno::Type>::const_iterator iType;
2810         for (iType=aTypes.begin(); iType!=aTypes.end(); ++iType)
2811             *pTypes++ = *iType;
2812         for( sal_Int32 nType = 0; nType < nBaseTypes; nType++ )
2813             *pTypes++ = *pBaseTypes++;
2814     }
2815 
2816     return maTypeSequence;
2817 }
2818 
getImplementationId()2819 Sequence< sal_Int8 > SAL_CALL SdMasterPage::getImplementationId() throw(uno::RuntimeException)
2820 {
2821     OGuard aGuard( Application::GetSolarMutex() );
2822 
2823     throwIfDisposed();
2824 
2825     static Sequence< sal_Int8 > aId;
2826     if( aId.getLength() == 0 )
2827     {
2828         aId.realloc( 16 );
2829         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
2830     }
2831     return aId;
2832 }
2833 
2834 // XServiceInfo
getImplementationName()2835 OUString SAL_CALL SdMasterPage::getImplementationName() throw(uno::RuntimeException)
2836 {
2837     return OUString( RTL_CONSTASCII_USTRINGPARAM("SdMasterPage") );
2838 }
2839 
getSupportedServiceNames()2840 Sequence< OUString > SAL_CALL SdMasterPage::getSupportedServiceNames() throw(uno::RuntimeException)
2841 {
2842     OGuard aGuard( Application::GetSolarMutex() );
2843 
2844     throwIfDisposed();
2845 
2846     Sequence< OUString > aSeq( SdGenericDrawPage::getSupportedServiceNames() );
2847     comphelper::ServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.drawing.MasterPage" );
2848 
2849     if( SvxFmDrawPage::mpPage && ((SdPage*)SvxFmDrawPage::mpPage)->GetPageKind() == PK_HANDOUT )
2850         comphelper::ServiceInfoHelper::addToSequence( aSeq, 1, "com.sun.star.presentation.HandoutMasterPage" );
2851 
2852     return aSeq;
2853 }
2854 
supportsService(const OUString & ServiceName)2855 sal_Bool SAL_CALL SdMasterPage::supportsService( const OUString& ServiceName )
2856     throw(uno::RuntimeException)
2857 {
2858     return SdGenericDrawPage::supportsService( ServiceName );
2859 }
2860 
2861 // XElementAccess
hasElements()2862 sal_Bool SAL_CALL SdMasterPage::hasElements() throw(uno::RuntimeException)
2863 {
2864     OGuard aGuard( Application::GetSolarMutex() );
2865 
2866     throwIfDisposed();
2867 
2868     if( SvxFmDrawPage::mpPage == NULL )
2869         return sal_False;
2870 
2871     return SvxFmDrawPage::mpPage->GetObjCount() > 0;
2872 }
2873 
getElementType()2874 uno::Type SAL_CALL SdMasterPage::getElementType()
2875     throw(uno::RuntimeException)
2876 {
2877     return SdGenericDrawPage::getElementType();
2878 }
2879 
2880 // XIndexAccess
getCount()2881 sal_Int32 SAL_CALL SdMasterPage::getCount()
2882     throw(uno::RuntimeException)
2883 {
2884     OGuard aGuard( Application::GetSolarMutex() );
2885 
2886     throwIfDisposed();
2887 
2888     return SdGenericDrawPage::getCount();
2889 }
2890 
getByIndex(sal_Int32 Index)2891 Any SAL_CALL SdMasterPage::getByIndex( sal_Int32 Index )
2892     throw(lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
2893 {
2894     OGuard aGuard( Application::GetSolarMutex() );
2895 
2896     throwIfDisposed();
2897 
2898     return SdGenericDrawPage::getByIndex(Index);
2899 }
2900 
2901 // intern
setBackground(const Any & rValue)2902 void SdMasterPage::setBackground( const Any& rValue )
2903     throw( lang::IllegalArgumentException )
2904 {
2905     // we need at least an beans::XPropertySet
2906     Reference< beans::XPropertySet > xInputSet( rValue, UNO_QUERY );
2907     if( !xInputSet.is() )
2908         throw lang::IllegalArgumentException();
2909 
2910     try
2911     {
2912         if( GetModel() && mbIsImpressDocument )
2913         {
2914             Reference< container::XNameAccess >  xFamilies( GetModel()->getStyleFamilies(), UNO_QUERY_THROW );
2915             Reference< container::XNameAccess > xFamily( xFamilies->getByName( getName() ), UNO_QUERY_THROW ) ;
2916             if( xFamily.is() )
2917             {
2918                 OUString aStyleName( OUString::createFromAscii(sUNO_PseudoSheet_Background) );
2919 
2920                 Reference< beans::XPropertySet >  xStyleSet( xFamily->getByName( aStyleName ), UNO_QUERY_THROW );
2921 
2922                 Reference< beans::XPropertySetInfo >  xSetInfo( xInputSet->getPropertySetInfo(), UNO_QUERY_THROW );
2923                 Reference< beans::XPropertyState > xSetStates( xInputSet, UNO_QUERY );
2924 
2925                 PropertyEntryVector_t aBackgroundProperties = ImplGetPageBackgroundPropertySet()->getPropertyMap()->getPropertyEntries();
2926                 PropertyEntryVector_t::const_iterator aIt = aBackgroundProperties.begin();
2927                 while( aIt != aBackgroundProperties.end() )
2928                 {
2929                     if( xSetInfo->hasPropertyByName( aIt->sName ) )
2930                     {
2931                         if( !xSetStates.is() || xSetStates->getPropertyState( aIt->sName ) == beans::PropertyState_DIRECT_VALUE )
2932                             xStyleSet->setPropertyValue( aIt->sName,    xInputSet->getPropertyValue( aIt->sName ) );
2933                         else
2934                             xSetStates->setPropertyToDefault( aIt->sName );
2935                     }
2936 
2937                     ++aIt;
2938                 }
2939             }
2940         }
2941         else
2942         {
2943             // first fill an item set
2944             // is it our own implementation?
2945             SdUnoPageBackground* pBack = SdUnoPageBackground::getImplementation( xInputSet );
2946 
2947             SfxItemSet aSet( GetModel()->GetDoc()->GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST );
2948 
2949             if( pBack )
2950             {
2951                 pBack->fillItemSet( (SdDrawDocument*)GetPage()->GetModel(), aSet );
2952             }
2953             else
2954             {
2955                 SdUnoPageBackground* pBackground = new SdUnoPageBackground();
2956 
2957                 Reference< beans::XPropertySetInfo > xInputSetInfo( xInputSet->getPropertySetInfo(), UNO_QUERY_THROW );
2958                 Reference< beans::XPropertySet > xDestSet( (beans::XPropertySet*)pBackground );
2959                 Reference< beans::XPropertySetInfo > xDestSetInfo( xDestSet->getPropertySetInfo(), UNO_QUERY_THROW );
2960 
2961                 uno::Sequence< beans::Property> aProperties( xDestSetInfo->getProperties() );
2962                 sal_Int32 nCount = aProperties.getLength();
2963                 beans::Property* pProp = aProperties.getArray();
2964 
2965                 while( nCount-- )
2966                 {
2967                     const OUString aPropName( pProp->Name );
2968                     if( xInputSetInfo->hasPropertyByName( aPropName ) )
2969                         xDestSet->setPropertyValue( aPropName, xInputSet->getPropertyValue( aPropName ) );
2970 
2971                     pProp++;
2972                 }
2973 
2974                 pBackground->fillItemSet( (SdDrawDocument*)SvxFmDrawPage::mpPage->GetModel(), aSet );
2975             }
2976 
2977             // if we find the background style, copy the set to the background
2978             SdDrawDocument* pDoc = (SdDrawDocument*)SvxFmDrawPage::mpPage->GetModel();
2979             SfxStyleSheetBasePool* pSSPool = (SfxStyleSheetBasePool*)pDoc->GetStyleSheetPool();
2980             if(pSSPool)
2981             {
2982                 String aLayoutName( static_cast< SdPage* >( SvxFmDrawPage::mpPage )->GetLayoutName() );
2983                 aLayoutName.Erase(aLayoutName.Search(String(RTL_CONSTASCII_USTRINGPARAM(SD_LT_SEPARATOR)))+4);
2984                 aLayoutName += String(SdResId(STR_LAYOUT_BACKGROUND));
2985                 SfxStyleSheetBase* pStyleSheet = pSSPool->Find( aLayoutName, SD_STYLE_FAMILY_MASTERPAGE );
2986 
2987                 if( pStyleSheet )
2988                 {
2989                     pStyleSheet->GetItemSet().Put( aSet );
2990 
2991                     // repaint only
2992                     SvxFmDrawPage::mpPage->ActionChanged();
2993                     return;
2994                 }
2995             }
2996 
2997             // if no background style is available, set at page directly. This
2998             // is an error and should NOT happen (and will be asserted from the SdrPage)
2999             GetPage()->getSdrPageProperties().PutItemSet(aSet);
3000         }
3001     }
3002     catch( Exception& )
3003     {
3004         DBG_ERROR("sd::SdMasterPage::setBackground(), exception caught!");
3005     }
3006 }
3007 
getBackground(Any & rValue)3008 void SdMasterPage::getBackground( Any& rValue ) throw()
3009 {
3010     if( GetModel() ) try
3011     {
3012         if( mbIsImpressDocument )
3013         {
3014             Reference< container::XNameAccess > xFamilies( GetModel()->getStyleFamilies(), UNO_QUERY_THROW );
3015             Reference< container::XNameAccess > xFamily( xFamilies->getByName( getName() ), UNO_QUERY_THROW );
3016 
3017             const OUString aStyleName( OUString::createFromAscii(sUNO_PseudoSheet_Background) );
3018             rValue <<= Reference< beans::XPropertySet >( xFamily->getByName( aStyleName ), UNO_QUERY_THROW );
3019         }
3020         else
3021         {
3022             SdDrawDocument* pDoc = (SdDrawDocument*)SvxFmDrawPage::mpPage->GetModel();
3023             SfxStyleSheetBasePool* pSSPool = (SfxStyleSheetBasePool*)pDoc->GetStyleSheetPool();
3024             if(pSSPool)
3025             {
3026                 String aLayoutName( static_cast< SdPage* >(SvxFmDrawPage::mpPage)->GetLayoutName() );
3027                 aLayoutName.Erase( aLayoutName.Search(String(RTL_CONSTASCII_USTRINGPARAM(SD_LT_SEPARATOR)))+4);
3028                 aLayoutName += String(SdResId(STR_LAYOUT_BACKGROUND));
3029                 SfxStyleSheetBase* pStyleSheet = pSSPool->Find( aLayoutName, SD_STYLE_FAMILY_MASTERPAGE );
3030 
3031                 if( pStyleSheet )
3032                 {
3033                     SfxItemSet aStyleSet( pStyleSheet->GetItemSet());
3034                     if( aStyleSet.Count() )
3035                     {
3036                         rValue <<= Reference< beans::XPropertySet >( new SdUnoPageBackground( pDoc, &aStyleSet ) );
3037                         return;
3038                     }
3039                 }
3040             }
3041 
3042             // No style found, use fill attributes from page background. This
3043             // should NOT happen and is an error
3044             const SfxItemSet& rFallbackItemSet(SvxFmDrawPage::mpPage->getSdrPageProperties().GetItemSet());
3045 
3046             if(XFILL_NONE == ((const XFillStyleItem&)rFallbackItemSet.Get(XATTR_FILLSTYLE)).GetValue())
3047             {
3048                 rValue <<= Reference< beans::XPropertySet >(
3049                     new SdUnoPageBackground(GetModel()->GetDoc(), &rFallbackItemSet));
3050             }
3051             else
3052             {
3053                 rValue.clear();
3054             }
3055         }
3056     }
3057     catch( Exception& )
3058     {
3059         rValue.clear();
3060         DBG_ERROR("sd::SdMasterPage::getBackground(), exception caught!");
3061     }
3062 }
3063 
3064 // XNamed
setName(const OUString & aName)3065 void SAL_CALL SdMasterPage::setName( const OUString& aName )
3066     throw(uno::RuntimeException)
3067 {
3068     OGuard aGuard( Application::GetSolarMutex() );
3069 
3070     throwIfDisposed();
3071 
3072     if(SvxFmDrawPage::mpPage && GetPage()->GetPageKind() != PK_NOTES)
3073     {
3074         String aNewName( aName );
3075         GetPage()->SetName( aNewName );
3076 
3077         if(GetModel()->GetDoc())
3078             GetModel()->GetDoc()->RenameLayoutTemplate(GetPage()->GetLayoutName(), aNewName);
3079 
3080         // fake a mode change to repaint the page tab bar
3081         ::sd::DrawDocShell* pDocSh = GetModel()->GetDocShell();
3082         ::sd::ViewShell* pViewSh = pDocSh ? pDocSh->GetViewShell() : NULL;
3083         if( pViewSh && pViewSh->ISA(::sd::DrawViewShell ) )
3084         {
3085             ::sd::DrawViewShell* pDrawViewSh =
3086                   static_cast< ::sd::DrawViewShell*>(pViewSh);
3087 
3088             EditMode eMode = pDrawViewSh->GetEditMode();
3089             if( eMode == EM_MASTERPAGE )
3090             {
3091                 sal_Bool bLayer = pDrawViewSh->IsLayerModeActive();
3092 
3093                 pDrawViewSh->ChangeEditMode( eMode, !bLayer );
3094                 pDrawViewSh->ChangeEditMode( eMode, bLayer );
3095             }
3096         }
3097 
3098         GetModel()->SetModified();
3099     }
3100 }
3101 
getName()3102 OUString SAL_CALL SdMasterPage::getName(  )
3103     throw(uno::RuntimeException)
3104 {
3105     OGuard aGuard( Application::GetSolarMutex() );
3106 
3107     throwIfDisposed();
3108 
3109     if(SvxFmDrawPage::mpPage)
3110     {
3111         String aLayoutName( GetPage()->GetLayoutName() );
3112         aLayoutName = aLayoutName.Erase(aLayoutName.Search( String( RTL_CONSTASCII_USTRINGPARAM((SD_LT_SEPARATOR)))));
3113 
3114         return aLayoutName;
3115     }
3116 
3117     return OUString();
3118 }
3119 
3120 // XPresentationPage
getNotesPage()3121 Reference< drawing::XDrawPage > SAL_CALL SdMasterPage::getNotesPage()
3122     throw(uno::RuntimeException)
3123 {
3124     OGuard aGuard( Application::GetSolarMutex() );
3125 
3126     throwIfDisposed();
3127 
3128     if(SvxFmDrawPage::mpPage && GetModel()->GetDoc() )
3129     {
3130         SdPage* pNotesPage = GetModel()->GetDoc()->GetMasterSdPage( (SvxFmDrawPage::mpPage->GetPageNum()-1)>>1, PK_NOTES );
3131         if( pNotesPage )
3132         {
3133             Reference< drawing::XDrawPage > xPage( pNotesPage->getUnoPage(), uno::UNO_QUERY );
3134             return xPage;
3135         }
3136     }
3137     return NULL;
3138 }
3139 
3140 // XShapes
add(const Reference<drawing::XShape> & xShape)3141 void SAL_CALL SdMasterPage::add( const Reference< drawing::XShape >& xShape ) throw(uno::RuntimeException)
3142 {
3143     SdGenericDrawPage::add( xShape );
3144 }
3145 
remove(const Reference<drawing::XShape> & xShape)3146 void SAL_CALL SdMasterPage::remove( const Reference< drawing::XShape >& xShape ) throw(uno::RuntimeException)
3147 {
3148     OGuard aGuard( Application::GetSolarMutex() );
3149 
3150     throwIfDisposed();
3151 
3152     SvxShape* pShape = SvxShape::getImplementation( xShape );
3153     if( pShape )
3154     {
3155         SdrObject* pObj = pShape->GetSdrObject();
3156         if( pObj )
3157         {
3158             if( GetPage()->IsPresObj( pObj ) )
3159                 GetPage()->RemovePresObj(pObj);
3160         }
3161     }
3162 
3163     SdGenericDrawPage::remove( xShape );
3164 }
3165 
3166 
createUnoPageImpl(SdPage * pPage)3167 Reference< uno::XInterface > createUnoPageImpl( SdPage* pPage )
3168 {
3169     Reference< uno::XInterface > xPage;
3170 
3171     if( pPage && pPage->GetModel() )
3172     {
3173         SdXImpressDocument* pModel = SdXImpressDocument::getImplementation( pPage->GetModel()->getUnoModel() );
3174         if( pModel )
3175         {
3176             if( pPage->IsMasterPage() )
3177             {
3178                 xPage = (::cppu::OWeakObject*)new SdMasterPage( pModel, pPage );
3179             }
3180             else
3181             {
3182                 xPage = (::cppu::OWeakObject*)new SdDrawPage( pModel, pPage );
3183             }
3184         }
3185     }
3186 
3187     return xPage;
3188 }
3189