/**************************************************************
 * 
 * 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_cui.hxx"

#define _SVSTDARR_STRINGSISORTDTOR
#define _SVSTDARR_STRINGSDTOR
#include <svl/svstdarr.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/field.hxx>
#include <vcl/keycodes.hxx>
#include <sot/exchange.hxx>
#include <svtools/transfer.hxx>
#include <unotools/syslocale.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/viewsh.hxx>
#include <unotools/charclass.hxx>
#include <unotools/collatorwrapper.hxx>
#include <com/sun/star/i18n/CollatorOptions.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <comphelper/processfactory.hxx>
#include <vcl/svapp.hxx>
#include <sfx2/module.hxx>
#include <sfx2/request.hxx>
#include <sfx2/sfxsids.hrc>
#include <svl/eitem.hxx>
#include <svl/languageoptions.hxx>
#include <svx/SmartTagMgr.hxx>
#include <com/sun/star/smarttags/XSmartTagRecognizer.hpp>
#include <com/sun/star/smarttags/XSmartTagAction.hpp>

#define _OFA_AUTOCDLG_CXX
#include "autocdlg.hxx"
#include "autocdlg.hrc"
#include "helpid.hrc"
#include <editeng/acorrcfg.hxx>
#include <editeng/svxacorr.hxx>
#include "cuicharmap.hxx"
#include <editeng/unolingu.hxx>
#include <dialmgr.hxx>
#include <svx/svxids.hrc> // SID_OPEN_SMARTTAGSOPTIONS

static LanguageType eLastDialogLanguage = LANGUAGE_SYSTEM;

using namespace ::com::sun::star::util;
using namespace ::com::sun::star;
using namespace ::rtl;

static ::com::sun::star::uno::Reference<
		::com::sun::star::lang::XMultiServiceFactory >& GetProcessFact()
{
	static ::com::sun::star::uno::Reference<
			::com::sun::star::lang::XMultiServiceFactory > xMSF =
									::comphelper::getProcessServiceFactory();
	return xMSF;
}

/*-----------------14.10.96 15.47-------------------

--------------------------------------------------*/

OfaAutoCorrDlg::OfaAutoCorrDlg(Window* pParent, const SfxItemSet* _pSet ) :
    SfxTabDialog(pParent, CUI_RES( RID_OFA_AUTOCORR_DLG ), _pSet),
	aLanguageFT(    this, CUI_RES(FT_LANG 		  )),
	aLanguageLB(    this, CUI_RES(LB_LANG    		  ))
{
	sal_Bool bShowSWOptions = sal_False;
    sal_Bool bOpenSmartTagOptions = sal_False;

    if ( _pSet )
	{
        SFX_ITEMSET_ARG( _pSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
		if ( pItem && pItem->GetValue() )
			bShowSWOptions = sal_True;

        SFX_ITEMSET_ARG( _pSet, pItem2, SfxBoolItem, SID_OPEN_SMARTTAGOPTIONS, sal_False );
		if ( pItem2 && pItem2->GetValue() )
			bOpenSmartTagOptions = sal_True;
	}

	aLanguageFT.SetZOrder(0, WINDOW_ZORDER_FIRST);
	aLanguageLB.SetZOrder(&aLanguageFT, WINDOW_ZORDER_BEHIND);
	aLanguageLB.SetHelpId(HID_AUTOCORR_LANGUAGE);
	FreeResource();

	AddTabPage(RID_OFAPAGE_AUTOCORR_OPTIONS, OfaAutocorrOptionsPage::Create, 0);
	AddTabPage(RID_OFAPAGE_AUTOFMT_APPLY, OfaSwAutoFmtOptionsPage::Create, 0);
	AddTabPage(RID_OFAPAGE_AUTOCOMPLETE_OPTIONS, OfaAutoCompleteTabPage::Create, 0);
    AddTabPage(RID_OFAPAGE_SMARTTAG_OPTIONS, OfaSmartTagOptionsTabPage::Create, 0);

	if (!bShowSWOptions)
	{
		RemoveTabPage(RID_OFAPAGE_AUTOFMT_APPLY);
		RemoveTabPage(RID_OFAPAGE_AUTOCOMPLETE_OPTIONS);
		RemoveTabPage(RID_OFAPAGE_SMARTTAG_OPTIONS);
	}
	else
    {
        // remove smart tag tab page if no extensions are installed
        SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
        SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
        if ( !pOpt || !pOpt->pSmartTagMgr || 0 == pOpt->pSmartTagMgr->NumberOfRecognizers() )
            RemoveTabPage(RID_OFAPAGE_SMARTTAG_OPTIONS);

		RemoveTabPage(RID_OFAPAGE_AUTOCORR_OPTIONS);
    }

	AddTabPage(RID_OFAPAGE_AUTOCORR_REPLACE, OfaAutocorrReplacePage::Create, 0);
	AddTabPage(RID_OFAPAGE_AUTOCORR_EXCEPT,  OfaAutocorrExceptPage::Create, 0);
	AddTabPage(RID_OFAPAGE_AUTOCORR_QUOTE, 	 OfaQuoteTabPage::Create, 0);

	// initialize languages
	//! LANGUAGE_NONE is displayed as '[All]' and the LanguageType
	//! will be set to LANGUAGE_DONTKNOW
    sal_Int16 nLangList = LANG_LIST_WESTERN;
    
    if( SvtLanguageOptions().IsCTLFontEnabled() ) 
        nLangList |= LANG_LIST_CTL;
    aLanguageLB.SetLanguageList( nLangList, sal_True, sal_True );
	aLanguageLB.SelectLanguage( LANGUAGE_NONE );
	sal_uInt16 nPos = aLanguageLB.GetSelectEntryPos();
	DBG_ASSERT( LISTBOX_ENTRY_NOTFOUND != nPos, "listbox entry missing" );
	aLanguageLB.SetEntryData( nPos, (void*)(long) LANGUAGE_DONTKNOW );

	// Initialisierung funktionier fuer static nicht unter Linux - deswegen hier
	if( LANGUAGE_SYSTEM == eLastDialogLanguage )
		eLastDialogLanguage = Application::GetSettings().GetLanguage();

	LanguageType nSelectLang = LANGUAGE_DONTKNOW;
	nPos = aLanguageLB.GetEntryPos( (void*)(long) eLastDialogLanguage );
	if (LISTBOX_ENTRY_NOTFOUND != nPos)
		nSelectLang = eLastDialogLanguage;
	aLanguageLB.SelectLanguage( nSelectLang );

	aLanguageLB.SetSelectHdl(LINK(this, OfaAutoCorrDlg, SelectLanguageHdl));

    Size aMinSize(aLanguageFT.CalcMinimumSize());
    //reserve some extra space for CJK accelerators that are possible inserted
    //later (like '(A)')
    aLanguageFT.SetPosSizePixel( 0, 0, aMinSize.Width() + 20, 0, WINDOW_POSSIZE_WIDTH );

    if ( bOpenSmartTagOptions )
        SetCurPageId( RID_OFAPAGE_SMARTTAG_OPTIONS );
}
/*-----------------16.10.96 14.06-------------------

--------------------------------------------------*/

sal_Bool lcl_FindEntry( ListBox& rLB, const String& rEntry,
					CollatorWrapper& rCmpClass )
{
	sal_uInt16 nCount = rLB.GetEntryCount();
	sal_uInt16 nSelPos = rLB.GetSelectEntryPos();
	sal_uInt16 i;
	for(i = 0; i < nCount; i++)
	{
		if( 0 == rCmpClass.compareString(rEntry, rLB.GetEntry(i) ))
		{
			rLB.SelectEntryPos(i, sal_True);
			return sal_True;
		}
	}
	if(LISTBOX_ENTRY_NOTFOUND != nSelPos)
		rLB.SelectEntryPos(nSelPos, sal_False);
	return sal_False;
}

/* -----------------23.11.98 10:46-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK(OfaAutoCorrDlg, SelectLanguageHdl, ListBox*, pBox)
{
	sal_uInt16 nPos = pBox->GetSelectEntryPos();
	void* pVoid = pBox->GetEntryData(nPos);
	LanguageType eNewLang = (LanguageType)(long)pVoid;
	//alte Einstellungen speichern und neu fuellen
	if(eNewLang != eLastDialogLanguage)
	{
		sal_uInt16	nPageId = GetCurPageId();
		if(RID_OFAPAGE_AUTOCORR_REPLACE == nPageId)
			((OfaAutocorrReplacePage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
		else if(RID_OFAPAGE_AUTOCORR_EXCEPT == nPageId)
			((OfaAutocorrExceptPage*)GetTabPage( nPageId ))->SetLanguage(eNewLang);
	}
	return 0;
}
/*-----------------14.10.96 15.57-------------------

--------------------------------------------------*/

OfaAutocorrOptionsPage::OfaAutocorrOptionsPage( Window* pParent,
												const SfxItemSet& rSet ) :
	SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_OPTIONS ), rSet),
	aCheckLB			(this, CUI_RES(CLB_SETTINGS	)),

	sInput    			(CUI_RES(ST_USE_REPLACE		)),
    sDoubleCaps         (CUI_RES(ST_CPTL_STT_WORD     )),
    sStartCap           (CUI_RES(ST_CPTL_STT_SENT     )),
    sBoldUnderline      (CUI_RES(ST_BOLD_UNDER        )),
    sURL                (CUI_RES(ST_DETECT_URL        )),
    sNoDblSpaces        (CUI_RES(STR_NO_DBL_SPACES    )),
	sDash    			(CUI_RES(ST_DASH	         	))
{
	FreeResource();

	aCheckLB.SetHelpId(HID_OFAPAGE_AUTOCORR_CLB);
}

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/


OfaAutocorrOptionsPage::~OfaAutocorrOptionsPage()
{
}

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/


SfxTabPage*	OfaAutocorrOptionsPage::Create( Window* pParent,
								const SfxItemSet& rSet)
{
	return new OfaAutocorrOptionsPage(pParent, rSet);
}
/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/


sal_Bool OfaAutocorrOptionsPage::FillItemSet( SfxItemSet& )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	long nFlags = pAutoCorrect->GetFlags();

	sal_uInt16 nPos = 0;
	pAutoCorrect->SetAutoCorrFlag(Autocorrect, 			aCheckLB.IsChecked(nPos++));
	pAutoCorrect->SetAutoCorrFlag(CptlSttWrd, 			aCheckLB.IsChecked(nPos++));
	pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc, 		aCheckLB.IsChecked(nPos++));
	pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl,		aCheckLB.IsChecked(nPos++));
	pAutoCorrect->SetAutoCorrFlag(SetINetAttr, 			aCheckLB.IsChecked(nPos++));
	pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash,		aCheckLB.IsChecked(nPos++));
	pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace,	aCheckLB.IsChecked(nPos++));

	sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
	if(bReturn )
    {
        SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
        pCfg->SetModified();
        pCfg->Commit();
    }
	return bReturn;
}

/* -----------------23.11.98 16:15-------------------
 *
 * --------------------------------------------------*/
void	OfaAutocorrOptionsPage::ActivatePage( const SfxItemSet& )
{
	((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
}

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/


void OfaAutocorrOptionsPage::Reset( const SfxItemSet& )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	const long nFlags = pAutoCorrect->GetFlags();

	aCheckLB.SetUpdateMode(sal_False);
	aCheckLB.Clear();

	aCheckLB.InsertEntry(sInput);
	aCheckLB.InsertEntry(sDoubleCaps);
	aCheckLB.InsertEntry(sStartCap);
	aCheckLB.InsertEntry(sBoldUnderline);
	aCheckLB.InsertEntry(sURL);
	aCheckLB.InsertEntry(sDash);
	aCheckLB.InsertEntry(sNoDblSpaces);

	sal_uInt16 nPos = 0;
	aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & Autocorrect) );
	aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttWrd) );
	aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & CptlSttSntnc) );
	aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgWeightUnderl) );
	aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & SetINetAttr) );
	aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgToEnEmDash) );
	aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & IgnoreDoubleSpace) );

	aCheckLB.SetUpdateMode(sal_True);
}

/*********************************************************************/
/*                                                                   */
/*  Hilfs-struct fuer dUserDaten der Checklistbox                    */
/*                                                                   */
/*********************************************************************/

struct ImpUserData
{
	String 	*pString;
	Font* 	pFont;

	ImpUserData(String* pText, Font* pFnt)
		{ pString = pText; pFont = pFnt;}
};


/*********************************************************************/
/*                                                                   */
/*	Dialog fuer Prozenteinstellung                                   */
/*                                                                   */
/*********************************************************************/

class OfaAutoFmtPrcntSet : public ModalDialog
{
	OKButton 		aOKPB;
	CancelButton	aCancelPB;
	FixedLine		aPrcntFL;
	MetricField		aPrcntMF;

	public:
		OfaAutoFmtPrcntSet(Window* pParent) :
			ModalDialog(pParent, CUI_RES(RID_OFADLG_PRCNT_SET)),
				aOKPB(this, 		CUI_RES(BT_OK)),
				aCancelPB(this, 	CUI_RES(BT_CANCEL)),
				aPrcntFL(this, 		CUI_RES(FL_PRCNT)),
				aPrcntMF(this, 	CUI_RES(ED_RIGHT_MARGIN))
			{
				FreeResource();
			}
	MetricField& 	GetPrcntFld(){return aPrcntMF;}
};


/*********************************************************************/
/*                                                                   */
/*  veraenderter LBoxString                                          */
/*                                                                   */
/*********************************************************************/

class OfaImpBrwString : public SvLBoxString
{
public:

	OfaImpBrwString( SvLBoxEntry* pEntry, sal_uInt16 nFlags,
		const String& rStr ) : SvLBoxString(pEntry,nFlags,rStr){}

	virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags,
											SvLBoxEntry* pEntry);
};

/*********************************************************************/
/*                                                                   */
/*********************************************************************/


void __EXPORT OfaImpBrwString::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 /*nFlags*/,
	SvLBoxEntry* pEntry )
{
	rDev.DrawText( rPos, GetText() );
	if(pEntry->GetUserData())
	{
		ImpUserData* pUserData = (ImpUserData* )pEntry->GetUserData();
		Point aNewPos(rPos);
		aNewPos.X() += rDev.GetTextWidth(GetText());
		Font aOldFont( rDev.GetFont());
		Font aFont( aOldFont );
		if(pUserData->pFont)
		{
			aFont = *pUserData->pFont;
			aFont.SetColor(aOldFont.GetColor());
			aFont.SetSize(aOldFont.GetSize());
		}
		aFont.SetWeight( WEIGHT_BOLD );

		sal_Bool bFett = sal_True;
		sal_uInt16 nPos = 0;
		do {
			String sTxt( pUserData->pString->GetToken( 0, 1, nPos ));

			if( bFett )
				rDev.SetFont( aFont );

			rDev.DrawText( aNewPos, sTxt );

			if( STRING_NOTFOUND != nPos )
				aNewPos.X() += rDev.GetTextWidth( sTxt );

			if( bFett )
				rDev.SetFont( aOldFont );

			bFett = !bFett;
		} while( STRING_NOTFOUND != nPos );
	}
}

