/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


#ifndef _DOCSTYLE_HXX
#define _DOCSTYLE_HXX

#include <rtl/ref.hxx>

#ifndef _SVSTDARR_HXX
#define _SVSTDARR_STRINGSDTOR
#include <svl/svstdarr.hxx>
#endif
#include <svl/style.hxx>
#include <svl/itemset.hxx>
#include "swdllapi.h"

class SwDoc;
class SwDocStyleSheetPool;
class SwPageDesc;
class SwCharFmt;
class SwTxtFmtColl;
class SwFrmFmt;
class SwNumRule;

/*--------------------------------------------------------------------
	Beschreibung:	Lokale Hilfsklasse
 --------------------------------------------------------------------*/
class SwPoolFmtList : public SvStringsDtor
{
public:
	SwPoolFmtList() {}
	void Append( char cChar, const String& rStr );
	void Erase();
};


/*--------------------------------------------------------------------
	Beschreibung:	temp. StyleSheet
 --------------------------------------------------------------------*/
class SW_DLLPUBLIC SwDocStyleSheet : public SfxStyleSheetBase
{
	friend class SwDocStyleSheetPool;
	friend class SwStyleSheetIterator;

	SwCharFmt*			pCharFmt;
	SwTxtFmtColl* 		pColl;
	SwFrmFmt* 			pFrmFmt;
	const SwPageDesc* 	pDesc;
	const SwNumRule*	pNumRule;

	SwDoc&				rDoc;
	SfxItemSet			aCoreSet;

	sal_Bool 				bPhysical;


	// leere Huelse zum richtigen StyleSheet (Core) machen
	SW_DLLPRIVATE void				Create();

	// den StyleSheet mit Daten fuellen
	enum FillStyleType {
		FillOnlyName,
		FillAllInfo,
		FillPhysical
	};

	SW_DLLPRIVATE sal_Bool FillStyleSheet( FillStyleType eFType );

protected:
	virtual ~SwDocStyleSheet();

public:
	SwDocStyleSheet( SwDoc& 				rDoc,
					 const String& 			rName,
					 SwDocStyleSheetPool& 	rPool,
					 SfxStyleFamily 		eFam,
					 sal_uInt16 				nMask);

	SwDocStyleSheet( const SwDocStyleSheet& );

	void					Reset();

	void 					SetMask(sal_uInt16 nMsk)			{ nMask = nMsk;   	}
	void 					SetFamily(SfxStyleFamily eFam)	{ nFamily = eFam;	}

	sal_Bool		   			IsPhysical() const				{ return bPhysical; }
	void					SetPhysical(sal_Bool bPhys);

    // --> OD 2008-02-11 #newlistlevelattrs#
    // add optional parameter <bResetIndentAttrsAtParagraphStyle>, default value sal_False,
    // which indicates that the indent attributes at a paragraph style should
    // be reset in case that a list style is applied to the paragraph style and
    // no indent attributes are applied.
    void                    SetItemSet( const SfxItemSet& rSet,
                                        const bool bResetIndentAttrsAtParagraphStyle = false );
    // <--

	virtual SfxItemSet& 	GetItemSet();
    // --> OD 2008-02-12 #newlistlevelattrs#
    // new method for paragraph styles to merge indent attributes of applied list
    // style into the given item set, if the list style indent attributes are applicable.
    void MergeIndentAttrsOfListStyle( SfxItemSet& rSet );
    // <--
	virtual const String& 	GetParent() const;
	virtual const String& 	GetFollow() const;

	virtual sal_uLong GetHelpId( String& rFile );
	virtual void SetHelpId( const String& r, sal_uLong nId );

	// Vorbelegen der member ohne physikalischen Zugriff
	// wird vom StyleSheetPool benutzt
	//
	void			  		PresetName(const String& rName)  { aName   = rName; }
	void			  		PresetNameAndFamily(const String& rName);
	void					PresetParent(const String& rName){ aParent = rName; }
	void					PresetFollow(const String& rName){ aFollow = rName; }

