/**************************************************************
 *
 * 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_sw.hxx"

#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <hintids.hxx>
#include <sfx2/app.hxx>
#include <svl/whiter.hxx>
#include <sfx2/templdlg.hxx>
#include <sfx2/tplpitem.hxx>
#include <sfx2/request.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/newstyle.hxx>
#include <sfx2/printer.hxx>
#include <svl/macitem.hxx>
#include <editeng/brshitem.hxx>
#include <svl/stritem.hxx>
#include <svl/languageoptions.hxx>
#include <editeng/eeitem.hxx>
#include <svx/htmlmode.hxx>
#include <svx/xdef.hxx>
#include <swmodule.hxx>
#include <wdocsh.hxx>
#include <fmtfsize.hxx>
#include <fchrfmt.hxx>
#include <svtools/htmlcfg.hxx>
#include <SwStyleNameMapper.hxx>
#include <SwRewriter.hxx>
#include <numrule.hxx>
#include <swundo.hxx>
#include <svx/svdmodel.hxx>
#include <svx/drawitem.hxx>
#include "view.hxx"
#include "wrtsh.hxx"
#include "docsh.hxx"
#include "uitool.hxx"
#include "cmdid.h"
#include "globals.hrc"
#include "viewopt.hxx"
#include <doc.hxx>
#include <IDocumentUndoRedo.hxx>
#include "swstyle.h"
#include "frmfmt.hxx"
#include "charfmt.hxx"
#include "poolfmt.hxx"
#include "pagedesc.hxx"
#include "docstyle.hxx"
#include "uiitems.hxx"
#include "fmtcol.hxx"
#include "frmmgr.hxx"		//SwFrmValid
#include "swevent.hxx"
#include "edtwin.hxx"
#include "unochart.hxx"
#include "app.hrc"
#include <fmtui.hrc>
#include "swabstdlg.hxx"
#include <list.hxx>
#include <paratr.hxx>	//#outline level,add by zhaojianwei
#include <drawdoc.hxx>

using namespace ::com::sun::star;

/*--------------------------------------------------------------------
	Beschreibung:
 --------------------------------------------------------------------*/


void  SwDocShell::StateStyleSheet(SfxItemSet& rSet, SwWrtShell* pSh)
{
	SfxWhichIter aIter(rSet);
	sal_uInt16 	nWhich 	= aIter.FirstWhich();
	sal_uInt16 nActualFamily = USHRT_MAX;

	SwWrtShell* pShell = pSh ? pSh : GetWrtShell();
    if(!pShell)
	{
		while (nWhich)
		{
			rSet.DisableItem(nWhich);
			nWhich = aIter.NextWhich();
		}
		return;
	}
	else
	{
		SfxViewFrame* pFrame = pShell->GetView().GetViewFrame();
		const ISfxTemplateCommon* pCommon = SFX_APP()->GetCurrentTemplateCommon(pFrame->GetBindings());
		if( pCommon )
            nActualFamily = static_cast< sal_uInt16 >(pCommon->GetActualFamily());
	}

	while (nWhich)
	{
		// aktuelle Vorlage zu jeder Familie ermitteln
		//
		String aName;
		switch (nWhich)
		{
			case SID_STYLE_APPLY:
			{//hier wird die Vorlage und ihre Familie an die StyleBox
			 //uebergeben, damit diese Familie angezeigt wird
				if(pShell->IsFrmSelected())
				{
					SwFrmFmt* pFmt = pShell->GetCurFrmFmt();
					if( pFmt )
						aName = pFmt->GetName();
				}
				else
				{
					SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
					if(pColl)
						aName = pColl->GetName();
				}
				rSet.Put(SfxTemplateItem(nWhich, aName));
			}
			break;
			case SID_STYLE_FAMILY1:
				if( !pShell->IsFrmSelected() )
				{
					SwCharFmt* pFmt = pShell->GetCurCharFmt();
					if(pFmt)
						aName = pFmt->GetName();
					else
						aName = *SwStyleNameMapper::GetTextUINameArray()[
							RES_POOLCOLL_STANDARD - RES_POOLCOLL_TEXT_BEGIN ];
                    rSet.Put(SfxTemplateItem(nWhich, aName));
                }
                break;

			case SID_STYLE_FAMILY2:
				if(!pShell->IsFrmSelected())
				{
					SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
					if(pColl)
						aName = pColl->GetName();

					SfxTemplateItem aItem(nWhich, aName);

					sal_uInt16 nMask = 0;
					if( mpDoc->get(IDocumentSettingAccess::HTML_MODE) )
						nMask = SWSTYLEBIT_HTML;
					else
					{
						const int nSelection = pShell->GetFrmType(0,sal_True);
						if(pShell->GetCurTOX())
							nMask = SWSTYLEBIT_IDX	;
						else if(nSelection & FRMTYPE_HEADER 	||
								nSelection & FRMTYPE_FOOTER 	||
								nSelection & FRMTYPE_TABLE 		||
								nSelection & FRMTYPE_FLY_ANY 	||
								nSelection & FRMTYPE_FOOTNOTE 	||
								nSelection & FRMTYPE_FTNPAGE)
							nMask = SWSTYLEBIT_EXTRA;
						else
							nMask = SWSTYLEBIT_TEXT;
					}

					aItem.SetValue(nMask);
					rSet.Put(aItem);
				}

				break;

			case SID_STYLE_FAMILY3:

				if( mpDoc->get(IDocumentSettingAccess::HTML_MODE) )
					rSet.DisableItem( nWhich );
				else
				{
					SwFrmFmt* pFmt = pShell->GetCurFrmFmt();
					if(pFmt && pShell->IsFrmSelected())
                    {
						aName = pFmt->GetName();
                        rSet.Put(SfxTemplateItem(nWhich, aName));
                    }
                }
				break;

			case SID_STYLE_FAMILY4:
			{
				SvxHtmlOptions* pHtmlOpt = SvxHtmlOptions::Get();
				if( mpDoc->get(IDocumentSettingAccess::HTML_MODE) && !pHtmlOpt->IsPrintLayoutExtension())
					rSet.DisableItem( nWhich );
				else
				{
					sal_uInt16 n = pShell->GetCurPageDesc( sal_False );
					if( n < pShell->GetPageDescCnt() )
						aName = pShell->GetPageDesc( n ).GetName();

					rSet.Put(SfxTemplateItem(nWhich, aName));
				}
			}
			break;
			case SID_STYLE_FAMILY5:
				{
					const SwNumRule* pRule = pShell->GetNumRuleAtCurrCrsrPos();
					if( pRule )
						aName = pRule->GetName();

					rSet.Put(SfxTemplateItem(nWhich, aName));
				}
				break;

			case SID_STYLE_WATERCAN:
			{
                SwEditWin& rEdtWin = pShell->GetView().GetEditWin();
                SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
                rSet.Put(SfxBoolItem(nWhich, pApply && pApply->eType != 0));
			}
            break;
			case SID_STYLE_UPDATE_BY_EXAMPLE:
				if( pShell->IsFrmSelected()
						? SFX_STYLE_FAMILY_FRAME != nActualFamily
						: ( SFX_STYLE_FAMILY_FRAME == nActualFamily ||
							SFX_STYLE_FAMILY_PAGE == nActualFamily ||
							(SFX_STYLE_FAMILY_PSEUDO == nActualFamily && !pShell->GetNumRuleAtCurrCrsrPos())) )
				{
					rSet.DisableItem( nWhich );
				}
				break;

			case SID_STYLE_NEW_BY_EXAMPLE:
				if( (pShell->IsFrmSelected()
						? SFX_STYLE_FAMILY_FRAME != nActualFamily
						: SFX_STYLE_FAMILY_FRAME == nActualFamily) ||
					(SFX_STYLE_FAMILY_PSEUDO == nActualFamily && !pShell->GetNumRuleAtCurrCrsrPos()) )
				{
					rSet.DisableItem( nWhich );
				}
				break;

			default:
				DBG_ERROR( "Invalid SlotId");
		}
		nWhich = aIter.NextWhich();
	}
}


