/**************************************************************
 *
 * 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 <hintids.hxx>
#include <tools/shl.hxx>
#ifndef _MENU_HXX //autogen
#include <vcl/menu.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#include <sfx2/tabdlg.hxx>
#include <editeng/brshitem.hxx>
#include <unotools/configmgr.hxx>
#include <SwStyleNameMapper.hxx>

#ifndef _NUM_HXX //autogen
#define USE_NUMTABPAGES
#include <num.hxx>
#endif
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <uitool.hxx>
#include <errhdl.hxx>
#include <wrtsh.hxx>
#include <swmodule.hxx>
#include <fmtcol.hxx>
#include <outline.hxx>
#include <uinums.hxx>
#include <poolfmt.hxx>
#include <shellres.hxx>
#include <svl/style.hxx>
#include <charfmt.hxx>
#include <docstyle.hxx>
#include <viewopt.hxx>
#include <svtools/ctrlbox.hxx>
#ifndef _HELPID_H
#include <helpid.h>
#endif
#ifndef _GLOBALS_HRC
#include <globals.hrc>		// fuer Vorlagenname 'keins'
#endif
#ifndef _MISC_HRC
#include <misc.hrc>
#endif
#ifndef _OUTLINE_HRC
#include <outline.hrc>
#endif
#include <paratr.hxx>

#include <unomid.h>

#include <IDocumentOutlineNodes.hxx>
// --> OD 2008-04-14 #outlinelevel#
#include <app.hrc>
// <--

#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
#include <com/sun/star/accessibility/AccessibleRole.hpp>
#endif

using namespace ::com::sun::star;

/* -----------------------------31.01.01 10:23--------------------------------

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

DBG_NAME(outlinehdl)

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

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

class SwNumNamesDlg: public ModalDialog
{
    FixedLine    aFormFL;
	Edit         aFormEdit;
	ListBox      aFormBox;
	OKButton     aOKBtn;
	CancelButton aCancelBtn;
	HelpButton   aHelpBtn;

	DECL_LINK( ModifyHdl, Edit * );
	DECL_LINK( SelectHdl, ListBox * );
	DECL_LINK( DoubleClickHdl, ListBox * );

public:
	SwNumNamesDlg(Window *pParent);
	~SwNumNamesDlg();
	void SetUserNames(const String *pList[]);
	String GetName() const { return aFormEdit.GetText(); }
	sal_uInt16 GetCurEntryPos() const { return aFormBox.GetSelectEntryPos(); }
};

/*------------------------------------------------------------------------
 Beschreibung:  selektierten Eintrag merken
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwNumNamesDlg, SelectHdl, ListBox *, pBox )
{
	aFormEdit.SetText(pBox->GetSelectEntry());
	aFormEdit.SetSelection(Selection(0, SELECTION_MAX));
	return 0;
}
IMPL_LINK_INLINE_END( SwNumNamesDlg, SelectHdl, ListBox *, pBox )

/*------------------------------------------------------------------------
 Beschreibung:  Setzen der vom Benutzer vergebenen Namen
 Parameter:     Liste der vom Benutzer vergebenen Namen;
				nicht vom Benutzer benannte Positionen sind 0.
------------------------------------------------------------------------*/


void SwNumNamesDlg::SetUserNames(const String *pList[])
{
	sal_uInt16 nSelect = 0;
	for(sal_uInt16 i = 0; i < SwBaseNumRules::nMaxRules; ++i)
	{
		if(pList[i])
		{
			aFormBox.RemoveEntry(i);
			aFormBox.InsertEntry(*pList[i], i);
			if(i == nSelect && nSelect < SwBaseNumRules::nMaxRules)
				nSelect++;
		}
	}
	aFormBox.SelectEntryPos(nSelect);
	SelectHdl(&aFormBox);
}
/*------------------------------------------------------------------------
 Beschreibung:  OK-Button freischalten, wenn Text im Edit steht.
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwNumNamesDlg, ModifyHdl, Edit *, pBox )
{
	aOKBtn.Enable(0 != pBox->GetText().Len());
	return 0;
}
IMPL_LINK_INLINE_END( SwNumNamesDlg, ModifyHdl, Edit *, pBox )
/*------------------------------------------------------------------------
 Beschreibung:  DoubleClickHdl
------------------------------------------------------------------------*/


IMPL_LINK_INLINE_START( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG )
{
	EndDialog(RET_OK);
	return 0;
}
IMPL_LINK_INLINE_END( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG )

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

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

SwNumNamesDlg::SwNumNamesDlg(Window *pParent)
	: ModalDialog(pParent, SW_RES(DLG_NUM_NAMES)),
	aFormFL(this, SW_RES(FL_FORM)),
    aFormEdit(this, SW_RES(ED_FORM)),
	aFormBox(this, SW_RES(LB_FORM)),
	aOKBtn(this, SW_RES(BT_OK)),
	aCancelBtn(this, SW_RES(BT_CANCEL)),
	aHelpBtn(this, SW_RES(BT_HELP))
{
	FreeResource();
	aFormEdit.SetModifyHdl(LINK(this, SwNumNamesDlg, ModifyHdl));
	aFormBox.SetSelectHdl(LINK(this, SwNumNamesDlg, SelectHdl));
	aFormBox.SetDoubleClickHdl(LINK(this, SwNumNamesDlg, DoubleClickHdl));
	SelectHdl(&aFormBox);
}

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

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

__EXPORT SwNumNamesDlg::~SwNumNamesDlg() {}


/* -----------------08.07.98 08:46-------------------
 *
 * --------------------------------------------------*/
sal_uInt16 lcl_BitToLevel(sal_uInt16 nActLevel)
{
	sal_uInt16 nTmp = nActLevel;
	sal_uInt16 nTmpLevel = 0;
	while( 0 != (nTmp >>= 1) )
		nTmpLevel++;
	return nTmpLevel;
}

/* -----------------07.07.98 14:13-------------------
 *
 * --------------------------------------------------*/
