/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sd.hxx"


#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameAccess.hpp>

#include "futempl.hxx"

#include <editeng/editdata.hxx>
#include <editeng/bulitem.hxx>
#include <svx/svxids.hrc>   // fuer SID_OBJECT_SELECT
#include <sfx2/bindings.hxx>
#include <svl/aeitem.hxx>
#include <sfx2/dispatch.hxx>
#include <vcl/msgbox.hxx>
#include <editeng/eeitem.hxx>
#include <sfx2/request.hxx>
#include <editeng/numitem.hxx>
#include <editeng/editeng.hxx>
#include <editeng/lrspitem.hxx>
#include <svx/svdopage.hxx>
#include <svx/svditer.hxx>
#include <svx/sdr/properties/properties.hxx>

#include <sfx2/viewfrm.hxx>
#include <svx/xlndsit.hxx>
#include <svx/xlnstit.hxx>
#include <svx/xlnedit.hxx>
#include "app.hrc"
#include "stlsheet.hxx"
#include "sdpage.hxx"
#include "stlpool.hxx"
#include "app.hxx"
#include "View.hxx"
#ifndef SD_WINDOW_SHELL_HXX
#include "Window.hxx"
#endif
#include "drawview.hxx"
#include "drawdoc.hxx"
#include "DrawDocShell.hxx"
#include "DrawViewShell.hxx"
#include "ViewShell.hxx"
#include "res_bmp.hrc"
#include "glob.hrc"
#include "prlayout.hxx"         // enum PresentationObjects
#include "prltempl.hrc"         // TAB_PRES_LAYOUT_TEMPLATE_x
#include <svx/tabarea.hxx>
#include "sdresid.hxx"
#include "OutlineViewShell.hxx"
#include "strings.hrc"
#include "helpids.h"
#include "sdabstdlg.hxx"

using rtl::OUString;
using namespace com::sun::star::uno;
using namespace com::sun::star::container;
using namespace com::sun::star::beans;
using namespace com::sun::star::style;

