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


#include <tools/list.hxx>

#include <hintids.hxx>
#include "uitool.hxx"
#include <sfx2/app.hxx>
#include <svx/rulritem.hxx>
#include <editeng/tstpitem.hxx>
#include <sfx2/request.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/boxitem.hxx>
#include <editeng/frmdiritem.hxx>
#include <svl/eitem.hxx>
#include <svl/whiter.hxx>
#include <svx/ruler.hxx>
#include <editeng/protitem.hxx>
#include <svl/rectitem.hxx>
#include <sfx2/bindings.hxx>
#include <fmtfsize.hxx>
#include <fmthdft.hxx>
#include <fmtclds.hxx>
#include <fmtornt.hxx>
#include <frmatr.hxx>
#include <edtwin.hxx>
#include "view.hxx"
#include "wrtsh.hxx"
#include "basesh.hxx"
#include "cmdid.h"
#include "viewopt.hxx"
#include "tabcol.hxx"
#include "frmfmt.hxx"		// FrameFormat
#include "pagedesc.hxx"		// Aktuelles Seitenformat
#include "wview.hxx"
#include "fmtcol.hxx"
#include "section.hxx"

// -> #i23726#
#include "ndtxt.hxx"
#include "pam.hxx"
// <- #i23726#

#include <IDocumentSettingAccess.hxx>

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


/*--------------------------------------------------------------------
	Beschreibung:	Debug-Methode
 --------------------------------------------------------------------*/


/*--------------------------------------------------------------------
	Beschreibung:	Columns eintueten
 --------------------------------------------------------------------*/


void lcl_FillSvxColumn(const SwFmtCol& rCol,
						  sal_uInt16 nTotalWidth,
						  SvxColumnItem& rColItem,
						  long nDistance)
{
	const SwColumns& rCols = rCol.GetColumns();
	sal_uInt16 nWidth = 0;

    sal_Bool bOrtho = rCol.IsOrtho() && rCols.Count();
    long nInnerWidth = 0;
    if( bOrtho )
    {
        nInnerWidth = nTotalWidth;
        for ( sal_uInt16 i = 0; i < rCols.Count(); ++i )
        {
            SwColumn* pCol = rCols[i];
            nInnerWidth -= pCol->GetLeft() + pCol->GetRight();
        }
        if( nInnerWidth < 0 )
            nInnerWidth = 0;
        else
            nInnerWidth /= rCols.Count();
    }
    for ( sal_uInt16 i = 0; i < rCols.Count(); ++i )
    {
        SwColumn* pCol = rCols[i];
        const sal_uInt16 nStart = sal_uInt16(pCol->GetLeft() + nWidth + nDistance);
        if( bOrtho )
            nWidth = static_cast< sal_uInt16 >(nWidth + nInnerWidth + pCol->GetLeft() + pCol->GetRight());
        else
            nWidth = static_cast< sal_uInt16 >(nWidth + rCol.CalcColWidth(i, nTotalWidth));
        const sal_uInt16 nEnd = sal_uInt16(nWidth - pCol->GetRight() + nDistance);

        SvxColumnDescription aColDesc(nStart, nEnd, sal_True);
        rColItem.Append(aColDesc);
    }
}

/*--------------------------------------------------------------------
	Beschreibung:	ColumnItem in ColumnInfo ueberfuehren
 --------------------------------------------------------------------*/


void lcl_ConvertToCols(const SvxColumnItem& rColItem,
						  sal_uInt16 nTotalWidth,
						  SwFmtCol& rCols)
{
	ASSERT( rCols.GetNumCols() == rColItem.Count(), "Column count mismatch" );
    // #126939# ruler executes that change the columns shortly after the selection has changed
    // can result in a crash
    if(rCols.GetNumCols() != rColItem.Count())
        return;

	sal_uInt16 nLeft 	= 0;
	SwTwips nSumAll= 0;  // Summiere alle Spalten und Raender auf

	SwColumns& rArr = rCols.GetColumns();

	// Tabcols der Reihe nach
	for( sal_uInt16 i=0; i < rColItem.Count()-1; ++i )
	{
		DBG_ASSERT(rColItem[i+1].nStart >= rColItem[i].nEnd,"\201berlappende Spalten" );
        sal_uInt16 nStart = static_cast< sal_uInt16 >(rColItem[i+1].nStart);
        sal_uInt16 nEnd = static_cast< sal_uInt16 >(rColItem[i].nEnd);
		if(nStart < nEnd)
			nStart = nEnd;
		const sal_uInt16 nDiff	= nStart - nEnd;
		const sal_uInt16 nRight = nDiff / 2;

        sal_uInt16 nWidth = static_cast< sal_uInt16 >(rColItem[i].nEnd - rColItem[i].nStart);
		nWidth += nLeft + nRight;

		SwColumn* pCol = rArr[i];
		pCol->SetWishWidth( sal_uInt16(long(rCols.GetWishWidth()) * long(nWidth) /
															long(nTotalWidth) ));
		pCol->SetLeft( nLeft );
		pCol->SetRight( nRight );
		nSumAll += pCol->GetWishWidth();

		nLeft = nRight;
	}
	rArr[rColItem.Count()-1]->SetLeft( nLeft );

	//Die Differenz aus der Gesamtwunschbreite und der Summe der bisher berechneten
	// Spalten und Raender sollte die Breite der letzten Spalte ergeben.
	rArr[rColItem.Count()-1]->SetWishWidth( rCols.GetWishWidth() - (sal_uInt16)nSumAll );

	rCols.SetOrtho(sal_False, 0, 0 );
}

/*--------------------------------------------------------------------
	Beschreibung:	Tabs loeschen
 --------------------------------------------------------------------*/


void lcl_EraseDefTabs(SvxTabStopItem& rTabStops)
{
	// Def Tabs loeschen
	for ( sal_uInt16 i = 0; i < rTabStops.Count(); )
	{
		// Hier auch den DefTab auf Null rausschmeissen
		if ( SVX_TAB_ADJUST_DEFAULT == rTabStops[i].GetAdjustment() ||
			rTabStops[i].GetTabPos() == 0 )
		{
			rTabStops.Remove(i);
			continue;
		}
		++i;
	}
}

/*--------------------------------------------------------------------
	Beschreibung:	Seitenrand umdrehen
 --------------------------------------------------------------------*/


void SwView::SwapPageMargin(const SwPageDesc& rDesc, SvxLRSpaceItem& rLRSpace)
{
    sal_uInt16 nPhyPage, nVirPage;
    GetWrtShell().GetPageNum( nPhyPage, nVirPage );

    if ( rDesc.GetUseOn() == nsUseOnPage::PD_MIRROR && (nPhyPage % 2) == 0 )
    {
        long nTmp = rLRSpace.GetRight();
        rLRSpace.SetRight( rLRSpace.GetLeft() );
        rLRSpace.SetLeft( nTmp );
    }
}

/*--------------------------------------------------------------------
	Beschreibung:	Wenn der Rahmenrand verschoben wird, sollen die
					Spaltentrenner an der gleichen absoluten Position bleiben
 --------------------------------------------------------------------*/


void lcl_Scale(long& nVal, long nScale)
{
	nVal *= nScale;
	nVal >>= 8;
}

void ResizeFrameCols(SwFmtCol& rCol,
					long nOldWidth,
					long nNewWidth,
					long nLeftDelta )
{
	SwColumns& rArr = rCol.GetColumns();
	long nWishSum = (long)rCol.GetWishWidth();
	long nWishDiff = (nWishSum * 100/nOldWidth * nNewWidth) / 100 - nWishSum;
	long nNewWishWidth = nWishSum + nWishDiff;
	if(nNewWishWidth > 0xffffl)
	{
		// wenn die Wunschbreite zu gross wird, dann muessen alle Werte passend skaliert werden
		long nScale = (0xffffl << 8)/ nNewWishWidth;
		for(sal_uInt16 i = 0; i < rArr.Count(); i++)
		{
			SwColumn* pCol = rArr.GetObject(i);
			long nVal = pCol->GetWishWidth();
			lcl_Scale(nVal, nScale);
			pCol->SetWishWidth((sal_uInt16) nVal);
			nVal = pCol->GetLeft();
			lcl_Scale(nVal, nScale);
			pCol->SetLeft((sal_uInt16) nVal);
			nVal = pCol->GetRight();
			lcl_Scale(nVal, nScale);
			pCol->SetRight((sal_uInt16) nVal);
		}
		lcl_Scale(nNewWishWidth, nScale);
		lcl_Scale(nWishDiff, nScale);
	}
	rCol.SetWishWidth( (sal_uInt16) (nNewWishWidth) );

	if( nLeftDelta >= 2 || nLeftDelta <= -2)
		rArr[0]->SetWishWidth(rArr[0]->GetWishWidth() + (sal_uInt16)nWishDiff);
	else
		rArr[rArr.Count()-1]->SetWishWidth(rArr[rArr.Count()-1]->GetWishWidth() + (sal_uInt16)nWishDiff);
    //reset auto width
    rCol.SetOrtho(sal_False, 0, 0 );
}
/*--------------------------------------------------------------------
	Beschreibung:	Hier werden alle Aenderungen der Tableiste
					wieder in das Modell geschossen
 --------------------------------------------------------------------*/


