/**************************************************************
 * 
 * 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/list.hxx>
#include <vcl/msgbox.hxx>
#include <svl/stritem.hxx>
#include <svl/intitem.hxx>
#include <svx/htmlmode.hxx>
#include <editeng/keepitem.hxx>
#include <editeng/brkitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/frmdiritem.hxx>
#include <svl/ctloptions.hxx>
#include <swmodule.hxx>
#include <fmtornt.hxx>
#include <fmtpdsc.hxx>
#include <fmtlsplt.hxx>

#include <svtools/htmlcfg.hxx>
#include <fmtrowsplt.hxx>
#include <svx/htmlmode.hxx>

#include "access.hrc"

#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <wrtsh.hxx>
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#include <viewopt.hxx>
#include <uitool.hxx>
#include <frmatr.hxx>
#include <tabledlg.hxx>
#ifndef _TABLEPG_HXX
#include <tablepg.hxx>
#endif
#include <tablemgr.hxx>
#include <pagedesc.hxx>
#include <uiitems.hxx>
#include <poolfmt.hxx>
#include <SwStyleNameMapper.hxx>

#ifndef _CMDID_H
#include <cmdid.h>
#endif
#ifndef _TABLEDLG_HRC
#include <tabledlg.hrc>
#endif
#ifndef _TABLE_HRC
#include <table.hrc>
#endif
#include <svx/svxids.hrc>
#include <svx/dialogs.hrc>
#include <svx/flagsdef.hxx>
#include <svx/svxdlg.hxx>

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


#ifdef DEBUG_TBLDLG
void DbgTblRep(SwTableRep* pRep)
{
	DBG_ERROR(String(pRep->GetColCount()))
	DBG_ERROR(String(pRep->GetAllColCount()))
	SwTwips nSum = 0;
	for(sal_uInt16 i = 0; i < pRep->GetAllColCount(); i++)
	{
		String sMsg(i);
		sMsg += pRep->GetColumns()[i].bVisible ? " v " : " h ";
		sMsg += pRep->GetColumns()[i].nWidth;
		nSum +=pRep->GetColumns()[i].nWidth;
		DBG_ERROR(sMsg)
	}
	String sMsg("Spaltensumme: ");
	sMsg += nSum;
	sMsg += " Tblbreite: ";
	sMsg += pRep->GetWidth();
	DBG_ERROR(sMsg)
	sMsg = "Gesamt/Links/Rechts: ";
	sMsg += pRep->GetSpace();
	sMsg += '/';
	sMsg += pRep->GetLeftSpace();
	sMsg += '/';
	sMsg += pRep->GetRightSpace();
	DBG_ERROR(sMsg)
	sMsg = "Align: ";
	sMsg += pRep->GetAlign();
	DBG_ERROR(sMsg)

};

#endif


SwFormatTablePage::SwFormatTablePage( Window* pParent, const SfxItemSet& rSet ) :
	SfxTabPage(pParent, SW_RES( TP_FORMAT_TABLE ), rSet ),
    aOptionsFL(this,    SW_RES( FL_OPTIONS )),
	aNameFT(this,		SW_RES( FT_NAME )),
	aNameED(this,		SW_RES( ED_NAME )),
	aWidthFT(this,		SW_RES( FT_WIDTH )),
	aWidthMF(this,		SW_RES( ED_WIDTH )),
	aRelWidthCB(this, 	SW_RES( CB_REL_WIDTH )),

    aPosFL(this,       SW_RES( FL_POS )),
    aFullBtn(this,      SW_RES( RB_FULL )),
    aLeftBtn(this,      SW_RES( RB_LEFT )),
    aFromLeftBtn(this,  SW_RES( RB_FROM_LEFT )),
    aRightBtn(this,     SW_RES( RB_RIGHT )),
    aCenterBtn(this,    SW_RES( RB_CENTER )),
    aFreeBtn(this,      SW_RES( RB_FREE )),

    aDistFL(this,       SW_RES( FL_DIST )),
    aLeftFT(this,       SW_RES( FT_LEFT_DIST )),
	aLeftMF(this,		SW_RES( ED_LEFT_DIST )),
	aRightFT(this,		SW_RES( FT_RIGHT_DIST )),
	aRightMF(this,		SW_RES( ED_RIGHT_DIST )),
	aTopFT (this,		SW_RES( FT_TOP_DIST )),
	aTopMF(this,		SW_RES( ED_TOP_DIST )),
	aBottomFT(this,		SW_RES( FT_BOTTOM_DIST )),
	aBottomMF(this,		SW_RES( ED_BOTTOM_DIST )),

    aPropertiesFL(this,     SW_RES( FL_PROPERTIES    )),
    aTextDirectionFT(this,  SW_RES( FT_TEXTDIRECTION )),
    aTextDirectionLB(this,  SW_RES( LB_TEXTDIRECTION )),

    pTblData(0),
	nSaveWidth(0),
	nMinTableWidth(MINLAY),
	bModified(sal_False),
    bFull(0),
    bHtmlMode(sal_False)
{
	FreeResource();
	SetExchangeSupport();

    const SfxPoolItem* pItem;
    if(SFX_ITEM_SET == rSet.GetItemState(SID_HTML_MODE, sal_False, &pItem))
        bHtmlMode = 0 != (((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON);

    sal_Bool bCTL = SW_MOD()->GetCTLOptions().IsCTLFontEnabled();
    if( !bHtmlMode && bCTL )
    {
        aPropertiesFL.Show();
        aTextDirectionFT.Show();
        aTextDirectionLB.Show();
    }

    Init();
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwFormatTablePage::Init()
{
	aLeftMF.MetricField::SetMin(-999999);
	aRightMF.MetricField::SetMin(-999999);

	// handler
	Link aLk = LINK( this, SwFormatTablePage, AutoClickHdl );
	aFullBtn.SetClickHdl( aLk );
	aFreeBtn.SetClickHdl( aLk );
	aLeftBtn.SetClickHdl( aLk );
	aFromLeftBtn.SetClickHdl( aLk );
	aRightBtn.SetClickHdl( aLk );
	aCenterBtn.SetClickHdl( aLk );

    aLk = LINK( this, SwFormatTablePage, UpDownLoseFocusHdl );
	aTopMF.SetUpHdl( aLk );
	aBottomMF.SetUpHdl( aLk );
	aRightMF.SetUpHdl( aLk );
	aLeftMF.SetUpHdl( aLk );
	aWidthMF.SetUpHdl( aLk );

    aTopMF.SetDownHdl( aLk );
	aBottomMF.SetDownHdl( aLk );
	aRightMF.SetDownHdl( aLk );
	aLeftMF.SetDownHdl( aLk );
	aWidthMF.SetDownHdl( aLk );

	aTopMF.SetLoseFocusHdl( aLk );
	aBottomMF.SetLoseFocusHdl( aLk );
	aRightMF.SetLoseFocusHdl( aLk );
	aLeftMF.SetLoseFocusHdl( aLk );
	aWidthMF.SetLoseFocusHdl( aLk );

	aRelWidthCB.SetClickHdl(LINK( this, SwFormatTablePage, RelWidthClickHdl ));
}

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

IMPL_LINK( SwFormatTablePage, RelWidthClickHdl, CheckBox *, pBtn )
{
	DBG_ASSERT(pTblData, "Tabellendaten nicht da?");
	sal_Bool bIsChecked = pBtn->IsChecked();
    sal_Int64 nLeft  = aLeftMF.DenormalizePercent(aLeftMF.GetValue(FUNIT_TWIP ));
    sal_Int64 nRight = aRightMF.DenormalizePercent(aRightMF.GetValue(FUNIT_TWIP ));
	aWidthMF.ShowPercent(bIsChecked);
	aLeftMF.ShowPercent(bIsChecked);
	aRightMF.ShowPercent(bIsChecked);

	if (bIsChecked)
	{
		aWidthMF.SetRefValue(pTblData->GetSpace());
		aLeftMF.SetRefValue(pTblData->GetSpace());
		aRightMF.SetRefValue(pTblData->GetSpace());
		aLeftMF.MetricField::SetMin(0); // wird vom Percentfield ueberschrieben
		aRightMF.MetricField::SetMin(0);//                 -""-
        aLeftMF.MetricField::SetMax(99); // 
        aRightMF.MetricField::SetMax(99);// 
        aLeftMF.SetPrcntValue(aLeftMF.NormalizePercent(nLeft ), FUNIT_TWIP );
        aRightMF.SetPrcntValue(aRightMF.NormalizePercent(nRight ), FUNIT_TWIP );
	}
	else
		ModifyHdl(&aLeftMF);	// Werte wieder korrigieren

	if(aFreeBtn.IsChecked())
	{
		sal_Bool bEnable = !pBtn->IsChecked();
		aRightMF.Enable(bEnable);
		aRightFT.Enable(bEnable);
	}
	bModified = sal_True;

	return 0;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK( SwFormatTablePage, AutoClickHdl, CheckBox *, pBox )
{
	sal_Bool bRestore = sal_True,
		 bLeftEnable = sal_False,
		 bRightEnable= sal_False,
		 bWidthEnable= sal_False,
		 bOthers = sal_True;
	if( (RadioButton *) pBox == &aFullBtn )
	{
        aLeftMF.SetPrcntValue(0);
        aRightMF.SetPrcntValue(0);
        nSaveWidth = static_cast< SwTwips >(aWidthMF.DenormalizePercent(aWidthMF.GetValue(FUNIT_TWIP )));
        aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(pTblData->GetSpace() ), FUNIT_TWIP );
		bFull = sal_True;
		bRestore = sal_False;
	}
	else if( (RadioButton *) pBox == &aLeftBtn )
	{
		bRightEnable = bWidthEnable = sal_True;
        aLeftMF.SetPrcntValue(0);
	}
	else if( (RadioButton *) pBox == &aFromLeftBtn )
	{
		bLeftEnable = bWidthEnable = sal_True;
        aRightMF.SetPrcntValue(0);
	}
	else if( (RadioButton *) pBox == &aRightBtn )
	{
		bLeftEnable = bWidthEnable = sal_True;
        aRightMF.SetPrcntValue(0);
	}
	else if( ( RadioButton * ) pBox == &aCenterBtn )
	{
		bLeftEnable = bWidthEnable = sal_True;
	}
	else if( ( RadioButton * ) pBox == &aFreeBtn )
	{
		RightModifyHdl(&aRightMF);
		bLeftEnable = sal_True;
		bWidthEnable = sal_True;
		bOthers = sal_False;
	}
	aLeftMF.Enable(bLeftEnable);
	aLeftFT.Enable(bLeftEnable);
	aWidthMF.Enable(bWidthEnable);
	aWidthFT.Enable(bWidthEnable);
	if ( bOthers )
	{
		aRightMF.Enable(bRightEnable);
		aRightFT.Enable(bRightEnable);
		aRelWidthCB.Enable(bWidthEnable);
	}

	if(bFull && bRestore)
	{
		// nachdem auf autom. geschaltet wurde, wurde die Breite gemerkt,
		// um sie beim Zurueckschalten restaurieren zu koennen
		bFull = sal_False;
        aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(nSaveWidth ), FUNIT_TWIP );
	}
	ModifyHdl(&aWidthMF);
	bModified = sal_True;
	return 0;
}

/*----------------------------------------------------------------------*/
IMPL_LINK( SwFormatTablePage, RightModifyHdl, MetricField *, EMPTYARG )
{
	if(aFreeBtn.IsChecked())
	{
		sal_Bool bEnable = aRightMF.GetValue() == 0;
//		aWidthMF.Enable(bEnable);
		aRelWidthCB.Enable(bEnable);
//		aWidthFT.Enable(bEnable);
		if ( !bEnable )
		{
			aRelWidthCB.Check(sal_False);
			RelWidthClickHdl(&aRelWidthCB);
		}
		bEnable = aRelWidthCB.IsChecked();
		aRightMF.Enable(!bEnable);
		aRightFT.Enable(!bEnable);
	}
	return 0;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwFormatTablePage, UpDownLoseFocusHdl, MetricField *, pEdit )
{
    if( &aRightMF == pEdit)
        RightModifyHdl(pEdit);
    ModifyHdl( pEdit );
	return 0;
}
IMPL_LINK_INLINE_END( SwFormatTablePage, UpDownLoseFocusHdl, MetricField *, pEdit )

