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