namespace sd
{

TYPEINIT1( FuTemplate, FuPoor );

/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/

FuTemplate::FuTemplate (
    ViewShell* pViewSh,
    ::sd::Window* pWin,
    ::sd::View* pView,
    SdDrawDocument* pDoc,
    SfxRequest& rReq )
    : FuPoor( pViewSh, pWin, pView, pDoc, rReq )
{
}

FunctionReference FuTemplate::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
{
	FunctionReference xFunc( new FuTemplate( pViewSh, pWin, pView, pDoc, rReq ) );
	xFunc->DoExecute(rReq);
	return xFunc;
}

void FuTemplate::DoExecute( SfxRequest& rReq )
{
	const SfxItemSet* pArgs = rReq.GetArgs();
	sal_uInt16 nSId = rReq.GetSlot();

	// StyleSheet-Parameter holen
	SfxStyleSheetBasePool* pSSPool = mpDoc->GetDocSh()->GetStyleSheetPool();
	SfxStyleSheetBase* pStyleSheet = NULL;

	const SfxPoolItem* pItem;
    sal_uInt16 nFamily = USHRT_MAX;
    if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILY,
        sal_False, &pItem ))
    {
        nFamily = ( (const SfxUInt16Item &) pArgs->Get( SID_STYLE_FAMILY ) ).GetValue();
    }
    else
    if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILYNAME,
        sal_False, &pItem ))
    {
        String sFamily = ( (const SfxStringItem &) pArgs->Get( SID_STYLE_FAMILYNAME ) ).GetValue();
        if (sFamily.CompareToAscii("graphics") == COMPARE_EQUAL)
            nFamily = SD_STYLE_FAMILY_GRAPHICS;
		else
			nFamily = SD_STYLE_FAMILY_PSEUDO;
    }

	String aStyleName;
	sal_uInt16 nRetMask = 0xffff;

	switch( nSId )
	{
		case SID_STYLE_APPLY:
		case SID_STYLE_EDIT:
		case SID_STYLE_DELETE:
		case SID_STYLE_FAMILY:
		case SID_STYLE_NEW_BY_EXAMPLE:
		{
            SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, SID_APPLY_STYLE, sal_False );
            SFX_REQUEST_ARG( rReq, pFamilyItem, SfxStringItem, SID_STYLE_FAMILYNAME, sal_False );
            if ( pFamilyItem && pNameItem )
            {
                try
                {
					Reference< XStyleFamiliesSupplier > xModel(mpDoc->GetDocSh()->GetModel(), UNO_QUERY_THROW );
                    Reference< XNameAccess > xCont( xModel->getStyleFamilies() );
                    Reference< XNameAccess > xStyles( xCont->getByName(pFamilyItem->GetValue()), UNO_QUERY_THROW );
                    Reference< XPropertySet > xInfo( xStyles->getByName( pNameItem->GetValue() ), UNO_QUERY_THROW );

					OUString aUIName;
                    xInfo->getPropertyValue( ::rtl::OUString::createFromAscii("DisplayName") ) >>= aUIName;
                    if ( aUIName.getLength() )
                        rReq.AppendItem( SfxStringItem( nSId, aUIName ) );
                }
                catch( Exception& )
                {
                }
            }

			if (pArgs->GetItemState(nSId) == SFX_ITEM_SET)
				aStyleName = ( ( (const SfxStringItem &) pArgs->Get( nSId ) ).GetValue() );
		}
	}

	switch( nSId )
	{
		case SID_STYLE_NEW:
		{
			SfxStyleSheetBase *p = pSSPool->Find(aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_ALL );
			if(p)
			{
				pSSPool->Remove(p);
				p = 0;
			}
			pStyleSheet = &pSSPool->Make( aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_USERDEF );

			if (pArgs->GetItemState(SID_STYLE_REFERENCE) == SFX_ITEM_ON)
			{
				String aParentName(((const SfxStringItem&) pArgs->Get(SID_STYLE_REFERENCE)).GetValue());
				pStyleSheet->SetParent(aParentName);
			}
			else
			{
				pStyleSheet->SetParent(String(SdResId(STR_STANDARD_STYLESHEET_NAME)));
			}
		}
		break;

		case SID_STYLE_NEW_BY_EXAMPLE:
		{
			// Z.Z. geht immer noch der Dialog auf, um den Namen
			// der Vorlage einzugeben.
			if( mpView->AreObjectsMarked() || sal_True )
			{
				SfxStyleSheetBase *p = pSSPool->Find(aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_ALL );
				if(p)
				{
					pSSPool->Remove(p);
					p = 0;
				}
				pStyleSheet = &pSSPool->Make( aStyleName, (SfxStyleFamily) nFamily, SFXSTYLEBIT_USERDEF );
				pStyleSheet->SetParent(String(SdResId(STR_STANDARD_STYLESHEET_NAME)));
			}
		}
		break;

		case SID_STYLE_EDIT:
			pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
		break;

		case SID_STYLE_DELETE:
			pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
			if( pStyleSheet )
			{
				pSSPool->Remove( pStyleSheet );
				nRetMask = sal_True;
				mpDoc->SetChanged(sal_True);
			}
			else
			{
				nRetMask = sal_False;
			}
		break;

		case SID_STYLE_APPLY:
			// Anwenden der Vorlage auf das Dokument
			pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);

			// do not set presentation styles, they will be set implicit
			if ( pStyleSheet && pStyleSheet->GetFamily() != SD_STYLE_FAMILY_PSEUDO )
			{
				SfxStyleSheet* pOldStyleSheet = mpView->GetStyleSheet();
				String aStr;

				if( // if the object had no style sheet, allow all
					!pOldStyleSheet || 
					
					// allow if old and new style sheet has same family
					pStyleSheet->GetFamily() == pOldStyleSheet->GetFamily() ||
					
					// allow if old was background objects and new is graphics
					pStyleSheet->GetFamily() == (SD_STYLE_FAMILY_GRAPHICS && pOldStyleSheet->GetHelpId( aStr ) == HID_PSEUDOSHEET_BACKGROUNDOBJECTS) ||
					
					// allow if old was presentation and we are a drawing document
					(pOldStyleSheet->GetFamily() == SD_STYLE_FAMILY_MASTERPAGE && mpDoc->GetDocumentType() == DOCUMENT_TYPE_DRAW) )
				{
					mpView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
					mpDoc->SetChanged(sal_True);
					mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
				}
			}