/*********************************************************************/
/*                                                                   */
/* 	TabPage Autoformat anwenden			                             */
/*                                                                   */
/*********************************************************************/

#define CBCOL_FIRST		0
#define CBCOL_SECOND	1
#define CBCOL_BOTH		2

enum OfaAutoFmtOptions
{
	USE_REPLACE_TABLE,
	CORR_UPPER,
	BEGIN_UPPER,
	BOLD_UNDERLINE,
	DETECT_URL,
	REPLACE_DASHES,
	DEL_SPACES_AT_STT_END,
	DEL_SPACES_BETWEEN_LINES,
	IGNORE_DBLSPACE,
	APPLY_NUMBERING,
	INSERT_BORDER,
	CREATE_TABLE,
	REPLACE_STYLES,
	DEL_EMPTY_NODE,
	REPLACE_USER_COLL,
	REPLACE_BULLETS,
	MERGE_SINGLE_LINE_PARA
};

OfaSwAutoFmtOptionsPage::OfaSwAutoFmtOptionsPage( Window* pParent,
								const SfxItemSet& rSet ) :
	SfxTabPage(pParent, CUI_RES(RID_OFAPAGE_AUTOFMT_APPLY), rSet),
	aCheckLB			(this,	CUI_RES(CLB_SETTINGS)),
	aEditPB				(this, 	CUI_RES(PB_EDIT)),
	aHeader1Expl		(this, 	CUI_RES(FT_HEADER1_EXPLANATION)),
	aHeader2Expl		(this, 	CUI_RES(FT_HEADER2_EXPLANATION)),
	sHeader1			(CUI_RES( STR_HEADER1		)),
	sHeader2			(CUI_RES( STR_HEADER2		)),
	sDeleteEmptyPara	(CUI_RES( ST_DEL_EMPTY_PARA)),
	sUseReplaceTbl		(CUI_RES(	ST_USE_REPLACE  )),
	sCptlSttWord		(CUI_RES(	ST_CPTL_STT_WORD)),
	sCptlSttSent		(CUI_RES(	ST_CPTL_STT_SENT)),
	sUserStyle			(CUI_RES(	ST_USER_STYLE   )),
	sBullet				(CUI_RES(	ST_BULLET       )),
	sBoldUnder			(CUI_RES(	ST_BOLD_UNDER   )),
	sNoDblSpaces		(CUI_RES(	STR_NO_DBL_SPACES)),
	sDetectURL			(CUI_RES(	ST_DETECT_URL   )),
	sDash				(CUI_RES(	ST_DASH         )),
	sRightMargin		(CUI_RES(	ST_RIGHT_MARGIN	)),
	sNum				(CUI_RES(	STR_NUM			)),
	sBorder				(CUI_RES(	STR_BORDER		)),
	sTable				(CUI_RES(	STR_TABLE		)),
	sReplaceTemplates   (CUI_RES(	STR_REPLACE_TEMPLATES)),
	sDelSpaceAtSttEnd	(CUI_RES(	STR_DEL_SPACES_AT_STT_END)),
	sDelSpaceBetweenLines(CUI_RES(STR_DEL_SPACES_BETWEEN_LINES)),

	nPercent		( 50 ),
	pCheckButtonData( NULL )

{
	FreeResource();

	//typ. Anfuehrungszeichen einsetzen
	SvtSysLocale aSysLcl;

	aCheckLB.SetHelpId(HID_OFAPAGE_AUTOFORMAT_CLB);
	aCheckLB.SetStyle(aCheckLB.GetStyle()|WB_HSCROLL| WB_VSCROLL);

	aCheckLB.SetSelectHdl(LINK(this, OfaSwAutoFmtOptionsPage, SelectHdl));
	aCheckLB.SetDoubleClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));

	static long aStaticTabs[]=
	{
		3, 0, 20, 40
	};

	aCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
	String sHeader( sHeader1 );
	sHeader += '\t';
	sHeader += sHeader2;
	sHeader += '\t';
	aCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
						HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);

	aEditPB.SetClickHdl(LINK(this, OfaSwAutoFmtOptionsPage, EditHdl));
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

SvLBoxEntry* OfaSwAutoFmtOptionsPage::CreateEntry(String& rTxt, sal_uInt16 nCol) 
{
	SvLBoxEntry* pEntry = new SvLBoxEntry;

	if ( !pCheckButtonData )
	{
		pCheckButtonData = new SvLBoxButtonData( &aCheckLB );
		aCheckLB.SetCheckButtonData( pCheckButtonData );
	}

	pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));	// Sonst Puff!

	String sEmpty;
	if (nCol == CBCOL_SECOND)
		pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );	// Leerspalte
	else
		pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );

	if (nCol == CBCOL_FIRST)
		pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );	// Leerspalte
	else
		pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );
	pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );

	return pEntry;
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/


__EXPORT OfaSwAutoFmtOptionsPage::~OfaSwAutoFmtOptionsPage()
{
	delete (ImpUserData*) aCheckLB.GetUserData( REPLACE_BULLETS );
	delete (ImpUserData*) aCheckLB.GetUserData( APPLY_NUMBERING );
	delete (ImpUserData*) aCheckLB.GetUserData( MERGE_SINGLE_LINE_PARA );
	delete pCheckButtonData;
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

SfxTabPage* __EXPORT OfaSwAutoFmtOptionsPage::Create( Window* pParent,
								const SfxItemSet& rAttrSet)
{
	return new OfaSwAutoFmtOptionsPage(pParent, rAttrSet);
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

sal_Bool OfaSwAutoFmtOptionsPage::FillItemSet( SfxItemSet&  )
{
	sal_Bool bModified = sal_False;
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
	long nFlags = pAutoCorrect->GetFlags();

	sal_Bool bCheck = aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_FIRST);
	bModified |= pOpt->bAutoCorrect != bCheck;
	pOpt->bAutoCorrect = bCheck;
	pAutoCorrect->SetAutoCorrFlag(Autocorrect,
						aCheckLB.IsChecked(USE_REPLACE_TABLE, CBCOL_SECOND));

	bCheck = aCheckLB.IsChecked(CORR_UPPER, CBCOL_FIRST);
	bModified |= pOpt->bCptlSttWrd != bCheck;
	pOpt->bCptlSttWrd = bCheck;
	pAutoCorrect->SetAutoCorrFlag(CptlSttWrd,
						aCheckLB.IsChecked(CORR_UPPER, CBCOL_SECOND));

	bCheck = aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_FIRST);
	bModified |= pOpt->bCptlSttSntnc != bCheck;
	pOpt->bCptlSttSntnc = bCheck;
	pAutoCorrect->SetAutoCorrFlag(CptlSttSntnc,
						aCheckLB.IsChecked(BEGIN_UPPER, CBCOL_SECOND));

	bCheck = aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_FIRST);
	bModified |= pOpt->bChgWeightUnderl != bCheck;
	pOpt->bChgWeightUnderl = bCheck;
	pAutoCorrect->SetAutoCorrFlag(ChgWeightUnderl,
						aCheckLB.IsChecked(BOLD_UNDERLINE, CBCOL_SECOND));

	pAutoCorrect->SetAutoCorrFlag(IgnoreDoubleSpace,
						aCheckLB.IsChecked(IGNORE_DBLSPACE, CBCOL_SECOND));

	bCheck = aCheckLB.IsChecked(DETECT_URL, CBCOL_FIRST);
	bModified |= pOpt->bSetINetAttr != bCheck;
	pOpt->bSetINetAttr = bCheck;
	pAutoCorrect->SetAutoCorrFlag(SetINetAttr,
						aCheckLB.IsChecked(DETECT_URL, CBCOL_SECOND));

	bCheck = aCheckLB.IsChecked(DEL_EMPTY_NODE, CBCOL_FIRST);
	bModified |= pOpt->bDelEmptyNode != bCheck;
	pOpt->bDelEmptyNode = bCheck;

	bCheck = aCheckLB.IsChecked(REPLACE_USER_COLL, CBCOL_FIRST);
	bModified |= pOpt->bChgUserColl != bCheck;
	pOpt->bChgUserColl = bCheck;

	bCheck = aCheckLB.IsChecked(REPLACE_BULLETS, CBCOL_FIRST);
	bModified |= pOpt->bChgEnumNum != bCheck;
	pOpt->bChgEnumNum = bCheck;
	bModified |= aBulletFont != pOpt->aBulletFont;
	pOpt->aBulletFont = aBulletFont;
	bModified |= String(pOpt->cBullet) != sBulletChar;
	pOpt->cBullet = sBulletChar.GetChar(0);

	bModified |= aByInputBulletFont != pOpt->aByInputBulletFont;
	bModified |= String(pOpt->cByInputBullet) != sByInputBulletChar;
	pOpt->aByInputBulletFont = aByInputBulletFont;
	pOpt->cByInputBullet = sByInputBulletChar.GetChar(0);

	bCheck = aCheckLB.IsChecked(MERGE_SINGLE_LINE_PARA, CBCOL_FIRST);
	bModified |= pOpt->bRightMargin != bCheck;
	pOpt->bRightMargin = bCheck;
	bModified |= nPercent != pOpt->nRightMargin;
	pOpt->nRightMargin = (sal_uInt8)nPercent;

	bCheck = aCheckLB.IsChecked(APPLY_NUMBERING, CBCOL_SECOND);
	bModified |= pOpt->bSetNumRule != bCheck;
	pOpt->bSetNumRule = bCheck;

	bCheck = aCheckLB.IsChecked(INSERT_BORDER, CBCOL_SECOND);
	bModified |= pOpt->bSetBorder != bCheck;
	pOpt->bSetBorder = bCheck;

	bCheck = aCheckLB.IsChecked(CREATE_TABLE, CBCOL_SECOND);
	bModified |= pOpt->bCreateTable != bCheck;
	pOpt->bCreateTable = bCheck;

	bCheck = aCheckLB.IsChecked(REPLACE_STYLES, CBCOL_SECOND);
	bModified |= pOpt->bReplaceStyles != bCheck;
	pOpt->bReplaceStyles = bCheck;

	bCheck = aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_FIRST);
	bModified |= pOpt->bChgToEnEmDash != bCheck;
	pOpt->bChgToEnEmDash = bCheck;
	pAutoCorrect->SetAutoCorrFlag(ChgToEnEmDash,
						aCheckLB.IsChecked(REPLACE_DASHES, CBCOL_SECOND));

	bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_FIRST);
	bModified |= pOpt->bAFmtDelSpacesAtSttEnd != bCheck;
	pOpt->bAFmtDelSpacesAtSttEnd = bCheck;
	bCheck = aCheckLB.IsChecked(DEL_SPACES_AT_STT_END, CBCOL_SECOND);
	bModified |= pOpt->bAFmtByInpDelSpacesAtSttEnd != bCheck;
	pOpt->bAFmtByInpDelSpacesAtSttEnd = bCheck;

	bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_FIRST);
	bModified |= pOpt->bAFmtDelSpacesBetweenLines != bCheck;
	pOpt->bAFmtDelSpacesBetweenLines = bCheck;
	bCheck = aCheckLB.IsChecked(DEL_SPACES_BETWEEN_LINES, CBCOL_SECOND);
	bModified |= pOpt->bAFmtByInpDelSpacesBetweenLines != bCheck;
	pOpt->bAFmtByInpDelSpacesBetweenLines = bCheck;

	if(bModified || nFlags != pAutoCorrect->GetFlags())
    {
        SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
        pCfg->SetModified();
        pCfg->Commit();
    }

	return sal_True;
}

/* -----------------23.11.98 16:15-------------------
 *
 * --------------------------------------------------*/
