xref: /trunk/main/sd/source/ui/view/drviewse.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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 <com/sun/star/presentation/XPresentation2.hpp>
32 #include <com/sun/star/form/FormButtonType.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 #include <com/sun/star/i18n/TransliterationModules.hpp>
35 #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
36 
37 #include <comphelper/processfactory.hxx>
38 
39 #include "undo/undomanager.hxx"
40 #include <vcl/waitobj.hxx>
41 #include <svl/aeitem.hxx>
42 #include <editeng/editstat.hxx>
43 #include <vcl/msgbox.hxx>
44 #include <svl/urlbmk.hxx>
45 #include <svx/svdpagv.hxx>
46 #include <svx/fmshell.hxx>
47 #include <vcl/scrbar.hxx>
48 #include <svx/svdopath.hxx>
49 #include <svx/svdundo.hxx>
50 #include <svx/svdorect.hxx>
51 #include <svx/svdograf.hxx>
52 #include <svl/eitem.hxx>
53 #include <editeng/eeitem.hxx>
54 #include <sfx2/dispatch.hxx>
55 #include <sfx2/viewfrm.hxx>
56 #include <sfx2/request.hxx>
57 #include <svx/svxids.hrc>
58 #include <editeng/flditem.hxx>
59 #include <svx/ruler.hxx>
60 #include <svx/obj3d.hxx>
61 #include <svx/fmglob.hxx>
62 #include <svx/svdouno.hxx>
63 #include <svx/dataaccessdescriptor.hxx>
64 #include <tools/urlobj.hxx>
65 #include <svl/slstitm.hxx>
66 #include <sfx2/ipclient.hxx>
67 #include <toolkit/helper/vclunohelper.hxx>
68 #include <avmedia/mediawindow.hxx>
69 #include <svl/urihelper.hxx>
70 #include <sfx2/docfile.hxx>
71 
72 #include "DrawViewShell.hxx"
73 #include "slideshow.hxx"
74 #include "ViewShellImplementation.hxx"
75 #include "ViewShellHint.hxx"
76 #include "framework/FrameworkHelper.hxx"
77 #include "app.hrc"
78 #include "glob.hrc"
79 #include "strings.hrc"
80 #include "res_bmp.hrc"
81 #include "drawdoc.hxx"
82 #include "fusel.hxx"
83 #include "futext.hxx"
84 #include "fuconrec.hxx"
85 #include "fuconcs.hxx"
86 #include "fuconuno.hxx"
87 #include "fuconbez.hxx"
88 #include "fuediglu.hxx"
89 #include "fuconarc.hxx"
90 #include "fucon3d.hxx"
91 #include "sdresid.hxx"
92 #include "slideshow.hxx"
93 #include "Outliner.hxx"
94 #include "PresentationViewShell.hxx"
95 #include "sdpage.hxx"
96 #include "FrameView.hxx"
97 #include "zoomlist.hxx"
98 #include "drawview.hxx"
99 #include "DrawDocShell.hxx"
100 #include "sdattr.hxx"
101 #include "ViewShellBase.hxx"
102 #include "ToolBarManager.hxx"
103 #include "anminfo.hxx"
104 #include "optsitem.hxx"
105 #include "Window.hxx"
106 #include "fuformatpaintbrush.hxx"
107 
108 using ::rtl::OUString;
109 using namespace ::com::sun::star;
110 using namespace ::com::sun::star::uno;
111 using namespace ::com::sun::star::presentation;
112 
113 namespace sd {
114 
115 #ifdef _MSC_VER
116 #pragma optimize ( "", off )
117 #endif
118 
119 /*************************************************************************
120 |*
121 |* Permanente Funktionen
122 |*
123 \************************************************************************/
124 
125 void ImpAddPrintableCharactersToTextEdit(SfxRequest& rReq, ::sd::View* pView)
126 {
127     // #98198# evtl. feed characters to activated textedit
128     const SfxItemSet* pSet = rReq.GetArgs();
129 
130     if(pSet)
131     {
132         String aInputString;
133 
134         if(SFX_ITEM_SET == pSet->GetItemState(SID_ATTR_CHAR))
135             aInputString = ((SfxStringItem&)pSet->Get(SID_ATTR_CHAR)).GetValue();
136 
137         if(aInputString.Len())
138         {
139             OutlinerView* pOLV = pView->GetTextEditOutlinerView();
140 
141             if(pOLV)
142             {
143                 for(sal_uInt16 a(0); a < aInputString.Len(); a++)
144                 {
145                     sal_Char aChar = (sal_Char)aInputString.GetChar(a);
146                     KeyCode aKeyCode;
147                     KeyEvent aKeyEvent(aChar, aKeyCode);
148 
149                     // add actual character
150                     pOLV->PostKeyEvent(aKeyEvent);
151                 }
152             }
153         }
154     }
155 }
156 
157 void DrawViewShell::FuPermanent(SfxRequest& rReq)
158 {
159     // Waehrend einer Native-Diashow wird nichts ausgefuehrt!
160 
161     if (SlideShow::IsRunning(GetViewShellBase()))
162         return;
163 
164     sal_uInt16 nSId = rReq.GetSlot();
165 
166     if( HasCurrentFunction() &&
167         ( nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE ||
168           nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL ) )
169     {
170         FunctionReference xFunc( GetCurrentFunction() );
171 
172         FuText* pFuText = dynamic_cast< FuText* >( xFunc.get() );
173 
174         if( pFuText )
175         {
176             pFuText->SetPermanent(sal_True);
177             xFunc->ReceiveRequest( rReq );
178 
179             MapSlot( nSId );
180 
181             Invalidate();
182 
183             Invalidate();
184 
185             // #98198# evtl. feed characters to activated textedit
186             if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit())
187                 ImpAddPrintableCharactersToTextEdit(rReq, GetView());
188 
189             rReq.Done();
190             return;
191         }
192     }
193 
194     CheckLineTo (rReq);
195     sal_uInt16 nOldSId = 0;
196     sal_Bool bPermanent = sal_False;
197 
198     if( !mpDrawView )
199         return;
200 
201     if(HasCurrentFunction())
202     {
203         if( (nSId == SID_FORMATPAINTBRUSH) && (GetCurrentFunction()->GetSlotID() == SID_TEXTEDIT) )
204         {
205             // save text edit mode for format paintbrush!
206             SetOldFunction( GetCurrentFunction() );
207         }
208         else
209         {
210             if(GetOldFunction() == GetCurrentFunction())
211             {
212                 SetOldFunction(0);
213             }
214         }
215 
216         if ( nSId != SID_TEXTEDIT && nSId != SID_ATTR_CHAR && nSId != SID_TEXT_FITTOSIZE &&
217              nSId != SID_ATTR_CHAR_VERTICAL && nSId != SID_TEXT_FITTOSIZE_VERTICAL &&
218              nSId != SID_FORMATPAINTBRUSH &&
219              mpDrawView->IsTextEdit() )
220         {
221             mpDrawView->SdrEndTextEdit();
222         }
223 
224         if( HasCurrentFunction() )
225         {
226             nOldSId = GetCurrentFunction()->GetSlotID();
227 
228             if (nOldSId == nSId ||
229                 ((nOldSId == SID_TEXTEDIT || nOldSId == SID_ATTR_CHAR || nOldSId == SID_TEXT_FITTOSIZE ||
230                 nOldSId == SID_ATTR_CHAR_VERTICAL || nOldSId == SID_TEXT_FITTOSIZE_VERTICAL) &&
231                 (nSId == SID_TEXTEDIT || nSId == SID_ATTR_CHAR || nSId == SID_TEXT_FITTOSIZE ||
232                 nSId == SID_ATTR_CHAR_VERTICAL || nSId == SID_TEXT_FITTOSIZE_VERTICAL )))
233             {
234                 bPermanent = sal_True;
235             }
236 
237             GetCurrentFunction()->Deactivate();
238         }
239 
240         SetCurrentFunction(0);
241 
242         SfxBindings& rBind = GetViewFrame()->GetBindings();
243         rBind.Invalidate(nOldSId);
244         rBind.Update(nOldSId);
245     }
246 
247     // Slot wird gemapped (ToolboxImages/-Slots)
248     MapSlot( nSId );
249 
250     switch ( nSId )
251     {
252         case SID_TEXTEDIT:  // BASIC ???
253         case SID_ATTR_CHAR:
254         case SID_ATTR_CHAR_VERTICAL:
255         case SID_TEXT_FITTOSIZE:
256         case SID_TEXT_FITTOSIZE_VERTICAL:
257         {
258             SetCurrentFunction( FuText::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
259             GetCurrentFunction()->DoExecute(rReq);
260 
261             SfxBindings& rBindings = GetViewFrame()->GetBindings();
262             rBindings.Invalidate( SID_ATTR_CHAR );
263             rBindings.Invalidate( SID_ATTR_CHAR_VERTICAL );
264             rBindings.Invalidate( SID_TEXT_FITTOSIZE );
265             rBindings.Invalidate( SID_TEXT_FITTOSIZE_VERTICAL );
266 
267             // #98198# evtl. feed characters to activated textedit
268             if(SID_ATTR_CHAR == nSId && GetView() && GetView()->IsTextEdit())
269                 ImpAddPrintableCharactersToTextEdit(rReq, GetView());
270 
271             rReq.Done();
272         }
273         break;
274 
275         case SID_FM_CREATE_CONTROL:
276         {
277             SetCurrentFunction( FuConstructUnoControl::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
278             rReq.Done();
279         }
280         break;
281 
282         // #98721#
283         case SID_FM_CREATE_FIELDCONTROL:
284         {
285             SFX_REQUEST_ARG( rReq, pDescriptorItem, SfxUnoAnyItem, SID_FM_DATACCESS_DESCRIPTOR, sal_False );
286             DBG_ASSERT( pDescriptorItem, "DrawViewShell::FuPermanent(SID_FM_CREATE_FIELDCONTROL): invalid request args!" );
287 
288             if(pDescriptorItem)
289             {
290                 // get the form view
291                 FmFormView* pFormView = PTR_CAST(FmFormView, mpDrawView);
292                 SdrPageView* pPageView = pFormView ? pFormView->GetSdrPageView() : NULL;
293 
294                 if(pPageView)
295                 {
296                     ::svx::ODataAccessDescriptor aDescriptor(pDescriptorItem->GetValue());
297                     SdrObject* pNewDBField = pFormView->CreateFieldControl(aDescriptor);
298 
299                     if(pNewDBField)
300                     {
301                         Rectangle aVisArea = GetActiveWindow()->PixelToLogic(Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel()));
302                         Point aObjPos(aVisArea.Center());
303                         Size aObjSize(pNewDBField->GetLogicRect().GetSize());
304                         aObjPos.X() -= aObjSize.Width() / 2;
305                         aObjPos.Y() -= aObjSize.Height() / 2;
306                         Rectangle aNewObjectRectangle(aObjPos, aObjSize);
307 
308                         pNewDBField->SetLogicRect(aNewObjectRectangle);
309 
310                         GetView()->InsertObjectAtView(pNewDBField, *pPageView);
311                     }
312                 }
313             }
314             rReq.Done();
315         }
316         break;
317 
318         case SID_OBJECT_SELECT:
319         case SID_OBJECT_ROTATE:
320         case SID_OBJECT_MIRROR:
321         case SID_OBJECT_CROP:
322         case SID_OBJECT_TRANSPARENCE:
323         case SID_OBJECT_GRADIENT:
324         case SID_OBJECT_SHEAR:
325         case SID_OBJECT_CROOK_ROTATE:
326         case SID_OBJECT_CROOK_SLANT:
327         case SID_OBJECT_CROOK_STRETCH:
328         case SID_CONVERT_TO_3D_LATHE:
329         {
330             short nSlotId = rReq.GetSlot();
331 
332             if( nSlotId == SID_OBJECT_ROTATE )
333             {
334                 // togle rotation
335                 if( nOldSId == nSlotId )
336                 {
337                     nSlotId = SID_OBJECT_SELECT;
338                     rReq.SetSlot( nSlotId );
339                 }
340             }
341 
342             if (nSlotId == SID_OBJECT_CROOK_ROTATE ||
343                 nSlotId == SID_OBJECT_CROOK_SLANT ||
344                 nSlotId == SID_OBJECT_CROOK_STRETCH)
345             {
346                 if ( mpDrawView->GetMarkedObjectList().GetMarkCount() > 0 &&
347                     !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) )
348                 {
349                     if ( mpDrawView->IsPresObjSelected() )
350                     {
351                         ::sd::Window* pWindow = GetActiveWindow();
352                         InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
353                     }
354                     else if ( QueryBox(GetActiveWindow(), WB_YES_NO,
355                                       String(SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER) )
356                                       ).Execute() == RET_YES )
357                     {
358                         // Implizite Wandlung in Bezier
359                         WaitObject aWait( (Window*)GetActiveWindow() );
360                         mpDrawView->ConvertMarkedToPathObj(sal_False);
361                     }
362                 }
363             }
364             else if (nSlotId == SID_OBJECT_SHEAR)
365             {
366                 sal_uLong i = 0;
367                 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
368                 sal_uLong nMarkCnt = rMarkList.GetMarkCount();
369                 sal_Bool b3DObjMarked = sal_False;
370 
371                 while (i < nMarkCnt && !b3DObjMarked)
372                 {
373                     if (rMarkList.GetMark(i)->GetMarkedSdrObj()->ISA(E3dObject))
374                     {
375                         b3DObjMarked = sal_True;
376                     }
377                     else
378                     {
379                         i++;
380                     }
381                 }
382 
383                 if ( nMarkCnt > 0 && !b3DObjMarked &&
384                      (!mpDrawView->IsShearAllowed() || !mpDrawView->IsDistortAllowed()) )
385                 {
386                     if ( mpDrawView->IsPresObjSelected() )
387                     {
388                         ::sd::Window* pWindow = GetActiveWindow();
389                         InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
390                     }
391                     else if ( QueryBox(GetActiveWindow(), WB_YES_NO,
392                                       String(SdResId(STR_ASK_FOR_CONVERT_TO_BEZIER) )
393                                       ).Execute() == RET_YES )
394                     {
395                         // Implizite Wandlung in Bezier
396                         WaitObject aWait( (Window*)GetActiveWindow() );
397                         mpDrawView->ConvertMarkedToPathObj(sal_False);
398                     }
399                 }
400             }
401 
402             SetCurrentFunction( FuSelection::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq) );
403             rReq.Done();
404             Invalidate( SID_OBJECT_SELECT );
405         }
406         break;
407 
408         case SID_DRAW_LINE:
409         case SID_DRAW_XLINE:
410         case SID_DRAW_MEASURELINE:
411         case SID_LINE_ARROW_START:
412         case SID_LINE_ARROW_END:
413         case SID_LINE_ARROWS:
414         case SID_LINE_ARROW_CIRCLE:
415         case SID_LINE_CIRCLE_ARROW:
416         case SID_LINE_ARROW_SQUARE:
417         case SID_LINE_SQUARE_ARROW:
418 
419         case SID_DRAW_RECT:
420         case SID_DRAW_RECT_NOFILL:
421         case SID_DRAW_RECT_ROUND:
422         case SID_DRAW_RECT_ROUND_NOFILL:
423         case SID_DRAW_SQUARE:
424         case SID_DRAW_SQUARE_NOFILL:
425         case SID_DRAW_SQUARE_ROUND:
426         case SID_DRAW_SQUARE_ROUND_NOFILL:
427         case SID_DRAW_ELLIPSE:
428         case SID_DRAW_ELLIPSE_NOFILL:
429         case SID_DRAW_CIRCLE:
430         case SID_DRAW_CIRCLE_NOFILL:
431         case SID_DRAW_CAPTION:
432         case SID_DRAW_CAPTION_VERTICAL:
433         case SID_TOOL_CONNECTOR:
434         case SID_CONNECTOR_ARROW_START:
435         case SID_CONNECTOR_ARROW_END:
436         case SID_CONNECTOR_ARROWS:
437         case SID_CONNECTOR_CIRCLE_START:
438         case SID_CONNECTOR_CIRCLE_END:
439         case SID_CONNECTOR_CIRCLES:
440         case SID_CONNECTOR_LINE:
441         case SID_CONNECTOR_LINE_ARROW_START:
442         case SID_CONNECTOR_LINE_ARROW_END:
443         case SID_CONNECTOR_LINE_ARROWS:
444         case SID_CONNECTOR_LINE_CIRCLE_START:
445         case SID_CONNECTOR_LINE_CIRCLE_END:
446         case SID_CONNECTOR_LINE_CIRCLES:
447         case SID_CONNECTOR_CURVE:
448         case SID_CONNECTOR_CURVE_ARROW_START:
449         case SID_CONNECTOR_CURVE_ARROW_END:
450         case SID_CONNECTOR_CURVE_ARROWS:
451         case SID_CONNECTOR_CURVE_CIRCLE_START:
452         case SID_CONNECTOR_CURVE_CIRCLE_END:
453         case SID_CONNECTOR_CURVE_CIRCLES:
454         case SID_CONNECTOR_LINES:
455         case SID_CONNECTOR_LINES_ARROW_START:
456         case SID_CONNECTOR_LINES_ARROW_END:
457         case SID_CONNECTOR_LINES_ARROWS:
458         case SID_CONNECTOR_LINES_CIRCLE_START:
459         case SID_CONNECTOR_LINES_CIRCLE_END:
460         case SID_CONNECTOR_LINES_CIRCLES:
461         {
462             SetCurrentFunction( FuConstructRectangle::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
463             rReq.Done();
464         }
465         break;
466         case SID_DRAW_POLYGON:
467         case SID_DRAW_POLYGON_NOFILL:
468         case SID_DRAW_XPOLYGON:
469         case SID_DRAW_XPOLYGON_NOFILL:
470         case SID_DRAW_FREELINE:
471         case SID_DRAW_FREELINE_NOFILL:
472         case SID_DRAW_BEZIER_FILL:          // BASIC
473         case SID_DRAW_BEZIER_NOFILL:        // BASIC
474         {
475             SetCurrentFunction( FuConstructBezierPolygon::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent) );
476             rReq.Done();
477         }
478         break;
479 
480         case SID_GLUE_EDITMODE:
481         {
482             if (nOldSId != SID_GLUE_EDITMODE)
483             {
484                 SetCurrentFunction( FuEditGluePoints::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
485             }
486             else
487             {
488                 GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
489             }
490 
491             rReq.Done();
492         }
493         break;
494 
495         case SID_DRAW_ARC:
496         case SID_DRAW_CIRCLEARC:
497         case SID_DRAW_PIE:
498         case SID_DRAW_PIE_NOFILL:
499         case SID_DRAW_CIRCLEPIE:
500         case SID_DRAW_CIRCLEPIE_NOFILL:
501         case SID_DRAW_ELLIPSECUT:
502         case SID_DRAW_ELLIPSECUT_NOFILL:
503         case SID_DRAW_CIRCLECUT:
504         case SID_DRAW_CIRCLECUT_NOFILL:
505         {
506             SetCurrentFunction( FuConstructArc::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent) );
507             rReq.Done();
508         }
509         break;
510 
511         case SID_3D_CUBE:
512         case SID_3D_SHELL:
513         case SID_3D_SPHERE:
514         case SID_3D_TORUS:
515         case SID_3D_HALF_SPHERE:
516         case SID_3D_CYLINDER:
517         case SID_3D_CONE:
518         case SID_3D_PYRAMID:
519         {
520             SetCurrentFunction( FuConstruct3dObject::Create(this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
521             rReq.Done();
522         }
523         break;
524 
525         case SID_DRAWTBX_CS_BASIC :
526         case SID_DRAWTBX_CS_SYMBOL :
527         case SID_DRAWTBX_CS_ARROW :
528         case SID_DRAWTBX_CS_FLOWCHART :
529         case SID_DRAWTBX_CS_CALLOUT :
530         case SID_DRAWTBX_CS_STAR :
531         case SID_DRAW_CS_ID :
532         {
533             SetCurrentFunction( FuConstructCustomShape::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq, bPermanent ) );
534             rReq.Done();
535 
536             if ( nSId != SID_DRAW_CS_ID )
537             {
538                 SfxBindings& rBind = GetViewFrame()->GetBindings();
539                 rBind.Invalidate( nSId );
540                 rBind.Update( nSId );
541             }
542         }
543         break;
544 
545         case SID_FORMATPAINTBRUSH:
546         {
547             SetCurrentFunction( FuFormatPaintBrush::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
548             rReq.Done();
549             SfxBindings& rBind = GetViewFrame()->GetBindings();
550             rBind.Invalidate( nSId );
551             rBind.Update( nSId );
552             break;
553         }
554 
555         default:
556         break;
557     }
558 
559     if(HasOldFunction())
560     {
561         sal_uInt16 nSlotId = GetOldFunction()->GetSlotID();
562 
563         GetOldFunction()->Deactivate();
564         SetOldFunction(0);
565 
566         SfxBindings& rBind = GetViewFrame()->GetBindings();
567         rBind.Invalidate( nSlotId );
568         rBind.Update( nSlotId );
569     }
570 
571     if(HasCurrentFunction())
572     {
573         GetCurrentFunction()->Activate();
574         SetOldFunction( GetCurrentFunction() );
575 
576         SetHelpId( GetCurrentFunction()->GetSlotID() );
577     }
578 
579     // Shell wird invalidiert, schneller als einzeln (laut MI)
580     // Jetzt explizit der letzte Slot incl. Update()
581     Invalidate();
582 
583     // #97016# III CTRL-SID_OBJECT_SELECT -> select first draw object if none is selected yet
584     if(SID_OBJECT_SELECT == nSId && HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1))
585     {
586         if(!GetView()->AreObjectsMarked())
587         {
588             // select first object
589             GetView()->UnmarkAllObj();
590             GetView()->MarkNextObj(sal_True);
591 
592             // ...and make it visible
593             if(GetView()->AreObjectsMarked())
594                 GetView()->MakeVisible(GetView()->GetAllMarkedRect(), *GetActiveWindow());
595         }
596     }
597 
598     // #97016# with qualifier construct directly
599     if(HasCurrentFunction() && (rReq.GetModifier() & KEY_MOD1))
600     {
601         // get SdOptions
602         SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType());
603         sal_uInt32 nDefaultObjectSizeWidth(pOptions->GetDefaultObjectSizeWidth());
604         sal_uInt32 nDefaultObjectSizeHeight(pOptions->GetDefaultObjectSizeHeight());
605 
606         // calc position and size
607         Rectangle aVisArea = GetActiveWindow()->PixelToLogic(Rectangle(Point(0,0), GetActiveWindow()->GetOutputSizePixel()));
608         Point aPagePos = aVisArea.Center();
609         aPagePos.X() -= nDefaultObjectSizeWidth / 2;
610         aPagePos.Y() -= nDefaultObjectSizeHeight / 2;
611         Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight));
612         SdrPageView* pPageView = mpDrawView->GetSdrPageView();
613 
614         if(pPageView)
615         {
616             // create the default object
617             SdrObject* pObj = GetCurrentFunction()->CreateDefaultObject(nSId, aNewObjectRectangle);
618 
619             if(pObj)
620             {
621                 // insert into page
622                 GetView()->InsertObjectAtView(pObj, *pPageView);
623 
624                 // Now that pFuActual has done what it was created for we
625                 // can switch on the edit mode for callout objects.
626                 switch (nSId)
627                 {
628                     case SID_DRAW_CAPTION:
629                     case SID_DRAW_CAPTION_VERTICAL:
630                     {
631                         // Make FuText the current function.
632                         SfxUInt16Item aItem (SID_TEXTEDIT, 1);
633                         GetViewFrame()->GetDispatcher()->
634                             Execute(SID_TEXTEDIT, SFX_CALLMODE_SYNCHRON |
635                                 SFX_CALLMODE_RECORD, &aItem, 0L);
636                         // Put text object into edit mode.
637                         GetView()->SdrBeginTextEdit(static_cast<SdrTextObj*>(pObj), pPageView);
638                         break;
639                     }
640                 }
641             }
642         }
643     }
644 }
645 
646 //////////////////////////////////////////////////////////////////////////////
647 // service routine for Undo/Redo implementation
648 extern SfxUndoManager* ImpGetUndoManagerFromViewShell(DrawViewShell& rDViewShell);
649 
650 /*************************************************************************
651 |*
652 |* SfxRequests fuer Support-Funktionen
653 |*
654 \************************************************************************/
655 
656 void DrawViewShell::FuSupport(SfxRequest& rReq)
657 {
658     if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs())
659         GetDocSh()->SetStyleFamily(((SfxUInt16Item&)rReq.GetArgs()->Get( SID_STYLE_FAMILY )).GetValue());
660 
661     // Waehrend einer Native-Diashow wird nichts ausgefuehrt!
662     if(SlideShow::IsRunning(GetViewShellBase()) &&
663         (rReq.GetSlot() != SID_PRESENTATION_END &&
664          rReq.GetSlot() != SID_SIZE_PAGE))
665         return;
666 
667     CheckLineTo (rReq);
668 
669     if( !mpDrawView )
670         return;
671 
672     sal_uInt16 nSId = rReq.GetSlot();
673 
674     // Slot wird evtl. gemapped (ToolboxImages/-Slots)
675     MapSlot( nSId );
676 
677     switch ( nSId )
678     {
679         case SID_CLEAR_UNDO_STACK:
680         {
681             GetDocSh()->ClearUndoBuffer();
682             rReq.Ignore ();
683         }
684         break;
685 
686         // Slots der ToolboxController gemapped ausfuehren
687         case SID_OBJECT_CHOOSE_MODE:
688         case SID_POSITION:
689         case SID_OBJECT_ALIGN:
690         case SID_ZOOM_TOOLBOX:
691         case SID_DRAWTBX_TEXT:
692         case SID_DRAWTBX_RECTANGLES:
693         case SID_DRAWTBX_ELLIPSES:
694         case SID_DRAWTBX_LINES:
695         case SID_DRAWTBX_ARROWS:
696         case SID_DRAWTBX_3D_OBJECTS:
697         case SID_DRAWTBX_CONNECTORS:
698         case SID_DRAWTBX_INSERT:
699         {
700             sal_uInt16 nMappedSlot = GetMappedSlot( nSId );
701             if( nMappedSlot > 0 )
702             {
703                 SfxRequest aReq( nMappedSlot, 0, GetDoc()->GetItemPool() );
704                 ExecuteSlot( aReq );
705             }
706         }
707         break;
708 
709         case SID_PRESENTATION:
710         case SID_REHEARSE_TIMINGS:
711         {
712             Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() );
713             if( xPresentation.is() )
714             {
715                 if( ( SID_REHEARSE_TIMINGS != rReq.GetSlot() ) )
716                     xPresentation->start();
717                 else
718                     xPresentation->rehearseTimings();
719             }
720             rReq.Ignore ();
721         }
722         break;
723 
724         case SID_PRESENTATION_END:
725         {
726             StopSlideShow(true);
727 
728             rReq.Ignore ();
729         }
730         break;
731 
732         case SID_BEZIER_EDIT:
733         {
734             mpDrawView->SetFrameDragSingles(!mpDrawView->IsFrameDragSingles());
735 
736             /******************************************************************
737             * ObjectBar einschalten
738             ******************************************************************/
739             if( dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) || dynamic_cast< FuConstructBezierPolygon* >( GetCurrentFunction().get() ) )
740             {
741                 // Tell the tool bar manager about the context change.
742                 GetViewShellBase().GetToolBarManager()->SelectionHasChanged(*this,*mpDrawView);
743             }
744 
745             Invalidate(SID_BEZIER_EDIT);
746             rReq.Ignore();
747         }
748         break;
749 
750         case SID_OBJECT_CLOSE:
751         {
752             const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
753             if ( rMarkList.GetMark(0) && !mpDrawView->IsAction() )
754             {
755                 SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetMarkedSdrObj();
756                 const bool bUndo = mpDrawView->IsUndoEnabled();
757                 if( bUndo )
758                     mpDrawView->BegUndo(String(SdResId(STR_UNDO_BEZCLOSE)));
759 
760                 mpDrawView->UnmarkAllPoints();
761 
762                 if( bUndo )
763                     mpDrawView->AddUndo(new SdrUndoGeoObj(*pPathObj));
764 
765                 pPathObj->ToggleClosed();
766 
767                 if( bUndo )
768                     mpDrawView->EndUndo();
769             }
770             rReq.Done();
771         }
772         break;
773 
774         case SID_CUT:
775         {
776             if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) )
777             {
778                 ::sd::Window* pWindow = GetActiveWindow();
779                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
780             }
781             else
782             {
783                 if(HasCurrentFunction())
784                 {
785                     GetCurrentFunction()->DoCut();
786                 }
787                 else if(mpDrawView)
788                 {
789                     mpDrawView->DoCut();
790                 }
791             }
792             rReq.Ignore ();
793         }
794         break;
795 
796         case SID_COPY:
797         {
798             if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) )
799             {
800                 ::sd::Window* pWindow = GetActiveWindow();
801                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
802             }
803             else
804             {
805                 if(HasCurrentFunction())
806                 {
807                     GetCurrentFunction()->DoCopy();
808                 }
809                 else if( mpDrawView )
810                 {
811                     mpDrawView->DoCopy();
812                 }
813             }
814             rReq.Ignore ();
815         }
816         break;
817 
818         case SID_PASTE:
819         {
820             WaitObject aWait( (Window*)GetActiveWindow() );
821 
822             if(HasCurrentFunction())
823             {
824                 GetCurrentFunction()->DoPaste();
825             }
826             else if(mpDrawView)
827             {
828                 mpDrawView->DoPaste();
829             }
830 
831             rReq.Ignore ();
832         }
833         break;
834 
835         case SID_CLIPBOARD_FORMAT_ITEMS:
836         {
837             WaitObject              aWait( (Window*)GetActiveWindow() );
838             TransferableDataHelper  aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
839             const SfxItemSet*       pReqArgs = rReq.GetArgs();
840             sal_uInt32                  nFormat = 0;
841 
842             if( pReqArgs )
843             {
844                 SFX_REQUEST_ARG( rReq, pIsActive, SfxUInt32Item, SID_CLIPBOARD_FORMAT_ITEMS, sal_False );
845                 nFormat = pIsActive->GetValue();
846             }
847 
848 
849             if( nFormat && aDataHelper.GetTransferable().is() )
850             {
851                 sal_Int8 nAction = DND_ACTION_COPY;
852 
853                 if( !mpDrawView->InsertData( aDataHelper,
854                                           GetActiveWindow()->PixelToLogic( Rectangle( Point(), GetActiveWindow()->GetOutputSizePixel() ).Center() ),
855                                           nAction, sal_False, nFormat ) )
856                 {
857                     INetBookmark    aINetBookmark( aEmptyStr, aEmptyStr );
858 
859                     if( ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) &&
860                           aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, aINetBookmark ) ) ||
861                         ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) &&
862                           aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR, aINetBookmark ) ) ||
863                         ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) &&
864                           aDataHelper.GetINetBookmark( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR, aINetBookmark ) ) )
865                     {
866                         InsertURLField( aINetBookmark.GetURL(), aINetBookmark.GetDescription(), aEmptyStr, NULL );
867                     }
868                 }
869             }
870         }
871         break;
872 
873         case SID_DELETE:
874         {
875             if ( mpDrawView->IsTextEdit() )
876             {
877                 OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
878 
879                 if (pOLV)
880                 {
881                     KeyCode aKCode(KEY_DELETE);
882                     KeyEvent aKEvt( 0, aKCode);
883                     pOLV->PostKeyEvent(aKEvt);
884                 }
885             }
886             else if ( mpDrawView->IsPresObjSelected(sal_False, sal_True, sal_False, sal_True) )
887             {
888                 ::sd::Window* pWindow = GetActiveWindow();
889                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
890             }
891             else
892             {
893                 KeyCode aKCode(KEY_DELETE);
894                 KeyEvent aKEvt( 0, aKCode);
895 
896                 bool bConsumed = mpDrawView && mpDrawView->getSmartTags().KeyInput( aKEvt );
897 
898                 if( !bConsumed && HasCurrentFunction() )
899                     bConsumed = GetCurrentFunction()->KeyInput(aKEvt);
900 
901                 if( !bConsumed && mpDrawView )
902                     mpDrawView->DeleteMarked();
903             }
904             rReq.Ignore ();
905         }
906         break;
907 
908         case SID_NOTESMODE:
909         case SID_HANDOUTMODE:
910             // AutoLayouts have to be ready.
911             GetDoc()->StopWorkStartupDelay();
912             // Fall through to following case statements.
913 
914         case SID_DRAWINGMODE:
915         case SID_DIAMODE:
916         case SID_OUTLINEMODE:
917             // Let the sub-shell manager handle the slot handling.
918             framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot(
919                 nSId,
920                 rReq);
921             rReq.Ignore ();
922             break;
923 
924         case SID_MASTERPAGE:          // BASIC
925         case SID_SLIDE_MASTERPAGE:    // BASIC
926         case SID_TITLE_MASTERPAGE:    // BASIC
927         case SID_NOTES_MASTERPAGE:    // BASIC
928         case SID_HANDOUT_MASTERPAGE:  // BASIC
929         {
930             // AutoLayouts muessen fertig sein
931             GetDoc()->StopWorkStartupDelay();
932 
933             const SfxItemSet* pReqArgs = rReq.GetArgs();
934 
935             if ( pReqArgs )
936             {
937                 SFX_REQUEST_ARG (rReq, pIsActive, SfxBoolItem, SID_MASTERPAGE, sal_False);
938                 mbIsLayerModeActive = pIsActive->GetValue ();
939             }
940 
941             Broadcast (
942                 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START));
943 
944             if (nSId == SID_MASTERPAGE                                       ||
945                 (nSId == SID_SLIDE_MASTERPAGE   && mePageKind == PK_STANDARD) ||
946                 (nSId == SID_TITLE_MASTERPAGE   && mePageKind == PK_STANDARD) ||
947                 (nSId == SID_NOTES_MASTERPAGE   && mePageKind == PK_NOTES)    ||
948                 (nSId == SID_HANDOUT_MASTERPAGE && mePageKind == PK_HANDOUT))
949             {
950                 if (nSId == SID_TITLE_MASTERPAGE ||
951                     nSId == SID_SLIDE_MASTERPAGE)
952                 {
953                     // Gibt es eine Seite mit dem AutoLayout "Titel"?
954                     sal_Bool bFound = sal_False;
955                     sal_uInt16 i = 0;
956                     sal_uInt16 nCount = GetDoc()->GetSdPageCount(PK_STANDARD);
957 
958                     while (i < nCount && !bFound)
959                     {
960                         SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);
961 
962                         if (nSId == SID_TITLE_MASTERPAGE && pPage->GetAutoLayout() == AUTOLAYOUT_TITLE)
963                         {
964                             bFound = sal_True;
965                             SwitchPage((pPage->GetPageNum() - 1) / 2);
966                         }
967                         else if (nSId == SID_SLIDE_MASTERPAGE && pPage->GetAutoLayout() != AUTOLAYOUT_TITLE)
968                         {
969                             bFound = sal_True;
970                             SwitchPage((pPage->GetPageNum() - 1) / 2);
971                         }
972 
973                         i++;
974                     }
975                 }
976 
977                 // Default-Layer der MasterPage einschalten
978                 mpDrawView->SetActiveLayer( String( SdResId(STR_LAYER_BCKGRNDOBJ) ) );
979 
980                 ChangeEditMode(EM_MASTERPAGE, mbIsLayerModeActive);
981 
982                 if(HasCurrentFunction(SID_BEZIER_EDIT))
983                     GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);
984             }
985             else
986             {
987                 // Switch to requested ViewShell.
988                 ::OUString sRequestedView;
989                 PageKind ePageKind;
990                 switch (nSId)
991                 {
992                     case SID_SLIDE_MASTERPAGE:
993                     case SID_TITLE_MASTERPAGE:
994                     default:
995                         sRequestedView = framework::FrameworkHelper::msImpressViewURL;
996                         ePageKind = PK_STANDARD;
997                         break;
998 
999                     case SID_NOTES_MASTERPAGE:
1000                         sRequestedView = framework::FrameworkHelper::msNotesViewURL;
1001                         ePageKind = PK_NOTES;
1002                         break;
1003 
1004                     case SID_HANDOUT_MASTERPAGE:
1005                         sRequestedView = framework::FrameworkHelper::msHandoutViewURL;
1006                         ePageKind = PK_HANDOUT;
1007                         break;
1008                 }
1009 
1010                 mpFrameView->SetViewShEditMode(EM_MASTERPAGE, ePageKind);
1011                 mpFrameView->SetLayerMode(mbIsLayerModeActive);
1012                 framework::FrameworkHelper::Instance(GetViewShellBase())->RequestView(
1013                     sRequestedView,
1014                     framework::FrameworkHelper::msCenterPaneURL);
1015             }
1016             Broadcast (
1017                 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END));
1018 
1019             InvalidateWindows();
1020             Invalidate();
1021 
1022             rReq.Done();
1023         }
1024         break;
1025 
1026 
1027         case SID_CLOSE_MASTER_VIEW:
1028         {
1029             Broadcast (
1030                 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_START));
1031 
1032             // Switch page back to the first one.  Not doing so leads to a
1033             // crash.  This seems to be some bug in the edit mode switching
1034             // and page switching methods.
1035             SwitchPage (0);
1036             ChangeEditMode(EM_PAGE, IsLayerModeActive());
1037             Broadcast (
1038                 ViewShellHint(ViewShellHint::HINT_CHANGE_EDIT_MODE_END));
1039 
1040             if(HasCurrentFunction(SID_BEZIER_EDIT))
1041             {
1042                 GetViewFrame()->GetDispatcher()->Execute(
1043                     SID_OBJECT_SELECT,
1044                     SFX_CALLMODE_ASYNCHRON);
1045             }
1046 
1047 
1048             rReq.Done();
1049         }
1050         break;
1051 
1052 
1053         case SID_RULER:
1054         {
1055             const SfxItemSet* pReqArgs = rReq.GetArgs();
1056 
1057             // #97516# Remember old ruler state
1058             sal_Bool bOldHasRuler(HasRuler());
1059 
1060             if ( pReqArgs )
1061             {
1062                 SFX_REQUEST_ARG (rReq, pIsActive, SfxBoolItem, SID_RULER, sal_False);
1063                 SetRuler (pIsActive->GetValue ());
1064             }
1065             else SetRuler (!HasRuler());
1066 
1067             // #97516# Did ruler state change? Tell that to SdOptions, too.
1068             sal_Bool bHasRuler(HasRuler());
1069 
1070             if(bOldHasRuler != bHasRuler)
1071             {
1072                 SdOptions* pOptions = SD_MOD()->GetSdOptions(GetDoc()->GetDocumentType());
1073 
1074                 if(pOptions && pOptions->IsRulerVisible() != bHasRuler)
1075                 {
1076                     pOptions->SetRulerVisible(bHasRuler);
1077                 }
1078             }
1079 
1080             Invalidate (SID_RULER);
1081             Resize();
1082             rReq.Done ();
1083         }
1084         break;
1085 
1086         case SID_SIZE_PAGE:
1087         case SID_SIZE_PAGE_WIDTH:  // BASIC
1088         {
1089             mbZoomOnPage = ( rReq.GetSlot() == SID_SIZE_PAGE );
1090 
1091             SdrPageView* pPageView = mpDrawView->GetSdrPageView();
1092 
1093             if ( pPageView )
1094             {
1095                 Point aPagePos(0, 0); // = pPageView->GetOffset();
1096                 Size aPageSize = pPageView->GetPage()->GetSize();
1097 
1098                 aPagePos.X() += aPageSize.Width()  / 2;
1099                 aPageSize.Width() = (long) (aPageSize.Width() * 1.03);
1100 
1101                 if( rReq.GetSlot() == SID_SIZE_PAGE )
1102                 {
1103                     aPagePos.Y() += aPageSize.Height() / 2;
1104                     aPageSize.Height() = (long) (aPageSize.Height() * 1.03);
1105                     aPagePos.Y() -= aPageSize.Height() / 2;
1106                 }
1107                 else
1108                 {
1109                     Point aPt = GetActiveWindow()->PixelToLogic( Point( 0, GetActiveWindow()->GetSizePixel().Height() / 2 ) );
1110                     aPagePos.Y() += aPt.Y();
1111                     aPageSize.Height() = 2;
1112                 }
1113 
1114                 aPagePos.X() -= aPageSize.Width()  / 2;
1115 
1116                 SetZoomRect( Rectangle( aPagePos, aPageSize ) );
1117 
1118                 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
1119                                               GetActiveWindow()->GetOutputSizePixel()) );
1120                 mpZoomList->InsertZoomRect(aVisAreaWin);
1121             }
1122             Invalidate( SID_ZOOM_IN );
1123             Invalidate( SID_ZOOM_OUT );
1124             Invalidate( SID_ZOOM_PANNING );
1125             Invalidate( SID_ZOOM_TOOLBOX );
1126             rReq.Done ();
1127         }
1128         break;
1129 
1130         case SID_SIZE_REAL:  // BASIC
1131         {
1132             mbZoomOnPage = sal_False;
1133             SetZoom( 100 );
1134             Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
1135                                               GetActiveWindow()->GetOutputSizePixel()) );
1136             mpZoomList->InsertZoomRect(aVisAreaWin);
1137             Invalidate( SID_ZOOM_IN );
1138             Invalidate( SID_ZOOM_OUT );
1139             Invalidate( SID_ZOOM_PANNING );
1140             Invalidate( SID_ZOOM_TOOLBOX );
1141             rReq.Done ();
1142         }
1143         break;
1144 
1145         case SID_ZOOM_IN:  // BASIC
1146         {
1147             mbZoomOnPage = sal_False;
1148             SetZoom( Max( (long) ( GetActiveWindow()->GetZoom() / 2 ), (long) GetActiveWindow()->GetMinZoom() ) );
1149             Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
1150                                               GetActiveWindow()->GetOutputSizePixel()) );
1151             mpZoomList->InsertZoomRect(aVisAreaWin);
1152             Invalidate( SID_ZOOM_IN );
1153             Invalidate( SID_ZOOM_OUT );
1154             Invalidate( SID_ZOOM_PANNING );
1155             Invalidate( SID_ZOOM_TOOLBOX );
1156             rReq.Done ();
1157         }
1158         break;
1159 
1160         case SID_SIZE_VISAREA:
1161         {
1162             Rectangle aVisArea = mpFrameView->GetVisArea();
1163             Size aVisAreaSize = aVisArea.GetSize();
1164 
1165             if (aVisAreaSize.Height()!=0 && aVisAreaSize.Width()!=0)
1166             {
1167                 mbZoomOnPage = sal_False;
1168                 SetZoomRect(aVisArea);
1169                 Invalidate( SID_ZOOM_IN );
1170                 Invalidate( SID_ZOOM_OUT );
1171                 Invalidate( SID_ZOOM_PANNING );
1172                 Invalidate( SID_ZOOM_TOOLBOX );
1173             }
1174             rReq.Done ();
1175         }
1176         break;
1177 
1178         // Namensverwirrung: SID_SIZE_OPTIMAL -> Zoom auf selektierte Objekte
1179         // --> Wird als Objektzoom im Programm angeboten
1180         case SID_SIZE_OPTIMAL:  // BASIC
1181         {
1182             mbZoomOnPage = sal_False;
1183             if ( mpDrawView->AreObjectsMarked() )
1184             {
1185                 maMarkRect = mpDrawView->GetAllMarkedRect();
1186                 long nW = (long) (maMarkRect.GetWidth()  * 1.03);
1187                 long nH = (long) (maMarkRect.GetHeight() * 1.03);
1188                 Point aPos = maMarkRect.Center();
1189                 aPos.X() -= nW / 2;
1190                 aPos.Y() -= nH / 2;
1191                 if ( nW && nH )
1192                 {
1193                     SetZoomRect(Rectangle(aPos, Size(nW, nH)));
1194 
1195                     Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
1196                                               GetActiveWindow()->GetOutputSizePixel()) );
1197                     mpZoomList->InsertZoomRect(aVisAreaWin);
1198                 }
1199             }
1200             Invalidate( SID_ZOOM_IN );
1201             Invalidate( SID_ZOOM_OUT );
1202             Invalidate( SID_ZOOM_PANNING );
1203             Invalidate( SID_ZOOM_TOOLBOX );
1204             rReq.Done ();
1205         }
1206         break;
1207 
1208         // Namensverwirrung: SID_SIZE_ALL -> Zoom auf alle Objekte
1209         // --> Wird als Optimal im Programm angeboten
1210         case SID_SIZE_ALL:  // BASIC
1211         {
1212             mbZoomOnPage = sal_False;
1213             SdrPageView* pPageView = mpDrawView->GetSdrPageView();
1214 
1215             if( pPageView )
1216             {
1217                 Rectangle aBoundRect( pPageView->GetObjList()->GetAllObjBoundRect() );
1218 
1219                 long nW = (long) (aBoundRect.GetWidth() * 1.03);
1220                 long nH = (long) (aBoundRect.GetHeight() * 1.03);
1221                 Point aPos = aBoundRect.Center();
1222                 aPos.X() -= nW / 2;
1223                 aPos.Y() -= nH / 2;
1224                 if ( nW && nH )
1225                 {
1226                     SetZoomRect( Rectangle( aPos, Size( nW, nH ) ) );
1227 
1228                     Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
1229                                               GetActiveWindow()->GetOutputSizePixel()) );
1230                     mpZoomList->InsertZoomRect(aVisAreaWin);
1231                 }
1232 
1233                 Invalidate( SID_ZOOM_IN );
1234                 Invalidate( SID_ZOOM_OUT );
1235                 Invalidate( SID_ZOOM_PANNING );
1236                 Invalidate( SID_ZOOM_TOOLBOX );
1237             }
1238             rReq.Done ();
1239         }
1240         break;
1241 
1242         case SID_ZOOM_PREV:
1243         {
1244             if (mpDrawView->IsTextEdit())
1245             {
1246                 mpDrawView->SdrEndTextEdit();
1247             }
1248 
1249             if (mpZoomList->IsPreviousPossible())
1250             {
1251                 // Vorheriges ZoomRect einstellen
1252                 SetZoomRect(mpZoomList->GetPreviousZoomRect());
1253             }
1254             rReq.Done ();
1255             Invalidate( SID_ZOOM_TOOLBOX );
1256         }
1257         break;
1258 
1259         case SID_ZOOM_NEXT:
1260         {
1261             if (mpDrawView->IsTextEdit())
1262             {
1263                 mpDrawView->SdrEndTextEdit();
1264             }
1265 
1266             if (mpZoomList->IsNextPossible())
1267             {
1268                 // Naechstes ZoomRect einstellen
1269                 SetZoomRect(mpZoomList->GetNextZoomRect());
1270             }
1271             rReq.Done ();
1272             Invalidate( SID_ZOOM_TOOLBOX );
1273         }
1274         break;
1275 
1276         case SID_GLUE_INSERT_POINT:
1277         case SID_GLUE_PERCENT:
1278         case SID_GLUE_ESCDIR:
1279         case SID_GLUE_ESCDIR_LEFT:
1280         case SID_GLUE_ESCDIR_RIGHT:
1281         case SID_GLUE_ESCDIR_TOP:
1282         case SID_GLUE_ESCDIR_BOTTOM:
1283         case SID_GLUE_HORZALIGN_CENTER:
1284         case SID_GLUE_HORZALIGN_LEFT:
1285         case SID_GLUE_HORZALIGN_RIGHT:
1286         case SID_GLUE_VERTALIGN_CENTER:
1287         case SID_GLUE_VERTALIGN_TOP:
1288         case SID_GLUE_VERTALIGN_BOTTOM:
1289         {
1290             FunctionReference xFunc( GetCurrentFunction() );
1291             FuEditGluePoints* pFunc = dynamic_cast< FuEditGluePoints* >( xFunc.get() );
1292 
1293             if(pFunc)
1294                 pFunc->ReceiveRequest(rReq);
1295 
1296             rReq.Done();
1297         }
1298         break;
1299 
1300 #ifdef DBG_UTIL
1301         case SID_SHOW_ITEMBROWSER:
1302         {
1303             mpDrawView->ShowItemBrowser( !mpDrawView->IsItemBrowserVisible() );
1304             rReq.Done ();
1305         }
1306         break;
1307 #endif
1308 
1309         case SID_AUTOSPELL_CHECK:
1310         {
1311             sal_Bool bOnlineSpell = !GetDoc()->GetOnlineSpell();
1312             GetDoc()->SetOnlineSpell(bOnlineSpell);
1313 
1314             ::Outliner* pOL = mpDrawView->GetTextEditOutliner();
1315 
1316             if (pOL)
1317             {
1318                 sal_uLong nCntrl = pOL->GetControlWord();
1319 
1320                 if (bOnlineSpell)
1321                     nCntrl |= EE_CNTRL_ONLINESPELLING;
1322                 else
1323                     nCntrl &= ~EE_CNTRL_ONLINESPELLING;
1324 
1325                 pOL->SetControlWord(nCntrl);
1326             }
1327 
1328             GetActiveWindow()->Invalidate();
1329             rReq.Done ();
1330         }
1331         break;
1332 
1333         case SID_CONVERT_TO_1BIT_THRESHOLD:
1334         case SID_CONVERT_TO_1BIT_MATRIX:
1335         case SID_CONVERT_TO_4BIT_GRAYS:
1336         case SID_CONVERT_TO_4BIT_COLORS:
1337         case SID_CONVERT_TO_8BIT_GRAYS:
1338         case SID_CONVERT_TO_8BIT_COLORS:
1339         case SID_CONVERT_TO_24BIT:
1340         {
1341             BmpConversion eBmpConvert = BMP_CONVERSION_NONE;
1342 
1343             switch( nSId )
1344             {
1345                 case SID_CONVERT_TO_1BIT_THRESHOLD:
1346                     eBmpConvert = BMP_CONVERSION_1BIT_THRESHOLD;
1347                     break;
1348 
1349                 case SID_CONVERT_TO_1BIT_MATRIX:
1350                     eBmpConvert = BMP_CONVERSION_1BIT_MATRIX;
1351                     break;
1352 
1353                 case SID_CONVERT_TO_4BIT_GRAYS:
1354                     eBmpConvert = BMP_CONVERSION_4BIT_GREYS;
1355                     break;
1356 
1357                 case SID_CONVERT_TO_4BIT_COLORS:
1358                     eBmpConvert = BMP_CONVERSION_4BIT_COLORS;
1359                     break;
1360 
1361                 case SID_CONVERT_TO_8BIT_GRAYS:
1362                     eBmpConvert = BMP_CONVERSION_8BIT_GREYS;
1363                     break;
1364 
1365                 case SID_CONVERT_TO_8BIT_COLORS:
1366                     eBmpConvert = BMP_CONVERSION_8BIT_COLORS;
1367                     break;
1368 
1369                 case SID_CONVERT_TO_24BIT:
1370                     eBmpConvert = BMP_CONVERSION_24BIT;
1371                     break;
1372             }
1373 
1374             mpDrawView->BegUndo(String(SdResId(STR_UNDO_COLORRESOLUTION)));
1375             const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
1376 
1377             for (sal_uLong i=0; i<rMarkList.GetMarkCount(); i++)
1378             {
1379                 SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
1380 
1381                 if (pObj->GetObjInventor() == SdrInventor)
1382                 {
1383                     if (pObj->GetObjIdentifier() == OBJ_GRAF && !((SdrGrafObj*) pObj)->IsLinkedGraphic())
1384                     {
1385                         const Graphic& rGraphic = ((SdrGrafObj*) pObj)->GetGraphic();
1386 
1387                         if( rGraphic.GetType() == GRAPHIC_BITMAP )
1388                         {
1389                             SdrGrafObj* pNewObj = (SdrGrafObj*) pObj->Clone();
1390 
1391                             if( rGraphic.IsAnimated() )
1392                             {
1393                                 Animation aAnim( rGraphic.GetAnimation() );
1394                                 aAnim.Convert( eBmpConvert );
1395                                 pNewObj->SetGraphic( aAnim );
1396                             }
1397                             else
1398                             {
1399                                 BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
1400                                 aBmpEx.Convert( eBmpConvert );
1401                                 pNewObj->SetGraphic( aBmpEx );
1402                             }
1403 
1404                             mpDrawView->ReplaceObjectAtView( pObj, *mpDrawView->GetSdrPageView(), pNewObj );
1405                         }
1406                     }
1407                 }
1408             }
1409 
1410             mpDrawView->EndUndo();
1411             rReq.Done ();
1412         }
1413         break;
1414 
1415         case SID_TRANSLITERATE_SENTENCE_CASE:
1416         case SID_TRANSLITERATE_TITLE_CASE:
1417         case SID_TRANSLITERATE_TOGGLE_CASE:
1418         case SID_TRANSLITERATE_UPPER:
1419         case SID_TRANSLITERATE_LOWER:
1420         case SID_TRANSLITERATE_HALFWIDTH:
1421         case SID_TRANSLITERATE_FULLWIDTH:
1422         case SID_TRANSLITERATE_HIRAGANA:
1423         case SID_TRANSLITERATE_KATAGANA:
1424         {
1425             OutlinerView* pOLV = GetView()->GetTextEditOutlinerView();
1426             if( pOLV )
1427             {
1428                 using namespace ::com::sun::star::i18n;
1429                 sal_Int32 nType = 0;
1430 
1431                 switch( nSId )
1432                 {
1433                     case SID_TRANSLITERATE_SENTENCE_CASE:
1434                         nType = TransliterationModulesExtra::SENTENCE_CASE;
1435                         break;
1436                     case SID_TRANSLITERATE_TITLE_CASE:
1437                         nType = TransliterationModulesExtra::TITLE_CASE;
1438                         break;
1439                     case SID_TRANSLITERATE_TOGGLE_CASE:
1440                         nType = TransliterationModulesExtra::TOGGLE_CASE;
1441                         break;
1442                     case SID_TRANSLITERATE_UPPER:
1443                         nType = TransliterationModules_LOWERCASE_UPPERCASE;
1444                         break;
1445                     case SID_TRANSLITERATE_LOWER:
1446                         nType = TransliterationModules_UPPERCASE_LOWERCASE;
1447                         break;
1448                     case SID_TRANSLITERATE_HALFWIDTH:
1449                         nType = TransliterationModules_FULLWIDTH_HALFWIDTH;
1450                         break;
1451                     case SID_TRANSLITERATE_FULLWIDTH:
1452                         nType = TransliterationModules_HALFWIDTH_FULLWIDTH;
1453                         break;
1454                     case SID_TRANSLITERATE_HIRAGANA:
1455                         nType = TransliterationModules_KATAKANA_HIRAGANA;
1456                         break;
1457                     case SID_TRANSLITERATE_KATAGANA:
1458                         nType = TransliterationModules_HIRAGANA_KATAKANA;
1459                         break;
1460                 }
1461 
1462                 pOLV->TransliterateText( nType );
1463             }
1464 
1465             rReq.Done();
1466         }
1467         break;
1468 
1469         // #UndoRedo#
1470         case SID_UNDO :
1471         {
1472             // #96090# moved implementation to BaseClass
1473             ImpSidUndo(sal_True, rReq);
1474         }
1475         break;
1476         case SID_REDO :
1477         {
1478             // #96090# moved implementation to BaseClass
1479             ImpSidRedo(sal_True, rReq);
1480         }
1481         break;
1482 
1483         default:
1484         break;
1485     }
1486 }
1487 
1488 /*************************************************************************
1489 |*
1490 |* URL-Feld einfuegen
1491 |*
1492 \************************************************************************/
1493 
1494 void DrawViewShell::InsertURLField(const String& rURL, const String& rText,
1495                                      const String& rTarget, const Point* pPos)
1496 {
1497     OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
1498 
1499     if (pOLV)
1500     {
1501         ESelection aSel( pOLV->GetSelection() );
1502         SvxFieldItem aURLItem( SvxURLField( rURL, rText, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD );
1503         pOLV->InsertField( aURLItem );
1504         if ( aSel.nStartPos <= aSel.nEndPos )
1505             aSel.nEndPos = aSel.nStartPos + 1;
1506         else
1507             aSel.nStartPos = aSel.nEndPos + 1;
1508         pOLV->SetSelection( aSel );
1509     }
1510     else
1511     {
1512         Outliner* pOutl = GetDoc()->GetInternalOutliner();
1513         pOutl->Init( OUTLINERMODE_TEXTOBJECT );
1514         sal_uInt16 nOutlMode = pOutl->GetMode();
1515 
1516         SvxURLField aURLField(rURL, rText, SVXURLFORMAT_REPR);
1517         aURLField.SetTargetFrame(rTarget);
1518         SvxFieldItem aURLItem(aURLField, EE_FEATURE_FIELD);
1519         pOutl->QuickInsertField( aURLItem, ESelection() );
1520         OutlinerParaObject* pOutlParaObject = pOutl->CreateParaObject();
1521 
1522         SdrRectObj* pRectObj = new SdrRectObj(OBJ_TEXT);
1523 
1524         pOutl->UpdateFields();
1525         pOutl->SetUpdateMode( sal_True );
1526         Size aSize(pOutl->CalcTextSize());
1527         pOutl->SetUpdateMode( sal_False );
1528 
1529         Point aPos;
1530 
1531         if (pPos)
1532         {
1533             aPos = *pPos;
1534         }
1535         else
1536         {
1537             Rectangle aRect(aPos, GetActiveWindow()->GetOutputSizePixel() );
1538             aPos = aRect.Center();
1539             aPos = GetActiveWindow()->PixelToLogic(aPos);
1540             aPos.X() -= aSize.Width() / 2;
1541             aPos.Y() -= aSize.Height() / 2;
1542         }
1543 
1544         Rectangle aLogicRect(aPos, aSize);
1545         pRectObj->SetLogicRect(aLogicRect);
1546         pRectObj->SetOutlinerParaObject( pOutlParaObject );
1547         mpDrawView->InsertObjectAtView(pRectObj, *mpDrawView->GetSdrPageView());
1548         pOutl->Init( nOutlMode );
1549     }
1550 }
1551 
1552 /*************************************************************************
1553 |*
1554 |* URL-Button einfuegen
1555 |*
1556 \************************************************************************/
1557 
1558 void DrawViewShell::InsertURLButton(const String& rURL, const String& rText,
1559                                       const String& rTarget, const Point* pPos)
1560 {
1561     sal_Bool bNewObj = sal_True;
1562 
1563     const OUString sTargetURL( ::URIHelper::SmartRel2Abs( INetURLObject( GetDocSh()->GetMedium()->GetBaseURL() ), rURL, URIHelper::GetMaybeFileHdl(), true, false,
1564                                                                 INetURLObject::WAS_ENCODED,
1565                                                                 INetURLObject::DECODE_UNAMBIGUOUS ) );
1566     if (mpDrawView->GetMarkedObjectList().GetMarkCount() > 0)
1567     {
1568         SdrObject* pMarkedObj = mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
1569         if( pMarkedObj ) try
1570         {
1571             // change first marked object
1572             if( (FmFormInventor == pMarkedObj->GetObjInventor() && pMarkedObj->GetObjIdentifier() == OBJ_FM_BUTTON) )
1573             {
1574                 bNewObj = sal_False;
1575 
1576                 SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( pMarkedObj );
1577 
1578                 Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), UNO_QUERY_THROW );
1579                 Reference< beans::XPropertySet > xPropSet( xControlModel, UNO_QUERY_THROW );
1580 
1581                 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" )), Any( OUString( rText ) ) );
1582                 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" )), Any( sTargetURL ) );
1583 
1584                 if( rTarget.Len() )
1585                     xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetFrame" )), Any( OUString( rTarget ) ) );
1586 
1587                 xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" )), Any( form::FormButtonType_URL ) );
1588                 if ( ::avmedia::MediaWindow::isMediaURL( rURL ) )
1589                 {
1590                     // #105638# OJ
1591                     xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DispatchURLInternal" )), Any( sal_True ) );
1592                 }
1593             }
1594             else
1595             {
1596                 // add url as interaction for first selected shape
1597                 bNewObj = sal_False;
1598 
1599                 SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pMarkedObj, true);
1600                 pInfo->meClickAction = presentation::ClickAction_DOCUMENT;
1601                 pInfo->SetBookmark( sTargetURL );
1602             }
1603         }
1604         catch( uno::Exception& )
1605         {
1606         }
1607     }
1608 
1609     if (bNewObj) try
1610     {
1611         SdrUnoObj* pUnoCtrl = static_cast< SdrUnoObj* >( SdrObjFactory::MakeNewObject(FmFormInventor, OBJ_FM_BUTTON,
1612                                 mpDrawView->GetSdrPageView()->GetPage(), GetDoc()) );
1613 
1614         Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel(), uno::UNO_QUERY_THROW );
1615         Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY_THROW );
1616 
1617         xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Label" )), Any( OUString( rText ) ) );
1618         xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetURL" )), Any( sTargetURL ) );
1619 
1620         if( rTarget.Len() )
1621             xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "TargetFrame" )), Any( OUString( rTarget ) ) );
1622 
1623         xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "ButtonType" )), Any(  form::FormButtonType_URL ) );
1624         // #105638# OJ
1625         if ( ::avmedia::MediaWindow::isMediaURL( rURL ) )
1626             xPropSet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "DispatchURLInternal" )), Any( sal_True ) );
1627 
1628         Point aPos;
1629 
1630         if (pPos)
1631         {
1632             aPos = *pPos;
1633         }
1634         else
1635         {
1636             aPos = Rectangle(aPos, GetActiveWindow()->GetOutputSizePixel()).Center();
1637             aPos = GetActiveWindow()->PixelToLogic(aPos);
1638         }
1639 
1640         Size aSize(4000, 1000);
1641         aPos.X() -= aSize.Width() / 2;
1642         aPos.Y() -= aSize.Height() / 2;
1643         pUnoCtrl->SetLogicRect(Rectangle(aPos, aSize));
1644 
1645         sal_uLong nOptions = SDRINSERT_SETDEFLAYER;
1646 
1647         OSL_ASSERT (GetViewShell()!=NULL);
1648         SfxInPlaceClient* pIpClient = GetViewShell()->GetIPClient();
1649         if (pIpClient!=NULL && pIpClient->IsObjectInPlaceActive())
1650         {
1651             nOptions |= SDRINSERT_DONTMARK;
1652         }
1653 
1654         mpDrawView->InsertObjectAtView(pUnoCtrl, *mpDrawView->GetSdrPageView(), nOptions);
1655     }
1656     catch( Exception& )
1657     {
1658     }
1659 }
1660 
1661 /*************************************************************************
1662 |*
1663 |*
1664 |*
1665 \************************************************************************/
1666 
1667 void DrawViewShell::ShowUIControls (bool bVisible)
1668 {
1669     ViewShell::ShowUIControls (bVisible);
1670 
1671     //AF: The LayerDialogChildWindow is not used anymore (I hope).
1672     //    GetViewFrame()->SetChildWindow(
1673     //        LayerDialogChildWindow::GetChildWindowId(),
1674     //        IsLayerModeActive() && bVisible);
1675     maTabControl.Show (bVisible);
1676 }
1677 
1678 void DrawViewShell::StopSlideShow (bool /*bCloseFrame*/)
1679 {
1680     Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() );
1681     if(xPresentation.is() && xPresentation->isRunning())
1682     {
1683         if( mpDrawView->IsTextEdit() )
1684             mpDrawView->SdrEndTextEdit();
1685 
1686         xPresentation->end();
1687     }
1688 }
1689 
1690 #ifdef _MSC_VER
1691 #pragma optimize ( "", on )
1692 #endif
1693 
1694 } // end of namespace sd
1695