/**************************************************************
 * 
 * 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_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif

#include "swuiidxmrk.hxx"
#include <hintids.hxx>
#include <helpid.h>
#define _SVSTDARR_STRINGSSORT
#include <svl/svstdarr.hxx>
#include <comphelper/processfactory.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/util/SearchOptions.hpp>
#include <com/sun/star/util/SearchFlags.hpp>
#include <com/sun/star/i18n/TransliterationModules.hpp>
#include <svl/stritem.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/dispatch.hxx>
#include <svl/eitem.hxx>
#include <svtools/txtcmp.hxx>
#include <editeng/scripttypeitem.hxx>
#include <svl/itemset.hxx>
#include <editeng/langitem.hxx>
#include "editeng/unolingu.hxx"
#include <swtypes.hxx>
#include <idxmrk.hxx>
#include <txttxmrk.hxx>
#include <wrtsh.hxx>
#include <view.hxx>
#include <multmrk.hxx>
#include <swundo.hxx>               	// fuer Undo-Ids
#include <cmdid.h>
#include <index.hrc>
#include <idxmrk.hrc>
#include <swmodule.hxx>
#include <fldmgr.hxx>
#include <fldbas.hxx>
#include <utlui.hrc>
#include <swcont.hxx>
#include <svl/cjkoptions.hxx>
#include <ndtxt.hxx>
#include <breakit.hxx>
#include <SwRewriter.hxx>

#include "swuiidxmrk.hxx"
#include <unomid.h>


#define POS_CONTENT 0
#define POS_INDEX   1
#define POS_USER    2

static sal_uInt16 nTypePos = 1; // TOX_INDEX as standard
static sal_uInt16 nKey1Pos = USHRT_MAX;

static sal_uInt16 nKey2Pos = USHRT_MAX;

using namespace com::sun::star;
using namespace com::sun::star::i18n;
using namespace com::sun::star::lang;
using namespace com::sun::star::util;
using namespace com::sun::star::i18n;
using ::rtl::OUString;
using namespace ::comphelper;
using namespace ::com::sun::star;

/*--------------------------------------------------------------------
	 Beschreibung:	Dialog zum Einfuegen einer Verzeichnismarkierung
 --------------------------------------------------------------------*/
SwIndexMarkDlg::SwIndexMarkDlg(Window *pParent,
							   sal_Bool bNewDlg,
							   const ResId& rResId,
                               sal_Int32 _nOptionsId, SwWrtShell& rWrtShell ) :
	  Window(pParent, rResId),
    aIndexFL(this,  SW_RES(FL_INDEX )),
    aTypeFT (this,  SW_RES(LBL_INDEX    )),
    aTypeDCB(this,  SW_RES(DCB_INDEX    )),
	aNewBT(this, 	SW_RES(BT_NEW 	)),

    aEntryFT(this,  SW_RES(LBL_ENTRY    )),
    aEntryED(this,  SW_RES(SL_ENTRY )),
    aPhoneticFT0(this,  SW_RES(FT_PHONETIC_1 )),
    aPhoneticED0(this,  SW_RES(ED_PHONETIC_1 )),

    aKeyFT(this,    SW_RES(LBL_KEY  )),
    aKeyDCB(this,   SW_RES(DCB_KEY  )),
    aPhoneticFT1(this,  SW_RES(FT_PHONETIC_2 )),
    aPhoneticED1(this,  SW_RES(ED_PHONETIC_2 )),

    aKey2FT(this,   SW_RES(LBL_KEY2 )),
    aKey2DCB(this,  SW_RES(DCB_KEY2 )),
    aPhoneticFT2(this,  SW_RES(FT_PHONETIC_3 )),
    aPhoneticED2(this,  SW_RES(ED_PHONETIC_3 )),

    aLevelFT(this,  SW_RES(LBL_LEVEL    )),
    aLevelED(this,  SW_RES(SL_LEVEL )),
    aMainEntryCB(this, SW_RES(CB_MAIN_ENTRY )),
    aApplyToAllCB(this,SW_RES(CB_APPLY_TO_ALL)),
    aSearchCaseSensitiveCB(this,    SW_RES(CB_CASESENSITIVE )),
    aSearchCaseWordOnlyCB(this,     SW_RES(CB_WORDONLY      )),


    aOKBT(this,     SW_RES(BT_OK    )),
    aCancelBT(this, SW_RES(BT_CANCEL )),
    aHelpBT(this,   SW_RES(BT_HELP   )),
    aDelBT(this,    SW_RES(BT_DEL   )),

    aPrevSameBT(this,SW_RES(BT_PREVSAME)),
    aNextSameBT(this,SW_RES(BT_NXTSAME)),
    aPrevBT(this,   SW_RES(BT_PREV  )),
    aNextBT(this,   SW_RES(BT_NXT   )),

    nOptionsId( _nOptionsId ),
    bDel(sal_False),
    bNewMark(bNewDlg),
    bSelected(sal_False),

    bPhoneticED0_ChangedByUser(sal_False),
	bPhoneticED1_ChangedByUser(sal_False),
	bPhoneticED2_ChangedByUser(sal_False),
    nLangForPhoneticReading(2052),
    bIsPhoneticReadingEnabled(sal_False),
    xExtendedIndexEntrySupplier(NULL),
    pTOXMgr(0),
    pSh(&rWrtShell)
{
	aNewBT.SetAccessibleRelationMemberOf(&aIndexFL);

	if( SvtCJKOptions().IsCJKFontEnabled() )
	{
		uno::Reference< lang::XMultiServiceFactory > xMSF = getProcessServiceFactory();

		xExtendedIndexEntrySupplier =
            uno::Reference< i18n::XExtendedIndexEntrySupplier > (
					xMSF->createInstance( C2U("com.sun.star.i18n.IndexEntrySupplier") ),
																		uno::UNO_QUERY );
	}

	SetStyle(GetStyle()|WB_DIALOGCONTROL);
	FreeResource();
	aOKBT			.SetHelpId(HID_INSERT_IDX_MRK_OK   		);
	aCancelBT		.SetHelpId(HID_INSERT_IDX_MRK_CLOSE		);
	aDelBT      	.SetHelpId(HID_INSERT_IDX_MRK_DELETE	);
	aNewBT      	.SetHelpId(HID_INSERT_IDX_MRK_NEW		);
	aPrevBT     	.SetHelpId(HID_INSERT_IDX_MRK_PREV		);
	aPrevSameBT 	.SetHelpId(HID_INSERT_IDX_MRK_PREV_SAME	);
	aNextBT     	.SetHelpId(HID_INSERT_IDX_MRK_NEXT		);
	aNextSameBT 	.SetHelpId(HID_INSERT_IDX_MRK_NEXT_SAME	);
	aTypeDCB    	.SetHelpId(HID_INSERT_IDX_MRK_TYPE		);
	aEntryED    	.SetHelpId(HID_INSERT_IDX_MRK_ENTRY		);
	aKeyDCB     	.SetHelpId(HID_INSERT_IDX_MRK_PRIM_KEY	);
	aKey2DCB    	.SetHelpId(HID_INSERT_IDX_MRK_SEC_KEY	);
	aLevelED    	.SetHelpId(HID_INSERT_IDX_MRK_LEVEL		);
	aMainEntryCB	.SetHelpId(HID_INSERT_IDX_MRK_MAIN_ENTRY);
	aApplyToAllCB	.SetHelpId(HID_INSERT_IDX_MRK_APPLY_ALL	);
	aPhoneticED0	.SetHelpId(HID_INSERT_IDX_MRK_PHONETIC_READING );
	aPhoneticED1	.SetHelpId(HID_INSERT_IDX_MRK_PHONETIC_READING );
	aPhoneticED2	.SetHelpId(HID_INSERT_IDX_MRK_PHONETIC_READING );

	aSearchCaseSensitiveCB.SetHelpId(	HID_INSERT_IDX_MRK_SRCH_CASESENSITIVE	);
	aSearchCaseWordOnlyCB.SetHelpId(	HID_INSERT_IDX_MRK_SRCH_WORDONLY		);


	GetParent()->SetText( SW_RESSTR( bNewMark ? STR_IDXMRK_INSERT : STR_IDXMRK_EDIT));

	aDelBT.SetClickHdl(LINK(this,SwIndexMarkDlg, 		DelHdl));
	aPrevBT.SetClickHdl(LINK(this,SwIndexMarkDlg, 		PrevHdl));
	aPrevSameBT.SetClickHdl(LINK(this,SwIndexMarkDlg, 	PrevSameHdl));
	aNextBT.SetClickHdl(LINK(this,SwIndexMarkDlg, 		NextHdl));
	aNextSameBT.SetClickHdl(LINK(this,SwIndexMarkDlg, 	NextSameHdl));
	//aTypeDCB.SetModifyHdl(LINK(this,SwIndexMarkDlg, 	ModifyHdl));
	aTypeDCB.SetSelectHdl(LINK(this,SwIndexMarkDlg, 	ModifyHdl));
	aKeyDCB.SetModifyHdl(LINK(this,SwIndexMarkDlg, 		KeyDCBModifyHdl));
	aKey2DCB.SetModifyHdl(LINK(this,SwIndexMarkDlg, 	KeyDCBModifyHdl));
	aOKBT.SetClickHdl(LINK(this,SwIndexMarkDlg, 		InsertHdl));
	aCancelBT.SetClickHdl(LINK(this,SwIndexMarkDlg, 	CloseHdl));
	aEntryED.SetModifyHdl(LINK(this,SwIndexMarkDlg, 	ModifyHdl));
	aNewBT.SetClickHdl(LINK(this, SwIndexMarkDlg,       NewUserIdxHdl));
	aApplyToAllCB.SetClickHdl(LINK(this, SwIndexMarkDlg, SearchTypeHdl));
	aPhoneticED0.SetModifyHdl(LINK(this,SwIndexMarkDlg, PhoneticEDModifyHdl));
	aPhoneticED1.SetModifyHdl(LINK(this,SwIndexMarkDlg, PhoneticEDModifyHdl));
	aPhoneticED2.SetModifyHdl(LINK(this,SwIndexMarkDlg, PhoneticEDModifyHdl));

	if(bNewMark)
	{
		aDelBT.Hide();

		{
			ImageList aTempList( SW_RES( IMG_NAVI_ENTRYBMPH ) );
			aNewBT.SetModeImage( aTempList.GetImage( SID_SW_START + CONTENT_TYPE_INDEX ), BMP_COLOR_HIGHCONTRAST );
		}

		{
			ImageList aTempList( SW_RES( IMG_NAVI_ENTRYBMP ) );
			aNewBT.SetModeImage( aTempList.GetImage( SID_SW_START + CONTENT_TYPE_INDEX ), BMP_COLOR_NORMAL );
		}
	}
	else
	{
		aNewBT.Hide();
		OKButton aTmp(this, WB_HIDE);
		aOKBT.SetText( aTmp.GetText() );
	}

    aEntryED.GrabFocus();
}