void SwView::ExecTabWin( SfxRequest& rReq )
{
    SwWrtShell &rSh 		= GetWrtShell();
    const sal_uInt16 nFrmType	= rSh.IsObjSelected() ?
                                    FRMTYPE_DRAWOBJ :
                                        rSh.GetFrmType(0,sal_True);
    const sal_Bool bFrmSelection = rSh.IsFrmSelected();
    const sal_Bool bBrowse = rSh.GetViewOptions()->getBrowseMode();

    const sal_uInt16 nSlot 	  	= rReq.GetSlot();
    const SfxItemSet* pReqArgs = rReq.GetArgs();
    const sal_uInt16 nDescId  	= rSh.GetCurPageDesc();
    const SwPageDesc& rDesc = rSh.GetPageDesc( nDescId );

    const sal_Bool bVerticalWriting = rSh.IsInVerticalText();
    const SwFmtHeader& rHeaderFmt = rDesc.GetMaster().GetHeader();
    SwFrmFmt *pHeaderFmt = (SwFrmFmt*)rHeaderFmt.GetHeaderFmt();

    const SwFmtFooter& rFooterFmt = rDesc.GetMaster().GetFooter();
    SwFrmFmt *pFooterFmt = (SwFrmFmt*)rFooterFmt.GetFooterFmt();

    const SwFmtFrmSize &rFrmSize = rDesc.GetMaster().GetFrmSize();

    const SwRect& rPageRect = rSh.GetAnyCurRect(RECT_PAGE);
    const long nPageWidth  = bBrowse ? rPageRect.Width() : rFrmSize.GetWidth();
    const long nPageHeight = bBrowse ? rPageRect.Height() : rFrmSize.GetHeight();

    sal_Bool bUnlockView = sal_False;
    rSh.StartAllAction();
    sal_Bool bSect = 0 != (nFrmType & FRMTYPE_COLSECT);

    switch( nSlot )
    {
    case SID_ATTR_LONG_LRSPACE:
        if ( pReqArgs )
        {
            SvxLongLRSpaceItem aLongLR( (const SvxLongLRSpaceItem&)pReqArgs->
                Get( SID_ATTR_LONG_LRSPACE ) );
            SvxLRSpaceItem aLR(RES_LR_SPACE);
            if ( !bSect && (bFrmSelection || nFrmType & FRMTYPE_FLY_ANY) )
            {
                SwFrmFmt* pFmt = ((SwFrmFmt*)rSh.GetFlyFrmFmt());
                const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED);

                sal_Bool bVerticalFrame(sal_False);
                {
                    sal_Bool bRTL;
                    sal_Bool bVertL2R;
                    bVerticalFrame = ( bFrmSelection &&
                        rSh.IsFrmVertical(sal_True, bRTL, bVertL2R) ) ||
                        ( !bFrmSelection && bVerticalWriting);
                }
                long nDeltaX = bVerticalFrame ?
                    rRect.Right() - rPageRect.Right() + aLongLR.GetRight() :
                    rPageRect.Left() + aLongLR.GetLeft() - rRect.Left();

                SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
                    RES_VERT_ORIENT, RES_HORI_ORIENT,
                    RES_COL, RES_COL, 0 );

                if(bVerticalFrame)
                {
                    SwFmtVertOrient aVertOrient(pFmt->GetVertOrient());
                    aVertOrient.SetVertOrient(text::VertOrientation::NONE);
                    aVertOrient.SetPos(aVertOrient.GetPos() + nDeltaX );
                    aSet.Put( aVertOrient );
                }
                else
                {
                    SwFmtHoriOrient aHoriOrient( pFmt->GetHoriOrient() );
                    aHoriOrient.SetHoriOrient( text::HoriOrientation::NONE );
                    aHoriOrient.SetPos( aHoriOrient.GetPos() + nDeltaX );
                    aSet.Put( aHoriOrient );
                }

                SwFmtFrmSize aSize( pFmt->GetFrmSize() );
                long nOldWidth = (long) aSize.GetWidth();

                if(aSize.GetWidthPercent())
                {
                    SwRect aRect;
                    rSh.CalcBoundRect(aRect, FLY_AS_CHAR);
                    long nPrtWidth = aRect.Width();
                    aSize.SetWidthPercent(sal_uInt8((nPageWidth - aLongLR.GetLeft() - aLongLR.GetRight()) * 100 /nPrtWidth));
                }
                else
                    aSize.SetWidth( nPageWidth -
                    (aLongLR.GetLeft() + aLongLR.GetRight()));

                if( nFrmType & FRMTYPE_COLUMN )
                {
                    SwFmtCol aCol(pFmt->GetCol());

                    ::ResizeFrameCols(aCol, nOldWidth, (long)aSize.GetWidth(), nDeltaX );
                    aSet.Put(aCol);
                }

                aSet.Put( aSize );

                rSh.StartAction();
                rSh.Push();
                rSh.SetFlyFrmAttr( aSet );
                //die Rahmenselektion wieder aufheben
                if(!bFrmSelection && rSh.IsFrmSelected())
                {
                    rSh.UnSelectFrm();
                    rSh.LeaveSelFrmMode();
                }
                rSh.Pop();
                rSh.EndAction();
            }
            else if ( nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER ))
            {
                // Seitenraender rausrechnen
                long nOld = rDesc.GetMaster().GetLRSpace().GetLeft();
                aLongLR.SetLeft( nOld > aLongLR.GetLeft() ? 0 : aLongLR.GetLeft() - nOld );

                nOld = rDesc.GetMaster().GetLRSpace().GetRight();
                aLongLR.SetRight( nOld > (sal_uInt16)aLongLR.GetRight() ? 0 : aLongLR.GetRight() - nOld );
                aLR.SetLeft((sal_uInt16)aLongLR.GetLeft());
                aLR.SetRight((sal_uInt16)aLongLR.GetRight());

                if ( nFrmType & FRMTYPE_HEADER && pHeaderFmt )
                    pHeaderFmt->SetFmtAttr( aLR );
                else if( nFrmType & FRMTYPE_FOOTER && pFooterFmt )
                    pFooterFmt->SetFmtAttr( aLR );
            }
            else if( nFrmType == FRMTYPE_DRAWOBJ)
            {
                SwRect aRect( rSh.GetObjRect() );
                aRect.Left( aLongLR.GetLeft() + rPageRect.Left() );
                aRect.Right( rPageRect.Right() - aLongLR.GetRight());
                rSh.SetObjRect( aRect );
            }
            else if(bSect || rSh.IsDirectlyInSection())
            {
                //change the section indents and the columns if available
                //at first determine the changes
                SwRect aSectRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, 0);
                const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, 0);
                aSectRect.Pos() += aTmpRect.Pos();
                long nLeftDiff = aLongLR.GetLeft() - (long)(aSectRect.Left() - rPageRect.Left() );
                long nRightDiff = aLongLR.GetRight() - (long)( rPageRect.Right() - aSectRect.Right());
                //change the LRSpaceItem of the section accordingly
                const SwSection* pCurrSect = rSh.GetCurrSection();
                const SwSectionFmt* pSectFmt = pCurrSect->GetFmt();
                SvxLRSpaceItem aLRTmp = pSectFmt->GetLRSpace();
                aLRTmp.SetLeft(aLRTmp.GetLeft() + nLeftDiff);
                aLRTmp.SetRight(aLRTmp.GetRight() + nRightDiff);
                SfxItemSet aSet(rSh.GetAttrPool(), RES_LR_SPACE, RES_LR_SPACE, RES_COL, RES_COL, 0L);
                aSet.Put(aLRTmp);
                //change the first/last column
                if(bSect)
                {
                    SwFmtCol aCols( pSectFmt->GetCol() );
                    long nDiffWidth = nLeftDiff + nRightDiff;
                    ::ResizeFrameCols(aCols, aSectRect.Width(), aSectRect.Width() - nDiffWidth, nLeftDiff );
                    aSet.Put( aCols );
                }
                SwSectionData aData(*pCurrSect);
                rSh.UpdateSection(rSh.GetSectionFmtPos(*pSectFmt), aData, &aSet);
            }
            else
            {	// Seitenraender einstellen
                aLR.SetLeft((sal_uInt16)aLongLR.GetLeft());
                aLR.SetRight((sal_uInt16)aLongLR.GetRight());
                SwapPageMargin( rDesc, aLR );
                SwPageDesc aDesc( rDesc );
                aDesc.GetMaster().SetFmtAttr( aLR );
                rSh.ChgPageDesc( nDescId, aDesc );
            }
        }
        break;

        // apply new left and right margins to current page style
    case SID_ATTR_PAGE_LRSPACE:
        if ( pReqArgs )
        {
            const SvxLongLRSpaceItem aLongLR( static_cast<const SvxLongLRSpaceItem&>(pReqArgs->Get( SID_ATTR_PAGE_LRSPACE )) );

            SwPageDesc aDesc( rDesc );
            {
                SvxLRSpaceItem aLR( RES_LR_SPACE );
                aLR.SetLeft((sal_uInt16)aLongLR.GetLeft());
                aLR.SetRight((sal_uInt16)aLongLR.GetRight());
                SwapPageMargin( rDesc, aLR );
                aDesc.GetMaster().SetFmtAttr( aLR );
            }
            rSh.ChgPageDesc( nDescId, aDesc );
        }
        break;

    case SID_ATTR_LONG_ULSPACE:
        if ( pReqArgs )
        {
            SvxLongULSpaceItem aLongULSpace( (const SvxLongULSpaceItem&)pReqArgs->
                Get( SID_ATTR_LONG_ULSPACE ));

            if( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
            {
                SwFrmFmt* pFmt = ((SwFrmFmt*)rSh.GetFlyFrmFmt());
                const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED);
                const long nDeltaY = rPageRect.Top() + aLongULSpace.GetUpper() - rRect.Top();
                const long nHeight = nPageHeight - (aLongULSpace.GetUpper() + aLongULSpace.GetLower());

                SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
                    RES_VERT_ORIENT, RES_HORI_ORIENT, 0 );
                //which of the orientation attributes is to be put depends on the frame's environment
                sal_Bool bRTL;
                sal_Bool bVertL2R;
                if ( ( bFrmSelection &&
                    rSh.IsFrmVertical(sal_True, bRTL, bVertL2R ) ) ||
                    ( !bFrmSelection && bVerticalWriting ) )
                {
                    SwFmtHoriOrient aHoriOrient(pFmt->GetHoriOrient());
                    aHoriOrient.SetHoriOrient(text::HoriOrientation::NONE);
                    aHoriOrient.SetPos(aHoriOrient.GetPos() + nDeltaY );
                    aSet.Put( aHoriOrient );
                }
                else
                {
                    SwFmtVertOrient aVertOrient(pFmt->GetVertOrient());
                    aVertOrient.SetVertOrient(text::VertOrientation::NONE);
                    aVertOrient.SetPos(aVertOrient.GetPos() + nDeltaY );
                    aSet.Put( aVertOrient );
                }
                SwFmtFrmSize aSize(pFmt->GetFrmSize());
                if(aSize.GetHeightPercent())
                {
                    SwRect aRect;
                    rSh.CalcBoundRect(aRect, FLY_AS_CHAR);
                    long nPrtHeight = aRect.Height();
                    aSize.SetHeightPercent(sal_uInt8(nHeight * 100 /nPrtHeight));
                }
                else
                    aSize.SetHeight(nHeight );

                aSet.Put( aSize );
                rSh.SetFlyFrmAttr( aSet );
            }
            else if( nFrmType == FRMTYPE_DRAWOBJ )
            {
                SwRect aRect( rSh.GetObjRect() );
                aRect.Top( aLongULSpace.GetUpper() + rPageRect.Top() );
                aRect.Bottom( rPageRect.Bottom() - aLongULSpace.GetLower() );
                rSh.SetObjRect( aRect ) ;
            }
            else if(bVerticalWriting && (bSect || rSh.IsDirectlyInSection()))
            {
                //change the section indents and the columns if available
                //at first determine the changes
                SwRect aSectRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, 0);
                const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, 0);
                aSectRect.Pos() += aTmpRect.Pos();
                const long nLeftDiff = aLongULSpace.GetUpper() - (long)(aSectRect.Top() - rPageRect.Top());
                const long nRightDiff = aLongULSpace.GetLower() - (long)(nPageHeight - aSectRect.Bottom() + rPageRect.Top());
                //change the LRSpaceItem of the section accordingly
                const SwSection* pCurrSect = rSh.GetCurrSection();
                const SwSectionFmt* pSectFmt = pCurrSect->GetFmt();
                SvxLRSpaceItem aLR = pSectFmt->GetLRSpace();
                aLR.SetLeft(aLR.GetLeft() + nLeftDiff);
                aLR.SetRight(aLR.GetRight() + nRightDiff);
                SfxItemSet aSet(rSh.GetAttrPool(), RES_LR_SPACE, RES_LR_SPACE, RES_COL, RES_COL, 0L);
                aSet.Put(aLR);
                //change the first/last column
                if(bSect)
                {
                    SwFmtCol aCols( pSectFmt->GetCol() );
                    long nDiffWidth = nLeftDiff + nRightDiff;
                    ::ResizeFrameCols(aCols, aSectRect.Height(), aSectRect.Height() - nDiffWidth, nLeftDiff );
                    aSet.Put( aCols );
                }
                SwSectionData aData(*pCurrSect);
                rSh.UpdateSection(rSh.GetSectionFmtPos(*pSectFmt), aData, &aSet);
            }
            else
            {	SwPageDesc aDesc( rDesc );

            if ( nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER ))
            {

                const sal_Bool bHead = nFrmType & FRMTYPE_HEADER ? sal_True : sal_False;
                SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() );
                if ( bHead )
                    aUL.SetUpper( (sal_uInt16)aLongULSpace.GetUpper() );
                else
                    aUL.SetLower( (sal_uInt16)aLongULSpace.GetLower() );
                aDesc.GetMaster().SetFmtAttr( aUL );

                if( (bHead && pHeaderFmt) || (!bHead && pFooterFmt) )
                {
                    SwFmtFrmSize aSz( bHead ? pHeaderFmt->GetFrmSize() :
                        pFooterFmt->GetFrmSize() );
                    aSz.SetHeightSizeType( ATT_FIX_SIZE );
                    aSz.SetHeight(nPageHeight - aLongULSpace.GetLower() -
                        aLongULSpace.GetUpper() );
                    if ( bHead )
                        pHeaderFmt->SetFmtAttr( aSz );
                    else
                        pFooterFmt->SetFmtAttr( aSz );
                }
            }
            else
            {
                SvxULSpaceItem aUL(RES_UL_SPACE);
                aUL.SetUpper((sal_uInt16)aLongULSpace.GetUpper());
                aUL.SetLower((sal_uInt16)aLongULSpace.GetLower());
                aDesc.GetMaster().SetFmtAttr(aUL);
            }

            rSh.ChgPageDesc( nDescId, aDesc );
            }
        }
        break;

        // apply new top and bottom margins to current page style
    case SID_ATTR_PAGE_ULSPACE:
        if ( pReqArgs )
        {
            SvxLongULSpaceItem aLongULSpace(
                static_cast<const SvxLongULSpaceItem&>(pReqArgs->Get( SID_ATTR_PAGE_ULSPACE ) ) );

            SwPageDesc aDesc( rDesc );
            {
                SvxULSpaceItem aUL(RES_UL_SPACE);
                aUL.SetUpper((sal_uInt16)aLongULSpace.GetUpper());
                aUL.SetLower((sal_uInt16)aLongULSpace.GetLower());
                aDesc.GetMaster().SetFmtAttr(aUL);
            }
            rSh.ChgPageDesc( nDescId, aDesc );
        }
        break;

    case SID_ATTR_PAGE_COLUMN:
        if ( pReqArgs )
        {
            const SfxInt16Item aColumnItem( (const SfxInt16Item&)pReqArgs->Get(nSlot) );
            const sal_uInt16 nPageColumnType = aColumnItem.GetValue();

            // nPageColumnType =
            // 1 - single-columned page
            // 2 - two-columned page
            // 3 - three-columned page
            // 4 - two-columned page with left column width of 2/3 of page width
            // 5 - two-columned page with right column width of 2/3 of page width

            sal_uInt16 nCount = 2;
            if ( nPageColumnType == 1 )
            {
                nCount = 0;
            }
            else if ( nPageColumnType == 3 )
            {
                nCount = 3;
            }

            const sal_uInt16 nGutterWidth = 0;

            const SvxLRSpaceItem aLR( rDesc.GetMaster().GetLRSpace() );
            const long nLeft = aLR.GetLeft();
            const long nRight = aLR.GetRight();
            const long nWidth = nPageWidth - nLeft - nRight;

            SwFmtCol aCols( rDesc.GetMaster().GetCol() );
            aCols.Init( nCount, nGutterWidth, nWidth );
            aCols.SetWishWidth( nWidth );
            aCols.SetGutterWidth( nGutterWidth, nWidth );
            aCols.SetOrtho( sal_False, nGutterWidth, nWidth );

            long nColumnLeft = 0;
            long nColumnRight = 0;
            if ( nPageColumnType == 4 )
            {
                nColumnRight = (long)(nWidth/3);
                nColumnLeft = nWidth - nColumnRight;
                aCols.GetColumns()[0]->SetWishWidth( nColumnLeft );
                aCols.GetColumns()[1]->SetWishWidth( nColumnRight );
            }
            else if ( nPageColumnType == 5 )
            {
                nColumnLeft = (long)(nWidth/3);
                nColumnRight = nWidth - nColumnLeft;
                aCols.GetColumns()[0]->SetWishWidth( nColumnLeft );
                aCols.GetColumns()[1]->SetWishWidth( nColumnRight );
            }

            SwPageDesc aDesc( rDesc );
            aDesc.GetMaster().SetFmtAttr( aCols );
            rSh.ChgPageDesc( rSh.GetCurPageDesc(), aDesc );
        }
        break;

    case SID_ATTR_TABSTOP_VERTICAL:
    case SID_ATTR_TABSTOP:
        if ( pReqArgs )
        {
            sal_uInt16 nWhich = GetPool().GetWhich(nSlot);
            SvxTabStopItem aTabStops( (const SvxTabStopItem&)pReqArgs->
                Get( nWhich ));
            aTabStops.SetWhich(RES_PARATR_TABSTOP);
            const SvxTabStopItem& rDefTabs =
                (const SvxTabStopItem&)rSh.GetDefault(RES_PARATR_TABSTOP);

            // Default-Tab an Pos 0
            SfxItemSet aSet( GetPool(), RES_LR_SPACE, RES_LR_SPACE );
            rSh.GetCurAttr( aSet );
            const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)aSet.Get(RES_LR_SPACE);

            if ( rLR.GetTxtFirstLineOfst() < 0 )
            {
                SvxTabStop aSwTabStop( 0, SVX_TAB_ADJUST_DEFAULT );
                aTabStops.Insert( aSwTabStop );
            }

            // auffuellen mit Default-Tabs
            sal_uInt16 nDef = ::GetTabDist( rDefTabs );
            ::MakeDefTabs( nDef, aTabStops );

            SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
            if(	pColl && pColl->IsAutoUpdateFmt() )
            {
                SfxItemSet aTmp(GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP);
                aTmp.Put(aTabStops);
                rSh.AutoUpdatePara( pColl, aTmp );
            }
            else
                rSh.SetAttr( aTabStops );
            break;
        }

    case SID_ATTR_PARA_LRSPACE_VERTICAL:
    case SID_ATTR_PARA_LRSPACE:
        if ( pReqArgs )
        {
            SvxLRSpaceItem aParaMargin((const SvxLRSpaceItem&)pReqArgs->Get(nSlot));
            if(nFrmType & FRMTYPE_FLY_ANY)
            {
                sal_Bool bFirstColumn = sal_True;
                sal_Bool bLastColumn = sal_True;
                if(nFrmType & FRMTYPE_COLUMN)
                {
                    sal_uInt16 nCurFrameCol = rSh.GetCurColNum() - 1;
                    bFirstColumn = !nCurFrameCol;
                    const SwFrmFmt* pFmt =  rSh.GetFlyFrmFmt();
                    const SwFmtCol* pCols = &pFmt->GetCol();
                    const SwColumns& rCols = pCols->GetColumns();
                    sal_uInt16 nColumnCount = rCols.Count();
                    bLastColumn = nColumnCount == nCurFrameCol + 1;
                }
            }
            aParaMargin.SetRight( aParaMargin.GetRight() - nRightBorderDistance );
            aParaMargin.SetTxtLeft(aParaMargin.GetTxtLeft() - nLeftBorderDistance );

            aParaMargin.SetWhich( RES_LR_SPACE );
            SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();

            // #i23726#
            if (pNumRuleNodeFromDoc)
            {
                // --> FME 2005-02-22 #i42922# Mouse move of numbering label
                // has to consider the left indent of the paragraph
                SfxItemSet aSet( GetPool(), RES_LR_SPACE, RES_LR_SPACE );
                rSh.GetCurAttr( aSet );
                const SvxLRSpaceItem& rLR =
                    static_cast<const SvxLRSpaceItem&>(aSet.Get(RES_LR_SPACE));
                // <--

                SwPosition aPos(*pNumRuleNodeFromDoc);
                // --> OD 2008-06-09 #i90078#
                rSh.SetIndent( static_cast< short >(aParaMargin.GetTxtLeft() - rLR.GetTxtLeft()), aPos);
                // <--
                // --> OD 2005-02-18 #i42921# - invalidate state of indent in order
                // to get a ruler update.
                aParaMargin.SetWhich( nSlot );
                GetViewFrame()->GetBindings().SetState( aParaMargin );
                // <--
            }
            else if( pColl && pColl->IsAutoUpdateFmt() )
            {
                SfxItemSet aSet(GetPool(), RES_LR_SPACE, RES_LR_SPACE);
                aSet.Put(aParaMargin);
                rSh.AutoUpdatePara( pColl, aSet);
            }
            else
                rSh.SetAttr( aParaMargin );

            if ( aParaMargin.GetTxtFirstLineOfst() < 0 )
            {
                SfxItemSet aSet( GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP );

                rSh.GetCurAttr( aSet );
                const SvxTabStopItem&  rTabStops = (const SvxTabStopItem&)aSet.Get(RES_PARATR_TABSTOP);

                // Haben wir einen Tab an Stelle Null
                sal_uInt16 i;

                for ( i = 0; i < rTabStops.Count(); ++i )
                    if ( rTabStops[i].GetTabPos() == 0 )
                        break;

                if ( i >= rTabStops.Count() )
                {
                    // Kein DefTab
                    SvxTabStopItem aTabStops( RES_PARATR_TABSTOP );
                    aTabStops = rTabStops;

                    ::lcl_EraseDefTabs(aTabStops);

                    SvxTabStop aSwTabStop( 0, SVX_TAB_ADJUST_DEFAULT );
                    aTabStops.Insert(aSwTabStop);

                    const SvxTabStopItem& rDefTabs =
                        (const SvxTabStopItem&)rSh.GetDefault(RES_PARATR_TABSTOP);
                    sal_uInt16 nDef = ::GetTabDist(rDefTabs);
                    ::MakeDefTabs( nDef, aTabStops );

                    if(	pColl && pColl->IsAutoUpdateFmt())
                    {
                        SfxItemSet aSetTmp(GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP);
                        aSetTmp.Put(aTabStops);
                        rSh.AutoUpdatePara( pColl, aSetTmp );
                    }
                    else
                        rSh.SetAttr( aTabStops );
                }
            }
        }
        break;

    case SID_ATTR_PARA_ULSPACE:
        if ( pReqArgs )
	{
		SvxULSpaceItem aParaMargin((const SvxULSpaceItem&)pReqArgs->Get(nSlot));

		long nUDist = 0;
		long nLDist = 0;
		aParaMargin.SetUpper( aParaMargin.GetUpper() - nUDist );
		aParaMargin.SetLower(aParaMargin.GetLower() - nLDist);

		aParaMargin.SetWhich( RES_UL_SPACE );
		SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl();
		if(	pColl && pColl->IsAutoUpdateFmt() )
		{
			SfxItemSet aSet(GetPool(), RES_UL_SPACE, RES_UL_SPACE);
			aSet.Put(aParaMargin);
			rSh.AutoUpdatePara( pColl, aSet);
		}
		else
			rSh.SetAttr( aParaMargin );
	}
	break;

    case SID_RULER_BORDERS_VERTICAL:
    case SID_RULER_BORDERS:
        if ( pReqArgs )
        {
            SvxColumnItem aColItem((const SvxColumnItem&)pReqArgs->Get(nSlot));

            if( bSetTabColFromDoc || (!bSect && rSh.GetTableFmt()) )
            {
                ASSERT(aColItem.Count(), "ColDesc ist leer!!");

                const sal_Bool bSingleLine = ((const SfxBoolItem&)rReq.
                    GetArgs()->Get(SID_RULER_ACT_LINE_ONLY)).GetValue();

                SwTabCols aTabCols;
                if ( bSetTabColFromDoc )
                    rSh.GetMouseTabCols( aTabCols, aTabColFromDocPos );
                else
                    rSh.GetTabCols(aTabCols);

                // linker Tabellenrand
                long nBorder = (long)(aColItem.GetLeft() - aTabCols.GetLeftMin());
                aTabCols.SetLeft( nBorder );

                nBorder = (bVerticalWriting ? nPageHeight : nPageWidth) - aTabCols.GetLeftMin() - aColItem.GetRight();

#ifdef DEBUG
                long nTmp1 = nPageWidth;
                long nTmp2 = aTabCols.GetLeftMin() + nBorder;
                (void)nTmp1;
                (void)nTmp2;
#endif

                if ( aColItem.GetRight() > 0 )
                    aTabCols.SetRight( nBorder );

                // Tabcols der Reihe nach
                // Die letzte Col wird durch den Rand definiert
                //columns in right-to-left tables need to be mirrored
                sal_Bool bIsTableRTL =
                    IsTabColFromDoc() ?
                    rSh.IsMouseTableRightToLeft(aTabColFromDocPos)
                    : rSh.IsTableRightToLeft();
                if(bIsTableRTL)
                {
                    sal_uInt16 nColCount = aColItem.Count() - 1;
                    for ( sal_uInt16 i = 0; i < nColCount; ++i )
                    {
                        const SvxColumnDescription& rCol = aColItem[nColCount - i];
                        aTabCols[i] = aTabCols.GetRight() - rCol.nStart;
                        aTabCols.SetHidden( i, !rCol.bVisible );
                    }
                }
                else
                {
                    for ( sal_uInt16 i = 0; i < aColItem.Count()-1; ++i )
                    {
                        const SvxColumnDescription& rCol = aColItem[i];
                        aTabCols[i] = rCol.nEnd + aTabCols.GetLeft();
                        aTabCols.SetHidden( i, !rCol.bVisible );
                    }
                }

                if ( bSetTabColFromDoc )
                {
                    if( !rSh.IsViewLocked() )
                    {
                        bUnlockView = sal_True;
                        rSh.LockView( sal_True );
                    }
                    rSh.SetMouseTabCols( aTabCols, bSingleLine,
                        aTabColFromDocPos );
                }
                else
                    rSh.SetTabCols(aTabCols, bSingleLine);

            }
            else
            {
                if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY || bSect)
                {
                    SwSectionFmt *pSectFmt = 0;
                    SfxItemSet aSet( GetPool(), RES_COL, RES_COL );
                    if(bSect)
                    {
                        const SwSection *pSect = rSh.GetAnySection();
                        ASSERT( pSect, "Welcher Bereich?");
                        pSectFmt = pSect->GetFmt();
                    }
                    else
                    {
                        rSh.GetFlyFrmAttr( aSet );
                    }
                    SwFmtCol aCols(
                        bSect ?
                        pSectFmt->GetCol() :
                        (const SwFmtCol&)aSet.Get( RES_COL, sal_False ));
                    SwRect aCurRect = rSh.GetAnyCurRect(bSect ? RECT_SECTION_PRT : RECT_FLY_PRT_EMBEDDED);
                    const long lWidth = bVerticalWriting ? aCurRect.Height() : aCurRect.Width();
                    ::lcl_ConvertToCols( aColItem, sal_uInt16(lWidth), aCols );
                    aSet.Put( aCols );
                    if(bSect)
                        rSh.SetSectionAttr( aSet, pSectFmt );
                    else
                    {
                        rSh.StartAction();
                        rSh.Push();
                        rSh.SetFlyFrmAttr( aSet );
                        //die Rahmenselektion wieder aufheben
                        if(!bFrmSelection && rSh.IsFrmSelected())
                        {
                            rSh.UnSelectFrm();
                            rSh.LeaveSelFrmMode();
                        }
                        rSh.Pop();
                        rSh.EndAction();
                    }
                }
                else
                {
                    SwFmtCol aCols( rDesc.GetMaster().GetCol() );
                    const SwRect aPrtRect = rSh.GetAnyCurRect(RECT_PAGE_PRT);
                    ::lcl_ConvertToCols( aColItem,
                        sal_uInt16(bVerticalWriting ? aPrtRect.Height() : aPrtRect.Width()),
                        aCols );
                    SwPageDesc aDesc( rDesc );
                    aDesc.GetMaster().SetFmtAttr( aCols );
                    rSh.ChgPageDesc( rSh.GetCurPageDesc(), aDesc );
                }
            }
        }
        break;

    case SID_RULER_ROWS :
    case SID_RULER_ROWS_VERTICAL:
        if ( pReqArgs )
        {
            SvxColumnItem aColItem((const SvxColumnItem&)pReqArgs->Get(nSlot));

            if( bSetTabColFromDoc || (!bSect && rSh.GetTableFmt()) )
            {
                ASSERT(aColItem.Count(), "ColDesc ist leer!!");

                SwTabCols aTabCols;
                if ( bSetTabRowFromDoc )
                    rSh.GetMouseTabRows( aTabCols, aTabColFromDocPos );
                else
                    rSh.GetTabRows(aTabCols);

                if ( bVerticalWriting )
                {
                    aTabCols.SetRight(nPageWidth - aColItem.GetRight() - aColItem.GetLeft());
                    aTabCols.SetLeftMin(aColItem.GetLeft());
                }
                else
                {
                    long nBorder = nPageHeight - aTabCols.GetLeftMin() - aColItem.GetRight();
                    aTabCols.SetRight( nBorder );
                }

                if(bVerticalWriting)
                {
                    for ( sal_uInt16 i = aColItem.Count() - 1; i; --i )
                    {
                        const SvxColumnDescription& rCol = aColItem[i - 1];
                        long nColumnPos = aTabCols.GetRight() - rCol.nEnd ;
                        aTabCols[i - 1] = nColumnPos;
                        aTabCols.SetHidden( i - 1, !rCol.bVisible );
                    }
                }
                else
                {
                    for ( sal_uInt16 i = 0; i < aColItem.Count()-1; ++i )
                    {
                        const SvxColumnDescription& rCol = aColItem[i];
                        aTabCols[i] = rCol.nEnd + aTabCols.GetLeft();
                        aTabCols.SetHidden( i, !rCol.bVisible );
                    }
                }
                sal_Bool bSingleLine = sal_False;
                const SfxPoolItem* pSingleLine;
                if( SFX_ITEM_SET == pReqArgs->GetItemState(SID_RULER_ACT_LINE_ONLY, sal_False, &pSingleLine))
                    bSingleLine = ((const SfxBoolItem*)pSingleLine)->GetValue();
                if ( bSetTabRowFromDoc )
                {
                    if( !rSh.IsViewLocked() )
                    {
                        bUnlockView = sal_True;
                        rSh.LockView( sal_True );
                    }
                    rSh.SetMouseTabRows( aTabCols, bSingleLine, aTabColFromDocPos );
                }
                else
                    rSh.SetTabRows(aTabCols, bSingleLine);
            }
        }
        break;

    default:
        ASSERT( !this, "Falsche SlotId");
    }
    rSh.EndAllAction();

    if( bUnlockView )
        rSh.LockView( sal_False );

    bSetTabColFromDoc = bSetTabRowFromDoc = bTabColFromDoc = bTabRowFromDoc = sal_False;
    SetNumRuleNodeFromDoc(NULL);
}

