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 : fnDrag(&SwWrtShell::BeginDrag),\
113 : fnSetCrsr(&SwWrtShell::SetCrsr),\
114 : fnEndDrag(&SwWrtShell::DefaultEndDrag),\
115 : fnKillSel(&SwWrtShell::Ignore),\
116 : pModeStack(0), \
117 : ePageMove(MV_NO),\
118 : pCrsrStack(0), \
119 : rView(rShell),\
120 : aNavigationMgr(*this), \
121 : bDestOnStack(false)
122 :
123 : #define BITFLD_INI_LIST \
124 : bClearMark = \
125 : bIns = true;\
126 : bAddMode = \
127 : bBlockMode = \
128 : bExtMode = \
129 : bInSelect = \
130 : bCopy = \
131 : bLayoutMode = \
132 : bSelWrd = \
133 : bSelLn = \
134 : mbRetainSelection = false; \
135 : bIsInClickToEdit = false;
136 :
137 0 : static SvxAutoCorrect* lcl_IsAutoCorr()
138 : {
139 0 : SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get().GetAutoCorrect();
140 0 : if( pACorr && !pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
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 0 : void SwWrtShell::Edit()
154 : {
155 0 : if (CanInsert())
156 : {
157 0 : ShowCrsr();
158 : }
159 0 : }
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 4 : void SwWrtShell::InsertByWord( const OUString & rStr)
172 : {
173 4 : if( !rStr.isEmpty() )
174 : {
175 4 : bool bDelim = GetAppCharClass().isLetterNumeric( rStr, 0 );
176 4 : sal_Int32 nPos = 0, nStt = 0;
177 118 : for( ; nPos < rStr.getLength(); nPos++ )
178 : {
179 114 : bool bTmpDelim = GetAppCharClass().isLetterNumeric( rStr, nPos );
180 114 : if( bTmpDelim != bDelim )
181 : {
182 6 : Insert( rStr.copy( nStt, nPos - nStt ));
183 6 : nStt = nPos;
184 : }
185 : }
186 4 : if( nStt != nPos )
187 4 : Insert( rStr.copy( nStt, nPos - nStt ));
188 : }
189 4 : }
190 :
191 18 : void SwWrtShell::Insert( const OUString &rStr )
192 : {
193 18 : ResetCursorStack();
194 18 : if( !CanInsert() )
195 18 : return;
196 :
197 18 : bool bStarted = false;
198 18 : bool bHasSel = HasSelection(),
199 18 : bCallIns = bIns /*|| bHasSel*/;
200 18 : bool bDeleted = false;
201 :
202 18 : if( bHasSel || ( !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 18 : SwEditShell::Insert2( rStr, bDeleted ) : SwEditShell::Overwrite( rStr );
229 :
230 18 : 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 transfered, 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(), OStringToOUString( aCmd, RTL_TEXTENCODING_UTF8 ), 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, SwFlyFrmFmt **pFlyFrmFmt )
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. sal_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 : SwFlyFrmFmt *pFmt = SwFEShell::InsertObject( xRef, &aFrmMgr.GetAttrSet() );
516 :
517 : // --> #i972#
518 0 : if ( bStarMath && mpDoc->getIDocumentSettingAccess().get( IDocumentSettingAccess::MATH_BASELINE_ALIGNMENT ) )
519 0 : AlignFormulaToBaseline( xRef.GetObject() );
520 :
521 0 : if (pFlyFrmFmt)
522 0 : *pFlyFrmFmt = pFmt;
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( sal_False ) );
538 0 : xProps->setPropertyValue("DisableComplexChartTypes",
539 0 : uno::makeAny( sal_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 : ((SwOleClient*)pCli)->SetInDoVerb( true );
583 :
584 0 : CalcAndSetScale( xRef );
585 0 : pCli->DoVerb( nVerb );
586 :
587 0 : ((SwOleClient*)pCli)->SetInDoVerb( false );
588 0 : CalcAndSetScale( xRef );
589 : }
590 0 : }
591 :
592 2 : void SwWrtShell::MoveObjectIfActive( svt::EmbeddedObjectRef& xObj, const Point& rOffset )
593 : {
594 : try
595 : {
596 2 : sal_Int32 nState = xObj->getCurrentState();
597 2 : if ( nState == ::com::sun::star::embed::EmbedStates::INPLACE_ACTIVE
598 2 : || 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 2 : }
614 :
615 1632 : void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
616 : const SwRect *pFlyPrtRect,
617 : const SwRect *pFlyFrmRect,
618 : const bool bNoTxtFrmPrtAreaChanged )
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 1632 : sal_Int64 nAspect = xObj.GetViewAspect();
625 1632 : if ( nAspect == embed::Aspects::MSOLE_ICON )
626 1610 : return; // the replacement image is completely controlled by container in this case
627 :
628 1632 : sal_Int64 nMisc = 0;
629 1632 : bool bLinkingChart = false;
630 :
631 : try
632 : {
633 1632 : 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 1632 : if( embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE & nMisc )
638 : {
639 : // TODO/MBA: testing
640 : SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
641 322 : : GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ));
642 322 : if( !aRect.IsEmpty() )
643 : {
644 : // TODO/LEAN: getMapUnit can switch object to running state
645 : // xObj.TryRunningState();
646 :
647 322 : MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
648 :
649 : // TODO/LATER: needs complete VisArea?!
650 322 : Size aSize( OutputDevice::LogicToLogic( aRect.SVRect(), MAP_TWIP, aUnit ).GetSize() );
651 322 : awt::Size aSz;
652 322 : aSz.Width = aSize.Width();
653 322 : aSz.Height = aSize.Height();
654 :
655 : // Action 'setVisualAreaSize' doesn't have to change the
656 : // modified state of the document, either.
657 322 : bool bModified = false;
658 322 : uno::Reference<util::XModifiable> xModifiable(xObj->getComponent(), uno::UNO_QUERY);
659 322 : if (xModifiable.is())
660 166 : bModified = xModifiable->isModified();
661 322 : xObj->setVisualAreaSize( nAspect, aSz );
662 322 : xModifiable.set(xObj->getComponent(), uno::UNO_QUERY);
663 322 : if (xModifiable.is())
664 322 : 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 322 : bool bResetEnableSetModified(false);
676 322 : if ( GetDoc()->GetDocShell()->IsEnableSetModified() )
677 : {
678 316 : GetDoc()->GetDocShell()->EnableSetModified( false );
679 316 : 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 322 : if ( !SotExchange::IsChart( xObj->getClassID() ) )
687 0 : xObj.UpdateReplacement();
688 :
689 322 : if ( bResetEnableSetModified )
690 : {
691 316 : GetDoc()->GetDocShell()->EnableSetModified( true );
692 : }
693 322 : }
694 : }
695 :
696 : // TODO/LATER: this is only a workaround,
697 322 : uno::Reference< chart2::XChartDocument > xChartDocument( xObj->getComponent(), uno::UNO_QUERY );
698 322 : bLinkingChart = ( xChartDocument.is() && !xChartDocument->hasInternalDataProvider() );
699 : }
700 : }
701 0 : catch (const uno::Exception&)
702 : {
703 : // TODO/LATER: handle the error
704 0 : return;
705 : }
706 :
707 1632 : SfxInPlaceClient* pCli = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin() );
708 1632 : if ( !pCli )
709 : {
710 1616 : if ( (embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY & nMisc)
711 1616 : || 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 1610 : || ( bNoTxtFrmPrtAreaChanged && nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE ) )
717 : {
718 6 : pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
719 : }
720 : else
721 1610 : return;
722 : }
723 :
724 : // TODO/LEAN: getMapUnit can switch object to running state
725 : // xObj.TryRunningState();
726 :
727 22 : awt::Size aSize;
728 : try
729 : {
730 22 : 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 22 : Size _aVisArea( aSize.Width, aSize.Height );
745 :
746 22 : Fraction aScaleWidth( 1, 1 );
747 22 : Fraction aScaleHeight( 1, 1 );
748 :
749 22 : bool bUseObjectSize = false;
750 :
751 : // As long as there comes no reasonable size from the object,
752 : // nothing can be scaled.
753 22 : if( _aVisArea.Width() && _aVisArea.Height() )
754 : {
755 22 : const MapMode aTmp( MAP_TWIP );
756 22 : MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
757 22 : _aVisArea = OutputDevice::LogicToLogic( _aVisArea, aUnit, aTmp);
758 22 : Size aObjArea;
759 22 : if ( pFlyPrtRect )
760 22 : 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 22 : SwSelPaintRects::Get1PixelInLogic( *this, &nX, &nY );
767 66 : if( !( _aVisArea.Width() - nX <= aObjArea.Width() &&
768 44 : _aVisArea.Width() + nX >= aObjArea.Width() &&
769 22 : _aVisArea.Height()- nY <= aObjArea.Height()&&
770 44 : _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 22 : }
784 : }
785 :
786 : // Now is the favorable time to set the ObjArea.
787 : // The Scaling must be considered.
788 22 : SwRect aArea;
789 22 : if ( pFlyPrtRect )
790 : {
791 22 : aArea = *pFlyPrtRect;
792 22 : 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 22 : if ( bUseObjectSize )
801 : {
802 : // --> this moves non-resizable object so that when adding borders the baseline remains the same
803 0 : const SwFlyFrmFmt *pFlyFrmFmt = dynamic_cast< const SwFlyFrmFmt * >( GetFlyFrmFmt() );
804 : OSL_ENSURE( pFlyFrmFmt, "Could not find fly frame." );
805 0 : if ( pFlyFrmFmt )
806 : {
807 0 : const Point &rPoint = pFlyFrmFmt->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 22 : aArea.Width ( Fraction( aArea.Width() ) / pCli->GetScaleWidth() );
819 22 : aArea.Height( Fraction( aArea.Height() ) / pCli->GetScaleHeight());
820 : }
821 :
822 22 : 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 :
837 10 : void SwWrtShell::InsertPageBreak(const OUString *pPageDesc, ::boost::optional<sal_uInt16> oPgNum )
838 : {
839 10 : ResetCursorStack();
840 10 : if( CanInsert() )
841 : {
842 10 : SwActContext aActContext(this);
843 10 : StartUndo(UNDO_UI_INSERT_PAGE_BREAK);
844 :
845 10 : if ( !IsCrsrInTbl() )
846 : {
847 10 : if(HasSelection())
848 0 : DelRight();
849 10 : SwFEShell::SplitNode();
850 : // delete the numbered attribute of the last line if the last line is empty
851 10 : GetDoc()->ClearLineNumAttrs( *GetCrsr()->GetPoint() );
852 : }
853 :
854 : const SwPageDesc *pDesc = pPageDesc
855 10 : ? FindPageDescByName( *pPageDesc, true ) : 0;
856 10 : if( pDesc )
857 : {
858 10 : SwFmtPageDesc aDesc( pDesc );
859 10 : aDesc.SetNumOffset( oPgNum );
860 10 : SetAttrItem( aDesc );
861 : }
862 : else
863 0 : SetAttrItem( SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE, RES_BREAK) );
864 10 : EndUndo(UNDO_UI_INSERT_PAGE_BREAK);
865 : }
866 10 : }
867 :
868 : // Insert hard page break;
869 : // Selections will be overwritten
870 :
871 0 : void SwWrtShell::InsertLineBreak()
872 : {
873 0 : ResetCursorStack();
874 0 : if( CanInsert() )
875 : {
876 0 : if(HasSelection())
877 0 : DelRight();
878 :
879 0 : const sal_Unicode cIns = 0x0A;
880 0 : SvxAutoCorrect* pACorr = lcl_IsAutoCorr();
881 0 : if( pACorr )
882 0 : AutoCorrect( *pACorr, cIns );
883 : else
884 0 : SwWrtShell::Insert( OUString( cIns ) );
885 : }
886 0 : }
887 :
888 : // Insert hard column break;
889 : // Selections will be overwritten
890 :
891 0 : void SwWrtShell::InsertColumnBreak()
892 : {
893 0 : SwActContext aActContext(this);
894 0 : ResetCursorStack();
895 0 : if( CanInsert() )
896 : {
897 0 : StartUndo(UNDO_UI_INSERT_COLUMN_BREAK);
898 :
899 0 : if ( !IsCrsrInTbl() )
900 : {
901 0 : if(HasSelection())
902 0 : DelRight();
903 0 : SwFEShell::SplitNode( false, false );
904 : }
905 0 : SetAttrItem(SvxFmtBreakItem(SVX_BREAK_COLUMN_BEFORE, RES_BREAK));
906 :
907 0 : EndUndo(UNDO_UI_INSERT_COLUMN_BREAK);
908 0 : }
909 0 : }
910 :
911 : // Insert footnote
912 : // rStr - optional footnote mark
913 :
914 0 : void SwWrtShell::InsertFootnote(const OUString &rStr, bool bEndNote, bool bEdit )
915 : {
916 0 : ResetCursorStack();
917 0 : if( CanInsert() )
918 : {
919 0 : if(HasSelection())
920 : {
921 : //collapse cursor to the end
922 0 : if(!IsCrsrPtAtEnd())
923 0 : SwapPam();
924 0 : ClearMark();
925 : }
926 0 : SwPosition aPos = *GetCrsr()->GetPoint();
927 0 : SwFmtFtn aFootNote( bEndNote );
928 0 : if(!rStr.isEmpty())
929 0 : aFootNote.SetNumStr( rStr );
930 :
931 0 : SetAttrItem(aFootNote);
932 :
933 0 : if( bEdit )
934 : {
935 : // For editing the footnote text.
936 0 : Left(CRSR_SKIP_CHARS, false, 1, false );
937 0 : GotoFtnTxt();
938 : }
939 0 : aNavigationMgr.addEntry(aPos);
940 : }
941 0 : }
942 :
943 : // SplitNode; also, because
944 : // - of deleting selected content;
945 : // - of reset of the Cursorstack if necessary.
946 :
947 2 : void SwWrtShell::SplitNode( bool bAutoFmt, bool bCheckTableStart )
948 : {
949 2 : ResetCursorStack();
950 2 : if( CanInsert() )
951 : {
952 2 : SwActContext aActContext(this);
953 :
954 2 : rView.GetEditWin().FlushInBuffer();
955 2 : bool bHasSel = HasSelection();
956 2 : if( bHasSel )
957 : {
958 0 : StartUndo( UNDO_INSERT );
959 0 : DelRight();
960 : }
961 :
962 2 : SwFEShell::SplitNode( bAutoFmt, bCheckTableStart );
963 2 : if( bHasSel )
964 0 : EndUndo( UNDO_INSERT );
965 : }
966 2 : }
967 :
968 : // Turn on numbering
969 : // Parameter: Optional specification of a name for the named list;
970 : // this indicates a position if it is possible to convert them
971 : // into a number and less than nMaxRules.
972 :
973 : // To test the CharFormats at the numbering
974 : // external void SetNumChrFmt( SwWrtShell*, SwNumRules& );
975 :
976 : // -> #i40041#
977 : // Preconditions (as far as OD has figured out):
978 : // - <SwEditShell::HasNumber()> is sal_False, if <bNum> is sal_True
979 : // - <SwEditShell::HasBullet()> is sal_False, if <bNum> is sal_False
980 : // Behavior of method is determined by the current situation at the current
981 : // cursor position in the document.
982 0 : void SwWrtShell::NumOrBulletOn(bool bNum)
983 : {
984 : // determine numbering rule found at current cursor position in the document.
985 0 : const SwNumRule* pCurRule = GetNumRuleAtCurrCrsrPos();
986 :
987 0 : StartUndo(UNDO_NUMORNONUM);
988 :
989 0 : const SwNumRule * pNumRule = pCurRule;
990 :
991 : // - activate outline rule respectively turning on outline rule for
992 : // current text node. But, only for turning on a numbering (<bNum> == sal_True).
993 : // - overwrite found numbering rule at current cursor position, if
994 : // no numbering rule can be retrieved from the paragraph style.
995 0 : bool bContinueFoundNumRule( false );
996 0 : bool bActivateOutlineRule( false );
997 0 : int nActivateOutlineLvl( MAXLEVEL ); // only relevant, if <bActivateOutlineRule> == sal_True
998 0 : SwTxtFmtColl * pColl = GetCurTxtFmtColl();
999 0 : if ( pColl )
1000 : {
1001 : // retrieve numbering rule at paragraph
1002 : // style, which is found at current cursor position in the document.
1003 0 : SwNumRule* pCollRule = mpDoc->FindNumRulePtr(pColl->GetNumRule().GetValue());
1004 : // #125993# - The outline numbering rule isn't allowed
1005 : // to be derived from a parent paragraph style to a derived one.
1006 : // Thus check, if the found outline numbering rule is directly
1007 : // set at the paragraph style <pColl>. If not, set <pCollRule> to NULL
1008 0 : if ( pCollRule && pCollRule == GetDoc()->GetOutlineNumRule() )
1009 : {
1010 : const SwNumRule* pDirectCollRule =
1011 0 : mpDoc->FindNumRulePtr(pColl->GetNumRule( false ).GetValue());
1012 0 : if ( !pDirectCollRule )
1013 : {
1014 0 : pCollRule = 0;
1015 : }
1016 : }
1017 :
1018 0 : if ( !pCollRule )
1019 : {
1020 0 : pNumRule = pCollRule;
1021 : }
1022 : // no activation or continuation of outline numbering in Writer/Web document
1023 0 : else if ( bNum &&
1024 0 : !dynamic_cast<SwWebDocShell*>(GetDoc()->GetDocShell()) &&
1025 0 : pCollRule == GetDoc()->GetOutlineNumRule() )
1026 : {
1027 0 : if ( pNumRule == pCollRule )
1028 : {
1029 : // check, if text node at current cursor positioned is counted.
1030 : // If not, let it been counted. Then it has to be checked,
1031 : // of the outline numbering has to be activated or continued.
1032 : SwTxtNode* pTxtNode =
1033 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1034 0 : if ( pTxtNode && !pTxtNode->IsCountedInList() )
1035 : {
1036 : // check, if numbering of the outline level of the paragraph
1037 : // style is active. If not, activate this outline level.
1038 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1039 : OSL_ENSURE( pColl->IsAssignedToListLevelOfOutlineStyle(),
1040 : "<SwWrtShell::NumOrBulletOn(..)> - paragraph style with outline rule, but no outline level" );
1041 0 : if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&
1042 0 : pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1043 : == SVX_NUM_NUMBER_NONE )
1044 : {
1045 : // activate outline numbering
1046 0 : bActivateOutlineRule = true;
1047 : }
1048 : else
1049 : {
1050 : // turning on outline numbering at current cursor position
1051 0 : bContinueFoundNumRule = true;
1052 : }
1053 : }
1054 : else
1055 : {
1056 : // #i101234#
1057 : // activate outline numbering, because from the precondition
1058 : // it's known, that <SwEdit::HasNumber()> == sal_False
1059 0 : bActivateOutlineRule = true;
1060 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1061 : }
1062 : }
1063 0 : else if ( !pNumRule )
1064 : {
1065 : // #i101234#
1066 : // Check, if corresponding list level of the outline numbering
1067 : // has already a numbering format set.
1068 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1069 0 : if ( pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1070 : == SVX_NUM_NUMBER_NONE )
1071 : {
1072 : // activate outline numbering, because from the precondition
1073 : // it's known, that <SwEdit::HasNumber()> == sal_False
1074 0 : bActivateOutlineRule = true;
1075 : }
1076 : else
1077 : {
1078 : // turning on outline numbering at current cursor position
1079 0 : bContinueFoundNumRule = true;
1080 : }
1081 : }
1082 : else
1083 : {
1084 : // check, if numbering of the outline level of the paragraph
1085 : // style is active. If not, activate this outline level.
1086 0 : nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1087 : OSL_ENSURE( pColl->IsAssignedToListLevelOfOutlineStyle(),
1088 : "<SwWrtShell::NumOrBulletOn(..)> - paragraph style with outline rule, but no outline level" );
1089 0 : if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&
1090 0 : pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1091 : == SVX_NUM_NUMBER_NONE )
1092 : {
1093 : // activate outline numbering
1094 0 : bActivateOutlineRule = true;
1095 : }
1096 : else
1097 : {
1098 : // turning on outline numbering at current cursor position
1099 0 : bContinueFoundNumRule = true;
1100 : }
1101 : }
1102 0 : pNumRule = pCollRule;
1103 : }
1104 : }
1105 :
1106 : // Only automatic numbering/bullet rules should be changed.
1107 : // Note: The outline numbering rule is also an automatic one. It's only
1108 : // changed, if it has to be activated.
1109 0 : if ( pNumRule )
1110 : {
1111 0 : if ( !pNumRule->IsAutoRule() )
1112 : {
1113 0 : pNumRule = 0;
1114 : }
1115 0 : else if ( pNumRule == GetDoc()->GetOutlineNumRule() &&
1116 0 : !bActivateOutlineRule && !bContinueFoundNumRule )
1117 : {
1118 0 : pNumRule = 0;
1119 : }
1120 : }
1121 :
1122 : // Search for a previous numbering/bullet rule to continue it.
1123 0 : OUString sContinuedListId;
1124 0 : if ( !pNumRule )
1125 : {
1126 0 : pNumRule = GetDoc()->SearchNumRule( *GetCrsr()->GetPoint(),
1127 : false, bNum, false, 0,
1128 0 : sContinuedListId );
1129 0 : bContinueFoundNumRule = pNumRule != 0;
1130 : }
1131 :
1132 0 : if (pNumRule)
1133 : {
1134 0 : SwNumRule aNumRule(*pNumRule);
1135 :
1136 : // do not change found numbering/bullet rule, if it should only be continued.
1137 0 : if ( !bContinueFoundNumRule )
1138 : {
1139 0 : SwTxtNode * pTxtNode = GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1140 :
1141 0 : if (pTxtNode)
1142 : {
1143 : // use above retrieve outline level, if outline numbering has to be activated.
1144 : int nLevel = bActivateOutlineRule
1145 : ? nActivateOutlineLvl
1146 0 : : pTxtNode->GetActualListLevel();
1147 :
1148 0 : if (nLevel < 0)
1149 0 : nLevel = 0;
1150 :
1151 0 : if (nLevel >= MAXLEVEL)
1152 0 : nLevel = MAXLEVEL - 1;
1153 :
1154 0 : SwNumFmt aFmt(aNumRule.Get(static_cast<sal_uInt16>(nLevel)));
1155 :
1156 0 : if (bNum)
1157 0 : aFmt.SetNumberingType(SVX_NUM_ARABIC);
1158 : else
1159 : {
1160 : // #i63395# Only apply user defined default bullet font
1161 0 : if ( numfunc::IsDefBulletFontUserDefined() )
1162 : {
1163 0 : const vcl::Font* pFnt = &numfunc::GetDefBulletFont();
1164 0 : aFmt.SetBulletFont( pFnt );
1165 : }
1166 0 : aFmt.SetBulletChar( numfunc::GetBulletChar(static_cast<sal_uInt8>(nLevel)));
1167 0 : aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
1168 : // #i93908# clear suffix for bullet lists
1169 0 : aFmt.SetPrefix(OUString());
1170 0 : aFmt.SetSuffix(OUString());
1171 : }
1172 0 : aNumRule.Set(static_cast<sal_uInt16>(nLevel), aFmt);
1173 : }
1174 : }
1175 :
1176 : // reset indent attribute on applying list style
1177 0 : SetCurNumRule( aNumRule, false, sContinuedListId, true );
1178 : }
1179 : else
1180 : {
1181 : // #i95907#
1182 : const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
1183 0 : numfunc::GetDefaultPositionAndSpaceMode() );
1184 0 : SwNumRule aNumRule( GetUniqueNumRuleName(), ePosAndSpaceMode );
1185 : // Append the character template at the numbering.
1186 : SwCharFmt* pChrFmt;
1187 0 : SwDocShell* pDocSh = GetView().GetDocShell();
1188 : // #i63395#
1189 : // Only apply user defined default bullet font
1190 0 : const vcl::Font* pFnt = numfunc::IsDefBulletFontUserDefined()
1191 : ? &numfunc::GetDefBulletFont()
1192 0 : : 0;
1193 :
1194 0 : if (bNum)
1195 : {
1196 0 : pChrFmt = GetCharFmtFromPool( RES_POOLCHR_NUM_LEVEL );
1197 : }
1198 : else
1199 : {
1200 0 : pChrFmt = GetCharFmtFromPool( RES_POOLCHR_BUL_LEVEL );
1201 : }
1202 :
1203 0 : const SwTxtNode* pTxtNode = GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1204 : const SwTwips nWidthOfTabs = pTxtNode
1205 : ? pTxtNode->GetWidthOfLeadingTabs()
1206 0 : : 0;
1207 0 : GetDoc()->getIDocumentContentOperations().RemoveLeadingWhiteSpace( *GetCrsr()->GetPoint() );
1208 :
1209 0 : const bool bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
1210 0 : const bool bRightToLeft = IsInRightToLeftText();
1211 0 : for( sal_uInt8 nLvl = 0; nLvl < MAXLEVEL; ++nLvl )
1212 : {
1213 0 : SwNumFmt aFmt( aNumRule.Get( nLvl ) );
1214 0 : aFmt.SetCharFmt( pChrFmt );
1215 :
1216 0 : if (! bNum)
1217 : {
1218 : // #i63395#
1219 : // Only apply user defined default bullet font
1220 0 : if ( pFnt )
1221 : {
1222 0 : aFmt.SetBulletFont( pFnt );
1223 : }
1224 0 : aFmt.SetBulletChar( numfunc::GetBulletChar(nLvl) );
1225 0 : aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
1226 : // #i93908# clear suffix for bullet lists
1227 0 : aFmt.SetPrefix(OUString());
1228 0 : aFmt.SetSuffix(OUString());
1229 : }
1230 :
1231 : // #i95907#
1232 0 : if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1233 : {
1234 0 : if(bHtml && nLvl)
1235 : {
1236 : // 1/2" for HTML
1237 0 : aFmt.SetLSpace(720);
1238 0 : aFmt.SetAbsLSpace(nLvl * 720);
1239 : }
1240 0 : else if ( nWidthOfTabs > 0 )
1241 : {
1242 0 : aFmt.SetAbsLSpace(nWidthOfTabs + nLvl * 720);
1243 : }
1244 : }
1245 :
1246 : // #i38904# Default alignment for
1247 : // numbering/bullet should be rtl in rtl paragraph:
1248 0 : if ( bRightToLeft )
1249 : {
1250 0 : aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
1251 : }
1252 :
1253 0 : aNumRule.Set( nLvl, aFmt );
1254 0 : }
1255 :
1256 : // #i95907#
1257 0 : if ( pTxtNode &&
1258 : ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
1259 : {
1260 :
1261 0 : const SwTwips nTxtNodeIndent = pTxtNode->GetAdditionalIndentForStartingNewList();
1262 0 : if ( ( nTxtNodeIndent + nWidthOfTabs ) != 0 )
1263 : {
1264 : // #i111172#
1265 : // If text node is already inside a list, assure that the indents
1266 : // are the same. Thus, adjust the indent change value by subtracting
1267 : // indents of to be applied list style.
1268 0 : SwTwips nIndentChange = nTxtNodeIndent + nWidthOfTabs;
1269 0 : if ( pTxtNode->GetNumRule() )
1270 : {
1271 0 : const SwNumFmt aFmt( aNumRule.Get( 0 ) );
1272 0 : if ( aFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
1273 : {
1274 0 : nIndentChange -= aFmt.GetIndentAt() + aFmt.GetFirstLineIndent();
1275 0 : }
1276 : }
1277 0 : aNumRule.ChangeIndent( nIndentChange );
1278 : }
1279 : }
1280 : // reset indent attribute on applying list style
1281 : // start new list
1282 0 : SetCurNumRule( aNumRule, true, OUString(), true );
1283 : }
1284 :
1285 0 : EndUndo(UNDO_NUMORNONUM);
1286 0 : }
1287 : // <- #i40041#
1288 :
1289 0 : void SwWrtShell::NumOn()
1290 : {
1291 0 : NumOrBulletOn(true);
1292 0 : }
1293 :
1294 0 : void SwWrtShell::NumOrBulletOff()
1295 : {
1296 0 : const SwNumRule * pCurNumRule = GetNumRuleAtCurrCrsrPos();
1297 :
1298 0 : if (pCurNumRule)
1299 : {
1300 0 : if (pCurNumRule->IsOutlineRule())
1301 : {
1302 0 : SwNumRule aNumRule(*pCurNumRule);
1303 :
1304 : SwTxtNode * pTxtNode =
1305 0 : GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1306 :
1307 0 : if (pTxtNode)
1308 : {
1309 0 : int nLevel = pTxtNode->GetActualListLevel();
1310 :
1311 0 : if (nLevel < 0)
1312 0 : nLevel = 0;
1313 :
1314 0 : if (nLevel >= MAXLEVEL)
1315 0 : nLevel = MAXLEVEL - 1;
1316 :
1317 0 : SwNumFmt aFmt(aNumRule.Get(static_cast<sal_uInt16>(nLevel)));
1318 :
1319 0 : aFmt.SetNumberingType(SVX_NUM_NUMBER_NONE);
1320 0 : aNumRule.Set(nLevel, aFmt);
1321 :
1322 : // no start or continuation of a list - the outline style is only changed.
1323 0 : SetCurNumRule( aNumRule, false );
1324 0 : }
1325 : }
1326 : else
1327 : {
1328 0 : DelNumRules();
1329 : }
1330 :
1331 : // #126346# - Cursor can not be anymore in front of
1332 : // a label, because numbering/bullet is switched off.
1333 0 : SetInFrontOfLabel( false );
1334 : }
1335 0 : }
1336 : // <- #i29560#
1337 :
1338 : // Request Default-Bulletlist
1339 :
1340 0 : void SwWrtShell::BulletOn()
1341 : {
1342 0 : NumOrBulletOn(false);
1343 0 : }
1344 :
1345 33736 : SelectionType SwWrtShell::GetSelectionType() const
1346 : {
1347 : // ContentType cannot be determined within a
1348 : // Start-/Endaction parentheses.
1349 : // Because there is no invalid value TEXT will be returned.
1350 : // The value does not matter, it may be updated in endaction anyway.
1351 :
1352 33736 : if ( BasicActionPend() )
1353 0 : return IsSelFrmMode() ? nsSelectionType::SEL_FRM : nsSelectionType::SEL_TXT;
1354 :
1355 33736 : SwView &_rView = ((SwView&)GetView());
1356 33736 : if (_rView.GetPostItMgr() && _rView.GetPostItMgr()->HasActiveSidebarWin() )
1357 0 : return nsSelectionType::SEL_POSTIT;
1358 :
1359 : // Inserting a frame is not a DrawMode
1360 : int nCnt;
1361 67472 : if ( !_rView.GetEditWin().IsFrmAction() &&
1362 67472 : (IsObjSelected() || (_rView.IsDrawMode() && !IsFrmSelected()) ))
1363 : {
1364 0 : if (GetDrawView()->IsTextEdit())
1365 0 : nCnt = nsSelectionType::SEL_DRW_TXT;
1366 : else
1367 : {
1368 0 : if (GetView().IsFormMode()) // Only Form selected
1369 0 : nCnt = nsSelectionType::SEL_DRW_FORM;
1370 : else
1371 0 : nCnt = nsSelectionType::SEL_DRW; // Any draw object
1372 :
1373 0 : if (_rView.IsBezierEditMode())
1374 0 : nCnt |= nsSelectionType::SEL_BEZ;
1375 0 : else if( GetDrawView()->GetContext() == SDRCONTEXT_MEDIA )
1376 0 : nCnt |= nsSelectionType::SEL_MEDIA;
1377 :
1378 0 : if (svx::checkForSelectedCustomShapes(
1379 0 : const_cast<SdrView *>(GetDrawView()),
1380 : true /* bOnlyExtruded */ ))
1381 : {
1382 0 : nCnt |= nsSelectionType::SEL_EXTRUDED_CUSTOMSHAPE;
1383 : }
1384 0 : sal_uInt32 nCheckStatus = 0;
1385 0 : if (svx::checkForSelectedFontWork(
1386 0 : const_cast<SdrView *>(GetDrawView()), nCheckStatus ))
1387 : {
1388 0 : nCnt |= nsSelectionType::SEL_FONTWORK;
1389 : }
1390 : }
1391 :
1392 0 : return nCnt;
1393 : }
1394 :
1395 33736 : nCnt = GetCntType();
1396 :
1397 33736 : if ( IsFrmSelected() )
1398 : {
1399 0 : if (_rView.IsDrawMode())
1400 0 : _rView.LeaveDrawCreate(); // clean up (Bug #45639)
1401 0 : if ( !(nCnt & (CNT_GRF | CNT_OLE)) )
1402 0 : return nsSelectionType::SEL_FRM;
1403 : }
1404 :
1405 33736 : if ( IsCrsrInTbl() )
1406 834 : nCnt |= nsSelectionType::SEL_TBL;
1407 :
1408 33736 : if ( IsTableMode() )
1409 42 : nCnt |= (nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS);
1410 :
1411 : // Do not pop up numbering toolbar, if the text node has a numbering of type SVX_NUM_NUMBER_NONE.
1412 33736 : const SwNumRule* pNumRule = GetNumRuleAtCurrCrsrPos();
1413 33736 : if ( pNumRule )
1414 : {
1415 : const SwTxtNode* pTxtNd =
1416 282 : GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1417 :
1418 282 : if ( pTxtNd && pTxtNd->IsInList() )
1419 : {
1420 282 : int nLevel = pTxtNd->GetActualListLevel();
1421 :
1422 282 : if (nLevel < 0)
1423 0 : nLevel = 0;
1424 :
1425 282 : if (nLevel >= MAXLEVEL)
1426 0 : nLevel = MAXLEVEL - 1;
1427 :
1428 282 : const SwNumFmt& rFmt = pNumRule->Get(nLevel);
1429 282 : if ( SVX_NUM_NUMBER_NONE != rFmt.GetNumberingType() )
1430 250 : nCnt |= nsSelectionType::SEL_NUM;
1431 : }
1432 : }
1433 :
1434 33736 : return nCnt;
1435 : }
1436 :
1437 : // Find the text collection with the name rCollname
1438 : // Returns: Pointer at the collection or 0, if no
1439 : // text collection with this name exists, or
1440 : // this is a default template.
1441 :
1442 0 : SwTxtFmtColl *SwWrtShell::GetParaStyle(const OUString &rCollName, GetStyle eCreate )
1443 : {
1444 0 : SwTxtFmtColl* pColl = FindTxtFmtCollByName( rCollName );
1445 0 : if( !pColl && GETSTYLE_NOCREATE != eCreate )
1446 : {
1447 0 : sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rCollName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
1448 0 : if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
1449 0 : pColl = GetTxtCollFromPool( nId );
1450 : }
1451 0 : return pColl;
1452 : }
1453 :
1454 : // Find the text collection with the name rCollname
1455 : // Returns: Pointer at the collection or 0, if no
1456 : // character template with this name exists, or
1457 : // this is a default template or template is automatic.
1458 :
1459 0 : SwCharFmt *SwWrtShell::GetCharStyle(const OUString &rFmtName, GetStyle eCreate )
1460 : {
1461 0 : SwCharFmt* pFmt = FindCharFmtByName( rFmtName );
1462 0 : if( !pFmt && GETSTYLE_NOCREATE != eCreate )
1463 : {
1464 0 : sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rFmtName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
1465 0 : if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
1466 0 : pFmt = (SwCharFmt*)GetFmtFromPool( nId );
1467 : }
1468 0 : return pFmt;
1469 : }
1470 :
1471 : // Find the table format with the name rFmtname
1472 : // Returns: Pointer at the collection or 0, if no
1473 : // frame format with this name exists or
1474 : // this is a default format or the format is automatic.
1475 :
1476 0 : SwFrmFmt *SwWrtShell::GetTblStyle(const OUString &rFmtName)
1477 : {
1478 0 : SwFrmFmt *pFmt = 0;
1479 0 : for( sal_uInt16 i = GetTblFrmFmtCount(); i; )
1480 0 : if( !( pFmt = &GetTblFrmFmt( --i ) )->IsDefault() &&
1481 0 : pFmt->GetName() == rFmtName && IsUsed( *pFmt ) )
1482 0 : return pFmt;
1483 0 : return 0;
1484 : }
1485 :
1486 0 : void SwWrtShell::addCurrentPosition() {
1487 0 : SwPaM* pPaM = GetCrsr();
1488 0 : aNavigationMgr.addEntry(*pPaM->GetPoint());
1489 0 : }
1490 :
1491 : // Applying templates
1492 :
1493 0 : void SwWrtShell::SetPageStyle(const OUString &rCollName)
1494 : {
1495 0 : if( !SwCrsrShell::HasSelection() && !IsSelFrmMode() && !IsObjSelected() )
1496 : {
1497 0 : SwPageDesc* pDesc = FindPageDescByName( rCollName, true );
1498 0 : if( pDesc )
1499 0 : ChgCurPageDesc( *pDesc );
1500 : }
1501 0 : }
1502 :
1503 : // Access templates
1504 :
1505 1051 : OUString SwWrtShell::GetCurPageStyle( const bool bCalcFrm ) const
1506 : {
1507 1051 : return GetPageDesc(GetCurPageDesc( bCalcFrm )).GetName();
1508 : }
1509 :
1510 : // Change the current template referring to the existing change.
1511 :
1512 0 : void SwWrtShell::QuickUpdateStyle()
1513 : {
1514 0 : SwTxtFmtColl *pColl = GetCurTxtFmtColl();
1515 :
1516 : // Default cannot be changed
1517 0 : if(pColl && !pColl->IsDefault())
1518 : {
1519 0 : FillByEx(pColl);
1520 : // Also apply the template to remove hard attribute assignment.
1521 0 : SetTxtFmtColl(pColl);
1522 : }
1523 0 : }
1524 :
1525 0 : void SwWrtShell::AutoUpdatePara(SwTxtFmtColl* pColl, const SfxItemSet& rStyleSet, SwPaM* pPaM )
1526 : {
1527 0 : SwPaM* pCrsr = pPaM ? pPaM : GetCrsr( );
1528 0 : SfxItemSet aCoreSet( GetAttrPool(),
1529 : RES_CHRATR_BEGIN, RES_CHRATR_END - 1,
1530 : RES_PARATR_BEGIN, RES_PARATR_END - 1,
1531 : RES_FRMATR_BEGIN, RES_FRMATR_END - 1,
1532 : SID_ATTR_TABSTOP_POS, SID_ATTR_TABSTOP_POS,
1533 : SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_DEFAULTS,
1534 : SID_ATTR_TABSTOP_OFFSET, SID_ATTR_TABSTOP_OFFSET,
1535 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
1536 : SID_ATTR_PARA_MODEL, SID_ATTR_PARA_KEEP,
1537 : SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM,
1538 0 : 0 );
1539 0 : GetPaMAttr( pCrsr, aCoreSet );
1540 0 : bool bReset = false;
1541 0 : SfxItemIter aParaIter( aCoreSet );
1542 0 : const SfxPoolItem* pParaItem = aParaIter.FirstItem();
1543 0 : while( pParaItem )
1544 : {
1545 0 : if(!IsInvalidItem(pParaItem))
1546 : {
1547 0 : sal_uInt16 nWhich = pParaItem->Which();
1548 0 : if(SfxItemState::SET == aCoreSet.GetItemState(nWhich) &&
1549 0 : SfxItemState::SET == rStyleSet.GetItemState(nWhich))
1550 : {
1551 0 : aCoreSet.ClearItem(nWhich);
1552 0 : bReset = true;
1553 : }
1554 : }
1555 0 : pParaItem = aParaIter.NextItem();
1556 : }
1557 0 : StartAction();
1558 0 : if(bReset)
1559 : {
1560 0 : ResetAttr( std::set<sal_uInt16>(), pCrsr );
1561 0 : SetAttrSet(aCoreSet, 0, pCrsr);
1562 : }
1563 0 : mpDoc->ChgFmt(*pColl, rStyleSet );
1564 0 : EndAction();
1565 0 : }
1566 :
1567 0 : void SwWrtShell::AutoUpdateFrame( SwFrmFmt* pFmt, const SfxItemSet& rStyleSet )
1568 : {
1569 0 : StartAction();
1570 :
1571 0 : ResetFlyFrmAttr( 0, &rStyleSet );
1572 0 : pFmt->SetFmtAttr( rStyleSet );
1573 :
1574 0 : EndAction();
1575 0 : }
1576 :
1577 0 : void SwWrtShell::AutoCorrect( SvxAutoCorrect& rACorr, sal_Unicode cChar )
1578 : {
1579 0 : ResetCursorStack();
1580 0 : if(CanInsert())
1581 : {
1582 0 : bool bStarted = false;
1583 0 : if(HasSelection())
1584 : {
1585 : // Only parenthese here, because the regular insert
1586 : // is already clipped to the editshell
1587 0 : StartAllAction();
1588 0 : StartUndo(UNDO_INSERT);
1589 0 : bStarted = true;
1590 0 : DelRight();
1591 : }
1592 0 : SwEditShell::AutoCorrect( rACorr, IsInsMode(), cChar );
1593 :
1594 0 : if(bStarted)
1595 : {
1596 0 : EndAllAction();
1597 0 : EndUndo(UNDO_INSERT);
1598 : }
1599 : }
1600 0 : }
1601 :
1602 : // Some kind of controlled copy ctor
1603 :
1604 0 : SwWrtShell::SwWrtShell( SwWrtShell& rSh, vcl::Window *_pWin, SwView &rShell )
1605 : : SwFEShell( rSh, _pWin ),
1606 0 : COMMON_INI_LIST
1607 : {
1608 0 : BITFLD_INI_LIST
1609 0 : SET_CURR_SHELL( this );
1610 :
1611 0 : SetSfxViewShell( (SfxViewShell *)&rShell );
1612 0 : SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
1613 :
1614 : // place the cursor on the first field...
1615 0 : IFieldmark *pBM = NULL;
1616 0 : if ( IsFormProtected() && ( pBM = GetFieldmarkAfter( ) ) !=NULL ) {
1617 0 : GotoFieldmark(pBM);
1618 0 : }
1619 0 : }
1620 :
1621 4708 : SwWrtShell::SwWrtShell( SwDoc& rDoc, vcl::Window *_pWin, SwView &rShell,
1622 : const SwViewOption *pViewOpt )
1623 : : SwFEShell( rDoc, _pWin, pViewOpt),
1624 4708 : COMMON_INI_LIST
1625 : {
1626 4708 : BITFLD_INI_LIST
1627 4708 : SET_CURR_SHELL( this );
1628 4708 : SetSfxViewShell( (SfxViewShell *)&rShell );
1629 4708 : SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
1630 :
1631 : // place the cursor on the first field...
1632 4708 : IFieldmark *pBM = NULL;
1633 4708 : if ( IsFormProtected() && ( pBM = GetFieldmarkAfter( ) ) !=NULL ) {
1634 2 : GotoFieldmark(pBM);
1635 4708 : }
1636 4708 : }
1637 :
1638 14118 : SwWrtShell::~SwWrtShell()
1639 : {
1640 4706 : SET_CURR_SHELL( this );
1641 9412 : while(IsModePushed())
1642 0 : PopMode();
1643 4706 : while(PopCrsr(false))
1644 : ;
1645 4706 : SwTransferable::ClearSelection( *this );
1646 9412 : }
1647 :
1648 916 : bool SwWrtShell::Pop( bool bOldCrsr )
1649 : {
1650 916 : bool bRet = SwCrsrShell::Pop( bOldCrsr );
1651 916 : if( bRet && IsSelection() )
1652 : {
1653 5 : fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
1654 5 : fnKillSel = &SwWrtShell::ResetSelect;
1655 : }
1656 916 : return bRet;
1657 : }
1658 :
1659 32 : bool SwWrtShell::CanInsert()
1660 : {
1661 32 : if(IsSelFrmMode())
1662 : {
1663 0 : return false;
1664 : }
1665 :
1666 32 : if(IsObjSelected())
1667 : {
1668 0 : return false;
1669 : }
1670 :
1671 32 : if(GetView().GetDrawFuncPtr())
1672 : {
1673 0 : return false;
1674 : }
1675 :
1676 32 : if(GetView().GetPostItMgr()->GetActiveSidebarWin())
1677 : {
1678 0 : return false;
1679 : }
1680 :
1681 32 : return true;
1682 : }
1683 :
1684 4 : void SwWrtShell::ChgDBData(const SwDBData& aDBData)
1685 : {
1686 4 : SwEditShell::ChgDBData(aDBData);
1687 : //notify the db-beamer if available
1688 4 : GetView().NotifyDBChanged();
1689 4 : }
1690 :
1691 0 : OUString SwWrtShell::GetSelDescr() const
1692 : {
1693 0 : OUString aResult;
1694 :
1695 0 : int nSelType = GetSelectionType();
1696 0 : switch (nSelType)
1697 : {
1698 : case nsSelectionType::SEL_GRF:
1699 0 : aResult = SW_RESSTR(STR_GRAPHIC);
1700 :
1701 0 : break;
1702 : case nsSelectionType::SEL_FRM:
1703 : {
1704 0 : const SwFrmFmt * pFrmFmt = GetCurFrmFmt();
1705 :
1706 0 : if (pFrmFmt)
1707 0 : aResult = pFrmFmt->GetDescription();
1708 : }
1709 0 : break;
1710 : case nsSelectionType::SEL_DRW:
1711 : {
1712 0 : aResult = SW_RESSTR(STR_DRAWING_OBJECTS);
1713 : }
1714 0 : break;
1715 : default:
1716 0 : if (0 != mpDoc)
1717 0 : aResult = GetCrsrDescr();
1718 : }
1719 :
1720 0 : return aResult;
1721 : }
1722 :
1723 1732 : void SwWrtShell::ApplyViewOptions( const SwViewOption &rOpt )
1724 : {
1725 1732 : SwFEShell::ApplyViewOptions( rOpt );
1726 : //#i115062# invalidate meta character slot
1727 1732 : GetView().GetViewFrame()->GetBindings().Invalidate( FN_VIEW_META_CHARS );
1728 1732 : }
1729 :
1730 0 : void SwWrtShell::SetReadonlyOption(bool bSet)
1731 : {
1732 0 : GetView().GetEditWin().GetFrameControlsManager().SetReadonlyControls( bSet );
1733 0 : SwViewShell::SetReadonlyOption( bSet );
1734 0 : }
1735 :
1736 : // Switch on/off header or footer of a page style - if an empty name is
1737 : // given all styles are changed
1738 :
1739 0 : void SwWrtShell::ChangeHeaderOrFooter(
1740 : const OUString& rStyleName, bool bHeader, bool bOn, bool bShowWarning)
1741 : {
1742 0 : addCurrentPosition();
1743 0 : StartAllAction();
1744 0 : StartUndo( UNDO_HEADER_FOOTER ); // #i7983#
1745 0 : bool bExecute = true;
1746 0 : bool bCrsrSet = false;
1747 0 : for( sal_uInt16 nFrom = 0, nTo = GetPageDescCnt();
1748 : nFrom < nTo; ++nFrom )
1749 : {
1750 0 : int bChgd = sal_False;
1751 0 : SwPageDesc aDesc( GetPageDesc( nFrom ));
1752 0 : OUString sTmp(aDesc.GetName());
1753 0 : if( rStyleName.isEmpty() || rStyleName == sTmp )
1754 : {
1755 0 : if( bShowWarning && !bOn && GetActiveView() && GetActiveView() == &GetView() &&
1756 0 : ( (bHeader && aDesc.GetMaster().GetHeader().IsActive()) ||
1757 0 : (!bHeader && aDesc.GetMaster().GetFooter().IsActive()) ) )
1758 : {
1759 0 : bShowWarning = false;
1760 : //Actions have to be closed while the dialog is showing
1761 0 : EndAllAction();
1762 :
1763 0 : vcl::Window* pParent = &GetView().GetViewFrame()->GetWindow();
1764 : short nResult;
1765 0 : if (bHeader)
1766 0 : nResult = DeleteHeaderDialog(pParent).Execute();
1767 : else
1768 0 : nResult = DeleteFooterDialog(pParent).Execute();
1769 0 : bExecute = nResult == RET_YES;
1770 :
1771 0 : StartAllAction();
1772 : }
1773 0 : if( bExecute )
1774 : {
1775 0 : bChgd = sal_True;
1776 0 : SwFrmFmt &rMaster = aDesc.GetMaster();
1777 0 : if(bHeader)
1778 0 : rMaster.SetFmtAttr( SwFmtHeader( bOn ));
1779 : else
1780 0 : rMaster.SetFmtAttr( SwFmtFooter( bOn ));
1781 0 : if( bOn )
1782 : {
1783 0 : SvxULSpaceItem aUL(bHeader ? 0 : MM50, bHeader ? MM50 : 0, RES_UL_SPACE );
1784 : SwFrmFmt* pFmt = bHeader ?
1785 0 : (SwFrmFmt*)rMaster.GetHeader().GetHeaderFmt() :
1786 0 : (SwFrmFmt*)rMaster.GetFooter().GetFooterFmt();
1787 0 : pFmt->SetFmtAttr( aUL );
1788 : }
1789 : }
1790 0 : if( bChgd )
1791 : {
1792 0 : ChgPageDesc( nFrom, aDesc );
1793 :
1794 0 : if( !bCrsrSet && bOn )
1795 : {
1796 0 : if ( !IsHeaderFooterEdit() )
1797 0 : ToggleHeaderFooterEdit();
1798 : bCrsrSet = SetCrsrInHdFt(
1799 0 : rStyleName.isEmpty() ? (sal_uInt16)0xFFFF : nFrom,
1800 0 : bHeader );
1801 : }
1802 : }
1803 : }
1804 0 : }
1805 0 : EndUndo( UNDO_HEADER_FOOTER ); // #i7983#
1806 0 : EndAllAction();
1807 0 : }
1808 :
1809 0 : void SwWrtShell::SetShowHeaderFooterSeparator( FrameControlType eControl, bool bShow )
1810 : {
1811 0 : SwViewShell::SetShowHeaderFooterSeparator( eControl, bShow );
1812 0 : if ( !bShow )
1813 0 : GetView().GetEditWin().GetFrameControlsManager().HideControls( eControl );
1814 270 : }
1815 :
1816 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|