void	OfaSwAutoFmtOptionsPage::ActivatePage( const SfxItemSet& )
{
	((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/


void OfaSwAutoFmtOptionsPage::Reset( const SfxItemSet& )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
	const long nFlags = pAutoCorrect->GetFlags();

	aCheckLB.SetUpdateMode(sal_False);
	aCheckLB.Clear();

	// Die folgenden Eintraege muessen in der selben Reihenfolge, wie im
	// OfaAutoFmtOptions-enum eingefuegt werden!
	aCheckLB.GetModel()->Insert(CreateEntry(sUseReplaceTbl,		CBCOL_BOTH	));
	aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttWord,		CBCOL_BOTH	));
	aCheckLB.GetModel()->Insert(CreateEntry(sCptlSttSent,		CBCOL_BOTH	));
	aCheckLB.GetModel()->Insert(CreateEntry(sBoldUnder,			CBCOL_BOTH	));
	aCheckLB.GetModel()->Insert(CreateEntry(sDetectURL,			CBCOL_BOTH	));
	aCheckLB.GetModel()->Insert(CreateEntry(sDash,				CBCOL_BOTH  ));
	aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceAtSttEnd,	CBCOL_BOTH  ));
	aCheckLB.GetModel()->Insert(CreateEntry(sDelSpaceBetweenLines, CBCOL_BOTH  ));

	aCheckLB.GetModel()->Insert(CreateEntry(sNoDblSpaces,		CBCOL_SECOND));
	aCheckLB.GetModel()->Insert(CreateEntry(sNum,				CBCOL_SECOND));
	aCheckLB.GetModel()->Insert(CreateEntry(sBorder,			CBCOL_SECOND));
	aCheckLB.GetModel()->Insert(CreateEntry(sTable,				CBCOL_SECOND));
	aCheckLB.GetModel()->Insert(CreateEntry(sReplaceTemplates,	CBCOL_SECOND));
	aCheckLB.GetModel()->Insert(CreateEntry(sDeleteEmptyPara,	CBCOL_FIRST	));
	aCheckLB.GetModel()->Insert(CreateEntry(sUserStyle,			CBCOL_FIRST	));
	aCheckLB.GetModel()->Insert(CreateEntry(sBullet,			CBCOL_FIRST	));
	aCheckLB.GetModel()->Insert(CreateEntry(sRightMargin,		CBCOL_FIRST	));

	aCheckLB.CheckEntryPos( USE_REPLACE_TABLE, 	CBCOL_FIRST,	pOpt->bAutoCorrect );
	aCheckLB.CheckEntryPos( USE_REPLACE_TABLE,	CBCOL_SECOND,	0 != (nFlags & Autocorrect));
	aCheckLB.CheckEntryPos( CORR_UPPER,			CBCOL_FIRST,	pOpt->bCptlSttWrd );
	aCheckLB.CheckEntryPos( CORR_UPPER,			CBCOL_SECOND,	0 != (nFlags & CptlSttWrd) );
	aCheckLB.CheckEntryPos( BEGIN_UPPER,		CBCOL_FIRST,	pOpt->bCptlSttSntnc );
	aCheckLB.CheckEntryPos( BEGIN_UPPER,		CBCOL_SECOND,	0 != (nFlags & CptlSttSntnc) );
	aCheckLB.CheckEntryPos( BOLD_UNDERLINE,		CBCOL_FIRST,	pOpt->bChgWeightUnderl );
	aCheckLB.CheckEntryPos( BOLD_UNDERLINE,		CBCOL_SECOND,	0 != (nFlags & ChgWeightUnderl) );
	aCheckLB.CheckEntryPos( IGNORE_DBLSPACE,	CBCOL_SECOND,	0 != (nFlags & IgnoreDoubleSpace) );
	aCheckLB.CheckEntryPos( DETECT_URL,			CBCOL_FIRST,	pOpt->bSetINetAttr );
	aCheckLB.CheckEntryPos( DETECT_URL,			CBCOL_SECOND,	0 != (nFlags & SetINetAttr) );
	aCheckLB.CheckEntryPos( REPLACE_DASHES,		CBCOL_FIRST,	pOpt->bChgToEnEmDash );
	aCheckLB.CheckEntryPos( REPLACE_DASHES,		CBCOL_SECOND,	0 != (nFlags & ChgToEnEmDash) );
	aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END,		CBCOL_FIRST,	pOpt->bAFmtDelSpacesAtSttEnd );
	aCheckLB.CheckEntryPos( DEL_SPACES_AT_STT_END,		CBCOL_SECOND,	pOpt->bAFmtByInpDelSpacesAtSttEnd );
	aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES,	CBCOL_FIRST,	pOpt->bAFmtDelSpacesBetweenLines );
	aCheckLB.CheckEntryPos( DEL_SPACES_BETWEEN_LINES,	CBCOL_SECOND,	pOpt->bAFmtByInpDelSpacesBetweenLines );
	aCheckLB.CheckEntryPos( DEL_EMPTY_NODE,		CBCOL_FIRST,	pOpt->bDelEmptyNode );
	aCheckLB.CheckEntryPos( REPLACE_USER_COLL,	CBCOL_FIRST,	pOpt->bChgUserColl );
	aCheckLB.CheckEntryPos( REPLACE_BULLETS,	CBCOL_FIRST,	pOpt->bChgEnumNum );

	aBulletFont = pOpt->aBulletFont;
	sBulletChar = pOpt->cBullet;
	ImpUserData* pUserData = new ImpUserData(&sBulletChar, &aBulletFont);
	aCheckLB.SetUserData(  REPLACE_BULLETS, pUserData );

	nPercent = pOpt->nRightMargin;
	sMargin = ' ';
	sMargin += String::CreateFromInt32( nPercent );
    sMargin.AppendAscii( " %" );
	pUserData = new ImpUserData(&sMargin, 0);
	aCheckLB.SetUserData( MERGE_SINGLE_LINE_PARA, pUserData );

	aCheckLB.CheckEntryPos( APPLY_NUMBERING,	CBCOL_SECOND,	pOpt->bSetNumRule );

	aByInputBulletFont = pOpt->aByInputBulletFont;
	sByInputBulletChar = pOpt->cByInputBullet;
	ImpUserData* pUserData2 = new ImpUserData(&sByInputBulletChar, &aByInputBulletFont);
	aCheckLB.SetUserData( APPLY_NUMBERING , pUserData2 );

	aCheckLB.CheckEntryPos( MERGE_SINGLE_LINE_PARA, CBCOL_FIRST, pOpt->bRightMargin );
	aCheckLB.CheckEntryPos( INSERT_BORDER,		CBCOL_SECOND,	pOpt->bSetBorder );
	aCheckLB.CheckEntryPos( CREATE_TABLE,		CBCOL_SECOND,	pOpt->bCreateTable );
	aCheckLB.CheckEntryPos( REPLACE_STYLES,		CBCOL_SECOND,	pOpt->bReplaceStyles );

	aCheckLB.SetUpdateMode(sal_True);
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

IMPL_LINK(OfaSwAutoFmtOptionsPage, SelectHdl, OfaACorrCheckListBox*, pBox)
{
	aEditPB.Enable(0 != pBox->FirstSelected()->GetUserData());
	return 0;
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

IMPL_LINK(OfaSwAutoFmtOptionsPage, EditHdl, PushButton*, EMPTYARG)
{
    sal_uLong nSelEntryPos = aCheckLB.GetSelectEntryPos();
	if( nSelEntryPos == REPLACE_BULLETS ||
		nSelEntryPos == APPLY_NUMBERING)
	{
		SvxCharacterMap *pMapDlg = new SvxCharacterMap(this);
		ImpUserData* pUserData = (ImpUserData*)aCheckLB.FirstSelected()->GetUserData();
		pMapDlg->SetCharFont(*pUserData->pFont);
		pMapDlg->SetChar( pUserData->pString->GetChar(0) );
		if(RET_OK == pMapDlg->Execute())
		{
			Font aFont(pMapDlg->GetCharFont());
			*pUserData->pFont = aFont;
			sal_UCS4 aChar = pMapDlg->GetChar();
			// using the UCS4 constructor
			rtl::OUString aOUStr( &aChar, 1 );
			*pUserData->pString = aOUStr;
		}
		delete pMapDlg;
	}
	else if( MERGE_SINGLE_LINE_PARA == nSelEntryPos )
	{
		// Dialog fuer Prozenteinstellung
		OfaAutoFmtPrcntSet aDlg(this);
		aDlg.GetPrcntFld().SetValue(nPercent);
		if(RET_OK == aDlg.Execute())
		{
			nPercent = (sal_uInt16)aDlg.GetPrcntFld().GetValue();
			sMargin = ' ';
			sMargin += String::CreateFromInt32( nPercent );
            sMargin.AppendAscii( " %" );
		}
	}
	aCheckLB.Invalidate();
	return 0;
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

void OfaACorrCheckListBox::SetTabs()
{
	SvxSimpleTable::SetTabs();
	sal_uInt16 nAdjust = SV_LBOXTAB_ADJUST_RIGHT|SV_LBOXTAB_ADJUST_LEFT|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_ADJUST_NUMERIC|SV_LBOXTAB_FORCE;

	if( aTabs.Count() > 1 )
	{
		SvLBoxTab* pTab = (SvLBoxTab*)aTabs.GetObject(1);
		pTab->nFlags &= ~nAdjust;
		pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
	}
	if( aTabs.Count() > 2 )
	{
		SvLBoxTab* pTab = (SvLBoxTab*)aTabs.GetObject(2);
		pTab->nFlags &= ~nAdjust;
		pTab->nFlags |= SV_LBOXTAB_PUSHABLE|SV_LBOXTAB_ADJUST_CENTER|SV_LBOXTAB_FORCE;
	}
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

void OfaACorrCheckListBox::CheckEntryPos(sal_uLong nPos, sal_uInt16 nCol, sal_Bool bChecked)
{
	if ( nPos < GetEntryCount() )
		SetCheckButtonState(
			GetEntry(nPos),
			nCol,
			bChecked ? SvButtonState( SV_BUTTON_CHECKED ) :
									   SvButtonState( SV_BUTTON_UNCHECKED ) );
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

sal_Bool OfaACorrCheckListBox::IsChecked(sal_uLong nPos, sal_uInt16 nCol)
{
	return GetCheckButtonState( GetEntry(nPos), nCol ) == SV_BUTTON_CHECKED;
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

void OfaACorrCheckListBox::SetCheckButtonState( SvLBoxEntry* pEntry, sal_uInt16 nCol, SvButtonState eState)
{
	SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));

	DBG_ASSERT(pItem,"SetCheckButton:Item not found");
	if (((SvLBoxItem*)pItem)->IsA() == SV_ITEM_ID_LBOXBUTTON)
	{
		switch( eState )
		{
			case SV_BUTTON_CHECKED:
				pItem->SetStateChecked();
				break;

			case SV_BUTTON_UNCHECKED:
				pItem->SetStateUnchecked();
				break;

			case SV_BUTTON_TRISTATE:
				pItem->SetStateTristate();
				break;
		}
		InvalidateEntry( pEntry );
	}
}

/*********************************************************************/
/*                                                                   */
/*********************************************************************/

SvButtonState OfaACorrCheckListBox::GetCheckButtonState( SvLBoxEntry* pEntry, sal_uInt16 nCol ) const
{
	SvButtonState eState = SV_BUTTON_UNCHECKED;
	SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetItem(nCol + 1));
	DBG_ASSERT(pItem,"GetChButnState:Item not found");

	if (((SvLBoxItem*)pItem)->IsA() == SV_ITEM_ID_LBOXBUTTON)
	{
		sal_uInt16 nButtonFlags = pItem->GetButtonFlags();
		eState = pCheckButtonData->ConvertToButtonState( nButtonFlags );
	}

	return eState;
}

void OfaACorrCheckListBox::HBarClick()
{
	// Sortierung durch diese Ueberladung abgeklemmt
}
/* -----------------------------22.05.2002 11:06------------------------------

 ---------------------------------------------------------------------------*/
void    OfaACorrCheckListBox::KeyInput( const KeyEvent& rKEvt )
{
    if(!rKEvt.GetKeyCode().GetModifier() &&
        KEY_SPACE == rKEvt.GetKeyCode().GetCode())
    {
        sal_uLong nSelPos = GetSelectEntryPos();
        sal_uInt16 nCol = GetCurrentTabPos() - 1;
        if ( nCol < 2 )
        {
            CheckEntryPos( nSelPos, nCol, !IsChecked( nSelPos, nCol ) );
            CallImplEventListeners( VCLEVENT_CHECKBOX_TOGGLE, (void*)GetEntry( nSelPos ) );
        }
        else
        {
            sal_uInt16 nCheck = IsChecked(nSelPos, 1) ? 1 : 0;
            if(IsChecked(nSelPos, 0))
                nCheck += 2;
            nCheck--;
            nCheck &= 3;
            CheckEntryPos(nSelPos, 1, 0 != (nCheck & 1));
            CheckEntryPos(nSelPos, 0, 0 != (nCheck & 2));
        }
    }
    else
        SvxSimpleTable::KeyInput(rKEvt);
}
/* -----------------19.11.98 15:57-------------------
 *
 * --------------------------------------------------*/
struct DoubleString
{
	String 	sShort;
	String 	sLong;
	void* 	pUserData; // CheckBox -> form. Text Bool -> Selektionstext
};
typedef DoubleString* DoubleStringPtr;
SV_DECL_PTRARR_DEL(DoubleStringArray, DoubleStringPtr, 4, 4)
SV_IMPL_PTRARR(DoubleStringArray, DoubleStringPtr);

/* -----------------19.11.98 16:07-------------------
 *
 * --------------------------------------------------*/
void lcl_ClearTable(DoubleStringTable& rTable)
{
	DoubleStringArrayPtr pArray = rTable.Last();
	while(pArray)
	{
		pArray->DeleteAndDestroy(0, pArray->Count());
		delete pArray;
		pArray = rTable.Prev();
	}
	rTable.Clear();
}

/*-----------------14.10.96 15.57-------------------

--------------------------------------------------*/

OfaAutocorrReplacePage::OfaAutocorrReplacePage( Window* pParent,
												const SfxItemSet& rSet ) :
	SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_REPLACE ), rSet),
    aTextOnlyCB(    this, CUI_RES(CB_TEXT_ONLY      )),
    aShortFT  (     this, CUI_RES(FT_SHORT          )),
	aShortED  ( 	this, CUI_RES(ED_SHORT          )),
	aReplaceFT( 	this, CUI_RES(FT_REPLACE        )),
	aReplaceED( 	this, CUI_RES(ED_REPLACE        )),
	aReplaceTLB( 	this, CUI_RES(TLB_REPLACE       )),
    aNewReplacePB(  this, CUI_RES(PB_NEW_REPLACE    )),
	aDeleteReplacePB(this,CUI_RES(PB_DELETE_REPLACE )),
	sModify(CUI_RES(STR_MODIFY)),
	sNew(aNewReplacePB.GetText()),
    pFormatText(0),
    eLang(eLastDialogLanguage),
    bHasSelectionText(sal_False),
    bFirstSelect(sal_True),
	bReplaceEditChanged(sal_False),
    bSWriter(sal_True)
{
	FreeResource();
	SfxModule *pMod = *(SfxModule**)GetAppData(SHL_WRITER);
    bSWriter = pMod == SfxModule::GetActiveModule();

	::com::sun::star::lang::Locale aLcl( SvxCreateLocale(eLastDialogLanguage ));
	pCompareClass = new CollatorWrapper( GetProcessFact() );
	pCompareClass->loadDefaultCollator( aLcl, 0 );
	pCharClass = new CharClass( aLcl );

	static long nTabs[] = { 2 /* Tab-Count */, 1, 61 };
	aReplaceTLB.SetTabs( &nTabs[0], MAP_APPFONT );

	aReplaceTLB.SetStyle(aReplaceTLB.GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN);
	aReplaceTLB.SetSelectHdl(LINK(this, OfaAutocorrReplacePage, SelectHdl));
	aNewReplacePB.SetClickHdl( LINK(this, OfaAutocorrReplacePage, NewDelHdl));
	aDeleteReplacePB.SetClickHdl(LINK(this, OfaAutocorrReplacePage, NewDelHdl));
	aShortED.SetModifyHdl(LINK(this, OfaAutocorrReplacePage, ModifyHdl));
	aReplaceED.SetModifyHdl(LINK(this, OfaAutocorrReplacePage, ModifyHdl));
	aShortED.SetActionHdl(LINK(this, OfaAutocorrReplacePage, NewDelHdl));
	aReplaceED.SetActionHdl(LINK(this, OfaAutocorrReplacePage, NewDelHdl));

	aReplaceED.SetSpaces(sal_True);
	aShortED.SetSpaces(sal_True);
	aShortED.SetMaxTextLen(30);
}

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/


