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

#ifndef _VIRDEV_HXX //autogen
#include <vcl/virdev.hxx>
#endif
#ifndef SV_FIXED_HXX
#include <vcl/fixed.hxx>
#endif
#ifndef SV_LSTBOX_HXX
#include <vcl/lstbox.hxx>
#endif
#ifndef SV_GROUP_HXX
#include <vcl/group.hxx>
#endif
#ifndef SV_BUTTON_HXX
#include <vcl/button.hxx>
#endif
#ifndef SV_MOREBTN_HXX
#include <vcl/morebtn.hxx>
#endif
#ifndef _DIALOG_HXX //autogen
#include <vcl/dialog.hxx>
#endif
#include <vcl/combobox.hxx>
#include <vcl/field.hxx>
#include <svl/svarray.hxx>

#define _SVSTDARR_USHORTS
#include <svl/svstdarr.hxx>
#include <vcl/virdev.hxx>
#include <vcl/scrbar.hxx>
#include <svl/svarray.hxx>

#ifndef	_SVSTDARR_STRINGS
#define _SVSTDARR_STRINGS
#include <svl/svstdarr.hxx>
#endif
#include <vcl/tabpage.hxx>
#include <vcl/tabctrl.hxx>

//------------------------------------------------------------------------

//========================================================================
enum eKindOfControl { KOC_UNDEFINED=0,KOC_LISTBOX=1, KOC_COMBOBOX=2,
						KOC_EDIT=3,KOC_USERDEFINED=5};

class SvXPropertyCtrListener;

class SvXPropertyControl : public Control
{
public:
										SvXPropertyControl( Window* pParent, WinBits nWinStyle = 0 );
										SvXPropertyControl( Window* pParent, const ResId& rResId );

		virtual void					SetSvXPropertyCtrListener(SvXPropertyCtrListener*)=0;

		virtual SvXPropertyCtrListener*	GetSvXPropertyCtrListener()=0;
		virtual void					SetProperty(const String &rString)=0;
		virtual String					GetProperty()const=0;
		virtual sal_Bool					HasList()=0;
		virtual void					ClearList()=0;
		virtual	void					InsertEntry( const String& rString,
												sal_uInt16 nPos = LISTBOX_APPEND )=0;

		virtual void					SetCtrSize(const Size& rSize)=0;
		virtual void					SetLocked(sal_Bool bLocked=sal_True)=0;

		virtual void					SetMyName(const String &rString)=0;
		virtual String					GetMyName()const=0;

		virtual void					SetMyData(void*)=0;
		virtual void*					GetMyData()=0;
};

class SvXPropertyCtrListener
{

public:
		virtual void					Modified (SvXPropertyControl *pSvXPCtr)=0;
		virtual void					GetFocus (SvXPropertyControl *pSvXPCtr)=0;
		virtual void					LoseFocus(SvXPropertyControl *pSvXPCtr)=0;
		virtual void					KeyInput (SvXPropertyControl *pSvXPCtr ,const KeyCode&)=0;
};


class SvXPropertyEdit : public SvXPropertyControl
{
private:

		String							aName;
		SvXPropertyCtrListener*			pListener;
		Edit							aEdit;
		void*							pData;

		DECL_LINK(ModifiedHdl,Edit*);
		DECL_LINK(GetFocusHdl,Edit*);
		DECL_LINK(LoseFocusHdl,Edit*);

public:
										SvXPropertyEdit( Window* pParent, WinBits nWinStyle = 0 );
										SvXPropertyEdit( Window* pParent, const ResId& rResId );

		virtual void					SetSvXPropertyCtrListener(SvXPropertyCtrListener*);

		virtual SvXPropertyCtrListener*	GetSvXPropertyCtrListener();

		virtual void					SetProperty(const String &rString);
		virtual String					GetProperty()const;

		virtual sal_Bool					HasList();
		virtual void					ClearList();
		virtual	void					InsertEntry( const String& rString,
												sal_uInt16 nPos = LISTBOX_APPEND );

		virtual void					SetCtrSize(const Size& rSize);
		virtual void					SetLocked(sal_Bool bLocked=sal_True);

		virtual void					SetMyName(const String &rString);
		virtual String					GetMyName()const;

		virtual void					SetMyData(void*);
		virtual void*					GetMyData();
};


class SvXPropertyListBox : public SvXPropertyControl
{
private:

		String							aName;
		SvXPropertyCtrListener*			pListener;
		ListBox							aListBox;
		void*							pData;

