/************************************************************** * * 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 #include #include //------------------------------------------------------------------------ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // BM/IHA -- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; // BM/IHA -- // erAck #include "chart2uno.hxx" // erAck #include "fuinsert.hxx" #include "tabvwsh.hxx" #include "sc.hrc" #include "chartarr.hxx" #include "docsh.hxx" #include "document.hxx" #include "undotab.hxx" #include "chartlis.hxx" #include "uiitems.hxx" #include "globstr.hrc" #include "drawview.hxx" //------------------------------------------------------------------------ #define IS_AVAILABLE(WhichId,ppItem) \ (pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET) void lcl_ChartInit( const uno::Reference < embed::XEmbeddedObject >& xObj, ScViewData* pViewData, const rtl::OUString& rRangeParam ) { ScDocShell* pDocShell = pViewData->GetDocShell(); ScDocument* pScDoc = pDocShell->GetDocument(); rtl::OUString aRangeString( rRangeParam ); if ( !aRangeString.getLength() ) { SCCOL nCol1 = 0; SCROW nRow1 = 0; SCTAB nTab1 = 0; SCCOL nCol2 = 0; SCROW nRow2 = 0; SCTAB nTab2 = 0; ScMarkData& rMark = pViewData->GetMarkData(); if ( !rMark.IsMarked() ) pViewData->GetView()->MarkDataArea( sal_True ); if ( pViewData->GetSimpleArea( nCol1,nRow1,nTab1, nCol2,nRow2,nTab2 ) == SC_MARK_SIMPLE ) { PutInOrder( nCol1, nCol2 ); PutInOrder( nRow1, nRow2 ); if ( nCol2>nCol1 || nRow2>nRow1 ) { ScDocument* pDoc = pViewData->GetDocument(); pDoc->LimitChartArea( nTab1, nCol1,nRow1, nCol2,nRow2 ); String aStr; ScRange aRange( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); aRange.Format( aStr, SCR_ABS_3D, pScDoc ); aRangeString = aStr; } } } if ( aRangeString.getLength() ) { // connect to Calc data (if no range string, leave chart alone, with its own data) uno::Reference< ::com::sun::star::chart2::data::XDataReceiver > xReceiver; uno::Reference< embed::XComponentSupplier > xCompSupp( xObj, uno::UNO_QUERY ); if( xCompSupp.is()) xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY ); OSL_ASSERT( xReceiver.is()); if( xReceiver.is() ) { uno::Reference< chart2::data::XDataProvider > xDataProvider = new ScChart2DataProvider( pScDoc ); xReceiver->attachDataProvider( xDataProvider ); uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( pDocShell->GetModel(), uno::UNO_QUERY ); xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier ); // Same behavior as with old chart: Always assume data series in columns chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS; bool bHasCategories = false; bool bFirstCellAsLabel = false; // use ScChartPositioner to auto-detect column/row headers (like ScChartArray in old version) ScRangeListRef aRangeListRef( new ScRangeList ); aRangeListRef->Parse( aRangeString, pScDoc ); if ( aRangeListRef->Count() ) { pScDoc->LimitChartIfAll( aRangeListRef ); // limit whole columns/rows to used area // update string from modified ranges. The ranges must be in the current formula syntax. String aTmpStr; aRangeListRef->Format( aTmpStr, SCR_ABS_3D, pScDoc, pScDoc->GetAddressConvention() ); aRangeString = aTmpStr; ScChartPositioner aChartPositioner( pScDoc, aRangeListRef ); const ScChartPositionMap* pPositionMap( aChartPositioner.GetPositionMap() ); if( pPositionMap ) { SCSIZE nRowCount = pPositionMap->GetRowCount(); if( 1==nRowCount ) eDataRowSource = chart::ChartDataRowSource_ROWS; } if ( eDataRowSource == chart::ChartDataRowSource_COLUMNS ) { bHasCategories = aChartPositioner.HasRowHeaders(); bFirstCellAsLabel = aChartPositioner.HasColHeaders(); } else // in case the default is changed { bHasCategories = aChartPositioner.HasColHeaders(); bFirstCellAsLabel = aChartPositioner.HasRowHeaders(); } } uno::Sequence< beans::PropertyValue > aArgs( 4 ); aArgs[0] = beans::PropertyValue( ::rtl::OUString::createFromAscii("CellRangeRepresentation"), -1, uno::makeAny( aRangeString ), beans::PropertyState_DIRECT_VALUE ); aArgs[1] = beans::PropertyValue( ::rtl::OUString::createFromAscii("HasCategories"), -1, uno::makeAny( bHasCategories ), beans::PropertyState_DIRECT_VALUE ); aArgs[2] = beans::PropertyValue( ::rtl::OUString::createFromAscii("FirstCellAsLabel"), -1, uno::makeAny( bFirstCellAsLabel ), beans::PropertyState_DIRECT_VALUE ); aArgs[3] = beans::PropertyValue( ::rtl::OUString::createFromAscii("DataRowSource"), -1, uno::makeAny( eDataRowSource ), beans::PropertyState_DIRECT_VALUE ); xReceiver->setArguments( aArgs ); // don't create chart listener here (range may be modified in chart dialog) } } } /************************************************************************* |* |* FuInsertOLE::Konstruktor |* \************************************************************************/ FuInsertOLE::FuInsertOLE(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP, SdrModel* pDoc, SfxRequest& rReq) : FuPoor(pViewSh, pWin, pViewP, pDoc, rReq) { if( ! rReq.IsAPI() ) rReq.Done(); //! hier DLL's initialisieren, damit die Factories existieren? uno::Reference < embed::XEmbeddedObject > xObj; uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage(); sal_Bool bIsFromFile = sal_False; ::rtl::OUString aName; sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT; ::rtl::OUString aIconMediaType; uno::Reference< io::XInputStream > xIconMetaFile; sal_uInt16 nSlot = rReq.GetSlot(); SFX_REQUEST_ARG( rReq, pNameItem, SfxGlobalNameItem, SID_INSERT_OBJECT, sal_False ); if ( nSlot == SID_INSERT_OBJECT && pNameItem ) { SvGlobalName aClassName = pNameItem->GetValue(); xObj = pViewShell->GetViewFrame()->GetObjectShell()->GetEmbeddedObjectContainer().CreateEmbeddedObject( aClassName.GetByteSequence(), aName ); } else if ( nSlot == SID_INSERT_SMATH ) { if ( SvtModuleOptions().IsMath() ) { nSlot = SID_INSERT_OBJECT; xObj = pViewShell->GetViewFrame()->GetObjectShell()->GetEmbeddedObjectContainer().CreateEmbeddedObject( SvGlobalName( SO3_SM_CLASSID_60 ).GetByteSequence(), aName ); rReq.AppendItem( SfxGlobalNameItem( SID_INSERT_OBJECT, SvGlobalName( SO3_SM_CLASSID_60 ) ) ); } } else { SvObjectServerList aServerLst; switch ( nSlot ) { case SID_INSERT_OBJECT : aServerLst.FillInsertObjects(); aServerLst.Remove( ScDocShell::Factory().GetClassId() ); // Starcalc nicht anzeigen //TODO/LATER: currently no inserting of ClassId into SfxRequest! case SID_INSERT_PLUGIN : case SID_INSERT_FLOATINGFRAME : { SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); SfxAbstractInsertObjectDialog* pDlg = pFact->CreateInsertObjectDialog( pViewShell->GetWindow(), SC_MOD()->GetSlotPool()->GetSlot(nSlot)->GetCommandString(), xStorage, &aServerLst ); if ( pDlg ) { pDlg->Execute(); xObj = pDlg->GetObject(); xIconMetaFile = pDlg->GetIconIfIconified( &aIconMediaType ); if ( xIconMetaFile.is() ) nAspect = embed::Aspects::MSOLE_ICON; if ( xObj.is() ) pViewSh->GetObjectShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aName ); // damit DrawShell eingeschaltet wird (Objekt aktivieren ist unnoetig): bIsFromFile = !pDlg->IsCreateNew(); DELETEZ( pDlg ); } break; } case SID_INSERT_SOUND : case SID_INSERT_VIDEO : { // create special filedialog for plugins SvxPluginFileDlg aPluginFileDialog(pWin, nSlot); // open filedlg if ( ERRCODE_NONE == aPluginFileDialog.Execute() ) { // get URL INetURLObject aURL; aURL.SetSmartProtocol( INET_PROT_FILE ); if ( aURL.SetURL( aPluginFileDialog.GetPath() ) ) { // create a plugin object ::rtl::OUString aObjName; SvGlobalName aClassId( SO3_PLUGIN_CLASSID ); comphelper::EmbeddedObjectContainer aCnt( xStorage ); xObj = aCnt.CreateEmbeddedObject( aClassId.GetByteSequence(), aObjName ); if ( xObj.is() && svt::EmbeddedObjectRef::TryRunningState( xObj ) ) { // set properties from dialog uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY ); if ( xSet.is() ) { xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginURL"), uno::makeAny( ::rtl::OUString( aURL.GetMainURL( INetURLObject::NO_DECODE ) ) ) ); } } } else { DBG_ERROR("Invalid URL!"); //! error message //! can this happen??? } } } } } // SvInsertObjectDialog (alles in einem Dialog) wird nicht mehr benutzt if (xObj.is()) { pView->UnmarkAll(); try { ::svt::EmbeddedObjectRef aObjRef( xObj, nAspect ); Size aSize; MapMode aMap100( MAP_100TH_MM ); MapUnit aMapUnit = MAP_100TH_MM; if ( nAspect == embed::Aspects::MSOLE_ICON ) { aObjRef.SetGraphicStream( xIconMetaFile, aIconMediaType ); aSize = aObjRef.GetSize( &aMap100 ); } else { awt::Size aSz; try { aSz = xObj->getVisualAreaSize( nAspect ); } catch( embed::NoVisualAreaSizeException& ) { // the default size will be set later } aSize = Size( aSz.Width, aSz.Height ); aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ); if (aSize.Height() == 0 || aSize.Width() == 0) { // Rechteck mit ausgewogenem Kantenverhaeltnis aSize.Width() = 5000; aSize.Height() = 5000; Size aTmp = OutputDevice::LogicToLogic( aSize, MAP_100TH_MM, aMapUnit ); aSz.Width = aTmp.Width(); aSz.Height = aTmp.Height(); xObj->setVisualAreaSize( nAspect, aSz ); // re-convert aSize to 1/100th mm to avoid rounding errors in comparison below aSize = Window::LogicToLogic( aTmp, MapMode( aMapUnit ), aMap100 ); } else aSize = Window::LogicToLogic( aSize, MapMode( aMapUnit ), aMap100 ); } // Chart initialisieren ? if ( SvtModuleOptions().IsChart() && SotExchange::IsChart( SvGlobalName( xObj->getClassID() ) ) ) lcl_ChartInit( xObj, pViewSh->GetViewData(), rtl::OUString() ); ScViewData* pData = pViewSh->GetViewData(); Point aPnt = pViewSh->GetInsertPos(); if ( pData->GetDocument()->IsNegativePage( pData->GetTabNo() ) ) aPnt.X() -= aSize.Width(); // move position to left edge Rectangle aRect (aPnt, aSize); SdrOle2Obj* pObj = new SdrOle2Obj( aObjRef, aName, aRect); SdrPageView* pPV = pView->GetSdrPageView(); pView->InsertObjectAtView(pObj, *pPV); if ( nAspect != embed::Aspects::MSOLE_ICON ) { // #73279# Math objects change their object size during InsertObject. // New size must be set in SdrObject, or a wrong scale will be set at // ActivateObject. try { awt::Size aSz = xObj->getVisualAreaSize( nAspect ); Size aNewSize( aSz.Width, aSz.Height ); aNewSize = OutputDevice::LogicToLogic( aNewSize, aMapUnit, MAP_100TH_MM ); if ( aNewSize != aSize ) { aRect.SetSize( aNewSize ); pObj->SetLogicRect( aRect ); } } catch( embed::NoVisualAreaSizeException& ) {} } if ( !rReq.IsAPI() ) { // XXX Activate aus Makro ist toedlich !!! ??? if (bIsFromFile) { // #45012# Objekt ist selektiert, also Draw-Shell aktivieren pViewShell->SetDrawShell( sal_True ); } else { pViewShell->ActivateObject( (SdrOle2Obj*) pObj, SVVERB_SHOW ); } } rReq.Done(); } catch( uno::Exception& ) { OSL_ASSERT( "May need error handling here!\n" ); } } else rReq.Ignore(); } /************************************************************************* |* |* FuInsertOLE::Destruktor |* \************************************************************************/ FuInsertOLE::~FuInsertOLE() { } /************************************************************************* |* |* FuInsertOLE::Function aktivieren |* \************************************************************************/ void FuInsertOLE::Activate() { FuPoor::Activate(); } /************************************************************************* |* |* FuInsertOLE::Function deaktivieren |* \************************************************************************/ void FuInsertOLE::Deactivate() { FuPoor::Deactivate(); } /************************************************************************* |* |* FuInsertChart::Konstruktor |* \************************************************************************/ FuInsertChart::FuInsertChart(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* pViewP, SdrModel* pDoc, SfxRequest& rReq) : FuPoor(pViewSh, pWin, pViewP, pDoc, rReq) { const SfxItemSet* pReqArgs = rReq.GetArgs(); if( ! rReq.IsAPI() ) rReq.Done(); if( SvtModuleOptions().IsChart() ) { // ---------------------------------------- // BM/IHA -- // get range ::rtl::OUString aRangeString; ScRange aPositionRange; // cell range for chart positioning if( pReqArgs ) { const SfxPoolItem* pItem; if( IS_AVAILABLE( FN_PARAM_5, &pItem ) ) aRangeString = ::rtl::OUString( ((const SfxStringItem*)pItem)->GetValue()); aPositionRange = pViewSh->GetViewData()->GetCurPos(); } else { ScMarkData& rMark = pViewSh->GetViewData()->GetMarkData(); bool bAutomaticMark = false; if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) { pViewSh->GetViewData()->GetView()->MarkDataArea( sal_True ); bAutomaticMark = true; } ScMarkData aMultiMark( rMark ); aMultiMark.MarkToMulti(); ScRangeList aRanges; aMultiMark.FillRangeListWithMarks( &aRanges, sal_False ); String aStr; ScDocument* pDocument = pViewSh->GetViewData()->GetDocument(); aRanges.Format( aStr, SCR_ABS_3D, pDocument, pDocument->GetAddressConvention() ); aRangeString = aStr; // get "total" range for positioning sal_uLong nCount = aRanges.Count(); if ( nCount > 0 ) { aPositionRange = *aRanges.GetObject(0); for (sal_uLong i=1; iGetViewData()->GetView()->Unmark(); } // ---------------------------------------- // adapted old code pView->UnmarkAll(); ::rtl::OUString aName; const sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT; uno::Reference < embed::XEmbeddedObject > xObj = pViewShell->GetObjectShell()->GetEmbeddedObjectContainer().CreateEmbeddedObject( SvGlobalName( SO3_SCH_CLASSID_60 ).GetByteSequence(), aName ); uno::Reference< ::com::sun::star::chart2::data::XDataReceiver > xReceiver; uno::Reference< embed::XComponentSupplier > xCompSupp( xObj, uno::UNO_QUERY ); if( xCompSupp.is()) xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY ); // lock the model to suppress any internal updates uno::Reference< frame::XModel > xChartModel( xReceiver, uno::UNO_QUERY ); if( xChartModel.is() ) xChartModel->lockControllers(); ScRangeListRef aDummy; Rectangle aMarkDest; SCTAB nMarkTab; sal_Bool bDrawRect = pViewShell->GetChartArea( aDummy, aMarkDest, nMarkTab ); // Objekt-Groesse awt::Size aSz = xObj->getVisualAreaSize( nAspect ); Size aSize( aSz.Width, aSz.Height ); MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ); sal_Bool bSizeCh = sal_False; if (bDrawRect && !aMarkDest.IsEmpty()) { aSize = aMarkDest.GetSize(); bSizeCh = sal_True; } if (aSize.Height() <= 0 || aSize.Width() <= 0) { aSize.Width() = 5000; aSize.Height() = 5000; bSizeCh = sal_True; } if (bSizeCh) { aSize = Window::LogicToLogic( aSize, MapMode( MAP_100TH_MM ), MapMode( aMapUnit ) ); aSz.Width = aSize.Width(); aSz.Height = aSize.Height(); xObj->setVisualAreaSize( nAspect, aSz ); } ScViewData* pData = pViewSh->GetViewData(); ScDocShell* pScDocSh = pData->GetDocShell(); ScDocument* pScDoc = pScDocSh->GetDocument(); sal_Bool bUndo (pScDoc->IsUndoEnabled()); if( pReqArgs ) { const SfxPoolItem* pItem; sal_uInt16 nToTable = 0; if( IS_AVAILABLE( FN_PARAM_4, &pItem ) ) { if ( pItem->ISA( SfxUInt16Item ) ) nToTable = ((const SfxUInt16Item*)pItem)->GetValue(); else if ( pItem->ISA( SfxBoolItem ) ) { // #46033# in der idl fuer Basic steht FN_PARAM_4 als SfxBoolItem // -> wenn gesetzt, neue Tabelle, sonst aktuelle Tabelle if ( ((const SfxBoolItem*)pItem)->GetValue() ) nToTable = static_cast(pScDoc->GetTableCount()); else nToTable = static_cast(pData->GetTabNo()); } } else { if (bDrawRect) nToTable = static_cast(nMarkTab); rReq.AppendItem( SfxUInt16Item( FN_PARAM_4, nToTable ) ); } // auf neue Tabelle ausgeben? if ( nToTable == pScDoc->GetTableCount() ) { // dann los... String aTabName; SCTAB nNewTab = pScDoc->GetTableCount(); pScDoc->CreateValidTabName( aTabName ); if ( pScDoc->InsertTab( nNewTab, aTabName ) ) { sal_Bool bAppend = sal_True; if (bUndo) { pScDocSh->GetUndoManager()->AddUndoAction( new ScUndoInsertTab( pScDocSh, nNewTab, bAppend, aTabName ) ); } pScDocSh->Broadcast( ScTablesHint( SC_TAB_INSERTED, nNewTab ) ); pViewSh->SetTabNo( nNewTab, sal_True ); pScDocSh->PostPaintExtras(); //! erst hinterher ??? } else { DBG_ERROR( "Could not create new table :-/" ); } } else if ( nToTable != pData->GetTabNo() ) { pViewSh->SetTabNo( nToTable, sal_True ); } } lcl_ChartInit( xObj, pData, aRangeString ); // set source range, auto-detect column/row headers // Objekt-Position Point aStart; if ( bDrawRect ) aStart = aMarkDest.TopLeft(); // marked by hand else { // get chart position (from window size and data range) aStart = pViewSh->GetChartInsertPos( aSize, aPositionRange ); } Rectangle aRect (aStart, aSize); SdrOle2Obj* pObj = new SdrOle2Obj( svt::EmbeddedObjectRef( xObj, nAspect ), aName, aRect); SdrPageView* pPV = pView->GetSdrPageView(); // #121334# This call will change the chart's default background fill from white to transparent. // Add here again if this is wanted (see task description for details) // ChartHelper::AdaptDefaultsForChart( xObj ); // pView->InsertObjectAtView(pObj, *pPV);//this call leads to an immidiate redraw and asks the chart for a visual representation // use the page instead of the view to insert, so no undo action is created yet SdrPage* pInsPage = pPV->GetPage(); pInsPage->InsertObject( pObj ); pView->UnmarkAllObj(); pView->MarkObj( pObj, pPV ); bool bAddUndo = true; // add undo action later, unless the dialog is canceled if (rReq.IsAPI()) { if( xChartModel.is() ) xChartModel->unlockControllers(); } else { //the controller will be unlocked by the dialog when the dialog is told to do so // only activate object if not called via API (e.g. macro) pViewShell->ActivateObject( (SdrOle2Obj*) pObj, SVVERB_SHOW ); //open wizard //@todo get context from calc if that has one uno::Reference< uno::XComponentContext > xContext( ::cppu::defaultBootstrap_InitialComponentContext() ); if(xContext.is()) { uno::Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() ); if(xMCF.is()) { uno::Reference< ui::dialogs::XExecutableDialog > xDialog( xMCF->createInstanceWithContext( rtl::OUString::createFromAscii("com.sun.star.comp.chart2.WizardDialog") , xContext), uno::UNO_QUERY); uno::Reference< lang::XInitialization > xInit( xDialog, uno::UNO_QUERY ); if( xChartModel.is() && xInit.is() ) { uno::Reference< awt::XWindow > xDialogParentWindow(0); // initialize dialog uno::Sequence aSeq(2); uno::Any* pArray = aSeq.getArray(); beans::PropertyValue aParam1; aParam1.Name = rtl::OUString::createFromAscii("ParentWindow"); aParam1.Value <<= uno::makeAny(xDialogParentWindow); beans::PropertyValue aParam2; aParam2.Name = rtl::OUString::createFromAscii("ChartModel"); aParam2.Value <<= uno::makeAny(xChartModel); pArray[0] <<= uno::makeAny(aParam1); pArray[1] <<= uno::makeAny(aParam2); xInit->initialize( aSeq ); // try to set the dialog's position so it doesn't hide the chart uno::Reference < beans::XPropertySet > xDialogProps( xDialog, uno::UNO_QUERY ); if ( xDialogProps.is() ) { try { //get dialog size: awt::Size aDialogAWTSize; if( xDialogProps->getPropertyValue( ::rtl::OUString::createFromAscii("Size") ) >>= aDialogAWTSize ) { Size aDialogSize( aDialogAWTSize.Width, aDialogAWTSize.Height ); if ( aDialogSize.Width() > 0 && aDialogSize.Height() > 0 ) { //calculate and set new position Point aDialogPos = pViewShell->GetChartDialogPos( aDialogSize, aRect ); xDialogProps->setPropertyValue( ::rtl::OUString::createFromAscii("Position"), uno::makeAny( awt::Point(aDialogPos.getX(),aDialogPos.getY()) ) ); } } //tell the dialog to unlock controller xDialogProps->setPropertyValue( ::rtl::OUString::createFromAscii("UnlockControllersOnExecute"), uno::makeAny( sal_True ) ); } catch( uno::Exception& ) { OSL_ASSERT( "Chart wizard couldn't be positioned automatically\n" ); } } sal_Int16 nDialogRet = xDialog->execute(); if( nDialogRet == ui::dialogs::ExecutableDialogResults::CANCEL ) { // leave OLE inplace mode and unmark OSL_ASSERT( pViewShell ); OSL_ASSERT( pView ); pViewShell->DeactivateOle(); pView->UnmarkAll(); // old page view pointer is invalid after switching sheets pPV = pView->GetSdrPageView(); // remove the chart OSL_ASSERT( pPV ); SdrPage * pPage( pPV->GetPage()); OSL_ASSERT( pPage ); OSL_ASSERT( pObj ); if( pPage ) pPage->RemoveObject( pObj->GetOrdNum()); bAddUndo = false; // don't create the undo action for inserting // leave the draw shell pViewShell->SetDrawShell( sal_False ); } else { OSL_ASSERT( nDialogRet == ui::dialogs::ExecutableDialogResults::OK ); //@todo maybe move chart to different table } } uno::Reference< lang::XComponent > xComponent( xDialog, uno::UNO_QUERY ); if( xComponent.is()) xComponent->dispose(); } } } if ( bAddUndo ) { // add undo action the same way as in SdrEditView::InsertObjectAtView // (using UndoActionHdl etc.) pView->AddUndo(pDoc->GetSdrUndoFactory().CreateUndoNewObject(*pObj)); } // BM/IHA -- } } /************************************************************************* |* |* FuInsertChart::Destruktor |* \************************************************************************/ FuInsertChart::~FuInsertChart() { } /************************************************************************* |* |* FuInsertChart::Function aktivieren |* \************************************************************************/ void FuInsertChart::Activate() { FuPoor::Activate(); } /************************************************************************* |* |* FuInsertChart::Function deaktivieren |* \************************************************************************/ void FuInsertChart::Deactivate() { FuPoor::Deactivate(); }