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 <com/sun/star/container/XChild.hpp>
21 : #include <com/sun/star/embed/XVisualObject.hpp>
22 : #include <com/sun/star/embed/EmbedMisc.hpp>
23 : #include <com/sun/star/embed/EmbedStates.hpp>
24 : #include <com/sun/star/beans/XPropertySet.hpp>
25 : #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
26 : #include <com/sun/star/chart2/XChartDocument.hpp>
27 : #include <com/sun/star/util/XModifiable.hpp>
28 :
29 : #include <svx/dialogs.hrc>
30 :
31 : #include <math.h>
32 : #include <hintids.hxx>
33 : #include <svx/hdft.hxx>
34 : #include <svx/svdview.hxx>
35 : #include <sot/factory.hxx>
36 : #include <svl/itemiter.hxx>
37 : #include <tools/bigint.hxx>
38 : #include <sot/storage.hxx>
39 : #include <svtools/insdlg.hxx>
40 : #include <sfx2/frmdescr.hxx>
41 : #include <sfx2/ipclient.hxx>
42 : #include <svtools/ehdl.hxx>
43 : #include <svtools/soerr.hxx>
44 : #include <unotools/moduleoptions.hxx>
45 : #include <editeng/sizeitem.hxx>
46 : #include <editeng/formatbreakitem.hxx>
47 : #include <editeng/svxacorr.hxx>
48 : #include <editeng/ulspitem.hxx>
49 : #include <vcl/graph.hxx>
50 : #include <vcl/msgbox.hxx>
51 : #include <sfx2/printer.hxx>
52 : #include <unotools/charclass.hxx>
53 : #include <comphelper/storagehelper.hxx>
54 : #include <svx/svxdlg.hxx>
55 : #include <svx/extrusionbar.hxx>
56 : #include <svx/fontworkbar.hxx>
57 : #include <frmfmt.hxx>
58 : #include <fmtftn.hxx>
59 : #include <fmthdft.hxx>
60 : #include <fmtpdsc.hxx>
61 : #include <wdocsh.hxx>
62 : #include <basesh.hxx>
63 : #include <swmodule.hxx>
64 : #include <wrtsh.hxx>
65 : #include <view.hxx>
66 : #include <uitool.hxx>
67 : #include <cmdid.h>
68 : #include <cfgitems.hxx>
69 : #include <pagedesc.hxx>
70 : #include <frmmgr.hxx>
71 : #include <shellio.hxx>
72 : #include <uinums.hxx>
73 : #include <swundo.hxx>
74 : #include <swcli.hxx>
75 : #include <poolfmt.hxx>
76 : #include <wview.hxx>
77 : #include <edtwin.hxx>
78 : #include <fmtcol.hxx>
79 : #include <swtable.hxx>
80 : #include <caption.hxx>
81 : #include <viscrs.hxx>
82 : #include <swdtflvr.hxx>
83 : #include <crsskip.hxx>
84 : #include <doc.hxx>
85 : #include <IDocumentSettingAccess.hxx>
86 : #include <wrtsh.hrc>
87 : #include <SwStyleNameMapper.hxx>
88 : #include <sfx2/request.hxx>
89 : #include <paratr.hxx>
90 : #include <ndtxt.hxx>
91 : #include <editeng/acorrcfg.hxx>
92 : #include <IMark.hxx>
93 : #include <sfx2/bindings.hxx>
94 : #include <svx/dialmgr.hxx>
95 :
96 : // -> #111827#
97 : #include <SwRewriter.hxx>
98 : #include <comcore.hrc>
99 : // <- #111827#
100 :
101 : #include <toolkit/helper/vclunohelper.hxx>
102 : #include <sfx2/viewfrm.hxx>
103 :
104 : #include "PostItMgr.hxx"
105 : #include <sfx2/msgpool.hxx>
106 : #include <boost/scoped_ptr.hpp>
107 :
108 : using namespace sw::mark;
109 : using namespace com::sun::star;
110 :
111 : #define COMMON_INI_LIST \
112 : m_fnDrag(&SwWrtShell::BeginDrag),\
113 : m_fnSetCrsr(&SwWrtShell::SetCrsr),\
114 : m_fnEndDrag(&SwWrtShell::DefaultEndDrag),\
115 : m_fnKillSel(&SwWrtShell::Ignore),\
116 : m_pModeStack(0), \
117 : m_ePageMove(MV_NO),\
118 : m_pCrsrStack(0), \
119 : m_rView(rShell),\
120 : m_aNavigationMgr(*this), \
121 : m_bDestOnStack(false)
122 :
123 : #define BITFLD_INI_LIST \
124 : m_bClearMark = \
125 : m_bIns = true;\
126 : m_bAddMode = \
127 : m_bBlockMode = \
128 : m_bExtMode = \
129 : m_bInSelect = \
130 : m_bCopy = \
131 : m_bLayoutMode = \
132 : m_bSelWrd = \
133 : m_bSelLn = \
134 : m_bRetainSelection = false; \
135 : m_bIsInClickToEdit = false;
136 :
137 0 : static SvxAutoCorrect* lcl_IsAutoCorr()
138 : {
139 0 : SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get().GetAutoCorrect();
140 0 : if( pACorr && !pACorr->IsAutoCorrFlag( CapitalStartSentence | CapitalStartWord |
141 : AddNonBrkSpace | ChgOrdinalNumber |
142 0 : ChgToEnEmDash | SetINetAttr | Autocorrect ))
143 0 : pACorr = 0;
144 0 : return pACorr;
145 : }
146 :
147 0 : void SwWrtShell::NoEdit(bool bHideCrsr)
148 : {
149 0 : if(bHideCrsr)
150 0 : HideCrsr();
151 0 : }
152 :
153 3 : void SwWrtShell::Edit()
154 : {
155 3 : if (CanInsert())
156 : {
157 3 : ShowCrsr();
158 : }
159 3 : }
160 :
161 0 : bool SwWrtShell::IsEndWrd()
162 : {
163 0 : SwMvContext aMvContext(this);
164 0 : if(IsEndPara() && !IsSttPara())
165 0 : return true;
166 :
167 0 : return IsEndWord();
168 : }
169 :
170 : // Insert string
171 2 : void SwWrtShell::InsertByWord( const OUString & rStr)
172 : {
173 2 : if( !rStr.isEmpty() )
174 : {
175 2 : bool bDelim = GetAppCharClass().isLetterNumeric( rStr, 0 );
176 2 : sal_Int32 nPos = 0, nStt = 0;
177 59 : for( ; nPos < rStr.getLength(); nPos++ )
178 : {
179 57 : bool bTmpDelim = GetAppCharClass().isLetterNumeric( rStr, nPos );
180 57 : if( bTmpDelim != bDelim )
181 : {
182 3 : Insert( rStr.copy( nStt, nPos - nStt ));
183 3 : nStt = nPos;
184 : }
185 : }
186 2 : if( nStt != nPos )
187 2 : Insert( rStr.copy( nStt, nPos - nStt ));
188 : }
189 2 : }
190 :
191 16 : void SwWrtShell::Insert( const OUString &rStr )
192 : {
193 16 : ResetCursorStack();
194 16 : if( !CanInsert() )
195 16 : return;
196 :
197 16 : bool bStarted = false;
198 16 : bool bHasSel = HasSelection(),
199 16 : bCallIns = m_bIns /*|| bHasSel*/;
200 16 : bool bDeleted = false;
201 :
202 16 : if( bHasSel || ( !m_bIns && SelectHiddenRange() ) )
203 : {
204 : // Only here parenthesizing, because the normal
205 : // insert is already in parentheses at Editshell.
206 0 : StartAllAction();
207 :
208 : // #111827#
209 0 : SwRewriter aRewriter;
210 :
211 0 : aRewriter.AddRule(UndoArg1, GetCrsrDescr());
212 0 : aRewriter.AddRule(UndoArg2, OUString(SW_RES(STR_YIELDS)));
213 : {
214 0 : OUString aTmpStr;
215 0 : aTmpStr += SW_RES(STR_START_QUOTE);
216 0 : aTmpStr += rStr;
217 0 : aTmpStr += SW_RES(STR_END_QUOTE);
218 :
219 0 : aRewriter.AddRule(UndoArg3, rStr);
220 : }
221 :
222 0 : StartUndo(UNDO_REPLACE, &aRewriter);
223 0 : bStarted = true;
224 0 : bDeleted = DelRight() != 0;
225 : }
226 :
227 : bCallIns ?
228 16 : SwEditShell::Insert2( rStr, bDeleted ) : SwEditShell::Overwrite( rStr );
229 :
230 16 : if( bStarted )
231 : {
232 0 : EndAllAction();
233 0 : EndUndo();
234 : }
235 : }
236 :
237 : // Maximum height limit not possible, because the maximum height
238 : // of the current frame can not be obtained.
239 :
240 0 : void SwWrtShell::Insert( const OUString &rPath, const OUString &rFilter,
241 : const Graphic &rGrf, SwFlyFrmAttrMgr *pFrmMgr,
242 : bool bRule )
243 : {
244 0 : ResetCursorStack();
245 0 : if ( !CanInsert() )
246 0 : return;
247 :
248 0 : StartAllAction();
249 :
250 0 : SwRewriter aRewriter;
251 0 : aRewriter.AddRule(UndoArg1, SW_RES(STR_GRAPHIC));
252 :
253 0 : StartUndo(UNDO_INSERT, &aRewriter);
254 :
255 0 : if ( HasSelection() )
256 0 : DelRight();
257 : // Inserted graphics in its own paragraph,
258 : // if at the end of a non-empty paragraph.
259 : //For i120928,avoid to split node
260 :
261 0 : EnterSelFrmMode();
262 :
263 0 : bool bSetGrfSize = true;
264 0 : bool bOwnMgr = false;
265 :
266 0 : if ( !pFrmMgr )
267 : {
268 0 : bOwnMgr = true;
269 0 : pFrmMgr = new SwFlyFrmAttrMgr( true, this, FRMMGR_TYPE_GRF );
270 :
271 : // CAUTION
272 : // GetAttrSet makes an adjustment
273 : // While pasting is a SwFrmSize present
274 : // because of the DEF-Framesize
275 : // These must be removed explicitly for the optimal size.
276 0 : pFrmMgr->DelAttr(RES_FRM_SIZE);
277 : }
278 : else
279 : {
280 0 : Size aSz( pFrmMgr->GetSize() );
281 0 : if ( !aSz.Width() || !aSz.Height() )
282 : {
283 0 : aSz.Width() = aSz.Height() = 567;
284 0 : pFrmMgr->SetSize( aSz );
285 : }
286 0 : else if ( aSz.Width() != DFLT_WIDTH && aSz.Height() != DFLT_HEIGHT )
287 0 : bSetGrfSize = false;
288 :
289 0 : pFrmMgr->SetHeightSizeType(ATT_FIX_SIZE);
290 : }
291 :
292 : // Insert the graphic
293 0 : SwFEShell::Insert(rPath, rFilter, &rGrf, &pFrmMgr->GetAttrSet());
294 0 : if ( bOwnMgr )
295 0 : pFrmMgr->UpdateAttrMgr();
296 :
297 0 : if( bSetGrfSize && !bRule )
298 : {
299 0 : Size aGrfSize, aBound = GetGraphicDefaultSize();
300 0 : GetGrfSize( aGrfSize );
301 :
302 : // Add the margin attributes to GrfSize,
303 : // because these counts at the margin additionally
304 0 : aGrfSize.Width() += pFrmMgr->CalcWidthBorder();
305 0 : aGrfSize.Height()+= pFrmMgr->CalcHeightBorder();
306 :
307 0 : const BigInt aTempWidth( aGrfSize.Width() );
308 0 : const BigInt aTempHeight( aGrfSize.Height());
309 :
310 : // Fit width if necessary, scale down the height proportional thereafter.
311 0 : if( aGrfSize.Width() > aBound.Width() )
312 : {
313 0 : aGrfSize.Width() = aBound.Width();
314 0 : aGrfSize.Height() = BigInt(aBound.Width()) * aTempHeight / aTempWidth;
315 : }
316 : // Fit hight if necessary, scale down the width proportional thereafter.
317 0 : if( aGrfSize.Height() > aBound.Height() )
318 : {
319 0 : aGrfSize.Height() = aBound.Height();
320 0 : aGrfSize.Width() = BigInt(aBound.Height()) * aTempWidth / aTempHeight;
321 : }
322 0 : pFrmMgr->SetSize( aGrfSize );
323 0 : pFrmMgr->UpdateFlyFrm();
324 : }
325 0 : if ( bOwnMgr )
326 0 : delete pFrmMgr;
327 :
328 0 : EndUndo();
329 0 : EndAllAction();
330 : }
331 :
332 : // Insert an OLE-Objekt into the CORE.
333 : // if no object is transferred, then one will be created.
334 :
335 0 : void SwWrtShell::InsertObject( const svt::EmbeddedObjectRef& xRef, SvGlobalName *pName,
336 : bool bActivate, sal_uInt16 nSlotId )
337 : {
338 0 : ResetCursorStack();
339 0 : if( !CanInsert() )
340 0 : return;
341 :
342 0 : if( !xRef.is() )
343 : {
344 : // temporary storage
345 0 : svt::EmbeddedObjectRef xObj;
346 0 : uno::Reference < embed::XStorage > xStor = comphelper::OStorageHelper::GetTemporaryStorage();
347 0 : bool bDoVerb = true;
348 0 : if ( pName )
349 : {
350 0 : comphelper::EmbeddedObjectContainer aCnt( xStor );
351 0 : OUString aName;
352 : // TODO/LATER: get aspect?
353 0 : xObj.Assign( aCnt.CreateEmbeddedObject( pName->GetByteSequence(), aName ), embed::Aspects::MSOLE_CONTENT );
354 : }
355 : else
356 : {
357 0 : SvObjectServerList aServerList;
358 0 : switch (nSlotId)
359 : {
360 : case SID_INSERT_OBJECT:
361 : {
362 0 : aServerList.FillInsertObjects();
363 0 : aServerList.Remove( SwDocShell::Factory().GetClassId() );
364 : // Intentionally no break!
365 : }
366 :
367 : // TODO/LATER: recording! Convert properties to items
368 : case SID_INSERT_PLUGIN:
369 : case SID_INSERT_FLOATINGFRAME:
370 : {
371 0 : SfxSlotPool* pSlotPool = SW_MOD()->GetSlotPool();
372 0 : const SfxSlot* pSlot = pSlotPool->GetSlot(nSlotId);
373 0 : OString aCmd(".uno:");
374 0 : aCmd += pSlot->GetUnoName();
375 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
376 : boost::scoped_ptr<SfxAbstractInsertObjectDialog> pDlg(
377 0 : pFact->CreateInsertObjectDialog( GetWin(), OUString::fromUtf8( aCmd ), xStor, &aServerList ));
378 0 : if ( pDlg )
379 : {
380 0 : pDlg->Execute();
381 0 : bDoVerb = pDlg->IsCreateNew();
382 0 : OUString aIconMediaType;
383 0 : uno::Reference< io::XInputStream > xIconMetaFile = pDlg->GetIconIfIconified( &aIconMediaType );
384 0 : xObj.Assign( pDlg->GetObject(),
385 0 : xIconMetaFile.is() ? embed::Aspects::MSOLE_ICON : embed::Aspects::MSOLE_CONTENT );
386 0 : if ( xIconMetaFile.is() )
387 0 : xObj.SetGraphicStream( xIconMetaFile, aIconMediaType );
388 : }
389 :
390 0 : break;
391 : }
392 :
393 : default:
394 0 : break;
395 0 : }
396 : }
397 :
398 0 : if ( xObj.is() )
399 : {
400 0 : if( InsertOleObject( xObj ) && bActivate && bDoVerb )
401 : {
402 0 : SfxInPlaceClient* pClient = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin() );
403 0 : if ( !pClient )
404 : {
405 0 : pClient = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
406 0 : SetCheckForOLEInCaption( true );
407 : }
408 :
409 0 : if ( xObj.GetViewAspect() == embed::Aspects::MSOLE_ICON )
410 : {
411 0 : SwRect aArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() );
412 0 : aArea.Pos() += GetAnyCurRect( RECT_FLY_EMBEDDED, 0, xObj.GetObject() ).Pos();
413 0 : MapMode aMapMode( MAP_TWIP );
414 0 : Size aSize = xObj.GetSize( &aMapMode );
415 0 : aArea.Width( aSize.Width() );
416 0 : aArea.Height( aSize.Height() );
417 0 : RequestObjectResize( aArea, xObj.GetObject() );
418 : }
419 : else
420 0 : CalcAndSetScale( xObj );
421 :
422 : //#50270# We don't need to handle error, this is handled by the
423 : //DoVerb in the SfxViewShell
424 0 : pClient->DoVerb( SVVERB_SHOW );
425 :
426 : // TODO/LATER: set document name - should be done in Client
427 : }
428 0 : }
429 : }
430 : else
431 : {
432 0 : if( HasSelection() )
433 0 : DelRight();
434 0 : InsertOleObject( xRef );
435 : }
436 : }
437 :
438 : // Insert object into the Core.
439 : // From ClipBoard or Insert
440 :
441 0 : bool SwWrtShell::InsertOleObject( const svt::EmbeddedObjectRef& xRef, SwFlyFrameFormat **pFlyFrameFormat )
442 : {
443 0 : ResetCursorStack();
444 0 : StartAllAction();
445 :
446 0 : StartUndo(UNDO_INSERT);
447 :
448 : //Some differences between StarMath and any other objects:
449 : //1. Selections should be deleted. For StarMath the Text should be
450 : // passed to the Object
451 : //2. If the cursor is at the end of an non empty paragraph a paragraph
452 : // break should be insertet. StarMath objects are character bound and
453 : // no break should be inserted.
454 : //3. If an selection is passed to a StarMath object, this object should
455 : // not be activated. false should be returned then.
456 0 : bool bStarMath = true;
457 0 : bool bActivate = true;
458 :
459 : // set parent to get correct VisArea(in case of object needing parent printer)
460 0 : uno::Reference < container::XChild > xChild( xRef.GetObject(), uno::UNO_QUERY );
461 0 : if ( xChild.is() )
462 0 : xChild->setParent( mpDoc->GetDocShell()->GetModel() );
463 :
464 0 : SvGlobalName aCLSID( xRef->getClassID() );
465 0 : bStarMath = ( SotExchange::IsMath( aCLSID ) != 0 );
466 0 : if( IsSelection() )
467 : {
468 0 : if( bStarMath )
469 : {
470 0 : OUString aMathData;
471 0 : GetSelectedText( aMathData, GETSELTXT_PARABRK_TO_ONLYCR );
472 :
473 0 : if( !aMathData.isEmpty() && svt::EmbeddedObjectRef::TryRunningState( xRef.GetObject() ) )
474 : {
475 0 : uno::Reference < beans::XPropertySet > xSet( xRef->getComponent(), uno::UNO_QUERY );
476 0 : if ( xSet.is() )
477 : {
478 : try
479 : {
480 0 : xSet->setPropertyValue("Formula", uno::makeAny( OUString( aMathData ) ) );
481 0 : bActivate = false;
482 : }
483 0 : catch (const uno::Exception&)
484 : {
485 : }
486 0 : }
487 0 : }
488 : }
489 0 : DelRight();
490 : }
491 :
492 0 : if ( !bStarMath )
493 0 : SwFEShell::SplitNode( false, false );
494 :
495 0 : EnterSelFrmMode();
496 :
497 0 : SwFlyFrmAttrMgr aFrmMgr( true, this, FRMMGR_TYPE_OLE );
498 0 : aFrmMgr.SetHeightSizeType(ATT_FIX_SIZE);
499 :
500 0 : SwRect aBound;
501 0 : CalcBoundRect( aBound, aFrmMgr.GetAnchor() );
502 :
503 : //The Size should be suggested by the OLE server
504 0 : MapMode aMapMode( MAP_TWIP );
505 0 : Size aSz = xRef.GetSize( &aMapMode );
506 :
507 : //Object size can be limited
508 0 : if ( aSz.Width() > aBound.Width() )
509 : {
510 : //Always limit proportional.
511 0 : aSz.Height() = aSz.Height() * aBound.Width() / aSz.Width();
512 0 : aSz.Width() = aBound.Width();
513 : }
514 0 : aFrmMgr.SetSize( aSz );
515 0 : SwFlyFrameFormat *pFormat = SwFEShell::InsertObject( xRef, &aFrmMgr.GetAttrSet() );
516 :
517 : // --> #i972#
518 0 : if ( bStarMath && mpDoc->getIDocumentSettingAccess().get( DocumentSettingId::MATH_BASELINE_ALIGNMENT ) )
519 0 : AlignFormulaToBaseline( xRef.GetObject() );
520 :
521 0 : if (pFlyFrameFormat)
522 0 : *pFlyFrameFormat = pFormat;
523 :
524 0 : if ( SotExchange::IsChart( aCLSID ) )
525 : {
526 0 : uno::Reference< embed::XEmbeddedObject > xEmbeddedObj( xRef.GetObject(), uno::UNO_QUERY );
527 0 : if ( xEmbeddedObj.is() )
528 : {
529 0 : bool bDisableDataTableDialog = false;
530 0 : svt::EmbeddedObjectRef::TryRunningState( xEmbeddedObj );
531 0 : uno::Reference< beans::XPropertySet > xProps( xEmbeddedObj->getComponent(), uno::UNO_QUERY );
532 0 : if ( xProps.is() &&
533 0 : ( xProps->getPropertyValue("DisableDataTableDialog") >>= bDisableDataTableDialog ) &&
534 : bDisableDataTableDialog )
535 : {
536 0 : xProps->setPropertyValue("DisableDataTableDialog",
537 0 : uno::makeAny( false ) );
538 0 : xProps->setPropertyValue("DisableComplexChartTypes",
539 0 : uno::makeAny( false ) );
540 0 : uno::Reference< util::XModifiable > xModifiable( xProps, uno::UNO_QUERY );
541 0 : if ( xModifiable.is() )
542 : {
543 0 : xModifiable->setModified( sal_True );
544 0 : }
545 0 : }
546 0 : }
547 : }
548 :
549 0 : EndAllAction();
550 0 : GetView().AutoCaption(OLE_CAP, &aCLSID);
551 :
552 0 : SwRewriter aRewriter;
553 :
554 0 : if ( bStarMath )
555 0 : aRewriter.AddRule(UndoArg1, SW_RES(STR_MATH_FORMULA));
556 0 : else if ( SotExchange::IsChart( aCLSID ) )
557 0 : aRewriter.AddRule(UndoArg1, SW_RES(STR_CHART));
558 : else
559 0 : aRewriter.AddRule(UndoArg1, SW_RES(STR_OLE));
560 :
561 0 : EndUndo(UNDO_INSERT, &aRewriter);
562 :
563 0 : return bActivate;
564 : }
565 :
566 : // The current selected OLE object will be loaded with the
567 : // verb into the server.
568 :
569 0 : void SwWrtShell::LaunchOLEObj( long nVerb )
570 : {
571 0 : if ( GetCntType() == CNT_OLE &&
572 0 : !GetView().GetViewFrame()->GetFrame().IsInPlace() )
573 : {
574 0 : svt::EmbeddedObjectRef& xRef = GetOLEObject();
575 : OSL_ENSURE( xRef.is(), "OLE not found" );
576 0 : SfxInPlaceClient* pCli=0;
577 :
578 0 : pCli = GetView().FindIPClient( xRef.GetObject(), &GetView().GetEditWin() );
579 0 : if ( !pCli )
580 0 : pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xRef );
581 :
582 0 : static_cast<SwOleClient*>(pCli)->SetInDoVerb( true );
583 :
584 0 : CalcAndSetScale( xRef );
585 0 : pCli->DoVerb( nVerb );
586 :
587 0 : static_cast<SwOleClient*>(pCli)->SetInDoVerb( false );
588 0 : CalcAndSetScale( xRef );
589 : }
590 0 : }
591 :
592 6 : void SwWrtShell::MoveObjectIfActive( svt::EmbeddedObjectRef& xObj, const Point& rOffset )
593 : {
594 : try
595 : {
596 6 : sal_Int32 nState = xObj->getCurrentState();
597 6 : if ( nState == ::com::sun::star::embed::EmbedStates::INPLACE_ACTIVE
598 6 : || nState == ::com::sun::star::embed::EmbedStates::UI_ACTIVE )
599 : {
600 : SfxInPlaceClient* pCli =
601 0 : GetView().FindIPClient( xObj.GetObject(), &(GetView().GetEditWin()) );
602 0 : if ( pCli )
603 : {
604 0 : Rectangle aArea = pCli->GetObjArea();
605 0 : aArea += rOffset;
606 0 : pCli->SetObjArea( aArea );
607 : }
608 : }
609 : }
610 0 : catch (const uno::Exception&)
611 : {
612 : }
613 6 : }
614 :
615 809 : void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
616 : const SwRect *pFlyPrtRect,
617 : const SwRect *pFlyFrmRect,
618 : const bool bNoTextFrmPrtAreaChanged )
619 : {
620 : // Setting the scale of the client. This arises from the difference
621 : // between the VisArea of the object and the ObjArea.
622 : OSL_ENSURE( xObj.is(), "ObjectRef not valid" );
623 :
624 809 : sal_Int64 nAspect = xObj.GetViewAspect();
625 809 : if ( nAspect == embed::Aspects::MSOLE_ICON )
626 802 : return; // the replacement image is completely controlled by container in this case
627 :
628 809 : sal_Int64 nMisc = 0;
629 809 : bool bLinkingChart = false;
630 :
631 : try
632 : {
633 809 : nMisc = xObj->getStatus( nAspect );
634 :
635 : // This can surely only be a non-active object, if desired they
636 : // get the new size set as VisArea (StarChart).
637 809 : if( embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE & nMisc )
638 : {
639 : // TODO/MBA: testing
640 : SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
641 157 : : GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ));
642 157 : if( !aRect.IsEmpty() )
643 : {
644 : // TODO/LEAN: getMapUnit can switch object to running state
645 : // xObj.TryRunningState();
646 :
647 157 : MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
648 :
649 : // TODO/LATER: needs complete VisArea?!
650 157 : Size aSize( OutputDevice::LogicToLogic( aRect.SVRect(), MAP_TWIP, aUnit ).GetSize() );
651 157 : awt::Size aSz;
652 157 : aSz.Width = aSize.Width();
653 157 : aSz.Height = aSize.Height();
654 :
655 : // Action 'setVisualAreaSize' doesn't have to change the
656 : // modified state of the document, either.
657 157 : bool bModified = false;
658 157 : uno::Reference<util::XModifiable> xModifiable(xObj->getComponent(), uno::UNO_QUERY);
659 157 : if (xModifiable.is())
660 4 : bModified = xModifiable->isModified();
661 157 : xObj->setVisualAreaSize( nAspect, aSz );
662 4 : xModifiable.set(xObj->getComponent(), uno::UNO_QUERY);
663 4 : if (xModifiable.is())
664 4 : xModifiable->setModified(bModified);
665 :
666 : // #i48419# - action 'UpdateReplacement' doesn't
667 : // have to change the modified state of the document.
668 : // This is only a workaround for the defect, that this action
669 : // modifies a document after load, because unnecessarily the
670 : // replacement graphic is updated, in spite of the fact that
671 : // nothing has been changed.
672 : // If the replacement graphic changes by this action, the document
673 : // will be already modified via other mechanisms.
674 : {
675 4 : bool bResetEnableSetModified(false);
676 4 : if ( GetDoc()->GetDocShell()->IsEnableSetModified() )
677 : {
678 3 : GetDoc()->GetDocShell()->EnableSetModified( false );
679 3 : bResetEnableSetModified = true;
680 : }
681 :
682 : //#i79576# don't destroy chart replacement images on load
683 : //#i79578# don't request a new replacement image for charts to often
684 : //a chart sends a modified call to the framework if it was changed
685 : //thus the replacement update is already handled elsewhere
686 4 : if ( !SotExchange::IsChart( xObj->getClassID() ) )
687 0 : xObj.UpdateReplacement();
688 :
689 4 : if ( bResetEnableSetModified )
690 : {
691 3 : GetDoc()->GetDocShell()->EnableSetModified( true );
692 : }
693 157 : }
694 : }
695 :
696 : // TODO/LATER: this is only a workaround,
697 4 : uno::Reference< chart2::XChartDocument > xChartDocument( xObj->getComponent(), uno::UNO_QUERY );
698 4 : bLinkingChart = ( xChartDocument.is() && !xChartDocument->hasInternalDataProvider() );
699 : }
700 : }
701 306 : catch (const uno::Exception&)
702 : {
703 : // TODO/LATER: handle the error
704 153 : return;
705 : }
706 :
707 656 : SfxInPlaceClient* pCli = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin() );
708 656 : if ( !pCli )
709 : {
710 650 : if ( (embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY & nMisc)
711 650 : || bLinkingChart
712 : // TODO/LATER: ResizeOnPrinterChange
713 : //|| SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & xObj->GetMiscStatus()
714 : // --> OD #i117189# - refine condition for non-resizable objects
715 : // non-resizable objects need to be set the size back by this method
716 649 : || ( bNoTextFrmPrtAreaChanged && nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE ) )
717 : {
718 1 : pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
719 : }
720 : else
721 649 : return;
722 : }
723 :
724 : // TODO/LEAN: getMapUnit can switch object to running state
725 : // xObj.TryRunningState();
726 :
727 7 : awt::Size aSize;
728 : try
729 : {
730 7 : aSize = xObj->getVisualAreaSize( nAspect );
731 : }
732 0 : catch (const embed::NoVisualAreaSizeException&)
733 : {
734 : OSL_FAIL("Can't get visual area size!\n" );
735 : // the scaling will not be done
736 : }
737 0 : catch (const uno::Exception&)
738 : {
739 : // TODO/LATER: handle the error
740 : OSL_FAIL("Can't get visual area size!\n" );
741 0 : return;
742 : }
743 :
744 7 : Size _aVisArea( aSize.Width, aSize.Height );
745 :
746 7 : Fraction aScaleWidth( 1, 1 );
747 14 : Fraction aScaleHeight( 1, 1 );
748 :
749 7 : bool bUseObjectSize = false;
750 :
751 : // As long as there comes no reasonable size from the object,
752 : // nothing can be scaled.
753 7 : if( _aVisArea.Width() && _aVisArea.Height() )
754 : {
755 7 : const MapMode aTmp( MAP_TWIP );
756 7 : MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
757 7 : _aVisArea = OutputDevice::LogicToLogic( _aVisArea, aUnit, aTmp);
758 7 : Size aObjArea;
759 7 : if ( pFlyPrtRect )
760 7 : aObjArea = pFlyPrtRect->SSize();
761 : else
762 0 : aObjArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ).SSize();
763 :
764 : // differ the aObjArea and _aVisArea by 1 Pixel then set new VisArea
765 : long nX, nY;
766 7 : SwSelPaintRects::Get1PixelInLogic( *this, &nX, &nY );
767 21 : if( !( _aVisArea.Width() - nX <= aObjArea.Width() &&
768 14 : _aVisArea.Width() + nX >= aObjArea.Width() &&
769 7 : _aVisArea.Height()- nY <= aObjArea.Height()&&
770 14 : _aVisArea.Height()+ nY >= aObjArea.Height() ))
771 : {
772 0 : if ( nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE )
773 : {
774 : // the object must not be scaled,
775 : // the size stored in object must be used for restoring
776 0 : bUseObjectSize = true;
777 : }
778 : else
779 : {
780 0 : aScaleWidth = Fraction( aObjArea.Width(), _aVisArea.Width() );
781 0 : aScaleHeight = Fraction( aObjArea.Height(), _aVisArea.Height());
782 : }
783 7 : }
784 : }
785 :
786 : // Now is the favorable time to set the ObjArea.
787 : // The Scaling must be considered.
788 7 : SwRect aArea;
789 7 : if ( pFlyPrtRect )
790 : {
791 7 : aArea = *pFlyPrtRect;
792 7 : aArea += pFlyFrmRect->Pos();
793 : }
794 : else
795 : {
796 0 : aArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() );
797 0 : aArea.Pos() += GetAnyCurRect( RECT_FLY_EMBEDDED, 0, xObj.GetObject() ).Pos();
798 : }
799 :
800 7 : if ( bUseObjectSize )
801 : {
802 : // --> this moves non-resizable object so that when adding borders the baseline remains the same
803 0 : const SwFlyFrameFormat *pFlyFrameFormat = dynamic_cast< const SwFlyFrameFormat * >( GetFlyFrameFormat() );
804 : OSL_ENSURE( pFlyFrameFormat, "Could not find fly frame." );
805 0 : if ( pFlyFrameFormat )
806 : {
807 0 : const Point &rPoint = pFlyFrameFormat->GetLastFlyFrmPrtRectPos();
808 : SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
809 0 : : GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ));
810 0 : aArea += rPoint - aRect.Pos(); // adjust area by diff of printing area position in order to keep baseline alignment correct.
811 : }
812 0 : aArea.Width ( _aVisArea.Width() );
813 0 : aArea.Height( _aVisArea.Height() );
814 0 : RequestObjectResize( aArea, xObj.GetObject() );
815 : }
816 : else
817 : {
818 7 : aArea.Width ( Fraction( aArea.Width() ) / pCli->GetScaleWidth() );
819 7 : aArea.Height( Fraction( aArea.Height() ) / pCli->GetScaleHeight());
820 : }
821 :
822 14 : pCli->SetObjAreaAndScale( aArea.SVRect(), aScaleWidth, aScaleHeight );
823 : }
824 :
825 0 : void SwWrtShell::ConnectObj( svt::EmbeddedObjectRef& xObj, const SwRect &rPrt,
826 : const SwRect &rFrm )
827 : {
828 0 : SfxInPlaceClient* pCli = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin());
829 0 : if ( !pCli )
830 0 : pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
831 0 : CalcAndSetScale( xObj, &rPrt, &rFrm );
832 0 : }
833 :
834 : // Insert hard page break;
835 : // Selections will be overwritten
836 44 : void SwWrtShell::InsertPageBreak(const OUString *pPageDesc, const ::boost::optional<sal_uInt16>& oPgNum )
837 : {
838 44 : ResetCursorStack();
839 44 : if( CanInsert() )
840 : {
841 44 : SwActContext aActContext(this);
842 44 : StartUndo(UNDO_UI_INSERT_PAGE_BREAK);
843 :
844 44 : if ( !IsCrsrInTable() )
845 : {
846 44 : if(HasSelection())
847 0 : DelRight();
848 44 : SwFEShell::SplitNode();
849 : // delete the numbered attribute of the last line if the last line is empty
850 44 : GetDoc()->ClearLineNumAttrs( *GetCrsr()->GetPoint() );
851 : }
852 :
853 : const SwPageDesc *pDesc = pPageDesc
854 44 : ? FindPageDescByName( *pPageDesc, true ) : 0;
855 44 : if( pDesc )
856 : {
857 44 : SwFormatPageDesc aDesc( pDesc );
858 44 : aDesc.SetNumOffset( oPgNum );
859 44 : SetAttrItem( aDesc );
860 : }
861 : else
862 0 : SetAttrItem( SvxFormatBreakItem(SVX_BREAK_PAGE_BEFORE, RES_BREAK) );
863 44 : EndUndo(UNDO_UI_INSERT_PAGE_BREAK);
864 : }
865 44 : }
866 :
867 : // Insert hard page break;
868 : // Selections will be overwritten
869 :
870 0 : void SwWrtShell::InsertLineBreak()
871 : {
872 0 : ResetCursorStack();
873 0 : if( CanInsert() )
874 : {
875 0 : if(HasSelection())
876 0 : DelRight();
877 :
878 0 : const sal_Unicode cIns = 0x0A;
879 0 : SvxAutoCorrect* pACorr = lcl_IsAutoCorr();
880 0 : if( pACorr )
881 0 : AutoCorrect( *pACorr, cIns );
882 : else
883 0 : SwWrtShell::Insert( OUString( cIns ) );
884 : }
885 0 : }
886 :
887 : // Insert hard column break;
888 : // Selections will be overwritten
889 :
890 0 : void SwWrtShell::InsertColumnBreak()
891 : {
892 0 : SwActContext aActContext(this);
893 0 : ResetCursorStack();
894 0 : if( CanInsert() )
895 : {
896 0 : StartUndo(UNDO_UI_INSERT_COLUMN_BREAK);
897 :
898 0 : if ( !IsCrsrInTable() )
899 : {
900 0 : if(HasSelection())
901 0 : DelRight();
902 0 : SwFEShell::SplitNode( false, false );
903 : }
904 0 : SetAttrItem(SvxFormatBreakItem(SVX_BREAK_COLUMN_BEFORE, RES_BREAK));
905 :
906 0 : EndUndo(UNDO_UI_INSERT_COLUMN_BREAK);
907 0 : }
908 0 : }
909 :
910 : // Insert footnote
911 : // rStr - optional footnote mark
912 :
913 0 : void SwWrtShell::InsertFootnote(const OUString &rStr, bool bEndNote, bool bEdit )
914 : {
915 0 : ResetCursorStack();
916 0 : if( CanInsert() )
917 : {
918 0 : if(HasSelection())
919 : {
920 : //collapse cursor to the end
921 0 : if(!IsCrsrPtAtEnd())
922 0 : SwapPam();
923 0 : ClearMark();
924 : }
925 0 : SwPosition aPos = *GetCrsr()->GetPoint();
926 0 : SwFormatFootnote aFootNote( bEndNote );
927 0 : if(!rStr.isEmpty())
928 0 : aFootNote.SetNumStr( rStr );
929 :
930 0 : SetAttrItem(aFootNote);
931 :
932 0 : if( bEdit )
933 : {
934 : // For editing the footnote text.
935 0 : Left(CRSR_SKIP_CHARS, false, 1, false );
936 0 : GotoFootnoteText();
937 : }
938 0 : m_aNavigationMgr.addEntry(aPos);
939 : }
940 0 : }
941 :
942 : // SplitNode; also, because
943 : // - of deleting selected content;
944 : // - of reset of the Cursorstack if necessary.
945 :
946 4 : void SwWrtShell::SplitNode( bool bAutoFormat, bool bCheckTableStart )
947 : {
948 4 : ResetCursorStack();
949 4 : if( CanInsert() )
950 : {
951 4 : SwActContext aActContext(this);
952 :
953 4 : m_rView.GetEditWin().FlushInBuffer();
954 4 : bool bHasSel = HasSelection();
955 4 : if( bHasSel )
956 : {
957 0 : StartUndo( UNDO_INSERT );
958 0 : DelRight();
959 : }
960 :
961 4 : SwFEShell::SplitNode( bAutoFormat, bCheckTableStart );
962 4 : if( bHasSel )
963 0 : EndUndo( UNDO_INSERT );
964 : }
965 4 : }
966 :
967 : // Turn on numbering
968 : // Parameter: Optional specification of a name for the named list;
969 : // this indicates a position if it is possible to convert them
970 : // into a number and less than nMaxRules.
971 :
972 : // To test the CharFormats at the numbering
973 : // external void SetNumChrFormat( SwWrtShell*, SwNumRules& );
974 :
975 : // -> #i40041#
976 : // Preconditions (as far as OD has figured out):
977 : // - <SwEditShell::HasNumber()> is false, if <bNum> is true
978 : // - <SwEditShell::HasBullet()> is false, if <bNum> is false
979 : // Behavior of method is determined by the current situation at the current
980 : // cursor position in the document.
981 0 : void SwWrtShell::NumOrBulletOn(bool bNum)
982 : {
983 : // determine numbering rule found at current cursor position in the document.
984 0 : const SwNumRule* pCurRule = GetNumRuleAtCurrCrsrPos();
985 :
986 0 : StartUndo(UNDO_NUMORNONUM);
987 :
988 0 : const SwNumRule * pNumRule = pCurRule;
989 :
990 : // - activate outline rule respectively turning on outline rule for
991 : // current text node. But, only for turning on a numbering (<bNum> == true).
992 : // - overwrite found numbering rule at current cursor position, if
993 : // no numbering rule can be retrieved from the paragraph style.
994 0 : bool bContinueFoundNumRule( false );
995 0 : bool bActivateOutlineRule( false );
996 0 : int nActivateOutlineLvl( MAXLEVEL ); // only relevant, if <bActivateOutlineRule> == true
997 0 : SwTextFormatColl * pColl = GetCurTextFormatColl();
998 0 : if ( pColl )
999 : {
1000 : // retrieve numbering rule at paragraph
1001 : // style, which is found at current cursor position in the document.
1002 0 : SwNumRule* pCollRule = mpDoc->FindNumRulePtr(pColl->GetNumRule().GetValue());
1003 : // #125993# - The outline numbering rule isn't allowed
1004 : // to be derived from a parent paragraph style to a derived one.
1005 : // Thus check, if the found outline numbering rule is directly
1006 : // set at the paragraph style <pColl>. If not, set <pCollRule> to NULL
1007 0 : if ( pCollRule && pCollRule == GetDoc()->GetOutlineNumRule() )
1008 : {
1009 : const SwNumRule* pDirectCollRule =
1010 0 : mpDoc->FindNumRulePtr(pColl->GetNumRule( false ).GetValue());
1011 0 : if ( !pDirectCollRule )
1012 : {
1013 0 : pCollRule = 0;
1014 : }
1015 : }
1016 :
1017 0 : if ( !pCollRule )
1018 : {
1019 0 : pNumRule = pCollRule;
1020 : }
1021 : // no activation or continuation of outline numbering in Writer/Web document
1022 0 : else if ( bNum &&
1023 0 : !dynamic_cast<SwWebDocShell*>(GetDoc()->GetDocShell()) &&
1024 0 : pCollRule == GetDoc()->GetOutlineNumRule() )
1025 : {
1026 0 : if ( pNumRule == pCollRule )
1027 : {
1028 : // check, if text node at current cursor positioned is counted.
1029 : // If not, let it been counted. Then it has to be checked,
1030 : // of the outline numbering has to be activated or continued.
1031 : SwTextNode* pTextNode =
1032 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTextNode();
1033 0 : if ( pTextNode && !pTextNode->IsCountedInList() )
1034 : {
1035 : // check, if numbering of the outline level of the paragraph
1036 : // style is active. If not, activate this outline level.
1037 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1038 : OSL_ENSURE( pColl->IsAssignedToListLevelOfOutlineStyle(),
1039 : "<SwWrtShell::NumOrBulletOn(..)> - paragraph style with outline rule, but no outline level" );
1040 0 : if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&
1041 0 : pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1042 : == SVX_NUM_NUMBER_NONE )
1043 : {
1044 : // activate outline numbering
1045 0 : bActivateOutlineRule = true;
1046 : }
1047 : else
1048 : {
1049 : // turning on outline numbering at current cursor position
1050 0 : bContinueFoundNumRule = true;
1051 : }
1052 : }
1053 : else
1054 : {
1055 : // #i101234#
1056 : // activate outline numbering, because from the precondition
1057 : // it's known, that <SwEdit::HasNumber()> == false
1058 0 : bActivateOutlineRule = true;
1059 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1060 : }
1061 : }
1062 0 : else if ( !pNumRule )
1063 : {
1064 : // #i101234#
1065 : // Check, if corresponding list level of the outline numbering
1066 : // has already a numbering format set.
1067 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1068 0 : if ( pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1069 : == SVX_NUM_NUMBER_NONE )
1070 : {
1071 : // activate outline numbering, because from the precondition
1072 : // it's known, that <SwEdit::HasNumber()> == false
1073 0 : bActivateOutlineRule = true;
1074 : }
1075 : else
1076 : {
1077 : // turning on outline numbering at current cursor position
1078 0 : bContinueFoundNumRule = true;
1079 : }
1080 : }
1081 : else
1082 : {
1083 : // check, if numbering of the outline level of the paragraph
1084 : // style is active. If not, activate this outline level.
1085 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1086 : OSL_ENSURE( pColl->IsAssignedToListLevelOfOutlineStyle(),
1087 : "<SwWrtShell::NumOrBulletOn(..)> - paragraph style with outline rule, but no outline level" );
1088 0 : if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&
1089 0 : pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1090 : == SVX_NUM_NUMBER_NONE )
1091 : {
1092 : // activate outline numbering
1093 0 : bActivateOutlineRule = true;
1094 : }
1095 : else
1096 : {
1097 : // turning on outline numbering at current cursor position
1098 0 : bContinueFoundNumRule = true;
1099 : }
1100 : }
1101 0 : pNumRule = pCollRule;
1102 : }
1103 : }
1104 :
1105 : // Only automatic numbering/bullet rules should be changed.
1106 : // Note: The outline numbering rule is also an automatic one. It's only
1107 : // changed, if it has to be activated.
1108 0 : if ( pNumRule )
1109 : {
1110 0 : if ( !pNumRule->IsAutoRule() )
1111 : {
1112 0 : pNumRule = 0;
1113 : }
1114 0 : else if ( pNumRule == GetDoc()->GetOutlineNumRule() &&
1115 0 : !bActivateOutlineRule && !bContinueFoundNumRule )
1116 : {
1117 0 : pNumRule = 0;
1118 : }
1119 : }
1120 :
1121 : // Search for a previous numbering/bullet rule to continue it.
1122 0 : OUString sContinuedListId;
1123 0 : if ( !pNumRule )
1124 : {
1125 0 : pNumRule = GetDoc()->SearchNumRule( *GetCrsr()->GetPoint(),
1126 : false, bNum, false, 0,
1127 0 : sContinuedListId );
1128 0 : bContinueFoundNumRule = pNumRule != 0;
1129 : }
1130 :
1131 0 : if (pNumRule)
1132 : {
1133 0 : SwNumRule aNumRule(*pNumRule);
1134 :
1135 : // do not change found numbering/bullet rule, if it should only be continued.
1136 0 : if ( !bContinueFoundNumRule )
1137 : {
1138 0 : SwTextNode * pTextNode = GetCrsr()->GetPoint()->nNode.GetNode().GetTextNode();
1139 :
1140 0 : if (pTextNode)
1141 : {
1142 : // use above retrieve outline level, if outline numbering has to be activated.
1143 : int nLevel = bActivateOutlineRule
1144 : ? nActivateOutlineLvl
1145 0 : : pTextNode->GetActualListLevel();
1146 :
1147 0 : if (nLevel < 0)
1148 0 : nLevel = 0;
1149 :
1150 0 : if (nLevel >= MAXLEVEL)
1151 0 : nLevel = MAXLEVEL - 1;
1152 :
1153 0 : SwNumFormat aFormat(aNumRule.Get(static_cast<sal_uInt16>(nLevel)));
1154 :
1155 0 : if (bNum)
1156 0 : aFormat.SetNumberingType(SVX_NUM_ARABIC);
1157 : else
1158 : {
1159 : // #i63395# Only apply user defined default bullet font
1160 0 : if ( numfunc::IsDefBulletFontUserDefined() )
1161 : {
1162 0 : const vcl::Font* pFnt = &numfunc::GetDefBulletFont();
1163 0 : aFormat.SetBulletFont( pFnt );
1164 : }
1165 0 : aFormat.SetBulletChar( numfunc::GetBulletChar(static_cast<sal_uInt8>(nLevel)));
1166 0 : aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
1167 : // #i93908# clear suffix for bullet lists
1168 0 : aFormat.SetPrefix(OUString());
1169 0 : aFormat.SetSuffix(OUString());
1170 : }
1171 0 : aNumRule.Set(static_cast<sal_uInt16>(nLevel), aFormat);
1172 : }
1173 : }
1174 :
1175 : // reset indent attribute on applying list style
1176 0 : SetCurNumRule( aNumRule, false, sContinuedListId, true );
1177 : }
1178 : else
1179 : {
1180 : // #i95907#
1181 : const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
1182 0 : numfunc::GetDefaultPositionAndSpaceMode() );
1183 0 : SwNumRule aNumRule( GetUniqueNumRuleName(), ePosAndSpaceMode );
1184 : // Append the character template at the numbering.
1185 : SwCharFormat* pChrFormat;
1186 0 : SwDocShell* pDocSh = GetView().GetDocShell();
1187 : // #i63395#
1188 : // Only apply user defined default bullet font
1189 0 : const vcl::Font* pFnt = numfunc::IsDefBulletFontUserDefined()
1190 : ? &numfunc::GetDefBulletFont()
1191 0 : : 0;
1192 :
1193 0 : if (bNum)
1194 : {
1195 0 : pChrFormat = GetCharFormatFromPool( RES_POOLCHR_NUM_LEVEL );
1196 : }
1197 : else
1198 : {
1199 0 : pChrFormat = GetCharFormatFromPool( RES_POOLCHR_BUL_LEVEL );
1200 : }
1201 :
1202 0 : const SwTextNode* pTextNode = GetCrsr()->GetPoint()->nNode.GetNode().GetTextNode();
1203 : const SwTwips nWidthOfTabs = pTextNode
1204 : ? pTextNode->GetWidthOfLeadingTabs()
1205 0 : : 0;
1206 0 : GetDoc()->getIDocumentContentOperations().RemoveLeadingWhiteSpace( *GetCrsr()->GetPoint() );
1207 :
1208 0 : const bool bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
1209 0 : const bool bRightToLeft = IsInRightToLeftText();
1210 0 : for( sal_uInt8 nLvl = 0; nLvl < MAXLEVEL; ++nLvl )
1211 : {
1212 0 : SwNumFormat aFormat( aNumRule.Get( nLvl ) );
1213 0 : aFormat.SetCharFormat( pChrFormat );
1214 :
1215 0 : if (! bNum)
1216 : {
1217 : // #i63395#
1218 : // Only apply user defined default bullet font
1219 0 : if ( pFnt )
1220 : {
1221 0 : aFormat.SetBulletFont( pFnt );
1222 : }
1223 0 : aFormat.SetBulletChar( numfunc::GetBulletChar(nLvl) );
1224 0 : aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
1225 : // #i93908# clear suffix for bullet lists
1226 0 : aFormat.SetPrefix(OUString());
1227 0 : aFormat.SetSuffix(OUString());
1228 : }
1229 :
1230 : // #i95907#
1231 0 : if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1232 : {
1233 0 : if(bHtml && nLvl)
1234 : {
1235 : // 1/2" for HTML
1236 0 : aFormat.SetAbsLSpace(nLvl * 720);
1237 : }
1238 0 : else if ( nWidthOfTabs > 0 )
1239 : {
1240 0 : aFormat.SetAbsLSpace(nWidthOfTabs + nLvl * 720);
1241 : }
1242 : }
1243 :
1244 : // #i38904# Default alignment for
1245 : // numbering/bullet should be rtl in rtl paragraph:
1246 0 : if ( bRightToLeft )
1247 : {
1248 0 : aFormat.SetNumAdjust( SVX_ADJUST_RIGHT );
1249 : }
1250 :
1251 0 : aNumRule.Set( nLvl, aFormat );
1252 0 : }
1253 :
1254 : // #i95907#
1255 0 : if ( pTextNode &&
1256 : ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
1257 : {
1258 :
1259 0 : const SwTwips nTextNodeIndent = pTextNode->GetAdditionalIndentForStartingNewList();
1260 0 : if ( ( nTextNodeIndent + nWidthOfTabs ) != 0 )
1261 : {
1262 : // #i111172#/fdo#85666
1263 : // If text node is already inside a list, assure that the indents
1264 : // are the same. Thus, adjust the indent change value by subtracting
1265 : // indents of to be applied list style.
1266 0 : SwTwips nIndentChange = nTextNodeIndent + nWidthOfTabs;
1267 0 : if ( pTextNode->GetNumRule() )
1268 : {
1269 0 : int nLevel = pTextNode->GetActualListLevel();
1270 :
1271 0 : if (nLevel < 0)
1272 0 : nLevel = 0;
1273 :
1274 0 : if (nLevel >= MAXLEVEL)
1275 0 : nLevel = MAXLEVEL - 1;
1276 :
1277 0 : const SwNumFormat aFormat( aNumRule.Get( nLevel ) );
1278 0 : if ( aFormat.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
1279 : {
1280 0 : nIndentChange -= aFormat.GetIndentAt() + aFormat.GetFirstLineIndent();
1281 0 : }
1282 : }
1283 0 : aNumRule.ChangeIndent( nIndentChange );
1284 : }
1285 : }
1286 : // reset indent attribute on applying list style
1287 : // start new list
1288 0 : SetCurNumRule( aNumRule, true, OUString(), true );
1289 : }
1290 :
1291 0 : EndUndo(UNDO_NUMORNONUM);
1292 0 : }
1293 : // <- #i40041#
1294 :
1295 0 : void SwWrtShell::NumOn()
1296 : {
1297 0 : NumOrBulletOn(true);
1298 0 : }
1299 :
1300 0 : void SwWrtShell::NumOrBulletOff()
1301 : {
1302 0 : const SwNumRule * pCurNumRule = GetNumRuleAtCurrCrsrPos();
1303 :
1304 0 : if (pCurNumRule)
1305 : {
1306 0 : if (pCurNumRule->IsOutlineRule())
1307 : {
1308 0 : SwNumRule aNumRule(*pCurNumRule);
1309 :
1310 : SwTextNode * pTextNode =
1311 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTextNode();
1312 :
1313 0 : if (pTextNode)
1314 : {
1315 0 : int nLevel = pTextNode->GetActualListLevel();
1316 :
1317 0 : if (nLevel < 0)
1318 0 : nLevel = 0;
1319 :
1320 0 : if (nLevel >= MAXLEVEL)
1321 0 : nLevel = MAXLEVEL - 1;
1322 :
1323 0 : SwNumFormat aFormat(aNumRule.Get(static_cast<sal_uInt16>(nLevel)));
1324 :
1325 0 : aFormat.SetNumberingType(SVX_NUM_NUMBER_NONE);
1326 0 : aNumRule.Set(nLevel, aFormat);
1327 :
1328 : // no start or continuation of a list - the outline style is only changed.
1329 0 : SetCurNumRule( aNumRule, false );
1330 0 : }
1331 : }
1332 : else
1333 : {
1334 0 : DelNumRules();
1335 : }
1336 :
1337 : // #126346# - Cursor can not be anymore in front of
1338 : // a label, because numbering/bullet is switched off.
1339 0 : SetInFrontOfLabel( false );
1340 : }
1341 0 : }
1342 : // <- #i29560#
1343 :
1344 : // Request Default-Bulletlist
1345 :
1346 0 : void SwWrtShell::BulletOn()
1347 : {
1348 0 : NumOrBulletOn(false);
1349 0 : }
1350 :
1351 19894 : SelectionType SwWrtShell::GetSelectionType() const
1352 : {
1353 : // ContentType cannot be determined within a
1354 : // Start-/Endaction parentheses.
1355 : // Because there is no invalid value TEXT will be returned.
1356 : // The value does not matter, it may be updated in endaction anyway.
1357 :
1358 19894 : if ( BasicActionPend() )
1359 0 : return IsSelFrmMode() ? nsSelectionType::SEL_FRM : nsSelectionType::SEL_TXT;
1360 :
1361 19894 : SwView &_rView = const_cast<SwView&>(GetView());
1362 19894 : if (_rView.GetPostItMgr() && _rView.GetPostItMgr()->HasActiveSidebarWin() )
1363 0 : return nsSelectionType::SEL_POSTIT;
1364 :
1365 : // Inserting a frame is not a DrawMode
1366 : int nCnt;
1367 39790 : if ( !_rView.GetEditWin().IsFrmAction() &&
1368 39786 : (IsObjSelected() || (_rView.IsDrawMode() && !IsFrmSelected()) ))
1369 : {
1370 2 : if (GetDrawView()->IsTextEdit())
1371 0 : nCnt = nsSelectionType::SEL_DRW_TXT;
1372 : else
1373 : {
1374 2 : if (GetView().IsFormMode()) // Only Form selected
1375 0 : nCnt = nsSelectionType::SEL_DRW_FORM;
1376 : else
1377 2 : nCnt = nsSelectionType::SEL_DRW; // Any draw object
1378 :
1379 2 : if (_rView.IsBezierEditMode())
1380 0 : nCnt |= nsSelectionType::SEL_BEZ;
1381 2 : else if( GetDrawView()->GetContext() == SDRCONTEXT_MEDIA )
1382 0 : nCnt |= nsSelectionType::SEL_MEDIA;
1383 :
1384 2 : if (svx::checkForSelectedCustomShapes(
1385 2 : const_cast<SdrView *>(GetDrawView()),
1386 : true /* bOnlyExtruded */ ))
1387 : {
1388 0 : nCnt |= nsSelectionType::SEL_EXTRUDED_CUSTOMSHAPE;
1389 : }
1390 2 : sal_uInt32 nCheckStatus = 0;
1391 2 : if (svx::checkForSelectedFontWork(
1392 2 : const_cast<SdrView *>(GetDrawView()), nCheckStatus ))
1393 : {
1394 0 : nCnt |= nsSelectionType::SEL_FONTWORK;
1395 : }
1396 : }
1397 :
1398 2 : return nCnt;
1399 : }
1400 :
1401 19892 : nCnt = GetCntType();
1402 :
1403 19892 : if ( IsFrmSelected() )
1404 : {
1405 0 : if (_rView.IsDrawMode())
1406 0 : _rView.LeaveDrawCreate(); // clean up (Bug #45639)
1407 0 : if ( !(nCnt & (CNT_GRF | CNT_OLE)) )
1408 0 : return nsSelectionType::SEL_FRM;
1409 : }
1410 :
1411 19892 : if ( IsCrsrInTable() )
1412 472 : nCnt |= nsSelectionType::SEL_TBL;
1413 :
1414 19892 : if ( IsTableMode() )
1415 33 : nCnt |= (nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS);
1416 :
1417 : // Do not pop up numbering toolbar, if the text node has a numbering of type SVX_NUM_NUMBER_NONE.
1418 19892 : const SwNumRule* pNumRule = GetNumRuleAtCurrCrsrPos();
1419 19892 : if ( pNumRule )
1420 : {
1421 : const SwTextNode* pTextNd =
1422 413 : GetCrsr()->GetPoint()->nNode.GetNode().GetTextNode();
1423 :
1424 413 : if ( pTextNd && pTextNd->IsInList() )
1425 : {
1426 413 : int nLevel = pTextNd->GetActualListLevel();
1427 :
1428 413 : if (nLevel < 0)
1429 0 : nLevel = 0;
1430 :
1431 413 : if (nLevel >= MAXLEVEL)
1432 0 : nLevel = MAXLEVEL - 1;
1433 :
1434 413 : const SwNumFormat& rFormat = pNumRule->Get(nLevel);
1435 413 : if ( SVX_NUM_NUMBER_NONE != rFormat.GetNumberingType() )
1436 364 : nCnt |= nsSelectionType::SEL_NUM;
1437 : }
1438 : }
1439 :
1440 19892 : return nCnt;
1441 : }
1442 :
1443 : // Find the text collection with the name rCollname
1444 : // Returns: Pointer at the collection or 0, if no
1445 : // text collection with this name exists, or
1446 : // this is a default template.
1447 :
1448 0 : SwTextFormatColl *SwWrtShell::GetParaStyle(const OUString &rCollName, GetStyle eCreate )
1449 : {
1450 0 : SwTextFormatColl* pColl = FindTextFormatCollByName( rCollName );
1451 0 : if( !pColl && GETSTYLE_NOCREATE != eCreate )
1452 : {
1453 0 : sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rCollName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
1454 0 : if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
1455 0 : pColl = GetTextCollFromPool( nId );
1456 : }
1457 0 : return pColl;
1458 : }
1459 :
1460 : // Find the text collection with the name rCollname
1461 : // Returns: Pointer at the collection or 0, if no
1462 : // character template with this name exists, or
1463 : // this is a default template or template is automatic.
1464 :
1465 0 : SwCharFormat *SwWrtShell::GetCharStyle(const OUString &rFormatName, GetStyle eCreate )
1466 : {
1467 0 : SwCharFormat* pFormat = FindCharFormatByName( rFormatName );
1468 0 : if( !pFormat && GETSTYLE_NOCREATE != eCreate )
1469 : {
1470 0 : sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rFormatName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
1471 0 : if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
1472 0 : pFormat = static_cast<SwCharFormat*>(GetFormatFromPool( nId ));
1473 : }
1474 0 : return pFormat;
1475 : }
1476 :
1477 : // Find the table format with the name rFormatname
1478 : // Returns: Pointer at the collection or 0, if no
1479 : // frame format with this name exists or
1480 : // this is a default format or the format is automatic.
1481 :
1482 0 : SwFrameFormat *SwWrtShell::GetTableStyle(const OUString &rFormatName)
1483 : {
1484 0 : for( size_t i = GetTableFrameFormatCount(); i; )
1485 : {
1486 0 : SwFrameFormat *pFormat = &GetTableFrameFormat( --i );
1487 0 : if( !pFormat->IsDefault() &&
1488 0 : pFormat->GetName() == rFormatName && IsUsed( *pFormat ) )
1489 0 : return pFormat;
1490 : }
1491 0 : return 0;
1492 : }
1493 :
1494 20 : void SwWrtShell::addCurrentPosition() {
1495 20 : SwPaM* pPaM = GetCrsr();
1496 20 : m_aNavigationMgr.addEntry(*pPaM->GetPoint());
1497 20 : }
1498 :
1499 : // Applying templates
1500 :
1501 0 : void SwWrtShell::SetPageStyle(const OUString &rCollName)
1502 : {
1503 0 : if( !SwCrsrShell::HasSelection() && !IsSelFrmMode() && !IsObjSelected() )
1504 : {
1505 0 : SwPageDesc* pDesc = FindPageDescByName( rCollName, true );
1506 0 : if( pDesc )
1507 0 : ChgCurPageDesc( *pDesc );
1508 : }
1509 0 : }
1510 :
1511 : // Access templates
1512 :
1513 872 : OUString SwWrtShell::GetCurPageStyle( const bool bCalcFrm ) const
1514 : {
1515 872 : return GetPageDesc(GetCurPageDesc( bCalcFrm )).GetName();
1516 : }
1517 :
1518 : // Change the current template referring to the existing change.
1519 :
1520 0 : void SwWrtShell::QuickUpdateStyle()
1521 : {
1522 0 : SwTextFormatColl *pColl = GetCurTextFormatColl();
1523 :
1524 : // Default cannot be changed
1525 0 : if(pColl && !pColl->IsDefault())
1526 : {
1527 0 : FillByEx(pColl);
1528 : // Also apply the template to remove hard attribute assignment.
1529 0 : SetTextFormatColl(pColl);
1530 : }
1531 0 : }
1532 :
1533 0 : void SwWrtShell::AutoUpdatePara(SwTextFormatColl* pColl, const SfxItemSet& rStyleSet, SwPaM* pPaM )
1534 : {
1535 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr( );
1536 0 : SfxItemSet aCoreSet( GetAttrPool(),
1537 : RES_CHRATR_BEGIN, RES_CHRATR_END - 1,
1538 : RES_PARATR_BEGIN, RES_PARATR_END - 1,
1539 : RES_FRMATR_BEGIN, RES_FRMATR_END - 1,
1540 : SID_ATTR_TABSTOP_POS, SID_ATTR_TABSTOP_POS,
1541 : SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_DEFAULTS,
1542 : SID_ATTR_TABSTOP_OFFSET, SID_ATTR_TABSTOP_OFFSET,
1543 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
1544 : SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP,
1545 : SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM,
1546 0 : 0 );
1547 0 : GetPaMAttr( pCrsr, aCoreSet );
1548 0 : bool bReset = false;
1549 0 : SfxItemIter aParaIter( aCoreSet );
1550 0 : const SfxPoolItem* pParaItem = aParaIter.FirstItem();
1551 0 : while( pParaItem )
1552 : {
1553 0 : if(!IsInvalidItem(pParaItem))
1554 : {
1555 0 : sal_uInt16 nWhich = pParaItem->Which();
1556 0 : if(SfxItemState::SET == aCoreSet.GetItemState(nWhich) &&
1557 0 : SfxItemState::SET == rStyleSet.GetItemState(nWhich))
1558 : {
1559 0 : aCoreSet.ClearItem(nWhich);
1560 0 : bReset = true;
1561 : }
1562 : }
1563 0 : pParaItem = aParaIter.NextItem();
1564 : }
1565 0 : StartAction();
1566 0 : if(bReset)
1567 : {
1568 0 : ResetAttr( std::set<sal_uInt16>(), pCrsr );
1569 0 : SetAttrSet(aCoreSet, SetAttrMode::DEFAULT, pCrsr);
1570 : }
1571 0 : mpDoc->ChgFormat(*pColl, rStyleSet );
1572 0 : EndAction();
1573 0 : }
1574 :
1575 0 : void SwWrtShell::AutoUpdateFrame( SwFrameFormat* pFormat, const SfxItemSet& rStyleSet )
1576 : {
1577 0 : StartAction();
1578 :
1579 0 : ResetFlyFrmAttr( 0, &rStyleSet );
1580 0 : pFormat->SetFormatAttr( rStyleSet );
1581 :
1582 0 : EndAction();
1583 0 : }
1584 :
1585 3 : void SwWrtShell::AutoCorrect( SvxAutoCorrect& rACorr, sal_Unicode cChar )
1586 : {
1587 3 : ResetCursorStack();
1588 3 : if(CanInsert())
1589 : {
1590 3 : bool bStarted = false;
1591 3 : if(HasSelection())
1592 : {
1593 : // Only parenthese here, because the regular insert
1594 : // is already clipped to the editshell
1595 0 : StartAllAction();
1596 0 : StartUndo(UNDO_INSERT);
1597 0 : bStarted = true;
1598 0 : DelRight();
1599 : }
1600 3 : SwEditShell::AutoCorrect( rACorr, IsInsMode(), cChar );
1601 :
1602 3 : if(bStarted)
1603 : {
1604 0 : EndAllAction();
1605 0 : EndUndo(UNDO_INSERT);
1606 : }
1607 : }
1608 3 : }
1609 :
1610 : // Some kind of controlled copy ctor
1611 :
1612 0 : SwWrtShell::SwWrtShell( SwWrtShell& rSh, vcl::Window *_pWin, SwView &rShell )
1613 : : SwFEShell( rSh, _pWin ),
1614 0 : COMMON_INI_LIST
1615 : {
1616 0 : BITFLD_INI_LIST
1617 0 : SET_CURR_SHELL( this );
1618 :
1619 0 : SetSfxViewShell( static_cast<SfxViewShell *>(&rShell) );
1620 0 : SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
1621 :
1622 : // place the cursor on the first field...
1623 0 : IFieldmark *pBM = NULL;
1624 0 : if ( IsFormProtected() && ( pBM = GetFieldmarkAfter( ) ) !=NULL ) {
1625 0 : GotoFieldmark(pBM);
1626 0 : }
1627 0 : }
1628 :
1629 2761 : SwWrtShell::SwWrtShell( SwDoc& rDoc, vcl::Window *_pWin, SwView &rShell,
1630 : const SwViewOption *pViewOpt )
1631 : : SwFEShell( rDoc, _pWin, pViewOpt),
1632 2761 : COMMON_INI_LIST
1633 : {
1634 2761 : BITFLD_INI_LIST
1635 2761 : SET_CURR_SHELL( this );
1636 2761 : SetSfxViewShell( static_cast<SfxViewShell *>(&rShell) );
1637 2761 : SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
1638 :
1639 : // place the cursor on the first field...
1640 2761 : IFieldmark *pBM = NULL;
1641 2761 : if ( IsFormProtected() && ( pBM = GetFieldmarkAfter( ) ) !=NULL ) {
1642 1 : GotoFieldmark(pBM);
1643 2761 : }
1644 2761 : }
1645 :
1646 8271 : SwWrtShell::~SwWrtShell()
1647 : {
1648 2757 : SET_CURR_SHELL( this );
1649 5514 : while(IsModePushed())
1650 0 : PopMode();
1651 2757 : while(PopCrsr(false))
1652 : ;
1653 2757 : SwTransferable::ClearSelection( *this );
1654 5514 : }
1655 :
1656 1110 : bool SwWrtShell::Pop( bool bOldCrsr )
1657 : {
1658 1110 : bool bRet = SwCrsrShell::Pop( bOldCrsr );
1659 1110 : if( bRet && IsSelection() )
1660 : {
1661 17 : m_fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
1662 17 : m_fnKillSel = &SwWrtShell::ResetSelect;
1663 : }
1664 1110 : return bRet;
1665 : }
1666 :
1667 71 : bool SwWrtShell::CanInsert()
1668 : {
1669 71 : if(IsSelFrmMode())
1670 : {
1671 0 : return false;
1672 : }
1673 :
1674 71 : if(IsObjSelected())
1675 : {
1676 0 : return false;
1677 : }
1678 :
1679 71 : if(GetView().GetDrawFuncPtr())
1680 : {
1681 0 : return false;
1682 : }
1683 :
1684 71 : if(GetView().GetPostItMgr()->GetActiveSidebarWin())
1685 : {
1686 0 : return false;
1687 : }
1688 :
1689 71 : return true;
1690 : }
1691 :
1692 8 : void SwWrtShell::ChgDBData(const SwDBData& aDBData)
1693 : {
1694 8 : SwEditShell::ChgDBData(aDBData);
1695 : //notify the db-beamer if available
1696 8 : GetView().NotifyDBChanged();
1697 8 : }
1698 :
1699 0 : OUString SwWrtShell::GetSelDescr() const
1700 : {
1701 0 : OUString aResult;
1702 :
1703 0 : int nSelType = GetSelectionType();
1704 0 : switch (nSelType)
1705 : {
1706 : case nsSelectionType::SEL_GRF:
1707 0 : aResult = SW_RESSTR(STR_GRAPHIC);
1708 :
1709 0 : break;
1710 : case nsSelectionType::SEL_FRM:
1711 : {
1712 0 : const SwFrameFormat * pFrameFormat = GetCurFrameFormat();
1713 :
1714 0 : if (pFrameFormat)
1715 0 : aResult = pFrameFormat->GetDescription();
1716 : }
1717 0 : break;
1718 : case nsSelectionType::SEL_DRW:
1719 : {
1720 0 : aResult = SW_RESSTR(STR_DRAWING_OBJECTS);
1721 : }
1722 0 : break;
1723 : default:
1724 0 : if (0 != mpDoc)
1725 0 : aResult = GetCrsrDescr();
1726 : }
1727 :
1728 0 : return aResult;
1729 : }
1730 :
1731 1167 : void SwWrtShell::ApplyViewOptions( const SwViewOption &rOpt )
1732 : {
1733 1167 : SwFEShell::ApplyViewOptions( rOpt );
1734 : //#i115062# invalidate meta character slot
1735 1167 : GetView().GetViewFrame()->GetBindings().Invalidate( FN_VIEW_META_CHARS );
1736 1167 : }
1737 :
1738 0 : void SwWrtShell::SetReadonlyOption(bool bSet)
1739 : {
1740 0 : GetView().GetEditWin().GetFrameControlsManager().SetReadonlyControls( bSet );
1741 0 : SwViewShell::SetReadonlyOption( bSet );
1742 0 : }
1743 :
1744 : // Switch on/off header or footer of a page style - if an empty name is
1745 : // given all styles are changed
1746 :
1747 0 : void SwWrtShell::ChangeHeaderOrFooter(
1748 : const OUString& rStyleName, bool bHeader, bool bOn, bool bShowWarning)
1749 : {
1750 0 : addCurrentPosition();
1751 0 : StartAllAction();
1752 0 : StartUndo( UNDO_HEADER_FOOTER ); // #i7983#
1753 0 : bool bExecute = true;
1754 0 : bool bCrsrSet = false;
1755 0 : for( size_t nFrom = 0, nTo = GetPageDescCnt();
1756 : nFrom < nTo; ++nFrom )
1757 : {
1758 0 : SwPageDesc aDesc( GetPageDesc( nFrom ));
1759 0 : OUString sTmp(aDesc.GetName());
1760 0 : if( rStyleName.isEmpty() || rStyleName == sTmp )
1761 : {
1762 0 : bool bChgd = false;
1763 :
1764 0 : if( bShowWarning && !bOn && GetActiveView() && GetActiveView() == &GetView() &&
1765 0 : ( (bHeader && aDesc.GetMaster().GetHeader().IsActive()) ||
1766 0 : (!bHeader && aDesc.GetMaster().GetFooter().IsActive()) ) )
1767 : {
1768 0 : bShowWarning = false;
1769 : //Actions have to be closed while the dialog is showing
1770 0 : EndAllAction();
1771 :
1772 0 : vcl::Window* pParent = &GetView().GetViewFrame()->GetWindow();
1773 : short nResult;
1774 0 : if (bHeader) {
1775 0 : nResult = ScopedVclPtrInstance<DeleteHeaderDialog>::Create(pParent)->Execute();
1776 : } else {
1777 0 : nResult = ScopedVclPtrInstance<DeleteFooterDialog>::Create(pParent)->Execute();
1778 : }
1779 :
1780 0 : bExecute = nResult == RET_YES;
1781 0 : StartAllAction();
1782 : }
1783 0 : if( bExecute )
1784 : {
1785 0 : bChgd = true;
1786 0 : SwFrameFormat &rMaster = aDesc.GetMaster();
1787 0 : if(bHeader)
1788 0 : rMaster.SetFormatAttr( SwFormatHeader( bOn ));
1789 : else
1790 0 : rMaster.SetFormatAttr( SwFormatFooter( bOn ));
1791 0 : if( bOn )
1792 : {
1793 0 : SvxULSpaceItem aUL(bHeader ? 0 : MM50, bHeader ? MM50 : 0, RES_UL_SPACE );
1794 : SwFrameFormat* pFormat = bHeader ?
1795 0 : const_cast<SwFrameFormat*>(rMaster.GetHeader().GetHeaderFormat()) :
1796 0 : const_cast<SwFrameFormat*>(rMaster.GetFooter().GetFooterFormat());
1797 0 : pFormat->SetFormatAttr( aUL );
1798 : }
1799 : }
1800 0 : if( bChgd )
1801 : {
1802 0 : ChgPageDesc( nFrom, aDesc );
1803 :
1804 0 : if( !bCrsrSet && bOn )
1805 : {
1806 0 : if ( !IsHeaderFooterEdit() )
1807 0 : ToggleHeaderFooterEdit();
1808 : bCrsrSet = SetCrsrInHdFt(
1809 0 : rStyleName.isEmpty() ? SIZE_MAX : nFrom,
1810 0 : bHeader );
1811 : }
1812 : }
1813 : }
1814 0 : }
1815 0 : EndUndo( UNDO_HEADER_FOOTER ); // #i7983#
1816 0 : EndAllAction();
1817 0 : }
1818 :
1819 4 : void SwWrtShell::SetShowHeaderFooterSeparator( FrameControlType eControl, bool bShow )
1820 : {
1821 4 : SwViewShell::SetShowHeaderFooterSeparator( eControl, bShow );
1822 4 : if ( !bShow )
1823 4 : GetView().GetEditWin().GetFrameControlsManager().HideControls( eControl );
1824 181 : }
1825 :
1826 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|