		DECL_LINK(ModifiedHdl,ListBox*);
		DECL_LINK(GetFocusHdl,ListBox*);
		DECL_LINK(LoseFocusHdl,ListBox*);


public:
										SvXPropertyListBox( Window* pParent, WinBits nWinStyle = 0 );
										SvXPropertyListBox( Window* pParent, const ResId& rResId );

		virtual void					SetSvXPropertyCtrListener(SvXPropertyCtrListener*);

		virtual SvXPropertyCtrListener*	GetSvXPropertyCtrListener();

		ListBox*						GetListBox();

		virtual void					SetProperty(const String &rString);
		virtual String					GetProperty()const;

		virtual sal_Bool					HasList();
		virtual void					ClearList();
		virtual	void					InsertEntry( const String& rString,
												sal_uInt16 nPos = LISTBOX_APPEND );

		virtual void					SetCtrSize(const Size& rSize);
		virtual void					SetLocked(sal_Bool bLocked=sal_True);

		virtual void					SetMyName(const String &rString);
		virtual String					GetMyName()const;

		virtual void					SetMyData(void*);
		virtual void*					GetMyData();
};

class SvXPropertyComboBox : public SvXPropertyControl
{
private:

		String							aName;
		SvXPropertyCtrListener*			pListener;
		ComboBox						aComboBox;
		void*							pData;

		DECL_LINK(ModifiedHdl,ComboBox*);
		DECL_LINK(GetFocusHdl,ComboBox*);
		DECL_LINK(LoseFocusHdl,ComboBox*);


public:
										SvXPropertyComboBox( Window* pParent, WinBits nWinStyle = 0 );
										SvXPropertyComboBox( Window* pParent, const ResId& rResId );

		virtual void					SetSvXPropertyCtrListener(SvXPropertyCtrListener*);

		virtual SvXPropertyCtrListener*	GetSvXPropertyCtrListener();

		ComboBox*						GetComboBox();

		virtual void					SetProperty(const String &rString);
		virtual String					GetProperty()const;

		virtual sal_Bool					HasList();
		virtual void					ClearList();
		virtual	void					InsertEntry( const String& rString,
												sal_uInt16 nPos = LISTBOX_APPEND );

		virtual void					SetCtrSize(const Size& rSize);
		virtual void					SetLocked(sal_Bool bLocked=sal_True);

		virtual void					SetMyName(const String &rString);
		virtual String					GetMyName()const;

		virtual void					SetMyData(void*);
		virtual void*					GetMyData();
};



class SvPropertyLine : public Control
{
private:
			FixedText			aName;
			sal_uInt16				nNameWidth;
			sal_Bool				bNeedsRepaint;
			SvXPropertyControl*	pSvXPropertyControl;

			PushButton			aXButton;
			sal_Bool				bIsLocked;
			sal_Bool				bHasXButton;
			sal_Bool				bIsHyperlink;
			eKindOfControl		eKindOfCtr;

protected:
			virtual void		Resize();

public:
			SvPropertyLine( Window* pParent,
							WinBits nWinStyle = 0 );
			SvPropertyLine( Window* pParent,
							const ResId& rResId );

			sal_Bool				NeedsRepaint();
			void				SetNeedsRepaint(sal_Bool bFlag);
			void				SetSvXPropertyControl(SvXPropertyControl*);
			SvXPropertyControl*	GetSvXPropertyControl();

			void				SetKindOfControl(eKindOfControl);
			eKindOfControl		GetKindOfControl();

			void				SetName(const String& rString );
			String				GetName() const;
			void				SetNameWidth(sal_uInt16);

			void				ShowXButton();
			void				HideXButton();
			sal_Bool				IsVisibleXButton();
			void				ShowAsHyperLink(sal_Bool nFlag=sal_True);
			sal_Bool				IsShownAsHyperlink();

			void				Locked(sal_Bool nFlag=sal_True);
			sal_Bool				IsLineLocked();

			void				SetClickHdl(const Link&);

};


class SvPropertyData
{
public:
		eKindOfControl			eKind;
		String					aName;
		String					aValue;
		SvStrings				theValues; // ???

		sal_Bool					bHasVisibleXButton;
		sal_Bool					bIsHyperLink;
		sal_Bool					bIsLocked;
		void*					pDataPtr;
		SvXPropertyControl*		pControl;
};

class SvPropertyDataObjectControl
{
};

class SvPropertyDataControl
{
public:
		virtual void					Modified(	const String& aName,
													const String& aVal,
													void* pData)=0;

