1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sw.hxx" 30 31 32 #include <tools/list.hxx> 33 34 #include <hintids.hxx> 35 #include "uitool.hxx" 36 #include <sfx2/app.hxx> 37 #include <svx/rulritem.hxx> 38 #include <editeng/tstpitem.hxx> 39 #include <sfx2/request.hxx> 40 #include <editeng/lrspitem.hxx> 41 #include <editeng/ulspitem.hxx> 42 #include <editeng/boxitem.hxx> 43 #include <editeng/frmdiritem.hxx> 44 #include <svl/eitem.hxx> 45 #include <svl/whiter.hxx> 46 #include <svx/ruler.hxx> 47 #include <editeng/protitem.hxx> 48 #include <svl/rectitem.hxx> 49 #include <sfx2/bindings.hxx> 50 #include <fmtfsize.hxx> 51 #include <fmthdft.hxx> 52 #include <fmtclds.hxx> 53 #include <fmtornt.hxx> 54 #include <frmatr.hxx> 55 #include <edtwin.hxx> 56 #include "view.hxx" 57 #include "wrtsh.hxx" 58 #include "basesh.hxx" 59 #include "cmdid.h" 60 #include "viewopt.hxx" 61 #include "tabcol.hxx" 62 #include "frmfmt.hxx" // FrameFormat 63 #include "pagedesc.hxx" // Aktuelles Seitenformat 64 #include "wview.hxx" 65 #include "fmtcol.hxx" 66 #include "section.hxx" 67 68 // -> #i23726# 69 #include "ndtxt.hxx" 70 #include "pam.hxx" 71 // <- #i23726# 72 73 #include <IDocumentSettingAccess.hxx> 74 75 using namespace ::com::sun::star; 76 77 78 /*-------------------------------------------------------------------- 79 Beschreibung: Debug-Methode 80 --------------------------------------------------------------------*/ 81 82 83 /*-------------------------------------------------------------------- 84 Beschreibung: Columns eintueten 85 --------------------------------------------------------------------*/ 86 87 88 void lcl_FillSvxColumn(const SwFmtCol& rCol, 89 sal_uInt16 nTotalWidth, 90 SvxColumnItem& rColItem, 91 long nDistance) 92 { 93 const SwColumns& rCols = rCol.GetColumns(); 94 sal_uInt16 nWidth = 0; 95 96 sal_Bool bOrtho = rCol.IsOrtho() && rCols.Count(); 97 long nInnerWidth = 0; 98 if( bOrtho ) 99 { 100 nInnerWidth = nTotalWidth; 101 for ( sal_uInt16 i = 0; i < rCols.Count(); ++i ) 102 { 103 SwColumn* pCol = rCols[i]; 104 nInnerWidth -= pCol->GetLeft() + pCol->GetRight(); 105 } 106 if( nInnerWidth < 0 ) 107 nInnerWidth = 0; 108 else 109 nInnerWidth /= rCols.Count(); 110 } 111 for ( sal_uInt16 i = 0; i < rCols.Count(); ++i ) 112 { 113 SwColumn* pCol = rCols[i]; 114 const sal_uInt16 nStart = sal_uInt16(pCol->GetLeft() + nWidth + nDistance); 115 if( bOrtho ) 116 nWidth = static_cast< sal_uInt16 >(nWidth + nInnerWidth + pCol->GetLeft() + pCol->GetRight()); 117 else 118 nWidth = static_cast< sal_uInt16 >(nWidth + rCol.CalcColWidth(i, nTotalWidth)); 119 const sal_uInt16 nEnd = sal_uInt16(nWidth - pCol->GetRight() + nDistance); 120 121 SvxColumnDescription aColDesc(nStart, nEnd, sal_True); 122 rColItem.Append(aColDesc); 123 } 124 } 125 126 /*-------------------------------------------------------------------- 127 Beschreibung: ColumnItem in ColumnInfo ueberfuehren 128 --------------------------------------------------------------------*/ 129 130 131 void lcl_ConvertToCols(const SvxColumnItem& rColItem, 132 sal_uInt16 nTotalWidth, 133 SwFmtCol& rCols) 134 { 135 ASSERT( rCols.GetNumCols() == rColItem.Count(), "Column count mismatch" ); 136 // #126939# ruler executes that change the columns shortly after the selection has changed 137 // can result in a crash 138 if(rCols.GetNumCols() != rColItem.Count()) 139 return; 140 141 sal_uInt16 nLeft = 0; 142 SwTwips nSumAll= 0; // Summiere alle Spalten und Raender auf 143 144 SwColumns& rArr = rCols.GetColumns(); 145 146 // Tabcols der Reihe nach 147 for( sal_uInt16 i=0; i < rColItem.Count()-1; ++i ) 148 { 149 DBG_ASSERT(rColItem[i+1].nStart >= rColItem[i].nEnd,"\201berlappende Spalten" ); 150 sal_uInt16 nStart = static_cast< sal_uInt16 >(rColItem[i+1].nStart); 151 sal_uInt16 nEnd = static_cast< sal_uInt16 >(rColItem[i].nEnd); 152 if(nStart < nEnd) 153 nStart = nEnd; 154 const sal_uInt16 nDiff = nStart - nEnd; 155 const sal_uInt16 nRight = nDiff / 2; 156 157 sal_uInt16 nWidth = static_cast< sal_uInt16 >(rColItem[i].nEnd - rColItem[i].nStart); 158 nWidth += nLeft + nRight; 159 160 SwColumn* pCol = rArr[i]; 161 pCol->SetWishWidth( sal_uInt16(long(rCols.GetWishWidth()) * long(nWidth) / 162 long(nTotalWidth) )); 163 pCol->SetLeft( nLeft ); 164 pCol->SetRight( nRight ); 165 nSumAll += pCol->GetWishWidth(); 166 167 nLeft = nRight; 168 } 169 rArr[rColItem.Count()-1]->SetLeft( nLeft ); 170 171 //Die Differenz aus der Gesamtwunschbreite und der Summe der bisher berechneten 172 // Spalten und Raender sollte die Breite der letzten Spalte ergeben. 173 rArr[rColItem.Count()-1]->SetWishWidth( rCols.GetWishWidth() - (sal_uInt16)nSumAll ); 174 175 rCols.SetOrtho(sal_False, 0, 0 ); 176 } 177 178 /*-------------------------------------------------------------------- 179 Beschreibung: Tabs loeschen 180 --------------------------------------------------------------------*/ 181 182 183 void lcl_EraseDefTabs(SvxTabStopItem& rTabStops) 184 { 185 // Def Tabs loeschen 186 for ( sal_uInt16 i = 0; i < rTabStops.Count(); ) 187 { 188 // Hier auch den DefTab auf Null rausschmeissen 189 if ( SVX_TAB_ADJUST_DEFAULT == rTabStops[i].GetAdjustment() || 190 rTabStops[i].GetTabPos() == 0 ) 191 { 192 rTabStops.Remove(i); 193 continue; 194 } 195 ++i; 196 } 197 } 198 199 /*-------------------------------------------------------------------- 200 Beschreibung: Seitenrand umdrehen 201 --------------------------------------------------------------------*/ 202 203 204 void SwView::SwapPageMargin(const SwPageDesc& rDesc, SvxLRSpaceItem& rLRSpace) 205 { 206 sal_uInt16 nPhyPage, nVirPage; 207 GetWrtShell().GetPageNum( nPhyPage, nVirPage ); 208 209 if ( rDesc.GetUseOn() == nsUseOnPage::PD_MIRROR && (nPhyPage % 2) == 0 ) 210 { 211 long nTmp = rLRSpace.GetRight(); 212 rLRSpace.SetRight( rLRSpace.GetLeft() ); 213 rLRSpace.SetLeft( nTmp ); 214 } 215 } 216 217 /*-------------------------------------------------------------------- 218 Beschreibung: Wenn der Rahmenrand verschoben wird, sollen die 219 Spaltentrenner an der gleichen absoluten Position bleiben 220 --------------------------------------------------------------------*/ 221 222 223 void lcl_Scale(long& nVal, long nScale) 224 { 225 nVal *= nScale; 226 nVal >>= 8; 227 } 228 229 void ResizeFrameCols(SwFmtCol& rCol, 230 long nOldWidth, 231 long nNewWidth, 232 long nLeftDelta ) 233 { 234 SwColumns& rArr = rCol.GetColumns(); 235 long nWishSum = (long)rCol.GetWishWidth(); 236 long nWishDiff = (nWishSum * 100/nOldWidth * nNewWidth) / 100 - nWishSum; 237 long nNewWishWidth = nWishSum + nWishDiff; 238 if(nNewWishWidth > 0xffffl) 239 { 240 // wenn die Wunschbreite zu gross wird, dann muessen alle Werte passend skaliert werden 241 long nScale = (0xffffl << 8)/ nNewWishWidth; 242 for(sal_uInt16 i = 0; i < rArr.Count(); i++) 243 { 244 SwColumn* pCol = rArr.GetObject(i); 245 long nVal = pCol->GetWishWidth(); 246 lcl_Scale(nVal, nScale); 247 pCol->SetWishWidth((sal_uInt16) nVal); 248 nVal = pCol->GetLeft(); 249 lcl_Scale(nVal, nScale); 250 pCol->SetLeft((sal_uInt16) nVal); 251 nVal = pCol->GetRight(); 252 lcl_Scale(nVal, nScale); 253 pCol->SetRight((sal_uInt16) nVal); 254 } 255 lcl_Scale(nNewWishWidth, nScale); 256 lcl_Scale(nWishDiff, nScale); 257 } 258 rCol.SetWishWidth( (sal_uInt16) (nNewWishWidth) ); 259 260 if( nLeftDelta >= 2 || nLeftDelta <= -2) 261 rArr[0]->SetWishWidth(rArr[0]->GetWishWidth() + (sal_uInt16)nWishDiff); 262 else 263 rArr[rArr.Count()-1]->SetWishWidth(rArr[rArr.Count()-1]->GetWishWidth() + (sal_uInt16)nWishDiff); 264 //reset auto width 265 rCol.SetOrtho(sal_False, 0, 0 ); 266 } 267 /*-------------------------------------------------------------------- 268 Beschreibung: Hier werden alle Aenderungen der Tableiste 269 wieder in das Modell geschossen 270 --------------------------------------------------------------------*/ 271 272 273 void SwView::ExecTabWin( SfxRequest& rReq ) 274 { 275 SwWrtShell &rSh = GetWrtShell(); 276 const sal_uInt16 nFrmType = rSh.IsObjSelected() ? 277 FRMTYPE_DRAWOBJ : 278 rSh.GetFrmType(0,sal_True); 279 const sal_Bool bFrmSelection = rSh.IsFrmSelected(); 280 const sal_Bool bBrowse = rSh.GetViewOptions()->getBrowseMode(); 281 282 const sal_uInt16 nSlot = rReq.GetSlot(); 283 const sal_uInt16 nDescId = rSh.GetCurPageDesc(); 284 const SwPageDesc& rDesc = rSh.GetPageDesc( nDescId ); 285 286 const sal_Bool bVerticalWriting = rSh.IsInVerticalText(); 287 const SwFmtHeader& rHeaderFmt = rDesc.GetMaster().GetHeader(); 288 SwFrmFmt *pHeaderFmt = (SwFrmFmt*)rHeaderFmt.GetHeaderFmt(); 289 290 const SwFmtFooter& rFooterFmt = rDesc.GetMaster().GetFooter(); 291 SwFrmFmt *pFooterFmt = (SwFrmFmt*)rFooterFmt.GetFooterFmt(); 292 293 const SwFmtFrmSize &rFrmSize = rDesc.GetMaster().GetFrmSize(); 294 295 const SwRect& rPageRect = rSh.GetAnyCurRect(RECT_PAGE); 296 const long nPageWidth = bBrowse ? rPageRect.Width() : rFrmSize.GetWidth(); 297 const long nPageHeight = bBrowse ? rPageRect.Height() : rFrmSize.GetHeight(); 298 299 sal_Bool bUnlockView = sal_False; 300 rSh.StartAllAction(); 301 sal_Bool bSect = 0 != (nFrmType & FRMTYPE_COLSECT); 302 303 switch ( nSlot ) 304 { 305 case SID_ATTR_LONG_LRSPACE: 306 { 307 SvxLongLRSpaceItem aLongLR( (const SvxLongLRSpaceItem&)rReq.GetArgs()-> 308 Get( SID_ATTR_LONG_LRSPACE ) ); 309 SvxLRSpaceItem aLR(RES_LR_SPACE); 310 if ( !bSect && (bFrmSelection || nFrmType & FRMTYPE_FLY_ANY) ) 311 { 312 SwFrmFmt* pFmt = ((SwFrmFmt*)rSh.GetFlyFrmFmt()); 313 const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED); 314 315 sal_Bool bVerticalFrame(sal_False); 316 { 317 sal_Bool bRTL; 318 sal_Bool bVertL2R; 319 bVerticalFrame = ( bFrmSelection && 320 rSh.IsFrmVertical(sal_True, bRTL, bVertL2R) ) || 321 ( !bFrmSelection && bVerticalWriting); 322 } 323 long nDeltaX = bVerticalFrame ? 324 rRect.Right() - rPageRect.Right() + aLongLR.GetRight() : 325 rPageRect.Left() + aLongLR.GetLeft() - rRect.Left(); 326 327 SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE, 328 RES_VERT_ORIENT, RES_HORI_ORIENT, 329 RES_COL, RES_COL, 0 ); 330 331 if(bVerticalFrame) 332 { 333 SwFmtVertOrient aVertOrient(pFmt->GetVertOrient()); 334 aVertOrient.SetVertOrient(text::VertOrientation::NONE); 335 aVertOrient.SetPos(aVertOrient.GetPos() + nDeltaX ); 336 aSet.Put( aVertOrient ); 337 } 338 else 339 { 340 SwFmtHoriOrient aHoriOrient( pFmt->GetHoriOrient() ); 341 aHoriOrient.SetHoriOrient( text::HoriOrientation::NONE ); 342 aHoriOrient.SetPos( aHoriOrient.GetPos() + nDeltaX ); 343 aSet.Put( aHoriOrient ); 344 } 345 346 SwFmtFrmSize aSize( pFmt->GetFrmSize() ); 347 long nOldWidth = (long) aSize.GetWidth(); 348 349 if(aSize.GetWidthPercent()) 350 { 351 SwRect aRect; 352 rSh.CalcBoundRect(aRect, FLY_AS_CHAR); 353 long nPrtWidth = aRect.Width(); 354 aSize.SetWidthPercent(sal_uInt8((nPageWidth - aLongLR.GetLeft() - aLongLR.GetRight()) * 100 /nPrtWidth)); 355 } 356 else 357 aSize.SetWidth( nPageWidth - 358 (aLongLR.GetLeft() + aLongLR.GetRight())); 359 360 if( nFrmType & FRMTYPE_COLUMN ) 361 { 362 SwFmtCol aCol(pFmt->GetCol()); 363 364 ::ResizeFrameCols(aCol, nOldWidth, (long)aSize.GetWidth(), nDeltaX ); 365 aSet.Put(aCol); 366 } 367 368 aSet.Put( aSize ); 369 370 rSh.StartAction(); 371 rSh.Push(); 372 rSh.SetFlyFrmAttr( aSet ); 373 //die Rahmenselektion wieder aufheben 374 if(!bFrmSelection && rSh.IsFrmSelected()) 375 { 376 rSh.UnSelectFrm(); 377 rSh.LeaveSelFrmMode(); 378 } 379 rSh.Pop(); 380 rSh.EndAction(); 381 } 382 else if ( nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER )) 383 { 384 // Seitenraender rausrechnen 385 long nOld = rDesc.GetMaster().GetLRSpace().GetLeft(); 386 aLongLR.SetLeft( nOld > aLongLR.GetLeft() ? 0 : aLongLR.GetLeft() - nOld ); 387 388 nOld = rDesc.GetMaster().GetLRSpace().GetRight(); 389 aLongLR.SetRight( nOld > (sal_uInt16)aLongLR.GetRight() ? 0 : aLongLR.GetRight() - nOld ); 390 aLR.SetLeft((sal_uInt16)aLongLR.GetLeft()); 391 aLR.SetRight((sal_uInt16)aLongLR.GetRight()); 392 393 if ( nFrmType & FRMTYPE_HEADER && pHeaderFmt ) 394 pHeaderFmt->SetFmtAttr( aLR ); 395 else if( nFrmType & FRMTYPE_FOOTER && pFooterFmt ) 396 pFooterFmt->SetFmtAttr( aLR ); 397 } 398 else if( nFrmType == FRMTYPE_DRAWOBJ) 399 { 400 SwRect aRect( rSh.GetObjRect() ); 401 aRect.Left( aLongLR.GetLeft() + rPageRect.Left() ); 402 aRect.Right( rPageRect.Right() - aLongLR.GetRight()); 403 rSh.SetObjRect( aRect ); 404 } 405 else if(bSect || rSh.IsDirectlyInSection()) 406 { 407 //change the section indents and the columns if available 408 //at first determine the changes 409 SwRect aSectRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, 0); 410 const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, 0); 411 aSectRect.Pos() += aTmpRect.Pos(); 412 long nLeftDiff = aLongLR.GetLeft() - (long)(aSectRect.Left() - rPageRect.Left() ); 413 long nRightDiff = aLongLR.GetRight() - (long)( rPageRect.Right() - aSectRect.Right()); 414 //change the LRSpaceItem of the section accordingly 415 const SwSection* pCurrSect = rSh.GetCurrSection(); 416 const SwSectionFmt* pSectFmt = pCurrSect->GetFmt(); 417 SvxLRSpaceItem aLRTmp = pSectFmt->GetLRSpace(); 418 aLRTmp.SetLeft(aLRTmp.GetLeft() + nLeftDiff); 419 aLRTmp.SetRight(aLRTmp.GetRight() + nRightDiff); 420 SfxItemSet aSet(rSh.GetAttrPool(), RES_LR_SPACE, RES_LR_SPACE, RES_COL, RES_COL, 0L); 421 aSet.Put(aLRTmp); 422 //change the first/last column 423 if(bSect) 424 { 425 SwFmtCol aCols( pSectFmt->GetCol() ); 426 long nDiffWidth = nLeftDiff + nRightDiff; 427 ::ResizeFrameCols(aCols, aSectRect.Width(), aSectRect.Width() - nDiffWidth, nLeftDiff ); 428 aSet.Put( aCols ); 429 } 430 SwSectionData aData(*pCurrSect); 431 rSh.UpdateSection(rSh.GetSectionFmtPos(*pSectFmt), aData, &aSet); 432 } 433 else 434 { // Seitenraender einstellen 435 aLR.SetLeft((sal_uInt16)aLongLR.GetLeft()); 436 aLR.SetRight((sal_uInt16)aLongLR.GetRight()); 437 SwapPageMargin( rDesc, aLR ); 438 SwPageDesc aDesc( rDesc ); 439 aDesc.GetMaster().SetFmtAttr( aLR ); 440 rSh.ChgPageDesc( nDescId, aDesc ); 441 } 442 } 443 break; 444 case SID_ATTR_LONG_ULSPACE: 445 { 446 SvxLongULSpaceItem aLongULSpace( (const SvxLongULSpaceItem&)rReq.GetArgs()-> 447 Get( SID_ATTR_LONG_ULSPACE )); 448 449 if( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY ) 450 { 451 SwFrmFmt* pFmt = ((SwFrmFmt*)rSh.GetFlyFrmFmt()); 452 const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED); 453 const long nDeltaY = rPageRect.Top() + aLongULSpace.GetUpper() - rRect.Top(); 454 const long nHeight = nPageHeight - (aLongULSpace.GetUpper() + aLongULSpace.GetLower()); 455 456 SfxItemSet aSet( GetPool(), RES_FRM_SIZE, RES_FRM_SIZE, 457 RES_VERT_ORIENT, RES_HORI_ORIENT, 0 ); 458 //which of the orientation attributes is to be put depends on the frame's environment 459 sal_Bool bRTL; 460 sal_Bool bVertL2R; 461 if ( ( bFrmSelection && 462 rSh.IsFrmVertical(sal_True, bRTL, bVertL2R ) ) || 463 ( !bFrmSelection && bVerticalWriting ) ) 464 { 465 SwFmtHoriOrient aHoriOrient(pFmt->GetHoriOrient()); 466 aHoriOrient.SetHoriOrient(text::HoriOrientation::NONE); 467 aHoriOrient.SetPos(aHoriOrient.GetPos() + nDeltaY ); 468 aSet.Put( aHoriOrient ); 469 } 470 else 471 { 472 SwFmtVertOrient aVertOrient(pFmt->GetVertOrient()); 473 aVertOrient.SetVertOrient(text::VertOrientation::NONE); 474 aVertOrient.SetPos(aVertOrient.GetPos() + nDeltaY ); 475 aSet.Put( aVertOrient ); 476 } 477 SwFmtFrmSize aSize(pFmt->GetFrmSize()); 478 if(aSize.GetHeightPercent()) 479 { 480 SwRect aRect; 481 rSh.CalcBoundRect(aRect, FLY_AS_CHAR); 482 long nPrtHeight = aRect.Height(); 483 aSize.SetHeightPercent(sal_uInt8(nHeight * 100 /nPrtHeight)); 484 } 485 else 486 aSize.SetHeight(nHeight ); 487 488 aSet.Put( aSize ); 489 rSh.SetFlyFrmAttr( aSet ); 490 } 491 else if( nFrmType == FRMTYPE_DRAWOBJ ) 492 { 493 SwRect aRect( rSh.GetObjRect() ); 494 aRect.Top( aLongULSpace.GetUpper() + rPageRect.Top() ); 495 aRect.Bottom( rPageRect.Bottom() - aLongULSpace.GetLower() ); 496 rSh.SetObjRect( aRect ) ; 497 } 498 else if(bVerticalWriting && (bSect || rSh.IsDirectlyInSection())) 499 { 500 //change the section indents and the columns if available 501 //at first determine the changes 502 SwRect aSectRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, 0); 503 const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, 0); 504 aSectRect.Pos() += aTmpRect.Pos(); 505 const long nLeftDiff = aLongULSpace.GetUpper() - (long)(aSectRect.Top() - rPageRect.Top()); 506 const long nRightDiff = aLongULSpace.GetLower() - (long)(nPageHeight - aSectRect.Bottom() + rPageRect.Top()); 507 //change the LRSpaceItem of the section accordingly 508 const SwSection* pCurrSect = rSh.GetCurrSection(); 509 const SwSectionFmt* pSectFmt = pCurrSect->GetFmt(); 510 SvxLRSpaceItem aLR = pSectFmt->GetLRSpace(); 511 aLR.SetLeft(aLR.GetLeft() + nLeftDiff); 512 aLR.SetRight(aLR.GetRight() + nRightDiff); 513 SfxItemSet aSet(rSh.GetAttrPool(), RES_LR_SPACE, RES_LR_SPACE, RES_COL, RES_COL, 0L); 514 aSet.Put(aLR); 515 //change the first/last column 516 if(bSect) 517 { 518 SwFmtCol aCols( pSectFmt->GetCol() ); 519 long nDiffWidth = nLeftDiff + nRightDiff; 520 ::ResizeFrameCols(aCols, aSectRect.Height(), aSectRect.Height() - nDiffWidth, nLeftDiff ); 521 aSet.Put( aCols ); 522 } 523 SwSectionData aData(*pCurrSect); 524 rSh.UpdateSection(rSh.GetSectionFmtPos(*pSectFmt), aData, &aSet); 525 } 526 else 527 { SwPageDesc aDesc( rDesc ); 528 529 if ( nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER )) 530 { 531 532 const sal_Bool bHead = nFrmType & FRMTYPE_HEADER ? sal_True : sal_False; 533 SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() ); 534 if ( bHead ) 535 aUL.SetUpper( (sal_uInt16)aLongULSpace.GetUpper() ); 536 else 537 aUL.SetLower( (sal_uInt16)aLongULSpace.GetLower() ); 538 aDesc.GetMaster().SetFmtAttr( aUL ); 539 540 if( (bHead && pHeaderFmt) || (!bHead && pFooterFmt) ) 541 { 542 SwFmtFrmSize aSz( bHead ? pHeaderFmt->GetFrmSize() : 543 pFooterFmt->GetFrmSize() ); 544 aSz.SetHeightSizeType( ATT_FIX_SIZE ); 545 aSz.SetHeight(nPageHeight - aLongULSpace.GetLower() - 546 aLongULSpace.GetUpper() ); 547 if ( bHead ) 548 pHeaderFmt->SetFmtAttr( aSz ); 549 else 550 pFooterFmt->SetFmtAttr( aSz ); 551 } 552 } 553 else 554 { 555 SvxULSpaceItem aUL(RES_UL_SPACE); 556 aUL.SetUpper((sal_uInt16)aLongULSpace.GetUpper()); 557 aUL.SetLower((sal_uInt16)aLongULSpace.GetLower()); 558 aDesc.GetMaster().SetFmtAttr(aUL); 559 } 560 561 rSh.ChgPageDesc( nDescId, aDesc ); 562 } 563 } 564 break; 565 case SID_ATTR_TABSTOP_VERTICAL: 566 case SID_ATTR_TABSTOP: 567 { 568 sal_uInt16 nWhich = GetPool().GetWhich(nSlot); 569 SvxTabStopItem aTabStops( (const SvxTabStopItem&)rReq.GetArgs()-> 570 Get( nWhich )); 571 aTabStops.SetWhich(RES_PARATR_TABSTOP); 572 const SvxTabStopItem& rDefTabs = 573 (const SvxTabStopItem&)rSh.GetDefault(RES_PARATR_TABSTOP); 574 575 // Default-Tab an Pos 0 576 SfxItemSet aSet( GetPool(), RES_LR_SPACE, RES_LR_SPACE ); 577 rSh.GetCurAttr( aSet ); 578 const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)aSet.Get(RES_LR_SPACE); 579 580 if ( rLR.GetTxtFirstLineOfst() < 0 ) 581 { 582 SvxTabStop aSwTabStop( 0, SVX_TAB_ADJUST_DEFAULT ); 583 aTabStops.Insert( aSwTabStop ); 584 } 585 586 // auffuellen mit Default-Tabs 587 sal_uInt16 nDef = ::GetTabDist( rDefTabs ); 588 ::MakeDefTabs( nDef, aTabStops ); 589 590 SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl(); 591 if( pColl && pColl->IsAutoUpdateFmt() ) 592 { 593 SfxItemSet aTmp(GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP); 594 aTmp.Put(aTabStops); 595 rSh.AutoUpdatePara( pColl, aTmp ); 596 } 597 else 598 rSh.SetAttr( aTabStops ); 599 break; 600 } 601 case SID_ATTR_PARA_LRSPACE_VERTICAL: 602 case SID_ATTR_PARA_LRSPACE: 603 { 604 SvxLRSpaceItem aParaMargin((const SvxLRSpaceItem&)rReq. 605 GetArgs()->Get(nSlot)); 606 if(nFrmType & FRMTYPE_FLY_ANY) 607 { 608 sal_Bool bFirstColumn = sal_True; 609 sal_Bool bLastColumn = sal_True; 610 if(nFrmType & FRMTYPE_COLUMN) 611 { 612 sal_uInt16 nCurFrameCol = rSh.GetCurColNum() - 1; 613 bFirstColumn = !nCurFrameCol; 614 const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt(); 615 const SwFmtCol* pCols = &pFmt->GetCol(); 616 const SwColumns& rCols = pCols->GetColumns(); 617 sal_uInt16 nColumnCount = rCols.Count(); 618 bLastColumn = nColumnCount == nCurFrameCol + 1; 619 } 620 } 621 aParaMargin.SetRight( aParaMargin.GetRight() - nRightBorderDistance ); 622 aParaMargin.SetTxtLeft(aParaMargin.GetTxtLeft() - nLeftBorderDistance ); 623 624 aParaMargin.SetWhich( RES_LR_SPACE ); 625 SwTxtFmtColl* pColl = rSh.GetCurTxtFmtColl(); 626 627 // #i23726# 628 if (pNumRuleNodeFromDoc) 629 { 630 // --> FME 2005-02-22 #i42922# Mouse move of numbering label 631 // has to consider the left indent of the paragraph 632 SfxItemSet aSet( GetPool(), RES_LR_SPACE, RES_LR_SPACE ); 633 rSh.GetCurAttr( aSet ); 634 const SvxLRSpaceItem& rLR = 635 static_cast<const SvxLRSpaceItem&>(aSet.Get(RES_LR_SPACE)); 636 // <-- 637 638 SwPosition aPos(*pNumRuleNodeFromDoc); 639 // --> OD 2008-06-09 #i90078# 640 rSh.SetIndent( static_cast< short >(aParaMargin.GetTxtLeft() - rLR.GetTxtLeft()), aPos); 641 // <-- 642 // --> OD 2005-02-18 #i42921# - invalidate state of indent in order 643 // to get a ruler update. 644 aParaMargin.SetWhich( nSlot ); 645 GetViewFrame()->GetBindings().SetState( aParaMargin ); 646 // <-- 647 } 648 else if( pColl && pColl->IsAutoUpdateFmt() ) 649 { 650 SfxItemSet aSet(GetPool(), RES_LR_SPACE, RES_LR_SPACE); 651 aSet.Put(aParaMargin); 652 rSh.AutoUpdatePara( pColl, aSet); 653 } 654 else 655 rSh.SetAttr( aParaMargin ); 656 657 if ( aParaMargin.GetTxtFirstLineOfst() < 0 ) 658 { 659 SfxItemSet aSet( GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP ); 660 661 rSh.GetCurAttr( aSet ); 662 const SvxTabStopItem& rTabStops = (const SvxTabStopItem&)aSet.Get(RES_PARATR_TABSTOP); 663 664 // Haben wir einen Tab an Stelle Null 665 sal_uInt16 i; 666 667 for ( i = 0; i < rTabStops.Count(); ++i ) 668 if ( rTabStops[i].GetTabPos() == 0 ) 669 break; 670 671 if ( i >= rTabStops.Count() ) 672 { 673 // Kein DefTab 674 SvxTabStopItem aTabStops( RES_PARATR_TABSTOP ); 675 aTabStops = rTabStops; 676 677 ::lcl_EraseDefTabs(aTabStops); 678 679 SvxTabStop aSwTabStop( 0, SVX_TAB_ADJUST_DEFAULT ); 680 aTabStops.Insert(aSwTabStop); 681 682 const SvxTabStopItem& rDefTabs = 683 (const SvxTabStopItem&)rSh.GetDefault(RES_PARATR_TABSTOP); 684 sal_uInt16 nDef = ::GetTabDist(rDefTabs); 685 ::MakeDefTabs( nDef, aTabStops ); 686 687 if( pColl && pColl->IsAutoUpdateFmt()) 688 { 689 SfxItemSet aSetTmp(GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP); 690 aSetTmp.Put(aTabStops); 691 rSh.AutoUpdatePara( pColl, aSetTmp ); 692 } 693 else 694 rSh.SetAttr( aTabStops ); 695 } 696 } 697 } 698 break; 699 case SID_RULER_BORDERS_VERTICAL: 700 case SID_RULER_BORDERS: 701 { 702 SvxColumnItem aColItem((const SvxColumnItem&)rReq. 703 GetArgs()->Get(nSlot)); 704 705 if( bSetTabColFromDoc || (!bSect && rSh.GetTableFmt()) ) 706 { 707 ASSERT(aColItem.Count(), "ColDesc ist leer!!"); 708 709 const sal_Bool bSingleLine = ((const SfxBoolItem&)rReq. 710 GetArgs()->Get(SID_RULER_ACT_LINE_ONLY)).GetValue(); 711 712 SwTabCols aTabCols; 713 if ( bSetTabColFromDoc ) 714 rSh.GetMouseTabCols( aTabCols, aTabColFromDocPos ); 715 else 716 rSh.GetTabCols(aTabCols); 717 718 // linker Tabellenrand 719 long nBorder = (long)(aColItem.GetLeft() - aTabCols.GetLeftMin()); 720 aTabCols.SetLeft( nBorder ); 721 722 nBorder = (bVerticalWriting ? nPageHeight : nPageWidth) - aTabCols.GetLeftMin() - aColItem.GetRight(); 723 724 #ifdef DEBUG 725 long nTmp1 = nPageWidth; 726 long nTmp2 = aTabCols.GetLeftMin() + nBorder; 727 (void)nTmp1; 728 (void)nTmp2; 729 #endif 730 731 if ( aColItem.GetRight() > 0 ) 732 aTabCols.SetRight( nBorder ); 733 734 // Tabcols der Reihe nach 735 // Die letzte Col wird durch den Rand definiert 736 //columns in right-to-left tables need to be mirrored 737 sal_Bool bIsTableRTL = 738 IsTabColFromDoc() ? 739 rSh.IsMouseTableRightToLeft(aTabColFromDocPos) 740 : rSh.IsTableRightToLeft(); 741 if(bIsTableRTL) 742 { 743 sal_uInt16 nColCount = aColItem.Count() - 1; 744 for ( sal_uInt16 i = 0; i < nColCount; ++i ) 745 { 746 const SvxColumnDescription& rCol = aColItem[nColCount - i]; 747 aTabCols[i] = aTabCols.GetRight() - rCol.nStart; 748 aTabCols.SetHidden( i, !rCol.bVisible ); 749 } 750 } 751 else 752 { 753 for ( sal_uInt16 i = 0; i < aColItem.Count()-1; ++i ) 754 { 755 const SvxColumnDescription& rCol = aColItem[i]; 756 aTabCols[i] = rCol.nEnd + aTabCols.GetLeft(); 757 aTabCols.SetHidden( i, !rCol.bVisible ); 758 } 759 } 760 761 if ( bSetTabColFromDoc ) 762 { 763 if( !rSh.IsViewLocked() ) 764 { 765 bUnlockView = sal_True; 766 rSh.LockView( sal_True ); 767 } 768 rSh.SetMouseTabCols( aTabCols, bSingleLine, 769 aTabColFromDocPos ); 770 } 771 else 772 rSh.SetTabCols(aTabCols, bSingleLine); 773 774 } 775 else 776 { 777 if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY || bSect) 778 { 779 SwSectionFmt *pSectFmt = 0; 780 SfxItemSet aSet( GetPool(), RES_COL, RES_COL ); 781 if(bSect) 782 { 783 const SwSection *pSect = rSh.GetAnySection(); 784 ASSERT( pSect, "Welcher Bereich?"); 785 pSectFmt = pSect->GetFmt(); 786 } 787 else 788 { 789 rSh.GetFlyFrmAttr( aSet ); 790 } 791 SwFmtCol aCols( 792 bSect ? 793 pSectFmt->GetCol() : 794 (const SwFmtCol&)aSet.Get( RES_COL, sal_False )); 795 SwRect aCurRect = rSh.GetAnyCurRect(bSect ? RECT_SECTION_PRT : RECT_FLY_PRT_EMBEDDED); 796 const long lWidth = bVerticalWriting ? aCurRect.Height() : aCurRect.Width(); 797 ::lcl_ConvertToCols( aColItem, sal_uInt16(lWidth), aCols ); 798 aSet.Put( aCols ); 799 if(bSect) 800 rSh.SetSectionAttr( aSet, pSectFmt ); 801 else 802 { 803 rSh.StartAction(); 804 rSh.Push(); 805 rSh.SetFlyFrmAttr( aSet ); 806 //die Rahmenselektion wieder aufheben 807 if(!bFrmSelection && rSh.IsFrmSelected()) 808 { 809 rSh.UnSelectFrm(); 810 rSh.LeaveSelFrmMode(); 811 } 812 rSh.Pop(); 813 rSh.EndAction(); 814 } 815 } 816 else 817 { 818 SwFmtCol aCols( rDesc.GetMaster().GetCol() ); 819 const SwRect aPrtRect = rSh.GetAnyCurRect(RECT_PAGE_PRT); 820 ::lcl_ConvertToCols( aColItem, 821 sal_uInt16(bVerticalWriting ? aPrtRect.Height() : aPrtRect.Width()), 822 aCols ); 823 SwPageDesc aDesc( rDesc ); 824 aDesc.GetMaster().SetFmtAttr( aCols ); 825 rSh.ChgPageDesc( rSh.GetCurPageDesc(), aDesc ); 826 } 827 } 828 } 829 break; 830 831 case SID_RULER_ROWS : 832 case SID_RULER_ROWS_VERTICAL: 833 { 834 SvxColumnItem aColItem((const SvxColumnItem&)rReq. 835 GetArgs()->Get(nSlot)); 836 837 if( bSetTabColFromDoc || (!bSect && rSh.GetTableFmt()) ) 838 { 839 ASSERT(aColItem.Count(), "ColDesc ist leer!!"); 840 841 SwTabCols aTabCols; 842 if ( bSetTabRowFromDoc ) 843 rSh.GetMouseTabRows( aTabCols, aTabColFromDocPos ); 844 else 845 rSh.GetTabRows(aTabCols); 846 847 if ( bVerticalWriting ) 848 { 849 aTabCols.SetRight(nPageWidth - aColItem.GetRight() - aColItem.GetLeft()); 850 aTabCols.SetLeftMin(aColItem.GetLeft()); 851 } 852 else 853 { 854 long nBorder = nPageHeight - aTabCols.GetLeftMin() - aColItem.GetRight(); 855 aTabCols.SetRight( nBorder ); 856 } 857 858 if(bVerticalWriting) 859 { 860 for ( sal_uInt16 i = aColItem.Count() - 1; i; --i ) 861 { 862 const SvxColumnDescription& rCol = aColItem[i - 1]; 863 long nColumnPos = aTabCols.GetRight() - rCol.nEnd ; 864 aTabCols[i - 1] = nColumnPos; 865 aTabCols.SetHidden( i - 1, !rCol.bVisible ); 866 } 867 } 868 else 869 { 870 for ( sal_uInt16 i = 0; i < aColItem.Count()-1; ++i ) 871 { 872 const SvxColumnDescription& rCol = aColItem[i]; 873 aTabCols[i] = rCol.nEnd + aTabCols.GetLeft(); 874 aTabCols.SetHidden( i, !rCol.bVisible ); 875 } 876 } 877 sal_Bool bSingleLine = sal_False; 878 const SfxPoolItem* pSingleLine; 879 if( SFX_ITEM_SET == rReq.GetArgs()->GetItemState(SID_RULER_ACT_LINE_ONLY, sal_False, &pSingleLine)) 880 bSingleLine = ((const SfxBoolItem*)pSingleLine)->GetValue(); 881 if ( bSetTabRowFromDoc ) 882 { 883 if( !rSh.IsViewLocked() ) 884 { 885 bUnlockView = sal_True; 886 rSh.LockView( sal_True ); 887 } 888 rSh.SetMouseTabRows( aTabCols, bSingleLine, aTabColFromDocPos ); 889 } 890 else 891 rSh.SetTabRows(aTabCols, bSingleLine); 892 } 893 } 894 break; 895 896 default: 897 ASSERT( !this, "Falsche SlotId"); 898 } 899 rSh.EndAllAction(); 900 901 if( bUnlockView ) 902 rSh.LockView( sal_False ); 903 904 bSetTabColFromDoc = bSetTabRowFromDoc = bTabColFromDoc = bTabRowFromDoc = sal_False; 905 SetNumRuleNodeFromDoc(NULL); 906 } 907 908 /*-------------------------------------------------------------------- 909 Beschreibung: Hier wird der Status der Tableiste ermittelt 910 sprich alle relevanten Attribute an der CursorPos 911 werden der Tableiste uebermittelt 912 --------------------------------------------------------------------*/ 913 914 915 void SwView::StateTabWin(SfxItemSet& rSet) 916 { 917 SwWrtShell &rSh = GetWrtShell(); 918 919 const Point* pPt = IsTabColFromDoc() || IsTabRowFromDoc() ? &aTabColFromDocPos : 0; 920 const sal_uInt16 nFrmType = rSh.IsObjSelected() 921 ? FRMTYPE_DRAWOBJ 922 : rSh.GetFrmType( pPt, sal_True ); 923 924 const sal_Bool bFrmSelection = rSh.IsFrmSelected(); 925 const sal_Bool bBrowse = rSh.GetViewOptions()->getBrowseMode(); 926 // PageOffset/Begrenzer 927 const SwRect& rPageRect = rSh.GetAnyCurRect( RECT_PAGE, pPt ); 928 const SwRect& rPagePrtRect = rSh.GetAnyCurRect( RECT_PAGE_PRT, pPt ); 929 const long nPageWidth = rPageRect.Width(); 930 const long nPageHeight = rPageRect.Height(); 931 932 const SwPageDesc& rDesc = rSh.GetPageDesc( 933 IsTabColFromDoc() || bTabRowFromDoc ? 934 rSh.GetMousePageDesc(aTabColFromDocPos) : rSh.GetCurPageDesc() ); 935 936 const SvxFrameDirectionItem& rFrameDir = rDesc.GetMaster().GetFrmDir(); 937 const sal_Bool bVerticalWriting = rSh.IsInVerticalText(); 938 939 //enable tab stop display on the rulers depending on the writing direction 940 WinBits nRulerStyle = pHRuler->GetStyle() & ~WB_EXTRAFIELD; 941 pHRuler->SetStyle(bVerticalWriting||bBrowse ? nRulerStyle : nRulerStyle|WB_EXTRAFIELD); 942 nRulerStyle = pVRuler->GetStyle() & ~WB_EXTRAFIELD; 943 pVRuler->SetStyle(bVerticalWriting ? nRulerStyle|WB_EXTRAFIELD : nRulerStyle); 944 945 //#i24363# tab stops relative to indent 946 bool bRelative = rSh.getIDocumentSettingAccess()->get(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT); 947 pHRuler->SetTabsRelativeToIndent( bRelative ); 948 pVRuler->SetTabsRelativeToIndent( bRelative ); 949 950 SvxLRSpaceItem aPageLRSpace( rDesc.GetMaster().GetLRSpace() ); 951 SwapPageMargin( rDesc, aPageLRSpace ); 952 953 SfxItemSet aCoreSet( GetPool(), RES_PARATR_TABSTOP, RES_PARATR_TABSTOP, 954 RES_LR_SPACE, RES_UL_SPACE, 0 ); 955 // --> OD 2008-01-17 #newlistlevelattrs# 956 // get also the list level indent values merged as LR-SPACE item, if needed. 957 rSh.GetCurAttr( aCoreSet, true ); 958 // <-- 959 SelectionType nSelType = rSh.GetSelectionType(); 960 961 SfxWhichIter aIter( rSet ); 962 sal_uInt16 nWhich = aIter.FirstWhich(); 963 sal_Bool bPutContentProtection = sal_False; 964 965 while ( nWhich ) 966 { 967 switch ( nWhich ) 968 { 969 // case RES_LR_SPACE: 970 // case SID_ATTR_LRSPACE: 971 case SID_ATTR_LONG_LRSPACE: 972 { 973 SvxLongLRSpaceItem aLongLR( (long)aPageLRSpace.GetLeft(), 974 (long)aPageLRSpace.GetRight(), 975 SID_ATTR_LONG_LRSPACE); 976 if(bBrowse) 977 { 978 aLongLR.SetLeft(rPagePrtRect.Left()); 979 aLongLR.SetRight(nPageWidth - rPagePrtRect.Right()); 980 } 981 if ( ( nFrmType & FRMTYPE_HEADER || nFrmType & FRMTYPE_FOOTER ) && 982 !(nFrmType & FRMTYPE_COLSECT) ) 983 { 984 SwFrmFmt *pFmt = (SwFrmFmt*) (nFrmType & FRMTYPE_HEADER ? 985 rDesc.GetMaster().GetHeader().GetHeaderFmt() : 986 rDesc.GetMaster().GetFooter().GetFooterFmt()); 987 if( pFmt )// #i80890# if rDesc is not the one belonging to the current page is might crash 988 { 989 SwRect aRect( rSh.GetAnyCurRect( RECT_HEADERFOOTER, pPt)); 990 aRect.Pos() -= rSh.GetAnyCurRect( RECT_PAGE, pPt ).Pos(); 991 const SvxLRSpaceItem& aLR = pFmt->GetLRSpace(); 992 aLongLR.SetLeft ( (long)aLR.GetLeft() + (long)aRect.Left() ); 993 aLongLR.SetRight( (nPageWidth - 994 (long)aRect.Right() + (long)aLR.GetRight())); 995 } 996 } 997 else 998 { 999 SwRect aRect; 1000 if( !bFrmSelection && ((nFrmType & FRMTYPE_COLSECT) || rSh.IsDirectlyInSection()) ) 1001 { 1002 aRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, pPt); 1003 const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, pPt); 1004 aRect.Pos() += aTmpRect.Pos(); 1005 } 1006 1007 else if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY ) 1008 aRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt); 1009 else if( nFrmType & FRMTYPE_DRAWOBJ) 1010 aRect = rSh.GetObjRect(); 1011 1012 if( aRect.Width() ) 1013 { 1014 // PAGES01 1015 // make relative to page position: 1016 aLongLR.SetLeft ((long)( aRect.Left() - rPageRect.Left() )); 1017 aLongLR.SetRight((long)( rPageRect.Right() - aRect.Right())); 1018 } 1019 } 1020 if( nWhich == SID_ATTR_LONG_LRSPACE ) 1021 rSet.Put( aLongLR ); 1022 else 1023 { 1024 SvxLRSpaceItem aLR( aLongLR.GetLeft(), 1025 aLongLR.GetRight(), 1026 0, 0, 1027 nWhich); 1028 rSet.Put(aLR); 1029 } 1030 break; 1031 } 1032 case SID_ATTR_LONG_ULSPACE: 1033 // case SID_ATTR_ULSPACE: 1034 // case RES_UL_SPACE: 1035 { 1036 // Rand Seite Oben Unten 1037 SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() ); 1038 SvxLongULSpaceItem aLongUL( (long)aUL.GetUpper(), 1039 (long)aUL.GetLower(), 1040 SID_ATTR_LONG_ULSPACE); 1041 1042 if ( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY ) 1043 { 1044 // Dokumentkoordinaten Frame auf Seitenkoordinaten umbrechen 1045 const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt); 1046 aLongUL.SetUpper((sal_uInt16)(rRect.Top() - rPageRect.Top() )); 1047 aLongUL.SetLower((sal_uInt16)(rPageRect.Bottom() - rRect.Bottom() )); 1048 } 1049 else if ( nFrmType & FRMTYPE_HEADER || nFrmType & FRMTYPE_FOOTER ) 1050 { 1051 SwRect aRect( rSh.GetAnyCurRect( RECT_HEADERFOOTER, pPt)); 1052 aRect.Pos() -= rSh.GetAnyCurRect( RECT_PAGE, pPt ).Pos(); 1053 aLongUL.SetUpper( (sal_uInt16)aRect.Top() ); 1054 aLongUL.SetLower( (sal_uInt16)(nPageHeight - aRect.Bottom()) ); 1055 } 1056 else if( nFrmType & FRMTYPE_DRAWOBJ) 1057 { 1058 const SwRect &rRect = rSh.GetObjRect(); 1059 aLongUL.SetUpper((rRect.Top() - rPageRect.Top())); 1060 aLongUL.SetLower((rPageRect.Bottom() - rRect.Bottom())); 1061 } 1062 else if(bBrowse) 1063 { 1064 aLongUL.SetUpper(rPagePrtRect.Top()); 1065 aLongUL.SetLower(nPageHeight - rPagePrtRect.Bottom()); 1066 } 1067 if( nWhich == SID_ATTR_LONG_ULSPACE ) 1068 rSet.Put( aLongUL ); 1069 else 1070 { 1071 SvxULSpaceItem aULTmp((sal_uInt16)aLongUL.GetUpper(), 1072 (sal_uInt16)aLongUL.GetLower(), 1073 nWhich); 1074 rSet.Put(aULTmp); 1075 } 1076 break; 1077 } 1078 case SID_ATTR_TABSTOP_VERTICAL : 1079 case RES_PARATR_TABSTOP: 1080 { 1081 if ( ISA( SwWebView ) || 1082 IsTabColFromDoc() || 1083 IsTabRowFromDoc() || 1084 ( nSelType & nsSelectionType::SEL_GRF) || 1085 (nSelType & nsSelectionType::SEL_FRM) || 1086 (nSelType & nsSelectionType::SEL_OLE) || 1087 SFX_ITEM_AVAILABLE > aCoreSet.GetItemState(RES_LR_SPACE)|| 1088 (!bVerticalWriting && (SID_ATTR_TABSTOP_VERTICAL == nWhich))|| 1089 (bVerticalWriting && (RES_PARATR_TABSTOP == nWhich)) 1090 ) 1091 rSet.DisableItem( nWhich ); 1092 else 1093 { 1094 SvxTabStopItem aTabStops((const SvxTabStopItem&) 1095 aCoreSet.Get( RES_PARATR_TABSTOP )); 1096 1097 const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&) 1098 rSh.GetDefault(RES_PARATR_TABSTOP); 1099 1100 DBG_ASSERT(pHRuler, "warum ist das Lineal nicht da?"); 1101 long nDefTabDist = ::GetTabDist(rDefTabs); 1102 pHRuler->SetDefTabDist( nDefTabDist ); 1103 pVRuler->SetDefTabDist( nDefTabDist ); 1104 ::lcl_EraseDefTabs(aTabStops); 1105 rSet.Put(aTabStops, nWhich); 1106 } 1107 break; 1108 } 1109 case SID_ATTR_PARA_LRSPACE_VERTICAL: 1110 case SID_ATTR_PARA_LRSPACE: 1111 { 1112 if ( nSelType & nsSelectionType::SEL_GRF || 1113 nSelType & nsSelectionType::SEL_FRM || 1114 nSelType & nsSelectionType::SEL_OLE || 1115 nFrmType == FRMTYPE_DRAWOBJ || 1116 (!bVerticalWriting && (SID_ATTR_PARA_LRSPACE_VERTICAL == nWhich))|| 1117 (bVerticalWriting && (SID_ATTR_PARA_LRSPACE == nWhich)) 1118 ) 1119 { 1120 rSet.DisableItem(nWhich); 1121 } 1122 else 1123 { 1124 SvxLRSpaceItem aLR( RES_LR_SPACE ); 1125 if ( !IsTabColFromDoc() ) 1126 { 1127 aLR = (const SvxLRSpaceItem&)aCoreSet.Get(RES_LR_SPACE); 1128 1129 // #i23726# 1130 if (pNumRuleNodeFromDoc) 1131 { 1132 short nOffset = static_cast< short >(aLR.GetTxtLeft() + 1133 // --> FME 2005-02-22 #i42922# Mouse move of numbering label 1134 // has to consider the left indent of the paragraph 1135 pNumRuleNodeFromDoc->GetLeftMarginWithNum( sal_True ) ); 1136 // <-- 1137 1138 short nFLOffset; 1139 pNumRuleNodeFromDoc->GetFirstLineOfsWithNum( nFLOffset ); 1140 1141 aLR.SetLeft( nOffset + nFLOffset ); 1142 } 1143 } 1144 aLR.SetWhich(nWhich); 1145 rSet.Put(aLR); 1146 } 1147 break; 1148 } 1149 case SID_RULER_BORDER_DISTANCE: 1150 { 1151 nLeftBorderDistance = 0; 1152 nRightBorderDistance = 0; 1153 if ( nSelType & nsSelectionType::SEL_GRF || 1154 nSelType & nsSelectionType::SEL_FRM || 1155 nSelType & nsSelectionType::SEL_OLE || 1156 nFrmType == FRMTYPE_DRAWOBJ ) 1157 rSet.DisableItem(SID_RULER_BORDER_DISTANCE); 1158 else 1159 { 1160 SvxLRSpaceItem aDistLR(SID_RULER_BORDER_DISTANCE); 1161 if(nFrmType & FRMTYPE_FLY_ANY) 1162 { 1163 if( IsTabColFromDoc() ) 1164 { 1165 const SwRect& rFlyPrtRect = rSh.GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, pPt ); 1166 aDistLR.SetLeft(rFlyPrtRect.Left()); 1167 aDistLR.SetRight(rFlyPrtRect.Left()); 1168 } 1169 else 1170 { 1171 SfxItemSet aCoreSet2( GetPool(), 1172 RES_BOX, RES_BOX, 1173 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 ); 1174 SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER ); 1175 aCoreSet.Put( aBoxInfo ); 1176 rSh.GetFlyFrmAttr( aCoreSet ); 1177 const SvxBoxItem& rBox = (const SvxBoxItem&)aCoreSet.Get(RES_BOX); 1178 aDistLR.SetLeft((sal_uInt16)rBox.GetDistance(BOX_LINE_LEFT )); 1179 aDistLR.SetRight((sal_uInt16)rBox.GetDistance(BOX_LINE_RIGHT)); 1180 1181 //add the paragraph border distance 1182 SfxItemSet aCoreSet1( GetPool(), 1183 RES_BOX, RES_BOX, 1184 0 ); 1185 rSh.GetCurAttr( aCoreSet1 ); 1186 const SvxBoxItem& rParaBox = (const SvxBoxItem&)aCoreSet1.Get(RES_BOX); 1187 aDistLR.SetLeft(aDistLR.GetLeft() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_LEFT )); 1188 aDistLR.SetRight(aDistLR.GetRight() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_RIGHT)); 1189 } 1190 rSet.Put(aDistLR); 1191 nLeftBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetLeft()); 1192 nRightBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetRight()); 1193 } 1194 else if ( IsTabColFromDoc() || 1195 ( rSh.GetTableFmt() && !bFrmSelection && 1196 !(nFrmType & FRMTYPE_COLSECT ) ) ) 1197 { 1198 SfxItemSet aCoreSet2( GetPool(), 1199 RES_BOX, RES_BOX, 1200 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 ); 1201 SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER ); 1202 aBoxInfo.SetTable(sal_False); 1203 aBoxInfo.SetDist((sal_Bool) sal_True); 1204 aCoreSet2.Put(aBoxInfo); 1205 rSh.GetTabBorders( aCoreSet2 ); 1206 const SvxBoxItem& rBox = (const SvxBoxItem&)aCoreSet2.Get(RES_BOX); 1207 aDistLR.SetLeft((sal_uInt16)rBox.GetDistance(BOX_LINE_LEFT )); 1208 aDistLR.SetRight((sal_uInt16)rBox.GetDistance(BOX_LINE_RIGHT)); 1209 1210 //add the border distance of the paragraph 1211 SfxItemSet aCoreSet1( GetPool(), 1212 RES_BOX, RES_BOX, 1213 0 ); 1214 rSh.GetCurAttr( aCoreSet1 ); 1215 const SvxBoxItem& rParaBox = (const SvxBoxItem&)aCoreSet1.Get(RES_BOX); 1216 aDistLR.SetLeft(aDistLR.GetLeft() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_LEFT )); 1217 aDistLR.SetRight(aDistLR.GetRight() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_RIGHT)); 1218 rSet.Put(aDistLR); 1219 nLeftBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetLeft()); 1220 nRightBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetRight()); 1221 } 1222 else if ( !rSh.IsDirectlyInSection() ) 1223 { 1224 //get the page/header/footer border distance 1225 const SwFrmFmt& rMaster = rDesc.GetMaster(); 1226 const SvxBoxItem& rBox = (const SvxBoxItem&)rMaster.GetAttrSet().Get(RES_BOX); 1227 aDistLR.SetLeft((sal_uInt16)rBox.GetDistance(BOX_LINE_LEFT )); 1228 aDistLR.SetRight((sal_uInt16)rBox.GetDistance(BOX_LINE_RIGHT)); 1229 1230 const SvxBoxItem* pBox = 0; 1231 if(nFrmType & FRMTYPE_HEADER) 1232 { 1233 rMaster.GetHeader(); 1234 const SwFmtHeader& rHeaderFmt = rMaster.GetHeader(); 1235 SwFrmFmt *pHeaderFmt = (SwFrmFmt*)rHeaderFmt.GetHeaderFmt(); 1236 if( pHeaderFmt )// #i80890# if rDesc is not the one belonging to the current page is might crash 1237 pBox = & (const SvxBoxItem&)pHeaderFmt->GetBox(); 1238 } 1239 else if(nFrmType & FRMTYPE_FOOTER ) 1240 { 1241 const SwFmtFooter& rFooterFmt = rMaster.GetFooter(); 1242 SwFrmFmt *pFooterFmt = (SwFrmFmt*)rFooterFmt.GetFooterFmt(); 1243 if( pFooterFmt )// #i80890# if rDesc is not the one belonging to the current page is might crash 1244 pBox = & (const SvxBoxItem&)pFooterFmt->GetBox(); 1245 } 1246 if(pBox) 1247 { 1248 aDistLR.SetLeft((sal_uInt16)pBox->GetDistance(BOX_LINE_LEFT )); 1249 aDistLR.SetRight((sal_uInt16)pBox->GetDistance(BOX_LINE_RIGHT)); 1250 } 1251 1252 //add the border distance of the paragraph 1253 SfxItemSet aCoreSetTmp( GetPool(), 1254 RES_BOX, RES_BOX, 1255 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0 ); 1256 rSh.GetCurAttr( aCoreSetTmp ); 1257 const SvxBoxItem& rParaBox = (const SvxBoxItem&)aCoreSetTmp.Get(RES_BOX); 1258 aDistLR.SetLeft(aDistLR.GetLeft() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_LEFT )); 1259 aDistLR.SetRight(aDistLR.GetRight() + (sal_uInt16)rParaBox.GetDistance(BOX_LINE_RIGHT)); 1260 rSet.Put(aDistLR); 1261 nLeftBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetLeft()); 1262 nRightBorderDistance = static_cast< sal_uInt16 >(aDistLR.GetRight()); 1263 } 1264 } 1265 } 1266 break; 1267 case SID_RULER_TEXT_RIGHT_TO_LEFT: 1268 { 1269 if ( nSelType & nsSelectionType::SEL_GRF || 1270 nSelType & nsSelectionType::SEL_FRM || 1271 nSelType & nsSelectionType::SEL_OLE || 1272 nFrmType == FRMTYPE_DRAWOBJ) 1273 rSet.DisableItem(nWhich); 1274 else 1275 { 1276 sal_Bool bFlag = rSh.IsInRightToLeftText(); 1277 rSet.Put(SfxBoolItem(nWhich, bFlag)); 1278 } 1279 } 1280 break; 1281 case SID_RULER_BORDERS_VERTICAL: 1282 case SID_RULER_BORDERS: 1283 { 1284 sal_Bool bFrameHasVerticalColumns(sal_False); 1285 { 1286 sal_Bool bFrameRTL; 1287 sal_Bool bFrameVertL2R; 1288 bFrameHasVerticalColumns = rSh.IsFrmVertical(sal_False, bFrameRTL, bFrameVertL2R) && 1289 bFrmSelection; 1290 } 1291 sal_Bool bHasTable = ( IsTabColFromDoc() || 1292 ( rSh.GetTableFmt() && !bFrmSelection && 1293 !(nFrmType & FRMTYPE_COLSECT ) ) ); 1294 1295 sal_Bool bTableVertical = bHasTable && rSh.IsTableVertical(); 1296 1297 if( ( (SID_RULER_BORDERS_VERTICAL == nWhich) && 1298 ((bHasTable && !bTableVertical)|| 1299 (!bVerticalWriting && !bFrmSelection && !bHasTable ) || (bFrmSelection && !bFrameHasVerticalColumns)) ) || 1300 ((SID_RULER_BORDERS == nWhich) && 1301 ((bHasTable && bTableVertical)|| 1302 (bVerticalWriting && !bFrmSelection&& !bHasTable) || bFrameHasVerticalColumns))) 1303 rSet.DisableItem(nWhich); 1304 else if ( bHasTable ) 1305 { 1306 SwTabCols aTabCols; 1307 sal_uInt16 nNum; 1308 if ( 0 != ( bSetTabColFromDoc = IsTabColFromDoc() ) ) 1309 { 1310 rSh.GetMouseTabCols( aTabCols, aTabColFromDocPos ); 1311 nNum = rSh.GetCurMouseTabColNum( aTabColFromDocPos ); 1312 } 1313 else 1314 { 1315 rSh.GetTabCols( aTabCols ); 1316 nNum = rSh.GetCurTabColNum(); 1317 if(rSh.IsTableRightToLeft()) 1318 nNum = aTabCols.Count() - nNum; 1319 } 1320 1321 ASSERT(nNum <= aTabCols.Count(), "TabCol not found"); 1322 const int nLft = aTabCols.GetLeftMin() + aTabCols.GetLeft(); 1323 const int nRgt = (sal_uInt16)(bTableVertical ? nPageHeight : nPageWidth) - 1324 (aTabCols.GetLeftMin() + 1325 aTabCols.GetRight()); 1326 1327 const sal_uInt16 nL = static_cast< sal_uInt16 >(nLft > 0 ? nLft : 0); 1328 const sal_uInt16 nR = static_cast< sal_uInt16 >(nRgt > 0 ? nRgt : 0); 1329 1330 SvxColumnItem aColItem(nNum, nL, nR); 1331 1332 sal_uInt16 nStart = 0, 1333 nEnd; 1334 1335 //columns in right-to-left tables need to be mirrored 1336 sal_Bool bIsTableRTL = 1337 IsTabColFromDoc() ? 1338 rSh.IsMouseTableRightToLeft(aTabColFromDocPos) 1339 : rSh.IsTableRightToLeft(); 1340 if(bIsTableRTL) 1341 { 1342 for ( sal_uInt16 i = aTabCols.Count(); i ; --i ) 1343 { 1344 const SwTabColsEntry& rEntry = aTabCols.GetEntry( i - 1 ); 1345 nEnd = (sal_uInt16)aTabCols.GetRight(); 1346 nEnd = nEnd - (sal_uInt16)rEntry.nPos; 1347 SvxColumnDescription aColDesc( nStart, nEnd, 1348 (sal_uInt16(aTabCols.GetRight() - rEntry.nMax)), 1349 (sal_uInt16(aTabCols.GetRight() - rEntry.nMin)), 1350 !aTabCols.IsHidden(i - 1) ); 1351 aColItem.Append(aColDesc); 1352 nStart = nEnd; 1353 } 1354 SvxColumnDescription aColDesc(nStart, 1355 aTabCols.GetRight() - aTabCols.GetLeft(), sal_True); 1356 aColItem.Append(aColDesc); 1357 } 1358 else 1359 { 1360 for ( sal_uInt16 i = 0; i < aTabCols.Count(); ++i ) 1361 { 1362 const SwTabColsEntry& rEntry = aTabCols.GetEntry( i ); 1363 nEnd = static_cast< sal_uInt16 >(rEntry.nPos - aTabCols.GetLeft()); 1364 SvxColumnDescription aColDesc( nStart, nEnd, 1365 rEntry.nMin - aTabCols.GetLeft(), rEntry.nMax - aTabCols.GetLeft(), 1366 !aTabCols.IsHidden(i) ); 1367 aColItem.Append(aColDesc); 1368 nStart = nEnd; 1369 } 1370 SvxColumnDescription aColDesc(nStart, aTabCols.GetRight() - aTabCols.GetLeft(), 1371 0, 0, 1372 sal_True); 1373 aColItem.Append(aColDesc); 1374 } 1375 rSet.Put(aColItem, nWhich); 1376 } 1377 else if ( bFrmSelection || nFrmType & ( FRMTYPE_COLUMN | FRMTYPE_COLSECT ) ) 1378 { 1379 // Aus Rahmen oder Seite ? 1380 sal_uInt16 nNum = 0; 1381 if(bFrmSelection) 1382 { 1383 const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt(); 1384 if(pFmt) 1385 nNum = pFmt->GetCol().GetNumCols(); 1386 } 1387 else 1388 nNum = rSh.GetCurColNum(); 1389 1390 if( 1391 //eigentlich sollte FRMTYPE_COLSECT nicht enthalten sein, wenn der Rahmen selektiert ist! 1392 !bFrmSelection && 1393 nFrmType & FRMTYPE_COLSECT ) 1394 { 1395 const SwSection *pSect = rSh.GetAnySection(sal_False, pPt); 1396 ASSERT( pSect, "Welcher Bereich?"); 1397 if( pSect ) 1398 { 1399 SwSectionFmt *pFmt = pSect->GetFmt(); 1400 const SwFmtCol& rCol = pFmt->GetCol(); 1401 if(rSh.IsInRightToLeftText()) 1402 nNum = rCol.GetColumns().Count() - nNum; 1403 else 1404 --nNum; 1405 SvxColumnItem aColItem(nNum); 1406 SwRect aRect = rSh.GetAnyCurRect(RECT_SECTION_PRT, pPt); 1407 const SwRect aTmpRect = rSh.GetAnyCurRect(RECT_SECTION, pPt); 1408 1409 ::lcl_FillSvxColumn(rCol, sal_uInt16(bVerticalWriting ? aRect.Height() : aRect.Width()), aColItem, 0); 1410 1411 if(bVerticalWriting) 1412 { 1413 aRect.Pos() += Point(aTmpRect.Left(), aTmpRect.Top()); 1414 aRect.Pos().Y() -= rPageRect.Top(); 1415 aColItem.SetLeft ((sal_uInt16)(aRect.Top())); 1416 aColItem.SetRight((sal_uInt16)(nPageHeight - aRect.Bottom() )); 1417 } 1418 else 1419 { 1420 aRect.Pos() += aTmpRect.Pos(); 1421 1422 // PAGES01 1423 // make relative to page position: 1424 aColItem.SetLeft ((sal_uInt16)( aRect.Left() - rPageRect.Left() )); 1425 aColItem.SetRight((sal_uInt16)( rPageRect.Right() - aRect.Right())); 1426 } 1427 aColItem.SetOrtho(aColItem.CalcOrtho()); 1428 1429 rSet.Put(aColItem, nWhich); 1430 } 1431 } 1432 else if( bFrmSelection || nFrmType & FRMTYPE_FLY_ANY ) 1433 { 1434 // Spalten in Rahmen 1435 if ( nNum ) 1436 { 1437 const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt() ; 1438 1439 const SwFmtCol& rCol = pFmt->GetCol(); 1440 if(rSh.IsInRightToLeftText()) 1441 nNum = rCol.GetColumns().Count() - nNum; 1442 else 1443 nNum--; 1444 SvxColumnItem aColItem(nNum); 1445 const SwRect &rSizeRect = rSh.GetAnyCurRect(RECT_FLY_PRT_EMBEDDED, pPt); 1446 1447 sal_Bool bUseVertical = bFrameHasVerticalColumns || (!bFrmSelection && bVerticalWriting); 1448 const long lWidth = bUseVertical ? rSizeRect.Height() : rSizeRect.Width(); 1449 const SwRect &rRect = rSh.GetAnyCurRect(RECT_FLY_EMBEDDED, pPt); 1450 long nDist2 = ((bUseVertical ? rRect.Height() : rRect.Width()) - lWidth) /2; 1451 ::lcl_FillSvxColumn(rCol, sal_uInt16(lWidth), aColItem, nDist2); 1452 1453 SfxItemSet aFrameSet(GetPool(), RES_LR_SPACE, RES_LR_SPACE); 1454 rSh.GetFlyFrmAttr( aFrameSet ); 1455 1456 if(bUseVertical) 1457 { 1458 aColItem.SetLeft ((sal_uInt16)(rRect.Top()- rPageRect.Top())); 1459 aColItem.SetRight((sal_uInt16)(nPageHeight + rPageRect.Top() - rRect.Bottom() )); 1460 } 1461 else 1462 { 1463 aColItem.SetLeft ((sal_uInt16)(rRect.Left() - rPageRect.Left() )); 1464 aColItem.SetRight((sal_uInt16)(rPageRect.Right() - rRect.Right() )); 1465 } 1466 1467 aColItem.SetOrtho(aColItem.CalcOrtho()); 1468 1469 rSet.Put(aColItem, nWhich); 1470 } 1471 else 1472 rSet.DisableItem(nWhich); 1473 } 1474 else 1475 { // Spalten auf der Seite 1476 const SwFrmFmt& rMaster = rDesc.GetMaster(); 1477 SwFmtCol aCol(rMaster.GetCol()); 1478 if(rFrameDir.GetValue() == FRMDIR_HORI_RIGHT_TOP) 1479 nNum = aCol.GetColumns().Count() - nNum; 1480 else 1481 nNum--; 1482 1483 SvxColumnItem aColItem(nNum); 1484 const SwRect aPrtRect = rSh.GetAnyCurRect(RECT_PAGE_PRT, pPt); 1485 const SvxBoxItem& rBox = (const SvxBoxItem&)rMaster.GetFmtAttr(RES_BOX); 1486 long nDist = rBox.GetDistance(); 1487 ::lcl_FillSvxColumn(aCol, 1488 sal_uInt16(bVerticalWriting ? aPrtRect.Height() : aPrtRect.Width() ), 1489 aColItem, nDist); 1490 1491 if(bBrowse) 1492 { 1493 aColItem.SetLeft((sal_uInt16)rPagePrtRect.Left()); 1494 aColItem.SetRight(sal_uInt16(nPageWidth - rPagePrtRect.Right())); 1495 } 1496 else 1497 { 1498 aColItem.SetLeft (aPageLRSpace.GetLeft()); 1499 aColItem.SetRight(aPageLRSpace.GetRight()); 1500 } 1501 aColItem.SetOrtho(aColItem.CalcOrtho()); 1502 1503 rSet.Put(aColItem, nWhich); 1504 } 1505 } 1506 else 1507 rSet.DisableItem(nWhich); 1508 break; 1509 } 1510 case SID_RULER_ROWS : 1511 case SID_RULER_ROWS_VERTICAL: 1512 { 1513 sal_Bool bFrameHasVerticalColumns(sal_False); 1514 { 1515 sal_Bool bFrameRTL; 1516 sal_Bool bFrameVertL2R; 1517 bFrameHasVerticalColumns = rSh.IsFrmVertical(sal_False, bFrameRTL, bFrameVertL2R) && 1518 bFrmSelection; 1519 } 1520 1521 if( ( (SID_RULER_ROWS == nWhich) && 1522 ((!bVerticalWriting && !bFrmSelection) || (bFrmSelection && !bFrameHasVerticalColumns)) ) || 1523 ((SID_RULER_ROWS_VERTICAL == nWhich) && 1524 ((bVerticalWriting && !bFrmSelection) || bFrameHasVerticalColumns))) 1525 rSet.DisableItem(nWhich); 1526 else if ( IsTabRowFromDoc() || 1527 ( rSh.GetTableFmt() && !bFrmSelection && 1528 !(nFrmType & FRMTYPE_COLSECT ) ) ) 1529 { 1530 SwTabCols aTabCols; 1531 //no current value necessary 1532 sal_uInt16 nNum = 0; 1533 if ( 0 != ( bSetTabRowFromDoc = IsTabRowFromDoc() ) ) 1534 { 1535 rSh.GetMouseTabRows( aTabCols, aTabColFromDocPos ); 1536 } 1537 else 1538 { 1539 rSh.GetTabRows( aTabCols ); 1540 } 1541 1542 // ASSERT(nNum <= aTabCols.Count(), "TabCol not found"); 1543 const int nLft = aTabCols.GetLeftMin(); 1544 const int nRgt = (sal_uInt16)(bVerticalWriting ? nPageWidth : nPageHeight) - 1545 (aTabCols.GetLeftMin() + 1546 aTabCols.GetRight()); 1547 1548 const sal_uInt16 nL = static_cast< sal_uInt16 >(nLft > 0 ? nLft : 0); 1549 const sal_uInt16 nR = static_cast< sal_uInt16 >(nRgt > 0 ? nRgt : 0); 1550 1551 SvxColumnItem aColItem(nNum, nL, nR); 1552 1553 sal_uInt16 nStart = 0, 1554 nEnd; 1555 1556 for ( sal_uInt16 i = 0; i < aTabCols.Count(); ++i ) 1557 { 1558 const SwTabColsEntry& rEntry = aTabCols.GetEntry( i ); 1559 if(bVerticalWriting) 1560 { 1561 nEnd = sal_uInt16(aTabCols.GetRight() - rEntry.nPos); 1562 SvxColumnDescription aColDesc( nStart, nEnd, 1563 aTabCols.GetRight() - rEntry.nMax, aTabCols.GetRight() - rEntry.nMin, 1564 !aTabCols.IsHidden(i) ); 1565 aColItem.Append(aColDesc); 1566 } 1567 else 1568 { 1569 nEnd = sal_uInt16(rEntry.nPos - aTabCols.GetLeft()); 1570 SvxColumnDescription aColDesc( nStart, nEnd, 1571 sal_uInt16(rEntry.nMin - aTabCols.GetLeft()), sal_uInt16(rEntry.nMax - aTabCols.GetLeft()), 1572 !aTabCols.IsHidden(i) ); 1573 aColItem.Append(aColDesc); 1574 } 1575 nStart = nEnd; 1576 } 1577 if(bVerticalWriting) 1578 nEnd = static_cast< sal_uInt16 >(aTabCols.GetRight()); 1579 else 1580 nEnd = static_cast< sal_uInt16 >(aTabCols.GetLeft()); 1581 // put a position protection when the last row cannot be moved 1582 // due to a page break inside of a row 1583 if(!aTabCols.IsLastRowAllowedToChange()) 1584 bPutContentProtection = sal_True; 1585 1586 SvxColumnDescription aColDesc( nStart, nEnd, 1587 aTabCols.GetRight(), aTabCols.GetRight(), 1588 sal_False ); 1589 aColItem.Append(aColDesc); 1590 1591 rSet.Put(aColItem, nWhich); 1592 } 1593 else 1594 rSet.DisableItem(nWhich); 1595 } 1596 break; 1597 case SID_RULER_PAGE_POS: 1598 { 1599 // PAGES01 1600 SvxPagePosSizeItem aPagePosSize( 1601 Point( rPageRect.Left(), rPageRect.Top()) , nPageWidth, nPageHeight); 1602 1603 rSet.Put(aPagePosSize); 1604 break; 1605 } 1606 case SID_RULER_LR_MIN_MAX: 1607 { 1608 Rectangle aRectangle; 1609 if( ( nFrmType & FRMTYPE_COLSECT ) && !IsTabColFromDoc() && 1610 ( nFrmType & ( FRMTYPE_TABLE|FRMTYPE_COLUMN ) ) ) 1611 { 1612 if( nFrmType & FRMTYPE_TABLE ) 1613 { 1614 const sal_uInt16 nNum = rSh.GetCurTabColNum(); 1615 SwTabCols aTabCols; 1616 rSh.GetTabCols( aTabCols ); 1617 1618 const int nLft = aTabCols.GetLeftMin() + aTabCols.GetLeft(); 1619 const int nRgt = (sal_uInt16)nPageWidth -(aTabCols.GetLeftMin() + aTabCols.GetRight()); 1620 1621 const sal_uInt16 nL = static_cast< sal_uInt16 >(nLft > 0 ? nLft : 0); 1622 const sal_uInt16 nR = static_cast< sal_uInt16 >(nRgt > 0 ? nRgt : 0); 1623 1624 aRectangle.Left() = nL; 1625 if(nNum > 1) 1626 aRectangle.Left() += aTabCols[nNum - 2]; 1627 if(nNum) 1628 aRectangle.Left() += MINLAY; 1629 if(aTabCols.Count() <= nNum + 1 ) 1630 aRectangle.Right() = nR; 1631 else 1632 aRectangle.Right() = nPageWidth - (nL + aTabCols[nNum + 1]); 1633 1634 if(nNum < aTabCols.Count()) 1635 aRectangle.Right() += MINLAY; 1636 } 1637 else 1638 { 1639 const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt(); 1640 const SwFmtCol* pCols = pFmt ? &pFmt->GetCol(): 1641 &rDesc.GetMaster().GetCol(); 1642 const SwColumns& rCols = pCols->GetColumns(); 1643 sal_uInt16 nNum = rSh.GetCurOutColNum(); 1644 sal_uInt16 nCount = Min(sal_uInt16(nNum + 1), rCols.Count()); 1645 const SwRect aRect( rSh.GetAnyCurRect( pFmt 1646 ? RECT_FLY_PRT_EMBEDDED 1647 : RECT_PAGE_PRT, pPt )); 1648 const SwRect aAbsRect( rSh.GetAnyCurRect( pFmt 1649 ? RECT_FLY_EMBEDDED 1650 : RECT_PAGE, pPt )); 1651 1652 //die Breite im Rahmen bzw. innerhalbe der Seitenraender 1653 const sal_uInt16 nTotalWidth = (sal_uInt16)aRect.Width(); 1654 //die gesamte Rahmenbreite - die Differenz ist der doppelte Abstand zum Rand 1655 const sal_uInt16 nOuterWidth = (sal_uInt16)aAbsRect.Width(); 1656 int nWidth = 0, 1657 nStart = 0, 1658 nEnd = 0; 1659 aRectangle.Left() = 0; 1660 for ( sal_uInt16 i = 0; i < nCount; ++i ) 1661 { 1662 SwColumn* pCol = rCols[i]; 1663 nStart = pCol->GetLeft() + nWidth; 1664 if(i == nNum - 2) 1665 aRectangle.Left() = nStart; 1666 nWidth += pCols->CalcColWidth( i, nTotalWidth ); 1667 nEnd = nWidth - pCol->GetRight(); 1668 } 1669 aRectangle.Right() = rPageRect.Right() - nEnd; 1670 aRectangle.Left() -= rPageRect.Left(); 1671 1672 if(nNum > 1) 1673 { 1674 aRectangle.Left() += MINLAY; 1675 aRectangle.Left() += aRect.Left(); 1676 } 1677 if(pFmt) //Bereich in Rahmen - hier darf man bis zum Rand 1678 aRectangle.Left() = aRectangle.Right() = 0; 1679 else 1680 { 1681 // das Rechteck an die richtige absolute Position verschieben 1682 aRectangle.Left() += aAbsRect.Left(); 1683 aRectangle.Right() -= aAbsRect.Left(); 1684 // Abstand zur Umrandung mit einbeziehen 1685 aRectangle.Right() -= (nOuterWidth - nTotalWidth) / 2; 1686 } 1687 1688 if(nNum < rCols.Count()) 1689 { 1690 aRectangle.Right() += MINLAY; 1691 } 1692 else 1693 // rechts ist jetzt nur noch der Seitenrand 1694 aRectangle.Right() = 0; 1695 1696 1697 } 1698 } 1699 else if ( ((nFrmType & FRMTYPE_TABLE) || IsTabColFromDoc()) && 1700 !bFrmSelection ) 1701 { 1702 sal_Bool bColumn; 1703 if ( IsTabColFromDoc() ) 1704 bColumn = rSh.GetCurMouseColNum( aTabColFromDocPos ) != 0; 1705 else 1706 bColumn = (nFrmType & (FRMTYPE_COLUMN|FRMTYPE_FLY_ANY| 1707 FRMTYPE_COLSECTOUTTAB)) ? 1708 sal_True : sal_False; 1709 if ( !bColumn ) 1710 { 1711 if( nFrmType & FRMTYPE_FLY_ANY && IsTabColFromDoc() ) 1712 { 1713 SwRect aRect( rSh.GetAnyCurRect( 1714 RECT_FLY_PRT_EMBEDDED, pPt ) ); 1715 aRect.Pos() += rSh.GetAnyCurRect( RECT_FLY_EMBEDDED, 1716 pPt ).Pos(); 1717 1718 aRectangle.Left() = aRect.Left() - rPageRect.Left(); 1719 aRectangle.Right() = rPageRect.Right() - aRect.Right(); 1720 } 1721 else if( bBrowse ) 1722 { 1723 aRectangle.Left() = rPagePrtRect.Left(); 1724 aRectangle.Right() = nPageWidth - rPagePrtRect.Right(); 1725 } 1726 else 1727 { 1728 aRectangle.Left() = aPageLRSpace.GetLeft(); 1729 aRectangle.Right() = aPageLRSpace.GetRight(); 1730 } 1731 } 1732 else 1733 { //hier nur fuer Tabelle in mehrspaltigen Seiten und Rahmen 1734 sal_Bool bSectOutTbl = (nFrmType & FRMTYPE_TABLE) ? sal_True : sal_False; 1735 sal_Bool bFrame = (nFrmType & FRMTYPE_FLY_ANY) ? sal_True : sal_False; 1736 sal_Bool bColSct = (nFrmType & ( bSectOutTbl 1737 ? FRMTYPE_COLSECTOUTTAB 1738 : FRMTYPE_COLSECT ) 1739 ) ? sal_True : sal_False; 1740 //Damit man auch mit der Mouse ziehen kann, 1741 //ohne in der Tabelle zu stehen 1742 CurRectType eRecType = RECT_PAGE_PRT; 1743 sal_uInt16 nNum = IsTabColFromDoc() ? 1744 rSh.GetCurMouseColNum( aTabColFromDocPos ): 1745 rSh.GetCurOutColNum(); 1746 const SwFrmFmt* pFmt = NULL; 1747 if( bColSct ) 1748 { 1749 eRecType = bSectOutTbl ? RECT_OUTTABSECTION 1750 : RECT_SECTION; 1751 const SwSection *pSect = rSh.GetAnySection( bSectOutTbl, pPt ); 1752 ASSERT( pSect, "Welcher Bereich?"); 1753 pFmt = pSect->GetFmt(); 1754 } 1755 else if( bFrame ) 1756 { 1757 pFmt = rSh.GetFlyFrmFmt(); 1758 eRecType = RECT_FLY_PRT_EMBEDDED; 1759 } 1760 1761 const SwFmtCol* pCols = pFmt ? &pFmt->GetCol(): 1762 &rDesc.GetMaster().GetCol(); 1763 const SwColumns& rCols = pCols->GetColumns(); 1764 const sal_uInt16 nBorder = pFmt ? pFmt->GetBox().GetDistance() : 1765 rDesc.GetMaster().GetBox().GetDistance(); 1766 1767 /* RECT_FLY_PRT_EMBEDDED returns the relative position to 1768 RECT_FLY_EMBEDDED 1769 the absolute position must be added here 1770 */ 1771 SwRect aRect( rSh.GetAnyCurRect( eRecType, pPt ) ); 1772 if(RECT_FLY_PRT_EMBEDDED == eRecType) 1773 aRect.Pos() += rSh.GetAnyCurRect( RECT_FLY_EMBEDDED, 1774 pPt ).Pos(); 1775 1776 const sal_uInt16 nTotalWidth = (sal_uInt16)aRect.Width(); 1777 //nStart und nEnd initialisieren fuer nNum == 0 1778 int nWidth = 0, 1779 nStart = 0, 1780 nEnd = nTotalWidth; 1781 1782 if( nNum > rCols.Count() ) 1783 { 1784 ASSERT( !this, "es wird auf dem falschen FmtCol gearbeitet!" ); 1785 nNum = rCols.Count(); 1786 } 1787 1788 for( sal_uInt16 i = 0; i < nNum; ++i ) 1789 { 1790 SwColumn* pCol = rCols[i]; 1791 nStart = pCol->GetLeft() + nWidth; 1792 nWidth += pCols->CalcColWidth( i, nTotalWidth ); 1793 nEnd = nWidth - pCol->GetRight(); 1794 } 1795 if( bFrame | bColSct ) 1796 { 1797 aRectangle.Left() = aRect.Left() - rPageRect.Left() + nStart; 1798 aRectangle.Right() = nPageWidth - aRectangle.Left() - nEnd + nStart; 1799 } 1800 else if(!bBrowse) 1801 { 1802 aRectangle.Left() = aPageLRSpace.GetLeft() + nStart; 1803 aRectangle.Right() = nPageWidth - nEnd - aPageLRSpace.GetLeft(); 1804 } 1805 else 1806 { 1807 long nLeft = rPagePrtRect.Left(); 1808 aRectangle.Left() = nStart + nLeft; 1809 aRectangle.Right() = nPageWidth - nEnd - nLeft; 1810 } 1811 if(!bFrame) 1812 { 1813 aRectangle.Left() += nBorder; 1814 aRectangle.Right() -= nBorder; 1815 } 1816 } 1817 } 1818 else if ( nFrmType & ( FRMTYPE_HEADER | FRMTYPE_FOOTER )) 1819 { 1820 aRectangle.Left() = aPageLRSpace.GetLeft(); 1821 aRectangle.Right() = aPageLRSpace.GetRight(); 1822 } 1823 else 1824 aRectangle.Left() = aRectangle.Right() = 0; 1825 1826 SfxRectangleItem aLR( SID_RULER_LR_MIN_MAX , aRectangle); 1827 rSet.Put(aLR); 1828 } 1829 break; 1830 case SID_RULER_PROTECT: 1831 { 1832 if(bFrmSelection) 1833 { 1834 sal_uInt8 nProtect = pWrtShell->IsSelObjProtected( FLYPROTECT_SIZE|FLYPROTECT_POS|FLYPROTECT_CONTENT ); 1835 1836 SvxProtectItem aProt(SID_RULER_PROTECT); 1837 aProt.SetCntntProtect((nProtect & FLYPROTECT_CONTENT) != 0); 1838 aProt.SetSizeProtect ((nProtect & FLYPROTECT_SIZE) != 0); 1839 aProt.SetPosProtect ((nProtect & FLYPROTECT_POS) != 0); 1840 rSet.Put(aProt); 1841 } 1842 else 1843 { 1844 SvxProtectItem aProtect(SID_RULER_PROTECT); 1845 if(bBrowse && !(nFrmType & (FRMTYPE_DRAWOBJ|FRMTYPE_COLUMN)) && !rSh.GetTableFmt()) 1846 { 1847 aProtect.SetSizeProtect(sal_True); 1848 aProtect.SetPosProtect(sal_True); 1849 } 1850 rSet.Put(aProtect); 1851 } 1852 } 1853 break; 1854 } 1855 nWhich = aIter.NextWhich(); 1856 } 1857 if(bPutContentProtection) 1858 { 1859 SvxProtectItem aProtect(SID_RULER_PROTECT); 1860 aProtect.SetCntntProtect(sal_True); 1861 rSet.Put(aProtect); 1862 } 1863 } 1864 1865 1866