/*--------------------------------------------------------------------
	Beschreibung:	StyleSheet-Requeste auswerten
 --------------------------------------------------------------------*/


void SwDocShell::ExecStyleSheet( SfxRequest& rReq )
{
	sal_uInt16 	nSlot 	= rReq.GetSlot();
	sal_uInt16 	nRet 	= 0xffff;

	const SfxItemSet* pArgs = rReq.GetArgs();
	const SfxPoolItem* pItem;
	SwWrtShell* pActShell = 0;
	sal_Bool bSetReturn = sal_True;
	switch (nSlot)
	{
	case SID_STYLE_NEW:
		if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_FAMILY,
			sal_False, &pItem ))
		{
			const sal_uInt16 nFamily = ((const SfxUInt16Item*)pItem)->GetValue();

			String sName;
			sal_uInt16 nMask = 0;
			if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_NEW,
				sal_False, &pItem ))
				sName = ((const SfxStringItem*)pItem)->GetValue();
			if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_MASK,
				sal_False, &pItem ))
				nMask = ((const SfxUInt16Item*)pItem)->GetValue();
			String sParent;
			if( SFX_ITEM_SET == pArgs->GetItemState( SID_STYLE_REFERENCE,
				sal_False, &pItem ))
				sParent = ((const SfxStringItem*)pItem)->GetValue();

			nRet = Edit( sName, sParent, nFamily, nMask, sal_True, 0, 0, rReq.IsAPI() );
		}
		break;

		case SID_STYLE_APPLY:
			if( !pArgs )
			{
				GetView()->GetViewFrame()->GetDispatcher()->Execute(SID_STYLE_DESIGNER, sal_False);
				break;
            }
            else
            {
                // convert internal StyleName to DisplayName (slot implementation uses the latter)
                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 )
                {
                    uno::Reference< style::XStyleFamiliesSupplier > xModel(GetModel(), uno::UNO_QUERY);
                    try
                    {
                        uno::Reference< container::XNameAccess > xStyles;
                        uno::Reference< container::XNameAccess > xCont = xModel->getStyleFamilies();
                        xCont->getByName(pFamilyItem->GetValue()) >>= xStyles;
                        uno::Reference< beans::XPropertySet > xInfo;
                        xStyles->getByName( pNameItem->GetValue() ) >>= xInfo;
                        ::rtl::OUString aUIName;
                        xInfo->getPropertyValue( ::rtl::OUString::createFromAscii("DisplayName") ) >>= aUIName;
                        if ( aUIName.getLength() )
                            rReq.AppendItem( SfxStringItem( SID_STYLE_APPLY, aUIName ) );
                    }
                    catch( uno::Exception& )
                    {
                    }
                }
            }

            // intentionally no break

		case SID_STYLE_EDIT:
		case SID_STYLE_DELETE:
		case SID_STYLE_WATERCAN:
		case SID_STYLE_FAMILY:
		case SID_STYLE_UPDATE_BY_EXAMPLE:
		case SID_STYLE_NEW_BY_EXAMPLE:
		{
			String aParam;
            sal_uInt16 nFamily = SFX_STYLE_FAMILY_PARA;
            sal_uInt16 nMask = 0;

			if( !pArgs )
			{
				nFamily = SFX_STYLE_FAMILY_PARA;

				switch (nSlot)
				{
					case SID_STYLE_NEW_BY_EXAMPLE:
					{
						SfxNewStyleDlg *pDlg = new SfxNewStyleDlg( 0,
													*GetStyleSheetPool());
						if(RET_OK == pDlg->Execute())
                        {
							aParam = pDlg->GetName();
							rReq.AppendItem(SfxStringItem(nSlot, aParam));
                        }

						delete pDlg;
					}
					break;

					case SID_STYLE_UPDATE_BY_EXAMPLE:
					case SID_STYLE_EDIT:
					{
						SwTxtFmtColl* pColl = GetWrtShell()->GetCurTxtFmtColl();
						if(pColl)
						{
							aParam = pColl->GetName();
							rReq.AppendItem(SfxStringItem(nSlot, aParam));
						}
					}
					break;
				}
			}
			else
			{
				ASSERT( pArgs->Count(), "SfxBug ItemSet ist leer");

				SwWrtShell* pShell = GetWrtShell();
				if( SFX_ITEM_SET == pArgs->GetItemState(nSlot, sal_False, &pItem ))
					aParam = ((const SfxStringItem*)pItem)->GetValue();

				if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_FAMILY,
					sal_False, &pItem ))
					nFamily = ((const SfxUInt16Item*)pItem)->GetValue();

				if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_FAMILYNAME, sal_False, &pItem ))
                {
					String aFamily = ((const SfxStringItem*)pItem)->GetValue();
                    if(aFamily.CompareToAscii("CharacterStyles") == COMPARE_EQUAL)
                        nFamily = SFX_STYLE_FAMILY_CHAR;
                    else
                    if(aFamily.CompareToAscii("ParagraphStyles") == COMPARE_EQUAL)
                        nFamily = SFX_STYLE_FAMILY_PARA;
                    else
                    if(aFamily.CompareToAscii("PageStyles") == COMPARE_EQUAL)
                        nFamily = SFX_STYLE_FAMILY_PAGE;
                    else
                    if(aFamily.CompareToAscii("FrameStyles") == COMPARE_EQUAL)
                        nFamily = SFX_STYLE_FAMILY_FRAME;
                    else
                    if(aFamily.CompareToAscii("NumberingStyles") == COMPARE_EQUAL)
                        nFamily = SFX_STYLE_FAMILY_PSEUDO;
                }

				if( SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_MASK,
					sal_False, &pItem ))
					nMask = ((const SfxUInt16Item*)pItem)->GetValue();
				if( SFX_ITEM_SET == pArgs->GetItemState(FN_PARAM_WRTSHELL,
					sal_False, &pItem ))
					pActShell = pShell = (SwWrtShell*)((SwPtrItem*)pItem)->GetValue();

				if( nSlot == SID_STYLE_UPDATE_BY_EXAMPLE )
				{
					switch( nFamily )
					{
						case SFX_STYLE_FAMILY_PARA:
						{
							SwTxtFmtColl* pColl = pShell->GetCurTxtFmtColl();
							if(pColl)
								aParam = pColl->GetName();
						}
						break;
						case SFX_STYLE_FAMILY_FRAME:
						{
							SwFrmFmt* pFrm = mpWrtShell->GetCurFrmFmt();
							if( pFrm )
								aParam = pFrm->GetName();
						}
						break;
						case SFX_STYLE_FAMILY_CHAR:
						{
							SwCharFmt* pChar = mpWrtShell->GetCurCharFmt();
							if( pChar )
								aParam = pChar->GetName();
						}
						break;
						case SFX_STYLE_FAMILY_PSEUDO:
						if(SFX_ITEM_SET == pArgs->GetItemState(SID_STYLE_UPD_BY_EX_NAME, sal_False, &pItem))
						{
							aParam = ((const SfxStringItem*)pItem)->GetValue();
						}
						break;
					}
					rReq.AppendItem(SfxStringItem(nSlot, aParam));
				}
			}
			if (aParam.Len() || nSlot == SID_STYLE_WATERCAN )
			{
				switch(nSlot)
				{
					case SID_STYLE_EDIT:
						nRet = Edit(aParam, aEmptyStr, nFamily, nMask, sal_False, 0, pActShell );
						break;
					case SID_STYLE_DELETE:
						nRet = Delete(aParam, nFamily);
						break;
					case SID_STYLE_APPLY:
						// Shellwechsel in ApplyStyles
                        nRet = ApplyStyles(aParam, nFamily, pActShell, rReq.GetModifier() );
						break;
					case SID_STYLE_WATERCAN:
						nRet = DoWaterCan(aParam, nFamily);
						break;
					case SID_STYLE_UPDATE_BY_EXAMPLE:
						nRet = UpdateStyle(aParam, nFamily, pActShell);
						break;
					case SID_STYLE_NEW_BY_EXAMPLE:
					{
						nRet = MakeByExample(aParam, nFamily, nMask, pActShell );
						SfxTemplateDialog* pDlg = SFX_APP()->GetTemplateDialog();

						if(pDlg && pDlg->IsVisible())
							pDlg->Update();
					}
					break;

					default:
						DBG_ERROR( "Falsche Slot-Id");
				}

                rReq.Done();
			}

			break;
		}
	}

	if(bSetReturn)
	{
		if(rReq.IsAPI()) // Basic bekommt nur sal_True oder sal_False
			rReq.SetReturnValue(SfxUInt16Item(nSlot, nRet !=0));
		else
			rReq.SetReturnValue(SfxUInt16Item(nSlot, nRet));
	}

}

