/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 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