/*--------------------------------------------------------------------
	 Beschreibung:	Controls neu initialisieren mit der aktuellen
					Markierung
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::InitControls()
{
	DBG_ASSERT(pSh && pTOXMgr, "Shell nicht da?");
	// Inhalts-Verzeichnis
	const SwTOXType* pType = pTOXMgr->GetTOXType(TOX_CONTENT, 0);
	ASSERT(pType, "Kein Verzeichnistyp !!");
	String sTmpTypeSelection;
	if(aTypeDCB.GetSelectEntryCount())
		sTmpTypeSelection = aTypeDCB.GetSelectEntry();
	aTypeDCB.Clear();
	aTypeDCB.InsertEntry(pType->GetTypeName());

	// Stichwort-Verzeichnis
	pType = pTOXMgr->GetTOXType(TOX_INDEX, 0);
	ASSERT(pType, "Kein Verzeichnistyp !!");
	aTypeDCB.InsertEntry(pType->GetTypeName());

	// Benutzerverzeichnisse
	sal_uInt16 nCount = pSh->GetTOXTypeCount(TOX_USER);
	sal_uInt16 i;
	for( i = 0; i < nCount; ++i )
		aTypeDCB.InsertEntry( pSh->GetTOXType(TOX_USER, i)->GetTypeName() );

	// KeyWords Primary einlesen
	SvStringsSort aArr;
	nCount = pSh->GetTOIKeys( TOI_PRIMARY, aArr );
	for(i=0; i < nCount; ++i)
		aKeyDCB.InsertEntry( *aArr[ i ] );

	// KeyWords Secondary einlesen
	nCount = pSh->GetTOIKeys( TOI_SECONDARY, aArr );
	for(i=0; i < nCount; ++i)
		aKey2DCB.InsertEntry( *aArr[ i ] );

	UpdateLanguageDependenciesForPhoneticReading();

	// Aktueller Eintrag
	const SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
	if( pMark && !bNewMark)
	{
		// Controls-Handling

		// nur wenn mehr als eins vorhanden
		// wenn gleich landet es auf dem gleichen Eintrag
		pSh->SttCrsrMove();

		const SwTOXMark* pMoveMark;
		sal_Bool bShow = sal_False;

		pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_PRV );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_NXT ), bShow = sal_True;
		aPrevBT.Enable( pMoveMark != pMark );
		pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_NXT );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_PRV ), bShow = sal_True;
		aNextBT.Enable( pMoveMark != pMark );
		if( bShow )
		{
			aPrevBT.Show();
			aNextBT.Show();
			bShow = sal_False;
		}

		pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_PRV );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT ), bShow = sal_True;
		aPrevSameBT.Enable( pMoveMark != pMark );
		pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_NXT );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV ), bShow = sal_True;
		aNextSameBT.Enable( pMoveMark != pMark );
		if( bShow )
		{
			aNextSameBT.Show();
			aPrevSameBT.Show();
		}
		pSh->EndCrsrMove();

		aTypeFT.Show();

		aTypeDCB.Enable(sal_False);
		aTypeFT.Enable(sal_False);

		UpdateDialog();
	}
	else
	{ 	// aktuelle Selektion (1.Element) anzeigen  ????
		sal_uInt16 nCnt = pSh->GetCrsrCnt();
		if (nCnt < 2)
		{
			bSelected = !pSh->HasSelection();
			aOrgStr = pSh->GetView().GetSelectionTextParam(sal_True, sal_False);
			aEntryED.SetText(aOrgStr);

			//alle gleichen Eintraege aufzunehmen darf nur im Body und auch da nur
			//bei vorhandener einfacher Selektion erlaubt werden
			const sal_uInt16 nFrmType = pSh->GetFrmType(0,sal_True);
			aApplyToAllCB.Show();
			aSearchCaseSensitiveCB.Show();
			aSearchCaseWordOnlyCB.Show();
			aApplyToAllCB.Enable(0 != aOrgStr.Len() &&
				0 == (nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FLY_ANY )));
			SearchTypeHdl(&aApplyToAllCB);
		}

		// Verzeichnistyp ist default
		if(	sTmpTypeSelection.Len() &&
			LISTBOX_ENTRY_NOTFOUND != aTypeDCB.GetEntryPos( sTmpTypeSelection ) )
            aTypeDCB.SelectEntry(sTmpTypeSelection);
		else
			aTypeDCB.SelectEntry(aTypeDCB.GetEntry(nTypePos));
		ModifyHdl(&aTypeDCB);
	}
}

void	SwIndexMarkDlg::UpdateLanguageDependenciesForPhoneticReading()
{
	//no phonetic reading if no global cjk support
	if( !xExtendedIndexEntrySupplier.is() )
	{
		bIsPhoneticReadingEnabled = sal_False;
		return;
	}
	bIsPhoneticReadingEnabled = sal_True;

	//get the current language
	if(!bNewMark) //if dialog is opened to iterate existing marks
	{
		ASSERT(pTOXMgr, "need TOXMgr")
		if(!pTOXMgr)
			return;
		SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
		ASSERT(pMark, "need current SwTOXMark");
		if(!pMark)
			return;
		SwTxtTOXMark* pTxtTOXMark = pMark->GetTxtTOXMark();
		ASSERT(pTxtTOXMark, "need current SwTxtTOXMark");
		if(!pTxtTOXMark)
			return;
		const SwTxtNode* pTxtNode = pTxtTOXMark->GetpTxtNd();
		ASSERT(pTxtNode, "need current SwTxtNode");
		if(!pTxtNode)
			return;
		xub_StrLen nTextIndex = *pTxtTOXMark->GetStart();
		nLangForPhoneticReading = pTxtNode->GetLang( nTextIndex );
	}
	else //if dialog is opened to create a new mark
	{
		sal_uInt16 nScriptType = pSh->GetScriptType();
		sal_uInt16 nWhich;
		switch(nScriptType)
		{
			case SCRIPTTYPE_ASIAN: nWhich = RES_CHRATR_CJK_LANGUAGE; break;
			case SCRIPTTYPE_COMPLEX:nWhich = RES_CHRATR_CTL_LANGUAGE; break;
			//case SCRIPTTYPE_LATIN:
			default:nWhich = RES_CHRATR_LANGUAGE; break;
		}
        SfxItemSet aLangSet(pSh->GetAttrPool(), nWhich, nWhich);
        pSh->GetCurAttr(aLangSet);
        nLangForPhoneticReading = ((const SvxLanguageItem&)aLangSet.Get(nWhich)).GetLanguage();
	}

	/*
	//enable phonetic reading dependent on the current language
	{
		lang::Locale aLocale( SvxCreateLocale( LanguageType( nLangForPhoneticReading ) ) );
		bIsPhoneticReadingEnabled = xExtendedIndexEntrySupplier->usePhoneticEntry( aLocale );
	}
	*/
}

String	SwIndexMarkDlg::GetDefaultPhoneticReading( const String& rText )
{
	if( !bIsPhoneticReadingEnabled )
		return aEmptyStr;

	lang::Locale aLocale( SvxCreateLocale( LanguageType( nLangForPhoneticReading ) ) );
	return xExtendedIndexEntrySupplier->getPhoneticCandidate(rText, aLocale);
}

/* -----------------07.09.99 10:43-------------------
	Change the content of aEntryED if text is selected
 --------------------------------------------------*/

void	SwIndexMarkDlg::Activate()
{
	// aktuelle Selektion (1.Element) anzeigen  ????
	if(bNewMark)
	{
		sal_uInt16 nCnt = pSh->GetCrsrCnt();
		if (nCnt < 2)
		{
			bSelected = !pSh->HasSelection();
			aOrgStr = pSh->GetView().GetSelectionTextParam(sal_True, sal_False);
			aEntryED.SetText(aOrgStr);

			//alle gleichen Eintraege aufzunehmen darf nur im Body und auch da nur
			//bei vorhandener einfacher Selektion erlaubt werden
			const sal_uInt16 nFrmType = pSh->GetFrmType(0,sal_True);
			aApplyToAllCB.Show();
			aSearchCaseSensitiveCB.Show();
			aSearchCaseWordOnlyCB.Show();
			aApplyToAllCB.Enable(0 != aOrgStr.Len() &&
				0 == (nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FLY_ANY )));
			SearchTypeHdl(&aApplyToAllCB);
		}
		ModifyHdl(&aTypeDCB);
	}
}

/*--------------------------------------------------------------------
	 Beschreibung:	Ok-Button auswerten
 --------------------------------------------------------------------*/
void SwIndexMarkDlg::Apply()
{
	InsertUpdate();
	if(bSelected)
		pSh->ResetSelect(0, sal_False);
}