/*--------------------------------------------------------------------
	Beschreibung:	Edit
 --------------------------------------------------------------------*/

sal_uInt16 SwDocShell::Edit(
    const String &rName,
    const String &rParent,
    const sal_uInt16 nFamily,
    sal_uInt16 nMask,
    const sal_Bool bNew,
    const sal_uInt16 nSlot,
    SwWrtShell* pActShell,
    const sal_Bool bBasic )
{
	ASSERT(GetWrtShell(), "Keine Shell, keine Styles");
	SfxStyleSheetBase *pStyle = 0;

	sal_uInt16 nRet = nMask;
	sal_Bool bModified = mpDoc->IsModified();

	if( bNew )
	{
		if( SFXSTYLEBIT_ALL != nMask && SFXSTYLEBIT_USED != nMask )
			nMask |= SFXSTYLEBIT_USERDEF;
		else
			nMask = SFXSTYLEBIT_USERDEF;

		pStyle = &mxBasePool->Make( rName, (SfxStyleFamily)nFamily, nMask );

		// die aktuellen als Parent setzen
		SwDocStyleSheet* pDStyle = (SwDocStyleSheet*)pStyle;
		switch( nFamily )
		{
			case SFX_STYLE_FAMILY_PARA:
			{
				if(rParent.Len())
				{
					SwTxtFmtColl* pColl = mpWrtShell->FindTxtFmtCollByName( rParent );
                    if(!pColl)
                    {
                        sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL);
                        if(USHRT_MAX != nId)
                            pColl =  mpWrtShell->GetTxtCollFromPool( nId );
                    }
					pDStyle->GetCollection()->SetDerivedFrom( pColl );
					pDStyle->PresetParent( rParent );

					 /*When a new paragraph style is created based on a "to outline style
						assigned" paragraph style, the outline level attribute and the list
						style attribute of the new paragraph style have to be set to 0
						respectively "".*/
					if( pColl->IsAssignedToListLevelOfOutlineStyle())
					{
						SwNumRuleItem aItem(aEmptyStr);
						pDStyle->GetCollection()->SetFmtAttr( aItem );
						pDStyle->GetCollection()->SetAttrOutlineLevel( 0 );
					}

				}
				else
				{
					SwTxtFmtColl* pColl = mpWrtShell->GetCurTxtFmtColl();
					pDStyle->GetCollection()->SetDerivedFrom( pColl );
					if( pColl )
						pDStyle->PresetParent( pColl->GetName() );
				}
			}
			break;
			case SFX_STYLE_FAMILY_CHAR:
			{
				if(rParent.Len())
				{
					SwCharFmt* pCFmt = mpWrtShell->FindCharFmtByName( rParent );
                    if(!pCFmt)
                    {
                        sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT);
                        if(USHRT_MAX != nId)
                            pCFmt =  mpWrtShell->GetCharFmtFromPool( nId );
                    }

					pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
					pDStyle->PresetParent( rParent );
				}
				else
				{
					SwCharFmt* pCFmt = mpWrtShell->GetCurCharFmt();
					pDStyle->GetCharFmt()->SetDerivedFrom( pCFmt );
						if( pCFmt )
							pDStyle->PresetParent( pCFmt->GetName() );
				}
			}
			break;
			case SFX_STYLE_FAMILY_FRAME :
			{
				if(rParent.Len())
				{
					SwFrmFmt* pFFmt = mpWrtShell->GetDoc()->FindFrmFmtByName( rParent );
                    if(!pFFmt)
                    {
                        sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rParent, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT);
                        if(USHRT_MAX != nId)
                            pFFmt =  mpWrtShell->GetFrmFmtFromPool( nId );
                    }
                    pDStyle->GetFrmFmt()->SetDerivedFrom( pFFmt );
					pDStyle->PresetParent( rParent );
				}
			}
			break;
		}
	}
	else
	{
		pStyle = mxBasePool->Find( rName, (SfxStyleFamily)nFamily );
		ASSERT(pStyle, "Vorlage nicht gefunden");
	}

	if(!pStyle)
		return sal_False;

	// Dialoge zusammenstoepseln
	//
	rtl::Reference< SwDocStyleSheet > xTmp( new SwDocStyleSheet( *(SwDocStyleSheet*)pStyle ) );
	if( SFX_STYLE_FAMILY_PARA == nFamily )
	{
		SfxItemSet& rSet = xTmp->GetItemSet();
		::SwToSfxPageDescAttr( rSet );
		// erstmal nur eine Null
		rSet.Put(SwBackgroundDestinationItem(SID_PARA_BACKGRND_DESTINATION, 0));
        // --> OD 2008-02-13 #newlistlevelattrs#
        // merge list level indent attributes into the item set if needed
        xTmp->MergeIndentAttrsOfListStyle( rSet );
        // <--
	}