void  SwFormatTablePage::ModifyHdl( Edit* pEdit )
{

    SwTwips nCurWidth  = static_cast< SwTwips >(aWidthMF.DenormalizePercent(aWidthMF.GetValue( FUNIT_TWIP )));
	SwTwips nPrevWidth = nCurWidth;
    SwTwips nRight = static_cast< SwTwips >(aRightMF.DenormalizePercent(aRightMF.GetValue( FUNIT_TWIP )));
    SwTwips nLeft  = static_cast< SwTwips >(aLeftMF.DenormalizePercent(aLeftMF.GetValue( FUNIT_TWIP )));
	SwTwips nDiff;

	if( pEdit == &aWidthMF )
	{
		if( nCurWidth < MINLAY )
			nCurWidth = MINLAY;
		nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;
		//rechtsbuendig nur linken Rand veraendern
		if(aRightBtn.IsChecked())
			nLeft -= nDiff;
		//linksbuendig nur rechten Rand veraendern
		else if(aLeftBtn.IsChecked())
			nRight -= nDiff;
		//linker Rand und Breite erlaubt - erst rechts - dann links
		else if(aFromLeftBtn.IsChecked())
		{
			if( nRight >= nDiff )
				nRight -= nDiff;
			else
			{
				nDiff -= nRight;
				nRight = 0;
				if(nLeft >= nDiff)
					nLeft -= nDiff;
				else
				{
					nRight += nLeft - nDiff;
					nLeft = 0;
					nCurWidth = pTblData->GetSpace();
				}

			}
		}
		//zentriert beide Seiten gleichmaessig veraendern
		else if(aCenterBtn.IsChecked())
		{
			if((nLeft != nRight))
			{
				nDiff += nLeft + nRight;
				nLeft = nDiff/2;
				nRight = nDiff/2;
			}
			else
			{
					nLeft -= nDiff/2;
					nRight -= nDiff/2;
			}
		}
		//freie Ausrichtung: beide Raender verkleinern
		else if(aFreeBtn.IsChecked())
		{
			nLeft -= nDiff/2;
			nRight -= nDiff/2;
		}
	}
	if( pEdit == &aRightMF	)
	{

		if( nRight + nLeft > pTblData->GetSpace() - MINLAY )
			nRight = pTblData->GetSpace() -nLeft - MINLAY;

		nCurWidth = pTblData->GetSpace() - nLeft - nRight;
	}
	if( pEdit == &aLeftMF )
	{
		if(!aFromLeftBtn.IsChecked())
		{
			sal_Bool bCenter = aCenterBtn.IsChecked();
			if( bCenter )
				nRight = nLeft;
			if(nRight + nLeft > pTblData->GetSpace() - MINLAY )
			{
				nLeft  = bCenter ? 	(pTblData->GetSpace() - MINLAY) /2 :
									(pTblData->GetSpace() - MINLAY) - nRight;
				nRight = bCenter ? 	(pTblData->GetSpace() - MINLAY) /2 : nRight;
			}
			nCurWidth = pTblData->GetSpace() - nLeft - nRight;
		}
		else
		{
			//hier wird bei Aenderung an der linken Seite zuerst der
			//rechte Rand veraendert, dann die Breite
			nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;

			nRight -= nDiff;
			nCurWidth = pTblData->GetSpace() - nLeft - nRight;
		}
	}
	if (nCurWidth != nPrevWidth )
        aWidthMF.SetPrcntValue( aWidthMF.NormalizePercent( nCurWidth ), FUNIT_TWIP );
    aRightMF.SetPrcntValue( aRightMF.NormalizePercent( nRight ), FUNIT_TWIP );
    aLeftMF.SetPrcntValue( aLeftMF.NormalizePercent( nLeft ), FUNIT_TWIP );
	bModified = sal_True;
}

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

