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

#include <vcl/tabpage.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/dialog.hxx>
#ifndef _SV_BUTTON_HXX
#include <vcl/button.hxx>
#endif
#include <vcl/image.hxx>
#include <svtools/ivctrl.hxx>
#include <svl/itempool.hxx>
#include <svl/itemset.hxx>
#include <tools/list.hxx>
#include <tools/string.hxx>

#define CTRLS_OFFSET		3
#define BUTTON_DISTANCE		8
#define RET_USER 		100
#define RET_USER_CANCEL	101

// forward-declarations
struct IconChoicePageData;
class IconChoiceDialog;
class IconChoicePage;

// Create-Function
typedef IconChoicePage* (*CreatePage)(Window *pParent, const SfxItemSet &rAttrSet);
typedef sal_uInt16*		    (*GetPageRanges)(); // liefert internationale Which-Wert

// page-list
DECLARE_LIST( IconChoicePageList, IconChoicePageData * )

// position of iconchoicectrl
enum EIconChoicePos { PosLeft, PosRight, PosTop, PosBottom };

/**********************************************************************
|
| Data-structure for pages in dialog
|
\**********************************************************************/

struct IconChoicePageData
{
	sal_uInt16 nId;					 // Die ID
	CreatePage fnCreatePage;	 // Pointer auf die Factory
	GetPageRanges fnGetRanges;// Pointer auf die Ranges-Funktion
	IconChoicePage* pPage;		 // die TabPage selber
	sal_Bool bOnDemand;				 // Flag: ItemSet onDemand
	sal_Bool bRefresh; 				 // Flag: Seite mu\s neu initialisiert werden

	// Konstruktor
	IconChoicePageData( sal_uInt16 Id, CreatePage fnPage, GetPageRanges fnRanges, sal_Bool bDemand )
		: nId			( Id ),
		  fnCreatePage	( fnPage ),
		  fnGetRanges	( fnRanges ),
		  pPage			( NULL ),
		  bOnDemand		( bDemand ),
		  bRefresh		( sal_False )
	{}
};

/**********************************************************************
|
| IconChoicePage
|
\**********************************************************************/

class IconChoicePage : public TabPage
{
	using TabPage::ActivatePage;
	using TabPage::DeactivatePage;

private :
	const SfxItemSet*	pSet;
	String				aUserString;
	sal_Bool				bHasExchangeSupport;
	IconChoiceDialog*	pDialog;
	sal_Bool				bStandard;

	void				SetDialog( IconChoiceDialog* pNew ) { pDialog = pNew; }
	IconChoiceDialog*	GetDialog() const { return pDialog; }

	void				SetInputSet( const SfxItemSet* pNew ) { pSet = pNew; }

	void				ImplInitSettings();

protected :
	IconChoicePage( Window *pParent, const ResId &, const SfxItemSet &rAttrSet );

	sal_uInt16				GetSlot( sal_uInt16 nWhich ) const	{ return pSet->GetPool()->GetSlotId( nWhich ); }
	sal_uInt16				GetWhich( sal_uInt16 nSlot ) const	{ return pSet->GetPool()->GetWhich( nSlot ); }

public :
	virtual             ~IconChoicePage();

	const SfxItemSet&	GetItemSet() const { return *pSet; }

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

	sal_Bool				HasExchangeSupport() const				{ return bHasExchangeSupport; }
	void				SetExchangeSupport( sal_Bool bNew = sal_True )	{ bHasExchangeSupport = bNew; }

	enum {
		KEEP_PAGE = 0x0000,		// Fehlerbehandlung; Seite nicht wechseln
			// 2. F"ullen eines ItemSets f"ur die Aktualilsierung
			// "ubergeordneter Beispiele; dieser Pointer kann immer
			// NULL sein!!
		LEAVE_PAGE = 0x0001,
			// Set aktualisieren und andere Page aktualisieren
		REFRESH_SET = 0x0002
	};

	virtual void		ActivatePage( const SfxItemSet& );
	virtual int			DeactivatePage( SfxItemSet* pSet = 0 );
	void				SetUserData(const String& rString)	{ aUserString = rString; }
	String				GetUserData() { return aUserString; }
	virtual void		FillUserData();
	virtual sal_Bool		IsReadOnly() const;
    virtual sal_Bool    QueryClose();

	void				StateChanged( StateChangedType nType );
	void				DataChanged( const DataChangedEvent& rDCEvt );
};

/**********************************************************************
|
| IconChoiceDialog
|
\**********************************************************************/

class IconChoiceDialog : public ModalDialog
{
private :
	friend class IconChoicePage;