/* #96983# GrabFocus moved to stylist
			pWin->GrabFocus();
*/
		break;

		case SID_STYLE_WATERCAN:
		{
			if( !SD_MOD()->GetWaterCan() )
			{
				if( pArgs->GetItemState( nSId ) == SFX_ITEM_SET )
				{
					aStyleName = ( ( (const SfxStringItem &) pArgs->Get( nSId ) ).GetValue() );
					SD_MOD()->SetWaterCan( sal_True );
					pStyleSheet = pSSPool->Find( aStyleName, (SfxStyleFamily) nFamily);
				}
				// keine Praesentationsobjektvorlagen, die werden nur
				// implizit zugewiesen
				if( pStyleSheet && pStyleSheet->GetFamily() != SD_STYLE_FAMILY_PSEUDO )
				{
					( (SdStyleSheetPool*) pSSPool )->SetActualStyleSheet( pStyleSheet );

					// Es wird explizit in den Selektionsmodus geschaltet
					mpViewShell->GetViewFrame()->GetDispatcher()->Execute( SID_OBJECT_SELECT,
										SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );

				}
				else
					SD_MOD()->SetWaterCan( sal_False );
			}
			else
			{
				SD_MOD()->SetWaterCan( sal_False );
				// Werkzeugleiste muss wieder enabled werden
				mpViewShell->Invalidate();
			}
		}
		break;

		default:
		break;
	}

	switch( nSId )
	{
		case SID_STYLE_NEW:
		case SID_STYLE_EDIT:
		{
			PresentationObjects ePO = PO_OUTLINE_1;

			if( pStyleSheet )
			{
				SfxAbstractTabDialog*  pStdDlg  = NULL;
				SfxAbstractTabDialog*  pPresDlg = NULL;
				SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
				sal_Bool bOldDocInOtherLanguage = sal_False;
				SfxItemSet aOriSet( pStyleSheet->GetItemSet() );

				SfxStyleFamily eFamily = pStyleSheet->GetFamily();

				if (eFamily == SD_STYLE_FAMILY_GRAPHICS)
				{
					pStdDlg = pFact ? pFact->CreateSdTabTemplateDlg( 0, mpDoc->GetDocSh(), *pStyleSheet, mpDoc, mpView ) : 0;
				}
				else if (eFamily == SD_STYLE_FAMILY_PSEUDO)
				{
					String aName(pStyleSheet->GetName());
					sal_uInt16 nDlgId = 0;

					if (aName == String(SdResId(STR_PSEUDOSHEET_TITLE)))
					{
						nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
						ePO    = PO_TITLE;
					}
					else if (aName == String(SdResId(STR_PSEUDOSHEET_SUBTITLE)))
					{
						nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
						ePO    = PO_SUBTITLE;
					}
					else if (aName ==
							 String(SdResId(STR_PSEUDOSHEET_BACKGROUND)))
					{
						nDlgId = TAB_PRES_LAYOUT_TEMPLATE_BACKGROUND;
						ePO    = PO_BACKGROUND;
					}
					else if (aName ==
							 String(SdResId(STR_PSEUDOSHEET_BACKGROUNDOBJECTS)))
					{
						nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
						ePO    = PO_BACKGROUNDOBJECTS;
					}
					else if (aName ==
							 String(SdResId(STR_PSEUDOSHEET_NOTES)))
					{
						nDlgId = TAB_PRES_LAYOUT_TEMPLATE;
						ePO    = PO_NOTES;
					}
					else if(aName.Search(String(SdResId(STR_PSEUDOSHEET_OUTLINE))) !=
							STRING_NOTFOUND)
					{
						nDlgId = TAB_PRES_LAYOUT_TEMPLATE;

						String aOutlineStr((SdResId(STR_PSEUDOSHEET_OUTLINE)));
						// die Nummer ermitteln; ein Leerzeichen zwischen
						// Name und Nummer beachten
						String aNumStr(aName.Copy(aOutlineStr.Len() + 1));
						sal_uInt16 nLevel = (sal_uInt16)aNumStr.ToInt32();
						switch (nLevel)
						{
							case 1: ePO = PO_OUTLINE_1; break;
							case 2: ePO = PO_OUTLINE_2; break;
							case 3: ePO = PO_OUTLINE_3; break;
							case 4: ePO = PO_OUTLINE_4; break;
							case 5: ePO = PO_OUTLINE_5; break;
							case 6: ePO = PO_OUTLINE_6; break;
							case 7: ePO = PO_OUTLINE_7; break;
							case 8: ePO = PO_OUTLINE_8; break;
							case 9: ePO = PO_OUTLINE_9; break;
						}
					}
					else
					{
						DBG_ERROR("Vorlage aus aelterer anderssprachiger Version");
						bOldDocInOtherLanguage = sal_True;
					}

					if( !bOldDocInOtherLanguage )
					{
						pPresDlg = pFact ? pFact->CreateSdPresLayoutTemplateDlg( mpDocSh, NULL, SdResId(nDlgId), *pStyleSheet, ePO, pSSPool ) : 0;
					}
				}
				else if (eFamily == SD_STYLE_FAMILY_CELL)
				{
				}

				sal_uInt16 nResult = RET_CANCEL;
				const SfxItemSet* pOutSet = NULL;
				if (pStdDlg)
				{
					nResult = pStdDlg->Execute();
					pOutSet = pStdDlg->GetOutputItemSet();
				}
				else if( pPresDlg )
				{
					nResult = pPresDlg->Execute();
					pOutSet = pPresDlg->GetOutputItemSet();
				}

				switch( nResult )
				{
					case RET_OK:
					{
						nRetMask = pStyleSheet->GetMask();

						if (eFamily == SD_STYLE_FAMILY_PSEUDO)
						{
							SfxItemSet aTempSet(*pOutSet);
							((SdStyleSheet*)pStyleSheet)->AdjustToFontHeight(aTempSet);

							// Sonderbehandlung: die INVALIDS auf NULL-Pointer
							// zurueckgesetzen (sonst landen INVALIDs oder
							// Pointer auf die DefaultItems in der Vorlage;
							// beides wuerde die Attribut-Vererbung unterbinden)
							aTempSet.ClearInvalidItems();

							// EE_PARA_NUMBULLET item is only valid in first outline template
							if( (ePO >= PO_OUTLINE_2) && (ePO <= PO_OUTLINE_9) )
							{
								if (aTempSet.GetItemState(EE_PARA_NUMBULLET) == SFX_ITEM_SET)
								{
									SvxNumRule aRule(*((SvxNumBulletItem*)aTempSet.GetItem(EE_PARA_NUMBULLET))->GetNumRule());

									String sStyleName((SdResId(STR_PSEUDOSHEET_OUTLINE)));
									sStyleName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " 1" ) );
									SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( sStyleName, SD_STYLE_FAMILY_PSEUDO);

									if(pFirstStyleSheet)
									{
										pFirstStyleSheet->GetItemSet().Put( SvxNumBulletItem( aRule, EE_PARA_NUMBULLET ));
										SdStyleSheet* pRealSheet = ((SdStyleSheet*)pFirstStyleSheet)->GetRealStyleSheet();
										pRealSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
									}

									aTempSet.ClearItem( EE_PARA_NUMBULLET );
								}
							}

							String sStyleName((SdResId(STR_PSEUDOSHEET_OUTLINE)));
							sStyleName.Append( sal_Unicode( ' ' ));

							pStyleSheet->GetItemSet().Put(aTempSet);

							SdStyleSheet* pRealSheet =((SdStyleSheet*)pStyleSheet)->GetRealStyleSheet();
							pRealSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));

							if( (ePO >= PO_OUTLINE_1) && (ePO <= PO_OUTLINE_8) )
							{
								for( sal_uInt16 n = (sal_uInt16)(ePO - PO_OUTLINE_1 + 2); n < 10; n++ )
								{
									String aName( sStyleName );
									aName.Append( String::CreateFromInt32( (sal_Int32) n ));

									SfxStyleSheetBase* pSheet = pSSPool->Find( aName, SD_STYLE_FAMILY_PSEUDO);

									if(pSheet)
									{
										SdStyleSheet* pRealStyleSheet = ((SdStyleSheet*)pSheet)->GetRealStyleSheet();
										pRealStyleSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
									}
								}
							}
						}

						SfxItemSet& rAttr = pStyleSheet->GetItemSet();

						sdr::properties::CleanupFillProperties( rAttr );

						// check for unique names of named items for xml
						if( rAttr.GetItemState( XATTR_FILLBITMAP ) == SFX_ITEM_SET )
						{
							const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLBITMAP );
							SfxPoolItem* pNewItem = ((XFillBitmapItem*)pOldItem)->checkForUniqueItem( mpDoc );
							if( pOldItem != pNewItem )
							{
								rAttr.Put( *pNewItem );
								delete pNewItem;
							}
						}
						if( rAttr.GetItemState( XATTR_LINEDASH ) == SFX_ITEM_SET )
						{
							const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEDASH );
							SfxPoolItem* pNewItem = ((XLineDashItem*)pOldItem)->checkForUniqueItem( mpDoc );
							if( pOldItem != pNewItem )
							{
								rAttr.Put( *pNewItem );
								delete pNewItem;
							}
						}
						if( rAttr.GetItemState( XATTR_LINESTART ) == SFX_ITEM_SET )
						{
							const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINESTART );
							SfxPoolItem* pNewItem = ((XLineStartItem*)pOldItem)->checkForUniqueItem( mpDoc );
							if( pOldItem != pNewItem )
							{
								rAttr.Put( *pNewItem );
								delete pNewItem;
							}
						}
						if( rAttr.GetItemState( XATTR_LINEEND ) == SFX_ITEM_SET )
						{
							const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEEND );
							SfxPoolItem* pNewItem = ((XLineEndItem*)pOldItem)->checkForUniqueItem( mpDoc );
							if( pOldItem != pNewItem )
							{
								rAttr.Put( *pNewItem );
								delete pNewItem;
							}
						}
						if( rAttr.GetItemState( XATTR_FILLGRADIENT ) == SFX_ITEM_SET )
						{
							const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLGRADIENT );
							SfxPoolItem* pNewItem = ((XFillGradientItem*)pOldItem)->checkForUniqueItem( mpDoc );
							if( pOldItem != pNewItem )
							{
								rAttr.Put( *pNewItem );
								delete pNewItem;
							}
						}
						if( rAttr.GetItemState( XATTR_FILLFLOATTRANSPARENCE ) == SFX_ITEM_SET )
						{
							const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLFLOATTRANSPARENCE );
							SfxPoolItem* pNewItem = ((XFillFloatTransparenceItem*)pOldItem)->checkForUniqueItem( mpDoc );
							if( pOldItem != pNewItem )
							{
								rAttr.Put( *pNewItem );
								delete pNewItem;
							}
						}
						if( rAttr.GetItemState( XATTR_FILLHATCH ) == SFX_ITEM_SET )
						{
							const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLHATCH );
							SfxPoolItem* pNewItem = ((XFillHatchItem*)pOldItem)->checkForUniqueItem( mpDoc );
							if( pOldItem != pNewItem )
							{
								rAttr.Put( *pNewItem );
								delete pNewItem;
							}
						}

						( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );

						DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpViewShell );
						if( pDrawViewShell )
						{
							PageKind ePageKind = pDrawViewShell->GetPageKind();
							if( ePageKind == PK_NOTES || ePageKind == PK_HANDOUT )
							{
								SdPage* pPage = mpViewShell->GetActualPage();

								if(pDrawViewShell->GetEditMode() == EM_MASTERPAGE)
								{
									pPage = static_cast<SdPage*>((&(pPage->TRG_GetMasterPage())));
								}

								if( pPage )
								{
									SdrObjListIter aIter( *pPage );
									while( aIter.IsMore() )
									{
										SdrObject* pObj = aIter.Next();
										if( pObj->ISA(SdrPageObj) )
										{
											// repaint only
											pObj->ActionChanged();
											// pObj->SendRepaintBroadcast();
										}
									}
								}
							}
						}

						if( mpDoc->GetOnlineSpell() )
						{
							const SfxPoolItem* pTempItem;
							if( SFX_ITEM_SET == rAttr.GetItemState(EE_CHAR_LANGUAGE, sal_False, &pTempItem ) ||
								SFX_ITEM_SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CJK, sal_False, &pTempItem ) ||
								SFX_ITEM_SET == rAttr.GetItemState(EE_CHAR_LANGUAGE_CTL, sal_False, &pTempItem ) )
							{
								mpDoc->StopOnlineSpelling();
								mpDoc->StartOnlineSpelling();
							}
						}

						mpDoc->SetChanged(sal_True);
					}
					break;

					default:
					{
						if( nSId == SID_STYLE_NEW )
							pSSPool->Remove( pStyleSheet );
						delete pStdDlg;
						delete pPresDlg;
					}
					return; // Abbruch
				}
				delete pStdDlg;
				delete pPresDlg;
			}
		}
		break;

		case SID_STYLE_NEW_BY_EXAMPLE:
		{
			if( pStyleSheet )
			{
				nRetMask = pStyleSheet->GetMask();
				SfxItemSet aCoreSet( mpDoc->GetPool() );
				mpView->GetAttributes( aCoreSet, sal_True );

				// wenn das Objekt eine Vorlage hatte, wird diese Parent
				// der neuen Vorlage
				SfxStyleSheet* pOldStyle = mpView->GetStyleSheet();

				// Wenn pOldStyle == pStyleSheet -> Rekursion
				if( pOldStyle != pStyleSheet )
				{
					if (pOldStyle)
					{
						pStyleSheet->SetParent(pOldStyle->GetName());
					}

					SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
					pStyleSet->Put(aCoreSet);

					// Vorlage anwenden (Aber nicht, wenn gerade ein Text
					// editiert wird, denn dazu muesste die Edit Engine
					// Vorlagen auf Zeichenebene beherrschen.)
					if (!mpView->GetTextEditObject())
					{
						mpView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);
					}

					( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
					mpDoc->SetChanged(sal_True);

					mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
				}
			}
		}
		break;

		case SID_STYLE_UPDATE_BY_EXAMPLE:
		{
			if ((mpView->AreObjectsMarked() && mpView->GetMarkedObjectList().GetMarkCount() == 1) ||
				 mpView->ISA(OutlineView))
			{
				pStyleSheet = mpView->GetStyleSheet();

				if( pStyleSheet )
				{
					nRetMask = pStyleSheet->GetMask();
					SfxItemSet aCoreSet( mpDoc->GetPool() );
					mpView->GetAttributes( aCoreSet );

					SfxItemSet* pStyleSet = &pStyleSheet->GetItemSet();
					pStyleSet->Put( aCoreSet );

					mpView->SetStyleSheet( (SfxStyleSheet*) pStyleSheet);

					( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
					mpDoc->SetChanged(sal_True);
					mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_STYLE_FAMILY2 );
				}
			}
		}
		break;

	}
	if( nRetMask != 0xffff )
		rReq.SetReturnValue( SfxUInt16Item( nSId, nRetMask ) );
}

void FuTemplate::Activate()
{
}

void FuTemplate::Deactivate()
{
}

} // end of namespace sd