OfaAutocorrReplacePage::~OfaAutocorrReplacePage()
{
	delete pFormatText;
	lcl_ClearTable(aDoubleStringTable);
    delete pCompareClass;
    delete pCharClass;
}
/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/

SfxTabPage*	OfaAutocorrReplacePage::Create( Window* pParent,
								const SfxItemSet& rSet)
{
	return new OfaAutocorrReplacePage(pParent, rSet);
}
/* -----------------20.11.98 13:26-------------------
 *
 * --------------------------------------------------*/
void	OfaAutocorrReplacePage::ActivatePage( const SfxItemSet& )
{
	if(eLang != eLastDialogLanguage)
		SetLanguage(eLastDialogLanguage);
	((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
}
/* -----------------20.11.98 13:26-------------------
 *
 * --------------------------------------------------*/
int OfaAutocorrReplacePage::DeactivatePage( SfxItemSet*  )
{
	return LEAVE_PAGE;
}
/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/

sal_Bool OfaAutocorrReplacePage::FillItemSet( SfxItemSet& )
{
    SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
    DoubleStringArrayPtr pDoubleStringArray = aDoubleStringTable.Last();
	while(pDoubleStringArray)
	{
		LanguageType eCurLang = (LanguageType)aDoubleStringTable.GetCurKey();
		if(eCurLang != eLang) // die aktuelle Sprache wird weiter hinten behandelt
		{
			SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eCurLang);
			sal_uInt16 nWordListCount = pWordList->Count();
			sal_uInt16 nDoubleStringArrayCount = pDoubleStringArray->Count();
			sal_uInt16 nPos = nDoubleStringArrayCount;
			sal_uInt16 nLastPos = nPos;
			// 1. Durchlauf: Eintraege loeschen oder veraendern:


			for( sal_uInt16 nWordListPos = nWordListCount; nWordListPos; nWordListPos-- )
			{
				SvxAutocorrWordPtr pWordPtr = pWordList->GetObject(nWordListPos - 1);
				String sEntry(pWordPtr->GetShort());
				// formatierter Text steht nur im Writer
				sal_Bool bFound = !bSWriter && !pWordPtr->IsTextOnly();
				while(!bFound && nPos)
				{
					DoubleString* pDouble = pDoubleStringArray->GetObject( nPos - 1);

					if( 0 == pCompareClass->compareString(
													sEntry, pDouble->sShort ))
					{
						nLastPos = nPos - 1;
						bFound = sal_True;
						if( !(pWordPtr->IsTextOnly() == (0 == pDouble->pUserData)
                            && 0 == pCompareClass->compareString(
								pWordPtr->GetLong(), pDouble->sLong ) ) )
						{
							pAutoCorrect->PutText(sEntry, pDouble->sLong, eCurLang);
						}
						pDoubleStringArray->DeleteAndDestroy(nPos - 1, 1);
						break;
					}
					nPos--;
				}
				nPos = nLastPos;
				if(!bFound)
				{
					pAutoCorrect->DeleteText(sEntry, eCurLang);
				}
			}
			nDoubleStringArrayCount = pDoubleStringArray->Count();
			for(sal_uInt16 nDoubleStringArrayPos = 0; nDoubleStringArrayPos < nDoubleStringArrayCount; nDoubleStringArrayPos++ )
			{
				//jetzt sollte es nur noch neue Eintraege geben
				DoubleString* pDouble = pDoubleStringArray->GetObject( nDoubleStringArrayPos );
				if(pDouble->pUserData == &bHasSelectionText)
					pAutoCorrect->PutText( pDouble->sShort,
								*SfxObjectShell::Current(), eCurLang );
				else
				{
					pAutoCorrect->PutText( pDouble->sShort, pDouble->sLong,
															eCurLang);
				}
			}
		}
		pDoubleStringArray->DeleteAndDestroy(0, pDoubleStringArray->Count());
		delete pDoubleStringArray;
		pDoubleStringArray = aDoubleStringTable.Prev();
	}
	aDoubleStringTable.Clear();
	// jetzt noch die aktuelle Selektion
	SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eLang);
	sal_uInt16 nWordListCount = pWordList->Count();
	sal_uInt16 nListBoxCount = (sal_uInt16)aReplaceTLB.GetEntryCount();

	aReplaceTLB.SetUpdateMode(sal_False);
	sal_uInt16 nListBoxPos = nListBoxCount;
	sal_uInt16 nLastListBoxPos = nListBoxPos;
	// 1. Durchlauf: Eintraege loeschen oder veraendern:

	sal_uInt16 i;
	for( i = nWordListCount; i; i-- )
	{
		SvxAutocorrWordPtr pWordPtr = pWordList->GetObject(i- 1);
		String sEntry(pWordPtr->GetShort());
		// formatierter Text steht nur im Writer
		sal_Bool bFound = !bSWriter && !pWordPtr->IsTextOnly();
		while(!bFound && nListBoxPos)
		{
			SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( nListBoxPos - 1);
			if( 0 == pCompareClass->compareString( sEntry,
						aReplaceTLB.GetEntryText(pEntry, 0)))
			{
				nLastListBoxPos = nListBoxPos - 1;
				bFound = sal_True;
				String sLong = aReplaceTLB.GetEntryText(pEntry, 1);
				if( !(pWordPtr->IsTextOnly() == (0 == pEntry->GetUserData())
                    && 0 == pCompareClass->compareString(
						pWordPtr->GetLong(), sLong )))
				{
					pAutoCorrect->PutText(sEntry, sLong, eLang);
				}
				aReplaceTLB.GetModel()->Remove(pEntry);
				break;

			}
			nListBoxPos --;
		}
		nListBoxPos = nLastListBoxPos;
		if(!bFound)
		{
			pAutoCorrect->DeleteText(sEntry, eLang);
		}

	}
	nListBoxCount = (sal_uInt16)aReplaceTLB.GetEntryCount();
	for(i = 0; i < nListBoxCount; i++ )
	{
		//jetzt sollte es nur noch neue Eintraege geben
		SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( i );
		String sShort = aReplaceTLB.GetEntryText(pEntry, 0);
		if(pEntry->GetUserData() == &bHasSelectionText)
			pAutoCorrect->PutText(sShort, *SfxObjectShell::Current(), eLang);
		else
		{
			String sLong = aReplaceTLB.GetEntryText(pEntry, 1);
			pAutoCorrect->PutText(sShort, sLong, eLang);
		}
	}

	return sal_False;
}

/* -----------------19.11.98 13:16-------------------
 *
 * --------------------------------------------------*/
void OfaAutocorrReplacePage::RefillReplaceBox(sal_Bool bFromReset,
										LanguageType eOldLanguage,
										LanguageType eNewLanguage)
{
	eLang = eNewLanguage;
	if(bFromReset)
		lcl_ClearTable(aDoubleStringTable);
	else
	{
		DoubleStringArray* pArray = 0;
		if(aDoubleStringTable.IsKeyValid(eOldLanguage))
		{
			pArray = aDoubleStringTable.Seek(sal_uLong(eOldLanguage));
			pArray->DeleteAndDestroy(0, pArray->Count());
		}
		else
		{
			pArray = new DoubleStringArray;
			aDoubleStringTable.Insert(sal_uLong(eOldLanguage), pArray);
		}

		sal_uInt16 nListBoxCount = (sal_uInt16)aReplaceTLB.GetEntryCount();
		sal_uInt16 i;
		for(i = 0; i < nListBoxCount; i++)
		{
			DoubleString* pDouble = new DoubleString();
			SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( i );
			pDouble->sShort = aReplaceTLB.GetEntryText(pEntry, 0);
			pDouble->sLong = aReplaceTLB.GetEntryText(pEntry, 1);
			pDouble->pUserData = pEntry->GetUserData();
			pArray->Insert(pDouble, i);
		}
	}

	aReplaceTLB.Clear();
	if(!bSWriter)
	{
		if(pFormatText)
			pFormatText->DeleteAndDestroy(0, pFormatText->Count());
		else
			pFormatText = new SvStringsISortDtor();
	}

	if(aDoubleStringTable.IsKeyValid(eLang))
	{
		DoubleStringArray* pArray = aDoubleStringTable.Seek(sal_uLong(eNewLanguage));
		for(sal_uInt16 i = 0; i < pArray->Count(); i++)
		{
			DoubleString* pDouble = pArray->GetObject(i);
			sal_Bool bTextOnly = 0 == pDouble->pUserData;
			// formatierter Text wird nur im Writer angeboten
			if(bSWriter || bTextOnly)
			{
				String sEntry(pDouble->sShort);
				sEntry += '\t';
				sEntry += pDouble->sLong;
				SvLBoxEntry* pEntry = aReplaceTLB.InsertEntry(sEntry);
				aTextOnlyCB.Check(bTextOnly);
				if(!bTextOnly)
					pEntry->SetUserData(pDouble->pUserData); // Das heisst: mit Formatinfo oder sogar mit Selektionstext
			}
			else
			{
				pFormatText->Insert(new String(pDouble->sShort));
			}
		}
	}
	else
	{
        SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
        SvxAutocorrWordList* pWordList = pAutoCorrect->LoadAutocorrWordList(eLang);

		for(sal_uInt16 i = 0; i < pWordList->Count(); i++)
		{
			SvxAutocorrWordPtr pWordPtr = pWordList->GetObject(i);
			sal_Bool bTextOnly = pWordPtr->IsTextOnly();
			// formatierter Text wird nur im Writer angeboten
			if(bSWriter || bTextOnly)
			{
				String sEntry(pWordPtr->GetShort());
				sEntry += '\t';
				sEntry += pWordPtr->GetLong();
				SvLBoxEntry* pEntry = aReplaceTLB.InsertEntry(sEntry);
				aTextOnlyCB.Check(pWordPtr->IsTextOnly());
				if(!bTextOnly)
					pEntry->SetUserData(&aTextOnlyCB); // Das heisst: mit Formatinfo
			}
			else
			{
				pFormatText->Insert(new String(pWordPtr->GetShort()));
			}
		}
		aNewReplacePB.Enable(sal_False);
		aDeleteReplacePB.Enable(sal_False);

	}

	SfxViewShell* pViewShell = SfxViewShell::Current();
	if( pViewShell && pViewShell->HasSelection( sal_True ) )
	{
		bHasSelectionText = sal_True;
		const String sSelection( pViewShell->GetSelectionText() );
		aReplaceED.SetText( sSelection );
		aTextOnlyCB.Check( !bSWriter );
		aTextOnlyCB.Enable( bSWriter && sSelection.Len() );
	}
	else
		aTextOnlyCB.Enable( sal_False );
}
/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/

void OfaAutocorrReplacePage::Reset( const SfxItemSet& )
{
	RefillReplaceBox(sal_True, eLang, eLang);
	aShortED.GrabFocus();
}

/* -----------------23.11.98 10:33-------------------
 *
 * --------------------------------------------------*/
void OfaAutocorrReplacePage::SetLanguage(LanguageType eSet)
{
	//save old settings an refill
	if(eSet != eLang)
	{
		RefillReplaceBox(sal_False, eLang, eSet);
		eLastDialogLanguage = eSet;
		delete pCompareClass;
		delete pCharClass;

		::com::sun::star::lang::Locale aLcl( SvxCreateLocale(eLastDialogLanguage ));
		pCompareClass = new CollatorWrapper( GetProcessFact() );
        pCompareClass->loadDefaultCollator( aLcl, 0 );
		pCharClass = new CharClass( aLcl );
		ModifyHdl(&aShortED);
	}
}
/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/


IMPL_LINK(OfaAutocorrReplacePage, SelectHdl, SvTabListBox*, pBox)
{
	if(!bFirstSelect || !bHasSelectionText)
	{
		SvLBoxEntry* pEntry = pBox->FirstSelected();
		String sTmpShort(pBox->GetEntryText(pEntry, 0));
		// wird der Text ueber den ModifyHdl gesetzt, dann steht der Cursor sonst immer am Wortanfang,
		// obwohl man gerade hier editiert
		sal_Bool bSameContent = 0 == pCompareClass->compareString(
				sTmpShort, aShortED.GetText() );
		Selection aSel = aShortED.GetSelection();
		if(aShortED.GetText() != sTmpShort)
		{
			aShortED.SetText(sTmpShort);
			//war es nur eine andere Schreibweise, dann muss die Selektion auch wieder gesetzt werden
			if(bSameContent)
				aShortED.SetSelection(aSel);
		}
		aReplaceED.SetText(pBox->GetEntryText(pEntry, 1));
		// mit UserData gibt es eine Formatinfo
		aTextOnlyCB.Check(0 == pEntry->GetUserData());
	}
	else
		bFirstSelect = sal_False;

	aNewReplacePB.Enable(sal_False);
	aDeleteReplacePB.Enable();
	return 0;
};

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/


IMPL_LINK(OfaAutocorrReplacePage, NewDelHdl, PushButton*, pBtn)
{
    SvLBoxEntry* _pEntry = aReplaceTLB.FirstSelected();
	if(pBtn == &aDeleteReplacePB)
	{
        DBG_ASSERT(_pEntry, "keine Eintrag selektiert");
        if(_pEntry)
		{
            aReplaceTLB.GetModel()->Remove(_pEntry);
			ModifyHdl(&aShortED);
			return 0;
		}
	}
	if(pBtn == &aNewReplacePB || aNewReplacePB.IsEnabled())
	{
        SvLBoxEntry* _pNewEntry = aReplaceTLB.FirstSelected();
		String sEntry(aShortED.GetText());
		if(sEntry.Len() && ( aReplaceED.GetText().Len() ||
				( bHasSelectionText && bSWriter ) ))
		{
			aReplaceTLB.SetUpdateMode(sal_False);
			sal_uInt16 nPos = USHRT_MAX;
			sEntry += '\t';
			sEntry += aReplaceED.GetText();
            if(_pNewEntry)
			{
                nPos = (sal_uInt16)aReplaceTLB.GetModel()->GetAbsPos(_pNewEntry);
                aReplaceTLB.GetModel()->Remove(_pNewEntry);
			}
			else
			{
				sal_uInt16 j;
				for( j = 0; j < aReplaceTLB.GetEntryCount(); j++ )
				{
                    SvLBoxEntry* pReplaceEntry = aReplaceTLB.GetEntry(j);
					if( 0 >=  pCompareClass->compareString(sEntry,
                                    aReplaceTLB.GetEntryText(pReplaceEntry, 0) ) )
						break;
				}
				nPos = j;
			}
			SvLBoxEntry* pInsEntry =
                aReplaceTLB.InsertEntry(
                    sEntry, static_cast< SvLBoxEntry * >(NULL), false,
                    nPos == USHRT_MAX ? LIST_APPEND : nPos);
			if( !bReplaceEditChanged && !aTextOnlyCB.IsChecked())
				pInsEntry->SetUserData(&bHasSelectionText); // neuer formatierter Text

			aReplaceTLB.MakeVisible( pInsEntry );
			aReplaceTLB.SetUpdateMode(sal_True);
			// falls der Request aus dem ReplaceEdit kam, dann Focus in das ShortEdit setzen
			if(aReplaceED.HasFocus())
				aShortED.GrabFocus();

		}
	}
	else
	{
		// das kann nur ein Enter in einem der beiden Edit-Felder sein und das
		// bedeutet EndDialog() - muss im KeyInput ausgewertet werden
		return 0;
	}
	ModifyHdl(&aShortED);
	return 1;
}