/*	else if( SFX_STYLE_FAMILY_FRAME == nFamily )
	{
		// Auskommentiert wegen Bug #45776 (per default keine Breite&Groesse in Rahmenvorlagen)
		SfxItemSet& rSet = aTmp.GetItemSet();
		if( SFX_ITEM_SET != rSet.GetItemState( RES_FRM_SIZE ))
		{
			// dann sollten wir spaetesten hier eines anlegen
			SwFrmValid aFrmDefValues;
			rSet.Put( SwFmtFrmSize( ATT_VAR_SIZE, aFrmDefValues.nWidth,
									aFrmDefValues.nHeight ));
		}
	}*/
	else if( SFX_STYLE_FAMILY_CHAR == nFamily )
	{
		SfxItemSet& rSet = xTmp->GetItemSet();
		const SfxPoolItem *pTmpBrush;
		if( SFX_ITEM_SET == rSet.GetItemState( RES_CHRATR_BACKGROUND,
			sal_True, &pTmpBrush ) )
		{
			SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
			aTmpBrush.SetWhich( RES_BACKGROUND );
			rSet.Put( aTmpBrush );
		}
	}

    if(SFX_STYLE_FAMILY_PAGE == nFamily || SFX_STYLE_FAMILY_PARA == nFamily)
    {
        //UUUU create needed items for XPropertyList entries from the DrawModel so that
        // the Area TabPage can access them
        SfxItemSet& rSet = xTmp->GetItemSet();
        const SwDrawModel* pDrawModel = GetDoc()->GetDrawModel();

        rSet.Put(SvxColorTableItem(pDrawModel->GetColorTableFromSdrModel(), SID_COLOR_TABLE));
        rSet.Put(SvxGradientListItem(pDrawModel->GetGradientListFromSdrModel(), SID_GRADIENT_LIST));
        rSet.Put(SvxHatchListItem(pDrawModel->GetHatchListFromSdrModel(), SID_HATCH_LIST));
        rSet.Put(SvxBitmapListItem(pDrawModel->GetBitmapListFromSdrModel(), SID_BITMAP_LIST));
    }

    if (!bBasic)
    {
        // vor dem Dialog wird der HtmlMode an der DocShell versenkt
        sal_uInt16 nHtmlMode = ::GetHtmlMode(this);

        // In HTML mode, we do not always have a printer. In order to show
        // the correct page size in the Format - Page dialog, we have to
        // get one here.
        SwWrtShell* pCurrShell = ( pActShell ? pActShell : mpWrtShell );
        if( ( HTMLMODE_ON & nHtmlMode ) &&
            !pCurrShell->getIDocumentDeviceAccess()->getPrinter( false ) )
            pCurrShell->InitPrt( pCurrShell->getIDocumentDeviceAccess()->getPrinter( true ) );

        PutItem(SfxUInt16Item(SID_HTML_MODE, nHtmlMode));
        FieldUnit eMetric = ::GetDfltMetric(0 != (HTMLMODE_ON&nHtmlMode));
        SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
        SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
        DBG_ASSERT(pFact, "Dialogdiet fail!");
        SfxAbstractTabDialog* pDlg = pFact->CreateTemplateDialog( DLG_TEMPLATE_BASE,
                                                    0, *(xTmp.get()), nFamily, nSlot,
                                                    pActShell ? pActShell : mpWrtShell, bNew);
        DBG_ASSERT(pDlg, "Dialogdiet fail!");
		if(RET_OK == pDlg->Execute())
		{
			GetWrtShell()->StartAllAction();

			// nur bei Absatz-Vorlagen die Maske neu setzen
			if( bNew )
			{
				nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
						? xTmp->GetMask()
						: SFXSTYLEBIT_USERDEF;
			}
			else if( pStyle->GetMask() != xTmp->GetMask() )
				nRet = xTmp->GetMask();

			if( SFX_STYLE_FAMILY_PARA == nFamily )
			{
				SfxItemSet aSet( *pDlg->GetOutputItemSet() );
				::SfxToSwPageDescAttr( *GetWrtShell(), aSet  );
                // --> OD 2008-02-12 #newlistlevelattrs#
                // reset indent attributes at paragraph style, if a list style
                // will be applied and no indent attributes will be applied.
				xTmp->SetItemSet( aSet, true );
                // <--
			}
			else
			{
                if(SFX_STYLE_FAMILY_PAGE == nFamily)
                {
                    static const sal_uInt16 aInval[] = {
                        SID_IMAGE_ORIENTATION,
						SID_ATTR_CHAR_FONT,
						FN_INSERT_CTRL, FN_INSERT_OBJ_CTRL, 0};
                    mpView->GetViewFrame()->GetBindings().Invalidate(aInval);
                }
                SfxItemSet aTmpSet( *pDlg->GetOutputItemSet() );
				if( SFX_STYLE_FAMILY_CHAR == nFamily )
				{
					const SfxPoolItem *pTmpBrush;
					if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
						sal_False, &pTmpBrush ) )
					{
						SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
						aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
						aTmpSet.Put( aTmpBrush );
					}
					aTmpSet.ClearItem( RES_BACKGROUND );
				}

				xTmp->SetItemSet( aTmpSet );

                if( SFX_STYLE_FAMILY_PAGE == nFamily && SvtLanguageOptions().IsCTLFontEnabled() )
                {
                    const SfxPoolItem *pItem = NULL;
                    if( aTmpSet.GetItemState( GetPool().GetTrueWhich( SID_ATTR_FRAMEDIRECTION, sal_False ) , sal_True, &pItem ) == SFX_ITEM_SET )
                        SwChartHelper::DoUpdateAllCharts( mpDoc );
                }
			}

            //UUUU
            if(bNew)
            {
                if(SFX_STYLE_FAMILY_FRAME == nFamily || SFX_STYLE_FAMILY_PARA == nFamily)
                {
                    // clear FillStyle so that it works as a derived attribute
                    SfxItemSet aTmpSet(*pDlg->GetOutputItemSet());

                    aTmpSet.ClearItem(XATTR_FILLSTYLE);
                    xTmp->SetItemSet(aTmpSet);
                }
            }

			if(SFX_STYLE_FAMILY_PAGE == nFamily)
				mpView->InvalidateRulerPos();

			if( bNew )
				mxBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xTmp.get() ) );

			// JP 19.09.97:
			// Dialog vorm EndAction zerstoeren - bei Seitenvorlagen kann
			// muss der ItemSet zerstoert werden, damit die Cursor aus den
			// Kopf-/Fusszeilen entfernt werden. Sonst kommts zu GPFs!!!
			delete pDlg;

			mpDoc->SetModified();
			if( !bModified )	// Bug 57028
            {
                mpDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
            }

			GetWrtShell()->EndAllAction();
		}
		else
		{
			if( bNew )
            {
                // #116530#
				//pBasePool->Erase( &aTmp );
                GetWrtShell()->Undo(1);
                mpDoc->GetIDocumentUndoRedo().ClearRedo();
            }

			if( !bModified )
				mpDoc->ResetModified();
			delete pDlg;
		}
	}
	else
	{
		// vor dem Dialog wird der HtmlMode an der DocShell versenkt
		PutItem(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(this)));

		GetWrtShell()->StartAllAction();

		// nur bei Absatz-Vorlagen die Maske neu setzen
		if( bNew )
		{
			nRet = SFX_STYLE_FAMILY_PARA == pStyle->GetFamily()
					? xTmp->GetMask()
					: SFXSTYLEBIT_USERDEF;
		}
		else if( pStyle->GetMask() != xTmp->GetMask() )
			nRet = xTmp->GetMask();

		if( SFX_STYLE_FAMILY_PARA == nFamily )
			::SfxToSwPageDescAttr( *GetWrtShell(), xTmp->GetItemSet() );
		else
		{
			SfxItemSet aTmpSet( xTmp->GetItemSet() );
			if( SFX_STYLE_FAMILY_CHAR == nFamily )
			{
				const SfxPoolItem *pTmpBrush;
				if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_BACKGROUND,
					sal_False, &pTmpBrush ) )
				{
					SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
					aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
					aTmpSet.Put( aTmpBrush );
				}
				aTmpSet.ClearItem( RES_BACKGROUND );
			}
			xTmp->SetItemSet( aTmpSet );
		}
		if(SFX_STYLE_FAMILY_PAGE == nFamily)
			mpView->InvalidateRulerPos();

		if( bNew )
			mxBasePool->Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *xTmp.get() ) );

		mpDoc->SetModified();
		if( !bModified )		// Bug 57028
        {
            mpDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
        }
		GetWrtShell()->EndAllAction();
	}

	return nRet;
}

