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



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_dbui.hxx"

#include "detailpages.hxx"
#include "sqlmessage.hxx"
#include "dsmeta.hxx"
#include "advancedsettings.hxx"
#include "DbAdminImpl.hxx"
#include "dsitems.hxx"
#include "dbfindex.hxx"
#include "localresaccess.hxx"
#include "dsnItem.hxx"

#include "dbaccess_helpid.hrc"
#include "dbu_dlg.hrc"
#include "dbadmin.hrc"

#ifndef _SFXITEMSET_HXX
#include <svl/itemset.hxx>
#endif
#ifndef _SFXSTRITEM_HXX
#include <svl/stritem.hxx>
#endif
#ifndef _SFXENUMITEM_HXX
#include <svl/eitem.hxx>
#endif
#ifndef _SFXINTITEM_HXX
#include <svl/intitem.hxx>
#endif
#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef _SV_MNEMONIC_HXX
#include <vcl/mnemonic.hxx>
#endif
#ifndef _SVTOOLS_CJKOPTIONS_HXX
#include <svl/cjkoptions.hxx>
#endif
#include <jvmaccess/virtualmachine.hxx>
#ifndef DBAUI_ADABASPAGE_HRC
#include "AdabasPage.hrc"
#endif
#ifndef _DBAUI_ADASTAT_HXX_
#include "AdabasStat.hxx"
#endif
#ifndef _CONNECTIVITY_COMMONTOOLS_HXX_
#include <connectivity/CommonTools.hxx>
#endif
#ifndef DBAUI_DRIVERSETTINGS_HXX
#include "DriverSettings.hxx"
#endif
#ifndef _DBAUI_DBADMIN_HXX_
#include "dbadmin.hxx"
#endif
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#include "AutoControlsDef.hrc"

//.........................................................................
namespace dbaui
{
//.........................................................................

	using namespace ::com::sun::star::uno;
	using namespace ::com::sun::star::sdbc;
	using namespace ::com::sun::star::beans;
	using namespace ::com::sun::star::lang;
	using namespace ::com::sun::star::container;
	using namespace ::dbtools;

	//========================================================================
	//= OCommonBehaviourTabPage
    //========================================================================
    DBG_NAME(OCommonBehaviourTabPage)
    //------------------------------------------------------------------------
	OCommonBehaviourTabPage::OCommonBehaviourTabPage(Window* pParent, sal_uInt16 nResId, const SfxItemSet& _rCoreAttrs,
		sal_uInt32 nControlFlags,bool _bFreeResource)

		:OGenericAdministrationPage(pParent, ModuleRes(nResId), _rCoreAttrs)
		,m_pOptionsLabel(NULL)
		,m_pOptions(NULL)
		,m_pDataConvertFixedLine(NULL)
		,m_pCharsetLabel(NULL)
		,m_pCharset(NULL)
        ,m_pAutoFixedLine(NULL)
		,m_pAutoRetrievingEnabled(NULL)
		,m_pAutoIncrementLabel(NULL)
		,m_pAutoIncrement(NULL)
		,m_pAutoRetrievingLabel(NULL)
		,m_pAutoRetrieving(NULL)
		,m_nControlFlags(nControlFlags)
	{
        DBG_CTOR(OCommonBehaviourTabPage,NULL);

		if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
		{
			m_pOptionsLabel = new FixedText(this, ModuleRes(FT_OPTIONS));
			m_pOptions = new Edit(this, ModuleRes(ET_OPTIONS));
			m_pOptions->SetModifyHdl(getControlModifiedLink());
		}

		if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
		{
			m_pDataConvertFixedLine = new FixedLine(this, ModuleRes(FL_DATACONVERT));
			m_pCharsetLabel = new FixedText(this, ModuleRes(FT_CHARSET));
			m_pCharset = new CharSetListBox(this, ModuleRes(LB_CHARSET));
			m_pCharset->SetSelectHdl(getControlModifiedLink());
		}

		Window* pWindows[] = { 	m_pAutoRetrievingEnabled, m_pAutoFixedLine,
								m_pAutoIncrementLabel, m_pAutoIncrement,
								m_pAutoRetrievingLabel, m_pAutoRetrieving };

		sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
		for (sal_Int32 i=1; i < nCount; ++i)
		{
			if ( pWindows[i] )
			{
				Window* pPrev = pWindows[i-1];
				for (sal_Int32 j = i-1; pPrev == NULL && j >= 0 ; --j)
				{
					pPrev = pWindows[j];
				}
				if ( pPrev )
					pWindows[i]->SetZOrder(pPrev, WINDOW_ZORDER_BEHIND);
			}
		}

		if ( _bFreeResource )
			FreeResource();
	}

	// -----------------------------------------------------------------------
	OCommonBehaviourTabPage::~OCommonBehaviourTabPage()
	{
		DELETEZ(m_pOptionsLabel);
		DELETEZ(m_pOptions);

		DELETEZ(m_pDataConvertFixedLine);
		DELETEZ(m_pCharsetLabel);
		DELETEZ(m_pCharset);

		DELETEZ(m_pAutoFixedLine);
		DELETEZ(m_pAutoIncrementLabel);
		DELETEZ(m_pAutoIncrement);

		DELETEZ(m_pAutoRetrievingEnabled);
		DELETEZ(m_pAutoRetrievingLabel);
		DELETEZ(m_pAutoRetrieving);

        DBG_DTOR(OCommonBehaviourTabPage,NULL);
    }

	// -----------------------------------------------------------------------
	void OCommonBehaviourTabPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
		{
			_rControlList.push_back(new ODisableWrapper<FixedText>(m_pOptionsLabel));
		}