/*--------------------------------------------------------------------
	Beschreibung: Aenderungen uebernehmen
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::InsertUpdate()
{
	pSh->StartUndo(bDel ? UNDO_INDEX_ENTRY_DELETE : UNDO_INDEX_ENTRY_INSERT);
	pSh->StartAllAction();

    SwRewriter aRewriter;

	if( bNewMark )
    {
		InsertMark();

        if ( pTOXMgr->GetCurTOXMark())
            aRewriter.AddRule(UNDO_ARG1, pTOXMgr->GetCurTOXMark()->GetText());
    }
	else if( !pSh->HasReadonlySel() )
	{
        if ( pTOXMgr->GetCurTOXMark())
            aRewriter.AddRule(UNDO_ARG1,
                              pTOXMgr->GetCurTOXMark()->GetText());

		if( bDel )
			pTOXMgr->DeleteTOXMark();
		else if( pTOXMgr->GetCurTOXMark() )
			UpdateMark();
	}

	pSh->EndAllAction();
	pSh->EndUndo(bDel ? UNDO_INDEX_ENTRY_DELETE : UNDO_INDEX_ENTRY_INSERT);

	if((nTypePos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry())) == LISTBOX_ENTRY_NOTFOUND)
		nTypePos = 0;

	nKey1Pos = aKeyDCB.GetEntryPos(aKeyDCB.GetText());
	nKey2Pos = aKey2DCB.GetEntryPos(aKey2DCB.GetText());
}

/*--------------------------------------------------------------------
	 Beschreibung:	Marke einfuegen
 --------------------------------------------------------------------*/
static void lcl_SelectSameStrings(SwWrtShell& rSh, sal_Bool bWordOnly, sal_Bool bCaseSensitive)
{
	rSh.Push();

	SearchOptions aSearchOpt(
						SearchAlgorithms_ABSOLUTE,
						( bWordOnly ? SearchFlags::NORM_WORD_ONLY : 0 ),
						rSh.GetSelTxt(), OUString(),
						SvxCreateLocale( GetAppLanguage() ),
						0, 0, 0,
						(bCaseSensitive
							? 0
							: TransliterationModules_IGNORE_CASE) );

	rSh.ClearMark();
    sal_Bool bCancel;

	//todo/mba: assuming that notes should not be searched
	sal_Bool bSearchInNotes = sal_False;
    rSh.Find( aSearchOpt,  bSearchInNotes, DOCPOS_START, DOCPOS_END, bCancel,
                        (FindRanges)(FND_IN_SELALL|FND_IN_BODYONLY), sal_False );
}


void SwIndexMarkDlg::InsertMark()
{
	sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
	TOXTypes eType = nPos == POS_CONTENT ? TOX_CONTENT :
						nPos == POS_INDEX ? TOX_INDEX : TOX_USER;

	SwTOXMarkDescription aDesc(eType);

	sal_uInt16 nLevel = (sal_uInt16)aLevelED.Denormalize(aLevelED.GetValue());
	switch(nPos)
	{
		case POS_CONTENT : break;
		case POS_INDEX:  	// Stichwortverzeichnismarke
		{
			UpdateKeyBoxes();
			String  aPrim(aKeyDCB.GetText());
			String  aSec(aKey2DCB.GetText());
			aDesc.SetPrimKey(aPrim);
			aDesc.SetSecKey(aSec);
			aDesc.SetMainEntry(aMainEntryCB.IsChecked());
			aDesc.SetPhoneticReadingOfAltStr(aPhoneticED0.GetText());
			aDesc.SetPhoneticReadingOfPrimKey(aPhoneticED1.GetText());
			aDesc.SetPhoneticReadingOfSecKey(aPhoneticED2.GetText());
		}
		break;
		default:            // Userdefinedverz.-Marke
		{
			String aName(aTypeDCB.GetSelectEntry());
			aDesc.SetTOUName(aName);
		}
	}
	if (aOrgStr != aEntryED.GetText())
		aDesc.SetAltStr(aEntryED.GetText());
	sal_Bool bApplyAll = aApplyToAllCB.IsChecked();
    sal_Bool bWordOnly = aSearchCaseWordOnlyCB.IsChecked();
	sal_Bool bCaseSensitive = aSearchCaseSensitiveCB.IsChecked();

	pSh->StartAllAction();
	// hier muessen alle gleichen Strings selektiert werden
	// damit der Eintrag auf alle gleichen Strings angewandt wird
	if(bApplyAll)
	{
		lcl_SelectSameStrings(*pSh, bWordOnly, bCaseSensitive);
	}
	aDesc.SetLevel(nLevel);
	SwTOXMgr aMgr(pSh);
	aMgr.InsertTOXMark(aDesc);
	if(bApplyAll)
		pSh->Pop(sal_False);

	pSh->EndAllAction();
}

/*--------------------------------------------------------------------
	 Beschreibung:	Marke Updaten
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::UpdateMark()
{
	String 	aAltText(aEntryED.GetText());
	String* pAltText = aOrgStr != aEntryED.GetText() ? &aAltText : 0;
	//empty alternative texts are not allowed
	if(pAltText && !pAltText->Len())
		return;

	UpdateKeyBoxes();

	sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
	TOXTypes eType = TOX_USER;
	if(POS_CONTENT == nPos)
		eType = TOX_CONTENT;
	else if(POS_INDEX == nPos)
		eType = TOX_INDEX;

	SwTOXMarkDescription aDesc(eType);
    aDesc.SetLevel( static_cast< int >(aLevelED.GetValue()) );
	if(pAltText)
		aDesc.SetAltStr(*pAltText);

	String  aPrim(aKeyDCB.GetText());
	if(aPrim.Len())
		aDesc.SetPrimKey(aPrim);
	String  aSec(aKey2DCB.GetText());
	if(aSec.Len())
		aDesc.SetSecKey(aSec);

	if(eType == TOX_INDEX)
	{
		aDesc.SetPhoneticReadingOfAltStr(aPhoneticED0.GetText());
		aDesc.SetPhoneticReadingOfPrimKey(aPhoneticED1.GetText());
		aDesc.SetPhoneticReadingOfSecKey(aPhoneticED2.GetText());
	}
	aDesc.SetMainEntry(aMainEntryCB.IsVisible() && aMainEntryCB.IsChecked());
	pTOXMgr->UpdateTOXMark(aDesc);
}

/*--------------------------------------------------------------------
	Beschreibung: Neue Keys eintragen
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::UpdateKeyBoxes()
{
	String aKey(aKeyDCB.GetText());
	sal_uInt16 nPos = aKeyDCB.GetEntryPos(aKey);

	if(nPos == LISTBOX_ENTRY_NOTFOUND && aKey.Len() > 0)
	{	// neuen Key erzeugen
		aKeyDCB.InsertEntry(aKey);
	}

	aKey = aKey2DCB.GetText();
	nPos = aKey2DCB.GetEntryPos(aKey);

	if(nPos == LISTBOX_ENTRY_NOTFOUND && aKey.Len() > 0)
	{	// neuen Key erzeugen
		aKey2DCB.InsertEntry(aKey);
	}
}
/* -----------------13.10.99 15:10-------------------

 --------------------------------------------------*/
class SwNewUserIdxDlg : public ModalDialog
{
	OKButton 		aOKPB;
	CancelButton 	aCancelPB;
	HelpButton 		aHelpPB;
    FixedLine       aNameFL;
	FixedText		aNameFT;
	Edit			aNameED;

	SwIndexMarkDlg*	pDlg;

	DECL_LINK( ModifyHdl, Edit*);

	public:
		SwNewUserIdxDlg(SwIndexMarkDlg* pParent) :
			ModalDialog(pParent, SW_RES(DLG_NEW_USER_IDX)),
            aOKPB(this, SW_RES(     PB_OK       )),
            aCancelPB(this, SW_RES( PB_CANCEL   )),
            aHelpPB(this, SW_RES(   PB_HELP     )),
            aNameFL(this, SW_RES(    FL_NAME     )),
            aNameFT(this, SW_RES(   FT_NAME     )),
            aNameED(this, SW_RES(    ED_NAME     )),
            pDlg(pParent)
			{
				FreeResource();
				aNameED.SetModifyHdl(LINK(this, SwNewUserIdxDlg, ModifyHdl));
				aOKPB.Enable(sal_False);
				aNameED.GrabFocus();
			}

	virtual void	Apply();
	String 	GetName(){return aNameED.GetText();}
};
void SwNewUserIdxDlg::Apply()
{
}

IMPL_LINK( SwNewUserIdxDlg, ModifyHdl, Edit*, pEdit)
{
	aOKPB.Enable(pEdit->GetText().Len() && !pDlg->IsTOXType(pEdit->GetText()));
	return 0;
}

IMPL_LINK( SwIndexMarkDlg, NewUserIdxHdl, Button*, EMPTYARG)
{
	SwNewUserIdxDlg* pDlg = new SwNewUserIdxDlg(this);
	if(RET_OK == pDlg->Execute())
	{
		String sNewName(pDlg->GetName());
		aTypeDCB.InsertEntry(sNewName);
		aTypeDCB.SelectEntry(sNewName);
	}
	delete pDlg;
	return 0;
}
/* -----------------------------17.01.00 12:18--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, SearchTypeHdl, CheckBox*, pBox)
{
	sal_Bool bEnable = pBox->IsChecked() && pBox->IsEnabled();
	aSearchCaseWordOnlyCB.Enable(bEnable);
	aSearchCaseSensitiveCB.Enable(bEnable);
	return 0;
}
/* -----------------07.09.99 10:30-------------------

 --------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, InsertHdl, Button *, pButton )
{
	Apply();
	//close the dialog if only one entry is available
	if(!bNewMark && !aPrevBT.IsVisible() && !aNextBT.IsVisible())
		CloseHdl(pButton);
	return 0;
}
/* -----------------07.09.99 10:29-------------------

 --------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, CloseHdl, Button *, EMPTYARG )
{
	if(bNewMark)
	{
		sal_uInt16 nSlot = FN_INSERT_IDX_ENTRY_DLG;
		SfxViewFrame::Current()->GetDispatcher()->Execute(nSlot,
					SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
	}
	else
	{
		((SwIndexMarkModalDlg*)GetParent())->EndDialog(RET_CANCEL);
	}
	return 0;
}
/*--------------------------------------------------------------------
	 Beschreibung:	VerzeichnisTyp auswaehlen nur bei Einfuegen
 --------------------------------------------------------------------*/
