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

#include <svx/stddlg.hxx>

#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif

#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif

#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif

#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#include <vcl/lstbox.hxx>
#include <sfx2/tabdlg.hxx>

#include "tox.hxx"
#include <tools/list.hxx>
#include <toxmgr.hxx>
#include <svx/checklbx.hxx>
#include <tools/resary.hxx>
#include <svtools/svtreebx.hxx>
#include <vcl/menubtn.hxx>
#include <svx/langbox.hxx>
#include <cnttab.hxx>
class SwWrtShell;
class SwTOXMgr;
namespace com{namespace sun{namespace star{
    namespace text{
        class XTextSection;
        class XDocumentIndex;
    }
}}}

//-----------------------------------------------------------------------------
struct SwIndexSections_Impl
{
    com::sun::star::uno::Reference< com::sun::star::text::XTextSection >    xContainerSection;
    com::sun::star::uno::Reference< com::sun::star::text::XDocumentIndex >    xDocumentIndex;
};

//-----------------------------------------------------------------------------
class SwOneExampleFrame;
struct SwIndexSections_Impl;

class SwMultiTOXTabDialog : public SfxTabDialog
{
	Window					aExampleContainerWIN;
    Window                  aExampleWIN;
	CheckBox				aShowExampleCB;
	SwTOXMgr*				pMgr;
	SwWrtShell& 			rSh;

	SwOneExampleFrame*		pExampleFrame;

	SwTOXDescription** 		pDescArr; //
	SwForm**				pFormArr; //
	SwIndexSections_Impl**	pxIndexSectionsArr;

	SwTOXBase* 				pParamTOXBase;

	CurTOXType				eCurrentTOXType;

	String					sUserDefinedIndex;
	sal_uInt16 					nTypeCount;
	sal_uInt16					nInitialTOXType;

	sal_Bool					bEditTOX;
	sal_Bool					bExampleCreated;
	sal_Bool					bGlobalFlag;

	virtual short		Ok();
	SwTOXDescription* 	CreateTOXDescFromTOXBase(const SwTOXBase*pCurTOX);

	DECL_LINK(CreateExample_Hdl, void* );
	DECL_LINK(ShowPreviewHdl, CheckBox*);

public:
	SwMultiTOXTabDialog(Window* pParent, const SfxItemSet& rSet,
						SwWrtShell &rShell,
						SwTOXBase* pCurTOX, sal_uInt16 nToxType = USHRT_MAX,
						sal_Bool bGlobal = sal_False);
	~SwMultiTOXTabDialog();

	virtual void		PageCreated( sal_uInt16 nId, SfxTabPage &rPage );

	SwForm*				GetForm(CurTOXType eType);

	CurTOXType			GetCurrentTOXType() const { return eCurrentTOXType;}
	void				SetCurrentTOXType(CurTOXType	eSet)
								{
									eCurrentTOXType = eSet;
								}

	void				UpdateExample();
	sal_Bool				IsTOXEditMode() const { return bEditTOX;}

	SwWrtShell& 		GetWrtShell() {return rSh;}

	SwTOXDescription&	GetTOXDescription(CurTOXType eTOXTypes);
	void				CreateOrUpdateExample(
                            TOXTypes nTOXIndex, sal_uInt16 nPage = 0, sal_uInt16 nCurLevel = USHRT_MAX);

	static sal_Bool	IsNoNum(SwWrtShell& rSh, const String& rName);
};
/* -----------------14.07.99 12:17-------------------

 --------------------------------------------------*/
class IndexEntryRessource;
class IndexEntrySupplierWrapper;

class SwTOXSelectTabPage : public SfxTabPage
{
    FixedLine       aTypeTitleFL;
	FixedText		aTitleFT;
	Edit			aTitleED;
	FixedText		aTypeFT;
	ListBox			aTypeLB;
	CheckBox		aReadOnlyCB;

    FixedLine       aAreaFL;
    FixedText       aAreaFT;
    ListBox         aAreaLB;
	FixedText		aLevelFT;	//content, user
	NumericField	aLevelNF;   //content, user

	//content
    FixedLine       aCreateFromFL;  // content, user, illustration
	CheckBox		aFromHeadingsCB;
//	PushButton		aChapterDlgPB;	//#outline level,removed by zhaojianwei
	CheckBox		aAddStylesCB;
	PushButton		aAddStylesPB;
    Point           aAddStylesPosDef;
    Point           aAddStylesPosUser;
	//user
	CheckBox		aFromTablesCB;
	CheckBox		aFromFramesCB;
	CheckBox		aFromGraphicsCB;
	CheckBox		aFromOLECB;
	CheckBox		aLevelFromChapterCB;