		virtual void					Clicked(	const String& aName,
													const String& aVal,
													void* pData)=0;

		virtual void					Commit(		const String& aName,
													const String& aVal,
													void* pData)=0;

		virtual void					Select(		const String& aName,
													void* pData)=0;

		virtual void					LinkClicked(const String& aName,
													void* pData)=0;
};

class SvXPropEvListener: public SvXPropertyCtrListener
{
		Link							aModifyLink;
		Link							aGetFocusLink;
		Link							aLoseFocusLink;
		Link							aKeyInputLink;
		String							aModifiedResult;

		SvXPropertyControl *			pTheActiveControl;
		KeyCode							aKeyCode;

public:
										SvXPropEvListener();
        virtual                        ~SvXPropEvListener();

		virtual void					Modified (SvXPropertyControl *pSvXPCtr);
		virtual void					GetFocus (SvXPropertyControl *pSvXPCtr);
		virtual void					LoseFocus(SvXPropertyControl *pSvXPCtr);
		virtual void					KeyInput(SvXPropertyControl *pSvXPCtr ,const KeyCode&);

		SvXPropertyControl *				GetPropertyControl();
		KeyCode							GetKeyCode() const;

		void							SetModifyHdl( const Link& rLink ) { aModifyLink = rLink; }
		const Link&						GetModifyHdl() const { return aModifyLink; }

		void							SetGetFocusHdl( const Link& rLink ) { aGetFocusLink = rLink; }
		const Link&						GetGetFocusHdl() const { return aGetFocusLink; }

		void							SetLoseFocusHdl( const Link& rLink ) { aLoseFocusLink = rLink; }
		const Link&						GetLoseFocusHdl() const { return aLoseFocusLink; }

		void							SetKeyInputHdl( const Link& rLink ) { aKeyInputLink = rLink; }
		const Link&						GetKeyInputHdl() const { return aKeyInputLink; }


};

typedef SvPropertyLine * SvPropertyLinePtr;

SV_DECL_PTRARR(SvPropLineArray,SvPropertyLinePtr,1,1)

class SvListBoxForProperties: public Control
{
private:

			SvXPropEvListener		aListener;
			Window					aPlayGround;
			ScrollBar				aVScroll;
			SvPropLineArray			PLineArray;
			SvPropertyDataControl*	pPropDataControl;
			sal_uInt16					nRowHeight;
			sal_Bool					bUpdate;
			sal_uInt16					nTheNameSize;
			long					nYOffset;

			DECL_LINK(   ScrollHdl,ScrollBar*);
			DECL_LINK(	 ClickHdl ,PushButton*);

			DECL_LINK(   ModifyHdl,SvXPropEvListener*);
			DECL_LINK( GetFocusHdl,SvXPropEvListener*);
			DECL_LINK(LoseFocusHdl,SvXPropEvListener*);
			DECL_LINK( KeyInputHdl,SvXPropEvListener*);

protected:
			void					UpdateAll();
			void					UpdatePosNSize();
			void					UpdatePlayGround();
			void					UpdateVScroll();

			void					Resize();

public:
									SvListBoxForProperties( Window* pParent, WinBits nWinStyle = 0 );
									SvListBoxForProperties( Window* pParent, const ResId& rResId );

									~SvListBoxForProperties();

			virtual sal_uInt16			CalcVisibleLines();
			virtual void			EnableUpdate();
			virtual void			DisableUpdate();

			virtual void			SetController(SvPropertyDataControl *);

			virtual void			Clear();

			virtual sal_uInt16 			InsertEntry( const SvPropertyData&, sal_uInt16 nPos = LISTBOX_APPEND );

			virtual void			ChangeEntry( const SvPropertyData&, sal_uInt16 nPos);

			virtual sal_uInt16 			AppendEntry( const SvPropertyData&);

			virtual void			SetPropertyValue( const String & rEntryName, const String & rValue );

			virtual void			SetFirstVisibleEntry(sal_uInt16 nPos);
			virtual sal_uInt16			GetFirstVisibleEntry();

			virtual void			SetSelectedEntry(sal_uInt16 nPos);
			virtual sal_uInt16			GetSelectedEntry();
};

class SvTabPageForProperties: public TabPage
{

private:

			SvListBoxForProperties	aLbProp;

protected:

			virtual void			Resize();

public:
			SvTabPageForProperties(Window* pParent,WinBits nWinStyle = 0 );

			SvListBoxForProperties*   GetTheListBox();
};


class SvBasicPropertyDataControl: public SvPropertyDataControl
{
private:

