blob: 910e4eeb8fd716565046ca206da701a38de0cc97 [file] [log] [blame]
/**************************************************************
*
* 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.SetAttrItem( 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.SetAttrItem( 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.SetAttrItem( 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.SetAttrItem( 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 );
const 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);
}
}