sal_uInt16 SwOutlineTabDialog::nNumLevel = 1;
SwOutlineTabDialog::SwOutlineTabDialog(Window* pParent,
					const SfxItemSet* pSwItemSet,
					SwWrtShell &rSh) :
									//der UserString wird danach richtig gesetzt
		SfxTabDialog(pParent, SW_RES(DLG_TAB_OUTLINE), pSwItemSet, sal_False, &aEmptyStr),
        aNullStr(C2S("____")),
		aFormMenu(SW_RES(MN_FORM)),
        rWrtSh(rSh),
		pChapterNumRules(SW_MOD()->GetChapterNumRules()),
        bModified(rWrtSh.IsModified())
{
    // --> OD 2008-04-14 #outlinelevel#
    SetText( SW_RES( STR_OUTLINE_NUMBERING ) );
    // <--
    PushButton* pUserButton = GetUserButton();
    pUserButton->SetText(SW_RES(ST_FORM));
    pUserButton->SetHelpId(HID_OUTLINE_FORM);
    pUserButton->SetClickHdl(LINK(this, SwOutlineTabDialog, FormHdl));
	pUserButton->SetAccessibleRole( com::sun::star::accessibility::AccessibleRole::BUTTON_MENU );

	FreeResource();
	pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() );
	GetCancelButton().SetClickHdl(LINK(this, SwOutlineTabDialog, CancelHdl));

	AddTabPage(TP_NUM_POSITION	 , &SwNumPositionTabPage::Create, 0);
	AddTabPage(TP_OUTLINE_NUM	 , &SwOutlineSettingsTabPage::Create, 0);

	String sHeadline;
	sal_uInt16 i;

	for( i = 0; i < MAXLEVEL; ++i )
	{
		// wurde die Vorlage noch nicht angelegt, dann ist sie noch an dieserPosition
		if( !rWrtSh.GetParaStyle( sHeadline =
            SwStyleNameMapper::GetUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i),
                                          sHeadline )) )
			aCollNames[i] = sHeadline;
	}

	// Erfragen der Gliederungsebenen der Textvorlagen
	const sal_uInt16 nCount = rWrtSh.GetTxtFmtCollCount();
	for(i = 0; i < nCount; ++i )
	{
		SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i);
		if(!rTxtColl.IsDefault())
		{
			//sal_uInt8 nOutLevel = rTxtColl.GetOutlineLevel();	//<-#outline level, removed out by zhaojianwei
			//if(nOutLevel != NO_NUMBERING)
			//->added by zhaojianwei
			if(rTxtColl.IsAssignedToListLevelOfOutlineStyle())
			{
				int nOutLevel = rTxtColl.GetAssignedOutlineStyleLevel();
				aCollNames[ nOutLevel ] = rTxtColl.GetName();
			}
			//<-end
		}
	}
}

/* -----------------07.07.98 14:13-------------------
 *
 * --------------------------------------------------*/
SwOutlineTabDialog::~SwOutlineTabDialog()
{
	delete pNumRule;
}

/* -----------------07.07.98 14:13-------------------
 *
 * --------------------------------------------------*/
void 	SwOutlineTabDialog::PageCreated(sal_uInt16 nPageId, SfxTabPage& rPage)
{
	switch ( nPageId )
	{
		case TP_NUM_POSITION:
                ((SwNumPositionTabPage&)rPage).SetWrtShell(&rWrtSh);
                ((SwNumPositionTabPage&)rPage).SetOutlineTabDialog(this);
		break;
		case TP_OUTLINE_NUM:
				((SwOutlineSettingsTabPage&)rPage).SetWrtShell(&rWrtSh);
		break;
	}
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineTabDialog, CancelHdl, Button *, EMPTYARG )
{
	if (!bModified)
		rWrtSh.ResetModified();
	EndDialog(RET_CANCEL);
	return 0;
}
/* -----------------08.07.98 12:14-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineTabDialog, FormHdl, Button *, pBtn )
{
	//PopupMenu auffuellen
	for( sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i )
	{
		const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
		if( pRules )
			aFormMenu.SetItemText(i + MN_FORMBASE, pRules->GetName());
	}
	aFormMenu.SetSelectHdl(LINK(this, SwOutlineTabDialog, MenuSelectHdl));
	aFormMenu.Execute(pBtn, Rectangle(Point(0,0), pBtn->GetSizePixel()), POPUPMENU_EXECUTE_DOWN);
	return 0;
}

/* -----------------08.07.98 12:14-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineTabDialog, MenuSelectHdl, Menu *, pMenu )
{
	sal_uInt8 nLevelNo = 0;
	switch(pMenu->GetCurItemId())
	{
		case MN_FORM1: nLevelNo = 1;	break;
		case MN_FORM2: nLevelNo = 2;	break;
		case MN_FORM3: nLevelNo = 3;	break;
		case MN_FORM4: nLevelNo = 4;	break;
		case MN_FORM5: nLevelNo = 5;	break;
		case MN_FORM6: nLevelNo = 6;	break;
		case MN_FORM7: nLevelNo = 7;	break;
		case MN_FORM8: nLevelNo = 8;	break;
		case MN_FORM9: nLevelNo = 9;	break;

		case MN_SAVE:
		{
			SwNumNamesDlg *pDlg = new SwNumNamesDlg(this);
			const String *aStrArr[SwChapterNumRules::nMaxRules];
			for(sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i)
			{
				const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i);
				if(pRules)
					aStrArr[i] = &pRules->GetName();
				else
					aStrArr[i] = 0;
			}
			pDlg->SetUserNames(aStrArr);
			if(RET_OK == pDlg->Execute())
			{
				const String aName(pDlg->GetName());
				pChapterNumRules->ApplyNumRules( SwNumRulesWithName(
						*pNumRule, aName ), pDlg->GetCurEntryPos() );
				pMenu->SetItemText(
						pDlg->GetCurEntryPos() + MN_FORMBASE, aName);
			}
			delete pDlg;
			return 0;

		}

	}
	if( nLevelNo-- )
	{
		const SwNumRulesWithName *pRules = pChapterNumRules->GetRules( nLevelNo );
		if( pRules )
		{
			pRules->MakeNumRule( rWrtSh, *pNumRule );
			pNumRule->SetRuleType( OUTLINE_RULE );
		}
		else
			*pNumRule = *rWrtSh.GetOutlineNumRule();
	}

	sal_uInt16	nPageId = GetCurPageId();
	SfxTabPage*	pPage = GetTabPage( nPageId );
	pPage->Reset(*GetOutputItemSet());

	return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
sal_uInt16 	SwOutlineTabDialog::GetLevel(const String &rFmtName) const
{
	for(sal_uInt16 i = 0; i < MAXLEVEL; ++i)
	{
		if(aCollNames[i] == rFmtName)
			return i;
	}
	return MAXLEVEL;//NO_NUMBERING;	//#outline level,zhaojianwei

}
/* -----------------07.07.98 16:30-------------------
 *
 * --------------------------------------------------*/
