xref: /trunk/main/sd/source/ui/view/drviewsc.cxx (revision 5b190011)
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 			        if (pGraf!=NULL && pGraf->HasGDIMetaFile())
367 						nCount += pGraf->GetGraphic().GetGDIMetaFile().GetActionCount();
368                     if(pOle2!=NULL && pOle2->GetGraphic())
369                         nCount += pOle2->GetGraphic()->GetGDIMetaFile().GetActionCount();
370 				}
371 
372 				// anhand der erm. Summe entscheiden ob mit
373 				// oder ohne Dialog aufgebrochen wird.
374 				if(nCount < MIN_ACTIONS_FOR_DIALOG)
375 				{
376 					// ohne Dialog aufbrechen
377 					mpDrawView->DoImportMarkedMtf();
378 				}
379 				else
380 				{
381 					SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
382 					if( pFact )
383 					{
384 						VclAbstractDialog* pDlg = pFact->CreateBreakDlg(GetActiveWindow(), mpDrawView, GetDocSh(), nCount, nAnz );
385 						if( pDlg )
386 						{
387 							pDlg->Execute();
388 							delete pDlg;
389 						}
390 					}
391 				}
392 			}
393 
394 			Cancel();
395 			rReq.Done ();
396 		}
397 		break;
398 
399 		case SID_CONVERT_TO_3D:
400 		{
401 			if ( mpDrawView->IsPresObjSelected() )
402 			{
403                 ::sd::Window* pWindow = GetActiveWindow();
404                 InfoBox(pWindow, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
405 			}
406 			else
407 			{
408 				if (mpDrawView->IsConvertTo3DObjPossible())
409 				{
410 					if (mpDrawView->IsTextEdit())
411 					{
412 						mpDrawView->SdrEndTextEdit();
413 					}
414 
415 					WaitObject aWait( (Window*)GetActiveWindow() );
416 					mpDrawView->ConvertMarkedObjTo3D(sal_True);
417 				}
418 			}
419 
420 			Cancel();
421 			rReq.Done();
422 		}
423 		break;
424 
425 		case SID_FRAME_TO_TOP:	// BASIC
426 		{
427 			mpDrawView->PutMarkedToTop();
428 			Cancel();
429 			Invalidate( SID_POSITION );
430 			rReq.Done ();
431 		}
432 		break;
433 
434 		case SID_MOREFRONT:  // BASIC
435 		{
436 			mpDrawView->MovMarkedToTop();
437 			Cancel();
438 			Invalidate( SID_POSITION );
439 			rReq.Done ();
440 		}
441 		break;
442 
443 		case SID_MOREBACK:	// BASIC
444 		{
445 			mpDrawView->MovMarkedToBtm();
446 			Cancel();
447 			Invalidate( SID_POSITION );
448 			rReq.Done ();
449 		}
450 		break;
451 
452 		case SID_FRAME_TO_BOTTOM:	// BASIC
453 		{
454 			mpDrawView->PutMarkedToBtm();
455 			Cancel();
456 			Invalidate( SID_POSITION );
457 			rReq.Done ();
458 		}
459 		break;
460 
461 		case SID_HORIZONTAL:  // BASIC
462 		{
463 			mpDrawView->MirrorAllMarkedHorizontal();
464 			Cancel();
465 			rReq.Done ();
466 		}
467 		break;
468 
469 		case SID_VERTICAL:	// BASIC
470 		{
471 			mpDrawView->MirrorAllMarkedVertical();
472 			Cancel();
473 			rReq.Done ();
474 		}
475 		break;
476 
477 		case SID_OBJECT_ALIGN_LEFT:  // BASIC
478 		{
479 			mpDrawView->AlignMarkedObjects(SDRHALIGN_LEFT, SDRVALIGN_NONE);
480 			Cancel();
481 			rReq.Done ();
482 		}
483 		break;
484 
485 		case SID_OBJECT_ALIGN_CENTER:  // BASIC
486 		{
487 			mpDrawView->AlignMarkedObjects(SDRHALIGN_CENTER, SDRVALIGN_NONE);
488 			Cancel();
489 			rReq.Done ();
490 		}
491 		break;
492 
493 		case SID_OBJECT_ALIGN_RIGHT:  // BASIC
494 		{
495 			mpDrawView->AlignMarkedObjects(SDRHALIGN_RIGHT, SDRVALIGN_NONE);
496 			Cancel();
497 			rReq.Done ();
498 		}
499 		break;
500 
501 		case SID_OBJECT_ALIGN_UP:  // BASIC
502 		{
503 			mpDrawView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_TOP);
504 			Cancel();
505 			rReq.Done ();
506 		}
507 		break;
508 
509 		case SID_OBJECT_ALIGN_MIDDLE:  // BASIC
510 		{
511 			mpDrawView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_CENTER);
512 			Cancel();
513 			rReq.Done ();
514 		}
515 		break;
516 
517 		case SID_OBJECT_ALIGN_DOWN:  // BASIC
518 		{
519 			mpDrawView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_BOTTOM);
520 			Cancel();
521 			rReq.Done ();
522 		}
523 		break;
524 
525 		case SID_SELECTALL:  // BASIC
526 		{
527             if( (dynamic_cast<FuSelection*>( GetOldFunction().get() ) != 0) &&
528                 !GetView()->IsFrameDragSingles() && GetView()->HasMarkablePoints())
529 			{
530 				if ( !mpDrawView->IsAction() )
531 					mpDrawView->MarkAllPoints();
532 			}
533 			else
534 				mpDrawView->SelectAll();
535 
536 			Cancel();
537 			rReq.Done ();
538 		}
539 		break;
540 
541 		case SID_STYLE_NEW:	// BASIC ???
542 		case SID_STYLE_APPLY:
543 		case SID_STYLE_EDIT:
544 		case SID_STYLE_DELETE:
545 		case SID_STYLE_FAMILY:
546 		case SID_STYLE_WATERCAN:
547 		case SID_STYLE_UPDATE_BY_EXAMPLE:
548 		case SID_STYLE_NEW_BY_EXAMPLE:
549 		{
550 			if( rReq.GetSlot() == SID_STYLE_EDIT && !rReq.GetArgs() )
551 			{
552 				SfxStyleSheet* pStyleSheet = mpDrawView->GetStyleSheet();
553 				if( pStyleSheet && pStyleSheet->GetFamily() == SD_STYLE_FAMILY_MASTERPAGE)
554 					pStyleSheet = ((SdStyleSheet*)pStyleSheet)->GetPseudoStyleSheet();
555 
556 				if( (pStyleSheet == NULL) && GetView()->IsTextEdit() )
557 				{
558 					GetView()->SdrEndTextEdit();
559 
560 					pStyleSheet = mpDrawView->GetStyleSheet();
561 					if(pStyleSheet && pStyleSheet->GetFamily() == SD_STYLE_FAMILY_MASTERPAGE)
562 						pStyleSheet = ((SdStyleSheet*)pStyleSheet)->GetPseudoStyleSheet();
563 				}
564 
565 				if( pStyleSheet == NULL )
566 				{
567 					rReq.Ignore();
568 					break;
569 				}
570 
571 				SfxAllItemSet aSet(GetDoc()->GetPool());
572 
573 				SfxStringItem aStyleNameItem( SID_STYLE_EDIT, pStyleSheet->GetName() );
574 				aSet.Put(aStyleNameItem);
575 
576 				SfxUInt16Item aStyleFamilyItem( SID_STYLE_FAMILY, (sal_uInt16)pStyleSheet->GetFamily() );
577 				aSet.Put(aStyleFamilyItem);
578 
579 				rReq.SetArgs(aSet);
580 			}
581 
582 			if( rReq.GetArgs() )
583 			{
584 				SetCurrentFunction( FuTemplate::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
585 				if( rReq.GetSlot() == SID_STYLE_APPLY )
586 					GetViewFrame()->GetBindings().Invalidate( SID_STYLE_APPLY );
587 				Cancel();
588 			}
589 			else if( rReq.GetSlot() == SID_STYLE_APPLY )
590 				GetViewFrame()->GetDispatcher()->Execute( SID_STYLE_DESIGNER, SFX_CALLMODE_ASYNCHRON );
591 			rReq.Ignore ();
592 		}
593 		break;
594 
595 		case SID_IMAP:
596 		{
597 			SvxIMapDlg* pDlg;
598 			sal_uInt16		nId = SvxIMapDlgChildWindow::GetChildWindowId();
599 
600 			GetViewFrame()->ToggleChildWindow( nId );
601 			GetViewFrame()->GetBindings().Invalidate( SID_IMAP );
602 
603 			if ( GetViewFrame()->HasChildWindow( nId )
604                 && ( ( pDlg = ViewShell::Implementation::GetImageMapDialog() ) != NULL ) )
605 			{
606 				const SdrMarkList&	rMarkList = mpDrawView->GetMarkedObjectList();
607 
608 				if ( rMarkList.GetMarkCount() == 1 )
609 					UpdateIMapDlg( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
610 			}
611 
612 			Cancel();
613 			rReq.Ignore ();
614 		}
615 		break;
616 
617 		case SID_GRID_FRONT:
618 		{
619 			mpDrawView->SetGridFront( !mpDrawView->IsGridFront() );
620 			Cancel();
621 			rReq.Done ();
622 		}
623 		break;
624 
625 		case SID_HELPLINES_FRONT:
626 		{
627 			mpDrawView->SetHlplFront( !mpDrawView->IsHlplFront() );
628 			Cancel();
629 			rReq.Done ();
630 		}
631 		break;
632 
633 		default:
634 			FuTemp04(rReq);
635 		break;
636 	};
637 };
638 
639 /*************************************************************************
640 |*
641 |* Liefert die globale/Haupt-ID zurueck, also die ID, ueber die die
642 |* Toolbox ausgeloest wird
643 |*
644 \************************************************************************/
645 
646 sal_uInt16 DrawViewShell::GetIdBySubId( sal_uInt16 nSId )
647 {
648 	sal_uInt16 nMappedSId = 0;
649 	switch( nSId )
650 	{
651 		case SID_OBJECT_ROTATE:
652 		case SID_OBJECT_MIRROR:
653 		case SID_OBJECT_TRANSPARENCE:
654 		case SID_OBJECT_GRADIENT:
655 		case SID_OBJECT_SHEAR:
656 		case SID_OBJECT_CROOK_ROTATE:
657 		case SID_OBJECT_CROOK_SLANT:
658 		case SID_OBJECT_CROOK_STRETCH:
659         case SID_CONVERT_TO_3D_LATHE:
660 		{
661 			nMappedSId = SID_OBJECT_CHOOSE_MODE;
662 		}
663 		break;
664 
665 		case SID_OBJECT_ALIGN_LEFT:
666 		case SID_OBJECT_ALIGN_CENTER:
667 		case SID_OBJECT_ALIGN_RIGHT:
668 		case SID_OBJECT_ALIGN_UP:
669 		case SID_OBJECT_ALIGN_MIDDLE:
670 		case SID_OBJECT_ALIGN_DOWN:
671 		{
672 			nMappedSId = SID_OBJECT_ALIGN;
673 		}
674 		break;
675 
676 		case SID_FRAME_TO_TOP:
677 		case SID_MOREFRONT:
678 		case SID_MOREBACK:
679 		case SID_FRAME_TO_BOTTOM:
680 		case SID_BEFORE_OBJ:
681 		case SID_BEHIND_OBJ:
682 		case SID_REVERSE_ORDER:
683 		{
684 			nMappedSId = SID_POSITION;
685 		}
686 		break;
687 
688 		case SID_ZOOM_OUT:
689 		case SID_ZOOM_IN:
690 		case SID_SIZE_REAL:
691 		case SID_ZOOM_PANNING:
692 		case SID_SIZE_PAGE:
693 		case SID_SIZE_PAGE_WIDTH:
694 		case SID_SIZE_ALL:
695 		case SID_SIZE_OPTIMAL:
696 		case SID_ZOOM_NEXT:
697 		case SID_ZOOM_PREV:
698 		{
699 			nMappedSId = SID_ZOOM_TOOLBOX;
700 		}
701 		break;
702 
703 		case SID_ATTR_CHAR:
704 		case SID_TEXT_FITTOSIZE:
705 		case SID_DRAW_CAPTION:
706 		case SID_DRAW_FONTWORK:
707 		case SID_DRAW_FONTWORK_VERTICAL:
708 		{
709 			nMappedSId = SID_DRAWTBX_TEXT;
710 		}
711 		break;
712 
713 		case SID_DRAW_RECT:
714 		case SID_DRAW_SQUARE:
715 		case SID_DRAW_RECT_ROUND:
716 		case SID_DRAW_SQUARE_ROUND:
717 		case SID_DRAW_RECT_NOFILL:
718 		case SID_DRAW_SQUARE_NOFILL:
719 		case SID_DRAW_RECT_ROUND_NOFILL:
720 		case SID_DRAW_SQUARE_ROUND_NOFILL:
721 		{
722 			nMappedSId = SID_DRAWTBX_RECTANGLES;
723 		}
724 		break;
725 
726 		case SID_DRAW_ELLIPSE:
727 		case SID_DRAW_CIRCLE:
728 		case SID_DRAW_PIE:
729 		case SID_DRAW_CIRCLEPIE:
730 		case SID_DRAW_ELLIPSECUT:
731 		case SID_DRAW_CIRCLECUT:
732 		case SID_DRAW_ARC:
733 		case SID_DRAW_CIRCLEARC:
734 		case SID_DRAW_ELLIPSE_NOFILL:
735 		case SID_DRAW_CIRCLE_NOFILL:
736 		case SID_DRAW_PIE_NOFILL:
737 		case SID_DRAW_CIRCLEPIE_NOFILL:
738 		case SID_DRAW_ELLIPSECUT_NOFILL:
739 		case SID_DRAW_CIRCLECUT_NOFILL:
740 		{
741 			nMappedSId = SID_DRAWTBX_ELLIPSES;
742 		}
743 		break;
744 
745         case SID_DRAW_BEZIER_NOFILL:
746 		case SID_DRAW_POLYGON_NOFILL:
747 		case SID_DRAW_XPOLYGON_NOFILL:
748         case SID_DRAW_FREELINE_NOFILL:
749         case SID_DRAW_BEZIER_FILL:
750 		case SID_DRAW_POLYGON:
751 		case SID_DRAW_XPOLYGON:
752         case SID_DRAW_FREELINE:
753 		{
754 			nMappedSId = SID_DRAWTBX_LINES;
755 		}
756 		break;
757 
758 		case SID_DRAW_LINE:
759 		case SID_DRAW_XLINE:
760 		case SID_DRAW_MEASURELINE:
761 		case SID_LINE_ARROW_START:
762 		case SID_LINE_ARROW_END:
763 		case SID_LINE_ARROWS:
764 		case SID_LINE_ARROW_CIRCLE:
765 		case SID_LINE_CIRCLE_ARROW:
766 		case SID_LINE_ARROW_SQUARE:
767 		case SID_LINE_SQUARE_ARROW:
768 		{
769 			nMappedSId = SID_DRAWTBX_ARROWS;
770 		}
771 		break;
772 
773 		case SID_3D_CUBE:
774 		case SID_3D_TORUS:
775 		case SID_3D_SPHERE:
776 		case SID_3D_SHELL:
777 		case SID_3D_HALF_SPHERE:
778 		case SID_3D_CYLINDER:
779 		case SID_3D_CONE:
780 		case SID_3D_PYRAMID:
781 		{
782 			nMappedSId = SID_DRAWTBX_3D_OBJECTS;
783 		}
784 		break;
785 
786 		case SID_INSERT_DIAGRAM:
787 		case SID_ATTR_TABLE:
788 		case SID_INSERTFILE:
789 		case SID_INSERT_GRAPHIC:
790 		case SID_INSERT_AVMEDIA:
791 		case SID_INSERTPAGE:
792 	    case SID_INSERT_MATH:
793 	    case SID_INSERT_FLOATINGFRAME:
794 	    case SID_INSERT_OBJECT:
795         case SID_INSERT_PLUGIN:
796 		case SID_INSERT_SOUND:
797 		case SID_INSERT_VIDEO:
798 		case SID_INSERT_TABLE:
799 		{
800 			nMappedSId = SID_DRAWTBX_INSERT;
801 		}
802 		break;
803 
804         case SID_TOOL_CONNECTOR:
805         case SID_CONNECTOR_ARROW_START:
806         case SID_CONNECTOR_ARROW_END:
807         case SID_CONNECTOR_ARROWS:
808         case SID_CONNECTOR_CIRCLE_START:
809         case SID_CONNECTOR_CIRCLE_END:
810         case SID_CONNECTOR_CIRCLES:
811         case SID_CONNECTOR_LINE:
812         case SID_CONNECTOR_LINE_ARROW_START:
813         case SID_CONNECTOR_LINE_ARROW_END:
814         case SID_CONNECTOR_LINE_ARROWS:
815         case SID_CONNECTOR_LINE_CIRCLE_START:
816         case SID_CONNECTOR_LINE_CIRCLE_END:
817         case SID_CONNECTOR_LINE_CIRCLES:
818         case SID_CONNECTOR_CURVE:
819         case SID_CONNECTOR_CURVE_ARROW_START:
820         case SID_CONNECTOR_CURVE_ARROW_END:
821         case SID_CONNECTOR_CURVE_ARROWS:
822         case SID_CONNECTOR_CURVE_CIRCLE_START:
823         case SID_CONNECTOR_CURVE_CIRCLE_END:
824         case SID_CONNECTOR_CURVE_CIRCLES:
825         case SID_CONNECTOR_LINES:
826         case SID_CONNECTOR_LINES_ARROW_START:
827         case SID_CONNECTOR_LINES_ARROW_END:
828         case SID_CONNECTOR_LINES_ARROWS:
829         case SID_CONNECTOR_LINES_CIRCLE_START:
830         case SID_CONNECTOR_LINES_CIRCLE_END:
831         case SID_CONNECTOR_LINES_CIRCLES:
832         {
833             nMappedSId = SID_DRAWTBX_CONNECTORS;
834         }
835 	}
836 	return( nMappedSId );
837 }
838 
839 /*************************************************************************
840 |*
841 |* Fuellt das SlotArray, um das aktuelle Mapping des ToolboxSlots zu
842 |* bekommen
843 |*
844 \************************************************************************/
845 
846 void DrawViewShell::MapSlot( sal_uInt16 nSId )
847 {
848 	sal_uInt16 nMappedSId = GetIdBySubId( nSId );
849 
850 	if( nMappedSId > 0 )
851 	{
852 		sal_uInt16 nID = GetArrayId( nMappedSId ) + 1;
853 		mpSlotArray[ nID ] = nSId;
854 	}
855 }
856 
857 /*************************************************************************
858 |*
859 |* Ermoeglicht ueber das SlotArray ein ImageMapping
860 |*
861 \************************************************************************/
862 
863 void DrawViewShell::UpdateToolboxImages( SfxItemSet &rSet, sal_Bool bPermanent )
864 {
865 	if( !bPermanent )
866 	{
867 		sal_uInt16 nId = GetArrayId( SID_ZOOM_TOOLBOX ) + 1;
868 		rSet.Put( TbxImageItem( SID_ZOOM_TOOLBOX, mpSlotArray[nId] ) );
869 
870 		nId = GetArrayId( SID_DRAWTBX_INSERT ) + 1;
871 		rSet.Put( TbxImageItem( SID_DRAWTBX_INSERT, mpSlotArray[nId] ) );
872 
873 		nId = GetArrayId( SID_POSITION ) + 1;
874 		rSet.Put( TbxImageItem( SID_POSITION, mpSlotArray[nId] ) );
875 
876 		nId = GetArrayId( SID_OBJECT_ALIGN ) + 1;
877 		rSet.Put( TbxImageItem( SID_OBJECT_ALIGN, mpSlotArray[nId] ) );
878 	}
879 	else
880 	{
881 		for( sal_uInt16 nId = 0; nId < SLOTARRAY_COUNT; nId += 2 )
882 		{
883 			rSet.Put( TbxImageItem( mpSlotArray[nId], mpSlotArray[nId+1] ) );
884 		}
885 	}
886 }
887 
888 /*************************************************************************
889 |*
890 |* Gibt den gemappten Slot zurueck
891 |*
892 \************************************************************************/
893 
894 sal_uInt16 DrawViewShell::GetMappedSlot( sal_uInt16 nSId )
895 {
896 	sal_uInt16 nSlot = 0;
897 	sal_uInt16 nId = GetArrayId( nSId );
898 	if( nId != USHRT_MAX )
899 		nSlot = mpSlotArray[ nId+1 ];
900 
901 	// Wenn der Slot noch auf sich selbst gemapped ist, muss 0 zurueck-
902 	// gegeben werden, da sonst der Slot immer wieder selbst executet
903 	// wird. Im Array ist der Slot selbst initial vorhanden, damit das
904 	// Image richtig angezeigt wird.
905 	if( nSId == nSlot )
906 		return( 0 );
907 
908 	return( nSlot );
909 }
910 
911 /*************************************************************************
912 |*
913 |* Gibt die Nummer des HauptSlots im SlotArray zurueck
914 |*
915 \************************************************************************/
916 
917 sal_uInt16 DrawViewShell::GetArrayId( sal_uInt16 nSId )
918 {
919 	for( sal_uInt16 i = 0; i < SLOTARRAY_COUNT; i += 2 )
920 	{
921 		if( mpSlotArray[ i ] == nSId )
922 			return( i );
923 	}
924 	DBG_ERROR( "Slot im Array nicht gefunden!" );
925 	return( USHRT_MAX );
926 }
927 
928 
929 /*************************************************************************
930 |*
931 |* IMap-Dlg updaten
932 |*
933 \************************************************************************/
934 
935 void DrawViewShell::UpdateIMapDlg( SdrObject* pObj )
936 {
937 	if( ( pObj->ISA( SdrGrafObj ) || pObj->ISA( SdrOle2Obj ) ) && !mpDrawView->IsTextEdit() &&
938 		 GetViewFrame()->HasChildWindow( SvxIMapDlgChildWindow::GetChildWindowId() ) )
939 	{
940 		Graphic 	aGraphic;
941 		ImageMap*	pIMap = NULL;
942 		TargetList*	pTargetList = NULL;
943 		SdIMapInfo* pIMapInfo = GetDoc()->GetIMapInfo( pObj );
944 
945 		// get graphic from shape
946 		SdrGrafObj* pGrafObj = dynamic_cast< SdrGrafObj* >( pObj );
947 		if( pGrafObj )
948 			aGraphic = pGrafObj->GetGraphic();
949 
950 		if ( pIMapInfo )
951 		{
952 			pIMap = (ImageMap*) &pIMapInfo->GetImageMap();
953 			pTargetList = new TargetList;
954 			GetViewFrame()->GetTargetList( *pTargetList );
955 		}
956 
957 		SvxIMapDlgChildWindow::UpdateIMapDlg( aGraphic, pIMap, pTargetList, pObj );
958 
959 		// TargetListe kann von uns wieder geloescht werden
960 		if ( pTargetList )
961 		{
962 			String* pEntry = pTargetList->First();
963 			while( pEntry )
964 			{
965 				delete pEntry;
966 				pEntry = pTargetList->Next();
967 			}
968 
969 			delete pTargetList;
970 		}
971 	}
972 }
973 
974 // -----------------------------------------------------------------------------
975 
976 IMPL_LINK( DrawViewShell, NameObjectHdl, AbstractSvxNameDialog*, pDialog )
977 {
978     String aName;
979 
980     if( pDialog )
981         pDialog->GetName( aName );
982 
983     return( ( !aName.Len() || ( GetDoc() && !GetDoc()->GetObj( aName ) ) ) ? 1 : 0 );
984 }
985 
986 } // end of namespace sd
987