/*------------------------------------------------------------------------
-------------------------------------------------------------------------*/
sal_Bool  SwFormatTablePage::FillItemSet( SfxItemSet& rCoreSet )
{
	// Testen, ob eins der Control noch den Focus hat
	if(aWidthMF.HasFocus())
		ModifyHdl(&aWidthMF);
	else if(aLeftMF.HasFocus())
		ModifyHdl(&aLeftMF);
	else if(aRightMF.HasFocus())
		ModifyHdl(&aRightMF);
	else if(aTopMF.HasFocus())
		ModifyHdl(&aTopMF);
	else if(aBottomMF.HasFocus())
		ModifyHdl(&aBottomMF);

	if(bModified)
	{
		if( aBottomMF.GetText() != aBottomMF.GetSavedValue() ||
									aTopMF.GetText() != aTopMF.GetSavedValue() )
		{
			SvxULSpaceItem aULSpace(RES_UL_SPACE);
			aULSpace.SetUpper( (sal_uInt16) aTopMF.Denormalize(
										aTopMF.GetValue( FUNIT_TWIP )));
			aULSpace.SetLower( (sal_uInt16) aBottomMF.Denormalize(
										aBottomMF.GetValue( FUNIT_TWIP )));
			rCoreSet.Put(aULSpace);
		}

	}
	if(aNameED.GetText() != aNameED.GetSavedValue())
	{
		rCoreSet.Put(SfxStringItem(	FN_PARAM_TABLE_NAME, aNameED.GetText()));
		bModified = sal_True;
	}

    sal_uInt16 nPos;
    if( aTextDirectionLB.IsVisible() &&
        ( nPos = aTextDirectionLB.GetSelectEntryPos() ) !=
                                            aTextDirectionLB.GetSavedValue() )
	{
        sal_uInt32 nDirection = (sal_uInt32)(sal_uIntPtr)aTextDirectionLB.GetEntryData( nPos );
        rCoreSet.Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
		bModified = sal_True;
	}

    return bModified;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwFormatTablePage::Reset( const SfxItemSet& )
{
	const SfxItemSet& rSet = GetItemSet();
	const SfxPoolItem*	pItem;

    if(bHtmlMode)
	{
		aNameED	.Disable();
		aTopFT	.Hide();
		aTopMF	.Hide();
		aBottomFT.Hide();
		aBottomMF.Hide();
		aFreeBtn.Enable(sal_False);
	}
	FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
	SetMetric( aWidthMF, aMetric );
	SetMetric( aRightMF, aMetric );
	SetMetric( aLeftMF, aMetric );
	SetMetric( aTopMF, aMetric );
	SetMetric( aBottomMF, aMetric );

	//Name
	if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_NAME, sal_False, &pItem ))
	{
		aNameED.SetText(((const SfxStringItem*)pItem)->GetValue());
		aNameED.SaveValue();
	}

	if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, sal_False, &pItem ))
	{
		pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
		nMinTableWidth = pTblData->GetColCount() * MINLAY;

		if(pTblData->GetWidthPercent())
		{
			aRelWidthCB.Check(sal_True);
			RelWidthClickHdl(&aRelWidthCB);
            aWidthMF.SetPrcntValue(pTblData->GetWidthPercent(), FUNIT_CUSTOM);

			aWidthMF.SaveValue();
            nSaveWidth = static_cast< SwTwips >(aWidthMF.GetValue(FUNIT_CUSTOM));
		}
		else
		{
            aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(
					pTblData->GetWidth()), FUNIT_TWIP);
			aWidthMF.SaveValue();
			nSaveWidth = pTblData->GetWidth();
			nMinTableWidth = Min( nSaveWidth, nMinTableWidth );
		}

		aWidthMF.SetRefValue(pTblData->GetSpace());
		aWidthMF.SetLast(aWidthMF.NormalizePercent( pTblData->GetSpace() ));
		aLeftMF.SetLast(aLeftMF.NormalizePercent( pTblData->GetSpace() ));
		aRightMF.SetLast(aRightMF.NormalizePercent( pTblData->GetSpace() ));

        aLeftMF.SetPrcntValue(aLeftMF.NormalizePercent(
					pTblData->GetLeftSpace()), FUNIT_TWIP);
        aRightMF.SetPrcntValue(aRightMF.NormalizePercent(
					pTblData->GetRightSpace()), FUNIT_TWIP);
		aLeftMF.SaveValue();
		aRightMF.SaveValue();

		nOldAlign = pTblData->GetAlign();

		sal_Bool bSetRight = sal_False, bRightEnable = sal_False,
			 bSetLeft  = sal_False, bLeftEnable  = sal_False;
		switch( nOldAlign )
		{
            case text::HoriOrientation::NONE:
				aFreeBtn.Check();
				if(aRelWidthCB.IsChecked())
					bSetRight = sal_True;
			break;
            case text::HoriOrientation::FULL:
			{
				bSetRight = bSetLeft = sal_True;
				aFullBtn.Check();
				aWidthMF.Enable(sal_False);
				aRelWidthCB.Enable(sal_False);
				aWidthFT.Enable(sal_False);
			}
			break;
            case text::HoriOrientation::LEFT:
			{
				bSetLeft = sal_True;
				aLeftBtn.Check();
			}
			break;
            case text::HoriOrientation::LEFT_AND_WIDTH :
			{
				bSetRight = sal_True;
				aFromLeftBtn.Check();
			}
			break;
            case text::HoriOrientation::RIGHT:
			{
				bSetRight = sal_True;
				aRightBtn.Check();
			}
			break;
            case text::HoriOrientation::CENTER:
			{
				bSetRight = sal_True;
				aCenterBtn.Check();
			}
			break;
		}
		if ( bSetRight )
		{
			aRightMF.Enable(bRightEnable);
			aRightFT.Enable(bRightEnable);
		}
		if ( bSetLeft )
		{
			aLeftMF.Enable(bLeftEnable);
			aLeftFT.Enable(bLeftEnable);
		}

	}

	//Raender
	if(SFX_ITEM_SET == rSet.GetItemState( RES_UL_SPACE, sal_False,&pItem ))
	{
		aTopMF.SetValue(aTopMF.Normalize(
						((const SvxULSpaceItem*)pItem)->GetUpper()), FUNIT_TWIP);
		aBottomMF.SetValue(aBottomMF.Normalize(
						((const SvxULSpaceItem*)pItem)->GetLower()), FUNIT_TWIP);
		aTopMF.SaveValue();
		aBottomMF.SaveValue();
	}

    //text direction
    if( SFX_ITEM_SET == rSet.GetItemState( RES_FRAMEDIR, sal_True, &pItem ) )
	{
        sal_uInt32 nVal  = ((SvxFrameDirectionItem*)pItem)->GetValue();
        sal_uInt16 nPos = aTextDirectionLB.GetEntryPos( (void*) nVal );
        aTextDirectionLB.SelectEntryPos( nPos );
        aTextDirectionLB.SaveValue();
	}

    aWidthMF.SetMax( 2*aWidthMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
	aRightMF.SetMax( aRightMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
	aLeftMF.SetMax( aLeftMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
	aWidthMF.SetMin( aWidthMF.NormalizePercent( nMinTableWidth ), FUNIT_TWIP );

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  	SwFormatTablePage::ActivatePage( const SfxItemSet& rSet )
{
	DBG_ASSERT(pTblData, "Tabellendaten nicht da?");
	if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP ))
	{
        SwTwips nCurWidth = text::HoriOrientation::FULL != pTblData->GetAlign() ?
										pTblData->GetWidth() :
											pTblData->GetSpace();
		if(pTblData->GetWidthPercent() == 0 &&
				nCurWidth != aWidthMF.DenormalizePercent(aWidthMF.GetValue(FUNIT_TWIP )))
		{
            aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(
							nCurWidth), FUNIT_TWIP);
			aWidthMF.SaveValue();
			nSaveWidth = nCurWidth;
            aLeftMF.SetPrcntValue(aLeftMF.NormalizePercent(
							pTblData->GetLeftSpace()), FUNIT_TWIP);
			aLeftMF.SaveValue();
            aRightMF.SetPrcntValue(aRightMF.NormalizePercent(
							pTblData->GetRightSpace()), FUNIT_TWIP);
			aRightMF.SaveValue();
		}
	}

}
/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
int  SwFormatTablePage::DeactivatePage( SfxItemSet* _pSet )
{
	// os: VCL sorgt nicht dafuer, dass das aktive Control im
	// dialog bei OK den focus verliert
	aNameED.GrabFocus();
	// Test des Tabellennamens auf Leerzeichen
	String sTblName = aNameED.GetText();
	if(sTblName.Search(' ') != STRING_NOTFOUND)
	{
		InfoBox(this, SW_RES(MSG_WRONG_TABLENAME)).Execute();
		aNameED.GrabFocus();
		return KEEP_PAGE;
	}
    if(_pSet)
	{
        FillItemSet(*_pSet);
		if(bModified)
		{
            SwTwips lLeft  = static_cast< SwTwips >(aLeftMF.DenormalizePercent(aLeftMF.GetValue( FUNIT_TWIP )));
            SwTwips lRight = static_cast< SwTwips >(aRightMF.DenormalizePercent(aRightMF.GetValue( FUNIT_TWIP )));


			if( aLeftMF.GetText() != aLeftMF.GetSavedValue() ||
									aRightMF.GetText() != aRightMF.GetSavedValue() )
			{
				pTblData->SetWidthChanged();
				pTblData->SetLeftSpace( lLeft);
				pTblData->SetRightSpace( lRight);
			}

			SwTwips lWidth;
			if (aRelWidthCB.IsChecked() && aRelWidthCB.IsEnabled())
			{
				lWidth = pTblData->GetSpace() - lRight - lLeft;
				sal_uInt16 nPercentWidth = (sal_uInt16)aWidthMF.GetValue(FUNIT_CUSTOM);
				if(pTblData->GetWidthPercent() != nPercentWidth)
				{
					pTblData->SetWidthPercent(nPercentWidth);
					pTblData->SetWidthChanged();
				}
			}
			else
			{
				pTblData->SetWidthPercent(0);
                lWidth = static_cast< SwTwips >(aWidthMF.DenormalizePercent(aWidthMF.GetValue( FUNIT_TWIP )));
			}
			pTblData->SetWidth(lWidth);

			SwTwips nColSum = 0;
			sal_uInt16 i;

			for( i = 0; i < pTblData->GetColCount(); i++)
			{
				nColSum += pTblData->GetColumns()[i].nWidth;
			}
			if(nColSum != pTblData->GetWidth())
			{
				SwTwips nMinWidth = Min( (long)MINLAY,
									(long) (pTblData->GetWidth() /
											pTblData->GetColCount() - 1));
				SwTwips nDiff = nColSum - pTblData->GetWidth();
				while ( Abs(nDiff) > pTblData->GetColCount() + 1 )
				{
					SwTwips nSub = nDiff / pTblData->GetColCount();
					for( i = 0; i < pTblData->GetColCount(); i++)
					{
						if(pTblData->GetColumns()[i].nWidth - nMinWidth > nSub)
						{
							pTblData->GetColumns()[i].nWidth -= nSub;
							nDiff -= nSub;
						}
						else
						{
							nDiff -= pTblData->GetColumns()[i].nWidth - nMinWidth;
							pTblData->GetColumns()[i].nWidth = nMinWidth;
						}

					}
				}
			}

            sal_Int16 nAlign = 0;
			if(aRightBtn.IsChecked())
                nAlign = text::HoriOrientation::RIGHT;
			else if(aLeftBtn.IsChecked())
                nAlign = text::HoriOrientation::LEFT;
			else if(aFromLeftBtn.IsChecked())
                nAlign = text::HoriOrientation::LEFT_AND_WIDTH;
			else if(aCenterBtn.IsChecked())
                nAlign = text::HoriOrientation::CENTER;
			else if(aFreeBtn.IsChecked())
                nAlign = text::HoriOrientation::NONE;
			else if(aFullBtn.IsChecked())
			{
                nAlign = text::HoriOrientation::FULL;
				lWidth = lAutoWidth;
			}
			if(nAlign != pTblData->GetAlign())
			{
				pTblData->SetWidthChanged();
				pTblData->SetAlign(nAlign);
			}


    //      if(  text::HoriOrientation::CENTER && lWidth != (SwTwips)aWidthMF.GetSavedValue())
			if(pTblData->GetWidth() != lWidth )
			{
				pTblData->SetWidthChanged();
				pTblData->SetWidth(
                    nAlign == text::HoriOrientation::FULL ? pTblData->GetSpace() : lWidth );
			}
			if(pTblData->HasWidthChanged())
                _pSet->Put(SwPtrItem(FN_TABLE_REP, pTblData));
		}
#ifdef DEBUG_TBLDLG
DbgTblRep(pTblData)
#endif
	}
	return sal_True;
}
/*------------------------------------------------------------------------
	Beschreibung: Seite Spaltenkonfiguration
------------------------------------------------------------------------*/
SwTableColumnPage::SwTableColumnPage( Window* pParent,
			const SfxItemSet& rSet ) :
	SfxTabPage(pParent, SW_RES( TP_TABLE_COLUMN ), rSet ),
	aModifyTableCB(this,	SW_RES(CB_MOD_TBL)),
	aProportionalCB(this,	SW_RES(CB_PROP)),
	aSpaceFT(this,			SW_RES(FT_SPACE)),
	aSpaceED(this,			SW_RES(ED_SPACE)),
    
    aColFL(this,            SW_RES(COL_FL_LAYOUT)),
    aUpBtn(this,            SW_RES(COL_BTN_UP)),
    aFT1(this,              SW_RES(COL_FT_1)),
	aMF1(this,				SW_RES(COL_MF_1)),
	aFT2(this,				SW_RES(COL_FT_2)),
	aMF2(this,				SW_RES(COL_MF_2)),
	aFT3(this,				SW_RES(COL_FT_3)),
	aMF3(this,				SW_RES(COL_MF_3)),
	aFT4(this,				SW_RES(COL_FT_4)),
	aMF4(this,				SW_RES(COL_MF_4)),
	aFT5(this,				SW_RES(COL_FT_5)),
	aMF5(this,				SW_RES(COL_MF_5)),
	aFT6(this,				SW_RES(COL_FT_6)),
	aMF6(this,				SW_RES(COL_MF_6)),
    aDownBtn(this,          SW_RES(COL_BTN_DOWN)),

    nTableWidth(0),
    nMinWidth( MINLAY ),
    nNoOfCols( 0 ),
	nNoOfVisibleCols( 0 ),
	bModified(sal_False),
	bModifyTbl(sal_False),
    bPercentMode(sal_False)
{
	FreeResource();
	SetExchangeSupport();

	aDownBtn.SetAccessibleRelationMemberOf(&aColFL);
	aUpBtn.SetAccessibleRelationMemberOf(&aColFL);

	pFieldArr[0] = &aMF1;
	pFieldArr[1] = &aMF2;
	pFieldArr[2] = &aMF3;
	pFieldArr[3] = &aMF4;
	pFieldArr[4] = &aMF5;
	pFieldArr[5] = &aMF6;

	pTextArr[0] = &aFT1;
	pTextArr[1] = &aFT2;
	pTextArr[2] = &aFT3;
	pTextArr[3] = &aFT4;
	pTextArr[4] = &aFT5;
	pTextArr[5] = &aFT6;

	const SfxPoolItem* pItem;
	Init((SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, sal_False,&pItem )
		&& ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON));

};
/*------------------------------------------------------------------------
	Beschreibung: Seite Spaltenkonfiguration
------------------------------------------------------------------------*/
 SwTableColumnPage::~SwTableColumnPage()
{
};

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

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwTableColumnPage::Reset( const SfxItemSet& )
{
	const SfxItemSet& rSet = GetItemSet();

	const SfxPoolItem* pItem;
	if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, sal_False, &pItem ))
	{
		pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
		nNoOfVisibleCols = pTblData->GetColCount();
		nNoOfCols = pTblData->GetAllColCount();
        nTableWidth = pTblData->GetAlign() != text::HoriOrientation::FULL &&
                            pTblData->GetAlign() != text::HoriOrientation::LEFT_AND_WIDTH?
						pTblData->GetWidth() : pTblData->GetSpace();

		sal_uInt16 i;
		for( i = 0; i < nNoOfCols; i++ )
		{
			if( pTblData->GetColumns()[i].nWidth  < nMinWidth )
					nMinWidth = pTblData->GetColumns()[i].nWidth;
		}
        sal_Int64 nMinTwips = pFieldArr[0]->NormalizePercent( nMinWidth );
        sal_Int64 nMaxTwips = pFieldArr[0]->NormalizePercent( nTableWidth );
		for( i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
		{
            pFieldArr[i]->SetPrcntValue( pFieldArr[i]->NormalizePercent(
												GetVisibleWidth(i) ), FUNIT_TWIP );
			pFieldArr[i]->SetMin( nMinTwips , FUNIT_TWIP );
			pFieldArr[i]->SetMax( nMaxTwips , FUNIT_TWIP );
			pFieldArr[i]->Enable();
			pTextArr[i]->Enable();
		}

		if( nNoOfVisibleCols > MET_FIELDS )
			aUpBtn.Enable();
		i = nNoOfVisibleCols;
		while( i < MET_FIELDS )
		{
			pFieldArr[i]->SetText( aEmptyStr );
			pTextArr[i]->Hide();
			i++;
		}
	}
	ActivatePage(rSet);

};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwTableColumnPage::Init(sal_Bool bWeb)
{
	FieldUnit aMetric = ::GetDfltMetric(bWeb);
	Link aLkUp = LINK( this, SwTableColumnPage, UpHdl );
	Link aLkDown = LINK( this, SwTableColumnPage, DownHdl );
	Link aLkLF = LINK( this, SwTableColumnPage, LoseFocusHdl );
	for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
	{
		aValueTbl[i] = i;
		SetMetric(*pFieldArr[i], aMetric);
		pFieldArr[i]->SetUpHdl( aLkUp );
		pFieldArr[i]->SetDownHdl( aLkDown );
		pFieldArr[i]->SetLoseFocusHdl( aLkLF );

	}
	SetMetric(aSpaceED, aMetric);

	Link aLk = LINK( this, SwTableColumnPage, AutoClickHdl );
	aUpBtn.SetClickHdl( aLk );
	aDownBtn.SetClickHdl( aLk );

	aLk = LINK( this, SwTableColumnPage, ModeHdl );
	aModifyTableCB .SetClickHdl( aLk );
	aProportionalCB.SetClickHdl( aLk );
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK( SwTableColumnPage, AutoClickHdl, CheckBox *, pBox )
{
	//Anzeigefenster verschieben
	if(pBox == (CheckBox *)&aDownBtn)
	{
		if(aValueTbl[0] > 0)
		{
			for( sal_uInt16 i=0; i < MET_FIELDS; i++ )
				aValueTbl[i] -= 1;
		}
	}
	if(pBox == (CheckBox *)&aUpBtn)
	{
		if( aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1  )
		{
			for(sal_uInt16 i=0;i < MET_FIELDS;i++)
				aValueTbl[i] += 1;
		}
	}
	for( sal_uInt16 i = 0; (i < nNoOfVisibleCols ) && ( i < MET_FIELDS); i++ )
	{
		String sEntry('~');
		String sIndex = String::CreateFromInt32( aValueTbl[i] + 1 );
		sEntry += sIndex;
		pTextArr[i]->SetText( sEntry );
//IAccessibility2 Impplementaton 2009-----
		//added by menghu for SODC_5143,12/12/2006
		String sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH);
		sColumnWidth.SearchAndReplace( DEFINE_CONST_UNICODE("%1"), sIndex );
		pFieldArr[i]->SetAccessibleName( sColumnWidth );
		//end of SODC_5143
//-----IAccessibility2 Impplementaton 2009
	}

	aDownBtn.Enable(aValueTbl[0] > 0);
	aUpBtn.Enable(aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1 );
	UpdateCols(0);
	return 0;
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwTableColumnPage, UpHdl, PercentField *, pEdit )
{
	bModified = sal_True;
	ModifyHdl( pEdit );
	return 0;
};
IMPL_LINK_INLINE_END( SwTableColumnPage, UpHdl, PercentField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwTableColumnPage, DownHdl, PercentField *, pEdit )
{
	bModified = sal_True;
	ModifyHdl( pEdit );
	return 0;
};
IMPL_LINK_INLINE_END( SwTableColumnPage, DownHdl, PercentField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK_INLINE_START( SwTableColumnPage, LoseFocusHdl, PercentField *, pEdit )
{
	if(pEdit->IsModified())
	{
		bModified = sal_True;
		ModifyHdl( pEdit );
	}
	return 0;
};
IMPL_LINK_INLINE_END( SwTableColumnPage, LoseFocusHdl, PercentField *, pEdit )

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
IMPL_LINK( SwTableColumnPage, ModeHdl, CheckBox*, pBox )
{
	sal_Bool bCheck = pBox->IsChecked();
	if(pBox == &aProportionalCB)
	{
		if(bCheck)
			aModifyTableCB.Check();
		aModifyTableCB.Enable(!bCheck && bModifyTbl);
	}
	return 0;
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
sal_Bool  SwTableColumnPage::FillItemSet( SfxItemSet& )
{
	for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
	{
		if(pFieldArr[i]->HasFocus())
		{
			LoseFocusHdl(pFieldArr[i]);
			break;
		}
	}

	if(bModified)
	{
		pTblData->SetColsChanged();
	}
	return bModified;
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void   SwTableColumnPage::ModifyHdl( PercentField* pEdit )
{
		sal_uInt16 nAktPos;
		sal_uInt16 i;

		for( i = 0; i < MET_FIELDS; i++)
			if(pEdit == pFieldArr[i])
				break;

        SetVisibleWidth(aValueTbl[i], static_cast< SwTwips >(pEdit->DenormalizePercent(pEdit->GetValue( FUNIT_TWIP ))) );
		nAktPos = aValueTbl[i];

		UpdateCols( nAktPos );
};

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void   SwTableColumnPage::UpdateCols( sal_uInt16 nAktPos )
{
	SwTwips nSum = 0;
	sal_uInt16 i;

	for( i = 0; i < nNoOfCols; i++ )
	{
		nSum += (pTblData->GetColumns())[i].nWidth;
	}
	SwTwips nDiff = nSum - nTableWidth;

    sal_Bool bModifyTable = aModifyTableCB.IsChecked();
	sal_Bool bProp =    aProportionalCB.IsChecked();

    if(!bModifyTable && !bProp )
	{
//		the table width is constant, the difference is balanced with the other columns
		sal_uInt16 nLoopCount = 0;
		while( nDiff )
		{
			if( ++nAktPos == nNoOfVisibleCols)
			{
				nAktPos = 0;
				++nLoopCount;
				//#i101353# in small tables it might not be possible to balance column width
				if( nLoopCount > 1 )
					break;
			}
			if( nDiff < 0 )
			{
				SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
				nDiff = 0;
			}
			else if( GetVisibleWidth(nAktPos) >= nDiff + nMinWidth )
			{
				SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
				nDiff = 0;
			}
			if( nDiff > 0 && GetVisibleWidth(nAktPos) > nMinWidth )
			{
				if( nDiff >= (GetVisibleWidth(nAktPos) - nMinWidth) )
				{
					nDiff -= (GetVisibleWidth(nAktPos) - nMinWidth);
					SetVisibleWidth(nAktPos, nMinWidth);
				}
				else
				{
					nDiff = 0;
					SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
				}
				DBG_ASSERT(nDiff >= 0, "nDiff < 0 kann hier nicht sein!");
			}
		}
	}
    else if(bModifyTable && !bProp)
	{
//		Differenz wird ueber die Tabellenbreite ausgeglichen,
//		andere Spalten bleiben unveraendert
		DBG_ASSERT(nDiff <= pTblData->GetSpace() - nTableWidth, "Maximum falsch eingestellt" );
		SwTwips nActSpace = pTblData->GetSpace() - nTableWidth;
		if(nDiff > nActSpace)
		{
			nTableWidth = pTblData->GetSpace();
			SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nActSpace );
		}
		else
		{
			nTableWidth += nDiff;
		}
	}
    else if(bModifyTable & bProp)
	{
//		Alle Spalten werden proportional mitveraendert, die Tabellenbreite wird
//  	entsprechend angepasst
		DBG_ASSERT(nDiff * nNoOfVisibleCols <= pTblData->GetSpace() - nTableWidth, "Maximum falsch eingestellt" );
		long nAdd = nDiff;
		if(nDiff * nNoOfVisibleCols > pTblData->GetSpace() - nTableWidth)
		{
			nAdd = (pTblData->GetSpace() - nTableWidth) / nNoOfVisibleCols;
			SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nAdd );
			nDiff = nAdd;
		}
		if(nAdd)
            for(i = 0; i < nNoOfVisibleCols; i++ )
			{
				if(i == nAktPos)
					continue;
				SwTwips nVisWidth;
				if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
				{
					nAdd += nVisWidth - MINLAY;
					SetVisibleWidth(i, MINLAY);
				}
				else
				{
					SetVisibleWidth(i, nVisWidth + nDiff);
					nAdd += nDiff;
				}

			}
		nTableWidth += nAdd;

	}
	else
	{
//		Die Differenz wird gleichmaessig auf alle anderen Spalten aufgeteilt
// 		die Tabellenbreite bleibt konstant
/*
		SwTwips nDiffn = nDiff/(nNoOfVisibleCols - 1);
		if(nDiff < 0 && (nNoOfVisibleCols - 1) * nDiffn != nDiff)
			nDiffn-- ;
		sal_uInt16 nStart = nAktPos++;
		if(nAktPos == nNoOfVisibleCols)
			nStart = 0;
		for(sal_uInt16 i = 0; i < nNoOfVisibleCols; i++ )
		{
			if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
			{
				nAdd += nVisWidth - MINLAY;
				SetVisibleWidth(i, MINLAY);
			}
		}
*/

	}

#ifdef DEBUG_TBLDLG
DbgTblRep(pTblData)
#endif

	if(!bPercentMode)
		aSpaceED.SetValue(aSpaceED.Normalize( pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);

	for( i = 0; ( i < nNoOfVisibleCols ) && ( i < MET_FIELDS ); i++)
	{
        pFieldArr[i]->SetPrcntValue(pFieldArr[i]->NormalizePercent(
						GetVisibleWidth(aValueTbl[i]) ), FUNIT_TWIP);
		pFieldArr[i]->ClearModifyFlag();
	}

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void    SwTableColumnPage::ActivatePage( const SfxItemSet& )
{
	bPercentMode = pTblData->GetWidthPercent() != 0;
	for( sal_uInt16 i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
	{
		pFieldArr[i]->SetRefValue(pTblData->GetWidth());
		pFieldArr[i]->ShowPercent( bPercentMode );
	}

	sal_uInt16 nTblAlign = pTblData->GetAlign();
    if((text::HoriOrientation::FULL != nTblAlign && nTableWidth != pTblData->GetWidth()) ||
    (text::HoriOrientation::FULL == nTblAlign && nTableWidth != pTblData->GetSpace()))
	{
        nTableWidth = text::HoriOrientation::FULL == nTblAlign ?
									pTblData->GetSpace() :
										pTblData->GetWidth();
		UpdateCols(0);
	}
	bModifyTbl = sal_True;
	if(pTblData->GetWidthPercent() ||
                text::HoriOrientation::FULL == nTblAlign ||
						pTblData->IsLineSelected()  )
		bModifyTbl = sal_False;
	if(bPercentMode)
	{
		aModifyTableCB	.Check(sal_False);
		aProportionalCB .Check(sal_False);
	}
	else if( !bModifyTbl )
	{
		aProportionalCB.Check(sal_False);
		aModifyTableCB.Check(sal_False);
	}
	aSpaceFT.Enable(!bPercentMode);
	aSpaceED.Enable(!bPercentMode);
	aModifyTableCB.Enable( !bPercentMode && bModifyTbl );
	aProportionalCB.Enable(!bPercentMode && bModifyTbl );

/*	if(pTblData->IsLineSelected() && pTblData->IsComplex())
	{

	}*/
	aSpaceED.SetValue(aSpaceED.Normalize(
				pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
int  SwTableColumnPage::DeactivatePage( SfxItemSet* _pSet )
{
    if(_pSet)
	{
        FillItemSet(*_pSet);
        if(text::HoriOrientation::FULL != pTblData->GetAlign() && pTblData->GetWidth() != nTableWidth)
		{
			pTblData->SetWidth(nTableWidth);
			SwTwips nDiff = pTblData->GetSpace() - pTblData->GetWidth() -
							pTblData->GetLeftSpace() - pTblData->GetRightSpace();
			switch( pTblData->GetAlign()  )
			{
                case text::HoriOrientation::RIGHT:
					pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff);
				break;
                case text::HoriOrientation::LEFT:
					pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff);
				break;
                case text::HoriOrientation::NONE:
				{
					SwTwips nDiff2 = nDiff/2;
					if( nDiff > 0 ||
						(-nDiff2 < pTblData->GetRightSpace() && - nDiff2 < pTblData->GetLeftSpace()))
					{
						pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff2);
						pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff2);
					}
					else
					{
						if(pTblData->GetRightSpace() > pTblData->GetLeftSpace())
						{
							pTblData->SetLeftSpace(0);
							pTblData->SetRightSpace(pTblData->GetSpace() - pTblData->GetWidth());
						}
						else
						{
							pTblData->SetRightSpace(0);
							pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
						}
					}
				}
				break;
                case text::HoriOrientation::CENTER:
					pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff/2);
					pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff/2);
				break;
                case text::HoriOrientation::LEFT_AND_WIDTH :
					if(nDiff > pTblData->GetRightSpace())
					{
						pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
					}
					pTblData->SetRightSpace(
						pTblData->GetSpace() - pTblData->GetWidth() - pTblData->GetLeftSpace());
				break;
			}
			pTblData->SetWidthChanged();
		}
#ifdef DEBUG_TBLDLG
DbgTblRep(pTblData)
#endif
        _pSet->Put(SwPtrItem( FN_TABLE_REP, pTblData ));
	}
	return sal_True;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
SwTwips  SwTableColumnPage::GetVisibleWidth(sal_uInt16 nPos)
{
	sal_uInt16 i=0;

	while( nPos )
	{
		if(pTblData->GetColumns()[i].bVisible && nPos)
			nPos--;
		i++;
	}
	SwTwips nReturn = pTblData->GetColumns()[i].nWidth;
	DBG_ASSERT(i < nNoOfCols, "Array index out of range");
	while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
		nReturn += pTblData->GetColumns()[++i].nWidth;

//	return (*ppTableColumns)[i].nWidth;
	return nReturn;
}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void SwTableColumnPage::SetVisibleWidth(sal_uInt16 nPos, SwTwips nNewWidth)
{
	sal_uInt16 i=0;
	while( nPos )
	{
		if(pTblData->GetColumns()[i].bVisible && nPos)
			nPos--;
		i++;
	}
	DBG_ASSERT(i < nNoOfCols, "Array index out of range");
	pTblData->GetColumns()[i].nWidth = nNewWidth;
	while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
		pTblData->GetColumns()[++i].nWidth = 0;

}

/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
SwTableTabDlg::SwTableTabDlg(Window* pParent, SfxItemPool& ,
					const SfxItemSet* pItemSet, SwWrtShell* pSh ) :
		SfxTabDialog(pParent, SW_RES(DLG_FORMAT_TABLE), pItemSet,0),
        pShell(pSh),
        nHtmlMode(::GetHtmlMode(pSh->GetView().GetDocShell()))
{
	FreeResource();
    SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
    DBG_ASSERT(pFact, "Dialogdiet fail!");
	AddTabPage(TP_FORMAT_TABLE, &SwFormatTablePage::Create, 0 );
	AddTabPage(TP_TABLE_TEXTFLOW, &SwTextFlowPage::Create, 0 );
	AddTabPage(TP_TABLE_COLUMN, &SwTableColumnPage::Create, 0 );
    AddTabPage(TP_BACKGROUND, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BACKGROUND ), 0 );
    AddTabPage(TP_BORDER, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BORDER ), 0 );
}