/*-----------------17.10.96 07.49-------------------

--------------------------------------------------*/
IMPL_LINK(OfaAutocorrReplacePage, ModifyHdl, Edit*, pEdt)
{
	SvLBoxEntry* pFirstSel = aReplaceTLB.FirstSelected();
	sal_Bool bShort = pEdt == &aShortED;
	const String rEntry = pEdt->GetText();
	const String rRepString = aReplaceED.GetText();
	String aWordStr( pCharClass->lower( rEntry ));

	if(bShort)
	{
		if(rEntry.Len())
		{
			sal_Bool bFound = sal_False;
			sal_Bool bTmpSelEntry=sal_False;

			for(sal_uInt16 i = 0; i < aReplaceTLB.GetEntryCount(); i++)
			{
				SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( i );
				String aTestStr=aReplaceTLB.GetEntryText(pEntry, 0);
				if( 0 == pCompareClass->compareString(rEntry, aTestStr ))
				{
					if(rRepString.Len())
						bFirstSelect = sal_True;
					aReplaceTLB.SetCurEntry(pEntry);
					pFirstSel = pEntry;
					aNewReplacePB.SetText(sModify);
					bFound= sal_True;
					break;
				}
				else
				{
					pCharClass->toLower( aTestStr );
					if(aTestStr.Search(aWordStr)==0 && !bTmpSelEntry)
					{
						aReplaceTLB.MakeVisible(pEntry);
						bTmpSelEntry=sal_True;
					}
				}
			}
			if(!bFound)
			{
				aReplaceTLB.SelectAll(sal_False);
				pFirstSel = 0;
				aNewReplacePB.SetText(sNew);
				if(bReplaceEditChanged)
					aTextOnlyCB.Enable(sal_False);
			}
			aDeleteReplacePB.Enable(bFound);
		}
		else if(aReplaceTLB.GetEntryCount()>0)
		{
			SvLBoxEntry*  pEntry = aReplaceTLB.GetEntry( 0 );
			aReplaceTLB.MakeVisible(pEntry);
		}

	}
	else if(!bShort)
	{
		bReplaceEditChanged = sal_True;
		if(pFirstSel)
		{
			aNewReplacePB.SetText(sModify);
		}
	}

	const String& rShortTxt = aShortED.GetText();
	sal_Bool bEnableNew = rShortTxt.Len() &&
						( rRepString.Len() ||
								( bHasSelectionText && bSWriter )) &&
						( !pFirstSel || rRepString !=
								aReplaceTLB.GetEntryText( pFirstSel, 1 ) );
	if(bEnableNew && pFormatText)
	{
		for(sal_uInt16 i = 0; i < pFormatText->Count(); i++)
			if(*pFormatText->GetObject(i) == rShortTxt)
			{
				bEnableNew = sal_False;
				break;
			}
	}
	aNewReplacePB.Enable(bEnableNew);

	return 0;
}

/* -----------------20.11.98 13:48-------------------
 *
 * --------------------------------------------------*/

struct StringsArrays
{

	SvStringsDtor aAbbrevStrings;
	SvStringsDtor aDoubleCapsStrings;

	StringsArrays() :
		aAbbrevStrings(5,5), aDoubleCapsStrings(5,5) {}
};
typedef StringsArrays* StringsArraysPtr;
/* -----------------19.11.98 16:07-------------------
 *
 * --------------------------------------------------*/
sal_Bool lcl_FindInArray(SvStringsDtor& rStrings, const String& rString)
{
	for(sal_uInt16 i = 0; i < rStrings.Count(); i++)
		if(rString == *rStrings.GetObject(i))
			return sal_True;
	return sal_False;
}

void lcl_ClearTable(StringsTable& rTable)
{
	StringsArraysPtr pArrays = rTable.Last();
	while(pArrays)
	{
		delete pArrays;
		pArrays = rTable.Prev();
	}
	rTable.Clear();
}

/*-----------------14.10.96 15.57-------------------

--------------------------------------------------*/

OfaAutocorrExceptPage::OfaAutocorrExceptPage( Window* pParent,
												const SfxItemSet& rSet ) :
	SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_EXCEPT ), rSet),
	aAbbrevFL    	(this, CUI_RES(FL_ABBREV		 )),
	aAbbrevED       (this, CUI_RES(ED_ABBREV		 )),
	aAbbrevLB    	(this, CUI_RES(LB_ABBREV		 )),
	aNewAbbrevPB    (this, CUI_RES(PB_NEWABBREV	 )),
	aDelAbbrevPB    (this, CUI_RES(PB_DELABBREV	 )),
	aAutoAbbrevCB   (this, CUI_RES(CB_AUTOABBREV	 )),
	aDoubleCapsFL   (this, CUI_RES(FL_DOUBLECAPS	 )),
	aDoubleCapsED   (this, CUI_RES(ED_DOUBLE_CAPS	 )),
	aDoubleCapsLB   (this, CUI_RES(LB_DOUBLE_CAPS	 )),
	aNewDoublePB    (this, CUI_RES(PB_NEWDOUBLECAPS)),
	aDelDoublePB 	(this, CUI_RES(PB_DELDOUBLECAPS)),
	aAutoCapsCB   	(this, CUI_RES(CB_AUTOCAPS	 )),
    eLang(eLastDialogLanguage)
{
	aNewAbbrevPB.SetAccessibleName(String(CUI_RES(STR_PB_NEWABBREV) ) );
	aDelAbbrevPB.SetAccessibleName(String(CUI_RES(STR_PB_DELABBREV) ) );
	aNewDoublePB.SetAccessibleName(String(CUI_RES(STR_PB_NEWDOUBLECAPS) ) );
	aDelDoublePB.SetAccessibleName(String(CUI_RES(STR_PB_DELDOUBLECAPS) ) );

	FreeResource();

	::com::sun::star::lang::Locale aLcl( SvxCreateLocale(eLastDialogLanguage ));
	pCompareClass = new CollatorWrapper( GetProcessFact() );
	pCompareClass->loadDefaultCollator( aLcl, 0 );

	aNewAbbrevPB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
	aDelAbbrevPB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
	aNewDoublePB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
	aDelDoublePB.SetClickHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));

	aAbbrevLB.SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
	aDoubleCapsLB.SetSelectHdl(LINK(this, OfaAutocorrExceptPage, SelectHdl));
	aAbbrevED.SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));
	aDoubleCapsED.SetModifyHdl(LINK(this, OfaAutocorrExceptPage, ModifyHdl));

	aAbbrevED.SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));
	aDoubleCapsED.SetActionHdl(LINK(this, OfaAutocorrExceptPage, NewDelHdl));

	aNewAbbrevPB.SetAccessibleRelationMemberOf(&aAbbrevFL);
	aDelAbbrevPB.SetAccessibleRelationMemberOf(&aAbbrevFL);
	aNewDoublePB.SetAccessibleRelationMemberOf(&aDoubleCapsFL);
	aDelDoublePB.SetAccessibleRelationMemberOf(&aDoubleCapsFL);
}

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/

OfaAutocorrExceptPage::~OfaAutocorrExceptPage()
{
	lcl_ClearTable(aStringsTable);
	delete pCompareClass;
}

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/

SfxTabPage*	OfaAutocorrExceptPage::Create( Window* pParent,
								const SfxItemSet& rSet)
{
	return new OfaAutocorrExceptPage(pParent, rSet);
}
/* -----------------20.11.98 13:26-------------------
 *
 * --------------------------------------------------*/
void	OfaAutocorrExceptPage::ActivatePage( const SfxItemSet& )
{
	if(eLang != eLastDialogLanguage)
		SetLanguage(eLastDialogLanguage);
	((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_True);
}
/* -----------------20.11.98 13:26-------------------
 *
 * --------------------------------------------------*/
int     OfaAutocorrExceptPage::DeactivatePage( SfxItemSet* )
{
	return LEAVE_PAGE;
}
/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/

sal_Bool OfaAutocorrExceptPage::FillItemSet( SfxItemSet&  )
{
    SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
    StringsArraysPtr pArrays = aStringsTable.Last();
	while(pArrays)
	{
		LanguageType eCurLang = (LanguageType)aStringsTable.GetCurKey();
		if(eCurLang != eLang) // die aktuelle Sprache wird weiter hinten behandelt
		{
			SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eCurLang);

			if(pWrdList)
			{
				sal_uInt16 nCount = pWrdList->Count();
				sal_uInt16 i;
				for( i = nCount; i; )
				{
					String* pString = pWrdList->GetObject( --i );
					//Eintrag finden u. gfs entfernen
					if( !lcl_FindInArray(pArrays->aDoubleCapsStrings, *pString))
					  pWrdList->DeleteAndDestroy( i );
				}
				nCount = pArrays->aDoubleCapsStrings.Count();
				for( i = 0; i < nCount; ++i )
				{
					String* pEntry = new String( *pArrays->aDoubleCapsStrings.GetObject( i ) );
					if( !pWrdList->Insert( pEntry ))
						delete pEntry;
				}
				pAutoCorrect->SaveWrdSttExceptList(eCurLang);
			}

			SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eCurLang);

			if(pCplList)
			{
				sal_uInt16 nCount = pCplList->Count();
				sal_uInt16 i;
				for( i = nCount; i; )
				{
					String* pString = pCplList->GetObject( --i );
					if( !lcl_FindInArray(pArrays->aAbbrevStrings, *pString))
						pCplList->DeleteAndDestroy( i );
				}
				nCount = pArrays->aAbbrevStrings.Count();
				for( i = 0; i < nCount; ++i )
				{
					String* pEntry = new String( *pArrays->aAbbrevStrings.GetObject(i) );
					if( !pCplList->Insert( pEntry ))
						delete pEntry;
				}
				pAutoCorrect->SaveCplSttExceptList(eCurLang);
			}
		}
		pArrays = aStringsTable.Prev();
	}
	aStringsTable.Clear();

	SvStringsISortDtor* pWrdList = pAutoCorrect->LoadWrdSttExceptList(eLang);

	if(pWrdList)
	{
		sal_uInt16 nCount = pWrdList->Count();
		sal_uInt16 i;
		for( i = nCount; i; )
		{
			String* pString = pWrdList->GetObject( --i );
			if( USHRT_MAX == aDoubleCapsLB.GetEntryPos(*pString) )
				pWrdList->DeleteAndDestroy( i );
		}
		nCount = aDoubleCapsLB.GetEntryCount();
		for( i = 0; i < nCount; ++i )
		{
			String* pEntry = new String( aDoubleCapsLB.GetEntry( i ) );
			if( !pWrdList->Insert( pEntry ))
				delete pEntry;
		}
		pAutoCorrect->SaveWrdSttExceptList(eLang);
	}

	SvStringsISortDtor* pCplList = pAutoCorrect->LoadCplSttExceptList(eLang);

	if(pCplList)
	{
		sal_uInt16 nCount = pCplList->Count();
		sal_uInt16 i;
		for( i = nCount; i; )
		{
			String* pString = pCplList->GetObject( --i );
			if( USHRT_MAX == aAbbrevLB.GetEntryPos(*pString) )
				pCplList->DeleteAndDestroy( i );
		}
		nCount = aAbbrevLB.GetEntryCount();
		for( i = 0; i < nCount; ++i )
		{
			String* pEntry = new String( aAbbrevLB.GetEntry( i ) );
			if( !pCplList->Insert( pEntry ))
				delete pEntry;
		}
		pAutoCorrect->SaveCplSttExceptList(eLang);
	}
	if(aAutoAbbrevCB.IsChecked() != aAutoAbbrevCB.GetSavedValue())
		pAutoCorrect->SetAutoCorrFlag( SaveWordCplSttLst, aAutoAbbrevCB.IsChecked());
	if(aAutoCapsCB.IsChecked() != aAutoCapsCB.GetSavedValue())
		pAutoCorrect->SetAutoCorrFlag( SaveWordWrdSttLst, aAutoCapsCB.IsChecked());
	return sal_False;
}

/* -----------------23.11.98 10:33-------------------
 *
 * --------------------------------------------------*/
void OfaAutocorrExceptPage::SetLanguage(LanguageType eSet)
{
	if(eLang != eSet)
	{
		//alte Einstellungen speichern und neu fuellen
		RefillReplaceBoxes(sal_False, eLang, eSet);
		eLastDialogLanguage = eSet;
		delete pCompareClass;
		pCompareClass = new CollatorWrapper( GetProcessFact() );
		pCompareClass->loadDefaultCollator( SvxCreateLocale( eLastDialogLanguage ), 0 );
		ModifyHdl(&aAbbrevED);
		ModifyHdl(&aDoubleCapsED);
	}
}
/* -----------------20.11.98 14:06-------------------
 *
 * --------------------------------------------------*/