/*--------------------------------------------------------------------
	Beschreibung:	Delete
 --------------------------------------------------------------------*/


sal_uInt16 SwDocShell::Delete(const String &rName, sal_uInt16 nFamily)
{
	SfxStyleSheetBase *pStyle = mxBasePool->Find(rName, (SfxStyleFamily)nFamily);

	if(pStyle)
	{
		ASSERT(GetWrtShell(), "Keine Shell, keine Styles");

		GetWrtShell()->StartAllAction();
		mxBasePool->Remove(pStyle);
		GetWrtShell()->EndAllAction();

		return sal_True;
	}
	return sal_False;
}

/*--------------------------------------------------------------------
	Beschreibung:	Vorlage anwenden
 --------------------------------------------------------------------*/


sal_uInt16 SwDocShell::ApplyStyles(
    const String &rName,
    const sal_uInt16 nFamily,
    SwWrtShell* pShell,
    const sal_uInt16 nMode )
{
    SwDocStyleSheet* pStyle = (SwDocStyleSheet*) mxBasePool->Find( rName, (SfxStyleFamily) nFamily );

    ASSERT( pStyle, "Wo ist der StyleSheet" );
    if ( !pStyle )
        return sal_False;

    SwWrtShell *pSh = pShell ? pShell : GetWrtShell();

    ASSERT( pSh, "Keine Shell, keine Styles" );

    pSh->StartAllAction();

    switch (nFamily)
    {
    case SFX_STYLE_FAMILY_CHAR:
    {
        SwFmtCharFmt aFmt( pStyle->GetCharFmt() );
        pSh->SetAttrItem( aFmt, ( nMode & KEY_SHIFT ) ? nsSetAttrMode::SETATTR_DONTREPLACE : nsSetAttrMode::SETATTR_DEFAULT );
        break;
    }
    case SFX_STYLE_FAMILY_PARA:
    {
        // clear also list attributes at affected text nodes, if paragraph style has the list style attribute set.
        pSh->SetTxtFmtColl( pStyle->GetCollection(), true );
        break;
    }
    case SFX_STYLE_FAMILY_FRAME:
    {
        if ( pSh->IsFrmSelected() )
            pSh->SetFrmFmt( pStyle->GetFrmFmt() );
        break;
    }
    case SFX_STYLE_FAMILY_PAGE:
    {
        pSh->SetPageStyle( pStyle->GetPageDesc()->GetName() );
        break;
    }

    case SFX_STYLE_FAMILY_PSEUDO:
    {
        const SwNumRule* pNumRule = pStyle->GetNumRule();
        const String sListIdForStyle = pNumRule->GetDefaultListId();
        pSh->SetCurNumRule( *pNumRule, false, sListIdForStyle, true );
        break;
    }

    default:
        DBG_ERROR( "Unbekannte Familie" );
    }
    pSh->EndAllAction();

    return nFamily;
}