/*--------------------------------------------------------------------
	Beschreibung:	Hier wird der Status der Tableiste ermittelt
					sprich alle relevanten Attribute an der CursorPos
					werden der Tableiste uebermittelt
 --------------------------------------------------------------------*/


void SwView::StateTabWin(SfxItemSet& rSet)
{
    SwWrtShell &rSh 		= GetWrtShell();

    const Point* pPt = IsTabColFromDoc() || IsTabRowFromDoc() ? &aTabColFromDocPos : 0;
    const sal_uInt16 nFrmType	= rSh.IsObjSelected()
                ? FRMTYPE_DRAWOBJ
                : rSh.GetFrmType( pPt, sal_True );

    const sal_Bool 	bFrmSelection = rSh.IsFrmSelected();
    const sal_Bool bBrowse = rSh.GetViewOptions()->getBrowseMode();
    // PageOffset/Begrenzer
    const SwRect& rPageRect = rSh.GetAnyCurRect( RECT_PAGE, pPt );
    const SwRect& rPagePrtRect = rSh.GetAnyCurRect( RECT_PAGE_PRT, pPt );
    const long nPageWidth  = rPageRect.Width();
    const long nPageHeight = rPageRect.Height();

    const SwPageDesc& rDesc = rSh.GetPageDesc(
                IsTabColFromDoc() || bTabRowFromDoc ?
                    rSh.GetMousePageDesc(aTabColFromDocPos) : rSh.GetCurPageDesc() );

    const SvxFrameDirectionItem& rFrameDir = rDesc.GetMaster().GetFrmDir();
    const sal_Bool bVerticalWriting = rSh.IsInVerticalText();

    //enable tab stop display on the rulers depending on the writing direction
    WinBits nRulerStyle = pHRuler->GetStyle() & ~WB_EXTRAFIELD;
    pHRuler->SetStyle(bVerticalWriting||bBrowse ? nRulerStyle : nRulerStyle|WB_EXTRAFIELD);
    nRulerStyle = pVRuler->GetStyle() & ~WB_EXTRAFIELD;
    pVRuler->SetStyle(bVerticalWriting ? nRulerStyle|WB_EXTRAFIELD : nRulerStyle);

    //#i24363# tab stops relative to indent
    bool bRelative = rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT);
    pHRuler->SetTabsRelativeToIndent( bRelative );
    pVRuler->SetTabsRelativeToIndent( bRelative );

    SvxLRSpaceItem aPageLRSpace( rDesc.GetMaster().GetLRSpace() );
    SwapPageMargin( rDesc, aPageLRSpace );

    SfxItemSet aCoreSet( GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP,
                                    RES_LR_SPACE, 		 RES_UL_SPACE, 0 );
    // get also the list level indent values merged as LR-SPACE item, if needed.
    rSh.GetCurAttr( aCoreSet, true );
    SelectionType nSelType = rSh.GetSelectionType();

    SfxWhichIter aIter( rSet );
    sal_uInt16 nWhich = aIter.FirstWhich();
    sal_Bool bPutContentProtection = sal_False;

    while ( nWhich )
    {
        switch ( nWhich )
        {
        case SID_ATTR_PAGE_COLUMN:
            {
                sal_uInt16 nColumnType = 0;

                const SwFrmFmt& rMaster = rDesc.GetMaster();
                SwFmtCol aCol(rMaster.GetCol());
                const sal_uInt16 nCols = aCol.GetNumCols();
                if ( nCols == 0 )
                {
                    nColumnType = 1;
                }
                else if ( nCols == 2 )
                {
                    const sal_uInt16 nColLeft = aCol.CalcPrtColWidth(0, aCol.GetWishWidth());
                    const sal_uInt16 nColRight = aCol.CalcPrtColWidth(1, aCol.GetWishWidth());

                    if ( abs(nColLeft - nColRight) <= 10 )
                    {
                        nColumnType = 2;
                    }
                    else if( abs(nColLeft - nColRight*2) < 20 )
                    {
                        nColumnType = 4;
                    }
                    else if( abs(nColLeft*2 - nColRight) < 20 )
                    {
                        nColumnType = 5;
                    }
                }
                else if( nCols == 3 )
                {
                    nColumnType = 3;
                }

                rSet.Put( SfxInt16Item( SID_ATTR_PAGE_COLUMN, nColumnType ) );
            }
            break;

        case SID_ATTR_LONG_LRSPACE:
            {
                SvxLongLRSpaceItem aLongLR( (long)aPageLRSpace.GetLeft(),
                    (long)aPageLRSpace.GetRight(),
                    SID_ATTR_LONG_LRSPACE);
                if(bBrowse)
                {
                    aLongLR.SetLeft(rPagePrtRect.Left());
                    aLongLR.SetRight(nPageWidth - rPagePrtRect.Right());
                }
                if ( ( nFrmType & FRMTYPE_HEADER || nFrmType & FRMTYPE_FOOTER ) &&
                    !(nFrmType & FRMTYPE_COLSECT) )
                {
                    SwFrmFmt *pFmt = (SwFrmFmt*) (nFrmType & FRMTYPE_HEADER ?
                        rDesc.GetMaster().GetHeader().GetHeaderFmt() :
                        rDesc.GetMaster().GetFooter().GetFooterFmt());
                    if( pFmt )// #i80890# if rDesc is not the one belonging to the current page is might crash
                    {
                        SwRect aRect( rSh.GetAnyCurRect( RECT_HEADERFOOTER, pPt));
                        aRect.Pos() -= rSh.GetAnyCurRect( RECT_PAGE, pPt ).Pos();
                        const SvxLRSpaceItem& aLR = pFmt->GetLRSpace();
                        aLongLR.SetLeft ( (long)aLR.GetLeft() + (long)aRect.Left() );
                        aLongLR.SetRight( (nPageWidth -
                            (long)aRect.Right() + (long)aLR.GetRight()));
                    }
                }
                else
                {
                    SwRect aRect;
                    if( !bFrmSelection && ((nFrmType & FRMTYPE_COLSECT) || rSh.IsDirectlyInSection()) )
                    {
                        aRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, pPt);
                        const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, pPt);
                        aRect.Pos() += aTmpRect.Pos();
                    }

                    else if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
                        aRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt);
                    else if( nFrmType & FRMTYPE_DRAWOBJ)
                        aRect = rSh.GetObjRect();

                    if( aRect.Width() )
                    {
                        // PAGES01
                        // make relative to page position:
                        aLongLR.SetLeft ((long)( aRect.Left() - rPageRect.Left() ));
                        aLongLR.SetRight((long)( rPageRect.Right() - aRect.Right()));
                    }
                }
                if( nWhich == SID_ATTR_LONG_LRSPACE )
                    rSet.Put( aLongLR );
                else
                {
                    SvxLRSpaceItem aLR( aLongLR.GetLeft(),
                        aLongLR.GetRight(),
                        0, 0,
                        nWhich);
                    rSet.Put(aLR);
                }
                break;
            }

        // provide left and right margins of current page style
        case SID_ATTR_PAGE_LRSPACE:
            {
                const SvxLRSpaceItem aTmpPageLRSpace( rDesc.GetMaster().GetLRSpace() );
                const SvxLongLRSpaceItem aLongLR(
                    (long)aTmpPageLRSpace.GetLeft(),
                    (long)aTmpPageLRSpace.GetRight(),
                    SID_ATTR_PAGE_LRSPACE );
                rSet.Put( aLongLR );
            }
            break;

        case SID_ATTR_LONG_ULSPACE:
            {
                // Rand Seite Oben Unten
                SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() );
                SvxLongULSpaceItem aLongUL( (long)aUL.GetUpper(),
                    (long)aUL.GetLower(),
                    SID_ATTR_LONG_ULSPACE);

                if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
                {
                    // Dokumentkoordinaten Frame auf Seitenkoordinaten umbrechen
                    const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt);
                    aLongUL.SetUpper((sal_uInt16)(rRect.Top() - rPageRect.Top() ));
                    aLongUL.SetLower((sal_uInt16)(rPageRect.Bottom() - rRect.Bottom() ));
                }
                else if ( nFrmType & FRMTYPE_HEADER || nFrmType & FRMTYPE_FOOTER )
                {
                    SwRect aRect( rSh.GetAnyCurRect( RECT_HEADERFOOTER, pPt));
                    aRect.Pos() -= rSh.GetAnyCurRect( RECT_PAGE, pPt ).Pos();
                    aLongUL.SetUpper( (sal_uInt16)aRect.Top() );
                    aLongUL.SetLower( (sal_uInt16)(nPageHeight - aRect.Bottom()) );
                }
                else if( nFrmType & FRMTYPE_DRAWOBJ)
                {
                    const SwRect &rRect = rSh.GetObjRect();
                    aLongUL.SetUpper((rRect.Top() - rPageRect.Top()));
                    aLongUL.SetLower((rPageRect.Bottom() - rRect.Bottom()));
                }
                else if(bBrowse)
                {
                    aLongUL.SetUpper(rPagePrtRect.Top());
                    aLongUL.SetLower(nPageHeight - rPagePrtRect.Bottom());
                }
                if( nWhich == SID_ATTR_LONG_ULSPACE )
                    rSet.Put( aLongUL );
                else
                {
                    SvxULSpaceItem aULTmp((sal_uInt16)aLongUL.GetUpper(),
                        (sal_uInt16)aLongUL.GetLower(),
                        nWhich);
                    rSet.Put(aULTmp);
                }
                break;
            }

        // provide top and bottom margins of current page style
        case SID_ATTR_PAGE_ULSPACE:
            {
                const SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() );
                SvxLongULSpaceItem aLongUL(
                    (long)aUL.GetUpper(),
                    (long)aUL.GetLower(),
                    SID_ATTR_PAGE_ULSPACE );

                rSet.Put( aLongUL );
            }
            break;

        case SID_ATTR_TABSTOP_VERTICAL :
        case RES_PARATR_TABSTOP:
            {
                if ( ISA( SwWebView ) ||
                    IsTabColFromDoc() ||
                    IsTabRowFromDoc() ||
                    ( nSelType & nsSelectionType::SEL_GRF) ||
                    (nSelType & nsSelectionType::SEL_FRM) ||
                    (nSelType & nsSelectionType::SEL_OLE) ||
                    SFX_ITEM_AVAILABLE > aCoreSet.GetItemState(RES_LR_SPACE)||
                    (!bVerticalWriting && (SID_ATTR_TABSTOP_VERTICAL == nWhich))||
                    (bVerticalWriting && (RES_PARATR_TABSTOP == nWhich))
                    )
                    rSet.DisableItem( nWhich );
                else
                {
                    SvxTabStopItem aTabStops((const SvxTabStopItem&)
                        aCoreSet.Get( RES_PARATR_TABSTOP ));

                    const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&)
                        rSh.GetDefault(RES_PARATR_TABSTOP);

                    DBG_ASSERT(pHRuler, "warum ist das Lineal nicht da?");
                    long nDefTabDist = ::GetTabDist(rDefTabs);
                    pHRuler->SetDefTabDist( nDefTabDist );
                    pVRuler->SetDefTabDist( nDefTabDist );
                    ::lcl_EraseDefTabs(aTabStops);
                    rSet.Put(aTabStops, nWhich);
                }
                break;
            }

        case SID_ATTR_PARA_LRSPACE_VERTICAL:
        case SID_ATTR_PARA_LRSPACE:
            {
                if ( nSelType & nsSelectionType::SEL_GRF ||
                    nSelType & nsSelectionType::SEL_FRM ||
                    nSelType & nsSelectionType::SEL_OLE ||
                    nFrmType == FRMTYPE_DRAWOBJ ||
                    (!bVerticalWriting && (SID_ATTR_PARA_LRSPACE_VERTICAL == nWhich))||
                    (bVerticalWriting && (SID_ATTR_PARA_LRSPACE == nWhich))
                    )
                {
                    rSet.DisableItem(nWhich);
                }
                else
                {
                    SvxLRSpaceItem aLR( RES_LR_SPACE );
                    if ( !IsTabColFromDoc() )
                    {
                        aLR = (const SvxLRSpaceItem&)aCoreSet.Get(RES_LR_SPACE);

                        // #i23726#
                        if (pNumRuleNodeFromDoc)
                        {
                            short nOffset = static_cast< short >(aLR.GetTxtLeft() +
                                // --> FME 2005-02-22 #i42922# Mouse move of numbering label
                                // has to consider the left indent of the paragraph
                                pNumRuleNodeFromDoc->GetLeftMarginWithNum( sal_True ) );
                            // <--

                            short nFLOffset;
                            pNumRuleNodeFromDoc->GetFirstLineOfsWithNum( nFLOffset );

                            aLR.SetLeft( nOffset + nFLOffset );
                        }
                    }
                    aLR.SetWhich(nWhich);
                    rSet.Put(aLR);
                }
                break;
            }

	case SID_ATTR_PARA_ULSPACE:
	{	
		SvxULSpaceItem aUL = (const SvxULSpaceItem&)aCoreSet.Get(RES_UL_SPACE);
		aUL.SetWhich(nWhich);

		SfxItemState e = aCoreSet.GetItemState(RES_UL_SPACE);
		if( e >= SFX_ITEM_AVAILABLE )
			rSet.Put( aUL );
		else
			rSet.InvalidateItem(nWhich);
	}
	break;

        case SID_RULER_BORDER_DISTANCE:
            {
                nLeftBorderDistance = 0;
                nRightBorderDistance = 0;
                if ( nSelType & nsSelectionType::SEL_GRF ||
                    nSelType & nsSelectionType::SEL_FRM ||
                    nSelType & nsSelectionType::SEL_OLE ||
                    nFrmType == FRMTYPE_DRAWOBJ )
                    rSet.DisableItem(SID_RULER_BORDER_DISTANCE);
                else
                {
                    SvxLRSpaceItem aDistLR(SID_RULER_BORDER_DISTANCE);
                    if(nFrmType & FRMTYPE_FLY_ANY)
                    {
                        if( IsTabColFromDoc() )
                        {
                            const SwRect& rFlyPrtRect = rSh.GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, pPt );
                            aDistLR.SetLeft(rFlyPrtRect.Left());
                            aDistLR.SetRight(rFlyPrtRect.Left());
                        }
                        else
                        {
                            SfxItemSet aCoreSet2( GetPool(),
                                RES_BOX, RES_BOX,
                                SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
                            SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
                            aCoreSet.Put( aBoxInfo );
                            rSh.GetFlyFrmAttr( aCoreSet );
                            const SvxBoxItem& rBox = (const SvxBoxItem&)aCoreSet.Get(RES_BOX);
                            aDistLR.SetLeft((sal_uInt16)rBox.GetDistance(BOX_LINE_LEFT ));
                            aDistLR.SetRight((sal_uInt16)rBox.GetDistance(BOX_LINE_RIGHT));

                            //add the paragraph border distance
                            SfxItemSet aCoreSet1( GetPool(),
                                RES_BOX, RES_BOX,
                                0 );
                            rSh.GetCurAttr( aCoreSet1 );
                            const SvxBoxItem& rParaBox = (const SvxBoxItem&)aCoreSet1.Get(RES_BOX);
                            aDistLR.SetLeft(aDistLR.GetLeft() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_LEFT ));
                            aDistLR.SetRight(aDistLR.GetRight() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_RIGHT));
                        }
                        rSet.Put(aDistLR);
                        nLeftBorderDistance  = static_cast< sal_uInt16 >(aDistLR.GetLeft());
                        nRightBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetRight());
                    }
                    else if ( IsTabColFromDoc() ||
                        ( rSh.GetTableFmt() && !bFrmSelection &&
                        !(nFrmType & FRMTYPE_COLSECT ) ) )
                    {
                        SfxItemSet aCoreSet2( GetPool(),
                            RES_BOX, RES_BOX,
                            SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
                        SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
                        aBoxInfo.SetTable(sal_False);
                        aBoxInfo.SetDist((sal_Bool) sal_True);
                        aCoreSet2.Put(aBoxInfo);
                        rSh.GetTabBorders( aCoreSet2 );
                        const SvxBoxItem& rBox = (const SvxBoxItem&)aCoreSet2.Get(RES_BOX);
                        aDistLR.SetLeft((sal_uInt16)rBox.GetDistance(BOX_LINE_LEFT ));
                        aDistLR.SetRight((sal_uInt16)rBox.GetDistance(BOX_LINE_RIGHT));

                        //add the border distance of the paragraph
                        SfxItemSet aCoreSet1( GetPool(),
                            RES_BOX, RES_BOX,
                            0 );
                        rSh.GetCurAttr( aCoreSet1 );
                        const SvxBoxItem& rParaBox = (const SvxBoxItem&)aCoreSet1.Get(RES_BOX);
                        aDistLR.SetLeft(aDistLR.GetLeft() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_LEFT ));
                        aDistLR.SetRight(aDistLR.GetRight() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_RIGHT));
                        rSet.Put(aDistLR);
                        nLeftBorderDistance  = static_cast< sal_uInt16 >(aDistLR.GetLeft());
                        nRightBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetRight());
                    }
                    else if ( !rSh.IsDirectlyInSection() )
                    {
                        //get the page/header/footer border distance
                        const SwFrmFmt& rMaster = rDesc.GetMaster();
                        const SvxBoxItem& rBox = (const SvxBoxItem&)rMaster.GetAttrSet().Get(RES_BOX);
                        aDistLR.SetLeft((sal_uInt16)rBox.GetDistance(BOX_LINE_LEFT ));
                        aDistLR.SetRight((sal_uInt16)rBox.GetDistance(BOX_LINE_RIGHT));

                        const SvxBoxItem* pBox = 0;
                        if(nFrmType & FRMTYPE_HEADER)
                        {
                            rMaster.GetHeader();
                            const SwFmtHeader& rHeaderFmt = rMaster.GetHeader();
                            SwFrmFmt *pHeaderFmt = (SwFrmFmt*)rHeaderFmt.GetHeaderFmt();
                            if( pHeaderFmt )// #i80890# if rDesc is not the one belonging to the current page is might crash
                                pBox = & (const SvxBoxItem&)pHeaderFmt->GetBox();
                        }
                        else if(nFrmType & FRMTYPE_FOOTER )
                        {
                            const SwFmtFooter& rFooterFmt = rMaster.GetFooter();
                            SwFrmFmt *pFooterFmt = (SwFrmFmt*)rFooterFmt.GetFooterFmt();
                            if( pFooterFmt )// #i80890# if rDesc is not the one belonging to the current page is might crash
                                pBox = & (const SvxBoxItem&)pFooterFmt->GetBox();
                        }
                        if(pBox)
                        {
                            aDistLR.SetLeft((sal_uInt16)pBox->GetDistance(BOX_LINE_LEFT ));
                            aDistLR.SetRight((sal_uInt16)pBox->GetDistance(BOX_LINE_RIGHT));
                        }

                        //add the border distance of the paragraph
                        SfxItemSet aCoreSetTmp( GetPool(),
                            RES_BOX, RES_BOX,
                            SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 );
                        rSh.GetCurAttr( aCoreSetTmp );
                        const SvxBoxItem& rParaBox = (const SvxBoxItem&)aCoreSetTmp.Get(RES_BOX);
                        aDistLR.SetLeft(aDistLR.GetLeft() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_LEFT ));
                        aDistLR.SetRight(aDistLR.GetRight() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_RIGHT));
                        rSet.Put(aDistLR);
                        nLeftBorderDistance  = static_cast< sal_uInt16 >(aDistLR.GetLeft());
                        nRightBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetRight());
                    }
                }
            }
            break;

        case SID_RULER_TEXT_RIGHT_TO_LEFT:
            {
                if ( nSelType & nsSelectionType::SEL_GRF ||
                    nSelType & nsSelectionType::SEL_FRM ||
                    nSelType & nsSelectionType::SEL_OLE ||
                    nFrmType == FRMTYPE_DRAWOBJ)
                    rSet.DisableItem(nWhich);
                else
                {
                    sal_Bool bFlag = rSh.IsInRightToLeftText();
                    rSet.Put(SfxBoolItem(nWhich, bFlag));
                }
            }
            break;

        case SID_RULER_BORDERS_VERTICAL:
        case SID_RULER_BORDERS:
            {
                sal_Bool bFrameHasVerticalColumns(sal_False);
                {
                    sal_Bool bFrameRTL;
                    sal_Bool bFrameVertL2R;
                    bFrameHasVerticalColumns = rSh.IsFrmVertical(sal_False, bFrameRTL, bFrameVertL2R) &&
                        bFrmSelection;
                }
                sal_Bool bHasTable = ( IsTabColFromDoc() ||
                    ( rSh.GetTableFmt() && !bFrmSelection &&
                    !(nFrmType & FRMTYPE_COLSECT ) ) );

                sal_Bool bTableVertical = bHasTable && rSh.IsTableVertical();

                if( ( (SID_RULER_BORDERS_VERTICAL == nWhich) &&
                    ((bHasTable && !bTableVertical)||
                    (!bVerticalWriting && !bFrmSelection && !bHasTable ) || (bFrmSelection && !bFrameHasVerticalColumns)) ) ||
                    ((SID_RULER_BORDERS == nWhich) &&
                    ((bHasTable && bTableVertical)||
                    (bVerticalWriting && !bFrmSelection&& !bHasTable) || bFrameHasVerticalColumns)))
                    rSet.DisableItem(nWhich);
                else if ( bHasTable )
                {
                    SwTabCols aTabCols;
                    sal_uInt16	  nNum;
                    if ( 0 != ( bSetTabColFromDoc = IsTabColFromDoc() ) )
                    {
                        rSh.GetMouseTabCols( aTabCols, aTabColFromDocPos );
                        nNum = rSh.GetCurMouseTabColNum( aTabColFromDocPos );
                    }
                    else
                    {
                        rSh.GetTabCols( aTabCols );
                        nNum = rSh.GetCurTabColNum();
                        if(rSh.IsTableRightToLeft())
                            nNum = aTabCols.Count() - nNum;
                    }

                    ASSERT(nNum <= aTabCols.Count(), "TabCol not found");
                    const int nLft = aTabCols.GetLeftMin() + aTabCols.GetLeft();
                    const int nRgt = (sal_uInt16)(bTableVertical ? nPageHeight : nPageWidth) -
                        (aTabCols.GetLeftMin() +
                        aTabCols.GetRight());

                    const sal_uInt16 nL = static_cast< sal_uInt16 >(nLft > 0 ? nLft : 0);
                    const sal_uInt16 nR = static_cast< sal_uInt16 >(nRgt > 0 ? nRgt : 0);

                    SvxColumnItem aColItem(nNum, nL, nR);

                    sal_uInt16 nStart = 0,
                        nEnd;

                    //columns in right-to-left tables need to be mirrored
                    sal_Bool bIsTableRTL =
                        IsTabColFromDoc() ?
                        rSh.IsMouseTableRightToLeft(aTabColFromDocPos)
                        : rSh.IsTableRightToLeft();
                    if(bIsTableRTL)
                    {
                        for ( sal_uInt16 i = aTabCols.Count(); i ; --i )
                        {
                            const SwTabColsEntry& rEntry = aTabCols.GetEntry( i - 1 );
                            nEnd  = (sal_uInt16)aTabCols.GetRight();
                            nEnd  = nEnd - (sal_uInt16)rEntry.nPos;
                            SvxColumnDescription aColDesc( nStart, nEnd,
                                (sal_uInt16(aTabCols.GetRight() - rEntry.nMax)),
                                (sal_uInt16(aTabCols.GetRight() - rEntry.nMin)),
                                !aTabCols.IsHidden(i - 1) );
                            aColItem.Append(aColDesc);
                            nStart = nEnd;
                        }
                        SvxColumnDescription aColDesc(nStart,
                            aTabCols.GetRight() - aTabCols.GetLeft(), sal_True);
                        aColItem.Append(aColDesc);
                    }
                    else
                    {
                        for ( sal_uInt16 i = 0; i < aTabCols.Count(); ++i )
                        {
                            const SwTabColsEntry& rEntry = aTabCols.GetEntry( i );
                            nEnd  = static_cast< sal_uInt16 >(rEntry.nPos - aTabCols.GetLeft());
                            SvxColumnDescription aColDesc( nStart, nEnd,
                                rEntry.nMin - aTabCols.GetLeft(), rEntry.nMax - aTabCols.GetLeft(),
                                !aTabCols.IsHidden(i) );
                            aColItem.Append(aColDesc);
                            nStart = nEnd;
                        }
                        SvxColumnDescription aColDesc(nStart, aTabCols.GetRight() - aTabCols.GetLeft(),
                            0, 0,
                            sal_True);
                        aColItem.Append(aColDesc);
                    }
                    rSet.Put(aColItem, nWhich);
                }
                else if ( bFrmSelection || nFrmType & ( FRMTYPE_COLUMN | FRMTYPE_COLSECT ) )
                {
                    // Aus Rahmen oder Seite ?
                    sal_uInt16 nNum = 0;
                    if(bFrmSelection)
                    {
                        const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt();
                        if(pFmt)
                            nNum = pFmt->GetCol().GetNumCols();
                    }
                    else
                        nNum = rSh.GetCurColNum();

                    if(
                        //eigentlich sollte FRMTYPE_COLSECT nicht enthalten sein, wenn der Rahmen selektiert ist!
                            !bFrmSelection &&
                            nFrmType & FRMTYPE_COLSECT )
                    {
                        const SwSection *pSect = rSh.GetAnySection(sal_False, pPt);
                        ASSERT( pSect, "Welcher Bereich?");
                        if( pSect )
                        {
                            SwSectionFmt *pFmt = pSect->GetFmt();
                            const SwFmtCol& rCol = pFmt->GetCol();
                            if(rSh.IsInRightToLeftText())
                                nNum = rCol.GetColumns().Count() - nNum;
                            else
                                --nNum;
                            SvxColumnItem aColItem(nNum);
                            SwRect aRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, pPt);
                            const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, pPt);

                            ::lcl_FillSvxColumn(rCol, sal_uInt16(bVerticalWriting ? aRect.Height() : aRect.Width()), aColItem, 0);

                            if(bVerticalWriting)
                            {
                                aRect.Pos() += Point(aTmpRect.Left(), aTmpRect.Top());
                                aRect.Pos().Y() -= rPageRect.Top();
                                aColItem.SetLeft ((sal_uInt16)(aRect.Top()));
                                aColItem.SetRight((sal_uInt16)(nPageHeight   - aRect.Bottom() ));
                            }
                            else
                            {
                                aRect.Pos() += aTmpRect.Pos();

                                // PAGES01
                                // make relative to page position:
                                aColItem.SetLeft ((sal_uInt16)( aRect.Left() - rPageRect.Left() ));
                                aColItem.SetRight((sal_uInt16)( rPageRect.Right() - aRect.Right()));
                            }
                            aColItem.SetOrtho(aColItem.CalcOrtho());

                            rSet.Put(aColItem, nWhich);
                        }
                    }
                    else if( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY )
                    {
                        // Spalten in Rahmen
                        if ( nNum  )
                        {
                            const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt() ;

                            const SwFmtCol& rCol = pFmt->GetCol();
                            if(rSh.IsInRightToLeftText())
                                nNum = rCol.GetColumns().Count() - nNum;
                            else
                                nNum--;
                            SvxColumnItem aColItem(nNum);
                            const SwRect &rSizeRect = rSh.GetAnyCurRect(RECT_FLY_PRT_EMBEDDED, pPt);

                            sal_Bool bUseVertical = bFrameHasVerticalColumns || (!bFrmSelection && bVerticalWriting);
                            const long lWidth = bUseVertical ? rSizeRect.Height() : rSizeRect.Width();
                            const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt);
                            long nDist2 = ((bUseVertical ? rRect.Height() : rRect.Width()) - lWidth) /2;
                            ::lcl_FillSvxColumn(rCol, sal_uInt16(lWidth), aColItem, nDist2);

                            SfxItemSet aFrameSet(GetPool(), RES_LR_SPACE, RES_LR_SPACE);
                            rSh.GetFlyFrmAttr( aFrameSet );

                            if(bUseVertical)
                            {
                                aColItem.SetLeft ((sal_uInt16)(rRect.Top()- rPageRect.Top()));
                                aColItem.SetRight((sal_uInt16)(nPageHeight + rPageRect.Top() - rRect.Bottom() ));
                            }
                            else
                            {
                                aColItem.SetLeft ((sal_uInt16)(rRect.Left() - rPageRect.Left()   ));
                                aColItem.SetRight((sal_uInt16)(rPageRect.Right() - rRect.Right() ));
                            }

                            aColItem.SetOrtho(aColItem.CalcOrtho());

                            rSet.Put(aColItem, nWhich);
                        }
                        else
                            rSet.DisableItem(nWhich);
                    }
                    else
                    {	// Spalten auf der Seite
                        const SwFrmFmt& rMaster = rDesc.GetMaster();
                        SwFmtCol aCol(rMaster.GetCol());
                        if(rFrameDir.GetValue() == FRMDIR_HORI_RIGHT_TOP)
                            nNum = aCol.GetColumns().Count() - nNum;
                        else
                            nNum--;

                        SvxColumnItem aColItem(nNum);
                        const SwRect aPrtRect = rSh.GetAnyCurRect(RECT_PAGE_PRT, pPt);
                        const SvxBoxItem& rBox = (const SvxBoxItem&)rMaster.GetFmtAttr(RES_BOX);
                        long nDist = rBox.GetDistance();
                        ::lcl_FillSvxColumn(aCol,
                            sal_uInt16(bVerticalWriting ? aPrtRect.Height() : aPrtRect.Width() ),
                            aColItem, nDist);

                        if(bBrowse)
                        {
                            aColItem.SetLeft((sal_uInt16)rPagePrtRect.Left());
                            aColItem.SetRight(sal_uInt16(nPageWidth - rPagePrtRect.Right()));
                        }
                        else
                        {
                            aColItem.SetLeft (aPageLRSpace.GetLeft());
                            aColItem.SetRight(aPageLRSpace.GetRight());
                        }
                        aColItem.SetOrtho(aColItem.CalcOrtho());

                        rSet.Put(aColItem, nWhich);
                    }
                }
                else
                    rSet.DisableItem(nWhich);
                break;
            }

        case SID_RULER_ROWS :
        case SID_RULER_ROWS_VERTICAL:
            {
                sal_Bool bFrameHasVerticalColumns(sal_False);
                {
                    sal_Bool bFrameRTL;
                    sal_Bool bFrameVertL2R;
                    bFrameHasVerticalColumns = rSh.IsFrmVertical(sal_False, bFrameRTL, bFrameVertL2R) &&
                        bFrmSelection;
                }

                if( ( (SID_RULER_ROWS == nWhich) &&
                    ((!bVerticalWriting && !bFrmSelection) || (bFrmSelection && !bFrameHasVerticalColumns)) ) ||
                    ((SID_RULER_ROWS_VERTICAL == nWhich) &&
                    ((bVerticalWriting && !bFrmSelection) || bFrameHasVerticalColumns)))
                    rSet.DisableItem(nWhich);
                else if ( IsTabRowFromDoc() ||
                    ( rSh.GetTableFmt() && !bFrmSelection &&
                    !(nFrmType & FRMTYPE_COLSECT ) ) )
                {
                    SwTabCols aTabCols;
                    //no current value necessary
                    sal_uInt16    nNum = 0;
                    if ( 0 != ( bSetTabRowFromDoc = IsTabRowFromDoc() ) )
                    {
                        rSh.GetMouseTabRows( aTabCols, aTabColFromDocPos );
                    }
                    else
                    {
                        rSh.GetTabRows( aTabCols );
                    }

                    //                ASSERT(nNum <= aTabCols.Count(), "TabCol not found");
                    const int nLft = aTabCols.GetLeftMin();
                    const int nRgt = (sal_uInt16)(bVerticalWriting ? nPageWidth : nPageHeight) -
                        (aTabCols.GetLeftMin() +
                        aTabCols.GetRight());

                    const sal_uInt16 nL = static_cast< sal_uInt16 >(nLft > 0 ? nLft : 0);
                    const sal_uInt16 nR = static_cast< sal_uInt16 >(nRgt > 0 ? nRgt : 0);

                    SvxColumnItem aColItem(nNum, nL, nR);

                    sal_uInt16 nStart = 0,
                        nEnd;

                    for ( sal_uInt16 i = 0; i < aTabCols.Count(); ++i )
                    {
                        const SwTabColsEntry& rEntry = aTabCols.GetEntry( i );
                        if(bVerticalWriting)
                        {
                            nEnd  = sal_uInt16(aTabCols.GetRight() - rEntry.nPos);
                            SvxColumnDescription aColDesc( nStart, nEnd,
                                aTabCols.GetRight() - rEntry.nMax, aTabCols.GetRight() - rEntry.nMin,
                                !aTabCols.IsHidden(i) );
                            aColItem.Append(aColDesc);
                        }
                        else
                        {
                            nEnd  = sal_uInt16(rEntry.nPos - aTabCols.GetLeft());
                            SvxColumnDescription aColDesc( nStart, nEnd,
                                sal_uInt16(rEntry.nMin - aTabCols.GetLeft()), sal_uInt16(rEntry.nMax - aTabCols.GetLeft()),
                                !aTabCols.IsHidden(i) );
                            aColItem.Append(aColDesc);
                        }
                        nStart = nEnd;
                    }
                    if(bVerticalWriting)
                        nEnd = static_cast< sal_uInt16 >(aTabCols.GetRight());
                    else
                        nEnd = static_cast< sal_uInt16 >(aTabCols.GetLeft());
                    // put a position protection when the last row cannot be moved
                    // due to a page break inside of a row
                    if(!aTabCols.IsLastRowAllowedToChange())
                        bPutContentProtection = sal_True;

                    SvxColumnDescription aColDesc( nStart, nEnd,
                        aTabCols.GetRight(), aTabCols.GetRight(),
                        sal_False );
                    aColItem.Append(aColDesc);

                    rSet.Put(aColItem, nWhich);
                }
                else
                    rSet.DisableItem(nWhich);
            }
            break;

        case SID_RULER_PAGE_POS:
            {
                // PAGES01
                SvxPagePosSizeItem aPagePosSize(
                    Point( rPageRect.Left(), rPageRect.Top()) ,	nPageWidth, nPageHeight);

                rSet.Put(aPagePosSize);
                break;
            }

        case SID_RULER_LR_MIN_MAX:
            {
                Rectangle aRectangle;
                if( ( nFrmType & FRMTYPE_COLSECT ) && !IsTabColFromDoc() &&
                    ( nFrmType & ( FRMTYPE_TABLE|FRMTYPE_COLUMN ) ) )
                {
                    if( nFrmType & FRMTYPE_TABLE )
                    {
                        const sal_uInt16 nNum = rSh.GetCurTabColNum();
                        SwTabCols aTabCols;
                        rSh.GetTabCols( aTabCols );

                        const int nLft = aTabCols.GetLeftMin() + aTabCols.GetLeft();
                        const int nRgt = (sal_uInt16)nPageWidth -(aTabCols.GetLeftMin() + aTabCols.GetRight());

                        const sal_uInt16 nL = static_cast< sal_uInt16 >(nLft > 0 ? nLft : 0);
                        const sal_uInt16 nR = static_cast< sal_uInt16 >(nRgt > 0 ? nRgt : 0);

                        aRectangle.Left() = nL;
                        if(nNum > 1)
                            aRectangle.Left() += aTabCols[nNum - 2];
                        if(nNum)
                            aRectangle.Left() += MINLAY;
                        if(aTabCols.Count() <= nNum + 1 )
                            aRectangle.Right() = nR;
                        else
                            aRectangle.Right() = nPageWidth - (nL + aTabCols[nNum + 1]);

                        if(nNum < aTabCols.Count())
                            aRectangle.Right() += MINLAY;
                    }
                    else
                    {
                        const SwFrmFmt* pFmt =  rSh.GetFlyFrmFmt();
                        const SwFmtCol* pCols = pFmt ? &pFmt->GetCol():
                            &rDesc.GetMaster().GetCol();
                        const SwColumns& rCols = pCols->GetColumns();
                        sal_uInt16 nNum = rSh.GetCurOutColNum();
                        sal_uInt16 nCount = Min(sal_uInt16(nNum + 1), rCols.Count());
                        const SwRect aRect( rSh.GetAnyCurRect( pFmt
                            ? RECT_FLY_PRT_EMBEDDED
                            : RECT_PAGE_PRT, pPt ));
                        const SwRect aAbsRect( rSh.GetAnyCurRect( pFmt
                            ? RECT_FLY_EMBEDDED
                            : RECT_PAGE, pPt ));

                        //die Breite im Rahmen bzw. innerhalbe der Seitenraender
                        const sal_uInt16 nTotalWidth = (sal_uInt16)aRect.Width();
                        //die gesamte Rahmenbreite - die Differenz ist der doppelte Abstand zum Rand
                        const sal_uInt16 nOuterWidth = (sal_uInt16)aAbsRect.Width();
                        int nWidth = 0,
                            nStart = 0,
                            nEnd = 0;
                        aRectangle.Left() = 0;
                        for ( sal_uInt16 i = 0; i < nCount; ++i )
                        {
                            SwColumn* pCol = rCols[i];
                            nStart = pCol->GetLeft() + nWidth;
                            if(i == nNum - 2)
                                aRectangle.Left() = nStart;
                            nWidth += pCols->CalcColWidth( i, nTotalWidth );
                            nEnd = nWidth - pCol->GetRight();
                        }
                        aRectangle.Right() = rPageRect.Right() - nEnd;
                        aRectangle.Left() -= rPageRect.Left();

                        if(nNum > 1)
                        {
                            aRectangle.Left() += MINLAY;
                            aRectangle.Left() += aRect.Left();
                        }
                        if(pFmt) //Bereich in Rahmen - hier darf man bis zum Rand
                            aRectangle.Left()  = aRectangle.Right() = 0;
                        else
                        {
                            // das Rechteck an die richtige absolute Position verschieben
                            aRectangle.Left() += aAbsRect.Left();
                            aRectangle.Right() -= aAbsRect.Left();
                            // Abstand zur Umrandung mit einbeziehen
                            aRectangle.Right() -= (nOuterWidth - nTotalWidth) / 2;
                        }

                        if(nNum < rCols.Count())
                        {
                            aRectangle.Right() += MINLAY;
                        }
                        else
                            // rechts ist jetzt nur noch der Seitenrand
                            aRectangle.Right() = 0;


                    }
                }
                else if ( ((nFrmType & FRMTYPE_TABLE) || IsTabColFromDoc()) &&
                    !bFrmSelection )
                {
                    sal_Bool bColumn;
                    if ( IsTabColFromDoc() )
                        bColumn = rSh.GetCurMouseColNum( aTabColFromDocPos ) != 0;
                    else
                        bColumn = (nFrmType & (FRMTYPE_COLUMN|FRMTYPE_FLY_ANY|FRMTYPE_COLSECTOUTTAB)) 
                                  ? sal_True 
                                  : sal_False;
                    if ( !bColumn )
                    {
                        if( nFrmType & FRMTYPE_FLY_ANY && IsTabColFromDoc() )
                        {
                            SwRect aRect( rSh.GetAnyCurRect(
                                RECT_FLY_PRT_EMBEDDED, pPt ) );
                            aRect.Pos() += rSh.GetAnyCurRect( RECT_FLY_EMBEDDED,
                                pPt ).Pos();

                            aRectangle.Left()  = aRect.Left() - rPageRect.Left();
                            aRectangle.Right() = rPageRect.Right() - aRect.Right();
                        }
                        else if( bBrowse )
                        {
                            aRectangle.Left()  = rPagePrtRect.Left();
                            aRectangle.Right() = nPageWidth - rPagePrtRect.Right();
                        }
                        else
                        {
                            aRectangle.Left()  = aPageLRSpace.GetLeft();
                            aRectangle.Right() = aPageLRSpace.GetRight();
                        }
                    }
                    else
                    {	//hier nur fuer Tabelle in mehrspaltigen Seiten und Rahmen
                        sal_Bool bSectOutTbl = (nFrmType & FRMTYPE_TABLE) ? sal_True : sal_False;
                        sal_Bool bFrame = (nFrmType & FRMTYPE_FLY_ANY) ? sal_True : sal_False;
                        sal_Bool bColSct = 	(nFrmType & ( bSectOutTbl
                            ? FRMTYPE_COLSECTOUTTAB
                            : FRMTYPE_COLSECT )
                            ) ? sal_True : sal_False;
                        //Damit man auch mit der Mouse ziehen kann,
                        //ohne in der Tabelle zu stehen
                        CurRectType eRecType = RECT_PAGE_PRT;
                        sal_uInt16 nNum = IsTabColFromDoc() ?
                            rSh.GetCurMouseColNum( aTabColFromDocPos ):
                            rSh.GetCurOutColNum();
                        const SwFrmFmt* pFmt = NULL;
                        if( bColSct )
                        {
                            eRecType = bSectOutTbl ? RECT_OUTTABSECTION
                                : RECT_SECTION;
                            const SwSection *pSect = rSh.GetAnySection( bSectOutTbl, pPt );
                            ASSERT( pSect, "Welcher Bereich?");
                            pFmt = pSect->GetFmt();
                        }
                        else if( bFrame )
                        {
                            pFmt = rSh.GetFlyFrmFmt();
                            eRecType = RECT_FLY_PRT_EMBEDDED;
                        }

                        const SwFmtCol* pCols = pFmt ? &pFmt->GetCol():
                            &rDesc.GetMaster().GetCol();
                        const SwColumns& rCols = pCols->GetColumns();
                        const sal_uInt16 nBorder = pFmt ? pFmt->GetBox().GetDistance() :
                            rDesc.GetMaster().GetBox().GetDistance();

                        /* RECT_FLY_PRT_EMBEDDED returns the relative position to
                        RECT_FLY_EMBEDDED
                        the absolute position must be added here
                        */
                        SwRect aRect( rSh.GetAnyCurRect( eRecType, pPt ) );
                        if(RECT_FLY_PRT_EMBEDDED == eRecType)
                            aRect.Pos() += rSh.GetAnyCurRect( RECT_FLY_EMBEDDED,
                            pPt ).Pos();

                        const sal_uInt16 nTotalWidth = (sal_uInt16)aRect.Width();
                        //nStart und nEnd initialisieren fuer nNum == 0
                        int nWidth = 0,
                            nStart = 0,
                            nEnd = nTotalWidth;

                        if( nNum > rCols.Count() )
                        {
                            ASSERT( !this, "es wird auf dem falschen FmtCol gearbeitet!" );
                            nNum = rCols.Count();
                        }

                        for( sal_uInt16 i = 0; i < nNum; ++i )
                        {
                            SwColumn* pCol = rCols[i];
                            nStart = pCol->GetLeft() + nWidth;
                            nWidth += pCols->CalcColWidth( i, nTotalWidth );
                            nEnd = nWidth - pCol->GetRight();
                        }
                        if( bFrame | bColSct )
                        {
                            aRectangle.Left()  = aRect.Left() - rPageRect.Left() + nStart;
                            aRectangle.Right() = nPageWidth	- aRectangle.Left() - nEnd + nStart;
                        }
                        else if(!bBrowse)
                        {
                            aRectangle.Left()  = aPageLRSpace.GetLeft() + nStart;
                            aRectangle.Right() = nPageWidth - nEnd - aPageLRSpace.GetLeft();
                        }
                        else
                        {
                            long nLeft = rPagePrtRect.Left();
                            aRectangle.Left()  = nStart + nLeft;
                            aRectangle.Right() = nPageWidth - nEnd - nLeft;
                        }
                        if(!bFrame)
                        {
                            aRectangle.Left() += nBorder;
                            aRectangle.Right() -= nBorder;
                        }
                    }
                }
                else if ( nFrmType & ( FRMTYPE_HEADER  | FRMTYPE_FOOTER ))
                {
                    aRectangle.Left()  = aPageLRSpace.GetLeft();
                    aRectangle.Right() = aPageLRSpace.GetRight();
                }
                else
                    aRectangle.Left()  = aRectangle.Right() = 0;

                SfxRectangleItem aLR( SID_RULER_LR_MIN_MAX , aRectangle);
                rSet.Put(aLR);
            }
            break;

        case SID_RULER_PROTECT:
            {
                if(bFrmSelection)
                {
                    sal_uInt8 nProtect = pWrtShell->IsSelObjProtected( FLYPROTECT_SIZE|FLYPROTECT_POS|FLYPROTECT_CONTENT );

                    SvxProtectItem aProt(SID_RULER_PROTECT);
                    aProt.SetCntntProtect((nProtect & FLYPROTECT_CONTENT)	!= 0);
                    aProt.SetSizeProtect ((nProtect & FLYPROTECT_SIZE)		!= 0);
                    aProt.SetPosProtect  ((nProtect & FLYPROTECT_POS)		!= 0);
                    rSet.Put(aProt);
                }
                else
                {
                    SvxProtectItem aProtect(SID_RULER_PROTECT);
                    if(bBrowse && !(nFrmType & (FRMTYPE_DRAWOBJ|FRMTYPE_COLUMN)) && !rSh.GetTableFmt())
                    {
                        aProtect.SetSizeProtect(sal_True);
                        aProtect.SetPosProtect(sal_True);
                    }
                    rSet.Put(aProtect);
                }
            }
            break;
        }
        nWhich = aIter.NextWhich();
    }
    if(bPutContentProtection)
    {
        SvxProtectItem aProtect(SID_RULER_PROTECT);
        aProtect.SetCntntProtect(sal_True);
        rSet.Put(aProtect);
    }
}


