xref: /trunk/main/sw/source/ui/wrtsh/wrtsh1.cxx (revision 9320a50f461ac7eabd094c7267d6a8145ef266b2)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 #include <com/sun/star/container/XChild.hpp>
32 #include <com/sun/star/embed/XVisualObject.hpp>
33 #include <com/sun/star/embed/EmbedMisc.hpp>
34 #include <com/sun/star/embed/EmbedStates.hpp>
35 #include <com/sun/star/beans/XPropertySet.hpp>
36 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
37 #include <com/sun/star/chart2/XChartDocument.hpp>
38 #include <com/sun/star/util/XModifiable.hpp>
39 
40 #if STLPORT_VERSION>=321
41 #include <math.h>   // prevent conflict between exception and std::exception
42 #endif
43 #include <hintids.hxx>
44 #include <svx/svdview.hxx>
45 #include <sot/factory.hxx>
46 #include <svl/itemiter.hxx>
47 #include <vcl/sound.hxx>
48 #include <tools/bigint.hxx>
49 #include <sot/storage.hxx>
50 #include <svtools/insdlg.hxx>
51 #include <sfx2/frmdescr.hxx>
52 #include <sfx2/ipclient.hxx>
53 #include <svtools/ehdl.hxx>
54 #include <svtools/soerr.hxx>
55 #include <tools/cachestr.hxx>
56 #include <unotools/moduleoptions.hxx>
57 #include <editeng/sizeitem.hxx>
58 #include <editeng/brkitem.hxx>
59 #include <editeng/svxacorr.hxx>
60 #include <vcl/graph.hxx>
61 #include <sfx2/printer.hxx>
62 #include <unotools/charclass.hxx>
63 #include <comphelper/storagehelper.hxx>
64 #include <svx/svxdlg.hxx>
65 #include <svx/extrusionbar.hxx>
66 #include <svx/fontworkbar.hxx>
67 #include <frmfmt.hxx>
68 #include <fmtftn.hxx>
69 #include <fmtpdsc.hxx>
70 #include <wdocsh.hxx>
71 #include <basesh.hxx>
72 #include <swmodule.hxx>
73 #include <wrtsh.hxx>
74 #include <view.hxx>
75 #include <uitool.hxx>
76 #include <cmdid.h>
77 #include <cfgitems.hxx>
78 #include <pagedesc.hxx>
79 #include <frmmgr.hxx>
80 #include <shellio.hxx>
81 #include <uinums.hxx>  // fuer Anwenden einer
82 #include <swundo.hxx>  // fuer Undo-Ids
83 #include <swcli.hxx>
84 #include <poolfmt.hxx>
85 #include <wview.hxx>
86 #include <edtwin.hxx>
87 #include <fmtcol.hxx>
88 #include <swtable.hxx>
89 #include <caption.hxx>
90 #include <viscrs.hxx>
91 #include <swdtflvr.hxx>
92 #include <crsskip.hxx>
93 #include <doc.hxx>
94 #include <wrtsh.hrc>
95 #include <SwStyleNameMapper.hxx>
96 #include <sfx2/request.hxx>
97 #include <paratr.hxx>
98 #include <ndtxt.hxx>
99 #include <editeng/acorrcfg.hxx>
100 #include <IMark.hxx>
101 #include <sfx2/bindings.hxx>
102 
103 // -> #111827#
104 #include <SwRewriter.hxx>
105 #include <comcore.hrc>
106 // <- #111827#
107 
108 #include <toolkit/helper/vclunohelper.hxx>
109 #include <sfx2/viewfrm.hxx>
110 
111 #include <editeng/acorrcfg.hxx>
112 
113 #include "PostItMgr.hxx"
114 #include <sfx2/msgpool.hxx>
115 
116 using namespace sw::mark;
117 using namespace com::sun::star;
118 
119 #define COMMON_INI_LIST \
120         fnDrag(&SwWrtShell::BeginDrag),\
121         fnSetCrsr(&SwWrtShell::SetCrsr),\
122         fnEndDrag(&SwWrtShell::EndDrag),\
123         fnKillSel(&SwWrtShell::Ignore),\
124         pModeStack(0), \
125         ePageMove(MV_NO),\
126         pCrsrStack(0),  \
127         rView(rShell),\
128         bDestOnStack(sal_False), \
129         fnLeaveSelect(&SwWrtShell::SttLeaveSelect)
130 
131 #define BITFLD_INI_LIST \
132         bClearMark = \
133         bIns = sal_True;\
134         bAddMode = \
135         bBlockMode = \
136         bExtMode = \
137         bInSelect = \
138         bCopy = \
139         bLayoutMode = \
140         bNoEdit = \
141         bSelWrd = \
142         bSelLn = \
143         bIsInClickToEdit = \
144         mbRetainSelection = sal_False;
145 
146 
147 SvxAutoCorrect* lcl_IsAutoCorr()
148 {
149     SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get()->GetAutoCorrect();
150     if( pACorr && !pACorr->IsAutoCorrFlag( CptlSttSntnc | CptlSttWrd |
151                             AddNonBrkSpace | ChgOrdinalNumber |
152                             ChgToEnEmDash | SetINetAttr | Autocorrect ))
153         pACorr = 0;
154     return pACorr;
155 }
156 
157 void SwWrtShell::NoEdit(sal_Bool bHideCrsr)
158 {
159     if(bHideCrsr)
160         HideCrsr();
161     bNoEdit = sal_True;
162 }
163 
164 
165 
166 void SwWrtShell::Edit()
167 {
168     if (CanInsert())
169     {
170         ShowCrsr();
171         bNoEdit = sal_False;
172     }
173 }
174 
175 
176 
177 sal_Bool SwWrtShell::IsEndWrd()
178 {
179     MV_KONTEXT(this);
180     if(IsEndPara() && !IsSttPara())
181         return sal_True;
182 
183     return IsEndWord();
184 }
185 
186 
187 /*------------------------------------------------------------------------
188  Beschreibung:  Abfrage, ob Einfuegen moeglich ist; gfs. Beep
189 ------------------------------------------------------------------------*/
190 
191 
192 
193 sal_Bool SwWrtShell::_CanInsert()
194 {
195     if(!CanInsert())
196     {
197         Sound::Beep();
198         return sal_False;
199     }
200     return sal_True;
201 }
202 /*------------------------------------------------------------------------
203  Beschreibung:  String einfuegen
204 ------------------------------------------------------------------------*/
205 
206 void SwWrtShell::InsertByWord( const String & rStr)
207 {
208     if( rStr.Len() )
209     {
210         sal_Bool bDelim = GetAppCharClass().isLetterNumeric( rStr, 0 );
211         xub_StrLen nPos = 0, nStt = 0;
212         for( ; nPos < rStr.Len(); nPos++ )
213         {
214             sal_Bool bTmpDelim = GetAppCharClass().isLetterNumeric( rStr, nPos );
215             if( bTmpDelim != bDelim )
216             {
217                 Insert( rStr.Copy( nStt, nPos - nStt ));
218                 nStt = nPos;
219             }
220         }
221         if( nStt != nPos )
222             Insert( rStr.Copy( nStt, nPos - nStt ));
223     }
224 }
225 
226 
227 void SwWrtShell::Insert( const String &rStr )
228 {
229     ResetCursorStack();
230     if( !_CanInsert() )
231         return;
232 
233     sal_Bool bStarted = sal_False, bHasSel = HasSelection(),
234         bCallIns = bIns /*|| bHasSel*/;
235     bool bDeleted = false;
236 
237     if( bHasSel || ( !bIns && SelectHiddenRange() ) )
238     {
239             // nur hier klammern, da das normale Insert schon an der
240             // Editshell geklammert ist
241         StartAllAction();
242 
243         // #111827#
244         SwRewriter aRewriter;
245 
246         aRewriter.AddRule(UNDO_ARG1, GetCrsrDescr());
247         aRewriter.AddRule(UNDO_ARG2, String(SW_RES(STR_YIELDS)));
248         {
249             String aTmpStr;
250             aTmpStr += String(SW_RES(STR_START_QUOTE));
251             aTmpStr += rStr;
252             aTmpStr += String(SW_RES(STR_END_QUOTE));
253 
254             aRewriter.AddRule(UNDO_ARG3, rStr);
255         }
256 
257         StartUndo(UNDO_REPLACE, &aRewriter);
258         bStarted = sal_True;
259         bDeleted = DelRight() != 0;
260     }
261 
262     /*
263 JP 21.01.98: Ueberschreiben ueberschreibt nur die Selektion, nicht das
264             naechste Zeichen.
265     if( bHasSel && !bIns && 1 < rStr.Len() )
266     {
267         // falls mehrere Zeichen anstehen, nur das erste einfuegen,
268         // der Rest muss dann aber Ueberschrieben werden.
269         SwEditShell::Insert( rStr.GetChar( 0 ) );
270         SwEditShell::Overwrite( rStr.Copy( 1 ) );
271     }
272     else
273 */
274     bCallIns ?
275         SwEditShell::Insert2( rStr, bDeleted ) : SwEditShell::Overwrite( rStr );
276 
277 
278     if( bStarted )
279     {
280         EndAllAction();
281         EndUndo();
282     }
283 //    delete pChgFlg;
284 }
285 
286 /* Begrenzung auf maximale Hoehe geht nicht, da die maximale Hoehe
287  * des aktuellen Frames nicht erfragt werden kann. */
288 
289 
290 
291 void SwWrtShell::Insert( const String &rPath, const String &rFilter,
292                          const Graphic &rGrf, SwFlyFrmAttrMgr *pFrmMgr,
293                          sal_Bool bRule )
294 {
295     ResetCursorStack();
296     if ( !_CanInsert() )
297         return;
298 
299     StartAllAction();
300 
301     SwRewriter aRewriter;
302     aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_GRAPHIC));
303 
304     StartUndo(UNDO_INSERT, &aRewriter);
305 
306     if ( HasSelection() )
307         DelRight();
308         // eingefuegte Grafik in eigenen Absatz, falls am Ende
309         // eines nichtleeren Absatzes
310     if ( IsEndPara() && !IsSttPara() )
311         SwFEShell::SplitNode();
312 
313     EnterSelFrmMode();
314 
315     sal_Bool bSetGrfSize = sal_True;
316     sal_Bool bOwnMgr     = sal_False;
317 
318     if ( !pFrmMgr )
319     {
320         bOwnMgr = sal_True;
321         pFrmMgr = new SwFlyFrmAttrMgr( sal_True, this, FRMMGR_TYPE_GRF );
322 
323         // VORSICHT
324         // GetAttrSet nimmt einen Abgleich vor
325         // Beim Einfuegen ist eine SwFrmSize vorhanden wegen der
326         // DEF-Rahmengroesse
327         // Diese muss fuer die optimale Groesse explizit entfernt werden
328         pFrmMgr->DelAttr(RES_FRM_SIZE);
329     }
330     else
331     {
332         Size aSz( pFrmMgr->GetSize() );
333         if ( !aSz.Width() || !aSz.Height() )
334         {
335             aSz.Width() = aSz.Height() = 567;
336             pFrmMgr->SetSize( aSz );
337         }
338         else if ( aSz.Width() != DFLT_WIDTH && aSz.Height() != DFLT_HEIGHT )
339             bSetGrfSize = sal_False;
340 
341         pFrmMgr->SetHeightSizeType(ATT_FIX_SIZE);
342 
343     }
344 
345     // Einfuegen der Grafik
346     SwFEShell::Insert(rPath, rFilter, &rGrf, &pFrmMgr->GetAttrSet());
347     if ( bOwnMgr )
348         pFrmMgr->UpdateAttrMgr();
349 
350     if( bSetGrfSize && !bRule )
351     {
352         Size aGrfSize, aBound = GetGraphicDefaultSize();
353         GetGrfSize( aGrfSize );
354 
355         //Die GrafikSize noch um die Randattribute vergroessern, denn die
356         //Zaehlen beim Rahmen mit.
357         aGrfSize.Width() += pFrmMgr->CalcWidthBorder();
358         aGrfSize.Height()+= pFrmMgr->CalcHeightBorder();
359 
360         const BigInt aTempWidth( aGrfSize.Width() );
361         const BigInt aTempHeight( aGrfSize.Height());
362 
363         // ggf. Breite anpassen, Hoehe dann proportional verkleinern
364         if( aGrfSize.Width() > aBound.Width() )
365         {
366             aGrfSize.Width()  = aBound.Width();
367             aGrfSize.Height() = ((BigInt)aBound.Width()) * aTempHeight / aTempWidth;
368         }
369         // ggf. Hoehe anpassen, Breite dann proportional verkleinern
370         if( aGrfSize.Height() > aBound.Height() )
371         {
372             aGrfSize.Height() = aBound.Height();
373             aGrfSize.Width() =  ((BigInt)aBound.Height()) * aTempWidth / aTempHeight;
374         }
375         pFrmMgr->SetSize( aGrfSize );
376         pFrmMgr->UpdateFlyFrm();
377     }
378     if ( bOwnMgr )
379         delete pFrmMgr;
380 
381     EndUndo();
382     EndAllAction();
383 }
384 
385 
386 /*------------------------------------------------------------------------
387    Beschreibung: Fuegt ein OLE-Objekt in die CORE ein.
388                  Wenn kein Object uebergeben wird, so wird eins erzeugt.
389 ------------------------------------------------------------------------*/
390 
391 
392 void SwWrtShell::InsertObject( const svt::EmbeddedObjectRef& xRef, SvGlobalName *pName,
393                             sal_Bool bActivate, sal_uInt16 nSlotId )
394 {
395     ResetCursorStack();
396     if( !_CanInsert() )
397         return;
398 
399     if( !xRef.is() )
400     {
401         // temporary storage
402         svt::EmbeddedObjectRef xObj;
403         uno::Reference < embed::XStorage > xStor = comphelper::OStorageHelper::GetTemporaryStorage();
404         sal_Bool bDoVerb = sal_True;
405         if ( pName )
406         {
407             comphelper::EmbeddedObjectContainer aCnt( xStor );
408             ::rtl::OUString aName;
409             // TODO/LATER: get aspect?
410             xObj.Assign( aCnt.CreateEmbeddedObject( pName->GetByteSequence(), aName ), embed::Aspects::MSOLE_CONTENT );
411         }
412         else
413         {
414             SvObjectServerList aServerList;
415             switch (nSlotId)
416             {
417                 case SID_INSERT_OBJECT:
418                 {
419                     aServerList.FillInsertObjects();
420                     aServerList.Remove( SwDocShell::Factory().GetClassId() );
421                     // Intentionally no break!
422                 }
423 
424                 // TODO/LATER: recording! Convert properties to items
425                 case SID_INSERT_PLUGIN:
426                     /*
427                     if(pReq)
428                     {
429                         INetURLObject* pURL = aDlg.GetURL();
430                         if(pURL)
431                             pReq->AppendItem(SfxStringItem(FN_PARAM_2, pURL->GetMainURL(INetURLObject::NO_DECODE)));
432                         pReq->AppendItem(SfxStringItem(FN_PARAM_3 , aDlg.GetCommands()));
433                     } */
434                 case SID_INSERT_FLOATINGFRAME:
435                     /*
436                     if(pReq && xFloatingFrame.Is())
437                     {
438                         const SfxFrameDescriptor* pDescriptor = xFloatingFrame->GetFrameDescriptor();
439                         pReq->AppendItem(SfxStringItem(FN_PARAM_1, pDescriptor->GetName()));
440                         pReq->AppendItem(
441                                 SfxStringItem( FN_PARAM_2,
442                                     pDescriptor->GetURL().GetMainURL(INetURLObject::NO_DECODE)));
443                         pReq->AppendItem(SvxSizeItem(FN_PARAM_3, pDescriptor->GetMargin()));
444                         pReq->AppendItem(SfxByteItem(FN_PARAM_4, pDescriptor->GetScrollingMode()));
445                         pReq->AppendItem(SfxBoolItem(FN_PARAM_5, pDescriptor->HasFrameBorder()));
446                     }*/
447                 {
448                     SfxSlotPool* pSlotPool = SW_MOD()->GetSlotPool();
449                     const SfxSlot* pSlot = pSlotPool->GetSlot(nSlotId);
450                     rtl::OString aCmd(".uno:");
451                     aCmd += pSlot->GetUnoName();
452                     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
453                     SfxAbstractInsertObjectDialog* pDlg =
454                             pFact->CreateInsertObjectDialog( GetWin(), rtl::OUString( aCmd, aCmd.getLength(), RTL_TEXTENCODING_UTF8 ), xStor, &aServerList );
455                     if ( pDlg )
456                     {
457                         pDlg->Execute();
458                         bDoVerb = pDlg->IsCreateNew();
459                         ::rtl::OUString aIconMediaType;
460                         uno::Reference< io::XInputStream > xIconMetaFile = pDlg->GetIconIfIconified( &aIconMediaType );
461                         xObj.Assign( pDlg->GetObject(),
462                                      xIconMetaFile.is() ? embed::Aspects::MSOLE_ICON : embed::Aspects::MSOLE_CONTENT );
463                         if ( xIconMetaFile.is() )
464                             xObj.SetGraphicStream( xIconMetaFile, aIconMediaType );
465 
466                         DELETEZ( pDlg );
467                     }
468 
469                     break;
470                 }
471 
472                 default:
473                     break;
474             }
475         }
476 
477         if ( xObj.is() )
478         {
479             if( InsertOleObject( xObj ) && bActivate && bDoVerb )
480             {
481                 SfxInPlaceClient* pClient = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin() );
482                 if ( !pClient )
483                 {
484                     pClient = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
485                     SetCheckForOLEInCaption( sal_True );
486                 }
487 
488                 if ( xObj.GetViewAspect() == embed::Aspects::MSOLE_ICON )
489                 {
490                     SwRect aArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() );
491                     aArea.Pos() += GetAnyCurRect( RECT_FLY_EMBEDDED, 0, xObj.GetObject() ).Pos();
492                     MapMode aMapMode( MAP_TWIP );
493                     Size aSize = xObj.GetSize( &aMapMode );
494                     aArea.Width( aSize.Width() );
495                     aArea.Height( aSize.Height() );
496                     RequestObjectResize( aArea, xObj.GetObject() );
497                 }
498                 else
499                     CalcAndSetScale( xObj );
500 
501                 //#50270# Error brauchen wir nicht handeln, das erledigt das
502                 //DoVerb in der SfxViewShell
503                 pClient->DoVerb( SVVERB_SHOW );
504 
505                 // TODO/LATER: set document name - should be done in Client
506                 //if ( !ERRCODE_TOERROR( nErr ) )
507                 //    xIPObj->SetDocumentName( GetView().GetDocShell()->GetTitle() );
508             }
509         }
510     }
511     else
512     {
513         if( HasSelection() )
514             DelRight();
515         InsertOleObject( xRef );
516     }
517 }
518 
519 /*------------------------------------------------------------------------
520  Beschreibung:   Object in die Core einfuegen.
521                  Vom ClipBoard oder Insert
522 ------------------------------------------------------------------------*/
523 
524 sal_Bool SwWrtShell::InsertOleObject( const svt::EmbeddedObjectRef& xRef, SwFlyFrmFmt **pFlyFrmFmt )
525 {
526     ResetCursorStack();
527     StartAllAction();
528 
529     StartUndo(UNDO_INSERT);
530 
531     //Some differences between StarMath and any other objects:
532     //1. Selections should be deleted. For StarMath the Text should be
533     //   passed to the Object
534     //2. If the cursor is at the end of an non empty paragraph a paragraph
535     //   break should be insertet. StarMath objects are character bound and
536     //   no break should be inserted.
537     //3. If an selektion is passed to a StarMath object, this object should
538     //   not be activated. sal_False should be returned then.
539     sal_Bool bStarMath = sal_True;
540     sal_Bool bActivate = sal_True;
541 
542     // set parent to get correct VisArea(in case of object needing parent printer)
543     uno::Reference < container::XChild > xChild( xRef.GetObject(), uno::UNO_QUERY );
544     if ( xChild.is() )
545         xChild->setParent( pDoc->GetDocShell()->GetModel() );
546 
547     SvGlobalName aCLSID( xRef->getClassID() );
548     bStarMath = ( SotExchange::IsMath( aCLSID ) != 0 );
549     if( IsSelection() )
550     {
551         if( bStarMath )
552         {
553             String aMathData;
554             GetSelectedText( aMathData, GETSELTXT_PARABRK_TO_ONLYCR );
555 
556             if( aMathData.Len() && svt::EmbeddedObjectRef::TryRunningState( xRef.GetObject() ) )
557             {
558                 uno::Reference < beans::XPropertySet > xSet( xRef->getComponent(), uno::UNO_QUERY );
559                 if ( xSet.is() )
560                 {
561                     try
562                     {
563                         xSet->setPropertyValue( ::rtl::OUString::createFromAscii("Formula"), uno::makeAny( ::rtl::OUString( aMathData ) ) );
564                         bActivate = sal_False;
565                     }
566                     catch ( uno::Exception& )
567                     {
568                     }
569                 }
570             }
571         }
572         DelRight();
573     }
574 
575     if ( !bStarMath )
576         SwFEShell::SplitNode( sal_False, sal_False );
577 
578     EnterSelFrmMode();
579 
580     SwFlyFrmAttrMgr aFrmMgr( sal_True, this, FRMMGR_TYPE_OLE );
581     aFrmMgr.SetHeightSizeType(ATT_FIX_SIZE);
582 
583     SwRect aBound;
584     CalcBoundRect( aBound, aFrmMgr.GetAnchor() );
585 
586     //The Size should be suggested by the OLE server
587     MapMode aMapMode( MAP_TWIP );
588     Size aSz = xRef.GetSize( &aMapMode );
589 
590     //Object size can be limited
591     if ( aSz.Width() > aBound.Width() )
592     {
593         //Immer proportional begrenzen.
594         aSz.Height() = aSz.Height() * aBound.Width() / aSz.Width();
595         aSz.Width() = aBound.Width();
596     }
597     aFrmMgr.SetSize( aSz );
598     SwFlyFrmFmt *pFmt = SwFEShell::InsertObject( xRef, &aFrmMgr.GetAttrSet() );
599 
600     // --> #i972#
601     if ( bStarMath && pDoc->get( IDocumentSettingAccess::MATH_BASELINE_ALIGNMENT ) )
602         AlignFormulaToBaseline( xRef.GetObject() );
603     // <--
604 
605     if (pFlyFrmFmt)
606         *pFlyFrmFmt = pFmt;
607 
608     if ( SotExchange::IsChart( aCLSID ) )
609     {
610         uno::Reference< embed::XEmbeddedObject > xEmbeddedObj( xRef.GetObject(), uno::UNO_QUERY );
611         if ( xEmbeddedObj.is() )
612         {
613             bool bDisableDataTableDialog = false;
614             svt::EmbeddedObjectRef::TryRunningState( xEmbeddedObj );
615             uno::Reference< beans::XPropertySet > xProps( xEmbeddedObj->getComponent(), uno::UNO_QUERY );
616             if ( xProps.is() &&
617                  ( xProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableDataTableDialog" ) ) ) >>= bDisableDataTableDialog ) &&
618                  bDisableDataTableDialog )
619             {
620                 xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableDataTableDialog" ) ),
621                     uno::makeAny( sal_False ) );
622                 xProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisableComplexChartTypes" ) ),
623                     uno::makeAny( sal_False ) );
624                 uno::Reference< util::XModifiable > xModifiable( xProps, uno::UNO_QUERY );
625                 if ( xModifiable.is() )
626                 {
627                     xModifiable->setModified( sal_True );
628                 }
629             }
630         }
631     }
632 
633     EndAllAction();
634     GetView().AutoCaption(OLE_CAP, &aCLSID);
635 
636     SwRewriter aRewriter;
637 
638     if ( bStarMath )
639         aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_MATH_FORMULA));
640     else if ( SotExchange::IsChart( aCLSID ) )
641         aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_CHART));
642     else
643         aRewriter.AddRule(UNDO_ARG1, SW_RES(STR_OLE));
644 
645     EndUndo(UNDO_INSERT, &aRewriter);
646 
647     return bActivate;
648 }
649 
650 /*------------------------------------------------------------------------
651     Beschreibung: Das aktuelle selektierte OLE-Objekt wird mit dem
652                   Verb in den Server geladen.
653 ------------------------------------------------------------------------*/
654 
655 
656 
657 void SwWrtShell::LaunchOLEObj( long nVerb )
658 {
659     if ( GetCntType() == CNT_OLE &&
660          !GetView().GetViewFrame()->GetFrame().IsInPlace() )
661     {
662         svt::EmbeddedObjectRef& xRef = GetOLEObject();
663         ASSERT( xRef.is(), "OLE not found" );
664         SfxInPlaceClient* pCli=0;
665 
666         pCli = GetView().FindIPClient( xRef.GetObject(), &GetView().GetEditWin() );
667         if ( !pCli )
668             pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xRef );
669 
670         ((SwOleClient*)pCli)->SetInDoVerb( sal_True );
671 
672         CalcAndSetScale( xRef );
673         pCli->DoVerb( nVerb );
674 
675         ((SwOleClient*)pCli)->SetInDoVerb( sal_False );
676         CalcAndSetScale( xRef );
677     }
678 }
679 
680 void SwWrtShell::MoveObjectIfActive( svt::EmbeddedObjectRef& xObj, const Point& rOffset )
681 {
682     try
683     {
684         sal_Int32 nState = xObj->getCurrentState();
685         if ( nState == ::com::sun::star::embed::EmbedStates::INPLACE_ACTIVE
686           || nState == ::com::sun::star::embed::EmbedStates::UI_ACTIVE )
687         {
688             SfxInPlaceClient* pCli =
689                 GetView().FindIPClient( xObj.GetObject(), &(GetView().GetEditWin()) );
690             if ( pCli )
691             {
692                 Rectangle aArea = pCli->GetObjArea();
693                 aArea += rOffset;
694                 pCli->SetObjArea( aArea );
695             }
696         }
697     }
698     catch( uno::Exception& )
699     {}
700 }
701 
702 
703 void SwWrtShell::CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
704                                   const SwRect *pFlyPrtRect,
705                                   const SwRect *pFlyFrmRect,
706                                   const bool bNoTxtFrmPrtAreaChanged )
707 {
708     //Einstellen der Skalierung am Client. Diese ergibt sich aus der Differenz
709     //zwischen der VisArea des Objektes und der ObjArea.
710     ASSERT( xObj.is(), "ObjectRef not  valid" );
711 
712     sal_Int64 nAspect = xObj.GetViewAspect();
713     if ( nAspect == embed::Aspects::MSOLE_ICON )
714         return; // the replacement image is completely controlled by container in this case
715 
716     sal_Int64 nMisc = 0;
717     sal_Bool bLinkingChart = sal_False;
718 
719     try
720     {
721         nMisc = xObj->getStatus( nAspect );
722 
723         //Das kann ja wohl nur ein nicht aktives Objekt sein. Diese bekommen
724         //auf Wunsch die neue Groesse als VisArea gesetzt (StarChart)
725         if( embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE & nMisc )
726         {
727             // TODO/MBA: testing
728             SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
729                         : GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ));
730             if( !aRect.IsEmpty() )
731             {
732                 // TODO/LEAN: getMapUnit can switch object to running state
733                 // xObj.TryRunningState();
734 
735                 MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
736 
737                 // TODO/LATER: needs complete VisArea?!
738                 Size aSize( OutputDevice::LogicToLogic( aRect.SVRect(), MAP_TWIP, aUnit ).GetSize() );
739                 awt::Size aSz;
740                 aSz.Width = aSize.Width();
741                 aSz.Height = aSize.Height();
742                 xObj->setVisualAreaSize( nAspect, aSz );
743                 // --> OD 2005-05-02 #i48419# - action 'UpdateReplacement' doesn't
744                 // have to change the modified state of the document.
745                 // This is only a workaround for the defect, that this action
746                 // modifies a document after load, because unnecessarily the
747                 // replacement graphic is updated, in spite of the fact that
748                 // nothing has been changed.
749                 // If the replacement graphic changes by this action, the document
750                 // will be already modified via other mechanisms.
751                 {
752                     bool bResetEnableSetModified(false);
753                     if ( GetDoc()->GetDocShell()->IsEnableSetModified() )
754                     {
755                         GetDoc()->GetDocShell()->EnableSetModified( sal_False );
756                         bResetEnableSetModified = true;
757                     }
758 
759                     //#i79576# don't destroy chart replacement images on load
760                     //#i79578# don't request a new replacement image for charts to often
761                     //a chart sends a modified call to the framework if it was changed
762                     //thus the replacement update is already handled elsewhere
763                     if ( !SotExchange::IsChart( xObj->getClassID() ) )
764                         xObj.UpdateReplacement();
765 
766                     if ( bResetEnableSetModified )
767                     {
768                         GetDoc()->GetDocShell()->EnableSetModified( sal_True );
769                     }
770                 }
771                 // <--
772             }
773 
774             // TODO/LATER: this is only a workaround,
775             uno::Reference< chart2::XChartDocument > xChartDocument( xObj->getComponent(), uno::UNO_QUERY );
776             bLinkingChart = ( xChartDocument.is() && !xChartDocument->hasInternalDataProvider() );
777         }
778     }
779     catch ( uno::Exception& )
780     {
781         // TODO/LATER: handle the error
782         return;
783     }
784 
785     SfxInPlaceClient* pCli = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin() );
786     if ( !pCli )
787     {
788         if ( (embed::EmbedMisc::EMBED_ACTIVATEIMMEDIATELY & nMisc)
789              || bLinkingChart
790             // TODO/LATER: ResizeOnPrinterChange
791              //|| SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & xObj->GetMiscStatus()
792              // --> OD #i117189# - refine condition for non-resizable objects
793              // non-resizable objects need to be set the size back by this method
794              || ( bNoTxtFrmPrtAreaChanged && nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE ) )
795         {
796             pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
797         }
798         else
799             return;
800     }
801 
802     // TODO/LEAN: getMapUnit can switch object to running state
803     // xObj.TryRunningState();
804 
805     awt::Size aSize;
806     try
807     {
808         aSize = xObj->getVisualAreaSize( nAspect );
809     }
810     catch( embed::NoVisualAreaSizeException& )
811     {
812         DBG_ERROR( "Can't get visual area size!\n" );
813         // the scaling will not be done
814     }
815     catch( uno::Exception& )
816     {
817         // TODO/LATER: handle the error
818         DBG_ERROR( "Can't get visual area size!\n" );
819         return;
820     }
821 
822     Size _aVisArea( aSize.Width, aSize.Height );
823 
824     Fraction aScaleWidth( 1, 1 );
825     Fraction aScaleHeight( 1, 1 );
826 
827     sal_Bool bUseObjectSize = sal_False;
828 
829     // solange keine vernuenftige Size vom Object kommt, kann nichts
830     // skaliert werden
831     if( _aVisArea.Width() && _aVisArea.Height() )
832     {
833         const MapMode aTmp( MAP_TWIP );
834         MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) );
835         _aVisArea = OutputDevice::LogicToLogic( _aVisArea, aUnit, aTmp);
836         Size aObjArea;
837         if ( pFlyPrtRect )
838             aObjArea = pFlyPrtRect->SSize();
839         else
840             aObjArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ).SSize();
841 
842         // differ the aObjArea and _aVisArea by 1 Pixel then set new VisArea
843         long nX, nY;
844         SwSelPaintRects::Get1PixelInLogic( *this, &nX, &nY );
845         if( !( _aVisArea.Width() - nX <= aObjArea.Width() &&
846                _aVisArea.Width() + nX >= aObjArea.Width() &&
847                _aVisArea.Height()- nY <= aObjArea.Height()&&
848                _aVisArea.Height()+ nY >= aObjArea.Height() ))
849         {
850             // TODO/LATER: MISCSTATUS_RESIZEONPRINTERCHANGE
851             /*
852             if( SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE & nMisc )
853             {
854                 //This type of objects should never be resized.
855                 //If this request comes from the Writer core (inaktive Object
856                 //ist resized), the Object should be resized too.
857                 //If this request comes from the Object itself, the Frame
858                 //in the Writer core should be resized.
859                 if ( pFlyPrtRect )      //Request from core?
860                 {
861                     xObj->SetVisArea( OutputDevice::LogicToLogic(
862                         pFlyPrtRect->SVRect(), MAP_TWIP, xObj->GetMapUnit() ));
863                 }
864                 else
865                 {
866                     SwRect aTmp( Point( LONG_MIN, LONG_MIN ), _aVisArea );
867                     RequestObjectResize( aTmp, xObj );
868                 }
869                 //Der Rest erledigt sich, weil wir eh wiederkommen sollten, evtl.
870                 //sogar rekursiv.
871                 return;
872             }
873             else*/
874 
875             if ( nMisc & embed::EmbedMisc::EMBED_NEVERRESIZE )
876             {
877                 // the object must not be scaled, the size stored in object must be used for restoring
878                 bUseObjectSize = sal_True;
879             }
880             else
881             {
882                 aScaleWidth = Fraction( aObjArea.Width(),   _aVisArea.Width() );
883                 aScaleHeight = Fraction( aObjArea.Height(), _aVisArea.Height());
884             }
885         }
886     }
887 
888     //Jetzt ist auch der guenstige Zeitpunkt die ObjArea einzustellen.
889     //Die Scalierung muss beruecksichtigt werden.
890     SwRect aArea;
891     if ( pFlyPrtRect )
892     {
893         aArea = *pFlyPrtRect;
894         aArea += pFlyFrmRect->Pos();
895     }
896     else
897     {
898         aArea = GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() );
899         aArea.Pos() += GetAnyCurRect( RECT_FLY_EMBEDDED, 0, xObj.GetObject() ).Pos();
900     }
901 
902     if ( bUseObjectSize )
903     {
904         // --> this moves non-resizable object so that when adding borders the baseline remains the same
905         const SwFlyFrmFmt *pFlyFrmFmt = dynamic_cast< const SwFlyFrmFmt * >( GetFlyFrmFmt() );
906         ASSERT( pFlyFrmFmt, "Could not find fly frame." );
907         if ( pFlyFrmFmt )
908         {
909             const Point &rPoint = pFlyFrmFmt->GetLastFlyFrmPrtRectPos();
910             SwRect aRect( pFlyPrtRect ? *pFlyPrtRect
911                         : GetAnyCurRect( RECT_FLY_PRT_EMBEDDED, 0, xObj.GetObject() ));
912             aArea += rPoint - aRect.Pos(); // adjust area by diff of printing area position in order to keep baseline alignment correct.
913         }
914         // <--
915         aArea.Width ( _aVisArea.Width() );
916         aArea.Height( _aVisArea.Height() );
917         RequestObjectResize( aArea, xObj.GetObject() );
918     }
919     else
920     {
921         aArea.Width ( Fraction( aArea.Width()  ) / pCli->GetScaleWidth() );
922         aArea.Height( Fraction( aArea.Height() ) / pCli->GetScaleHeight());
923     }
924 
925     pCli->SetObjAreaAndScale( aArea.SVRect(), aScaleWidth, aScaleHeight );
926 }
927 
928 
929 
930 void SwWrtShell::ConnectObj( svt::EmbeddedObjectRef& xObj, const SwRect &rPrt,
931                             const SwRect &rFrm )
932 {
933     SfxInPlaceClient* pCli = GetView().FindIPClient( xObj.GetObject(), &GetView().GetEditWin());
934     if ( !pCli )
935         pCli = new SwOleClient( &GetView(), &GetView().GetEditWin(), xObj );
936     CalcAndSetScale( xObj, &rPrt, &rFrm );
937 }
938 
939 /*------------------------------------------------------------------------
940  Beschreibung:  Einfuegen harter Seitenumbruch;
941                 Selektionen werden ueberschrieben
942 ------------------------------------------------------------------------*/
943 
944 
945 
946 void SwWrtShell::InsertPageBreak(const String *pPageDesc, sal_uInt16 nPgNum )
947 {
948     ResetCursorStack();
949     if( _CanInsert() )
950     {
951         ACT_KONTEXT(this);
952         StartUndo(UNDO_UI_INSERT_PAGE_BREAK);
953 
954         if ( !IsCrsrInTbl() )
955         {
956             if(HasSelection())
957                 DelRight();
958             SwFEShell::SplitNode();
959         }
960 
961         const SwPageDesc *pDesc = pPageDesc
962                                 ? FindPageDescByName( *pPageDesc, sal_True ) : 0;
963         if( pDesc )
964         {
965             SwFmtPageDesc aDesc( pDesc );
966             aDesc.SetNumOffset( nPgNum );
967             SetAttr( aDesc );
968         }
969         else
970             SetAttr( SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE, RES_BREAK) );
971         EndUndo(UNDO_UI_INSERT_PAGE_BREAK);
972     }
973 }
974 /*------------------------------------------------------------------------
975  Beschreibung:  Einfuegen harter Zeilenumbruch;
976                 Selektionen werden ueberschrieben
977 ------------------------------------------------------------------------*/
978 
979 
980 void SwWrtShell::InsertLineBreak()
981 {
982     ResetCursorStack();
983     if( _CanInsert() )
984     {
985         if(HasSelection())
986             DelRight();
987 
988         const sal_Unicode cIns = 0x0A;
989         SvxAutoCorrect* pACorr = lcl_IsAutoCorr();
990         if( pACorr )
991             AutoCorrect( *pACorr, cIns );
992         else
993             SwWrtShell::Insert( String( cIns ) );
994     }
995 }
996 /*------------------------------------------------------------------------
997  Beschreibung:  Einfuegen harter Spaltenumbruch;
998                 Selektionen werden ueberschrieben
999 ------------------------------------------------------------------------*/
1000 
1001 
1002 void SwWrtShell::InsertColumnBreak()
1003 {
1004     ACT_KONTEXT(this);
1005     ResetCursorStack();
1006     if( _CanInsert() )
1007     {
1008         StartUndo(UNDO_UI_INSERT_COLUMN_BREAK);
1009 
1010         if ( !IsCrsrInTbl() )
1011         {
1012             if(HasSelection())
1013                 DelRight();
1014             SwFEShell::SplitNode( sal_False, sal_False );
1015         }
1016         SetAttr(SvxFmtBreakItem(SVX_BREAK_COLUMN_BEFORE, RES_BREAK));
1017 
1018         EndUndo(UNDO_UI_INSERT_COLUMN_BREAK);
1019     }
1020 }
1021 
1022 /*------------------------------------------------------------------------
1023  Beschreibung:  Einfuegen Fussnote
1024  Parameter:     rStr -- optionales Fussnotenzeichen
1025 ------------------------------------------------------------------------*/
1026 
1027 
1028 void SwWrtShell::InsertFootnote(const String &rStr, sal_Bool bEndNote, sal_Bool bEdit )
1029 {
1030     ResetCursorStack();
1031     if( _CanInsert() )
1032     {
1033         if(HasSelection())
1034         {
1035             //collapse cursor to the end
1036             if(!IsCrsrPtAtEnd())
1037                 SwapPam();
1038             ClearMark();
1039         }
1040 
1041         SwFmtFtn aFootNote( bEndNote );
1042         if(rStr.Len())
1043             aFootNote.SetNumStr( rStr );
1044 
1045         SetAttr(aFootNote);
1046 
1047         if( bEdit )
1048         {
1049             // zur Bearbeiung des Fussnotentextes
1050             Left(CRSR_SKIP_CHARS, sal_False, 1, sal_False );
1051             GotoFtnTxt();
1052         }
1053     }
1054 }
1055 /*------------------------------------------------------------------------
1056  Beschreibung:  SplitNode; hier auch, da
1057                     - selektierter Inhalt geloescht wird;
1058                     - der Cursorstack gfs. zurueckgesetzt wird.
1059 ------------------------------------------------------------------------*/
1060 
1061 
1062 void SwWrtShell::SplitNode( sal_Bool bAutoFmt, sal_Bool bCheckTableStart )
1063 {
1064     ResetCursorStack();
1065     if( _CanInsert() )
1066     {
1067         ACT_KONTEXT(this);
1068 
1069         rView.GetEditWin().FlushInBuffer();
1070         sal_Bool bHasSel = HasSelection();
1071         if( bHasSel )
1072         {
1073             StartUndo( UNDO_INSERT );
1074             DelRight();
1075         }
1076 
1077         SwFEShell::SplitNode( bAutoFmt, bCheckTableStart );
1078         if( bHasSel )
1079             EndUndo( UNDO_INSERT );
1080     }
1081 }
1082 
1083 /*------------------------------------------------------------------------
1084  Beschreibung:  Numerierung anschalten
1085  Parameter:     Optionale Angabe eines Namens fuer die benannte Liste;
1086                 dieser bezeichnet eine Position, wenn er in eine
1087                 Zahl konvertierbar ist und kleiner ist als nMaxRules.
1088 -------------------------------------------------------------------------*/
1089 
1090 
1091 // zum Testen der CharFormate an der Numerierung
1092 // extern void SetNumChrFmt( SwWrtShell*, SwNumRules& );
1093 
1094 // -> #i40041#
1095 // --> OD 2005-10-25 #b6340308#
1096 // Preconditions (as far as OD has figured out):
1097 // - <SwEditShell::HasNumber()> is sal_False, if <bNum> is sal_True
1098 // - <SwEditShell::HasBullet()> is sal_False, if <bNum> is sal_False
1099 // Behavior of method is determined by the current situation at the current
1100 // cursor position in the document.
1101 void SwWrtShell::NumOrBulletOn(sal_Bool bNum)
1102 {
1103     // determine numbering rule found at current cursor position in the docment.
1104     const SwNumRule* pCurRule = GetCurNumRule();
1105 
1106     StartUndo(UNDO_NUMORNONUM);
1107 
1108     const SwNumRule * pNumRule = pCurRule;
1109 
1110     // --> OD 2005-10-25 #b6340308#
1111     // - activate outline rule respectively turning on outline rule for
1112     //   current text node. But, only for turning on a numbering (<bNum> == sal_True).
1113     // - overwrite found numbering rule at current cursor position, if
1114     //   no numbering rule can be retrieved from the paragraph style.
1115     bool bContinueFoundNumRule( false );
1116     bool bActivateOutlineRule( false );
1117     int nActivateOutlineLvl( MAXLEVEL );    // only relevant, if <bActivateOutlineRule> == sal_True
1118     SwTxtFmtColl * pColl = GetCurTxtFmtColl();
1119     if ( pColl )
1120     {
1121         // --> OD 2005-10-25 #b6340308# - retrieve numbering rule at paragraph
1122         // style, which is found at current cursor position in the document.
1123         SwNumRule* pCollRule = pDoc->FindNumRulePtr(pColl->GetNumRule().GetValue());
1124         // --> OD 2005-10-25 #125993# - The outline numbering rule isn't allowed
1125         // to be derived from a parent paragraph style to a derived one.
1126         // Thus check, if the found outline numbering rule is directly
1127         // set at the paragraph style <pColl>. If not, set <pCollRule> to NULL
1128         if ( pCollRule && pCollRule == GetDoc()->GetOutlineNumRule() )
1129         {
1130             const SwNumRule* pDirectCollRule =
1131                     pDoc->FindNumRulePtr(pColl->GetNumRule( sal_False ).GetValue());
1132             if ( !pDirectCollRule )
1133             {
1134                 pCollRule = 0;
1135             }
1136         }
1137         // --> OD 2006-11-20 #i71764#
1138         // Document setting OUTLINE_LEVEL_YIELDS_OUTLINE_RULE has no influence
1139         // any more.
1140 //        if ( pCollRule == NULL &&
1141 //             NO_NUMBERING != pColl->GetOutlineLevel() &&
1142 //             GetDoc()->get(IDocumentSettingAccess::OUTLINE_LEVEL_YIELDS_OUTLINE_RULE) )
1143 //        {
1144 //            pCollRule = GetDoc()->GetOutlineNumRule();
1145 //        }
1146         // <--
1147 
1148         // <--
1149         // --> OD 2005-10-25 #b6340308#
1150         if ( !pCollRule )
1151         {
1152             pNumRule = pCollRule;
1153         }
1154         // --> OD 2006-06-12 #b6435904#
1155         // no activation or continuation of outline numbering in Writer/Web document
1156         else if ( bNum &&
1157                   !dynamic_cast<SwWebDocShell*>(GetDoc()->GetDocShell()) &&
1158                   pCollRule == GetDoc()->GetOutlineNumRule() )
1159         // <--
1160         {
1161             if ( pNumRule == pCollRule )
1162             {
1163                 // check, if text node at current cursor positioned is counted.
1164                 // If not, let it been counted. Then it has to be checked,
1165                 // of the outline numbering has to be activated or continued.
1166                 SwTxtNode* pTxtNode =
1167                             GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1168                 if ( pTxtNode && !pTxtNode->IsCountedInList() )
1169                 {
1170                     // check, if numbering of the outline level of the pararaph
1171                     // style is active. If not, activate this outline level.
1172                     nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();
1173                     ASSERT( pColl->IsAssignedToListLevelOfOutlineStyle(),   //<-end,zhaojianwei
1174                             "<SwWrtShell::NumOrBulletOn(..)> - paragraph style with outline rule, but no outline level" );
1175                     if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&        //<-end,zhaojianwei
1176                          pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1177                             == SVX_NUM_NUMBER_NONE )
1178                     {
1179                         // activate outline numbering
1180                         bActivateOutlineRule = true;
1181                     }
1182                     else
1183                     {
1184                         // turning on outline numbering at current cursor position
1185                         bContinueFoundNumRule = true;
1186                     }
1187                 }
1188                 else
1189                 {
1190                     // --> OD 2009-08-27 #i101234#
1191                     // activate outline numbering, because from the precondition
1192                     // it's known, that <SwEdit::HasNumber()> == sal_False
1193                     bActivateOutlineRule = true;
1194                     nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();//<-end,zhaojianwei
1195                 }
1196             }
1197             else if ( !pNumRule )
1198             {
1199                 // --> OD 2009-08-27 #i101234#
1200                 // Check, if corresponding list level of the outline numbering
1201                 // has already a numbering format set.
1202                 nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();//<-end,zhaojianwei,need further consideration
1203                 if ( pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1204                                 == SVX_NUM_NUMBER_NONE )
1205                 {
1206                     // activate outline numbering, because from the precondition
1207                     // it's known, that <SwEdit::HasNumber()> == sal_False
1208                     bActivateOutlineRule = true;
1209                 }
1210                 else
1211                 {
1212                     // turning on outline numbering at current cursor position
1213                     bContinueFoundNumRule = true;
1214                 }
1215                 // <--
1216             }
1217             else
1218             {
1219                 // check, if numbering of the outline level of the pararaph
1220                 // style is active. If not, activate this outline level.
1221                 nActivateOutlineLvl = pColl->GetAssignedOutlineStyleLevel();//#outline level,zhaojianwei
1222                 ASSERT( pColl->IsAssignedToListLevelOfOutlineStyle(),//#outline level,zhaojianwei
1223                         "<SwWrtShell::NumOrBulletOn(..)> - paragraph style with outline rule, but no outline level" );
1224                 if ( pColl->IsAssignedToListLevelOfOutlineStyle() &&//#outline level,zhaojianwei
1225                      pCollRule->Get( static_cast<sal_uInt16>(nActivateOutlineLvl) ).GetNumberingType()
1226                         == SVX_NUM_NUMBER_NONE )
1227                 {
1228                     // activate outline numbering
1229                     bActivateOutlineRule = true;
1230                 }
1231                 else
1232                 {
1233                     // turning on outline numbering at current cursor position
1234                     bContinueFoundNumRule = true;
1235                 }
1236             }
1237             pNumRule = pCollRule;
1238         }
1239     }
1240 
1241     // --> OD 2005-10-25 #b6340308#
1242     // Only automatic numbering/bullet rules should be changed.
1243     // Note: The outline numbering rule is also an automatic one. It's only
1244     //       changed, if it has to be activated.
1245     if ( pNumRule )
1246     {
1247         if ( !pNumRule->IsAutoRule() )
1248         {
1249             pNumRule = 0;
1250         }
1251         else if ( pNumRule == GetDoc()->GetOutlineNumRule() &&
1252                   !bActivateOutlineRule && !bContinueFoundNumRule )
1253         {
1254             pNumRule = 0;
1255         }
1256     }
1257     // <--
1258 
1259     // --> OD 2005-10-25 #b6340308#
1260     // Search for a previous numbering/bullet rule to continue it.
1261     // --> OD 2008-03-18 #refactorlists#
1262     String sContinuedListId;
1263     if ( !pNumRule )
1264     {
1265         pNumRule = GetDoc()->SearchNumRule( *GetCrsr()->GetPoint(),
1266                                             false, bNum, false, 0,
1267                                             sContinuedListId );
1268         bContinueFoundNumRule = pNumRule != 0;
1269     }
1270     // <--
1271 
1272     if (pNumRule)
1273     {
1274         SwNumRule aNumRule(*pNumRule);
1275 
1276         // --> OD 2005-10-25 #b6340308#
1277         // do not change found numbering/bullet rule, if it should only be continued.
1278         if ( !bContinueFoundNumRule )
1279         {
1280             SwTxtNode * pTxtNode = GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1281 
1282             if (pTxtNode)
1283             {
1284                 // --> OD 2005-10-26 #b6340308# - use above retrieve outline
1285                 // level, if outline numbering has to be activated.
1286                 int nLevel = bActivateOutlineRule  ////#outline level,zhaojianwei,need more consideration
1287                               ? nActivateOutlineLvl
1288                               : pTxtNode->GetActualListLevel();
1289                 // <--
1290 
1291                 if (nLevel < 0)
1292                     nLevel = 0;
1293 
1294                 if (nLevel >= MAXLEVEL)
1295                     nLevel = MAXLEVEL - 1;
1296 
1297                 SwNumFmt aFmt(aNumRule.Get(static_cast<sal_uInt16>(nLevel)));
1298 
1299                 if (bNum)
1300                     aFmt.SetNumberingType(SVX_NUM_ARABIC);
1301                 else
1302                 {
1303                     // --> OD 2008-06-03 #i63395#
1304                     // Only apply user defined default bullet font
1305                     if ( numfunc::IsDefBulletFontUserDefined() )
1306                     {
1307                         const Font* pFnt = &numfunc::GetDefBulletFont();
1308                         aFmt.SetBulletFont( pFnt );
1309                     }
1310                     // <--
1311                     aFmt.SetBulletChar( numfunc::GetBulletChar(static_cast<sal_uInt8>(nLevel)));
1312                     aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
1313                     // #i93908# clear suffix for bullet lists
1314                     aFmt.SetPrefix(::rtl::OUString());
1315                     aFmt.SetSuffix(::rtl::OUString());
1316                 }
1317                 aNumRule.Set(static_cast<sal_uInt16>(nLevel), aFmt);
1318             }
1319         }
1320         // <--
1321 
1322         // --> OD 2008-02-08 #newlistlevelattrs#
1323         // reset indent attribute on applying list style
1324         // --> OD 2008-03-27 #refactorlists#
1325         SetCurNumRule( aNumRule, false, sContinuedListId, true );
1326         // <--
1327     }
1328     else
1329     {
1330         // --> OD 2009-08-27 #i95907#
1331         const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
1332                                     numfunc::GetDefaultPositionAndSpaceMode() );
1333         // --> OD 2008-02-11 #newlistlevelattrs#
1334         SwNumRule aNumRule( GetUniqueNumRuleName(), ePosAndSpaceMode );
1335         // <--
1336         // <--
1337         // Zeichenvorlage an die Numerierung haengen
1338         SwCharFmt* pChrFmt;
1339         SwDocShell* pDocSh = GetView().GetDocShell();
1340         // --> OD 2008-06-03 #i63395#
1341         // Only apply user defined default bullet font
1342         const Font* pFnt = numfunc::IsDefBulletFontUserDefined()
1343                            ? &numfunc::GetDefBulletFont()
1344                            : 0;
1345         // <--
1346 
1347         if (bNum)
1348         {
1349             pChrFmt = GetCharFmtFromPool( RES_POOLCHR_NUM_LEVEL );
1350         }
1351         else
1352         {
1353             pChrFmt = GetCharFmtFromPool( RES_POOLCHR_BUL_LEVEL );
1354         }
1355 
1356         const SwTxtNode* pTxtNode = GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1357         const SwTwips nWidthOfTabs = pTxtNode
1358                                      ? pTxtNode->GetWidthOfLeadingTabs()
1359                                      : 0;
1360         GetDoc()->RemoveLeadingWhiteSpace( *GetCrsr()->GetPoint() );
1361 
1362         const bool bHtml = 0 != PTR_CAST(SwWebDocShell, pDocSh);
1363         const bool bRightToLeft = IsInRightToLeftText();
1364         for( sal_uInt8 nLvl = 0; nLvl < MAXLEVEL; ++nLvl )
1365         {
1366             SwNumFmt aFmt( aNumRule.Get( nLvl ) );
1367             aFmt.SetCharFmt( pChrFmt );
1368 
1369             if (! bNum)
1370             {
1371                 // --> OD 2008-06-03 #i63395#
1372                 // Only apply user defined default bullet font
1373                 if ( pFnt )
1374                 {
1375                     aFmt.SetBulletFont( pFnt );
1376                 }
1377                 aFmt.SetBulletChar( numfunc::GetBulletChar(nLvl) );
1378                 aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
1379                 // #i93908# clear suffix for bullet lists
1380                 aFmt.SetPrefix(::rtl::OUString());
1381                 aFmt.SetSuffix(::rtl::OUString());
1382             }
1383 
1384             // --> OD 2009-08-26 #i95907#
1385             if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1386             {
1387                 if(bHtml && nLvl)
1388                 {
1389                     // 1/2" fuer HTML
1390                     aFmt.SetLSpace(720);
1391                     aFmt.SetAbsLSpace(nLvl * 720);
1392                 }
1393                 else if ( nWidthOfTabs > 0 )
1394                 {
1395                     aFmt.SetAbsLSpace(nWidthOfTabs + nLvl * 720);
1396                 }
1397             }
1398             // <--
1399 
1400             // --> FME 2005-01-21 #i38904#  Default alignment for
1401             // numbering/bullet should be rtl in rtl paragraph:
1402             if ( bRightToLeft )
1403             {
1404                 aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
1405             }
1406             // <--
1407 
1408             aNumRule.Set( nLvl, aFmt );
1409         }
1410 
1411         // --> OD 2009-08-26 #i95907#
1412         if ( pTxtNode &&
1413              ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
1414         {
1415             // --> OD 2010-01-05 #b6884103#
1416 //            short nTxtNodeFirstLineOffset( 0 );
1417 //            pTxtNode->GetFirstLineOfsWithNum( nTxtNodeFirstLineOffset );
1418 //            const SwTwips nTxtNodeIndent = pTxtNode->GetLeftMarginForTabCalculation() +
1419 //                                           nTxtNodeFirstLineOffset;
1420             const SwTwips nTxtNodeIndent = pTxtNode->GetAdditionalIndentForStartingNewList();
1421             // <--
1422             if ( ( nTxtNodeIndent + nWidthOfTabs ) != 0 )
1423             {
1424                 // --> OD 2010-05-05 #i111172#
1425                 // If text node is already inside a list, assure that the indents
1426                 // are the same. Thus, adjust the indent change value by subtracting
1427                 // indents of to be applied list style.
1428                 SwTwips nIndentChange = nTxtNodeIndent + nWidthOfTabs;
1429                 if ( pTxtNode->GetNumRule() )
1430                 {
1431                     const SwNumFmt aFmt( aNumRule.Get( 0 ) );
1432                     if ( aFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
1433                     {
1434                         nIndentChange -= aFmt.GetIndentAt() + aFmt.GetFirstLineIndent();
1435                     }
1436                 }
1437                 // <--
1438                 aNumRule.ChangeIndent( nIndentChange );
1439             }
1440         }
1441         // <--
1442         // --> OD 2008-02-08 #newlistlevelattrs#
1443         // reset indent attribute on applying list style
1444         // --> OD 2008-03-17 #refactorlists#
1445         // start new list
1446         SetCurNumRule( aNumRule, true, String(), true );
1447         // <--
1448     }
1449 
1450     EndUndo(UNDO_NUMORNONUM);
1451 }
1452 // <- #i40041#
1453 
1454 void SwWrtShell::NumOn()
1455 {
1456     NumOrBulletOn(sal_True);
1457 }
1458 
1459 void SwWrtShell::NumOrBulletOff()
1460 {
1461     const SwNumRule * pCurNumRule = GetCurNumRule();
1462 
1463     if (pCurNumRule)
1464     {
1465         if (pCurNumRule->IsOutlineRule())
1466         {
1467             SwNumRule aNumRule(*pCurNumRule);
1468 
1469             SwTxtNode * pTxtNode =
1470                 GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1471 
1472             if (pTxtNode)
1473             {
1474                 sal_uInt16 nLevel = sal::static_int_cast<sal_uInt16, sal_Int32>(pTxtNode->GetActualListLevel());
1475                 SwNumFmt aFmt(aNumRule.Get(nLevel));
1476 
1477                 aFmt.SetNumberingType(SVX_NUM_NUMBER_NONE);
1478                 aNumRule.Set(nLevel, aFmt);
1479 
1480                 // --> OD 2008-03-17 #refactorlists#
1481                 // no start or continuation of a list - the outline style is only changed.
1482                 SetCurNumRule( aNumRule, false );
1483                 // <--
1484             }
1485         }
1486         else
1487         {
1488             DelNumRules();
1489         }
1490 
1491         // --> OD 2005-10-24 #126346# - Cursor can not be anymore in front of
1492         // a label, because numbering/bullet is switched off.
1493         SetInFrontOfLabel( sal_False );
1494         // <--
1495     }
1496 }
1497 // <- #i29560#
1498 
1499 /*------------------------------------------------------------------------
1500  Beschreibung:  Default-Bulletliste erfragen
1501 ------------------------------------------------------------------------*/
1502 
1503 void SwWrtShell::BulletOn()
1504 {
1505     NumOrBulletOn(sal_False);
1506 }
1507 
1508 
1509 /*--------------------------------------------------
1510 
1511 --------------------------------------------------*/
1512 SelectionType SwWrtShell::GetSelectionType() const
1513 {
1514     // ContentType kann nicht ermittelt werden innerhalb einer
1515     // Start-/Endactionklammerung.
1516     // Da es keinen ungueltigen Wert gibt, wird TEXT geliefert.
1517     // Der Wert ist egal, da in EndAction ohnehin aktualisiert wird.
1518 
1519     if ( BasicActionPend() )
1520         return IsSelFrmMode() ? nsSelectionType::SEL_FRM : nsSelectionType::SEL_TXT;
1521 
1522 //  if ( IsTableMode() )
1523 //      return nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS;
1524 
1525     SwView &_rView = ((SwView&)GetView());
1526     if (_rView.GetPostItMgr() && _rView.GetPostItMgr()->HasActiveSidebarWin() )
1527         return nsSelectionType::SEL_POSTIT;
1528     int nCnt;
1529 
1530     // Rahmen einfuegen ist kein DrawMode
1531     if ( !_rView.GetEditWin().IsFrmAction() &&
1532             (IsObjSelected() || (_rView.IsDrawMode() && !IsFrmSelected()) ))
1533     {
1534         if (GetDrawView()->IsTextEdit())
1535             nCnt = nsSelectionType::SEL_DRW_TXT;
1536         else
1537         {
1538             if (GetView().IsFormMode()) // Nur Forms selektiert
1539                 nCnt = nsSelectionType::SEL_DRW_FORM;
1540             else
1541                 nCnt = nsSelectionType::SEL_DRW;            // Irgendein Draw-Objekt
1542 
1543             if (_rView.IsBezierEditMode())
1544                 nCnt |= nsSelectionType::SEL_BEZ;
1545             else if( GetDrawView()->GetContext() == SDRCONTEXT_MEDIA )
1546                 nCnt |= nsSelectionType::SEL_MEDIA;
1547 
1548             if (svx::checkForSelectedCustomShapes(
1549                     const_cast<SdrView *>(GetDrawView()),
1550                     true /* bOnlyExtruded */ ))
1551             {
1552                 nCnt |= nsSelectionType::SEL_EXTRUDED_CUSTOMSHAPE;
1553             }
1554             sal_uInt32 nCheckStatus = 0;
1555             if (svx::checkForSelectedFontWork(
1556                     const_cast<SdrView *>(GetDrawView()), nCheckStatus ))
1557             {
1558                 nCnt |= nsSelectionType::SEL_FONTWORK;
1559             }
1560         }
1561 
1562         return nCnt;
1563     }
1564 
1565     nCnt = GetCntType();
1566 
1567     if ( IsFrmSelected() )
1568     {
1569         if (_rView.IsDrawMode())
1570             _rView.LeaveDrawCreate();   // Aufraeumen (Bug #45639)
1571         if ( !(nCnt & (CNT_GRF | CNT_OLE)) )
1572             return nsSelectionType::SEL_FRM;
1573     }
1574 
1575     if ( IsCrsrInTbl() )
1576         nCnt |= nsSelectionType::SEL_TBL;
1577 
1578     if ( IsTableMode() )
1579         nCnt |= (nsSelectionType::SEL_TBL | nsSelectionType::SEL_TBL_CELLS);
1580 
1581     // --> FME 2005-01-12 #i39855#
1582     // Do not pop up numbering toolbar, if the text node has a numbering
1583     // of type SVX_NUM_NUMBER_NONE.
1584     const SwNumRule* pNumRule = GetCurNumRule();
1585     if ( pNumRule )
1586     {
1587         const SwTxtNode* pTxtNd =
1588             GetCrsr()->GetPoint()->nNode.GetNode().GetTxtNode();
1589 
1590         // --> OD 2008-03-19 #refactorlists#
1591         if ( pTxtNd && pTxtNd->IsInList() )
1592         // <--
1593         {
1594             const SwNumFmt& rFmt = pNumRule->Get(sal::static_int_cast< sal_uInt8, sal_Int32>(pTxtNd->GetActualListLevel()));
1595             if ( SVX_NUM_NUMBER_NONE != rFmt.GetNumberingType() )
1596                 nCnt |= nsSelectionType::SEL_NUM;
1597         }
1598     }
1599     // <--
1600 
1601     return nCnt;
1602 }
1603 
1604 /*------------------------------------------------------------------------
1605  Beschreibung:  Finden der TextCollection mit dem Name rCollname
1606  Return:                Pointer auf die Collection oder 0, wenn keine
1607                                 TextCollection mit diesem Namen existiert oder
1608                                 diese eine Defaultvorlage ist.
1609 ------------------------------------------------------------------------*/
1610 
1611 
1612 SwTxtFmtColl *SwWrtShell::GetParaStyle(const String &rCollName, GetStyle eCreate )
1613 {
1614     SwTxtFmtColl* pColl = FindTxtFmtCollByName( rCollName );
1615     if( !pColl && GETSTYLE_NOCREATE != eCreate )
1616     {
1617         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rCollName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
1618         if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
1619             pColl = GetTxtCollFromPool( nId );
1620     }
1621     return pColl;
1622 }
1623 /*------------------------------------------------------------------------
1624  Beschreibung:  Finden der Zeichenvorlage mit dem Name rCollname
1625  Return:                Pointer auf die Collection oder 0, wenn keine
1626                                 Zeichenvorlage mit diesem Namen existiert oder
1627                                 diese eine Defaultvorlage oder automatische Vorlage ist.
1628 ------------------------------------------------------------------------*/
1629 
1630 
1631 
1632 SwCharFmt *SwWrtShell::GetCharStyle(const String &rFmtName, GetStyle eCreate )
1633 {
1634     SwCharFmt* pFmt = FindCharFmtByName( rFmtName );
1635     if( !pFmt && GETSTYLE_NOCREATE != eCreate )
1636     {
1637         sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rFmtName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
1638         if( USHRT_MAX != nId || GETSTYLE_CREATEANY == eCreate )
1639             pFmt = (SwCharFmt*)GetFmtFromPool( nId );
1640     }
1641     return pFmt;
1642 }
1643 
1644 /*------------------------------------------------------------------------
1645  Beschreibung:  Finden des Tabellenformates mit dem Name rFmtname
1646  Return:                Pointer auf das Format oder 0, wenn kein
1647                                 Rahmenformat mit diesem Namen existiert oder
1648                                 dieses eine Defaultformat oder automatisches Format ist.
1649 ------------------------------------------------------------------------*/
1650 
1651 
1652 
1653 SwFrmFmt *SwWrtShell::GetTblStyle(const String &rFmtName)
1654 {
1655     SwFrmFmt *pFmt = 0;
1656     for( sal_uInt16 i = GetTblFrmFmtCount(); i; )
1657         if( !( pFmt = &GetTblFrmFmt( --i ) )->IsDefault() &&
1658             pFmt->GetName() == rFmtName && IsUsed( *pFmt ) )
1659             return pFmt;
1660     return 0;
1661 }
1662 
1663 
1664 /*------------------------------------------------------------------------
1665  Beschreibung:  Anwenden der Vorlagen
1666 ------------------------------------------------------------------------*/
1667 
1668 
1669 
1670 void SwWrtShell::SetPageStyle(const String &rCollName)
1671 {
1672     if( !SwCrsrShell::HasSelection() && !IsSelFrmMode() && !IsObjSelected() )
1673     {
1674         SwPageDesc* pDesc = FindPageDescByName( rCollName, sal_True );
1675         if( pDesc )
1676             ChgCurPageDesc( *pDesc );
1677     }
1678 }
1679 
1680 /*------------------------------------------------------------------------
1681  Beschreibung:  Zugriff Vorlagen
1682 ------------------------------------------------------------------------*/
1683 
1684 
1685 
1686 String SwWrtShell::GetCurPageStyle( const sal_Bool bCalcFrm ) const
1687 {
1688     return GetPageDesc(GetCurPageDesc( bCalcFrm )).GetName();
1689 }
1690 
1691 /*------------------------------------------------------------------------
1692  Beschreibung:  Aktuelle Vorlage anhand der geltenden Attribute aendern
1693 ------------------------------------------------------------------------*/
1694 
1695 
1696 void SwWrtShell::QuickUpdateStyle()
1697 {
1698     SwTxtFmtColl *pColl = GetCurTxtFmtColl();
1699 
1700     // Standard kann nicht geaendert werden
1701     if(pColl && !pColl->IsDefault())
1702     {
1703         FillByEx(pColl);
1704             // Vorlage auch anwenden, um harte Attributierung
1705             // zu entfernen
1706         SetTxtFmtColl(pColl);
1707     }
1708 }
1709 
1710 
1711 void SwWrtShell::AutoUpdatePara(SwTxtFmtColl* pColl, const SfxItemSet& rStyleSet)
1712 {
1713     SfxItemSet aCoreSet( GetAttrPool(),
1714             RES_CHRATR_BEGIN,           RES_CHRATR_END - 1,
1715             RES_PARATR_BEGIN,           RES_PARATR_END - 1,
1716             RES_FRMATR_BEGIN,           RES_FRMATR_END - 1,
1717             SID_ATTR_TABSTOP_POS,       SID_ATTR_TABSTOP_POS,
1718             SID_ATTR_TABSTOP_DEFAULTS,  SID_ATTR_TABSTOP_DEFAULTS,
1719             SID_ATTR_TABSTOP_OFFSET,    SID_ATTR_TABSTOP_OFFSET,
1720             SID_ATTR_BORDER_INNER,      SID_ATTR_BORDER_INNER,
1721             SID_ATTR_PARA_MODEL,        SID_ATTR_PARA_KEEP,
1722             SID_ATTR_PARA_PAGENUM,      SID_ATTR_PARA_PAGENUM,
1723             0   );
1724     GetCurAttr( aCoreSet );
1725     sal_Bool bReset = sal_False;
1726     SfxItemIter aParaIter( aCoreSet );
1727     const SfxPoolItem* pParaItem = aParaIter.FirstItem();
1728     while( pParaItem )
1729     {
1730         if(!IsInvalidItem(pParaItem))
1731         {
1732             sal_uInt16 nWhich = pParaItem->Which();
1733             if(SFX_ITEM_SET == aCoreSet.GetItemState(nWhich) &&
1734                SFX_ITEM_SET == rStyleSet.GetItemState(nWhich))
1735             {
1736                 aCoreSet.ClearItem(nWhich);
1737                 bReset = sal_True;
1738             }
1739         }
1740         pParaItem = aParaIter.NextItem();
1741     }
1742     StartAction();
1743     if(bReset)
1744     {
1745         ResetAttr();
1746         SetAttr(aCoreSet);
1747     }
1748     pDoc->ChgFmt(*pColl, rStyleSet );
1749     EndAction();
1750 }
1751 
1752 /*-----------------12.03.97 12.24-------------------
1753 
1754 --------------------------------------------------*/
1755 
1756 void SwWrtShell::AutoUpdateFrame( SwFrmFmt* pFmt, const SfxItemSet& rStyleSet )
1757 {
1758     StartAction();
1759 
1760     ResetFlyFrmAttr( 0, &rStyleSet );
1761     pFmt->SetFmtAttr( rStyleSet );
1762 
1763     EndAction();
1764 }
1765 
1766 
1767 void SwWrtShell::AutoCorrect( SvxAutoCorrect& rACorr, sal_Unicode cChar )
1768 {
1769     ResetCursorStack();
1770     if(_CanInsert())
1771     {
1772         sal_Bool bStarted = sal_False;
1773         if(HasSelection())
1774         {
1775                 // nur hier klammern, da das normale Insert schon an der
1776                 // Editshell geklammert ist
1777             StartAllAction();
1778             StartUndo(UNDO_INSERT);
1779             bStarted = sal_True;
1780             DelRight();
1781         }
1782         SwEditShell::AutoCorrect( rACorr, IsInsMode(), cChar );
1783 
1784         if(bStarted)
1785         {
1786             EndAllAction();
1787             EndUndo(UNDO_INSERT);
1788         }
1789     }
1790 }
1791 
1792 
1793 /*
1794  * eine Art kontrollierter copy ctor
1795  */
1796 
1797 SwWrtShell::SwWrtShell( SwWrtShell& rSh, Window *_pWin, SwView &rShell )
1798     : SwFEShell( rSh, _pWin ),
1799      COMMON_INI_LIST
1800 {
1801     BITFLD_INI_LIST
1802     SET_CURR_SHELL( this );
1803 
1804     SetSfxViewShell( (SfxViewShell *)&rShell );
1805     SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
1806 
1807     // place the cursor on the first field...
1808     IFieldmark *pBM = NULL;
1809     if ( IsFormProtected() && ( pBM = GetFieldmarkAfter( ) ) !=NULL ) {
1810         GotoFieldmark(pBM);
1811     }
1812 }
1813 
1814 
1815 SwWrtShell::SwWrtShell( SwDoc& rDoc, Window *_pWin, SwView &rShell,
1816                         const SwViewOption *pViewOpt )
1817     : SwFEShell( rDoc, _pWin, pViewOpt),
1818       COMMON_INI_LIST
1819 {
1820     BITFLD_INI_LIST
1821     SET_CURR_SHELL( this );
1822     SetSfxViewShell( (SfxViewShell *)&rShell );
1823     SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
1824 }
1825 
1826 /*
1827  * ctor
1828  */
1829 
1830 
1831 
1832 SwWrtShell::~SwWrtShell()
1833 {
1834     SET_CURR_SHELL( this );
1835     while(IsModePushed())
1836         PopMode();
1837     while(PopCrsr(sal_False))
1838         ;
1839     SwTransferable::ClearSelection( *this );
1840 }
1841 
1842 sal_Bool SwWrtShell::Pop( sal_Bool bOldCrsr )
1843 {
1844     sal_Bool bRet = SwCrsrShell::Pop( bOldCrsr );
1845     if( bRet && IsSelection() )
1846     {
1847         fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
1848         fnKillSel = &SwWrtShell::ResetSelect;
1849     }
1850     return bRet;
1851 }
1852 
1853 /*--------------------------------------------------------------------
1854     Beschreibung:
1855  --------------------------------------------------------------------*/
1856 sal_Bool SwWrtShell::CanInsert()
1857 {
1858     return (!(IsSelFrmMode() | IsObjSelected() | (GetView().GetDrawFuncPtr() != NULL) | (GetView().GetPostItMgr()->GetActiveSidebarWin()!= NULL)));
1859 }
1860 
1861 // die Core erzeugt eine Selektion, das SttSelect muss gerufen werden
1862 void SwWrtShell::NewCoreSelection()
1863 {
1864     SttSelect();
1865 }
1866 
1867 // --------------
1868 void SwWrtShell::ChgDBData(const SwDBData& aDBData)
1869 {
1870     SwEditShell::ChgDBData(aDBData);
1871     //notify the db-beamer if available
1872     GetView().NotifyDBChanged();
1873 }
1874 
1875 String SwWrtShell::GetSelDescr() const
1876 {
1877     String aResult;
1878 
1879     int nSelType = GetSelectionType();
1880     switch (nSelType)
1881     {
1882     case nsSelectionType::SEL_GRF:
1883         aResult = SW_RES(STR_GRAPHIC);
1884 
1885         break;
1886     case nsSelectionType::SEL_FRM:
1887         {
1888             const SwFrmFmt * pFrmFmt = GetCurFrmFmt();
1889 
1890             if (pFrmFmt)
1891                 aResult = pFrmFmt->GetDescription();
1892         }
1893         break;
1894     case nsSelectionType::SEL_DRW:
1895         {
1896             aResult = SW_RES(STR_DRAWING_OBJECTS);
1897         }
1898         break;
1899     default:
1900         if (0 != pDoc)
1901             aResult = GetCrsrDescr();
1902     }
1903 
1904     return aResult;
1905 }
1906 
1907 void SwWrtShell::ApplyViewOptions( const SwViewOption &rOpt )
1908 {
1909     SwFEShell::ApplyViewOptions( rOpt );
1910     //#i115062# invalidate meta character slot
1911     GetView().GetViewFrame()->GetBindings().Invalidate( FN_VIEW_META_CHARS );
1912 }
1913 
1914 
1915