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


