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