xref: /aoo41x/main/sd/source/ui/view/drviews2.cxx (revision d5370dc8)
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_sd.hxx"
26 
27 #include "DrawViewShell.hxx"
28 #include "ViewShellImplementation.hxx"
29 #include <vcl/waitobj.hxx>
30 #include <svx/svdograf.hxx>
31 #ifndef _SVXIDS_HRC
32 #include <svx/svxids.hrc>
33 #endif
34 #include <svx/svdpagv.hxx>
35 #include <svx/svdundo.hxx>
36 #ifndef _ZOOMITEM_HXX
37 #include <svx/zoomitem.hxx>
38 #endif
39 #ifndef _EDITDATA_HXX
40 #include <editeng/editdata.hxx>
41 #endif
42 #include <basic/sberrors.hxx>
43 #include <vcl/msgbox.hxx>
44 #include <sfx2/request.hxx>
45 #include <sfx2/dispatch.hxx>
46 #include <svx/xfillit0.hxx>
47 #include <svx/xflclit.hxx>
48 #include <svl/aeitem.hxx>
49 #include <editeng/eeitem.hxx>
50 #include <basic/sbstar.hxx>
51 #include <editeng/flditem.hxx>
52 #include <svx/xlineit0.hxx>
53 #include <svx/xfillit0.hxx>
54 
55 #ifndef _SDOUTL_HXX //autogen
56 #include <svx/svdoutl.hxx>
57 #endif
58 #include <svx/xlnwtit.hxx>
59 #include <svx/svdoattr.hxx>
60 #include <svx/xlnstwit.hxx>
61 #include <svx/sdtmfitm.hxx>
62 #include <svx/sdtagitm.hxx>
63 #include <svx/xlnedwit.hxx>
64 #include <svx/fontworkbar.hxx>
65 
66 #include <svx/svxdlg.hxx>
67 #include <svx/dialogs.hrc>
68 
69 #include <sfx2/viewfrm.hxx>
70 #include "sdgrffilter.hxx"
71 
72 #include "app.hrc"
73 #include "glob.hrc"
74 #include "helpids.h"
75 #include "sdattr.hxx"
76 #include "drawview.hxx"
77 #include "Window.hxx"
78 #include "drawdoc.hxx"
79 #include "DrawDocShell.hxx"
80 #include "sdpage.hxx"
81 #include "fuscale.hxx"
82 #include "sdresid.hxx"
83 #include "GraphicViewShell.hxx"
84 #include "unmodpg.hxx"
85 #include "slideshow.hxx"
86 #include "fuvect.hxx"
87 #include "stlpool.hxx"
88 
89 // #90356#
90 #include "optsitem.hxx"
91 #include "sdabstdlg.hxx"
92 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
93 #include <com/sun/star/drawing/XDrawPages.hpp>
94 
95 #include <strings.hrc>
96 
97 using namespace ::com::sun::star;
98 using namespace ::com::sun::star::uno;
99 
100 namespace sd {
101 
102 /*************************************************************************
103 |*
104 |* SfxRequests fuer temporaere Funktionen
105 |*
106 \************************************************************************/
107 
108 void DrawViewShell::FuTemporary(SfxRequest& rReq)
109 {
110 	// Waehrend einer Native-Diashow wird nichts ausgefuehrt!
111 	if(SlideShow::IsRunning( GetViewShellBase() ) && (rReq.GetSlot() != SID_NAVIGATOR))
112 		return;
113 
114 	DBG_ASSERT( mpDrawView, "sd::DrawViewShell::FuTemporary(), no draw view!" );
115 	if( !mpDrawView )
116 		return;
117 
118 	CheckLineTo (rReq);
119 
120 	DeactivateCurrentFunction();
121 
122 	sal_uInt16 nSId = rReq.GetSlot();
123 
124 	// Slot wird gemapped (ToolboxImages/-Slots)
125 	MapSlot( nSId );
126 
127 	switch ( nSId )
128 	{
129 		// Flaechen und Linien-Attribute:
130 		// Sollten (wie StateMethode) eine eigene
131 		// Execute-Methode besitzen
132 		case SID_ATTR_FILL_STYLE:
133 		case SID_ATTR_FILL_COLOR:
134 		case SID_ATTR_FILL_GRADIENT:
135 		case SID_ATTR_FILL_HATCH:
136 		case SID_ATTR_FILL_BITMAP:
137 		case SID_ATTR_FILL_SHADOW:
138         case SID_ATTR_FILL_TRANSPARENCE:
139         case SID_ATTR_FILL_FLOATTRANSPARENCE:
140 
141 		case SID_ATTR_LINE_STYLE:
142 		case SID_ATTR_LINE_DASH:
143 		case SID_ATTR_LINE_WIDTH:
144 		case SID_ATTR_LINE_COLOR:
145 		case SID_ATTR_LINEEND_STYLE:
146         case SID_ATTR_LINE_START:
147         case SID_ATTR_LINE_END:
148         case SID_ATTR_LINE_TRANSPARENCE:
149         case SID_ATTR_LINE_JOINT:
150         case SID_ATTR_LINE_CAP:
151 
152 		case SID_ATTR_TEXT_FITTOSIZE:
153 		{
154 			if( rReq.GetArgs() )
155 			{
156 				sal_Bool bMergeUndo = sal_False;
157 				::svl::IUndoManager* pUndoManager = GetDocSh()->GetUndoManager();
158 
159 				// Anpassungen Start/EndWidth #63083#
160 				if(nSId == SID_ATTR_LINE_WIDTH)
161 				{
162 					SdrObject* pObj = NULL;
163 					const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
164 					sal_uLong nCount = rMarkList.GetMarkCount();
165 					const sal_Int32 nNewLineWidth(((const XLineWidthItem&)rReq.GetArgs()->Get(XATTR_LINEWIDTH)).GetValue());
166 					const bool bUndo(mpDrawView->IsUndoEnabled());
167 
168 					for (sal_uLong i=0; i<nCount; i++)
169 					{
170 						SfxItemSet aAttr(GetDoc()->GetPool());
171 						pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
172 						aAttr.Put(pObj->GetMergedItemSet());
173 
174 						sal_Int32 nActLineWidth = ((const XLineWidthItem&)aAttr.Get(XATTR_LINEWIDTH)).GetValue();
175 
176 						if(nActLineWidth != nNewLineWidth)
177 						{
178 							sal_Bool bSetItemSet(sal_False);
179 
180 							// #86265# do this for SFX_ITEM_DEFAULT and for SFX_ITEM_SET
181 							if(SFX_ITEM_DONTCARE != aAttr.GetItemState(XATTR_LINESTARTWIDTH))
182 							{
183 								sal_Int32 nValAct = ((const XLineStartWidthItem&)aAttr.Get(XATTR_LINESTARTWIDTH)).GetValue();
184 								sal_Int32 nValNew = nValAct + (((nNewLineWidth - nActLineWidth) * 15) / 10);
185 								if(nValNew < 0)
186 									nValNew = 0;
187 								bSetItemSet = sal_True;
188 								aAttr.Put(XLineStartWidthItem(nValNew));
189 							}
190 
191 							// #86265# do this for SFX_ITEM_DEFAULT and for SFX_ITEM_SET
192 							if(SFX_ITEM_DONTCARE != aAttr.GetItemState(XATTR_LINEENDWIDTH))
193 							{
194 								sal_Int32 nValAct = ((const XLineEndWidthItem&)aAttr.Get(XATTR_LINEENDWIDTH)).GetValue();
195 								sal_Int32 nValNew = nValAct + (((nNewLineWidth - nActLineWidth) * 15) / 10);
196 								if(nValNew < 0)
197 									nValNew = 0;
198 								bSetItemSet = sal_True;
199 								aAttr.Put(XLineEndWidthItem(nValNew));
200 							}
201 
202 							if(bSetItemSet)
203                             {
204                                 if(bUndo)
205                                 {
206                                     if(!bMergeUndo)
207                                     {
208 										pUndoManager->EnterListAction( String(), String() );
209             							mpDrawView->BegUndo();
210 										bMergeUndo = sal_True;
211                                     }
212 
213                                     mpDrawView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoAttrObject(*pObj));
214                                 }
215 
216                                 pObj->SetMergedItemSet(aAttr);
217                             }
218 						}
219 					}
220 
221                     if(bMergeUndo)
222                     {
223 						mpDrawView->EndUndo();
224                     }
225 				}
226 
227 				if (nSId == SID_ATTR_FILL_SHADOW)
228 				{
229 					// Ggf. werden transparente Objekte wei?gefuellt
230 					SdrObject* pObj = NULL;
231 					const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
232 					sal_uLong nCount = rMarkList.GetMarkCount();
233 					const bool bUndo = mpDrawView->IsUndoEnabled();
234 
235 					for (sal_uLong i=0; i<nCount; i++)
236 					{
237 						SfxItemSet aAttr(GetDoc()->GetPool());
238 						pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
239 
240 						// #i25616#
241 						if(!pObj->ISA(SdrGrafObj))
242 						{
243 							aAttr.Put(pObj->GetMergedItemSet());
244 
245 							const XFillStyleItem& rFillStyle = (const XFillStyleItem&) aAttr.Get(XATTR_FILLSTYLE);
246 							const XLineStyleItem& rLineStyle = (const XLineStyleItem&) aAttr.Get(XATTR_LINESTYLE);
247 
248 							if(XFILL_NONE == rFillStyle.GetValue() && XLINE_NONE == rLineStyle.GetValue())
249 							{
250 								if( bUndo )
251 								{
252 									// Vorlage hat keine Fuellung,
253 									// daher hart attributieren: Fuellung setzen
254 									if (!bMergeUndo)
255 									{
256 										bMergeUndo = sal_True;
257 										pUndoManager->EnterListAction( String(), String() );
258 										mpDrawView->BegUndo();
259 									}
260 
261 									mpDrawView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoAttrObject(*pObj));
262 								}
263 
264 								aAttr.Put(XFillStyleItem(XFILL_SOLID));
265 								aAttr.Put(XFillColorItem(String(), COL_WHITE));
266 
267 								pObj->SetMergedItemSet(aAttr);
268 							}
269 						}
270 					}
271 
272 					if (bMergeUndo)
273 					{
274 						mpDrawView->EndUndo();
275 					}
276 				}
277 
278 				mpDrawView->SetAttributes(*rReq.GetArgs());
279 
280 				if (bMergeUndo)
281 				{
282 					pUndoManager->LeaveListAction();
283 				}
284 
285 				rReq.Done();
286 			}
287 			else
288 			{
289 				switch( rReq.GetSlot() )
290 				{
291 					case SID_ATTR_FILL_SHADOW:
292 					case SID_ATTR_FILL_STYLE:
293 					case SID_ATTR_FILL_COLOR:
294 					case SID_ATTR_FILL_GRADIENT:
295 					case SID_ATTR_FILL_HATCH:
296 					case SID_ATTR_FILL_BITMAP:
297                     case SID_ATTR_FILL_TRANSPARENCE:
298                     case SID_ATTR_FILL_FLOATTRANSPARENCE:
299 						GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_AREA, SFX_CALLMODE_ASYNCHRON );
300 						break;
301 					case SID_ATTR_LINE_STYLE:
302 					case SID_ATTR_LINE_DASH:
303 					case SID_ATTR_LINE_WIDTH:
304 					case SID_ATTR_LINE_COLOR:
305                     case SID_ATTR_LINE_TRANSPARENCE:
306                     case SID_ATTR_LINE_JOINT:
307                     case SID_ATTR_LINE_CAP:
308 						GetViewFrame()->GetDispatcher()->Execute( SID_ATTRIBUTES_LINE, SFX_CALLMODE_ASYNCHRON );
309 						break;
310 					case SID_ATTR_TEXT_FITTOSIZE:
311 						GetViewFrame()->GetDispatcher()->Execute( SID_TEXTATTR_DLG, SFX_CALLMODE_ASYNCHRON );
312 						break;
313 				}
314 			}
315 			Cancel();
316 		}
317 		break;
318 
319 		case SID_HYPHENATION:
320 		{
321 			// const SfxPoolItem* pItem = rReq.GetArg( SID_HYPHENATION );
322 			//  ^-- Soll so nicht benutzt werden (Defaults sind falsch) !
323 			SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, SID_HYPHENATION, sal_False);
324 
325 			if( pItem )
326 			{
327 				SfxItemSet aSet( GetPool(), EE_PARA_HYPHENATE, EE_PARA_HYPHENATE );
328 				sal_Bool bValue = ( (const SfxBoolItem*) pItem)->GetValue();
329 				aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) );
330 				mpDrawView->SetAttributes( aSet );
331 			}
332 			else // nur zum Test
333 			{
334 				DBG_ERROR(" Kein Wert fuer Silbentrennung!");
335 				SfxItemSet aSet( GetPool(), EE_PARA_HYPHENATE, EE_PARA_HYPHENATE );
336 				sal_Bool bValue = sal_True;
337 				aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) );
338 				mpDrawView->SetAttributes( aSet );
339 			}
340 			rReq.Done();
341 			Cancel();
342 		}
343 		break;
344 
345 		case SID_INSERTPAGE:
346 		case SID_INSERTPAGE_QUICK:
347 		case SID_DUPLICATE_PAGE:
348         {
349             SdPage* pNewPage = CreateOrDuplicatePage (rReq, mePageKind, GetActualPage());
350             Cancel();
351             if(HasCurrentFunction(SID_BEZIER_EDIT) )
352                 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
353             if (pNewPage != NULL)
354                 SwitchPage((pNewPage->GetPageNum()-1)/2);
355             rReq.Done ();
356         }
357 		break;
358 
359 		case SID_INSERT_MASTER_PAGE:
360         {
361             // Use the API to create a new page.
362             Reference<drawing::XMasterPagesSupplier> xMasterPagesSupplier (
363                 GetDoc()->getUnoModel(), UNO_QUERY);
364             if (xMasterPagesSupplier.is())
365             {
366                 Reference<drawing::XDrawPages> xMasterPages (
367                     xMasterPagesSupplier->getMasterPages());
368                 if (xMasterPages.is())
369                 {
370                     sal_uInt16 nIndex = GetCurPageId();
371                     xMasterPages->insertNewByIndex (nIndex);
372 
373                     // Create shapes for the default layout.
374                     SdPage* pMasterPage = GetDoc()->GetMasterSdPage(
375                         nIndex, PK_STANDARD);
376                     pMasterPage->CreateTitleAndLayout (sal_True,sal_True);
377                 }
378             }
379 
380             Cancel();
381             if(HasCurrentFunction(SID_BEZIER_EDIT))
382                 GetViewFrame()->GetDispatcher()->Execute(
383                     SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
384             rReq.Done ();
385         }
386         break;
387 
388 		case SID_MODIFYPAGE:
389 		{
390 			if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES ||
391 				(mePageKind==PK_HANDOUT && meEditMode==EM_MASTERPAGE) )
392 			{
393 				if ( mpDrawView->IsTextEdit() )
394 				{
395 					mpDrawView->SdrEndTextEdit();
396 				}
397 				sal_uInt16 nPage = maTabControl.GetCurPageId() - 1;
398 				mpActualPage = GetDoc()->GetSdPage(nPage, mePageKind);
399                 ::sd::ViewShell::mpImpl->ProcessModifyPageSlot (
400                     rReq,
401                     mpActualPage,
402                     mePageKind);
403 			}
404 
405 			Cancel();
406 			rReq.Done ();
407 		}
408 		break;
409 
410         case SID_ASSIGN_LAYOUT:
411 		{
412 			if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES || (mePageKind==PK_HANDOUT && meEditMode==EM_MASTERPAGE))
413 			{
414 			    if ( mpDrawView->IsTextEdit() )
415 				    mpDrawView->SdrEndTextEdit();
416 
417 				::sd::ViewShell::mpImpl->AssignLayout(rReq, mePageKind);
418             }
419             Cancel();
420 			rReq.Done ();
421 		}
422         break;
423 
424 		case SID_RENAMEPAGE:
425 		case SID_RENAME_MASTER_PAGE:
426         {
427 			if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES )
428 			{
429 				if ( mpDrawView->IsTextEdit() )
430 				{
431 					mpDrawView->SdrEndTextEdit();
432 				}
433 
434                 sal_uInt16 nPageId = maTabControl.GetCurPageId();
435                 SdPage* pCurrentPage = ( GetEditMode() == EM_PAGE )
436                     ? GetDoc()->GetSdPage( nPageId - 1, GetPageKind() )
437                     : GetDoc()->GetMasterSdPage( nPageId - 1, GetPageKind() );
438 
439                 String aTitle( SdResId( STR_TITLE_RENAMESLIDE ) );
440                 String aDescr( SdResId( STR_DESC_RENAMESLIDE ) );
441                 String aPageName = pCurrentPage->GetName();
442 
443                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
444 				DBG_ASSERT(pFact, "Dialogdiet fail!");
445 				AbstractSvxNameDialog* aNameDlg = pFact->CreateSvxNameDialog( GetActiveWindow(), aPageName, aDescr );
446 				DBG_ASSERT(aNameDlg, "Dialogdiet fail!");
447 				aNameDlg->SetText( aTitle );
448                 aNameDlg->SetCheckNameHdl( LINK( this, DrawViewShell, RenameSlideHdl ), true );
449                 aNameDlg->SetEditHelpId( HID_SD_NAMEDIALOG_PAGE );
450 
451                 if( aNameDlg->Execute() == RET_OK )
452                 {
453                     String aNewName;
454                     aNameDlg->GetName( aNewName );
455                     if( ! aNewName.Equals( aPageName ) )
456                     {
457 #ifdef DBG_UTIL
458                         bool bResult =
459 #endif
460 							RenameSlide( nPageId, aNewName );
461                         DBG_ASSERT( bResult, "Couldn't rename slide" );
462                     }
463                 }
464 				delete aNameDlg;
465             }
466 
467 			Cancel();
468 			rReq.Ignore ();
469         }
470         break;
471 
472         case SID_RENAMEPAGE_QUICK:
473 		{
474 			if (mePageKind==PK_STANDARD || mePageKind==PK_NOTES )
475 			{
476 				if ( mpDrawView->IsTextEdit() )
477 				{
478 					mpDrawView->SdrEndTextEdit();
479 				}
480 
481 				maTabControl.StartEditMode( maTabControl.GetCurPageId() );
482 			}
483 
484 			Cancel();
485 			rReq.Ignore ();
486 		}
487 		break;
488 
489 		case SID_PAGESIZE :  // entweder dieses (kein menueeintrag o. ae. !!)
490 		{
491 			const SfxItemSet *pArgs = rReq.GetArgs ();
492 
493 			if (pArgs)
494 				if (pArgs->Count () == 3)
495 				{
496 					SFX_REQUEST_ARG (rReq, pWidth, SfxUInt32Item, ID_VAL_PAGEWIDTH, sal_False);
497 					SFX_REQUEST_ARG (rReq, pHeight, SfxUInt32Item, ID_VAL_PAGEHEIGHT, sal_False);
498 					SFX_REQUEST_ARG (rReq, pScaleAll, SfxBoolItem, ID_VAL_SCALEOBJECTS, sal_False);
499 
500 					Size aSize (pWidth->GetValue (), pHeight->GetValue ());
501 
502 					SetupPage (aSize, 0, 0, 0, 0, sal_True, sal_False, pScaleAll->GetValue ());
503 					rReq.Ignore ();
504 					break;
505 				}
506 
507 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
508 			rReq.Ignore ();
509 			break;
510 		}
511 
512 		case SID_PAGEMARGIN :  // oder dieses (kein menueeintrag o. ae. !!)
513 		{
514 			const SfxItemSet *pArgs = rReq.GetArgs ();
515 
516 			if (pArgs)
517 				if (pArgs->Count () == 5)
518 				{
519 					SFX_REQUEST_ARG (rReq, pLeft, SfxUInt32Item, ID_VAL_PAGELEFT, sal_False);
520 					SFX_REQUEST_ARG (rReq, pRight, SfxUInt32Item, ID_VAL_PAGERIGHT, sal_False);
521 					SFX_REQUEST_ARG (rReq, pUpper, SfxUInt32Item, ID_VAL_PAGETOP, sal_False);
522 					SFX_REQUEST_ARG (rReq, pLower, SfxUInt32Item, ID_VAL_PAGEBOTTOM, sal_False);
523 					SFX_REQUEST_ARG (rReq, pScaleAll, SfxBoolItem, ID_VAL_SCALEOBJECTS, sal_False);
524 
525 					Size aEmptySize (0, 0);
526 
527 					SetupPage (aEmptySize, pLeft->GetValue (), pRight->GetValue (),
528 							   pUpper->GetValue (), pLower->GetValue (),
529 							   sal_False, sal_True, pScaleAll->GetValue ());
530 					rReq.Ignore ();
531 					break;
532 				}
533 
534 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
535 			rReq.Ignore ();
536 			break;
537 		}
538 
539 		case SID_ATTR_ZOOMSLIDER:
540 		{
541 			const SfxItemSet* pArgs = rReq.GetArgs();
542 
543 			if (pArgs && pArgs->Count () == 1 )
544 			{
545 				SFX_REQUEST_ARG (rReq, pScale, SfxUInt16Item, SID_ATTR_ZOOMSLIDER, sal_False);
546 				if (CHECK_RANGE (5, pScale->GetValue (), 3000))
547 				{
548 					SetZoom (pScale->GetValue ());
549 
550 					SfxBindings& rBindings = GetViewFrame()->GetBindings();
551 					rBindings.Invalidate( SID_ATTR_ZOOM );
552 					rBindings.Invalidate( SID_ZOOM_IN );
553 					rBindings.Invalidate( SID_ZOOM_OUT );
554 					rBindings.Invalidate( SID_ATTR_ZOOMSLIDER );
555 
556 				}
557 			}
558 
559 			Cancel();
560 			rReq.Done ();
561 			break;
562 		}
563 		case SID_ZOOMING :	// kein Menueintrag, sondern aus dem Zoomdialog generiert
564 		{
565 			const SfxItemSet* pArgs = rReq.GetArgs();
566 
567 			if (pArgs)
568 				if (pArgs->Count () == 1)
569 				{
570 					SFX_REQUEST_ARG (rReq, pScale, SfxUInt32Item, ID_VAL_ZOOM, sal_False);
571 					if (CHECK_RANGE (10, pScale->GetValue (), 1000))
572 					{
573 						SetZoom (pScale->GetValue ());
574 
575 						SfxBindings& rBindings = GetViewFrame()->GetBindings();
576 						rBindings.Invalidate( SID_ATTR_ZOOM );
577 						rBindings.Invalidate( SID_ZOOM_IN );
578 						rBindings.Invalidate( SID_ZOOM_OUT );
579 						rBindings.Invalidate( SID_ATTR_ZOOMSLIDER );
580 					}
581 					else StarBASIC::FatalError (SbERR_BAD_PROP_VALUE);
582 
583 					rReq.Ignore ();
584 					break;
585 				}
586 
587 			StarBASIC::FatalError (SbERR_WRONG_ARGS);
588 			rReq.Ignore ();
589 			break;
590 		}
591 
592 		case SID_ATTR_ZOOM:
593 		{
594 			const SfxItemSet* pArgs = rReq.GetArgs();
595 			mbZoomOnPage = sal_False;
596 
597 			if ( pArgs )
598 			{
599 				SvxZoomType eZT = ( ( const SvxZoomItem& ) pArgs->
600 											Get( SID_ATTR_ZOOM ) ).GetType();
601 				switch( eZT )
602 				{
603 					case SVX_ZOOM_PERCENT:
604 						SetZoom( (long) ( ( const SvxZoomItem& ) pArgs->
605 											Get( SID_ATTR_ZOOM ) ).GetValue() );
606 						break;
607 
608 					case SVX_ZOOM_OPTIMAL:
609 						GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_ALL,
610 									SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
611 						break;
612 
613 					case SVX_ZOOM_PAGEWIDTH:
614 						GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE_WIDTH,
615 									SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
616 						break;
617 
618 					case SVX_ZOOM_WHOLEPAGE:
619 						GetViewFrame()->GetDispatcher()->Execute( SID_SIZE_PAGE,
620 									SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
621 						break;
622 					case SVX_ZOOM_PAGEWIDTH_NOBORDER:
623 						DBG_ERROR("sd::DrawViewShell::FuTemporary(), SVX_ZOOM_PAGEWIDTH_NOBORDER not handled!" );
624 						break;
625 				}
626 				rReq.Ignore ();
627 			}
628 			else
629 			{
630 				// hier den Zoom-Dialog oeffnen
631 				SetCurrentFunction( FuScale::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
632 			}
633 			Cancel();
634 		}
635 		break;
636 
637 		case SID_CHANGEBEZIER:
638 		case SID_CHANGEPOLYGON:
639 			if ( mpDrawView->IsTextEdit() )
640 			{
641 				mpDrawView->SdrEndTextEdit();
642 				GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
643 			}
644 
645 			if ( mpDrawView->IsPresObjSelected() )
646 			{
647                 ::sd::Window* pWindow = GetActiveWindow();
648 				InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
649 			}
650 			else
651 			{
652 				if( rReq.GetSlot() == SID_CHANGEBEZIER )
653 				{
654 					WaitObject aWait( (Window*)GetActiveWindow() );
655 					mpDrawView->ConvertMarkedToPathObj(sal_False);
656 				}
657 				else
658 				{
659 					if( mpDrawView->IsVectorizeAllowed() )
660                     {
661 						SetCurrentFunction( FuVectorize::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
662                     }
663 					else
664 					{
665 						WaitObject aWait( (Window*)GetActiveWindow() );
666 						mpDrawView->ConvertMarkedToPolyObj(sal_False);
667 					}
668 				}
669 
670 				Invalidate(SID_CHANGEBEZIER);
671 				Invalidate(SID_CHANGEPOLYGON);
672 			}
673 			Cancel();
674 
675 			if( HasCurrentFunction(SID_BEZIER_EDIT) )
676 			{	// ggf. die richtige Editfunktion aktivieren
677 				GetViewFrame()->GetDispatcher()->Execute(SID_SWITCH_POINTEDIT,
678 										SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
679 			}
680 			rReq.Ignore ();
681 			break;
682 
683 		case SID_CONVERT_TO_CONTOUR:
684 			if ( mpDrawView->IsTextEdit() )
685 			{
686 				mpDrawView->SdrEndTextEdit();
687 				GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
688 			}
689 
690 			if ( mpDrawView->IsPresObjSelected() )
691 			{
692                 ::sd::Window* pWindow = GetActiveWindow();
693 				InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
694 			}
695 			else
696 			{
697 				WaitObject aWait( (Window*)GetActiveWindow() );
698 				mpDrawView->ConvertMarkedToPathObj(sal_True);
699 
700 				Invalidate(SID_CONVERT_TO_CONTOUR);
701 			}
702 			Cancel();
703 
704 			rReq.Ignore ();
705 			break;
706 
707 		case SID_CONVERT_TO_METAFILE:
708 		case SID_CONVERT_TO_BITMAP:
709 		{
710             // End text edit mode when it is active because the metafile or
711             // bitmap that will be created does not support it.
712             if ( mpDrawView->IsTextEdit() )
713 			{
714 				mpDrawView->SdrEndTextEdit();
715 				GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
716             }
717 
718 			if ( mpDrawView->IsPresObjSelected(true,true,true) )
719 			{
720                 ::sd::Window* pWindow = GetActiveWindow();
721 				InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
722 			}
723 			else
724 			{
725 				WaitObject aWait( (Window*)GetActiveWindow() );
726 
727 				// switch on undo for the next operations
728 				mpDrawView->BegUndo(
729 					String(
730 					SdResId (nSId==SID_CONVERT_TO_METAFILE ? STR_UNDO_CONVERT_TO_METAFILE : STR_UNDO_CONVERT_TO_BITMAP)));
731 
732 				// create SdrGrafObj from metafile/bitmap
733 				Graphic aGraphic;
734 				switch (nSId)
735 				{
736 					case SID_CONVERT_TO_METAFILE:
737 					{
738 						GDIMetaFile aMetaFile(mpDrawView->GetMarkedObjMetaFile());
739 						aGraphic = Graphic(aMetaFile);
740 					}
741 					break;
742 					case SID_CONVERT_TO_BITMAP:
743 					{
744                         bool bDone(false);
745 
746                         // I have to get the image here directly since GetMarkedObjBitmapEx works
747                         // based on Bitmaps, but not on BitmapEx, thus throwing away the alpha
748                         // channel. Argh! GetMarkedObjBitmapEx itself is too widely used to safely
749                         // change that, e.g. in the exchange formats. For now I can only add this
750                         // exception to get good results for Svgs. This is how the code gets more
751                         // and more crowded, at last I made a remark for myself to change this
752                         // as one of the next tasks.
753                         if(1 == mpDrawView->GetMarkedObjectCount())
754                         {
755                             const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(mpDrawView->GetMarkedObjectByIndex(0));
756 
757                             if(pSdrGrafObj && pSdrGrafObj->isEmbeddedSvg())
758                             {
759                                 aGraphic = Graphic(pSdrGrafObj->GetGraphic().getSvgData()->getReplacement());
760                                 bDone = true;
761                             }
762                         }
763 
764                         if(!bDone)
765                         {
766                             aGraphic = Graphic(mpDrawView->GetMarkedObjBitmapEx());
767                         }
768 					}
769 					break;
770 				}
771 
772 				// create new object
773 				SdrGrafObj* pGraphicObj = new SdrGrafObj (aGraphic);
774 
775 				// get some necessary info and ensure it
776 				const SdrMarkList& rMarkList(mpDrawView->GetMarkedObjectList());
777 				const sal_uInt32 nMarkCount(rMarkList.GetMarkCount());
778 				SdrPageView* pPageView = mpDrawView->GetSdrPageView();
779 				OSL_ENSURE(nMarkCount, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP with empty selection (!)");
780 				OSL_ENSURE(pPageView, "DrawViewShell::FuTemporary: SID_CONVERT_TO_BITMAP without SdrPageView (!)");
781 
782 				// fit rectangle of new graphic object to selection's mark rect
783 				Rectangle aAllMarkedRect;
784 				rMarkList.TakeBoundRect(pPageView, aAllMarkedRect);
785 				pGraphicObj->SetLogicRect(aAllMarkedRect);
786 
787 				// #i71540# to keep the order, it is necessary to replace the lowest object
788 				// of the selection with the new object. This also means that with multi
789 				// selection, all other objects need to be deleted first
790 				SdrMark* pFirstMark = rMarkList.GetMark(0L);
791 				SdrObject* pReplacementCandidate = pFirstMark->GetMarkedSdrObj();
792 
793 				if(nMarkCount > 1L)
794 				{
795 					// take first object out of selection
796 					mpDrawView->MarkObj(pReplacementCandidate, pPageView, true, true);
797 
798 					// clear remaining selection
799 					mpDrawView->DeleteMarkedObj();
800 				}
801 
802 				// now replace lowest object with new one
803 				mpDrawView->ReplaceObjectAtView(pReplacementCandidate, *pPageView, pGraphicObj);
804 
805 				// switch off undo
806 				mpDrawView->EndUndo();
807 			}
808 		}
809 
810 		Cancel();
811 
812 		rReq.Done ();
813 		break;
814 
815 		case SID_SET_DEFAULT:
816 		{
817 			SfxItemSet* pSet = NULL;
818 
819 			if (mpDrawView->IsTextEdit())
820 			{
821 				::Outliner* pOutl = mpDrawView->GetTextEditOutliner();
822 				if (pOutl)
823 				{
824 					pOutl->RemoveFields(sal_True, (TypeId) SvxURLField::StaticType());
825 				}
826 
827 				pSet = new SfxItemSet( GetPool(), EE_ITEMS_START, EE_ITEMS_END );
828 				mpDrawView->SetAttributes( *pSet, sal_True );
829 			}
830 			else
831 			{
832 				const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
833 				sal_uLong nCount = rMarkList.GetMarkCount();
834 
835 				// In diese Liste werden fuer jedes Praesentationsobjekt ein SfxItemSet
836 				// der harten Attribute sowie der UserCall eingetragen, da diese beim nachfolgenden
837 				// mpDrawView->SetAttributes( *pSet, sal_True ) verloren gehen und spaeter restauriert
838 				// werden muessen
839 				List* pAttrList = new List();
840 				SdPage* pPresPage = (SdPage*) mpDrawView->GetSdrPageView()->GetPage();
841 				sal_uLong i;
842 
843 				for ( i = 0; i < nCount; i++ )
844 				{
845 					SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
846 
847 					if( pPresPage->IsPresObj( pObj ) )
848 					{
849 						SfxItemSet* pNewSet = new SfxItemSet( GetDoc()->GetPool(), SDRATTR_TEXT_MINFRAMEHEIGHT, SDRATTR_TEXT_AUTOGROWHEIGHT, 0 );
850 						pNewSet->Put(pObj->GetMergedItemSet());
851 						pAttrList->Insert( pNewSet, LIST_APPEND );
852 						pAttrList->Insert( pObj->GetUserCall(), LIST_APPEND );
853 					}
854 				}
855 
856 				pSet = new SfxItemSet( GetPool() );
857 				mpDrawView->SetAttributes( *pSet, sal_True );
858 
859 				sal_uLong j = 0;
860 
861 				for ( i = 0; i < nCount; i++ )
862 				{
863 					SfxStyleSheet* pSheet = NULL;
864 					SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
865 
866 					if (pObj->GetObjIdentifier() == OBJ_TITLETEXT)
867 					{
868 						pSheet = mpActualPage->GetStyleSheetForPresObj(PRESOBJ_TITLE);
869 						if (pSheet)
870 							pObj->SetStyleSheet(pSheet, sal_False);
871 					}
872 					else if(pObj->GetObjIdentifier() == OBJ_OUTLINETEXT)
873 					{
874 						for (sal_uInt16 nLevel = 1; nLevel < 10; nLevel++)
875 						{
876 							pSheet = mpActualPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE );
877 							DBG_ASSERT(pSheet, "Vorlage fuer Gliederungsobjekt nicht gefunden");
878 							if (pSheet)
879 							{
880 								pObj->StartListening(*pSheet);
881 
882 								if( nLevel == 1 )
883 									// Textrahmen hoert auf StyleSheet der Ebene1
884 									pObj->NbcSetStyleSheet(pSheet, sal_False);
885 
886 							}
887 						}
888 					}
889 
890 					if( pPresPage->IsPresObj( pObj ) )
891 					{
892 						SfxItemSet* pNewSet = (SfxItemSet*) pAttrList->GetObject(j++);
893 						SdrObjUserCall* pUserCall = (SdrObjUserCall*) pAttrList->GetObject(j++);
894 
895 						if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_MINFRAMEHEIGHT ) == SFX_ITEM_ON )
896 						{
897 							pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_MINFRAMEHEIGHT));
898 						}
899 
900 						if ( pNewSet && pNewSet->GetItemState( SDRATTR_TEXT_AUTOGROWHEIGHT ) == SFX_ITEM_ON )
901 						{
902 							pObj->SetMergedItem(pNewSet->Get(SDRATTR_TEXT_AUTOGROWHEIGHT));
903 						}
904 
905 						if( pUserCall )
906 							pObj->SetUserCall( pUserCall );
907 
908 						delete pNewSet;
909 					}
910 				}
911 
912 				delete pAttrList;
913 			}
914 
915 			delete pSet;
916 			Cancel();
917 		}
918 		break;
919 
920 		case SID_DELETE_SNAPITEM:
921 		{
922 			SdrPageView* pPV;
923 			Point	aMPos = GetActiveWindow()->PixelToLogic( maMousePos );
924 			sal_uInt16	nHitLog = (sal_uInt16) GetActiveWindow()->PixelToLogic( Size(
925                 FuPoor::HITPIX, 0 ) ).Width();
926 			sal_uInt16	nHelpLine;
927 
928 			mbMousePosFreezed = sal_False;
929 
930 			if( mpDrawView->PickHelpLine( aMPos, nHitLog, *GetActiveWindow(), nHelpLine, pPV) )
931 			{
932 				pPV->DeleteHelpLine( nHelpLine );
933 			}
934 			Cancel();
935 			rReq.Ignore ();
936 		}
937 		break;
938 
939 		case SID_DELETE_PAGE:
940 		case SID_DELETE_MASTER_PAGE:
941 			DeleteActualPage();
942 			Cancel();
943 			rReq.Ignore ();
944 		break;
945 
946 		case SID_DELETE_LAYER:
947 			DeleteActualLayer();
948 			Cancel();
949 			rReq.Ignore ();
950 		break;
951 
952 		case SID_ORIGINAL_SIZE:
953 			mpDrawView->SetMarkedOriginalSize();
954 			Cancel();
955 			rReq.Done();
956 		break;
957 
958 		case SID_DRAW_FONTWORK:
959 		case SID_DRAW_FONTWORK_VERTICAL:
960 		{
961 			svx::FontworkBar::execute( mpView, rReq, GetViewFrame()->GetBindings() );		// SJ: can be removed  (I think)
962 			Cancel();
963 			rReq.Done();
964 		}
965 		break;
966 
967 		case SID_SAVEGRAPHIC:
968 		{
969 			const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
970 			if( rMarkList.GetMarkCount() == 1 )
971 			{
972 				SdrGrafObj *pGrafObj = dynamic_cast< SdrGrafObj* >( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
973 				if(pGrafObj )
974 				{
975 					::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape( pGrafObj->getUnoShape(), com::sun::star::uno::UNO_QUERY );
976 					SdGRFFilter::SaveGraphic( xShape );
977 				}
978 			}
979 			Cancel();
980 			rReq.Ignore();
981 		}
982 		break;
983 
984 		default:
985 		{
986 			// switch Anweisung wegen CLOOKS aufgeteilt. Alle case-Anweisungen die
987 			// eine Fu???? -Funktion aufrufen, sind in die Methode FuTemp01 (drviews8)
988 			// gewandert.
989 			FuTemp01(rReq);
990 		}
991 		break;
992 	}
993 
994 	if(HasCurrentFunction())
995 	{
996 		GetCurrentFunction()->Activate();
997 	}
998 }
999 
1000 
1001 
1002 
1003 /** This method consists basically of three parts:
1004     1. Process the arguments of the SFX request.
1005     2. Use the model to create a new page or duplicate an existing one.
1006     3. Update the tab control and switch to the new page.
1007 */
1008 SdPage* DrawViewShell::CreateOrDuplicatePage (
1009     SfxRequest& rRequest,
1010     PageKind ePageKind,
1011     SdPage* pPage,
1012     const sal_Int32 nInsertPosition)
1013 {
1014     SdPage* pNewPage = NULL;
1015     if (ePageKind == PK_STANDARD && meEditMode != EM_MASTERPAGE)
1016     {
1017         if ( mpDrawView->IsTextEdit() )
1018         {
1019             mpDrawView->SdrEndTextEdit();
1020         }
1021         pNewPage = ViewShell::CreateOrDuplicatePage (rRequest, ePageKind, pPage, nInsertPosition);
1022     }
1023     return pNewPage;
1024 }
1025 
1026 } // end of namespace sd
1027