| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sc.hxx" |
| |
| #include <svx/svxdlg.hxx> //CHINA001 |
| #include <svx/dialogs.hrc> //CHINA001 |
| |
| #include "scitems.hxx" |
| |
| #include <editeng/eeitem.hxx> |
| #include <svx/fontwork.hxx> |
| //#include <svx/labdlg.hxx> CHINA001 |
| #include <svl/srchitem.hxx> |
| #include <svx/tabarea.hxx> |
| #include <svx/tabline.hxx> |
| //CHINA001 #include <svx/transfrm.hxx> |
| #include <sfx2/app.hxx> |
| #include <sfx2/objface.hxx> |
| #include <sfx2/objsh.hxx> |
| #include <sfx2/request.hxx> |
| #include <sfx2/dispatch.hxx> |
| #include <svl/whiter.hxx> |
| #include <vcl/msgbox.hxx> |
| |
| #include "drawsh.hxx" |
| #include "drwlayer.hxx" |
| #include "sc.hrc" |
| #include "viewdata.hxx" |
| #include "document.hxx" |
| #include "docpool.hxx" |
| #include "drawview.hxx" |
| #include "scresid.hxx" |
| #include <svx/svdobj.hxx> |
| //add header of cui CHINA001 |
| #include <svx/svxdlg.hxx> |
| #include <svx/dialogs.hrc> |
| #include <svx/drawitem.hxx> |
| #include <svx/xtable.hxx> |
| #include "tabvwsh.hxx" |
| #include <sfx2/bindings.hxx> |
| |
| #define ScDrawShell |
| #include "scslots.hxx" |
| |
| #include "userdat.hxx" |
| #include <sfx2/objsh.hxx> |
| #include <svl/macitem.hxx> |
| #include <sfx2/evntconf.hxx> |
| #include <sfx2/viewsh.hxx> |
| #include <com/sun/star/util/XModifiable.hpp> |
| #include <com/sun/star/frame/XFrame.hpp> |
| |
| //------------------------------------------------------------------ |
| |
| TYPEINIT1( ScDrawShell, SfxShell ); |
| |
| SFX_IMPL_INTERFACE(ScDrawShell, SfxShell, ScResId(SCSTR_DRAWSHELL) ) |
| { |
| SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER, |
| ScResId(RID_DRAW_OBJECTBAR) ); |
| SFX_POPUPMENU_REGISTRATION( ScResId(RID_POPUP_DRAW) ); |
| SFX_CHILDWINDOW_REGISTRATION( SvxFontWorkChildWindow::GetChildWindowId() ); |
| } |
| |
| |
| // abschalten der nicht erwuenschten Acceleratoren: |
| |
| void ScDrawShell::StateDisableItems( SfxItemSet &rSet ) |
| { |
| SfxWhichIter aIter(rSet); |
| sal_uInt16 nWhich = aIter.FirstWhich(); |
| |
| while (nWhich) |
| { |
| rSet.DisableItem( nWhich ); |
| nWhich = aIter.NextWhich(); |
| } |
| } |
| |
| void lcl_setModified( SfxObjectShell* pShell ) |
| { |
| if ( pShell ) |
| { |
| com::sun::star::uno::Reference< com::sun::star::util::XModifiable > xModif( pShell->GetModel(), com::sun::star::uno::UNO_QUERY ); |
| if ( xModif.is() ) |
| xModif->setModified( sal_True ); |
| } |
| } |
| |
| void ScDrawShell::ExecDrawAttr( SfxRequest& rReq ) |
| { |
| sal_uInt16 nSlot = rReq.GetSlot(); |
| Window* pWin = pViewData->GetActiveWin(); |
| // SfxViewFrame* pViewFrame = SfxViewShell::Current()->GetViewFrame(); //!!! koennte knallen |
| ScDrawView* pView = pViewData->GetScDrawView(); |
| SdrModel* pDoc = pViewData->GetDocument()->GetDrawLayer(); |
| |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| sal_uLong nMarkCount = rMarkList.GetMarkCount(); |
| SdrObject* pSingleSelectedObj = NULL; |
| if ( nMarkCount > 0 ) |
| pSingleSelectedObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); |
| |
| switch ( nSlot ) |
| { |
| case SID_ASSIGNMACRO: |
| { |
| if ( pSingleSelectedObj ) |
| ExecuteMacroAssign( pSingleSelectedObj, pWin ); |
| } |
| break; |
| |
| case SID_TEXT_STANDARD: // Harte Textattributierung loeschen |
| { |
| SfxItemSet aEmptyAttr(GetPool(), EE_ITEMS_START, EE_ITEMS_END); |
| pView->SetAttributes(aEmptyAttr, sal_True); |
| } |
| break; |
| |
| case SID_ATTR_LINE_STYLE: |
| case SID_ATTR_LINEEND_STYLE: |
| case SID_ATTR_LINE_START: |
| case SID_ATTR_LINE_END: |
| case SID_ATTR_LINE_DASH: |
| case SID_ATTR_LINE_WIDTH: |
| case SID_ATTR_LINE_COLOR: |
| case SID_ATTR_LINE_TRANSPARENCE: |
| case SID_ATTR_LINE_JOINT: |
| case SID_ATTR_LINE_CAP: |
| case SID_ATTR_FILL_STYLE: |
| case SID_ATTR_FILL_COLOR: |
| case SID_ATTR_FILL_GRADIENT: |
| case SID_ATTR_FILL_HATCH: |
| case SID_ATTR_FILL_BITMAP: |
| case SID_ATTR_FILL_TRANSPARENCE: |
| case SID_ATTR_FILL_FLOATTRANSPARENCE: |
| |
| // #i25616# |
| case SID_ATTR_FILL_SHADOW: |
| { |
| // Wenn ToolBar vertikal : |
| if ( !rReq.GetArgs() ) |
| { |
| switch ( nSlot ) |
| { |
| case SID_ATTR_LINE_STYLE: |
| case SID_ATTR_LINE_DASH: |
| case SID_ATTR_LINE_WIDTH: |
| case SID_ATTR_LINE_COLOR: |
| case SID_ATTR_LINE_TRANSPARENCE: |
| case SID_ATTR_LINE_JOINT: |
| case SID_ATTR_LINE_CAP: |
| ExecuteLineDlg( rReq ); |
| break; |
| |
| case SID_ATTR_FILL_STYLE: |
| case SID_ATTR_FILL_COLOR: |
| case SID_ATTR_FILL_GRADIENT: |
| case SID_ATTR_FILL_HATCH: |
| case SID_ATTR_FILL_BITMAP: |
| case SID_ATTR_FILL_TRANSPARENCE: |
| case SID_ATTR_FILL_FLOATTRANSPARENCE: |
| |
| // #i25616# |
| case SID_ATTR_FILL_SHADOW: |
| |
| ExecuteAreaDlg( rReq ); |
| break; |
| |
| default: |
| break; |
| } |
| |
| //===== |
| return; |
| //===== |
| } |
| |
| if( pView->AreObjectsMarked() ) |
| pView->SetAttrToMarked( *rReq.GetArgs(), sal_False ); |
| else |
| pView->SetDefaultAttr( *rReq.GetArgs(), sal_False); |
| pView->InvalidateAttribs(); |
| } |
| break; |
| |
| case SID_ATTRIBUTES_LINE: |
| ExecuteLineDlg( rReq ); |
| break; |
| |
| case SID_ATTRIBUTES_AREA: |
| ExecuteAreaDlg( rReq ); |
| break; |
| |
| case SID_DRAWTEXT_ATTR_DLG: |
| ExecuteTextAttrDlg( rReq ); |
| break; |
| |
| #ifdef ISSUE66550_HLINK_FOR_SHAPES |
| case SID_DRAW_HLINK_EDIT: |
| if ( pSingleSelectedObj ) |
| pViewData->GetDispatcher().Execute( SID_HYPERLINK_DIALOG ); |
| break; |
| |
| case SID_DRAW_HLINK_DELETE: |
| if ( pSingleSelectedObj ) |
| SetHlinkForObject( pSingleSelectedObj, rtl::OUString() ); |
| break; |
| |
| case SID_OPEN_HYPERLINK: |
| if ( nMarkCount == 1 ) |
| { |
| SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); |
| if ( pObj->IsGroupObject() ) |
| { |
| SdrPageView* pPV = 0; |
| SdrObject* pHit = 0; |
| if ( pView->PickObj( pWin->PixelToLogic( pViewData->GetMousePosPixel() ), pView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) ) |
| pObj = pHit; |
| } |
| |
| ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj ); |
| if ( pInfo && (pInfo->GetHlink().getLength() > 0) ) |
| ScGlobal::OpenURL( pInfo->GetHlink(), String::EmptyString() ); |
| } |
| break; |
| #endif |
| |
| case SID_ATTR_TRANSFORM: |
| { |
| { |
| if ( pView->AreObjectsMarked() ) |
| { |
| const SfxItemSet* pArgs = rReq.GetArgs(); |
| |
| if( !pArgs ) |
| { |
| // const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| if( rMarkList.GetMark(0) != 0 ) |
| { |
| SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); |
| if( pObj->GetObjIdentifier() == OBJ_CAPTION ) |
| { |
| // --------- Itemset fuer Caption -------- |
| SfxItemSet aNewAttr(pDoc->GetItemPool()); |
| pView->GetAttributes(aNewAttr); |
| // --------- Itemset fuer Groesse und Position -------- |
| SfxItemSet aNewGeoAttr(pView->GetGeoAttrFromMarked()); |
| |
| //SvxCaptionTabDialog* pDlg = new SvxCaptionTabDialog(pWin, pView); |
| //change for cui CHINA001 |
| SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); |
| if ( pFact ) |
| { |
| SfxAbstractTabDialog *pDlg = pFact->CreateCaptionDialog( pWin, pView ); |
| |
| const sal_uInt16* pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() ); |
| SfxItemSet aCombSet( *aNewAttr.GetPool(), pRange ); |
| aCombSet.Put( aNewAttr ); |
| aCombSet.Put( aNewGeoAttr ); |
| pDlg->SetInputSet( &aCombSet ); |
| |
| if (pDlg->Execute() == RET_OK) |
| { |
| rReq.Done(*(pDlg->GetOutputItemSet())); |
| pView->SetAttributes(*pDlg->GetOutputItemSet()); |
| pView->SetGeoAttrToMarked(*pDlg->GetOutputItemSet()); |
| } |
| |
| delete pDlg; |
| }// change for cui |
| } |
| else |
| { |
| SfxItemSet aNewAttr(pView->GetGeoAttrFromMarked()); |
| //CHINA001 SvxTransformTabDialog* pDlg = new SvxTransformTabDialog(pWin, &aNewAttr, pView); |
| SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); |
| if(pFact) |
| { |
| SfxAbstractTabDialog* pDlg = pFact->CreateSvxTransformTabDialog( pWin, &aNewAttr,pView ); |
| DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 |
| if (pDlg->Execute() == RET_OK) |
| { |
| rReq.Done(*(pDlg->GetOutputItemSet())); |
| pView->SetGeoAttrToMarked(*pDlg->GetOutputItemSet()); |
| } |
| delete pDlg; |
| } |
| } |
| } |
| |
| |
| } |
| else |
| pView->SetGeoAttrToMarked( *pArgs ); |
| } |
| } |
| |
| ScTabViewShell* pViewShell = pViewData->GetViewShell(); |
| SfxBindings& rBindings=pViewShell->GetViewFrame()->GetBindings(); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_WIDTH); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_HEIGHT); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_X); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_Y); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_ANGLE); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_ROT_X); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_ROT_Y); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_AUTOWIDTH); |
| rBindings.Invalidate(SID_ATTR_TRANSFORM_AUTOHEIGHT); |
| break; |
| } |
| |
| default: |
| break; |
| } |
| } |
| |
| void ScDrawShell::ExecuteMacroAssign( SdrObject* pObj, Window* pWin ) |
| { |
| SvxMacroItem aItem ( SFX_APP()->GetPool().GetWhich( SID_ATTR_MACROITEM ) ); |
| ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj, sal_True ); |
| if ( pInfo->GetMacro().getLength() > 0 ) |
| { |
| SvxMacroTableDtor aTab; |
| String sMacro( pInfo->GetMacro() ); |
| aTab.Insert( SFX_EVENT_MOUSECLICK_OBJECT, new SvxMacro( sMacro, String() ) ); |
| aItem.SetMacroTable( aTab ); |
| } |
| |
| // create empty itemset for macro-dlg |
| SfxItemSet* pItemSet = new SfxItemSet(SFX_APP()->GetPool(), SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 ); |
| pItemSet->Put ( aItem, SID_ATTR_MACROITEM ); |
| |
| SfxEventNamesItem aNamesItem(SID_EVENTCONFIG); |
| aNamesItem.AddEvent( ScResId(RID_SCSTR_ONCLICK), String(), SFX_EVENT_MOUSECLICK_OBJECT ); |
| pItemSet->Put( aNamesItem, SID_EVENTCONFIG ); |
| |
| com::sun::star::uno::Reference < com::sun::star::frame::XFrame > xFrame; |
| if (GetViewShell()) |
| xFrame = GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface(); |
| |
| SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); |
| SfxAbstractDialog* pMacroDlg = pFact->CreateSfxDialog( pWin, *pItemSet, xFrame, SID_EVENTCONFIG ); |
| if ( pMacroDlg && pMacroDlg->Execute() == RET_OK ) |
| { |
| const SfxItemSet* pOutSet = pMacroDlg->GetOutputItemSet(); |
| const SfxPoolItem* pItem; |
| if( SFX_ITEM_SET == pOutSet->GetItemState( SID_ATTR_MACROITEM, sal_False, &pItem )) |
| { |
| rtl::OUString sMacro; |
| SvxMacro* pMacro = ((SvxMacroItem*)pItem)->GetMacroTable().Get( SFX_EVENT_MOUSECLICK_OBJECT ); |
| if ( pMacro ) |
| sMacro = pMacro->GetMacName(); |
| |
| if ( pObj->IsGroupObject() ) |
| { |
| SdrObjList* pOL = pObj->GetSubList(); |
| sal_uLong nObj = pOL->GetObjCount(); |
| for ( sal_uLong index=0; index<nObj; ++index ) |
| { |
| pInfo = ScDrawLayer::GetMacroInfo( pOL->GetObj(index), sal_True ); |
| pInfo->SetMacro( sMacro ); |
| } |
| } |
| else |
| pInfo->SetMacro( sMacro ); |
| lcl_setModified( GetObjectShell() ); |
| } |
| } |
| |
| delete pMacroDlg; |
| delete pItemSet; |
| } |
| |
| void ScDrawShell::ExecuteLineDlg( SfxRequest& rReq, sal_uInt16 nTabPage ) |
| { |
| ScDrawView* pView = pViewData->GetScDrawView(); |
| sal_Bool bHasMarked = pView->AreObjectsMarked(); |
| const SdrObject* pObj = NULL; |
| const SdrMarkList& rMarkList = pView->GetMarkedObjectList(); |
| |
| if( rMarkList.GetMarkCount() == 1 ) |
| pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); |
| |
| SfxItemSet aNewAttr( pView->GetDefaultAttr() ); |
| if( bHasMarked ) |
| pView->MergeAttrFromMarked( aNewAttr, sal_False ); |
| |
| //CHINA001 SvxLineTabDialog* pDlg |
| //CHINA001 = new SvxLineTabDialog( pViewData->GetDialogParent(), |
| //CHINA001 &aNewAttr, |
| //CHINA001 pViewData->GetDocument()->GetDrawLayer(), |
| //CHINA001 pObj, |
| //CHINA001 bHasMarked ); |
| SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "Dialogdiet Factory fail!");//CHINA001 |
| SfxAbstractTabDialog * pDlg = pFact->CreateSvxLineTabDialog( pViewData->GetDialogParent(), |
| &aNewAttr, |
| pViewData->GetDocument()->GetDrawLayer(), |
| pObj, |
| bHasMarked); |
| DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 |
| if ( nTabPage != 0xffff ) |
| pDlg->SetCurPageId( nTabPage ); |
| |
| if ( pDlg->Execute() == RET_OK ) |
| { |
| if( bHasMarked ) |
| pView->SetAttrToMarked( *pDlg->GetOutputItemSet(), sal_False ); |
| else |
| pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False ); |
| |
| pView->InvalidateAttribs(); |
| rReq.Done(); |
| } |
| |
| delete pDlg; |
| } |
| |
| void ScDrawShell::ExecuteAreaDlg( SfxRequest& rReq, sal_uInt16 nTabPage ) |
| { |
| ScDrawView* pView = pViewData->GetScDrawView(); |
| sal_Bool bHasMarked = pView->AreObjectsMarked(); |
| |
| SfxItemSet aNewAttr( pView->GetDefaultAttr() ); |
| if( bHasMarked ) |
| pView->MergeAttrFromMarked( aNewAttr, sal_False ); |
| |
| //CHINA001 SvxAreaTabDialog* pDlg |
| //CHINA001 = new SvxAreaTabDialog( pViewData->GetDialogParent(), |
| //CHINA001 &aNewAttr, |
| //CHINA001 pViewData->GetDocument()->GetDrawLayer(), |
| //CHINA001 pView ); |
| |
| SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "Dialogdiet Factory fail!");//CHINA001 |
| AbstractSvxAreaTabDialog * pDlg = pFact->CreateSvxAreaTabDialog( pViewData->GetDialogParent(), |
| &aNewAttr, |
| pViewData->GetDocument()->GetDrawLayer(), |
| pView); |
| DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 |
| |
| // #i74099# by default, the dialog deletes the current color table if a different one is loaded |
| // (see SwDrawShell::ExecDrawDlg) |
| // const SvxColorTableItem* pColorItem = static_cast<const SvxColorTableItem*>( pViewData->GetSfxDocShell()->GetItem(SID_COLOR_TABLE) ); |
| |
| if ( nTabPage != 0xffff ) |
| pDlg->SetCurPageId( nTabPage ); |
| |
| if ( pDlg->Execute() == RET_OK ) |
| { |
| if( bHasMarked ) |
| pView->SetAttrToMarked( *pDlg->GetOutputItemSet(), sal_False ); |
| else |
| pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False ); |
| |
| pView->InvalidateAttribs(); |
| rReq.Done(); |
| } |
| |
| delete pDlg; |
| } |
| |
| void ScDrawShell::ExecuteTextAttrDlg( SfxRequest& rReq, sal_uInt16 /* nTabPage */ ) |
| { |
| ScDrawView* pView = pViewData->GetScDrawView(); |
| sal_Bool bHasMarked = pView->AreObjectsMarked(); |
| SfxItemSet aNewAttr ( pView->GetDefaultAttr() ); |
| |
| if( bHasMarked ) |
| pView->MergeAttrFromMarked( aNewAttr, sal_False ); |
| |
| SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); |
| SfxAbstractTabDialog *pDlg = pFact->CreateTextTabDialog( pViewData->GetDialogParent(), &aNewAttr, pView ); |
| |
| sal_uInt16 nResult = pDlg->Execute(); |
| |
| if ( RET_OK == nResult ) |
| { |
| if ( bHasMarked ) |
| pView->SetAttributes( *pDlg->GetOutputItemSet() ); |
| else |
| pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False ); |
| |
| pView->InvalidateAttribs(); |
| rReq.Done(); |
| } |
| delete( pDlg ); |
| } |
| |
| #ifdef ISSUE66550_HLINK_FOR_SHAPES |
| void ScDrawShell::SetHlinkForObject( SdrObject* pObj, const rtl::OUString& rHlnk ) |
| { |
| if ( pObj ) |
| { |
| ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj, sal_True ); |
| pInfo->SetHlink( rHlnk ); |
| lcl_setModified( GetObjectShell() ); |
| } |
| } |
| #endif |
| |