IMPL_LINK( SwIndexMarkDlg, ModifyHdl, ListBox *, pBox )
{
	if(&aTypeDCB == pBox)
	{
		// Verzeichnistyp setzen
		sal_uInt16 nPos = aTypeDCB.GetEntryPos(aTypeDCB.GetSelectEntry());
		sal_Bool bLevelEnable = sal_False,
		 	bKeyEnable	  = sal_False,
		 	bSetKey2 	  = sal_False,
		 	bKey2Enable  = sal_False,
			bEntryHasText	= sal_False,
			bKey1HasText	= sal_False,
			bKey2HasText	= sal_False;
		if(nPos == POS_INDEX)
		{
			if(aEntryED.GetText().Len())
				bEntryHasText = sal_True;
			aPhoneticED0.SetText(GetDefaultPhoneticReading(aEntryED.GetText()));

			bKeyEnable = sal_True;
			aKeyDCB.SetText(aKeyDCB.GetEntry(nKey1Pos));
			aPhoneticED1.SetText(GetDefaultPhoneticReading(aKeyDCB.GetText()));
			if(aKeyDCB.GetText().Len() > 0)
			{
				bKey1HasText = bSetKey2 = bKey2Enable = sal_True;
				aKey2DCB.SetText(aKey2DCB.GetEntry(nKey2Pos));
				aPhoneticED2.SetText(GetDefaultPhoneticReading(aKey2DCB.GetText()));
				if(aKey2DCB.GetText().Len())
					bKey2HasText = sal_True;
			}
		}
		else
		{
			bLevelEnable = sal_True;
			aLevelED.SetMax(MAXLEVEL);
			aLevelED.SetValue(aLevelED.Normalize(0));
			bSetKey2 = sal_True;
		}
		aLevelFT.Show(bLevelEnable);
		aLevelED.Show(bLevelEnable);
		aMainEntryCB.Show(nPos == POS_INDEX);

		aKeyFT.Enable(bKeyEnable);
		aKeyDCB.Enable(bKeyEnable);
		if ( bSetKey2 )
		{
			aKey2DCB.Enable(bKey2Enable);
			aKey2FT.Enable(bKey2Enable);
		}
		aPhoneticFT0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
		aPhoneticED0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
		aPhoneticFT1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
		aPhoneticED1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
		aPhoneticFT2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);
		aPhoneticED2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);
	}
	else //aEntryED  !!aEntryED is not a ListBox but a Edit
	{
		sal_Bool bHasText = (aEntryED.GetText().Len()>0);
		if(!bHasText)
		{
			aPhoneticED0.SetText(aEmptyStr);
			bPhoneticED0_ChangedByUser = sal_False;
		}
		else if(!bPhoneticED0_ChangedByUser)
			aPhoneticED0.SetText(GetDefaultPhoneticReading(aEntryED.GetText()));

		aPhoneticFT0.Enable(bHasText&&bIsPhoneticReadingEnabled);
		aPhoneticED0.Enable(bHasText&&bIsPhoneticReadingEnabled);
	}
    aOKBT.Enable(!pSh->HasReadonlySel() &&
        (aEntryED.GetText().Len() || pSh->GetCrsrCnt(sal_False)));
	return 0;
}

/*--------------------------------------------------------------------
	 Beschreibung:
 --------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwIndexMarkDlg, NextHdl, Button *, EMPTYARG )
{
	InsertUpdate();
	pTOXMgr->NextTOXMark();
	UpdateDialog();
	return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, NextHdl, Button *, EMPTYARG )


IMPL_LINK_INLINE_START( SwIndexMarkDlg, NextSameHdl, Button *, EMPTYARG )
{
	InsertUpdate();
	pTOXMgr->NextTOXMark(sal_True);
	UpdateDialog();
	return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, NextSameHdl, Button *, EMPTYARG )


IMPL_LINK_INLINE_START( SwIndexMarkDlg, PrevHdl, Button *, EMPTYARG )
{
	InsertUpdate();
	pTOXMgr->PrevTOXMark();
	UpdateDialog();
	return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, PrevHdl, Button *, EMPTYARG )


IMPL_LINK_INLINE_START( SwIndexMarkDlg, PrevSameHdl, Button *, EMPTYARG )
{
	InsertUpdate();
	pTOXMgr->PrevTOXMark(sal_True);
	UpdateDialog();

	return 0;
}
IMPL_LINK_INLINE_END( SwIndexMarkDlg, PrevSameHdl, Button *, EMPTYARG )


IMPL_LINK( SwIndexMarkDlg, DelHdl, Button *, EMPTYARG )
{
	bDel = sal_True;
	InsertUpdate();
	bDel = sal_False;

	if(pTOXMgr->GetCurTOXMark())
		UpdateDialog();
	else
	{
		CloseHdl(&aCancelBT);
		SfxViewFrame::Current()->GetBindings().Invalidate(FN_EDIT_IDX_ENTRY_DLG);
	}
	return 0;
}

/*--------------------------------------------------------------------
	 Beschreibung: Dialoganzeige erneuern
 --------------------------------------------------------------------*/


void SwIndexMarkDlg::UpdateDialog()
{
	DBG_ASSERT(pSh && pTOXMgr, "Shell nicht da?");
	SwTOXMark* pMark = pTOXMgr->GetCurTOXMark();
	ASSERT(pMark, "Keine aktuelle Markierung");
	if(!pMark)
		return;

	ViewShell::SetCareWin( GetParent() );

	aOrgStr = pMark->GetText();
	aEntryED.SetText(aOrgStr);

	// Verzeichnistyp setzen
	sal_Bool bLevelEnable = sal_True,
		 bKeyEnable   = sal_False,
		 bKey2Enable  = sal_False,
		 bEntryHasText	= sal_False,
		 bKey1HasText	= sal_False,
		 bKey2HasText	= sal_False;

	TOXTypes eCurType = pMark->GetTOXType()->GetType();
	if(TOX_INDEX == eCurType)
	{
		bLevelEnable = sal_False;
		bKeyEnable = sal_True;
		bKey1HasText = bKey2Enable = 0 != pMark->GetPrimaryKey().Len();
		bKey2HasText = 0 != pMark->GetSecondaryKey().Len();
		bEntryHasText = 0 != pMark->GetText().Len();
		aKeyDCB.SetText( pMark->GetPrimaryKey() );
		aKey2DCB.SetText( pMark->GetSecondaryKey() );
		aPhoneticED0.SetText( pMark->GetTextReading() );
		aPhoneticED1.SetText( pMark->GetPrimaryKeyReading() );
		aPhoneticED2.SetText( pMark->GetSecondaryKeyReading() );
		aMainEntryCB.Check(pMark->IsMainEntry());
	}
	else if(TOX_CONTENT == eCurType || TOX_USER == eCurType)
	{
		aLevelED.SetValue(aLevelED.Normalize(pMark->GetLevel()));
	}
	aKeyFT.Enable(bKeyEnable);
	aKeyDCB.Enable(bKeyEnable);
	aLevelED.SetMax(MAXLEVEL);
	aLevelFT.Show(bLevelEnable);
	aLevelED.Show(bLevelEnable);
	aMainEntryCB.Show(!bLevelEnable);
	aKey2FT.Enable(bKey2Enable);
	aKey2DCB.Enable(bKey2Enable);

	UpdateLanguageDependenciesForPhoneticReading();
	aPhoneticFT0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
	aPhoneticED0.Enable(bKeyEnable&&bEntryHasText&&bIsPhoneticReadingEnabled);
	aPhoneticFT1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
	aPhoneticED1.Enable(bKeyEnable&&bKey1HasText&&bIsPhoneticReadingEnabled);
	aPhoneticFT2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);
	aPhoneticED2.Enable(bKeyEnable&&bKey2HasText&&bIsPhoneticReadingEnabled);

	// Verzeichnis-Typ setzen
	aTypeDCB.SelectEntry(pMark->GetTOXType()->GetTypeName());

	// Next - Prev - Buttons setzen
	pSh->SttCrsrMove();
	if( aPrevBT.IsVisible() )
	{
		const SwTOXMark* pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_PRV );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_NXT );
		aPrevBT.Enable( pMoveMark != pMark );
		pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_NXT );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_PRV );
		aNextBT.Enable( pMoveMark != pMark );
	}

	if( aPrevSameBT.IsVisible() )
	{
		const SwTOXMark* pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_PRV );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_SAME_NXT );
		aPrevSameBT.Enable( pMoveMark != pMark );
		pMoveMark = &pSh->GotoTOXMark( *pMark, TOX_SAME_NXT );
		if( pMoveMark != pMark )
			pSh->GotoTOXMark( *pMoveMark, TOX_SAME_PRV );
		aNextSameBT.Enable( pMoveMark != pMark );
	}

	sal_Bool bEnable = !pSh->HasReadonlySel();
	aOKBT.Enable( bEnable );
	aDelBT.Enable( bEnable );
	aEntryED.SetReadOnly( !bEnable );
	aLevelED.SetReadOnly( !bEnable );
	aKeyDCB.SetReadOnly( !bEnable );
	aKey2DCB.SetReadOnly( !bEnable );

	pSh->SelectTxtAttr( RES_TXTATR_TOXMARK, pMark->GetTxtTOXMark() );
	// we need the point at the start of the attribut
	pSh->SwapPam();

	pSh->EndCrsrMove();
}

/*--------------------------------------------------------------------
	 Remind whether the edit boxes for Phonetic reading are changed manually
 --------------------------------------------------------------------*/

IMPL_LINK( SwIndexMarkDlg, PhoneticEDModifyHdl, Edit *, pEdit )
{
	if(&aPhoneticED0 == pEdit)
	{
		bPhoneticED0_ChangedByUser = pEdit->GetText().Len()>0;
	}
	else if(&aPhoneticED1 == pEdit)
	{
		bPhoneticED1_ChangedByUser = pEdit->GetText().Len()>0;
	}
	else if(&aPhoneticED2 == pEdit)
	{
		bPhoneticED2_ChangedByUser = pEdit->GetText().Len()>0;
	}
	return 0;
}