	//illustration + table
	RadioButton		aFromCaptionsRB;
	RadioButton     aFromObjectNamesRB;

	//illustration and tables
	FixedText		aCaptionSequenceFT;
	ListBox			aCaptionSequenceLB;
	FixedText		aDisplayTypeFT;
	ListBox			aDisplayTypeLB;

	//all but illustration and table
	CheckBox		aTOXMarksCB;

	//

	//index only
	FixedLine       aIdxOptionsFL;
	CheckBox		aCollectSameCB;
	CheckBox		aUseFFCB;
	CheckBox		aUseDashCB;
	CheckBox		aCaseSensitiveCB;
	CheckBox		aInitialCapsCB;
	CheckBox		aKeyAsEntryCB;
	CheckBox		aFromFileCB;
	MenuButton		aAutoMarkPB;

	// object only
	SwOLENames		aFromNames;
	SvxCheckListBox	aFromObjCLB;
    FixedLine       aFromObjFL;

	CheckBox		aSequenceCB;
	FixedText		aBracketFT;
	ListBox			aBracketLB;
    FixedLine       aAuthorityFormatFL;

    //all
    FixedLine       aSortOptionsFL;
    FixedText       aLanguageFT;
    SvxLanguageBox  aLanguageLB;
    FixedText       aSortAlgorithmFT;
    ListBox         aSortAlgorithmLB;

    IndexEntryRessource* pIndexRes;

    Point           aCBLeftPos1;
	Point 			aCBLeftPos2;
	Point 			aCBLeftPos3;

	String			aStyleArr[MAXLEVEL];
	String 			sAutoMarkURL;
	String 			sAutoMarkType;
	String 			sAddStyleUser;
	String 			sAddStyleContent;

    const IndexEntrySupplierWrapper* pIndexEntryWrapper;

	sal_Bool 			bFirstCall;

	DECL_LINK(TOXTypeHdl, 	ListBox* );
	DECL_LINK(TOXAreaHdl, 	ListBox* );
//	DECL_LINK(ChapterHdl, 	PushButton* ); //#outline level,removed by zhaojianwei
	DECL_LINK(AddStylesHdl, PushButton* );
	DECL_LINK(MenuEnableHdl, Menu*);
	DECL_LINK(MenuExecuteHdl, Menu*);
    DECL_LINK(LanguageHdl, ListBox*);

	DECL_LINK(CheckBoxHdl, 	CheckBox*	);
	DECL_LINK(RadioButtonHdl, RadioButton* );
	DECL_LINK(ModifyHdl, void*);

  	void	ApplyTOXDescription();
	void 	FillTOXDescription();
    
    using SfxTabPage::ActivatePage;
    using SfxTabPage::DeactivatePage;

public:
	SwTOXSelectTabPage(Window* pParent, const SfxItemSet& rAttrSet);
	~SwTOXSelectTabPage();

	virtual sal_Bool		FillItemSet( SfxItemSet& );
	virtual void		Reset( const SfxItemSet& );

    virtual void		ActivatePage( const SfxItemSet& );
	virtual int			DeactivatePage( SfxItemSet* pSet = 0 );

	static SfxTabPage*	Create( Window* pParent,
								const SfxItemSet& rAttrSet);

