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

#ifndef _DIALOG_HXX //autogen
#include <vcl/dialog.hxx>
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _FIELD_HXX //autogen
#include <vcl/field.hxx>
#endif
#include <vcl/fixed.hxx>
#include <vcl/tabdlg.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/tabpage.hxx>
#include <tools/config.hxx>
#ifndef _TOOLS_LIST_HXX
#include <tools/list.hxx>
#endif
#include <vcl/lstbox.hxx>
#include <vcl/floatwin.hxx>
#include <vcl/toolbox.hxx>
#include <svtools/ctrltool.hxx>
#include <svtools/ctrlbox.hxx>

class SbxVariable;

#ifndef _BASIC_TTRESHLP_HXX
#include <basic/ttstrhlp.hxx>
#endif

class AboutDialog : public ModalDialog {
	FixedText a1,a4,aVersionString;
	OKButton  aOk;
public:
	AboutDialog (Window*, const ResId&);
};

class FindDialog : public ModalDialog {
	FixedText		aFT1;
	Edit            aFind;
	OKButton 		aOk;
	CancelButton    aCancel;
	String*		    pFind;
	DECL_LINK( ButtonClick, Button * );
public:
	FindDialog (Window*, const ResId&, String&);
};

class ReplaceDialog : public ModalDialog {
	FixedText		aFT1;
	FixedText		aFT2;
	Edit            aFind;
	Edit            aReplace;
	OKButton 		aOk;
	CancelButton    aCancel;
	String*		    pFind;
	String*		    pReplace;
	DECL_LINK( ButtonClick, Button * );
public:
	ReplaceDialog (Window*, const ResId&, String&, String&);
};

////////////////////////////////////////////////////////////////////

class ConfEdit : public PushButton
{
protected:
	FixedText aText;
	Edit aEdit;
	ByteString aKeyName;

    void Init( Config &aConf );

public:
	ConfEdit( Window* pParent, sal_uInt16 nResText, sal_uInt16 nResEdit, sal_uInt16 nResButton, const ByteString& aKN, Config &aConf );
	ConfEdit( Window* pParent, sal_uInt16 nResEdit, sal_uInt16 nResButton, const ByteString& aKN, Config &aConf );
	void Save( Config &aConf );
	void Reload( Config &aConf );
	void Click();
    String GetValue() { return aEdit.GetText(); };
    void SetModifyHdl( Link aLink ) { aEdit.SetModifyHdl( aLink ); };
};


class OptConfEdit : public ConfEdit
{
protected:
	CheckBox aCheck;
	ConfEdit& rBase;
    DECL_LINK( ToggleHdl, CheckBox* );
public:
	OptConfEdit( Window* pParent, sal_uInt16 nResCheck, sal_uInt16 nResEdit, sal_uInt16 nResButton, const ByteString& aKN, ConfEdit& rBaseEdit, Config& aConf );
	void Reload( Config &aConf );
    DECL_LINK( BaseModifyHdl, Edit* );
};


class OptionsDialog : public TabDialog
{
private:
	TabControl		aTabCtrl;

	OKButton aOK;
	CancelButton aCancel;
	DECL_LINK( OKClick, Button * );

    Config aConfig;

public:
	OptionsDialog( Window* pParent, const ResId& );
	~OptionsDialog();
	virtual sal_Bool	Close();


	DECL_LINK( ActivatePageHdl, TabControl * );
};

class ProfileOptions : public TabPage
{
	Config &rConf;

	FixedLine aFlProfile;
	ComboBox aCbProfile;
	PushButton aPbNewProfile;
	PushButton aPbDelProfile;

    FixedLine aDirs;
    ConfEdit aLog;
	ConfEdit aBasis;
	OptConfEdit aHID;

	CheckBox aAutoReload;
	CheckBox aAutoSave;
	CheckBox aStopOnSyntaxError;

	void LoadData();

    DECL_LINK( Select, ComboBox* );
	DECL_LINK( DelProfile, Button* );
	DECL_LINK( NewProfile, Button* );
	DECL_LINK( CheckButtonsHdl, ComboBox* );

    void ReloadProfile();
	void Save();

public:
	ProfileOptions( Window*, Config &rConfig );
	void Save( Config &rConfig );
};


class CrashreportOptions : public TabPage
{
    FixedLine aFLCrashreport;
    CheckBox aCBUseProxy;
    FixedText aFTCRHost;
    Edit aEDCRHost;
    FixedText aFTCRPort;
    NumericField aNFCRPort;

    CheckBox aCBAllowContact;
    FixedText aFTEMail;
    Edit aEDEMail;

    DECL_LINK( CheckProxy, void*);
    DECL_LINK( CheckResponse, void*);

public:
	CrashreportOptions( Window*, Config &aConfig );
	void Save( Config &aConfig );
};