short SwOutlineTabDialog::Ok()
{
    SfxTabDialog::Ok();
	// bei allen erzeugten Vorlagen die Ebenen setzen, muss
	// geschehen, um evtl. aufgehobene Zuordnungen
	// auch wieder zu loeschen

    // --> OD 2006-12-11 #130443#
    // encapsulate changes into a action to avoid effects on the current cursor
    // position during the changes.
    rWrtSh.StartAction();
    // <--

    const SwNumRule * pOutlineRule = rWrtSh.GetOutlineNumRule();

	sal_uInt16 i, nCount = rWrtSh.GetTxtFmtCollCount();
	for( i = 0; i < nCount; ++i )
	{
		SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i);
		if( !rTxtColl.IsDefault() )
        {
			//rTxtColl.SetOutlineLevel( (sal_uInt8)GetLevel(rTxtColl.GetName()));//#outline level,removed by zhaojianwei

            const SfxPoolItem & rItem =
                rTxtColl.GetFmtAttr(RES_PARATR_NUMRULE, sal_False);

			//if ((sal_uInt8)GetLevel(rTxtColl.GetName()) == NO_NUMBERING)	//#outline level,removed by zhaojianwei
			//{
			//	if (static_cast<const SwNumRuleItem &>(rItem).GetValue() ==
			//		pOutlineRule->GetName())
			//	{
			//		rTxtColl.ResetFmtAttr(RES_PARATR_NUMRULE);
			//	}
			//}
			//else
			//{
			//	if (static_cast<const SwNumRuleItem &>(rItem).GetValue() !=
			//		pOutlineRule->GetName())
			//	{
			//		SwNumRuleItem aItem(pOutlineRule->GetName());
			//		rTxtColl.SetFmtAttr(aItem);
			//	}
			//}
           if ((sal_uInt8)GetLevel(rTxtColl.GetName()) == MAXLEVEL) //add by zhaojianwei
            {
			    if(rTxtColl.IsAssignedToListLevelOfOutlineStyle())
				{
					rTxtColl.DeleteAssignmentToListLevelOfOutlineStyle();
				}
				if (static_cast<const SwNumRuleItem &>(rItem).GetValue() ==
                    pOutlineRule->GetName())
                {
                    rTxtColl.ResetFmtAttr(RES_PARATR_NUMRULE);
                }
            }
            else
            {
				rTxtColl.AssignToListLevelOfOutlineStyle(GetLevel(rTxtColl.GetName()));

				if (static_cast<const SwNumRuleItem &>(rItem).GetValue() !=
                    pOutlineRule->GetName())
                {
                    SwNumRuleItem aItem(pOutlineRule->GetName());
                    rTxtColl.SetFmtAttr(aItem);
                }
            }							//<-end,zhaojianwei
        }
	}

    for(i = 0; i < MAXLEVEL; ++i )
    {
        String sHeadline;
        ::SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i),
                                         sHeadline );
        SwTxtFmtColl* pColl = rWrtSh.FindTxtFmtCollByName( sHeadline );
        if( !pColl )
        {
			//if( !aCollNames[i].Len() )			//#outline level,removed by zhaojianwei
			//{
			//	SwTxtFmtColl* pTxtColl = rWrtSh.GetTxtCollFromPool(
			//		static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i) );
			//	pTxtColl->SetOutlineLevel( NO_NUMBERING );
			//	pTxtColl->ResetFmtAttr(RES_PARATR_NUMRULE);
			//}
			//else if(aCollNames[i] != sHeadline)
			//{
			//	SwTxtFmtColl* pTxtColl = rWrtSh.GetParaStyle(
			//		aCollNames[i], SwWrtShell::GETSTYLE_CREATESOME);
			//	if(pTxtColl)
			//	{
			//		pTxtColl->SetOutlineLevel( static_cast< sal_uInt8 >(i) );

			//		SwNumRuleItem aItem(pOutlineRule->GetName());
			//		pTxtColl->SetFmtAttr(aItem);
			//	}
			//}
            if(aCollNames[i] != sHeadline)//->added by zhaojianwei
            {
				SwTxtFmtColl* pTxtColl = rWrtSh.GetTxtCollFromPool(
					static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i) );
				pTxtColl->DeleteAssignmentToListLevelOfOutlineStyle();
				pTxtColl->ResetFmtAttr(RES_PARATR_NUMRULE);

				if( aCollNames[i].Len() )
				{
					pTxtColl = rWrtSh.GetParaStyle(
                                aCollNames[i], SwWrtShell::GETSTYLE_CREATESOME);
					if(pTxtColl)
					{
						pTxtColl->AssignToListLevelOfOutlineStyle(i);
						SwNumRuleItem aItem(pOutlineRule->GetName());
						pTxtColl->SetFmtAttr(aItem);
					}
                }
            }//<--end,zhaojianwei
        }
    }

	rWrtSh.SetOutlineNumRule( *pNumRule);

    // --> OD 2006-12-11 #130443#
    rWrtSh.EndAction();
    // <--

	return RET_OK;
}