		if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
		{
			_rControlList.push_back(new ODisableWrapper<FixedLine>(m_pDataConvertFixedLine));
			_rControlList.push_back(new ODisableWrapper<FixedText>(m_pCharsetLabel));
		}
	}
	// -----------------------------------------------------------------------
	void OCommonBehaviourTabPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
			_rControlList.push_back(new OSaveValueWrapper<Edit>(m_pOptions));

		if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
			_rControlList.push_back(new OSaveValueWrapper<ListBox>(m_pCharset));
	}

	// -----------------------------------------------------------------------
	void OCommonBehaviourTabPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

		// collect the items
		SFX_ITEMSET_GET(_rSet, pOptionsItem, SfxStringItem, DSID_ADDITIONALOPTIONS, sal_True);
		SFX_ITEMSET_GET(_rSet, pCharsetItem, SfxStringItem, DSID_CHARSET, sal_True);

		// forward the values to the controls
		if (bValid)
		{
			if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
			{
				m_pOptions->SetText(pOptionsItem->GetValue());
				m_pOptions->ClearModifyFlag();
			}

			if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
			{
                m_pCharset->SelectEntryByIanaName( pCharsetItem->GetValue() );
			}
		}
		OGenericAdministrationPage::implInitControls(_rSet, _bSaveValue);
	}
	// -----------------------------------------------------------------------
	sal_Bool OCommonBehaviourTabPage::FillItemSet(SfxItemSet& _rSet)
	{
		sal_Bool bChangedSomething = sal_False;

		if ((m_nControlFlags & CBTP_USE_OPTIONS) == CBTP_USE_OPTIONS)
		{
			fillString(_rSet,m_pOptions,DSID_ADDITIONALOPTIONS,bChangedSomething);
		}

		if ((m_nControlFlags & CBTP_USE_CHARSET) == CBTP_USE_CHARSET)
		{
            if ( m_pCharset->StoreSelectedCharSet( _rSet, DSID_CHARSET ) )
				bChangedSomething = sal_True;
		}

		return bChangedSomething;
	}

	//========================================================================
	//= ODbaseDetailsPage
	//========================================================================
    DBG_NAME(ODbaseDetailsPage)
    //------------------------------------------------------------------------
	ODbaseDetailsPage::ODbaseDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_DBASE, _rCoreAttrs, CBTP_USE_CHARSET ,false)
		,m_aShowDeleted		(this, ModuleRes(CB_SHOWDELETEDROWS))
		,m_aFL_1			(this, ModuleRes( FL_SEPARATOR1) )
		,m_aFT_Message		(this, ModuleRes( FT_SPECIAL_MESSAGE) )
		,m_aIndexes			(this, ModuleRes(PB_INDICIES))
	{
        DBG_CTOR(ODbaseDetailsPage,NULL);

		m_aIndexes.SetClickHdl(LINK(this, ODbaseDetailsPage, OnButtonClicked));
		m_aShowDeleted.SetClickHdl(LINK(this, ODbaseDetailsPage, OnButtonClicked));

		// correct the z-order which is mixed-up because the base class constructed some controls before we did
		m_pCharset->SetZOrder(&m_aShowDeleted, WINDOW_ZORDER_BEFOR);

		FreeResource();
	}

	// -----------------------------------------------------------------------
	ODbaseDetailsPage::~ODbaseDetailsPage()
	{

        DBG_DTOR(ODbaseDetailsPage,NULL);
    }

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateDbase( Window* pParent,	const SfxItemSet& _rAttrSet )
	{
		return ( new ODbaseDetailsPage( pParent, _rAttrSet ) );
	}

	// -----------------------------------------------------------------------
	void ODbaseDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls(_rControlList);
		_rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aShowDeleted));
	}
	// -----------------------------------------------------------------------
	void ODbaseDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows(_rControlList);
		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFT_Message));
		_rControlList.push_back(new ODisableWrapper<PushButton>(&m_aIndexes));
	}
	// -----------------------------------------------------------------------
	void ODbaseDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

		// get the DSN string (needed for the index dialog)
		SFX_ITEMSET_GET(_rSet, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
		SFX_ITEMSET_GET(_rSet, pTypesItem, DbuTypeCollectionItem, DSID_TYPECOLLECTION, sal_True);
		::dbaccess::ODsnTypeCollection* pTypeCollection = pTypesItem ? pTypesItem->getCollection() : NULL;
		if (pTypeCollection && pUrlItem && pUrlItem->GetValue().Len())
			m_sDsn = pTypeCollection->cutPrefix(pUrlItem->GetValue());

		// get the other relevant items
		SFX_ITEMSET_GET(_rSet, pDeletedItem, SfxBoolItem, DSID_SHOWDELETEDROWS, sal_True);

		if ( bValid )
		{
			m_aShowDeleted.Check( pDeletedItem->GetValue() );
			m_aFT_Message.Show(m_aShowDeleted.IsChecked());
		}

		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
	}

	// -----------------------------------------------------------------------
	sal_Bool ODbaseDetailsPage::FillItemSet( SfxItemSet& _rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);

		fillBool(_rSet,&m_aShowDeleted,DSID_SHOWDELETEDROWS,bChangedSomething);
		return bChangedSomething;
	}

	//------------------------------------------------------------------------
	IMPL_LINK( ODbaseDetailsPage, OnButtonClicked, Button*, pButton )
	{
		if (&m_aIndexes == pButton)
		{
			ODbaseIndexDialog aIndexDialog(this, m_sDsn);
			aIndexDialog.Execute();
		}
		else
		{
			m_aFT_Message.Show(m_aShowDeleted.IsChecked());
			// it was one of the checkboxes -> we count as modified from now on
			callModifiedHdl();
		}

		return 0;
	}

	//========================================================================
	//= OAdoDetailsPage
    //========================================================================
    DBG_NAME(OAdoDetailsPage)
	// -----------------------------------------------------------------------
	OAdoDetailsPage::OAdoDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_ADO, _rCoreAttrs, CBTP_USE_CHARSET )
	{
        DBG_CTOR(OAdoDetailsPage,NULL);

	}

	// -----------------------------------------------------------------------
	OAdoDetailsPage::~OAdoDetailsPage()
	{

        DBG_DTOR(OAdoDetailsPage,NULL);
    }
	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateAdo( Window* pParent,	const SfxItemSet& _rAttrSet )
	{
		return ( new OAdoDetailsPage( pParent, _rAttrSet ) );
	}

	// -----------------------------------------------------------------------
	//========================================================================
	//= OOdbcDetailsPage
	//========================================================================
	OOdbcDetailsPage::OOdbcDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_ODBC, _rCoreAttrs, CBTP_USE_CHARSET | CBTP_USE_OPTIONS,false)
		,m_aFL_1		(this, ModuleRes(FL_SEPARATOR1))
		,m_aUseCatalog	(this, ModuleRes(CB_USECATALOG))
	{
		m_aUseCatalog.SetToggleHdl(getControlModifiedLink());
		FreeResource();

		Window* pWindows[] = {  m_pCharsetLabel, m_pCharset
								,m_pOptionsLabel,m_pOptions,&m_aUseCatalog
								};

		sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
		for (sal_Int32 i=1; i < nCount; ++i)
			pWindows[i]->SetZOrder(pWindows[i-1], WINDOW_ZORDER_BEHIND);
	}

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateODBC( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new OOdbcDetailsPage( pParent, _rAttrSet ) );
	}

	// -----------------------------------------------------------------------
	sal_Bool OOdbcDetailsPage::FillItemSet( SfxItemSet& _rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
		fillBool(_rSet,&m_aUseCatalog,DSID_USECATALOG,bChangedSomething);
		return bChangedSomething;
	}
	// -----------------------------------------------------------------------
	void OOdbcDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls(_rControlList);
		_rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aUseCatalog));
	}
	// -----------------------------------------------------------------------
	void OOdbcDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows(_rControlList);
		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
	}
	// -----------------------------------------------------------------------
	void OOdbcDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

		SFX_ITEMSET_GET(_rSet, pUseCatalogItem, SfxBoolItem, DSID_USECATALOG, sal_True);

		if ( bValid )
			m_aUseCatalog.Check(pUseCatalogItem->GetValue());

		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
	}
	//========================================================================
	//= OOdbcDetailsPage
	//========================================================================
	OUserDriverDetailsPage::OUserDriverDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_USERDRIVER, _rCoreAttrs,
		CBTP_USE_CHARSET | CBTP_USE_OPTIONS ,false)
		,m_aFTHostname		(this, ModuleRes(FT_HOSTNAME))
		,m_aEDHostname		(this, ModuleRes(ET_HOSTNAME))
		,m_aPortNumber		(this, ModuleRes(FT_PORTNUMBER))
		,m_aNFPortNumber	(this, ModuleRes(NF_PORTNUMBER))
		,m_aUseCatalog		(this, ModuleRes(CB_USECATALOG))
	{
		m_aUseCatalog.SetToggleHdl(getControlModifiedLink());
		FreeResource();
	}

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateUser( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new OUserDriverDetailsPage( pParent, _rAttrSet ) );
	}

	// -----------------------------------------------------------------------
	sal_Bool OUserDriverDetailsPage::FillItemSet( SfxItemSet& _rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);

		fillInt32(_rSet,&m_aNFPortNumber,DSID_CONN_PORTNUMBER,bChangedSomething);
		fillString(_rSet,&m_aEDHostname,DSID_CONN_HOSTNAME,bChangedSomething);
		fillBool(_rSet,&m_aUseCatalog,DSID_USECATALOG,bChangedSomething);

		return bChangedSomething;
	}
	// -----------------------------------------------------------------------
	void OUserDriverDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls(_rControlList);
		_rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDHostname));
		_rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aUseCatalog));
		_rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFPortNumber));
	}
	// -----------------------------------------------------------------------
	void OUserDriverDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows(_rControlList);
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTHostname));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aPortNumber));
	}
	// -----------------------------------------------------------------------
	void OUserDriverDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

		SFX_ITEMSET_GET(_rSet, pUseCatalogItem, SfxBoolItem, DSID_USECATALOG, sal_True);
		SFX_ITEMSET_GET(_rSet, pHostName, SfxStringItem, DSID_CONN_HOSTNAME, sal_True);
		SFX_ITEMSET_GET(_rSet, pPortNumber, SfxInt32Item, DSID_CONN_PORTNUMBER, sal_True);

		if ( bValid )
		{
			m_aEDHostname.SetText(pHostName->GetValue());
			m_aEDHostname.ClearModifyFlag();

			m_aNFPortNumber.SetValue(pPortNumber->GetValue());
			m_aNFPortNumber.ClearModifyFlag();

			m_aUseCatalog.Check(pUseCatalogItem->GetValue());
		}

		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
	}
	//========================================================================
	//= OMySQLODBCDetailsPage
	//========================================================================
	OMySQLODBCDetailsPage::OMySQLODBCDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_MYSQL_ODBC, _rCoreAttrs, CBTP_USE_CHARSET )
	{
	}

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateMySQLODBC( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new OMySQLODBCDetailsPage( pParent, _rAttrSet ) );
	}

	//========================================================================
	//= OMySQLJDBCDetailsPage
	//========================================================================
	OGeneralSpecialJDBCDetailsPage::OGeneralSpecialJDBCDetailsPage( Window* pParent,sal_uInt16 _nResId, const SfxItemSet& _rCoreAttrs ,sal_uInt16 _nPortId)
		:OCommonBehaviourTabPage(pParent, _nResId, _rCoreAttrs, CBTP_USE_CHARSET ,false)
		,m_aFL_1			(this, ModuleRes( FL_SEPARATOR1) )
		,m_aFTHostname		(this, ModuleRes(FT_HOSTNAME))
		,m_aEDHostname		(this, ModuleRes(ET_HOSTNAME))
		,m_aPortNumber		(this, ModuleRes(FT_PORTNUMBER))
		,m_aNFPortNumber	(this, ModuleRes(NF_PORTNUMBER))
        ,m_aFTSocket		(this, ModuleRes(FT_SOCKET))
		,m_aEDSocket		(this, ModuleRes(ET_SOCKET))
		,m_aFTDriverClass	(this, ModuleRes(FT_JDBCDRIVERCLASS))
		,m_aEDDriverClass	(this, ModuleRes(ET_JDBCDRIVERCLASS))
		,m_aTestJavaDriver	(this, ModuleRes(PB_TESTDRIVERCLASS))
		,m_nPortId(_nPortId)
        ,m_bUseClass(true)
	{
        SFX_ITEMSET_GET(_rCoreAttrs, pUrlItem, SfxStringItem, DSID_CONNECTURL, sal_True);
        SFX_ITEMSET_GET(_rCoreAttrs, pTypesItem, DbuTypeCollectionItem, DSID_TYPECOLLECTION, sal_True);
	    ::dbaccess::ODsnTypeCollection* pTypeCollection = pTypesItem ? pTypesItem->getCollection() : NULL;
	    if (pTypeCollection && pUrlItem && pUrlItem->GetValue().Len() )
        {
            m_sDefaultJdbcDriverName = pTypeCollection->getJavaDriverClass(pUrlItem->GetValue());
        }
        if ( m_sDefaultJdbcDriverName.Len() )
        {
            m_aEDDriverClass.SetModifyHdl(getControlModifiedLink());
            m_aEDDriverClass.SetModifyHdl(LINK(this, OGeneralSpecialJDBCDetailsPage, OnEditModified));
		    m_aTestJavaDriver.SetClickHdl(LINK(this,OGeneralSpecialJDBCDetailsPage,OnTestJavaClickHdl));
        }
        else
        {
            m_bUseClass = false;
            m_aFTDriverClass.Show(sal_False);
            m_aEDDriverClass.Show(sal_False);
            m_aTestJavaDriver.Show(sal_False);
        }

        m_aFTSocket.Show(PAGE_MYSQL_JDBC == _nResId && !m_bUseClass);
        m_aEDSocket.Show(PAGE_MYSQL_JDBC == _nResId && !m_bUseClass);
		
		m_aEDHostname.SetModifyHdl(getControlModifiedLink());
		m_aNFPortNumber.SetModifyHdl(getControlModifiedLink());
        m_aEDSocket.SetModifyHdl(getControlModifiedLink());

		Window* pWindows[] = {  &m_aFTHostname,&m_aEDHostname,
								&m_aPortNumber,&m_aNFPortNumber,&m_aFTSocket,&m_aEDSocket,
								&m_aFTDriverClass, &m_aEDDriverClass,&m_aTestJavaDriver,
								m_pCharsetLabel, m_pCharset};

		sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
		for (sal_Int32 i=1; i < nCount; ++i)
			pWindows[i]->SetZOrder(pWindows[i-1], WINDOW_ZORDER_BEHIND);

		FreeResource();
	}

	// -----------------------------------------------------------------------
	void OGeneralSpecialJDBCDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls(_rControlList);
        if ( m_bUseClass )
		    _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDDriverClass));
		_rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDHostname));
		_rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFPortNumber));
        _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDSocket));
	}
	// -----------------------------------------------------------------------
	void OGeneralSpecialJDBCDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows(_rControlList);
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTHostname));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aPortNumber));
        _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTSocket));
        if ( m_bUseClass )
		    _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTDriverClass));
		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
	}

	// -----------------------------------------------------------------------
	sal_Bool OGeneralSpecialJDBCDetailsPage::FillItemSet( SfxItemSet& _rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);
        if ( m_bUseClass )
		    fillString(_rSet,&m_aEDDriverClass,DSID_JDBCDRIVERCLASS,bChangedSomething);
		fillString(_rSet,&m_aEDHostname,DSID_CONN_HOSTNAME,bChangedSomething);
        fillString(_rSet,&m_aEDSocket,DSID_CONN_SOCKET,bChangedSomething);
		fillInt32(_rSet,&m_aNFPortNumber,m_nPortId,bChangedSomething );

		return bChangedSomething;
	}
	// -----------------------------------------------------------------------
	void OGeneralSpecialJDBCDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

		SFX_ITEMSET_GET(_rSet, pDrvItem, SfxStringItem, DSID_JDBCDRIVERCLASS, sal_True);
		SFX_ITEMSET_GET(_rSet, pHostName, SfxStringItem, DSID_CONN_HOSTNAME, sal_True);
		SFX_ITEMSET_GET(_rSet, pPortNumber, SfxInt32Item, m_nPortId, sal_True);
        SFX_ITEMSET_GET(_rSet, pSocket, SfxStringItem, DSID_CONN_SOCKET, sal_True);

		if ( bValid )
		{
            if ( m_bUseClass )
            {
			    m_aEDDriverClass.SetText(pDrvItem->GetValue());
			    m_aEDDriverClass.ClearModifyFlag();
            }

			m_aEDHostname.SetText(pHostName->GetValue());
			m_aEDHostname.ClearModifyFlag();

			m_aNFPortNumber.SetValue(pPortNumber->GetValue());
			m_aNFPortNumber.ClearModifyFlag();

            m_aEDSocket.SetText(pSocket->GetValue());
			m_aEDSocket.ClearModifyFlag();
		}

		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);

		// to get the correcxt value when saveValue was called by base class
		if ( m_bUseClass && !m_aEDDriverClass.GetText().Len() )
		{
			m_aEDDriverClass.SetText(m_sDefaultJdbcDriverName);
			m_aEDDriverClass.SetModifyFlag();
		}
	}
	// -----------------------------------------------------------------------
	IMPL_LINK(OGeneralSpecialJDBCDetailsPage, OnTestJavaClickHdl, PushButton*, /*_pButton*/)
	{
		OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
        OSL_ENSURE(m_bUseClass,"Who called me?");

		sal_Bool bSuccess = sal_False;
		try
		{
			if ( m_aEDDriverClass.GetText().Len() )
			{
// TODO chage jvmaccess
				::rtl::Reference< jvmaccess::VirtualMachine > xJVM = ::connectivity::getJavaVM(m_pAdminDialog->getORB());
				bSuccess = ::connectivity::existsJavaClassByName(xJVM,m_aEDDriverClass.GetText());
			}
		}
		catch(Exception&)
		{
		}

		sal_uInt16 nMessage = bSuccess ? STR_JDBCDRIVER_SUCCESS : STR_JDBCDRIVER_NO_SUCCESS;
		OSQLMessageBox aMsg( this, String( ModuleRes( nMessage ) ), String() );
		aMsg.Execute();
		return 0L;
	}
	// -----------------------------------------------------------------------
	IMPL_LINK(OGeneralSpecialJDBCDetailsPage, OnEditModified, Edit*, _pEdit)
	{
		if ( m_bUseClass && _pEdit == &m_aEDDriverClass )
			m_aTestJavaDriver.Enable( m_aEDDriverClass.GetText().Len() != 0 );

		// tell the listener we were modified
		callModifiedHdl();
		return 0L;
	}

	//========================================================================
	//= MySQLNativePage
	//========================================================================
	MySQLNativePage::MySQLNativePage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_MYSQL_NATIVE, _rCoreAttrs, CBTP_USE_CHARSET, false )
		,m_aSeparator1          ( this, ModuleRes( FL_SEPARATOR1) )
        ,m_aMySQLSettings       ( *this, getControlModifiedLink() )
        ,m_aSeparator2          ( this, ModuleRes(FL_SEPARATOR2))
        ,m_aUserNameLabel       ( this, ModuleRes(FT_USERNAME))
        ,m_aUserName            ( this, ModuleRes(ET_USERNAME))
        ,m_aPasswordRequired    ( this, ModuleRes(CB_PASSWORD_REQUIRED))
	{
        m_aUserName.SetModifyHdl(getControlModifiedLink());

		Window* pWindows[] = {  &m_aMySQLSettings, &m_aSeparator2, &m_aUserNameLabel, &m_aUserName,
                                &m_aPasswordRequired, m_pCharsetLabel, m_pCharset};
		sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
		for (sal_Int32 i=1; i < nCount; ++i)
			pWindows[i]->SetZOrder(pWindows[i-1], WINDOW_ZORDER_BEHIND);

        LayoutHelper::positionBelow( m_aSeparator1, m_aMySQLSettings, RelatedControls, 3 );
        m_aMySQLSettings.Show();

		FreeResource();
	}

	// -----------------------------------------------------------------------
	void MySQLNativePage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls( _rControlList );
        m_aMySQLSettings.fillControls( _rControlList );

        _rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aUserName));
        _rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aPasswordRequired));
	}
	// -----------------------------------------------------------------------
	void MySQLNativePage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows( _rControlList );
        m_aMySQLSettings.fillWindows( _rControlList);

		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aSeparator1));
		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aSeparator2));
        _rControlList.push_back(new ODisableWrapper<FixedText>(&m_aUserNameLabel));
	}

	// -----------------------------------------------------------------------
	sal_Bool MySQLNativePage::FillItemSet( SfxItemSet& _rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet( _rSet );

        bChangedSomething |= m_aMySQLSettings.FillItemSet( _rSet );

        if ( m_aUserName.GetText() != m_aUserName.GetSavedValue() )
		{
			_rSet.Put( SfxStringItem( DSID_USER, m_aUserName.GetText() ) );
			_rSet.Put( SfxStringItem( DSID_PASSWORD, String()));
			bChangedSomething = sal_True;
		}
		fillBool(_rSet,&m_aPasswordRequired,DSID_PASSWORDREQUIRED,bChangedSomething);

        return bChangedSomething;
	}
	// -----------------------------------------------------------------------
	void MySQLNativePage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

        m_aMySQLSettings.implInitControls( _rSet );

		SFX_ITEMSET_GET(_rSet, pUidItem, SfxStringItem, DSID_USER, sal_True);
		SFX_ITEMSET_GET(_rSet, pAllowEmptyPwd, SfxBoolItem, DSID_PASSWORDREQUIRED, sal_True);

		if ( bValid )
		{
            m_aUserName.SetText(pUidItem->GetValue());
            m_aUserName.ClearModifyFlag();
			m_aPasswordRequired.Check(pAllowEmptyPwd->GetValue());
		}

		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
	}

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateMySQLJDBC( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new OGeneralSpecialJDBCDetailsPage( pParent,PAGE_MYSQL_JDBC, _rAttrSet,DSID_MYSQL_PORTNUMBER ) );
	}
    // -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateMySQLNATIVE( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new MySQLNativePage( pParent, _rAttrSet ) );
	}

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateOracleJDBC( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new OGeneralSpecialJDBCDetailsPage( pParent,PAGE_ORACLE_JDBC, _rAttrSet,DSID_ORACLE_PORTNUMBER) );
	}


	//========================================================================
	//= OAdabasDetailsPage
	//========================================================================
	OAdabasDetailsPage::OAdabasDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_ADABAS, _rCoreAttrs, CBTP_USE_CHARSET ,false)
		,m_aFTHostname		(this, ModuleRes(FT_HOSTNAME))
		,m_aEDHostname		(this, ModuleRes(ET_HOSTNAME))
		,m_aFL_1			(this, ModuleRes( FL_SEPARATOR1) )
		,m_FT_CACHE_SIZE(		this, ModuleRes( FT_CACHE_SIZE		) )
		,m_NF_CACHE_SIZE(		this, ModuleRes( NF_CACHE_SIZE		) )
		,m_FT_DATA_INCREMENT(	this, ModuleRes( FT_DATA_INCREMENT	) )
		,m_NF_DATA_INCREMENT(	this, ModuleRes( NF_DATA_INCREMENT	) )
		,m_aFL_2(				this, ModuleRes( FL_SEPARATOR2		) )
		,m_FT_CTRLUSERNAME(		this, ModuleRes( FT_CTRLUSERNAME	) )
		,m_ET_CTRLUSERNAME(		this, ModuleRes( ET_CTRLUSERNAME	) )
		,m_FT_CTRLPASSWORD(		this, ModuleRes( FT_CTRLPASSWORD	) )
		,m_ET_CTRLPASSWORD(		this, ModuleRes( ET_CTRLPASSWORD	) )
        ,m_CB_SHUTDB(			this, ModuleRes( CB_SHUTDB			) )
		,m_PB_STAT(				this, ModuleRes( PB_STAT			) )
	{
		m_aEDHostname.SetModifyHdl(getControlModifiedLink());

		FreeResource();

		m_PB_STAT.SetClickHdl(				LINK(this,OAdabasDetailsPage,PBClickHdl));

		m_CB_SHUTDB.SetClickHdl(			LINK(this,OAdabasDetailsPage,AttributesChangedHdl));
		m_NF_CACHE_SIZE.SetModifyHdl(		LINK(this,OAdabasDetailsPage,AttributesChangedHdl));
		m_NF_DATA_INCREMENT.SetModifyHdl(	LINK(this,OAdabasDetailsPage,AttributesChangedHdl));
		m_ET_CTRLUSERNAME.SetModifyHdl(		LINK(this,OAdabasDetailsPage,AttributesChangedHdl));
		m_ET_CTRLPASSWORD.SetModifyHdl(		LINK(this,OAdabasDetailsPage,AttributesChangedHdl));

		m_ET_CTRLUSERNAME.SetLoseFocusHdl(	LINK(this,OAdabasDetailsPage,LoseFocusHdl));
		m_ET_CTRLPASSWORD.SetLoseFocusHdl(	LINK(this,OAdabasDetailsPage,LoseFocusHdl));

		m_NF_DATA_INCREMENT.SetMin(20);
		m_NF_DATA_INCREMENT.SetMax(LONG_MAX);
		m_NF_DATA_INCREMENT.SetValue(20);
		m_NF_DATA_INCREMENT.SetDecimalDigits(0);

		m_NF_CACHE_SIZE.SetMin(4);
		m_NF_CACHE_SIZE.SetMax(LONG_MAX);
		m_NF_CACHE_SIZE.SetValue(4);
		m_NF_CACHE_SIZE.SetDecimalDigits(0);

		Window* pWindows[] = {  &m_aFTHostname,&m_aEDHostname
								,&m_FT_CACHE_SIZE,&m_NF_CACHE_SIZE
								,&m_FT_DATA_INCREMENT,&m_NF_DATA_INCREMENT
								,&m_FT_CTRLUSERNAME,&m_ET_CTRLUSERNAME
								,&m_FT_CTRLPASSWORD,&m_ET_CTRLPASSWORD
								,&m_CB_SHUTDB
								,m_pCharsetLabel, m_pCharset,&m_PB_STAT};

		sal_Int32 nCount = sizeof(pWindows) / sizeof(pWindows[0]);
		for (sal_Int32 i=1; i < nCount; ++i)
			pWindows[i]->SetZOrder(pWindows[i-1], WINDOW_ZORDER_BEHIND);
	}

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateAdabas( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new OAdabasDetailsPage( pParent, _rAttrSet ) );
	}

	// -----------------------------------------------------------------------
	void OAdabasDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls(_rControlList);
		_rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aEDHostname));
		_rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_NF_CACHE_SIZE));
		_rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_NF_DATA_INCREMENT));
		_rControlList.push_back(new OSaveValueWrapper<Edit>(&m_ET_CTRLUSERNAME));
		_rControlList.push_back(new OSaveValueWrapper<Edit>(&m_ET_CTRLPASSWORD));
		_rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_CB_SHUTDB));
	}
	// -----------------------------------------------------------------------
	void OAdabasDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows(_rControlList);
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTHostname));
		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_FT_CACHE_SIZE));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_FT_DATA_INCREMENT));
		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_2));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_FT_CTRLUSERNAME));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_FT_CTRLPASSWORD));
		_rControlList.push_back(new ODisableWrapper<PushButton>(&m_PB_STAT));
	}
	// -----------------------------------------------------------------------
	void OAdabasDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// first check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

		SFX_ITEMSET_GET(_rSet, pHostName, SfxStringItem, DSID_CONN_HOSTNAME, sal_True);
		SFX_ITEMSET_GET(_rSet, pCtrlUserItem, SfxStringItem, DSID_CONN_CTRLUSER, sal_True);
		SFX_ITEMSET_GET(_rSet, pCtrlPwdItem, SfxStringItem, DSID_CONN_CTRLPWD, sal_True);
		SFX_ITEMSET_GET(_rSet, pShutItem, SfxBoolItem, DSID_CONN_SHUTSERVICE, sal_True);
		SFX_ITEMSET_GET(_rSet, pIncItem, SfxInt32Item, DSID_CONN_DATAINC, sal_True);
		SFX_ITEMSET_GET(_rSet, pCacheItem, SfxInt32Item, DSID_CONN_CACHESIZE, sal_True);
		if ( bValid )
		{
			m_aEDHostname.SetText(pHostName->GetValue());
			m_aEDHostname.ClearModifyFlag();
			m_CB_SHUTDB.Check( pShutItem->GetValue() );
			m_NF_DATA_INCREMENT.SetValue( pIncItem->GetValue() );
			m_NF_CACHE_SIZE.SetValue( pCacheItem->GetValue() );
			m_ET_CTRLUSERNAME.SetText(pCtrlUserItem->GetValue());
			m_ET_CTRLPASSWORD.SetText(pCtrlPwdItem->GetValue());
			m_CB_SHUTDB.Enable(m_ET_CTRLUSERNAME.GetText().Len() && m_ET_CTRLPASSWORD.GetText().Len());
		}

		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
	}
	// -----------------------------------------------------------------------
	sal_Bool OAdabasDetailsPage::FillItemSet( SfxItemSet& _rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);

		fillString(_rSet,&m_aEDHostname,DSID_CONN_HOSTNAME,bChangedSomething);
		fillBool(_rSet,&m_CB_SHUTDB,DSID_CONN_SHUTSERVICE,bChangedSomething);
		fillInt32(_rSet,&m_NF_DATA_INCREMENT,DSID_CONN_DATAINC,bChangedSomething );
		fillInt32(_rSet,&m_NF_CACHE_SIZE,DSID_CONN_CACHESIZE,bChangedSomething );
		fillString(_rSet,&m_ET_CTRLUSERNAME,DSID_CONN_CTRLUSER,bChangedSomething );
		fillString(_rSet,&m_ET_CTRLPASSWORD,DSID_CONN_CTRLPWD,bChangedSomething );

		return bChangedSomething;
	}
	//------------------------------------------------------------------------
	IMPL_LINK( OAdabasDetailsPage, AttributesChangedHdl, void *, EMPTYARG )
	{
		m_CB_SHUTDB.Enable(m_ET_CTRLUSERNAME.GetText().Len() && m_ET_CTRLPASSWORD.GetText().Len());
		bAttrsChanged = sal_True;
		callModifiedHdl();
		return 0;
	}
	//------------------------------------------------------------------------
	IMPL_LINK( OAdabasDetailsPage, LoseFocusHdl, Edit *, /*pEdit*/ )
	{
		m_CB_SHUTDB.Enable(m_ET_CTRLUSERNAME.GetText().Len() && m_ET_CTRLPASSWORD.GetText().Len());
		return 0;
	}
	//------------------------------------------------------------------------
	IMPL_LINK( OAdabasDetailsPage, PBClickHdl, Button *, /*pButton*/ )
	{
		OSL_ENSURE(m_pAdminDialog,"No Admin dialog set! ->GPF");
		if ( m_pAdminDialog )
		{
			m_pAdminDialog->saveDatasource();
			try
			{
				Reference< XConnection > xConnection = m_pAdminDialog->createConnection().first;
				if ( xConnection.is() )
				{
					OAdabasStatistics aDlg(this,m_sUser,xConnection,m_pAdminDialog->getORB());
					aDlg.Execute();
					::comphelper::disposeComponent(xConnection);
				}
			}
			catch(Exception&)
			{
			}
		}

		return 0;
	}


	//========================================================================
	//= OLDAPDetailsPage
	//========================================================================
	OLDAPDetailsPage::OLDAPDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_LDAP, _rCoreAttrs,0,false)
		,m_aFL_1			(this, ModuleRes( FL_SEPARATOR1) )
		,m_aBaseDN			(this, ModuleRes(FT_BASEDN))
		,m_aETBaseDN		(this, ModuleRes(ET_BASEDN))
 		,m_aCBUseSSL        (this, ModuleRes(CB_USESSL))
		,m_aPortNumber		(this, ModuleRes(FT_PORTNUMBER))
		,m_aNFPortNumber	(this, ModuleRes(NF_PORTNUMBER))
		,m_aFTRowCount		(this, ModuleRes(FT_LDAPROWCOUNT))
		,m_aNFRowCount		(this, ModuleRes(NF_LDAPROWCOUNT))
	{
		m_aETBaseDN.SetModifyHdl(getControlModifiedLink());
		m_aCBUseSSL.SetToggleHdl(getControlModifiedLink());
		m_aNFPortNumber.SetModifyHdl(getControlModifiedLink());
		m_aNFRowCount.SetModifyHdl(getControlModifiedLink());

		m_aNFRowCount.SetUseThousandSep(sal_False);
		m_iNormalPort = 389;
		m_iSSLPort    = 636;
		m_aCBUseSSL.SetClickHdl(LINK(this, OLDAPDetailsPage,OnCheckBoxClick));
        FreeResource();
	}

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateLDAP( Window* pParent, const SfxItemSet& _rAttrSet )
	{
		return ( new OLDAPDetailsPage( pParent, _rAttrSet ) );
	}

	// -----------------------------------------------------------------------
	sal_Bool OLDAPDetailsPage::FillItemSet( SfxItemSet& _rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(_rSet);

		fillString(_rSet,&m_aETBaseDN,DSID_CONN_LDAP_BASEDN,bChangedSomething);
		fillInt32(_rSet,&m_aNFPortNumber,DSID_CONN_LDAP_PORTNUMBER,bChangedSomething);
		fillInt32(_rSet,&m_aNFRowCount,DSID_CONN_LDAP_ROWCOUNT,bChangedSomething);
		fillBool(_rSet,&m_aCBUseSSL,DSID_CONN_LDAP_USESSL,bChangedSomething);
		return bChangedSomething;
	}
	//------------------------------------------------------------------------
	IMPL_LINK( OLDAPDetailsPage, OnCheckBoxClick, CheckBox*, pCheckBox )
	{
		callModifiedHdl();
		if ( pCheckBox == &m_aCBUseSSL)
		{
			if ( m_aCBUseSSL.IsChecked() )
			{
				m_iNormalPort = static_cast<sal_Int32>(m_aNFPortNumber.GetValue());
				m_aNFPortNumber.SetValue(m_iSSLPort);
			}
			else
			{
				m_iSSLPort = static_cast<sal_Int32>(m_aNFPortNumber.GetValue());
				m_aNFPortNumber.SetValue(m_iNormalPort);
			}
		}
		return 0;
	}

	// -----------------------------------------------------------------------
	void OLDAPDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls(_rControlList);
		_rControlList.push_back(new OSaveValueWrapper<Edit>(&m_aETBaseDN));
		_rControlList.push_back(new OSaveValueWrapper<CheckBox>(&m_aCBUseSSL));
		_rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFPortNumber));
		_rControlList.push_back(new OSaveValueWrapper<NumericField>(&m_aNFRowCount));
	}
	// -----------------------------------------------------------------------
	void OLDAPDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows(_rControlList);
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aBaseDN));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aPortNumber));
		_rControlList.push_back(new ODisableWrapper<FixedText>(&m_aFTRowCount));
		_rControlList.push_back(new ODisableWrapper<FixedLine>(&m_aFL_1));
	}
	// -----------------------------------------------------------------------
	void OLDAPDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);


		SFX_ITEMSET_GET(_rSet, pBaseDN, SfxStringItem, DSID_CONN_LDAP_BASEDN, sal_True);
        SFX_ITEMSET_GET(_rSet, pUseSSL, SfxBoolItem, DSID_CONN_LDAP_USESSL, sal_True);
		SFX_ITEMSET_GET(_rSet, pPortNumber, SfxInt32Item, DSID_CONN_LDAP_PORTNUMBER, sal_True);
		SFX_ITEMSET_GET(_rSet, pRowCount, SfxInt32Item, DSID_CONN_LDAP_ROWCOUNT, sal_True);

		if ( bValid )
		{
			m_aETBaseDN.SetText(pBaseDN->GetValue());
			m_aNFPortNumber.SetValue(pPortNumber->GetValue());
			m_aNFRowCount.SetValue(pRowCount->GetValue());
			m_aCBUseSSL.Check(pUseSSL->GetValue());
		}

		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
	}


	//========================================================================
	//= OTextDetailsPage
	//========================================================================
    DBG_NAME(OTextDetailsPage)
    //------------------------------------------------------------------------
	OTextDetailsPage::OTextDetailsPage( Window* pParent, const SfxItemSet& _rCoreAttrs )
		:OCommonBehaviourTabPage(pParent, PAGE_TEXT, _rCoreAttrs, 0, false )
	{
        DBG_CTOR(OTextDetailsPage,NULL);

        m_pTextConnectionHelper = new OTextConnectionHelper( this, TC_EXTENSION | TC_HEADER | TC_SEPARATORS | TC_CHARSET );
		FreeResource();
	}

	// -----------------------------------------------------------------------
	OTextDetailsPage::~OTextDetailsPage()
	{
        DELETEZ(m_pTextConnectionHelper);

        DBG_DTOR(OTextDetailsPage,NULL);
    }

	// -----------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateText( Window* pParent,	const SfxItemSet& _rAttrSet )
	{
		return ( new OTextDetailsPage( pParent, _rAttrSet ) );
	}
	// -----------------------------------------------------------------------
	void OTextDetailsPage::fillControls(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillControls(_rControlList);
        m_pTextConnectionHelper->fillControls(_rControlList);

	}
	// -----------------------------------------------------------------------
	void OTextDetailsPage::fillWindows(::std::vector< ISaveValueWrapper* >& _rControlList)
	{
		OCommonBehaviourTabPage::fillWindows(_rControlList);
        m_pTextConnectionHelper->fillWindows(_rControlList);

	}
	// -----------------------------------------------------------------------
	void OTextDetailsPage::implInitControls(const SfxItemSet& _rSet, sal_Bool _bSaveValue)
	{
		// first check whether or not the selection is invalid or readonly (invalid implies readonly, but not vice versa)
		sal_Bool bValid, bReadonly;
		getFlags(_rSet, bValid, bReadonly);

		m_pTextConnectionHelper->implInitControls(_rSet, bValid);
		OCommonBehaviourTabPage::implInitControls(_rSet, _bSaveValue);
	}

	// -----------------------------------------------------------------------
	sal_Bool OTextDetailsPage::FillItemSet( SfxItemSet& rSet )
	{
		sal_Bool bChangedSomething = OCommonBehaviourTabPage::FillItemSet(rSet);
		bChangedSomething = m_pTextConnectionHelper->FillItemSet(rSet, bChangedSomething);
		return bChangedSomething;
	}

	// -----------------------------------------------------------------------
    sal_Bool OTextDetailsPage::prepareLeave()
    {
        return m_pTextConnectionHelper->prepareLeave();
    }

	//------------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateGeneratedValuesPage( Window* _pParent, const SfxItemSet& _rAttrSet )
	{
		return new GeneratedValuesPage( _pParent, _rAttrSet );
	}

    //------------------------------------------------------------------------
	SfxTabPage*	ODriversSettings::CreateSpecialSettingsPage( Window* _pParent, const SfxItemSet& _rAttrSet )
	{
        ::rtl::OUString eType = ODbDataSourceAdministrationHelper::getDatasourceType( _rAttrSet );
        DataSourceMetaData aMetaData( eType );
		return new SpecialSettingsPage(	_pParent, _rAttrSet, aMetaData );
	}
//.........................................................................
}	// namespace dbaui
//.........................................................................
