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 : #include <svx/svdobj.hxx>
21 : #include <init.hxx>
22 : #include <fesh.hxx>
23 : #include <pagefrm.hxx>
24 : #include <rootfrm.hxx>
25 : #include <cntfrm.hxx>
26 : #include <doc.hxx>
27 : #include <frmtool.hxx>
28 : #include <swtable.hxx>
29 : #include <viewimp.hxx>
30 : #include <dview.hxx>
31 : #include <flyfrm.hxx>
32 : #include <node.hxx>
33 : #include <pam.hxx>
34 : #include <sectfrm.hxx>
35 : #include <fmtpdsc.hxx>
36 : #include <fmtsrnd.hxx>
37 : #include <fmtcntnt.hxx>
38 : #include <fmtfsize.hxx>
39 : #include <tabfrm.hxx>
40 : #include <cellfrm.hxx>
41 : #include <flyfrms.hxx>
42 : #include <txtfrm.hxx>
43 : #include <mdiexp.hxx>
44 : #include <edimp.hxx>
45 : #include <pagedesc.hxx>
46 : #include <fmtanchr.hxx>
47 : #include <environmentofanchoredobject.hxx>
48 : #include <ndtxt.hxx>
49 : #include <dflyobj.hxx>
50 : #include <dcontact.hxx>
51 :
52 : using namespace com::sun::star;
53 :
54 1864037 : TYPEINIT1(SwFEShell,SwEditShell)
55 :
56 4 : void SwFEShell::EndAllActionAndCall()
57 : {
58 4 : SwViewShell *pTmp = this;
59 4 : do {
60 4 : if( pTmp->IsA( TYPE(SwCrsrShell) ) )
61 : {
62 4 : ((SwFEShell*)pTmp)->EndAction();
63 4 : ((SwFEShell*)pTmp)->CallChgLnk();
64 : }
65 : else
66 0 : pTmp->EndAction();
67 4 : } while( this != ( pTmp = (SwViewShell*)pTmp->GetNext() ));
68 4 : }
69 :
70 : // Determine the Cntnt's nearest to the point
71 0 : Point SwFEShell::GetCntntPos( const Point& rPoint, bool bNext ) const
72 : {
73 0 : SET_CURR_SHELL( (SwViewShell*)this );
74 0 : return GetLayout()->GetNextPrevCntntPos( rPoint, bNext );
75 : }
76 :
77 5912 : const SwRect& SwFEShell::GetAnyCurRect( CurRectType eType, const Point* pPt,
78 : const uno::Reference < embed::XEmbeddedObject >& xObj ) const
79 : {
80 5912 : const SwFrm *pFrm = Imp()->HasDrawView()
81 5912 : ? ::GetFlyFromMarked( &Imp()->GetDrawView()->GetMarkedObjectList(),
82 5912 : (SwViewShell*)this)
83 11824 : : 0;
84 :
85 5912 : if( !pFrm )
86 : {
87 5912 : if( pPt )
88 : {
89 0 : SwPosition aPos( *GetCrsr()->GetPoint() );
90 0 : Point aPt( *pPt );
91 0 : GetLayout()->GetCrsrOfst( &aPos, aPt );
92 0 : SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode();
93 0 : pFrm = pNd->getLayoutFrm( GetLayout(), pPt );
94 : }
95 : else
96 : {
97 5912 : const bool bOldCallbackActionEnabled = GetLayout()->IsCallbackActionEnabled();
98 5912 : if( bOldCallbackActionEnabled )
99 5912 : GetLayout()->SetCallbackActionEnabled( false );
100 5912 : pFrm = GetCurrFrm();
101 5912 : if( bOldCallbackActionEnabled )
102 5912 : GetLayout()->SetCallbackActionEnabled( true );
103 : }
104 : }
105 :
106 5912 : if( !pFrm )
107 0 : return GetLayout()->Frm();
108 :
109 5912 : bool bFrm = true;
110 5912 : switch ( eType )
111 : {
112 2075 : case RECT_PAGE_PRT: bFrm = false; /* no break */
113 3762 : case RECT_PAGE : pFrm = pFrm->FindPageFrm();
114 3762 : break;
115 :
116 1075 : case RECT_PAGE_CALC: pFrm->Calc();
117 1075 : pFrm = pFrm->FindPageFrm();
118 1075 : pFrm->Calc();
119 1075 : break;
120 :
121 0 : case RECT_FLY_PRT_EMBEDDED: bFrm = false; /* no break */
122 0 : case RECT_FLY_EMBEDDED: pFrm = xObj.is() ? FindFlyFrm( xObj )
123 0 : : pFrm->IsFlyFrm()
124 : ? pFrm
125 0 : : pFrm->FindFlyFrm();
126 0 : break;
127 :
128 : case RECT_OUTTABSECTION_PRT:
129 0 : case RECT_OUTTABSECTION : if( pFrm->IsInTab() )
130 0 : pFrm = pFrm->FindTabFrm();
131 : else {
132 : OSL_FAIL( "Missing Table" );
133 : }
134 : /* no break */
135 : case RECT_SECTION_PRT:
136 0 : case RECT_SECTION: if( pFrm->IsInSct() )
137 0 : pFrm = pFrm->FindSctFrm();
138 : else {
139 : OSL_FAIL( "Missing section" );
140 : }
141 :
142 0 : if( RECT_OUTTABSECTION_PRT == eType ||
143 : RECT_SECTION_PRT == eType )
144 0 : bFrm = false;
145 0 : break;
146 :
147 0 : case RECT_HEADERFOOTER_PRT: bFrm = false; /* no break */
148 0 : case RECT_HEADERFOOTER: if( 0 == (pFrm = pFrm->FindFooterOrHeader()) )
149 0 : return GetLayout()->Frm();
150 0 : break;
151 :
152 1075 : case RECT_PAGES_AREA: return GetLayout()->GetPagesArea();
153 :
154 0 : default: break;
155 : }
156 4837 : return bFrm ? pFrm->Frm() : pFrm->Prt();
157 : }
158 :
159 0 : sal_uInt16 SwFEShell::GetPageNumber( const Point &rPoint ) const
160 : {
161 0 : const SwFrm *pPage = GetLayout()->Lower();
162 0 : while ( pPage && !pPage->Frm().IsInside( rPoint ) )
163 0 : pPage = pPage->GetNext();
164 0 : if ( pPage )
165 0 : return ((const SwPageFrm*)pPage)->GetPhyPageNum();
166 : else
167 0 : return 0;
168 : }
169 :
170 1052 : bool SwFEShell::GetPageNumber( long nYPos, bool bAtCrsrPos, sal_uInt16& rPhyNum, sal_uInt16& rVirtNum, OUString &rDisplay) const
171 : {
172 : const SwFrm *pPage;
173 :
174 1052 : if ( bAtCrsrPos ) // get page of Crsr
175 : {
176 1041 : pPage = GetCurrFrm( false );
177 1041 : if ( pPage )
178 1041 : pPage = pPage->FindPageFrm();
179 : }
180 11 : else if ( nYPos > -1 ) // determine page via the position
181 : {
182 0 : pPage = GetLayout()->Lower();
183 0 : while( pPage && (pPage->Frm().Bottom() < nYPos ||
184 0 : nYPos < pPage->Frm().Top() ) )
185 0 : pPage = pPage->GetNext();
186 : }
187 : else // first visible page
188 : {
189 11 : pPage = Imp()->GetFirstVisPage();
190 11 : if ( pPage && ((SwPageFrm*)pPage)->IsEmptyPage() )
191 0 : pPage = pPage->GetNext();
192 : }
193 :
194 1052 : if( pPage )
195 : {
196 1052 : rPhyNum = ((const SwPageFrm*)pPage)->GetPhyPageNum();
197 1052 : rVirtNum = ((const SwPageFrm*)pPage)->GetVirtPageNum();
198 1052 : const SvxNumberType& rNum = ((const SwPageFrm*)pPage)->GetPageDesc()->GetNumType();
199 1052 : rDisplay = rNum.GetNumStr( rVirtNum );
200 : }
201 :
202 1052 : return 0 != pPage;
203 : }
204 :
205 398 : bool SwFEShell::IsDirectlyInSection() const
206 : {
207 398 : SwFrm* pFrm = GetCurrFrm( false );
208 398 : return pFrm && pFrm->GetUpper() && pFrm->GetUpper()->IsSctFrm();
209 : }
210 :
211 5681 : sal_uInt16 SwFEShell::GetFrmType( const Point *pPt, bool bStopAtFly ) const
212 : {
213 5681 : sal_uInt16 nReturn = FRMTYPE_NONE;
214 : const SwFrm *pFrm;
215 5681 : if ( pPt )
216 : {
217 0 : SwPosition aPos( *GetCrsr()->GetPoint() );
218 0 : Point aPt( *pPt );
219 0 : GetLayout()->GetCrsrOfst( &aPos, aPt );
220 0 : SwCntntNode *pNd = aPos.nNode.GetNode().GetCntntNode();
221 0 : pFrm = pNd->getLayoutFrm( GetLayout(), pPt );
222 : }
223 : else
224 5681 : pFrm = GetCurrFrm( false );
225 34170 : while ( pFrm )
226 : {
227 22808 : switch ( pFrm->GetType() )
228 : {
229 2 : case FRM_COLUMN: if( pFrm->GetUpper()->IsSctFrm() )
230 : {
231 : // Check, if isn't not only a single column
232 : // from a section with footnotes at the end.
233 2 : if( pFrm->GetNext() || pFrm->GetPrev() )
234 : // Sectioncolumns
235 2 : nReturn |= ( nReturn & FRMTYPE_TABLE ) ?
236 2 : FRMTYPE_COLSECTOUTTAB : FRMTYPE_COLSECT;
237 : }
238 : else // only pages and frame columns
239 0 : nReturn |= FRMTYPE_COLUMN;
240 2 : break;
241 5681 : case FRM_PAGE: nReturn |= FRMTYPE_PAGE;
242 5681 : if( ((SwPageFrm*)pFrm)->IsFtnPage() )
243 0 : nReturn |= FRMTYPE_FTNPAGE;
244 5681 : break;
245 0 : case FRM_HEADER: nReturn |= FRMTYPE_HEADER; break;
246 0 : case FRM_FOOTER: nReturn |= FRMTYPE_FOOTER; break;
247 5683 : case FRM_BODY: if( pFrm->GetUpper()->IsPageFrm() ) // not for ColumnFrms
248 5681 : nReturn |= FRMTYPE_BODY;
249 5683 : break;
250 0 : case FRM_FTN: nReturn |= FRMTYPE_FOOTNOTE; break;
251 0 : case FRM_FLY: if( ((SwFlyFrm*)pFrm)->IsFlyLayFrm() )
252 0 : nReturn |= FRMTYPE_FLY_FREE;
253 0 : else if ( ((SwFlyFrm*)pFrm)->IsFlyAtCntFrm() )
254 0 : nReturn |= FRMTYPE_FLY_ATCNT;
255 : else
256 : {
257 : OSL_ENSURE( ((SwFlyFrm*)pFrm)->IsFlyInCntFrm(),
258 : "New frametype?" );
259 0 : nReturn |= FRMTYPE_FLY_INCNT;
260 : }
261 0 : nReturn |= FRMTYPE_FLY_ANY;
262 0 : if( bStopAtFly )
263 0 : return nReturn;
264 0 : break;
265 : case FRM_TAB:
266 : case FRM_ROW:
267 60 : case FRM_CELL: nReturn |= FRMTYPE_TABLE; break;
268 11382 : default: /* do nothing */ break;
269 : }
270 22808 : if ( pFrm->IsFlyFrm() )
271 0 : pFrm = ((SwFlyFrm*)pFrm)->GetAnchorFrm();
272 : else
273 22808 : pFrm = pFrm->GetUpper();
274 : }
275 5681 : return nReturn;
276 : }
277 :
278 4650 : void SwFEShell::ShGetFcs( bool bUpdate )
279 : {
280 4650 : ::SetShell( this );
281 4650 : SwCrsrShell::ShGetFcs( bUpdate );
282 :
283 4650 : if ( HasDrawView() )
284 : {
285 4650 : Imp()->GetDrawView()->showMarkHandles();
286 4650 : if ( Imp()->GetDrawView()->AreObjectsMarked() )
287 0 : FrameNotify( this, FLY_DRAG_START );
288 : }
289 4650 : }
290 :
291 4650 : void SwFEShell::ShLooseFcs()
292 : {
293 4650 : SwCrsrShell::ShLooseFcs();
294 :
295 4650 : if ( HasDrawView() && Imp()->GetDrawView()->AreObjectsMarked() )
296 : {
297 4 : Imp()->GetDrawView()->hideMarkHandles();
298 4 : FrameNotify( this, FLY_DRAG_END );
299 : }
300 4650 : }
301 :
302 16 : sal_uInt16 SwFEShell::GetPhyPageNum()
303 : {
304 16 : SwFrm *pFrm = GetCurrFrm();
305 16 : if ( pFrm )
306 16 : return pFrm->GetPhyPageNum();
307 0 : return 0;
308 : }
309 :
310 4 : sal_uInt16 SwFEShell::GetVirtPageNum( const bool bCalcFrm )
311 : {
312 4 : SwFrm *pFrm = GetCurrFrm( bCalcFrm );
313 4 : if ( pFrm )
314 4 : return pFrm->GetVirtPageNum();
315 0 : return 0;
316 : }
317 :
318 0 : static void lcl_SetAPageOffset( sal_uInt16 nOffset, SwPageFrm* pPage, SwFEShell* pThis )
319 : {
320 0 : pThis->StartAllAction();
321 : OSL_ENSURE( pPage->FindFirstBodyCntnt(),
322 : "SwFEShell _SetAPageOffset() without CntntFrm" );
323 :
324 0 : SwFmtPageDesc aDesc( pPage->GetPageDesc() );
325 0 : aDesc.SetNumOffset( nOffset );
326 :
327 0 : SwFrm *pFrm = pThis->GetCurrFrm( false );
328 0 : if ( pFrm->IsInTab() )
329 0 : pThis->GetDoc()->SetAttr( aDesc, *pFrm->FindTabFrm()->GetFmt() );
330 : else
331 : {
332 0 : pThis->GetDoc()->getIDocumentContentOperations().InsertPoolItem( *pThis->GetCrsr(), aDesc, 0 );
333 : }
334 :
335 0 : pThis->EndAllAction();
336 0 : }
337 :
338 0 : void SwFEShell::SetNewPageOffset( sal_uInt16 nOffset )
339 : {
340 0 : GetLayout()->SetVirtPageNum( true );
341 0 : const SwPageFrm *pPage = GetCurrFrm( false )->FindPageFrm();
342 0 : lcl_SetAPageOffset( nOffset, (SwPageFrm*)pPage, this );
343 0 : }
344 :
345 0 : void SwFEShell::SetPageOffset( sal_uInt16 nOffset )
346 : {
347 0 : const SwPageFrm *pPage = GetCurrFrm( false )->FindPageFrm();
348 0 : const SwRootFrm* pDocLayout = GetLayout();
349 0 : while ( pPage )
350 : {
351 0 : const SwFrm *pFlow = pPage->FindFirstBodyCntnt();
352 0 : if ( pFlow )
353 : {
354 0 : if ( pFlow->IsInTab() )
355 0 : pFlow = pFlow->FindTabFrm();
356 0 : const SwFmtPageDesc& rPgDesc = pFlow->GetAttrSet()->GetPageDesc();
357 0 : if ( rPgDesc.GetNumOffset() )
358 : {
359 0 : pDocLayout->SetVirtPageNum( true );
360 0 : lcl_SetAPageOffset( nOffset, (SwPageFrm*)pPage, this );
361 0 : break;
362 : }
363 : }
364 0 : pPage = (SwPageFrm*)pPage->GetPrev();
365 : }
366 0 : }
367 :
368 0 : sal_uInt16 SwFEShell::GetPageOffset() const
369 : {
370 0 : const SwPageFrm *pPage = GetCurrFrm()->FindPageFrm();
371 0 : while ( pPage )
372 : {
373 0 : const SwFrm *pFlow = pPage->FindFirstBodyCntnt();
374 0 : if ( pFlow )
375 : {
376 0 : if ( pFlow->IsInTab() )
377 0 : pFlow = pFlow->FindTabFrm();
378 0 : ::boost::optional<sal_uInt16> oNumOffset = pFlow->GetAttrSet()->GetPageDesc().GetNumOffset();
379 0 : if ( oNumOffset )
380 0 : return oNumOffset.get();
381 : }
382 0 : pPage = (SwPageFrm*)pPage->GetPrev();
383 : }
384 0 : return 0;
385 : }
386 :
387 0 : void SwFEShell::InsertLabel( const SwLabelType eType, const OUString &rTxt, const OUString& rSeparator,
388 : const OUString& rNumberSeparator,
389 : const bool bBefore, const sal_uInt16 nId,
390 : const OUString& rCharacterStyle,
391 : const bool bCpyBrd )
392 : {
393 : // get node index of cursor position, SwDoc can do everything else itself
394 0 : SwCntntFrm *pCnt = LTYPE_DRAW==eType ? 0 : GetCurrFrm( false );
395 0 : if( LTYPE_DRAW==eType || pCnt )
396 : {
397 0 : StartAllAction();
398 :
399 0 : sal_uLong nIdx = 0;
400 0 : SwFlyFrmFmt* pFlyFmt = 0;
401 0 : switch( eType )
402 : {
403 : case LTYPE_OBJECT:
404 : case LTYPE_FLY:
405 0 : if( pCnt->IsInFly() )
406 : {
407 : // pass down index to the startnode for flys
408 0 : nIdx = pCnt->FindFlyFrm()->
409 0 : GetFmt()->GetCntnt().GetCntntIdx()->GetIndex();
410 : }
411 0 : break;
412 : case LTYPE_TABLE:
413 0 : if( pCnt->IsInTab() )
414 : {
415 : // pass down index to the TblNode for tables
416 0 : const SwTable& rTbl = *pCnt->FindTabFrm()->GetTable();
417 0 : nIdx = rTbl.GetTabSortBoxes()[ 0 ]
418 0 : ->GetSttNd()->FindTableNode()->GetIndex();
419 : }
420 0 : break;
421 : case LTYPE_DRAW:
422 0 : if( Imp()->GetDrawView() )
423 : {
424 0 : SwDrawView *pDView = Imp()->GetDrawView();
425 0 : const SdrMarkList& rMrkList = pDView->GetMarkedObjectList();
426 0 : StartUndo();
427 :
428 : // copy marked drawing objects to
429 : // local list to perform the corresponding action for each object
430 0 : std::vector<SdrObject*> aDrawObjs;
431 : {
432 0 : for ( size_t i = 0; i < rMrkList.GetMarkCount(); ++i )
433 : {
434 0 : SdrObject* pDrawObj = rMrkList.GetMark(i)->GetMarkedSdrObj();
435 0 : if( pDrawObj )
436 0 : aDrawObjs.push_back( pDrawObj );
437 : }
438 : }
439 : // loop on marked drawing objects
440 0 : while ( !aDrawObjs.empty() )
441 : {
442 0 : SdrObject* pDrawObj = aDrawObjs.back();
443 0 : if ( !pDrawObj->ISA(SwVirtFlyDrawObj) &&
444 0 : !pDrawObj->ISA(SwFlyDrawObj) )
445 : {
446 : SwFlyFrmFmt *pFmt =
447 0 : GetDoc()->InsertDrawLabel( rTxt, rSeparator, rNumberSeparator, nId, rCharacterStyle, *pDrawObj );
448 0 : if( !pFlyFmt )
449 0 : pFlyFmt = pFmt;
450 : }
451 :
452 0 : aDrawObjs.pop_back();
453 : }
454 :
455 0 : EndUndo();
456 : }
457 0 : break;
458 : default:
459 : OSL_ENSURE( false, "Crsr neither in table nor in fly." );
460 : }
461 :
462 0 : if( nIdx )
463 : pFlyFmt = GetDoc()->InsertLabel( eType, rTxt, rSeparator, rNumberSeparator, bBefore, nId,
464 0 : nIdx, rCharacterStyle, bCpyBrd );
465 :
466 : SwFlyFrm* pFrm;
467 0 : const Point aPt( GetCrsrDocPos() );
468 0 : if( pFlyFmt && 0 != ( pFrm = pFlyFmt->GetFrm( &aPt )))
469 0 : SelectFlyFrm( *pFrm, true );
470 :
471 0 : EndAllActionAndCall();
472 : }
473 0 : }
474 :
475 0 : bool SwFEShell::Sort(const SwSortOptions& rOpt)
476 : {
477 0 : if( !HasSelection() )
478 0 : return false;
479 :
480 0 : SET_CURR_SHELL( this );
481 : bool bRet;
482 0 : StartAllAction();
483 0 : if(IsTableMode())
484 : {
485 : // Sort table
486 : // check if Point/Mark of current Crsr are in one table
487 0 : SwFrm *pFrm = GetCurrFrm( false );
488 : OSL_ENSURE( pFrm->FindTabFrm(), "Crsr not in table." );
489 :
490 : // search boxes via the layout
491 0 : SwSelBoxes aBoxes;
492 0 : GetTblSel(*this, aBoxes);
493 :
494 : // The Crsr should be removed from the deletion area.
495 : // Always put them behind/on the table; via the
496 : // document position they will always be set to the old position
497 0 : while( !pFrm->IsCellFrm() )
498 0 : pFrm = pFrm->GetUpper();
499 : {
500 : /* ParkCursor->ParkCursorTab */
501 0 : ParkCursorInTab();
502 : }
503 :
504 : // call sorting on document
505 0 : bRet = mpDoc->SortTbl(aBoxes, rOpt) ? sal_True : sal_False;
506 : }
507 : else
508 : {
509 : // Sort text nothing else
510 0 : FOREACHPAM_START(GetCrsr())
511 :
512 0 : SwPaM* pPam = PCURCRSR;
513 :
514 0 : SwPosition* pStart = pPam->Start();
515 0 : SwPosition* pEnd = pPam->End();
516 :
517 0 : SwNodeIndex aPrevIdx( pStart->nNode, -1 );
518 0 : sal_uLong nOffset = pEnd->nNode.GetIndex() - pStart->nNode.GetIndex();
519 0 : const sal_Int32 nCntStt = pStart->nContent.GetIndex();
520 :
521 : // Sorting
522 0 : bRet = mpDoc->SortText(*pPam, rOpt) ? sal_True : sal_False;
523 :
524 : // put selection again
525 0 : pPam->DeleteMark();
526 0 : pPam->GetPoint()->nNode.Assign( aPrevIdx.GetNode(), +1 );
527 0 : SwCntntNode* pCNd = pPam->GetCntntNode();
528 0 : sal_Int32 nLen = pCNd->Len();
529 0 : if( nLen > nCntStt )
530 0 : nLen = nCntStt;
531 0 : pPam->GetPoint()->nContent.Assign(pCNd, nLen );
532 0 : pPam->SetMark();
533 :
534 0 : pPam->GetPoint()->nNode += nOffset;
535 0 : pCNd = pPam->GetCntntNode();
536 0 : pPam->GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
537 :
538 0 : FOREACHPAM_END()
539 : }
540 :
541 0 : EndAllAction();
542 0 : return bRet;
543 : }
544 :
545 0 : sal_uInt16 SwFEShell::_GetCurColNum( const SwFrm *pFrm,
546 : SwGetCurColNumPara* pPara ) const
547 : {
548 0 : sal_uInt16 nRet = 0;
549 0 : while ( pFrm )
550 : {
551 0 : pFrm = pFrm->GetUpper();
552 0 : if( pFrm && pFrm->IsColumnFrm() )
553 : {
554 0 : const SwFrm *pCurFrm = pFrm;
555 0 : do {
556 0 : ++nRet;
557 0 : pFrm = pFrm->GetPrev();
558 : } while ( pFrm );
559 :
560 0 : if( pPara )
561 : {
562 : // now search the format, determining the columness
563 0 : pFrm = pCurFrm->GetUpper();
564 0 : while( pFrm )
565 : {
566 0 : if( ( FRM_PAGE | FRM_FLY | FRM_SECTION ) & pFrm->GetType() )
567 : {
568 0 : pPara->pFrmFmt = ((SwLayoutFrm*)pFrm)->GetFmt();
569 0 : pPara->pPrtRect = &pFrm->Prt();
570 0 : pPara->pFrmRect = &pFrm->Frm();
571 0 : break;
572 : }
573 0 : pFrm = pFrm->GetUpper();
574 : }
575 0 : if( !pFrm )
576 : {
577 0 : pPara->pFrmFmt = 0;
578 0 : pPara->pPrtRect = 0;
579 0 : pPara->pFrmRect = 0;
580 : }
581 : }
582 0 : break;
583 : }
584 : }
585 0 : return nRet;
586 : }
587 :
588 0 : sal_uInt16 SwFEShell::GetCurColNum( SwGetCurColNumPara* pPara ) const
589 : {
590 : OSL_ENSURE( GetCurrFrm(), "Crsr parked?" );
591 0 : return _GetCurColNum( GetCurrFrm(), pPara );
592 : }
593 :
594 0 : sal_uInt16 SwFEShell::GetCurOutColNum( SwGetCurColNumPara* pPara ) const
595 : {
596 0 : sal_uInt16 nRet = 0;
597 0 : SwFrm* pFrm = GetCurrFrm();
598 : OSL_ENSURE( pFrm, "Crsr parked?" );
599 0 : if( pFrm )
600 : {
601 0 : pFrm = pFrm->IsInTab() ? (SwFrm*)pFrm->FindTabFrm()
602 0 : : (SwFrm*)pFrm->FindSctFrm();
603 : OSL_ENSURE( pFrm, "No Tab, no Sect" );
604 0 : if( pFrm )
605 0 : nRet = _GetCurColNum( pFrm, pPara );
606 : }
607 0 : return nRet;
608 : }
609 :
610 4708 : SwFEShell::SwFEShell( SwDoc& rDoc, vcl::Window *pWindow, const SwViewOption *pOptions )
611 : : SwEditShell( rDoc, pWindow, pOptions ),
612 4708 : pChainFrom( 0 ), pChainTo( 0 ), bCheckForOLEInCaption( false )
613 : {
614 4708 : }
615 :
616 0 : SwFEShell::SwFEShell( SwEditShell& rShell, vcl::Window *pWindow )
617 : : SwEditShell( rShell, pWindow ),
618 0 : pChainFrom( 0 ), pChainTo( 0 ), bCheckForOLEInCaption( false )
619 : {
620 0 : }
621 :
622 9412 : SwFEShell::~SwFEShell()
623 : {
624 4706 : delete pChainFrom;
625 4706 : delete pChainTo;
626 4706 : }
627 :
628 : // #i17567# - adjustments for allowing
629 : // negative vertical positions for fly frames anchored to paragraph/to character.
630 : // #i22305# - adjustments for option 'Follow text flow'
631 : // for to frame anchored objects.
632 : // #i22341# - adjustments for vertical alignment at top of line
633 : // for to character anchored objects.
634 0 : void SwFEShell::CalcBoundRect( SwRect& _orRect,
635 : const RndStdIds _nAnchorId,
636 : const sal_Int16 _eHoriRelOrient,
637 : const sal_Int16 _eVertRelOrient,
638 : const SwPosition* _pToCharCntntPos,
639 : const bool _bFollowTextFlow,
640 : bool _bMirror,
641 : Point* _opRef,
642 : Size* _opPercent,
643 : const SwFmtFrmSize* pFmtFrmSize) const
644 : {
645 : const SwFrm* pFrm;
646 : const SwFlyFrm* pFly;
647 0 : if( _opRef )
648 : {
649 0 : pFrm = GetCurrFrm();
650 0 : if( 0 != ( pFly = pFrm->FindFlyFrm() ) )
651 0 : pFrm = pFly->GetAnchorFrm();
652 : }
653 : else
654 : {
655 0 : pFly = FindFlyFrm();
656 0 : pFrm = pFly ? pFly->GetAnchorFrm() : GetCurrFrm();
657 : }
658 :
659 0 : bool bWrapThrough = false;
660 0 : if ( pFly )
661 : {
662 0 : SwFlyFrmFmt* pFmt = (SwFlyFrmFmt*)pFly->GetFmt();
663 0 : const SwFmtSurround& rSurround = pFmt->GetSurround();
664 0 : bWrapThrough = rSurround.GetSurround() == SURROUND_THROUGHT;
665 : }
666 :
667 0 : const SwPageFrm* pPage = pFrm->FindPageFrm();
668 0 : _bMirror = _bMirror && !pPage->OnRightPage();
669 :
670 0 : Point aPos;
671 0 : bool bVertic = false;
672 0 : bool bRTL = false;
673 0 : bool bVerticalL2R = false;
674 :
675 0 : if ((FLY_AT_PAGE == _nAnchorId) || (FLY_AT_FLY == _nAnchorId)) // LAYER_IMPL
676 : {
677 0 : const SwFrm* pTmp = pFrm;
678 : // #i22305#
679 0 : if ((FLY_AT_PAGE == _nAnchorId) ||
680 0 : ((FLY_AT_FLY == _nAnchorId) && !_bFollowTextFlow))
681 : {
682 0 : pFrm = pPage;
683 : }
684 : else
685 : {
686 0 : pFrm = pFrm->FindFlyFrm();
687 : }
688 0 : if ( !pFrm )
689 0 : pFrm = pTmp;
690 0 : _orRect = pFrm->Frm();
691 0 : SWRECTFN( pFrm )
692 0 : bRTL = pFrm->IsRightToLeft();
693 0 : if ( bRTL )
694 0 : aPos = pFrm->Frm().TopRight();
695 : else
696 0 : aPos = (pFrm->Frm().*fnRect->fnGetPos)();
697 :
698 0 : if( bVert || bVertL2R )
699 : {
700 0 : bVertic = bVert;
701 0 : bVerticalL2R = bVertL2R;
702 0 : _bMirror = false; // no mirroring in vertical environment
703 0 : switch ( _eHoriRelOrient )
704 : {
705 : case text::RelOrientation::PAGE_RIGHT:
706 0 : case text::RelOrientation::FRAME_RIGHT: aPos.Y() += pFrm->Prt().Height();
707 : // no break!
708 : case text::RelOrientation::PRINT_AREA:
709 0 : case text::RelOrientation::PAGE_PRINT_AREA: aPos.Y() += pFrm->Prt().Top(); break;
710 0 : default: break;
711 : }
712 : }
713 0 : else if ( _bMirror )
714 : {
715 0 : switch ( _eHoriRelOrient )
716 : {
717 : case text::RelOrientation::PRINT_AREA:
718 0 : case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Width();
719 : // no break
720 : case text::RelOrientation::PAGE_RIGHT:
721 0 : case text::RelOrientation::FRAME_RIGHT: aPos.X() += pFrm->Prt().Left(); break;
722 0 : default: aPos.X() += pFrm->Frm().Width();
723 : }
724 : }
725 0 : else if ( bRTL )
726 : {
727 0 : switch ( _eHoriRelOrient )
728 : {
729 : case text::RelOrientation::PRINT_AREA:
730 0 : case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Width();
731 : // no break!
732 : case text::RelOrientation::PAGE_LEFT:
733 0 : case text::RelOrientation::FRAME_LEFT: aPos.X() += pFrm->Prt().Left() -
734 0 : pFrm->Frm().Width(); break;
735 0 : default: break;
736 : }
737 : }
738 : else
739 : {
740 0 : switch ( _eHoriRelOrient )
741 : {
742 : case text::RelOrientation::PAGE_RIGHT:
743 0 : case text::RelOrientation::FRAME_RIGHT: aPos.X() += pFrm->Prt().Width();
744 : // no break!
745 : case text::RelOrientation::PRINT_AREA:
746 0 : case text::RelOrientation::PAGE_PRINT_AREA: aPos.X() += pFrm->Prt().Left(); break;
747 0 : default:break;
748 : }
749 : }
750 :
751 0 : if ( bVert && !bVertL2R )
752 : {
753 0 : switch ( _eVertRelOrient )
754 : {
755 : case text::RelOrientation::PRINT_AREA:
756 : case text::RelOrientation::PAGE_PRINT_AREA:
757 : {
758 0 : aPos.X() -= pFrm->GetRightMargin();
759 : }
760 0 : break;
761 : }
762 : }
763 0 : else if ( bVertL2R )
764 : {
765 0 : switch ( _eVertRelOrient )
766 : {
767 : case text::RelOrientation::PRINT_AREA:
768 : case text::RelOrientation::PAGE_PRINT_AREA:
769 : {
770 0 : aPos.X() += pFrm->GetLeftMargin();
771 : }
772 0 : break;
773 : }
774 : }
775 : else
776 : {
777 0 : switch ( _eVertRelOrient )
778 : {
779 : case text::RelOrientation::PRINT_AREA:
780 : case text::RelOrientation::PAGE_PRINT_AREA:
781 : {
782 0 : if ( pFrm->IsPageFrm() )
783 : {
784 0 : aPos.Y() =
785 0 : static_cast<const SwPageFrm*>(pFrm)->PrtWithoutHeaderAndFooter().Top();
786 : }
787 : else
788 : {
789 0 : aPos.Y() += pFrm->Prt().Top();
790 : }
791 : }
792 0 : break;
793 : }
794 : }
795 0 : if ( _opPercent )
796 0 : *_opPercent = pFrm->Prt().SSize();
797 : }
798 : else
799 : {
800 0 : const SwFrm* pUpper = ( pFrm->IsPageFrm() || pFrm->IsFlyFrm() ) ?
801 0 : pFrm : pFrm->GetUpper();
802 0 : SWRECTFN( pUpper );
803 0 : if ( _opPercent )
804 : {
805 : // If the size is relative from page, then full size should be counted from the page frame.
806 0 : if (pFmtFrmSize && pFmtFrmSize->GetWidthPercentRelation() == text::RelOrientation::PAGE_FRAME)
807 0 : _opPercent->setWidth(pPage->Frm().Width());
808 : else
809 0 : _opPercent->setWidth(pUpper->Prt().Width());
810 :
811 0 : if (pFmtFrmSize && pFmtFrmSize->GetHeightPercentRelation() == text::RelOrientation::PAGE_FRAME)
812 : // If the size is relative from page, then full size should be counted from the page frame.
813 0 : _opPercent->setHeight(pPage->Frm().Height());
814 : else
815 0 : _opPercent->setHeight(pUpper->Prt().Height());
816 : }
817 :
818 0 : bRTL = pFrm->IsRightToLeft();
819 0 : if ( bRTL )
820 0 : aPos = pFrm->Frm().TopRight();
821 : else
822 0 : aPos = (pFrm->Frm().*fnRect->fnGetPos)();
823 : // #i17567# - allow negative positions
824 : // for fly frames anchor to paragraph/to character.
825 0 : if ((_nAnchorId == FLY_AT_PARA) || (_nAnchorId == FLY_AT_CHAR))
826 : {
827 : // The rectangle, the fly frame can be positioned in, is determined
828 : // horizontally by the frame area of the horizontal environment
829 : // and vertically by the printing area of the vertical environment,
830 : // if the object follows the text flow, or by the frame area of the
831 : // vertical environment, if the object doesn't follow the text flow.
832 : // new class <SwEnvironmentOfAnchoredObject>
833 : objectpositioning::SwEnvironmentOfAnchoredObject aEnvOfObj(
834 0 : _bFollowTextFlow );
835 : const SwLayoutFrm& rHoriEnvironLayFrm =
836 0 : aEnvOfObj.GetHoriEnvironmentLayoutFrm( *pFrm );
837 : const SwLayoutFrm& rVertEnvironLayFrm =
838 0 : aEnvOfObj.GetVertEnvironmentLayoutFrm( *pFrm );
839 0 : SwRect aHoriEnvironRect( rHoriEnvironLayFrm.Frm() );
840 0 : SwRect aVertEnvironRect;
841 0 : if ( _bFollowTextFlow )
842 : {
843 0 : aVertEnvironRect = rVertEnvironLayFrm.Prt();
844 0 : aVertEnvironRect.Pos() += rVertEnvironLayFrm.Frm().Pos();
845 : // #i18732# - adjust vertical 'virtual' anchor position
846 : // (<aPos.Y()> respectively <aPos.X()>), if object is vertical aligned
847 : // to page areas.
848 0 : if ( _eVertRelOrient == text::RelOrientation::PAGE_FRAME || _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
849 : {
850 0 : if ( bVert && !bVertL2R )
851 : {
852 0 : aPos.X() = aVertEnvironRect.Right();
853 : }
854 0 : else if ( bVertL2R )
855 : {
856 0 : aPos.X() = aVertEnvironRect.Left();
857 : }
858 : else
859 : {
860 0 : aPos.Y() = aVertEnvironRect.Top();
861 : }
862 : }
863 : }
864 : else
865 : {
866 : OSL_ENSURE( rVertEnvironLayFrm.IsPageFrm(),
867 : "<SwFEShell::CalcBoundRect(..)> - not following text flow, but vertical environment *not* page!" );
868 0 : aVertEnvironRect = rVertEnvironLayFrm.Frm();
869 : // #i18732# - adjustment vertical 'virtual' anchor position
870 : // (<aPos.Y()> respectively <aPos.X()>), if object is vertical aligned
871 : // to page areas.
872 0 : if ( _eVertRelOrient == text::RelOrientation::PAGE_FRAME || _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
873 : {
874 0 : if ( bVert && !bVertL2R )
875 : {
876 0 : aPos.X() = aVertEnvironRect.Right();
877 0 : if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
878 : {
879 0 : aPos.setX(aPos.getX() - rVertEnvironLayFrm.GetRightMargin());
880 : }
881 : }
882 0 : else if ( bVertL2R )
883 : {
884 0 : aPos.X() = aVertEnvironRect.Left();
885 0 : if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
886 : {
887 0 : aPos.setX(aPos.getX() + rVertEnvironLayFrm.GetLeftMargin());
888 : }
889 : }
890 : else
891 : {
892 0 : aPos.Y() = aVertEnvironRect.Top();
893 0 : if ( _eVertRelOrient == text::RelOrientation::PAGE_PRINT_AREA )
894 : {
895 0 : aPos.setY(aPos.getY() + rVertEnvironLayFrm.GetTopMargin());
896 : // add height of page header
897 0 : const SwFrm* pTmpFrm = rVertEnvironLayFrm.Lower();
898 0 : if ( pTmpFrm->IsHeaderFrm() )
899 : {
900 0 : aPos.setY(aPos.getY() + pTmpFrm->Frm().Height());
901 : }
902 : }
903 : }
904 : }
905 : }
906 :
907 : // #i22341# - adjust vertical 'virtual' anchor position
908 : // (<aPos.Y()> respectively <aPos.X()>), if object is anchored to
909 : // character and vertical aligned at character or top of line
910 : // <pFrm>, which is the anchor frame or the proposed anchor frame,
911 : // doesn't have to be a text frame (e.g. edit a to-page anchored
912 : // fly frame). Thus, assure this.
913 0 : const SwTxtFrm* pTxtFrm( dynamic_cast<const SwTxtFrm*>(pFrm) );
914 0 : if ( pTxtFrm &&
915 0 : (_nAnchorId == FLY_AT_CHAR) &&
916 0 : ( _eVertRelOrient == text::RelOrientation::CHAR ||
917 : _eVertRelOrient == text::RelOrientation::TEXT_LINE ) )
918 : {
919 0 : SwTwips nTop = 0L;
920 0 : if ( _eVertRelOrient == text::RelOrientation::CHAR )
921 : {
922 0 : SwRect aChRect;
923 0 : if ( _pToCharCntntPos )
924 : {
925 0 : pTxtFrm->GetAutoPos( aChRect, *_pToCharCntntPos );
926 : }
927 : else
928 : {
929 : // No content position provided. Thus, use a default one.
930 0 : SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) );
931 0 : pTxtFrm->GetAutoPos( aChRect, aDefaultCntntPos );
932 : }
933 0 : nTop = (aChRect.*fnRect->fnGetBottom)();
934 : }
935 : else
936 : {
937 0 : if ( _pToCharCntntPos )
938 : {
939 0 : pTxtFrm->GetTopOfLine( nTop, *_pToCharCntntPos );
940 : }
941 : else
942 : {
943 : // No content position provided. Thus, use a default one.
944 0 : SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) );
945 0 : pTxtFrm->GetTopOfLine( nTop, aDefaultCntntPos );
946 : }
947 : }
948 0 : if ( bVert || bVertL2R )
949 : {
950 0 : aPos.setX(nTop);
951 : }
952 : else
953 : {
954 0 : aPos.setY(nTop);
955 : }
956 : }
957 :
958 : // #i26945# - adjust horizontal 'virtual' anchor
959 : // position (<aPos.X()> respectively <aPos.Y()>), if object is
960 : // anchored to character and horizontal aligned at character.
961 0 : if ( pTxtFrm &&
962 0 : (_nAnchorId == FLY_AT_CHAR) &&
963 : _eHoriRelOrient == text::RelOrientation::CHAR )
964 : {
965 0 : SwTwips nLeft = 0L;
966 0 : SwRect aChRect;
967 0 : if ( _pToCharCntntPos )
968 : {
969 0 : pTxtFrm->GetAutoPos( aChRect, *_pToCharCntntPos );
970 : }
971 : else
972 : {
973 : // No content position provided. Thus, use a default one.
974 0 : SwPosition aDefaultCntntPos( *(pTxtFrm->GetTxtNode()) );
975 0 : pTxtFrm->GetAutoPos( aChRect, aDefaultCntntPos );
976 : }
977 0 : nLeft = (aChRect.*fnRect->fnGetLeft)();
978 0 : if ( bVert || bVertL2R )
979 : {
980 0 : aPos.setY(nLeft);
981 : }
982 : else
983 : {
984 0 : aPos.setX(nLeft);
985 : }
986 : }
987 0 : if ( bVert || bVertL2R )
988 : {
989 0 : _orRect = SwRect( aVertEnvironRect.Left(),
990 : aHoriEnvironRect.Top(),
991 : aVertEnvironRect.Width(),
992 0 : aHoriEnvironRect.Height() );
993 : }
994 : else
995 : {
996 0 : _orRect = SwRect( aHoriEnvironRect.Left(),
997 : aVertEnvironRect.Top(),
998 : aHoriEnvironRect.Width(),
999 0 : aVertEnvironRect.Height() );
1000 0 : }
1001 : }
1002 : else
1003 : {
1004 0 : if( _opRef && pFly && pFly->IsFlyInCntFrm() )
1005 0 : *_opRef = ( (SwFlyInCntFrm*)pFly )->GetRefPoint();
1006 :
1007 0 : _orRect = pUpper->Frm();
1008 0 : if( !pUpper->IsBodyFrm() )
1009 : {
1010 0 : _orRect += pUpper->Prt().Pos();
1011 0 : _orRect.SSize( pUpper->Prt().SSize() );
1012 0 : if ( pUpper->IsCellFrm() )//MA_FLY_HEIGHT
1013 : {
1014 0 : const SwFrm* pTab = pUpper->FindTabFrm();
1015 0 : long nBottom = (pTab->GetUpper()->*fnRect->fnGetPrtBottom)();
1016 0 : (_orRect.*fnRect->fnSetBottom)( nBottom );
1017 : }
1018 : }
1019 : // only use 90% of height for character bound
1020 : {
1021 0 : if( bVert || bVertL2R )
1022 0 : _orRect.Width( (_orRect.Width()*9)/10 );
1023 : else
1024 0 : _orRect.Height( (_orRect.Height()*9)/10 );
1025 : }
1026 : }
1027 :
1028 0 : const SwTwips nBaseOfstForFly = ( pFrm->IsTxtFrm() && pFly ) ?
1029 0 : ((SwTxtFrm*)pFrm)->GetBaseOfstForFly( !bWrapThrough ) :
1030 0 : 0;
1031 0 : if( bVert || bVertL2R )
1032 : {
1033 0 : bVertic = bVert;
1034 0 : bVerticalL2R = bVertL2R;
1035 0 : _bMirror = false;
1036 :
1037 0 : switch ( _eHoriRelOrient )
1038 : {
1039 : case text::RelOrientation::FRAME_RIGHT:
1040 : {
1041 0 : aPos.setY(aPos.getY() + pFrm->Prt().Height());
1042 0 : aPos += (pFrm->Prt().*fnRect->fnGetPos)();
1043 0 : break;
1044 : }
1045 : case text::RelOrientation::PRINT_AREA:
1046 : {
1047 0 : aPos += (pFrm->Prt().*fnRect->fnGetPos)();
1048 0 : aPos.setY(aPos.getY() + nBaseOfstForFly);
1049 0 : break;
1050 : }
1051 : case text::RelOrientation::PAGE_RIGHT:
1052 : {
1053 0 : aPos.setY(pPage->Frm().Top() + pPage->Prt().Bottom());
1054 0 : break;
1055 : }
1056 : case text::RelOrientation::PAGE_PRINT_AREA:
1057 : {
1058 0 : aPos.setY(pPage->Frm().Top() + pPage->Prt().Top());
1059 0 : break;
1060 : }
1061 : case text::RelOrientation::PAGE_LEFT:
1062 : case text::RelOrientation::PAGE_FRAME:
1063 : {
1064 0 : aPos.setY(pPage->Frm().Top());
1065 0 : break;
1066 : }
1067 : case text::RelOrientation::FRAME:
1068 : {
1069 0 : aPos.setY(aPos.getY() + nBaseOfstForFly);
1070 0 : break;
1071 : }
1072 0 : default: break;
1073 : }
1074 : }
1075 0 : else if( _bMirror )
1076 : {
1077 0 : switch ( _eHoriRelOrient )
1078 : {
1079 0 : case text::RelOrientation::FRAME_RIGHT: aPos.setX(aPos.getX() + pFrm->Prt().Left()); break;
1080 : case text::RelOrientation::FRAME:
1081 0 : case text::RelOrientation::FRAME_LEFT: aPos.setX(aPos.getX() + pFrm->Frm().Width()); break;
1082 0 : case text::RelOrientation::PRINT_AREA: aPos.setX(aPos.getX() + pFrm->Prt().Right()); break;
1083 : case text::RelOrientation::PAGE_LEFT:
1084 0 : case text::RelOrientation::PAGE_FRAME: aPos.setX(pPage->Frm().Right()); break;
1085 0 : case text::RelOrientation::PAGE_PRINT_AREA: aPos.setX(pPage->Frm().Left()
1086 0 : + pPage->Prt().Left()); break;
1087 0 : default: break;
1088 : }
1089 : }
1090 0 : else if ( bRTL )
1091 : {
1092 0 : switch ( _eHoriRelOrient )
1093 : {
1094 : case text::RelOrientation::FRAME_LEFT:
1095 0 : aPos.setX(pFrm->Frm().Left() +
1096 0 : pFrm->Prt().Left());
1097 0 : break;
1098 :
1099 : case text::RelOrientation::PRINT_AREA:
1100 0 : aPos.setX(pFrm->Frm().Left() + pFrm->Prt().Left() +
1101 0 : pFrm->Prt().Width());
1102 0 : aPos.setX(aPos.getX() + nBaseOfstForFly);
1103 0 : break;
1104 :
1105 : case text::RelOrientation::PAGE_LEFT:
1106 0 : aPos.setX(pPage->Frm().Left() + pPage->Prt().Left());
1107 0 : break;
1108 :
1109 : case text::RelOrientation::PAGE_PRINT_AREA:
1110 0 : aPos.setX(pPage->Frm().Left() + pPage->Prt().Left() +
1111 0 : pPage->Prt().Width());
1112 0 : break;
1113 :
1114 : case text::RelOrientation::PAGE_RIGHT:
1115 : case text::RelOrientation::PAGE_FRAME:
1116 0 : aPos.setX(pPage->Frm().Right());
1117 0 : break;
1118 :
1119 : case text::RelOrientation::FRAME:
1120 0 : aPos.setX(aPos.getX() + nBaseOfstForFly);
1121 0 : break;
1122 0 : default: break;
1123 : }
1124 : }
1125 : else
1126 : {
1127 0 : switch ( _eHoriRelOrient )
1128 : {
1129 : case text::RelOrientation::FRAME_RIGHT:
1130 0 : aPos.X() += pFrm->Prt().Width();
1131 0 : aPos += pFrm->Prt().Pos();
1132 0 : break;
1133 : case text::RelOrientation::PRINT_AREA:
1134 0 : aPos += pFrm->Prt().Pos();
1135 0 : aPos.setX(aPos.getX() + nBaseOfstForFly);
1136 0 : break;
1137 : case text::RelOrientation::PAGE_RIGHT:
1138 0 : aPos.setX(pPage->Frm().Left() + pPage->Prt().Right());
1139 0 : break;
1140 : case text::RelOrientation::PAGE_PRINT_AREA:
1141 0 : aPos.setX(pPage->Frm().Left() + pPage->Prt().Left());
1142 0 : break;
1143 : case text::RelOrientation::PAGE_LEFT:
1144 : case text::RelOrientation::PAGE_FRAME:
1145 0 : aPos.setX(pPage->Frm().Left());
1146 0 : break;
1147 : case text::RelOrientation::FRAME:
1148 0 : aPos.setX(aPos.getX() + nBaseOfstForFly);
1149 0 : break;
1150 0 : default: break;
1151 : }
1152 : }
1153 :
1154 : }
1155 0 : if( !_opRef )
1156 : {
1157 0 : if( bVertic && !bVerticalL2R )
1158 0 : _orRect.Pos( aPos.getX() - _orRect.Width() - _orRect.Left(), _orRect.Top() - aPos.getY() );
1159 0 : else if( bVerticalL2R )
1160 0 : _orRect.Pos( _orRect.Left() - aPos.getX(), _orRect.Top() - aPos.getY() );
1161 0 : else if ( bRTL )
1162 0 : _orRect.Pos( - ( _orRect.Right() - aPos.getX() ), _orRect.Top() - aPos.getY() );
1163 : else
1164 0 : _orRect.Pos( _orRect.Left() - aPos.getX(), _orRect.Top() - aPos.getY() );
1165 0 : if( _bMirror )
1166 0 : _orRect.Pos( -_orRect.Right(), _orRect.Top() );
1167 : }
1168 0 : }
1169 :
1170 0 : Size SwFEShell::GetGraphicDefaultSize() const
1171 : {
1172 0 : Size aRet;
1173 0 : SwFlyFrm *pFly = FindFlyFrm();
1174 0 : if ( pFly )
1175 : {
1176 : // #i32951# - due to issue #i28701# no format of a
1177 : // newly inserted Writer fly frame or its anchor frame is performed
1178 : // any more. Thus, it could be possible (e.g. on insert of a horizontal
1179 : // line) that the anchor frame isn't formatted and its printing area
1180 : // size is (0,0). If this is the case the printing area of the upper
1181 : // of the anchor frame is taken.
1182 0 : const SwFrm* pAnchorFrm = pFly->GetAnchorFrm();
1183 0 : aRet = pAnchorFrm->Prt().SSize();
1184 0 : if ( aRet.Width() == 0 && aRet.Height() == 0 &&
1185 0 : pAnchorFrm->GetUpper() )
1186 : {
1187 0 : aRet = pAnchorFrm->GetUpper()->Prt().SSize();
1188 : }
1189 :
1190 0 : SwRect aBound;
1191 0 : CalcBoundRect( aBound, pFly->GetFmt()->GetAnchor().GetAnchorId());
1192 0 : if ( pFly->GetAnchorFrm()->IsVertical() )
1193 0 : aRet.Width() = aBound.Width();
1194 : else
1195 0 : aRet.Height() = aBound.Height();
1196 : }
1197 0 : return aRet;
1198 : }
1199 :
1200 804 : bool SwFEShell::IsFrmVertical(const bool bEnvironment, bool& bRTL, bool& bVertL2R) const
1201 : {
1202 804 : bool bVert = false;
1203 804 : bRTL = false;
1204 804 : bVertL2R = false;
1205 :
1206 804 : if ( Imp()->HasDrawView() )
1207 : {
1208 804 : const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
1209 804 : if( rMrkList.GetMarkCount() != 1 )
1210 804 : return bVert;
1211 :
1212 0 : SdrObject* pObj = rMrkList.GetMark( 0 )->GetMarkedSdrObj();
1213 0 : if ( !pObj )
1214 : {
1215 : OSL_FAIL( "<SwFEShell::IsFrmVertical(..)> - missing SdrObject instance in marked object list -> This is a serious situation, please inform OD" );
1216 0 : return bVert;
1217 : }
1218 : // #i26791#
1219 0 : SwContact* pContact = static_cast<SwContact*>(GetUserCall( pObj ));
1220 0 : if ( !pContact )
1221 : {
1222 : OSL_FAIL( "<SwFEShell::IsFrmVertical(..)> - missing SwContact instance at marked object -> This is a serious situation, please inform OD" );
1223 0 : return bVert;
1224 : }
1225 0 : const SwFrm* pRef = pContact->GetAnchoredObj( pObj )->GetAnchorFrm();
1226 0 : if ( !pRef )
1227 : {
1228 : OSL_FAIL( "<SwFEShell::IsFrmVertical(..)> - missing anchor frame at marked object -> This is a serious situation, please inform OD" );
1229 0 : return bVert;
1230 : }
1231 :
1232 0 : if ( pObj->ISA(SwVirtFlyDrawObj) && !bEnvironment )
1233 0 : pRef = static_cast<const SwVirtFlyDrawObj*>(pObj)->GetFlyFrm();
1234 :
1235 0 : bVert = pRef->IsVertical();
1236 0 : bRTL = pRef->IsRightToLeft();
1237 0 : bVertL2R = pRef->IsVertLR();
1238 : }
1239 :
1240 0 : return bVert;
1241 : }
1242 :
1243 0 : void SwFEShell::MoveObjectIfActive( svt::EmbeddedObjectRef&, const Point& )
1244 : {
1245 : // does not do anything, only avoids crash if the method is used for wrong shell
1246 0 : }
1247 :
1248 0 : void SwFEShell::ToggleHeaderFooterEdit()
1249 : {
1250 : // Clear objects selection
1251 0 : if ( Imp()->GetDrawView()->AreObjectsMarked() )
1252 : {
1253 0 : Imp()->GetDrawView()->UnmarkAll();
1254 0 : ClearMark();
1255 : }
1256 :
1257 0 : SwCrsrShell::ToggleHeaderFooterEdit();
1258 270 : }
1259 :
1260 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|