/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
SwOutlineSettingsTabPage::SwOutlineSettingsTabPage(Window* pParent, const SfxItemSet& rSet) :
	SfxTabPage(pParent, SW_RES(TP_OUTLINE_NUM), rSet),
    aLevelFL(       this, SW_RES(FL_LEVEL    )),
    aLevelLB(       this, SW_RES(LB_LEVEL   )),
	aNumberFL(this, SW_RES(FL_NUMBER)),
    aCollLbl(this, SW_RES(FT_COLL)),
	aCollBox(this, SW_RES(LB_COLL)),
    aNumberLbl(this, SW_RES(FT_NUMBER)),
    aNumberBox(this, SW_RES(LB_NUMBER), INSERT_NUM_TYPE_NO_NUMBERING|INSERT_NUM_EXTENDED_TYPES),
	aCharFmtFT(this, SW_RES(FT_CHARFMT)),
	aCharFmtLB(this, SW_RES(LB_CHARFMT)),
	aAllLevelFT(	this, SW_RES(FT_ALL_LEVEL)),
	aAllLevelNF(	this, SW_RES(NF_ALL_LEVEL)),
	aDelim(this, SW_RES(FT_DELIM)),
	aPrefixFT(this, SW_RES(FT_PREFIX)),
	aPrefixED(this, SW_RES(ED_PREFIX)),
	aSuffixFT(this, SW_RES(FT_SUFFIX)),
	aSuffixED(this, SW_RES(ED_SUFFIX)),
	aStartLbl(this, SW_RES(FT_START)),
	aStartEdit(this, SW_RES(ED_START)),
    aPreviewWIN(    this, SW_RES(WIN_PREVIEW )),

    aNoFmtName(SW_RES(ST_NO_COLL)),
    pSh(0),
    pCollNames(0),
    nActLevel(1)
{
	FreeResource();
	SetExchangeSupport();

	aCollBox.InsertEntry(aNoFmtName);
	aLevelLB.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, LevelHdl));
	aAllLevelNF.SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, ToggleComplete));
	aCollBox.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, CollSelect));
	aCollBox.SetGetFocusHdl(LINK(this, 	SwOutlineSettingsTabPage, CollSelectGetFocus));
	aNumberBox.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, NumberSelect));
	aPrefixED.SetModifyHdl(LINK(this, 	SwOutlineSettingsTabPage, DelimModify));
	aSuffixED.SetModifyHdl(LINK(this, 	SwOutlineSettingsTabPage, DelimModify));
	aStartEdit.SetModifyHdl(LINK(this, 	SwOutlineSettingsTabPage, StartModified));
	aCharFmtLB.SetSelectHdl(LINK(this, 	SwOutlineSettingsTabPage, CharFmtHdl));

}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
void   	SwOutlineSettingsTabPage::Update()
{
		// falls eine Vorlage fuer diese Ebene bereits selektiert wurde,
		// diese in der ListBox auswaehlean
	aCollBox.Enable(USHRT_MAX != nActLevel);
	if(USHRT_MAX == nActLevel)
	{
		sal_Bool bSamePrefix = sal_True;
		sal_Bool bSameSuffix = sal_True;
		sal_Bool bSameType = sal_True;
		sal_Bool bSameComplete = sal_True;
		sal_Bool bSameStart = sal_True;
		sal_Bool bSameCharFmt = sal_True;

		const SwNumFmt* aNumFmtArr[MAXLEVEL];
		const SwCharFmt* pFirstFmt = 0;

		for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
		{

			aNumFmtArr[ i ] = &pNumRule->Get(i);
			if(i == 0)
				pFirstFmt = aNumFmtArr[i]->GetCharFmt();
			else
			{
				bSameType 	&= aNumFmtArr[i]->GetNumberingType() == aNumFmtArr[0]->GetNumberingType();
				bSameStart	&= aNumFmtArr[i]->GetStart() == aNumFmtArr[0]->GetStart();
				bSamePrefix &= aNumFmtArr[i]->GetPrefix() == aNumFmtArr[0]->GetPrefix();
				bSameSuffix &= aNumFmtArr[i]->GetSuffix() == aNumFmtArr[0]->GetSuffix();
				bSameComplete &= aNumFmtArr[i]->GetIncludeUpperLevels() == aNumFmtArr[0]->GetIncludeUpperLevels();
				const SwCharFmt* pFmt = aNumFmtArr[i]->GetCharFmt();
				bSameCharFmt &= 	(!pFirstFmt && !pFmt)
									|| (pFirstFmt && pFmt && pFmt->GetName() == pFirstFmt->GetName());
			}
		}
        CheckForStartValue_Impl(aNumFmtArr[0]->GetNumberingType());
        if(bSameType)
			aNumberBox.SelectNumberingType( aNumFmtArr[0]->GetNumberingType() );
		else
			aNumberBox.SetNoSelection();
		if(bSameStart)
			aStartEdit.SetValue(aNumFmtArr[0]->GetStart());
		else
			aStartEdit.SetText(aEmptyStr);
		if(bSamePrefix)
			aPrefixED.SetText(aNumFmtArr[0]->GetPrefix());
		else
			aPrefixED.SetText(aEmptyStr);
		if(bSameSuffix)
			aSuffixED.SetText(aNumFmtArr[0]->GetSuffix());
		else
			aSuffixED.SetText(aEmptyStr);

		if(bSameCharFmt)
		{
			if(pFirstFmt)
				aCharFmtLB.SelectEntry(pFirstFmt->GetName());
			else
				aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone );
		}
		else
			aCharFmtLB.SetNoSelection();

		aAllLevelFT.Enable(sal_True);
		aAllLevelNF.Enable(sal_True);
		aAllLevelNF.SetMax(MAXLEVEL);
		if(bSameComplete)
		{
			aAllLevelNF.SetValue(aNumFmtArr[0]->GetIncludeUpperLevels());
		}
		else
		{
			aAllLevelNF.SetText(aEmptyStr);
		}
	}
	else
	{
		sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
		String aColl(pCollNames[nTmpLevel]);
		if(aColl.Len())
			aCollBox.SelectEntry(aColl);
		else
			aCollBox.SelectEntry(aNoFmtName);
		const SwNumFmt &rFmt = pNumRule->Get(nTmpLevel);

		aNumberBox.SelectNumberingType( rFmt.GetNumberingType() );
		aPrefixED.SetText(rFmt.GetPrefix());
		aSuffixED.SetText(rFmt.GetSuffix());
		const SwCharFmt* pFmt = rFmt.GetCharFmt();
		if(pFmt)
			aCharFmtLB.SelectEntry(pFmt->GetName());
		else
			aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone );

		if(nTmpLevel)
		{
			aAllLevelFT.Enable(sal_True);
			aAllLevelNF.Enable(sal_True);
			aAllLevelNF.SetMax(nTmpLevel + 1);
			aAllLevelNF.SetValue(rFmt.GetIncludeUpperLevels());
		}
		else
		{
			aAllLevelNF.SetText(aEmptyStr);
			aAllLevelNF.Enable(sal_False);
			aAllLevelFT.Enable(sal_False);
		}
        CheckForStartValue_Impl(rFmt.GetNumberingType());
		aStartEdit.SetValue( rFmt.GetStart() );
	}
	SetModified();
}