/*--------------------------------------------------------------------
	Beschreibung:	Giesskanne starten
 --------------------------------------------------------------------*/



sal_uInt16 SwDocShell::DoWaterCan(const String &rName, sal_uInt16 nFamily)
{
	ASSERT(GetWrtShell(), "Keine Shell, keine Styles");

	SwEditWin& rEdtWin = mpView->GetEditWin();
	SwApplyTemplate* pApply = rEdtWin.GetApplyTemplate();
	sal_Bool bWaterCan = !(pApply && pApply->eType != 0);
	if( !rName.Len() )
		bWaterCan = sal_False;
	SwApplyTemplate aTemplate;
	aTemplate.eType = nFamily;

	if(bWaterCan)
	{
		SwDocStyleSheet* pStyle =
			(SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);

		ASSERT(pStyle, "Wo ist der StyleSheet");
		if(!pStyle) return nFamily;

		switch(nFamily)
		{
			case SFX_STYLE_FAMILY_CHAR:
				aTemplate.aColl.pCharFmt = pStyle->GetCharFmt();
				break;
			case SFX_STYLE_FAMILY_PARA:
				aTemplate.aColl.pTxtColl = pStyle->GetCollection();
				break;
			case SFX_STYLE_FAMILY_FRAME:
				aTemplate.aColl.pFrmFmt = pStyle->GetFrmFmt();
				break;
			case SFX_STYLE_FAMILY_PAGE:
				aTemplate.aColl.pPageDesc = (SwPageDesc*)pStyle->GetPageDesc();
				break;
			case SFX_STYLE_FAMILY_PSEUDO:
				aTemplate.aColl.pNumRule = (SwNumRule*)pStyle->GetNumRule();
				break;

			default:
				DBG_ERROR( "Unbekannte Familie");
		}
	}
	else
		aTemplate.eType = 0;

	// Template anwenden
	mpView->GetEditWin().SetApplyTemplate(aTemplate);

	return nFamily;
}

/*--------------------------------------------------------------------
	Beschreibung:	Vorlage Updaten
 --------------------------------------------------------------------*/