void OfaAutocorrExceptPage::RefillReplaceBoxes(sal_Bool bFromReset,
										LanguageType eOldLanguage,
										LanguageType eNewLanguage)
{
	eLang = eNewLanguage;
	if(bFromReset)
		lcl_ClearTable(aStringsTable);
	else
	{
		StringsArraysPtr pArrays = 0;
		if(aStringsTable.IsKeyValid(eOldLanguage))
		{
			pArrays = aStringsTable.Seek(sal_uLong(eOldLanguage));
			pArrays->aAbbrevStrings.DeleteAndDestroy(
									0, pArrays->aAbbrevStrings.Count());
			pArrays->aDoubleCapsStrings.DeleteAndDestroy(
									0, pArrays->aDoubleCapsStrings.Count());
		}
		else
		{
			pArrays = new StringsArrays;
			aStringsTable.Insert(sal_uLong(eOldLanguage), pArrays);
		}

		sal_uInt16 i;
		for(i = 0; i < aAbbrevLB.GetEntryCount(); i++)
		{
			pArrays->aAbbrevStrings.Insert(
				new String(aAbbrevLB.GetEntry(i)), i);

		}
		for(i = 0; i < aDoubleCapsLB.GetEntryCount(); i++)
		{
			pArrays->aDoubleCapsStrings.Insert(
				new String(aDoubleCapsLB.GetEntry(i)), i);
		}
	}
	aDoubleCapsLB.Clear();
	aAbbrevLB.Clear();
	String sTemp;
	aAbbrevED.SetText(sTemp);
	aDoubleCapsED.SetText(sTemp);

	if(aStringsTable.IsKeyValid(eLang))
	{
		StringsArraysPtr pArrays = aStringsTable.Seek(sal_uLong(eLang));
		sal_uInt16 i;
		for(i = 0; i < pArrays->aAbbrevStrings.Count(); i++ )
		{
			aAbbrevLB.InsertEntry(*pArrays->aAbbrevStrings.GetObject(i));
		}
		for( i = 0; i < pArrays->aDoubleCapsStrings.Count(); i++ )
		{
			aDoubleCapsLB.InsertEntry(*pArrays->aDoubleCapsStrings.GetObject(i));
		}
	}
	else
	{
        SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
        const SvStringsISortDtor* pCplList = pAutoCorrect->GetCplSttExceptList(eLang);
		const SvStringsISortDtor* pWrdList = pAutoCorrect->GetWrdSttExceptList(eLang);
		sal_uInt16 i;
		for( i = 0; i < pCplList->Count(); i++ )
		{
			aAbbrevLB.InsertEntry(*pCplList->GetObject(i));
		}
		for( i = 0; i < pWrdList->Count(); i++ )
		{
			aDoubleCapsLB.InsertEntry(*pWrdList->GetObject(i));
		}
	}
}

/*-----------------14.10.96 15.58-------------------

--------------------------------------------------*/

void OfaAutocorrExceptPage::Reset( const SfxItemSet& )
{
    SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
    RefillReplaceBoxes(sal_True, eLang, eLang);
	aAutoAbbrevCB.	Check(	pAutoCorrect->IsAutoCorrFlag( SaveWordCplSttLst ));
	aAutoCapsCB.	Check(	pAutoCorrect->IsAutoCorrFlag( SaveWordWrdSttLst ));
	aAutoAbbrevCB.SaveValue();
	aAutoCapsCB.SaveValue();
}

/*-----------------16.10.96 12.27-------------------

--------------------------------------------------*/


IMPL_LINK(OfaAutocorrExceptPage, NewDelHdl, PushButton*, pBtn)
{
	if((pBtn == &aNewAbbrevPB || pBtn == (PushButton*)&aAbbrevED )
		&& aAbbrevED.GetText().Len())
	{
		aAbbrevLB.InsertEntry(aAbbrevED.GetText());
		ModifyHdl(&aAbbrevED);
	}
	else if(pBtn == &aDelAbbrevPB)
	{
		aAbbrevLB.RemoveEntry(aAbbrevED.GetText());
		ModifyHdl(&aAbbrevED);
	}
	else if((pBtn == &aNewDoublePB || pBtn == (PushButton*)&aDoubleCapsED )
			&& aDoubleCapsED.GetText().Len())
	{
		aDoubleCapsLB.InsertEntry(aDoubleCapsED.GetText());
		ModifyHdl(&aDoubleCapsED);
	}
	else if(pBtn == &aDelDoublePB)
	{
		aDoubleCapsLB.RemoveEntry(aDoubleCapsED.GetText());
		ModifyHdl(&aDoubleCapsED);
	}
	return 0;
}

/*-----------------16.10.96 12.57-------------------

--------------------------------------------------*/

IMPL_LINK(OfaAutocorrExceptPage, SelectHdl, ListBox*, pBox)
{
	if(pBox == &aAbbrevLB)
	{
		aAbbrevED.SetText(pBox->GetSelectEntry());
		aNewAbbrevPB.Enable(sal_False);
		aDelAbbrevPB.Enable();
	}
	else
	{
		aDoubleCapsED.SetText(pBox->GetSelectEntry());
		aNewDoublePB.Enable(sal_False);
		aDelDoublePB.Enable();
	}
	return 0;
}

/*-----------------16.10.96 13.02-------------------

--------------------------------------------------*/

IMPL_LINK(OfaAutocorrExceptPage, ModifyHdl, Edit*, pEdt)
{
//	sal_Bool bSame = pEdt->GetText() == ->GetSelectEntry();
	const String& sEntry = pEdt->GetText();
	sal_Bool bEntryLen = 0!= sEntry.Len();
	if(pEdt == &aAbbrevED)
	{
		sal_Bool bSame = lcl_FindEntry(aAbbrevLB, sEntry, *pCompareClass);
		if(bSame && sEntry != aAbbrevLB.GetSelectEntry())
			pEdt->SetText(aAbbrevLB.GetSelectEntry());
		aNewAbbrevPB.Enable(!bSame && bEntryLen);
		aDelAbbrevPB.Enable(bSame && bEntryLen);
	}
	else
	{
		sal_Bool bSame = lcl_FindEntry(aDoubleCapsLB, sEntry, *pCompareClass);
		if(bSame && sEntry != aDoubleCapsLB.GetSelectEntry())
			pEdt->SetText(aDoubleCapsLB.GetSelectEntry());
		aNewDoublePB.Enable(!bSame && bEntryLen);
		aDelDoublePB.Enable(bSame && bEntryLen);
	}
	return 0;
}

/*-----------------16.10.96 15.03-------------------

--------------------------------------------------*/

void AutoCorrEdit::KeyInput( const KeyEvent& rKEvt )
{
	const KeyCode aKeyCode = rKEvt.GetKeyCode();
	const sal_uInt16 nModifier = aKeyCode.GetModifier();
	if( aKeyCode.GetCode() == KEY_RETURN )
	{
		//wird bei Enter nichts getan, dann doch die Basisklasse rufen
		// um den Dialog zu schliessen
		if(!nModifier && !aActionLink.Call(this))
				 Edit::KeyInput(rKEvt);
	}
	else if(bSpaces || aKeyCode.GetCode() != KEY_SPACE)
		Edit::KeyInput(rKEvt);
}

/*-----------------03.07.97 13:17-------------------

--------------------------------------------------*/

enum OfaQuoteOptions
{
    ADD_NONBRK_SPACE,
	REPLACE_1ST
};

SvLBoxEntry* OfaQuoteTabPage::CreateEntry(String& rTxt, sal_uInt16 nCol) 
{
	SvLBoxEntry* pEntry = new SvLBoxEntry;
	
    if ( !pCheckButtonData )
	{
		pCheckButtonData = new SvLBoxButtonData( &aSwCheckLB );
		aSwCheckLB.SetCheckButtonData( pCheckButtonData );
	}

	pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0));	// Sonst Puff!

	String sEmpty;
	if (nCol == CBCOL_SECOND)
		pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );	// Leerspalte
	else
		pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );

	if (nCol == CBCOL_FIRST)
		pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) );	// Leerspalte
	else
		pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) );

	pEntry->AddItem( new OfaImpBrwString( pEntry, 0, rTxt ) );

	return pEntry;
}

OfaQuoteTabPage::OfaQuoteTabPage( Window* pParent, const SfxItemSet& rSet ) :
	SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCORR_QUOTE ), rSet),
	aCheckLB			(this, CUI_RES(CLB_SETTINGS     )),
	aSwCheckLB			(this, CUI_RES(CLB_SETTINGS     )),
	sHeader1			(CUI_RES( STR_HEADER1		    )),
	sHeader2			(CUI_RES( STR_HEADER2		    )),
    sNonBrkSpace		(CUI_RES( ST_NON_BREAK_SPACE    )),
	sOrdinal			(CUI_RES( ST_ORDINAL            )),
    pCheckButtonData    ( NULL ),

	aSingleFL           (this, CUI_RES(FL_SINGLE		 )),
    aSingleTypoCB       (this, CUI_RES(CB_SGL_TYPO     )),
    aSglStartQuoteFT    (this, CUI_RES(FT_SGL_STARTQUOTE )),
    aSglStartQuotePB    (this, CUI_RES(PB_SGL_STARTQUOTE )),
    aSglStartExFT       (this, CUI_RES(FT_SGSTEX       )),
    aSglEndQuoteFT      (this, CUI_RES(FT_SGL_ENDQUOTE   )),
    aSglEndQuotePB      (this, CUI_RES(PB_SGL_ENDQUOTE   )),
    aSglEndExFT         (this, CUI_RES(FT_SGENEX       )),
    aSglStandardPB      (this, CUI_RES(PB_SGL_STD      )),

    aDoubleFL           (this, CUI_RES(FL_DOUBLE       )),
    aTypoCB             (this, CUI_RES(CB_TYPO         )),
    aStartQuoteFT       (this, CUI_RES(FT_STARTQUOTE   )),
    aStartQuotePB       (this, CUI_RES(PB_STARTQUOTE   )),
    aDblStartExFT       (this, CUI_RES(FT_DBSTEX       )),
    aEndQuoteFT         (this, CUI_RES(FT_ENDQUOTE     )),
	aEndQuotePB    		(this, CUI_RES(PB_ENDQUOTE     )),
    aDblEndExFT         (this, CUI_RES(FT_DBECEX       )),
    aDblStandardPB      (this, CUI_RES(PB_DBL_STD      )),

    sStartQuoteDlg  (CUI_RES(STR_CHANGE_START)),
    sEndQuoteDlg    (CUI_RES(STR_CHANGE_END)),

    sStandard(CUI_RES(ST_STANDARD))
{
	//aSglStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_STD) ) );
	//aDblStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_STD) ) );
	//aStartQuotePB.SetAccessibleName( String(CUI_RES(STR_PB_DBL_START) ));
	//aEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_END) ));
	//aSglStartQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_START) ));
	//aSglEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_END) ) );

	FreeResource();
	
    sal_Bool bShowSWOptions = sal_False;

    aCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_CLB );
    aSwCheckLB.SetHelpId( HID_OFAPAGE_QUOTE_SW_CLB );

    SFX_ITEMSET_ARG( &rSet, pItem, SfxBoolItem, SID_AUTO_CORRECT_DLG, sal_False );
    if ( pItem && pItem->GetValue() )
	    bShowSWOptions = sal_True;

    if ( bShowSWOptions )
    {
    	static long aStaticTabs[]=
	    {
		    3, 0, 20, 40
    	};
	
    	aSwCheckLB.SetStyle(aSwCheckLB.GetStyle() | WB_HSCROLL| WB_VSCROLL);

    	aSwCheckLB.SvxSimpleTable::SetTabs(aStaticTabs);
	    String sHeader( sHeader1 );
    	sHeader += '\t';
	    sHeader += sHeader2;
    	sHeader += '\t';
	    aSwCheckLB.InsertHeaderEntry( sHeader, HEADERBAR_APPEND,
						HIB_CENTER | HIB_VCENTER | HIB_FIXEDPOS | HIB_FIXED);
        aCheckLB.Hide( sal_True );
    }
    else
    {
        aSwCheckLB.HideTable( );
    }

	aStartQuotePB.SetClickHdl(LINK(this, 	OfaQuoteTabPage, QuoteHdl));
	aEndQuotePB.SetClickHdl(LINK(this, 		OfaQuoteTabPage, QuoteHdl));
	aSglStartQuotePB.SetClickHdl(LINK(this, OfaQuoteTabPage, QuoteHdl));
	aSglEndQuotePB.SetClickHdl(LINK(this, 	OfaQuoteTabPage, QuoteHdl));
	aDblStandardPB.SetClickHdl(LINK(this, 	OfaQuoteTabPage, StdQuoteHdl));
	aSglStandardPB.SetClickHdl(LINK(this, 	OfaQuoteTabPage, StdQuoteHdl));

	// Move down from the position before FreeResource() 
	// For lost help ID issue
	aSglStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_STD) ) );
	aDblStandardPB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_STD) ) );
	aStartQuotePB.SetAccessibleName( String(CUI_RES(STR_PB_DBL_START) ));
	aEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_DBL_END) ));
	aSglStartQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_START) ));
	aSglEndQuotePB.SetAccessibleName(String(CUI_RES(STR_PB_SGL_END) ) );
	aSglStartQuotePB.SetAccessibleRelationLabeledBy( &aSglStartQuoteFT );
	aSglEndQuotePB.SetAccessibleRelationLabeledBy( &aSglEndQuoteFT );
	aSglStartQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
	aSglEndQuotePB.SetAccessibleRelationMemberOf( &aSingleFL );
	aStartQuotePB.SetAccessibleRelationLabeledBy( &aStartQuoteFT );
	aEndQuotePB.SetAccessibleRelationLabeledBy( &aEndQuoteFT );
	aStartQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
	aEndQuotePB.SetAccessibleRelationMemberOf( &aDoubleFL );
	aSglStandardPB.SetAccessibleRelationMemberOf(&aSingleFL);
	aDblStandardPB.SetAccessibleRelationMemberOf(&aDoubleFL);
}
/*-----------------03.07.97 13:17-------------------

--------------------------------------------------*/
OfaQuoteTabPage::~OfaQuoteTabPage()
{
    delete( pCheckButtonData );
}
/*-----------------03.07.97 13:17-------------------

--------------------------------------------------*/
SfxTabPage*	OfaQuoteTabPage::Create( Window* pParent,
								const SfxItemSet& rAttrSet)
{
	return new OfaQuoteTabPage(pParent, rAttrSet);
}
/*-----------------03.07.97 13:18-------------------

--------------------------------------------------*/
sal_Bool OfaQuoteTabPage::FillItemSet( SfxItemSet&  )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();

	long nFlags = pAutoCorrect->GetFlags();

    if ( aCheckLB.IsVisible( ) )
    {
	    sal_uInt16 nPos = 0;
        pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace,		aCheckLB.IsChecked(nPos++));
	    pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber,		aCheckLB.IsChecked(nPos++));
    }

    sal_Bool bModified = sal_False;
    if ( aSwCheckLB.IsVisible( ) )
    {
	    SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();

        sal_Bool bCheck = aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_FIRST);
	    bModified |= pOpt->bAddNonBrkSpace != bCheck;
        pOpt->bAddNonBrkSpace = bCheck;
        pAutoCorrect->SetAutoCorrFlag(AddNonBrkSpace,
                            aSwCheckLB.IsChecked(ADD_NONBRK_SPACE, CBCOL_SECOND));

    	bCheck = aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_FIRST);
	    bModified |= pOpt->bChgOrdinalNumber != bCheck;
    	pOpt->bChgOrdinalNumber = bCheck;
	    pAutoCorrect->SetAutoCorrFlag(ChgOrdinalNumber,
						aSwCheckLB.IsChecked(REPLACE_1ST, CBCOL_SECOND));
    }

	pAutoCorrect->SetAutoCorrFlag(ChgQuotes, 		aTypoCB.IsChecked());
	pAutoCorrect->SetAutoCorrFlag(ChgSglQuotes, 	aSingleTypoCB.IsChecked());
	sal_Bool bReturn = nFlags != pAutoCorrect->GetFlags();
	if(cStartQuote != pAutoCorrect->GetStartDoubleQuote())
	{
		bReturn = sal_True;
		sal_Unicode cUCS2 = static_cast<sal_Unicode>(cStartQuote); //TODO
		pAutoCorrect->SetStartDoubleQuote(cUCS2);
	}
	if(cEndQuote != pAutoCorrect->GetEndDoubleQuote())
	{
		bReturn = sal_True;
		sal_Unicode cUCS2 = static_cast<sal_Unicode>(cEndQuote); //TODO
		pAutoCorrect->SetEndDoubleQuote(cUCS2);
	}
	if(cSglStartQuote != pAutoCorrect->GetStartSingleQuote())
	{
		bReturn = sal_True;
		sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglStartQuote); //TODO
		pAutoCorrect->SetStartSingleQuote(cUCS2);
	}
	if(cSglEndQuote != pAutoCorrect->GetEndSingleQuote())
	{
		bReturn = sal_True;
		sal_Unicode cUCS2 = static_cast<sal_Unicode>(cSglEndQuote); //TODO
		pAutoCorrect->SetEndSingleQuote(cUCS2);
	}

	if( bModified || bReturn )
    {
        SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
        pCfg->SetModified();
        pCfg->Commit();
    }
	return bReturn;
}
/* -----------------23.11.98 16:15-------------------
 *
 * --------------------------------------------------*/