	virtual sal_Bool 			SetName( const String& rStr);
	virtual sal_Bool 			SetParent( const String& rStr);
	virtual sal_Bool 			SetFollow( const String& rStr);

	virtual sal_Bool 			HasFollowSupport() const;
	virtual sal_Bool 			HasParentSupport() const;
	virtual sal_Bool 			HasClearParentSupport() const;
	virtual String 			GetDescription();
	virtual String 			GetDescription(SfxMapUnit eUnit);

	SwCharFmt*		   		GetCharFmt();
	SwTxtFmtColl* 			GetCollection();
	SwFrmFmt* 				GetFrmFmt();
	const SwPageDesc* 		GetPageDesc();
	const SwNumRule*		GetNumRule();
	void					SetNumRule(const SwNumRule& rRule);

	virtual sal_Bool 			IsUsed() const;
};

/*--------------------------------------------------------------------
	Beschreibung:	Iterator fuer den Pool
 --------------------------------------------------------------------*/

class SwStyleSheetIterator : public SfxStyleSheetIterator, public SfxListener
{
	rtl::Reference< SwDocStyleSheet > mxIterSheet;
	rtl::Reference< SwDocStyleSheet > mxStyleSheet;
	SwPoolFmtList 		aLst;
	sal_uInt16 				nLastPos;
	sal_Bool 				bFirstCalled;

	void				AppendStyleList(const SvStringsDtor& rLst,
										sal_Bool 	bUsed,
										sal_uInt16 	nSection,
										char	cType);

public:
	SwStyleSheetIterator( SwDocStyleSheetPool* pBase,
						  SfxStyleFamily eFam, sal_uInt16 n=0xFFFF );
	virtual ~SwStyleSheetIterator();

	virtual sal_uInt16 Count();
	virtual SfxStyleSheetBase *operator[](sal_uInt16 nIdx);
	virtual SfxStyleSheetBase* First();
	virtual SfxStyleSheetBase* Next();
	virtual SfxStyleSheetBase* Find(const UniString& rStr);

	virtual void Notify( SfxBroadcaster&, const SfxHint& );
};

/*--------------------------------------------------------------------
	Beschreibung:	Pool fuer
 --------------------------------------------------------------------*/

class SwDocStyleSheetPool : public SfxStyleSheetBasePool
{
	rtl::Reference< SwDocStyleSheet > mxStyleSheet;
	SwDoc&				rDoc;
	sal_Bool				bOrganizer : 1;		// sal_True: fuer den Organizer


	virtual SfxStyleSheetBase* Create( const String&, SfxStyleFamily, sal_uInt16 nMask);
	virtual SfxStyleSheetBase* Create( const SfxStyleSheetBase& );

    using SfxStyleSheetBasePool::Find;

public:
	SwDocStyleSheetPool( SwDoc&, sal_Bool bOrganizer = sal_False );

	virtual void Replace( SfxStyleSheetBase& rSource,
						  SfxStyleSheetBase& rTarget );
	virtual SfxStyleSheetBase& Make(const String&, SfxStyleFamily, sal_uInt16 nMask, sal_uInt16 nPos = 0xffff);

	virtual SfxStyleSheetBase* Find( const String&, SfxStyleFamily eFam,
									sal_uInt16 n=0xFFFF );

	virtual sal_Bool SetParent( SfxStyleFamily eFam, const String &rStyle,
							const String &rParent );

	virtual void Remove( SfxStyleSheetBase* pStyle);

	void	SetOrganizerMode( sal_Bool bMode )	{ bOrganizer = bMode; }
	sal_Bool 	IsOrganizerMode() const 		{ return bOrganizer; }

	virtual SfxStyleSheetIteratorPtr CreateIterator( SfxStyleFamily, sal_uInt16 nMask );

	SwDoc& GetDoc() const { return rDoc; }

	void dispose();

    virtual void SAL_CALL acquire(  ) throw ();
    virtual void SAL_CALL release(  ) throw ();

protected:
	virtual ~SwDocStyleSheetPool();

	//Fuer die daemlicheren Compiler
private:
	SwDocStyleSheetPool( const SwDocStyleSheetPool& );
};


#endif
