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_sc.hxx"
26
27
28
29 //------------------------------------------------------------------
30
31 #include <editeng/eeitem.hxx>
32
33 #include <sfx2/viewfrm.hxx>
34 #include <sfx2/request.hxx>
35 #include <sfx2/bindings.hxx>
36 #include <tools/urlobj.hxx>
37 //CHINA001 #include <svx/dlgname.hxx>
38 #include <svx/svxdlg.hxx> //CHINA001
39 #include <svx/dialogs.hrc> //CHINA001
40 #include <svx/fmglob.hxx>
41 #include <svx/hlnkitem.hxx>
42 #include <svx/fontwork.hxx>
43 #include <svx/svdocapt.hxx>
44 #include <svx/svdoole2.hxx>
45 #include <svx/svdouno.hxx>
46 #include <svx/svdpage.hxx>
47 #include <svx/svdundo.hxx>
48 #include <svx/xdef.hxx>
49 #include <vcl/msgbox.hxx>
50 #include <svx/extrusionbar.hxx>
51 #include <svx/fontworkbar.hxx>
52 #include <sfx2/docfile.hxx>
53
54 #include <com/sun/star/form/FormButtonType.hpp>
55 #include <com/sun/star/beans/XPropertySet.hpp>
56 #include <com/sun/star/beans/XPropertySetInfo.hpp>
57 #include <com/sun/star/awt/XControlModel.hpp>
58
59 #include "drawsh.hxx"
60 #include "drawview.hxx"
61 #include "viewdata.hxx"
62 #include "tabvwsh.hxx"
63 #include "docsh.hxx"
64 //CHINA001 #include "strindlg.hxx"
65 #include "scresid.hxx"
66 #include "undotab.hxx"
67 #include "drwlayer.hxx"
68 #include "userdat.hxx"
69 #include "postit.hxx"
70
71 #include "sc.hrc"
72
73 using namespace com::sun::star;
74
75 //------------------------------------------------------------------
76
GetHLinkState(SfxItemSet & rSet)77 void ScDrawShell::GetHLinkState( SfxItemSet& rSet ) // Hyperlink
78 {
79 ScDrawView* pView = pViewData->GetScDrawView();
80 const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
81 sal_uLong nMarkCount = rMarkList.GetMarkCount();
82
83 // Hyperlink
84
85 SvxHyperlinkItem aHLinkItem;
86
87 if ( nMarkCount == 1 ) // URL-Button markiert ?
88 {
89 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
90 #ifdef ISSUE66550_HLINK_FOR_SHAPES
91 ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj );
92 if ( pInfo && (pInfo->GetHlink().getLength() > 0) )
93 {
94 aHLinkItem.SetURL( pInfo->GetHlink() );
95 aHLinkItem.SetInsertMode(HLINK_FIELD);
96 }
97 #endif
98 SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, pObj);
99 if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
100 {
101 uno::Reference<awt::XControlModel> xControlModel = pUnoCtrl->GetUnoControlModel();
102 DBG_ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
103 if( !xControlModel.is() )
104 return;
105
106 uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY );
107 uno::Reference< beans::XPropertySetInfo > xInfo = xPropSet->getPropertySetInfo();
108
109 rtl::OUString sPropButtonType = rtl::OUString::createFromAscii( "ButtonType" );
110 rtl::OUString sPropTargetURL = rtl::OUString::createFromAscii( "TargetURL" );
111 rtl::OUString sPropTargetFrame = rtl::OUString::createFromAscii( "TargetFrame" );
112 rtl::OUString sPropLabel = rtl::OUString::createFromAscii( "Label" );
113
114 if(xInfo->hasPropertyByName( sPropButtonType ))
115 {
116 uno::Any aAny = xPropSet->getPropertyValue( sPropButtonType );
117 form::FormButtonType eTmp;
118 if ( (aAny >>= eTmp) && eTmp == form::FormButtonType_URL )
119 {
120 rtl::OUString sTmp;
121 // Label
122 if(xInfo->hasPropertyByName( sPropLabel ))
123 {
124 aAny = xPropSet->getPropertyValue( sPropLabel );
125 if ( (aAny >>= sTmp) && sTmp.getLength() )
126 {
127 aHLinkItem.SetName(sTmp);
128 }
129 }
130 // URL
131 if(xInfo->hasPropertyByName( sPropTargetURL ))
132 {
133 aAny = xPropSet->getPropertyValue( sPropTargetURL );
134 if ( (aAny >>= sTmp) && sTmp.getLength() )
135 {
136 aHLinkItem.SetURL(sTmp);
137 }
138 }
139 // Target
140 if(xInfo->hasPropertyByName( sPropTargetFrame ))
141 {
142 aAny = xPropSet->getPropertyValue( sPropTargetFrame );
143 if ( (aAny >>= sTmp) && sTmp.getLength() )
144 {
145 aHLinkItem.SetTargetFrame(sTmp);
146 }
147 }
148 aHLinkItem.SetInsertMode(HLINK_BUTTON);
149 }
150 }
151 }
152 }
153
154 rSet.Put(aHLinkItem);
155 }
156
ExecuteHLink(SfxRequest & rReq)157 void ScDrawShell::ExecuteHLink( SfxRequest& rReq )
158 {
159 const SfxItemSet* pReqArgs = rReq.GetArgs();
160
161 sal_uInt16 nSlot = rReq.GetSlot();
162 switch ( nSlot )
163 {
164 case SID_HYPERLINK_SETLINK:
165 if( pReqArgs )
166 {
167 const SfxPoolItem* pItem;
168 if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, sal_True, &pItem ) == SFX_ITEM_SET )
169 {
170 const SvxHyperlinkItem* pHyper = (const SvxHyperlinkItem*) pItem;
171 const String& rName = pHyper->GetName();
172 const String& rURL = pHyper->GetURL();
173 const String& rTarget = pHyper->GetTargetFrame();
174 SvxLinkInsertMode eMode = pHyper->GetInsertMode();
175
176 sal_Bool bDone = sal_False;
177 if ( eMode == HLINK_FIELD || eMode == HLINK_BUTTON )
178 {
179 ScDrawView* pView = pViewData->GetScDrawView();
180 const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
181 if ( rMarkList.GetMarkCount() == 1 )
182 {
183 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
184 SdrUnoObj* pUnoCtrl = PTR_CAST(SdrUnoObj, pObj );
185 if (pUnoCtrl && FmFormInventor == pUnoCtrl->GetObjInventor())
186 {
187 uno::Reference<awt::XControlModel> xControlModel =
188 pUnoCtrl->GetUnoControlModel();
189 DBG_ASSERT( xControlModel.is(), "UNO-Control ohne Model" );
190 if( !xControlModel.is() )
191 return;
192
193 uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY );
194 uno::Reference< beans::XPropertySetInfo > xInfo = xPropSet->getPropertySetInfo();
195
196 rtl::OUString sPropTargetURL =
197 rtl::OUString::createFromAscii( "TargetURL" );
198
199 // Darf man eine URL an dem Objekt setzen?
200 if (xInfo->hasPropertyByName( sPropTargetURL ))
201 {
202 // Ja!
203
204 rtl::OUString sPropButtonType =
205 rtl::OUString::createFromAscii( "ButtonType" );
206 rtl::OUString sPropTargetFrame =
207 rtl::OUString::createFromAscii( "TargetFrame" );
208 rtl::OUString sPropLabel =
209 rtl::OUString::createFromAscii( "Label" );
210
211 uno::Any aAny;
212 if ( xInfo->hasPropertyByName( sPropLabel ) )
213 {
214 aAny <<= rtl::OUString(rName);
215 xPropSet->setPropertyValue( sPropLabel, aAny );
216 }
217
218 ::rtl::OUString aTmp = INetURLObject::GetAbsURL( pViewData->GetDocShell()->GetMedium()->GetBaseURL(), rURL );
219 aAny <<= aTmp;
220 xPropSet->setPropertyValue( sPropTargetURL, aAny );
221
222 if( rTarget.Len() && xInfo->hasPropertyByName( sPropTargetFrame ) )
223 {
224 aAny <<= rtl::OUString(rTarget);
225 xPropSet->setPropertyValue( sPropTargetFrame, aAny );
226 }
227
228 if ( xInfo->hasPropertyByName( sPropButtonType ) )
229 {
230 form::FormButtonType eButtonType = form::FormButtonType_URL;
231 aAny <<= eButtonType;
232 xPropSet->setPropertyValue( sPropButtonType, aAny );
233 }
234
235 //! Undo ???
236 pViewData->GetDocShell()->SetDocumentModified();
237 bDone = sal_True;
238 }
239 }
240 #ifdef ISSUE66550_HLINK_FOR_SHAPES
241 else
242 {
243 SetHlinkForObject( pObj, rURL );
244 bDone = sal_True;
245 }
246 #endif
247 }
248 }
249
250 if (!bDone)
251 pViewData->GetViewShell()->
252 InsertURL( rName, rURL, rTarget, (sal_uInt16) eMode );
253
254 // InsertURL an der ViewShell schaltet bei "Text" die DrawShell ab !!!
255 }
256 }
257 break;
258 default:
259 DBG_ERROR("falscher Slot");
260 }
261 }
262
263 sal_uInt16 ScGetFontWorkId(); // wegen CLOOKs - in drtxtob2
264
265 //------------------------------------------------------------------
266
267 //
268 // Funktionen auf Drawing-Objekten
269 //
270
ExecDrawFunc(SfxRequest & rReq)271 void ScDrawShell::ExecDrawFunc( SfxRequest& rReq )
272 {
273 SfxBindings& rBindings = pViewData->GetBindings();
274 ScTabView* pTabView = pViewData->GetView();
275 ScDrawView* pView = pTabView->GetScDrawView();
276 const SfxItemSet *pArgs = rReq.GetArgs();
277 sal_uInt16 nSlotId = rReq.GetSlot();
278
279 //!!!
280 // wer weiss, wie lange das funktioniert? (->vom Abreisscontrol funktioniert es)
281 //
282 if (nSlotId == SID_OBJECT_ALIGN && pArgs)
283 nSlotId = SID_OBJECT_ALIGN + ((SfxEnumItem&)pArgs->Get(SID_OBJECT_ALIGN)).GetValue() + 1;
284
285 switch (nSlotId)
286 {
287 case SID_OBJECT_HEAVEN:
288 pView->SetMarkedToLayer( SC_LAYER_FRONT );
289 rBindings.Invalidate(SID_OBJECT_HEAVEN);
290 rBindings.Invalidate(SID_OBJECT_HELL);
291 break;
292 case SID_OBJECT_HELL:
293 pView->SetMarkedToLayer( SC_LAYER_BACK );
294 rBindings.Invalidate(SID_OBJECT_HEAVEN);
295 rBindings.Invalidate(SID_OBJECT_HELL);
296 // leave draw shell if nothing selected (layer may be locked)
297 pViewData->GetViewShell()->UpdateDrawShell();
298 break;
299
300 case SID_FRAME_TO_TOP:
301 pView->PutMarkedToTop();
302 break;
303 case SID_FRAME_TO_BOTTOM:
304 pView->PutMarkedToBtm();
305 break;
306 case SID_FRAME_UP:
307 pView->MovMarkedToTop();
308 break;
309 case SID_FRAME_DOWN:
310 pView->MovMarkedToBtm();
311 break;
312
313 case SID_GROUP:
314 pView->GroupMarked();
315 break;
316 case SID_UNGROUP:
317 pView->UnGroupMarked();
318 break;
319 case SID_ENTER_GROUP:
320 pView->EnterMarkedGroup();
321 break;
322 case SID_LEAVE_GROUP:
323 pView->LeaveOneGroup();
324 break;
325
326 case SID_MIRROR_HORIZONTAL:
327 case SID_FLIP_HORIZONTAL:
328 pView->MirrorAllMarkedHorizontal();
329 rBindings.Invalidate( SID_ATTR_TRANSFORM_ANGLE );
330 break;
331 case SID_MIRROR_VERTICAL:
332 case SID_FLIP_VERTICAL:
333 pView->MirrorAllMarkedVertical();
334 rBindings.Invalidate( SID_ATTR_TRANSFORM_ANGLE );
335 break;
336
337 case SID_OBJECT_ALIGN_LEFT:
338 case SID_ALIGN_ANY_LEFT:
339 if (pView->IsAlignPossible())
340 pView->AlignMarkedObjects(SDRHALIGN_LEFT, SDRVALIGN_NONE);
341 break;
342 case SID_OBJECT_ALIGN_CENTER:
343 case SID_ALIGN_ANY_HCENTER:
344 if (pView->IsAlignPossible())
345 pView->AlignMarkedObjects(SDRHALIGN_CENTER, SDRVALIGN_NONE);
346 break;
347 case SID_OBJECT_ALIGN_RIGHT:
348 case SID_ALIGN_ANY_RIGHT:
349 if (pView->IsAlignPossible())
350 pView->AlignMarkedObjects(SDRHALIGN_RIGHT, SDRVALIGN_NONE);
351 break;
352 case SID_OBJECT_ALIGN_UP:
353 case SID_ALIGN_ANY_TOP:
354 if (pView->IsAlignPossible())
355 pView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_TOP);
356 break;
357 case SID_OBJECT_ALIGN_MIDDLE:
358 case SID_ALIGN_ANY_VCENTER:
359 if (pView->IsAlignPossible())
360 pView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_CENTER);
361 break;
362 case SID_OBJECT_ALIGN_DOWN:
363 case SID_ALIGN_ANY_BOTTOM:
364 if (pView->IsAlignPossible())
365 pView->AlignMarkedObjects(SDRHALIGN_NONE, SDRVALIGN_BOTTOM);
366 break;
367
368 case SID_DELETE:
369 case SID_DELETE_CONTENTS:
370 pView->DeleteMarked();
371 pViewData->GetViewShell()->UpdateDrawShell();
372 break;
373
374 case SID_CUT:
375 pView->DoCut();
376 pViewData->GetViewShell()->UpdateDrawShell();
377 break;
378
379 case SID_COPY:
380 pView->DoCopy();
381 break;
382
383 case SID_PASTE:
384 DBG_ERROR( "SdrView::PasteClipboard not supported anymore" );
385 // pView->PasteClipboard( pWin );
386 break;
387
388 case SID_SELECTALL:
389 pView->MarkAll();
390 break;
391
392 case SID_ANCHOR_PAGE:
393 pView->SetAnchor( SCA_PAGE );
394 rBindings.Invalidate( SID_ANCHOR_PAGE );
395 rBindings.Invalidate( SID_ANCHOR_CELL );
396 break;
397
398 case SID_ANCHOR_CELL:
399 pView->SetAnchor( SCA_CELL );
400 rBindings.Invalidate( SID_ANCHOR_PAGE );
401 rBindings.Invalidate( SID_ANCHOR_CELL );
402 break;
403
404 case SID_ANCHOR_TOGGLE:
405 {
406 switch( pView->GetAnchor() )
407 {
408 case SCA_CELL:
409 pView->SetAnchor( SCA_PAGE );
410 break;
411 default:
412 pView->SetAnchor( SCA_CELL );
413 break;
414 }
415 }
416 rBindings.Invalidate( SID_ANCHOR_PAGE );
417 rBindings.Invalidate( SID_ANCHOR_CELL );
418 break;
419
420 case SID_OBJECT_ROTATE:
421 {
422 SdrDragMode eMode;
423 if (pView->GetDragMode() == SDRDRAG_ROTATE)
424 eMode = SDRDRAG_MOVE;
425 else
426 eMode = SDRDRAG_ROTATE;
427 pView->SetDragMode( eMode );
428 rBindings.Invalidate( SID_OBJECT_ROTATE );
429 rBindings.Invalidate( SID_OBJECT_MIRROR );
430 if (eMode == SDRDRAG_ROTATE && !pView->IsFrameDragSingles())
431 {
432 pView->SetFrameDragSingles( sal_True );
433 rBindings.Invalidate( SID_BEZIER_EDIT );
434 }
435 }
436 break;
437 case SID_OBJECT_MIRROR:
438 {
439 SdrDragMode eMode;
440 if (pView->GetDragMode() == SDRDRAG_MIRROR)
441 eMode = SDRDRAG_MOVE;
442 else
443 eMode = SDRDRAG_MIRROR;
444 pView->SetDragMode( eMode );
445 rBindings.Invalidate( SID_OBJECT_ROTATE );
446 rBindings.Invalidate( SID_OBJECT_MIRROR );
447 if (eMode == SDRDRAG_MIRROR && !pView->IsFrameDragSingles())
448 {
449 pView->SetFrameDragSingles( sal_True );
450 rBindings.Invalidate( SID_BEZIER_EDIT );
451 }
452 }
453 break;
454 case SID_BEZIER_EDIT:
455 {
456 sal_Bool bOld = pView->IsFrameDragSingles();
457 pView->SetFrameDragSingles( !bOld );
458 rBindings.Invalidate( SID_BEZIER_EDIT );
459 if (bOld && pView->GetDragMode() != SDRDRAG_MOVE)
460 {
461 pView->SetDragMode( SDRDRAG_MOVE );
462 rBindings.Invalidate( SID_OBJECT_ROTATE );
463 rBindings.Invalidate( SID_OBJECT_MIRROR );
464 }
465 }
466 break;
467
468 case SID_FONTWORK:
469 {
470 sal_uInt16 nId = ScGetFontWorkId();
471 SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
472
473 if ( rReq.GetArgs() )
474 pViewFrm->SetChildWindow( nId,
475 ((const SfxBoolItem&)
476 (rReq.GetArgs()->Get(SID_FONTWORK))).
477 GetValue() );
478 else
479 pViewFrm->ToggleChildWindow( nId );
480
481 rBindings.Invalidate( SID_FONTWORK );
482 rReq.Done();
483 }
484 break;
485
486 case SID_ORIGINALSIZE:
487 pView->SetMarkedOriginalSize();
488 break;
489
490 case SID_ENABLE_HYPHENATION:
491 {
492 SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, SID_ENABLE_HYPHENATION, sal_False);
493 if( pItem )
494 {
495 SfxItemSet aSet( GetPool(), EE_PARA_HYPHENATE, EE_PARA_HYPHENATE );
496 sal_Bool bValue = ( (const SfxBoolItem*) pItem)->GetValue();
497 aSet.Put( SfxBoolItem( EE_PARA_HYPHENATE, bValue ) );
498 pView->SetAttributes( aSet );
499 }
500 rReq.Done();
501 }
502 break;
503
504 case SID_RENAME_OBJECT:
505 {
506 if(1L == pView->GetMarkedObjectCount())
507 {
508 // #i68101#
509 SdrObject* pSelected = pView->GetMarkedObjectByIndex(0L);
510 OSL_ENSURE(pSelected, "ScDrawShell::ExecDrawFunc: nMarkCount, but no object (!)");
511
512 if(SC_LAYER_INTERN != pSelected->GetLayer())
513 {
514 String aName(pSelected->GetName());
515
516 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
517 OSL_ENSURE(pFact, "Dialogdiet fail!");
518 AbstractSvxObjectNameDialog* pDlg = pFact->CreateSvxObjectNameDialog(NULL, aName);
519 OSL_ENSURE(pDlg, "Dialogdiet fail!");
520
521 pDlg->SetCheckNameHdl(LINK(this, ScDrawShell, NameObjectHdl));
522
523 if(RET_OK == pDlg->Execute())
524 {
525 ScDocShell* pDocSh = pViewData->GetDocShell();
526 pDlg->GetName(aName);
527
528 if(aName != pSelected->GetName())
529 {
530 // handle name change
531 const sal_uInt16 nObjType(pSelected->GetObjIdentifier());
532
533 if(OBJ_GRAF == nObjType && 0L == aName.Len())
534 {
535 // graphics objects must have names
536 // (all graphics are supposed to be in the navigator)
537 ScDrawLayer* pModel = pViewData->GetDocument()->GetDrawLayer();
538
539 if(pModel)
540 {
541 aName = pModel->GetNewGraphicName();
542 }
543 }
544
545 // An undo action for renaming is missing in svdraw (99363).
546 // For OLE objects (which can be identified using the persist name),
547 // ScUndoRenameObject can be used until there is a common action for all objects.
548 if(OBJ_OLE2 == nObjType)
549 {
550 const String aPersistName = static_cast<SdrOle2Obj*>(pSelected)->GetPersistName();
551
552 if(aPersistName.Len())
553 {
554 pDocSh->GetUndoManager()->AddUndoAction(
555 new ScUndoRenameObject(pDocSh, aPersistName, pSelected->GetName(), aName));
556 }
557 }
558
559 // set new name
560 pSelected->SetName(aName);
561 }
562
563 // ChartListenerCollectionNeedsUpdate is needed for Navigator update
564 pDocSh->GetDocument()->SetChartListenerCollectionNeedsUpdate( sal_True );
565 pDocSh->SetDrawModified();
566 }
567
568 delete pDlg;
569 }
570 }
571 break;
572 }
573
574 // #i68101#
575 case SID_TITLE_DESCRIPTION_OBJECT:
576 {
577 if(1L == pView->GetMarkedObjectCount())
578 {
579 SdrObject* pSelected = pView->GetMarkedObjectByIndex(0L);
580 OSL_ENSURE(pSelected, "ScDrawShell::ExecDrawFunc: nMarkCount, but no object (!)");
581
582 if(SC_LAYER_INTERN != pSelected->GetLayer())
583 {
584 String aTitle(pSelected->GetTitle());
585 String aDescription(pSelected->GetDescription());
586
587 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
588 OSL_ENSURE(pFact, "Dialogdiet fail!");
589 AbstractSvxObjectTitleDescDialog* pDlg = pFact->CreateSvxObjectTitleDescDialog(NULL, aTitle, aDescription);
590 OSL_ENSURE(pDlg, "Dialogdiet fail!");
591
592 if(RET_OK == pDlg->Execute())
593 {
594 ScDocShell* pDocSh = pViewData->GetDocShell();
595
596 // handle Title and Description
597 pDlg->GetTitle(aTitle);
598 pDlg->GetDescription(aDescription);
599 pSelected->SetTitle(aTitle);
600 pSelected->SetDescription(aDescription);
601
602 // ChartListenerCollectionNeedsUpdate is needed for Navigator update
603 pDocSh->GetDocument()->SetChartListenerCollectionNeedsUpdate( sal_True );
604 pDocSh->SetDrawModified();
605 }
606
607 delete pDlg;
608 }
609 }
610 break;
611 }
612
613 case SID_EXTRUSION_TOOGLE:
614 case SID_EXTRUSION_TILT_DOWN:
615 case SID_EXTRUSION_TILT_UP:
616 case SID_EXTRUSION_TILT_LEFT:
617 case SID_EXTRUSION_TILT_RIGHT:
618 case SID_EXTRUSION_3D_COLOR:
619 case SID_EXTRUSION_DEPTH:
620 case SID_EXTRUSION_DIRECTION:
621 case SID_EXTRUSION_PROJECTION:
622 case SID_EXTRUSION_LIGHTING_DIRECTION:
623 case SID_EXTRUSION_LIGHTING_INTENSITY:
624 case SID_EXTRUSION_SURFACE:
625 case SID_EXTRUSION_DEPTH_FLOATER:
626 case SID_EXTRUSION_DIRECTION_FLOATER:
627 case SID_EXTRUSION_LIGHTING_FLOATER:
628 case SID_EXTRUSION_SURFACE_FLOATER:
629 case SID_EXTRUSION_DEPTH_DIALOG:
630 svx::ExtrusionBar::execute( pView, rReq, rBindings );
631 rReq.Ignore ();
632 break;
633
634 case SID_FONTWORK_SHAPE:
635 case SID_FONTWORK_SHAPE_TYPE:
636 case SID_FONTWORK_ALIGNMENT:
637 case SID_FONTWORK_SAME_LETTER_HEIGHTS:
638 case SID_FONTWORK_CHARACTER_SPACING:
639 case SID_FONTWORK_KERN_CHARACTER_PAIRS:
640 case SID_FONTWORK_CHARACTER_SPACING_FLOATER:
641 case SID_FONTWORK_ALIGNMENT_FLOATER:
642 case SID_FONTWORK_CHARACTER_SPACING_DIALOG:
643 svx::FontworkBar::execute( pView, rReq, rBindings );
644 rReq.Ignore ();
645 break;
646
647 default:
648 break;
649 }
650 }
651
IMPL_LINK(ScDrawShell,NameObjectHdl,AbstractSvxNameDialog *,pDialog)652 IMPL_LINK( ScDrawShell, NameObjectHdl, AbstractSvxNameDialog*, pDialog )
653 {
654 String aName;
655
656 if( pDialog )
657 pDialog->GetName( aName );
658
659 ScDrawLayer* pModel = pViewData->GetDocument()->GetDrawLayer();
660 if ( aName.Len() && pModel )
661 {
662 SCTAB nDummyTab;
663 if ( pModel->GetNamedObject( aName, 0, nDummyTab ) )
664 {
665 // existing object found -> name invalid
666 return 0;
667 }
668 }
669
670 return 1; // name is valid
671 }
672
673 //------------------------------------------------------------------
674
ExecFormText(SfxRequest & rReq)675 void ScDrawShell::ExecFormText(SfxRequest& rReq)
676 {
677 ScDrawView* pDrView = pViewData->GetScDrawView();
678 const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList();
679
680 if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() )
681 {
682 const SfxItemSet& rSet = *rReq.GetArgs();
683
684 if ( pDrView->IsTextEdit() )
685 pDrView->ScEndTextEdit();
686
687 pDrView->SetAttributes(rSet);
688 }
689 }
690
691 //------------------------------------------------------------------
692
ExecFormatPaintbrush(SfxRequest & rReq)693 void ScDrawShell::ExecFormatPaintbrush( SfxRequest& rReq )
694 {
695 ScViewFunc* pView = pViewData->GetView();
696 if ( pView->HasPaintBrush() )
697 {
698 // cancel paintbrush mode
699 pView->ResetBrushDocument();
700 }
701 else
702 {
703 sal_Bool bLock = sal_False;
704 const SfxItemSet *pArgs = rReq.GetArgs();
705 if( pArgs && pArgs->Count() >= 1 )
706 bLock = static_cast<const SfxBoolItem&>(pArgs->Get(SID_FORMATPAINTBRUSH)).GetValue();
707
708 ScDrawView* pDrawView = pViewData->GetScDrawView();
709 if ( pDrawView && pDrawView->AreObjectsMarked() )
710 {
711 sal_Bool bOnlyHardAttr = sal_True;
712 SfxItemSet* pItemSet = new SfxItemSet( pDrawView->GetAttrFromMarked(bOnlyHardAttr) );
713 pView->SetDrawBrushSet( pItemSet, bLock );
714 }
715 }
716 }
717
StateFormatPaintbrush(SfxItemSet & rSet)718 void ScDrawShell::StateFormatPaintbrush( SfxItemSet& rSet )
719 {
720 ScDrawView* pDrawView = pViewData->GetScDrawView();
721 sal_Bool bSelection = pDrawView && pDrawView->AreObjectsMarked();
722 sal_Bool bHasPaintBrush = pViewData->GetView()->HasPaintBrush();
723
724 if ( !bHasPaintBrush && !bSelection )
725 rSet.DisableItem( SID_FORMATPAINTBRUSH );
726 else
727 rSet.Put( SfxBoolItem( SID_FORMATPAINTBRUSH, bHasPaintBrush ) );
728 }
729
GetDrawView()730 ScDrawView* ScDrawShell::GetDrawView()
731 {
732 return pViewData->GetView()->GetScDrawView();
733 }
734
735
736
737
738