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



#ifdef SOLAR_JAVA

#ifndef _SFXSFXJS_HXX
#include <sfx2/sfxjs.hxx>
#endif

class VCControl;
class VCForm;
class VCManager;
class VCRadioManager;


// Basis-Klasse aller VCControl-Wrapper-Klassen
// Haelt Verweis auf das Control und handelt einige gemeinsame Properties
class ImpSjJScriptControlBase
{
  protected:
	VCControl* pControl;

  public:
	// Beibehalten bis zum Vollupdate
	  /*
	String  	getName() const;
	void    	setName( const String & aStrg );
	String   	getValue() const;
	String   	getType() const;
	*/

	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	String  	ImpGetName() const;
	void    	ImpSetName( const String & aStrg );
	String   	ImpGetValue() const;
	void    	ImpSetValue( const String & aStrg );
	String   	ImpGetType() const;

	// Konstruktor
	ImpSjJScriptControlBase::ImpSjJScriptControlBase( VCControl* _pControl );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Button-Control
class ImpSjJScriptButtonObject : public SjJScriptButtonObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual void    	setValue( const String & aStrg );
	virtual String   	getType() const;

	// Methoden des Objektes
	virtual void		click();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnClick_Fct() const;
	virtual void setOnClick_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnClick() const;
	virtual void		setOnClick( const String & aSourceStrg );
			void 		onClick();

	// Konstruktor
	ImpSjJScriptButtonObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// PasswordControl (Edit-Control zur Password-Eingabe)
class ImpSjJScriptPasswordObject : public SjJScriptPasswordObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	virtual String  	getDefaultValue() const;
	virtual void    	setDefaultValue( const String & aStrg );
	virtual void    	setValue( const String & aStrg );

	// Methoden des Objektes
	virtual void		focus();
	virtual void		blur();
	virtual void		select();

	// Events (C++ --> Java)
	//----------------------
	// keine !

	// Konstruktor
	ImpSjJScriptPasswordObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptCheckboxObject : public SjJScriptCheckboxObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	virtual sal_Bool		getChecked() const;
	virtual void		setChecked( sal_Bool bCheck );
	virtual sal_Bool		getDefaultChecked() const;
	virtual void		setDefaultChecked( sal_Bool bCheck );
	// getValue() wird in der Basisklasse definiert
	virtual void    	setValue( const String & aStrg );

	// Methoden des Objektes
	virtual void		click();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnClick_Fct() const;
	virtual void setOnClick_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnClick() const;
	virtual void		setOnClick( const String & aSourceStrg );
			void 		onClick();

	// Konstruktor
	ImpSjJScriptCheckboxObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Wrapper-Klasse fuer RadioArray
class ImpSjJScriptRadioArray: public SjJSbxArrayObject
{
	VCRadioManager*	pMgr;
public:
	sal_Int32 ImpSjJScriptRadioArray::getLength() const;
	SjJSbxObject* ImpSjJScriptRadioArray::getElement( sal_Int32 nIndex ) const;
	SjJSbxObject* ImpSjJScriptRadioArray::getElement_String( const String & aName ) const;

