xref: /trunk/main/sw/source/ui/uiview/viewdraw.cxx (revision efeef26f)
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