xref: /trunk/main/sd/source/ui/func/futempl.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 
32 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 #include <com/sun/star/container/XNameAccess.hpp>
35 
36 #include "futempl.hxx"
37 
38 #include <editeng/editdata.hxx>
39 #include <editeng/bulitem.hxx>
40 #include <svx/svxids.hrc>   // fuer SID_OBJECT_SELECT
41 #include <sfx2/bindings.hxx>
42 #include <svl/aeitem.hxx>
43 #include <sfx2/dispatch.hxx>
44 #include <vcl/msgbox.hxx>
45 #include <editeng/eeitem.hxx>
46 #include <sfx2/request.hxx>
47 #include <editeng/numitem.hxx>
48 #include <editeng/editeng.hxx>
49 #include <editeng/lrspitem.hxx>
50 #include <svx/svdopage.hxx>
51 #include <svx/svditer.hxx>
52 #include <svx/sdr/properties/properties.hxx>
53 
54 #include <sfx2/viewfrm.hxx>
55 #include <svx/xlndsit.hxx>
56 #include <svx/xlnstit.hxx>
57 #include <svx/xlnedit.hxx>
58 #include "app.hrc"
59 #include "stlsheet.hxx"
60 #include "sdpage.hxx"
61 #include "stlpool.hxx"
62 #include "app.hxx"
63 #include "View.hxx"
64 #ifndef SD_WINDOW_SHELL_HXX
65 #include "Window.hxx"
66 #endif
67 #include "drawview.hxx"
68 #include "drawdoc.hxx"
69 #include "DrawDocShell.hxx"
70 #include "DrawViewShell.hxx"
71 #include "ViewShell.hxx"
72 #include "res_bmp.hrc"
73 #include "glob.hrc"
74 #include "prlayout.hxx"         // enum PresentationObjects
75 #include "prltempl.hrc"         // TAB_PRES_LAYOUT_TEMPLATE_x
76 #include <svx/tabarea.hxx>
77 #include "sdresid.hxx"
78 #include "OutlineViewShell.hxx"
79 #include "strings.hrc"
80 #include "helpids.h"
81 #include "sdabstdlg.hxx"
82 
83 using rtl::OUString;
84 using namespace com::sun::star::uno;
85 using namespace com::sun::star::container;
86 using namespace com::sun::star::beans;
87 using namespace com::sun::star::style;
88 
89 namespace sd
90 {
91 
92 TYPEINIT1( FuTemplate, FuPoor );
93 
94 /*************************************************************************
95 |*
96 |* Konstruktor
97 |*
98 \************************************************************************/
99 
100 FuTemplate::FuTemplate (
101     ViewShell* pViewSh,
102     ::sd::Window* pWin,
103     ::sd::View* pView,
104     SdDrawDocument* pDoc,
105     SfxRequest& rReq )
106     : FuPoor( pViewSh, pWin, pView, pDoc, rReq )
107 {
108 }
109 
110 FunctionReference FuTemplate::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
111 {
112     FunctionReference xFunc( new FuTemplate( pViewSh, pWin, pView, pDoc, rReq ) );
113     xFunc->DoExecute(rReq);
114     return xFunc;
115 }
116 
117 void FuTemplate::DoExecute( SfxRequest& rReq )
118 {
119     const SfxItemSet* pArgs = rReq.GetArgs();
120     sal_uInt16 nSId = rReq.GetSlot();
121 
122     // StyleSheet-Parameter holen
123     SfxStyleSheetBasePool* pSSPool = mpDoc->GetDocSh()->GetStyleSheetPool();
124     SfxStyleSheetBase* pStyleSheet = NULL;
125 
126     const SfxPoolItem* pItem;
127     sal_uInt16 nFamily = USHRT_MAX;
128     if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILY,
129         sal_False, &pItem ))
130     {
131         nFamily = ( (const SfxUInt16Item &) pArgs->Get( SID_STYLE_FAMILY ) ).GetValue();
132     }
133     else
134     if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILYNAME,
135         sal_False, &pItem ))
136     {
137         String sFamily = ( (const SfxStringItem &) pArgs->Get( SID_STYLE_FAMILYNAME ) ).GetValue();
138         if (sFamily.CompareToAscii("graphics") == COMPARE_EQUAL)
139             nFamily = SD_STYLE_FAMILY_GRAPHICS;
140         else
141             nFamily = SD_STYLE_FAMILY_PSEUDO;
142     }
143 
144     String aStyleName;
145     sal_uInt16 nRetMask = 0xffff;
146 
147     switch( nSId )
148     {
149         case SID_STYLE_APPLY:
150         case SID_STYLE_EDIT:
151         case SID_STYLE_DELETE:
152         case SID_STYLE_FAMILY:
153         case SID_STYLE_NEW_BY_EXAMPLE:
154         {
155             SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, SID_APPLY_STYLE, sal_False );
156             SFX_REQUEST_ARG( rReq, pFamilyItem, SfxStringItem, SID_STYLE_FAMILYNAME, sal_False );
157             if ( pFamilyItem && pNameItem )
158             {
159                 try
160                 {
161                     Reference< XStyleFamiliesSupplier > xModel(mpDoc->GetDocSh()->GetModel(), UNO_QUERY_THROW );
162                     Reference< XNameAccess > xCont( xModel->getStyleFamilies() );
163                     Reference< XNameAccess > xStyles( xCont->getByName(pFamilyItem->GetValue()), UNO_QUERY_THROW );
164                     Reference< XPropertySet > xInfo( xStyles->getByName( pNameItem->GetValue() ), UNO_QUERY_THROW );
165 
166                     OUString aUIName;
167                     xInfo->getPropertyValue( ::rtl::OUString::createFromAscii("DisplayName") ) >>= aUIName;
168                     if ( aUIName.getLength() )
169                         rReq.AppendItem( SfxStringItem( nSId, aUIName ) );
170                 }
171                 catch( Exception& )
172                 {
173                 }
174             }
175 
176             if (pArgs->GetItemState(nSId) == SFX_ITEM_SET)
177                 aStyleName = ( ( (const SfxStringItem &) pArgs->Get( nSId ) ).GetValue() );
178         }
179     }
180 
181     switch( nSId )
182     {
183         case SID_STYLE_NEW:
184         {
185             SfxStyleSheetBase *p = pSSPool->Find(aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_ALL );
186             if(p)
187             {
188                 pSSPool->Remove(p);
189                 p = 0;
190             }
191             pStyleSheet = &pSSPool->Make( aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_USERDEF );
192 
193             if (pArgs->GetItemState(SID_STYLE_REFERENCE) == SFX_ITEM_ON)
194             {
195                 String aParentName(((const SfxStringItem&) pArgs->Get(SID_STYLE_REFERENCE)).GetValue());
196                 pStyleSheet->SetParent(aParentName);
197             }
198             else
199             {
200                 pStyleSheet->SetParent(String(SdResId(STR_STANDARD_STYLESHEET_NAME)));
201             }
202         }
203         break;
204 
205         case SID_STYLE_NEW_BY_EXAMPLE:
206         {
207             // Z.Z. geht immer noch der Dialog auf, um den Namen
208             // der Vorlage einzugeben.
209             if( mpView->AreObjectsMarked() || sal_True )
210             {
211                 SfxStyleSheetBase *p = pSSPool->Find(aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_ALL );
212                 if(p)
213                 {
214                     pSSPool->Remove(p);
215                     p = 0;
216                 }
217                 pStyleSheet = &pSSPool->Make( aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_USERDEF );
218                 pStyleSheet->SetParent(String(SdResId(STR_STANDARD_STYLESHEET_NAME)));
219             }
220         }
221         break;
222 
223         case SID_STYLE_EDIT:
224             pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
225         break;
226 
227         case SID_STYLE_DELETE:
228             pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
229             if( pStyleSheet )
230             {
231                 pSSPool->Remove( pStyleSheet );
232                 nRetMask = sal_True;
233                 mpDoc->SetChanged(sal_True);
234             }
235             else
236             {
237                 nRetMask = sal_False;
238             }
239         break;
240 
241         case SID_STYLE_APPLY:
242             // Anwenden der Vorlage auf das Dokument
243             pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
244 
245             // do not set presentation styles, they will be set implicit
246             if ( pStyleSheet && pStyleSheet->GetFamily() != SD_STYLE_FAMILY_PSEUDO )
247             {
248                 SfxStyleSheet* pOldStyleSheet = mpView->GetStyleSheet();
249                 String aStr;
250 
251                 if( // if the object had no style sheet, allow all
252                     !pOldStyleSheet ||
253 
254                     // allow if old and new style sheet has same family
255                     pStyleSheet->GetFamily() == pOldStyleSheet->GetFamily() ||
256 
257                     // allow if old was background objects and new is graphics
258                     pStyleSheet->GetFamily() == (SD_STYLE_FAMILY_GRAPHICS && pOldStyleSheet->GetHelpId( aStr ) == HID_PSEUDOSHEET_BACKGROUNDOBJECTS) ||
259 
260                     // allow if old was presentation and we are a drawing document
261                     (pOldStyleSheet->GetFamily() == SD_STYLE_FAMILY_MASTERPAGE && mpDoc->GetDocumentType() == DOCUMENT_TYPE_DRAW) )
262                 {
263                     mpView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
264                     mpDoc->SetChanged(sal_True);
265                     mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
266                 }
267             }
268 /* #96983# GrabFocus moved to stylist
269             pWin->GrabFocus();
270 */
271         break;
272 
273         case SID_STYLE_WATERCAN:
274         {
275             if( !SD_MOD()->GetWaterCan() )
276             {
277                 if( pArgs->GetItemState( nSId ) == SFX_ITEM_SET )
278                 {
279                     aStyleName = ( ( (const SfxStringItem &) pArgs->Get( nSId ) ).GetValue() );
280                     SD_MOD()->SetWaterCan( sal_True );
281                     pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
282                 }
283                 // keine Praesentationsobjektvorlagen, die werden nur
284                 // implizit zugewiesen
285                 if( pStyleSheet && pStyleSheet->GetFamily() != SD_STYLE_FAMILY_PSEUDO )
286                 {
287                     ( (SdStyleSheetPool*) pSSPool )->SetActualStyleSheet( pStyleSheet );
288 
289                     // Es wird explizit in den Selektionsmodus geschaltet
290                     mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT,
291                                         SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
292 
293                 }
294                 else
295                     SD_MOD()->SetWaterCan( sal_False );
296             }
297             else
298             {
299                 SD_MOD()->SetWaterCan( sal_False );
300                 // Werkzeugleiste muss wieder enabled werden
301                 mpViewShell->Invalidate();
302             }
303         }
304         break;
305 
306         default:
307         break;
308     }
309 
310     switch( nSId )
311     {
312         case SID_STYLE_NEW:
313         case SID_STYLE_EDIT:
314         {
315             PresentationObjects ePO = PO_OUTLINE_1;
316 
317             if( pStyleSheet )
318             {
319                 SfxAbstractTabDialog*  pStdDlg  = NULL;
320                 SfxAbstractTabDialog*  pPresDlg = NULL;
321                 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
322                 sal_Bool bOldDocInOtherLanguage = sal_False;
323                 SfxItemSet aOriSet( pStyleSheet->GetItemSet() );
324 
325                 SfxStyleFamily eFamily = pStyleSheet->GetFamily();
326 
327                 if (eFamily == SD_STYLE_FAMILY_GRAPHICS)
328                 {
329                     pStdDlg = pFact ? pFact->CreateSdTabTemplateDlg( 0, mpDoc->GetDocSh(), *pStyleSheet, mpDoc, mpView ) : 0;
330                 }
331                 else if (eFamily == SD_STYLE_FAMILY_PSEUDO)
332                 {
333                     String aName(pStyleSheet->GetName());
334                     sal_uInt16 nDlgId = 0;
335 
336                     if (aName == String(SdResId(STR_PSEUDOSHEET_TITLE)))
337                     {
338                         nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
339                         ePO    = PO_TITLE;
340                     }
341                     else if (aName == String(SdResId(STR_PSEUDOSHEET_SUBTITLE)))
342                     {
343                         nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
344                         ePO    = PO_SUBTITLE;
345                     }
346                     else if (aName ==
347                              String(SdResId(STR_PSEUDOSHEET_BACKGROUND)))
348                     {
349                         nDlgId = TAB_PRES_LAYOUT_TEMPLATE_BACKGROUND;
350                         ePO    = PO_BACKGROUND;
351                     }
352                     else if (aName ==
353                              String(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS)))
354                     {
355                         nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
356                         ePO    = PO_BACKGROUNDOBJECTS;
357                     }
358                     else if (aName ==
359                              String(SdResId(STR_PSEUDOSHEET_NOTES)))
360                     {
361                         nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
362                         ePO    = PO_NOTES;
363                     }
364                     else if(aName.Search(String(SdResId(STR_PSEUDOSHEET_OUTLINE))) !=
365                             STRING_NOTFOUND)
366                     {
367                         nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
368 
369                         String aOutlineStr((SdResId(STR_PSEUDOSHEET_OUTLINE)));
370                         // die Nummer ermitteln; ein Leerzeichen zwischen
371                         // Name und Nummer beachten
372                         String aNumStr(aName.Copy(aOutlineStr.Len() + 1));
373                         sal_uInt16 nLevel = (sal_uInt16)aNumStr.ToInt32();
374                         switch (nLevel)
375                         {
376                             case 1: ePO = PO_OUTLINE_1; break;
377                             case 2: ePO = PO_OUTLINE_2; break;
378                             case 3: ePO = PO_OUTLINE_3; break;
379                             case 4: ePO = PO_OUTLINE_4; break;
380                             case 5: ePO = PO_OUTLINE_5; break;
381                             case 6: ePO = PO_OUTLINE_6; break;
382                             case 7: ePO = PO_OUTLINE_7; break;
383                             case 8: ePO = PO_OUTLINE_8; break;
384                             case 9: ePO = PO_OUTLINE_9; break;
385                         }
386                     }
387                     else
388                     {
389                         DBG_ERROR("Vorlage aus aelterer anderssprachiger Version");
390                         bOldDocInOtherLanguage = sal_True;
391                     }
392 
393                     if( !bOldDocInOtherLanguage )
394                     {
395                         pPresDlg = pFact ? pFact->CreateSdPresLayoutTemplateDlg( mpDocSh, NULL, SdResId(nDlgId), *pStyleSheet, ePO, pSSPool ) : 0;
396                     }
397                 }
398                 else if (eFamily == SD_STYLE_FAMILY_CELL)
399                 {
400                 }
401 
402                 sal_uInt16 nResult = RET_CANCEL;
403                 const SfxItemSet* pOutSet = NULL;
404                 if (pStdDlg)
405                 {
406                     nResult = pStdDlg->Execute();
407                     pOutSet = pStdDlg->GetOutputItemSet();
408                 }
409                 else if( pPresDlg )
410                 {
411                     nResult = pPresDlg->Execute();
412                     pOutSet = pPresDlg->GetOutputItemSet();
413                 }
414 
415                 switch( nResult )
416                 {
417                     case RET_OK:
418                     {
419                         nRetMask = pStyleSheet->GetMask();
420 
421                         if (eFamily == SD_STYLE_FAMILY_PSEUDO)
422                         {
423                             SfxItemSet aTempSet(*pOutSet);
424                             ((SdStyleSheet*)pStyleSheet)->AdjustToFontHeight(aTempSet);
425 
426                             // Sonderbehandlung: die INVALIDS auf NULL-Pointer
427                             // zurueckgesetzen (sonst landen INVALIDs oder
428                             // Pointer auf die DefaultItems in der Vorlage;
429                             // beides wuerde die Attribut-Vererbung unterbinden)
430                             aTempSet.ClearInvalidItems();
431 
432                             // EE_PARA_NUMBULLET item is only valid in first outline template
433                             if( (ePO >= PO_OUTLINE_2) && (ePO <= PO_OUTLINE_9) )
434                             {
435                                 if (aTempSet.GetItemState(EE_PARA_NUMBULLET) == SFX_ITEM_SET)
436                                 {
437                                     SvxNumRule aRule(*((SvxNumBulletItem*)aTempSet.GetItem(EE_PARA_NUMBULLET))->GetNumRule());
438 
439                                     String sStyleName((SdResId(STR_PSEUDOSHEET_OUTLINE)));
440                                     sStyleName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " 1" ) );
441                                     SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( sStyleName, SD_STYLE_FAMILY_PSEUDO);
442 
443                                     if(pFirstStyleSheet)
444                                     {
445                                         pFirstStyleSheet->GetItemSet().Put( SvxNumBulletItem( aRule, EE_PARA_NUMBULLET ));
446                                         SdStyleSheet* pRealSheet = ((SdStyleSheet*)pFirstStyleSheet)->GetRealStyleSheet();
447                                         pRealSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
448                                     }
449 
450                                     aTempSet.ClearItem( EE_PARA_NUMBULLET );
451                                 }
452                             }
453 
454                             String sStyleName((SdResId(STR_PSEUDOSHEET_OUTLINE)));
455                             sStyleName.Append( sal_Unicode( ' ' ));
456 
457                             pStyleSheet->GetItemSet().Put(aTempSet);
458 
459                             SdStyleSheet* pRealSheet =((SdStyleSheet*)pStyleSheet)->GetRealStyleSheet();
460                             pRealSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
461 
462                             if( (ePO >= PO_OUTLINE_1) && (ePO <= PO_OUTLINE_8) )
463                             {
464                                 for( sal_uInt16 n = (sal_uInt16)(ePO - PO_OUTLINE_1 + 2); n < 10; n++ )
465                                 {
466                                     String aName( sStyleName );
467                                     aName.Append( String::CreateFromInt32( (sal_Int32) n ));
468 
469                                     SfxStyleSheetBase* pSheet = pSSPool->Find( aName, SD_STYLE_FAMILY_PSEUDO);
470 
471                                     if(pSheet)
472                                     {
473                                         SdStyleSheet* pRealStyleSheet = ((SdStyleSheet*)pSheet)->GetRealStyleSheet();
474                                         pRealStyleSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
475                                     }
476                                 }
477                             }
478                         }
479 
480                         SfxItemSet& rAttr = pStyleSheet->GetItemSet();
481 
482                         sdr::properties::CleanupFillProperties( rAttr );
483 
484                         // check for unique names of named items for xml
485                         if( rAttr.GetItemState( XATTR_FILLBITMAP ) == SFX_ITEM_SET )
486                         {
487                             const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLBITMAP );
488                             SfxPoolItem* pNewItem = ((XFillBitmapItem*)pOldItem)->checkForUniqueItem( mpDoc );
489                             if( pOldItem != pNewItem )
490                             {
491                                 rAttr.Put( *pNewItem );
492                                 delete pNewItem;
493                             }
494                         }
495                         if( rAttr.GetItemState( XATTR_LINEDASH ) == SFX_ITEM_SET )
496                         {
497                             const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEDASH );
498                             SfxPoolItem* pNewItem = ((XLineDashItem*)pOldItem)->checkForUniqueItem( mpDoc );
499                             if( pOldItem != pNewItem )
500                             {
501                                 rAttr.Put( *pNewItem );
502                                 delete pNewItem;
503                             }
504                         }
505                         if( rAttr.GetItemState( XATTR_LINESTART ) == SFX_ITEM_SET )
506                         {
507                             const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINESTART );
508                             SfxPoolItem* pNewItem = ((XLineStartItem*)pOldItem)->checkForUniqueItem( mpDoc );
509                             if( pOldItem != pNewItem )
510                             {
511                                 rAttr.Put( *pNewItem );
512                                 delete pNewItem;
513                             }
514                         }
515                         if( rAttr.GetItemState( XATTR_LINEEND ) == SFX_ITEM_SET )
516                         {
517                             const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEEND );
518                             SfxPoolItem* pNewItem = ((XLineEndItem*)pOldItem)->checkForUniqueItem( mpDoc );
519                             if( pOldItem != pNewItem )
520                             {
521                                 rAttr.Put( *pNewItem );
522                                 delete pNewItem;
523                             }
524                         }
525                         if( rAttr.GetItemState( XATTR_FILLGRADIENT ) == SFX_ITEM_SET )
526                         {
527                             const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLGRADIENT );
528                             SfxPoolItem* pNewItem = ((XFillGradientItem*)pOldItem)->checkForUniqueItem( mpDoc );
529                             if( pOldItem != pNewItem )
530                             {
531                                 rAttr.Put( *pNewItem );
532                                 delete pNewItem;
533                             }
534                         }
535                         if( rAttr.GetItemState( XATTR_FILLFLOATTRANSPARENCE ) == SFX_ITEM_SET )
536                         {
537                             const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLFLOATTRANSPARENCE );
538                             SfxPoolItem* pNewItem = ((XFillFloatTransparenceItem*)pOldItem)->checkForUniqueItem( mpDoc );
539                             if( pOldItem != pNewItem )
540                             {
541                                 rAttr.Put( *pNewItem );
542                                 delete pNewItem;
543                             }
544                         }
545                         if( rAttr.GetItemState( XATTR_FILLHATCH ) == SFX_ITEM_SET )
546                         {
547                             const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLHATCH );
548                             SfxPoolItem* pNewItem = ((XFillHatchItem*)pOldItem)->checkForUniqueItem( mpDoc );
549                             if( pOldItem != pNewItem )
550                             {
551                                 rAttr.Put( *pNewItem );
552                                 delete pNewItem;
553                             }
554                         }
555 
556                         ( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
557 
558                         DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpViewShell );
559                         if( pDrawViewShell )
560                         {
561                             PageKind ePageKind = pDrawViewShell->GetPageKind();
562                             if( ePageKind == PK_NOTES || ePageKind == PK_HANDOUT )
563                             {
564                                 SdPage* pPage = mpViewShell->GetActualPage();
565 
566                                 if(pDrawViewShell->GetEditMode() == EM_MASTERPAGE)
567                                 {
568                                     pPage = static_cast<SdPage*>((&(pPage->TRG_GetMasterPage())));
569                                 }
570 
571                                 if( pPage )
572                                 {
573                                     SdrObjListIter aIter( *pPage );
574                                     while( aIter.IsMore() )
575                                     {
576                                         SdrObject* pObj = aIter.Next();
577                                         if( pObj->ISA(SdrPageObj) )
578                                         {
579                                             // repaint only
580                                             pObj->ActionChanged();
581                                             // pObj->SendRepaintBroadcast();
582                                         }
583                                     }
584                                 }
585                             }
586                         }
587 
588                         if( mpDoc->GetOnlineSpell() )
589                         {
590                             const SfxPoolItem* pTempItem;
591                             if( SFX_ITEM_SET == rAttr.GetItemState(EE_CHAR_LANGUAGE, sal_False, &pTempItem ) ||
592                                 SFX_ITEM_SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CJK, sal_False, &pTempItem ) ||
593                                 SFX_ITEM_SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CTL, sal_False, &pTempItem ) )
594                             {
595                                 mpDoc->StopOnlineSpelling();
596                                 mpDoc->StartOnlineSpelling();
597                             }
598                         }
599 
600                         mpDoc->SetChanged(sal_True);
601                     }
602                     break;
603 
604                     default:
605                     {
606                         if( nSId == SID_STYLE_NEW )
607                             pSSPool->Remove( pStyleSheet );
608                         delete pStdDlg;
609                         delete pPresDlg;
610                     }
611                     return; // Abbruch
612                 }
613                 delete pStdDlg;
614                 delete pPresDlg;
615             }
616         }
617         break;
618 
619         case SID_STYLE_NEW_BY_EXAMPLE:
620         {
621             if( pStyleSheet )
622             {
623                 nRetMask = pStyleSheet->GetMask();
624                 SfxItemSet aCoreSet( mpDoc->GetPool() );
625                 mpView->GetAttributes( aCoreSet, sal_True );
626 
627                 // wenn das Objekt eine Vorlage hatte, wird diese Parent
628                 // der neuen Vorlage
629                 SfxStyleSheet* pOldStyle = mpView->GetStyleSheet();
630 
631                 // Wenn pOldStyle == pStyleSheet -> Rekursion
632                 if( pOldStyle != pStyleSheet )
633                 {
634                     if (pOldStyle)
635                     {
636                         pStyleSheet->SetParent(pOldStyle->GetName());
637                     }
638 
639                     SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
640                     pStyleSet->Put(aCoreSet);
641 
642                     // Vorlage anwenden (Aber nicht, wenn gerade ein Text
643                     // editiert wird, denn dazu muesste die Edit Engine
644                     // Vorlagen auf Zeichenebene beherrschen.)
645                     if (!mpView->GetTextEditObject())
646                     {
647                         mpView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
648                     }
649 
650                     ( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
651                     mpDoc->SetChanged(sal_True);
652 
653                     mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
654                 }
655             }
656         }
657         break;
658 
659         case SID_STYLE_UPDATE_BY_EXAMPLE:
660         {
661             if ((mpView->AreObjectsMarked() && mpView->GetMarkedObjectList().GetMarkCount() == 1) ||
662                  mpView->ISA(OutlineView))
663             {
664                 pStyleSheet = mpView->GetStyleSheet();
665 
666                 if( pStyleSheet )
667                 {
668                     nRetMask = pStyleSheet->GetMask();
669                     SfxItemSet aCoreSet( mpDoc->GetPool() );
670                     mpView->GetAttributes( aCoreSet );
671 
672                     SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
673                     pStyleSet->Put( aCoreSet );
674 
675                     mpView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
676 
677                     ( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
678                     mpDoc->SetChanged(sal_True);
679                     mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
680                 }
681             }
682         }
683         break;
684 
685     }
686     if( nRetMask != 0xffff )
687         rReq.SetReturnValue( SfxUInt16Item( nSId, nRetMask ) );
688 }
689 
690 void FuTemplate::Activate()
691 {
692 }
693 
694 void FuTemplate::Deactivate()
695 {
696 }
697 
698 } // end of namespace sd
699