/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, LevelHdl, ListBox *, pBox )
{
	nActLevel = 0;
	if(pBox->IsEntryPosSelected( MAXLEVEL ))
	{
		nActLevel = 0xFFFF;
	}
	else
	{
		sal_uInt16 nMask = 1;
		for( sal_uInt16 i = 0; i < MAXLEVEL; i++ )
		{
			if(pBox->IsEntryPosSelected( i ))
				nActLevel |= nMask;
			nMask <<= 1;
		}
	}
	Update();
	return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, ToggleComplete, NumericField *, pFld )
{
	sal_uInt16 nMask = 1;
	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
	{
		if(nActLevel & nMask)
		{
			SwNumFmt aNumFmt(pNumRule->Get(i));
			aNumFmt.SetIncludeUpperLevels( Min( (sal_uInt8)pFld->GetValue(),
												(sal_uInt8)(i + 1)) );
			pNumRule->Set(i, aNumFmt);
		}
		nMask <<= 1;
	}
	SetModified();
	return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, CollSelect, ListBox *, pBox )
{
	sal_uInt8 i;

	const String aCollName(pBox->GetSelectEntry());
	//0xFFFF darf hier nicht sein (disable)
	sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
	String sOldName( pCollNames[nTmpLevel] );

	for( i = 0; i < MAXLEVEL; ++i)
		pCollNames[i] = aSaveCollNames[i];

	if(aCollName == aNoFmtName)
		pCollNames[nTmpLevel] = aEmptyStr;
	else
	{
		pCollNames[nTmpLevel] = aCollName;
				// wird die Vorlage bereits verwendet ?
		for( i = 0; i < MAXLEVEL; ++i)
			if(i != nTmpLevel && pCollNames[i] == aCollName )
				pCollNames[i] = aEmptyStr;
	}

	// search the oldname and put it into the current entries
	if( sOldName.Len() )
		for( i = 0; i < MAXLEVEL; ++i)
			if( aSaveCollNames[ i ] == sOldName && i != nTmpLevel &&
				!pCollNames[ i ].Len() )
			{
				sal_uInt8 n;
				for( n = 0; n < MAXLEVEL; ++n )
					if( pCollNames[ n ] == sOldName )
						break;

				if( MAXLEVEL == n )
					// it was a outline leveld name and the current entries is zero.
					pCollNames[ i ] = sOldName;
			}

	SetModified();
	return 0;
}

IMPL_LINK( SwOutlineSettingsTabPage, CollSelectGetFocus, ListBox *, EMPTYARG )
{
	for( sal_uInt8 i = 0; i < MAXLEVEL; ++i)
		aSaveCollNames[i] =  pCollNames[i];
	return 0;
}

/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, NumberSelect, SwNumberingTypeListBox *, pBox )
{
	sal_uInt16 nMask = 1;
	sal_Int16 nNumberType = pBox->GetSelectedNumberingType();//(sal_Int16)(sal_uLong)pBox->GetEntryData(pBox->GetSelectEntryPos());
	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
	{
		if(nActLevel & nMask)
		{
			SwNumFmt aNumFmt(pNumRule->Get(i));
			aNumFmt.SetNumberingType(nNumberType);
			pNumRule->Set(i, aNumFmt);
            CheckForStartValue_Impl(nNumberType);
        }
		nMask <<= 1;
	}
	SetModified();
	return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, DelimModify, Edit *, EMPTYARG )
{
	sal_uInt16 nMask = 1;
	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
	{
		if(nActLevel & nMask)
		{
			SwNumFmt aNumFmt(pNumRule->Get(i));
			aNumFmt.SetPrefix( aPrefixED.GetText() );
			aNumFmt.SetSuffix( aSuffixED.GetText() );
			pNumRule->Set(i, aNumFmt);
		}
		nMask <<= 1;
	}
	SetModified();
	return 0;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, StartModified, NumericField *, pFld )
{
	sal_uInt16 nMask = 1;
	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
	{
		if(nActLevel & nMask)
		{
			SwNumFmt aNumFmt(pNumRule->Get(i));
			aNumFmt.SetStart( (sal_uInt16)pFld->GetValue() );
			pNumRule->Set(i, aNumFmt);
		}
		nMask <<= 1;
	}
    SetModified();
	return 0;
}
/* -----------------21.09.98 12:21-------------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwOutlineSettingsTabPage, CharFmtHdl, ListBox *, EMPTYARG )
{
//	bAutomaticCharStyles = sal_False;
	String sEntry = aCharFmtLB.GetSelectEntry();
	sal_uInt16 nMask = 1;
	sal_Bool bFormatNone = sEntry == ViewShell::GetShellRes()->aStrNone;
	SwCharFmt* pFmt = 0;
	if(!bFormatNone)
	{
		sal_uInt16 nChCount = pSh->GetCharFmtCount();
		for(sal_uInt16 i = 0; i < nChCount; i++)
		{
			SwCharFmt& rChFmt = pSh->GetCharFmt(i);
			if(rChFmt.GetName() == sEntry)
			{
				pFmt = &rChFmt;
				break;
			}
		}
		if(!pFmt)
		{
			SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool();
			SfxStyleSheetBase* pBase;
			pBase = pPool->Find(sEntry, SFX_STYLE_FAMILY_CHAR);
			if(!pBase)
				pBase = &pPool->Make(sEntry, SFX_STYLE_FAMILY_PAGE);
			pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt();

		}
	}

	for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
	{
		if(nActLevel & nMask)
		{
			SwNumFmt aNumFmt(pNumRule->Get(i));
			if(bFormatNone)
				aNumFmt.SetCharFmt(0);
			else
				aNumFmt.SetCharFmt(pFmt);
			pNumRule->Set(i, aNumFmt);
		}
		nMask <<= 1;
	}
	return RET_OK;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
SwOutlineSettingsTabPage::~SwOutlineSettingsTabPage()
{
}
/* -----------------07.07.98 16:27-------------------
 *
 * --------------------------------------------------*/
