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