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