xref: /trunk/main/sc/source/ui/drawfunc/drawsh.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 #include <svx/svxdlg.hxx> //CHINA001
32 #include <svx/dialogs.hrc> //CHINA001
33 
34 #include "scitems.hxx"
35 
36 #include <editeng/eeitem.hxx>
37 #include <svx/fontwork.hxx>
38 //#include <svx/labdlg.hxx> CHINA001
39 #include <svl/srchitem.hxx>
40 #include <svx/tabarea.hxx>
41 #include <svx/tabline.hxx>
42 //CHINA001 #include <svx/transfrm.hxx>
43 #include <sfx2/app.hxx>
44 #include <sfx2/objface.hxx>
45 #include <sfx2/objsh.hxx>
46 #include <sfx2/request.hxx>
47 #include <sfx2/dispatch.hxx>
48 #include <svl/whiter.hxx>
49 #include <vcl/msgbox.hxx>
50 
51 #include "drawsh.hxx"
52 #include "drwlayer.hxx"
53 #include "sc.hrc"
54 #include "viewdata.hxx"
55 #include "document.hxx"
56 #include "docpool.hxx"
57 #include "drawview.hxx"
58 #include "scresid.hxx"
59 #include <svx/svdobj.hxx>
60 //add header of cui CHINA001
61 #include <svx/svxdlg.hxx>
62 #include <svx/dialogs.hrc>
63 #include <svx/drawitem.hxx>
64 #include <svx/xtable.hxx>
65 
66 #define ScDrawShell
67 #include "scslots.hxx"
68 
69 #include "userdat.hxx"
70 #include <sfx2/objsh.hxx>
71 #include <svl/macitem.hxx>
72 #include <sfx2/evntconf.hxx>
73 #include <sfx2/viewsh.hxx>
74 #include <com/sun/star/util/XModifiable.hpp>
75 #include <com/sun/star/frame/XFrame.hpp>
76 
77 //------------------------------------------------------------------
78 
79 TYPEINIT1( ScDrawShell, SfxShell );
80 
81 SFX_IMPL_INTERFACE(ScDrawShell, SfxShell, ScResId(SCSTR_DRAWSHELL) )
82 {
83     SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
84                                 ScResId(RID_DRAW_OBJECTBAR) );
85     SFX_POPUPMENU_REGISTRATION( ScResId(RID_POPUP_DRAW) );
86     SFX_CHILDWINDOW_REGISTRATION( SvxFontWorkChildWindow::GetChildWindowId() );
87 }
88 
89 
90 // abschalten der nicht erwuenschten Acceleratoren:
91 
92 void ScDrawShell::StateDisableItems( SfxItemSet &rSet )
93 {
94     SfxWhichIter aIter(rSet);
95     sal_uInt16 nWhich = aIter.FirstWhich();
96 
97     while (nWhich)
98     {
99         rSet.DisableItem( nWhich );
100         nWhich = aIter.NextWhich();
101     }
102 }
103 
104 void lcl_setModified( SfxObjectShell*  pShell )
105 {
106     if ( pShell )
107     {
108         com::sun::star::uno::Reference< com::sun::star::util::XModifiable > xModif( pShell->GetModel(), com::sun::star::uno::UNO_QUERY );
109         if ( xModif.is() )
110             xModif->setModified( sal_True );
111     }
112 }
113 
114 void ScDrawShell::ExecDrawAttr( SfxRequest& rReq )
115 {
116     sal_uInt16              nSlot       = rReq.GetSlot();
117     Window*             pWin        = pViewData->GetActiveWin();
118 //  SfxViewFrame*       pViewFrame  = SfxViewShell::Current()->GetViewFrame(); //!!! koennte knallen
119     ScDrawView*         pView       = pViewData->GetScDrawView();
120     SdrModel*           pDoc        = pViewData->GetDocument()->GetDrawLayer();
121 
122     const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
123     sal_uLong nMarkCount = rMarkList.GetMarkCount();
124     SdrObject* pSingleSelectedObj = NULL;
125     if ( nMarkCount > 0 )
126         pSingleSelectedObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
127 
128     switch ( nSlot )
129     {
130         case SID_ASSIGNMACRO:
131             {
132                 if ( pSingleSelectedObj )
133                     ExecuteMacroAssign( pSingleSelectedObj, pWin );
134             }
135             break;
136 
137         case SID_TEXT_STANDARD: // Harte Textattributierung loeschen
138             {
139                 SfxItemSet aEmptyAttr(GetPool(), EE_ITEMS_START, EE_ITEMS_END);
140                 pView->SetAttributes(aEmptyAttr, sal_True);
141             }
142             break;
143 
144         case SID_ATTR_LINE_STYLE:
145         case SID_ATTR_LINEEND_STYLE:
146         case SID_ATTR_LINE_DASH:
147         case SID_ATTR_LINE_WIDTH:
148         case SID_ATTR_LINE_COLOR:
149         case SID_ATTR_FILL_STYLE:
150         case SID_ATTR_FILL_COLOR:
151         case SID_ATTR_FILL_GRADIENT:
152         case SID_ATTR_FILL_HATCH:
153         case SID_ATTR_FILL_BITMAP:
154 
155         // #i25616#
156         case SID_ATTR_FILL_SHADOW:
157             {
158                 // Wenn ToolBar vertikal :
159                 if ( !rReq.GetArgs() )
160                 {
161                     switch ( nSlot )
162                     {
163                         case SID_ATTR_LINE_STYLE:
164                         case SID_ATTR_LINE_DASH:
165                         case SID_ATTR_LINE_WIDTH:
166                         case SID_ATTR_LINE_COLOR:
167                             ExecuteLineDlg( rReq );
168                             break;
169 
170                         case SID_ATTR_FILL_STYLE:
171                         case SID_ATTR_FILL_COLOR:
172                         case SID_ATTR_FILL_GRADIENT:
173                         case SID_ATTR_FILL_HATCH:
174                         case SID_ATTR_FILL_BITMAP:
175 
176                         // #i25616#
177                         case SID_ATTR_FILL_SHADOW:
178 
179                             ExecuteAreaDlg( rReq );
180                             break;
181 
182                         default:
183                             break;
184                     }
185 
186                     //=====
187                     return;
188                     //=====
189                 }
190 
191                 if( pView->AreObjectsMarked() )
192                     pView->SetAttrToMarked( *rReq.GetArgs(), sal_False );
193                 else
194                     pView->SetDefaultAttr( *rReq.GetArgs(), sal_False);
195                 pView->InvalidateAttribs();
196             }
197             break;
198 
199         case SID_ATTRIBUTES_LINE:
200             ExecuteLineDlg( rReq );
201             break;
202 
203         case SID_ATTRIBUTES_AREA:
204             ExecuteAreaDlg( rReq );
205             break;
206 
207         case SID_DRAWTEXT_ATTR_DLG:
208             ExecuteTextAttrDlg( rReq );
209             break;
210 
211 #ifdef ISSUE66550_HLINK_FOR_SHAPES
212         case SID_DRAW_HLINK_EDIT:
213             if ( pSingleSelectedObj )
214                 pViewData->GetDispatcher().Execute( SID_HYPERLINK_DIALOG );
215             break;
216 
217         case SID_DRAW_HLINK_DELETE:
218             if ( pSingleSelectedObj )
219                 SetHlinkForObject( pSingleSelectedObj, rtl::OUString() );
220             break;
221 
222         case SID_OPEN_HYPERLINK:
223             if ( nMarkCount == 1 )
224             {
225                 SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
226                 if ( pObj->IsGroupObject() )
227                 {
228                     SdrPageView* pPV = 0;
229                     SdrObject* pHit = 0;
230                     if ( pView->PickObj( pWin->PixelToLogic( pViewData->GetMousePosPixel() ), pView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) )
231                         pObj = pHit;
232                 }
233 
234                 ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj );
235                 if ( pInfo && (pInfo->GetHlink().getLength() > 0) )
236                     ScGlobal::OpenURL( pInfo->GetHlink(), String::EmptyString() );
237             }
238             break;
239 #endif
240 
241         case SID_ATTR_TRANSFORM:
242             {
243                 if ( pView->AreObjectsMarked() )
244                 {
245                     const SfxItemSet* pArgs = rReq.GetArgs();
246 
247                     if( !pArgs )
248                     {
249                         // const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
250                         if( rMarkList.GetMark(0) != 0 )
251                         {
252                             SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
253                             if( pObj->GetObjIdentifier() == OBJ_CAPTION )
254                             {
255                                 // --------- Itemset fuer Caption --------
256                                 SfxItemSet aNewAttr(pDoc->GetItemPool());
257                                 pView->GetAttributes(aNewAttr);
258                                 // --------- Itemset fuer Groesse und Position --------
259                                 SfxItemSet aNewGeoAttr(pView->GetGeoAttrFromMarked());
260 
261                                 //SvxCaptionTabDialog* pDlg = new SvxCaptionTabDialog(pWin, pView);
262                                 //change for cui CHINA001
263                                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
264                                 if ( pFact )
265                                 {
266                                     SfxAbstractTabDialog *pDlg = pFact->CreateCaptionDialog( pWin, pView );
267 
268                                     const sal_uInt16* pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() );
269                                     SfxItemSet aCombSet( *aNewAttr.GetPool(), pRange );
270                                     aCombSet.Put( aNewAttr );
271                                     aCombSet.Put( aNewGeoAttr );
272                                     pDlg->SetInputSet( &aCombSet );
273 
274                                     if (pDlg->Execute() == RET_OK)
275                                     {
276                                         rReq.Done(*(pDlg->GetOutputItemSet()));
277                                         pView->SetAttributes(*pDlg->GetOutputItemSet());
278                                         pView->SetGeoAttrToMarked(*pDlg->GetOutputItemSet());
279                                     }
280 
281                                     delete pDlg;
282                                 }// change for cui
283                             }
284                             else
285                             {
286                                 SfxItemSet aNewAttr(pView->GetGeoAttrFromMarked());
287                                 //CHINA001 SvxTransformTabDialog* pDlg = new SvxTransformTabDialog(pWin, &aNewAttr, pView);
288                                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
289                                 if(pFact)
290                                 {
291                                     SfxAbstractTabDialog* pDlg = pFact->CreateSvxTransformTabDialog( pWin, &aNewAttr,pView );
292                                     DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
293                                     if (pDlg->Execute() == RET_OK)
294                                     {
295                                         rReq.Done(*(pDlg->GetOutputItemSet()));
296                                         pView->SetGeoAttrToMarked(*pDlg->GetOutputItemSet());
297                                     }
298                                     delete pDlg;
299                                 }
300                             }
301                         }
302 
303 
304                     }
305                     else
306                         pView->SetGeoAttrToMarked( *pArgs );
307                 }
308             }
309             break;
310 
311         default:
312             break;
313     }
314 }
315 
316 void ScDrawShell::ExecuteMacroAssign( SdrObject* pObj, Window* pWin )
317 {
318     SvxMacroItem aItem ( SFX_APP()->GetPool().GetWhich( SID_ATTR_MACROITEM ) );
319     ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj, sal_True );
320     if ( pInfo->GetMacro().getLength() > 0 )
321     {
322         SvxMacroTableDtor aTab;
323         String sMacro(  pInfo->GetMacro() );
324         aTab.Insert( SFX_EVENT_MOUSECLICK_OBJECT, new SvxMacro( sMacro, String() ) );
325         aItem.SetMacroTable( aTab );
326     }
327 
328     // create empty itemset for macro-dlg
329     SfxItemSet* pItemSet = new SfxItemSet(SFX_APP()->GetPool(), SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 );
330     pItemSet->Put ( aItem, SID_ATTR_MACROITEM );
331 
332     SfxEventNamesItem aNamesItem(SID_EVENTCONFIG);
333     aNamesItem.AddEvent( ScResId(RID_SCSTR_ONCLICK), String(), SFX_EVENT_MOUSECLICK_OBJECT );
334     pItemSet->Put( aNamesItem, SID_EVENTCONFIG );
335 
336     com::sun::star::uno::Reference < com::sun::star::frame::XFrame > xFrame;
337     if (GetViewShell())
338         xFrame = GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface();
339 
340     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
341     SfxAbstractDialog* pMacroDlg = pFact->CreateSfxDialog( pWin, *pItemSet, xFrame, SID_EVENTCONFIG );
342     if ( pMacroDlg && pMacroDlg->Execute() == RET_OK )
343     {
344         const SfxItemSet* pOutSet = pMacroDlg->GetOutputItemSet();
345         const SfxPoolItem* pItem;
346         if( SFX_ITEM_SET == pOutSet->GetItemState( SID_ATTR_MACROITEM, sal_False, &pItem ))
347         {
348             rtl::OUString sMacro;
349             SvxMacro* pMacro = ((SvxMacroItem*)pItem)->GetMacroTable().Get( SFX_EVENT_MOUSECLICK_OBJECT );
350             if ( pMacro )
351                 sMacro = pMacro->GetMacName();
352 
353             if ( pObj->IsGroupObject() )
354             {
355                 SdrObjList* pOL = pObj->GetSubList();
356                 sal_uLong nObj = pOL->GetObjCount();
357                 for ( sal_uLong index=0; index<nObj; ++index )
358                 {
359                     pInfo = ScDrawLayer::GetMacroInfo( pOL->GetObj(index), sal_True );
360                     pInfo->SetMacro( sMacro );
361                 }
362             }
363             else
364                 pInfo->SetMacro( sMacro );
365             lcl_setModified( GetObjectShell() );
366         }
367     }
368 
369     delete pMacroDlg;
370     delete pItemSet;
371 }
372 
373 void ScDrawShell::ExecuteLineDlg( SfxRequest& rReq, sal_uInt16 nTabPage )
374 {
375     ScDrawView*         pView       = pViewData->GetScDrawView();
376     sal_Bool                bHasMarked  = pView->AreObjectsMarked();
377     const SdrObject*    pObj        = NULL;
378     const SdrMarkList&  rMarkList   = pView->GetMarkedObjectList();
379 
380     if( rMarkList.GetMarkCount() == 1 )
381         pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
382 
383     SfxItemSet  aNewAttr( pView->GetDefaultAttr() );
384     if( bHasMarked )
385         pView->MergeAttrFromMarked( aNewAttr, sal_False );
386 
387 //CHINA001  SvxLineTabDialog* pDlg
388 //CHINA001  = new SvxLineTabDialog( pViewData->GetDialogParent(),
389 //CHINA001  &aNewAttr,
390 //CHINA001  pViewData->GetDocument()->GetDrawLayer(),
391 //CHINA001  pObj,
392 //CHINA001  bHasMarked );
393         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
394         DBG_ASSERT(pFact, "Dialogdiet Factory fail!");//CHINA001
395         SfxAbstractTabDialog * pDlg = pFact->CreateSvxLineTabDialog( pViewData->GetDialogParent(),
396                     &aNewAttr,
397                 pViewData->GetDocument()->GetDrawLayer(),
398                 pObj,
399                 bHasMarked);
400         DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
401     if ( nTabPage != 0xffff )
402         pDlg->SetCurPageId( nTabPage );
403 
404     if ( pDlg->Execute() == RET_OK )
405     {
406         if( bHasMarked )
407             pView->SetAttrToMarked( *pDlg->GetOutputItemSet(), sal_False );
408         else
409             pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False );
410 
411         pView->InvalidateAttribs();
412         rReq.Done();
413     }
414 
415     delete pDlg;
416 }
417 
418 void ScDrawShell::ExecuteAreaDlg( SfxRequest& rReq, sal_uInt16 nTabPage )
419 {
420     ScDrawView* pView       = pViewData->GetScDrawView();
421     sal_Bool        bHasMarked  = pView->AreObjectsMarked();
422 
423     SfxItemSet  aNewAttr( pView->GetDefaultAttr() );
424     if( bHasMarked )
425         pView->MergeAttrFromMarked( aNewAttr, sal_False );
426 
427     //CHINA001 SvxAreaTabDialog* pDlg
428     //CHINA001  = new SvxAreaTabDialog( pViewData->GetDialogParent(),
429 //CHINA001                              &aNewAttr,
430 //CHINA001                              pViewData->GetDocument()->GetDrawLayer(),
431 //CHINA001                              pView );
432 
433     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
434     DBG_ASSERT(pFact, "Dialogdiet Factory fail!");//CHINA001
435     AbstractSvxAreaTabDialog * pDlg = pFact->CreateSvxAreaTabDialog( pViewData->GetDialogParent(),
436                                                                     &aNewAttr,
437                                                             pViewData->GetDocument()->GetDrawLayer(),
438                                                             pView);
439     DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
440 
441     // #i74099# by default, the dialog deletes the current color table if a different one is loaded
442     // (see SwDrawShell::ExecDrawDlg)
443     const SvxColorTableItem* pColorItem =
444         static_cast<const SvxColorTableItem*>( pViewData->GetSfxDocShell()->GetItem(SID_COLOR_TABLE) );
445     if (pColorItem->GetColorTable() == XColorTable::GetStdColorTable())
446         pDlg->DontDeleteColorTable();
447 
448     if ( nTabPage != 0xffff )
449         pDlg->SetCurPageId( nTabPage );
450 
451     if ( pDlg->Execute() == RET_OK )
452     {
453         if( bHasMarked )
454             pView->SetAttrToMarked( *pDlg->GetOutputItemSet(), sal_False );
455         else
456             pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False );
457 
458         pView->InvalidateAttribs();
459         rReq.Done();
460     }
461 
462     delete pDlg;
463 }
464 
465 void ScDrawShell::ExecuteTextAttrDlg( SfxRequest& rReq, sal_uInt16 /* nTabPage */ )
466 {
467     ScDrawView* pView       = pViewData->GetScDrawView();
468     sal_Bool        bHasMarked  = pView->AreObjectsMarked();
469     SfxItemSet  aNewAttr    ( pView->GetDefaultAttr() );
470 
471     if( bHasMarked )
472         pView->MergeAttrFromMarked( aNewAttr, sal_False );
473 
474     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
475     SfxAbstractTabDialog *pDlg = pFact->CreateTextTabDialog( pViewData->GetDialogParent(), &aNewAttr, pView );
476 
477     sal_uInt16 nResult = pDlg->Execute();
478 
479     if ( RET_OK == nResult )
480     {
481         if ( bHasMarked )
482             pView->SetAttributes( *pDlg->GetOutputItemSet() );
483         else
484             pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False );
485 
486         pView->InvalidateAttribs();
487         rReq.Done();
488     }
489     delete( pDlg );
490 }
491 
492 #ifdef ISSUE66550_HLINK_FOR_SHAPES
493 void ScDrawShell::SetHlinkForObject( SdrObject* pObj, const rtl::OUString& rHlnk )
494 {
495     if ( pObj )
496     {
497         ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj, sal_True );
498         pInfo->SetHlink( rHlnk );
499         lcl_setModified( GetObjectShell() );
500     }
501 }
502 #endif
503 
504