void OfaQuoteTabPage::ActivatePage( const SfxItemSet& )
{
	((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage(sal_False);
}
/*-----------------03.07.97 13:18-------------------

--------------------------------------------------*/
void OfaQuoteTabPage::Reset( const SfxItemSet& )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	const long nFlags = pAutoCorrect->GetFlags();

    // Initialize the Sw options
    if ( aSwCheckLB.IsVisible( ) )
    {
        SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();

        aSwCheckLB.SetUpdateMode( sal_False );
        aSwCheckLB.Clear();

        aSwCheckLB.GetModel()->Insert(CreateEntry(sNonBrkSpace,       CBCOL_BOTH ));
        aSwCheckLB.GetModel()->Insert(CreateEntry(sOrdinal,           CBCOL_BOTH ));

        aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE, CBCOL_FIRST,	pOpt->bAddNonBrkSpace );
        aSwCheckLB.CheckEntryPos( ADD_NONBRK_SPACE,	CBCOL_SECOND,	0 != (nFlags & AddNonBrkSpace) );
        aSwCheckLB.CheckEntryPos( REPLACE_1ST,		CBCOL_FIRST,	pOpt->bChgOrdinalNumber );
        aSwCheckLB.CheckEntryPos( REPLACE_1ST,		CBCOL_SECOND,	0 != (nFlags & ChgOrdinalNumber) );

        aSwCheckLB.SetUpdateMode( sal_True );
    }

    // Initialize the non Sw options
    if ( aCheckLB.IsVisible( ) )
    {
        aCheckLB.SetUpdateMode( sal_False );
        aCheckLB.Clear( );

        aCheckLB.InsertEntry( sNonBrkSpace );
        aCheckLB.InsertEntry( sOrdinal );
    
        sal_uInt16 nPos = 0;
        aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & AddNonBrkSpace) );
        aCheckLB.CheckEntryPos( nPos++, 0 != (nFlags & ChgOrdinalNumber) );

        aCheckLB.SetUpdateMode( sal_True );
    }

    // Initialize the quote stuffs
	aTypoCB    			.Check(0 != (nFlags & ChgQuotes));
	aSingleTypoCB    	.Check(0 != (nFlags & ChgSglQuotes));
	aTypoCB    			.SaveValue();
	aSingleTypoCB    	.SaveValue();

	cStartQuote = pAutoCorrect->GetStartDoubleQuote();
	cEndQuote = pAutoCorrect->GetEndDoubleQuote();
	cSglStartQuote = pAutoCorrect->GetStartSingleQuote();
	cSglEndQuote = pAutoCorrect->GetEndSingleQuote();

	aSglStartExFT .SetText(ChangeStringExt_Impl(cSglStartQuote));
	aSglEndExFT   .SetText(ChangeStringExt_Impl(cSglEndQuote));
	aDblStartExFT .SetText(ChangeStringExt_Impl(cStartQuote));
	aDblEndExFT   .SetText(ChangeStringExt_Impl(cEndQuote));
}


/*-----------------15.10.96 16.42-------------------

--------------------------------------------------*/
#define SGL_START		0
#define DBL_START       1
#define SGL_END         2
#define DBL_END         3


IMPL_LINK( OfaQuoteTabPage, QuoteHdl, PushButton*, pBtn )
{
	sal_uInt16 nMode = SGL_START;
	if(pBtn == &aSglEndQuotePB)
		nMode = SGL_END;
	else if(pBtn == &aStartQuotePB)
		nMode = DBL_START;
	else if(pBtn == &aEndQuotePB)
		nMode = DBL_END;
	// Zeichenauswahl-Dialog starten
	SvxCharacterMap* pMap = new SvxCharacterMap( this, sal_True );
	pMap->SetCharFont( OutputDevice::GetDefaultFont(DEFAULTFONT_LATIN_TEXT,
						LANGUAGE_ENGLISH_US, DEFAULTFONT_FLAGS_ONLYONE, 0 ));
	pMap->SetText(nMode < SGL_END ? sStartQuoteDlg  :  sEndQuoteDlg );
	sal_UCS4 cDlg;
	//The two lines below are added by BerryJia for Bug95846 Time:2002-8-13 15:50
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	LanguageType eLang = Application::GetSettings().GetLanguage();
	switch( nMode )
	{
		case SGL_START:
			cDlg = cSglStartQuote;
			if(cDlg == 0)
				cDlg = pAutoCorrect->GetQuote('\'',sal_True,eLang);   //add by BerryJia for Bug95846 Time:2002-8-13 15:50
		break;
		case SGL_END:
			cDlg = cSglEndQuote;
			if(cDlg == 0)
				cDlg = pAutoCorrect->GetQuote('\'',sal_False,eLang);  //add by BerryJia for Bug95846 Time:2002-8-13 15:50
		break;
		case DBL_START:
			cDlg = cStartQuote;
			if(cDlg == 0)
				cDlg = pAutoCorrect->GetQuote('\"',sal_True,eLang);   //add by BerryJia for Bug95846 Time:2002-8-13 15:50
		break;
		case DBL_END:
			cDlg = cEndQuote;
			if(cDlg == 0)
				cDlg = pAutoCorrect->GetQuote('\"',sal_False,eLang);  //add by BerryJia for Bug95846 Time:2002-8-13 15:50
		break;
		default:
			DBG_ERROR("svx::OfaQuoteTabPage::QuoteHdl(), how to initialize cDlg?" );
			cDlg = 0;
			break;

	}
	pMap->SetChar(  cDlg );
	pMap->DisableFontSelection();
	if(pMap->Execute() == RET_OK)
	{
		sal_UCS4 cNewChar = pMap->GetChar();
		switch( nMode )
		{
			case SGL_START:
				cSglStartQuote = cNewChar;
				aSglStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
			break;
			case SGL_END:
				cSglEndQuote = cNewChar;
				aSglEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
			break;
			case DBL_START:
				cStartQuote = cNewChar;
				aDblStartExFT.SetText(ChangeStringExt_Impl(cNewChar));
			break;
			case DBL_END:
				cEndQuote = cNewChar;
				aDblEndExFT.SetText(ChangeStringExt_Impl(cNewChar));
			break;
		}
	}
	delete pMap;

	return 0;
}

/*-----------------27.06.97 09.55-------------------

--------------------------------------------------*/
IMPL_LINK( OfaQuoteTabPage, StdQuoteHdl, PushButton*, pBtn )
{
	if(pBtn == &aDblStandardPB)
	{
		cStartQuote = 0;
		aDblStartExFT.SetText(ChangeStringExt_Impl(0));
		cEndQuote = 0;
		aDblEndExFT.SetText(ChangeStringExt_Impl(0));

	}
	else
	{
		cSglStartQuote = 0;
		aSglStartExFT.SetText(ChangeStringExt_Impl(0));
		cSglEndQuote = 0;
		aSglEndExFT.SetText(ChangeStringExt_Impl(0));
	}
	return 0;
}

// --------------------------------------------------

String OfaQuoteTabPage::ChangeStringExt_Impl( sal_UCS4 cChar )
{
	if( !cChar )
		return sStandard;

    // convert codepoint value to unicode-hex string
	sal_UCS4 aStrCodes[32] = { 0, ' ', '(', 'U', '+', '0' };
	aStrCodes[0] = cChar;
	int nFullLen = 5;
    int nHexLen = 4;
    while( (cChar >> (4*nHexLen)) != 0 )
        ++nHexLen;
    for( int i = nHexLen; --i >= 0;)
    {
        sal_UCS4 cHexDigit = ((cChar >> (4*i)) & 0x0f) + '0';
		if( cHexDigit > '9' )
			cHexDigit += 'A' - ('9' + 1);
		aStrCodes[ nFullLen++ ] = cHexDigit;
    }
	aStrCodes[ nFullLen++ ] = ')';
	// using the new UCS4 constructor
	rtl::OUString aOUStr( aStrCodes, nFullLen );
	return aOUStr;
}

OfaAutoCompleteTabPage::OfaAutoCompleteTabPage( Window* pParent,
												const SfxItemSet& rSet )
	: SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_AUTOCOMPLETE_OPTIONS ), rSet),
	aCBActiv		(this, CUI_RES(CB_ACTIV)),
    aCBAppendSpace  (this, CUI_RES(CB_APPEND_SPACE)),
    aCBAsTip        (this, CUI_RES(CB_AS_TIP)),
    aCBCollect      (this, CUI_RES(CB_COLLECT)),
    aCBRemoveList   (this, CUI_RES(CB_REMOVE_LIST)),
    aFTExpandKey    (this, CUI_RES(FT_EXPAND_KEY)),
    aDCBExpandKey   (this, CUI_RES(DCB_EXPAND_KEY)),
    aFTMinWordlen   (this, CUI_RES(FT_MIN_WORDLEN)),
    aNFMinWordlen   (this, CUI_RES(NF_MIN_WORDLEN)),
    aFTMaxEntries   (this, CUI_RES(FT_MAX_ENTRIES)),
    aNFMaxEntries   (this, CUI_RES(NF_MAX_ENTRIES)),
    aLBEntries      (*this, CUI_RES(LB_ENTRIES)),
	aPBEntries      (this, CUI_RES(PB_ENTRIES)),
	pAutoCmpltList( 0 ),
	nAutoCmpltListCnt( 0 )
{
	FreeResource();

	// the defined KEYs
	static const sal_uInt16 aKeyCodes[] = {
		KEY_END,
		KEY_RETURN,
		KEY_SPACE,
		KEY_RIGHT,
        KEY_TAB,
		0
	};

	for( const sal_uInt16* pKeys = aKeyCodes; *pKeys; ++pKeys )
	{
		KeyCode aKCode( *pKeys );
		sal_uInt16 nPos = aDCBExpandKey.InsertEntry( aKCode.GetName() );
		aDCBExpandKey.SetEntryData( nPos, (void*)(sal_uLong)*pKeys );
		if( KEY_RETURN == *pKeys )		// default to RETURN
			aDCBExpandKey.SelectEntryPos( nPos );
	}

	aPBEntries.SetClickHdl(LINK(this, OfaAutoCompleteTabPage, DeleteHdl));
	aCBActiv.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
    aCBCollect.SetToggleHdl(LINK(this, OfaAutoCompleteTabPage, CheckHdl));
	aLBEntries.SetAccessibleRelationLabeledBy(&aLBEntries);
}

OfaAutoCompleteTabPage::~OfaAutoCompleteTabPage()
{
}

SfxTabPage*	OfaAutoCompleteTabPage::Create( Window* pParent,
											const SfxItemSet& rSet)
{
	return new OfaAutoCompleteTabPage( pParent, rSet );
}

sal_Bool OfaAutoCompleteTabPage::FillItemSet( SfxItemSet& )
{
	sal_Bool bModified = sal_False, bCheck;
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
	sal_uInt16 nVal;

	bCheck = aCBActiv.IsChecked();
	bModified |= pOpt->bAutoCompleteWords != bCheck;
	pOpt->bAutoCompleteWords = bCheck;
	bCheck = aCBCollect.IsChecked();
	bModified |= pOpt->bAutoCmpltCollectWords != bCheck;
	pOpt->bAutoCmpltCollectWords = bCheck;
    bCheck = !aCBRemoveList.IsChecked(); // inverted value!
    bModified |= pOpt->bAutoCmpltKeepList != bCheck; 
    pOpt->bAutoCmpltKeepList = bCheck;
    bCheck = aCBAppendSpace.IsChecked();
	bModified |= pOpt->bAutoCmpltAppendBlanc != bCheck;
	pOpt->bAutoCmpltAppendBlanc = bCheck;
	bCheck = aCBAsTip.IsChecked();
	bModified |= pOpt->bAutoCmpltShowAsTip != bCheck;
	pOpt->bAutoCmpltShowAsTip = bCheck;

	nVal = (sal_uInt16)aNFMinWordlen.GetValue();
	bModified |= nVal != pOpt->nAutoCmpltWordLen;
	pOpt->nAutoCmpltWordLen = nVal;

	nVal = (sal_uInt16)aNFMaxEntries.GetValue();
	bModified |= nVal != pOpt->nAutoCmpltListLen;
	pOpt->nAutoCmpltListLen = nVal;

	nVal = aDCBExpandKey.GetSelectEntryPos();
	if( nVal < aDCBExpandKey.GetEntryCount() )
	{
		sal_uLong nKey = (sal_uLong)aDCBExpandKey.GetEntryData( nVal );
		bModified |= nKey != pOpt->nAutoCmpltExpandKey;
		pOpt->nAutoCmpltExpandKey = (sal_uInt16)nKey;
   }

	if( pAutoCmpltList && nAutoCmpltListCnt != aLBEntries.GetEntryCount() )
	{
		bModified = sal_True;
		pOpt->pAutoCmpltList = pAutoCmpltList;
	}
	if( bModified )
    {
        SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
        pCfg->SetModified();
        pCfg->Commit();
    }
	return sal_True;
}