	EIconChoicePos			meChoicePos;    // Position des IconChoiceCtrl's
	IconChoicePageList		maPageList;		// Liste von PageData-Pointer

	SvtIconChoiceCtrl		maIconCtrl;		// DAS IconChoice-Control

	sal_uInt16					mnCurrentPageId;	// Id der aktuell sichtbaren Page

	// Buttons
	OKButton				aOKBtn;
	CancelButton			aCancelBtn;
	HelpButton				aHelpBtn;
	PushButton				aResetBtn;

	const SfxItemSet*		pSet;
	SfxItemSet*				pOutSet;
	SfxItemSet*				pExampleSet;
	sal_uInt16*					pRanges;

	sal_uInt32				nResId;

	sal_Bool					bHideResetBtn;
	sal_Bool					bModal;
	sal_Bool					bInOK;
	sal_Bool					bModified;
	sal_Bool					bItemsReset;

	DECL_LINK ( ChosePageHdl_Impl, void * );
	DECL_LINK ( OkHdl,			   Button * );
	DECL_LINK ( ResetHdl,          Button * );
	DECL_LINK ( CancelHdl,		   Button * );

	IconChoicePageData*		GetPageData ( sal_uInt16 nId );
	void					Start_Impl();
	sal_Bool					OK_Impl();

	void					SetPosSizeCtrls ( sal_Bool bInit = sal_False );
	void					SetPosSizePages ( sal_uInt16 nId );

	void					FocusOnIcon ( sal_uInt16 nId );

protected :
	void					ShowPageImpl ( IconChoicePageData* pData );
	void					HidePageImpl ( IconChoicePageData* pData );

    virtual void            PageCreated( sal_uInt16 nId, IconChoicePage& rPage );
	virtual SfxItemSet*		CreateInputItemSet( sal_uInt16 nId );
	inline SfxItemSet*		GetInputSetImpl() { return (SfxItemSet*)pSet; }
	inline IconChoicePage*	GetTabPage( sal_uInt16 nPageId )
								{ return ( GetPageData (nPageId)->pPage?GetPageData (nPageId)->pPage:NULL); }
	const SfxItemSet*		GetRefreshedSet();

	void					ActivatePageImpl ();
	sal_Bool					DeActivatePageImpl ();
	void					ResetPageImpl ();

	short					Ok();

public :

	// im Ctor könnte auch die Position des IconChoiceCtrl's gesetzt werden.

	IconChoiceDialog ( Window* pParent, const ResId &rResId,
					   const EIconChoicePos ePos = PosLeft, const SfxItemSet * pItemSet = 0 );
	~IconChoiceDialog ();

	///////////////////////////////////////////////////////////////////////////////////
	// virtuelle Methoden
	//
	virtual void		Paint( const Rectangle& rRect );
	virtual void		Resize();

	///////////////////////////////////////////////////////////////////////////////////
	// Schnittstelle
	//

	SvxIconChoiceCtrlEntry*	AddTabPage(
		sal_uInt16 nId, const String& rIconText, const Image& rChoiceIcon, const Image& rChoiceIconHC,
		CreatePage pCreateFunc /* != NULL */, GetPageRanges pRangesFunc = NULL /* NULL allowed*/,
		sal_Bool bItemsOnDemand = sal_False, sal_uLong nPos = LIST_APPEND );

	void				SetCurPageId( sal_uInt16 nId ) { mnCurrentPageId = nId; FocusOnIcon( nId ); }
	sal_uInt16				GetCurPageId() const       { return mnCurrentPageId; }
	void				ShowPage( sal_uInt16 nId );

						// liefert ggf. per Map konvertierte lokale Slots
	const sal_uInt16*		GetInputRanges( const SfxItemPool& );
	void				SetInputSet( const SfxItemSet* pInSet );
	const SfxItemSet*	GetOutputItemSet() const { return pOutSet; }

	const OKButton& 	GetOKButton() const { return aOKBtn; }
	OKButton&			GetOKButton() { return aOKBtn; }
	const CancelButton& GetCancelButton() const { return aCancelBtn; }
	CancelButton&		GetCancelButton() { return aCancelBtn; }
	const HelpButton&	GetHelpButton() const { return aHelpBtn; }
	HelpButton&			GetHelpButton() { return aHelpBtn; }

	short				Execute();
	void				Start( sal_Bool bShow = sal_True );
    sal_Bool            QueryClose();

	const SfxItemSet*	GetExampleSet() const { return pExampleSet; }

	EIconChoicePos		SetCtrlPos   ( const EIconChoicePos& rPos );
};

#endif //_ICCDLG_HXX