void SwOutlineSettingsTabPage::SetWrtShell(SwWrtShell* pShell)
{
	pSh = pShell;
	// Erfragen der NumRules dieses Dokumentes
	pNumRule = ((SwOutlineTabDialog*)GetTabDialog())->GetNumRule();
	pCollNames = ((SwOutlineTabDialog*)GetTabDialog())->GetCollNames();

	//pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() );

	aPreviewWIN.SetNumRule(pNumRule);
	aPreviewWIN.SetOutlineNames(pCollNames);
	// Startwert setzen - nActLevel muss hier 1 sein
	sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel);
	const SwNumFmt& rNumFmt = pNumRule->Get( nTmpLevel );
	aStartEdit.SetValue( rNumFmt.GetStart() );

	// Poolformate fuer Ueberschriften anlegen
	String sStr;
	sal_uInt16 i;
	for( i = 0; i < MAXLEVEL; ++i )
	{
		aCollBox.InsertEntry( SwStyleNameMapper::GetUIName(
                                    static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i), aEmptyStr ));
		aLevelLB.InsertEntry( String::CreateFromInt32(i + 1) );
	}
	sStr.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "1 - " ));
	sStr += String::CreateFromInt32(MAXLEVEL);
	aLevelLB.InsertEntry( sStr );

	// Erfragen der Gliederungsebenen der Textvorlagen
	const sal_uInt16 nCount = pSh->GetTxtFmtCollCount();
	for( i = 0; i < nCount; ++i )
	{
		SwTxtFmtColl &rTxtColl = pSh->GetTxtFmtColl(i);
		if(!rTxtColl.IsDefault())
		{
			sStr = rTxtColl.GetName();
			if(LISTBOX_ENTRY_NOTFOUND == aCollBox.GetEntryPos( sStr ))
				aCollBox.InsertEntry( sStr );
		}
	}

	aNumberBox.SelectNumberingType(rNumFmt.GetNumberingType());
	sal_uInt16 nOutlinePos = pSh->GetOutlinePos(MAXLEVEL);
	sal_uInt16 nTmp = 0;
	if(nOutlinePos != USHRT_MAX)
	{
        nTmp = static_cast<sal_uInt16>(pSh->getIDocumentOutlineNodesAccess()->getOutlineLevel(nOutlinePos));
	}
	aLevelLB.SelectEntryPos(nTmp-1);//nTmp);//#outline level,zhaojianwei

	// Zeichenvorlagen sammeln
	aCharFmtLB.Clear();
	aCharFmtLB.InsertEntry( ViewShell::GetShellRes()->aStrNone );

	// Zeichenvorlagen
	::FillCharStyleListBox(aCharFmtLB,
						pSh->GetView().GetDocShell());
	Update();
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
void    SwOutlineSettingsTabPage::ActivatePage(const SfxItemSet& )
{
    nActLevel = SwOutlineTabDialog::GetActNumLevel();
	if(nActLevel != USHRT_MAX)
		aLevelLB.SelectEntryPos(lcl_BitToLevel(nActLevel));
	else
		aLevelLB.SelectEntryPos(MAXLEVEL);
	LevelHdl(&aLevelLB);
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
int     SwOutlineSettingsTabPage::DeactivatePage(SfxItemSet*)
{
    SwOutlineTabDialog::SetActNumLevel(nActLevel);
	return LEAVE_PAGE;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
sal_Bool    SwOutlineSettingsTabPage::FillItemSet( SfxItemSet&  )
{
	return sal_True;
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
void 	SwOutlineSettingsTabPage::Reset( const SfxItemSet& rSet )
{
	ActivatePage(rSet);
}
/* -----------------07.07.98 14:19-------------------
 *
 * --------------------------------------------------*/
SfxTabPage*	SwOutlineSettingsTabPage::Create( Window* pParent,
								const SfxItemSet& rAttrSet)
{
	return new SwOutlineSettingsTabPage(pParent, rAttrSet);
}
/* -----------------07.11.2002 15:13-----------------
 *
 * --------------------------------------------------*/
void SwOutlineSettingsTabPage::CheckForStartValue_Impl(sal_uInt16 nNumberingType)
{
    sal_Bool bIsNull = aStartEdit.GetValue() == 0;
    sal_Bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC ||
                        SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType ||
                        SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType;
    aStartEdit.SetMin(bNoZeroAllowed ? 1 : 0);
    if(bIsNull && bNoZeroAllowed)
        aStartEdit.GetModifyHdl().Call(&aStartEdit);
}
/*-----------------09.12.97 11:54-------------------

--------------------------------------------------*/
sal_uInt16 lcl_DrawBullet(VirtualDevice* pVDev,
			const SwNumFmt& rFmt, sal_uInt16 nXStart,
			sal_uInt16 nYStart, const Size& rSize)
{
	Font aTmpFont(pVDev->GetFont());

	Font aFont(*rFmt.GetBulletFont());
	aFont.SetSize(rSize);
	aFont.SetTransparent(sal_True);
	pVDev->SetFont( aFont );
	String aText(rFmt.GetBulletChar());
	pVDev->DrawText( Point(nXStart, nYStart), aText );
	sal_uInt16 nRet = (sal_uInt16)pVDev->GetTextWidth(aText);

	pVDev->SetFont(aTmpFont);
	return nRet;
}
/*-----------------09.12.97 11:49-------------------

--------------------------------------------------*/
sal_uInt16 lcl_DrawGraphic(VirtualDevice* pVDev, const SwNumFmt &rFmt, sal_uInt16 nXStart,
						sal_uInt16 nYStart, sal_uInt16 nDivision)
{
	const SvxBrushItem* pBrushItem = rFmt.GetBrush();
	sal_uInt16 nRet = 0;
	if(pBrushItem)
	{
		const Graphic* pGrf = pBrushItem->GetGraphic();
		if(pGrf)
		{
			Size aGSize( rFmt.GetGraphicSize());
			aGSize.Width() /= nDivision;
			nRet = (sal_uInt16)aGSize.Width();
			aGSize.Height() /= nDivision;
			pGrf->Draw( pVDev, Point(nXStart,nYStart),
					pVDev->PixelToLogic( aGSize ) );
		}
	}
	return nRet;

}
/*-----------------02.12.97 10:34-------------------
	Vorschau der Numerierung painten
--------------------------------------------------*/
void    NumberingPreview::Paint( const Rectangle& /*rRect*/ )
{
	Size aSize(PixelToLogic(GetOutputSizePixel()));
	Rectangle aRect(Point(0,0), aSize);

	VirtualDevice* pVDev = new VirtualDevice(*this);
	pVDev->SetMapMode(GetMapMode());
	pVDev->SetOutputSize( aSize );

	// #101524# OJ
	pVDev->SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() );
	pVDev->SetLineColor( GetSettings().GetStyleSettings().GetButtonTextColor() );
	pVDev->DrawRect(aRect);

	if(pActNum)
	{
		sal_uInt16 nWidthRelation;
		if(nPageWidth)
		{
			nWidthRelation = sal_uInt16 (nPageWidth / aSize.Width());
			if(bPosition)
				nWidthRelation = nWidthRelation * 2 / 3;
			else
				nWidthRelation = nWidthRelation / 4;
		}
		else
			nWidthRelation = 30; // Kapiteldialog

		//Hoehe pro Ebene
        sal_uInt16 nXStep = sal_uInt16(aSize.Width() / (3 * MAXLEVEL));
		if(MAXLEVEL < 10)
			nXStep /= 2;
		sal_uInt16 nYStart = 4;
        sal_uInt16 nYStep = sal_uInt16((aSize.Height() - 6)/ MAXLEVEL);
        aStdFont = OutputDevice::GetDefaultFont(
                                    DEFAULTFONT_UI_SANS, (LanguageType)GetAppLanguage(),
									DEFAULTFONT_FLAGS_ONLYONE, this );
		// #101524# OJ
        aStdFont.SetColor( SwViewOption::GetFontColor() );

		//
		sal_uInt16 nFontHeight = nYStep * 6 / 10;
		if(bPosition)
			nFontHeight = nYStep * 15 / 10;
		aStdFont.SetSize(Size( 0, nFontHeight ));

		sal_uInt16 nPreNum = pActNum->Get(0).GetStart();

		if(bPosition)
		{
			sal_uInt16 nLineHeight = nFontHeight * 8 / 7;
			sal_uInt8 nStart = 0;
			while( !(nActLevel & (1<<nStart)) )
			{
				nStart++;
			}
			if(nStart) // damit moeglichs Vorgaenger und Nachfolger gezeigt werden
				nStart--;

            SwNumberTree::tNumberVector aNumVector;
			sal_uInt8 nEnd = Min( (sal_uInt8)(nStart + 3), MAXLEVEL );
			for( sal_uInt8 nLevel = nStart; nLevel < nEnd; ++nLevel )
			{
				const SwNumFmt &rFmt = pActNum->Get(nLevel);
				aNumVector.push_back(rFmt.GetStart());

                // --> OD 2008-02-01 #newlistlevelattrs#
                sal_uInt16 nXStart( 0 );
                short nTextOffset( 0 );
                sal_uInt16 nNumberXPos( 0 );
                if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
                {
                    nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
                    nTextOffset = rFmt.GetCharTextDistance() / nWidthRelation;
                    nNumberXPos = nXStart;
                    sal_uInt16 nFirstLineOffset = (-rFmt.GetFirstLineOffset()) / nWidthRelation;

                    if(nFirstLineOffset <= nNumberXPos)
                        nNumberXPos = nNumberXPos - nFirstLineOffset;
                    else
                        nNumberXPos = 0;
                }
                else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
                {
                    const long nTmpNumberXPos( ( rFmt.GetIndentAt() +
                                                 rFmt.GetFirstLineIndent() ) /
                                               nWidthRelation );
                    if ( nTmpNumberXPos < 0 )
                    {
                        nNumberXPos = 0;
                    }
                    else
                    {
                        nNumberXPos = static_cast<sal_uInt16>(nTmpNumberXPos);
                    }
                }
                // <--

				sal_uInt16 nBulletWidth = 0;
				if( SVX_NUM_BITMAP == rFmt.GetNumberingType() )
				{
					nBulletWidth = lcl_DrawGraphic(pVDev, rFmt,
										nNumberXPos,
											nYStart, nWidthRelation);
				}
				else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
				{
					nBulletWidth =  lcl_DrawBullet(pVDev, rFmt, nNumberXPos, nYStart, aStdFont.GetSize());
				}
				else
				{
					pVDev->SetFont(aStdFont);
					if(pActNum->IsContinusNum())
						aNumVector[nLevel] = nPreNum;
                    // --> OD 2005-11-17 #128041#
                    String aText(pActNum->MakeNumString( aNumVector ));
                    // <--
					pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
					nBulletWidth = (sal_uInt16)pVDev->GetTextWidth(aText);
					nPreNum++;
				}
                // --> OD 2008-02-01 #newlistlevelattrs#
                if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT &&
                     rFmt.GetLabelFollowedBy() == SvxNumberFormat::SPACE )
                {
                    pVDev->SetFont(aStdFont);
                    String aText(' ');
                    pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
                    nBulletWidth = nBulletWidth + (sal_uInt16)pVDev->GetTextWidth(aText);
                }
                // <--

                // --> OD 2008-02-01 #newlistlevelattrs#
                sal_uInt16 nTextXPos( 0 );
                if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
                {
                    nTextXPos = nXStart;
                    if(nTextOffset < 0)
                         nTextXPos = nTextXPos + nTextOffset;
                    if(nNumberXPos + nBulletWidth + nTextOffset > nTextXPos )
                        nTextXPos = nNumberXPos + nBulletWidth + nTextOffset;
                }
                else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
                {
                    switch ( rFmt.GetLabelFollowedBy() )
                    {
                        case SvxNumberFormat::LISTTAB:
                        {
                            nTextXPos = static_cast<sal_uInt16>(
                                            rFmt.GetListtabPos() / nWidthRelation );
                            if ( nTextXPos < nNumberXPos + nBulletWidth )
                            {
                                nTextXPos = nNumberXPos + nBulletWidth;
                            }
                        }
                        break;
                        case SvxNumberFormat::SPACE:
                        case SvxNumberFormat::NOTHING:
                        {
                            nTextXPos = nNumberXPos + nBulletWidth;
                        }
                        break;
                    }

                    nXStart = static_cast<sal_uInt16>( rFmt.GetIndentAt() / nWidthRelation );
                }
                // <--


                Rectangle aRect1(Point(nTextXPos, nYStart + nFontHeight / 2), Size(aSize.Width() / 2, 2));
				pVDev->SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() ); // Color( COL_BLACK ) );
				pVDev->DrawRect( aRect1 );

				Rectangle aRect2(Point(nXStart, nYStart + nLineHeight + nFontHeight / 2 ), Size(aSize.Width() / 2, 2));
				pVDev->DrawRect( aRect2 );
				nYStart += 2 * nLineHeight;
			}
		}
		else
		{
            SwNumberTree::tNumberVector aNumVector;
			sal_uInt16 nLineHeight = nFontHeight * 3 / 2;
			for( sal_uInt8 nLevel = 0; nLevel < MAXLEVEL;
                            ++nLevel, nYStart = nYStart + nYStep )
			{
				const SwNumFmt &rFmt = pActNum->Get(nLevel);
				aNumVector.push_back(rFmt.GetStart());
                // --> OD 2008-02-01 #newlistlevelattrs#
                sal_uInt16 nXStart( 0 );
                if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
                {
                    nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
                }
                else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
                {
                    const long nTmpXStart( ( rFmt.GetIndentAt() +
                                             rFmt.GetFirstLineIndent() ) /
                                           nWidthRelation );
                    if ( nTmpXStart < 0 )
                    {
                        nXStart = 0;
                    }
                    else
                    {
                        nXStart = static_cast<sal_uInt16>(nTmpXStart);
                    }
                }
                nXStart /= 2;
                nXStart += 2;
                // <--
				sal_uInt16 nTextOffset = 2 * nXStep;
				if( SVX_NUM_BITMAP == rFmt.GetNumberingType() )
				{
					lcl_DrawGraphic(pVDev, rFmt, nXStart, nYStart, nWidthRelation);
					nTextOffset = nLineHeight + nXStep;
				}
				else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
				{
					nTextOffset =  lcl_DrawBullet(pVDev, rFmt, nXStart, nYStart, aStdFont.GetSize());
                    nTextOffset = nTextOffset + nXStep;
				}
				else
				{
					pVDev->SetFont(aStdFont);
					if(pActNum->IsContinusNum())
						aNumVector[nLevel] = nPreNum;
                    // --> OD 2005-11-17 #128041#
                    String aText(pActNum->MakeNumString( aNumVector ));
                    // <--
					pVDev->DrawText( Point(nXStart, nYStart), aText );
					nTextOffset = (sal_uInt16)pVDev->GetTextWidth(aText);
                    nTextOffset = nTextOffset + nXStep;
					nPreNum++;
				}
				pVDev->SetFont(aStdFont);

				// Changed as per BugID 79541 Branding/Configuration
                uno::Any MyAny = ::utl::ConfigManager::GetConfigManager()->
                        GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTNAME );
                ::rtl::OUString aProductName;

				MyAny >>= aProductName;
				String sMsg(C2S("%PRODUCTNAME"));
				sMsg.SearchAndReplaceAscii( "%PRODUCTNAME" , aProductName );

				if(pOutlineNames)
					sMsg = pOutlineNames[nLevel];
				pVDev->DrawText( Point(nXStart + nTextOffset, nYStart), sMsg );
			}
		}
	}
	DrawOutDev(	Point(0,0), aSize,
				Point(0,0), aSize,
						*pVDev );
	delete pVDev;

}

/*-----------------02.12.97 10:34-------------------

--------------------------------------------------*/
NumberingPreview::~NumberingPreview()
{
}
