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

// include ---------------------------------------------------------------

#include <vector>
#include <ucbhelper/content.hxx>
#include <vcl/button.hxx>
#include <vcl/fixed.hxx>
#include <vcl/timer.hxx>
#include <sfx2/tabdlg.hxx>
#include <svx/simptabl.hxx>
#include <com/sun/star/ui/dialogs/XFolderPicker.hpp>
#include <svtools/dialogclosedlistener.hxx>
#include "radiobtnbox.hxx"

// forward ---------------------------------------------------------------

typedef struct _JavaInfo JavaInfo;

class	SvxJavaParameterDlg;
class	SvxJavaClassPathDlg;

// class SvxJavaOptionsPage ----------------------------------------------

class SvxJavaOptionsPage : public SfxTabPage
{
private:
    FixedLine                   m_aJavaLine;
    CheckBox                    m_aJavaEnableCB;
    FixedText                   m_aJavaFoundLabel;
    svx::SvxRadioButtonListBox  m_aJavaList;
    FixedText                   m_aJavaPathText;
    PushButton                  m_aAddBtn;
    PushButton                  m_aParameterBtn;
    PushButton                  m_aClassPathBtn;

	SvxJavaParameterDlg*	m_pParamDlg;
	SvxJavaClassPathDlg*	m_pPathDlg;

	JavaInfo**				m_parJavaInfo;
	rtl_uString**			m_parParameters;
	rtl_uString*			m_pClassPath;
	sal_Int32				m_nInfoSize;
	sal_Int32				m_nParamSize;
	String					m_sInstallText;
	String					m_sAccessibilityText;
	String					m_sAddDialogText;
	Timer					m_aResetTimer;

	::std::vector< JavaInfo* >
							m_aAddedInfos;

    ::com::sun::star::uno::Reference< ::svt::DialogClosedListener > xDialogListener;
    ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XFolderPicker > xFolderPicker;

	DECL_LINK(				EnableHdl_Impl, CheckBox * );
	DECL_LINK(				CheckHdl_Impl, SvxSimpleTable * );
	DECL_LINK( 				SelectHdl_Impl, SvxSimpleTable * );
	DECL_LINK(				AddHdl_Impl, PushButton * );
	DECL_LINK(				ParameterHdl_Impl, PushButton * );
	DECL_LINK(				ClassPathHdl_Impl, PushButton * );
    DECL_LINK(              ResetHdl_Impl, Timer * );

    DECL_LINK(              StartFolderPickerHdl, void * );
    DECL_LINK(              DialogClosedHdl, ::com::sun::star::ui::dialogs::DialogClosedEvent* );

	void					ClearJavaInfo();
	void					ClearJavaList();
	void					LoadJREs();
	void					AddJRE( JavaInfo* _pInfo );
	void					HandleCheckEntry( SvLBoxEntry* _pEntry );
    void                    AddFolder( const ::rtl::OUString& _rFolder );

public:
	SvxJavaOptionsPage( Window* pParent, const SfxItemSet& rSet );
	~SvxJavaOptionsPage();

	static SfxTabPage*		Create( Window* pParent, const SfxItemSet& rSet );

	virtual	sal_Bool 			FillItemSet( SfxItemSet& rSet );
	virtual	void 			Reset( const SfxItemSet& rSet );
	virtual void        	FillUserData();
};

// class SvxJavaParameterDlg ---------------------------------------------

class SvxJavaParameterDlg : public ModalDialog
{
private:
	FixedText				m_aParameterLabel;
	Edit			   		m_aParameterEdit;
	PushButton				m_aAssignBtn;

	FixedText				m_aAssignedLabel;
	ListBox					m_aAssignedList;
	FixedText				m_aExampleText;
	PushButton				m_aRemoveBtn;

	FixedLine				m_aButtonsLine;
	OKButton				m_aOKBtn;
	CancelButton	   		m_aCancelBtn;
	HelpButton				m_aHelpBtn;

	DECL_LINK(				ModifyHdl_Impl, Edit * );
	DECL_LINK(				AssignHdl_Impl, PushButton * );
	DECL_LINK(				SelectHdl_Impl, ListBox * );
	DECL_LINK(				DblClickHdl_Impl, ListBox * );
	DECL_LINK(				RemoveHdl_Impl, PushButton * );

	inline void				EnableRemoveButton()
								{ m_aRemoveBtn.Enable(
									m_aAssignedList.GetSelectEntryPos()
									!= LISTBOX_ENTRY_NOTFOUND ); }


public:
	SvxJavaParameterDlg( Window* pParent );
	~SvxJavaParameterDlg();

	virtual short			Execute();

	::com::sun::star::uno::Sequence< ::rtl::OUString > GetParameters() const;
	void SetParameters( ::com::sun::star::uno::Sequence< ::rtl::OUString >& rParams );
};

// class SvxJavaClassPathDlg ---------------------------------------------

class SvxJavaClassPathDlg : public ModalDialog
{
private:
	FixedText				m_aPathLabel;
	ListBox					m_aPathList;
	PushButton				m_aAddArchiveBtn;
	PushButton				m_aAddPathBtn;
	PushButton				m_aRemoveBtn;

	FixedLine				m_aButtonsLine;
	OKButton				m_aOKBtn;
	CancelButton			m_aCancelBtn;
	HelpButton				m_aHelpBtn;

	String					m_sOldPath;

	DECL_LINK(				AddArchiveHdl_Impl, PushButton * );
	DECL_LINK(				AddPathHdl_Impl, PushButton * );
	DECL_LINK(				RemoveHdl_Impl, PushButton * );
	DECL_LINK(				SelectHdl_Impl, ListBox * );

	bool					IsPathDuplicate( const String& _rPath );
    inline void             EnableRemoveButton()
                                { m_aRemoveBtn.Enable(
                                    m_aPathList.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND ); }

public:
	SvxJavaClassPathDlg( Window* pParent );
	~SvxJavaClassPathDlg();

	inline const String&	GetOldPath() const { return m_sOldPath; }
	inline void				SetFocus() { m_aPathList.GrabFocus(); }

	String					GetClassPath() const;
	void					SetClassPath( const String& _rPath );
};

#endif // #ifndef _SVX_OPTJAVA_HXX