/*--------------------------------------------------------------------
	 Beschreibung: Enable Disable des 2. Schluessels
 --------------------------------------------------------------------*/

IMPL_LINK( SwIndexMarkDlg, KeyDCBModifyHdl, ComboBox *, pBox )
{
	if(&aKeyDCB == pBox)
	{
		sal_Bool bEnable = pBox->GetText().Len() > 0;
		if(!bEnable)
		{
			aKey2DCB.SetText(aEmptyStr);
			aPhoneticED1.SetText(aEmptyStr);
			aPhoneticED2.SetText(aEmptyStr);
			bPhoneticED1_ChangedByUser = sal_False;
			bPhoneticED2_ChangedByUser = sal_False;
		}
		else
		{
			if(pBox->IsInDropDown())
			{
				//reset bPhoneticED1_ChangedByUser if a completly new string is selected
				bPhoneticED1_ChangedByUser = sal_False;
			}
			if(!bPhoneticED1_ChangedByUser)
				aPhoneticED1.SetText(GetDefaultPhoneticReading(pBox->GetText()));
		}
		aKey2DCB.Enable(bEnable);
		aKey2FT.Enable(bEnable);
	}
	else if(&aKey2DCB == pBox)
	{
		if(!(pBox->GetText().Len()>0))
		{
			aPhoneticED2.SetText(aEmptyStr);
			bPhoneticED2_ChangedByUser = sal_False;
		}
		else
		{
			if(pBox->IsInDropDown())
			{
				//reset bPhoneticED1_ChangedByUser if a completly new string is selected
				bPhoneticED2_ChangedByUser = sal_False;
			}
			if(!bPhoneticED2_ChangedByUser)
				aPhoneticED2.SetText(GetDefaultPhoneticReading(pBox->GetText()));
		}
	}
	sal_Bool	bKey1HasText	= (0 != aKeyDCB.GetText().Len());
	sal_Bool	bKey2HasText	= (0 != aKey2DCB.GetText().Len());

	aPhoneticFT1.Enable(bKey1HasText&&bIsPhoneticReadingEnabled);
	aPhoneticED1.Enable(bKey1HasText&bIsPhoneticReadingEnabled);
	aPhoneticFT2.Enable(bKey2HasText&bIsPhoneticReadingEnabled);
	aPhoneticED2.Enable(bKey2HasText&bIsPhoneticReadingEnabled);

	return 0;
}

/*-----------------25.02.94 21:19-------------------
 dtor ueberladen
--------------------------------------------------*/


SwIndexMarkDlg::~SwIndexMarkDlg()
{
	delete pTOXMgr;
	ViewShell::SetCareWin( 0 );
}
/* -----------------07.09.99 08:41-------------------

 --------------------------------------------------*/
void    SwIndexMarkDlg::ReInitDlg(SwWrtShell& rWrtShell, SwTOXMark* pCurTOXMark)
{
	pSh = &rWrtShell;
	delete pTOXMgr;
	pTOXMgr = new SwTOXMgr(pSh);
    if(pCurTOXMark)
    {
        for(sal_uInt16 i = 0; i < pTOXMgr->GetTOXMarkCount(); i++)
            if(pTOXMgr->GetTOXMark(i) == pCurTOXMark)
            {
                pTOXMgr->SetCurTOXMark(i);
                break;
            }
    }
    InitControls();
}
/* -----------------06.10.99 10:00-------------------

 --------------------------------------------------*/
SwIndexMarkFloatDlg::SwIndexMarkFloatDlg(SfxBindings* _pBindings,
				   				SfxChildWindow* pChild,
				   				Window *pParent,
								SfxChildWinInfo* pInfo,
				   				sal_Bool bNew) :
SfxModelessDialog(_pBindings, pChild, pParent, SvtCJKOptions().IsCJKFontEnabled()?SW_RES(DLG_INSIDXMARK_CJK):SW_RES(DLG_INSIDXMARK)),
    aDlg(this, bNew, SW_RES(WIN_DLG), SvtCJKOptions().IsCJKFontEnabled()?DLG_INSIDXMARK_CJK:DLG_INSIDXMARK, *::GetActiveWrtShell())
{
	FreeResource();
    aDlg.ReInitDlg(*::GetActiveWrtShell());
	Initialize(pInfo);
}
/* -----------------06.10.99 10:27-------------------

 --------------------------------------------------*/
void	SwIndexMarkFloatDlg::Activate()
{
	SfxModelessDialog::Activate();
	aDlg.Activate();
}

void SwIndexMarkFloatDlg::ReInitDlg(SwWrtShell& rWrtShell)
{
	aDlg.ReInitDlg( rWrtShell );
}

/* -----------------06.10.99 10:35-------------------

 --------------------------------------------------*/
SwIndexMarkModalDlg::SwIndexMarkModalDlg(Window *pParent, SwWrtShell& rSh, SwTOXMark* pCurTOXMark) :
SvxStandardDialog(pParent, SvtCJKOptions().IsCJKFontEnabled()?SW_RES(DLG_EDIT_IDXMARK_CJK):SW_RES(DLG_EDIT_IDXMARK)),
    aDlg(this, sal_False, SW_RES(WIN_DLG), SvtCJKOptions().IsCJKFontEnabled()?DLG_EDIT_IDXMARK_CJK:DLG_EDIT_IDXMARK, rSh)
{
	FreeResource();
    aDlg.ReInitDlg(rSh, pCurTOXMark);
}
/* -----------------06.10.99 10:46-------------------

 --------------------------------------------------*/
void	SwIndexMarkModalDlg::Apply()
{
	aDlg.Apply();
}
/* -----------------16.09.99 14:19-------------------

 --------------------------------------------------*/
class SwCreateAuthEntryDlg_Impl : public ModalDialog
{
    FixedLine       aEntriesFL;

	FixedText*		pFixedTexts[AUTH_FIELD_END];
	ListBox*		pTypeListBox;
	ComboBox*		pIdentifierBox;
	Edit*			pEdits[AUTH_FIELD_END];

    OKButton        aOKBT;
	CancelButton 	aCancelBT;
	HelpButton 		aHelpBT;

	Link			aShortNameCheckLink;

	SwWrtShell& 	rWrtSh;

	sal_Bool			m_bNewEntryMode;
	sal_Bool			m_bNameAllowed;

	DECL_LINK(IdentifierHdl, ComboBox*);
	DECL_LINK(ShortNameHdl, Edit*);
	DECL_LINK(EnableHdl, ListBox* pBox);

public:
	SwCreateAuthEntryDlg_Impl(Window* pParent,
							const String pFields[],
							SwWrtShell& rSh,
							sal_Bool bNewEntry,
							sal_Bool bCreate);
	~SwCreateAuthEntryDlg_Impl();

	String			GetEntryText(ToxAuthorityField eField) const;

	void			SetCheckNameHdl(const Link& rLink) {aShortNameCheckLink = rLink;}

};
/*-- 15.09.99 08:43:24---------------------------------------------------

  -----------------------------------------------------------------------*/
struct TextInfo
{
	sal_uInt16 nToxField;
	const char* pHelpId;
};

static const TextInfo aTextInfoArr[] =
{
	{AUTH_FIELD_IDENTIFIER,      HID_AUTH_FIELD_IDENTIFIER      },
	{AUTH_FIELD_AUTHORITY_TYPE,  HID_AUTH_FIELD_AUTHORITY_TYPE  },
	{AUTH_FIELD_AUTHOR,          HID_AUTH_FIELD_AUTHOR          },
	{AUTH_FIELD_TITLE,           HID_AUTH_FIELD_TITLE           },
	{AUTH_FIELD_YEAR,            HID_AUTH_FIELD_YEAR            },
	{AUTH_FIELD_PUBLISHER,       HID_AUTH_FIELD_PUBLISHER       },
	{AUTH_FIELD_ADDRESS,         HID_AUTH_FIELD_ADDRESS         },
	{AUTH_FIELD_ISBN,            HID_AUTH_FIELD_ISBN            },
	{AUTH_FIELD_CHAPTER,         HID_AUTH_FIELD_CHAPTER         },
	{AUTH_FIELD_PAGES,           HID_AUTH_FIELD_PAGES           },
	{AUTH_FIELD_EDITOR,          HID_AUTH_FIELD_EDITOR          },
	{AUTH_FIELD_EDITION,         HID_AUTH_FIELD_EDITION         },
	{AUTH_FIELD_BOOKTITLE,       HID_AUTH_FIELD_BOOKTITLE       },
	{AUTH_FIELD_VOLUME,          HID_AUTH_FIELD_VOLUME          },
	{AUTH_FIELD_HOWPUBLISHED,    HID_AUTH_FIELD_HOWPUBLISHED    },
	{AUTH_FIELD_ORGANIZATIONS,   HID_AUTH_FIELD_ORGANIZATIONS   },
	{AUTH_FIELD_INSTITUTION,     HID_AUTH_FIELD_INSTITUTION     },
	{AUTH_FIELD_SCHOOL,          HID_AUTH_FIELD_SCHOOL          },
	{AUTH_FIELD_REPORT_TYPE,     HID_AUTH_FIELD_REPORT_TYPE     },
	{AUTH_FIELD_MONTH,           HID_AUTH_FIELD_MONTH           },
	{AUTH_FIELD_JOURNAL,         HID_AUTH_FIELD_JOURNAL         },
	{AUTH_FIELD_NUMBER,          HID_AUTH_FIELD_NUMBER          },
	{AUTH_FIELD_SERIES,          HID_AUTH_FIELD_SERIES          },
	{AUTH_FIELD_ANNOTE,          HID_AUTH_FIELD_ANNOTE          },
	{AUTH_FIELD_NOTE,            HID_AUTH_FIELD_NOTE            },
	{AUTH_FIELD_URL,             HID_AUTH_FIELD_URL             },
	{AUTH_FIELD_CUSTOM1,         HID_AUTH_FIELD_CUSTOM1         },
	{AUTH_FIELD_CUSTOM2,         HID_AUTH_FIELD_CUSTOM2         },
	{AUTH_FIELD_CUSTOM3,         HID_AUTH_FIELD_CUSTOM3         },
	{AUTH_FIELD_CUSTOM4,         HID_AUTH_FIELD_CUSTOM4         },
	{AUTH_FIELD_CUSTOM5,         HID_AUTH_FIELD_CUSTOM5         }
};

