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