	void				SelectType(TOXTypes eSet); 	//preset TOXType, GlobalDoc
	void				SetWrtShell(SwWrtShell& rSh);
};
/* -----------------16.06.99 08:33-------------------

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

DECLARE_LIST(TOXControlList, Control*)

class SwTOXEdit;
class SwTOXButton;
class SwTOXEntryTabPage;

class SwTokenWindow : public Window
{
	ImageButton 	aLeftScrollWin;
	Window			aCtrlParentWin;
	ImageButton 	aRightScrollWin;
	TOXControlList 	aControlList;
	SwForm* 		pForm;
	sal_uInt16 			nLevel;
	sal_Bool			bValid;
	String 			aButtonTexts[TOKEN_END]; // Text of the buttons
	String 			aButtonHelpTexts[TOKEN_END]; // QuickHelpText of the buttons
	String 			sCharStyle;
	Link			aButtonSelectedHdl;
	Control*		pActiveCtrl;
	Link			aModifyHdl;
	String 	 	accessibleName;
	String		sAdditionalAccnameString1;
	String		sAdditionalAccnameString2;
	String		sAdditionalAccnameString3;

	SwTOXEntryTabPage*	m_pParent;

	DECL_LINK(EditResize, Edit*);
	DECL_LINK(NextItemHdl, SwTOXEdit* );
	DECL_LINK(TbxFocusHdl, SwTOXEdit* );
	DECL_LINK(NextItemBtnHdl, SwTOXButton* );
	DECL_LINK(TbxFocusBtnHdl, SwTOXButton* );
	DECL_LINK(ScrollHdl, ImageButton* );

	void	SetActiveControl(Control* pSet);

	Control*	InsertItem(const String& rText, const SwFormToken& aToken);
	void		AdjustPositions();
	void 		AdjustScrolling();
	void 		MoveControls(long nOffset);

public:
	SwTokenWindow(SwTOXEntryTabPage* pParent, const ResId& rResId);
	~SwTokenWindow();

	void		SetForm(SwForm& rForm, sal_uInt16 nLevel);
	sal_uInt16 		GetLastLevel()const {return nLevel;};

	sal_Bool		IsValid() const {return bValid;}

	void		SetInvalid() {bValid = sal_False;}

	String		GetPattern() const;

	void		SetButtonSelectedHdl(const Link& rLink)
				{ aButtonSelectedHdl = rLink;}

	void		SetModifyHdl(const Link& rLink){aModifyHdl = rLink;}

	Control*	GetActiveControl()
					{ return pActiveCtrl;}

	void		InsertAtSelection(const String& rText, const SwFormToken& aToken);
	void		RemoveControl(SwTOXButton* pDel, sal_Bool bInternalCall = sal_False);

	sal_Bool 		Contains(FormTokenType) const;

	sal_Bool		DetermineLinkStart();

	//helper for pattern buttons and edits
	sal_Bool 		CreateQuickHelp(Control* pCtrl,
					const SwFormToken& rToken, const HelpEvent& );

	virtual void		Resize();
    virtual void        GetFocus();
	void SetFocus2theAllBtn();
private:	
	sal_uInt32 GetControlIndex(FormTokenType eType, const Control* pCurControl) const;
};
/* -----------------------------23.12.99 14:16--------------------------------

 ---------------------------------------------------------------------------*/
class SwTOXEntryTabPage;
class SwIdxTreeListBox : public SvTreeListBox
{
	SwTOXEntryTabPage* pParent;

	virtual void    RequestHelp( const HelpEvent& rHEvt );
public:
	SwIdxTreeListBox(SwTOXEntryTabPage* pPar, const ResId& rResId);
};

/* -----------------16.06.99 12:49-------------------

 --------------------------------------------------*/
class SwTOXEntryTabPage : public SfxTabPage
{
    FixedText           aLevelFT;
    SwIdxTreeListBox    aLevelLB;

	FixedLine       aEntryFL;
    FixedText       aTokenFT;
    SwTokenWindow   aTokenWIN;
	PushButton		aAllLevelsPB;

	PushButton		aEntryNoPB;
	PushButton		aEntryPB;
	PushButton 		aTabPB;
	PushButton		aChapterInfoPB;
	PushButton		aPageNoPB;
	PushButton		aHyperLinkPB;

	ListBox			aAuthFieldsLB;
	PushButton 		aAuthInsertPB;
	PushButton 		aAuthRemovePB;

	FixedText		aCharStyleFT;
	ListBox			aCharStyleLB;		// character style of the current token
	PushButton		aEditStylePB;

	FixedText		aChapterEntryFT;
	ListBox			aChapterEntryLB;	// type of chapter info

	FixedText		aNumberFormatFT;
	ListBox			aNumberFormatLB;    //!< format for numbering (E#)

	FixedText		aEntryOutlineLevelFT;    //!< Fixed text, for i53420
	NumericField	aEntryOutlineLevelNF;   //!< level to evaluate outline level to, for i53420
	FixedText		aFillCharFT;
	ComboBox		aFillCharCB;		// fill char for tab stop
	FixedText		aTabPosFT;
	MetricField		aTabPosMF;			// tab stop position
	CheckBox		aAutoRightCB;
	FixedLine       aFormatFL;

	CheckBox		aRelToStyleCB;		// position relative to the right margin of the para style
	FixedText		aMainEntryStyleFT;
	ListBox 		aMainEntryStyleLB;	// character style of main entries in indexes
	CheckBox		aAlphaDelimCB;
	CheckBox		aCommaSeparatedCB;

	RadioButton		aSortDocPosRB;
	RadioButton		aSortContentRB;
    FixedLine       aSortingFL;

	FixedText			aFirstKeyFT;
	ListBox				aFirstKeyLB;
	ImageRadioButton    aFirstSortUpRB;
	ImageRadioButton    aFirstSortDownRB;

	FixedText			aSecondKeyFT;
	ListBox				aSecondKeyLB;
	ImageRadioButton    aSecondSortUpRB;
	ImageRadioButton    aSecondSortDownRB;