sal_Bool SwAuthMarkDlg::bIsFromComponent = sal_True;

SwAuthMarkDlg::SwAuthMarkDlg(  Window *pParent,
							   const ResId& rResId,
							   sal_Bool bNewDlg) :
	Window(pParent, rResId),
    aFromComponentRB(   this, ResId(RB_FROMCOMPONENT, *rResId.GetResMgr()   )),
    aFromDocContentRB(  this, ResId(RB_FROMDOCCONTENT, *rResId.GetResMgr()  )),

    aAuthorFT(  this, ResId(FT_AUTHOR, *rResId.GetResMgr()       )),
    aAuthorFI(  this, ResId(FI_AUTHOR, *rResId.GetResMgr()   )),
    aTitleFT(   this, ResId(FT_TITLE, *rResId.GetResMgr()    )),
    aTitleFI(   this, ResId(FI_TITLE, *rResId.GetResMgr()    )),
    aEntryFT(   this, ResId(FT_ENTRY, *rResId.GetResMgr()    )),
    aEntryED(   this, ResId(ED_ENTRY, *rResId.GetResMgr()   )),
    aEntryLB(   this, ResId(LB_ENTRY, *rResId.GetResMgr()   )),

    aEntryFL(   this, ResId(FL_ENTRY, *rResId.GetResMgr()    )),

    aOKBT(      this, ResId(PB_OK, *rResId.GetResMgr()       )),
    aCancelBT(  this, ResId(PB_CANCEL, *rResId.GetResMgr()  )),
    aHelpBT(    this, ResId(PB_HELP, *rResId.GetResMgr()    )),
    aCreateEntryPB(this,ResId(PB_CREATEENTRY, *rResId.GetResMgr())),
    aEditEntryPB(this,  ResId(PB_EDITENTRY, *rResId.GetResMgr())),

    sChangeST(  ResId(ST_CHANGE, *rResId.GetResMgr())),
    bNewEntry(bNewDlg),
    bBibAccessInitialized(sal_False),

    pSh(0)
{
	SetStyle(GetStyle()|WB_DIALOGCONTROL);
	FreeResource();

	aFromComponentRB.SetHelpId(HID_AUTH_MARK_DLG_FROM_COMP_RB);
	aFromDocContentRB.SetHelpId(HID_AUTH_MARK_DLG_FROM_DOC_RB );
	aEntryED.SetHelpId(HID_AUTH_MARK_DLG_ID_LISTBOX           );
	aEntryLB.SetHelpId(HID_AUTH_MARK_DLG_ID_LISTBOX           );

	aFromComponentRB.Show(bNewEntry);
	aFromDocContentRB.Show(bNewEntry);
	aFromComponentRB.Check(bIsFromComponent);
	aFromDocContentRB.Check(!bIsFromComponent);

	aOKBT		.SetHelpId(HID_INSERT_AUTH_MRK_OK   );
	aCancelBT	.SetHelpId(HID_INSERT_AUTH_MRK_CLOSE);
	aEntryED		.SetHelpId(HID_INSERT_AUTH_MRK_ENTRY		);
	aCreateEntryPB  .SetHelpId(HID_INSERT_AUTH_MRK_CREATE_ENTRY	);
	aEditEntryPB    .SetHelpId(HID_INSERT_AUTH_MRK_EDIT_ENTRY	);

	aOKBT.SetClickHdl(LINK(this,SwAuthMarkDlg, InsertHdl));
	aCancelBT.SetClickHdl(LINK(this,SwAuthMarkDlg, CloseHdl));
	aCreateEntryPB.SetClickHdl(LINK(this,SwAuthMarkDlg, CreateEntryHdl));
	aEditEntryPB.SetClickHdl(LINK(this,SwAuthMarkDlg, CreateEntryHdl));
	aFromComponentRB.SetClickHdl(LINK(this,SwAuthMarkDlg, ChangeSourceHdl));
	aFromDocContentRB.SetClickHdl(LINK(this,SwAuthMarkDlg, ChangeSourceHdl));
    aEntryED.SetModifyHdl(LINK(this,SwAuthMarkDlg, EditModifyHdl));

	GetParent()->SetText(String(SW_RES(
					bNewEntry ? STR_AUTHMRK_INSERT : STR_AUTHMRK_EDIT)));
	aEntryED.Show(!bNewEntry);
	aEntryLB.Show(bNewEntry);
	if(!bNewEntry)
	{
		aOKBT.SetText(sChangeST);
	}
	else
	{
		aEntryLB.SetSelectHdl(LINK(this, SwAuthMarkDlg, CompEntryHdl));
	}
}
/*-- 15.09.99 08:43:25---------------------------------------------------

  -----------------------------------------------------------------------*/
SwAuthMarkDlg::~SwAuthMarkDlg()
{
}
/*-- 15.09.99 08:43:25---------------------------------------------------

  -----------------------------------------------------------------------*/
void	SwAuthMarkDlg::ReInitDlg(SwWrtShell& rWrtShell)
{
	pSh = &rWrtShell;
	InitControls();
}
/* -----------------15.09.99 08:57-------------------

 --------------------------------------------------*/
