xref: /AOO41X/main/sw/source/ui/uiview/viewdraw.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include "hintids.hxx"
29 #include <svl/aeitem.hxx>
30 #include <svl/itempool.hxx>
31 #include <svx/svdobj.hxx>
32 #include <svx/svdview.hxx>
33 #include <svx/svdpage.hxx>
34 #include <editeng/editview.hxx>
35 #include <editeng/editeng.hxx>
36 #include <editeng/outliner.hxx>
37 #include <svx/fmview.hxx>
38 #include <svx/dataaccessdescriptor.hxx>
39 #include <sfx2/viewfrm.hxx>
40 #include <doc.hxx>
41 #include <editeng/langitem.hxx>
42 #include <linguistic/lngprops.hxx>
43 #include <editeng/unolingu.hxx>
44 #include <svx/fontworkbar.hxx>
45 #include <svx/fontworkgallery.hxx>
46 #include <editeng/eeitem.hxx>
47 #include <svx/svdogrp.hxx>
48 #include <svx/svdetc.hxx>
49 #include <editeng/editstat.hxx>
50 #include <sfx2/request.hxx>
51 #include <sfx2/bindings.hxx>
52 #include <sfx2/printer.hxx>
53 #include <svx/fmglob.hxx>
54 #include <sfx2/dispatch.hxx>
55 #include <svx/svdoutl.hxx>
56 
57 #include "view.hxx"
58 #include "wrtsh.hxx"
59 #include "viewopt.hxx"
60 #include "cmdid.h"
61 #include "drawsh.hxx"
62 #include "drwbassh.hxx"
63 #include "beziersh.hxx"
64 #include "conrect.hxx"
65 #include "conpoly.hxx"
66 #include "conarc.hxx"
67 #include "conform.hxx"
68 #include "concustomshape.hxx"
69 #include "dselect.hxx"
70 #include "edtwin.hxx"
71 
72 // #108784#
73 #include <dcontact.hxx>
74 
75 // #108784#
76 #include <svx/svdpagv.hxx>
77 #include <svx/extrusionbar.hxx>
78 #include <vcl/svapp.hxx>
79 
80 using namespace ::com::sun::star;
81 /*--------------------------------------------------------------------
82     Beschreibung:   Drawing-Ids ausfuehren
83  --------------------------------------------------------------------*/
84 
ExecDraw(SfxRequest & rReq)85 void SwView::ExecDraw(SfxRequest& rReq)
86 {
87     const SfxItemSet *pArgs = rReq.GetArgs();
88     const SfxPoolItem* pItem;
89     const SfxAllEnumItem* pEItem = 0;
90     const SfxStringItem* pStringItem = 0;
91     SdrView *pSdrView = pWrtShell->GetDrawView();
92     sal_Bool bDeselect = sal_False;
93 
94     sal_uInt16 nSlotId = rReq.GetSlot();
95     if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(GetPool().GetWhich(nSlotId), sal_False, &pItem))
96     {
97         pEItem = dynamic_cast< const SfxAllEnumItem*>(pItem);
98         pStringItem = dynamic_cast< const SfxStringItem*>(pItem);
99     }
100 
101     if (SID_INSERT_DRAW == nSlotId && pEItem)
102         switch ( pEItem->GetValue() )
103         {
104             case SVX_SNAP_DRAW_SELECT:              nSlotId = SID_OBJECT_SELECT;            break;
105             case SVX_SNAP_DRAW_LINE:                nSlotId = SID_DRAW_LINE;                break;
106             case SVX_SNAP_DRAW_RECT:                nSlotId = SID_DRAW_RECT;                break;
107             case SVX_SNAP_DRAW_ELLIPSE:             nSlotId = SID_DRAW_ELLIPSE;             break;
108             case SVX_SNAP_DRAW_POLYGON_NOFILL:      nSlotId = SID_DRAW_POLYGON_NOFILL;      break;
109             case SVX_SNAP_DRAW_BEZIER_NOFILL:       nSlotId = SID_DRAW_BEZIER_NOFILL;       break;
110             case SVX_SNAP_DRAW_FREELINE_NOFILL:     nSlotId = SID_DRAW_FREELINE_NOFILL;     break;
111             case SVX_SNAP_DRAW_ARC:                 nSlotId = SID_DRAW_ARC;                 break;
112             case SVX_SNAP_DRAW_PIE:                 nSlotId = SID_DRAW_PIE;                 break;
113             case SVX_SNAP_DRAW_CIRCLECUT:           nSlotId = SID_DRAW_CIRCLECUT;           break;
114             case SVX_SNAP_DRAW_TEXT:                nSlotId = SID_DRAW_TEXT;                break;
115             case SVX_SNAP_DRAW_TEXT_VERTICAL:       nSlotId = SID_DRAW_TEXT_VERTICAL;       break;
116             case SVX_SNAP_DRAW_TEXT_MARQUEE:        nSlotId = SID_DRAW_TEXT_MARQUEE;        break;
117             case SVX_SNAP_DRAW_CAPTION:             nSlotId = SID_DRAW_CAPTION;             break;
118             case SVX_SNAP_DRAW_CAPTION_VERTICAL:    nSlotId = SID_DRAW_CAPTION_VERTICAL;    break;
119         }
120 
121     if (nSlotId == SID_OBJECT_SELECT && nFormSfxId == nSlotId)
122     {
123         bDeselect = sal_True;
124     }
125     else if (nSlotId == SID_FM_CREATE_CONTROL)
126     {
127         SFX_REQUEST_ARG( rReq, pIdentifierItem, SfxUInt16Item, SID_FM_CONTROL_IDENTIFIER, sal_False );
128         if( pIdentifierItem )
129         {
130             sal_uInt16 nNewId = pIdentifierItem->GetValue();
131             if (nNewId == nFormSfxId)
132             {
133                 bDeselect = sal_True;
134                 GetViewFrame()->GetDispatcher()->Execute(SID_FM_LEAVE_CREATE);  // Button soll rauspoppen
135             }
136         }
137     }
138     else if( nSlotId == SID_FM_CREATE_FIELDCONTROL)
139     {
140         FmFormView* pFormView = PTR_CAST( FmFormView, pSdrView );
141         if ( pFormView )
142         {
143             SFX_REQUEST_ARG( rReq, pDescriptorItem, SfxUnoAnyItem, SID_FM_DATACCESS_DESCRIPTOR, sal_False );
144             DBG_ASSERT( pDescriptorItem, "SwView::ExecDraw(SID_FM_CREATE_FIELDCONTROL): invalid request args!" );
145             if( pDescriptorItem )
146             {
147                 ::svx::ODataAccessDescriptor aDescriptor( pDescriptorItem->GetValue() );
148                 SdrObject* pObj = pFormView->CreateFieldControl( aDescriptor );
149 
150                 if ( pObj )
151                 {
152                     Size aDocSize(pWrtShell->GetDocSize());
153                     const SwRect& rVisArea = pWrtShell->VisArea();
154                     Point aStartPos = rVisArea.Center();
155                     if(rVisArea.Width() > aDocSize.Width())
156                         aStartPos.X() = aDocSize.Width() / 2 + rVisArea.Left();
157                     if(rVisArea.Height() > aDocSize.Height())
158                         aStartPos.Y() = aDocSize.Height() / 2 + rVisArea.Top();
159 
160                     //determine the size of the object
161                     if(pObj->IsGroupObject())
162                     {
163                         const Rectangle& rBoundRect = ((SdrObjGroup*)pObj)->GetCurrentBoundRect();
164                         aStartPos.X() -= rBoundRect.GetWidth()/2;
165                         aStartPos.Y() -= rBoundRect.GetHeight()/2;
166                     }
167 
168                     // TODO: unmark all other
169                     pWrtShell->EnterStdMode();
170                     pWrtShell->SwFEShell::InsertDrawObj( *pObj, aStartPos );
171                 }
172             }
173         }
174     }
175     else if ( nSlotId == SID_FONTWORK_GALLERY_FLOATER )
176     {
177         Window*  pWin = &( pWrtShell->GetView().GetViewFrame()->GetWindow() );
178 
179         if ( pWin )
180             pWin->EnterWait();
181 
182         if( !pWrtShell->HasDrawView() )
183             pWrtShell->MakeDrawView();
184 
185         pSdrView = pWrtShell->GetDrawView();
186         if ( pSdrView )
187         {
188             SdrObject* pObj = NULL;
189             svx::FontWorkGalleryDialog aDlg( pSdrView, pWin, nSlotId );
190             aDlg.SetSdrObjectRef( &pObj, pSdrView->GetModel() );
191             aDlg.Execute();
192             if ( pObj )
193             {
194                 Size            aDocSize( pWrtShell->GetDocSize() );
195                 const SwRect&   rVisArea = pWrtShell->VisArea();
196                 Point           aPos( rVisArea.Center() );
197                 Size            aSize;
198                 Size            aPrefSize( pObj->GetSnapRect().GetSize() );
199 
200                 if( rVisArea.Width() > aDocSize.Width())
201                     aPos.X() = aDocSize.Width() / 2 + rVisArea.Left();
202 
203                 if(rVisArea.Height() > aDocSize.Height())
204                     aPos.Y() = aDocSize.Height() / 2 + rVisArea.Top();
205 
206                 if( aPrefSize.Width() && aPrefSize.Height() )
207                 {
208                     if( pWin )
209                         aSize = pWin->PixelToLogic( aPrefSize, MAP_TWIP );
210                     else
211                         aSize = Application::GetDefaultDevice()->PixelToLogic( aPrefSize, MAP_TWIP );
212                 }
213                 else
214                     aSize = Size( 2835, 2835 );
215 
216                 pWrtShell->EnterStdMode();
217                 pWrtShell->SwFEShell::InsertDrawObj( *pObj, aPos );
218                 rReq.Ignore ();
219             }
220         }
221         if( pWin )
222             pWin->LeaveWait();
223     }
224 
225     if( nSlotId == SID_DRAW_CS_ID )
226     {
227         //deselect if same custom shape is selected again
228         SwDrawBase* pFuncPtr = GetDrawFuncPtr();
229         if( pFuncPtr && pFuncPtr->GetSlotId() == SID_DRAW_CS_ID )
230         {
231             ConstCustomShape* pConstCustomShape = (ConstCustomShape*)(pFuncPtr);
232             rtl::OUString aNew = ConstCustomShape::GetShapeTypeFromRequest( rReq );
233             rtl::OUString aOld = pConstCustomShape->GetShapeType();
234             if( aNew == aOld )
235             {
236                 bDeselect = true;
237             }
238         }
239     }
240 
241     //deselect if same shape is selected again (but different custom shapes do have same slot id)
242     if ( bDeselect || (nSlotId == nDrawSfxId &&
243             (!pStringItem || (pStringItem->GetValue() == sDrawCustom))
244                 && (nSlotId != SID_DRAW_CS_ID) ) )
245     {
246         if (GetDrawFuncPtr())
247         {
248             GetDrawFuncPtr()->Deactivate();
249             SetDrawFuncPtr(NULL);
250         }
251 
252         if (pWrtShell->IsObjSelected() && !pWrtShell->IsSelFrmMode())
253             pWrtShell->EnterSelFrmMode(NULL);
254         LeaveDrawCreate();
255 
256         GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
257 
258         AttrChangedNotify(pWrtShell);
259         return;
260     }
261 
262     LeaveDrawCreate();
263 
264     if (pWrtShell->IsFrmSelected())
265         pWrtShell->EnterStdMode();  // wegen Bug #45639
266 
267     SwDrawBase* pFuncPtr = NULL;
268 
269     switch (nSlotId)
270     {
271         case SID_OBJECT_SELECT:
272         case SID_DRAW_SELECT:
273             pFuncPtr = new DrawSelection(pWrtShell, pEditWin, this);
274             nDrawSfxId = nFormSfxId = SID_OBJECT_SELECT;
275             sDrawCustom.Erase();
276             break;
277 
278         case SID_DRAW_LINE:
279         case SID_DRAW_RECT:
280         case SID_DRAW_ELLIPSE:
281         case SID_DRAW_TEXT:
282         case SID_DRAW_TEXT_VERTICAL:
283         case SID_DRAW_TEXT_MARQUEE:
284         case SID_DRAW_CAPTION:
285         case SID_DRAW_CAPTION_VERTICAL:
286             pFuncPtr = new ConstRectangle(pWrtShell, pEditWin, this);
287             nDrawSfxId = nSlotId;
288             sDrawCustom.Erase();
289             break;
290 
291         case SID_DRAW_POLYGON_NOFILL:
292         case SID_DRAW_BEZIER_NOFILL:
293         case SID_DRAW_FREELINE_NOFILL:
294             pFuncPtr = new ConstPolygon(pWrtShell, pEditWin, this);
295             nDrawSfxId = nSlotId;
296             sDrawCustom.Erase();
297             break;
298 
299         case SID_DRAW_ARC:
300         case SID_DRAW_PIE:
301         case SID_DRAW_CIRCLECUT:
302             pFuncPtr = new ConstArc(pWrtShell, pEditWin, this);
303             nDrawSfxId = nSlotId;
304             sDrawCustom.Erase();
305             break;
306 
307         case SID_FM_CREATE_CONTROL:
308         {
309             SFX_REQUEST_ARG( rReq, pIdentifierItem, SfxUInt16Item, SID_FM_CONTROL_IDENTIFIER, sal_False );
310             if( pIdentifierItem )
311                 nSlotId = pIdentifierItem->GetValue();
312             pFuncPtr = new ConstFormControl(pWrtShell, pEditWin, this);
313             nFormSfxId = nSlotId;
314         }
315         break;
316 
317         case SID_DRAWTBX_CS_BASIC :
318         case SID_DRAWTBX_CS_SYMBOL :
319         case SID_DRAWTBX_CS_ARROW :
320         case SID_DRAWTBX_CS_FLOWCHART :
321         case SID_DRAWTBX_CS_CALLOUT :
322         case SID_DRAWTBX_CS_STAR :
323         case SID_DRAW_CS_ID :
324         {
325             pFuncPtr = new ConstCustomShape(pWrtShell, pEditWin, this, rReq );
326             nDrawSfxId = nSlotId;
327             if ( nSlotId != SID_DRAW_CS_ID )
328             {
329                 if ( pStringItem )
330                 {
331                     sDrawCustom = pStringItem->GetValue();
332                     aCurrShapeEnumCommand[ nSlotId - SID_DRAWTBX_CS_BASIC ] = sDrawCustom;
333                     SfxBindings& rBind = GetViewFrame()->GetBindings();
334                     rBind.Invalidate( nSlotId );
335                     rBind.Update( nSlotId );
336                 }
337             }
338         }
339         break;
340 
341         default:
342             break;
343     }
344 
345     static sal_uInt16 __READONLY_DATA aInval[] =
346     {
347         // Slot-Ids muessen beim Aufruf von Invalidate sortiert sein!
348         SID_ATTRIBUTES_AREA,
349         SID_INSERT_DRAW,
350         0
351     };
352     GetViewFrame()->GetBindings().Invalidate(aInval);
353 
354     sal_Bool bEndTextEdit = sal_True;
355     if (pFuncPtr)
356     {
357         if (GetDrawFuncPtr())
358         {
359             GetDrawFuncPtr()->Deactivate();
360             SetDrawFuncPtr(NULL);
361         }
362 
363         SetDrawFuncPtr(pFuncPtr);
364         AttrChangedNotify(pWrtShell);
365 
366         pFuncPtr->Activate(nSlotId);
367         NoRotate();
368         if(rReq.GetModifier() == KEY_MOD1)
369         {
370             if(SID_OBJECT_SELECT == nDrawSfxId )
371             {
372                 pWrtShell->GotoObj(sal_True);
373             }
374             else
375             {
376                 pFuncPtr->CreateDefaultObject();
377                 pFuncPtr->Deactivate();
378                 SetDrawFuncPtr(NULL);
379                 LeaveDrawCreate();
380                 pWrtShell->EnterStdMode();
381                 SdrView *pTmpSdrView = pWrtShell->GetDrawView();
382                 const SdrMarkList& rMarkList = pTmpSdrView->GetMarkedObjectList();
383                 if(rMarkList.GetMarkCount() == 1 &&
384                         (SID_DRAW_TEXT == nSlotId || SID_DRAW_TEXT_VERTICAL == nSlotId ||
385                             SID_DRAW_TEXT_MARQUEE == nSlotId ))
386                 {
387                     SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
388                     BeginTextEdit(pObj);
389                     bEndTextEdit = sal_False;
390                 }
391             }
392         }
393     }
394     else
395     {
396         if (pWrtShell->IsObjSelected() && !pWrtShell->IsSelFrmMode())
397             pWrtShell->EnterSelFrmMode(NULL);
398     }
399 
400     if(bEndTextEdit && pSdrView && pSdrView->IsTextEdit())
401         pSdrView->SdrEndTextEdit( sal_True );
402 
403     AttrChangedNotify(pWrtShell);
404 }
405 
406 /*--------------------------------------------------------------------
407     Beschreibung:   Drawing beenden
408  --------------------------------------------------------------------*/
409 
410 
411 
ExitDraw()412 void SwView::ExitDraw()
413 {
414     NoRotate();
415 
416     if(pShell)
417     {
418         //#126062 # the shell may be invalid at close/reload/SwitchToViewShell
419         SfxDispatcher* pDispatch = GetViewFrame()->GetDispatcher();
420         sal_uInt16 nIdx = 0;
421         SfxShell* pTest = 0;
422         do
423         {
424             pTest = pDispatch->GetShell(nIdx++);
425         }
426         while( pTest && pTest != this && pTest != pShell);
427         if(pTest == pShell &&
428             // don't call LeaveSelFrmMode() etc. for the below,
429             // because objects may still be selected:
430             !pShell->ISA(SwDrawBaseShell) &&
431             !pShell->ISA(SwBezierShell) &&
432             !pShell->ISA(svx::ExtrusionBar) &&
433             !pShell->ISA(svx::FontworkBar))
434         {
435             SdrView *pSdrView = pWrtShell->GetDrawView();
436 
437             if (pSdrView && pSdrView->IsGroupEntered())
438             {
439                 pSdrView->LeaveOneGroup();
440                 pSdrView->UnmarkAll();
441                 GetViewFrame()->GetBindings().Invalidate(SID_ENTER_GROUP);
442             }
443 
444             if (GetDrawFuncPtr())
445             {
446                 if (pWrtShell->IsSelFrmMode())
447                     pWrtShell->LeaveSelFrmMode();
448                 GetDrawFuncPtr()->Deactivate();
449 
450                 SetDrawFuncPtr(NULL);
451                 LeaveDrawCreate();
452 
453                 GetViewFrame()->GetBindings().Invalidate(SID_INSERT_DRAW);
454             }
455             GetEditWin().SetPointer(Pointer(POINTER_TEXT));
456         }
457     }
458 }
459 
460 /*--------------------------------------------------------------------
461     Beschreibung:   Rotate-Mode abschalten
462  --------------------------------------------------------------------*/
463 
464 
465 
NoRotate()466 void SwView::NoRotate()
467 {
468     if (IsDrawRotate())
469     {
470         pWrtShell->SetDragMode(SDRDRAG_MOVE);
471         FlipDrawRotate();
472 
473         const SfxBoolItem aTmp( SID_OBJECT_ROTATE, sal_False );
474         GetViewFrame()->GetBindings().SetState( aTmp );
475     }
476 }
477 
478 /******************************************************************************
479  *  Beschreibung: DrawTextEditMode einschalten
480  ******************************************************************************/
481 
EnterDrawTextMode(const Point & aDocPos)482 sal_Bool SwView::EnterDrawTextMode(const Point& aDocPos)
483 {
484     SdrObject* pObj;
485     SdrPageView* pPV;
486     SwWrtShell *pSh = &GetWrtShell();
487     SdrView *pSdrView = pSh->GetDrawView();
488     ASSERT( pSdrView, "EnterDrawTextMode without DrawView?" );
489 
490     sal_Bool bReturn = sal_False;
491 
492     sal_uInt16 nOld = pSdrView->GetHitTolerancePixel();
493     pSdrView->SetHitTolerancePixel( 2 );
494 
495     if( pSdrView->IsMarkedHit( aDocPos ) &&
496         !pSdrView->PickHandle( aDocPos ) && IsTextTool() &&
497         pSdrView->PickObj( aDocPos, pSdrView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKTEXTEDIT ) &&
498 
499         // #108784#
500         // To allow SwDrawVirtObj text objects to be activated, allow their type, too.
501         //pObj->ISA( SdrTextObj ) &&
502         ( pObj->ISA( SdrTextObj ) ||
503           ( pObj->ISA(SwDrawVirtObj) &&
504             ((SwDrawVirtObj*)pObj)->GetReferencedObj().ISA(SdrTextObj) ) ) &&
505 
506         !pWrtShell->IsSelObjProtected(FLYPROTECT_CONTENT))
507     {
508         bReturn = BeginTextEdit( pObj, pPV, pEditWin, sal_False );
509     }
510 
511     pSdrView->SetHitTolerancePixel( nOld );
512 
513     return bReturn;
514 }
515 
516 /******************************************************************************
517  *  Beschreibung: DrawTextEditMode einschalten
518  ******************************************************************************/
BeginTextEdit(SdrObject * pObj,SdrPageView * pPV,Window * pWin,bool bIsNewObj,bool bSetSelectionToStart)519 sal_Bool SwView::BeginTextEdit(SdrObject* pObj, SdrPageView* pPV, Window* pWin,
520         bool bIsNewObj, bool bSetSelectionToStart)
521 {
522     SwWrtShell *pSh = &GetWrtShell();
523     SdrView *pSdrView = pSh->GetDrawView();
524     SdrOutliner* pOutliner = ::SdrMakeOutliner(OUTLINERMODE_TEXTOBJECT, pSdrView->GetModel());
525     uno::Reference< linguistic2::XSpellChecker1 >  xSpell( ::GetSpellChecker() );
526     if (pOutliner)
527     {
528         pOutliner->SetRefDevice(pSh->getIDocumentDeviceAccess()->getReferenceDevice(false));
529         pOutliner->SetSpeller(xSpell);
530         uno::Reference<linguistic2::XHyphenator> xHyphenator( ::GetHyphenator() );
531         pOutliner->SetHyphenator( xHyphenator );
532         pSh->SetCalcFieldValueHdl(pOutliner);
533 
534         sal_uInt32 nCntrl = pOutliner->GetControlWord();
535         nCntrl |= EE_CNTRL_ALLOWBIGOBJS;
536         nCntrl |= EE_CNTRL_URLSFXEXECUTE;
537 
538         const SwViewOption *pOpt = pSh->GetViewOptions();
539 
540         if (SwViewOption::IsFieldShadings())
541             nCntrl |= EE_CNTRL_MARKFIELDS;
542         else
543             nCntrl &= ~EE_CNTRL_MARKFIELDS;
544 
545         if (pOpt->IsOnlineSpell())
546             nCntrl |= EE_CNTRL_ONLINESPELLING;
547         else
548             nCntrl &= ~EE_CNTRL_ONLINESPELLING;
549 
550         pOutliner->SetControlWord(nCntrl);
551         const SfxPoolItem& rItem = pSh->GetDoc()->GetDefault(RES_CHRATR_LANGUAGE);
552         pOutliner->SetDefaultLanguage(((const SvxLanguageItem&)rItem).GetLanguage());
553 
554         if( bIsNewObj )
555             pOutliner->SetVertical( SID_DRAW_TEXT_VERTICAL == nDrawSfxId ||
556                                     SID_DRAW_CAPTION_VERTICAL == nDrawSfxId );
557         // #i7672#
558         // No longer necessary, see text below
559         // Color aBackground(pSh->GetShapeBackgrd());
560         // pOutliner->SetBackgroundColor(aBackground);
561 
562         // OD 09.12.2002 #103045# - set default horizontal text direction at outliner
563         EEHorizontalTextDirection aDefHoriTextDir =
564             pSh->IsShapeDefaultHoriTextDirR2L() ? EE_HTEXTDIR_R2L : EE_HTEXTDIR_L2R;
565         pOutliner->SetDefaultHorizontalTextDirection( aDefHoriTextDir );
566     }
567 
568     // #108784#
569     // To allow editing the referenced object from a SwDrawVirtObj here
570     // the original needs to be fetched evenually. This ATM activates the
571     // text edit mode for the original object.
572     SdrObject* pToBeActivated = pObj;
573 
574     // #108784#
575     // Always the original object is edited. To allow the TextEdit to happen
576     // where the VirtObj is positioned, on demand a occurring offset is set at
577     // the TextEdit object. That offset is used for creating and managing the
578     // OutlinerView.
579     Point aNewTextEditOffset(0, 0);
580 
581     if(pObj->ISA(SwDrawVirtObj))
582     {
583         SwDrawVirtObj* pVirtObj = (SwDrawVirtObj*)pObj;
584         pToBeActivated = &((SdrObject&)pVirtObj->GetReferencedObj());
585         aNewTextEditOffset = pVirtObj->GetOffset();
586     }
587 
588     // set in each case, thus it will be correct for all objects
589     ((SdrTextObj*)pToBeActivated)->SetTextEditOffset(aNewTextEditOffset);
590 
591     sal_Bool bRet(pSdrView->SdrBeginTextEdit( pToBeActivated, pPV, pWin, sal_True, pOutliner, 0, sal_False, sal_False, sal_False ));
592 
593     // #i7672#
594     // Since SdrBeginTextEdit actually creates the OutlinerView and thus also
595     // sets the background color, an own background color needs to be set
596     // after TextEditing was started. This is now done here.
597     if(bRet)
598     {
599         OutlinerView* pView = pSdrView->GetTextEditOutlinerView();
600 
601         if(pView)
602         {
603             Color aBackground(pSh->GetShapeBackgrd());
604             pView->SetBackgroundColor(aBackground);
605         }
606 
607         // editing should start at the end of text, spell checking at the beginning ...
608         ESelection aNewSelection(EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND, EE_PARA_NOT_FOUND, EE_INDEX_NOT_FOUND);
609         if (bSetSelectionToStart)
610             aNewSelection = ESelection();
611         pView->SetSelection(aNewSelection);
612     }
613 
614     return bRet;
615 }
616 
617 /******************************************************************************
618  *  Beschreibung: Ist ein DrawTextObjekt selektiert?
619  ******************************************************************************/
620 
621 
622 
IsTextTool() const623 sal_Bool SwView::IsTextTool() const
624 {
625     sal_uInt16 nId;
626     sal_uInt32 nInvent;
627     SdrView *pSdrView = GetWrtShell().GetDrawView();
628     ASSERT( pSdrView, "IsTextTool without DrawView?" );
629 
630     if (pSdrView->IsCreateMode())
631         pSdrView->SetCreateMode(sal_False);
632 
633     pSdrView->TakeCurrentObj(nId,nInvent);
634     return (nInvent==SdrInventor);
635 }
636 
637 /*--------------------------------------------------------------------
638     Beschreibung:
639  --------------------------------------------------------------------*/
640 
641 
642 
GetDrawView() const643 SdrView* SwView::GetDrawView() const
644 {
645     return GetWrtShell().GetDrawView();
646 }
647 
648 /*--------------------------------------------------------------------
649     Beschreibung:
650  --------------------------------------------------------------------*/
651 
652 
653 
IsBezierEditMode()654 sal_Bool SwView::IsBezierEditMode()
655 {
656     return (!IsDrawSelMode() && GetWrtShell().GetDrawView()->HasMarkablePoints());
657 }
658 
659 /*--------------------------------------------------------------------
660     Beschreibung:
661  --------------------------------------------------------------------*/
662 
IsFormMode() const663 sal_Bool SwView::IsFormMode() const
664 {
665     if (GetDrawFuncPtr() && GetDrawFuncPtr()->IsCreateObj())
666     {
667         return (GetDrawFuncPtr()->IsInsertForm());
668     }
669 
670     return AreOnlyFormsSelected();
671 }
672 
673 /*--------------------------------------------------------------------
674     Beschreibung:
675  --------------------------------------------------------------------*/
676 
677 
678 
SetDrawFuncPtr(SwDrawBase * pFuncPtr)679 void SwView::SetDrawFuncPtr(SwDrawBase* pFuncPtr)
680 {
681     if (pDrawActual)
682         delete pDrawActual;
683     pDrawActual = pFuncPtr;
684 }
685 
686 /*--------------------------------------------------------------------
687     Beschreibung:
688  --------------------------------------------------------------------*/
689 
SetSelDrawSlot()690 void SwView::SetSelDrawSlot()
691 {
692     nDrawSfxId = SID_OBJECT_SELECT;
693     sDrawCustom.Erase();
694 }
695 
696 /*--------------------------------------------------------------------
697     Beschreibung:
698  --------------------------------------------------------------------*/
699 
AreOnlyFormsSelected() const700 sal_Bool SwView::AreOnlyFormsSelected() const
701 {
702     if ( GetWrtShell().IsFrmSelected() )
703         return sal_False;
704 
705     sal_Bool bForm = sal_True;
706 
707     SdrView* pSdrView = GetWrtShell().GetDrawView();
708 
709     const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList();
710     sal_uInt32 nCount = rMarkList.GetMarkCount();
711 
712     if (nCount)
713     {
714         for (sal_uInt32 i = 0; i < nCount; i++)
715         {
716             // Sind ausser Controls noch normale Draw-Objekte selektiert?
717             SdrObject *pSdrObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
718 
719             if (!HasOnlyObj(pSdrObj, FmFormInventor))
720             {
721                 bForm = sal_False;
722                 break;
723             }
724         }
725     }
726     else
727         bForm = sal_False;
728 
729     return bForm;
730 }
731 
732 /*--------------------------------------------------------------------
733     Beschreibung:
734  --------------------------------------------------------------------*/
735 
HasDrwObj(SdrObject * pSdrObj) const736 sal_Bool SwView::HasDrwObj(SdrObject *pSdrObj) const
737 {
738     sal_Bool bRet = sal_False;
739 
740     if (pSdrObj->IsGroupObject())
741     {
742         SdrObjList* pList = pSdrObj->GetSubList();
743         sal_uInt32 nCnt = pList->GetObjCount();
744 
745         for (sal_uInt32 i = 0; i < nCnt; i++)
746             if ((bRet = HasDrwObj(pList->GetObj(i))) == sal_True)
747                 break;
748     }
749     else if (SdrInventor == pSdrObj->GetObjInventor() || pSdrObj->Is3DObj())
750         return sal_True;
751 
752     return bRet;
753 }
754 
755 /*--------------------------------------------------------------------
756     Beschreibung:
757  --------------------------------------------------------------------*/
758 
HasOnlyObj(SdrObject * pSdrObj,sal_uInt32 eObjInventor) const759 sal_Bool SwView::HasOnlyObj(SdrObject *pSdrObj, sal_uInt32 eObjInventor) const
760 {
761     sal_Bool bRet = sal_False;
762 
763     if (pSdrObj->IsGroupObject())
764     {
765         SdrObjList* pList = pSdrObj->GetSubList();
766         sal_uInt32 nCnt = pList->GetObjCount();
767 
768         for (sal_uInt32 i = 0; i < nCnt; i++)
769             if ((bRet = HasOnlyObj(pList->GetObj(i), eObjInventor)) == sal_False)
770                 break;
771     }
772     else if (eObjInventor == pSdrObj->GetObjInventor())
773         return sal_True;
774 
775     return bRet;
776 }
777 
778 
779 //#i87414# mod
IMPL_LINK(SwView,OnlineSpellCallback,SpellCallbackInfo *,pInfo)780 IMPL_LINK(SwView, OnlineSpellCallback, SpellCallbackInfo*, pInfo)
781 {
782     if (pInfo->nCommand == SPELLCMD_STARTSPELLDLG)
783         GetViewFrame()->GetDispatcher()->Execute( FN_SPELL_GRAMMAR_DIALOG, SFX_CALLMODE_ASYNCHRON);
784     return 0;
785 }
786 
787 /*--------------------------------------------------------------------
788     Beschreibung:
789  --------------------------------------------------------------------*/
ExecDrwTxtSpellPopup(const Point & rPt)790 sal_Bool SwView::ExecDrwTxtSpellPopup(const Point& rPt)
791 {
792     sal_Bool bRet = sal_False;
793     SdrView *pSdrView = pWrtShell->GetDrawView();
794     OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
795     Point aPos( GetEditWin().LogicToPixel( rPt ) );
796 
797     if (pOLV->IsWrongSpelledWordAtPos( aPos ))
798     {
799         bRet = sal_True;
800         Link aLink = LINK(this, SwView, OnlineSpellCallback);
801         pOLV->ExecuteSpellPopup( aPos,&aLink );
802     }
803     return bRet;
804 }
805 
806 /*--------------------------------------------------------------------
807     Beschreibung:
808  --------------------------------------------------------------------*/
809 
810 
811 
IsDrawTextHyphenate()812 sal_Bool SwView::IsDrawTextHyphenate()
813 {
814     SdrView *pSdrView = pWrtShell->GetDrawView();
815     sal_Bool bHyphenate = sal_False;
816 
817     SfxItemSet aNewAttr( pSdrView->GetModel()->GetItemPool(),
818                             EE_PARA_HYPHENATE, EE_PARA_HYPHENATE );
819     if( pSdrView->GetAttributes( aNewAttr ) &&
820         aNewAttr.GetItemState( EE_PARA_HYPHENATE ) >= SFX_ITEM_AVAILABLE )
821         bHyphenate = ((const SfxBoolItem&)aNewAttr.Get( EE_PARA_HYPHENATE )).
822                         GetValue();
823 
824     return bHyphenate;
825 }
826 
827 /*--------------------------------------------------------------------
828     Beschreibung:
829  --------------------------------------------------------------------*/
830 
831 
832 
HyphenateDrawText()833 void SwView::HyphenateDrawText()
834 {
835     SdrView *pSdrView = pWrtShell->GetDrawView();
836     sal_Bool bHyphenate = IsDrawTextHyphenate();
837 
838     SfxItemSet aSet( GetPool(), EE_PARA_HYPHENATE, EE_PARA_HYPHENATE );
839     aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, !bHyphenate ) );
840     pSdrView->SetAttributes( aSet );
841     GetViewFrame()->GetBindings().Invalidate(FN_HYPHENATE_OPT_DLG);
842 }
843 
844 
845 
846