	FixedText 			aThirdKeyFT;
	ListBox 			aThirdKeyLB;
	ImageRadioButton    aThirdSortUpRB;
	ImageRadioButton    aThirdSortDownRB;

    FixedLine       aSortKeyFL;

	String 			sDelimStr;
	String 			sLevelStr;
	String			sAuthTypeStr;

	String 			sNoCharStyle;
	String 			sNoCharSortKey;
	Point 			aButtonPositions[5];
    SwForm*         m_pCurrentForm;

	Point 			aRelToStylePos;
	Point 			aRelToStyleIdxPos;
    Size            aLevelFLSize;

	CurTOXType  	aLastTOXType;
	sal_Bool 			bInLevelHdl;

    Point           aChapterEntryFTPosition; //!< holds position of ChapterEntryFT control,
                                             //to be used in moving the element among different tokens
    Point           aEntryOutlineLevelFTPosition;//!< holds position ofrEntryOutlineLevelFT control
    sal_Int32       nBiasToEntryPoint;

	DECL_LINK(StyleSelectHdl, ListBox*);
	DECL_LINK(EditStyleHdl, PushButton*);
	DECL_LINK(InsertTokenHdl, PushButton*);
	DECL_LINK(LevelHdl, SvTreeListBox*);
	DECL_LINK(AutoRightHdl, CheckBox*);
	DECL_LINK(TokenSelectedHdl, SwFormToken*);
	DECL_LINK(TabPosHdl, MetricField*);
	DECL_LINK(FillCharHdl, ComboBox*);
	DECL_LINK(RemoveInsertAuthHdl, PushButton*);
	DECL_LINK(SortKeyHdl, RadioButton*);
	DECL_LINK(ChapterInfoHdl, ListBox*);
	DECL_LINK(ChapterInfoOutlineHdl, NumericField*);
    DECL_LINK(NumberFormatHdl, ListBox*);

	DECL_LINK(AllLevelsHdl, PushButton*);

	void 			EnableButtons();
	void			WriteBackLevel();
	void			UpdateDescriptor();
	DECL_LINK(ModifyHdl, void*);

    using SfxTabPage::ActivatePage;
    using SfxTabPage::DeactivatePage;

public:
	SwTOXEntryTabPage(Window* pParent, const SfxItemSet& rAttrSet);
	~SwTOXEntryTabPage();

	virtual sal_Bool		FillItemSet( SfxItemSet& );
	virtual void		Reset( const SfxItemSet& );
    virtual void		ActivatePage( const SfxItemSet& );
	virtual int			DeactivatePage( SfxItemSet* pSet = 0 );

	static SfxTabPage*	Create( Window* pParent,
								const SfxItemSet& rAttrSet);
	void				SetWrtShell(SwWrtShell& rSh);

	String 				GetLevelHelp(sal_uInt16 nLevel) const;

	void 				PreTokenButtonRemoved(const SwFormToken& rToken);
	void SetFocus2theAllBtn();
	virtual long Notify( NotifyEvent& rNEvt );
};
/* -----------------05.07.99 13:00-------------------

 --------------------------------------------------*/
class SwTOXStylesTabPage : public SfxTabPage
{
    FixedLine       aFormatFL;
	FixedText		aLevelFT2;
	ListBox 		aLevelLB;
    ImageButton     aAssignBT;
	FixedText		aTemplateFT;
	ListBox 		aParaLayLB;
	PushButton		aStdBT;
	PushButton 		aEditStyleBT;

    SwForm*         m_pCurrentForm;
//	void			UpdatePattern();

	DECL_LINK( EditStyleHdl, Button *);
	DECL_LINK( StdHdl, Button * );
	DECL_LINK( EnableSelectHdl, ListBox * );
	DECL_LINK( DoubleClickHdl, Button * );
	DECL_LINK( AssignHdl, Button * );
	DECL_LINK( ModifyHdl, void*);

	SwForm&		GetForm()
		{
			SwMultiTOXTabDialog* pDlg = (SwMultiTOXTabDialog*)GetTabDialog();
			return *pDlg->GetForm(pDlg->GetCurrentTOXType());
		}

    using SfxTabPage::ActivatePage;
    using SfxTabPage::DeactivatePage;

public:
	SwTOXStylesTabPage(Window* pParent, const SfxItemSet& rAttrSet);
	~SwTOXStylesTabPage();

	virtual sal_Bool		FillItemSet( SfxItemSet& );
	virtual void		Reset( const SfxItemSet& );

    virtual void		ActivatePage( const SfxItemSet& );
	virtual int			DeactivatePage( SfxItemSet* pSet = 0 );

	static SfxTabPage*	Create( Window* pParent,
								const SfxItemSet& rAttrSet);

};

#endif // _SWUI_CNTTAB_HXX