		sal_Bool							bCorrectness;
		String							aEntryName;
		String							aEntryProperty;
		String							aCorrectProperty;
		void*							pTheData;
		Link							aModifyLink;
		Link							aClickedLink;
		Link							aCommitLink;
		Link							aSelectLink;

public:
        virtual ~SvBasicPropertyDataControl();

		virtual void					Modified(	const String& aName,
													const String& aVal,
													void* pData);		//User has modified Property

		virtual void					Clicked(	const String& aName,
													const String& aVal,
													void* pData);		//Xtension-Button pressed

		virtual void					Commit(		const String& aName,
													const String& aVal,
													void* pData);		//User accept changes

		virtual void					Select(		const String& aName,
													void* pData);		//User select new Row

		virtual void					LinkClicked(const String& aName,
													void* pData);

		virtual void					SetIsCorrect(sal_Bool nFlag);

		//virtual String					GetTheCorrectProperty()const;
		virtual void					SetTheCorrectProperty(const String& aName);

		String							GetName() const; //Tell's the name of the Property
		String							GetProperty() const; //Tell's the content of the Property
		void*							GetData(); //Tell's the storage


		void							SetModifyHdl( const Link& rLink ) { aModifyLink = rLink; }
		const Link&						GetModifyHdl() const { return aModifyLink; }

		void							SetClickedHdl( const Link& rLink ) { aClickedLink = rLink; }
		const Link&						GetClickedHdl() const { return aClickedLink; }

		void							SetCommitHdl( const Link& rLink ) { aCommitLink = rLink; }
		const Link&						GetCommitHdl() const { return aCommitLink; }

		void							SetSelectHdl( const Link& rLink ) { aSelectLink = rLink; }
		const Link&						GetSelectHdl() const { return aSelectLink; }

};


class SvPropertyBox: public Control
{
private:
			SvPropertyDataControl*		pThePropDataCtr;
			TabControl					aTabControl;

protected:
			virtual void				Resize();

public:
										SvPropertyBox	( Window* pParent, WinBits nWinStyle = 0 );
										SvPropertyBox	( Window* pParent, const ResId& rResId );

										~SvPropertyBox();

			virtual sal_uInt16				CalcVisibleLines();
			virtual void				EnableUpdate();		// auch IDL?
			virtual void				DisableUpdate();	// auch IDL?

			// AB: Hier beginnt das 'offizielle' Interface, das in IDL uebernommen werden soll
			virtual void				SetController(SvPropertyDataControl *);

			virtual sal_uInt16 				AppendPage( const String & r );
			virtual void				SetPage( sal_uInt16 );
			virtual sal_uInt16 				GetCurPage();
			virtual void				ClearAll();
			virtual void				ClearTable();

			virtual void				SetPropertyValue( const String & rEntryName, const String & rValue );

			virtual sal_uInt16 				InsertEntry( const SvPropertyData&, sal_uInt16 nPos = LISTBOX_APPEND );
			virtual void				ChangeEntry( const SvPropertyData&, sal_uInt16 nPos);
			virtual sal_uInt16 				AppendEntry( const SvPropertyData&);

			virtual void				SetFirstVisibleEntry(sal_uInt16 nPos);
			virtual sal_uInt16				GetFirstVisibleEntry();

			virtual void				SetSelectedEntry(sal_uInt16 nPos);
			virtual sal_uInt16				GetSelectedEntry();
};



/*
class ScPropertyDlg : public ModalDialog
{
private:
			SvBasicPropertyDataControl	aBaProDatCtr;
			OKButton					anOk;
			CancelButton				aCancel;
			sal_uInt16						nCount;
			sal_uInt16						nClickCount;

			SvPropertyData				aProperty;
			SvPropertyBox				aPropListBox;

			ListBox						aKindOfListBox;
			FixedText					aModAnswer;
			FixedText					aClickAnswer;
			FixedText					aCommitAnswer;
			FixedText					aSelectAnswer;

			DECL_LINK( ModifiedHdl, ListBox*);

			DECL_LINK( RowModifiedHdl, SvBasicPropertyDataControl*);
			DECL_LINK( ClickHdl		 , SvBasicPropertyDataControl*);
			DECL_LINK( SelectHdl	 , SvBasicPropertyDataControl*);
			DECL_LINK( CommitHdl	 , SvBasicPropertyDataControl*);

public:
			ScPropertyDlg( Window*	pParent);
			~ScPropertyDlg();
};
*/
#endif // SC_AUTOFMT_HXX
