/**************************************************************
 * 
 * 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 _MODOPT_HXX
#define _MODOPT_HXX

#include <tools/string.hxx>
#include <tools/wintypes.hxx>
#include <vcl/field.hxx>
#include <svl/svarray.hxx>
#include <unotools/configitem.hxx>
#include "swdllapi.h"
#include "authratr.hxx"
#include <SwCapObjType.hxx>
#include "tblenum.hxx"
#include "itabenum.hxx"
#include <tools/globname.hxx>
class SwModuleOptions;

//-----------------------------------------------------------------------------
class InsCaptionOpt;
typedef InsCaptionOpt* InsCaptionOptPtr;
SV_DECL_PTRARR_SORT_DEL(InsCapOptArr, InsCaptionOptPtr, 0, 5)

class InsCaptionOptArr : public InsCapOptArr
{
	friend class SwModuleOptions;
	friend class SwInsertConfig;
protected:
	InsCaptionOpt* Find(const SwCapObjType eType, const SvGlobalName *pOleId = 0) const;
};

/* -----------------------------10.10.00 16:14--------------------------------

 ---------------------------------------------------------------------------*/
class SwRevisionConfig : public utl::ConfigItem
{
	friend class SwModuleOptions;

	AuthorCharAttr	aInsertAttr;	//Revision/TextDisplay/Insert/Attribute  // Redlining: Author-Zeichenattribute
									//Revision/TextDisplay/Insert/Color
	AuthorCharAttr	aDeletedAttr;	//Revision/TextDisplay/Delete/Attribute
									//Revision/TextDisplay/Delete/Color
	AuthorCharAttr	aFormatAttr;    //Revision/TextDisplay/ChangeAttribute/Attribute
									//Revision/TextDisplay/ChangeAttribute/Color
	sal_uInt16			nMarkAlign;		//Revision/LinesChanged/Mark
	Color			aMarkColor;     //Revision/LinesChanged/Color

	const com::sun::star::uno::Sequence<rtl::OUString>& GetPropertyNames();
	public:
		SwRevisionConfig();
		~SwRevisionConfig();

	virtual void			Commit();
	virtual void Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
	void					Load();
	void 					SetModified(){ConfigItem::SetModified();}
};
/* -----------------------------11.10.00 09:00--------------------------------

 ---------------------------------------------------------------------------*/
class SwInsertConfig : public utl::ConfigItem
{
	friend class SwModuleOptions;

	InsCaptionOptArr* 	pCapOptions;
	InsCaptionOpt* 		pOLEMiscOpt;

	SvGlobalName		aGlobalNames[5];

	sal_Bool 			bInsWithCaption;	   //Insert/Caption/Automatic	// Objekte beschriftet einfuegen
    sal_Bool            bCaptionOrderNumberingFirst; //#i61007# caption order starting with numbering
//	sal_uInt16			nInsTblFlags;			//Insert/Table/Header	 	// Flags fuer Tabellen einfuegen
												//Insert/Table/RepeatHeader
												//Insert/Table/Split
												//Insert/Table/Border
	SwInsertTableOptions	aInsTblOpts;
	sal_Bool 			bIsWeb;

	const com::sun::star::uno::Sequence<rtl::OUString>& GetPropertyNames();
	public:
		SwInsertConfig(sal_Bool bWeb);
		~SwInsertConfig();

	virtual void			Commit();
	virtual void Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
	void					Load();
	void 					SetModified(){ConfigItem::SetModified();}
};
/* -----------------------------11.10.00 09:00--------------------------------

 ---------------------------------------------------------------------------*/
class SwTableConfig : public utl::ConfigItem
{
	friend class SwModuleOptions;

	sal_uInt16		nTblHMove;  		//int Table/Shift/Row
	sal_uInt16 		nTblVMove;          //int Table/Shift/Column
	sal_uInt16 		nTblHInsert;        //int Table/Insert/Row
	sal_uInt16		nTblVInsert;        //int Table/Insert/Column
	TblChgMode	eTblChgMode;    	//int Table/Change/Effect