sal_uInt16 SwDocShell::UpdateStyle(const String &rName, sal_uInt16 nFamily, SwWrtShell* pShell)
{
    SwWrtShell* pCurrWrtShell = pShell ? pShell : GetWrtShell();
	ASSERT(GetWrtShell(), "Keine Shell, keine Styles");

	SwDocStyleSheet* pStyle =
		(SwDocStyleSheet*)mxBasePool->Find(rName, (SfxStyleFamily)nFamily);

	if(!pStyle)
		return nFamily;

	switch(nFamily)
	{
		case SFX_STYLE_FAMILY_PARA:
		{
			SwTxtFmtColl* pColl = pStyle->GetCollection();
			if(pColl && !pColl->IsDefault())
			{
				GetWrtShell()->StartAllAction();

                SwRewriter aRewriter;
                aRewriter.AddRule(UNDO_ARG1, pColl->GetName());

                GetWrtShell()->StartUndo(UNDO_INSFMTATTR, &aRewriter);
				GetWrtShell()->FillByEx(pColl);
					// Vorlage auch anwenden, um harte Attributierung
					// zu entfernen
				GetWrtShell()->SetTxtFmtColl( pColl );
                GetWrtShell()->EndUndo();
				GetWrtShell()->EndAllAction();
			}
			break;
		}
		case SFX_STYLE_FAMILY_FRAME:
		{
			SwFrmFmt* pFrm = pStyle->GetFrmFmt();
            if( pCurrWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault() )
			{
				SfxItemSet aSet( GetPool(), aFrmFmtSetRange );
                pCurrWrtShell->StartAllAction();
                pCurrWrtShell->GetFlyFrmAttr( aSet );

                // --> OD 2009-12-28 #i105535#
                // no update of anchor attribute
                aSet.ClearItem( RES_ANCHOR );
                // <--

                pFrm->SetFmtAttr( aSet );

					// Vorlage auch anwenden, um harte Attributierung
					// zu entfernen
                pCurrWrtShell->SetFrmFmt( pFrm, sal_True );
                pCurrWrtShell->EndAllAction();
			}
		}
		break;
		case SFX_STYLE_FAMILY_CHAR:
		{
			SwCharFmt* pChar = pStyle->GetCharFmt();
			if( pChar && !pChar->IsDefault() )
			{
                pCurrWrtShell->StartAllAction();
                pCurrWrtShell->FillByEx(pChar);
					// Vorlage auch anwenden, um harte Attributierung
					// zu entfernen
                pCurrWrtShell->EndAllAction();
			}

		}
		break;
		case SFX_STYLE_FAMILY_PSEUDO:
		{
			const SwNumRule* pCurRule;
			if( pStyle->GetNumRule() &&
                0 != ( pCurRule = pCurrWrtShell->GetNumRuleAtCurrCrsrPos() ))
			{
				SwNumRule aRule( *pCurRule );
                // --> OD 2008-07-08 #i91400#
                aRule.SetName( pStyle->GetNumRule()->GetName(),
                               *(pCurrWrtShell->GetDoc()) );
                // <--
                pCurrWrtShell->ChgNumRuleFmts( aRule );
			}
		}
		break;
	}
	return nFamily;
}

/*--------------------------------------------------------------------
	Beschreibung:	NewByExample
 --------------------------------------------------------------------*/


sal_uInt16 SwDocShell::MakeByExample( const String &rName, sal_uInt16 nFamily,
									sal_uInt16 nMask, SwWrtShell* pShell )
{
    SwWrtShell* pCurrWrtShell = pShell ? pShell : GetWrtShell();
	SwDocStyleSheet* pStyle = (SwDocStyleSheet*)mxBasePool->Find(
											rName, (SfxStyleFamily)nFamily );
	if(!pStyle)
	{
		// JP 07.07.95: behalte die akt. Maske vom PI bei, dadurch werden
		//				neue sofort in den sichtbaren Bereich einsortiert
		if( SFXSTYLEBIT_ALL == nMask || SFXSTYLEBIT_USED == nMask )
			nMask = SFXSTYLEBIT_USERDEF;
		else
			nMask |= SFXSTYLEBIT_USERDEF;

		pStyle = (SwDocStyleSheet*)&mxBasePool->Make(rName,
								(SfxStyleFamily)nFamily, nMask );
	}

	switch(nFamily)
	{
		case  SFX_STYLE_FAMILY_PARA:
		{
			SwTxtFmtColl* pColl = pStyle->GetCollection();
			if(pColl && !pColl->IsDefault())
			{
                pCurrWrtShell->StartAllAction();
                pCurrWrtShell->FillByEx(pColl);
					// Vorlage auch anwenden, um harte Attributierung
					// zu entfernen
                pColl->SetDerivedFrom(pCurrWrtShell->GetCurTxtFmtColl());

					// setze die Maske noch an der Collection:
				sal_uInt16 nId = pColl->GetPoolFmtId() & 0x87ff;
				switch( nMask & 0x0fff )
				{
				case SWSTYLEBIT_TEXT:
					nId |= COLL_TEXT_BITS;
					break;
				case SWSTYLEBIT_CHAPTER:
					nId |= COLL_DOC_BITS;
					break;
				case SWSTYLEBIT_LIST:
					nId |= COLL_LISTS_BITS;
					break;
				case SWSTYLEBIT_IDX:
					nId |= COLL_REGISTER_BITS;
					break;
				case SWSTYLEBIT_EXTRA:
					nId |= COLL_EXTRA_BITS;
					break;
				case SWSTYLEBIT_HTML:
					nId |= COLL_HTML_BITS;
					break;
				}
				pColl->SetPoolFmtId(nId);

                pCurrWrtShell->SetTxtFmtColl(pColl);
                pCurrWrtShell->EndAllAction();
			}
		}
		break;
		case SFX_STYLE_FAMILY_FRAME:
		{
			SwFrmFmt* pFrm = pStyle->GetFrmFmt();
            if(pCurrWrtShell->IsFrmSelected() && pFrm && !pFrm->IsDefault())
			{
                pCurrWrtShell->StartAllAction();

				SfxItemSet aSet(GetPool(), aFrmFmtSetRange );
                pCurrWrtShell->GetFlyFrmAttr( aSet );

                SwFrmFmt* pFFmt = pCurrWrtShell->GetCurFrmFmt();
                pFrm->SetDerivedFrom( pFFmt );

				// JP 10.06.98: nur automatische Orientierungen uebernehmen
/*				#61359# jetzt auch wieder alle Orientierungen
				const SfxPoolItem* pItem;
				if( SFX_ITEM_SET == aSet.GetItemState( RES_VERT_ORIENT,
					sal_False, &pItem ) &&
                    text::VertOrientation::NONE == ((SwFmtVertOrient*)pItem)->GetVertOrient())
					aSet.ClearItem( RES_VERT_ORIENT );

				if( SFX_ITEM_SET == aSet.GetItemState( RES_HORI_ORIENT,
					sal_False, &pItem ) &&
                    text::HoriOrientation::NONE == ((SwFmtHoriOrient*)pItem)->GetHoriOrient())
					aSet.ClearItem( RES_HORI_ORIENT );
 */

                pFrm->SetFmtAttr( aSet );
					// Vorlage auch anwenden, um harte Attributierung
					// zu entfernen
                pCurrWrtShell->SetFrmFmt( pFrm );
                pCurrWrtShell->EndAllAction();
			}
		}
		break;
		case SFX_STYLE_FAMILY_CHAR:
		{
			SwCharFmt* pChar = pStyle->GetCharFmt();
			if(pChar && !pChar->IsDefault())
			{
                pCurrWrtShell->StartAllAction();
                pCurrWrtShell->FillByEx( pChar );
                pChar->SetDerivedFrom( pCurrWrtShell->GetCurCharFmt() );
				SwFmtCharFmt aFmt( pChar );
                pCurrWrtShell->SetAttrItem( aFmt );
                pCurrWrtShell->EndAllAction();
			}
		}
		break;

		case SFX_STYLE_FAMILY_PAGE:
		{
            pCurrWrtShell->StartAllAction();
            sal_uInt16 nPgDsc = pCurrWrtShell->GetCurPageDesc();
            SwPageDesc& rSrc = (SwPageDesc&)pCurrWrtShell->GetPageDesc( nPgDsc );
			SwPageDesc& rDest = *(SwPageDesc*)pStyle->GetPageDesc();

			sal_uInt16 nPoolId = rDest.GetPoolFmtId();
			sal_uInt16 nHId = rDest.GetPoolHelpId();
			sal_uInt8 nHFId = rDest.GetPoolHlpFileId();

            pCurrWrtShell->GetDoc()->CopyPageDesc( rSrc, rDest );

			// PoolId darf NIE kopiert werden!
			rDest.SetPoolFmtId( nPoolId );
			rDest.SetPoolHelpId( nHId );
			rDest.SetPoolHlpFileId( nHFId );

			// werden Kopf-/Fusszeilen angelegt, so gibt es kein Undo mehr!
            pCurrWrtShell->GetDoc()->GetIDocumentUndoRedo().DelAllUndoObj();

            pCurrWrtShell->EndAllAction();
		}
		break;

		case SFX_STYLE_FAMILY_PSEUDO:
		{
            pCurrWrtShell->StartAllAction();

            SwNumRule aRule( *pCurrWrtShell->GetNumRuleAtCurrCrsrPos() );
			String sOrigRule( aRule.GetName() );
            // --> OD 2008-07-08 #i91400#
            aRule.SetName( pStyle->GetNumRule()->GetName(),
                           *(pCurrWrtShell->GetDoc()) );
            // <--
            pCurrWrtShell->ChgNumRuleFmts( aRule );

            pCurrWrtShell->ReplaceNumRule( sOrigRule, aRule.GetName() );


            pCurrWrtShell->EndAllAction();
		}
		break;
	}
	return nFamily;
}