	// Konstruktor
	ImpSjJScriptRadioArray::ImpSjJScriptRadioArray( VCRadioManager* _pMgr, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptRadioObject : public SjJScriptRadioObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	// Properties von SjJScriptCheckboxObject
	virtual sal_Bool		getChecked() const;
	virtual void		setChecked( sal_Bool bCheck );
	virtual sal_Bool		getDefaultChecked() const;
	virtual void		setDefaultChecked( sal_Bool bCheck );
	// getValue() wird in der Basisklasse definiert
	virtual void    	setValue( const String & aStrg );

	// yyy Raus zum inkompatiblen
	//virtual sal_Int32		getLength();

	// Methoden des Objektes
	virtual void		click();

	// Events (C++ --> Java)
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnClick_Fct() const;
	virtual void setOnClick_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnClick() const;
	virtual void		setOnClick( const String & aSourceStrg );
			void 		onClick();

	// Konstruktor
	ImpSjJScriptRadioObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptSelectObject : public SjJScriptSelectObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	virtual sal_Int32		getLength();
	virtual sal_Int32		getSelectedIndex() const;
	virtual void    	setSelectedIndex( sal_Int32 nNo );

	// liefert eine Array von Option-Objekten
	//yyy Raus zum inkompatiblen
	//virtual SjJSbxArrayObject * getOptions();

	// Methoden des Objektes
	virtual void		focus();
	virtual void		blur();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnBlur_Fct() const;
	virtual void setOnBlur_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnChange_Fct() const;
	virtual void setOnChange_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnFocus_Fct() const;
	virtual void setOnFocus_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnBlur() const;
	virtual void		setOnBlur( const String & aSourceStrg );
			void 		onBlur();
	virtual String		getOnChange() const;
	virtual void		setOnChange( const String & aSourceStrg );
			void 		onChange();
	virtual String		getOnFocus() const;
	virtual void		setOnFocus( const String & aSourceStrg );
			void 		onFocus();

	// SjJSbxArrayObject-Methoden
	virtual sal_Int32			getLength() const;
	// Zugriff "uber den Index
	virtual SjJSbxObject * 	getElement( sal_Int32 nIndex ) const;
	// Zugriff "uber den Namen
	// native Java-Methoden k"onnen (noch) nicht "uberladen werden
	//virtual SjJSbxObject * 	getElement_String( const String & aName ) const;

	// Konstruktor
	ImpSjJScriptSelectObject( VCControl* _pControl, SjJSbxObject * p );

	// zum Setzen von Eintr"agen am Objket (zum Aufruf von Java aus) 15.1.1997
	virtual void		setOption( sal_Int32 nIndex, const String & aOptionText,
								   const String	& aOptionValue,
								   sal_Bool bDefaultSelected, sal_Bool bSelected );

	// Schnittstelle fuer die Properties der Option-Objekte
	virtual sal_Bool    	getOptionDefaultSelected( sal_Int32 nIndex ) const;
	virtual void		setOptionDefaultSelected( sal_Bool bSelected, sal_Int32 nIndex );
	virtual sal_Bool    	getOptionSelected( sal_Int32 nIndex ) const;
	virtual void		setOptionSelected( sal_Bool bSelected, sal_Int32 nIndex );
	virtual String		getOptionText( sal_Int32 nIndex ) const;
	virtual void		setOptionText( const String & sText, sal_Int32 nIndex );
	virtual void		setOptionValue( const String & sText, sal_Int32 nIndex );
	virtual String		getOptionValue( sal_Int32 nIndex ) const;
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Wieso von Controlbase abgeleitet?

class ImpSjJScriptOptionObject : public SjJScriptOptionObject, ImpSjJScriptControlBase
{
	sal_uInt16				nListBoxIndex;
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	virtual sal_Bool  		getdefaultSelected() const;
	virtual void		setdefaultSelected( sal_Bool bSelected );
	virtual sal_Int32		getIndex() const;
	virtual sal_Bool    	getSelected() const;
	virtual void    	setSelected( sal_Bool bSelected );


	//yyy Zum Vollupdate raus:
	/*
	virtual sal_Int32		getSelectedIndex() const;
	virtual void    	setSelectedIndex( sal_Int32 nNo );
	*/


	virtual String		getText() const;
	virtual void		setText( const String & sText );
	// getValue() wird in der Basisklasse definiert
	virtual String   	getValue() const;
	virtual void    	setValue( const String & aStrg );


	// DUMMY-Methoden
	virtual String getName() const { return "";}
	virtual void setName( const String &s) { }
	virtual String getType() const { return "";}
	// Methoden des Objektes
	// keine !

	// Events (C++ --> Java)
	//----------------------
	// keine !

	// Konstruktor
	ImpSjJScriptOptionObject( VCControl* _pControl, SjJSbxObject * p, sal_uInt16 _nListBoxIndex );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Eigene Klasse fuer forms-Array anlegen
class SjJSbxFormsArray: public SfxJSArray
{
	VCManager* pManager;

  public:
	// SjJSbxArrayObject-Methoden
	virtual sal_Int32			getLength() const;
	// Zugriff "uber den Index
	virtual SjJSbxObject * 	getElement( sal_Int32 nIndex ) const;
	// Zugriff "uber den Namen
	// native Java-Methoden k"onnen (noch) nicht "uberladen werden
	virtual SjJSbxObject * 	getElement_String( const String & aName ) const;

	// Konstruktor
	SjJSbxFormsArray( VCManager * _pManager, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptTextObject : public SjJScriptTextObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	virtual String		getDefaultValue() const;
	virtual void		setDefaultValue( const String & aStrg );
	// getValue() wird in der Basisklasse definiert
	virtual void    	setValue( const String & aStrg );

	// Methoden des Objektes
	virtual void		focus();
	virtual void		blur();
	virtual void		select();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnBlur_Fct() const;
	virtual void setOnBlur_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnChange_Fct() const;
	virtual void setOnChange_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnFocus_Fct() const;
	virtual void setOnFocus_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnSelect_Fct() const;
	virtual void setOnSelect_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnBlur() const;
	virtual void		setOnBlur( const String & aSourceStrg );
			void 		onBlur();
	virtual String		getOnChange() const;
	virtual void		setOnChange( const String & aSourceStrg );
			void 		onChange();
	virtual String		getOnFocus() const;
	virtual void		setOnFocus( const String & aSourceStrg );
			void 		onFocus();
	virtual String		getOnSelect() const;
	virtual void		setOnSelect( const String & aSourceStrg );
			void 		onSelect();

	// Konstruktor
	ImpSjJScriptTextObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptTextareaObject : public SjJScriptTextareaObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	virtual String		getDefaultValue() const;
	virtual void		setDefaultValue( const String & aStrg );
	// getValue() wird in der Basisklasse definiert
	virtual void    	setValue( const String & aStrg );

	// Methoden des Objektes
	virtual void		focus();
	virtual void		blur();
	virtual void		select();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnBlur_Fct() const;
	virtual void setOnBlur_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnChange_Fct() const;
	virtual void setOnChange_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnFocus_Fct() const;
	virtual void setOnFocus_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnSelect_Fct() const;
	virtual void setOnSelect_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnBlur() const;
	virtual void		setOnBlur( const String & aSourceStrg );
			void 		onBlur();
	virtual String		getOnChange() const;
	virtual void		setOnChange( const String & aSourceStrg );
			void 		onChange();
	virtual String		getOnFocus() const;
	virtual void		setOnFocus( const String & aSourceStrg );
			void 		onFocus();
	virtual String		getOnSelect() const;
	virtual void		setOnSelect( const String & aSourceStrg );
			void 		onSelect();

	// Konstruktor
	ImpSjJScriptTextareaObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptSubmitObject : public SjJScriptSubmitObject, ImpSjJScriptControlBase
{
	// Identisch mit ButtonObject
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual void    	setValue( const String & aStrg );
	virtual String   	getType() const;

	// Methoden des Objektes
	virtual void		click();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnClick_Fct() const;
	virtual void setOnClick_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnClick() const;
	virtual void		setOnClick( const String & aSourceStrg );
			void 		onClick();

	// Konstruktor
	ImpSjJScriptSubmitObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptResetObject : public SjJScriptResetObject, ImpSjJScriptControlBase
{
	// Identisch mit ButtonObject
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual void    	setValue( const String & aStrg );
	virtual String   	getType() const;

	// Methoden des Objektes
	virtual void		click();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnClick_Fct() const;
	virtual void setOnClick_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnClick() const;
	virtual void		setOnClick( const String & aSourceStrg );
			void 		onClick();

	// Konstruktor
	ImpSjJScriptResetObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptHiddenObject : public SjJScriptHiddenObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	// getValue() wird in der Basisklasse definiert
	virtual void    	setValue( const String & aStrg );

	// Methoden des Objektes
	// keine !

	// Events (C++ --> Java)
	//----------------------
	// keine !

	// Konstruktor
	ImpSjJScriptHiddenObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptFileUploadObject : public SjJScriptFileUploadObject, ImpSjJScriptControlBase
{
  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	// Basisklassen-Properties, werden an ImpSjJScriptControlBase durchgereicht
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	// Methoden des Objektes
	// keine !

	// Events (C++ --> Java)
	//----------------------
	// keine !

	// Konstruktor
	ImpSjJScriptFileUploadObject( VCControl* _pControl, SjJSbxObject * p );
};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class ImpSjJScriptFormObject : public SjJScriptFormObject
{
	VCForm* pVCForm;

  public:
	// Methoden von Java --> C++ (f"ur Properties)
	//--------------------------------------------
	virtual String  	getName() const;
	virtual void    	setName( const String & aStrg );
	virtual String   	getValue() const;
	virtual String   	getType() const;

	virtual String		getAction() const;
	virtual void		setAction( const String & sValue );
	virtual String		getEncoding() const;
	virtual void		setEncoding( const String & sValue );
	virtual String		getMethod() const;
	virtual void		setMethod( const String & sValue );
	virtual String		getTarget() const;
	virtual void		setTarget( const String & sValue );

	// SjJSbxArrayObject-Methoden
	sal_Int32				getLength() const;
	SjJSbxObject*		getElement( sal_Int32 nIndex ) const;
	SjJSbxObject*		getElement_String( const String & aName ) const;

	// liefert ein Array-Objekt mit Elementen vom Typ JScriptAbstractControlsObject
	// yyy Raus zum inkompatiblen
	//virtual SjJSbxArrayObject * getElements();

	// Zugriff ueber den Namen eines Controls (falls ein Name zugeordnet ist)
	// yyy Raus zum inkompatiblen
	//virtual SjJSbxObject * getElement( const String & aName );

	// Methoden des Objektes
	virtual void 		submit();
	virtual void		reset();

	// Events (C++ --> Java)
	//----------------------
	// Neue Event-Schnittstelle mit Function-Objekten
	virtual SjJScriptFunctionObject* getOnSubmit_Fct() const;
	virtual void setOnSubmit_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual SjJScriptFunctionObject* getOnReset_Fct() const;
	virtual void setOnReset_Fct( SjJScriptFunctionObject* pFunctionObject );
	virtual String		getOnSubmit() const;
	virtual void		setOnSubmit( const String & aSourceStrg );
			void 		onSubmit();
	virtual String		getOnReset() const;
	virtual void		setOnReset( const String & aSourceStrg );
			void 		onReset();

	// Konstruktor
	ImpSjJScriptFormObject( VCForm* _pVCForm, SjJSbxObject * p );
};

#endif