	sal_Bool	bInsTblFormatNum;		// Table/Input/NumberRecognition 		// Automatische Zahlenerkennung
	sal_Bool	bInsTblChangeNumFormat; // Table/Input/NumberFormatRecognition 	// Automatische Zahlenformaterkennung
	sal_Bool	bInsTblAlignNum;		// Table/Input/Alignment				// Zahlen ausrichten

	const com::sun::star::uno::Sequence<rtl::OUString>& GetPropertyNames();
	public:
		SwTableConfig(sal_Bool bWeb);
		~SwTableConfig();

	virtual void			Commit();
	virtual void Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
	void					Load();
	void 					SetModified(){ConfigItem::SetModified();}
};
/* -----------------------------18.01.01 16:57--------------------------------

 ---------------------------------------------------------------------------*/
class SwMiscConfig : public utl::ConfigItem
{
	friend class SwModuleOptions;

	String		sWordDelimiter;				// Statistics/WordNumber/Delimiter
	sal_Bool		bDefaultFontsInCurrDocOnly; // DefaultFont/Document
	sal_Bool 		bShowIndexPreview ;  		// Index/ShowPreview
	sal_Bool		bGrfToGalleryAsLnk; 		// Misc/GraphicToGalleryAsLink
	sal_Bool		bNumAlignSize;				// Numbering/Graphic/KeepRatio
	sal_Bool		bSinglePrintJob;			// FormLetter/PrintOutput/SinglePrintJobs
	sal_Bool		bIsNameFromColumn;          // FormLetter/FileOutput/FileName/Generation
    sal_Bool        bAskForMailMergeInPrint;    // Ask if documents containing fields should be 'mailmerged'
	sal_Int16	nMailingFormats;			// FormLetter/MailingOutput/Formats
	String		sNameFromColumn;			// FormLetter/FileOutput/FileName/FromDatabaseField (string!)
	String		sMailingPath;				// FormLetter/FileOutput/Path
	String		sMailName;					// FormLetter/FileOutput/FileName/FromManualSetting (string!)

	const com::sun::star::uno::Sequence<rtl::OUString>& GetPropertyNames();
	public:
		SwMiscConfig();
		~SwMiscConfig();

	virtual void			Commit();
	virtual void Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames );
	void					Load();
	void 					SetModified(){ConfigItem::SetModified();}
};

/* ---------------------------------------------------------------------------

 ---------------------------------------------------------------------------*/
class SW_DLLPUBLIC SwModuleOptions
{
	SwRevisionConfig 				aRevisionConfig;
	SwInsertConfig					aInsertConfig;
	SwInsertConfig					aWebInsertConfig;

	SwTableConfig					aTableConfig;
	SwTableConfig					aWebTableConfig;

	SwMiscConfig					aMiscConfig;

	//fiscus: don't show tips of text fields - it's not part of the configuration!
	sal_Bool 		bHideFieldTips : 1;

public:
	SwModuleOptions();

	TblChgMode	GetTblMode() const { return aTableConfig.eTblChgMode;}
	void		SetTblMode( TblChgMode  eSet ) { aTableConfig.eTblChgMode = eSet;
												aTableConfig.SetModified();}

	sal_uInt16		GetTblHMove() const { return aTableConfig.nTblHMove;}
	void		SetTblHMove( sal_uInt16 nSet ) { 	aTableConfig.nTblHMove = nSet;
												aTableConfig.SetModified();}

	sal_uInt16 		GetTblVMove() const { return aTableConfig.nTblVMove;}
	void 		SetTblVMove( sal_uInt16 nSet ) { 	aTableConfig.nTblVMove = nSet;
												aTableConfig.SetModified();}

	sal_uInt16 		GetTblHInsert() const {return aTableConfig.nTblHInsert;}
	void 		SetTblHInsert( sal_uInt16 nSet ) {	aTableConfig.nTblHInsert = nSet;
												aTableConfig.SetModified();}

	sal_uInt16		GetTblVInsert() const {return aTableConfig.nTblVInsert;}
	void 		SetTblVInsert( sal_uInt16 nSet ) {	aTableConfig.nTblVInsert = nSet;
												aTableConfig.SetModified();}