void  SwDocShell::LoadStyles( SfxObjectShell& rSource )
{
    _LoadStyles(rSource, sal_False);
}
/* -----------------16.05.2003 15:45-----------------
    bPreserveCurrentDocument determines whether SetFixFields() is called
    This call modifies the source document. This mustn't happen when the source
    is a document the user is working on.
    Calls of ::LoadStyles() normally use files especially loaded for the purpose
    of importing styles.
 --------------------------------------------------*/
void SwDocShell::_LoadStyles( SfxObjectShell& rSource, sal_Bool bPreserveCurrentDocument )
{
/*	[Beschreibung]

	Diese Methode wird vom SFx gerufen, wenn aus einer Dokument-Vorlage
	Styles nachgeladen werden sollen. Bestehende Styles soll dabei
	"uberschrieben werden. Das Dokument mu"s daher neu formatiert werden.
	Daher werden die Applikationen in der Regel diese Methode "uberladen
	und in ihrer Implementierung die Implementierung der Basisklasse
	rufen.
*/
	// ist die Source unser Document, dann uebernehmen wir das
	// abpruefen selbst (wesentlich schneller und laeuft nicht ueber
	// die Kruecke SfxStylePool
	if( rSource.ISA( SwDocShell ))
	{
		//JP 28.05.99: damit die Kopf-/Fusszeilen nicht den fixen Inhalt
		// 				der Vorlage erhalten, einmal alle FixFelder der
		//				Source aktualisieren
        if(!bPreserveCurrentDocument)
            ((SwDocShell&)rSource).mpDoc->SetFixFields(false, NULL);
		if( mpWrtShell )
		{
			mpWrtShell->StartAllAction();
			mpDoc->ReplaceStyles( *((SwDocShell&)rSource).mpDoc );
			mpWrtShell->EndAllAction();
		}
		else
		{
			sal_Bool bModified = mpDoc->IsModified();
			mpDoc->ReplaceStyles( *((SwDocShell&)rSource).mpDoc );
			if( !bModified && mpDoc->IsModified() && !mpView )
			{
				// die View wird spaeter angelegt, ueberschreibt aber das
				// Modify-Flag. Per Undo ist sowieso nichts mehr zu machen
                mpDoc->GetIDocumentUndoRedo().SetUndoNoResetModified();
            }
        }
    }
	else
		SfxObjectShell::LoadStyles( rSource );
}


void SwDocShell::FormatPage(
    const String& rPage,
    const sal_uInt16 nSlot,
    SwWrtShell& rActShell )
{
    Edit( rPage, aEmptyStr, SFX_STYLE_FAMILY_PAGE, 0, sal_False, nSlot, &rActShell);
}

Bitmap SwDocShell::GetStyleFamilyBitmap( SfxStyleFamily eFamily, BmpColorMode eColorMode )
{
	if( SFX_STYLE_FAMILY_PSEUDO == eFamily )
	{
		if ( eColorMode == BMP_COLOR_NORMAL )
			return Bitmap( SW_RES( BMP_STYLES_FAMILY_NUM ));
		else
			return Bitmap( SW_RES( BMP_STYLES_FAMILY_NUM_HC ));
	}

	return SfxObjectShell::GetStyleFamilyBitmap( eFamily, eColorMode );
}