IMPL_LINK( SwAuthMarkDlg, CloseHdl, PushButton *, EMPTYARG )
{
	if(bNewEntry)
	{
		sal_uInt16 nSlot = FN_INSERT_AUTH_ENTRY_DLG;
		SfxViewFrame::Current()->GetDispatcher()->Execute(nSlot,
					SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
	}
	else
	{
		((SwAuthMarkModalDlg*)GetParent())->EndDialog(RET_CANCEL);
	}
	return 0;
}
/* -----------------06.12.99 13:54-------------------

 --------------------------------------------------*/
static String lcl_FindColumnEntry(const beans::PropertyValue* pFields, sal_Int32 nLen, const String& rColumnTitle)
{
	String sRet;
	OUString uColumnTitle = rColumnTitle;
    for(sal_uInt16 i = 0; i < nLen; i++)
	{
        OUString uTmp;
        if(pFields[i].Name == uColumnTitle &&
            (pFields[i].Value >>= uTmp))
		{
			sRet = String(uTmp);
			break;
		}
	}
	return sRet;
}
/* -----------------------------07.12.99 15:39--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK( SwAuthMarkDlg, CompEntryHdl, ListBox*, pBox)
{
	String sEntry(pBox->GetSelectEntry());
	if(bIsFromComponent)
	{
		if(xBibAccess.is() && sEntry.Len())
		{
			OUString uEntry(sEntry);
			if(xBibAccess->hasByName(uEntry))
			{
				uno::Any aEntry(xBibAccess->getByName(uEntry));
                uno::Sequence<beans::PropertyValue> aFieldProps;
                if(aEntry >>= aFieldProps)
				{
					const beans::PropertyValue* pProps = aFieldProps.getConstArray();
                    for(sal_uInt16 i = 0; i < AUTH_FIELD_END && i < aFieldProps.getLength(); i++)
					{
						m_sFields[i] = lcl_FindColumnEntry(
								pProps, aFieldProps.getLength(), m_sColumnTitles[i]);
					}
				}
			}
		}
	}
	else
	{
		if(sEntry.Len())
		{
			const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
										pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
			const SwAuthEntry* 	pEntry = pFType ? pFType->GetEntryByIdentifier(sEntry) : 0;
			for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
				m_sFields[i] = pEntry ?
							pEntry->GetAuthorField((ToxAuthorityField)i) : aEmptyStr;
		}
	}
	if(!pBox->GetSelectEntry().Len())
	{
		for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
			m_sFields[i] = aEmptyStr;
	}
	aAuthorFI.SetText(m_sFields[AUTH_FIELD_AUTHOR]);
	aTitleFI.SetText(m_sFields[AUTH_FIELD_TITLE]);
	return 0;
}

/* -----------------15.09.99 08:57-------------------

 --------------------------------------------------*/
IMPL_LINK( SwAuthMarkDlg, InsertHdl, PushButton *, EMPTYARG )
{
	//insert or update the SwAuthorityField...
	if(pSh)
	{
		sal_Bool bDifferent = sal_False;
		DBG_ASSERT(m_sFields[AUTH_FIELD_IDENTIFIER].Len() , "No Id is set!");
		DBG_ASSERT(m_sFields[AUTH_FIELD_AUTHORITY_TYPE].Len() , "No authority type is set!");
		//check if the entry already exists with different content
		const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
										pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
		const SwAuthEntry* 	pEntry = pFType ?
				pFType->GetEntryByIdentifier( m_sFields[AUTH_FIELD_IDENTIFIER])
				: 0;
		if(pEntry)
		{
			for(sal_uInt16 i = 0; i < AUTH_FIELD_END && !bDifferent; i++)
				bDifferent |= m_sFields[i] != pEntry->GetAuthorField((ToxAuthorityField)i);
			if(bDifferent)
			{
				QueryBox aQuery(this, SW_RES(DLG_CHANGE_AUTH_ENTRY));
				if(RET_YES != aQuery.Execute())
					return 0;
			}
		}

		SwFldMgr aMgr(pSh);
		String sFields;
		for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
		{
			sFields += m_sFields[i];
			sFields += TOX_STYLE_DELIMITER;
		}
		if(bNewEntry)
		{
			if(bDifferent)
			{
				SwAuthEntry aNewData;
				for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
					aNewData.SetAuthorField((ToxAuthorityField)i, m_sFields[i]);
				pSh->ChangeAuthorityData(&aNewData);
			}
            SwInsertFld_Data aData(TYP_AUTHORITY, 0, sFields, aEmptyStr, 0 );
            aMgr.InsertFld( aData );
		}
		else if(aMgr.GetCurFld())
		{
			aMgr.UpdateCurFld(0, sFields, aEmptyStr);
		}
	}
	if(!bNewEntry)
		CloseHdl(0);
	return 0;
}
/* -----------------17.09.99 13:06-------------------

 --------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg, CreateEntryHdl, PushButton*, pButton)
{
	sal_Bool bCreate = pButton == &aCreateEntryPB;
	String sOldId = m_sCreatedEntry[0];
	for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
		m_sCreatedEntry[i] = bCreate ? aEmptyStr : m_sFields[i];
	SwCreateAuthEntryDlg_Impl aDlg(pButton,
				bCreate ? m_sCreatedEntry : m_sFields,
				*pSh, bNewEntry, bCreate);
	if(bNewEntry)
	{
		aDlg.SetCheckNameHdl(LINK(this, SwAuthMarkDlg, IsEntryAllowedHdl));
	}
	if(RET_OK == aDlg.Execute())
	{
		if(bCreate && sOldId.Len())
		{
			aEntryLB.RemoveEntry(sOldId);
		}
		for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
		{
			m_sFields[i] = aDlg.GetEntryText((ToxAuthorityField)i);
			m_sCreatedEntry[i] = m_sFields[i];
		}
		if(bNewEntry && !aFromDocContentRB.IsChecked())
		{
			aFromDocContentRB.Check(sal_True);
			ChangeSourceHdl(&aFromDocContentRB);
		}
		if(bCreate)
		{
			DBG_ASSERT(LISTBOX_ENTRY_NOTFOUND ==
						aEntryLB.GetEntryPos(m_sFields[AUTH_FIELD_IDENTIFIER]),
						"entry exists!");
			aEntryLB.InsertEntry(m_sFields[AUTH_FIELD_IDENTIFIER]);
			aEntryLB.SelectEntry(m_sFields[AUTH_FIELD_IDENTIFIER]);
		}
		aEntryED.SetText(m_sFields[AUTH_FIELD_IDENTIFIER]);
		aAuthorFI.SetText(m_sFields[AUTH_FIELD_AUTHOR]);
		aTitleFI.SetText(m_sFields[AUTH_FIELD_TITLE]);
        aOKBT.Enable();
	}
	return 0;
}
/* -----------------------------20.12.99 14:26--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg, ChangeSourceHdl, RadioButton*, pButton)
{
	sal_Bool bFromComp = (pButton == &aFromComponentRB);
	bIsFromComponent = bFromComp;
	aCreateEntryPB.Enable(!bIsFromComponent);
	aEntryLB.Clear();
	if(bIsFromComponent)
	{
		if(!bBibAccessInitialized)
		{
 			uno::Reference< lang::XMultiServiceFactory > xMSF = getProcessServiceFactory();
			xBibAccess = uno::Reference< container::XNameAccess > (
							xMSF->createInstance( C2U("com.sun.star.frame.Bibliography") ),
																		uno::UNO_QUERY );
			uno::Reference< beans::XPropertySet >  xPropSet(xBibAccess, uno::UNO_QUERY);
			OUString uPropName(C2U("BibliographyDataFieldNames"));
			if(xPropSet.is() && xPropSet->getPropertySetInfo()->hasPropertyByName(uPropName))
			{
				uno::Any aNames = xPropSet->getPropertyValue(uPropName);
                uno::Sequence<beans::PropertyValue> aSeq;
                if( aNames >>= aSeq)
				{
                    const beans::PropertyValue* pArr = aSeq.getConstArray();
					for(sal_uInt16 i = 0; i < aSeq.getLength(); i++)
					{
						String sTitle = pArr[i].Name;
						sal_Int16 nField = 0;
						pArr[i].Value >>= nField;
						if(nField >= 0 && nField < AUTH_FIELD_END)
							m_sColumnTitles[nField] = sTitle;
					}
				}
			}
			bBibAccessInitialized = sal_True;
		}
		if(xBibAccess.is())
		{
			uno::Sequence<OUString> aIdentifiers = xBibAccess->getElementNames();
			const OUString* pNames = aIdentifiers.getConstArray();
			for(sal_uInt16 i = 0; i < aIdentifiers.getLength(); i++)
			{
				aEntryLB.InsertEntry(pNames[i]);
			}
		}
	}
	else
	{
		const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
									pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
		if(pFType)
		{
			SvStringsDtor aIds;
			pFType->GetAllEntryIdentifiers(	aIds );
			for(sal_uInt16 n = 0; n < aIds.Count(); n++)
				aEntryLB.InsertEntry(*aIds.GetObject(n));
		}
		if(m_sCreatedEntry[AUTH_FIELD_IDENTIFIER].Len())
			aEntryLB.InsertEntry(m_sCreatedEntry[AUTH_FIELD_IDENTIFIER]);
	}
	aEntryLB.SelectEntryPos(0);
	CompEntryHdl(&aEntryLB);
	return 0;
}
/* -----------------15.10.2002 13:16-----------------
 *
 * --------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg, EditModifyHdl, Edit*, pEdit)
{
    Link aAllowed = LINK(this, SwAuthMarkDlg, IsEntryAllowedHdl);
    long nResult = aAllowed.Call(pEdit);
    aOKBT.Enable(nResult > 0);
    if(nResult)
    {
        String sEntry(pEdit->GetText());
        m_sFields[AUTH_FIELD_IDENTIFIER] = sEntry;
        m_sCreatedEntry[AUTH_FIELD_IDENTIFIER] = sEntry;
    }
    return 0;
};
/* -----------------------------20.12.99 15:11--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwAuthMarkDlg, IsEntryAllowedHdl, Edit*, pEdit)
{
	String sEntry = pEdit->GetText();
	sal_Bool bAllowed = sal_False;
	if(sEntry.Len())
	{
		if(aEntryLB.GetEntryPos(sEntry) != LISTBOX_ENTRY_NOTFOUND)
			return 0;
		else if(bIsFromComponent)
		{
			const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
										pSh->GetFldType(RES_AUTHORITY, aEmptyStr);
			bAllowed = !pFType || !pFType->GetEntryByIdentifier(sEntry);
		}
		else
		{
			bAllowed = !xBibAccess.is() || !xBibAccess->hasByName(sEntry);
		}
	}
	return bAllowed;
}
/* -----------------21.09.99 14:19-------------------

 --------------------------------------------------*/
void SwAuthMarkDlg::InitControls()
{
	DBG_ASSERT(pSh, "Shell nicht da?");
	SwField* pField = pSh->GetCurFld();
	ASSERT(bNewEntry || pField, "Keine aktuelle Markierung");
	if(bNewEntry)
	{
		ChangeSourceHdl(aFromComponentRB.IsChecked() ? &aFromComponentRB : &aFromDocContentRB);
		aCreateEntryPB.Enable(!aFromComponentRB.IsChecked());
		if(!aFromComponentRB.IsChecked() && m_sCreatedEntry[0].Len())
			for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
				m_sFields[i] = m_sCreatedEntry[i];
	}
	if(bNewEntry || !pField || pField->GetTyp()->Which() != RES_AUTHORITY)
		return;

	const SwAuthEntry* pEntry = ((SwAuthorityFieldType*)pField->GetTyp())->
            GetEntryByHandle(((SwAuthorityField*)pField)->GetHandle());

	DBG_ASSERT(pEntry, "No authority entry found");
	if(!pEntry)
		return;
	for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
		m_sFields[i] = pEntry->GetAuthorField((ToxAuthorityField)i);

	aEntryED.SetText(pEntry->GetAuthorField(AUTH_FIELD_IDENTIFIER));
	aAuthorFI.SetText(pEntry->GetAuthorField(AUTH_FIELD_AUTHOR));
	aTitleFI.SetText(pEntry->GetAuthorField(AUTH_FIELD_TITLE));
}
/* -----------------------------05.09.2002 09:44------------------------------

 ---------------------------------------------------------------------------*/
void    SwAuthMarkDlg::Activate()
{
    aOKBT.Enable(!pSh->HasReadonlySel());
    Window::Activate();
}
/* -----------------16.09.99 14:27-------------------

 --------------------------------------------------*/
SwCreateAuthEntryDlg_Impl::SwCreateAuthEntryDlg_Impl(Window* pParent,
		const String pFields[],
		SwWrtShell& rSh,
		sal_Bool bNewEntry,
		sal_Bool bCreate) :
	ModalDialog(pParent, SW_RES(DLG_CREATE_AUTH_ENTRY)),
    aEntriesFL(this,    SW_RES(FL_ENTRIES    )),
    pTypeListBox(0),
    pIdentifierBox(0),
    aOKBT(this,         SW_RES(PB_OK         )),
    aCancelBT(this,     SW_RES(PB_CANCEL        )),
    aHelpBT(this,       SW_RES(PB_HELP      )),
    rWrtSh(rSh),
	m_bNewEntryMode(bNewEntry),
	m_bNameAllowed(sal_True)
{
	FreeResource();
    Point aFLPos(aEntriesFL.GetPosPixel());
    Point aTL1(aFLPos);
    Size aFLSz(aEntriesFL.GetSizePixel().Width(), GetSizePixel().Height());
    long nControlSpace = aFLSz.Width() / 4;
	long nControlWidth = nControlSpace - 2 * aTL1.X();
	aTL1.X() *= 2;
	aTL1.Y() *= 5;
	Point aTR1(aTL1);
	aTR1.X() += nControlSpace;
	Point aTL2(aTR1);
	aTL2.X() += nControlSpace;
	Point aTR2(aTL2);
	aTR2.X() += nControlSpace;
    Size aFixedTextSize(aFLSz);
	Size aTmpSz(8,10);
	aTmpSz = LogicToPixel(aTmpSz, MAP_APPFONT);
	aFixedTextSize.Height() = aTmpSz.Width();
	Size aEditSize(aFixedTextSize);
    aFixedTextSize.Width() = nControlWidth + aFLPos.X();
	aEditSize.Height() = aTmpSz.Height();
	aEditSize.Width() = nControlWidth;

    sal_uInt16 nOffset = static_cast< sal_uInt16 >(aTmpSz.Width() * 3 / 2);
	sal_Bool bLeft = sal_True;
    Window* pRefWindow = 0;
    for(sal_uInt16 nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++)
	{
		const TextInfo aCurInfo = aTextInfoArr[nIndex];

		pFixedTexts[nIndex] = new FixedText(this);
        if(nIndex)
            pFixedTexts[nIndex]->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
        else
            pFixedTexts[nIndex]->SetZOrder( 0, WINDOW_ZORDER_FIRST );

        pRefWindow = pFixedTexts[nIndex];

		pFixedTexts[nIndex]->SetSizePixel(aFixedTextSize);
		pFixedTexts[nIndex]->SetPosPixel(bLeft ? aTL1 : aTL2);
		pFixedTexts[nIndex]->SetText(SW_RES(STR_AUTH_FIELD_START + aCurInfo.nToxField));
		pFixedTexts[nIndex]->Show();
		pEdits[nIndex] = 0;
		if( AUTH_FIELD_AUTHORITY_TYPE == aCurInfo.nToxField )
		{
			pTypeListBox = new ListBox(this, WB_DROPDOWN|WB_BORDER);
            pTypeListBox->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
            pRefWindow = pTypeListBox;
			for(sal_uInt16 j = 0; j < AUTH_TYPE_END; j++)
				pTypeListBox->InsertEntry(String(SW_RES(STR_AUTH_TYPE_START + j)));
			if(pFields[aCurInfo.nToxField].Len())
			{
                sal_uInt16 nIndexPos = static_cast< sal_uInt16 >(pFields[aCurInfo.nToxField].ToInt32());
				pTypeListBox->SelectEntryPos(nIndexPos);
			}
			Size aTmp(aEditSize);
			aTmp.Height() *= 4;
			pTypeListBox->SetSizePixel(aTmp);
			pTypeListBox->SetPosPixel(bLeft ? aTR1 : aTR2);
			pTypeListBox->Show();
			pTypeListBox->SetSelectHdl(LINK(this, SwCreateAuthEntryDlg_Impl, EnableHdl));
			pTypeListBox->SetHelpId(aCurInfo.pHelpId);

		}
		else if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField && !m_bNewEntryMode)
		{
            pIdentifierBox = new ComboBox(this, WB_BORDER|WB_DROPDOWN);
            pIdentifierBox->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
            pRefWindow = pIdentifierBox;

			pIdentifierBox->SetSelectHdl(LINK(this,
									SwCreateAuthEntryDlg_Impl, IdentifierHdl));


			const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
										rSh.GetFldType(RES_AUTHORITY, aEmptyStr);
			if(pFType)
			{
				SvStringsDtor aIds;
				pFType->GetAllEntryIdentifiers(	aIds );
				for(sal_uInt16 n = 0; n < aIds.Count(); n++)
					pIdentifierBox->InsertEntry(*aIds.GetObject(n));
			}
			pIdentifierBox->SetText(pFields[aCurInfo.nToxField]);
			Size aTmp(aEditSize);
			aTmp.Height() *= 4;
			pIdentifierBox->SetSizePixel(aTmp);
			pIdentifierBox->SetPosPixel(bLeft ? aTR1 : aTR2);
			pIdentifierBox->Show();
			pIdentifierBox->SetHelpId(aCurInfo.pHelpId);
		}
		else
		{
			pEdits[nIndex] = new Edit(this, WB_BORDER);
            pEdits[nIndex]->SetZOrder( pRefWindow, WINDOW_ZORDER_BEHIND );
            pRefWindow = pEdits[nIndex];
            pEdits[nIndex]->SetSizePixel(aEditSize);
			pEdits[nIndex]->SetPosPixel(bLeft ? aTR1 : aTR2);
			pEdits[nIndex]->SetText(pFields[aCurInfo.nToxField]);
			pEdits[nIndex]->Show();
			pEdits[nIndex]->SetHelpId(aCurInfo.pHelpId);
			if(AUTH_FIELD_IDENTIFIER == aCurInfo.nToxField)
			{
				pEdits[nIndex]->SetModifyHdl(LINK(this, SwCreateAuthEntryDlg_Impl, ShortNameHdl));
				m_bNameAllowed = pFields[nIndex].Len() > 0;
				if(!bCreate)
				{
					pFixedTexts[nIndex]->Enable(sal_False);
					pEdits[nIndex]->Enable(sal_False);
				}
			}
		}
		if(bLeft)
		{
			aTL1.Y() += nOffset;
			aTR1.Y() += nOffset;
		}
		else
		{
			aTL2.Y() += nOffset;
			aTR2.Y() += nOffset;
		}
		bLeft = !bLeft;
	}
	EnableHdl(pTypeListBox);

    long nHeightDiff = - aFLSz.Height();
    aFLSz.Height() = aTL1.Y();
    nHeightDiff += aFLSz.Height();
//    aEntriesFL.SetSizePixel(aFLSz);
	Size aDlgSize(GetSizePixel());
	aDlgSize.Height() += nHeightDiff;
    SetSizePixel(aDlgSize);

}
/* -----------------16.09.99 14:47-------------------

 --------------------------------------------------*/
