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