/*------------------------------------------------------------------------
------------------------------------------------------------------------*/
void  SwTableTabDlg::PageCreated(sal_uInt16 nId, SfxTabPage& rPage)
{
    SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
	if( TP_BACKGROUND == nId )
	{
        sal_Int32 nFlagType = SVX_SHOW_TBLCTL;
        if(!( nHtmlMode & HTMLMODE_ON ) ||
			nHtmlMode & HTMLMODE_SOME_STYLES)
            nFlagType |= SVX_SHOW_SELECTOR;
        aSet.Put (SfxUInt32Item(SID_FLAG_TYPE, nFlagType));
		rPage.PageCreated(aSet);
	}
	else if(TP_BORDER == nId)
	{
		aSet.Put (SfxUInt16Item(SID_SWMODE_TYPE,SW_BORDER_MODE_TABLE));
		rPage.PageCreated(aSet);
	}
	else if(TP_TABLE_TEXTFLOW == nId)
	{
		((SwTextFlowPage&)rPage).SetShell(pShell);
		const sal_uInt16 eType = pShell->GetFrmType(0,sal_True);
		if( !(FRMTYPE_BODY & eType) )
			((SwTextFlowPage&)rPage).DisablePageBreak();
	}
}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
SwTextFlowPage::SwTextFlowPage( Window* pParent,
								const SfxItemSet& rSet ) :
	SfxTabPage(pParent, SW_RES( TP_TABLE_TEXTFLOW ), rSet ),
    aFlowFL         (this, SW_RES(FL_FLOW            )),
	aPgBrkCB        (this, SW_RES(CB_PAGEBREAK      )),
	aPgBrkRB        (this, SW_RES(RB_BREAKPAGE      )),
	aColBrkRB       (this, SW_RES(RB_BREAKCOLUMN    )),
	aPgBrkBeforeRB  (this, SW_RES(RB_PAGEBREAKBEFORE)),
	aPgBrkAfterRB   (this, SW_RES(RB_PAGEBREAKAFTER )),
	aPageCollCB     (this, SW_RES(CB_PAGECOLL       )),
	aPageCollLB     (this, SW_RES(LB_PAGECOLL       )),
	aPageNoFT       (this, SW_RES(FT_PAGENUM        )),
	aPageNoNF       (this, SW_RES(NF_PAGENUM        )),
    aSplitCB        (this, SW_RES(CB_SPLIT          )),
    aSplitRowCB     (this, SW_RES(CB_SPLIT_ROW      )),
	aKeepCB			(this, SW_RES(CB_KEEP			)),
    aHeadLineCB     (this, SW_RES(CB_HEADLINE       )),
    aRepeatHeaderFT         (this, SW_RES(FT_REPEAT_HEADER  )),
    aRepeatHeaderBeforeFT   (this),
    aRepeatHeaderNF         (this, SW_RES(NF_REPEAT_HEADER  )),
    aRepeatHeaderAfterFT    (this),
    aRepeatHeaderCombo      (this, SW_RES(WIN_REPEAT_HEADER), aRepeatHeaderNF, aRepeatHeaderBeforeFT, aRepeatHeaderAfterFT),
    aTextDirectionFT(this, SW_RES(FT_TEXTDIRECTION  )),
    aTextDirectionLB(this, SW_RES(LB_TEXTDIRECTION  )),

    aVertOrientFL   (this, SW_RES(FL_VERT_ORIENT    )),
    aVertOrientFT(this,  SW_RES(FT_VERTORIENT       )),
    aVertOrientLB(this,  SW_RES(LB_VERTORIENT       )),

    pShell(0),

	bPageBreak(sal_True),
	bHtmlMode(sal_False)
{
	FreeResource();

	aPgBrkRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
	aColBrkRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
	aPgBrkBeforeRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
	aPgBrkAfterRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
	aPageCollLB.SetAccessibleRelationLabeledBy(&aPageCollCB);
	aPageCollLB.SetAccessibleName(aPageCollCB.GetText());

	aPgBrkCB.SetClickHdl(LINK(this, SwTextFlowPage, PageBreakHdl_Impl));
	aPgBrkBeforeRB.SetClickHdl(
		LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
	aPgBrkAfterRB.SetClickHdl(
		LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
	aPageCollCB.SetClickHdl(
		LINK( this, SwTextFlowPage, ApplyCollClickHdl_Impl ) );
	aColBrkRB.SetClickHdl(
		LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
	aPgBrkRB.SetClickHdl(
		LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
    aSplitCB.SetClickHdl(
        LINK( this, SwTextFlowPage, SplitHdl_Impl));
    aSplitRowCB.SetClickHdl(
        LINK( this, SwTextFlowPage, SplitRowHdl_Impl));
	aHeadLineCB.SetClickHdl( LINK( this, SwTextFlowPage, HeadLineCBClickHdl ) );

#ifndef SW_FILEFORMAT_40
	const SfxPoolItem *pItem;
	if(SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, sal_False,&pItem )
		&& ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
#endif
	{
		aKeepCB.Hide();
		aSplitCB.Hide();
        aSplitRowCB.Hide();
	}

	aRepeatHeaderCombo.Arrange( aRepeatHeaderFT );

	HeadLineCBClickHdl();
}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
 SwTextFlowPage::~SwTextFlowPage()
{
}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
SfxTabPage*   SwTextFlowPage::Create( Window* pParent,
								const SfxItemSet& rAttrSet)
{
	return new SwTextFlowPage(pParent, rAttrSet);
}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
sal_Bool  SwTextFlowPage::FillItemSet( SfxItemSet& rSet )
{
	sal_Bool bModified = sal_False;

	//Ueberschrift wiederholen
	if(aHeadLineCB.IsChecked() != aHeadLineCB.GetSavedValue() ||
        String::CreateFromInt32( static_cast< sal_Int32 >(aRepeatHeaderNF.GetValue()) ) != aRepeatHeaderNF.GetSavedValue() )
	{
		bModified |= 0 != rSet.Put(
			SfxUInt16Item(FN_PARAM_TABLE_HEADLINE, aHeadLineCB.IsChecked()? sal_uInt16(aRepeatHeaderNF.GetValue()) : 0 ));
	}
	if(aKeepCB.IsChecked() != aKeepCB.GetSavedValue())
        bModified |= 0 != rSet.Put( SvxFmtKeepItem( aKeepCB.IsChecked(), RES_KEEP));

	if(aSplitCB.IsChecked() != aSplitCB.GetSavedValue())
        bModified |= 0 != rSet.Put( SwFmtLayoutSplit( aSplitCB.IsChecked()));

    if(aSplitRowCB.IsChecked() != aSplitRowCB.GetSavedValue())
        bModified |= 0 != rSet.Put( SwFmtRowSplit( aSplitRowCB.IsChecked()));


	const SvxFmtBreakItem* pBreak = (const SvxFmtBreakItem*)GetOldItem( rSet, RES_BREAK );
	const SwFmtPageDesc* pDesc = (const SwFmtPageDesc*) GetOldItem( rSet, RES_PAGEDESC );


	sal_Bool bState = aPageCollCB.IsChecked();

	//Wenn Seitenvorlage, dann kein Break
	sal_Bool bPageItemPut = sal_False;
	if ( bState != aPageCollCB.GetSavedValue() ||
		 ( bState &&
		   aPageCollLB.GetSelectEntryPos() != aPageCollLB.GetSavedValue() )
		   || (aPageNoNF.IsEnabled() && aPageNoNF.IsValueModified()) )
	{
		String sPage;

		if ( bState )
		{
			sPage = aPageCollLB.GetSelectEntry();
		}
        sal_uInt16 nPgNum = static_cast< sal_uInt16 >(aPageNoNF.GetValue());
		if ( !pDesc || !pDesc->GetPageDesc() ||
			( pDesc->GetPageDesc() && ((pDesc->GetPageDesc()->GetName() != sPage) ||
					aPageNoNF.GetSavedValue() != (String)nPgNum)))
		{
			SwFmtPageDesc aFmt( pShell->FindPageDescByName( sPage, sal_True ) );
			aFmt.SetNumOffset(bState ? nPgNum : 0);
			bModified |= 0 != rSet.Put( aFmt );
			bPageItemPut = bState;
		}
	}
	sal_Bool bIsChecked = aPgBrkCB.IsChecked();
	if ( !bPageItemPut &&
		(	bState != aPageCollCB.GetSavedValue() ||
			bIsChecked != aPgBrkCB.GetSavedValue()				||
			aPgBrkBeforeRB.IsChecked() != aPgBrkBeforeRB.GetSavedValue()	||
			aPgBrkRB.IsChecked() != aPgBrkRB.GetSavedValue() ))
	{
		SvxFmtBreakItem aBreak(
			(const SvxFmtBreakItem&)GetItemSet().Get( RES_BREAK ) );

		if(bIsChecked)
		{
			sal_Bool bBefore = aPgBrkBeforeRB.IsChecked();

			if ( aPgBrkRB.IsChecked() )
			{
				if ( bBefore )
					aBreak.SetValue( SVX_BREAK_PAGE_BEFORE );
				else
					aBreak.SetValue( SVX_BREAK_PAGE_AFTER );
			}
			else
			{
				if ( bBefore )
					aBreak.SetValue( SVX_BREAK_COLUMN_BEFORE );
				else
					aBreak.SetValue( SVX_BREAK_COLUMN_AFTER );
			}
		}
		else
		{
				aBreak.SetValue( SVX_BREAK_NONE );
		}

		if ( !pBreak || !( *(const SvxFmtBreakItem*)pBreak == aBreak ) )
		{
			bModified |= 0 != rSet.Put( aBreak );
		}
	}

    if(aTextDirectionLB.GetSelectEntryPos() != aTextDirectionLB.GetSavedValue())
    {
          bModified |= 0 != rSet.Put(
                    SvxFrameDirectionItem(
                        (SvxFrameDirection)(sal_uLong)aTextDirectionLB.GetEntryData(aTextDirectionLB.GetSelectEntryPos())
                        , FN_TABLE_BOX_TEXTDIRECTION));
    }

    if(aVertOrientLB.GetSelectEntryPos() != aVertOrientLB.GetSavedValue())
    {
        sal_uInt16 nOrient = USHRT_MAX;
        switch(aVertOrientLB.GetSelectEntryPos())
        {
            case 0 : nOrient = text::VertOrientation::NONE; break;
            case 1 : nOrient = text::VertOrientation::CENTER; break;
            case 2 : nOrient = text::VertOrientation::BOTTOM; break;
        }
        if(nOrient != USHRT_MAX)
            bModified |= 0 != rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, nOrient));
    }

	return bModified;

}

/*-----------------12.12.96 12.22-------------------
--------------------------------------------------*/
void   SwTextFlowPage::Reset( const SfxItemSet& rSet )
{
	const SfxPoolItem* pItem;
	SvxHtmlOptions* pHtmlOpt = SvxHtmlOptions::Get();
	sal_Bool bFlowAllowed = !bHtmlMode || pHtmlOpt->IsPrintLayoutExtension();
	if(bFlowAllowed)
	{
		// Einfuegen der vorhandenen Seitenvorlagen in die Listbox
		const sal_uInt16 nCount = pShell->GetPageDescCnt();
		sal_uInt16 i;

		for( i = 0; i < nCount; ++i)
		{
			const SwPageDesc &rPageDesc = pShell->GetPageDesc(i);
			aPageCollLB.InsertEntry(rPageDesc.GetName());
		}

		String aFmtName;
		for(i = RES_POOLPAGE_BEGIN; i < RES_POOLPAGE_END; ++i)
			if( LISTBOX_ENTRY_NOTFOUND == aPageCollLB.GetEntryPos(
					aFmtName = SwStyleNameMapper::GetUIName( i, aFmtName ) ))
				aPageCollLB.InsertEntry( aFmtName );

		if(SFX_ITEM_SET == rSet.GetItemState( RES_KEEP, sal_False, &pItem ))
		{
			aKeepCB.Check( ((const SvxFmtKeepItem*)pItem)->GetValue() );
			aKeepCB.SaveValue();
		}
		if(SFX_ITEM_SET == rSet.GetItemState( RES_LAYOUT_SPLIT, sal_False, &pItem ))
		{
            aSplitCB.Check( ((const SwFmtLayoutSplit*)pItem)->GetValue() );
		}
        else
            aSplitCB.Check();

	    aSplitCB.SaveValue();
        SplitHdl_Impl(&aSplitCB);

        if(SFX_ITEM_SET == rSet.GetItemState( RES_ROW_SPLIT, sal_False, &pItem ))
        {
            aSplitRowCB.Check( ((const SwFmtRowSplit*)pItem)->GetValue() );
        }
        else
            aSplitRowCB.SetState(STATE_DONTKNOW);
        aSplitRowCB.SaveValue();

        if(bPageBreak)
		{
			if(SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, sal_False, &pItem ))
			{
				String sPageDesc;
				const SwPageDesc* pDesc = ((const SwFmtPageDesc*)pItem)->GetPageDesc();
				aPageNoNF.SetValue(((const SwFmtPageDesc*)pItem)->GetNumOffset());
				if(pDesc)
					sPageDesc = pDesc->GetName();
				if ( sPageDesc.Len() &&
						aPageCollLB.GetEntryPos( sPageDesc ) != LISTBOX_ENTRY_NOTFOUND )
				{
					aPageCollLB.SelectEntry( sPageDesc );
					aPageCollCB.Check();

					aPgBrkCB.Enable();
					aPgBrkRB.Enable();
					aColBrkRB.Enable();
					aPgBrkBeforeRB.Enable();
					aPgBrkAfterRB.Enable();
					aPageCollCB.Enable();
					aPgBrkCB.Check();

					aPgBrkCB.Check( sal_True );
					aColBrkRB.Check( sal_False );
					aPgBrkBeforeRB.Check( sal_True );
					aPgBrkAfterRB.Check( sal_False );
				}
				else
				{
					aPageCollLB.SetNoSelection();
					aPageCollCB.Check(sal_False);
				}
			}

			if(SFX_ITEM_SET == rSet.GetItemState( RES_BREAK, sal_False, &pItem ))
			{
				const SvxFmtBreakItem* pPageBreak = (const SvxFmtBreakItem*)pItem;
				SvxBreak eBreak = (SvxBreak)pPageBreak->GetValue();

				if ( eBreak != SVX_BREAK_NONE )
				{
					aPgBrkCB.Check();
					aPageCollCB.Enable(sal_False);
					aPageCollLB.Enable(sal_False);
					aPageNoFT.Enable(sal_False);
					aPageNoNF.Enable(sal_False);
				}
				switch ( eBreak )
				{
					case SVX_BREAK_PAGE_BEFORE:
						aPgBrkRB.Check( sal_True );
						aColBrkRB.Check( sal_False );
						aPgBrkBeforeRB.Check( sal_True );
						aPgBrkAfterRB.Check( sal_False );
						break;
					case SVX_BREAK_PAGE_AFTER:
						aPgBrkRB.Check( sal_True );
						aColBrkRB.Check( sal_False );
						aPgBrkBeforeRB.Check( sal_False );
						aPgBrkAfterRB.Check( sal_True );
						break;
					case SVX_BREAK_COLUMN_BEFORE:
						aPgBrkRB.Check( sal_False );
						aColBrkRB.Check( sal_True );
						aPgBrkBeforeRB.Check( sal_True );
						aPgBrkAfterRB.Check( sal_False );
						break;
					case SVX_BREAK_COLUMN_AFTER:
						aPgBrkRB.Check( sal_False );
						aColBrkRB.Check( sal_True );
						aPgBrkBeforeRB.Check( sal_False );
						aPgBrkAfterRB.Check( sal_True );
						break;
                    default:; //prevent warning
				}

			}
			if ( aPgBrkBeforeRB.IsChecked() )
				PageBreakPosHdl_Impl( &aPgBrkBeforeRB );
			else if ( aPgBrkAfterRB.IsChecked() )
				PageBreakPosHdl_Impl( &aPgBrkAfterRB );
			PageBreakHdl_Impl( &aPgBrkCB );
		}
	}
	else
	{
		aPgBrkRB.Enable(sal_False);
		aColBrkRB.Enable(sal_False);
		aPgBrkBeforeRB.Enable(sal_False);
		aPgBrkAfterRB.Enable(sal_False);
		aKeepCB	.Enable(sal_False);
		aSplitCB.Enable(sal_False);
		aPgBrkCB.Enable(sal_False);
		aPageCollCB.Enable(sal_False);
		aPageCollLB.Enable(sal_False);
	}

	if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, sal_False, &pItem ))
	{
		sal_uInt16 nRep = ((const SfxUInt16Item*)pItem)->GetValue();
		aHeadLineCB.Check( nRep > 0 );
		aHeadLineCB.SaveValue();
		aRepeatHeaderNF.SetValue( nRep );
		aRepeatHeaderNF.SaveValue();
	}
    if ( rSet.GetItemState(FN_TABLE_BOX_TEXTDIRECTION) > SFX_ITEM_AVAILABLE )
    {
        sal_uLong nDirection = ((const SvxFrameDirectionItem&)rSet.Get(FN_TABLE_BOX_TEXTDIRECTION)).GetValue();
        aTextDirectionLB.SelectEntryPos(aTextDirectionLB.GetEntryPos( (const void*)nDirection ));
    }

    if ( rSet.GetItemState(FN_TABLE_SET_VERT_ALIGN) > SFX_ITEM_AVAILABLE )
	{
		sal_uInt16 nVert = ((const SfxUInt16Item&)rSet.Get(FN_TABLE_SET_VERT_ALIGN)).GetValue();
        sal_uInt16 nPos = 0;
		switch(nVert)
		{
            case text::VertOrientation::NONE:     nPos = 0;   break;
            case text::VertOrientation::CENTER:   nPos = 1;   break;
            case text::VertOrientation::BOTTOM:   nPos = 2;   break;
		}
        aVertOrientLB.SelectEntryPos(nPos);
	}

	aPageCollCB.SaveValue();
	aPageCollLB.SaveValue();
	aPgBrkCB.SaveValue();
	aPgBrkRB.SaveValue();
	aColBrkRB.SaveValue();
	aPgBrkBeforeRB.SaveValue();
	aPgBrkAfterRB.SaveValue();
	aPageNoNF.SaveValue();
    aTextDirectionLB.SaveValue();
    aVertOrientLB.SaveValue();

	HeadLineCBClickHdl();
}
/*-----------------16.04.98 14:48-------------------

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

void SwTextFlowPage::SetShell(SwWrtShell* pSh)
{
	pShell = pSh;
	bHtmlMode = 0 != (::GetHtmlMode(pShell->GetView().GetDocShell()) & HTMLMODE_ON);
	if(bHtmlMode)
	{
		aPageNoNF.Enable(sal_False);
		aPageNoFT.Enable(sal_False);
	}
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, PageBreakHdl_Impl, CheckBox*, EMPTYARG )
{
	if( aPgBrkCB.IsChecked() )
	{
			aPgBrkRB.		Enable();
			aColBrkRB.		Enable();
			aPgBrkBeforeRB.	Enable();
			aPgBrkAfterRB.	Enable();

			if ( aPgBrkRB.IsChecked() && aPgBrkBeforeRB.IsChecked() )
			{
				aPageCollCB.Enable();

				sal_Bool bEnable = aPageCollCB.IsChecked() &&
											aPageCollLB.GetEntryCount();
				aPageCollLB.Enable(bEnable);
				if(!bHtmlMode)
				{
					aPageNoFT.Enable(bEnable);
					aPageNoNF.Enable(bEnable);
				}
			}
	}
	else
	{
			aPageCollCB.Check( sal_False );
			aPageCollCB.Enable(sal_False);
			aPageCollLB.Enable(sal_False);
			aPageNoFT.Enable(sal_False);
			aPageNoNF.Enable(sal_False);
			aPgBrkRB.		Enable(sal_False);
			aColBrkRB.		Enable(sal_False);
			aPgBrkBeforeRB.	Enable(sal_False);
			aPgBrkAfterRB.	Enable(sal_False);
	}
	return 0;
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, ApplyCollClickHdl_Impl, CheckBox*, EMPTYARG )
{
	sal_Bool bEnable = sal_False;
	if ( aPageCollCB.IsChecked() &&
		 aPageCollLB.GetEntryCount() )
	{
		bEnable = sal_True;
		aPageCollLB.SelectEntryPos( 0 );
	}
	else
	{
		aPageCollLB.SetNoSelection();
	}
	aPageCollLB.Enable(bEnable);
	if(!bHtmlMode)
	{
		aPageNoFT.Enable(bEnable);
		aPageNoNF.Enable(bEnable);
	}
	return 0;
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, PageBreakPosHdl_Impl, RadioButton*, pBtn )
{
	if ( aPgBrkCB.IsChecked() )
	{
        if ( pBtn == &aPgBrkBeforeRB && aPgBrkRB.IsChecked() )
		{
			aPageCollCB.Enable();

			sal_Bool bEnable = aPageCollCB.IsChecked()  &&
										aPageCollLB.GetEntryCount();

			aPageCollLB.Enable(bEnable);
			if(!bHtmlMode)
			{
				aPageNoFT.Enable(bEnable);
				aPageNoNF.Enable(bEnable);
			}
		}
		else if ( pBtn == &aPgBrkAfterRB )
		{
			aPageCollCB	.Check( sal_False );
			aPageCollCB	.Enable(sal_False);
			aPageCollLB	.Enable(sal_False);
			aPageNoFT 	.Enable(sal_False);
			aPageNoNF	.Enable(sal_False);
		}
	}
	return 0;
}

/*-----------------12.12.96 16.18-------------------
--------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, PageBreakTypeHdl_Impl, RadioButton*, pBtn )
{
	if ( pBtn == &aColBrkRB || aPgBrkAfterRB.IsChecked() )
	{
		aPageCollCB	.Check(sal_False);
		aPageCollCB	.Enable(sal_False);
		aPageCollLB	.Enable(sal_False);
		aPageNoFT	.Enable(sal_False);
		aPageNoNF	.Enable(sal_False);
	}
	else if ( aPgBrkBeforeRB.IsChecked() )
		PageBreakPosHdl_Impl( &aPgBrkBeforeRB );
	return 0;
}
/*-----------------17.11.2003 11:30-----------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, SplitHdl_Impl, CheckBox*, pBox )
{
    aSplitRowCB.Enable(pBox->IsChecked());
    return 0;
}
/*-----------------17.11.2003 11:30-----------------
 *
 * --------------------------------------------------*/
IMPL_LINK( SwTextFlowPage, SplitRowHdl_Impl, TriStateBox*, pBox )
{
    pBox->EnableTriState(sal_False);
    return 0;
}

IMPL_LINK( SwTextFlowPage, HeadLineCBClickHdl, void*, EMPTYARG )
{
	aRepeatHeaderCombo.Enable(aHeadLineCB.IsChecked());

	return 0;
}

/*-----------------30.05.97 07:37-------------------

--------------------------------------------------*/
void SwTextFlowPage::DisablePageBreak()
{
	bPageBreak = sal_False;
	aPgBrkCB       .Disable();
	aPgBrkRB       .Disable();
	aColBrkRB      .Disable();
	aPgBrkBeforeRB .Disable();
	aPgBrkAfterRB  .Disable();
	aPageCollCB    .Disable();
	aPageCollLB    .Disable();
	aPageNoFT      .Disable();
	aPageNoNF      .Disable();
}