SwCreateAuthEntryDlg_Impl::~SwCreateAuthEntryDlg_Impl()
{
	for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
	{
		delete pFixedTexts[i];
		delete pEdits[i];
	}
	delete pTypeListBox;
	delete pIdentifierBox;
}
/* -----------------16.09.99 14:27-------------------

 --------------------------------------------------*/
String	SwCreateAuthEntryDlg_Impl::GetEntryText(ToxAuthorityField eField) const
{
	String sRet;
	if( AUTH_FIELD_AUTHORITY_TYPE == eField )
	{
		DBG_ASSERT(pTypeListBox, "No ListBox");
		sRet = String::CreateFromInt32(pTypeListBox->GetSelectEntryPos());
	}
	else if( AUTH_FIELD_IDENTIFIER == eField && !m_bNewEntryMode)
	{
		DBG_ASSERT(pIdentifierBox, "No ComboBox");
		sRet = pIdentifierBox->GetText();
	}
	else
	{
		for(sal_uInt16 nIndex = 0; nIndex < AUTH_FIELD_END; nIndex++)
		{
			const TextInfo aCurInfo = aTextInfoArr[nIndex];
			if(aCurInfo.nToxField == eField)
			{
				sRet = pEdits[nIndex]->GetText();
				break;
			}
		}
	}
	return sRet;
}
/* -----------------21.09.99 13:54-------------------

 --------------------------------------------------*/
IMPL_LINK(SwCreateAuthEntryDlg_Impl, IdentifierHdl, ComboBox*, pBox)
{
	const SwAuthorityFieldType* pFType = (const SwAuthorityFieldType*)
								rWrtSh.GetFldType(RES_AUTHORITY, aEmptyStr);
	if(pFType)
	{
		const SwAuthEntry* pEntry = pFType->GetEntryByIdentifier(
														pBox->GetText());
		if(pEntry)
		{
			for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
			{
				if(AUTH_FIELD_IDENTIFIER == i)
					continue;
				if(AUTH_FIELD_AUTHORITY_TYPE == i)
					pTypeListBox->SelectEntry(
								pEntry->GetAuthorField((ToxAuthorityField)i));
				else
					pEdits[i]->SetText(
								pEntry->GetAuthorField((ToxAuthorityField)i));
			}
		}
	}
	return 0;
}
/* -----------------------------20.12.99 15:07--------------------------------

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

IMPL_LINK(SwCreateAuthEntryDlg_Impl, ShortNameHdl, Edit*, pEdit)
{
	if(aShortNameCheckLink.IsSet())
	{
		sal_Bool bEnable = 0 != aShortNameCheckLink.Call(pEdit);
		m_bNameAllowed |= bEnable;
		aOKBT.Enable(pTypeListBox->GetSelectEntryCount() && bEnable);
	}
	return 0;
}
/* -----------------------------20.12.99 15:54--------------------------------

 ---------------------------------------------------------------------------*/
IMPL_LINK(SwCreateAuthEntryDlg_Impl, EnableHdl, ListBox*, pBox)
{
	aOKBT.Enable(m_bNameAllowed && pBox->GetSelectEntryCount());
	return 0;
};
/* -----------------06.10.99 10:00-------------------

 --------------------------------------------------*/
SwAuthMarkFloatDlg::SwAuthMarkFloatDlg(SfxBindings* _pBindings,
				   				SfxChildWindow* pChild,
				   				Window *pParent,
								SfxChildWinInfo* pInfo,
				   				sal_Bool bNew) :
    SfxModelessDialog(_pBindings, pChild, pParent, SW_RES(DLG_INSAUTHMARK)),
    aDlg(this, SW_RES(WIN_DLG), bNew)
{
	FreeResource();
	Initialize(pInfo);
	SwWrtShell* pWrtShell = ::GetActiveWrtShell();
	DBG_ASSERT(pWrtShell, "No shell?");
	aDlg.ReInitDlg(*pWrtShell);
}
/* -----------------06.10.99 10:27-------------------

 --------------------------------------------------*/
void	SwAuthMarkFloatDlg::Activate()
{
	SfxModelessDialog::Activate();
	aDlg.Activate();
}

void SwAuthMarkFloatDlg::ReInitDlg(SwWrtShell& rWrtShell)
{
	aDlg.ReInitDlg( rWrtShell );
}

/* -----------------06.10.99 10:35-------------------

 --------------------------------------------------*/
SwAuthMarkModalDlg::SwAuthMarkModalDlg(Window *pParent, SwWrtShell& rSh) :
	SvxStandardDialog(pParent, SW_RES(DLG_EDIT_AUTHMARK)),
	aDlg(this, SW_RES(WIN_DLG), sal_False)
{
	FreeResource();
	aDlg.ReInitDlg(rSh);
}
/* -----------------06.10.99 10:46-------------------

 --------------------------------------------------*/
void	SwAuthMarkModalDlg::Apply()
{
	aDlg.InsertHdl(0);
}