xref: /AOO41X/main/sd/source/ui/view/drviewsc.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 #include "DrawViewShell.hxx"
28 #include "ViewShellImplementation.hxx"
29 #include <vcl/waitobj.hxx>
30 
31 #ifndef _SVXIDS_HRC
32 #include <svx/svxids.hrc>
33 #endif
34 #include <svx/dialogs.hrc>
35 #ifndef _IMAPDLG_HXX
36 #include <svx/imapdlg.hxx>
37 #endif
38 #include <vcl/msgbox.hxx>
39 #include <sfx2/request.hxx>
40 #include <svx/svdogrp.hxx>
41 #include <svx/svdoole2.hxx>
42 #include <svx/svdograf.hxx>
43 #include <svx/svxdlg.hxx>
44 #ifndef _BINDING_HXX //autogen
45 #include <sfx2/bindings.hxx>
46 #endif
47 #include <sfx2/dispatch.hxx>
48 #include <svx/svdoole2.hxx>
49 #include <svl/style.hxx>
50 #include <svx/svdpagv.hxx>
51 #include <svx/grafctrl.hxx>
52 #include "stlsheet.hxx"
53 
54 #include <sfx2/viewfrm.hxx>
55 
56 #include "app.hrc"
57 #include "strings.hrc"
58 #include "helpids.h"
59 #include "misc.hxx"
60 #include "Window.hxx"
61 #include "imapinfo.hxx"
62 #include "futempl.hxx"
63 #include "fusel.hxx"
64 #include "sdresid.hxx"
65 #include "drawdoc.hxx"
66 #include "DrawDocShell.hxx"
67 #include "drawview.hxx"
68 #include "sdabstdlg.hxx"
69 #include "brkdlg.hrc"
70 namespace sd {
71 
72 #define MIN_ACTIONS_FOR_DIALOG  5000    // bei mehr als 1600 Metaobjekten
73                                         // wird beim Aufbrechen ein Dialog
74                                         // angezeigt.
75 /*************************************************************************
76 |*
77 |* SfxRequests fuer temporaere Funktionen
78 |*
79 \************************************************************************/
80 
81 void DrawViewShell::FuTemp03(SfxRequest& rReq)
82 {
83     sal_uInt16 nSId = rReq.GetSlot();
84     switch( nSId )
85     {
86         case SID_GROUP:  // BASIC
87         {
88             if ( mpDrawView->IsPresObjSelected( sal_True, sal_True, sal_True ) )
89             {
90                 ::sd::Window* pWindow = GetActiveWindow();
91                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
92             }
93             else
94             {
95                 mpDrawView->GroupMarked();
96             }
97             Cancel();
98             rReq.Done ();
99         }
100         break;
101 
102         case SID_UNGROUP:  // BASIC
103         {
104             mpDrawView->UnGroupMarked();
105             Cancel();
106             rReq.Done ();
107         }
108         break;
109 
110         case SID_NAME_GROUP:
111         {
112             // only allow for single object selection since the name of an object needs
113             // to be unique
114             if(1L == mpDrawView->GetMarkedObjectCount())
115             {
116                 // #i68101#
117                 SdrObject* pSelected = mpDrawView->GetMarkedObjectByIndex(0L);
118                 OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)");
119                 String aName(pSelected->GetName());
120 
121                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
122                 OSL_ENSURE(pFact, "Dialogdiet fail!");
123                 AbstractSvxObjectNameDialog* pDlg = pFact->CreateSvxObjectNameDialog(NULL, aName);
124                 OSL_ENSURE(pDlg, "Dialogdiet fail!");
125 
126                 pDlg->SetCheckNameHdl(LINK(this, DrawViewShell, NameObjectHdl));
127 
128                 if(RET_OK == pDlg->Execute())
129                 {
130                     pDlg->GetName(aName);
131                     pSelected->SetName(aName);
132                 }
133 
134                 delete pDlg;
135             }
136 
137             SfxBindings& rBindings = GetViewFrame()->GetBindings();
138             rBindings.Invalidate( SID_NAVIGATOR_STATE, sal_True, sal_False );
139             rBindings.Invalidate( SID_CONTEXT );
140 
141             Cancel();
142             rReq.Ignore();
143             break;
144         }
145 
146         // #i68101#
147         case SID_OBJECT_TITLE_DESCRIPTION:
148         {
149             if(1L == mpDrawView->GetMarkedObjectCount())
150             {
151                 SdrObject* pSelected = mpDrawView->GetMarkedObjectByIndex(0L);
152                 OSL_ENSURE(pSelected, "DrawViewShell::FuTemp03: nMarkCount, but no object (!)");
153                 String aTitle(pSelected->GetTitle());
154                 String aDescription(pSelected->GetDescription());
155 
156                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
157                 OSL_ENSURE(pFact, "Dialogdiet fail!");
158                 AbstractSvxObjectTitleDescDialog* pDlg = pFact->CreateSvxObjectTitleDescDialog(NULL, aTitle, aDescription);
159                 OSL_ENSURE(pDlg, "Dialogdiet fail!");
160 
161                 if(RET_OK == pDlg->Execute())
162                 {
163                     pDlg->GetTitle(aTitle);
164                     pDlg->GetDescription(aDescription);
165                     pSelected->SetTitle(aTitle);
166                     pSelected->SetDescription(aDescription);
167                 }
168 
169                 delete pDlg;
170             }
171 
172             SfxBindings& rBindings = GetViewFrame()->GetBindings();
173             rBindings.Invalidate( SID_NAVIGATOR_STATE, sal_True, sal_False );
174             rBindings.Invalidate( SID_CONTEXT );
175 
176             Cancel();
177             rReq.Ignore();
178             break;
179         }
180 
181         case SID_ENTER_GROUP:  // BASIC
182         {
183             mpDrawView->EnterMarkedGroup();
184             Cancel();
185             rReq.Done ();
186         }
187         break;
188 
189         case SID_LEAVE_GROUP:  // BASIC
190         {
191             mpDrawView->LeaveOneGroup();
192             Cancel();
193             rReq.Done ();
194         }
195         break;
196 
197         case SID_LEAVE_ALL_GROUPS:  // BASIC
198         {
199             mpDrawView->LeaveAllGroup();
200             Cancel();
201             rReq.Done ();
202         }
203         break;
204 
205         case SID_COMBINE:  // BASIC
206         {
207             // #88224# End text edit to avoid conflicts
208             if(mpDrawView->IsTextEdit())
209                 mpDrawView->SdrEndTextEdit();
210 
211             if ( mpDrawView->IsPresObjSelected() )
212             {
213                 ::sd::Window* pWindow = GetActiveWindow();
214                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
215             }
216             else
217             {
218                 WaitObject aWait( (Window*)GetActiveWindow() );
219                 mpDrawView->CombineMarkedObjects(sal_False);
220             }
221             Cancel();
222             rReq.Done ();
223         }
224         break;
225 
226         case SID_DISTRIBUTE_DLG:
227         {
228             if ( mpDrawView->IsPresObjSelected() )
229             {
230                 ::sd::Window* pWindow = GetActiveWindow();
231                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
232             }
233             else
234             {
235                 mpDrawView->DistributeMarkedObjects();
236             }
237             Cancel();
238             rReq.Done ();
239         }
240         break;
241 
242         case SID_POLY_MERGE:
243         {
244             // #88224# End text edit to avoid conflicts
245             if(mpDrawView->IsTextEdit())
246                 mpDrawView->SdrEndTextEdit();
247 
248             if ( mpDrawView->IsPresObjSelected() )
249             {
250                 ::sd::Window* pWindow = GetActiveWindow();
251                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
252             }
253             else
254             {
255                 WaitObject aWait( (Window*)GetActiveWindow() );
256                 mpDrawView->MergeMarkedObjects(SDR_MERGE_MERGE);
257             }
258             Cancel();
259             rReq.Done ();
260         }
261         break;
262 
263         case SID_POLY_SUBSTRACT:
264         {
265             // #88224# End text edit to avoid conflicts
266             if(mpDrawView->IsTextEdit())
267                 mpDrawView->SdrEndTextEdit();
268 
269             if ( mpDrawView->IsPresObjSelected() )
270             {
271                 ::sd::Window* pWindow = GetActiveWindow();
272                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
273             }
274             else
275             {
276                 WaitObject aWait( (Window*)GetActiveWindow() );
277                 mpDrawView->MergeMarkedObjects(SDR_MERGE_SUBSTRACT);
278             }
279             Cancel();
280             rReq.Done ();
281         }
282         break;
283 
284         case SID_POLY_INTERSECT:
285         {
286             // #88224# End text edit to avoid conflicts
287             if(mpDrawView->IsTextEdit())
288                 mpDrawView->SdrEndTextEdit();
289 
290             if ( mpDrawView->IsPresObjSelected() )
291             {
292                 ::sd::Window* pWindow = GetActiveWindow();
293                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
294             }
295             else
296             {
297                 WaitObject aWait( (Window*)GetActiveWindow() );
298                 mpDrawView->MergeMarkedObjects(SDR_MERGE_INTERSECT);
299             }
300             Cancel();
301             rReq.Done ();
302         }
303         break;
304 
305         case SID_DISMANTLE:  // BASIC
306         {
307             if ( mpDrawView->IsDismantlePossible(sal_False) )
308             {
309                 WaitObject aWait( (Window*)GetActiveWindow() );
310                 mpDrawView->DismantleMarkedObjects(sal_False);
311             }
312             Cancel();
313             rReq.Done ();
314         }
315         break;
316 
317         case SID_CONNECT:  // BASIC
318         {
319             if ( mpDrawView->IsPresObjSelected() )
320             {
321                 ::sd::Window* pWindow = GetActiveWindow();
322                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
323             }
324             else
325             {
326                 WaitObject aWait( (Window*)GetActiveWindow() );
327                 mpDrawView->CombineMarkedObjects(sal_True);
328             }
329             Cancel();
330             rReq.Done ();
331         }
332         break;
333 
334         case SID_BREAK:  // BASIC
335         {
336             if ( mpDrawView->IsTextEdit() )
337             {
338                 mpDrawView->SdrEndTextEdit();
339             }
340 
341             if ( mpDrawView->IsBreak3DObjPossible() )
342             {
343                 WaitObject aWait( (Window*)GetActiveWindow() );
344                 mpDrawView->Break3DObj();
345             }
346             else if ( mpDrawView->IsDismantlePossible(sal_True) )
347             {
348                 WaitObject aWait( (Window*)GetActiveWindow() );
349                 mpDrawView->DismantleMarkedObjects(sal_True);
350             }
351             else if ( mpDrawView->IsImportMtfPossible() )
352             {
353 
354                 WaitObject aWait( (Window*)GetActiveWindow() );
355                 const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
356                 sal_uLong nAnz=rMarkList.GetMarkCount();
357 
358                 // Summe der Metaobjekte aller sel. Metafiles erm.
359                 sal_uLong nCount = 0;
360                 for(sal_uLong nm=0; nm<nAnz; nm++)
361                 {
362                     SdrMark*     pM=rMarkList.GetMark(nm);
363                     SdrObject*   pObj=pM->GetMarkedSdrObj();
364                     SdrGrafObj*  pGraf=PTR_CAST(SdrGrafObj,pObj);
365                     SdrOle2Obj*  pOle2=PTR_CAST(SdrOle2Obj,pObj);
366 
367                     if(pGraf)
368                     {
369                         if(pGraf->HasGDIMetaFile())
370                         {
371                             nCount += pGraf->GetGraphic().GetGDIMetaFile().GetActionCount();
372                         }
373                         else if(pGraf->isEmbeddedSvg())
374                         {
375                             nCount += pGraf->getMetafileFromEmbeddedSvg().GetActionCount();
376                         }
377                     }
378 
379                     if(pOle2 && pOle2->GetGraphic())
380                     {
381                         nCount += pOle2->GetGraphic()->GetGDIMetaFile().GetActionCount();
382                     }
383                 }
384 
385                 // anhand der erm. Summe entscheiden ob mit
386                 // oder ohne Dialog aufgebrochen wird.
387                 if(nCount < MIN_ACTIONS_FOR_DIALOG)
388                 {
389                     // ohne Dialog aufbrechen
390                     mpDrawView->DoImportMarkedMtf();
391                 }
392                 else
393                 {
394                     SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
395                     if( pFact )
396                     {
397                         VclAbstractDialog* pDlg = pFact->CreateBreakDlg(GetActiveWindow(), mpDrawView, GetDocSh(), nCount, nAnz );
398                         if( pDlg )
399                         {
400                             pDlg->Execute();
401                             delete pDlg;
402                         }
403                     }
404                 }
405             }
406 
407             Cancel();
408             rReq.Done ();
409         }
410         break;
411 
412         case SID_CONVERT_TO_3D:
413         {
414             if ( mpDrawView->IsPresObjSelected() )
415             {
416                 ::sd::Window* pWindow = GetActiveWindow();
417                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
418             }
419             else
420             {
421                 if (mpDrawView->IsConvertTo3DObjPossible())
422                 {
423                     if (mpDrawView->IsTextEdit())
424                     {
425                         mpDrawView->SdrEndTextEdit();
426                     }
427 
428                     WaitObject aWait( (Window*)GetActiveWindow() );
429                     mpDrawView->ConvertMarkedObjTo3D(sal_True);
430                 }
431             }
432 
433             Cancel();
434             rReq.Done();
435         }
436         break;
437 
438         case SID_FRAME_TO_TOP:  // BASIC
439         {
440             mpDrawView->PutMarkedToTop();
441             Cancel();
442             Invalidate( SID_POSITION );
443             rReq.Done ();
444         }
445         break;
446 
447         case SID_MOREFRONT:  // BASIC
448         {
449             mpDrawView->MovMarkedToTop();
450             Cancel();
451             Invalidate( SID_POSITION );
452             rReq.Done ();
453         }
454         break;
455 
456         case SID_MOREBACK:  // BASIC
457         {
458             mpDrawView->MovMarkedToBtm();
459             Cancel();
460             Invalidate( SID_POSITION );
461             rReq.Done ();
462         }
463         break;
464 
465         case SID_FRAME_TO_BOTTOM:   // BASIC
466         {
467             mpDrawView->PutMarkedToBtm();
468             Cancel();
469             Invalidate( SID_POSITION );
470             rReq.Done ();
471         }
472         break;
473 
474         case SID_HORIZONTAL:  // BASIC
475         {
476             mpDrawView->MirrorAllMarkedHorizontal();
477             Cancel();
478             rReq.Done ();
479         }
480         break;
481 
482         case SID_VERTICAL:  // BASIC
483         {
484             mpDrawView->MirrorAllMarkedVertical();
485             Cancel();
486             rReq.Done ();
487         }
488         break;
489 
490         case SID_OBJECT_ALIGN_LEFT:  // BASIC
491         {
492             mpDrawView->AlignMarkedObjects(SDRHALIGN_LEFT, SDRVALIGN_NONE);
493             Cancel();
494             rReq.Done ();
495         }
496         break;
497 
498         case SID_OBJECT_ALIGN_CENTER:  // BASIC
499         {
500             mpDrawView->AlignMarkedObjects(SDRHALIGN_CENTER, SDRVALIGN_NONE);
501             Cancel();
502             rReq.Done ();
503         }
504         break;
505 
506         case SID_OBJECT_ALIGN_RIGHT:  // BASIC
507         {
508             mpDrawView->AlignMarkedObjects(SDRHALIGN_RIGHT, SDRVALIGN_NONE);
509             Cancel();
510             rReq.Done ();
511         }
512         break;
513 
514         case SID_OBJECT_ALIGN_UP:  // BASIC
515         {
516             mpDrawView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_TOP);
517             Cancel();
518             rReq.Done ();
519         }
520         break;
521 
522         case SID_OBJECT_ALIGN_MIDDLE:  // BASIC
523         {
524             mpDrawView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_CENTER);
525             Cancel();
526             rReq.Done ();
527         }
528         break;
529 
530         case SID_OBJECT_ALIGN_DOWN:  // BASIC
531         {
532             mpDrawView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_BOTTOM);
533             Cancel();
534             rReq.Done ();
535         }
536         break;
537 
538         case SID_SELECTALL:  // BASIC
539         {
540             if( (dynamic_cast<FuSelection*>( GetOldFunction().get() ) != 0) &&
541                 !GetView()->IsFrameDragSingles() && GetView()->HasMarkablePoints())
542             {
543                 if ( !mpDrawView->IsAction() )
544                     mpDrawView->MarkAllPoints();
545             }
546             else
547                 mpDrawView->SelectAll();
548 
549             Cancel();
550             rReq.Done ();
551         }
552         break;
553 
554         case SID_STYLE_NEW: // BASIC ???
555         case SID_STYLE_APPLY:
556         case SID_STYLE_EDIT:
557         case SID_STYLE_DELETE:
558         case SID_STYLE_FAMILY:
559         case SID_STYLE_WATERCAN:
560         case SID_STYLE_UPDATE_BY_EXAMPLE:
561         case SID_STYLE_NEW_BY_EXAMPLE:
562         {
563             if( rReq.GetSlot() == SID_STYLE_EDIT && !rReq.GetArgs() )
564             {
565                 SfxStyleSheet* pStyleSheet = mpDrawView->GetStyleSheet();
566                 if( pStyleSheet && pStyleSheet->GetFamily() == SD_STYLE_FAMILY_MASTERPAGE)
567                     pStyleSheet = ((SdStyleSheet*)pStyleSheet)->GetPseudoStyleSheet();
568 
569                 if( (pStyleSheet == NULL) && GetView()->IsTextEdit() )
570                 {
571                     GetView()->SdrEndTextEdit();
572 
573                     pStyleSheet = mpDrawView->GetStyleSheet();
574                     if(pStyleSheet && pStyleSheet->GetFamily() == SD_STYLE_FAMILY_MASTERPAGE)
575                         pStyleSheet = ((SdStyleSheet*)pStyleSheet)->GetPseudoStyleSheet();
576                 }
577 
578                 if( pStyleSheet == NULL )
579                 {
580                     rReq.Ignore();
581                     break;
582                 }
583 
584                 SfxAllItemSet aSet(GetDoc()->GetPool());
585 
586                 SfxStringItem aStyleNameItem( SID_STYLE_EDIT, pStyleSheet->GetName() );
587                 aSet.Put(aStyleNameItem);
588 
589                 SfxUInt16Item aStyleFamilyItem( SID_STYLE_FAMILY, (sal_uInt16)pStyleSheet->GetFamily() );
590                 aSet.Put(aStyleFamilyItem);
591 
592                 rReq.SetArgs(aSet);
593             }
594 
595             if( rReq.GetArgs() )
596             {
597                 SetCurrentFunction( FuTemplate::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
598                 if( rReq.GetSlot() == SID_STYLE_APPLY )
599                     GetViewFrame()->GetBindings().Invalidate( SID_STYLE_APPLY );
600                 Cancel();
601             }
602             else if( rReq.GetSlot() == SID_STYLE_APPLY )
603                 GetViewFrame()->GetDispatcher()->Execute( SID_STYLE_DESIGNER, SFX_CALLMODE_ASYNCHRON );
604             rReq.Ignore ();
605         }
606         break;
607 
608         case SID_IMAP:
609         {
610             SvxIMapDlg* pDlg;
611             sal_uInt16      nId = SvxIMapDlgChildWindow::GetChildWindowId();
612 
613             GetViewFrame()->ToggleChildWindow( nId );
614             GetViewFrame()->GetBindings().Invalidate( SID_IMAP );
615 
616             if ( GetViewFrame()->HasChildWindow( nId )
617                 && ( ( pDlg = ViewShell::Implementation::GetImageMapDialog() ) != NULL ) )
618             {
619                 const SdrMarkList&  rMarkList = mpDrawView->GetMarkedObjectList();
620 
621                 if ( rMarkList.GetMarkCount() == 1 )
622                     UpdateIMapDlg( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
623             }
624 
625             Cancel();
626             rReq.Ignore ();
627         }
628         break;
629 
630         case SID_GRID_FRONT:
631         {
632             mpDrawView->SetGridFront( !mpDrawView->IsGridFront() );
633             Cancel();
634             rReq.Done ();
635         }
636         break;
637 
638         case SID_HELPLINES_FRONT:
639         {
640             mpDrawView->SetHlplFront( !mpDrawView->IsHlplFront() );
641             Cancel();
642             rReq.Done ();
643         }
644         break;
645 
646         default:
647             FuTemp04(rReq);
648         break;
649     };
650 };
651 
652 /*************************************************************************
653 |*
654 |* Liefert die globale/Haupt-ID zurueck, also die ID, ueber die die
655 |* Toolbox ausgeloest wird
656 |*
657 \************************************************************************/
658 
659 sal_uInt16 DrawViewShell::GetIdBySubId( sal_uInt16 nSId )
660 {
661     sal_uInt16 nMappedSId = 0;
662     switch( nSId )
663     {
664         case SID_OBJECT_ROTATE:
665         case SID_OBJECT_MIRROR:
666         case SID_OBJECT_TRANSPARENCE:
667         case SID_OBJECT_GRADIENT:
668         case SID_OBJECT_SHEAR:
669         case SID_OBJECT_CROOK_ROTATE:
670         case SID_OBJECT_CROOK_SLANT:
671         case SID_OBJECT_CROOK_STRETCH:
672         case SID_CONVERT_TO_3D_LATHE:
673         {
674             nMappedSId = SID_OBJECT_CHOOSE_MODE;
675         }
676         break;
677 
678         case SID_OBJECT_ALIGN_LEFT:
679         case SID_OBJECT_ALIGN_CENTER:
680         case SID_OBJECT_ALIGN_RIGHT:
681         case SID_OBJECT_ALIGN_UP:
682         case SID_OBJECT_ALIGN_MIDDLE:
683         case SID_OBJECT_ALIGN_DOWN:
684         {
685             nMappedSId = SID_OBJECT_ALIGN;
686         }
687         break;
688 
689         case SID_FRAME_TO_TOP:
690         case SID_MOREFRONT:
691         case SID_MOREBACK:
692         case SID_FRAME_TO_BOTTOM:
693         case SID_BEFORE_OBJ:
694         case SID_BEHIND_OBJ:
695         case SID_REVERSE_ORDER:
696         {
697             nMappedSId = SID_POSITION;
698         }
699         break;
700 
701         case SID_ZOOM_OUT:
702         case SID_ZOOM_IN:
703         case SID_SIZE_REAL:
704         case SID_ZOOM_PANNING:
705         case SID_SIZE_PAGE:
706         case SID_SIZE_PAGE_WIDTH:
707         case SID_SIZE_ALL:
708         case SID_SIZE_OPTIMAL:
709         case SID_ZOOM_NEXT:
710         case SID_ZOOM_PREV:
711         {
712             nMappedSId = SID_ZOOM_TOOLBOX;
713         }
714         break;
715 
716         case SID_ATTR_CHAR:
717         case SID_TEXT_FITTOSIZE:
718         case SID_DRAW_CAPTION:
719         case SID_DRAW_FONTWORK:
720         case SID_DRAW_FONTWORK_VERTICAL:
721         {
722             nMappedSId = SID_DRAWTBX_TEXT;
723         }
724         break;
725 
726         case SID_DRAW_RECT:
727         case SID_DRAW_SQUARE:
728         case SID_DRAW_RECT_ROUND:
729         case SID_DRAW_SQUARE_ROUND:
730         case SID_DRAW_RECT_NOFILL:
731         case SID_DRAW_SQUARE_NOFILL:
732         case SID_DRAW_RECT_ROUND_NOFILL:
733         case SID_DRAW_SQUARE_ROUND_NOFILL:
734         {
735             nMappedSId = SID_DRAWTBX_RECTANGLES;
736         }
737         break;
738 
739         case SID_DRAW_ELLIPSE:
740         case SID_DRAW_CIRCLE:
741         case SID_DRAW_PIE:
742         case SID_DRAW_CIRCLEPIE:
743         case SID_DRAW_ELLIPSECUT:
744         case SID_DRAW_CIRCLECUT:
745         case SID_DRAW_ARC:
746         case SID_DRAW_CIRCLEARC:
747         case SID_DRAW_ELLIPSE_NOFILL:
748         case SID_DRAW_CIRCLE_NOFILL:
749         case SID_DRAW_PIE_NOFILL:
750         case SID_DRAW_CIRCLEPIE_NOFILL:
751         case SID_DRAW_ELLIPSECUT_NOFILL:
752         case SID_DRAW_CIRCLECUT_NOFILL:
753         {
754             nMappedSId = SID_DRAWTBX_ELLIPSES;
755         }
756         break;
757 
758         case SID_DRAW_BEZIER_NOFILL:
759         case SID_DRAW_POLYGON_NOFILL:
760         case SID_DRAW_XPOLYGON_NOFILL:
761         case SID_DRAW_FREELINE_NOFILL:
762         case SID_DRAW_BEZIER_FILL:
763         case SID_DRAW_POLYGON:
764         case SID_DRAW_XPOLYGON:
765         case SID_DRAW_FREELINE:
766         {
767             nMappedSId = SID_DRAWTBX_LINES;
768         }
769         break;
770 
771         case SID_DRAW_LINE:
772         case SID_DRAW_XLINE:
773         case SID_DRAW_MEASURELINE:
774         case SID_LINE_ARROW_START:
775         case SID_LINE_ARROW_END:
776         case SID_LINE_ARROWS:
777         case SID_LINE_ARROW_CIRCLE:
778         case SID_LINE_CIRCLE_ARROW:
779         case SID_LINE_ARROW_SQUARE:
780         case SID_LINE_SQUARE_ARROW:
781         {
782             nMappedSId = SID_DRAWTBX_ARROWS;
783         }
784         break;
785 
786         case SID_3D_CUBE:
787         case SID_3D_TORUS:
788         case SID_3D_SPHERE:
789         case SID_3D_SHELL:
790         case SID_3D_HALF_SPHERE:
791         case SID_3D_CYLINDER:
792         case SID_3D_CONE:
793         case SID_3D_PYRAMID:
794         {
795             nMappedSId = SID_DRAWTBX_3D_OBJECTS;
796         }
797         break;
798 
799         case SID_INSERT_DIAGRAM:
800         case SID_ATTR_TABLE:
801         case SID_INSERTFILE:
802         case SID_INSERT_GRAPHIC:
803         case SID_INSERT_AVMEDIA:
804         case SID_INSERTPAGE:
805         case SID_INSERT_MATH:
806         case SID_INSERT_FLOATINGFRAME:
807         case SID_INSERT_OBJECT:
808         case SID_INSERT_PLUGIN:
809         case SID_INSERT_SOUND:
810         case SID_INSERT_VIDEO:
811         case SID_INSERT_TABLE:
812         {
813             nMappedSId = SID_DRAWTBX_INSERT;
814         }
815         break;
816 
817         case SID_TOOL_CONNECTOR:
818         case SID_CONNECTOR_ARROW_START:
819         case SID_CONNECTOR_ARROW_END:
820         case SID_CONNECTOR_ARROWS:
821         case SID_CONNECTOR_CIRCLE_START:
822         case SID_CONNECTOR_CIRCLE_END:
823         case SID_CONNECTOR_CIRCLES:
824         case SID_CONNECTOR_LINE:
825         case SID_CONNECTOR_LINE_ARROW_START:
826         case SID_CONNECTOR_LINE_ARROW_END:
827         case SID_CONNECTOR_LINE_ARROWS:
828         case SID_CONNECTOR_LINE_CIRCLE_START:
829         case SID_CONNECTOR_LINE_CIRCLE_END:
830         case SID_CONNECTOR_LINE_CIRCLES:
831         case SID_CONNECTOR_CURVE:
832         case SID_CONNECTOR_CURVE_ARROW_START:
833         case SID_CONNECTOR_CURVE_ARROW_END:
834         case SID_CONNECTOR_CURVE_ARROWS:
835         case SID_CONNECTOR_CURVE_CIRCLE_START:
836         case SID_CONNECTOR_CURVE_CIRCLE_END:
837         case SID_CONNECTOR_CURVE_CIRCLES:
838         case SID_CONNECTOR_LINES:
839         case SID_CONNECTOR_LINES_ARROW_START:
840         case SID_CONNECTOR_LINES_ARROW_END:
841         case SID_CONNECTOR_LINES_ARROWS:
842         case SID_CONNECTOR_LINES_CIRCLE_START:
843         case SID_CONNECTOR_LINES_CIRCLE_END:
844         case SID_CONNECTOR_LINES_CIRCLES:
845         {
846             nMappedSId = SID_DRAWTBX_CONNECTORS;
847         }
848     }
849     return( nMappedSId );
850 }
851 
852 /*************************************************************************
853 |*
854 |* Fuellt das SlotArray, um das aktuelle Mapping des ToolboxSlots zu
855 |* bekommen
856 |*
857 \************************************************************************/
858 
859 void DrawViewShell::MapSlot( sal_uInt16 nSId )
860 {
861     sal_uInt16 nMappedSId = GetIdBySubId( nSId );
862 
863     if( nMappedSId > 0 )
864     {
865         sal_uInt16 nID = GetArrayId( nMappedSId ) + 1;
866         mpSlotArray[ nID ] = nSId;
867     }
868 }
869 
870 /*************************************************************************
871 |*
872 |* Ermoeglicht ueber das SlotArray ein ImageMapping
873 |*
874 \************************************************************************/
875 
876 void DrawViewShell::UpdateToolboxImages( SfxItemSet &rSet, sal_Bool bPermanent )
877 {
878     if( !bPermanent )
879     {
880         sal_uInt16 nId = GetArrayId( SID_ZOOM_TOOLBOX ) + 1;
881         rSet.Put( TbxImageItem( SID_ZOOM_TOOLBOX, mpSlotArray[nId] ) );
882 
883         nId = GetArrayId( SID_DRAWTBX_INSERT ) + 1;
884         rSet.Put( TbxImageItem( SID_DRAWTBX_INSERT, mpSlotArray[nId] ) );
885 
886         nId = GetArrayId( SID_POSITION ) + 1;
887         rSet.Put( TbxImageItem( SID_POSITION, mpSlotArray[nId] ) );
888 
889         nId = GetArrayId( SID_OBJECT_ALIGN ) + 1;
890         rSet.Put( TbxImageItem( SID_OBJECT_ALIGN, mpSlotArray[nId] ) );
891     }
892     else
893     {
894         for( sal_uInt16 nId = 0; nId < SLOTARRAY_COUNT; nId += 2 )
895         {
896             rSet.Put( TbxImageItem( mpSlotArray[nId], mpSlotArray[nId+1] ) );
897         }
898     }
899 }
900 
901 /*************************************************************************
902 |*
903 |* Gibt den gemappten Slot zurueck
904 |*
905 \************************************************************************/
906 
907 sal_uInt16 DrawViewShell::GetMappedSlot( sal_uInt16 nSId )
908 {
909     sal_uInt16 nSlot = 0;
910     sal_uInt16 nId = GetArrayId( nSId );
911     if( nId != USHRT_MAX )
912         nSlot = mpSlotArray[ nId+1 ];
913 
914     // Wenn der Slot noch auf sich selbst gemapped ist, muss 0 zurueck-
915     // gegeben werden, da sonst der Slot immer wieder selbst executet
916     // wird. Im Array ist der Slot selbst initial vorhanden, damit das
917     // Image richtig angezeigt wird.
918     if( nSId == nSlot )
919         return( 0 );
920 
921     return( nSlot );
922 }
923 
924 /*************************************************************************
925 |*
926 |* Gibt die Nummer des HauptSlots im SlotArray zurueck
927 |*
928 \************************************************************************/
929 
930 sal_uInt16 DrawViewShell::GetArrayId( sal_uInt16 nSId )
931 {
932     for( sal_uInt16 i = 0; i < SLOTARRAY_COUNT; i += 2 )
933     {
934         if( mpSlotArray[ i ] == nSId )
935             return( i );
936     }
937     DBG_ERROR( "Slot im Array nicht gefunden!" );
938     return( USHRT_MAX );
939 }
940 
941 
942 /*************************************************************************
943 |*
944 |* IMap-Dlg updaten
945 |*
946 \************************************************************************/
947 
948 void DrawViewShell::UpdateIMapDlg( SdrObject* pObj )
949 {
950     if( ( pObj->ISA( SdrGrafObj ) || pObj->ISA( SdrOle2Obj ) ) && !mpDrawView->IsTextEdit() &&
951          GetViewFrame()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) )
952     {
953         Graphic     aGraphic;
954         ImageMap*   pIMap = NULL;
955         TargetList* pTargetList = NULL;
956         SdIMapInfo* pIMapInfo = GetDoc()->GetIMapInfo( pObj );
957 
958         // get graphic from shape
959         SdrGrafObj* pGrafObj = dynamic_cast< SdrGrafObj* >( pObj );
960         if( pGrafObj )
961             aGraphic = pGrafObj->GetGraphic();
962 
963         if ( pIMapInfo )
964         {
965             pIMap = (ImageMap*) &pIMapInfo->GetImageMap();
966             pTargetList = new TargetList;
967             GetViewFrame()->GetTargetList( *pTargetList );
968         }
969 
970         SvxIMapDlgChildWindow::UpdateIMapDlg( aGraphic, pIMap, pTargetList, pObj );
971 
972         // TargetListe kann von uns wieder geloescht werden
973         if ( pTargetList )
974         {
975             String* pEntry = pTargetList->First();
976             while( pEntry )
977             {
978                 delete pEntry;
979                 pEntry = pTargetList->Next();
980             }
981 
982             delete pTargetList;
983         }
984     }
985 }
986 
987 // -----------------------------------------------------------------------------
988 
989 IMPL_LINK( DrawViewShell, NameObjectHdl, AbstractSvxNameDialog*, pDialog )
990 {
991     String aName;
992 
993     if( pDialog )
994         pDialog->GetName( aName );
995 
996     return( ( !aName.Len() || ( GetDoc() && !GetDoc()->GetObj( aName ) ) ) ? 1 : 0 );
997 }
998 
999 } // end of namespace sd
1000