	const AuthorCharAttr	&GetInsertAuthorAttr() const { return aRevisionConfig.aInsertAttr; }
	void 		SetInsertAuthorAttr( AuthorCharAttr &rAttr ) {	aRevisionConfig.aInsertAttr = rAttr;
																aRevisionConfig.SetModified();}

	const AuthorCharAttr	&GetDeletedAuthorAttr() const { return aRevisionConfig.aDeletedAttr; }
	void 		SetDeletedAuthorAttr( AuthorCharAttr &rAttr ) {	aRevisionConfig.aDeletedAttr = rAttr;
																aRevisionConfig.SetModified();}

	const AuthorCharAttr	&GetFormatAuthorAttr() const { return aRevisionConfig.aFormatAttr; }
	void 		SetFormatAuthorAttr( AuthorCharAttr &rAttr ) {	aRevisionConfig.aFormatAttr = rAttr;
																aRevisionConfig.SetModified();}

	sal_uInt16			GetMarkAlignMode()	const				{ return aRevisionConfig.nMarkAlign; }
	void			SetMarkAlignMode(sal_uInt16 nMode)			{ aRevisionConfig.nMarkAlign = nMode;
															  aRevisionConfig.SetModified();}

	const Color&	GetMarkAlignColor()	const				{ return aRevisionConfig.aMarkColor; }
	void 			SetMarkAlignColor(const Color &rColor)	{ aRevisionConfig.aMarkColor = rColor;
															  aRevisionConfig.SetModified();}

	sal_Bool		IsInsWithCaption(sal_Bool bHTML) const
						{ return bHTML ? sal_False : aInsertConfig.bInsWithCaption; }
	void		SetInsWithCaption( sal_Bool bHTML, sal_Bool b )
					{ 	if(!bHTML)
							aInsertConfig.bInsWithCaption = b;
						aInsertConfig.SetModified();}

    sal_Bool    IsCaptionOrderNumberingFirst() const { return aInsertConfig.bCaptionOrderNumberingFirst; }
    void        SetCaptionOrderNumberingFirst( sal_Bool bSet ) 
                { 
                    if(aInsertConfig.bCaptionOrderNumberingFirst != bSet)
                    {
                        aInsertConfig.bCaptionOrderNumberingFirst = bSet; 
                        aInsertConfig.SetModified();
                    }
                }

	sal_Bool		IsInsTblFormatNum(sal_Bool bHTML) const
					{ return bHTML ? aWebTableConfig.bInsTblFormatNum : aTableConfig.bInsTblFormatNum; }
	void		SetInsTblFormatNum( sal_Bool bHTML, sal_Bool b )
					{ bHTML ? (aWebTableConfig.bInsTblFormatNum = b) : (aTableConfig.bInsTblFormatNum = b);
					  bHTML ? aWebTableConfig.SetModified() : aTableConfig.SetModified();}

	sal_Bool		IsInsTblChangeNumFormat(sal_Bool bHTML) const
					{ return bHTML ? aWebTableConfig.bInsTblChangeNumFormat : aTableConfig.bInsTblChangeNumFormat; }
	void		SetInsTblChangeNumFormat( sal_Bool bHTML, sal_Bool b )
					{ bHTML ? (aWebTableConfig.bInsTblChangeNumFormat = b) : (aTableConfig.bInsTblChangeNumFormat = b);
					  bHTML ? aWebTableConfig.SetModified() : aTableConfig.SetModified();}


	sal_Bool		IsInsTblAlignNum(sal_Bool bHTML) const
					{ return bHTML ? aWebTableConfig.bInsTblAlignNum : aTableConfig.bInsTblAlignNum; }
	void		SetInsTblAlignNum( sal_Bool bHTML, sal_Bool b )
					{ bHTML ? (aWebTableConfig.bInsTblAlignNum = b) : (aTableConfig.bInsTblAlignNum = b);
						bHTML ? aWebTableConfig.SetModified() : aTableConfig.SetModified();;}

	SwInsertTableOptions GetInsTblFlags(sal_Bool bHTML) const
					{ return bHTML ? aWebInsertConfig.aInsTblOpts : aInsertConfig.aInsTblOpts;}
	void		SetInsTblFlags( sal_Bool bHTML, const SwInsertTableOptions& rOpts )	{
					bHTML ? (aWebInsertConfig.aInsTblOpts = rOpts) : (aInsertConfig.aInsTblOpts = rOpts);
                    bHTML ? aWebInsertConfig.SetModified() : aInsertConfig.SetModified();}

