diff options
Diffstat (limited to 'chart2/source/controller/main/ChartController_Tools.cxx')
-rw-r--r-- | chart2/source/controller/main/ChartController_Tools.cxx | 288 |
1 files changed, 193 insertions, 95 deletions
diff --git a/chart2/source/controller/main/ChartController_Tools.cxx b/chart2/source/controller/main/ChartController_Tools.cxx index 9edd2963aca4..352a7e1279cc 100644 --- a/chart2/source/controller/main/ChartController_Tools.cxx +++ b/chart2/source/controller/main/ChartController_Tools.cxx @@ -48,6 +48,7 @@ #include "LegendHelper.hxx" #include "AxisHelper.hxx" #include "RegressionCurveHelper.hxx" +#include "ShapeController.hxx" #include <com/sun/star/chart2/DataPointLabel.hpp> #include <com/sun/star/beans/XPropertyState.hpp> @@ -59,8 +60,6 @@ #include <com/sun/star/drawing/TextHorizontalAdjust.hpp> #include <com/sun/star/chart/ErrorBarStyle.hpp> -// #include <com/sun/star/drawing/XDrawPageSupplier.hpp> - #include <svx/ActionDescriptionProvider.hxx> // for TransferableDataHelper/TransferableHelper #include <svtools/transfer.hxx> @@ -77,8 +76,17 @@ // for SolarMutex #include <vcl/svapp.hxx> #include <vos/mutex.hxx> +#include <svx/dialmgr.hxx> +#include <svx/dialogs.hrc> // for OutlinerView #include <editeng/outliner.hxx> +#include <svx/svditer.hxx> +#include <svx/svdpage.hxx> +#include <svx/svdundo.hxx> +#include <svx/unoapi.hxx> +#include <svx/unopage.hxx> + +#include <boost/scoped_ptr.hpp> using namespace ::com::sun::star; @@ -184,50 +192,6 @@ bool lcl_deleteDataCurve( } // anonymous namespace -namespace -{ -void lcl_InsertStringAsTextShapeIntoDrawPage( - const Reference< lang::XMultiServiceFactory > & xShapeFactory, - const Reference< drawing::XDrawPage > & xDrawPage, - OUString & rString, - const awt::Point & aPosition ) -{ - OSL_ASSERT( xShapeFactory.is() && xDrawPage.is()); - if( ! (xShapeFactory.is() && xDrawPage.is())) - return; - - try - { - Reference< drawing::XShape > xTextShape( - xShapeFactory->createInstance( C2U("com.sun.star.drawing.TextShape")), uno::UNO_QUERY_THROW ); - xDrawPage->add( xTextShape ); - - Reference< text::XTextRange > xRange( xTextShape, uno::UNO_QUERY_THROW ); - xRange->setString( rString ); - - float fCharHeight = 10.0; - Reference< beans::XPropertySet > xProperties( xTextShape, uno::UNO_QUERY_THROW ); - xProperties->setPropertyValue( C2U("TextAutoGrowHeight"), uno::makeAny( true )); - xProperties->setPropertyValue( C2U("TextAutoGrowWidth"), uno::makeAny( true )); - xProperties->setPropertyValue( C2U("CharHeight"), uno::makeAny( fCharHeight )); - xProperties->setPropertyValue( C2U("CharHeightAsian"), uno::makeAny( fCharHeight )); - xProperties->setPropertyValue( C2U("CharHeightComplex"), uno::makeAny( fCharHeight )); - xProperties->setPropertyValue( C2U("TextVerticalAdjust"), uno::makeAny( drawing::TextVerticalAdjust_CENTER )); - xProperties->setPropertyValue( C2U("TextHorizontalAdjust"), uno::makeAny( drawing::TextHorizontalAdjust_CENTER )); - xProperties->setPropertyValue( C2U("CharFontName"), uno::makeAny( C2U( "Albany" ))); - - awt::Point aAdaptedPos( aPosition ); - aAdaptedPos.Y -= (xTextShape->getSize().Height / 2); - aAdaptedPos.X -= (xTextShape->getSize().Width / 2); - xTextShape->setPosition( aAdaptedPos ); - } - catch( const uno::Exception & ex ) - { - ASSERT_EXCEPTION( ex ); - } -} - -} // anonymous namespace namespace chart { @@ -334,22 +298,21 @@ void ChartController::executeDispatch_Paste() TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( m_pChartWindow )); if( aDataHelper.GetTransferable().is()) { -// if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING )) -// { -// SotStorageStreamRef xStm; -// if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xStm )) -// { -// xStm->Seek( 0 ); -// uno::Reference< io::XInputStream > xInputStream( new utl::OInputStreamWrapper( *xStm )); -// SdrModel * pModel = new SdrModel(); -// DrawModelWrapper * pDrawModelWrapper( this->GetDrawModelWrapper()); -// if( SvxDrawingLayerImport( pModel, xInputStream )) -// lcl_CopyShapesToChart( *pModel, m_pDrawModelWrapper->getSdrModel()); -// delete pModel; -// } -// } -// else - if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB )) + if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) ) + { + SotStorageStreamRef xStm; + if ( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xStm ) ) + { + xStm->Seek( 0 ); + Reference< io::XInputStream > xInputStream( new utl::OInputStreamWrapper( *xStm ) ); + ::boost::scoped_ptr< SdrModel > spModel( new SdrModel() ); + if ( SvxDrawingLayerImport( spModel.get(), xInputStream ) ) + { + impl_PasteShapes( spModel.get() ); + } + } + } + else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) ) { // graphic exchange format (graphic manager bitmap format?) SotStorageStreamRef xStm; @@ -382,14 +345,7 @@ void ChartController::executeDispatch_Paste() pOutlinerView->InsertText( aString ); else { - awt::Point aTextPos; - awt::Size aPageSize( ChartModelHelper::getPageSize( m_aModel->getModel())); - aTextPos.X = (aPageSize.Width / 2); - aTextPos.Y = (aPageSize.Height / 2); - lcl_InsertStringAsTextShapeIntoDrawPage( - m_pDrawModelWrapper->getShapeFactory(), - m_pDrawModelWrapper->getMainDrawPage(), - aString, aTextPos ); + impl_PasteStringAsTextShape( aString, awt::Point( 0, 0 ) ); } } } @@ -441,7 +397,6 @@ void ChartController::impl_PasteGraphic( uno::Reference< beans::XPropertySet > xGraphicProp( xGraphic, uno::UNO_QUERY ); awt::Size aGraphicSize( 1000, 1000 ); - awt::Point aShapePos( 100,100 ); // first try size in 100th mm, then pixel size if( ! ( xGraphicProp->getPropertyValue( C2U("Size100thMM")) >>= aGraphicSize ) && ( ( xGraphicProp->getPropertyValue( C2U("SizePixel")) >>= aGraphicSize ) && m_pChartWindow )) @@ -451,41 +406,158 @@ void ChartController::impl_PasteGraphic( aGraphicSize.Height = aVCLSize.getHeight(); } xGraphicShape->setSize( aGraphicSize ); - - awt::Size aPageSize( ChartModelHelper::getPageSize( m_aModel->getModel())); - aShapePos.X = (aPageSize.Width / 2) - (aGraphicSize.Width / 2); - aShapePos.Y = (aPageSize.Height / 2) - (aGraphicSize.Height / 2); - xGraphicShape->setPosition( aShapePos ); + xGraphicShape->setPosition( awt::Point( 0, 0 ) ); } } -void ChartController::executeDispatch_Copy() +void ChartController::impl_PasteShapes( SdrModel* pModel ) { + DrawModelWrapper* pDrawModelWrapper( this->GetDrawModelWrapper() ); + if ( pDrawModelWrapper && m_pDrawViewWrapper ) + { + Reference< drawing::XDrawPage > xDestPage( pDrawModelWrapper->getMainDrawPage() ); + SdrPage* pDestPage = GetSdrPageFromXDrawPage( xDestPage ); + if ( pDestPage ) + { + Reference< drawing::XShape > xSelShape; + m_pDrawViewWrapper->BegUndo( SVX_RESSTR( RID_SVX_3D_UNDO_EXCHANGE_PASTE ) ); + sal_uInt16 nCount = pModel->GetPageCount(); + for ( sal_uInt16 i = 0; i < nCount; ++i ) + { + const SdrPage* pPage = pModel->GetPage( i ); + SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); + while ( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + SdrObject* pNewObj = ( pObj ? pObj->Clone() : NULL ); + if ( pNewObj ) + { + pNewObj->SetModel( &pDrawModelWrapper->getSdrModel() ); + pNewObj->SetPage( pDestPage ); + + // set position + Reference< drawing::XShape > xShape( pNewObj->getUnoShape(), uno::UNO_QUERY ); + if ( xShape.is() ) + { + xShape->setPosition( awt::Point( 0, 0 ) ); + } + + pDestPage->InsertObject( pNewObj ); + m_pDrawViewWrapper->AddUndo( new SdrUndoInsertObj( *pNewObj ) ); + xSelShape = xShape; + } + } + } + + Reference< util::XModifiable > xModifiable( m_aModel->getModel(), uno::UNO_QUERY ); + if ( xModifiable.is() ) + { + xModifiable->setModified( true ); + } - Reference< datatransfer::XTransferable > xTransferable; + // select last inserted shape + m_aSelection.setSelection( xSelShape ); + m_aSelection.applySelection( m_pDrawViewWrapper ); + + m_pDrawViewWrapper->EndUndo(); + } + } +} +void ChartController::impl_PasteStringAsTextShape( const OUString& rString, const awt::Point& rPosition ) +{ + DrawModelWrapper* pDrawModelWrapper( this->GetDrawModelWrapper() ); + if ( pDrawModelWrapper && m_pDrawViewWrapper ) { - ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); - SdrObject * pSelectedObj = 0; - if( m_pDrawViewWrapper && m_pDrawModelWrapper ) - { - if( m_aSelection.getSelectedCID().getLength() ) - pSelectedObj = m_pDrawModelWrapper->getNamedSdrObject( m_aSelection.getSelectedCID() ); - else - pSelectedObj = DrawViewWrapper::getSdrObject( m_aSelection.getSelectedAdditionalShape() ); + const Reference< lang::XMultiServiceFactory >& xShapeFactory( pDrawModelWrapper->getShapeFactory() ); + const Reference< drawing::XDrawPage >& xDrawPage( pDrawModelWrapper->getMainDrawPage() ); + OSL_ASSERT( xShapeFactory.is() && xDrawPage.is() ); - if( pSelectedObj ) + if ( xShapeFactory.is() && xDrawPage.is() ) + { + try { - xTransferable = Reference< datatransfer::XTransferable >( new ChartTransferable( - & m_pDrawModelWrapper->getSdrModel(), pSelectedObj )); + Reference< drawing::XShape > xTextShape( + xShapeFactory->createInstance( C2U( "com.sun.star.drawing.TextShape" ) ), uno::UNO_QUERY_THROW ); + xDrawPage->add( xTextShape ); + + Reference< text::XTextRange > xRange( xTextShape, uno::UNO_QUERY_THROW ); + xRange->setString( rString ); + + float fCharHeight = 10.0; + Reference< beans::XPropertySet > xProperties( xTextShape, uno::UNO_QUERY_THROW ); + xProperties->setPropertyValue( C2U( "TextAutoGrowHeight" ), uno::makeAny( true ) ); + xProperties->setPropertyValue( C2U( "TextAutoGrowWidth" ), uno::makeAny( true ) ); + xProperties->setPropertyValue( C2U( "CharHeight" ), uno::makeAny( fCharHeight ) ); + xProperties->setPropertyValue( C2U( "CharHeightAsian" ), uno::makeAny( fCharHeight ) ); + xProperties->setPropertyValue( C2U( "CharHeightComplex" ), uno::makeAny( fCharHeight ) ); + xProperties->setPropertyValue( C2U( "TextVerticalAdjust" ), uno::makeAny( drawing::TextVerticalAdjust_CENTER ) ); + xProperties->setPropertyValue( C2U( "TextHorizontalAdjust" ), uno::makeAny( drawing::TextHorizontalAdjust_CENTER ) ); + xProperties->setPropertyValue( C2U( "CharFontName" ), uno::makeAny( C2U( "Albany" ) ) ); + + xTextShape->setPosition( rPosition ); + + m_aSelection.setSelection( xTextShape ); + m_aSelection.applySelection( m_pDrawViewWrapper ); + + SdrObject* pObj = DrawViewWrapper::getSdrObject( xTextShape ); + if ( pObj ) + { + m_pDrawViewWrapper->BegUndo( SVX_RESSTR( RID_SVX_3D_UNDO_EXCHANGE_PASTE ) ); + m_pDrawViewWrapper->AddUndo( new SdrUndoInsertObj( *pObj ) ); + m_pDrawViewWrapper->EndUndo(); + } + } + catch ( const uno::Exception& ex ) + { + ASSERT_EXCEPTION( ex ); } } } - if( xTransferable.is() ) +} + +void ChartController::executeDispatch_Copy() +{ + if ( m_pDrawViewWrapper ) { - Reference< datatransfer::clipboard::XClipboard > xClipboard( TransferableHelper::GetSystemClipboard()); - if( xClipboard.is()) - xClipboard->setContents( xTransferable, Reference< datatransfer::clipboard::XClipboardOwner >() ); + OutlinerView* pOutlinerView = m_pDrawViewWrapper->GetTextEditOutlinerView(); + if ( pOutlinerView ) + { + pOutlinerView->Copy(); + } + else + { + Reference< datatransfer::XTransferable > xTransferable; + { + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + SdrObject* pSelectedObj = 0; + if ( m_pDrawModelWrapper ) + { + ObjectIdentifier aSelOID( m_aSelection.getSelectedOID() ); + if ( aSelOID.isAutoGeneratedObject() ) + { + pSelectedObj = m_pDrawModelWrapper->getNamedSdrObject( aSelOID.getObjectCID() ); + } + else if ( aSelOID.isAdditionalShape() ) + { + pSelectedObj = DrawViewWrapper::getSdrObject( aSelOID.getAdditionalShape() ); + } + if ( pSelectedObj ) + { + xTransferable = Reference< datatransfer::XTransferable >( new ChartTransferable( + &m_pDrawModelWrapper->getSdrModel(), pSelectedObj, aSelOID.isAdditionalShape() ) ); + } + } + } + if ( xTransferable.is() ) + { + Reference< datatransfer::clipboard::XClipboard > xClipboard( TransferableHelper::GetSystemClipboard() ); + if ( xClipboard.is() ) + { + xClipboard->setContents( xTransferable, Reference< datatransfer::clipboard::XClipboardOwner >() ); + } + } + } } } @@ -498,9 +570,10 @@ void ChartController::executeDispatch_Cut() //static bool ChartController::isObjectDeleteable( const uno::Any& rSelection ) { - OUString aSelObjCID; - if( (rSelection >>= aSelObjCID) && aSelObjCID.getLength() > 0 ) + ObjectIdentifier aSelOID( rSelection ); + if ( aSelOID.isAutoGeneratedObject() ) { + OUString aSelObjCID( aSelOID.getObjectCID() ); ObjectType aObjectType(ObjectIdentifier::getObjectType( aSelObjCID )); if( (OBJECTTYPE_TITLE == aObjectType) || (OBJECTTYPE_LEGEND == aObjectType) || (OBJECTTYPE_DATA_SERIES == aObjectType) ) @@ -513,6 +586,22 @@ bool ChartController::isObjectDeleteable( const uno::Any& rSelection ) if( (OBJECTTYPE_DATA_LABELS == aObjectType) || (OBJECTTYPE_DATA_LABEL == aObjectType) ) return true; } + else if ( aSelOID.isAdditionalShape() ) + { + return true; + } + + return false; +} + +bool ChartController::isShapeContext() const +{ + if ( m_aSelection.isAdditionalShapeSelected() || + ( m_pDrawViewWrapper && m_pDrawViewWrapper->AreObjectsMarked() && + ( m_pDrawViewWrapper->GetCurrentObjIdentifier() == OBJ_TEXT ) ) ) + { + return true; + } return false; } @@ -779,4 +868,13 @@ void ChartController::executeDispatch_ToggleGridHorizontal() } } +void ChartController::impl_ShapeControllerDispatch( const util::URL& rURL, const Sequence< beans::PropertyValue >& rArgs ) +{ + Reference< frame::XDispatch > xDispatch( m_aDispatchContainer.getShapeController() ); + if ( xDispatch.is() ) + { + xDispatch->dispatch( rURL, rArgs ); + } +} + } // namespace chart |