void OfaAutoCompleteTabPage::Reset( const SfxItemSet&  )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();

	aCBActiv.Check( 0 != pOpt->bAutoCompleteWords );
	aCBCollect.Check( 0 != pOpt->bAutoCmpltCollectWords );
    aCBRemoveList.Check( !pOpt->bAutoCmpltKeepList ); //inverted value!
    aCBAppendSpace.Check( 0 != pOpt->bAutoCmpltAppendBlanc );
	aCBAsTip.Check( 0 != pOpt->bAutoCmpltShowAsTip );

	aNFMinWordlen.SetValue( pOpt->nAutoCmpltWordLen );
	aNFMaxEntries.SetValue( pOpt->nAutoCmpltListLen );

	// select the specific KeyCode:
	{
		sal_uLong nKey = pOpt->nAutoCmpltExpandKey;
		for( sal_uInt16 n = 0, nCnt = aDCBExpandKey.GetEntryCount(); n < nCnt; ++n )
			if( nKey == (sal_uLong)aDCBExpandKey.GetEntryData( n ))
			{
				aDCBExpandKey.SelectEntryPos( n );
				break;
			}
	}

	if( pOpt->pAutoCmpltList && pOpt->pAutoCmpltList->Count() )
	{
		pAutoCmpltList = (SvStringsISortDtor*)pOpt->pAutoCmpltList;
		pOpt->pAutoCmpltList = 0;
		nAutoCmpltListCnt = pAutoCmpltList->Count();
		for( sal_uInt16 n = 0; n < nAutoCmpltListCnt; ++n )
		{
			const StringPtr pStr = pAutoCmpltList->GetObject( n );
			sal_uInt16 nPos = aLBEntries.InsertEntry( *pStr );
			aLBEntries.SetEntryData( nPos, (void*)pStr );
		}
	}
	else
	{
		aLBEntries.Disable();
		aPBEntries.Disable();
	}

	CheckHdl( &aCBActiv );
    CheckHdl( &aCBCollect );
}

void OfaAutoCompleteTabPage::ActivatePage( const SfxItemSet& )
{
	((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
}

IMPL_LINK( OfaAutoCompleteTabPage, DeleteHdl, PushButton*, EMPTYARG )
{
	sal_uInt16 nSelCnt = pAutoCmpltList ? aLBEntries.GetSelectEntryCount() : 0;
	while( nSelCnt )
	{
		sal_uInt16 nPos = aLBEntries.GetSelectEntryPos( --nSelCnt );
		const StringPtr pStr = (StringPtr)aLBEntries.GetEntryData( nPos );
		aLBEntries.RemoveEntry( nPos );
		nPos = pAutoCmpltList->GetPos( pStr );
		if( USHRT_MAX != nPos )
			pAutoCmpltList->Remove( nPos );
	}
	return 0;
}

IMPL_LINK( OfaAutoCompleteTabPage, CheckHdl, CheckBox*, pBox )
{
    sal_Bool bEnable = pBox->IsChecked();
    if( pBox == &aCBActiv )
	{
        aCBAppendSpace.Enable( bEnable );
        aCBAppendSpace.Enable( bEnable );
		aCBAsTip.Enable( bEnable );
		aDCBExpandKey.Enable( bEnable );
	}
    else if(&aCBCollect == pBox)
        aCBRemoveList.Enable( bEnable );
    return 0;
}

void OfaAutoCompleteTabPage::CopyToClipboard() const
{
	sal_uInt16 nSelCnt = aLBEntries.GetSelectEntryCount();
	if( pAutoCmpltList && nSelCnt )
	{
		TransferDataContainer* pCntnr = new TransferDataContainer;
		::com::sun::star::uno::Reference<
			::com::sun::star::datatransfer::XTransferable > xRef( pCntnr );

		ByteString sData;
		const sal_Char* pLineEnd =
#if defined(UNX)
				"\012";
#else
				"\015\012";
#endif

		rtl_TextEncoding nEncode = gsl_getSystemTextEncoding();

		for( sal_uInt16 n = 0; n < nSelCnt; ++n )
		{
			sData += ByteString( aLBEntries.GetSelectEntry( n ), nEncode );
			sData += pLineEnd;
		}
		pCntnr->CopyByteString( SOT_FORMAT_STRING, sData );
		pCntnr->CopyToClipboard( (Window*)this );
	}
}

long OfaAutoCompleteTabPage::AutoCompleteMultiListBox::PreNotify(
			NotifyEvent& rNEvt )
{
	long nHandled = MultiListBox::PreNotify( rNEvt );

	if( !nHandled && EVENT_KEYUP == rNEvt.GetType() )
	{
		const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
		switch( rKeyCode.GetModifier() | rKeyCode.GetCode() )
		{
		case KEY_DELETE:
			rPage.DeleteHdl( 0 );
			nHandled = 1;
			break;

		default:
			if( KEYFUNC_COPY == rKeyCode.GetFunction() )
			{
				rPage.CopyToClipboard();
				nHandled = 1;
			}
			break;
		}
	}
	return nHandled;
}

// class OfaSmartTagOptionsTabPage ---------------------------------------------

OfaSmartTagOptionsTabPage::OfaSmartTagOptionsTabPage( Window* pParent,
												      const SfxItemSet& rSet )
    : SfxTabPage(pParent, CUI_RES( RID_OFAPAGE_SMARTTAG_OPTIONS ), rSet),
    m_aMainCB( this, CUI_RES(CB_SMARTTAGS) ),
    m_aSmartTagTypesLB( this, CUI_RES(LB_SMARTTAGS) ),
    m_aPropertiesPB( this, CUI_RES(PB_SMARTTAGS) ),
    m_aTitleFT( this, CUI_RES(FT_SMARTTAGS) )
{
	FreeResource();

    // some options for the list box:
    m_aSmartTagTypesLB.SetStyle( m_aSmartTagTypesLB.GetStyle() | WB_HSCROLL | WB_HIDESELECTION );
	m_aSmartTagTypesLB.SetHighlightRange();

    // set the handlers:
	m_aMainCB.SetToggleHdl(LINK(this, OfaSmartTagOptionsTabPage, CheckHdl));
    m_aPropertiesPB.SetClickHdl(LINK(this, OfaSmartTagOptionsTabPage, ClickHdl));
    m_aSmartTagTypesLB.SetSelectHdl(LINK(this, OfaSmartTagOptionsTabPage, SelectHdl));
}

OfaSmartTagOptionsTabPage::~OfaSmartTagOptionsTabPage()
{

}

SfxTabPage*	OfaSmartTagOptionsTabPage::Create( Window* pParent, const SfxItemSet& rSet)
{
	return new OfaSmartTagOptionsTabPage( pParent, rSet );
}

/** This struct is used to associate list box entries with smart tag data
*/
struct ImplSmartTagLBUserData
{
    rtl::OUString maSmartTagType;
    uno::Reference< smarttags::XSmartTagRecognizer > mxRec;
    sal_Int32 mnSmartTagIdx;

    ImplSmartTagLBUserData( const rtl::OUString& rSmartTagType,
                            uno::Reference< smarttags::XSmartTagRecognizer > xRec,
                            sal_Int32 nSmartTagIdx ) :
        maSmartTagType( rSmartTagType ),
        mxRec( xRec ),
        mnSmartTagIdx( nSmartTagIdx ) {}
};

/** Clears m_aSmartTagTypesLB
*/
void OfaSmartTagOptionsTabPage::ClearListBox()
{
    const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();
    for ( sal_uInt16 i = 0; i < nCount; ++i )
	{
        const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
        const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
        delete pUserData;
    }

    m_aSmartTagTypesLB.Clear();
}

/** Inserts items into m_aSmartTagTypesLB
*/
void OfaSmartTagOptionsTabPage::FillListBox( const SmartTagMgr& rSmartTagMgr )
{
    // first we have to clear the list box:
    ClearListBox();

    // fill list box:
    const sal_uInt32 nNumberOfRecognizers = rSmartTagMgr.NumberOfRecognizers();
	const lang::Locale aLocale( SvxCreateLocale( eLastDialogLanguage ) );
    std::vector< ActionReference > aActionReferences;

    for ( sal_uInt32 i = 0; i < nNumberOfRecognizers; ++i )
    {
        uno::Reference< smarttags::XSmartTagRecognizer > xRec = rSmartTagMgr.GetRecognizer(i);

        const rtl::OUString aName = xRec->getName( aLocale );
        const rtl::OUString aDesc = xRec->getDescription( aLocale );
        const sal_Int32 nNumberOfSupportedSmartTags = xRec->getSmartTagCount();

        for ( sal_Int32 j = 0; j < nNumberOfSupportedSmartTags; ++j )
        {
            const rtl::OUString aSmartTagType = xRec->getSmartTagName(j);
            rtl::OUString aSmartTagCaption = rSmartTagMgr.GetSmartTagCaption( aSmartTagType, aLocale );

            if ( !aSmartTagCaption.getLength() )
                aSmartTagCaption = aSmartTagType;

            const rtl::OUString aLBEntry = aSmartTagCaption +
                                           OUString::createFromAscii(" (") +
                                           aName +
                                           OUString::createFromAscii(")");

            SvLBoxEntry* pEntry = m_aSmartTagTypesLB.SvTreeListBox::InsertEntry( aLBEntry );
            if ( pEntry )
            {
                const bool bCheck = rSmartTagMgr.IsSmartTagTypeEnabled( aSmartTagType );
                m_aSmartTagTypesLB.SetCheckButtonState( pEntry, bCheck ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
                pEntry->SetUserData(static_cast<void*>(new ImplSmartTagLBUserData( aSmartTagType, xRec, j ) ) );
            }
        }
    }
}

/** Handler for the push button
*/
IMPL_LINK( OfaSmartTagOptionsTabPage, ClickHdl, PushButton*, EMPTYARG )
{
	const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
    const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
    const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
    uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
    const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;

 	const lang::Locale aLocale( SvxCreateLocale( eLastDialogLanguage ) );
    if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
        xRec->displayPropertyPage( nSmartTagIdx, aLocale );

	return 0;
}

/** Handler for the check box
*/
IMPL_LINK( OfaSmartTagOptionsTabPage, CheckHdl, CheckBox*, EMPTYARG )
{
    const sal_Bool bEnable = m_aMainCB.IsChecked();
    m_aSmartTagTypesLB.Enable( bEnable );
    m_aSmartTagTypesLB.Invalidate();
    m_aPropertiesPB.Enable( false );

    // if the controls are currently enabled, we still have to check
    // if the properties button should be disabled because the currently
    // seleted smart tag type does not have a properties dialog.
    // We do this by calling SelectHdl:
    if ( bEnable )
        SelectHdl( &m_aSmartTagTypesLB );

    return 0;
}

/** Handler for the list box
*/
IMPL_LINK(OfaSmartTagOptionsTabPage, SelectHdl, SvxCheckListBox*, EMPTYARG)
{
    if ( m_aSmartTagTypesLB.GetEntryCount() < 1 )
        return 0;

	const sal_uInt16 nPos = m_aSmartTagTypesLB.GetSelectEntryPos();
    const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(nPos);
    const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
    uno::Reference< smarttags::XSmartTagRecognizer > xRec = pUserData->mxRec;
    const sal_Int32 nSmartTagIdx = pUserData->mnSmartTagIdx;

    const lang::Locale aLocale( SvxCreateLocale( eLastDialogLanguage ) );
    if ( xRec->hasPropertyPage( nSmartTagIdx, aLocale ) )
        m_aPropertiesPB.Enable( sal_True );
    else
        m_aPropertiesPB.Enable( sal_False );

	return 0;
}

/** Propagates the current settings to the smart tag manager.
*/
sal_Bool OfaSmartTagOptionsTabPage::FillItemSet( SfxItemSet& )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
    SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;

    // robust!
    if ( !pSmartTagMgr )
        return sal_False;

    sal_Bool bModifiedSmartTagTypes = sal_False;
    std::vector< rtl::OUString > aDisabledSmartTagTypes;

    const sal_uLong nCount = m_aSmartTagTypesLB.GetEntryCount();

    for ( sal_uInt16 i = 0; i < nCount; ++i )
	{
        const SvLBoxEntry* pEntry = m_aSmartTagTypesLB.GetEntry(i);
        const ImplSmartTagLBUserData* pUserData = static_cast< ImplSmartTagLBUserData* >(pEntry->GetUserData());
		const sal_Bool bChecked = m_aSmartTagTypesLB.IsChecked(i);
        const sal_Bool bIsCurrentlyEnabled = pSmartTagMgr->IsSmartTagTypeEnabled( pUserData->maSmartTagType );

        bModifiedSmartTagTypes = bModifiedSmartTagTypes || ( !bChecked != !bIsCurrentlyEnabled );

        if ( !bChecked )
            aDisabledSmartTagTypes.push_back( pUserData->maSmartTagType );

        delete pUserData;
    }

    const sal_Bool bModifiedRecognize = ( !m_aMainCB.IsChecked() != !pSmartTagMgr->IsLabelTextWithSmartTags() );
    if ( bModifiedSmartTagTypes || bModifiedRecognize )
    {
        bool bLabelTextWithSmartTags = m_aMainCB.IsChecked() ? true : false;
        pSmartTagMgr->WriteConfiguration( bModifiedRecognize     ? &bLabelTextWithSmartTags : 0,
                                          bModifiedSmartTagTypes ? &aDisabledSmartTagTypes : 0 );
    }

	return sal_True;
}

/** Sets the controls based on the current settings at SmartTagMgr.
*/
void OfaSmartTagOptionsTabPage::Reset( const SfxItemSet&  )
{
	SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect();
	SvxSwAutoFmtFlags *pOpt = &pAutoCorrect->GetSwFlags();
    const SmartTagMgr* pSmartTagMgr = pOpt->pSmartTagMgr;

    // robust, should not happen!
    if ( !pSmartTagMgr )
        return;

    FillListBox( *pSmartTagMgr );
	m_aSmartTagTypesLB.SelectEntryPos( 0 );
    m_aMainCB.Check( pSmartTagMgr->IsLabelTextWithSmartTags() );
    CheckHdl( &m_aMainCB );
}

void OfaSmartTagOptionsTabPage::ActivatePage( const SfxItemSet& )
{
	((OfaAutoCorrDlg*)GetTabDialog())->EnableLanguage( sal_False );
}