    const InsCaptionOpt* GetCapOption(sal_Bool bHTML, const SwCapObjType eType, const SvGlobalName *pOleId);
	sal_Bool		SetCapOption(sal_Bool bHTML, const InsCaptionOpt* pOpt);


	sal_Bool		IsGrfToGalleryAsLnk() const 	{ return aMiscConfig.bGrfToGalleryAsLnk; }
	void		SetGrfToGalleryAsLnk( sal_Bool b )  { aMiscConfig.bGrfToGalleryAsLnk = b;
												  aMiscConfig.SetModified();}

	sal_Int16	GetMailingFormats() const 		{ return aMiscConfig.nMailingFormats;}
	void 		SetMailingFormats( sal_Int16 nSet )	{ aMiscConfig.nMailingFormats = nSet;
												  aMiscConfig.SetModified();}

	sal_Bool		IsSinglePrintJob() const 		{ return aMiscConfig.bSinglePrintJob; }
	void		SetSinglePrintJob( sal_Bool b )  	{ aMiscConfig.bSinglePrintJob = b;
												  aMiscConfig.SetModified();}

	sal_Bool		IsNumAlignSize() const 			{ return aMiscConfig.bNumAlignSize; }
	void		SetNumAlignSize( sal_Bool b )  		{ aMiscConfig.bNumAlignSize = b;
												  aMiscConfig.SetModified();}

	sal_Bool		IsNameFromColumn() const		{ return aMiscConfig.bIsNameFromColumn; }
    void        SetIsNameFromColumn( sal_Bool bSet )    
                        { 
                            aMiscConfig.SetModified();
                            aMiscConfig.bIsNameFromColumn = bSet;
                        }

    sal_Bool        IsAskForMailMerge() const       { return aMiscConfig.bAskForMailMergeInPrint;}
    void        SetAskForMailMerge(sal_Bool bSet)        
                    { 
                        aMiscConfig.SetModified();
                        aMiscConfig.bAskForMailMergeInPrint = bSet;
                    }
            

	const String&	GetNameFromColumn() const		{ return aMiscConfig.sNameFromColumn; }
	void			SetNameFromColumn( const String& rSet )  	{ aMiscConfig.sNameFromColumn = rSet;
												  				aMiscConfig.SetModified();}

	String		GetMailingPath() const			{ return aMiscConfig.sMailingPath; }
	void		SetMailingPath(const String& sPath)	{ aMiscConfig.sMailingPath = sPath;
													  aMiscConfig.SetModified();}

	String		GetMailName() const				{ return aMiscConfig.sMailName; }
	void		SetMailName(const String& sName){ aMiscConfig.sMailName = sName;
												  aMiscConfig.SetModified();}

	const String	&GetWordDelimiter() const			{ return aMiscConfig.sWordDelimiter; }
	void		SetWordDelimiter(const String& sDelim)	{ aMiscConfig.sWordDelimiter = sDelim;
														  aMiscConfig.SetModified();}

	//convert word delimiter from or to user interface
	static String ConvertWordDelimiter(const String& rDelim, sal_Bool bFromUI);

	sal_Bool 		IsShowIndexPreview() const {return  aMiscConfig.bShowIndexPreview;}
	void		SetShowIndexPreview(sal_Bool bSet)
					{aMiscConfig.bShowIndexPreview = bSet;
					aMiscConfig.SetModified();}

	sal_Bool		IsDefaultFontInCurrDocOnly() const { return aMiscConfig.bDefaultFontsInCurrDocOnly;}
	void 		SetDefaultFontInCurrDocOnly(sal_Bool bSet)
					{
						aMiscConfig.bDefaultFontsInCurrDocOnly = bSet;
						aMiscConfig.SetModified();
					}

	sal_Bool 		IsHideFieldTips() const {return bHideFieldTips;}
	void		SetHideFieldTips(sal_Bool bSet) {bHideFieldTips = bSet;}
};
#endif