class MiscOptions : public TabPage
{
	FixedLine aFLCommunication;
	FixedText aFTHost;
	Edit aEDHost;
	FixedText aFTTTPort;
	NumericField aNFTTPort;
	FixedText aFTUNOPort;
	NumericField aNFUNOPort;
	FixedLine aOther;
	FixedText aTimeoutText;
	TimeField aServerTimeout;
	FixedText aFTLRU;
	NumericField aTFMaxLRU;
    FixedText aFTProgDir;
    Edit aEDProgDir;
    PushButton aPBProgDir;

    DECL_LINK( Click, void*);

public:
	MiscOptions( Window*, Config &aConfig );
	void Save( Config &aConfig );
};

class FontOptions : public TabPage
{
	FixedText aFTFontName;
    FontNameBox aFontName;
	FixedText aFTStyle;
    FontStyleBox aFontStyle;
	FixedText aFTSize;
    FontSizeBox aFontSize;
    FixedText aFTPreview;

    FontList aFontList;

    DECL_LINK( FontNameChanged, void* );
    DECL_LINK( FontStyleChanged, void* );
    DECL_LINK( FontSizeChanged, void* );

    void UpdatePreview();

public:
	FontOptions( Window*, Config &aConfig );
	void Save( Config &aConfig );
};


DECLARE_LIST( StringList, String * )
#define C_KEY_ALLE			CByteString("All")
#define C_KEY_AKTUELL		CByteString("Current")
#define C_KEY_TYPE			CByteString("Type")
#define C_KEY_DELETE		CByteString("Deleted Groups")

class GenericOptions : public TabPage
{
	Config &aConf;

	FixedLine aFlArea;
	ComboBox aCbArea;
	PushButton aPbNewArea;
	PushButton aPbDelArea;

	FixedLine aFlValue;
	ComboBox aCbValue;
    PushButton aPbSelectPath;
    PushButton aPbNewValue;
	PushButton aPbDelValue;

    int nMoveButtons;
    sal_Bool bShowSelectPath;
    AutoTimer aMoveTimer;
	DECL_LINK( MoveButtons, AutoTimer* );

	ByteString aLastGroupName;

	String ReadKey( const ByteString &aGroup, const ByteString &aKey );

	StringList* GetAllGroups();
	void LoadData();

    void ShowSelectPath( const String aType );

	DECL_LINK( LoadGroup, ComboBox* );
	DECL_LINK( DelGroup, Button* );
	DECL_LINK( NewGroup, Button* );
	DECL_LINK( SelectPath, Button* );
	DECL_LINK( DelValue, Button* );
	DECL_LINK( NewValue, Button* );
	DECL_LINK( CheckButtonsHdl, ComboBox* );

public:
	GenericOptions( Window*, Config &aConfig );
	~GenericOptions();
	void Save( Config &aConfig );
};


struct WinInfoRec;
class SplitWindow;

class DisplayHidDlg : public FloatingWindow
{
protected:
	ToolBox aTbConf;
	FixedText aFtControls;
	MultiListBox aMlbControls;
	FixedText aFtSlots;
	MultiListBox aMlbSlots;
	PushButton aPbKopieren;
	PushButton aPbBenennen;
	PushButton aPbSelectAll;
	OKButton aOKClose;

	DockingWindow* pControls;
	DockingWindow* pSlots;
	SplitWindow *pSplit;

	sal_uIntPtr nDisplayMode;

	DECL_LINK( Select, void* );
	DECL_LINK( SelectAll, PushButton* );
	DECL_LINK( CopyToClipboard, void* );

public:
	DisplayHidDlg( Window * pParent );
	virtual ~DisplayHidDlg();

	virtual void Resize();

	void AddData( WinInfoRec* pWinInfo );

};


class VarEditDialog : public ModelessDialog
{
protected:
	FixedText aFixedTextRID_FT_NAME;
	FixedText aFixedTextRID_FT_CONTENT;
	FixedText aFixedTextRID_FT_NEW_CONTENT;
	FixedText aFixedTextRID_FT_NAME_VALUE;
	FixedText aFixedTextRID_FT_CONTENT_VALUE;

	RadioButton aRadioButtonRID_RB_NEW_BOOL_T;
	RadioButton aRadioButtonRID_RB_NEW_BOOL_F;
	NumericField aNumericFieldRID_NF_NEW_INTEGER;
	NumericField aNumericFieldRID_NF_NEW_LONG;
	Edit aEditRID_ED_NEW_STRING;

	OKButton aOKButtonRID_OK;
	CancelButton aCancelButtonRID_CANCEL;

	SbxVariable *pVar;

	DECL_LINK( OKClick, Button * );

//	sal_Bool bCompare = sal_False;
//	String aCompareString;

public:
	VarEditDialog( Window * pParent, SbxVariable *pPVar );
};


#endif
