diff options
121 files changed, 7877 insertions, 2520 deletions
diff --git a/chart2/prj/build.lst b/chart2/prj/build.lst index 8a76f4a05..3cdc9a26e 100644 --- a/chart2/prj/build.lst +++ b/chart2/prj/build.lst @@ -14,7 +14,7 @@ ch chart2\source\view\axes nmake - all ch_source_view_axes ch_source_tools ch chart2\source\view\charttypes nmake - all ch_source_view_charttypes ch_inc NULL ch chart2\source\view\diagram nmake - all ch_source_view_diagram ch_inc NULL ch chart2\source\view\main nmake - all ch_source_view_main ch_inc NULL -ch chart2\source\controller nmake - all ch_source_controller ch_source_tools ch_source_view ch_source_controller_drawinglayer ch_source_controller_itemsetwrapper ch_source_controller_dialogs ch_source_controller_main ch_source_controller_chartapiwrapper ch_source_controller_accessibility ch_inc NULL +ch chart2\source\controller nmake - all ch_source_controller ch_source_tools ch_source_view ch_source_controller_drawinglayer ch_source_controller_itemsetwrapper ch_source_controller_dialogs ch_source_controller_main ch_source_controller_chartapiwrapper ch_source_controller_accessibility ch_inc ch_source_controller_menus NULL ch chart2\source\controller\inc get - all ch_source_controller_inc NULL ch chart2\source\controller\accessibility nmake - all ch_source_controller_accessibility ch_inc NULL ch chart2\source\controller\dialogs nmake - all ch_source_controller_dialogs ch_inc NULL @@ -22,4 +22,5 @@ ch chart2\source\controller\drawinglayer nmake - all ch_source_controller_drawi ch chart2\source\controller\itemsetwrapper nmake - all ch_source_controller_itemsetwrapper ch_inc NULL ch chart2\source\controller\chartapiwrapper nmake - all ch_source_controller_chartapiwrapper ch_inc NULL ch chart2\source\controller\main nmake - all ch_source_controller_main ch_inc NULL +ch chart2\source\controller\menus nmake - all ch_source_controller_menus ch_inc NULL ch chart2\prj get - all ch_prj NULL diff --git a/chart2/source/controller/accessibility/AccessibleBase.cxx b/chart2/source/controller/accessibility/AccessibleBase.cxx index 3d9a2f4d9..aba3ad273 100644 --- a/chart2/source/controller/accessibility/AccessibleBase.cxx +++ b/chart2/source/controller/accessibility/AccessibleBase.cxx @@ -29,6 +29,7 @@ #include "precompiled_chart2.hxx" #include "AccessibleBase.hxx" +#include "AccessibleChartShape.hxx" #include "ObjectHierarchy.hxx" #include "ObjectIdentifier.hxx" #include "chartview/ExplicitValueProvider.hxx" @@ -269,15 +270,15 @@ bool AccessibleBase::ImplUpdateChildren() { ObjectHierarchy::tChildContainer aModelChildren( m_aAccInfo.m_spObjectHierarchy->getChildren( GetId() )); - ::std::vector< ChildCIDMap::key_type > aAccChildren; + ::std::vector< ChildOIDMap::key_type > aAccChildren; aAccChildren.reserve( aModelChildren.size()); - ::std::transform( m_aChildCIDMap.begin(), m_aChildCIDMap.end(), + ::std::transform( m_aChildOIDMap.begin(), m_aChildOIDMap.end(), ::std::back_inserter( aAccChildren ), - ::std::select1st< ChildCIDMap::value_type >()); + ::std::select1st< ChildOIDMap::value_type >()); ::std::sort( aModelChildren.begin(), aModelChildren.end()); - ::std::vector< OUString > aChildrenToRemove, aChildrenToAdd; + ::std::vector< ObjectHierarchy::tOID > aChildrenToRemove, aChildrenToAdd; ::std::set_difference( aModelChildren.begin(), aModelChildren.end(), aAccChildren.begin(), aAccChildren.end(), ::std::back_inserter( aChildrenToAdd )); @@ -285,10 +286,10 @@ bool AccessibleBase::ImplUpdateChildren() aModelChildren.begin(), aModelChildren.end(), ::std::back_inserter( aChildrenToRemove )); - ::std::vector< OUString >::const_iterator aIt( aChildrenToRemove.begin()); + ::std::vector< ObjectHierarchy::tOID >::const_iterator aIt( aChildrenToRemove.begin()); for( ; aIt != aChildrenToRemove.end(); ++aIt ) { - RemoveChildById( *aIt ); + RemoveChildByOId( *aIt ); } AccessibleElementInfo aAccInfo( GetInfo()); @@ -296,8 +297,15 @@ bool AccessibleBase::ImplUpdateChildren() for( aIt = aChildrenToAdd.begin(); aIt != aChildrenToAdd.end(); ++aIt ) { - aAccInfo.m_aCID = *aIt; - AddChild( ChartElementFactory::CreateChartElement( aAccInfo )); + aAccInfo.m_aOID = *aIt; + if ( aIt->isAutoGeneratedObject() ) + { + AddChild( ChartElementFactory::CreateChartElement( aAccInfo ) ); + } + else if ( aIt->isAdditionalShape() ) + { + AddChild( new AccessibleChartShape( aAccInfo, true, false ) ); + } } bResult = true; } @@ -316,7 +324,7 @@ void AccessibleBase::AddChild( AccessibleBase * pChild ) Reference< XAccessible > xChild( pChild ); m_aChildList.push_back( xChild ); - m_aChildCIDMap[ pChild->GetId() ] = xChild; + m_aChildOIDMap[ pChild->GetId() ] = xChild; // inform listeners of new child if( m_bChildrenInitialized ) @@ -335,18 +343,18 @@ void AccessibleBase::AddChild( AccessibleBase * pChild ) /** in this method we imply that the Reference< XAccessible > elements in the vector are AccessibleBase objects ! */ -void AccessibleBase::RemoveChildById( const ::rtl::OUString & rId ) +void AccessibleBase::RemoveChildByOId( const ObjectIdentifier& rOId ) { // /-- ClearableMutexGuard aGuard( GetMutex() ); - ChildCIDMap::iterator aIt( m_aChildCIDMap.find( rId )); - if( aIt != m_aChildCIDMap.end()) + ChildOIDMap::iterator aIt( m_aChildOIDMap.find( rOId )); + if( aIt != m_aChildOIDMap.end()) { Reference< XAccessible > xChild( aIt->second ); // remove from map - m_aChildCIDMap.erase( aIt ); + m_aChildOIDMap.erase( aIt ); // search child in vector ChildListVectorType::iterator aVecIter = @@ -444,7 +452,7 @@ void AccessibleBase::KillAllChildren() // remove all children m_aChildList.clear(); - m_aChildCIDMap.clear(); + m_aChildOIDMap.clear(); aGuard.clear(); // \-- @@ -485,7 +493,7 @@ void AccessibleBase::SetInfo( const AccessibleElementInfo & rNewInfo ) AccessibleUniqueId AccessibleBase::GetId() const { - return m_aAccInfo.m_aCID; + return m_aAccInfo.m_aOID; } // ____________________________________ @@ -662,14 +670,15 @@ Reference< XAccessibleStateSet > SAL_CALL AccessibleBase::getAccessibleStateSet( { if( ! m_bStateSetInitialized ) { - OUString aSelCID; Reference< view::XSelectionSupplier > xSelSupp( GetInfo().m_xSelectionSupplier ); - if( xSelSupp.is() && - ( xSelSupp->getSelection() >>= aSelCID ) && - GetId().equals( aSelCID ) ) + if ( xSelSupp.is() ) { - AddState( AccessibleStateType::SELECTED ); - AddState( AccessibleStateType::FOCUSED ); + ObjectIdentifier aOID( xSelSupp->getSelection() ); + if ( aOID.isValid() && GetId() == aOID ) + { + AddState( AccessibleStateType::SELECTED ); + AddState( AccessibleStateType::FOCUSED ); + } } m_bStateSetInitialized = true; } @@ -752,7 +761,7 @@ awt::Rectangle SAL_CALL AccessibleBase::getBounds() if( pExplicitValueProvider ) { Window* pWindow( VCLUnoHelper::GetWindow( m_aAccInfo.m_xWindow )); - awt::Rectangle aLogicRect( pExplicitValueProvider->getRectangleOfObject( m_aAccInfo.m_aCID )); + awt::Rectangle aLogicRect( pExplicitValueProvider->getRectangleOfObject( m_aAccInfo.m_aOID.getObjectCID() )); if( pWindow ) { Rectangle aRect( aLogicRect.X, aLogicRect.Y, @@ -825,10 +834,11 @@ void SAL_CALL AccessibleBase::grabFocus() { CheckDisposeState(); - OUString aSelCID; Reference< view::XSelectionSupplier > xSelSupp( GetInfo().m_xSelectionSupplier ); - if( xSelSupp.is()) - xSelSupp->select( uno::makeAny( GetId())); + if ( xSelSupp.is() ) + { + xSelSupp->select( GetId().getAny() ); + } } sal_Int32 SAL_CALL AccessibleBase::getForeground() @@ -849,9 +859,10 @@ sal_Int32 AccessibleBase::getColor( eColorType eColType ) if( m_bAlwaysTransparent ) return nResult; - ObjectType eType( ObjectIdentifier::getObjectType( m_aAccInfo.m_aCID )); + ObjectIdentifier aOID( m_aAccInfo.m_aOID ); + ObjectType eType( aOID.getObjectType() ); Reference< beans::XPropertySet > xObjProp; - OUString aObjectCID = m_aAccInfo.m_aCID; + OUString aObjectCID = aOID.getObjectCID(); if( eType == OBJECTTYPE_LEGEND_ENTRY ) { // for colors get the data series/point properties diff --git a/chart2/source/controller/accessibility/AccessibleChartElement.cxx b/chart2/source/controller/accessibility/AccessibleChartElement.cxx index 2216953fd..db33f36c1 100644 --- a/chart2/source/controller/accessibility/AccessibleChartElement.cxx +++ b/chart2/source/controller/accessibility/AccessibleChartElement.cxx @@ -101,7 +101,7 @@ bool AccessibleChartElement::ImplUpdateChildren() bool bResult = false; Reference< chart2::XTitle > xTitle( ObjectIdentifier::getObjectPropertySet( - GetInfo().m_aCID, Reference< chart2::XChartDocument >( GetInfo().m_xChartDocument )), + GetInfo().m_aOID.getObjectCID(), Reference< chart2::XChartDocument >( GetInfo().m_xChartDocument )), uno::UNO_QUERY ); m_bHasText = xTitle.is(); @@ -136,7 +136,7 @@ void AccessibleChartElement::InitTextEdit() { Reference< lang::XInitialization > xInit( m_xTextHelper, uno::UNO_QUERY_THROW ); Sequence< uno::Any > aArgs( 3 ); - aArgs[0] <<= GetInfo().m_aCID; + aArgs[0] <<= GetInfo().m_aOID.getObjectCID(); aArgs[1] <<= Reference< XAccessible >( this ); aArgs[2] <<= Reference< awt::XWindow >( GetInfo().m_xWindow ); xInit->initialize( aArgs ); @@ -224,7 +224,7 @@ OUString SAL_CALL AccessibleChartElement::getAccessibleName() throw (::com::sun::star::uno::RuntimeException) { return ObjectNameProvider::getNameForCID( - GetInfo().m_aCID, GetInfo().m_xChartDocument ); + GetInfo().m_aOID.getObjectCID(), GetInfo().m_xChartDocument ); } // ________ AccessibleChartElement::XAccessibleContext (overloaded) ________ @@ -249,7 +249,7 @@ Reference< awt::XFont > SAL_CALL AccessibleChartElement::getFont() { Reference< beans::XMultiPropertySet > xObjProp( ObjectIdentifier::getObjectPropertySet( - GetInfo().m_aCID, Reference< chart2::XChartDocument >( GetInfo().m_xChartDocument )), uno::UNO_QUERY ); + GetInfo().m_aOID.getObjectCID(), Reference< chart2::XChartDocument >( GetInfo().m_xChartDocument )), uno::UNO_QUERY ); awt::FontDescriptor aDescr( CharacterProperties::createFontDescriptorFromPropertySet( xObjProp )); xFont = xDevice->getFont( aDescr ); @@ -270,7 +270,7 @@ OUString SAL_CALL AccessibleChartElement::getToolTipText() CheckDisposeState(); return ObjectNameProvider::getHelpText( - GetInfo().m_aCID, Reference< chart2::XChartDocument >( GetInfo().m_xChartDocument )); + GetInfo().m_aOID.getObjectCID(), Reference< chart2::XChartDocument >( GetInfo().m_xChartDocument )); } // ________ XAccessibleComponent ________ @@ -280,7 +280,7 @@ sal_Bool SAL_CALL AccessibleChartElement::containsPoint( const awt::Point& aPoin return AccessibleBase::containsPoint( aPoint ); } -Reference< accessibility::XAccessible > SAL_CALL AccessibleChartElement::getAccessibleAtPoint( const awt::Point& aPoint ) +Reference< XAccessible > SAL_CALL AccessibleChartElement::getAccessibleAtPoint( const awt::Point& aPoint ) throw (uno::RuntimeException) { return AccessibleBase::getAccessibleAtPoint( aPoint ); diff --git a/chart2/source/controller/accessibility/AccessibleChartShape.cxx b/chart2/source/controller/accessibility/AccessibleChartShape.cxx new file mode 100644 index 000000000..d4edfa0fb --- /dev/null +++ b/chart2/source/controller/accessibility/AccessibleChartShape.cxx @@ -0,0 +1,289 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "AccessibleChartShape.hxx" +#include "ObjectHierarchy.hxx" +#include "ObjectIdentifier.hxx" + +#include <toolkit/helper/vclunohelper.hxx> +#include <svx/ShapeTypeHandler.hxx> +#include <svx/AccessibleShape.hxx> +#include <svx/AccessibleShapeInfo.hxx> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::RuntimeException; + + +namespace chart +{ + +AccessibleChartShape::AccessibleChartShape( + const AccessibleElementInfo& rAccInfo, + bool bMayHaveChildren, bool bAlwaysTransparent ) + :impl::AccessibleChartShape_Base( rAccInfo, bMayHaveChildren, bAlwaysTransparent ) + ,m_pAccShape( NULL ) +{ + if ( rAccInfo.m_aOID.isAdditionalShape() ) + { + Reference< drawing::XShape > xShape( rAccInfo.m_aOID.getAdditionalShape() ); + Reference< XAccessible > xParent; + if ( rAccInfo.m_pParent ) + { + xParent.set( rAccInfo.m_pParent ); + } + sal_Int32 nIndex = -1; + if ( rAccInfo.m_spObjectHierarchy ) + { + nIndex = rAccInfo.m_spObjectHierarchy->getIndexInParent( rAccInfo.m_aOID ); + } + ::accessibility::AccessibleShapeInfo aShapeInfo( xShape, xParent, nIndex ); + + m_aShapeTreeInfo.SetSdrView( rAccInfo.m_pSdrView ); + m_aShapeTreeInfo.SetController( NULL ); + m_aShapeTreeInfo.SetWindow( VCLUnoHelper::GetWindow( rAccInfo.m_xWindow ) ); + m_aShapeTreeInfo.SetViewForwarder( rAccInfo.m_pViewForwarder ); + + ::accessibility::ShapeTypeHandler& rShapeHandler = ::accessibility::ShapeTypeHandler::Instance(); + m_pAccShape = rShapeHandler.CreateAccessibleObject( aShapeInfo, m_aShapeTreeInfo ); + if ( m_pAccShape ) + { + m_pAccShape->acquire(); + m_pAccShape->Init(); + } + } +} + +AccessibleChartShape::~AccessibleChartShape() +{ + OSL_ASSERT( CheckDisposeState( false /* don't throw exceptions */ ) ); + + if ( m_pAccShape ) + { + m_pAccShape->dispose(); + m_pAccShape->release(); + } +} + +// ________ XServiceInfo ________ +::rtl::OUString AccessibleChartShape::getImplementationName() + throw (RuntimeException) +{ + return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AccessibleChartShape" ) ); +} + +// ________ XAccessibleContext ________ +sal_Int32 AccessibleChartShape::getAccessibleChildCount() + throw (RuntimeException) +{ + sal_Int32 nCount(0); + if ( m_pAccShape ) + { + nCount = m_pAccShape->getAccessibleChildCount(); + } + return nCount; +} + +Reference< XAccessible > AccessibleChartShape::getAccessibleChild( sal_Int32 i ) + throw (lang::IndexOutOfBoundsException, RuntimeException) +{ + Reference< XAccessible > xChild; + if ( m_pAccShape ) + { + xChild = m_pAccShape->getAccessibleChild( i ); + } + return xChild; +} + +sal_Int16 AccessibleChartShape::getAccessibleRole() + throw (RuntimeException) +{ + sal_Int16 nRole(0); + if ( m_pAccShape ) + { + nRole = m_pAccShape->getAccessibleRole(); + } + return nRole; +} + +::rtl::OUString AccessibleChartShape::getAccessibleDescription() + throw (::com::sun::star::uno::RuntimeException) +{ + ::rtl::OUString aDescription; + if ( m_pAccShape ) + { + aDescription = m_pAccShape->getAccessibleDescription(); + } + return aDescription; +} + +::rtl::OUString AccessibleChartShape::getAccessibleName() + throw (::com::sun::star::uno::RuntimeException) +{ + ::rtl::OUString aName; + if ( m_pAccShape ) + { + aName = m_pAccShape->getAccessibleName(); + } + return aName; +} + +// ________ XAccessibleComponent ________ +sal_Bool AccessibleChartShape::containsPoint( const awt::Point& aPoint ) + throw (uno::RuntimeException) +{ + sal_Bool bReturn = sal_False; + if ( m_pAccShape ) + { + bReturn = m_pAccShape->containsPoint( aPoint ); + } + return bReturn; +} + +Reference< XAccessible > AccessibleChartShape::getAccessibleAtPoint( const awt::Point& aPoint ) + throw (uno::RuntimeException) +{ + Reference< XAccessible > xResult; + if ( m_pAccShape ) + { + xResult.set( m_pAccShape->getAccessibleAtPoint( aPoint ) ); + } + return xResult; +} + +awt::Rectangle AccessibleChartShape::getBounds() + throw (uno::RuntimeException) +{ + awt::Rectangle aBounds; + if ( m_pAccShape ) + { + aBounds = m_pAccShape->getBounds(); + } + return aBounds; +} + +awt::Point AccessibleChartShape::getLocation() + throw (uno::RuntimeException) +{ + awt::Point aLocation; + if ( m_pAccShape ) + { + aLocation = m_pAccShape->getLocation(); + } + return aLocation; +} + +awt::Point AccessibleChartShape::getLocationOnScreen() + throw (uno::RuntimeException) +{ + awt::Point aLocation; + if ( m_pAccShape ) + { + aLocation = m_pAccShape->getLocationOnScreen(); + } + return aLocation; +} + +awt::Size AccessibleChartShape::getSize() + throw (uno::RuntimeException) +{ + awt::Size aSize; + if ( m_pAccShape ) + { + aSize = m_pAccShape->getSize(); + } + return aSize; +} + +void AccessibleChartShape::grabFocus() + throw (uno::RuntimeException) +{ + return AccessibleBase::grabFocus(); +} + +sal_Int32 AccessibleChartShape::getForeground() + throw (uno::RuntimeException) +{ + sal_Int32 nColor(0); + if ( m_pAccShape ) + { + nColor = m_pAccShape->getForeground(); + } + return nColor; +} + +sal_Int32 AccessibleChartShape::getBackground() + throw (uno::RuntimeException) +{ + sal_Int32 nColor(0); + if ( m_pAccShape ) + { + nColor = m_pAccShape->getBackground(); + } + return nColor; +} + +// ________ XAccessibleExtendedComponent ________ +Reference< awt::XFont > AccessibleChartShape::getFont() + throw (uno::RuntimeException) +{ + Reference< awt::XFont > xFont; + if ( m_pAccShape ) + { + xFont.set( m_pAccShape->getFont() ); + } + return xFont; +} + +::rtl::OUString AccessibleChartShape::getTitledBorderText() + throw (uno::RuntimeException) +{ + ::rtl::OUString aText; + if ( m_pAccShape ) + { + aText = m_pAccShape->getTitledBorderText(); + } + return aText; +} + +::rtl::OUString AccessibleChartShape::getToolTipText() + throw (::com::sun::star::uno::RuntimeException) +{ + ::rtl::OUString aText; + if ( m_pAccShape ) + { + aText = m_pAccShape->getToolTipText(); + } + return aText; +} + +} // namespace chart diff --git a/chart2/source/controller/accessibility/AccessibleChartShape.hxx b/chart2/source/controller/accessibility/AccessibleChartShape.hxx new file mode 100644 index 000000000..be73e7457 --- /dev/null +++ b/chart2/source/controller/accessibility/AccessibleChartShape.hxx @@ -0,0 +1,104 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _CHART2_ACCESSIBLECHARTSHAPE_HXX_ +#define _CHART2_ACCESSIBLECHARTSHAPE_HXX_ + +#include "AccessibleBase.hxx" + +#include <com/sun/star/accessibility/XAccessibleExtendedComponent.hpp> +#include <cppuhelper/implbase1.hxx> +#include <svx/AccessibleShapeTreeInfo.hxx> + + +namespace accessibility +{ +class AccessibleShape; +} + +namespace chart +{ + +namespace impl +{ +typedef ::cppu::ImplInheritanceHelper1< + AccessibleBase, + ::com::sun::star::accessibility::XAccessibleExtendedComponent > AccessibleChartShape_Base; +} + +class AccessibleChartShape : + public impl::AccessibleChartShape_Base +{ +public: + AccessibleChartShape( const AccessibleElementInfo& rAccInfo, + bool bMayHaveChildren, bool bAlwaysTransparent = false ); + virtual ~AccessibleChartShape(); + + // ________ XServiceInfo ________ + virtual ::rtl::OUString SAL_CALL getImplementationName() + throw (::com::sun::star::uno::RuntimeException); + + // ________ XAccessibleContext ________ + virtual sal_Int32 SAL_CALL getAccessibleChildCount() + throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL + getAccessibleChild( sal_Int32 i ) + throw (::com::sun::star::lang::IndexOutOfBoundsException, + ::com::sun::star::uno::RuntimeException); + virtual sal_Int16 SAL_CALL getAccessibleRole() + throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getAccessibleDescription() + throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getAccessibleName() + throw (::com::sun::star::uno::RuntimeException); + + // ________ XAccessibleComponent ________ + virtual sal_Bool SAL_CALL containsPoint( const ::com::sun::star::awt::Point& aPoint ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const ::com::sun::star::awt::Point& aPoint ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::awt::Rectangle SAL_CALL getBounds() throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::awt::Point SAL_CALL getLocation() throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::awt::Point SAL_CALL getLocationOnScreen() throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::awt::Size SAL_CALL getSize() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL grabFocus() throw (::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getForeground() throw (::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getBackground() throw (::com::sun::star::uno::RuntimeException); + + // ________ XAccessibleExtendedComponent ________ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFont > SAL_CALL getFont() + throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getTitledBorderText() + throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getToolTipText() + throw (::com::sun::star::uno::RuntimeException); + +private: + ::accessibility::AccessibleShape* m_pAccShape; + ::accessibility::AccessibleShapeTreeInfo m_aShapeTreeInfo; +}; + +} // namespace chart + +#endif diff --git a/chart2/source/controller/accessibility/AccessibleChartView.cxx b/chart2/source/controller/accessibility/AccessibleChartView.cxx index ceb57fac5..dce38d072 100644 --- a/chart2/source/controller/accessibility/AccessibleChartView.cxx +++ b/chart2/source/controller/accessibility/AccessibleChartView.cxx @@ -36,6 +36,7 @@ #include "ObjectIdentifier.hxx" #include "ResId.hxx" #include "Strings.hrc" +#include "AccessibleViewForwarder.hxx" #include <com/sun/star/accessibility/AccessibleEventId.hpp> #include <com/sun/star/accessibility/AccessibleStateType.hpp> @@ -66,19 +67,22 @@ namespace chart //............................................................................. AccessibleChartView::AccessibleChartView( - const Reference<uno::XComponentContext> & xContext ) : + const Reference< uno::XComponentContext >& xContext, SdrView* pView ) : impl::AccessibleChartView_Base( AccessibleElementInfo(), // empty for now true, // has children true // always transparent ), - m_xContext( xContext ) + m_xContext( xContext ), + m_pSdrView( pView ), + m_pViewForwarder( NULL ) { AddState( AccessibleStateType::OPAQUE ); } AccessibleChartView::~AccessibleChartView() { + delete m_pViewForwarder; } @@ -187,20 +191,6 @@ awt::Point SAL_CALL AccessibleChartView::getLocationOnScreen() } //----------------------------------------------------------------- -// lang::XServiceInfo -//----------------------------------------------------------------- - -APPHELPER_XSERVICEINFO_IMPL( AccessibleChartView, CHART2_ACCESSIBLE_SERVICE_IMPLEMENTATION_NAME ) - -uno::Sequence< rtl::OUString > AccessibleChartView::getSupportedServiceNames_Static() -{ - uno::Sequence< rtl::OUString > aSNS( 2 ); - aSNS.getArray()[ 0 ] = C2U("com.sun.star.accessibility.Accessible"); - aSNS.getArray()[ 1 ] = CHART2_ACCESSIBLE_SERVICE_NAME; - return aSNS; -} - -//----------------------------------------------------------------- // lang::XInitialization //----------------------------------------------------------------- @@ -350,7 +340,7 @@ void SAL_CALL AccessibleChartView::initialize( const Sequence< Any >& rArguments { AccessibleElementInfo aAccInfo; - aAccInfo.m_aCID = C2U("ROOT"); + aAccInfo.m_aOID = ObjectIdentifier( C2U( "ROOT" ) ); aAccInfo.m_xChartDocument = uno::WeakReference< chart2::XChartDocument >( uno::Reference< chart2::XChartDocument >( m_xChartModel.get(), uno::UNO_QUERY )); aAccInfo.m_xSelectionSupplier = m_xSelectionSupplier; @@ -358,6 +348,14 @@ void SAL_CALL AccessibleChartView::initialize( const Sequence< Any >& rArguments aAccInfo.m_xWindow = m_xWindow; aAccInfo.m_pParent = 0; aAccInfo.m_spObjectHierarchy = m_spObjectHierarchy; + aAccInfo.m_pSdrView = m_pSdrView; + Window* pWindow = VCLUnoHelper::GetWindow( m_xWindow ); + if ( m_pViewForwarder ) + { + delete m_pViewForwarder; + } + m_pViewForwarder = new AccessibleViewForwarder( this, pWindow ); + aAccInfo.m_pViewForwarder = m_pViewForwarder; // broadcasts an INVALIDATE_ALL_CHILDREN event globally SetInfo( aAccInfo ); } @@ -384,16 +382,16 @@ void SAL_CALL AccessibleChartView::selectionChanged( const lang::EventObject& /* if( xSelectionSupplier.is() ) { - rtl::OUString aSelectedObjectCID; - Any aSelection = xSelectionSupplier->getSelection(); - if(aSelection>>=aSelectedObjectCID) + ObjectIdentifier aSelectedOID( xSelectionSupplier->getSelection() ); + if ( m_aCurrentSelectionOID.isValid() ) + { + NotifyEvent( LOST_SELECTION, m_aCurrentSelectionOID ); + } + if( aSelectedOID.isValid() ) { - if( m_aCurrentSelectionCID.getLength()) - NotifyEvent( LOST_SELECTION, m_aCurrentSelectionCID ); - if( aSelectedObjectCID.getLength()) - NotifyEvent( GOT_SELECTION, aSelectedObjectCID ); - m_aCurrentSelectionCID = aSelectedObjectCID; + NotifyEvent( GOT_SELECTION, aSelectedOID ); } + m_aCurrentSelectionOID = aSelectedOID; } } diff --git a/chart2/source/controller/accessibility/AccessibleViewForwarder.cxx b/chart2/source/controller/accessibility/AccessibleViewForwarder.cxx new file mode 100644 index 000000000..63ec07705 --- /dev/null +++ b/chart2/source/controller/accessibility/AccessibleViewForwarder.cxx @@ -0,0 +1,116 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "AccessibleViewForwarder.hxx" +#include "AccessibleChartView.hxx" + +#include <vcl/window.hxx> + +using namespace ::com::sun::star; + + +namespace chart +{ + +AccessibleViewForwarder::AccessibleViewForwarder( AccessibleChartView* pAccChartView, Window* pWindow ) + :m_pAccChartView( pAccChartView ) + ,m_pWindow( pWindow ) + ,m_aMapMode( MAP_100TH_MM ) +{ +} + +AccessibleViewForwarder::~AccessibleViewForwarder() +{ +} + +// ________ IAccessibleViewforwarder ________ + +BOOL AccessibleViewForwarder::IsValid() const +{ + return sal_True; +} + +Rectangle AccessibleViewForwarder::GetVisibleArea() const +{ + Rectangle aVisibleArea; + if ( m_pWindow ) + { + aVisibleArea.SetPos( Point( 0, 0 ) ); + aVisibleArea.SetSize( m_pWindow->GetOutputSizePixel() ); + aVisibleArea = m_pWindow->PixelToLogic( aVisibleArea, m_aMapMode ); + } + return aVisibleArea; +} + +Point AccessibleViewForwarder::LogicToPixel( const Point& rPoint ) const +{ + Point aPoint; + if ( m_pAccChartView && m_pWindow ) + { + awt::Point aLocation = m_pAccChartView->getLocationOnScreen(); + Point aTopLeft( aLocation.X, aLocation.Y ); + aPoint = m_pWindow->LogicToPixel( rPoint, m_aMapMode ) + aTopLeft; + } + return aPoint; +} + +Size AccessibleViewForwarder::LogicToPixel( const Size& rSize ) const +{ + Size aSize; + if ( m_pWindow ) + { + aSize = m_pWindow->LogicToPixel( rSize, m_aMapMode ); + } + return aSize; +} + +Point AccessibleViewForwarder::PixelToLogic( const Point& rPoint ) const +{ + Point aPoint; + if ( m_pAccChartView && m_pWindow ) + { + awt::Point aLocation = m_pAccChartView->getLocationOnScreen(); + Point aTopLeft( aLocation.X, aLocation.Y ); + aPoint = m_pWindow->PixelToLogic( rPoint - aTopLeft, m_aMapMode ); + } + return aPoint; +} + +Size AccessibleViewForwarder::PixelToLogic( const Size& rSize ) const +{ + Size aSize; + if ( m_pWindow ) + { + aSize = m_pWindow->PixelToLogic( rSize, m_aMapMode ); + } + return aSize; +} + +} // namespace chart diff --git a/chart2/source/controller/accessibility/AccessibleViewForwarder.hxx b/chart2/source/controller/accessibility/AccessibleViewForwarder.hxx new file mode 100644 index 000000000..629201a9c --- /dev/null +++ b/chart2/source/controller/accessibility/AccessibleViewForwarder.hxx @@ -0,0 +1,65 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _CHART2_ACCESSIBLEVIEWFORWARDER_HXX_ +#define _CHART2_ACCESSIBLEVIEWFORWARDER_HXX_ + +#include <vcl/mapmod.hxx> +#include <svx/IAccessibleViewForwarder.hxx> + +class Window; + +namespace chart +{ + +class AccessibleChartView; + +class AccessibleViewForwarder : public ::accessibility::IAccessibleViewForwarder +{ +public: + AccessibleViewForwarder( AccessibleChartView* pAccChartView, Window* pWindow ); + virtual ~AccessibleViewForwarder(); + + // ________ IAccessibleViewforwarder ________ + virtual BOOL IsValid() const; + virtual Rectangle GetVisibleArea() const; + virtual Point LogicToPixel( const Point& rPoint ) const; + virtual Size LogicToPixel( const Size& rSize ) const; + virtual Point PixelToLogic( const Point& rPoint ) const; + virtual Size PixelToLogic( const Size& rSize ) const; + +private: + AccessibleViewForwarder( AccessibleViewForwarder& ); + AccessibleViewForwarder& operator=( AccessibleViewForwarder& ); + + AccessibleChartView* m_pAccChartView; + Window* m_pWindow; + MapMode m_aMapMode; +}; + +} // namespace chart + +#endif diff --git a/chart2/source/controller/accessibility/ChartElementFactory.cxx b/chart2/source/controller/accessibility/ChartElementFactory.cxx index c87f9477a..1c5989663 100644 --- a/chart2/source/controller/accessibility/ChartElementFactory.cxx +++ b/chart2/source/controller/accessibility/ChartElementFactory.cxx @@ -30,7 +30,6 @@ #include "ChartElementFactory.hxx" #include "ObjectIdentifier.hxx" - #include "AccessibleChartElement.hxx" namespace chart @@ -38,8 +37,8 @@ namespace chart AccessibleBase* ChartElementFactory::CreateChartElement( const AccessibleElementInfo& rAccInfo ) { - ObjectType eType( - ObjectIdentifier::getObjectType( rAccInfo.m_aCID )); + ObjectIdentifier aOID( rAccInfo.m_aOID ); + ObjectType eType( aOID.getObjectType() ); switch( eType ) { @@ -72,6 +71,8 @@ AccessibleBase* ChartElementFactory::CreateChartElement( const AccessibleElement return new AccessibleChartElement( rAccInfo, true, false ); case OBJECTTYPE_UNKNOWN: break; + default: + break; } return 0; diff --git a/chart2/source/controller/accessibility/makefile.mk b/chart2/source/controller/accessibility/makefile.mk index e79019ba8..44c816d90 100644 --- a/chart2/source/controller/accessibility/makefile.mk +++ b/chart2/source/controller/accessibility/makefile.mk @@ -44,7 +44,9 @@ SLOFILES= $(SLO)$/AccessibleChartView.obj \ $(SLO)$/ChartElementFactory.obj \ $(SLO)$/AccessibleBase.obj \ $(SLO)$/AccessibleChartElement.obj \ - $(SLO)$/AccessibleTextHelper.obj + $(SLO)$/AccessibleChartShape.obj \ + $(SLO)$/AccessibleTextHelper.obj \ + $(SLO)$/AccessibleViewForwarder.obj # --- Targets ----------------------------------------------------------------- diff --git a/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx b/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx index f4f641b62..b4c0251d6 100644 --- a/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx +++ b/chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx @@ -54,6 +54,7 @@ #include "WrappedAddInProperty.hxx" #include "WrappedIgnoreProperty.hxx" #include "ChartRenderer.hxx" +#include "UndoManager.hxx" #include <com/sun/star/chart2/XTitled.hpp> #include <com/sun/star/chart2/data/XDataReceiver.hpp> #include <com/sun/star/chart/ChartDataRowSource.hpp> @@ -1489,6 +1490,12 @@ uno::Reference< uno::XInterface > SAL_CALL ChartDocumentWrapper::createInstance( xResult.set( m_xChartView ); bServiceFound = true; } + else if ( aServiceSpecifier.equals( CHART_UNDOMANAGER_SERVICE_NAME ) ) + { + Reference< chart2::XUndoManager > xUndoManager( new UndoManager() ); + xResult.set( xUndoManager ); + bServiceFound = true; + } else { // try to create a shape diff --git a/chart2/source/controller/dialogs/ResourceIds.hrc b/chart2/source/controller/dialogs/ResourceIds.hrc index 921fd827c..4e6f01595 100644 --- a/chart2/source/controller/dialogs/ResourceIds.hrc +++ b/chart2/source/controller/dialogs/ResourceIds.hrc @@ -48,6 +48,8 @@ #define DLG_SPLINE_PROPERTIES 904 #define DLG_DATA_TRENDLINE 841 #define DLG_DATA_YERRORBAR 842 +#define DLG_SHAPE_FONT 921 +#define DLG_SHAPE_PARAGRAPH 922 //----------------------------------------------------------------------------- //TabPage Ids: diff --git a/chart2/source/controller/dialogs/Strings.src b/chart2/source/controller/dialogs/Strings.src index 5ae1c3859..6b684d023 100644 --- a/chart2/source/controller/dialogs/Strings.src +++ b/chart2/source/controller/dialogs/Strings.src @@ -348,6 +348,11 @@ String STR_OBJECT_DIAGRAM_FLOOR Text [ en-US ] = "Chart Floor" ; }; +String STR_OBJECT_SHAPE +{ + Text [ en-US ] = "Drawing Object" ; +}; + //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- diff --git a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx index 0b01380e7..167d6e62a 100644 --- a/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx +++ b/chart2/source/controller/dialogs/dlg_ObjectProperties.cxx @@ -488,6 +488,8 @@ SchAttribTabDlg::SchAttribTabDlg(Window* pParent, SchAlignmentTabPage::CreateWithoutRotation can be deleted. */ AddTabPage(TP_ALIGNMENT, String(SchResId(STR_PAGE_ALIGNMENT)), SchAlignmentTabPage::CreateWithoutRotation, NULL); break; + default: + break; } // used to find out if user left the dialog with OK. When OK is pressed but diff --git a/chart2/source/controller/dialogs/dlg_ShapeFont.cxx b/chart2/source/controller/dialogs/dlg_ShapeFont.cxx new file mode 100644 index 000000000..dfae2910b --- /dev/null +++ b/chart2/source/controller/dialogs/dlg_ShapeFont.cxx @@ -0,0 +1,92 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "dlg_ShapeFont.hxx" +#include "ViewElementListProvider.hxx" +#include "ResId.hxx" +#include "ResourceIds.hrc" + +#include <svl/intitem.hxx> +#include <sfx2/objsh.hxx> +#include <svx/dialogs.hrc> +#include <svx/flagsdef.hxx> +#include <editeng/flstitem.hxx> + +using ::com::sun::star::uno::Reference; +using namespace ::com::sun::star; + +//............................................................................. +namespace chart +{ +//............................................................................. + +ShapeFontDialog::ShapeFontDialog( Window* pParent, const SfxItemSet* pAttr, + const ViewElementListProvider* pViewElementListProvider ) + :SfxTabDialog( pParent, SchResId( DLG_SHAPE_FONT ), pAttr ) + ,m_pViewElementListProvider( pViewElementListProvider ) +{ + FreeResource(); + + AddTabPage( RID_SVXPAGE_CHAR_NAME ); + AddTabPage( RID_SVXPAGE_CHAR_EFFECTS ); + AddTabPage( RID_SVXPAGE_CHAR_POSITION ); +} + +ShapeFontDialog::~ShapeFontDialog() +{ +} + +void ShapeFontDialog::PageCreated( USHORT nId, SfxTabPage& rPage ) +{ + SfxAllItemSet aSet( *( GetInputSetImpl()->GetPool() ) ); + switch ( nId ) + { + case RID_SVXPAGE_CHAR_NAME: + { + aSet.Put( SvxFontListItem( m_pViewElementListProvider->getFontList(), SID_ATTR_CHAR_FONTLIST ) ); + rPage.PageCreated( aSet ); + } + break; + case RID_SVXPAGE_CHAR_EFFECTS: + { + aSet.Put( SfxUInt16Item( SID_DISABLE_CTL, DISABLE_CASEMAP ) ); + rPage.PageCreated( aSet ); + } + break; + default: + { + } + break; + } +} + +//............................................................................. +} //namespace chart +//............................................................................. diff --git a/chart2/source/controller/dialogs/dlg_ShapeFont.src b/chart2/source/controller/dialogs/dlg_ShapeFont.src new file mode 100644 index 000000000..92466c496 --- /dev/null +++ b/chart2/source/controller/dialogs/dlg_ShapeFont.src @@ -0,0 +1,62 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include "ResourceIds.hrc" +#include <svx/dialogs.hrc> + +TabDialog DLG_SHAPE_FONT +{ + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 289 , 176 ) ; + Text [ en-US ] = "Character" ; + Moveable = TRUE ; + Closeable = TRUE ; + TabControl 1 + { + OutputSize = TRUE ; + Pos = MAP_APPFONT ( 3 , 3 ) ; + Size = MAP_APPFONT ( 260 , 135 ) ; + PageList = + { + PageItem + { + Identifier = RID_SVXPAGE_CHAR_NAME ; + Text [ en-US ] = "Font"; + }; + PageItem + { + Identifier = RID_SVXPAGE_CHAR_EFFECTS ; + Text [ en-US ] = "Font Effects"; + }; + PageItem + { + Identifier = RID_SVXPAGE_CHAR_POSITION ; + Text [ en-US ] = "Font Position"; + }; + }; + }; +}; diff --git a/chart2/source/controller/dialogs/dlg_ShapeParagraph.cxx b/chart2/source/controller/dialogs/dlg_ShapeParagraph.cxx new file mode 100644 index 000000000..ea464743b --- /dev/null +++ b/chart2/source/controller/dialogs/dlg_ShapeParagraph.cxx @@ -0,0 +1,93 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "dlg_ShapeParagraph.hxx" +#include "ResId.hxx" +#include "ResourceIds.hrc" + +#include <svl/cjkoptions.hxx> +#include <svl/intitem.hxx> +#include <svx/dialogs.hrc> +#include <svx/flagsdef.hxx> + +using ::com::sun::star::uno::Reference; +using namespace ::com::sun::star; + +//............................................................................. +namespace chart +{ +//............................................................................. + +ShapeParagraphDialog::ShapeParagraphDialog( Window* pParent, const SfxItemSet* pAttr ) + :SfxTabDialog( pParent, SchResId( DLG_SHAPE_PARAGRAPH ), pAttr ) +{ + FreeResource(); + + SvtCJKOptions aCJKOptions; + + AddTabPage( RID_SVXPAGE_STD_PARAGRAPH ); + AddTabPage( RID_SVXPAGE_ALIGN_PARAGRAPH ); + if ( aCJKOptions.IsAsianTypographyEnabled() ) + { + AddTabPage( RID_SVXPAGE_PARA_ASIAN ); + } + else + { + RemoveTabPage( RID_SVXPAGE_PARA_ASIAN ); + } + AddTabPage( RID_SVXPAGE_TABULATOR ); +} + +ShapeParagraphDialog::~ShapeParagraphDialog() +{ +} + +void ShapeParagraphDialog::PageCreated( USHORT nId, SfxTabPage& rPage ) +{ + SfxAllItemSet aSet( *( GetInputSetImpl()->GetPool() ) ); + switch ( nId ) + { + case RID_SVXPAGE_TABULATOR: + { + aSet.Put( SfxUInt16Item( SID_SVXTABULATORTABPAGE_CONTROLFLAGS, + ( TABTYPE_ALL &~TABTYPE_LEFT ) | ( TABFILL_ALL &~TABFILL_NONE ) ) ); + rPage.PageCreated( aSet ); + } + break; + default: + { + } + break; + } +} + +//............................................................................. +} //namespace chart +//............................................................................. diff --git a/chart2/source/controller/dialogs/dlg_ShapeParagraph.src b/chart2/source/controller/dialogs/dlg_ShapeParagraph.src new file mode 100644 index 000000000..be50398dd --- /dev/null +++ b/chart2/source/controller/dialogs/dlg_ShapeParagraph.src @@ -0,0 +1,67 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include "ResourceIds.hrc" +#include <svx/dialogs.hrc> + +TabDialog DLG_SHAPE_PARAGRAPH +{ + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 289 , 176 ) ; + Text [ en-US ] = "Paragraph" ; + Moveable = TRUE ; + Closeable = TRUE ; + TabControl 1 + { + OutputSize = TRUE ; + Pos = MAP_APPFONT ( 3 , 3 ) ; + Size = MAP_APPFONT ( 260 , 135 ) ; + PageList = + { + PageItem + { + Identifier = RID_SVXPAGE_STD_PARAGRAPH ; + Text [ en-US ] = "Indents & Spacing"; + }; + PageItem + { + Identifier = RID_SVXPAGE_ALIGN_PARAGRAPH ; + Text [ en-US ] = "Alignment"; + }; + PageItem + { + Identifier = RID_SVXPAGE_PARA_ASIAN ; + Text [ en-US ] = "Asian Typography"; + }; + PageItem + { + Identifier = RID_SVXPAGE_TABULATOR ; + Text [ en-US ] = "Tab"; + }; + }; + }; +}; diff --git a/chart2/source/controller/dialogs/makefile.mk b/chart2/source/controller/dialogs/makefile.mk index 955c1764b..d22f5c83b 100644 --- a/chart2/source/controller/dialogs/makefile.mk +++ b/chart2/source/controller/dialogs/makefile.mk @@ -98,6 +98,8 @@ SLOFILES= \ $(SLO)$/dlg_ChartType_UNO.obj \ $(SLO)$/dlg_ChartType.obj \ $(SLO)$/dlg_NumberFormat.obj \ + $(SLO)$/dlg_ShapeFont.obj \ + $(SLO)$/dlg_ShapeParagraph.obj \ $(SLO)$/RangeSelectionButton.obj \ $(SLO)$/RangeSelectionHelper.obj \ $(SLO)$/RangeSelectionListener.obj \ @@ -150,7 +152,9 @@ SRC1FILES= \ dlg_InsertErrorBars.src \ dlg_InsertTitle.src \ dlg_ChartType.src \ - dlg_CreationWizard.src + dlg_CreationWizard.src \ + dlg_ShapeFont.src \ + dlg_ShapeParagraph.src SRS1NAME=$(TARGET) diff --git a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx index 6332fcada..ae5650971 100644 --- a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx +++ b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx @@ -31,6 +31,8 @@ #include "chartview/DrawModelWrapper.hxx" #include "ConfigurationAccess.hxx" +#include <unotools/lingucfg.hxx> +#include <editeng/langitem.hxx> // header for class SdrPage #include <svx/svdpage.hxx> //header for class SdrPageView @@ -51,6 +53,7 @@ // header for class SvxShape #include <svx/unoshape.hxx> +#include <editeng/fhgtitem.hxx> #include <com/sun/star/container/XChild.hpp> #include <com/sun/star/lang/XUnoTunnel.hpp> @@ -162,6 +165,24 @@ DrawViewWrapper::DrawViewWrapper( SdrModel* pSdrModel, OutputDevice* pOut, bool SetPagePaintingAllowed(bPaintPageForEditMode); + // #i12587# support for shapes in chart + SdrOutliner* pOutliner = getOutliner(); + SfxItemPool* pOutlinerPool = ( pOutliner ? pOutliner->GetEditTextObjectPool() : NULL ); + if ( pOutlinerPool ) + { + SvtLinguConfig aLinguConfig; + SvtLinguOptions aLinguOptions; + if ( aLinguConfig.GetOptions( aLinguOptions ) ) + { + pOutlinerPool->SetPoolDefaultItem( SvxLanguageItem( aLinguOptions.nDefaultLanguage, EE_CHAR_LANGUAGE ) ); + pOutlinerPool->SetPoolDefaultItem( SvxLanguageItem( aLinguOptions.nDefaultLanguage_CJK, EE_CHAR_LANGUAGE_CJK ) ); + pOutlinerPool->SetPoolDefaultItem( SvxLanguageItem( aLinguOptions.nDefaultLanguage_CTL, EE_CHAR_LANGUAGE_CTL ) ); + } + + // set font height without changing SdrEngineDefaults + pOutlinerPool->SetPoolDefaultItem( SvxFontHeightItem( 423, 100, EE_CHAR_FONTHEIGHT ) ); // 12pt + } + ReInit(); } diff --git a/chart2/source/controller/inc/AccessibleBase.hxx b/chart2/source/controller/inc/AccessibleBase.hxx index 94ad7c73b..78d9141d2 100644 --- a/chart2/source/controller/inc/AccessibleBase.hxx +++ b/chart2/source/controller/inc/AccessibleBase.hxx @@ -27,6 +27,8 @@ #ifndef _CHART2_ACCESSIBLEBASE_HXX_ #define _CHART2_ACCESSIBLEBASE_HXX_ +#include "ObjectIdentifier.hxx" + #include <com/sun/star/chart2/XChartDocument.hpp> #include <com/sun/star/accessibility/XAccessible.hpp> #include <com/sun/star/accessibility/XAccessibleContext.hpp> @@ -50,6 +52,12 @@ class SfxItemSet; class SdrObject; +class SdrView; + +namespace accessibility +{ +class IAccessibleViewForwarder; +} namespace chart { @@ -57,11 +65,11 @@ namespace chart class AccessibleBase; class ObjectHierarchy; -typedef rtl::OUString AccessibleUniqueId; +typedef ObjectIdentifier AccessibleUniqueId; struct AccessibleElementInfo { - AccessibleUniqueId m_aCID; + AccessibleUniqueId m_aOID; ::com::sun::star::uno::WeakReference< ::com::sun::star::chart2::XChartDocument > m_xChartDocument; @@ -75,6 +83,8 @@ struct AccessibleElementInfo ::boost::shared_ptr< ObjectHierarchy > m_spObjectHierarchy; AccessibleBase * m_pParent; + SdrView* m_pSdrView; + ::accessibility::IAccessibleViewForwarder* m_pViewForwarder; }; @@ -173,7 +183,7 @@ protected: greater than the index of the removed element get an index one less than before. */ - void RemoveChildById( const ::rtl::OUString & rId ); + void RemoveChildByOId( const ObjectIdentifier& rOId ); /** Retrieve the pixel coordinates of logical coordinates (0,0) of the current logic coordinate system. This can be used for @@ -325,14 +335,14 @@ private: /** type of the hash containing a vector index for every AccessibleUniqueId of the object in the child list */ - typedef ::std::map< ::rtl::OUString, tAccessible > ChildCIDMap; + typedef ::std::map< ObjectIdentifier, tAccessible > ChildOIDMap; bool m_bIsDisposed; const bool m_bMayHaveChildren; bool m_bChildrenInitialized; ChildListVectorType m_aChildList; - ChildCIDMap m_aChildCIDMap; + ChildOIDMap m_aChildOIDMap; ::comphelper::AccessibleEventNotifier::TClientId m_nEventNotifierId; diff --git a/chart2/source/controller/inc/AccessibleChartView.hxx b/chart2/source/controller/inc/AccessibleChartView.hxx index 9265236ef..a0197dbf0 100644 --- a/chart2/source/controller/inc/AccessibleChartView.hxx +++ b/chart2/source/controller/inc/AccessibleChartView.hxx @@ -44,13 +44,17 @@ #include <boost/shared_ptr.hpp> +namespace accessibility +{ +class IAccessibleViewForwarder; +} + //............................................................................. namespace chart { //............................................................................. class ExplicitValueProvider; -class ObjectHierarchy; namespace impl { @@ -67,14 +71,9 @@ class AccessibleChartView : public: AccessibleChartView( const ::com::sun::star::uno::Reference< - ::com::sun::star::uno::XComponentContext > & xContext ); + ::com::sun::star::uno::XComponentContext >& xContext, SdrView* pView ); virtual ~AccessibleChartView(); - // ____ lang::XServiceInfo ____ - APPHELPER_XSERVICEINFO_DECL() - APPHELPER_SERVICE_FACTORY_HELPER( AccessibleChartView ) - -protected: // ____ WeakComponentHelper (called from XComponent::dispose()) ____ virtual void SAL_CALL disposing(); @@ -112,6 +111,7 @@ protected: virtual ::com::sun::star::awt::Rectangle SAL_CALL getBounds() throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::awt::Point SAL_CALL getLocationOnScreen() throw (::com::sun::star::uno::RuntimeException); +protected: // ________ AccessibleChartElement ________ virtual ::com::sun::star::awt::Point GetUpperLeftOnScreen() const; @@ -141,7 +141,9 @@ private: // members ::com::sun::star::accessibility::XAccessible > m_xParent; ::boost::shared_ptr< ObjectHierarchy > m_spObjectHierarchy; - AccessibleUniqueId m_aCurrentSelectionCID; + AccessibleUniqueId m_aCurrentSelectionOID; + SdrView* m_pSdrView; + ::accessibility::IAccessibleViewForwarder* m_pViewForwarder; //no default constructor AccessibleChartView(); diff --git a/chart2/source/controller/inc/MenuResIds.hrc b/chart2/source/controller/inc/MenuResIds.hrc new file mode 100644 index 000000000..6c899fc78 --- /dev/null +++ b/chart2/source/controller/inc/MenuResIds.hrc @@ -0,0 +1,41 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART_MENURESIDS_HRC +#define CHART_MENURESIDS_HRC + +#ifndef _SOLAR_HRC +#include <svl/solar.hrc> +#endif + +//----------------------------------------------------------------------------- +// context menus + +#define RID_CONTEXTMENU_SHAPE (RID_APP_START + 1) +#define RID_CONTEXTMENU_SHAPEEDIT (RID_APP_START + 2) + +// CHART_MENURESIDS_HRC +#endif diff --git a/chart2/source/controller/inc/ObjectHierarchy.hxx b/chart2/source/controller/inc/ObjectHierarchy.hxx index cf2750481..8c52321ad 100644 --- a/chart2/source/controller/inc/ObjectHierarchy.hxx +++ b/chart2/source/controller/inc/ObjectHierarchy.hxx @@ -27,6 +27,8 @@ #ifndef CHART2_OBJECTHIERARCHY_HXX #define CHART2_OBJECTHIERARCHY_HXX +#include "ObjectIdentifier.hxx" + #include <rtl/ustring.hxx> #include <com/sun/star/chart2/XChartDocument.hpp> #include <com/sun/star/awt/KeyEvent.hpp> @@ -47,8 +49,8 @@ class ImplObjectHierarchy; class ObjectHierarchy { public: - typedef ::rtl::OUString tCID; - typedef ::std::vector< tCID > tChildContainer; + typedef ObjectIdentifier tOID; + typedef ::std::vector< tOID > tChildContainer; /** @param bFlattenDiagram If <TRUE/>, the content of the diaram (data series, wall, floor, @@ -63,20 +65,20 @@ public: bool bOrderingForElementSelector = false ); ~ObjectHierarchy(); - static tCID getRootNodeCID(); - static bool isRootNode( const tCID & rCID ); + static tOID getRootNodeOID(); + static bool isRootNode( const tOID& rOID ); - /// equal to getChildren( getRootNodeCID()) + /// equal to getChildren( getRootNodeOID()) tChildContainer getTopLevelChildren() const; - bool hasChildren( const tCID & rParent ) const; - tChildContainer getChildren( const tCID & rParent ) const; + bool hasChildren( const tOID& rParent ) const; + tChildContainer getChildren( const tOID& rParent ) const; - tChildContainer getSiblings( const tCID & rNode ) const; + tChildContainer getSiblings( const tOID& rNode ) const; /// The result is empty, if the node cannot be found in the tree - tCID getParent( const tCID & rNode ) const; + tOID getParent( const tOID& rNode ) const; /// @returns -1, if no parent can be determined - sal_Int32 getIndexInParent( const tCID & rNode ) const; + sal_Int32 getIndexInParent( const tOID& rNode ) const; private: @@ -86,16 +88,16 @@ private: class ObjectKeyNavigation { public: - explicit ObjectKeyNavigation( const ObjectHierarchy::tCID & rCurrentCID, + explicit ObjectKeyNavigation( const ObjectHierarchy::tOID & rCurrentOID, const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > & xChartDocument, ExplicitValueProvider * pExplicitValueProvider = 0 ); bool handleKeyEvent( const ::com::sun::star::awt::KeyEvent & rEvent ); - ObjectHierarchy::tCID getCurrentSelection() const; + ObjectHierarchy::tOID getCurrentSelection() const; private: - void setCurrentSelection( const ObjectHierarchy::tCID & rCID ); + void setCurrentSelection( const ObjectHierarchy::tOID& rOID ); bool first(); bool last(); bool next(); @@ -105,7 +107,7 @@ private: bool veryFirst(); bool veryLast(); - ObjectHierarchy::tCID m_aCurrentCID; + ObjectHierarchy::tOID m_aCurrentOID; ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > m_xChartDocument; ExplicitValueProvider * m_pExplicitValueProvider; diff --git a/chart2/source/controller/inc/ShapeController.hrc b/chart2/source/controller/inc/ShapeController.hrc new file mode 100644 index 000000000..baaf28d18 --- /dev/null +++ b/chart2/source/controller/inc/ShapeController.hrc @@ -0,0 +1,50 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART_SHAPECONTROLLER_HRC +#define CHART_SHAPECONTROLLER_HRC + +//----------------------------------------------------------------------------- +//Command Ids: +#define COMMAND_ID_FORMAT_LINE 1 +#define COMMAND_ID_FORMAT_AREA 2 +#define COMMAND_ID_TEXT_ATTRIBUTES 3 +#define COMMAND_ID_TRANSFORM_DIALOG 4 +#define COMMAND_ID_OBJECT_TITLE_DESCRIPTION 5 +#define COMMAND_ID_RENAME_OBJECT 6 +#define COMMAND_ID_ARRANGE_ROW 7 +#define COMMAND_ID_BRING_TO_FRONT 8 +#define COMMAND_ID_FORWARD 9 +#define COMMAND_ID_BACKWARD 10 +#define COMMAND_ID_SEND_TO_BACK 11 +#define COMMAND_ID_CUT 12 +#define COMMAND_ID_COPY 13 +#define COMMAND_ID_PASTE 14 +#define COMMAND_ID_FONT_DIALOG 15 +#define COMMAND_ID_PARAGRAPH_DIALOG 16 + +// CHART_SHAPECONTROLLER_HRC +#endif diff --git a/chart2/source/controller/inc/dlg_ShapeFont.hxx b/chart2/source/controller/inc/dlg_ShapeFont.hxx new file mode 100644 index 000000000..c576d82cf --- /dev/null +++ b/chart2/source/controller/inc/dlg_ShapeFont.hxx @@ -0,0 +1,59 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART2_DLG_SHAPEFONT_HXX +#define CHART2_DLG_SHAPEFONT_HXX + +#include <sfx2/tabdlg.hxx> + +//............................................................................. +namespace chart +{ +//............................................................................. + +class ViewElementListProvider; + +/** dialog for font properties of shapes + */ +class ShapeFontDialog : public SfxTabDialog +{ +public: + ShapeFontDialog( Window* pParent, const SfxItemSet* pAttr, + const ViewElementListProvider* pViewElementListProvider ); + virtual ~ShapeFontDialog(); + +private: + virtual void PageCreated( USHORT nId, SfxTabPage& rPage ); + + const ViewElementListProvider* m_pViewElementListProvider; +}; + +//............................................................................. +} // namespace chart +//............................................................................. + +// CHART2_DLG_SHAPEFONT_HXX +#endif diff --git a/chart2/source/controller/inc/dlg_ShapeParagraph.hxx b/chart2/source/controller/inc/dlg_ShapeParagraph.hxx new file mode 100644 index 000000000..c326e1cb9 --- /dev/null +++ b/chart2/source/controller/inc/dlg_ShapeParagraph.hxx @@ -0,0 +1,54 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART2_DLG_SHAPEPARAGRAPH_HXX +#define CHART2_DLG_SHAPEPARAGRAPH_HXX + +#include <sfx2/tabdlg.hxx> + +//............................................................................. +namespace chart +{ +//............................................................................. + +/** dialog for paragraph properties of shapes + */ +class ShapeParagraphDialog : public SfxTabDialog +{ +public: + ShapeParagraphDialog( Window* pParent, const SfxItemSet* pAttr ); + virtual ~ShapeParagraphDialog(); + +private: + virtual void PageCreated( USHORT nId, SfxTabPage& rPage ); +}; + +//............................................................................. +} // namespace chart +//............................................................................. + +// CHART2_DLG_SHAPEPARAGRAPH_HXX +#endif diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx index 48c5fec47..26f2a1c8f 100644 --- a/chart2/source/controller/main/ChartController.cxx +++ b/chart2/source/controller/main/ChartController.cxx @@ -50,6 +50,10 @@ #include "dlg_CreationWizard.hxx" #include "dlg_ChartType.hxx" //#include "svx/ActionDescriptionProvider.hxx" +#include "AccessibleChartView.hxx" +#include "DrawCommandDispatch.hxx" +#include "ShapeController.hxx" +#include "UndoManager.hxx" #include <comphelper/InlineContainer.hxx> @@ -97,6 +101,7 @@ namespace chart //............................................................................. using namespace ::com::sun::star; +using namespace ::com::sun::star::accessibility; using namespace ::com::sun::star::chart2; using ::com::sun::star::uno::Any; using ::com::sun::star::uno::Reference; @@ -124,7 +129,8 @@ ChartController::ChartController(uno::Reference<uno::XComponentContext> const & , m_bWaitingForMouseUp(false) , m_bConnectingToView(false) , m_xUndoManager( 0 ) - , m_aDispatchContainer( m_xCC ) + , m_aDispatchContainer( m_xCC, this ) + , m_eDrawMode( CHARTDRAW_SELECT ) { DBG_CTOR(ChartController,NULL); // m_aDispatchContainer.setUndoManager( m_xUndoManager ); @@ -438,6 +444,11 @@ APPHELPER_XSERVICEINFO_IMPL(ChartController,CHART_CONTROLLER_SERVICE_IMPLEMENTAT //@todo: createElement should become unnecessary, remove when #i79198# is fixed xLayoutManager->createElement( C2U( "private:resource/toolbar/toolbar" ) ); xLayoutManager->requestElement( C2U( "private:resource/toolbar/toolbar" ) ); + + // #i12587# support for shapes in chart + xLayoutManager->createElement( C2U( "private:resource/toolbar/drawbar" ) ); + xLayoutManager->requestElement( C2U( "private:resource/toolbar/drawbar" ) ); + xLayoutManager->requestElement( C2U( "private:resource/statusbar/statusbar" ) ); xLayoutManager->unlock(); @@ -559,13 +570,27 @@ void SAL_CALL ChartController::modeChanged( const util::ModeChangeEvent& rEvent // set new model at dispatchers m_aDispatchContainer.setModel( aNewModelRef->getModel()); - ControllerCommandDispatch * pDispatch = new ControllerCommandDispatch( m_xCC, this ); + ControllerCommandDispatch * pDispatch = new ControllerCommandDispatch( m_xCC, this, &m_aDispatchContainer ); pDispatch->initialize(); // the dispatch container will return "this" for all commands returned by // impl_getAvailableCommands(). That means, for those commands dispatch() // is called here at the ChartController. - m_aDispatchContainer.setFallbackDispatch( pDispatch, impl_getAvailableCommands() ); + m_aDispatchContainer.setChartDispatch( pDispatch, impl_getAvailableCommands() ); + + DrawCommandDispatch* pDrawDispatch = new DrawCommandDispatch( m_xCC, this ); + if ( pDrawDispatch ) + { + pDrawDispatch->initialize(); + m_aDispatchContainer.setDrawCommandDispatch( pDrawDispatch ); + } + + ShapeController* pShapeController = new ShapeController( m_xCC, this ); + if ( pShapeController ) + { + pShapeController->initialize(); + m_aDispatchContainer.setShapeController( pShapeController ); + } #ifdef TEST_ENABLE_MODIFY_LISTENER uno::Reference< util::XModifyBroadcaster > xMBroadcaster( aNewModelRef->getModel(),uno::UNO_QUERY ); @@ -1061,7 +1086,7 @@ bool lcl_isFormatObjectCommand( const rtl::OString& aCommand ) void SAL_CALL ChartController ::dispatch( const util::URL& rURL - , const uno::Sequence< beans::PropertyValue >& /* rArgs */ ) + , const uno::Sequence< beans::PropertyValue >& rArgs ) throw (uno::RuntimeException) { //@todo avoid OString (see Mathias mail on bug #104387#) @@ -1161,7 +1186,16 @@ bool lcl_isFormatObjectCommand( const rtl::OString& aCommand ) else if( aCommand.equals("FormatSelection") ) this->executeDispatch_ObjectProperties(); else if( aCommand.equals("TransformDialog")) - this->executeDispatch_PositionAndSize(); + { + if ( isShapeContext() ) + { + this->impl_ShapeControllerDispatch( rURL, rArgs ); + } + else + { + this->executeDispatch_PositionAndSize(); + } + } else if( lcl_isFormatObjectCommand(aCommand) ) this->executeDispatch_FormatObject(rURL.Path); //more format @@ -1171,10 +1205,28 @@ bool lcl_isFormatObjectCommand( const rtl::OString& aCommand ) this->executeDispatch_ChartType(); else if( aCommand.equals("View3D")) this->executeDispatch_View3D(); - else if( aCommand.equals("Forward")) - this->executeDispatch_MoveSeries( sal_True ); - else if( aCommand.equals("Backward")) - this->executeDispatch_MoveSeries( sal_False ); + else if ( aCommand.equals( "Forward" ) ) + { + if ( isShapeContext() ) + { + this->impl_ShapeControllerDispatch( rURL, rArgs ); + } + else + { + this->executeDispatch_MoveSeries( sal_True ); + } + } + else if ( aCommand.equals( "Backward" ) ) + { + if ( isShapeContext() ) + { + this->impl_ShapeControllerDispatch( rURL, rArgs ); + } + else + { + this->executeDispatch_MoveSeries( sal_False ); + } + } else if( aCommand.equals("NewArrangement")) this->executeDispatch_NewArrangement(); else if( aCommand.equals("ToggleLegend")) @@ -1390,6 +1442,20 @@ void SAL_CALL ChartController::modified( const lang::EventObject& /* aEvent */ ) //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- +IMPL_LINK( ChartController, NotifyUndoActionHdl, SdrUndoAction*, pUndoAction ) +{ + ::rtl::OUString aObjectCID = m_aSelection.getSelectedCID(); + if ( aObjectCID.getLength() == 0 ) + { + UndoManager* pUndoManager = UndoManager::getImplementation( m_xUndoManager ); + if ( pUndoManager ) + { + pUndoManager->addShapeUndoAction( pUndoAction ); + } + } + return 0L; +} + DrawModelWrapper* ChartController::GetDrawModelWrapper() { if( !m_pDrawModelWrapper.get() ) @@ -1397,16 +1463,26 @@ DrawModelWrapper* ChartController::GetDrawModelWrapper() ExplicitValueProvider* pProvider = ExplicitValueProvider::getExplicitValueProvider( m_xChartView ); if( pProvider ) m_pDrawModelWrapper = pProvider->getDrawModelWrapper(); + if ( m_pDrawModelWrapper.get() ) + { + m_pDrawModelWrapper->getSdrModel().SetNotifyUndoActionHdl( LINK( this, ChartController, NotifyUndoActionHdl ) ); + } } return m_pDrawModelWrapper.get(); } -uno::Reference< accessibility::XAccessible > ChartController::CreateAccessible() +DrawViewWrapper* ChartController::GetDrawViewWrapper() { - uno::Reference< accessibility::XAccessible > xResult( - m_xCC->getServiceManager()->createInstanceWithContext( - CHART2_ACCESSIBLE_SERVICE_NAME, m_xCC ), uno::UNO_QUERY ); + if ( !m_pDrawViewWrapper ) + { + impl_createDrawViewController(); + } + return m_pDrawViewWrapper; +} +uno::Reference< XAccessible > ChartController::CreateAccessible() +{ + uno::Reference< XAccessible > xResult = new AccessibleChartView( m_xCC, GetDrawViewWrapper() ); impl_initializeAccessible( uno::Reference< lang::XInitialization >( xResult, uno::UNO_QUERY ) ); return xResult; } @@ -1438,7 +1514,7 @@ void ChartController::impl_initializeAccessible( const uno::Reference< lang::XIn uno::Reference<frame::XModel> xModel(m_aModel->getModel()); aArguments[1]=uno::makeAny(xModel); aArguments[2]=uno::makeAny(m_xChartView); - uno::Reference< accessibility::XAccessible > xParent; + uno::Reference< XAccessible > xParent; if( m_pChartWindow ) { Window* pParentWin( m_pChartWindow->GetAccessibleParentWindow()); diff --git a/chart2/source/controller/main/ChartController.hxx b/chart2/source/controller/main/ChartController.hxx index 78c5c83d8..a85732bf2 100644 --- a/chart2/source/controller/main/ChartController.hxx +++ b/chart2/source/controller/main/ChartController.hxx @@ -57,6 +57,7 @@ #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/util/XModifyListener.hpp> #include <com/sun/star/util/XModeChangeListener.hpp> +#include <com/sun/star/awt/Point.hpp> #include <com/sun/star/awt/Size.hpp> #include <com/sun/star/util/XURLTransformer.hpp> #include <com/sun/star/frame/XLayoutManagerListener.hpp> @@ -88,6 +89,8 @@ namespace chart { //............................................................................. +enum ChartDrawMode { CHARTDRAW_INSERT, CHARTDRAW_SELECT }; + class WindowController { public: @@ -155,6 +158,9 @@ class ChartController : public ::cppu::WeakImplHelper12 < > , public WindowController { + friend class DrawCommandDispatch; + friend class ShapeController; + public: //no default constructor ChartController(::com::sun::star::uno::Reference< @@ -463,6 +469,13 @@ public: static bool isObjectDeleteable( const ::com::sun::star::uno::Any& rSelection ); + void setDrawMode( ChartDrawMode eMode ) { m_eDrawMode = eMode; } + ChartDrawMode getDrawMode() const { return m_eDrawMode; } + + bool isShapeContext() const; + + DECL_LINK( NotifyUndoActionHdl, SdrUndoAction* ); + public: //----------------------------------------------------------------- //----------------------------------------------------------------- @@ -477,6 +490,7 @@ public: private: DrawModelWrapper* GetDrawModelWrapper(); + DrawViewWrapper* GetDrawViewWrapper(); private: class TheModelRef; @@ -577,6 +591,8 @@ private: ::com::sun::star::frame::XLayoutManagerEventBroadcaster > m_xLayoutManagerEventBroadcaster; + ChartDrawMode m_eDrawMode; + private: //private methods @@ -637,11 +653,11 @@ private: void executeDispatch_DeleteMinorGrid(); void SAL_CALL executeDispatch_InsertSpecialCharacter(); - void SAL_CALL executeDispatch_EditText(); + void SAL_CALL executeDispatch_EditText( const Point* pMousePixel = NULL ); void SAL_CALL executeDispatch_SourceData(); void SAL_CALL executeDispatch_MoveSeries( sal_Bool bForward ); - void StartTextEdit(); + void StartTextEdit( const Point* pMousePixel = NULL ); bool EndTextEdit(); void SAL_CALL executeDispatch_View3D(); @@ -659,9 +675,12 @@ private: void executeDispatch_ToggleLegend(); void executeDispatch_ToggleGridHorizontal(); + void impl_ShapeControllerDispatch( const ::com::sun::star::util::URL& rURL, + const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rArgs ); + // DECL_LINK( DoubleClickWaitingHdl, void* ); - void execute_DoubleClick(); + void execute_DoubleClick( const Point* pMousePixel = NULL ); void startDoubleClickWaiting(); void stopDoubleClickWaiting(); @@ -701,6 +720,8 @@ private: void impl_PasteGraphic( ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > & xGraphic, const ::Point & aPosition ); + void impl_PasteShapes( SdrModel* pModel ); + void impl_PasteStringAsTextShape( const ::rtl::OUString& rString, const ::com::sun::star::awt::Point& rPosition ); void impl_SetMousePointer( const MouseEvent & rEvent ); void impl_ClearSelection(); diff --git a/chart2/source/controller/main/ChartController_TextEdit.cxx b/chart2/source/controller/main/ChartController_TextEdit.cxx index 746873a9d..478bfc6d6 100644 --- a/chart2/source/controller/main/ChartController_TextEdit.cxx +++ b/chart2/source/controller/main/ChartController_TextEdit.cxx @@ -64,15 +64,15 @@ using namespace ::com::sun::star; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -void SAL_CALL ChartController::executeDispatch_EditText() +void SAL_CALL ChartController::executeDispatch_EditText( const Point* pMousePixel ) { - this->StartTextEdit(); + this->StartTextEdit( pMousePixel ); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -void ChartController::StartTextEdit() +void ChartController::StartTextEdit( const Point* pMousePixel ) { //the first marked object will be edited @@ -111,6 +111,18 @@ void ChartController::StartTextEdit() */ m_pDrawViewWrapper->SetEditMode(); + // #i12587# support for shapes in chart + if ( pMousePixel ) + { + OutlinerView* pOutlinerView = m_pDrawViewWrapper->GetTextEditOutlinerView(); + if ( pOutlinerView ) + { + MouseEvent aEditEvt( *pMousePixel, 1, MOUSE_SYNTHETIC, MOUSE_LEFT, 0 ); + pOutlinerView->MouseButtonDown( aEditEvt ); + pOutlinerView->MouseButtonUp( aEditEvt ); + } + } + //we invalidate the outliner region because the outliner has some //paint problems (some characters are painted twice a little bit shifted) m_pChartWindow->Invalidate( m_pDrawViewWrapper->GetMarkedObjBoundRect() ); @@ -139,22 +151,38 @@ bool ChartController::EndTextEdit() String aString = pOutliner->GetText( pOutliner->GetParagraph( 0 ), pOutliner->GetParagraphCount() ); - uno::Reference< beans::XPropertySet > xPropSet = - ObjectIdentifier::getObjectPropertySet( m_aSelection.getSelectedCID(), getModel() ); - - // lock controllers till end of block - ControllerLockGuard aCLGuard( m_aModel->getModel()); - //Paragraph* pPara = - TitleHelper::setCompleteString( aString, uno::Reference< - ::com::sun::star::chart2::XTitle >::query( xPropSet ), m_xCC ); - try + ::rtl::OUString aObjectCID = m_aSelection.getSelectedCID(); + if ( aObjectCID.getLength() > 0 ) { - m_xUndoManager->postAction( C2U("Edit Text") ); + uno::Reference< beans::XPropertySet > xPropSet = + ObjectIdentifier::getObjectPropertySet( aObjectCID, getModel() ); + + // lock controllers till end of block + ControllerLockGuard aCLGuard( m_aModel->getModel()); + + TitleHelper::setCompleteString( aString, uno::Reference< + ::com::sun::star::chart2::XTitle >::query( xPropSet ), m_xCC ); + + try + { + m_xUndoManager->postAction( C2U("Edit Text") ); + } + catch( uno::RuntimeException& e) + { + ASSERT_EXCEPTION( e ); + } } - catch( uno::RuntimeException& e) + else { - ASSERT_EXCEPTION( e ); + try + { + m_xUndoManager->cancelAction(); + } + catch ( uno::RuntimeException& e ) + { + ASSERT_EXCEPTION( e ); + } } } return true; diff --git a/chart2/source/controller/main/ChartController_Tools.cxx b/chart2/source/controller/main/ChartController_Tools.cxx index 076bab0ae..436d3b4f8 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 ) { - - Reference< datatransfer::XTransferable > xTransferable; - + DrawModelWrapper* pDrawModelWrapper( this->GetDrawModelWrapper() ); + if ( pDrawModelWrapper && m_pDrawViewWrapper ) { - ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); - SdrObject * pSelectedObj = 0; - if( m_pDrawViewWrapper && m_pDrawModelWrapper ) + Reference< drawing::XDrawPage > xDestPage( pDrawModelWrapper->getMainDrawPage() ); + SdrPage* pDestPage = GetSdrPageFromXDrawPage( xDestPage ); + if ( pDestPage ) { - if( m_aSelection.getSelectedCID().getLength() ) - pSelectedObj = m_pDrawModelWrapper->getNamedSdrObject( m_aSelection.getSelectedCID() ); - else - pSelectedObj = DrawViewWrapper::getSdrObject( m_aSelection.getSelectedAdditionalShape() ); + 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 ); + } + + // select last inserted shape + m_aSelection.setSelection( xSelShape ); + m_aSelection.applySelection( m_pDrawViewWrapper ); + + m_pDrawViewWrapper->EndUndo(); + } + } +} - if( pSelectedObj ) +void ChartController::impl_PasteStringAsTextShape( const OUString& rString, const awt::Point& rPosition ) +{ + DrawModelWrapper* pDrawModelWrapper( this->GetDrawModelWrapper() ); + if ( pDrawModelWrapper && m_pDrawViewWrapper ) + { + const Reference< lang::XMultiServiceFactory >& xShapeFactory( pDrawModelWrapper->getShapeFactory() ); + const Reference< drawing::XDrawPage >& xDrawPage( pDrawModelWrapper->getMainDrawPage() ); + OSL_ASSERT( xShapeFactory.is() && xDrawPage.is() ); + + if ( xShapeFactory.is() && xDrawPage.is() ) + { + 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" ) ) ); + + 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 ) { - xTransferable = Reference< datatransfer::XTransferable >( new ChartTransferable( - & m_pDrawModelWrapper->getSdrModel(), pSelectedObj )); + 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 diff --git a/chart2/source/controller/main/ChartController_Window.cxx b/chart2/source/controller/main/ChartController_Window.cxx index 59407cbd0..c5136f7a1 100644 --- a/chart2/source/controller/main/ChartController_Window.cxx +++ b/chart2/source/controller/main/ChartController_Window.cxx @@ -55,6 +55,8 @@ #include "AxisHelper.hxx" #include "LegendHelper.hxx" #include "servicenames_charttypes.hxx" +#include "MenuResIds.hrc" +#include "DrawCommandDispatch.hxx" #include <com/sun/star/chart2/RelativePosition.hpp> #include <com/sun/star/chart2/RelativeSize.hpp> @@ -623,7 +625,10 @@ void ChartController::execute_MouseButtonDown( const MouseEvent& rMEvt ) if( pDrawViewWrapper->IsTextEdit() ) { - if( pDrawViewWrapper->IsTextEditHit( aMPos, HITPIX) ) + SdrViewEvent aVEvt; + if ( pDrawViewWrapper->IsTextEditHit( aMPos, HITPIX ) || + // #i12587# support for shapes in chart + ( rMEvt.IsRight() && pDrawViewWrapper->PickAnything( rMEvt, SDRMOUSEBUTTONDOWN, aVEvt ) == SDRHIT_MARKEDOBJECT ) ) { pDrawViewWrapper->MouseButtonDown(rMEvt,m_pChartWindow); return; @@ -652,6 +657,39 @@ void ChartController::execute_MouseButtonDown( const MouseEvent& rMEvt ) //only change selection if no selection handles are hit if( !pHitSelectionHdl ) { + // #i12587# support for shapes in chart + if ( m_eDrawMode == CHARTDRAW_INSERT && + ( !pDrawViewWrapper->IsMarkedHit( aMPos ) || !m_aSelection.isDragableObjectSelected() ) ) + { + if ( m_aSelection.hasSelection() ) + { + m_aSelection.clearSelection(); + } + if ( !pDrawViewWrapper->IsAction() ) + { + if ( pDrawViewWrapper->GetCurrentObjIdentifier() == OBJ_CAPTION ) + { + Size aCaptionSize( 2268, 1134 ); + pDrawViewWrapper->BegCreateCaptionObj( aMPos, aCaptionSize ); + } + else + { + pDrawViewWrapper->BegCreateObj( aMPos); + } + SdrObject* pObj = pDrawViewWrapper->GetCreateObj(); + DrawCommandDispatch* pDrawCommandDispatch = m_aDispatchContainer.getDrawCommandDispatch(); + if ( pObj && m_pDrawModelWrapper && pDrawCommandDispatch ) + { + SfxItemSet aSet( m_pDrawModelWrapper->GetItemPool() ); + pDrawCommandDispatch->setAttributes( pObj ); + pDrawCommandDispatch->setLineEnds( aSet ); + pObj->SetMergedItemSet( aSet ); + } + } + impl_SetMousePointer( rMEvt ); + return; + } + m_aSelection.adaptSelectionToNewPos( aMPos, pDrawViewWrapper , rMEvt.IsRight(), m_bWaitingForDoubleClick ); @@ -754,7 +792,38 @@ void ChartController::execute_MouseButtonUp( const MouseEvent& rMEvt ) return; } - if(pDrawViewWrapper->IsDragObj()) + // #i12587# support for shapes in chart + if ( m_eDrawMode == CHARTDRAW_INSERT && pDrawViewWrapper->IsCreateObj() ) + { + pDrawViewWrapper->EndCreateObj( SDRCREATE_FORCEEND ); + if ( pDrawViewWrapper->AreObjectsMarked() ) + { + if ( pDrawViewWrapper->GetCurrentObjIdentifier() == OBJ_TEXT ) + { + executeDispatch_EditText(); + } + else + { + SdrObject* pObj = pDrawViewWrapper->getSelectedObject(); + if ( pObj ) + { + uno::Reference< drawing::XShape > xShape( pObj->getUnoShape(), uno::UNO_QUERY ); + if ( xShape.is() ) + { + m_aSelection.setSelection( xShape ); + m_aSelection.applySelection( pDrawViewWrapper ); + } + } + } + } + else + { + m_aSelection.adaptSelectionToNewPos( aMPos, pDrawViewWrapper, rMEvt.IsRight(), m_bWaitingForDoubleClick ); + m_aSelection.applySelection( pDrawViewWrapper ); + setDrawMode( CHARTDRAW_SELECT ); + } + } + else if ( pDrawViewWrapper->IsDragObj() ) { bool bDraggingDone = false; SdrDragMethod* pDragMethod = pDrawViewWrapper->SdrView::GetDragMethod(); @@ -839,7 +908,11 @@ void ChartController::execute_MouseButtonUp( const MouseEvent& rMEvt ) m_aSelection.resetPossibleSelectionAfterSingleClickWasEnsured(); } else if( isDoubleClick(rMEvt) ) - execute_DoubleClick(); + { + // #i12587# support for shapes in chart + Point aMousePixel = rMEvt.GetPosPixel(); + execute_DoubleClick( &aMousePixel ); + } //@todo ForcePointer(&rMEvt); pWindow->ReleaseMouse(); @@ -854,13 +927,39 @@ void ChartController::execute_MouseButtonUp( const MouseEvent& rMEvt ) impl_notifySelectionChangeListeners(); } -void ChartController::execute_DoubleClick() +void ChartController::execute_DoubleClick( const Point* pMousePixel ) { - ObjectType eObjectType = ObjectIdentifier::getObjectType( m_aSelection.getSelectedCID() ); - if( OBJECTTYPE_TITLE==eObjectType ) - executeDispatch_EditText(); + bool bEditText = false; + if ( m_aSelection.hasSelection() ) + { + ::rtl::OUString aCID( m_aSelection.getSelectedCID() ); + if ( aCID.getLength() ) + { + ObjectType eObjectType = ObjectIdentifier::getObjectType( aCID ); + if ( OBJECTTYPE_TITLE == eObjectType ) + { + bEditText = true; + } + } + else + { + // #i12587# support for shapes in chart + SdrObject* pObj = DrawViewWrapper::getSdrObject( m_aSelection.getSelectedAdditionalShape() ); + if ( pObj && pObj->ISA( SdrTextObj ) ) + { + bEditText = true; + } + } + } + + if ( bEditText ) + { + executeDispatch_EditText( pMousePixel ); + } else + { executeDispatch_ObjectProperties(); + } } void ChartController::execute_Resize() @@ -907,272 +1006,288 @@ void ChartController::execute_Command( const CommandEvent& rCEvt ) if( m_aSelection.isSelectionDifferentFromBeforeMouseDown() ) impl_notifySelectionChangeListeners(); - // todo: the context menu should be specified by an xml file in uiconfig - uno::Reference< awt::XPopupMenu > xPopupMenu( - m_xCC->getServiceManager()->createInstanceWithContext( - C2U("com.sun.star.awt.PopupMenu"), m_xCC ), uno::UNO_QUERY ); - uno::Reference< awt::XMenuExtended > xMenuEx( xPopupMenu, uno::UNO_QUERY ); - if( xPopupMenu.is() && xMenuEx.is()) + if ( isShapeContext() ) { - sal_Int16 nUniqueId = 1; - ObjectType eObjectType = ObjectIdentifier::getObjectType( m_aSelection.getSelectedCID() ); - Reference< XDiagram > xDiagram = ChartModelHelper::findDiagram( m_aModel->getModel() ); + // #i12587# support for shapes in chart + PopupMenu aContextMenu( SchResId( m_pDrawViewWrapper->IsTextEdit() ? + RID_CONTEXTMENU_SHAPEEDIT : RID_CONTEXTMENU_SHAPE ) ); + ::svt::ContextMenuHelper aContextMenuHelper( m_xFrame ); + Point aPos( rCEvt.GetMousePosPixel() ); + if( !rCEvt.IsMouseEvent() ) + { + aPos = m_pChartWindow->GetPointerState().maPos; + } + aContextMenuHelper.completeAndExecute( aPos, aContextMenu ); + } + else + { + // todo: the context menu should be specified by an xml file in uiconfig + uno::Reference< awt::XPopupMenu > xPopupMenu( + m_xCC->getServiceManager()->createInstanceWithContext( + C2U("com.sun.star.awt.PopupMenu"), m_xCC ), uno::UNO_QUERY ); + uno::Reference< awt::XMenuExtended > xMenuEx( xPopupMenu, uno::UNO_QUERY ); + if( xPopupMenu.is() && xMenuEx.is()) + { + sal_Int16 nUniqueId = 1; + ObjectType eObjectType = ObjectIdentifier::getObjectType( m_aSelection.getSelectedCID() ); + Reference< XDiagram > xDiagram = ChartModelHelper::findDiagram( m_aModel->getModel() ); - OUString aFormatCommand( lcl_getFormatCommandForObjectCID( m_aSelection.getSelectedCID() ) ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, aFormatCommand ); + OUString aFormatCommand( lcl_getFormatCommandForObjectCID( m_aSelection.getSelectedCID() ) ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, aFormatCommand ); - //some commands for dataseries and points: - //----- - if( OBJECTTYPE_DATA_SERIES == eObjectType || OBJECTTYPE_DATA_POINT == eObjectType ) - { - bool bIsPoint = ( OBJECTTYPE_DATA_POINT == eObjectType ); - uno::Reference< XDataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID( m_aSelection.getSelectedCID(), m_aModel->getModel() ); - uno::Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY ); - Reference< chart2::XRegressionCurve > xTrendline( RegressionCurveHelper::getFirstCurveNotMeanValueLine( xCurveCnt ) ); - bool bHasEquation = RegressionCurveHelper::hasEquation( xTrendline ); - Reference< chart2::XRegressionCurve > xMeanValue( RegressionCurveHelper::getMeanValueLine( xCurveCnt ) ); - bool bHasYErrorBars = StatisticsHelper::hasErrorBars( xSeries, true ); - bool bHasDataLabelsAtSeries = DataSeriesHelper::hasDataLabelsAtSeries( xSeries ); - bool bHasDataLabelsAtPoints = DataSeriesHelper::hasDataLabelsAtPoints( xSeries ); - bool bHasDataLabelAtPoint = false; - sal_Int32 nPointIndex = -1; - if( bIsPoint ) + //some commands for dataseries and points: + //----- + if( OBJECTTYPE_DATA_SERIES == eObjectType || OBJECTTYPE_DATA_POINT == eObjectType ) { - nPointIndex = ObjectIdentifier::getIndexFromParticleOrCID( m_aSelection.getSelectedCID() ); - bHasDataLabelAtPoint = DataSeriesHelper::hasDataLabelAtPoint( xSeries, nPointIndex ); - } - bool bSelectedPointIsFormatted = false; - bool bHasFormattedDataPointsOtherThanSelected = false; + bool bIsPoint = ( OBJECTTYPE_DATA_POINT == eObjectType ); + uno::Reference< XDataSeries > xSeries = ObjectIdentifier::getDataSeriesForCID( m_aSelection.getSelectedCID(), m_aModel->getModel() ); + uno::Reference< chart2::XRegressionCurveContainer > xCurveCnt( xSeries, uno::UNO_QUERY ); + Reference< chart2::XRegressionCurve > xTrendline( RegressionCurveHelper::getFirstCurveNotMeanValueLine( xCurveCnt ) ); + bool bHasEquation = RegressionCurveHelper::hasEquation( xTrendline ); + Reference< chart2::XRegressionCurve > xMeanValue( RegressionCurveHelper::getMeanValueLine( xCurveCnt ) ); + bool bHasYErrorBars = StatisticsHelper::hasErrorBars( xSeries, true ); + bool bHasDataLabelsAtSeries = DataSeriesHelper::hasDataLabelsAtSeries( xSeries ); + bool bHasDataLabelsAtPoints = DataSeriesHelper::hasDataLabelsAtPoints( xSeries ); + bool bHasDataLabelAtPoint = false; + sal_Int32 nPointIndex = -1; + if( bIsPoint ) + { + nPointIndex = ObjectIdentifier::getIndexFromParticleOrCID( m_aSelection.getSelectedCID() ); + bHasDataLabelAtPoint = DataSeriesHelper::hasDataLabelAtPoint( xSeries, nPointIndex ); + } + bool bSelectedPointIsFormatted = false; + bool bHasFormattedDataPointsOtherThanSelected = false; - Reference< beans::XPropertySet > xSeriesProperties( xSeries, uno::UNO_QUERY ); - if( xSeriesProperties.is() ) - { - uno::Sequence< sal_Int32 > aAttributedDataPointIndexList; - if( xSeriesProperties->getPropertyValue( C2U( "AttributedDataPoints" ) ) >>= aAttributedDataPointIndexList ) + Reference< beans::XPropertySet > xSeriesProperties( xSeries, uno::UNO_QUERY ); + if( xSeriesProperties.is() ) { - if( aAttributedDataPointIndexList.hasElements() ) + uno::Sequence< sal_Int32 > aAttributedDataPointIndexList; + if( xSeriesProperties->getPropertyValue( C2U( "AttributedDataPoints" ) ) >>= aAttributedDataPointIndexList ) { - if( bIsPoint ) + if( aAttributedDataPointIndexList.hasElements() ) { - ::std::vector< sal_Int32 > aIndices( ContainerHelper::SequenceToVector( aAttributedDataPointIndexList ) ); - ::std::vector< sal_Int32 >::iterator aIt = ::std::find( aIndices.begin(), aIndices.end(), nPointIndex ); - if( aIt != aIndices.end()) - bSelectedPointIsFormatted = true; + if( bIsPoint ) + { + ::std::vector< sal_Int32 > aIndices( ContainerHelper::SequenceToVector( aAttributedDataPointIndexList ) ); + ::std::vector< sal_Int32 >::iterator aIt = ::std::find( aIndices.begin(), aIndices.end(), nPointIndex ); + if( aIt != aIndices.end()) + bSelectedPointIsFormatted = true; + else + bHasFormattedDataPointsOtherThanSelected = true; + } else bHasFormattedDataPointsOtherThanSelected = true; } - else - bHasFormattedDataPointsOtherThanSelected = true; } } - } - - //const sal_Int32 nIdBeforeFormat = nUniqueId; - if( bIsPoint ) - { - if( bHasDataLabelAtPoint ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatDataLabel") ); - if( !bHasDataLabelAtPoint ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertDataLabel") ); - else - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteDataLabel") ); - if( bSelectedPointIsFormatted ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:ResetDataPoint")); - - xPopupMenu->insertSeparator( -1 ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatDataSeries") ); - } + //const sal_Int32 nIdBeforeFormat = nUniqueId; + if( bIsPoint ) + { + if( bHasDataLabelAtPoint ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatDataLabel") ); + if( !bHasDataLabelAtPoint ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertDataLabel") ); + else + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteDataLabel") ); + if( bSelectedPointIsFormatted ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:ResetDataPoint")); + + xPopupMenu->insertSeparator( -1 ); + + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatDataSeries") ); + } - Reference< chart2::XChartType > xChartType( DiagramHelper::getChartTypeOfSeries( xDiagram, xSeries ) ); - if( xChartType->getChartType().equals(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) ) - { - try + Reference< chart2::XChartType > xChartType( DiagramHelper::getChartTypeOfSeries( xDiagram, xSeries ) ); + if( xChartType->getChartType().equals(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) ) { - Reference< beans::XPropertySet > xChartTypeProp( xChartType, uno::UNO_QUERY ); - if( xChartTypeProp.is() ) + try { - bool bJapaneseStyle = false; - xChartTypeProp->getPropertyValue( C2U( "Japanese" ) ) >>= bJapaneseStyle; - - if( bJapaneseStyle ) + Reference< beans::XPropertySet > xChartTypeProp( xChartType, uno::UNO_QUERY ); + if( xChartTypeProp.is() ) { - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockLoss") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockGain") ); + bool bJapaneseStyle = false; + xChartTypeProp->getPropertyValue( C2U( "Japanese" ) ) >>= bJapaneseStyle; + + if( bJapaneseStyle ) + { + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockLoss") ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockGain") ); + } } } + catch( const uno::Exception & ex ) + { + ASSERT_EXCEPTION( ex ); + } } - catch( const uno::Exception & ex ) + + if( bHasDataLabelsAtSeries ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatDataLabels") ); + if( xTrendline.is() ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatTrendline") ); + if( bHasEquation ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatTrendlineEquation") ); + if( xMeanValue.is() ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatMeanValue") ); + if( bHasYErrorBars ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatYErrorBars") ); + + //if( nIdBeforeFormat != nUniqueId ) + xPopupMenu->insertSeparator( -1 ); + + //const sal_Int32 nIdBeforeInsert = nUniqueId; + + if( !bHasDataLabelsAtSeries ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertDataLabels") ); + if( !xTrendline.is() ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTrendline") ); + else if( !bHasEquation ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTrendlineEquation") ); + if( !xMeanValue.is() ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertMeanValue") ); + if( !bHasYErrorBars ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertYErrorBars") ); + + //if( nIdBeforeInsert != nUniqueId ) + // xPopupMenu->insertSeparator( -1 ); + + //const sal_Int32 nIdBeforeDelete = nUniqueId; + + if( bHasDataLabelsAtSeries || ( bHasDataLabelsAtPoints && bHasFormattedDataPointsOtherThanSelected ) ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteDataLabels") ); + if( xTrendline.is() ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteTrendline") ); + if( bHasEquation ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteTrendlineEquation") ); + if( xMeanValue.is() ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteMeanValue") ); + if( bHasYErrorBars ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteYErrorBars") ); + + if( bHasFormattedDataPointsOtherThanSelected ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:ResetAllDataPoints")); + + //if( nIdBeforeDelete != nUniqueId ) + xPopupMenu->insertSeparator( -1 ); + + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId, C2U(".uno:ArrangeRow")); + uno::Reference< awt::XPopupMenu > xArrangePopupMenu( + m_xCC->getServiceManager()->createInstanceWithContext( + C2U("com.sun.star.awt.PopupMenu"), m_xCC ), uno::UNO_QUERY ); + uno::Reference< awt::XMenuExtended > xArrangeMenuEx( xArrangePopupMenu, uno::UNO_QUERY ); + if( xArrangePopupMenu.is() && xArrangeMenuEx.is()) { - ASSERT_EXCEPTION( ex ); + sal_Int16 nSubId = nUniqueId + 1; + lcl_insertMenuCommand( xArrangePopupMenu, xArrangeMenuEx, nSubId++, C2U(".uno:Forward") ); + lcl_insertMenuCommand( xArrangePopupMenu, xArrangeMenuEx, nSubId, C2U(".uno:Backward") ); + xPopupMenu->setPopupMenu( nUniqueId, xArrangePopupMenu ); + nUniqueId = nSubId; } + ++nUniqueId; } - - if( bHasDataLabelsAtSeries ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatDataLabels") ); - if( xTrendline.is() ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatTrendline") ); - if( bHasEquation ) + else if( OBJECTTYPE_DATA_CURVE == eObjectType ) + { lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatTrendlineEquation") ); - if( xMeanValue.is() ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatMeanValue") ); - if( bHasYErrorBars ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatYErrorBars") ); - - //if( nIdBeforeFormat != nUniqueId ) - xPopupMenu->insertSeparator( -1 ); - - //const sal_Int32 nIdBeforeInsert = nUniqueId; - - if( !bHasDataLabelsAtSeries ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertDataLabels") ); - if( !xTrendline.is() ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTrendline") ); - else if( !bHasEquation ) lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTrendlineEquation") ); - if( !xMeanValue.is() ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertMeanValue") ); - if( !bHasYErrorBars ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertYErrorBars") ); - - //if( nIdBeforeInsert != nUniqueId ) - // xPopupMenu->insertSeparator( -1 ); - - //const sal_Int32 nIdBeforeDelete = nUniqueId; - - if( bHasDataLabelsAtSeries || ( bHasDataLabelsAtPoints && bHasFormattedDataPointsOtherThanSelected ) ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteDataLabels") ); - if( xTrendline.is() ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteTrendline") ); - if( bHasEquation ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTrendlineEquationAndR2") ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertR2Value") ); lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteTrendlineEquation") ); - if( xMeanValue.is() ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteMeanValue") ); - if( bHasYErrorBars ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteYErrorBars") ); - - if( bHasFormattedDataPointsOtherThanSelected ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:ResetAllDataPoints")); - - //if( nIdBeforeDelete != nUniqueId ) - xPopupMenu->insertSeparator( -1 ); - - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId, C2U(".uno:ArrangeRow")); - uno::Reference< awt::XPopupMenu > xArrangePopupMenu( - m_xCC->getServiceManager()->createInstanceWithContext( - C2U("com.sun.star.awt.PopupMenu"), m_xCC ), uno::UNO_QUERY ); - uno::Reference< awt::XMenuExtended > xArrangeMenuEx( xArrangePopupMenu, uno::UNO_QUERY ); - if( xArrangePopupMenu.is() && xArrangeMenuEx.is()) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteR2Value") ); + } + else if( OBJECTTYPE_DATA_CURVE_EQUATION == eObjectType ) { - sal_Int16 nSubId = nUniqueId + 1; - lcl_insertMenuCommand( xArrangePopupMenu, xArrangeMenuEx, nSubId++, C2U(".uno:Forward") ); - lcl_insertMenuCommand( xArrangePopupMenu, xArrangeMenuEx, nSubId, C2U(".uno:Backward") ); - xPopupMenu->setPopupMenu( nUniqueId, xArrangePopupMenu ); - nUniqueId = nSubId; + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertR2Value") ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteR2Value") ); } - ++nUniqueId; - } - else if( OBJECTTYPE_DATA_CURVE == eObjectType ) - { - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatTrendlineEquation") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTrendlineEquation") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTrendlineEquationAndR2") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertR2Value") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteTrendlineEquation") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteR2Value") ); - } - else if( OBJECTTYPE_DATA_CURVE_EQUATION == eObjectType ) - { - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertR2Value") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteR2Value") ); - } - //some commands for axes: and grids - //----- - else if( OBJECTTYPE_AXIS == eObjectType || OBJECTTYPE_GRID == eObjectType || OBJECTTYPE_SUBGRID == eObjectType ) - { - Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( m_aSelection.getSelectedCID(), m_aModel->getModel() ); - if( xAxis.is() && xDiagram.is() ) + //some commands for axes: and grids + //----- + else if( OBJECTTYPE_AXIS == eObjectType || OBJECTTYPE_GRID == eObjectType || OBJECTTYPE_SUBGRID == eObjectType ) { - sal_Int32 nDimensionIndex = -1; - sal_Int32 nCooSysIndex = -1; - sal_Int32 nAxisIndex = -1; - AxisHelper::getIndicesForAxis( xAxis, xDiagram, nCooSysIndex, nDimensionIndex, nAxisIndex ); - bool bIsSecondaryAxis = nAxisIndex!=0; - bool bIsAxisVisible = AxisHelper::isAxisVisible( xAxis ); - bool bIsMajorGridVisible = AxisHelper::isGridShown( nDimensionIndex, nCooSysIndex, true /*bMainGrid*/, xDiagram ); - bool bIsMinorGridVisible = AxisHelper::isGridShown( nDimensionIndex, nCooSysIndex, false /*bMainGrid*/, xDiagram ); - bool bHasTitle = false; - uno::Reference< XTitled > xTitled( xAxis, uno::UNO_QUERY ); - if( xTitled.is()) - bHasTitle = TitleHelper::getCompleteString( xTitled->getTitleObject() ).getLength()>0; - - if( OBJECTTYPE_AXIS != eObjectType && bIsAxisVisible ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatAxis") ); - if( OBJECTTYPE_GRID != eObjectType && bIsMajorGridVisible && !bIsSecondaryAxis ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatMajorGrid") ); - if( OBJECTTYPE_SUBGRID != eObjectType && bIsMinorGridVisible && !bIsSecondaryAxis ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatMinorGrid") ); - - xPopupMenu->insertSeparator( -1 ); - - if( OBJECTTYPE_AXIS != eObjectType && !bIsAxisVisible ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertAxis") ); - if( OBJECTTYPE_GRID != eObjectType && !bIsMajorGridVisible && !bIsSecondaryAxis ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertMajorGrid") ); - if( OBJECTTYPE_SUBGRID != eObjectType && !bIsMinorGridVisible && !bIsSecondaryAxis ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertMinorGrid") ); - if( !bHasTitle ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertAxisTitle") ); - - if( bIsAxisVisible ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteAxis") ); - if( bIsMajorGridVisible && !bIsSecondaryAxis ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteMajorGrid") ); - if( bIsMinorGridVisible && !bIsSecondaryAxis ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteMinorGrid") ); + Reference< XAxis > xAxis = ObjectIdentifier::getAxisForCID( m_aSelection.getSelectedCID(), m_aModel->getModel() ); + if( xAxis.is() && xDiagram.is() ) + { + sal_Int32 nDimensionIndex = -1; + sal_Int32 nCooSysIndex = -1; + sal_Int32 nAxisIndex = -1; + AxisHelper::getIndicesForAxis( xAxis, xDiagram, nCooSysIndex, nDimensionIndex, nAxisIndex ); + bool bIsSecondaryAxis = nAxisIndex!=0; + bool bIsAxisVisible = AxisHelper::isAxisVisible( xAxis ); + bool bIsMajorGridVisible = AxisHelper::isGridShown( nDimensionIndex, nCooSysIndex, true /*bMainGrid*/, xDiagram ); + bool bIsMinorGridVisible = AxisHelper::isGridShown( nDimensionIndex, nCooSysIndex, false /*bMainGrid*/, xDiagram ); + bool bHasTitle = false; + uno::Reference< XTitled > xTitled( xAxis, uno::UNO_QUERY ); + if( xTitled.is()) + bHasTitle = TitleHelper::getCompleteString( xTitled->getTitleObject() ).getLength()>0; + + if( OBJECTTYPE_AXIS != eObjectType && bIsAxisVisible ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatAxis") ); + if( OBJECTTYPE_GRID != eObjectType && bIsMajorGridVisible && !bIsSecondaryAxis ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatMajorGrid") ); + if( OBJECTTYPE_SUBGRID != eObjectType && bIsMinorGridVisible && !bIsSecondaryAxis ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatMinorGrid") ); + + xPopupMenu->insertSeparator( -1 ); + + if( OBJECTTYPE_AXIS != eObjectType && !bIsAxisVisible ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertAxis") ); + if( OBJECTTYPE_GRID != eObjectType && !bIsMajorGridVisible && !bIsSecondaryAxis ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertMajorGrid") ); + if( OBJECTTYPE_SUBGRID != eObjectType && !bIsMinorGridVisible && !bIsSecondaryAxis ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertMinorGrid") ); + if( !bHasTitle ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertAxisTitle") ); + + if( bIsAxisVisible ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteAxis") ); + if( bIsMajorGridVisible && !bIsSecondaryAxis ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteMajorGrid") ); + if( bIsMinorGridVisible && !bIsSecondaryAxis ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteMinorGrid") ); + } } - } - if( OBJECTTYPE_DATA_STOCK_LOSS == eObjectType ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockGain") ); - else if( OBJECTTYPE_DATA_STOCK_GAIN == eObjectType ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockLoss") ); + if( OBJECTTYPE_DATA_STOCK_LOSS == eObjectType ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockGain") ); + else if( OBJECTTYPE_DATA_STOCK_GAIN == eObjectType ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:FormatStockLoss") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:TransformDialog")); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:TransformDialog")); - if( OBJECTTYPE_PAGE == eObjectType || OBJECTTYPE_DIAGRAM == eObjectType - || OBJECTTYPE_DIAGRAM_WALL == eObjectType - || OBJECTTYPE_DIAGRAM_FLOOR == eObjectType - || OBJECTTYPE_UNKNOWN == eObjectType ) - { - if( OBJECTTYPE_UNKNOWN != eObjectType ) - xPopupMenu->insertSeparator( -1 ); - bool bHasLegend = LegendHelper::hasLegend( xDiagram ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTitles") ); - if( !bHasLegend ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertLegend") ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertRemoveAxes") ); - if( bHasLegend ) - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteLegend") ); + if( OBJECTTYPE_PAGE == eObjectType || OBJECTTYPE_DIAGRAM == eObjectType + || OBJECTTYPE_DIAGRAM_WALL == eObjectType + || OBJECTTYPE_DIAGRAM_FLOOR == eObjectType + || OBJECTTYPE_UNKNOWN == eObjectType ) + { + if( OBJECTTYPE_UNKNOWN != eObjectType ) + xPopupMenu->insertSeparator( -1 ); + bool bHasLegend = LegendHelper::hasLegend( xDiagram ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertTitles") ); + if( !bHasLegend ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertLegend") ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:InsertRemoveAxes") ); + if( bHasLegend ) + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DeleteLegend") ); + } + //----- + + xPopupMenu->insertSeparator( -1 ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DiagramType")); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DataRanges")); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DiagramData")); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:View3D")); + xPopupMenu->insertSeparator( -1 ); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:Cut")); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:Copy")); + lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:Paste")); + + ::svt::ContextMenuHelper aContextMenuHelper( m_xFrame ); + Point aPos( rCEvt.GetMousePosPixel() ); + if( !rCEvt.IsMouseEvent() ) + aPos = m_pChartWindow->GetPointerState().maPos; + aContextMenuHelper.completeAndExecute( aPos, xPopupMenu ); } - //----- - - xPopupMenu->insertSeparator( -1 ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DiagramType")); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DataRanges")); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:DiagramData")); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:View3D")); - xPopupMenu->insertSeparator( -1 ); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:Cut")); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:Copy")); - lcl_insertMenuCommand( xPopupMenu, xMenuEx, nUniqueId++, C2U(".uno:Paste")); - - ::svt::ContextMenuHelper aContextMenuHelper( m_xFrame ); - Point aPos( rCEvt.GetMousePosPixel() ); - if( !rCEvt.IsMouseEvent() ) - aPos = m_pChartWindow->GetPointerState().maPos; - aContextMenuHelper.completeAndExecute( aPos, xPopupMenu ); } } else if( ( rCEvt.GetCommand() == COMMAND_STARTEXTTEXTINPUT ) || @@ -1235,17 +1350,21 @@ bool ChartController::execute_KeyInput( const KeyEvent& rKEvt ) { // Natvigation (Tab/F3/Home/End) uno::Reference< XChartDocument > xChartDoc( m_aModel->getModel(), uno::UNO_QUERY ); - ObjectKeyNavigation aObjNav( m_aSelection.getSelectedCID(), xChartDoc, ExplicitValueProvider::getExplicitValueProvider( m_xChartView )); + ObjectKeyNavigation aObjNav( m_aSelection.getSelectedOID(), xChartDoc, ExplicitValueProvider::getExplicitValueProvider( m_xChartView )); awt::KeyEvent aKeyEvent( ::svt::AcceleratorExecute::st_VCLKey2AWTKey( aKeyCode )); bReturn = aObjNav.handleKeyEvent( aKeyEvent ); if( bReturn ) { - ::rtl::OUString aNewCID = aObjNav.getCurrentSelection(); + ObjectIdentifier aNewOID = aObjNav.getCurrentSelection(); uno::Any aNewSelection; - if( aNewCID.getLength()>0 && !ObjectHierarchy::isRootNode( aNewCID )) - aNewSelection <<= aNewCID; - if( m_eDragMode == SDRDRAG_ROTATE && !SelectionHelper::isRotateableObject( aNewCID, m_aModel->getModel() ) ) + if ( aNewOID.isValid() && !ObjectHierarchy::isRootNode( aNewOID ) ) + { + aNewSelection = aNewOID.getAny(); + } + if ( m_eDragMode == SDRDRAG_ROTATE && !SelectionHelper::isRotateableObject( aNewOID.getObjectCID(), m_aModel->getModel() ) ) + { m_eDragMode = SDRDRAG_MOVE; + } bReturn = select( aNewSelection ); } } @@ -1498,24 +1617,64 @@ bool ChartController::requestQuickHelp( ::select( const uno::Any& rSelection ) throw( lang::IllegalArgumentException ) { - rtl::OUString aNewCID; - if( rSelection.hasValue() && - ! (rSelection >>= aNewCID)) - return sal_False; + bool bSuccess = false; - - if( m_aSelection.setSelection( aNewCID ) ) + if ( rSelection.hasValue() ) + { + const uno::Type& rType = rSelection.getValueType(); + if ( rType == ::getCppuType( static_cast< const ::rtl::OUString* >( 0 ) ) ) + { + ::rtl::OUString aNewCID; + if ( ( rSelection >>= aNewCID ) && m_aSelection.setSelection( aNewCID ) ) + { + bSuccess = true; + } + } + else if ( rType == ::getCppuType( static_cast< const uno::Reference< drawing::XShape >* >( 0 ) ) ) + { + uno::Reference< drawing::XShape > xShape; + if ( ( rSelection >>= xShape ) && m_aSelection.setSelection( xShape ) ) + { + bSuccess = true; + } + } + } + else + { + if ( m_aSelection.hasSelection() ) + { + m_aSelection.clearSelection(); + bSuccess = true; + } + } + + if ( bSuccess ) { this->impl_selectObjectAndNotiy(); return sal_True; } + return sal_False; } uno::Any SAL_CALL ChartController ::getSelection() throw(uno::RuntimeException) { - return uno::makeAny(m_aSelection.getSelectedCID()); + uno::Any aReturn; + if ( m_aSelection.hasSelection() ) + { + ::rtl::OUString aCID( m_aSelection.getSelectedCID() ); + if ( aCID.getLength() ) + { + aReturn = uno::makeAny( aCID ); + } + else + { + // #i12587# support for shapes in chart + aReturn = uno::makeAny( m_aSelection.getSelectedAdditionalShape() ); + } + } + return aReturn; } void SAL_CALL ChartController @@ -1701,7 +1860,7 @@ void ChartController::impl_SetMousePointer( const MouseEvent & rEvent ) sal_uInt16 nModifier = rEvent.GetModifier(); BOOL bLeftDown = rEvent.IsLeft(); - if( m_pDrawViewWrapper->IsTextEdit() ) + if ( m_pDrawViewWrapper->IsTextEdit() ) { if( m_pDrawViewWrapper->IsTextEditHit( aMousePos, HITPIX) ) { @@ -1726,7 +1885,7 @@ void ChartController::impl_SetMousePointer( const MouseEvent & rEvent ) aMousePos, pWindow, nModifier, bLeftDown ); bool bForceArrowPointer = false; - ::rtl::OUString aObjectCID = m_aSelection.getSelectedCID(); + ObjectIdentifier aOID( m_aSelection.getSelectedOID() ); switch( aPointer.GetStyle()) { @@ -1742,7 +1901,7 @@ void ChartController::impl_SetMousePointer( const MouseEvent & rEvent ) bForceArrowPointer = true; break; case POINTER_MOVE: - if( ! ObjectIdentifier::isDragableObject( aObjectCID )) + if ( !aOID.isDragableObject() ) bForceArrowPointer = true; break; case POINTER_MOVEPOINT: @@ -1762,6 +1921,55 @@ void ChartController::impl_SetMousePointer( const MouseEvent & rEvent ) } else { + // #i12587# support for shapes in chart + if ( m_eDrawMode == CHARTDRAW_INSERT && + ( !m_pDrawViewWrapper->IsMarkedHit( aMousePos ) || !m_aSelection.isDragableObjectSelected() ) ) + { + PointerStyle ePointerStyle = POINTER_DRAW_RECT; + SdrObjKind eKind = static_cast< SdrObjKind >( m_pDrawViewWrapper->GetCurrentObjIdentifier() ); + switch ( eKind ) + { + case OBJ_LINE: + { + ePointerStyle = POINTER_DRAW_LINE; + } + break; + case OBJ_RECT: + case OBJ_CUSTOMSHAPE: + { + ePointerStyle = POINTER_DRAW_RECT; + } + break; + case OBJ_CIRC: + { + ePointerStyle = POINTER_DRAW_ELLIPSE; + } + break; + case OBJ_FREELINE: + { + ePointerStyle = POINTER_DRAW_POLYGON; + } + break; + case OBJ_TEXT: + { + ePointerStyle = POINTER_DRAW_TEXT; + } + break; + case OBJ_CAPTION: + { + ePointerStyle = POINTER_DRAW_CAPTION; + } + break; + default: + { + ePointerStyle = POINTER_DRAW_RECT; + } + break; + } + pWindow->SetPointer( Pointer( ePointerStyle ) ); + return; + } + ::rtl::OUString aHitObjectCID( SelectionHelper::getHitObjectCID( aMousePos, *m_pDrawViewWrapper, true /*bGetDiagramInsteadOf_Wall*/ )); diff --git a/chart2/source/controller/main/ChartTransferable.cxx b/chart2/source/controller/main/ChartTransferable.cxx index 3d518ed47..1ab1bc299 100644 --- a/chart2/source/controller/main/ChartTransferable.cxx +++ b/chart2/source/controller/main/ChartTransferable.cxx @@ -30,12 +30,21 @@ #include "ChartTransferable.hxx" +#include <unotools/streamwrap.hxx> #include <vcl/graph.hxx> +#include <svl/itempool.hxx> +#include <editeng/eeitem.hxx> +#include <editeng/fhgtitem.hxx> +#include <svx/svditer.hxx> #include <svx/svdmodel.hxx> +#include <svx/svdpage.hxx> +#include <svx/unomodel.hxx> // header for class SdrView #include <svx/svdview.hxx> +#define CHARTTRANSFER_OBJECTTYPE_DRAWMODEL 1 + using namespace ::com::sun::star; using ::com::sun::star::uno::Reference; @@ -45,7 +54,9 @@ using ::rtl::OUString; namespace chart { -ChartTransferable::ChartTransferable( SdrModel * pDrawModel, SdrObject * pSelectedObj ) +ChartTransferable::ChartTransferable( SdrModel* pDrawModel, SdrObject* pSelectedObj, bool bDrawing ) + :m_pMarkedObjModel( NULL ) + ,m_bDrawing( bDrawing ) { SdrExchangeView * pExchgView( new SdrView( pDrawModel )); SdrPageView* pPv = pExchgView->ShowSdrPage( pDrawModel->GetPage( 0 )); @@ -55,6 +66,10 @@ ChartTransferable::ChartTransferable( SdrModel * pDrawModel, SdrObject * pSelect pExchgView->MarkAllObj( pPv ); Graphic aGraphic( pExchgView->GetMarkedObjMetaFile( TRUE )); m_xMetaFileGraphic.set( aGraphic.GetXGraphic()); + if ( m_bDrawing ) + { + m_pMarkedObjModel = ( pExchgView ? pExchgView->GetAllMarkedModel() : NULL ); + } delete pExchgView; } @@ -63,6 +78,10 @@ ChartTransferable::~ChartTransferable() void ChartTransferable::AddSupportedFormats() { + if ( m_bDrawing ) + { + AddFormat( SOT_FORMATSTR_ID_DRAWING ); + } AddFormat( SOT_FORMAT_GDIMETAFILE ); AddFormat( SOT_FORMAT_BITMAP ); } @@ -74,7 +93,11 @@ sal_Bool ChartTransferable::GetData( const ::com::sun::star::datatransfer::DataF if( HasFormat( nFormat )) { - if( nFormat == FORMAT_GDIMETAFILE ) + if ( nFormat == SOT_FORMATSTR_ID_DRAWING ) + { + bResult = SetObject( m_pMarkedObjModel, CHARTTRANSFER_OBJECTTYPE_DRAWMODEL, rFlavor ); + } + else if ( nFormat == FORMAT_GDIMETAFILE ) { Graphic aGraphic( m_xMetaFileGraphic ); bResult = SetGDIMetaFile( aGraphic.GetGDIMetaFile(), rFlavor ); @@ -89,5 +112,61 @@ sal_Bool ChartTransferable::GetData( const ::com::sun::star::datatransfer::DataF return bResult; } +sal_Bool ChartTransferable::WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, + const datatransfer::DataFlavor& /* rFlavor */ ) +{ + // called from SetObject, put data into stream + + sal_Bool bRet = sal_False; + switch ( nUserObjectId ) + { + case CHARTTRANSFER_OBJECTTYPE_DRAWMODEL: + { + SdrModel* pMarkedObjModel = reinterpret_cast< SdrModel* >( pUserObject ); + if ( pMarkedObjModel ) + { + rxOStm->SetBufferSize( 0xff00 ); + + // #108584# + // for the changed pool defaults from drawing layer pool set those + // attributes as hard attributes to preserve them for saving + const SfxItemPool& rItemPool = pMarkedObjModel->GetItemPool(); + const SvxFontHeightItem& rDefaultFontHeight = static_cast< const SvxFontHeightItem& >( + rItemPool.GetDefaultItem( EE_CHAR_FONTHEIGHT ) ); + sal_uInt16 nCount = pMarkedObjModel->GetPageCount(); + for ( sal_uInt16 i = 0; i < nCount; ++i ) + { + const SdrPage* pPage = pMarkedObjModel->GetPage( i ); + SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); + while ( aIter.IsMore() ) + { + SdrObject* pObj = aIter.Next(); + const SvxFontHeightItem& rItem = static_cast< const SvxFontHeightItem& >( + pObj->GetMergedItem( EE_CHAR_FONTHEIGHT ) ); + if ( rItem.GetHeight() == rDefaultFontHeight.GetHeight() ) + { + pObj->SetMergedItem( rDefaultFontHeight ); + } + } + } + + Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxOStm ) ); + if ( SvxDrawingLayerExport( pMarkedObjModel, xDocOut ) ) + { + rxOStm->Commit(); + } + + bRet = ( rxOStm->GetError() == ERRCODE_NONE ); + } + } + break; + default: + { + DBG_ERROR( "ChartTransferable::WriteObject: unknown object id" ); + } + break; + } + return bRet; +} } // namespace chart diff --git a/chart2/source/controller/main/ChartTransferable.hxx b/chart2/source/controller/main/ChartTransferable.hxx index cfa031869..667b137ab 100644 --- a/chart2/source/controller/main/ChartTransferable.hxx +++ b/chart2/source/controller/main/ChartTransferable.hxx @@ -44,7 +44,7 @@ namespace chart class ChartTransferable : public TransferableHelper { public: - explicit ChartTransferable( SdrModel * pDrawModel, SdrObject * pSelectedObj ); + explicit ChartTransferable( SdrModel* pDrawModel, SdrObject* pSelectedObj, bool bDrawing = false ); virtual ~ChartTransferable(); protected: @@ -52,9 +52,13 @@ protected: // implementation of TransferableHelper methods virtual void AddSupportedFormats(); virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, + const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); private: ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > m_xMetaFileGraphic; + SdrModel* m_pMarkedObjModel; + bool m_bDrawing; }; } // namespace chart diff --git a/chart2/source/controller/main/CommandDispatchContainer.cxx b/chart2/source/controller/main/CommandDispatchContainer.cxx index 2f4087717..473c8b7fe 100644 --- a/chart2/source/controller/main/CommandDispatchContainer.cxx +++ b/chart2/source/controller/main/CommandDispatchContainer.cxx @@ -33,6 +33,9 @@ #include "StatusBarCommandDispatch.hxx" #include "DisposeHelper.hxx" #include "macros.hxx" +#include "ChartController.hxx" +#include "DrawCommandDispatch.hxx" +#include "ShapeController.hxx" #include <comphelper/InlineContainer.hxx> @@ -48,8 +51,11 @@ namespace chart { CommandDispatchContainer::CommandDispatchContainer( - const Reference< uno::XComponentContext > & xContext ) : - m_xContext( xContext ) + const Reference< uno::XComponentContext > & xContext, ChartController* pController ) + :m_xContext( xContext ) + ,m_pChartController( pController ) + ,m_pDrawCommandDispatch( NULL ) + ,m_pShapeController( NULL ) { m_aContainerDocumentCommands = ::comphelper::MakeSet< OUString > @@ -75,21 +81,20 @@ void CommandDispatchContainer::setModel( // m_xUndoManager = xUndoManager; // } -void CommandDispatchContainer::setFallbackDispatch( - const Reference< frame::XDispatch > xFallbackDispatch, - const ::std::set< OUString > & rFallbackCommands ) +void CommandDispatchContainer::setChartDispatch( + const Reference< frame::XDispatch > xChartDispatch, + const ::std::set< OUString > & rChartCommands ) { - OSL_ENSURE(xFallbackDispatch.is(),"Invalid fall back dispatcher!"); - m_xFallbackDispatcher.set( xFallbackDispatch ); - m_aFallbackCommands = rFallbackCommands; - m_aToBeDisposedDispatches.push_back( m_xFallbackDispatcher ); + OSL_ENSURE(xChartDispatch.is(),"Invalid fall back dispatcher!"); + m_xChartDispatcher.set( xChartDispatch ); + m_aChartCommands = rChartCommands; + m_aToBeDisposedDispatches.push_back( m_xChartDispatcher ); } Reference< frame::XDispatch > CommandDispatchContainer::getDispatchForURL( const util::URL & rURL ) { Reference< frame::XDispatch > xResult; - tDispatchMap::const_iterator aIt( m_aCachedDispatches.find( rURL.Complete )); if( aIt != m_aCachedDispatches.end()) { @@ -127,10 +132,24 @@ Reference< frame::XDispatch > CommandDispatchContainer::getDispatchForURL( // ToDo: can those dispatches be cached? m_aCachedDispatches[ rURL.Complete ].set( xResult ); } - else if( m_xFallbackDispatcher.is() && - (m_aFallbackCommands.find( rURL.Path ) != m_aFallbackCommands.end()) ) + else if( m_xChartDispatcher.is() && + (m_aChartCommands.find( rURL.Path ) != m_aChartCommands.end()) ) + { + xResult.set( m_xChartDispatcher ); + m_aCachedDispatches[ rURL.Complete ].set( xResult ); + } + // #i12587# support for shapes in chart + // Note, that the chart dispatcher must be queried first, because + // the chart dispatcher is the default dispatcher for all context + // sensitive commands. + else if ( m_pDrawCommandDispatch && m_pDrawCommandDispatch->isFeatureSupported( rURL.Complete ) ) + { + xResult.set( m_pDrawCommandDispatch ); + m_aCachedDispatches[ rURL.Complete ].set( xResult ); + } + else if ( m_pShapeController && m_pShapeController->isFeatureSupported( rURL.Complete ) ) { - xResult.set( m_xFallbackDispatcher ); + xResult.set( m_pShapeController ); m_aCachedDispatches[ rURL.Complete ].set( xResult ); } } @@ -157,8 +176,11 @@ void CommandDispatchContainer::DisposeAndClear() m_aCachedDispatches.clear(); DisposeHelper::DisposeAllElements( m_aToBeDisposedDispatches ); m_aToBeDisposedDispatches.clear(); - m_xFallbackDispatcher.clear(); - m_aFallbackCommands.clear(); + m_xChartDispatcher.clear(); + m_aChartCommands.clear(); + m_pChartController = NULL; + m_pDrawCommandDispatch = NULL; + m_pShapeController = NULL; } Reference< frame::XDispatch > CommandDispatchContainer::getContainerDispatchForURL( @@ -179,4 +201,16 @@ Reference< frame::XDispatch > CommandDispatchContainer::getContainerDispatchForU return xResult; } +void CommandDispatchContainer::setDrawCommandDispatch( DrawCommandDispatch* pDispatch ) +{ + m_pDrawCommandDispatch = pDispatch; + m_aToBeDisposedDispatches.push_back( Reference< frame::XDispatch >( pDispatch ) ); +} + +void CommandDispatchContainer::setShapeController( ShapeController* pController ) +{ + m_pShapeController = pController; + m_aToBeDisposedDispatches.push_back( Reference< frame::XDispatch >( pController ) ); +} + } // namespace chart diff --git a/chart2/source/controller/main/CommandDispatchContainer.hxx b/chart2/source/controller/main/CommandDispatchContainer.hxx index d51cd2bdb..f071e246b 100644 --- a/chart2/source/controller/main/CommandDispatchContainer.hxx +++ b/chart2/source/controller/main/CommandDispatchContainer.hxx @@ -41,6 +41,10 @@ namespace chart { +class ChartController; +class DrawCommandDispatch; +class ShapeController; + /** @HTML Helper class for implementing the <code>XDispatchProvider</code> interface @@ -53,9 +57,9 @@ namespace chart <li>Check if the command is handled by this class, e.g. Undo. If so, return a corresponding <code>XDispatch</code> implementation, and cache this implementation for later use</li> - <li>Otherwise send the command to the fallback dispatch provider, if it + <li>Otherwise send the command to the chart dispatch provider, if it can handle this dispatch (determined by the list of commands given in - <code>setFallbackDispatch()</code>).</li> + <code>setChartDispatch()</code>).</li> </ul> <p>The <code>XDispatch</code>Provider is designed to return different @@ -65,17 +69,18 @@ namespace chart <p>As most commands need much information of the controller and are implemented there, the controller handles most of the commands itself (it also implements <code>XDispatch</code>). Therefore it is set here as - fallback dispatch.</p> + chart dispatch.</p> */ class CommandDispatchContainer { public: - // note: the fallback dispatcher should be removed when all commands are - // handled by other dispatchers. (Fallback is currently the controller + // note: the chart dispatcher should be removed when all commands are + // handled by other dispatchers. (Chart is currently the controller // itself) explicit CommandDispatchContainer( const ::com::sun::star::uno::Reference< - ::com::sun::star::uno::XComponentContext > & xContext ); + ::com::sun::star::uno::XComponentContext > & xContext, + ChartController* pController ); void setModel( const ::com::sun::star::uno::Reference< @@ -84,18 +89,18 @@ public: // const ::com::sun::star::uno::Reference< // ::com::sun::star::chart2::XUndoManager > & xUndoManager ); - /** Set a fallback dispatcher that is used for all commands contained in - rFallbackCommands + /** Set a chart dispatcher that is used for all commands contained in + rChartCommands */ - void setFallbackDispatch( + void setChartDispatch( const ::com::sun::star::uno::Reference< - ::com::sun::star::frame::XDispatch > xFallbackDispatch, - const ::std::set< ::rtl::OUString > & rFallbackCommands ); + ::com::sun::star::frame::XDispatch > xChartDispatch, + const ::std::set< ::rtl::OUString > & rChartCommands ); /** Returns the dispatch that is able to do the command given in rURL, if implemented here. If the URL is not implemented here, it should be - checked whether the command is one of the commands given as fallback via - the setFallbackDispatch() method. If so, call the fallback dispatch. + checked whether the command is one of the commands given via + the setChartDispatch() method. If so, call the chart dispatch. <p>If all this fails, return an empty dispatch.</p> */ @@ -116,6 +121,11 @@ public: const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > & xChartController, const ::com::sun::star::util::URL & rURL ); + void setDrawCommandDispatch( DrawCommandDispatch* pDispatch ); + DrawCommandDispatch* getDrawCommandDispatch() { return m_pDrawCommandDispatch; } + void setShapeController( ShapeController* pController ); + ShapeController* getShapeController() { return m_pShapeController; } + private: typedef ::std::map< ::rtl::OUString, @@ -133,10 +143,14 @@ private: ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > m_xModel; ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XUndoManager > m_xUndoManager; - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > m_xFallbackDispatcher; - ::std::set< ::rtl::OUString > m_aFallbackCommands; + ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > m_xChartDispatcher; + ::std::set< ::rtl::OUString > m_aChartCommands; ::std::set< ::rtl::OUString > m_aContainerDocumentCommands; + + ChartController* m_pChartController; + DrawCommandDispatch* m_pDrawCommandDispatch; + ShapeController* m_pShapeController; }; } // namespace chart diff --git a/chart2/source/controller/main/ControllerCommandDispatch.cxx b/chart2/source/controller/main/ControllerCommandDispatch.cxx index c57d2f7f3..3eef0396f 100644 --- a/chart2/source/controller/main/ControllerCommandDispatch.cxx +++ b/chart2/source/controller/main/ControllerCommandDispatch.cxx @@ -42,6 +42,7 @@ #include "RegressionCurveHelper.hxx" #include "DataSeriesHelper.hxx" #include "StatisticsHelper.hxx" +#include "ShapeController.hxx" #include <com/sun/star/util/XModifyBroadcaster.hpp> #include <com/sun/star/frame/XStorable.hpp> @@ -178,22 +179,22 @@ void ControllerState::update( Reference< view::XSelectionSupplier > xSelectionSupplier( xController, uno::UNO_QUERY ); - OUString aSelObjCID; - // Update ControllerState variables. if( xSelectionSupplier.is()) { uno::Any aSelObj( xSelectionSupplier->getSelection() ); + ObjectIdentifier aSelOID( aSelObj ); + OUString aSelObjCID( aSelOID.getObjectCID() ); - bHasSelectedObject = ((aSelObj >>= aSelObjCID) && aSelObjCID.getLength() > 0); + bHasSelectedObject = aSelOID.isValid(); ObjectType aObjectType(ObjectIdentifier::getObjectType( aSelObjCID )); - bIsPositionableObject = (OBJECTTYPE_DATA_POINT != aObjectType) && ObjectIdentifier::isDragableObject( aSelObjCID ); + bIsPositionableObject = (OBJECTTYPE_DATA_POINT != aObjectType) && aSelOID.isDragableObject(); bIsTextObject = OBJECTTYPE_TITLE == aObjectType; uno::Reference< chart2::XDiagram > xDiagram( ChartModelHelper::findDiagram( xModel )); - bIsFormateableObjectSelected = bHasSelectedObject; + bIsFormateableObjectSelected = bHasSelectedObject && aSelOID.isAutoGeneratedObject(); if( OBJECTTYPE_DIAGRAM==aObjectType || OBJECTTYPE_DIAGRAM_WALL==aObjectType || OBJECTTYPE_DIAGRAM_FLOOR==aObjectType ) bIsFormateableObjectSelected = DiagramHelper::isSupportingFloorAndWall( xDiagram ); @@ -457,13 +458,15 @@ DBG_NAME(ControllerCommandDispatch) ControllerCommandDispatch::ControllerCommandDispatch( const Reference< uno::XComponentContext > & xContext, - const Reference< frame::XController > & xController ) : + ChartController* pController, CommandDispatchContainer* pContainer ) : impl::ControllerCommandDispatch_Base( xContext ), - m_xController( xController ), - m_xSelectionSupplier( xController, uno::UNO_QUERY ), - m_xDispatch( xController, uno::UNO_QUERY ), + m_pChartController( pController ), + m_xController( Reference< frame::XController >( pController ) ), + m_xSelectionSupplier( Reference< view::XSelectionSupplier >( pController ) ), + m_xDispatch( Reference< frame::XDispatch >( pController ) ), m_apModelState( new impl::ModelState() ), - m_apControllerState( new impl::ControllerState() ) + m_apControllerState( new impl::ControllerState() ), + m_pDispatchContainer( pContainer ) { DBG_CTOR(ControllerCommandDispatch,NULL); } @@ -523,6 +526,8 @@ void ControllerCommandDispatch::updateCommandAvailability() // @todo: determine correctly bool bHasSuitableClipboardContent = true; + bool bShapeContext = ( m_pChartController ? m_pChartController->isShapeContext() : false ); + // edit commands m_aCommandAvailability[ C2U(".uno:Cut")] = bIsWritable && bControllerStateIsValid && m_apControllerState->bIsDeleteableObjectSelected; m_aCommandAvailability[ C2U(".uno:Copy")] = bControllerStateIsValid && m_apControllerState->bHasSelectedObject; @@ -540,7 +545,8 @@ void ControllerCommandDispatch::updateCommandAvailability() m_aCommandAvailability[ C2U(".uno:DefaultColors")] = bIsWritable; m_aCommandAvailability[ C2U(".uno:BarWidth")] = bIsWritable; m_aCommandAvailability[ C2U(".uno:NumberOfLines")] = bIsWritable; - m_aCommandAvailability[ C2U(".uno:ArrangeRow")] = m_apControllerState->bMayMoveSeriesForward || m_apControllerState->bMayMoveSeriesBackward; + m_aCommandAvailability[ C2U(".uno:ArrangeRow")] = + bShapeContext || ( bIsWritable && bControllerStateIsValid && ( m_apControllerState->bMayMoveSeriesForward || m_apControllerState->bMayMoveSeriesBackward ) ); // insert objects m_aCommandAvailability[ C2U(".uno:InsertTitles")] = m_aCommandAvailability[ C2U(".uno:InsertMenuTitles")] = bIsWritable; @@ -574,6 +580,7 @@ void ControllerCommandDispatch::updateCommandAvailability() m_aCommandAvailability[ C2U(".uno:Legend")] = bIsWritable && m_apModelState->bHasLegend; m_aCommandAvailability[ C2U(".uno:DiagramWall")] = bIsWritable && bModelStateIsValid && m_apModelState->bHasWall; m_aCommandAvailability[ C2U(".uno:DiagramArea")] = bIsWritable; + m_aCommandAvailability[ C2U(".uno:TransformDialog")] = bIsWritable && bControllerStateIsValid && m_apControllerState->bHasSelectedObject && m_apControllerState->bIsPositionableObject; // 3d commands @@ -623,8 +630,10 @@ void ControllerCommandDispatch::updateCommandAvailability() m_aCommandAvailability[ C2U(".uno:DiagramGridAll")] = bIsWritable && bModelStateIsValid && m_apModelState->HasAnyGrid(); // series arrangement - m_aCommandAvailability[ C2U(".uno:Forward")] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesForward; - m_aCommandAvailability[ C2U(".uno:Backward")] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesBackward; + m_aCommandAvailability[ C2U(".uno:Forward")] = ( bShapeContext ? isShapeControllerCommandAvailable( C2U( ".uno:Forward" ) ) : + ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesForward ) ); + m_aCommandAvailability[ C2U(".uno:Backward")] = ( bShapeContext ? isShapeControllerCommandAvailable( C2U( ".uno:Backward" ) ) : + ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesBackward ) ); m_aCommandAvailability[ C2U(".uno:InsertDataLabels")] = bIsWritable; m_aCommandAvailability[ C2U(".uno:InsertDataLabel")] = bIsWritable; @@ -667,6 +676,17 @@ bool ControllerCommandDispatch::commandAvailable( const OUString & rCommand ) return false; } +bool ControllerCommandDispatch::isShapeControllerCommandAvailable( const ::rtl::OUString& rCommand ) +{ + ShapeController* pShapeController = ( m_pDispatchContainer ? m_pDispatchContainer->getShapeController() : NULL ); + if ( pShapeController ) + { + FeatureState aState( pShapeController->getState( rCommand ) ); + return aState.bEnabled; + } + return false; +} + void ControllerCommandDispatch::fireStatusEvent( const OUString & rURL, const Reference< frame::XStatusListener > & xSingleListener /* = 0 */ ) diff --git a/chart2/source/controller/main/ControllerCommandDispatch.hxx b/chart2/source/controller/main/ControllerCommandDispatch.hxx index d5e06fe18..943a3e760 100644 --- a/chart2/source/controller/main/ControllerCommandDispatch.hxx +++ b/chart2/source/controller/main/ControllerCommandDispatch.hxx @@ -38,6 +38,9 @@ namespace chart { +class ChartController; +class CommandDispatchContainer; + namespace impl { struct ModelState; @@ -64,8 +67,7 @@ public: explicit ControllerCommandDispatch( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > & xContext, - const ::com::sun::star::uno::Reference< - ::com::sun::star::frame::XController > & xController ); + ChartController* pController, CommandDispatchContainer* pContainer ); virtual ~ControllerCommandDispatch(); // late initialisation, especially for adding as listener @@ -109,6 +111,9 @@ private: bool commandAvailable( const ::rtl::OUString & rCommand ); void updateCommandAvailability(); + bool isShapeControllerCommandAvailable( const ::rtl::OUString& rCommand ); + + ChartController* m_pChartController; ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > m_xController; ::com::sun::star::uno::Reference< @@ -121,6 +126,8 @@ private: mutable ::std::map< ::rtl::OUString, bool > m_aCommandAvailability; mutable ::std::map< ::rtl::OUString, ::com::sun::star::uno::Any > m_aCommandArguments; + + CommandDispatchContainer* m_pDispatchContainer; }; } // namespace chart diff --git a/chart2/source/controller/main/DrawCommandDispatch.cxx b/chart2/source/controller/main/DrawCommandDispatch.cxx new file mode 100644 index 000000000..cd893672a --- /dev/null +++ b/chart2/source/controller/main/DrawCommandDispatch.cxx @@ -0,0 +1,674 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "DrawCommandDispatch.hxx" +#include "DrawCommandDispatch.hrc" +#include "ChartController.hxx" +#include "DrawViewWrapper.hxx" +#include "chartview/DrawModelWrapper.hxx" +#include "macros.hxx" + +#include <vos/mutex.hxx> +#include <vcl/svapp.hxx> +#include <svl/itempool.hxx> +#include <editeng/adjitem.hxx> +#include <svx/dialogs.hrc> +#include <svx/dialmgr.hxx> +#include <svx/fmmodel.hxx> +#include <svx/gallery.hxx> +#include <svx/svdoashp.hxx> +#include <svx/svdocapt.hxx> +#include <svx/svdopath.hxx> +#include <svx/svdpage.hxx> +#include <svx/unoapi.hxx> +#include <svx/xlnedit.hxx> +#include <svx/xlnedwit.hxx> +#include <svx/xlnwtit.hxx> +#include <svx/xtable.hxx> +#include <basegfx/polygon/b2dpolygon.hxx> + +#include <boost/bind.hpp> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::frame; + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; + + +//............................................................................. +namespace +{ +//............................................................................. + + // comparing two PropertyValue instances + struct PropertyValueCompare : public ::std::binary_function< beans::PropertyValue, ::rtl::OUString, bool > + { + bool operator() ( const beans::PropertyValue& rPropValue, const ::rtl::OUString& rName ) const + { + return rPropValue.Name.equals( rName ); + } + bool operator() ( const ::rtl::OUString& rName, const beans::PropertyValue& rPropValue ) const + { + return rName.equals( rPropValue.Name ); + } + }; + +//............................................................................. +} // anonymous namespace +//............................................................................. + + +//............................................................................. +namespace chart +{ +//............................................................................. + +DrawCommandDispatch::DrawCommandDispatch( const Reference< uno::XComponentContext >& rxContext, + ChartController* pController ) + :FeatureCommandDispatchBase( rxContext ) + ,m_pChartController( pController ) +{ +} + +DrawCommandDispatch::~DrawCommandDispatch() +{ +} + +void DrawCommandDispatch::initialize() +{ + FeatureCommandDispatchBase::initialize(); +} + +bool DrawCommandDispatch::isFeatureSupported( const ::rtl::OUString& rCommandURL ) +{ + sal_uInt16 nFeatureId = 0; + ::rtl::OUString aBaseCommand; + ::rtl::OUString aCustomShapeType; + return parseCommandURL( rCommandURL, &nFeatureId, &aBaseCommand, &aCustomShapeType ); +} + +::basegfx::B2DPolyPolygon getPolygon( sal_uInt16 nResId, SdrModel& rModel ) +{ + ::basegfx::B2DPolyPolygon aReturn; + XLineEndList* pLineEndList = rModel.GetLineEndList(); + if ( pLineEndList ) + { + String aName( SVX_RES( nResId ) ); + long nCount = pLineEndList->Count(); + for ( long nIndex = 0; nIndex < nCount; ++nIndex ) + { + XLineEndEntry* pEntry = pLineEndList->GetLineEnd( nIndex ); + if ( pEntry->GetName() == aName ) + { + aReturn = pEntry->GetLineEnd(); + break; + } + } + } + return aReturn; +} + +void DrawCommandDispatch::setAttributes( SdrObject* pObj ) +{ + if ( m_pChartController ) + { + DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper(); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pDrawModelWrapper && pDrawViewWrapper && pDrawViewWrapper->GetCurrentObjIdentifier() == OBJ_CUSTOMSHAPE ) + { + sal_Bool bAttributesAppliedFromGallery = sal_False; + if ( GalleryExplorer::GetSdrObjCount( GALLERY_THEME_POWERPOINT ) ) + { + ::std::vector< ::rtl::OUString > aObjList; + if ( GalleryExplorer::FillObjListTitle( GALLERY_THEME_POWERPOINT, aObjList ) ) + { + for ( sal_uInt16 i = 0; i < aObjList.size(); ++i ) + { + if ( aObjList[ i ].equalsIgnoreAsciiCase( m_aCustomShapeType ) ) + { + FmFormModel aModel; + SfxItemPool& rPool = aModel.GetItemPool(); + rPool.FreezeIdRanges(); + if ( GalleryExplorer::GetSdrObj( GALLERY_THEME_POWERPOINT, i, &aModel ) ) + { + const SdrObject* pSourceObj = aModel.GetPage( 0 )->GetObj( 0 ); + if ( pSourceObj ) + { + const SfxItemSet& rSource = pSourceObj->GetMergedItemSet(); + SfxItemSet aDest( pObj->GetModel()->GetItemPool(), // ranges from SdrAttrObj + SDRATTR_START, SDRATTR_SHADOW_LAST, + SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST, + SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION, + // Graphic Attributes + SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST, + // 3d Properties + SDRATTR_3D_FIRST, SDRATTR_3D_LAST, + // CustomShape properties + SDRATTR_CUSTOMSHAPE_FIRST, SDRATTR_CUSTOMSHAPE_LAST, + // range from SdrTextObj + EE_ITEMS_START, EE_ITEMS_END, + // end + 0, 0); + aDest.Set( rSource ); + pObj->SetMergedItemSet( aDest ); + sal_Int32 nAngle = pSourceObj->GetRotateAngle(); + if ( nAngle ) + { + double a = nAngle * F_PI18000; + pObj->NbcRotate( pObj->GetSnapRect().Center(), nAngle, sin( a ), cos( a ) ); + } + bAttributesAppliedFromGallery = sal_True; + } + } + break; + } + } + } + } + if ( !bAttributesAppliedFromGallery ) + { + pObj->SetMergedItem( SvxAdjustItem( SVX_ADJUST_CENTER, 0 ) ); + pObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) ); + pObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_BLOCK ) ); + pObj->SetMergedItem( SdrTextAutoGrowHeightItem( sal_False ) ); + ( dynamic_cast< SdrObjCustomShape* >( pObj ) )->MergeDefaultAttributes( &m_aCustomShapeType ); + } + } + } +} + +void DrawCommandDispatch::setLineEnds( SfxItemSet& rAttr ) +{ + if ( m_nFeatureId == COMMAND_ID_LINE_ARROW_END && m_pChartController ) + { + DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper(); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pDrawModelWrapper && pDrawViewWrapper ) + { + ::basegfx::B2DPolyPolygon aArrow( getPolygon( RID_SVXSTR_ARROW, pDrawModelWrapper->getSdrModel() ) ); + if ( !aArrow.count() ) + { + ::basegfx::B2DPolygon aNewArrow; + aNewArrow.append( ::basegfx::B2DPoint( 10.0, 0.0 ) ); + aNewArrow.append( ::basegfx::B2DPoint( 0.0, 30.0) ); + aNewArrow.append( ::basegfx::B2DPoint( 20.0, 30.0 ) ); + aNewArrow.setClosed( true ); + aArrow.append( aNewArrow ); + } + + SfxItemSet aSet( pDrawViewWrapper->GetModel()->GetItemPool() ); + pDrawViewWrapper->GetAttributes( aSet ); + + long nWidth = 300; // (1/100th mm) + if ( aSet.GetItemState( XATTR_LINEWIDTH ) != SFX_ITEM_DONTCARE ) + { + long nValue = ( ( const XLineWidthItem& ) aSet.Get( XATTR_LINEWIDTH ) ).GetValue(); + if ( nValue > 0 ) + { + nWidth = nValue * 3; + } + } + + rAttr.Put( XLineEndItem( SVX_RESSTR( RID_SVXSTR_ARROW ), aArrow ) ); + rAttr.Put( XLineEndWidthItem( nWidth ) ); + } + } +} + +// WeakComponentImplHelperBase +void DrawCommandDispatch::disposing() +{ +} + +// XEventListener +void DrawCommandDispatch::disposing( const lang::EventObject& /* Source */ ) + throw (uno::RuntimeException) +{ +} + +FeatureState DrawCommandDispatch::getState( const ::rtl::OUString& rCommand ) +{ + FeatureState aReturn; + aReturn.bEnabled = false; + aReturn.aState <<= false; + + sal_uInt16 nFeatureId = 0; + ::rtl::OUString aBaseCommand; + ::rtl::OUString aCustomShapeType; + if ( parseCommandURL( rCommand, &nFeatureId, &aBaseCommand, &aCustomShapeType ) ) + { + switch ( nFeatureId ) + { + case COMMAND_ID_OBJECT_SELECT: + case COMMAND_ID_DRAW_LINE: + case COMMAND_ID_LINE_ARROW_END: + case COMMAND_ID_DRAW_RECT: + case COMMAND_ID_DRAW_ELLIPSE: + case COMMAND_ID_DRAW_FREELINE_NOFILL: + case COMMAND_ID_DRAW_TEXT: + case COMMAND_ID_DRAW_CAPTION: + case COMMAND_ID_DRAWTBX_CS_BASIC: + case COMMAND_ID_DRAWTBX_CS_SYMBOL: + case COMMAND_ID_DRAWTBX_CS_ARROW: + case COMMAND_ID_DRAWTBX_CS_FLOWCHART: + case COMMAND_ID_DRAWTBX_CS_CALLOUT: + case COMMAND_ID_DRAWTBX_CS_STAR: + { + aReturn.bEnabled = true; + aReturn.aState <<= false; + } + break; + default: + { + aReturn.bEnabled = false; + aReturn.aState <<= false; + } + break; + } + } + + return aReturn; +} + +void DrawCommandDispatch::execute( const ::rtl::OUString& rCommand, const Sequence< beans::PropertyValue>& rArgs ) +{ + (void)rArgs; + + ChartDrawMode eDrawMode = CHARTDRAW_SELECT; + SdrObjKind eKind = OBJ_NONE; + bool bCreate = false; + + sal_uInt16 nFeatureId = 0; + ::rtl::OUString aBaseCommand; + ::rtl::OUString aCustomShapeType; + if ( parseCommandURL( rCommand, &nFeatureId, &aBaseCommand, &aCustomShapeType ) ) + { + m_nFeatureId = nFeatureId; + m_aCustomShapeType = aCustomShapeType; + + switch ( nFeatureId ) + { + case COMMAND_ID_OBJECT_SELECT: + { + eDrawMode = CHARTDRAW_SELECT; + eKind = OBJ_NONE; + } + break; + case COMMAND_ID_DRAW_LINE: + case COMMAND_ID_LINE_ARROW_END: + { + eDrawMode = CHARTDRAW_INSERT; + eKind = OBJ_LINE; + } + break; + case COMMAND_ID_DRAW_RECT: + { + eDrawMode = CHARTDRAW_INSERT; + eKind = OBJ_RECT; + } + break; + case COMMAND_ID_DRAW_ELLIPSE: + { + eDrawMode = CHARTDRAW_INSERT; + eKind = OBJ_CIRC; + } + break; + case COMMAND_ID_DRAW_FREELINE_NOFILL: + { + eDrawMode = CHARTDRAW_INSERT; + eKind = OBJ_FREELINE; + } + break; + case COMMAND_ID_DRAW_TEXT: + { + eDrawMode = CHARTDRAW_INSERT; + eKind = OBJ_TEXT; + bCreate = true; + } + break; + case COMMAND_ID_DRAW_CAPTION: + { + eDrawMode = CHARTDRAW_INSERT; + eKind = OBJ_CAPTION; + } + break; + case COMMAND_ID_DRAWTBX_CS_BASIC: + case COMMAND_ID_DRAWTBX_CS_SYMBOL: + case COMMAND_ID_DRAWTBX_CS_ARROW: + case COMMAND_ID_DRAWTBX_CS_FLOWCHART: + case COMMAND_ID_DRAWTBX_CS_CALLOUT: + case COMMAND_ID_DRAWTBX_CS_STAR: + { + eDrawMode = CHARTDRAW_INSERT; + eKind = OBJ_CUSTOMSHAPE; + } + break; + default: + { + eDrawMode = CHARTDRAW_SELECT; + eKind = OBJ_NONE; + } + break; + } + + if ( m_pChartController ) + { + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pDrawViewWrapper ) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + m_pChartController->setDrawMode( eDrawMode ); + setInsertObj( sal::static_int_cast< USHORT >( eKind ) ); + if ( bCreate ) + { + pDrawViewWrapper->SetCreateMode(); + } + + const ::rtl::OUString sKeyModifier( C2U( "KeyModifier" ) ); + const beans::PropertyValue* pIter = rArgs.getConstArray(); + const beans::PropertyValue* pEnd = pIter + rArgs.getLength(); + const beans::PropertyValue* pKeyModifier = ::std::find_if( + pIter, pEnd, ::std::bind2nd( PropertyValueCompare(), boost::cref( sKeyModifier ) ) ); + sal_Int16 nKeyModifier = 0; + if ( pKeyModifier && ( pKeyModifier->Value >>= nKeyModifier ) && nKeyModifier == KEY_MOD1 ) + { + if ( eDrawMode == CHARTDRAW_INSERT ) + { + SdrObject* pObj = createDefaultObject( nFeatureId ); + if ( pObj ) + { + SdrPageView* pPageView = pDrawViewWrapper->GetSdrPageView(); + pDrawViewWrapper->InsertObjectAtView( pObj, *pPageView ); + Reference< drawing::XShape > xShape( pObj->getUnoShape(), uno::UNO_QUERY ); + if ( xShape.is() ) + { + m_pChartController->m_aSelection.setSelection( xShape ); + m_pChartController->m_aSelection.applySelection( pDrawViewWrapper ); + } + if ( nFeatureId == SID_DRAW_TEXT ) + { + m_pChartController->StartTextEdit(); + } + } + } + } + } + } + } +} + +void DrawCommandDispatch::describeSupportedFeatures() +{ + implDescribeSupportedFeature( ".uno:SelectObject", COMMAND_ID_OBJECT_SELECT, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:Line", COMMAND_ID_DRAW_LINE, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:LineArrowEnd", COMMAND_ID_LINE_ARROW_END, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:Rect", COMMAND_ID_DRAW_RECT, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:Ellipse", COMMAND_ID_DRAW_ELLIPSE, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:Freeline_Unfilled", COMMAND_ID_DRAW_FREELINE_NOFILL, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:DrawText", COMMAND_ID_DRAW_TEXT, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:DrawCaption", COMMAND_ID_DRAW_CAPTION, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:BasicShapes", COMMAND_ID_DRAWTBX_CS_BASIC, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:SymbolShapes", COMMAND_ID_DRAWTBX_CS_SYMBOL, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:ArrowShapes", COMMAND_ID_DRAWTBX_CS_ARROW, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:FlowChartShapes", COMMAND_ID_DRAWTBX_CS_FLOWCHART, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:CalloutShapes", COMMAND_ID_DRAWTBX_CS_CALLOUT, CommandGroup::INSERT ); + implDescribeSupportedFeature( ".uno:StarShapes", COMMAND_ID_DRAWTBX_CS_STAR, CommandGroup::INSERT ); +} + +void DrawCommandDispatch::setInsertObj( USHORT eObj ) +{ + DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL ); + if ( pDrawViewWrapper ) + { + pDrawViewWrapper->SetCurrentObj( eObj /*, Inventor */); + } +} + +SdrObject* DrawCommandDispatch::createDefaultObject( const sal_uInt16 nID ) +{ + SdrObject* pObj = NULL; + DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL ); + DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL ); + + if ( pDrawViewWrapper && pDrawModelWrapper ) + { + Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() ); + SdrPage* pPage = GetSdrPageFromXDrawPage( xDrawPage ); + if ( pPage ) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + pObj = SdrObjFactory::MakeNewObject( pDrawViewWrapper->GetCurrentObjInventor(), + pDrawViewWrapper->GetCurrentObjIdentifier(), pPage ); + if ( pObj ) + { + long nDefaultObjectSizeWidth = 4000; + long nDefaultObjectSizeHeight = 2500; + Size aObjectSize( nDefaultObjectSizeWidth, nDefaultObjectSizeHeight ); + Rectangle aPageRect( Rectangle( Point( 0, 0 ), pPage->GetSize() ) ); + Point aObjectPos = aPageRect.Center(); + aObjectPos.X() -= aObjectSize.Width() / 2; + aObjectPos.Y() -= aObjectSize.Height() / 2; + Rectangle aRect( aObjectPos, aObjectSize ); + + switch ( nID ) + { + case COMMAND_ID_DRAW_LINE: + case COMMAND_ID_LINE_ARROW_END: + { + if ( pObj->ISA( SdrPathObj ) ) + { + Point aStart = aRect.TopLeft(); + Point aEnd = aRect.BottomRight(); + sal_Int32 nYMiddle( ( aRect.Top() + aRect.Bottom() ) / 2 ); + basegfx::B2DPolygon aPoly; + aPoly.append( basegfx::B2DPoint( aStart.X(), nYMiddle ) ); + aPoly.append( basegfx::B2DPoint( aEnd.X(), nYMiddle ) ); + ( dynamic_cast< SdrPathObj* >( pObj ) )->SetPathPoly( basegfx::B2DPolyPolygon( aPoly ) ); + SfxItemSet aSet( pDrawModelWrapper->GetItemPool() ); + setLineEnds( aSet ); + pObj->SetMergedItemSet( aSet ); + } + } + break; + case COMMAND_ID_DRAW_FREELINE_NOFILL: + { + if ( pObj->ISA( SdrPathObj ) ) + { + basegfx::B2DPolygon aInnerPoly; + aInnerPoly.append( basegfx::B2DPoint( aRect.Left(), aRect.Bottom() ) ); + aInnerPoly.appendBezierSegment( + basegfx::B2DPoint( aRect.Left(), aRect.Top() ), + basegfx::B2DPoint( aRect.Center().X(), aRect.Top() ), + basegfx::B2DPoint( aRect.Center().X(), aRect.Center().Y() ) ); + aInnerPoly.appendBezierSegment( + basegfx::B2DPoint( aRect.Center().X(), aRect.Bottom() ), + basegfx::B2DPoint( aRect.Right(), aRect.Bottom() ), + basegfx::B2DPoint( aRect.Right(), aRect.Top() ) ); + basegfx::B2DPolyPolygon aPoly; + aPoly.append( aInnerPoly ); + ( dynamic_cast< SdrPathObj* >( pObj ) )->SetPathPoly( aPoly ); + } + } + break; + case COMMAND_ID_DRAW_TEXT: + case COMMAND_ID_DRAW_TEXT_VERTICAL: + { + if ( pObj->ISA( SdrTextObj ) ) + { + SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj ); + if ( pTextObj ) + { + pTextObj->SetLogicRect( aRect ); + BOOL bVertical = ( nID == SID_DRAW_TEXT_VERTICAL ); + pTextObj->SetVerticalWriting( bVertical ); + if ( bVertical ) + { + SfxItemSet aSet( pDrawModelWrapper->GetItemPool() ); + aSet.Put( SdrTextAutoGrowWidthItem( TRUE ) ); + aSet.Put( SdrTextAutoGrowHeightItem( FALSE ) ); + aSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_TOP ) ); + aSet.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_RIGHT ) ); + pTextObj->SetMergedItemSet( aSet ); + } + } + } + } + break; + case COMMAND_ID_DRAW_CAPTION: + case COMMAND_ID_DRAW_CAPTION_VERTICAL: + { + if ( pObj->ISA( SdrCaptionObj ) ) + { + sal_Bool bIsVertical( SID_DRAW_CAPTION_VERTICAL == nID ); + SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj ); + if ( pTextObj ) + { + pTextObj->SetVerticalWriting( bIsVertical ); + } + if ( bIsVertical ) + { + SfxItemSet aSet( pObj->GetMergedItemSet() ); + aSet.Put( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) ); + aSet.Put( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_RIGHT ) ); + pObj->SetMergedItemSet( aSet ); + } + SdrCaptionObj* pCaptionObj = dynamic_cast< SdrCaptionObj* >( pObj ); + if ( pCaptionObj ) + { + pCaptionObj->SetLogicRect( aRect ); + pCaptionObj->SetTailPos( + aRect.TopLeft() - Point( aRect.GetWidth() / 2, aRect.GetHeight() / 2 ) ); + } + } + } + break; + default: + { + pObj->SetLogicRect( aRect ); + SfxItemSet aSet( pDrawModelWrapper->GetItemPool() ); + setAttributes( pObj ); + pObj->SetMergedItemSet( aSet ); + } + break; + } + } + } + } + + return pObj; +} + +bool DrawCommandDispatch::parseCommandURL( const ::rtl::OUString& rCommandURL, sal_uInt16* pnFeatureId, + ::rtl::OUString* pBaseCommand, ::rtl::OUString* pCustomShapeType ) +{ + bool bFound = true; + sal_uInt16 nFeatureId = 0; + ::rtl::OUString aBaseCommand; + ::rtl::OUString aType; + + sal_Int32 nIndex = 1; + ::rtl::OUString aToken = rCommandURL.getToken( 0, '.', nIndex ); + if ( nIndex == -1 || !aToken.getLength() ) + { + aBaseCommand = rCommandURL; + SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( aBaseCommand ); + if ( aIter != m_aSupportedFeatures.end() ) + { + nFeatureId = aIter->second.nFeatureId; + + switch ( nFeatureId ) + { + case COMMAND_ID_DRAWTBX_CS_BASIC: + { + aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "diamond" ) ); + } + break; + case COMMAND_ID_DRAWTBX_CS_SYMBOL: + { + aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "smiley" ) ); + } + break; + case COMMAND_ID_DRAWTBX_CS_ARROW: + { + aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "left-right-arrow" ) ); + } + break; + case COMMAND_ID_DRAWTBX_CS_FLOWCHART: + { + aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "flowchart-internal-storage" ) ); + } + break; + case COMMAND_ID_DRAWTBX_CS_CALLOUT: + { + aType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "round-rectangular-callout" ) ); + } + break; + case COMMAND_ID_DRAWTBX_CS_STAR: + { + aType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "star5" ) ); + } + break; + default: + { + } + break; + } + } + else + { + bFound = false; + } + } + else + { + aBaseCommand = rCommandURL.copy( 0, nIndex - 1 ); + SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( aBaseCommand ); + if ( aIter != m_aSupportedFeatures.end() ) + { + nFeatureId = aIter->second.nFeatureId; + aType = rCommandURL.getToken( 0, '.', nIndex ); + } + else + { + bFound = false; + } + } + + *pnFeatureId = nFeatureId; + *pBaseCommand = aBaseCommand; + *pCustomShapeType = aType; + + return bFound; +} + +//............................................................................. +} // namespace chart +//............................................................................. diff --git a/chart2/source/controller/main/DrawCommandDispatch.hrc b/chart2/source/controller/main/DrawCommandDispatch.hrc new file mode 100644 index 000000000..66a729498 --- /dev/null +++ b/chart2/source/controller/main/DrawCommandDispatch.hrc @@ -0,0 +1,50 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART_DRAWCOMMANDDISPATCH_HRC +#define CHART_DRAWCOMMANDDISPATCH_HRC + +//----------------------------------------------------------------------------- +//Command Ids: +#define COMMAND_ID_OBJECT_SELECT 1 +#define COMMAND_ID_DRAW_LINE 2 +#define COMMAND_ID_LINE_ARROW_END 3 +#define COMMAND_ID_DRAW_RECT 4 +#define COMMAND_ID_DRAW_ELLIPSE 5 +#define COMMAND_ID_DRAW_FREELINE_NOFILL 6 +#define COMMAND_ID_DRAW_TEXT 7 +#define COMMAND_ID_DRAW_TEXT_VERTICAL 8 +#define COMMAND_ID_DRAW_CAPTION 9 +#define COMMAND_ID_DRAW_CAPTION_VERTICAL 10 +#define COMMAND_ID_DRAWTBX_CS_BASIC 11 +#define COMMAND_ID_DRAWTBX_CS_SYMBOL 12 +#define COMMAND_ID_DRAWTBX_CS_ARROW 13 +#define COMMAND_ID_DRAWTBX_CS_FLOWCHART 14 +#define COMMAND_ID_DRAWTBX_CS_CALLOUT 15 +#define COMMAND_ID_DRAWTBX_CS_STAR 16 + +// CHART_DRAWCOMMANDDISPATCH_HRC +#endif diff --git a/chart2/source/controller/main/DrawCommandDispatch.hxx b/chart2/source/controller/main/DrawCommandDispatch.hxx new file mode 100644 index 000000000..a1e54f01b --- /dev/null +++ b/chart2/source/controller/main/DrawCommandDispatch.hxx @@ -0,0 +1,93 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART2_DRAWCOMMANDDISPATCH_HXX +#define CHART2_DRAWCOMMANDDISPATCH_HXX + +#include "FeatureCommandDispatchBase.hxx" + +#include <tools/solar.h> + +class SfxItemSet; +class SdrObject; + +//............................................................................. +namespace chart +{ +//............................................................................. + +class ChartController; + +/** This is a CommandDispatch implementation for drawing objects. + */ +class DrawCommandDispatch: public FeatureCommandDispatchBase +{ +public: + DrawCommandDispatch( const ::com::sun::star::uno::Reference< + ::com::sun::star::uno::XComponentContext >& rxContext, ChartController* pController ); + virtual ~DrawCommandDispatch(); + + // late initialisation, especially for adding as listener + virtual void initialize(); + + virtual bool isFeatureSupported( const ::rtl::OUString& rCommandURL ); + + void setAttributes( SdrObject* pObj ); + void setLineEnds( SfxItemSet& rAttr ); + +protected: + // WeakComponentImplHelperBase + virtual void SAL_CALL disposing(); + + // XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) + throw (::com::sun::star::uno::RuntimeException); + + // state of a feature + virtual FeatureState getState( const ::rtl::OUString& rCommand ); + + // execute a feature + virtual void execute( const ::rtl::OUString& rCommand, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& rArgs ); + + // all the features which should be handled by this class + virtual void describeSupportedFeatures(); + +private: + void setInsertObj( USHORT eObj ); + SdrObject* createDefaultObject( const sal_uInt16 nID ); + + bool parseCommandURL( const ::rtl::OUString& rCommandURL, sal_uInt16* pnFeatureId, ::rtl::OUString* pBaseCommand, ::rtl::OUString* pCustomShapeType ); + + ChartController* m_pChartController; + ::rtl::OUString m_aCustomShapeType; +}; + +//............................................................................. +} // namespace chart +//............................................................................. + +// CHART2_DRAWCOMMANDDISPATCH_HXX +#endif diff --git a/chart2/source/controller/main/ElementSelector.cxx b/chart2/source/controller/main/ElementSelector.cxx index d9b5fe465..210a26294 100644 --- a/chart2/source/controller/main/ElementSelector.cxx +++ b/chart2/source/controller/main/ElementSelector.cxx @@ -34,6 +34,9 @@ #include "ObjectHierarchy.hxx" #include "servicenames.hxx" #include <chartview/ExplicitValueProvider.hxx> +#include "DrawViewWrapper.hxx" +#include "ResId.hxx" +#include "Strings.hrc" #include <toolkit/helper/vclunohelper.hxx> #include <vos/mutex.hxx> @@ -71,20 +74,21 @@ SelectorListBox::~SelectorListBox() { } -void lcl_addObjectsToList( const ObjectHierarchy& rHierarchy, const ObjectHierarchy::tCID & rParent, std::vector< ListBoxEntryData >& rEntries +void lcl_addObjectsToList( const ObjectHierarchy& rHierarchy, const ObjectHierarchy::tOID & rParent, std::vector< ListBoxEntryData >& rEntries , const sal_Int32 nHierarchyDepth, const Reference< chart2::XChartDocument >& xChartDoc ) { ObjectHierarchy::tChildContainer aChildren( rHierarchy.getChildren(rParent) ); ObjectHierarchy::tChildContainer::const_iterator aIt( aChildren.begin()); while( aIt != aChildren.end() ) { - ::rtl::OUString aCID = *aIt; + ObjectHierarchy::tOID aOID = *aIt; + ::rtl::OUString aCID = aOID.getObjectCID(); ListBoxEntryData aEntry; - aEntry.CID = aCID; + aEntry.OID = aOID; aEntry.UIName += ObjectNameProvider::getNameForCID( aCID, xChartDoc ); aEntry.nHierarchyDepth = nHierarchyDepth; rEntries.push_back(aEntry); - lcl_addObjectsToList( rHierarchy, aCID, rEntries, nHierarchyDepth+1, xChartDoc ); + lcl_addObjectsToList( rHierarchy, aOID, rEntries, nHierarchyDepth+1, xChartDoc ); ++aIt; } } @@ -103,14 +107,18 @@ void SelectorListBox::UpdateChartElementsListAndSelection() if( xChartController.is() ) { Reference< view::XSelectionSupplier > xSelectionSupplier( xChartController, uno::UNO_QUERY); + ObjectHierarchy::tOID aSelectedOID; rtl::OUString aSelectedCID; if( xSelectionSupplier.is() ) - xSelectionSupplier->getSelection() >>= aSelectedCID; + { + aSelectedOID = ObjectIdentifier( xSelectionSupplier->getSelection() ); + aSelectedCID = aSelectedOID.getObjectCID(); + } Reference< chart2::XChartDocument > xChartDoc( xChartController->getModel(), uno::UNO_QUERY ); - ObjectType eType( ObjectIdentifier::getObjectType( aSelectedCID )); + ObjectType eType( aSelectedOID.getObjectType() ); bool bAddSelectionToList = false; - if( eType == OBJECTTYPE_DATA_POINT || eType == OBJECTTYPE_DATA_LABEL ) + if ( eType == OBJECTTYPE_DATA_POINT || eType == OBJECTTYPE_DATA_LABEL || eType == OBJECTTYPE_SHAPE ) bAddSelectionToList = true; Reference< uno::XInterface > xChartView; @@ -119,27 +127,39 @@ void SelectorListBox::UpdateChartElementsListAndSelection() xChartView = xFact->createInstance( CHART_VIEW_SERVICE_NAME ); ExplicitValueProvider* pExplicitValueProvider = 0;//ExplicitValueProvider::getExplicitValueProvider(xChartView); dies erzeugt alle sichtbaren datenpinkte, das ist zu viel ObjectHierarchy aHierarchy( xChartDoc, pExplicitValueProvider, true /*bFlattenDiagram*/, true /*bOrderingForElementSelector*/ ); - lcl_addObjectsToList( aHierarchy, aHierarchy.getRootNodeCID(), m_aEntries, 0, xChartDoc ); + lcl_addObjectsToList( aHierarchy, aHierarchy.getRootNodeOID(), m_aEntries, 0, xChartDoc ); std::vector< ListBoxEntryData >::iterator aIt( m_aEntries.begin() ); if( bAddSelectionToList ) { - rtl::OUString aSeriesCID = ObjectIdentifier::createClassifiedIdentifierForParticle( ObjectIdentifier::getSeriesParticleFromCID( aSelectedCID ) ); - for( aIt = m_aEntries.begin(); aIt != m_aEntries.end(); ++aIt ) + if ( aSelectedOID.isAutoGeneratedObject() ) { - if( aIt->CID.match( aSeriesCID ) ) + rtl::OUString aSeriesCID = ObjectIdentifier::createClassifiedIdentifierForParticle( ObjectIdentifier::getSeriesParticleFromCID( aSelectedCID ) ); + for( aIt = m_aEntries.begin(); aIt != m_aEntries.end(); ++aIt ) { - ListBoxEntryData aEntry; - aEntry.UIName = ObjectNameProvider::getNameForCID( aSelectedCID, xChartDoc ); - aEntry.CID = aSelectedCID; - ++aIt; - if( aIt != m_aEntries.end() ) - m_aEntries.insert(aIt, aEntry); - else - m_aEntries.push_back( aEntry ); - break; + if( aIt->OID.getObjectCID().match( aSeriesCID ) ) + { + ListBoxEntryData aEntry; + aEntry.UIName = ObjectNameProvider::getNameForCID( aSelectedCID, xChartDoc ); + aEntry.OID = aSelectedOID; + ++aIt; + if( aIt != m_aEntries.end() ) + m_aEntries.insert(aIt, aEntry); + else + m_aEntries.push_back( aEntry ); + break; + } } } + else if ( aSelectedOID.isAdditionalShape() ) + { + ListBoxEntryData aEntry; + SdrObject* pSelectedObj = DrawViewWrapper::getSdrObject( aSelectedOID.getAdditionalShape() ); + ::rtl::OUString aName( pSelectedObj ? pSelectedObj->GetName() : String() ); + aEntry.UIName = ( aName.getLength() > 0 ? aName : ::rtl::OUString( String( SchResId( STR_OBJECT_SHAPE ) ) ) ); + aEntry.OID = aSelectedOID; + m_aEntries.push_back( aEntry ); + } } USHORT nEntryPosToSelect = 0; bool bSelectionFound = false; @@ -147,7 +167,7 @@ void SelectorListBox::UpdateChartElementsListAndSelection() for( USHORT nN=0; aIt != m_aEntries.end(); ++aIt, ++nN ) { InsertEntry( aIt->UIName ); - if( !bSelectionFound && aSelectedCID.equals( aIt->CID ) ) + if ( !bSelectionFound && aSelectedOID == aIt->OID ) { nEntryPosToSelect = nN; bSelectionFound = true; @@ -188,11 +208,10 @@ void SelectorListBox::Select() USHORT nPos = GetSelectEntryPos(); if( nPos < m_aEntries.size() ) { - rtl::OUString aCID = m_aEntries[nPos].CID; - uno::Any aASelection( uno::makeAny(aCID) ); + ObjectHierarchy::tOID aOID = m_aEntries[nPos].OID; Reference< view::XSelectionSupplier > xSelectionSupplier( m_xChartController.get(), uno::UNO_QUERY ); if( xSelectionSupplier.is() ) - xSelectionSupplier->select(aASelection); + xSelectionSupplier->select( aOID.getAny() ); } ReleaseFocus_Impl(); } diff --git a/chart2/source/controller/main/ElementSelector.hxx b/chart2/source/controller/main/ElementSelector.hxx index e2337b671..3110e0ee2 100644 --- a/chart2/source/controller/main/ElementSelector.hxx +++ b/chart2/source/controller/main/ElementSelector.hxx @@ -28,6 +28,7 @@ #define _CHART_ELEMENTSELECTOR_HXX #include "ServiceMacros.hxx" +#include "ObjectHierarchy.hxx" #include <com/sun/star/lang/XServiceInfo.hpp> #include <cppuhelper/implbase1.hxx> #include <svtools/toolboxcontroller.hxx> @@ -45,7 +46,7 @@ namespace chart struct ListBoxEntryData { rtl::OUString UIName; - rtl::OUString CID; + ObjectHierarchy::tOID OID; sal_Int32 nHierarchyDepth; ListBoxEntryData() : nHierarchyDepth(0) diff --git a/chart2/source/controller/main/FeatureCommandDispatchBase.cxx b/chart2/source/controller/main/FeatureCommandDispatchBase.cxx new file mode 100644 index 000000000..0dbbc762f --- /dev/null +++ b/chart2/source/controller/main/FeatureCommandDispatchBase.cxx @@ -0,0 +1,114 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "FeatureCommandDispatchBase.hxx" + +using namespace ::com::sun::star; + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; + +namespace chart +{ + +FeatureCommandDispatchBase::FeatureCommandDispatchBase( const Reference< uno::XComponentContext >& rxContext ) + :CommandDispatch( rxContext ) + ,m_nFeatureId( 0 ) +{ +} + +FeatureCommandDispatchBase::~FeatureCommandDispatchBase() +{ +} + +void FeatureCommandDispatchBase::initialize() +{ + CommandDispatch::initialize(); + fillSupportedFeatures(); +} + +bool FeatureCommandDispatchBase::isFeatureSupported( const ::rtl::OUString& rCommandURL ) +{ + SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( rCommandURL ); + if ( aIter != m_aSupportedFeatures.end() ) + { + return true; + } + return false; +} + +void FeatureCommandDispatchBase::fireStatusEvent( const ::rtl::OUString& rURL, + const Reference< frame::XStatusListener >& xSingleListener /* = 0 */ ) +{ + if ( rURL.getLength() == 0 ) + { + SupportedFeatures::const_iterator aEnd( m_aSupportedFeatures.end() ); + for ( SupportedFeatures::const_iterator aIter( m_aSupportedFeatures.begin() ); aIter != aEnd; ++aIter ) + { + FeatureState aFeatureState( getState( aIter->first ) ); + fireStatusEventForURL( aIter->first, aFeatureState.aState, aFeatureState.bEnabled, xSingleListener ); + } + } + else + { + FeatureState aFeatureState( getState( rURL ) ); + fireStatusEventForURL( rURL, aFeatureState.aState, aFeatureState.bEnabled, xSingleListener ); + } +} + +// XDispatch +void FeatureCommandDispatchBase::dispatch( const util::URL& URL, + const Sequence< beans::PropertyValue >& Arguments ) + throw (uno::RuntimeException) +{ + ::rtl::OUString aCommand( URL.Complete ); + if ( getState( aCommand ).bEnabled ) + { + execute( aCommand, Arguments ); + } +} + +void FeatureCommandDispatchBase::implDescribeSupportedFeature( const sal_Char* pAsciiCommandURL, + sal_uInt16 nId, sal_Int16 nGroup ) +{ + ControllerFeature aFeature; + aFeature.Command = ::rtl::OUString::createFromAscii( pAsciiCommandURL ); + aFeature.nFeatureId = nId; + aFeature.GroupId = nGroup; + + m_aSupportedFeatures[ aFeature.Command ] = aFeature; +} + +void FeatureCommandDispatchBase::fillSupportedFeatures() +{ + describeSupportedFeatures(); +} + +} // namespace chart diff --git a/chart2/source/controller/main/FeatureCommandDispatchBase.hxx b/chart2/source/controller/main/FeatureCommandDispatchBase.hxx new file mode 100644 index 000000000..6dd610e0b --- /dev/null +++ b/chart2/source/controller/main/FeatureCommandDispatchBase.hxx @@ -0,0 +1,115 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART2_FEATURECOMMANDDISPATCHBASE_HXX +#define CHART2_FEATURECOMMANDDISPATCHBASE_HXX + +#include "CommandDispatch.hxx" + +#include <com/sun/star/frame/CommandGroup.hpp> +#include <com/sun/star/frame/DispatchInformation.hpp> +#include <com/sun/star/util/URL.hpp> + +namespace chart +{ + +struct ControllerFeature: public ::com::sun::star::frame::DispatchInformation +{ + sal_uInt16 nFeatureId; +}; + +typedef ::std::map< ::rtl::OUString, + ControllerFeature, + ::std::less< ::rtl::OUString > > SupportedFeatures; + +struct FeatureState +{ + bool bEnabled; + ::com::sun::star::uno::Any aState; + + FeatureState() : bEnabled( false ) { } +}; + +/** This is a base class for CommandDispatch implementations with feature support. + */ +class FeatureCommandDispatchBase: public CommandDispatch +{ +public: + FeatureCommandDispatchBase( const ::com::sun::star::uno::Reference< + ::com::sun::star::uno::XComponentContext >& rxContext ); + virtual ~FeatureCommandDispatchBase(); + + // late initialisation, especially for adding as listener + virtual void initialize(); + + virtual bool isFeatureSupported( const ::rtl::OUString& rCommandURL ); + +protected: + // XDispatch + virtual void SAL_CALL dispatch( const ::com::sun::star::util::URL& URL, + const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& Arguments ) + throw (::com::sun::star::uno::RuntimeException); + + virtual void fireStatusEvent( const ::rtl::OUString& rURL, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener >& xSingleListener ); + + // state of a feature + virtual FeatureState getState( const ::rtl::OUString& rCommand ) = 0; + + // execute a feature + virtual void execute( const ::rtl::OUString& rCommand, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& rArgs ) = 0; + + // all the features which should be handled by this class + virtual void describeSupportedFeatures() = 0; + + /** describes a feature supported by the controller + + Must not be called outside <member>describeSupportedFeatures</member>. + + @param pAsciiCommandURL + the URL of the feature command + @param nId + the id of the feature. Later references to this feature usually happen by id, not by + URL. + @param nGroup + the command group of the feature. This is important for configuring the controller UI + by the user, see also <type scope="com::sun::star::frame">CommandGroup</type>. + */ + void implDescribeSupportedFeature( const sal_Char* pAsciiCommandURL, sal_uInt16 nId, + sal_Int16 nGroup = ::com::sun::star::frame::CommandGroup::INTERNAL ); + + mutable SupportedFeatures m_aSupportedFeatures; + + sal_uInt16 m_nFeatureId; + +private: + void fillSupportedFeatures(); +}; + +} // namespace chart + +// CHART2_FEATURECOMMANDDISPATCHBASE_HXX +#endif diff --git a/chart2/source/tools/ImplUndoManager.cxx b/chart2/source/controller/main/ImplUndoManager.cxx index ce5764c25..7a289c46f 100644 --- a/chart2/source/tools/ImplUndoManager.cxx +++ b/chart2/source/controller/main/ImplUndoManager.cxx @@ -107,7 +107,10 @@ UndoElement::~UndoElement() void UndoElement::initialize( const Reference< frame::XModel > & xModel ) { - m_xModel.set( UndoElement::cloneModel( xModel )); + if ( xModel.is() ) + { + m_xModel.set( UndoElement::cloneModel( xModel ) ); + } } void UndoElement::dispose() @@ -353,6 +356,29 @@ UndoElement * UndoElementWithSelection::createFromModel( return new UndoElementWithSelection( getActionString(), xModel ); } +// ---------------------------------------- + +ShapeUndoElement::ShapeUndoElement( const OUString& rActionString, SdrUndoAction* pAction ) + :UndoElement( rActionString, Reference< frame::XModel >() ) + ,m_pAction( pAction ) +{ +} + +ShapeUndoElement::ShapeUndoElement( const ShapeUndoElement& rOther ) + :UndoElement( rOther ) + ,m_pAction( rOther.m_pAction ) +{ +} + +ShapeUndoElement::~ShapeUndoElement() +{ +} + +SdrUndoAction* ShapeUndoElement::getSdrUndoAction() +{ + return m_pAction; +} + // ======================================== UndoStack::UndoStack() : diff --git a/chart2/source/tools/ImplUndoManager.hxx b/chart2/source/controller/main/ImplUndoManager.hxx index 1829290ed..ad40bf87a 100644 --- a/chart2/source/tools/ImplUndoManager.hxx +++ b/chart2/source/controller/main/ImplUndoManager.hxx @@ -38,6 +38,9 @@ #include <utility> #include <deque> + +class SdrUndoAction; + namespace com { namespace sun { namespace star { namespace chart2 { class XInternalDataProvider; @@ -146,6 +149,19 @@ private: ::com::sun::star::uno::Any m_aSelection; }; +class ShapeUndoElement : public UndoElement +{ +public: + ShapeUndoElement( const ::rtl::OUString& rActionString, SdrUndoAction* pAction ); + ShapeUndoElement( const ShapeUndoElement& rOther ); + virtual ~ShapeUndoElement(); + + SdrUndoAction* getSdrUndoAction(); + +private: + SdrUndoAction* m_pAction; +}; + /** Note that all models that are put into this container are at some point disposed of inside this class. (At least in the destructor). That means the models retrieved here should never be used, but instead their content diff --git a/chart2/source/controller/main/ObjectHierarchy.cxx b/chart2/source/controller/main/ObjectHierarchy.cxx index c68738ca6..811437a28 100644 --- a/chart2/source/controller/main/ObjectHierarchy.cxx +++ b/chart2/source/controller/main/ObjectHierarchy.cxx @@ -40,6 +40,7 @@ #include "ChartTypeHelper.hxx" #include "DataSeriesHelper.hxx" #include "LegendHelper.hxx" +#include "chartview/DrawModelWrapper.hxx" #include <map> #include <algorithm> @@ -63,24 +64,25 @@ using ::rtl::OUString; namespace { -struct lcl_ObjectToCID : public ::std::unary_function< Reference< uno::XInterface >, OUString > + +struct lcl_ObjectToOID : public ::std::unary_function< Reference< uno::XInterface >, ::chart::ObjectIdentifier > { - explicit lcl_ObjectToCID( const Reference< chart2::XChartDocument > & xChartDoc ) : + explicit lcl_ObjectToOID( const Reference< chart2::XChartDocument > & xChartDoc ) : m_xModel( xChartDoc, uno::UNO_QUERY ) {} - OUString operator() ( const Reference< uno::XInterface > & xObj ) + ::chart::ObjectIdentifier operator() ( const Reference< uno::XInterface > & xObj ) { - return ::chart::ObjectIdentifier::createClassifiedIdentifierForObject( xObj, m_xModel ); + return ::chart::ObjectIdentifier( ::chart::ObjectIdentifier::createClassifiedIdentifierForObject( xObj, m_xModel ) ); } private: Reference< frame::XModel > m_xModel; }; -void lcl_getChildCIDs( - ::chart::ObjectHierarchy::tChildContainer & rOutChildren, - const Reference< container::XIndexAccess > & xShapes ) +void lcl_getChildOIDs( + ::chart::ObjectHierarchy::tChildContainer& rOutChildren, + const Reference< container::XIndexAccess >& xShapes ) { if( xShapes.is()) { @@ -98,11 +100,11 @@ void lcl_getChildCIDs( aName.getLength() > 0 && ::chart::ObjectIdentifier::isCID( aName )) { - rOutChildren.push_back( aName ); + rOutChildren.push_back( ::chart::ObjectIdentifier( aName ) ); } Reference< container::XIndexAccess > xNewShapes( xShapeProp, uno::UNO_QUERY ); if( xNewShapes.is()) - lcl_getChildCIDs( rOutChildren, xNewShapes ); + lcl_getChildOIDs( rOutChildren, xNewShapes ); } } } @@ -116,31 +118,31 @@ void lcl_addAxisTitle( const Reference< XAxis >& xAxis, ::chart::ObjectHierarchy Reference< XTitle > xAxisTitle( xAxisTitled->getTitleObject()); if( xAxisTitle.is()) rContainer.push_back( - ::chart::ObjectIdentifier::createClassifiedIdentifierForObject( xAxisTitle, xChartModel )); + ::chart::ObjectIdentifier( ::chart::ObjectIdentifier::createClassifiedIdentifierForObject( xAxisTitle, xChartModel ) ) ); } } } // anonymous namespace - namespace chart { namespace impl { + class ImplObjectHierarchy { public: explicit ImplObjectHierarchy( - const Reference< XChartDocument > & xChartDocument, - ExplicitValueProvider * pExplicitValueProvider, + const Reference< XChartDocument >& xChartDocument, + ExplicitValueProvider* pExplicitValueProvider, bool bFlattenDiagram, bool bOrderingForElementSelector ); - bool hasChildren( const OUString & rParent ); - ObjectHierarchy::tChildContainer getChildren( const OUString & rParent ); - ObjectHierarchy::tChildContainer getSiblings( const OUString & rNode ); + bool hasChildren( const ObjectHierarchy::tOID& rParent ); + ObjectHierarchy::tChildContainer getChildren( const ObjectHierarchy::tOID& rParent ); + ObjectHierarchy::tChildContainer getSiblings( const ObjectHierarchy::tOID& rNode ); - ObjectHierarchy::tCID getParent( const ObjectHierarchy::tCID & rCID ); + ObjectHierarchy::tOID getParent( const ObjectHierarchy::tOID& rOID ); private: void createTree( const Reference< XChartDocument > & xChartDocument ); @@ -149,9 +151,9 @@ private: const Reference< XChartDocument > & xChartDoc, const Reference< XDiagram > & xDiagram ); void createDiagramTree( - ObjectHierarchy::tChildContainer & rContainer, - const Reference< XChartDocument > & xChartDoc, - const Reference< XDiagram > & xDiagram ); + ObjectHierarchy::tChildContainer& rContainer, + const Reference< XChartDocument >& xChartDoc, + const Reference< XDiagram >& xDiagram ); void createDataSeriesTree( ObjectHierarchy::tChildContainer & rOutDiagramSubContainer, const Reference< XDiagram > & xDiagram ); @@ -162,22 +164,23 @@ private: ObjectHierarchy::tChildContainer & rContainer, const Reference< XChartDocument > & xChartDoc, const Reference< XDiagram > & xDiagram ); + void createAdditionalShapesTree( ObjectHierarchy::tChildContainer& rContainer ); - ObjectHierarchy::tCID getParentImpl( - const ObjectHierarchy::tCID & rParentCID, - const ObjectHierarchy::tCID & rCID ); + ObjectHierarchy::tOID getParentImpl( + const ObjectHierarchy::tOID& rParentOID, + const ObjectHierarchy::tOID& rOID ); - typedef ::std::map< OUString, ObjectHierarchy::tChildContainer > + typedef ::std::map< ObjectHierarchy::tOID, ObjectHierarchy::tChildContainer > tChildMap; tChildMap m_aChildMap; - ExplicitValueProvider * m_pExplicitValueProvider; + ExplicitValueProvider* m_pExplicitValueProvider; bool m_bFlattenDiagram; bool m_bOrderingForElementSelector; }; ImplObjectHierarchy::ImplObjectHierarchy( - const Reference< XChartDocument > & xChartDocument, - ExplicitValueProvider * pExplicitValueProvider, + const Reference< XChartDocument >& xChartDocument, + ExplicitValueProvider* pExplicitValueProvider, bool bFlattenDiagram, bool bOrderingForElementSelector ) : m_pExplicitValueProvider( pExplicitValueProvider ), @@ -189,15 +192,15 @@ ImplObjectHierarchy::ImplObjectHierarchy( m_pExplicitValueProvider = 0; } -void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChartDocument ) +void ImplObjectHierarchy::createTree( const Reference< XChartDocument >& xChartDocument ) { - if( !xChartDocument.is()) + if( !xChartDocument.is() ) return; //@todo: change ObjectIdentifier to take an XChartDocument rather than XModel Reference< frame::XModel > xModel( xChartDocument, uno::UNO_QUERY ); Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartDocument ) ); - OUString aDiaCID( ObjectIdentifier::createClassifiedIdentifierForObject( xDiagram, xModel )); + ObjectHierarchy::tOID aDiaOID( ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xDiagram, xModel ) ) ); ObjectHierarchy::tChildContainer aTopLevelContainer; // First Level @@ -205,8 +208,8 @@ void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChart // Chart Area if( m_bOrderingForElementSelector ) { - aTopLevelContainer.push_back( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, OUString() ) ); - aTopLevelContainer.push_back( aDiaCID ); + aTopLevelContainer.push_back( ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, OUString() ) ) ); + aTopLevelContainer.push_back( aDiaOID ); createWallAndFloor( aTopLevelContainer, xDiagram ); createLegendTree( aTopLevelContainer, xChartDocument, xDiagram ); } @@ -218,7 +221,7 @@ void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChart Reference< XTitle > xMainTitle( xDocTitled->getTitleObject()); if( xMainTitle.is()) aTopLevelContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForObject( xMainTitle, xModel )); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xMainTitle, xModel ) ) ); } if( xDiagram.is()) @@ -230,7 +233,7 @@ void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChart Reference< XTitle > xSubTitle( xDiaTitled->getTitleObject()); if( xSubTitle.is()) aTopLevelContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForObject( xSubTitle, xModel )); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xSubTitle, xModel ) ) ); } if( !m_bOrderingForElementSelector ) @@ -241,7 +244,7 @@ void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChart lcl_addAxisTitle( aAxes[i], aTopLevelContainer, xModel ); // Diagram - aTopLevelContainer.push_back( aDiaCID ); + aTopLevelContainer.push_back( aDiaOID ); } if( m_bFlattenDiagram ) @@ -250,21 +253,27 @@ void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChart { ObjectHierarchy::tChildContainer aSubContainer; createDiagramTree( aSubContainer, xChartDocument, xDiagram ); - if( ! aSubContainer.empty()) - m_aChildMap[ aDiaCID ] = aSubContainer; + if( !aSubContainer.empty() ) + m_aChildMap[ aDiaOID ] = aSubContainer; } if( !m_bOrderingForElementSelector ) createLegendTree( aTopLevelContainer, xChartDocument, xDiagram ); } + // #i12587# support for shapes in chart + if ( !m_bOrderingForElementSelector ) + { + createAdditionalShapesTree( aTopLevelContainer ); + } + // Chart Area if( !m_bOrderingForElementSelector ) aTopLevelContainer.push_back( - ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, OUString() ) ); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, OUString() ) ) ); if( ! aTopLevelContainer.empty()) - m_aChildMap[ ObjectHierarchy::getRootNodeCID() ] = aTopLevelContainer; + m_aChildMap[ ObjectHierarchy::getRootNodeOID() ] = aTopLevelContainer; } void ImplObjectHierarchy::createLegendTree( @@ -274,18 +283,18 @@ void ImplObjectHierarchy::createLegendTree( { if( xDiagram.is() && LegendHelper::hasLegend( xDiagram ) ) { - OUString aLegendCID( ObjectIdentifier::createClassifiedIdentifierForObject( xDiagram->getLegend(), Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ) )); - rContainer.push_back( aLegendCID ); + ObjectHierarchy::tOID aLegendOID( ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xDiagram->getLegend(), Reference< frame::XModel >( xChartDoc, uno::UNO_QUERY ) ) ) ); + rContainer.push_back( aLegendOID ); // iterate over child shapes of legend and search for matching CIDs if( m_pExplicitValueProvider ) { Reference< container::XIndexAccess > xLegendShapeContainer( - m_pExplicitValueProvider->getShapeForCID( aLegendCID ), uno::UNO_QUERY ); - ObjectHierarchy::tChildContainer aLegendEntryCIDs; - lcl_getChildCIDs( aLegendEntryCIDs, xLegendShapeContainer ); + m_pExplicitValueProvider->getShapeForCID( aLegendOID.getObjectCID() ), uno::UNO_QUERY ); + ObjectHierarchy::tChildContainer aLegendEntryOIDs; + lcl_getChildOIDs( aLegendEntryOIDs, xLegendShapeContainer ); - m_aChildMap[ aLegendCID ] = aLegendEntryCIDs; + m_aChildMap[ aLegendOID ] = aLegendEntryOIDs; } } } @@ -305,7 +314,7 @@ void ImplObjectHierarchy::createAxesTree( if( !m_bOrderingForElementSelector ) ::std::transform( aAxes.getConstArray(), aAxes.getConstArray() + aAxes.getLength(), ::std::back_inserter( rContainer ), - lcl_ObjectToCID( xChartDoc )); + lcl_ObjectToOID( xChartDoc )); // get all axes, also invisible ones aAxes = AxisHelper::getAllAxesOfDiagram( xDiagram, /* bOnlyVisible = */ false ); @@ -329,7 +338,7 @@ void ImplObjectHierarchy::createAxesTree( // axis if( AxisHelper::isAxisVisible( xAxis ) ) rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForObject( xAxis, xChartModel ) ); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xAxis, xChartModel ) ) ); // axis title lcl_addAxisTitle( aAxes[nA], rContainer, xChartModel ); @@ -340,7 +349,7 @@ void ImplObjectHierarchy::createAxesTree( { //main grid rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel ) ); + ObjectIdentifier( ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel ) ) ) ); } Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );; @@ -352,7 +361,7 @@ void ImplObjectHierarchy::createAxesTree( { //sub grid rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, nSubGrid ) ); + ObjectIdentifier( ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, nSubGrid ) ) ) ); } } } @@ -369,12 +378,12 @@ void ImplObjectHierarchy::createWallAndFloor( if( bHasWall && bIsThreeD ) { rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString())); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString() ) ) ); Reference< beans::XPropertySet > xFloor( xDiagram->getFloor()); if( xFloor.is()) rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_FLOOR, rtl::OUString())); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_FLOOR, rtl::OUString() ) ) ); } } @@ -426,9 +435,9 @@ void ImplObjectHierarchy::createDataSeriesTree( OUString aSeriesParticle( ObjectIdentifier::createParticleForSeries( nDiagramIndex, nCooSysIdx, nCTIdx, nSeriesIdx )); - ObjectHierarchy::tCID aSeriesCID( - ObjectIdentifier::createClassifiedIdentifierForParticle( aSeriesParticle )); - rOutDiagramSubContainer.push_back( aSeriesCID ); + ObjectHierarchy::tOID aSeriesOID( + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForParticle( aSeriesParticle ) ) ); + rOutDiagramSubContainer.push_back( aSeriesOID ); ObjectHierarchy::tChildContainer aSeriesSubContainer; @@ -440,7 +449,7 @@ void ImplObjectHierarchy::createDataSeriesTree( rtl::OUString aChildParticle( ObjectIdentifier::getStringForType( OBJECTTYPE_DATA_LABELS ) ); aChildParticle+=(C2U("=")); aSeriesSubContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForParticles( aSeriesParticle, aChildParticle )); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForParticles( aSeriesParticle, aChildParticle ) ) ); } // Statistics @@ -454,11 +463,11 @@ void ImplObjectHierarchy::createDataSeriesTree( { bool bIsAverageLine = RegressionCurveHelper::isMeanValueLine( aCurves[nCurveIdx] ); aSeriesSubContainer.push_back( - ObjectIdentifier::createDataCurveCID( aSeriesParticle, nCurveIdx, bIsAverageLine )); + ObjectIdentifier( ObjectIdentifier::createDataCurveCID( aSeriesParticle, nCurveIdx, bIsAverageLine ) ) ); if( RegressionCurveHelper::hasEquation( aCurves[nCurveIdx] ) ) { aSeriesSubContainer.push_back( - ObjectIdentifier::createDataCurveEquationCID( aSeriesParticle, nCurveIdx )); + ObjectIdentifier( ObjectIdentifier::createDataCurveEquationCID( aSeriesParticle, nCurveIdx ) ) ); } } Reference< beans::XPropertySet > xSeriesProp( xSeries, uno::UNO_QUERY ); @@ -472,8 +481,8 @@ void ImplObjectHierarchy::createDataSeriesTree( ( nStyle != ::com::sun::star::chart::ErrorBarStyle::NONE ) ) { aSeriesSubContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierWithParent( - OBJECTTYPE_DATA_ERRORS, OUString(), aSeriesParticle )); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierWithParent( + OBJECTTYPE_DATA_ERRORS, OUString(), aSeriesParticle ) ) ); } } } @@ -484,12 +493,12 @@ void ImplObjectHierarchy::createDataSeriesTree( if( m_pExplicitValueProvider ) { Reference< container::XIndexAccess > xSeriesShapeContainer( - m_pExplicitValueProvider->getShapeForCID( aSeriesCID ), uno::UNO_QUERY ); - lcl_getChildCIDs( aSeriesSubContainer, xSeriesShapeContainer ); + m_pExplicitValueProvider->getShapeForCID( aSeriesOID.getObjectCID() ), uno::UNO_QUERY ); + lcl_getChildOIDs( aSeriesSubContainer, xSeriesShapeContainer ); } if( ! aSeriesSubContainer.empty()) - m_aChildMap[ aSeriesCID ] = aSeriesSubContainer; + m_aChildMap[ aSeriesOID ] = aSeriesSubContainer; } } } @@ -500,9 +509,38 @@ void ImplObjectHierarchy::createDataSeriesTree( } } -bool ImplObjectHierarchy::hasChildren( const OUString & rParent ) +void ImplObjectHierarchy::createAdditionalShapesTree( ObjectHierarchy::tChildContainer& rContainer ) { - if( rParent.getLength()) + try + { + if ( m_pExplicitValueProvider ) + { + Reference< drawing::XDrawPage > xDrawPage( m_pExplicitValueProvider->getDrawModelWrapper()->getMainDrawPage() ); + Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY_THROW ); + Reference< drawing::XShapes > xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) ); + sal_Int32 nCount = xDrawPageShapes->getCount(); + for ( sal_Int32 i = 0; i < nCount; ++i ) + { + Reference< drawing::XShape > xShape; + if ( xDrawPageShapes->getByIndex( i ) >>= xShape ) + { + if ( xShape.is() && xShape != xChartRoot ) + { + rContainer.push_back( ObjectIdentifier( xShape ) ); + } + } + } + } + } + catch ( uno::Exception& ex ) + { + ASSERT_EXCEPTION( ex ); + } +} + +bool ImplObjectHierarchy::hasChildren( const ObjectHierarchy::tOID& rParent ) +{ + if ( rParent.isValid() ) { tChildMap::const_iterator aIt( m_aChildMap.find( rParent )); if( aIt != m_aChildMap.end()) @@ -511,9 +549,9 @@ bool ImplObjectHierarchy::hasChildren( const OUString & rParent ) return false; } -ObjectHierarchy::tChildContainer ImplObjectHierarchy::getChildren( const OUString & rParent ) +ObjectHierarchy::tChildContainer ImplObjectHierarchy::getChildren( const ObjectHierarchy::tOID& rParent ) { - if( rParent.getLength()) + if ( rParent.isValid() ) { tChildMap::const_iterator aIt( m_aChildMap.find( rParent )); if( aIt != m_aChildMap.end()) @@ -522,9 +560,9 @@ ObjectHierarchy::tChildContainer ImplObjectHierarchy::getChildren( const OUStrin return ObjectHierarchy::tChildContainer(); } -ObjectHierarchy::tChildContainer ImplObjectHierarchy::getSiblings( const OUString & rNode ) +ObjectHierarchy::tChildContainer ImplObjectHierarchy::getSiblings( const ObjectHierarchy::tOID& rNode ) { - if( rNode.getLength() && !ObjectHierarchy::isRootNode( rNode )) + if ( rNode.isValid() && !ObjectHierarchy::isRootNode( rNode ) ) { for( tChildMap::const_iterator aIt( m_aChildMap.begin()); aIt != m_aChildMap.end(); ++aIt ) @@ -538,23 +576,23 @@ ObjectHierarchy::tChildContainer ImplObjectHierarchy::getSiblings( const OUStrin return ObjectHierarchy::tChildContainer(); } -ObjectHierarchy::tCID ImplObjectHierarchy::getParentImpl( - const ObjectHierarchy::tCID & rParentCID, - const ObjectHierarchy::tCID & rCID ) +ObjectHierarchy::tOID ImplObjectHierarchy::getParentImpl( + const ObjectHierarchy::tOID & rParentOID, + const ObjectHierarchy::tOID & rOID ) { // search children - ObjectHierarchy::tChildContainer aChildren( getChildren( rParentCID )); + ObjectHierarchy::tChildContainer aChildren( getChildren( rParentOID )); ObjectHierarchy::tChildContainer::const_iterator aIt( - ::std::find( aChildren.begin(), aChildren.end(), rCID )); + ::std::find( aChildren.begin(), aChildren.end(), rOID )); // recursion end if( aIt != aChildren.end()) - return rParentCID; + return rParentOID; for( aIt = aChildren.begin(); aIt != aChildren.end(); ++aIt ) { // recursion - ObjectHierarchy::tCID aTempParent( getParentImpl( *aIt, rCID )); - if( aTempParent.getLength()) + ObjectHierarchy::tOID aTempParent( getParentImpl( *aIt, rOID )); + if ( aTempParent.isValid() ) { // exit on success return aTempParent; @@ -562,17 +600,18 @@ ObjectHierarchy::tCID ImplObjectHierarchy::getParentImpl( } // exit on fail - return ObjectHierarchy::tCID(); + return ObjectHierarchy::tOID(); } -ObjectHierarchy::tCID ImplObjectHierarchy::getParent( - const ObjectHierarchy::tCID & rCID ) +ObjectHierarchy::tOID ImplObjectHierarchy::getParent( + const ObjectHierarchy::tOID & rOID ) { - return getParentImpl( ObjectHierarchy::getRootNodeCID(), rCID ); + return getParentImpl( ObjectHierarchy::getRootNodeOID(), rOID ); } } // namespace impl + ObjectHierarchy::ObjectHierarchy( const Reference< XChartDocument > & xChartDocument, ExplicitValueProvider * pExplicitValueProvider /* = 0 */, @@ -585,60 +624,60 @@ ObjectHierarchy::~ObjectHierarchy() {} // static -ObjectHierarchy::tCID ObjectHierarchy::getRootNodeCID() +ObjectHierarchy::tOID ObjectHierarchy::getRootNodeOID() { - return C2U("ROOT"); + return ObjectIdentifier( C2U( "ROOT" ) ); } // static -bool ObjectHierarchy::isRootNode( const ObjectHierarchy::tCID & rCID ) +bool ObjectHierarchy::isRootNode( const ObjectHierarchy::tOID& rOID ) { - return rCID.equals( ObjectHierarchy::getRootNodeCID()); + return ( rOID == ObjectHierarchy::getRootNodeOID() ); } ObjectHierarchy::tChildContainer ObjectHierarchy::getTopLevelChildren() const { - return m_apImpl->getChildren( ObjectHierarchy::getRootNodeCID()); + return m_apImpl->getChildren( ObjectHierarchy::getRootNodeOID()); } -bool ObjectHierarchy::hasChildren( const tCID & rParent ) const +bool ObjectHierarchy::hasChildren( const tOID& rParent ) const { return m_apImpl->hasChildren( rParent ); } ObjectHierarchy::tChildContainer ObjectHierarchy::getChildren( - const ObjectHierarchy::tCID & rParent ) const + const ObjectHierarchy::tOID& rParent ) const { - if( rParent.getLength()) + if ( rParent.isValid() ) return m_apImpl->getChildren( rParent ); return ObjectHierarchy::tChildContainer(); } ObjectHierarchy::tChildContainer ObjectHierarchy::getSiblings( - const ObjectHierarchy::tCID & rNode ) const + const ObjectHierarchy::tOID& rNode ) const { - if( rNode.getLength() && !isRootNode( rNode )) + if ( rNode.isValid() && !isRootNode( rNode ) ) return m_apImpl->getSiblings( rNode ); return ObjectHierarchy::tChildContainer(); } -ObjectHierarchy::tCID ObjectHierarchy::getParent( - const ObjectHierarchy::tCID & rNode ) const +ObjectHierarchy::tOID ObjectHierarchy::getParent( + const ObjectHierarchy::tOID& rNode ) const { return m_apImpl->getParent( rNode ); } sal_Int32 ObjectHierarchy::getIndexInParent( - const ObjectHierarchy::tCID & rNode ) const + const ObjectHierarchy::tOID& rNode ) const { - tCID aParentCID( m_apImpl->getParent( rNode )); - tChildContainer aChildren( m_apImpl->getChildren( aParentCID )); - tChildContainer::const_iterator aIt( aChildren.begin()); + tOID aParentOID( m_apImpl->getParent( rNode )); + tChildContainer aChildren( m_apImpl->getChildren( aParentOID ) ); + tChildContainer::const_iterator aIt( aChildren.begin() ); for( sal_Int32 nIndex = 0; aIt != aChildren.end(); ++nIndex, ++aIt ) { - if( aIt->equals( rNode )) + if ( *aIt == rNode ) return nIndex; } return -1; @@ -647,16 +686,18 @@ sal_Int32 ObjectHierarchy::getIndexInParent( // ================================================================================ ObjectKeyNavigation::ObjectKeyNavigation( - const ObjectHierarchy::tCID & rCurrentCID, + const ObjectHierarchy::tOID & rCurrentOID, const Reference< chart2::XChartDocument > & xChartDocument, ExplicitValueProvider * pExplicitValueProvider /* = 0 */ ) : - m_aCurrentCID( rCurrentCID ), + m_aCurrentOID( rCurrentOID ), m_xChartDocument( xChartDocument ), m_pExplicitValueProvider( pExplicitValueProvider ), m_bStepDownInDiagram( true ) { - if( m_aCurrentCID.getLength() == 0 ) - setCurrentSelection( ObjectHierarchy::getRootNodeCID()); + if ( !m_aCurrentOID.isValid() ) + { + setCurrentSelection( ObjectHierarchy::getRootNodeOID() ); + } } bool ObjectKeyNavigation::handleKeyEvent( @@ -685,7 +726,7 @@ bool ObjectKeyNavigation::handleKeyEvent( bResult = down(); break; case awt::Key::ESCAPE: - setCurrentSelection( OUString()); + setCurrentSelection( ObjectIdentifier() ); bResult = true; break; default: @@ -695,20 +736,20 @@ bool ObjectKeyNavigation::handleKeyEvent( return bResult; } -void ObjectKeyNavigation::setCurrentSelection( const ObjectHierarchy::tCID & rCID ) +void ObjectKeyNavigation::setCurrentSelection( const ObjectHierarchy::tOID& rOID ) { - m_aCurrentCID = rCID; + m_aCurrentOID = rOID; } -ObjectHierarchy::tCID ObjectKeyNavigation::getCurrentSelection() const +ObjectHierarchy::tOID ObjectKeyNavigation::getCurrentSelection() const { - return m_aCurrentCID; + return m_aCurrentOID; } bool ObjectKeyNavigation::first() { ObjectHierarchy aHierarchy( m_xChartDocument, m_pExplicitValueProvider, m_bStepDownInDiagram ); - ObjectHierarchy::tChildContainer aSiblings( aHierarchy.getSiblings( getCurrentSelection())); + ObjectHierarchy::tChildContainer aSiblings( aHierarchy.getSiblings( getCurrentSelection() ) ); bool bResult = !aSiblings.empty(); if( bResult ) setCurrentSelection( aSiblings.front()); @@ -720,7 +761,7 @@ bool ObjectKeyNavigation::first() bool ObjectKeyNavigation::last() { ObjectHierarchy aHierarchy( m_xChartDocument, m_pExplicitValueProvider, m_bStepDownInDiagram ); - ObjectHierarchy::tChildContainer aSiblings( aHierarchy.getSiblings( getCurrentSelection())); + ObjectHierarchy::tChildContainer aSiblings( aHierarchy.getSiblings( getCurrentSelection() ) ); bool bResult = !aSiblings.empty(); if( bResult ) setCurrentSelection( aSiblings.back()); @@ -732,7 +773,7 @@ bool ObjectKeyNavigation::last() bool ObjectKeyNavigation::next() { ObjectHierarchy aHierarchy( m_xChartDocument, m_pExplicitValueProvider, m_bStepDownInDiagram ); - ObjectHierarchy::tChildContainer aSiblings( aHierarchy.getSiblings( getCurrentSelection())); + ObjectHierarchy::tChildContainer aSiblings( aHierarchy.getSiblings( getCurrentSelection() ) ); bool bResult = !aSiblings.empty(); if( bResult ) { diff --git a/chart2/source/controller/main/SelectionHelper.cxx b/chart2/source/controller/main/SelectionHelper.cxx index 40cfbf28f..1e1e40795 100644 --- a/chart2/source/controller/main/SelectionHelper.cxx +++ b/chart2/source/controller/main/SelectionHelper.cxx @@ -80,25 +80,29 @@ void impl_selectObject( SdrObject* pObjectToSelect, DrawViewWrapper& rDrawViewWr bool Selection::hasSelection() { - return m_aSelectedObjectCID.getLength() || m_xSelectAdditionalShape.is(); + return m_aSelectedOID.isValid(); } rtl::OUString Selection::getSelectedCID() { - return m_aSelectedObjectCID; + return m_aSelectedOID.getObjectCID(); } uno::Reference< drawing::XShape > Selection::getSelectedAdditionalShape() { - return m_xSelectAdditionalShape; + return m_aSelectedOID.getAdditionalShape(); +} + +ObjectIdentifier Selection::getSelectedOID() const +{ + return m_aSelectedOID; } bool Selection::setSelection( const ::rtl::OUString& rCID ) { - if( !rCID.equals( m_aSelectedObjectCID ) ) + if ( !rCID.equals( m_aSelectedOID.getObjectCID() ) ) { - m_aSelectedObjectCID = rCID; - m_xSelectAdditionalShape.set(0); + m_aSelectedOID = ObjectIdentifier( rCID ); return true; } return false; @@ -106,10 +110,10 @@ bool Selection::setSelection( const ::rtl::OUString& rCID ) bool Selection::setSelection( const uno::Reference< drawing::XShape >& xShape ) { - if( !(m_xSelectAdditionalShape==xShape) ) + if ( !( xShape == m_aSelectedOID.getAdditionalShape() ) ) { clearSelection(); - m_xSelectAdditionalShape = xShape; + m_aSelectedOID = ObjectIdentifier( xShape ); return true; } return false; @@ -117,18 +121,18 @@ bool Selection::setSelection( const uno::Reference< drawing::XShape >& xShape ) void Selection::clearSelection() { - m_aSelectedObjectCID = m_aSelectedObjectCID_beforeMouseDown - = m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = rtl::OUString(); - m_xSelectAdditionalShape.set(0); + m_aSelectedOID = ObjectIdentifier(); + m_aSelectedOID_beforeMouseDown = ObjectIdentifier(); + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); } bool Selection::maybeSwitchSelectionAfterSingleClickWasEnsured() { - if( m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.getLength() - && !m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.equals(m_aSelectedObjectCID) ) + if ( m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing.isValid() + && m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing != m_aSelectedOID ) { - m_aSelectedObjectCID = m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing; - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); + m_aSelectedOID = m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing; + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); return true; } return false; @@ -136,18 +140,20 @@ bool Selection::maybeSwitchSelectionAfterSingleClickWasEnsured() void Selection::resetPossibleSelectionAfterSingleClickWasEnsured() { - if( m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.getLength() ) - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); + if ( m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing.isValid() ) + { + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); + } } void Selection::remindSelectionBeforeMouseDown() { - m_aSelectedObjectCID_beforeMouseDown = m_aSelectedObjectCID; + m_aSelectedOID_beforeMouseDown = m_aSelectedOID; } bool Selection::isSelectionDifferentFromBeforeMouseDown() { - return !ObjectIdentifier::areIdenticalObjects( m_aSelectedObjectCID, m_aSelectedObjectCID_beforeMouseDown ); + return ( m_aSelectedOID != m_aSelectedOID_beforeMouseDown ); } void Selection::applySelection( DrawViewWrapper* pDrawViewWrapper ) @@ -159,10 +165,14 @@ void Selection::applySelection( DrawViewWrapper* pDrawViewWrapper ) pDrawViewWrapper->UnmarkAll(); } SdrObject* pObjectToSelect = 0; - if( m_aSelectedObjectCID.getLength() ) - pObjectToSelect = pDrawViewWrapper->getNamedSdrObject( m_aSelectedObjectCID ); - else if( m_xSelectAdditionalShape.is() ) - pObjectToSelect = DrawViewWrapper::getSdrObject( m_xSelectAdditionalShape ); + if ( m_aSelectedOID.isAutoGeneratedObject() ) + { + pObjectToSelect = pDrawViewWrapper->getNamedSdrObject( m_aSelectedOID.getObjectCID() ); + } + else if( m_aSelectedOID.isAdditionalShape() ) + { + pObjectToSelect = DrawViewWrapper::getSdrObject( m_aSelectedOID.getAdditionalShape() ); + } impl_selectObject( pObjectToSelect, *pDrawViewWrapper ); } @@ -176,7 +186,7 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* //do not toggel multiclick selection if right clicked on the selected object or waiting for double click bool bAllowMultiClickSelectionChange = !bIsRightMouse && !bWaitingForDoubleClick; - const rtl::OUString aNameOfLastSelectedObject( m_aSelectedObjectCID ); + ObjectIdentifier aLastSelectedObject( m_aSelectedOID ); ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); @@ -185,86 +195,89 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* //get object to select: SdrObject* pNewObj = 0; { - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); - m_xSelectAdditionalShape.set(0); + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); //the search for the object to select starts with the hit object deepest in the grouping hierarchy (a leaf in the tree) //further we travel along the grouping hierarchy from child to parent pNewObj = pDrawViewWrapper->getHitObject(rMousePos); - m_aSelectedObjectCID = lcl_getObjectName( pNewObj );//name of pNewObj - rtl::OUString aTestFirstHit = m_aSelectedObjectCID; + m_aSelectedOID = ObjectIdentifier( lcl_getObjectName( pNewObj ) );//name of pNewObj //ignore handle only objects for hit test - while( pNewObj && m_aSelectedObjectCID.match(C2U("HandlesOnly")) ) + while( pNewObj && m_aSelectedOID.getObjectCID().match( C2U( "HandlesOnly" ) ) ) { pNewObj->SetMarkProtect(true); pNewObj = pDrawViewWrapper->getHitObject(rMousePos); - m_aSelectedObjectCID = lcl_getObjectName( pNewObj ); + m_aSelectedOID = ObjectIdentifier( lcl_getObjectName( pNewObj ) ); } //accept only named objects while searching for the object to select - //this call may change m_aSelectedObjectCID - if( SelectionHelper::findNamedParent( pNewObj, m_aSelectedObjectCID, true ) ) + //this call may change m_aSelectedOID + if ( SelectionHelper::findNamedParent( pNewObj, m_aSelectedOID, true ) ) { //if the so far found object is a multi click object further steps are necessary - while( ObjectIdentifier::isMultiClickObject( m_aSelectedObjectCID ) ) + while( ObjectIdentifier::isMultiClickObject( m_aSelectedOID.getObjectCID() ) ) { - bool bSameObjectAsLastSelected = ObjectIdentifier::areIdenticalObjects( aNameOfLastSelectedObject, m_aSelectedObjectCID ); + bool bSameObjectAsLastSelected = ( aLastSelectedObject == m_aSelectedOID ); if( bSameObjectAsLastSelected ) { //if the same child is clicked again don't go up further break; } - if( ObjectIdentifier::areSiblings(aNameOfLastSelectedObject,m_aSelectedObjectCID) ) + if ( ObjectIdentifier::areSiblings( aLastSelectedObject.getObjectCID(), m_aSelectedOID.getObjectCID() ) ) { //if a sibling of the last selected object is clicked don't go up further break; } SdrObject* pLastChild = pNewObj; - rtl::OUString aLastChildName = m_aSelectedObjectCID; - if(!SelectionHelper::findNamedParent( pNewObj, m_aSelectedObjectCID, false )) + ObjectIdentifier aLastChild = m_aSelectedOID; + if ( !SelectionHelper::findNamedParent( pNewObj, m_aSelectedOID, false ) ) { //take the one found so far break; } //if the last selected object is found don't go up further //but take the last child if selection change is allowed - if( ObjectIdentifier::areIdenticalObjects( aNameOfLastSelectedObject, m_aSelectedObjectCID ) ) + if ( aLastSelectedObject == m_aSelectedOID ) { if( bAllowMultiClickSelectionChange ) { pNewObj = pLastChild; - m_aSelectedObjectCID = aLastChildName; + m_aSelectedOID = aLastChild; } else - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = aLastChildName; + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = aLastChild; break; } } - DBG_ASSERT(pNewObj && m_aSelectedObjectCID.getLength(),"somehow lost selected object"); + DBG_ASSERT( pNewObj && m_aSelectedOID.isValid(), "somehow lost selected object" ); } else { //maybe an additional shape was hit - m_aSelectedObjectCID = rtl::OUString(); - if( pNewObj ) + if ( pNewObj ) + { + m_aSelectedOID = ObjectIdentifier( uno::Reference< drawing::XShape >( pNewObj->getUnoShape(), uno::UNO_QUERY ) ); + } + else { - m_xSelectAdditionalShape = uno::Reference< drawing::XShape >( pNewObj->getUnoShape(), uno::UNO_QUERY); + m_aSelectedOID = ObjectIdentifier(); } } - if(!m_xSelectAdditionalShape.is()) + if ( !m_aSelectedOID.isAdditionalShape() ) { rtl::OUString aPageCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, rtl::OUString() ) );//@todo read CID from model - if( !m_aSelectedObjectCID.getLength() ) - m_aSelectedObjectCID = aPageCID; + if ( !m_aSelectedOID.isAutoGeneratedObject() ) + { + m_aSelectedOID = ObjectIdentifier( aPageCID ); + } //check wether the diagram was hit but not selected (e.g. because it has no filling): rtl::OUString aWallCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString() ) );//@todo read CID from model - if( m_aSelectedObjectCID.equals( aPageCID ) || m_aSelectedObjectCID.equals( aWallCID ) || !m_aSelectedObjectCID.getLength() ) + if ( m_aSelectedOID.getObjectCID().equals( aPageCID ) || m_aSelectedOID.getObjectCID().equals( aWallCID ) || !m_aSelectedOID.isAutoGeneratedObject() ) { rtl::OUString aDiagramCID = ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM, rtl::OUString::valueOf( sal_Int32(0) ) ); //todo: if more than one diagram is available in future do chack the list of all diagrams here @@ -273,7 +286,7 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* { if( pDrawViewWrapper->IsObjectHit( pDiagram, rMousePos ) ) { - m_aSelectedObjectCID = aDiagramCID; + m_aSelectedOID = ObjectIdentifier( aDiagramCID ); pNewObj = pDiagram; } } @@ -281,18 +294,21 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* } } - if( bIsRightMouse && m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.getLength() ) - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); + if ( bIsRightMouse && m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing.isValid() ) + { + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); + } } } bool Selection::isResizeableObjectSelected() { - ObjectType eObjectType = ObjectIdentifier::getObjectType( m_aSelectedObjectCID ); + ObjectType eObjectType = m_aSelectedOID.getObjectType(); switch( eObjectType ) { case OBJECTTYPE_DIAGRAM: case OBJECTTYPE_DIAGRAM_WALL: + case OBJECTTYPE_SHAPE: return true; default: return false; @@ -302,14 +318,17 @@ bool Selection::isResizeableObjectSelected() bool Selection::isRotateableObjectSelected( const uno::Reference< frame::XModel >& xChartModel ) { - return SelectionHelper::isRotateableObject( m_aSelectedObjectCID, xChartModel ); + return SelectionHelper::isRotateableObject( m_aSelectedOID.getObjectCID(), xChartModel ); } bool Selection::isDragableObjectSelected() { - if( m_aSelectedObjectCID.getLength() ) - return ObjectIdentifier::isDragableObject( m_aSelectedObjectCID ); - return m_xSelectAdditionalShape.is(); + return m_aSelectedOID.isDragableObject(); +} + +bool Selection::isAdditionalShapeSelected() const +{ + return m_aSelectedOID.isAdditionalShape(); } //----------------------------------------------------------------------------- @@ -351,6 +370,20 @@ bool SelectionHelper::findNamedParent( SdrObject*& pInOutObject } //static +bool SelectionHelper::findNamedParent( SdrObject*& pInOutObject + , ObjectIdentifier& rOutObject + , bool bGivenObjectMayBeResult ) +{ + rtl::OUString aName; + if ( findNamedParent( pInOutObject, aName, bGivenObjectMayBeResult ) ) + { + rOutObject = ObjectIdentifier( aName ); + return true; + } + return false; +} + +//static bool SelectionHelper::isDragableObjectHitTwice( const Point& rMPos , const rtl::OUString& rNameOfSelectedObject , const DrawViewWrapper& rDrawViewWrapper ) @@ -366,107 +399,6 @@ bool SelectionHelper::isDragableObjectHitTwice( const Point& rMPos return true; } -/* -rtl::OUString lcl_getObjectCIDToSelect( const Point& rMPos - , const rtl::OUString& rNameOfLastSelectedObject - , DrawViewWrapper& rDrawViewWrapper - , bool bAllowMultiClickSelectionChange - , rtl::OUString& rObjectToSelectIfNoDoubleClickIsFollowing //out parameter only - ) -{ - rtl::OUString aRet; - - ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); - - //bAllowMultiClickSelectionChange==true -> a second click on the same object can lead to a changed selection (e.g. series -> single data point) - - //get object to select: - SdrObject* pNewObj = 0; - { - rObjectToSelectIfNoDoubleClickIsFollowing = C2U(""); - - //the search for the object to select starts with the hit object deepest in the grouping hierarchy (a leaf in the tree) - //further we travel along the grouping hierarchy from child to parent - pNewObj = rDrawViewWrapper.getHitObject(rMPos); - aRet = lcl_getObjectName( pNewObj );//name of pNewObj - rtl::OUString aTestFirstHit = aRet; - - //ignore handle only objects for hit test - while( pNewObj && aRet.match(C2U("HandlesOnly")) ) - { - pNewObj->SetMarkProtect(true); - pNewObj = rDrawViewWrapper.getHitObject(rMPos); - aRet = lcl_getObjectName( pNewObj ); - } - - //accept only named objects while searching for the object to select - //this call may change aRet - if( !findNamedParent( pNewObj, aRet, true ) ) - { - return C2U(""); - } - //if the so far found object is a multi click object further steps are necessary - while( ObjectIdentifier::isMultiClickObject( aRet ) ) - { - bool bSameObjectAsLastSelected = ObjectIdentifier::areIdenticalObjects( rNameOfLastSelectedObject, aRet ); - if( bSameObjectAsLastSelected ) - { - //if the same child is clicked again don't go up further - break; - } - if( ObjectIdentifier::areSiblings(rNameOfLastSelectedObject,aRet) ) - { - //if a sibling of the last selected object is clicked don't go up further - break; - } - SdrObject* pLastChild = pNewObj; - rtl::OUString aLastChildName = aRet; - if(!findNamedParent( pNewObj, aRet, false )) - { - //take the one found so far - break; - } - //if the last selected object is found don't go up further - //but take the last child if selection change is allowed - if( ObjectIdentifier::areIdenticalObjects( rNameOfLastSelectedObject, aRet ) ) - { - if( bAllowMultiClickSelectionChange ) - { - pNewObj = pLastChild; - aRet = aLastChildName; - } - else - rObjectToSelectIfNoDoubleClickIsFollowing = aLastChildName; - - break; - } - } - - //check wether the diagram was hit but not selected: - rtl::OUString aPageCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, rtl::OUString() ) );//@todo read CID from model - rtl::OUString aWallCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString() ) );//@todo read CID from model - if( aRet.equals( aPageCID ) || aRet.equals( aWallCID ) || !aRet.getLength() ) - { - rtl::OUString aDiagramCID = ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM, rtl::OUString::valueOf( sal_Int32(0) ) ); - //todo: if more than one diagram is available in future do chack the list of all diagrams here - SdrObject* pDiagram = rDrawViewWrapper.getNamedSdrObject( aDiagramCID ); - if( pDiagram ) - { - if( rDrawViewWrapper.IsObjectHit( pDiagram, rMPos ) ) - { - aRet = aDiagramCID; - pNewObj = pDiagram; - } - } - } - - DBG_ASSERT(pNewObj && aRet.getLength(),"somehow lost selected object"); - } - - return aRet; -} -*/ - // static ::rtl::OUString SelectionHelper::getHitObjectCID( const Point& rMPos, diff --git a/chart2/source/controller/main/SelectionHelper.hxx b/chart2/source/controller/main/SelectionHelper.hxx index 7337726e6..a6904cf1a 100644 --- a/chart2/source/controller/main/SelectionHelper.hxx +++ b/chart2/source/controller/main/SelectionHelper.hxx @@ -28,6 +28,7 @@ #define _CHART2_SELECTIONHELPER_HXX #include "DrawViewWrapper.hxx" +#include "ObjectIdentifier.hxx" class SdrObject; // header for enum SdrDragMode @@ -39,6 +40,8 @@ namespace chart { //............................................................................. +class ObjectIdentifier; + //----------------------------------------------------------------------------- /** */ @@ -50,12 +53,15 @@ public: //methods rtl::OUString getSelectedCID(); ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > getSelectedAdditionalShape(); + ObjectIdentifier getSelectedOID() const; bool isResizeableObjectSelected(); bool isRotateableObjectSelected( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xChartModel ); bool isDragableObjectSelected(); + bool isAdditionalShapeSelected() const; + //returns true if selection has changed bool setSelection( const ::rtl::OUString& rCID ); bool setSelection( const ::com::sun::star::uno::Reference< @@ -81,12 +87,9 @@ private: //member //the content of m_xSelectedShape is ignored in that case //the strings are used for autogenerated chart specific objects //the shape reference is used for additional shapes - ::rtl::OUString m_aSelectedObjectCID;//only single object selection so far - ::rtl::OUString m_aSelectedObjectCID_beforeMouseDown; - ::rtl::OUString m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing; - - ::com::sun::star::uno::Reference< - ::com::sun::star::drawing::XShape > m_xSelectAdditionalShape; + ObjectIdentifier m_aSelectedOID; //only single object selection so far + ObjectIdentifier m_aSelectedOID_beforeMouseDown; + ObjectIdentifier m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing; }; class SelectionHelper : public MarkHandleProvider @@ -95,6 +98,9 @@ public: static bool findNamedParent( SdrObject*& pInOutObject , rtl::OUString& rOutName , bool bGivenObjectMayBeResult ); + static bool findNamedParent( SdrObject*& pInOutObject + , ObjectIdentifier& rOutObject + , bool bGivenObjectMayBeResult ); static SdrObject* getMarkHandlesObject( SdrObject* pObj ); static E3dScene* getSceneToRotate( SdrObject* pObj ); static bool isDragableObjectHitTwice( const Point& rMPos diff --git a/chart2/source/controller/main/ShapeController.cxx b/chart2/source/controller/main/ShapeController.cxx new file mode 100644 index 000000000..61527c291 --- /dev/null +++ b/chart2/source/controller/main/ShapeController.cxx @@ -0,0 +1,738 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "ShapeController.hxx" +#include "ShapeController.hrc" +#include "ChartController.hxx" +#include "ChartWindow.hxx" +#include "ViewElementListProvider.hxx" +#include "dlg_ShapeFont.hxx" +#include "dlg_ShapeParagraph.hxx" +#include "chartview/DrawModelWrapper.hxx" +#include "macros.hxx" + +#include <com/sun/star/frame/XStorable.hpp> + +#include <vos/mutex.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/svapp.hxx> +#include <editeng/brkitem.hxx> +#include <svx/dialogs.hrc> +#include <svx/drawitem.hxx> +#include <editeng/eeitem.hxx> +#include <editeng/hyznitem.hxx> +#include <editeng/orphitem.hxx> +#include <editeng/spltitem.hxx> +#include <svx/svxdlg.hxx> +#include <editeng/widwitem.hxx> + +#include <boost/scoped_ptr.hpp> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::frame; + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; + +//............................................................................. +namespace chart +{ +//............................................................................. + +ShapeController::ShapeController( const Reference< uno::XComponentContext >& rxContext, + ChartController* pController ) + :FeatureCommandDispatchBase( rxContext ) + ,m_pChartController( pController ) +{ +} + +ShapeController::~ShapeController() +{ +} + +void ShapeController::initialize() +{ + FeatureCommandDispatchBase::initialize(); +} + +// WeakComponentImplHelperBase +void ShapeController::disposing() +{ +} + +// XEventListener +void ShapeController::disposing( const lang::EventObject& /* Source */ ) + throw (uno::RuntimeException) +{ +} + +FeatureState ShapeController::getState( const ::rtl::OUString& rCommand ) +{ + FeatureState aReturn; + aReturn.bEnabled = false; + aReturn.aState <<= false; + + bool bWritable = false; + if ( m_pChartController ) + { + Reference< frame::XStorable > xStorable( m_pChartController->getModel(), uno::UNO_QUERY ); + if ( xStorable.is() ) + { + bWritable = !xStorable->isReadonly(); + } + } + + SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( rCommand ); + if ( aIter != m_aSupportedFeatures.end() ) + { + sal_uInt16 nFeatureId = aIter->second.nFeatureId; + switch ( nFeatureId ) + { + case COMMAND_ID_FORMAT_LINE: + case COMMAND_ID_FORMAT_AREA: + case COMMAND_ID_TEXT_ATTRIBUTES: + case COMMAND_ID_TRANSFORM_DIALOG: + case COMMAND_ID_OBJECT_TITLE_DESCRIPTION: + case COMMAND_ID_RENAME_OBJECT: + { + aReturn.bEnabled = bWritable; + aReturn.aState <<= false; + } + break; + case COMMAND_ID_BRING_TO_FRONT: + case COMMAND_ID_FORWARD: + { + aReturn.bEnabled = ( bWritable && isForwardPossible() ); + aReturn.aState <<= false; + } + break; + case COMMAND_ID_BACKWARD: + case COMMAND_ID_SEND_TO_BACK: + { + + aReturn.bEnabled = ( bWritable && isBackwardPossible() ); + aReturn.aState <<= false; + } + break; + case COMMAND_ID_FONT_DIALOG: + case COMMAND_ID_PARAGRAPH_DIALOG: + { + aReturn.bEnabled = bWritable; + aReturn.aState <<= false; + } + break; + default: + { + aReturn.bEnabled = false; + aReturn.aState <<= false; + } + break; + } + } + + return aReturn; +} + +void ShapeController::execute( const ::rtl::OUString& rCommand, const Sequence< beans::PropertyValue>& rArgs ) +{ + (void)rArgs; + + SupportedFeatures::const_iterator aIter = m_aSupportedFeatures.find( rCommand ); + if ( aIter != m_aSupportedFeatures.end() ) + { + sal_uInt16 nFeatureId = aIter->second.nFeatureId; + switch ( nFeatureId ) + { + case COMMAND_ID_FORMAT_LINE: + { + executeDispatch_FormatLine(); + } + break; + case COMMAND_ID_FORMAT_AREA: + { + executeDispatch_FormatArea(); + } + break; + case COMMAND_ID_TEXT_ATTRIBUTES: + { + executeDispatch_TextAttributes(); + } + break; + case COMMAND_ID_TRANSFORM_DIALOG: + { + executeDispatch_TransformDialog(); + } + break; + case COMMAND_ID_OBJECT_TITLE_DESCRIPTION: + { + executeDispatch_ObjectTitleDescription(); + } + break; + case COMMAND_ID_RENAME_OBJECT: + { + executeDispatch_RenameObject(); + } + break; + case COMMAND_ID_BRING_TO_FRONT: + case COMMAND_ID_FORWARD: + case COMMAND_ID_BACKWARD: + case COMMAND_ID_SEND_TO_BACK: + { + executeDispatch_ChangeZOrder( nFeatureId ); + } + break; + case COMMAND_ID_FONT_DIALOG: + { + executeDispatch_FontDialog(); + } + break; + case COMMAND_ID_PARAGRAPH_DIALOG: + { + executeDispatch_ParagraphDialog(); + } + break; + default: + { + } + break; + } + } +} + +void ShapeController::describeSupportedFeatures() +{ + implDescribeSupportedFeature( ".uno:FormatLine", COMMAND_ID_FORMAT_LINE, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:FormatArea", COMMAND_ID_FORMAT_AREA, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:TextAttributes", COMMAND_ID_TEXT_ATTRIBUTES, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:TransformDialog", COMMAND_ID_TRANSFORM_DIALOG, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:ObjectTitleDescription", COMMAND_ID_OBJECT_TITLE_DESCRIPTION, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:RenameObject", COMMAND_ID_RENAME_OBJECT, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:BringToFront", COMMAND_ID_BRING_TO_FRONT, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:Forward", COMMAND_ID_FORWARD, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:Backward", COMMAND_ID_BACKWARD, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:SendToBack", COMMAND_ID_SEND_TO_BACK, CommandGroup::FORMAT ); + implDescribeSupportedFeature( ".uno:FontDialog", COMMAND_ID_FONT_DIALOG, CommandGroup::EDIT ); + implDescribeSupportedFeature( ".uno:ParagraphDialog", COMMAND_ID_PARAGRAPH_DIALOG, CommandGroup::EDIT ); +} + +IMPL_LINK( ShapeController, CheckNameHdl, AbstractSvxNameDialog*, pDialog ) +{ + String aName; + if ( pDialog ) + { + pDialog->GetName( aName ); + } + if ( aName.Len() ) + { + DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL ); + if ( pDrawViewWrapper && pDrawViewWrapper->getNamedSdrObject( aName ) ) + { + return 0; + } + } + return 1; +} + +void ShapeController::executeDispatch_FormatLine() +{ + if ( m_pChartController ) + { + Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow ); + DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper(); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pParent && pDrawModelWrapper && pDrawViewWrapper ) + { + SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject(); + SfxItemSet aAttr( pDrawViewWrapper->GetDefaultAttr() ); + BOOL bHasMarked = pDrawViewWrapper->AreObjectsMarked(); + if ( bHasMarked ) + { + pDrawViewWrapper->MergeAttrFromMarked( aAttr, FALSE ); + } + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg( + pFact->CreateSvxLineTabDialog( pParent, &aAttr, &pDrawModelWrapper->getSdrModel(), + pSelectedObj, bHasMarked ) ); + if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) ) + { + const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet(); + if ( bHasMarked ) + { + pDrawViewWrapper->SetAttrToMarked( *pOutAttr, FALSE ); + } + else + { + pDrawViewWrapper->SetDefaultAttr( *pOutAttr, FALSE ); + } + } + } + } + } +} + +void ShapeController::executeDispatch_FormatArea() +{ + if ( m_pChartController ) + { + Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow ); + DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper(); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pParent && pDrawModelWrapper && pDrawViewWrapper ) + { + SfxItemSet aAttr( pDrawViewWrapper->GetDefaultAttr() ); + BOOL bHasMarked = pDrawViewWrapper->AreObjectsMarked(); + if ( bHasMarked ) + { + pDrawViewWrapper->MergeAttrFromMarked( aAttr, FALSE ); + } + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + ::boost::scoped_ptr< AbstractSvxAreaTabDialog > pDlg( + pFact->CreateSvxAreaTabDialog( pParent, &aAttr, &pDrawModelWrapper->getSdrModel(), + pDrawViewWrapper ) ); + if ( pDlg.get() ) + { + SfxItemPool& rItemPool = pDrawViewWrapper->GetModel()->GetItemPool(); + SfxItemSet aSet( rItemPool, rItemPool.GetFirstWhich(), rItemPool.GetLastWhich() ); + const SvxColorTableItem* pColorItem = static_cast< const SvxColorTableItem* >( aSet.GetItem( SID_COLOR_TABLE ) ); + if ( pColorItem && pColorItem->GetColorTable() == XColorTable::GetStdColorTable() ) + { + pDlg->DontDeleteColorTable(); + } + if ( pDlg->Execute() == RET_OK ) + { + const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet(); + if ( bHasMarked ) + { + pDrawViewWrapper->SetAttrToMarked( *pOutAttr, FALSE ); + } + else + { + pDrawViewWrapper->SetDefaultAttr( *pOutAttr, FALSE ); + } + } + } + } + } + } +} + +void ShapeController::executeDispatch_TextAttributes() +{ + if ( m_pChartController ) + { + Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow ); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pParent && pDrawViewWrapper ) + { + SfxItemSet aAttr( pDrawViewWrapper->GetDefaultAttr() ); + BOOL bHasMarked = pDrawViewWrapper->AreObjectsMarked(); + if ( bHasMarked ) + { + pDrawViewWrapper->MergeAttrFromMarked( aAttr, FALSE ); + } + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg( + pFact->CreateTextTabDialog( pParent, &aAttr, pDrawViewWrapper ) ); + if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) ) + { + const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet(); + if ( bHasMarked ) + { + pDrawViewWrapper->SetAttributes( *pOutAttr ); + } + else + { + pDrawViewWrapper->SetDefaultAttr( *pOutAttr, FALSE ); + } + } + } + } + } +} + +void ShapeController::executeDispatch_TransformDialog() +{ + if ( m_pChartController ) + { + Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow ); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pParent && pDrawViewWrapper ) + { + SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject(); + if ( pSelectedObj && pSelectedObj->GetObjIdentifier() == OBJ_CAPTION ) + { + // item set for caption + SfxItemSet aAttr( pDrawViewWrapper->GetModel()->GetItemPool() ); + pDrawViewWrapper->GetAttributes( aAttr ); + // item set for position and size + SfxItemSet aGeoAttr( pDrawViewWrapper->GetGeoAttrFromMarked() ); + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg( + pFact->CreateCaptionDialog( pParent, pDrawViewWrapper ) ); + if ( pDlg.get() ) + { + const USHORT* pRange = pDlg->GetInputRanges( *aAttr.GetPool() ); + SfxItemSet aCombAttr( *aAttr.GetPool(), pRange ); + aCombAttr.Put( aAttr ); + aCombAttr.Put( aGeoAttr ); + pDlg->SetInputSet( &aCombAttr ); + if ( pDlg->Execute() == RET_OK ) + { + const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet(); + pDrawViewWrapper->SetAttributes( *pOutAttr ); + pDrawViewWrapper->SetGeoAttrToMarked( *pOutAttr ); + } + } + } + } + else + { + SfxItemSet aGeoAttr( pDrawViewWrapper->GetGeoAttrFromMarked() ); + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + ::boost::scoped_ptr< SfxAbstractTabDialog > pDlg( + pFact->CreateSvxTransformTabDialog( pParent, &aGeoAttr, pDrawViewWrapper ) ); + if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) ) + { + const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet(); + pDrawViewWrapper->SetGeoAttrToMarked( *pOutAttr ); + } + } + } + } + } +} + +void ShapeController::executeDispatch_ObjectTitleDescription() +{ + if ( m_pChartController ) + { + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pDrawViewWrapper && pDrawViewWrapper->GetMarkedObjectCount() == 1 ) + { + SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject(); + if ( pSelectedObj ) + { + String aTitle( pSelectedObj->GetTitle() ); + String aDescription( pSelectedObj->GetDescription() ); + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + ::boost::scoped_ptr< AbstractSvxObjectTitleDescDialog > pDlg( + pFact->CreateSvxObjectTitleDescDialog( NULL, aTitle, aDescription ) ); + if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) ) + { + pDlg->GetTitle( aTitle ); + pDlg->GetDescription( aDescription ); + pSelectedObj->SetTitle( aTitle ); + pSelectedObj->SetDescription( aDescription ); + } + } + } + } + } +} + +void ShapeController::executeDispatch_RenameObject() +{ + if ( m_pChartController ) + { + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pDrawViewWrapper && pDrawViewWrapper->GetMarkedObjectCount() == 1 ) + { + SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject(); + if ( pSelectedObj ) + { + String aName( pSelectedObj->GetName() ); + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if ( pFact ) + { + ::boost::scoped_ptr< AbstractSvxObjectNameDialog > pDlg( + pFact->CreateSvxObjectNameDialog( NULL, aName ) ); + pDlg->SetCheckNameHdl( LINK( this, ShapeController, CheckNameHdl ) ); + if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) ) + { + pDlg->GetName( aName ); + if ( aName != pSelectedObj->GetName() ) + { + pSelectedObj->SetName( aName ); + } + } + } + } + } + } +} + +void ShapeController::executeDispatch_ChangeZOrder( sal_uInt16 nId ) +{ + DrawViewWrapper* pDrawViewWrapper = ( m_pChartController ? m_pChartController->GetDrawViewWrapper() : NULL ); + if ( pDrawViewWrapper ) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + switch ( nId ) + { + case COMMAND_ID_BRING_TO_FRONT: + { + if ( isForwardPossible() ) + { + pDrawViewWrapper->PutMarkedToTop(); + } + } + break; + case COMMAND_ID_FORWARD: + { + if ( isForwardPossible() ) + { + pDrawViewWrapper->MovMarkedToTop(); + } + } + break; + case COMMAND_ID_BACKWARD: + { + if ( isBackwardPossible() ) + { + pDrawViewWrapper->MovMarkedToBtm(); + } + } + break; + case COMMAND_ID_SEND_TO_BACK: + { + if ( isBackwardPossible() ) + { + SdrObject* pFirstObj = getFirstAdditionalShape(); + pDrawViewWrapper->PutMarkedBehindObj( pFirstObj ); + } + } + break; + default: + { + } + break; + } + } +} + +void ShapeController::executeDispatch_FontDialog() +{ + if ( m_pChartController ) + { + Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow ); + DrawModelWrapper* pDrawModelWrapper = m_pChartController->GetDrawModelWrapper(); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pParent && pDrawModelWrapper && pDrawViewWrapper ) + { + SfxItemSet aAttr( pDrawViewWrapper->GetModel()->GetItemPool() ); + pDrawViewWrapper->GetAttributes( aAttr ); + ViewElementListProvider aViewElementListProvider( pDrawModelWrapper ); + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + ::boost::scoped_ptr< ShapeFontDialog > pDlg( new ShapeFontDialog( pParent, &aAttr, &aViewElementListProvider ) ); + if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) ) + { + const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet(); + pDrawViewWrapper->SetAttributes( *pOutAttr ); + } + } + } +} + +void ShapeController::executeDispatch_ParagraphDialog() +{ + if ( m_pChartController ) + { + Window* pParent = dynamic_cast< Window* >( m_pChartController->m_pChartWindow ); + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pParent && pDrawViewWrapper ) + { + SfxItemPool& rPool = pDrawViewWrapper->GetModel()->GetItemPool(); + SfxItemSet aAttr( rPool ); + pDrawViewWrapper->GetAttributes( aAttr ); + + SfxItemSet aNewAttr( rPool, + EE_ITEMS_START, EE_ITEMS_END, + SID_ATTR_PARA_HYPHENZONE, SID_ATTR_PARA_HYPHENZONE, + SID_ATTR_PARA_PAGEBREAK, SID_ATTR_PARA_PAGEBREAK, + SID_ATTR_PARA_SPLIT, SID_ATTR_PARA_SPLIT, + SID_ATTR_PARA_WIDOWS, SID_ATTR_PARA_WIDOWS, + SID_ATTR_PARA_ORPHANS, SID_ATTR_PARA_ORPHANS, + 0 ); + aNewAttr.Put( aAttr ); + aNewAttr.Put( SvxHyphenZoneItem( sal_False, SID_ATTR_PARA_HYPHENZONE ) ); + aNewAttr.Put( SvxFmtBreakItem( SVX_BREAK_NONE, SID_ATTR_PARA_PAGEBREAK ) ); + aNewAttr.Put( SvxFmtSplitItem( sal_True, SID_ATTR_PARA_SPLIT) ); + aNewAttr.Put( SvxWidowsItem( 0, SID_ATTR_PARA_WIDOWS) ); + aNewAttr.Put( SvxOrphansItem( 0, SID_ATTR_PARA_ORPHANS) ); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + ::boost::scoped_ptr< ShapeParagraphDialog > pDlg( new ShapeParagraphDialog( pParent, &aNewAttr ) ); + if ( pDlg.get() && ( pDlg->Execute() == RET_OK ) ) + { + const SfxItemSet* pOutAttr = pDlg->GetOutputItemSet(); + pDrawViewWrapper->SetAttributes( *pOutAttr ); + } + } + } +} + +SdrObject* ShapeController::getFirstAdditionalShape() +{ + SdrObject* pFirstObj = NULL; + + try + { + DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL ); + if ( pDrawModelWrapper ) + { + Reference< drawing::XShape > xFirstShape; + Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() ); + Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY_THROW ); + Reference< drawing::XShapes > xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) ); + sal_Int32 nCount = xDrawPageShapes->getCount(); + for ( sal_Int32 i = 0; i < nCount; ++i ) + { + Reference< drawing::XShape > xShape; + if ( xDrawPageShapes->getByIndex( i ) >>= xShape ) + { + if ( xShape.is() && xShape != xChartRoot ) + { + xFirstShape = xShape; + break; + } + } + } + if ( xFirstShape.is() ) + { + pFirstObj = DrawViewWrapper::getSdrObject( xFirstShape ); + } + } + } + catch ( uno::Exception& ex ) + { + ASSERT_EXCEPTION( ex ); + } + + return pFirstObj; +} + +SdrObject* ShapeController::getLastAdditionalShape() +{ + SdrObject* pLastObj = NULL; + + try + { + DrawModelWrapper* pDrawModelWrapper = ( m_pChartController ? m_pChartController->GetDrawModelWrapper() : NULL ); + if ( pDrawModelWrapper ) + { + Reference< drawing::XShape > xLastShape; + Reference< drawing::XDrawPage > xDrawPage( pDrawModelWrapper->getMainDrawPage() ); + Reference< drawing::XShapes > xDrawPageShapes( xDrawPage, uno::UNO_QUERY_THROW ); + Reference< drawing::XShapes > xChartRoot( DrawModelWrapper::getChartRootShape( xDrawPage ) ); + sal_Int32 nCount = xDrawPageShapes->getCount(); + for ( sal_Int32 i = nCount - 1; i >= 0; --i ) + { + Reference< drawing::XShape > xShape; + if ( xDrawPageShapes->getByIndex( i ) >>= xShape ) + { + if ( xShape.is() && xShape != xChartRoot ) + { + xLastShape = xShape; + break; + } + } + } + if ( xLastShape.is() ) + { + pLastObj = DrawViewWrapper::getSdrObject( xLastShape ); + } + } + } + catch ( uno::Exception& ex ) + { + ASSERT_EXCEPTION( ex ); + } + + return pLastObj; +} + +bool ShapeController::isBackwardPossible() +{ + if ( m_pChartController && m_pChartController->m_aSelection.isAdditionalShapeSelected() ) + { + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pDrawViewWrapper ) + { + SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject(); + SdrObject* pFirstObj = getFirstAdditionalShape(); + if ( pSelectedObj && pFirstObj && pSelectedObj != pFirstObj ) + { + return true; + } + } + } + return false; +} + +bool ShapeController::isForwardPossible() +{ + if ( m_pChartController && m_pChartController->m_aSelection.isAdditionalShapeSelected() ) + { + DrawViewWrapper* pDrawViewWrapper = m_pChartController->GetDrawViewWrapper(); + if ( pDrawViewWrapper ) + { + SdrObject* pSelectedObj = pDrawViewWrapper->getSelectedObject(); + SdrObject* pLastObj = getLastAdditionalShape(); + if ( pSelectedObj && pLastObj && pSelectedObj != pLastObj ) + { + return true; + } + } + } + return false; +} + +//............................................................................. +} // namespace chart +//............................................................................. diff --git a/chart2/source/controller/main/ShapeController.hxx b/chart2/source/controller/main/ShapeController.hxx new file mode 100644 index 000000000..53436802e --- /dev/null +++ b/chart2/source/controller/main/ShapeController.hxx @@ -0,0 +1,100 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART2_SHAPECONTROLLER_HXX +#define CHART2_SHAPECONTROLLER_HXX + +#include "FeatureCommandDispatchBase.hxx" +#include <tools/link.hxx> + +class AbstractSvxNameDialog; +class SdrObject; + +//............................................................................. +namespace chart +{ +//............................................................................. + +class ChartController; + +/** This is a CommandDispatch implementation for shapes. + */ +class ShapeController: public FeatureCommandDispatchBase +{ + friend class ControllerCommandDispatch; + +public: + ShapeController( const ::com::sun::star::uno::Reference< + ::com::sun::star::uno::XComponentContext >& rxContext, ChartController* pController ); + virtual ~ShapeController(); + + // late initialisation, especially for adding as listener + virtual void initialize(); + +protected: + // WeakComponentImplHelperBase + virtual void SAL_CALL disposing(); + + // XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) + throw (::com::sun::star::uno::RuntimeException); + + // state of a feature + virtual FeatureState getState( const ::rtl::OUString& rCommand ); + + // execute a feature + virtual void execute( const ::rtl::OUString& rCommand, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& rArgs ); + + // all the features which should be handled by this class + virtual void describeSupportedFeatures(); + +private: + DECL_LINK( CheckNameHdl, AbstractSvxNameDialog* ); + + void executeDispatch_FormatLine(); + void executeDispatch_FormatArea(); + void executeDispatch_TextAttributes(); + void executeDispatch_TransformDialog(); + void executeDispatch_ObjectTitleDescription(); + void executeDispatch_RenameObject(); + void executeDispatch_ChangeZOrder( sal_uInt16 nId ); + void executeDispatch_FontDialog(); + void executeDispatch_ParagraphDialog(); + + SdrObject* getFirstAdditionalShape(); + SdrObject* getLastAdditionalShape(); + bool isBackwardPossible(); + bool isForwardPossible(); + + ChartController* m_pChartController; +}; + +//............................................................................. +} // namespace chart +//............................................................................. + +// CHART2_SHAPECONTROLLER_HXX +#endif diff --git a/chart2/source/controller/main/ShapeToolbarController.cxx b/chart2/source/controller/main/ShapeToolbarController.cxx new file mode 100644 index 000000000..6ef976cb7 --- /dev/null +++ b/chart2/source/controller/main/ShapeToolbarController.cxx @@ -0,0 +1,298 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_chart2.hxx" + +#include "ShapeToolbarController.hxx" + +#include <vos/mutex.hxx> +#include <comphelper/sequence.hxx> +#include <vcl/svapp.hxx> +#include <vcl/toolbox.hxx> +#include <toolkit/helper/vclunohelper.hxx> +#include <svx/svxids.hrc> +#include <svx/tbxcustomshapes.hxx> + + +using namespace com::sun::star; + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; + +//............................................................................. +namespace chart +{ +//............................................................................. + +::rtl::OUString ShapeToolbarController::getImplementationName() throw (uno::RuntimeException) +{ + return getImplementationName_Static(); +} + +::rtl::OUString ShapeToolbarController::getImplementationName_Static() throw (uno::RuntimeException) +{ + return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.comp.ShapeToolbarController" ) ); +} + +Sequence< ::rtl::OUString > ShapeToolbarController::getSupportedServiceNames_Static() throw (uno::RuntimeException) +{ + Sequence< ::rtl::OUString > aSupported(1); + aSupported.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.ShapeToolbarController" ) ); + return aSupported; +} + +::sal_Bool ShapeToolbarController::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException) +{ + return ::comphelper::existsValue( ServiceName, getSupportedServiceNames_Static() ); +} + +Sequence< ::rtl::OUString> ShapeToolbarController::getSupportedServiceNames() throw (uno::RuntimeException) +{ + return getSupportedServiceNames_Static(); +} + +Reference< uno::XInterface > ShapeToolbarController::create( const Reference< uno::XComponentContext >& xContext ) +{ + return *( new ShapeToolbarController( Reference< lang::XMultiServiceFactory >( xContext->getServiceManager(), uno::UNO_QUERY ) ) ); +} + +ShapeToolbarController::ShapeToolbarController( const Reference< lang::XMultiServiceFactory >& rxFact ) + :m_pToolbarController( NULL ) + ,m_nToolBoxId( 1 ) + ,m_nSlotId( 0 ) +{ + osl_incrementInterlockedCount( &m_refCount ); + m_xServiceManager = rxFact; + osl_decrementInterlockedCount( &m_refCount ); +} + +ShapeToolbarController::~ShapeToolbarController() +{ +} + +// ::com::sun::star::uno::XInterface +uno::Any ShapeToolbarController::queryInterface( const uno::Type& rType ) throw (uno::RuntimeException) +{ + uno::Any aReturn = ToolboxController::queryInterface( rType ); + if ( !aReturn.hasValue() ) + { + aReturn = ShapeToolbarController_Base::queryInterface( rType ); + } + return aReturn; +} + +void ShapeToolbarController::acquire() throw () +{ + ToolboxController::acquire(); +} + +void ShapeToolbarController::release() throw () +{ + ToolboxController::release(); +} + +// ::com::sun::star::lang::XInitialization +void ShapeToolbarController::initialize( const Sequence< uno::Any >& rArguments ) throw (uno::Exception, uno::RuntimeException) +{ + ToolboxController::initialize( rArguments ); + ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + ::osl::MutexGuard aGuard( m_aMutex ); + + ToolBox* pToolBox = static_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ) ); + if ( pToolBox ) + { + const USHORT nCount = pToolBox->GetItemCount(); + for ( USHORT nPos = 0; nPos < nCount; ++nPos ) + { + const USHORT nItemId = pToolBox->GetItemId( nPos ); + if ( pToolBox->GetItemCommand( nItemId ) == String( m_aCommandURL ) ) + { + m_nToolBoxId = nItemId; + break; + } + } + if ( m_aCommandURL.equalsAscii( ".uno:BasicShapes" ) ) + { + m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BasicShapes" ) ), sal_True ) ); + m_nSlotId = SID_DRAWTBX_CS_BASIC; + m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); + } + else if ( m_aCommandURL.equalsAscii( ".uno:SymbolShapes" ) ) + { + m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SymbolShapes" ) ), sal_True ) ); + m_nSlotId = SID_DRAWTBX_CS_SYMBOL; + m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); + } + else if ( m_aCommandURL.equalsAscii( ".uno:ArrowShapes" ) ) + { + m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ArrowShapes" ) ), sal_True ) ); + m_nSlotId = SID_DRAWTBX_CS_ARROW; + m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox) ); + } + else if ( m_aCommandURL.equalsAscii( ".uno:FlowChartShapes" ) ) + { + m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FlowChartShapes" ) ), sal_True ) ); + m_nSlotId = SID_DRAWTBX_CS_FLOWCHART; + m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); + } + else if ( m_aCommandURL.equalsAscii( ".uno:CalloutShapes" ) ) + { + m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CalloutShapes" ) ), sal_True ) ); + m_nSlotId = SID_DRAWTBX_CS_CALLOUT; + m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); + } + else if ( m_aCommandURL.equalsAscii( ".uno:StarShapes" ) ) + { + m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StarShapes" ) ), sal_True ) ); + m_nSlotId = SID_DRAWTBX_CS_STAR; + m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); + } + + for ( TCommandState::iterator aIter( m_aStates.begin() ); aIter != m_aStates.end(); ++aIter ) + { + addStatusListener( aIter->first ); + } + + if ( m_pToolbarController.is() ) + { + m_pToolbarController->initialize( rArguments ); + } + + // check if paste special is allowed, when not don't add DROPDOWN + pToolBox->SetItemBits( m_nToolBoxId, pToolBox->GetItemBits( m_nToolBoxId ) | TIB_DROPDOWN ); + } +} + +// ::com::sun::star::frame::XStatusListener +void ShapeToolbarController::statusChanged( const frame::FeatureStateEvent& Event ) throw ( uno::RuntimeException ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + TCommandState::iterator aFind = m_aStates.find( Event.FeatureURL.Complete ); + if ( aFind != m_aStates.end() ) + { + aFind->second = Event.IsEnabled; + if ( m_pToolbarController.is() ) + { + sal_Bool bCheckmark = sal_False; + ToolBox& rTb = m_pToolbarController->GetToolBox(); + + for ( USHORT i = 0; i < rTb.GetItemCount(); ++i ) + { + USHORT nId = rTb.GetItemId( i ); + if ( nId == 0 ) + { + continue; + } + ::rtl::OUString aCmd = rTb.GetItemCommand( nId ); + if ( aCmd == Event.FeatureURL.Complete ) + { + rTb.EnableItem( nId, Event.IsEnabled ); + if ( Event.State >>= bCheckmark ) + { + rTb.CheckItem( nId, bCheckmark ); + } + else + { + ::rtl::OUString aItemText; + if ( Event.State >>= aItemText ) + { + rTb.SetItemText( nId, aItemText ); + } + } + } + } + } + } +} + +// ::com::sun::star::frame::XToolbarController +Reference< awt::XWindow > ShapeToolbarController::createPopupWindow() throw (uno::RuntimeException) +{ + ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + ::osl::MutexGuard aGuard( m_aMutex ); + + Reference< awt::XWindow > xRet; + if ( m_pToolbarController.is() ) + { + xRet = m_pToolbarController.getRef()->createPopupWindow(); + } + + return xRet; +} + +// ::com::sun::star::frame::XSubToolbarController +::sal_Bool ShapeToolbarController::opensSubToolbar() throw (uno::RuntimeException) +{ + return ( m_nSlotId == SID_DRAWTBX_CS_BASIC || + m_nSlotId == SID_DRAWTBX_CS_SYMBOL || + m_nSlotId == SID_DRAWTBX_CS_ARROW || + m_nSlotId == SID_DRAWTBX_CS_FLOWCHART || + m_nSlotId == SID_DRAWTBX_CS_CALLOUT || + m_nSlotId == SID_DRAWTBX_CS_STAR ); +} + +::rtl::OUString ShapeToolbarController::getSubToolbarName() throw (uno::RuntimeException) +{ + ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + ::osl::MutexGuard aGuard(m_aMutex); + uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY ); + if ( xSub.is() ) + { + return xSub->getSubToolbarName(); + } + return ::rtl::OUString(); +} + +void ShapeToolbarController::functionSelected( const ::rtl::OUString& rCommand ) throw (uno::RuntimeException) +{ + ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + ::osl::MutexGuard aGuard( m_aMutex ); + + uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY ); + if ( xSub.is() ) + { + m_aCommandURL = rCommand; + xSub->functionSelected( rCommand ); + } +} + +void ShapeToolbarController::updateImage() throw (uno::RuntimeException) +{ + ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + ::osl::MutexGuard aGuard( m_aMutex ); + + uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY ); + if ( xSub.is() ) + { + xSub->updateImage(); + } +} + +//............................................................................. +} // namespace chart +//............................................................................. diff --git a/chart2/source/controller/main/ShapeToolbarController.hxx b/chart2/source/controller/main/ShapeToolbarController.hxx new file mode 100644 index 000000000..a8bfe9548 --- /dev/null +++ b/chart2/source/controller/main/ShapeToolbarController.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef CHART2_SHAPETOOLBARCONTROLLER_HXX +#define CHART2_SHAPETOOLBARCONTROLLER_HXX + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/frame/XSubToolbarController.hpp> + +#include <cppuhelper/implbase2.hxx> +#include <comphelper/implementationreference.hxx> +#include <comphelper/stl_types.hxx> +#include <svtools/toolboxcontroller.hxx> + +class SfxToolBoxControl; + +//............................................................................. +namespace chart +{ +//............................................................................. + +typedef ::cppu::ImplHelper2 < ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::frame::XSubToolbarController> ShapeToolbarController_Base; + +typedef ::comphelper::ImplementationReference< SfxToolBoxControl, ::com::sun::star::frame::XToolbarController > TToolbarHelper; + +class ShapeToolbarController : public ::svt::ToolboxController + ,public ShapeToolbarController_Base +{ + DECLARE_STL_USTRINGACCESS_MAP( sal_Bool, TCommandState ); + TCommandState m_aStates; + TToolbarHelper m_pToolbarController; + sal_uInt16 m_nToolBoxId; + sal_uInt16 m_nSlotId; + ShapeToolbarController( const ShapeToolbarController& ); + void operator =( const ShapeToolbarController& ); + +public: + ShapeToolbarController( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxFact ); + virtual ~ShapeToolbarController(); + + // ::com::sun::star::uno::XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& rType ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw (); + virtual void SAL_CALL release() throw (); + + // ::com::sun::star::lang::XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException); + + // needed by registration + static ::rtl::OUString getImplementationName_Static() throw( ::com::sun::star::uno::RuntimeException ); + static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL + create( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& xContext ); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::lang::XInitialization + virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::frame::XStatusListener + virtual void SAL_CALL statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::frame::XToolbarController + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createPopupWindow() throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::frame::XSubToolbarController + virtual ::sal_Bool SAL_CALL opensSubToolbar() throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getSubToolbarName() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL functionSelected( const ::rtl::OUString& aCommand ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL updateImage() throw (::com::sun::star::uno::RuntimeException); +}; + +//............................................................................. +} // namespace chart +//............................................................................. + +#endif //CHART2_SHAPETOOLBARCONTROLLER_HXX + diff --git a/chart2/source/controller/main/StatusBarCommandDispatch.cxx b/chart2/source/controller/main/StatusBarCommandDispatch.cxx index 64ae49dea..00cc9a844 100644 --- a/chart2/source/controller/main/StatusBarCommandDispatch.cxx +++ b/chart2/source/controller/main/StatusBarCommandDispatch.cxx @@ -95,7 +95,7 @@ void StatusBarCommandDispatch::fireStatusEvent( { uno::Any aArg; Reference< chart2::XChartDocument > xDoc( m_xModifiable, uno::UNO_QUERY ); - aArg <<= ObjectNameProvider::getSelectedObjectText( m_aSelectedCID, xDoc ); + aArg <<= ObjectNameProvider::getSelectedObjectText( m_aSelectedOID.getObjectCID(), xDoc ); fireStatusEventForURL( C2U(".uno:Context"), aArg, true, xSingleListener ); } if( bFireModified ) @@ -147,9 +147,9 @@ void SAL_CALL StatusBarCommandDispatch::selectionChanged( const lang::EventObjec throw (uno::RuntimeException) { if( m_xSelectionSupplier.is()) - m_xSelectionSupplier->getSelection() >>= m_aSelectedCID; + m_aSelectedOID = ObjectIdentifier( m_xSelectionSupplier->getSelection() ); else - m_aSelectedCID = OUString(); + m_aSelectedOID = ObjectIdentifier(); fireAllStatusEvents( 0 ); } diff --git a/chart2/source/controller/main/StatusBarCommandDispatch.hxx b/chart2/source/controller/main/StatusBarCommandDispatch.hxx index ea2c6f345..93e1f951c 100644 --- a/chart2/source/controller/main/StatusBarCommandDispatch.hxx +++ b/chart2/source/controller/main/StatusBarCommandDispatch.hxx @@ -28,6 +28,7 @@ #define CHART2_STATUSBARCOMMANDDISPATCH_HXX #include "CommandDispatch.hxx" +#include "ObjectIdentifier.hxx" #include <cppuhelper/implbase1.hxx> #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/view/XSelectionSupplier.hpp> @@ -100,7 +101,7 @@ private: ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionSupplier > m_xSelectionSupplier; bool m_bIsModified; - ::rtl::OUString m_aSelectedCID; + ObjectIdentifier m_aSelectedOID; }; } // namespace chart diff --git a/chart2/source/tools/UndoGuard.cxx b/chart2/source/controller/main/UndoGuard.cxx index 21f2ebf40..21f2ebf40 100644 --- a/chart2/source/tools/UndoGuard.cxx +++ b/chart2/source/controller/main/UndoGuard.cxx diff --git a/chart2/source/tools/UndoManager.cxx b/chart2/source/controller/main/UndoManager.cxx index 7b978c89f..55d4e0ec6 100644 --- a/chart2/source/tools/UndoManager.cxx +++ b/chart2/source/controller/main/UndoManager.cxx @@ -41,6 +41,8 @@ #include <unotools/configitem.hxx> #include <cppuhelper/compbase1.hxx> +#include <rtl/uuid.h> +#include <svx/svdundo.hxx> #include <functional> @@ -131,10 +133,31 @@ UndoManager::~UndoManager() m_pLastRemeberedUndoElement = 0; } +void UndoManager::addShapeUndoAction( SdrUndoAction* pAction ) +{ + if ( !pAction ) + { + return; + } + + impl::ShapeUndoElement* pShapeUndoElement = new impl::ShapeUndoElement( pAction->GetComment(), pAction ); + if ( pShapeUndoElement ) + { + m_apUndoStack->push( pShapeUndoElement ); + m_apRedoStack->disposeAndClear(); + if ( !m_apUndoStepsConfigItem.get() ) + { + retrieveConfigUndoSteps(); + } + fireModifyEvent(); + } +} + void UndoManager::impl_undoRedo( Reference< frame::XModel > & xCurrentModel, impl::UndoStack * pStackToRemoveFrom, - impl::UndoStack * pStackToAddTo ) + impl::UndoStack * pStackToAddTo, + bool bUndo ) { if( pStackToRemoveFrom && ! pStackToRemoveFrom->empty() ) { @@ -142,11 +165,32 @@ void UndoManager::impl_undoRedo( impl::UndoElement * pTop( pStackToRemoveFrom->top()); if( pTop ) { - // put a clone of current model into redo/undo stack with the same - // action string as the undo/redo - pStackToAddTo->push( pTop->createFromModel( xCurrentModel )); - // change current model by properties of the model from undo - pTop->applyToModel( xCurrentModel ); + impl::ShapeUndoElement* pShapeUndoElement = dynamic_cast< impl::ShapeUndoElement* >( pTop ); + if ( pShapeUndoElement ) + { + impl::ShapeUndoElement* pNewShapeUndoElement = new impl::ShapeUndoElement( *pShapeUndoElement ); + pStackToAddTo->push( pNewShapeUndoElement ); + SdrUndoAction* pAction = pNewShapeUndoElement->getSdrUndoAction(); + if ( pAction ) + { + if ( bUndo ) + { + pAction->Undo(); + } + else + { + pAction->Redo(); + } + } + } + else + { + // put a clone of current model into redo/undo stack with the same + // action string as the undo/redo + pStackToAddTo->push( pTop->createFromModel( xCurrentModel )); + // change current model by properties of the model from undo + pTop->applyToModel( xCurrentModel ); + } // remove the top undo element pStackToRemoveFrom->pop(), pTop = 0; ChartViewHelper::setViewToDirtyState( xCurrentModel ); @@ -287,14 +331,14 @@ void SAL_CALL UndoManager::undo( Reference< frame::XModel >& xCurrentModel ) throw (uno::RuntimeException) { OSL_ASSERT( m_apUndoStack.get() && m_apRedoStack.get()); - impl_undoRedo( xCurrentModel, m_apUndoStack.get(), m_apRedoStack.get()); + impl_undoRedo( xCurrentModel, m_apUndoStack.get(), m_apRedoStack.get(), true ); } void SAL_CALL UndoManager::redo( Reference< frame::XModel >& xCurrentModel ) throw (uno::RuntimeException) { OSL_ASSERT( m_apUndoStack.get() && m_apRedoStack.get()); - impl_undoRedo( xCurrentModel, m_apRedoStack.get(), m_apUndoStack.get()); + impl_undoRedo( xCurrentModel, m_apRedoStack.get(), m_apUndoStack.get(), false ); } ::sal_Bool SAL_CALL UndoManager::undoPossible() @@ -349,4 +393,44 @@ void SAL_CALL UndoManager::applyModelContent( impl::UndoElement::applyModelContentToModel( xModelToChange, xModelToCopyFrom ); } +// ____ XUnoTunnel ____ +sal_Int64 UndoManager::getSomething( const Sequence< sal_Int8 >& rId ) + throw (uno::RuntimeException) +{ + if ( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) + { + return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >( this ) ); + } + return 0; +} + +// static +const Sequence< sal_Int8 >& UndoManager::getUnoTunnelId() +{ + static Sequence< sal_Int8 >* pSeq = 0; + if( !pSeq ) + { + osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() ); + if( !pSeq ) + { + static Sequence< sal_Int8 > aSeq( 16 ); + rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); + pSeq = &aSeq; + } + } + return *pSeq; +} + +// static +UndoManager* UndoManager::getImplementation( const Reference< uno::XInterface > xObj ) +{ + UndoManager* pRet = NULL; + Reference< lang::XUnoTunnel > xUT( xObj, uno::UNO_QUERY ); + if ( xUT.is() ) + { + pRet = reinterpret_cast< UndoManager* >( sal::static_int_cast< sal_IntPtr >( xUT->getSomething( getUnoTunnelId() ) ) ); + } + return pRet; +} + } // namespace chart diff --git a/chart2/source/controller/main/_serviceregistration_controller.cxx b/chart2/source/controller/main/_serviceregistration_controller.cxx index ff38994ab..6dd12e642 100644 --- a/chart2/source/controller/main/_serviceregistration_controller.cxx +++ b/chart2/source/controller/main/_serviceregistration_controller.cxx @@ -34,6 +34,7 @@ #include "ChartDocumentWrapper.hxx" #include "AccessibleChartView.hxx" #include "ElementSelector.hxx" +#include "ShapeToolbarController.hxx" #include <cppuhelper/implementationentry.hxx> static struct ::cppu::ImplementationEntry g_entries_chart2_controller[] = @@ -79,17 +80,17 @@ static struct ::cppu::ImplementationEntry g_entries_chart2_controller[] = , 0 } ,{ - ::chart::AccessibleChartView::create - , ::chart::AccessibleChartView::getImplementationName_Static - , ::chart::AccessibleChartView::getSupportedServiceNames_Static + ::chart::ElementSelectorToolbarController::create + , ::chart::ElementSelectorToolbarController::getImplementationName_Static + , ::chart::ElementSelectorToolbarController::getSupportedServiceNames_Static , ::cppu::createSingleComponentFactory , 0 , 0 } ,{ - ::chart::ElementSelectorToolbarController::create - , ::chart::ElementSelectorToolbarController::getImplementationName_Static - , ::chart::ElementSelectorToolbarController::getSupportedServiceNames_Static + ::chart::ShapeToolbarController::create + , ::chart::ShapeToolbarController::getImplementationName_Static + , ::chart::ShapeToolbarController::getSupportedServiceNames_Static , ::cppu::createSingleComponentFactory , 0 , 0 diff --git a/chart2/source/controller/main/makefile.mk b/chart2/source/controller/main/makefile.mk index 8fe7cc8f7..729276d5b 100644 --- a/chart2/source/controller/main/makefile.mk +++ b/chart2/source/controller/main/makefile.mk @@ -67,7 +67,14 @@ SLOFILES = \ $(SLO)$/_serviceregistration_controller.obj \ $(SLO)$/ChartDropTargetHelper.obj \ $(SLO)$/StatusBarCommandDispatch.obj \ - $(SLO)$/ChartTransferable.obj + $(SLO)$/ChartTransferable.obj \ + $(SLO)$/FeatureCommandDispatchBase.obj \ + $(SLO)$/DrawCommandDispatch.obj \ + $(SLO)$/ShapeController.obj \ + $(SLO)$/ShapeToolbarController.obj \ + $(SLO)$/ImplUndoManager.obj \ + $(SLO)$/UndoManager.obj \ + $(SLO)$/UndoGuard.obj # $(SLO)$/CommonConverters.obj \ # $(SLO)$/Scaling.obj \ diff --git a/chart2/source/controller/makefile.mk b/chart2/source/controller/makefile.mk index b5a5975a2..8fdd6000f 100644 --- a/chart2/source/controller/makefile.mk +++ b/chart2/source/controller/makefile.mk @@ -112,6 +112,7 @@ DEF1NAME= $(SHL1TARGET) # sfx.srs is needed for the strings for UNDO and REDO in the UndoCommandDispatch RESLIB1LIST=\ $(SRS)$/chcdialogs.srs \ + $(SRS)$/chcmenus.srs \ $(SOLARCOMMONRESDIR)$/sfx.srs RESLIB1NAME= $(TARGET) diff --git a/chart2/source/controller/menus/ShapeContextMenu.src b/chart2/source/controller/menus/ShapeContextMenu.src new file mode 100644 index 000000000..281668b36 --- /dev/null +++ b/chart2/source/controller/menus/ShapeContextMenu.src @@ -0,0 +1,124 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include "MenuResIds.hrc" +#include "ShapeController.hrc" + + +Menu RID_CONTEXTMENU_SHAPE +{ + ItemList = + { + MenuItem + { + Identifier = COMMAND_ID_FORMAT_LINE; + Command = ".uno:FormatLine"; + }; + MenuItem + { + Identifier = COMMAND_ID_FORMAT_AREA; + Command = ".uno:FormatArea"; + }; + MenuItem + { + Identifier = COMMAND_ID_TEXT_ATTRIBUTES; + Command = ".uno:TextAttributes"; + }; + MenuItem + { + Identifier = COMMAND_ID_TRANSFORM_DIALOG; + Command = ".uno:TransformDialog"; + }; + MenuItem + { + Separator = TRUE; + }; + MenuItem + { + Identifier = COMMAND_ID_OBJECT_TITLE_DESCRIPTION; + Command = ".uno:ObjectTitleDescription"; + }; + MenuItem + { + Identifier = COMMAND_ID_RENAME_OBJECT; + Command = ".uno:RenameObject"; + }; + MenuItem + { + Separator = TRUE; + }; + MenuItem + { + Identifier = COMMAND_ID_ARRANGE_ROW; + Command = ".uno:ArrangeRow"; + SubMenu = Menu + { + ItemList = + { + MenuItem + { + Identifier = COMMAND_ID_BRING_TO_FRONT; + Command = ".uno:BringToFront"; + }; + MenuItem + { + Identifier = COMMAND_ID_FORWARD; + Command = ".uno:Forward"; + }; + MenuItem + { + Identifier = COMMAND_ID_BACKWARD; + Command = ".uno:Backward"; + }; + MenuItem + { + Identifier = COMMAND_ID_SEND_TO_BACK; + Command = ".uno:SendToBack"; + }; + }; + }; + }; + MenuItem + { + Separator = TRUE; + }; + MenuItem + { + Identifier = COMMAND_ID_CUT; + Command = ".uno:Cut"; + }; + MenuItem + { + Identifier = COMMAND_ID_COPY; + Command = ".uno:Copy"; + }; + MenuItem + { + Identifier = COMMAND_ID_PASTE; + Command = ".uno:Paste"; + }; + }; +}; diff --git a/chart2/source/controller/menus/ShapeEditContextMenu.src b/chart2/source/controller/menus/ShapeEditContextMenu.src new file mode 100644 index 000000000..6206f575d --- /dev/null +++ b/chart2/source/controller/menus/ShapeEditContextMenu.src @@ -0,0 +1,65 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include "MenuResIds.hrc" +#include "ShapeController.hrc" + + +Menu RID_CONTEXTMENU_SHAPEEDIT +{ + ItemList = + { + MenuItem + { + Identifier = COMMAND_ID_FONT_DIALOG; + Command = ".uno:FontDialog"; + }; + MenuItem + { + Identifier = COMMAND_ID_PARAGRAPH_DIALOG; + Command = ".uno:ParagraphDialog"; + }; + MenuItem + { + Separator = TRUE; + }; + MenuItem + { + Identifier = COMMAND_ID_CUT; + Command = ".uno:Cut"; + }; + MenuItem + { + Identifier = COMMAND_ID_COPY; + Command = ".uno:Copy"; + }; + MenuItem + { + Identifier = COMMAND_ID_PASTE; + Command = ".uno:Paste"; + }; + }; +}; diff --git a/chart2/source/controller/menus/makefile.mk b/chart2/source/controller/menus/makefile.mk new file mode 100644 index 000000000..f97548963 --- /dev/null +++ b/chart2/source/controller/menus/makefile.mk @@ -0,0 +1,63 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ= ..$/..$/.. +PRJINC= $(PRJ)$/source +PRJNAME= chart2 +TARGET= chcmenus + +ENABLE_EXCEPTIONS= TRUE +VISIBILITY_HIDDEN=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE: settings.mk + +# i26518 the gcc-3.0.4 requires to enhance the template-depth +# this seems to be a compiler issue, so we recommend not to use 3.0.x anymore +.IF "$(COM)"=="GCC" + CFLAGS+=-ftemplate-depth-128 +.ENDIF + +# --- Resources --------------------------------------------------------------- + +SRC1FILES= \ + ShapeContextMenu.src \ + ShapeEditContextMenu.src + +SRS1NAME=$(TARGET) + +# --- Targets ----------------------------------------------------------------- + +.INCLUDE: target.mk + +#dependencies: + +$(SRS)$/chcmenus.srs: \ + ..$/inc$/MenuResIds.hrc + +#$(SRS)$/$(TARGET).srs: $(SOLARINCDIR)$/svx$/globlmn.hrc diff --git a/chart2/source/inc/ChartModelHelper.hxx b/chart2/source/inc/ChartModelHelper.hxx index 69188726e..f0df131f5 100644 --- a/chart2/source/inc/ChartModelHelper.hxx +++ b/chart2/source/inc/ChartModelHelper.hxx @@ -55,8 +55,6 @@ namespace chart class OOO_DLLPUBLIC_CHARTTOOLS ChartModelHelper { public: - static ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XUndoManager > createUndoManager(); - static ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XRangeHighlighter > createRangeHighlighter( const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionSupplier >& xSelectionSupplier ); diff --git a/chart2/source/inc/ObjectIdentifier.hxx b/chart2/source/inc/ObjectIdentifier.hxx index 80abe812f..96bcda55b 100644 --- a/chart2/source/inc/ObjectIdentifier.hxx +++ b/chart2/source/inc/ObjectIdentifier.hxx @@ -40,6 +40,7 @@ #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/awt/Point.hpp> +#include <com/sun/star/drawing/XShape.hpp> //............................................................................. namespace chart @@ -76,6 +77,7 @@ enum ObjectType OBJECTTYPE_DATA_STOCK_RANGE, OBJECTTYPE_DATA_STOCK_LOSS, OBJECTTYPE_DATA_STOCK_GAIN, + OBJECTTYPE_SHAPE, OBJECTTYPE_UNKNOWN }; @@ -99,6 +101,18 @@ class OOO_DLLPUBLIC_CHARTTOOLS ObjectIdentifier //where Type: getStringForType( ObjectType eType ) or other string public: + ObjectIdentifier(); + ObjectIdentifier( const ::rtl::OUString& rObjectCID ); + ObjectIdentifier( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape ); + ObjectIdentifier( const ::com::sun::star::uno::Any& rAny ); + virtual ~ObjectIdentifier(); + + ObjectIdentifier( const ObjectIdentifier& rOID ); + ObjectIdentifier& operator=( const ObjectIdentifier& rOID ); + bool operator==( const ObjectIdentifier& rOID ) const; + bool operator!=( const ObjectIdentifier& rOID ) const; + bool operator<( const ObjectIdentifier& rOID ) const; + static rtl::OUString createClassifiedIdentifierForObject( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xObject @@ -169,6 +183,7 @@ public: static rtl::OUString getDragMethodServiceName( const rtl::OUString& rClassifiedIdentifier ); static rtl::OUString getDragParameterString( const rtl::OUString& rCID ); static bool isDragableObject( const rtl::OUString& rClassifiedIdentifier ); + bool isDragableObject(); static bool isRotateableObject( const rtl::OUString& rClassifiedIdentifier ); static bool isMultiClickObject( const rtl::OUString& rClassifiedIdentifier ); static bool areSiblings( const rtl::OUString& rCID1, const rtl::OUString& rCID2 );//identical object is no sibling @@ -176,6 +191,7 @@ public: static rtl::OUString getStringForType( ObjectType eObjectType ); static ObjectType getObjectType( const rtl::OUString& rCID ); + ObjectType getObjectType(); static rtl::OUString createSeriesSubObjectStub( ObjectType eSubObjectType , const rtl::OUString& rSeriesParticle @@ -238,6 +254,22 @@ public: static TitleHelper::eTitleType getTitleTypeForCID( const ::rtl::OUString& rCID ); static ::rtl::OUString getMovedSeriesCID( const ::rtl::OUString& rObjectCID, sal_Bool bForward ); + + bool isValid() const; + bool isAutoGeneratedObject() const; + bool isAdditionalShape() const; + ::rtl::OUString getObjectCID() const; + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > getAdditionalShape() const; + ::com::sun::star::uno::Any getAny() const; + +private: + // #i12587# support for shapes in chart + // For autogenerated chart objects a CID is specified in m_aObjectCID, + // for all other objects m_xAdditionalShape is set. + // Note, that if m_aObjectCID is set, m_xAdditionalShape must be empty + // and vice versa. + ::rtl::OUString m_aObjectCID; + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > m_xAdditionalShape; }; //............................................................................. diff --git a/chart2/source/inc/Strings.hrc b/chart2/source/inc/Strings.hrc index 437be1ee4..88c3f403e 100644 --- a/chart2/source/inc/Strings.hrc +++ b/chart2/source/inc/Strings.hrc @@ -30,7 +30,7 @@ // this includes no link dependency #include <svl/solar.hrc> -//next free is 290 +//next free is 291 //single free is: 134 //#define RID_APP_START 30000 @@ -264,6 +264,8 @@ #define STR_OBJECT_CURVE_EQUATION (RID_APP_START + 268) #define STR_STATISTICS_IN_LEGEND (RID_APP_START + 180) +#define STR_OBJECT_SHAPE (RID_APP_START + 290) + //----------------------------------------------------------------------------- //Titles for tabpages and dialogs diff --git a/chart2/source/inc/UndoGuard.hxx b/chart2/source/inc/UndoGuard.hxx index 179855ea2..6eb7dcae1 100644 --- a/chart2/source/inc/UndoGuard.hxx +++ b/chart2/source/inc/UndoGuard.hxx @@ -29,7 +29,6 @@ #include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/chart2/XUndoManager.hpp> -#include "charttoolsdllapi.hxx" // header for class OUString #include <rtl/ustring.hxx> @@ -48,7 +47,7 @@ public: ::com::sun::star::frame::XModel > & xModel ); virtual ~UndoGuard_Base(); -OOO_DLLPUBLIC_CHARTTOOLS void commitAction(); + void commitAction(); protected: ::com::sun::star::uno::Reference< @@ -64,7 +63,7 @@ protected: cancelAction in the DTOR if no other method is called. If commitAction is called the destructor does nothin anymore. */ -class OOO_DLLPUBLIC_CHARTTOOLS UndoGuard : public UndoGuard_Base +class UndoGuard : public UndoGuard_Base { public: explicit UndoGuard( const rtl::OUString& rUndoMessage @@ -79,7 +78,7 @@ public: cancelActionUndo in the DTOR if no other method is called. If commitAction is called the destructor does nothin anymore. */ -class OOO_DLLPUBLIC_CHARTTOOLS UndoLiveUpdateGuard : public UndoGuard_Base +class UndoLiveUpdateGuard : public UndoGuard_Base { public: explicit UndoLiveUpdateGuard( const rtl::OUString& rUndoMessage @@ -93,7 +92,7 @@ public: /** Same as UndoLiveUpdateGuard but with additional storage of the chart's data. Only use this if the data has internal data. */ -class OOO_DLLPUBLIC_CHARTTOOLS UndoLiveUpdateGuardWithData : +class UndoLiveUpdateGuardWithData : public UndoGuard_Base { public: @@ -105,7 +104,7 @@ public: virtual ~UndoLiveUpdateGuardWithData(); }; -class OOO_DLLPUBLIC_CHARTTOOLS UndoGuardWithSelection : public UndoGuard_Base +class UndoGuardWithSelection : public UndoGuard_Base { public: explicit UndoGuardWithSelection( const rtl::OUString& rUndoMessage diff --git a/chart2/source/inc/UndoManager.hxx b/chart2/source/inc/UndoManager.hxx index 86b47764d..b97817fa5 100644 --- a/chart2/source/inc/UndoManager.hxx +++ b/chart2/source/inc/UndoManager.hxx @@ -36,8 +36,9 @@ #include <com/sun/star/util/XModifyListener.hpp> #include <com/sun/star/chart2/XUndoManager.hpp> #include <com/sun/star/chart2/XUndoHelper.hpp> +#include <com/sun/star/lang/XUnoTunnel.hpp> -#include <cppuhelper/compbase3.hxx> +#include <cppuhelper/compbase4.hxx> #include <rtl/ustring.hxx> // for pair @@ -45,6 +46,8 @@ // for auto_ptr #include <memory> +class SdrUndoAction; + namespace com { namespace sun { namespace star { namespace frame { class XModel; @@ -62,10 +65,11 @@ class UndoElement; class UndoStack; class ModifyBroadcaster; -typedef ::cppu::WeakComponentImplHelper3< +typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::util::XModifyBroadcaster, ::com::sun::star::chart2::XUndoManager, - ::com::sun::star::chart2::XUndoHelper > + ::com::sun::star::chart2::XUndoHelper, + ::com::sun::star::lang::XUnoTunnel > UndoManager_Base; } // namespace impl @@ -87,6 +91,15 @@ public: explicit UndoManager(); virtual ~UndoManager(); + void addShapeUndoAction( SdrUndoAction* pAction ); + + // ____ XUnoTunnel ____ + virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) + throw (::com::sun::star::uno::RuntimeException); + + static const ::com::sun::star::uno::Sequence< sal_Int8 >& getUnoTunnelId(); + static UndoManager* getImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> xObj ); + protected: // ____ ConfigItemListener ____ virtual void notify( const ::rtl::OUString & rPropertyName ); @@ -145,7 +158,8 @@ private: ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > & xCurrentModel, impl::UndoStack * pStackToRemoveFrom, - impl::UndoStack * pStackToAddTo ); + impl::UndoStack * pStackToAddTo, + bool bUndo = true ); ::std::auto_ptr< impl::UndoStack > m_apUndoStack; ::std::auto_ptr< impl::UndoStack > m_apRedoStack; diff --git a/chart2/source/inc/chartview/DrawModelWrapper.hxx b/chart2/source/inc/chartview/DrawModelWrapper.hxx index 8805572e3..167a616b1 100644 --- a/chart2/source/inc/chartview/DrawModelWrapper.hxx +++ b/chart2/source/inc/chartview/DrawModelWrapper.hxx @@ -95,8 +95,6 @@ public: getUnoModel(); SdrModel& getSdrModel(); - SAL_DLLPRIVATE void updateTablesFromChartModel( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xChartModel ); - XColorTable* GetColorTable() const; XDashList* GetDashList() const; XLineEndList* GetLineEndList() const; diff --git a/chart2/source/inc/servicenames.hxx b/chart2/source/inc/servicenames.hxx index f71ecd093..ce2e310b7 100644 --- a/chart2/source/inc/servicenames.hxx +++ b/chart2/source/inc/servicenames.hxx @@ -57,14 +57,13 @@ namespace chart #define CHART_CHARTAPIWRAPPER_SERVICE_NAME ::rtl::OUString::createFromAscii("com.sun.star.chart2.ChartDocumentWrapper") // accessibility -#define CHART2_ACCESSIBLE_SERVICE_IMPLEMENTATION_NAME ::rtl::OUString::createFromAscii("com.sun.star.comp.chart2.AccessibleChartView") -#define CHART2_ACCESSIBLE_SERVICE_NAME ::rtl::OUString::createFromAscii("com.sun.star.chart2.AccessibleChartView") - #define CHART_ACCESSIBLE_TEXT_IMPLEMENTATION_NAME ::rtl::OUString::createFromAscii("com.sun.star.comp.chart2.AccessibleTextComponent") #define CHART_ACCESSIBLE_TEXT_SERVICE_NAME ::rtl::OUString::createFromAscii("com.sun.star.accessibility.AccessibleTextComponent") #define CHART_RENDERER_SERVICE_IMPLEMENTATION_NAME ::rtl::OUString::createFromAscii("com.sun.star.comp.chart2.ChartRenderer") +#define CHART_UNDOMANAGER_SERVICE_NAME ::rtl::OUString::createFromAscii( "com.sun.star.chart2.UndoManager" ) + //............................................................................. } //namespace chart //............................................................................. diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx index c2950b092..774cdc215 100644 --- a/chart2/source/model/main/ChartModel.cxx +++ b/chart2/source/model/main/ChartModel.cxx @@ -60,6 +60,7 @@ #include <com/sun/star/awt/XWindow.hpp> #include <com/sun/star/awt/PosSize.hpp> #include <com/sun/star/datatransfer/XTransferable.hpp> +#include <com/sun/star/drawing/XShapes.hpp> #include <map> #include <algorithm> @@ -105,6 +106,9 @@ ChartModel::ChartModel(uno::Reference<uno::XComponentContext > const & xContext) // attention: passing this as reference to ImplChartModel m_pImplChartModel.reset( new impl::ImplChartModel( xContext, this )); + + m_xUndoManager = Reference< chart2::XUndoManager >( + this->createInstance( CHART_UNDOMANAGER_SERVICE_NAME ), uno::UNO_QUERY ); } ChartModel::ChartModel( const ChartModel & rOther ) @@ -125,6 +129,7 @@ ChartModel::ChartModel( const ChartModel & rOther ) , m_xStorage( 0 ) //rOther.m_xStorage ) , m_aVisualAreaSize( rOther.m_aVisualAreaSize ) , m_aGraphicObjectVector( rOther.m_aGraphicObjectVector ) + , m_xUndoManager( rOther.m_xUndoManager ) { OSL_TRACE( "ChartModel: Copy-CTOR called" ); @@ -211,6 +216,43 @@ ChartModel::~ChartModel() } } +void ChartModel::impl_adjustAdditionalShapesPositionAndSize( const awt::Size& aVisualAreaSize ) +{ + uno::Reference< beans::XPropertySet > xProperties( static_cast< ::cppu::OWeakObject* >( this ), uno::UNO_QUERY ); + if ( xProperties.is() ) + { + uno::Reference< drawing::XShapes > xShapes; + xProperties->getPropertyValue( C2U( "AdditionalShapes" ) ) >>= xShapes; + if ( xShapes.is() ) + { + sal_Int32 nCount = xShapes->getCount(); + for ( sal_Int32 i = 0; i < nCount; ++i ) + { + Reference< drawing::XShape > xShape; + if ( xShapes->getByIndex( i ) >>= xShape ) + { + if ( xShape.is() ) + { + awt::Point aPos( xShape->getPosition() ); + awt::Size aSize( xShape->getSize() ); + + double fWidth = static_cast< double >( aVisualAreaSize.Width ) / m_aVisualAreaSize.Width; + double fHeight = static_cast< double >( aVisualAreaSize.Height ) / m_aVisualAreaSize.Height; + + aPos.X = static_cast< long >( aPos.X * fWidth ); + aPos.Y = static_cast< long >( aPos.Y * fHeight ); + aSize.Width = static_cast< long >( aSize.Width * fWidth ); + aSize.Height = static_cast< long >( aSize.Height * fHeight ); + + xShape->setPosition( aPos ); + xShape->setSize( aSize ); + } + } + } + } + } +} + //----------------------------------------------------------------- // lang::XServiceInfo //----------------------------------------------------------------- @@ -904,6 +946,13 @@ void SAL_CALL ChartModel::setVisualAreaSize( ::sal_Int64 nAspect, const awt::Siz bool bChanged = (m_aVisualAreaSize.Width != aSize.Width || m_aVisualAreaSize.Height != aSize.Height); + + // #i12587# support for shapes in chart + if ( bChanged ) + { + impl_adjustAdditionalShapesPositionAndSize( aSize ); + } + m_aVisualAreaSize = aSize; if( bChanged ) setModified( sal_True ); @@ -1086,18 +1135,20 @@ Reference< uno::XInterface > SAL_CALL ChartModel::createInstance( const OUString switch( (*aIt).second ) { case SERVICE_DASH_TABLE: - return m_pImplChartModel->GetDashTable(); case SERVICE_GARDIENT_TABLE: - return m_pImplChartModel->GetGradientTable(); case SERVICE_HATCH_TABLE: - return m_pImplChartModel->GetHatchTable(); case SERVICE_BITMAP_TABLE: - return m_pImplChartModel->GetBitmapTable(); case SERVICE_TRANSP_GRADIENT_TABLE: - return m_pImplChartModel->GetTransparencyGradientTable(); case SERVICE_MARKER_TABLE: - // not supported - return 0; + { + uno::Reference< lang::XMultiServiceFactory > xFact( + this->createInstance( CHART_VIEW_SERVICE_NAME ), uno::UNO_QUERY ); + if ( xFact.is() ) + { + return xFact->createInstance( rServiceSpecifier ); + } + } + break; case SERVICE_NAMESPACE_MAP: // not yet supported, @todo // return 0; @@ -1212,7 +1263,7 @@ void SAL_CALL ChartModel::setParent( const Reference< uno::XInterface >& Parent Reference< chart2::XUndoManager > SAL_CALL ChartModel::getUndoManager() throw (uno::RuntimeException) { - return m_pImplChartModel->GetUndoManager(); + return m_xUndoManager; } // ____ XDataSource ____ diff --git a/chart2/source/model/main/ChartModel.hxx b/chart2/source/model/main/ChartModel.hxx index f893910f4..6f7a2c3f6 100644 --- a/chart2/source/model/main/ChartModel.hxx +++ b/chart2/source/model/main/ChartModel.hxx @@ -147,6 +147,7 @@ private: ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > m_xParent; ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XRangeHighlighter > m_xRangeHighlighter; ::std::vector< GraphicObject > m_aGraphicObjectVector; + ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XUndoManager > m_xUndoManager; private: //private methods @@ -192,6 +193,9 @@ private: impl_createFilter( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > & rMediaDescriptor ); + void impl_adjustAdditionalShapesPositionAndSize( + const ::com::sun::star::awt::Size& aVisualAreaSize ); + public: //no default constructor ChartModel(::com::sun::star::uno::Reference< diff --git a/chart2/source/model/main/ImplChartModel.cxx b/chart2/source/model/main/ImplChartModel.cxx index 3d7b69d21..33eafaaf5 100644..100755 --- a/chart2/source/model/main/ImplChartModel.cxx +++ b/chart2/source/model/main/ImplChartModel.cxx @@ -109,17 +109,6 @@ ImplChartModel::ImplChartModel( m_spChartData( new ChartData( m_xContext )), m_bIsDisposed( false ), m_xPageBackground( new PageBackground( m_xContext )), - m_xUndoManager( ChartModelHelper::createUndoManager() ), - m_xDashTable( createNameContainer( ::getCppuType( reinterpret_cast< const drawing::LineDash * >(0)), - C2U( "com.sun.star.drawing.DashTable" ), C2U( "com.sun.star.comp.chart.DashTable" ) )), - m_xGradientTable( createNameContainer( ::getCppuType( reinterpret_cast< const awt::Gradient * >(0)), - C2U( "com.sun.star.drawing.GradientTable" ), C2U( "com.sun.star.comp.chart.GradientTable" ) )), - m_xHatchTable( createNameContainer( ::getCppuType( reinterpret_cast< const drawing::Hatch * >(0)), - C2U( "com.sun.star.drawing.HatchTable" ), C2U( "com.sun.star.comp.chart.HatchTable" ) )), - m_xBitmapTable( createNameContainer( ::getCppuType( reinterpret_cast< const OUString * >(0)), // URL - C2U( "com.sun.star.drawing.BitmapTable" ), C2U( "com.sun.star.comp.chart.BitmapTable" ) )), - m_xTransparencyGradientTable( createNameContainer( ::getCppuType( reinterpret_cast< const awt::Gradient * >(0)), - C2U( "com.sun.star.drawing.TransparencyGradientTable" ), C2U( "com.sun.star.comp.chart.TransparencyGradientTable" ) )), m_xXMLNamespaceMap( createNameContainer( ::getCppuType( (const OUString*) 0 ), C2U( "com.sun.star.xml.NamespaceMap" ), C2U( "com.sun.star.comp.chart.XMLNameSpaceMap" ) ), uno::UNO_QUERY), m_xModifyListener( xListener ) @@ -148,12 +137,6 @@ ImplChartModel::ImplChartModel( const ImplChartModel & rOther, const Reference< m_xPageBackground.set( CreateRefClone< Reference< beans::XPropertySet > >()( rOther.m_xPageBackground )); ModifyListenerHelper::addListener( m_xPageBackground, m_xModifyListener ); - m_xDashTable.set( CreateRefClone< Reference< container::XNameContainer > >()( rOther.m_xDashTable )); - m_xGradientTable.set( CreateRefClone< Reference< container::XNameContainer > >()( rOther.m_xGradientTable )); - m_xHatchTable.set( CreateRefClone< Reference< container::XNameContainer > >()( rOther.m_xHatchTable )); - m_xBitmapTable.set( CreateRefClone< Reference< container::XNameContainer > >()( rOther.m_xBitmapTable )); - m_xTransparencyGradientTable.set( CreateRefClone< Reference< container::XNameContainer > >()( rOther.m_xTransparencyGradientTable )); - m_xXMLNamespaceMap.set( CreateRefClone< Reference< container::XNameAccess > >()( rOther.m_xXMLNamespaceMap )); CloneRefVector< Reference< chart2::XDiagram > >( rOther.m_aDiagrams, m_aDiagrams ); @@ -440,12 +423,6 @@ void ImplChartModel::dispose() m_aDiagrams.clear(); DisposeHelper::DisposeAndClear( m_xTitle ); DisposeHelper::DisposeAndClear( m_xPageBackground ); - DisposeHelper::DisposeAndClear( m_xDashTable ); - DisposeHelper::DisposeAndClear( m_xGradientTable ); - DisposeHelper::DisposeAndClear( m_xHatchTable ); - DisposeHelper::DisposeAndClear( m_xBitmapTable ); - DisposeHelper::DisposeAndClear( m_xTransparencyGradientTable ); - DisposeHelper::DisposeAndClear( m_xXMLNamespaceMap ); // note: m_xModifyListener is the ChartModel, so don't call dispose() @@ -459,11 +436,6 @@ Reference< beans::XPropertySet > ImplChartModel::GetPageBackground() return m_xPageBackground; } -Reference< chart2::XUndoManager > ImplChartModel::GetUndoManager() -{ - return m_xUndoManager; -} - void ImplChartModel::SetNewData( const Reference< chart2::data::XDataSource > & xDataSource, const Sequence< beans::PropertyValue > & rArgs ) { @@ -515,27 +487,6 @@ void ImplChartModel::CreateDefaultChartTypeTemplate() } } -Reference< uno::XInterface > ImplChartModel::GetDashTable() const -{ - return Reference< uno::XInterface >( m_xDashTable ); -} -Reference< uno::XInterface > ImplChartModel::GetGradientTable() const -{ - return Reference< uno::XInterface >( m_xGradientTable ); -} -Reference< uno::XInterface > ImplChartModel::GetHatchTable() const -{ - return Reference< uno::XInterface >( m_xHatchTable ); -} -Reference< uno::XInterface > ImplChartModel::GetBitmapTable() const -{ - return Reference< uno::XInterface >( m_xBitmapTable ); -} -Reference< uno::XInterface > ImplChartModel::GetTransparencyGradientTable() const -{ - return Reference< uno::XInterface >( m_xTransparencyGradientTable ); -} - Reference< uno::XInterface > ImplChartModel::GetXMLNameSpaceMap() const { return Reference< uno::XInterface >( m_xXMLNamespaceMap ); diff --git a/chart2/source/model/main/ImplChartModel.hxx b/chart2/source/model/main/ImplChartModel.hxx index ebfb35caa..3a865e638 100644 --- a/chart2/source/model/main/ImplChartModel.hxx +++ b/chart2/source/model/main/ImplChartModel.hxx @@ -154,23 +154,9 @@ public: ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > GetPageBackground(); - ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XUndoManager > - GetUndoManager(); - void CreateDefaultChart(); ::com::sun::star::uno::Reference< - ::com::sun::star::uno::XInterface > GetDashTable() const; - ::com::sun::star::uno::Reference< - ::com::sun::star::uno::XInterface > GetGradientTable() const; - ::com::sun::star::uno::Reference< - ::com::sun::star::uno::XInterface > GetHatchTable() const; - ::com::sun::star::uno::Reference< - ::com::sun::star::uno::XInterface > GetBitmapTable() const; - ::com::sun::star::uno::Reference< - ::com::sun::star::uno::XInterface > GetTransparencyGradientTable() const; - - ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > GetXMLNameSpaceMap() const; ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > @@ -229,14 +215,6 @@ private: bool m_bIsDisposed; ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xPageBackground; - ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XUndoManager > - m_xUndoManager; - - ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xDashTable; - ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xGradientTable; - ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xHatchTable; - ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xBitmapTable; - ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > m_xTransparencyGradientTable; ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> m_xXMLNamespaceMap; diff --git a/chart2/source/tools/ChartModelHelper.cxx b/chart2/source/tools/ChartModelHelper.cxx index 66d6dcd26..673cb228f 100644 --- a/chart2/source/tools/ChartModelHelper.cxx +++ b/chart2/source/tools/ChartModelHelper.cxx @@ -32,7 +32,6 @@ #include "DiagramHelper.hxx" #include "DataSourceHelper.hxx" #include "ControllerLockGuard.hxx" -#include "UndoManager.hxx" #include "RangeHighlighter.hxx" #include "InternalDataProvider.hxx" @@ -56,12 +55,6 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::chart2; //static -uno::Reference< chart2::XUndoManager > ChartModelHelper::createUndoManager() -{ - return new UndoManager(); -} - -//static uno::Reference< chart2::data::XRangeHighlighter > ChartModelHelper::createRangeHighlighter( const uno::Reference< view::XSelectionSupplier > & xSelectionSupplier ) { diff --git a/chart2/source/tools/ObjectIdentifier.cxx b/chart2/source/tools/ObjectIdentifier.cxx index 83401d719..b7721e14c 100644 --- a/chart2/source/tools/ObjectIdentifier.cxx +++ b/chart2/source/tools/ObjectIdentifier.cxx @@ -59,6 +59,7 @@ using namespace ::com::sun::star::chart2; using rtl::OUString; using rtl::OUStringBuffer; using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Any; static OUString m_aMultiClick( C2U("MultiClick") ); static OUString m_aDragMethodEquals( C2U("DragMethod=") ); @@ -251,6 +252,94 @@ void lcl_getDiagramAndCooSys( const OUString& rObjectCID } //anonymous namespace +ObjectIdentifier::ObjectIdentifier() + :m_aObjectCID( OUString() ) + ,m_xAdditionalShape( 0 ) +{ +} + +ObjectIdentifier::ObjectIdentifier( const OUString& rObjectCID ) + :m_aObjectCID( rObjectCID ) + ,m_xAdditionalShape( 0 ) +{ +} + +ObjectIdentifier::ObjectIdentifier( const Reference< drawing::XShape >& rxShape ) + :m_aObjectCID( OUString() ) + ,m_xAdditionalShape( rxShape ) +{ +} + +ObjectIdentifier::ObjectIdentifier( const Any& rAny ) + :m_aObjectCID( OUString() ) + ,m_xAdditionalShape( 0 ) +{ + const uno::Type& rType = rAny.getValueType(); + if ( rType == ::getCppuType( static_cast< const OUString* >( 0 ) ) ) + { + rAny >>= m_aObjectCID; + } + else if ( rType == ::getCppuType( static_cast< const Reference< drawing::XShape >* >( 0 ) ) ) + { + rAny >>= m_xAdditionalShape; + } +} + +ObjectIdentifier::~ObjectIdentifier() +{ +} + +ObjectIdentifier::ObjectIdentifier( const ObjectIdentifier& rOID ) + :m_aObjectCID( rOID.m_aObjectCID ) + ,m_xAdditionalShape( rOID.m_xAdditionalShape ) +{ + +} + +ObjectIdentifier& ObjectIdentifier::operator=( const ObjectIdentifier& rOID ) +{ + m_aObjectCID = rOID.m_aObjectCID; + m_xAdditionalShape = rOID.m_xAdditionalShape; + return *this; +} + +bool ObjectIdentifier::operator==( const ObjectIdentifier& rOID ) const +{ + if ( areIdenticalObjects( m_aObjectCID, rOID.m_aObjectCID ) && + ( m_xAdditionalShape == rOID.m_xAdditionalShape ) ) + { + return true; + } + return false; +} + +bool ObjectIdentifier::operator!=( const ObjectIdentifier& rOID ) const +{ + return !operator==( rOID ); +} + +bool ObjectIdentifier::operator<( const ObjectIdentifier& rOID ) const +{ + bool bReturn = false; + if ( m_aObjectCID.getLength() && rOID.m_aObjectCID.getLength() ) + { + bReturn = ( m_aObjectCID.compareTo( rOID.m_aObjectCID ) < 0 ); + } + else if ( m_aObjectCID.getLength() ) + { + bReturn = true; + } + else if ( rOID.m_aObjectCID.getLength() ) + { + bReturn = false; + } + else if ( m_xAdditionalShape.is() && rOID.m_xAdditionalShape.is() ) + { + bReturn = ( m_xAdditionalShape < rOID.m_xAdditionalShape ); + } + return bReturn; +} + //static OUString ObjectIdentifier::createClassifiedIdentifierForObject( const Reference< uno::XInterface >& xObject @@ -665,6 +754,20 @@ bool ObjectIdentifier::isDragableObject( const OUString& rClassifiedIdentifier ) return false; } +bool ObjectIdentifier::isDragableObject() +{ + bool bReturn = false; + if ( isAutoGeneratedObject() ) + { + bReturn = isDragableObject( m_aObjectCID ); + } + else if ( isAdditionalShape() ) + { + bReturn = true; + } + return bReturn; +} + //static bool ObjectIdentifier::isRotateableObject( const OUString& rClassifiedIdentifier ) { @@ -903,6 +1006,20 @@ ObjectType ObjectIdentifier::getObjectType( const OUString& rCID ) return eRet; } +ObjectType ObjectIdentifier::getObjectType() +{ + ObjectType eObjectType( OBJECTTYPE_UNKNOWN ); + if ( isAutoGeneratedObject() ) + { + eObjectType = getObjectType( m_aObjectCID ); + } + else if ( isAdditionalShape() ) + { + eObjectType = OBJECTTYPE_SHAPE; + } + return eObjectType; +} + //static OUString ObjectIdentifier::createDataCurveCID( const OUString& rSeriesParticle @@ -1329,7 +1446,46 @@ OUString ObjectIdentifier::getMovedSeriesCID( const ::rtl::OUString& rObjectCID, OUString aRet = ObjectIdentifier::createParticleForSeries( nDiagramIndex, nCooSysIndex, nChartTypeIndex, nSeriesIndex ); return ObjectIdentifier::createClassifiedIdentifierForParticle( aRet ); } -//static + +bool ObjectIdentifier::isValid() const +{ + return ( isAutoGeneratedObject() || isAdditionalShape() ); +} + +bool ObjectIdentifier::isAutoGeneratedObject() const +{ + return ( m_aObjectCID.getLength() > 0 ); +} + +bool ObjectIdentifier::isAdditionalShape() const +{ + return m_xAdditionalShape.is(); +} + +OUString ObjectIdentifier::getObjectCID() const +{ + return m_aObjectCID; +} + +Reference< drawing::XShape > ObjectIdentifier::getAdditionalShape() const +{ + return m_xAdditionalShape; +} + +Any ObjectIdentifier::getAny() const +{ + Any aAny; + if ( isAutoGeneratedObject() ) + { + aAny = uno::makeAny( getObjectCID() ); + } + else if ( isAdditionalShape() ) + { + aAny = uno::makeAny( getAdditionalShape() ); + } + return aAny; +} + //............................................................................. } //namespace chart //............................................................................. diff --git a/chart2/source/tools/RangeHighlighter.cxx b/chart2/source/tools/RangeHighlighter.cxx index a28c26632..4f6991480 100644 --- a/chart2/source/tools/RangeHighlighter.cxx +++ b/chart2/source/tools/RangeHighlighter.cxx @@ -39,6 +39,7 @@ #include <com/sun/star/chart2/XDataSeries.hpp> #include <com/sun/star/chart/ErrorBarStyle.hpp> +#include <com/sun/star/drawing/XShape.hpp> #define PREFERED_DEFAULT_COLOR 0x0000ff @@ -106,66 +107,81 @@ void RangeHighlighter::determineRanges() m_bIncludeHiddenCells = ChartModelHelper::isIncludeHiddenCells( xChartModel ); uno::Any aSelection( m_xSelectionSupplier->getSelection()); - OUString aCID; - if(( aSelection >>= aCID ) && - aCID.getLength() > 0 ) + const uno::Type& rType = aSelection.getValueType(); + + if ( rType == ::getCppuType( static_cast< const OUString* >( 0 ) ) ) { // @todo??: maybe getSelection() should return a model object rather than a CID - ObjectType eObjectType = ObjectIdentifier::getObjectType( aCID ); - sal_Int32 nIndex = ObjectIdentifier::getIndexFromParticleOrCID( aCID ); - Reference< chart2::XDataSeries > xDataSeries( ObjectIdentifier::getDataSeriesForCID( aCID, xChartModel ) ); - if( OBJECTTYPE_LEGEND_ENTRY == eObjectType ) + OUString aCID; + aSelection >>= aCID; + if ( aCID.getLength() > 0 ) { - OUString aParentParticel( ObjectIdentifier::getFullParentParticle( aCID ) ); - ObjectType eParentObjectType = ObjectIdentifier::getObjectType( aParentParticel ); - eObjectType = eParentObjectType; - if( OBJECTTYPE_DATA_POINT == eObjectType ) - nIndex = ObjectIdentifier::getIndexFromParticleOrCID( aParentParticel ); - } + ObjectType eObjectType = ObjectIdentifier::getObjectType( aCID ); + sal_Int32 nIndex = ObjectIdentifier::getIndexFromParticleOrCID( aCID ); + Reference< chart2::XDataSeries > xDataSeries( ObjectIdentifier::getDataSeriesForCID( aCID, xChartModel ) ); + if( OBJECTTYPE_LEGEND_ENTRY == eObjectType ) + { + OUString aParentParticel( ObjectIdentifier::getFullParentParticle( aCID ) ); + ObjectType eParentObjectType = ObjectIdentifier::getObjectType( aParentParticel ); + eObjectType = eParentObjectType; + if( OBJECTTYPE_DATA_POINT == eObjectType ) + nIndex = ObjectIdentifier::getIndexFromParticleOrCID( aParentParticel ); + } - if( OBJECTTYPE_DATA_POINT == eObjectType || OBJECTTYPE_DATA_LABEL == eObjectType ) - { - // Data Point - fillRangesForDataPoint( xDataSeries, nIndex ); - return; - } - else if( OBJECTTYPE_DATA_ERRORS == eObjectType ) - { - // select error bar ranges, or data series, if the style is - // not set to FROM_DATA - fillRangesForErrorBars( ObjectIdentifier::getObjectPropertySet( aCID, xChartModel ), xDataSeries ); - return; - } - else if( xDataSeries.is() ) - { - // Data Series - fillRangesForDataSeries( xDataSeries ); - return; - } - else if( OBJECTTYPE_AXIS == eObjectType ) - { - // Axis (Categories) - Reference< chart2::XAxis > xAxis( ObjectIdentifier::getObjectPropertySet( aCID, xChartModel ), uno::UNO_QUERY ); - if( xAxis.is()) + if( OBJECTTYPE_DATA_POINT == eObjectType || OBJECTTYPE_DATA_LABEL == eObjectType ) { - fillRangesForCategories( xAxis ); + // Data Point + fillRangesForDataPoint( xDataSeries, nIndex ); return; } - } - else if( OBJECTTYPE_PAGE == eObjectType - || OBJECTTYPE_DIAGRAM == eObjectType - || OBJECTTYPE_DIAGRAM_WALL == eObjectType - || OBJECTTYPE_DIAGRAM_FLOOR == eObjectType - ) - { - // Diagram - Reference< chart2::XDiagram > xDia( ObjectIdentifier::getDiagramForCID( aCID, xChartModel ) ); - if( xDia.is()) + else if( OBJECTTYPE_DATA_ERRORS == eObjectType ) { - fillRangesForDiagram( xDia ); + // select error bar ranges, or data series, if the style is + // not set to FROM_DATA + fillRangesForErrorBars( ObjectIdentifier::getObjectPropertySet( aCID, xChartModel ), xDataSeries ); return; } + else if( xDataSeries.is() ) + { + // Data Series + fillRangesForDataSeries( xDataSeries ); + return; + } + else if( OBJECTTYPE_AXIS == eObjectType ) + { + // Axis (Categories) + Reference< chart2::XAxis > xAxis( ObjectIdentifier::getObjectPropertySet( aCID, xChartModel ), uno::UNO_QUERY ); + if( xAxis.is()) + { + fillRangesForCategories( xAxis ); + return; + } + } + else if( OBJECTTYPE_PAGE == eObjectType + || OBJECTTYPE_DIAGRAM == eObjectType + || OBJECTTYPE_DIAGRAM_WALL == eObjectType + || OBJECTTYPE_DIAGRAM_FLOOR == eObjectType + ) + { + // Diagram + Reference< chart2::XDiagram > xDia( ObjectIdentifier::getDiagramForCID( aCID, xChartModel ) ); + if( xDia.is()) + { + fillRangesForDiagram( xDia ); + return; + } + } + } + } + else if ( rType == ::getCppuType( static_cast< const Reference< drawing::XShape >* >( 0 ) ) ) + { + // #i12587# support for shapes in chart + Reference< drawing::XShape > xShape; + aSelection >>= xShape; + if ( xShape.is() ) + { + return; } } else diff --git a/chart2/source/tools/makefile.mk b/chart2/source/tools/makefile.mk index b459d489e..2b6e0cf51 100644 --- a/chart2/source/tools/makefile.mk +++ b/chart2/source/tools/makefile.mk @@ -101,9 +101,6 @@ SLOFILES= \ $(SLO)$/ChartDebugTrace.obj \ $(SLO)$/_serviceregistration_tools.obj \ $(SLO)$/UncachedDataSequence.obj \ - $(SLO)$/UndoManager.obj \ - $(SLO)$/UndoGuard.obj \ - $(SLO)$/ImplUndoManager.obj \ $(SLO)$/XMLRangeHelper.obj \ $(SLO)$/ModifyListenerHelper.obj \ $(SLO)$/ModifyListenerCallBack.obj \ diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 8b895f558..6f5a9e9b4 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -71,6 +71,7 @@ // header for class Application #include <vcl/svapp.hxx> #include <vos/mutex.hxx> +#include <svx/unofill.hxx> #include <time.h> @@ -100,6 +101,7 @@ #include <com/sun/star/text/XTextDocument.hpp> #include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/text/XTextEmbeddedObjectsSupplier.hpp> +#include <com/sun/star/view/XSelectionSupplier.hpp> #include <svl/languageoptions.hxx> #include <sot/clsids.hxx> @@ -2423,6 +2425,8 @@ void ChartView::createShapes() { // /-- ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); + // #i12587# support for shapes in chart + m_pDrawModelWrapper->getSdrModel().EnableUndo( FALSE ); m_pDrawModelWrapper->clearMainDrawPage(); // \-- } @@ -2575,6 +2579,13 @@ void ChartView::createShapes() lcl_removeEmptyGroupShapes( xPageShapes ); } + // #i12587# support for shapes in chart + if ( m_pDrawModelWrapper ) + { + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + m_pDrawModelWrapper->getSdrModel().EnableUndo( TRUE ); + } + #if OSL_DEBUG_LEVEL > 0 clock_t nEnd = clock(); double fDuration =(double(nEnd-nStart)*1000.0)/double(CLOCKS_PER_SEC); @@ -2597,6 +2608,12 @@ void ChartView::impl_updateView() if( !m_xChartModel.is() || !m_pDrawModelWrapper ) return; + // #i12587# support for shapes in chart + if ( m_bSdrViewIsInEditMode ) + { + return; + } + if( m_bViewDirty && !m_bInViewUpdate ) { m_bInViewUpdate = true; @@ -2611,7 +2628,6 @@ void ChartView::impl_updateView() // /-- ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); m_pDrawModelWrapper->lockControllers(); - m_pDrawModelWrapper->updateTablesFromChartModel( m_xChartModel ); // \-- } @@ -2686,8 +2702,22 @@ void ChartView::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) //#i77362 change notification for changes on additional shapes are missing if( m_bInViewUpdate ) return; - if( m_bSdrViewIsInEditMode ) - return; + + // #i12587# support for shapes in chart + if ( m_bSdrViewIsInEditMode && m_xChartModel.is() ) + { + uno::Reference< view::XSelectionSupplier > xSelectionSupplier( m_xChartModel->getCurrentController(), uno::UNO_QUERY ); + if ( xSelectionSupplier.is() ) + { + ::rtl::OUString aSelObjCID; + uno::Any aSelObj( xSelectionSupplier->getSelection() ); + aSelObj >>= aSelObjCID; + if ( aSelObjCID.getLength() > 0 ) + { + return; + } + } + } const SdrHint* pSdrHint = dynamic_cast< const SdrHint* >(&rHint); if( !pSdrHint ) @@ -2708,6 +2738,9 @@ void ChartView::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) case HINT_MODELCLEARED: bShapeChanged = true; break; + case HINT_ENDEDIT: + bShapeChanged = true; + break; default: break; } @@ -2879,6 +2912,88 @@ void SAL_CALL ChartView::removeVetoableChangeListener( const ::rtl::OUString& /* OSL_ENSURE(false,"not implemented"); } +// ____ XMultiServiceFactory ____ + +Reference< uno::XInterface > ChartView::createInstance( const ::rtl::OUString& aServiceSpecifier ) + throw (uno::Exception, uno::RuntimeException) +{ + SdrModel* pModel = ( m_pDrawModelWrapper ? &m_pDrawModelWrapper->getSdrModel() : NULL ); + if ( pModel ) + { + if ( aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.DashTable" ) ) == 0 ) + { + if ( !m_xDashTable.is() ) + { + m_xDashTable = SvxUnoDashTable_createInstance( pModel ); + } + return m_xDashTable; + } + else if ( aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.GradientTable" ) ) == 0 ) + { + if ( !m_xGradientTable.is() ) + { + m_xGradientTable = SvxUnoGradientTable_createInstance( pModel ); + } + return m_xGradientTable; + } + else if ( aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.HatchTable" ) ) == 0 ) + { + if ( !m_xHatchTable.is() ) + { + m_xHatchTable = SvxUnoHatchTable_createInstance( pModel ); + } + return m_xHatchTable; + } + else if ( aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.BitmapTable" ) ) == 0 ) + { + if ( !m_xBitmapTable.is() ) + { + m_xBitmapTable = SvxUnoBitmapTable_createInstance( pModel ); + } + return m_xBitmapTable; + } + else if ( aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.TransparencyGradientTable" ) ) == 0 ) + { + if ( !m_xTransGradientTable.is() ) + { + m_xTransGradientTable = SvxUnoTransGradientTable_createInstance( pModel ); + } + return m_xTransGradientTable; + } + else if ( aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.MarkerTable" ) ) == 0 ) + { + if ( !m_xMarkerTable.is() ) + { + m_xMarkerTable = SvxUnoMarkerTable_createInstance( pModel ); + } + return m_xMarkerTable; + } + } + + return 0; +} + +Reference< uno::XInterface > ChartView::createInstanceWithArguments( const ::rtl::OUString& ServiceSpecifier, const uno::Sequence< uno::Any >& Arguments ) + throw (uno::Exception, uno::RuntimeException) +{ + OSL_ENSURE( Arguments.getLength(), "ChartView::createInstanceWithArguments: arguments are ignored" ); + (void) Arguments; // avoid warning + return createInstance( ServiceSpecifier ); +} + +uno::Sequence< ::rtl::OUString > ChartView::getAvailableServiceNames() throw (uno::RuntimeException) +{ + uno::Sequence< ::rtl::OUString > aServiceNames( 6 ); + + aServiceNames[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.DashTable" ) ); + aServiceNames[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.GradientTable" ) ); + aServiceNames[2] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.HatchTable" ) ); + aServiceNames[3] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.BitmapTable" ) ); + aServiceNames[4] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.TransparencyGradientTable" ) ); + aServiceNames[5] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.MarkerTable" ) ); + + return aServiceNames; +} //............................................................................. } //namespace chart diff --git a/chart2/source/view/main/ChartView.hxx b/chart2/source/view/main/ChartView.hxx index c3a49cc75..735e7b1ec 100644 --- a/chart2/source/view/main/ChartView.hxx +++ b/chart2/source/view/main/ChartView.hxx @@ -29,7 +29,7 @@ #include "chartview/ExplicitValueProvider.hxx" #include "ServiceMacros.hxx" -#include <cppuhelper/implbase8.hxx> +#include <cppuhelper/implbase9.hxx> #include <cppuhelper/interfacecontainer.hxx> // header for class SfxListener @@ -69,7 +69,7 @@ The view than changes to state dirty. The view can be updated with call 'update' The View is not responsible to handle single user events (that is instead done by the ChartWindow). */ -class ChartView : public ::cppu::WeakImplHelper8< +class ChartView : public ::cppu::WeakImplHelper9< ::com::sun::star::lang::XInitialization , ::com::sun::star::lang::XServiceInfo , ::com::sun::star::datatransfer::XTransferable @@ -82,6 +82,7 @@ class ChartView : public ::cppu::WeakImplHelper8< ,::com::sun::star::util::XModeChangeBroadcaster ,::com::sun::star::util::XUpdatable ,::com::sun::star::beans::XPropertySet + ,::com::sun::star::lang::XMultiServiceFactory > , public ExplicitValueProvider , private SfxListener @@ -163,6 +164,15 @@ public: virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + //----------------------------------------------------------------- + // ::com::sun::star::lang::XMultiServiceFactory + //----------------------------------------------------------------- + virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstance( const ::rtl::OUString& aServiceSpecifier ) + throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithArguments( + const ::rtl::OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Arguments ) + throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getAvailableServiceNames() throw (::com::sun::star::uno::RuntimeException); // for ExplicitValueProvider // ____ XUnoTunnel ___ @@ -206,6 +216,13 @@ private: //member ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage> m_xDrawPage; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xDashTable; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xGradientTable; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xHatchTable; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xBitmapTable; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xTransGradientTable; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xMarkerTable; + ::boost::shared_ptr< DrawModelWrapper > m_pDrawModelWrapper; std::vector< VCoordinateSystem* > m_aVCooSysList; diff --git a/chart2/source/view/main/DrawModelWrapper.cxx b/chart2/source/view/main/DrawModelWrapper.cxx index bbc5585bf..8cf9da5cc 100644 --- a/chart2/source/view/main/DrawModelWrapper.cxx +++ b/chart2/source/view/main/DrawModelWrapper.cxx @@ -131,7 +131,7 @@ DrawModelWrapper::DrawModelWrapper( SetScaleUnit(MAP_100TH_MM); SetScaleFraction(Fraction(1, 1)); - SetDefaultFontHeight(847); // 24pt + SetDefaultFontHeight(423); // 12pt SfxItemPool* pMasterPool = &GetItemPool(); pMasterPool->SetDefaultMetric(SFX_MAPUNIT_100TH_MM); @@ -390,77 +390,6 @@ SdrObject* DrawModelWrapper::getNamedSdrObject( const String& rObjectCID, SdrObj return 0; } -namespace -{ - void impl_addOrExchangeElements( const uno::Reference< uno::XInterface >& xSource - , const uno::Reference< uno::XInterface >& xTarget ) - { - uno::Reference< container::XNameContainer > xSourceContainer( xSource, uno::UNO_QUERY ); - uno::Reference< container::XNameContainer > xTargetContainer( xTarget, uno::UNO_QUERY ); - - if(!xSourceContainer.is()||!xTargetContainer.is()) - return; - - try - { - //put each element of xSourceContainer to xTargetContainer - uno::Sequence< rtl::OUString > aNames( xSourceContainer->getElementNames() ); - for( sal_Int32 nN = aNames.getLength(); nN--; ) - { - rtl::OUString aName(aNames[nN]); - uno::Any aNewValue( xSourceContainer->getByName( aName ) ); - if( xTargetContainer->hasByName(aName) ) - { - uno::Any aOldValue( xTargetContainer->getByName( aName ) ); - if( aOldValue != aNewValue ) - xTargetContainer->replaceByName(aName,aNewValue); - } - else - xTargetContainer->insertByName( aName, aNewValue ); - } - } - catch( const uno::Exception & ex ) - { - ASSERT_EXCEPTION( ex ); - } - } -} - -void DrawModelWrapper::updateTablesFromChartModel( const uno::Reference< frame::XModel >& xChartModel ) -{ - //all gradients, etc contained in the model need to be offered fot the view and GUI also: - - DBG_ASSERT( xChartModel.is(),"need a chart model for updateTablesFromChartModel"); - if( !xChartModel.is() ) - return; - - uno::Reference< lang::XMultiServiceFactory > xTableFactory( xChartModel, uno::UNO_QUERY ); - DBG_ASSERT( xTableFactory.is(), "new model is expected to implement service factory for gradient table etc" ); - if( !xTableFactory.is() ) - return; - - //todo? colorTable... - //impl_addOrExchangeElements( xTableFactory->createInstance( C2U("com.sun.star.drawing.XXX") ) - // , SvxUnoXColorTable_createInstance( this->GetColorTable() ) ); - impl_addOrExchangeElements( xTableFactory->createInstance( C2U("com.sun.star.drawing.DashTable") ) - , SvxUnoXDashTable_createInstance( this->GetDashList() ) ); - impl_addOrExchangeElements( xTableFactory->createInstance( C2U("com.sun.star.drawing.MarkerTable") ) - , SvxUnoXLineEndTable_createInstance( this->GetLineEndList() ) ); - impl_addOrExchangeElements( xTableFactory->createInstance( C2U("com.sun.star.drawing.GradientTable") ) - , SvxUnoXGradientTable_createInstance( this->GetGradientList() ) ); - impl_addOrExchangeElements( xTableFactory->createInstance( C2U("com.sun.star.drawing.HatchTable") ) - , SvxUnoXHatchTable_createInstance( this->GetHatchList() ) ); - impl_addOrExchangeElements( xTableFactory->createInstance( C2U("com.sun.star.drawing.BitmapTable") ) - , SvxUnoXBitmapTable_createInstance( this->GetBitmapList() ) ); - - // transparency gradients - uno::Reference< uno::XInterface > xSource( - xTableFactory->createInstance( C2U("com.sun.star.drawing.TransparencyGradientTable"))); - uno::Reference< uno::XInterface > xTarget( - this->getShapeFactory()->createInstance( C2U("com.sun.star.drawing.TransparencyGradientTable"))); - impl_addOrExchangeElements( xSource, xTarget ); -} - //static bool DrawModelWrapper::removeShape( const uno::Reference< drawing::XShape >& xShape ) { diff --git a/chart2/uiconfig/toolbar/arrowshapes.xml b/chart2/uiconfig/toolbar/arrowshapes.xml new file mode 100644 index 000000000..17b654bd2 --- /dev/null +++ b/chart2/uiconfig/toolbar/arrowshapes.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-down-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.corner-right-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.striped-right-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.notched-right-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.pentagon-right" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.chevron" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.right-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.down-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.left-right-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-down-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.up-right-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.quad-arrow-callout" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.circular-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.split-round-arrow" toolbar:helpid="helpid:11004" /> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes.s-sharped-arrow" toolbar:helpid="helpid:11004" /> +</toolbar:toolbar>
\ No newline at end of file diff --git a/chart2/uiconfig/toolbar/basicshapes.xml b/chart2/uiconfig/toolbar/basicshapes.xml new file mode 100644 index 000000000..bd4b96708 --- /dev/null +++ b/chart2/uiconfig/toolbar/basicshapes.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.rectangle" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-rectangle" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.quadrat" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.round-quadrat" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ellipse" toolbar:helpid="helpid:11002" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.circle-pie" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.isosceles-triangle" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.right-triangle" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.trapezoid" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.diamond" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.parallelogram" toolbar:helpid="helpid:11002" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.pentagon" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.hexagon" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.octagon" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cross" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.ring" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.block-arc" toolbar:helpid="helpid:11002" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.can" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.cube" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.paper" toolbar:helpid="helpid:11002" /> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes.frame" toolbar:helpid="helpid:11002" /> +</toolbar:toolbar>
\ No newline at end of file diff --git a/chart2/uiconfig/toolbar/calloutshapes.xml b/chart2/uiconfig/toolbar/calloutshapes.xml new file mode 100644 index 000000000..91b957fa6 --- /dev/null +++ b/chart2/uiconfig/toolbar/calloutshapes.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.rectangular-callout" toolbar:helpid="helpid:11006" /> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-rectangular-callout" toolbar:helpid="helpid:11006" /> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.round-callout" toolbar:helpid="helpid:11006" /> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.cloud-callout" toolbar:helpid="helpid:11006" /> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-1" toolbar:helpid="helpid:11006" /> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-2" toolbar:helpid="helpid:11006" /> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes.line-callout-3" toolbar:helpid="helpid:11006" /> +</toolbar:toolbar>
\ No newline at end of file diff --git a/chart2/uiconfig/toolbar/drawbar.xml b/chart2/uiconfig/toolbar/drawbar.xml new file mode 100644 index 000000000..f40178356 --- /dev/null +++ b/chart2/uiconfig/toolbar/drawbar.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink"> + <toolbar:toolbaritem xlink:href=".uno:SelectObject" toolbar:helpid="10128"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:Line" toolbar:helpid="10102"/> + <toolbar:toolbaritem xlink:href=".uno:LineArrowEnd" toolbar:helpid="27173"/> + <toolbar:toolbaritem xlink:href=".uno:Rect" toolbar:helpid="10104"/> + <toolbar:toolbaritem xlink:href=".uno:Ellipse" toolbar:helpid="10110"/> + <toolbar:toolbaritem xlink:href=".uno:Freeline_Unfilled" toolbar:helpid="10464"/> + <toolbar:toolbaritem xlink:href=".uno:DrawText" toolbar:helpid="10253"/> + <toolbar:toolbaritem xlink:href=".uno:DrawCaption" toolbar:helpid="10254"/> + <toolbar:toolbarseparator/> + <toolbar:toolbaritem xlink:href=".uno:BasicShapes" toolbar:style="dropdown" toolbar:helpid="11002"/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes" toolbar:style="dropdown" toolbar:helpid="11003"/> + <toolbar:toolbaritem xlink:href=".uno:ArrowShapes" toolbar:style="dropdown" toolbar:helpid="11004"/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes" toolbar:style="dropdown" toolbar:helpid="11005"/> + <toolbar:toolbaritem xlink:href=".uno:CalloutShapes" toolbar:style="dropdown" toolbar:helpid="11006"/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes" toolbar:style="dropdown" toolbar:helpid="11007"/> +</toolbar:toolbar>
\ No newline at end of file diff --git a/chart2/uiconfig/toolbar/flowchartshapes.xml b/chart2/uiconfig/toolbar/flowchartshapes.xml new file mode 100644 index 000000000..556445479 --- /dev/null +++ b/chart2/uiconfig/toolbar/flowchartshapes.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-process" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-alternate-process" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-decision" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-data" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-predefined-process" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-internal-storage" toolbar:helpid="helpid:11005" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-document" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-multidocument" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-terminator" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-preparation" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-input" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-manual-operation" toolbar:helpid="helpid:11005" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-connector" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-off-page-connector" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-card" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-punched-tape" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-summing-junction" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-or" toolbar:helpid="helpid:11005" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-collate" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sort" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-extract" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-merge" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-stored-data" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-delay" toolbar:helpid="helpid:11005" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-sequential-access" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-magnetic-disk" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-direct-access-storage" toolbar:helpid="helpid:11005" /> + <toolbar:toolbaritem xlink:href=".uno:FlowChartShapes.flowchart-display" toolbar:helpid="helpid:11005" /> +</toolbar:toolbar>
\ No newline at end of file diff --git a/chart2/uiconfig/toolbar/starshapes.xml b/chart2/uiconfig/toolbar/starshapes.xml new file mode 100644 index 000000000..a2ff874d2 --- /dev/null +++ b/chart2/uiconfig/toolbar/starshapes.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.bang" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star4" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star5" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star6" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star8" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star12" toolbar:helpid="helpid:11007" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.star24" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.concave-star6" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.vertical-scroll" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.horizontal-scroll" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.signet" toolbar:helpid="helpid:11007" /> + <toolbar:toolbaritem xlink:href=".uno:StarShapes.doorplate" toolbar:helpid="helpid:11007" /> +</toolbar:toolbar>
\ No newline at end of file diff --git a/chart2/uiconfig/toolbar/symbolshapes.xml b/chart2/uiconfig/toolbar/symbolshapes.xml new file mode 100644 index 000000000..272a9dbba --- /dev/null +++ b/chart2/uiconfig/toolbar/symbolshapes.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> +<toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.smiley" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.sun" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.moon" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.lightning" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.heart" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.flower" toolbar:helpid="helpid:11003" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.cloud" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.forbidden" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.puzzle" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.bracket-pair" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-bracket" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-bracket" toolbar:helpid="helpid:11003" /> + <toolbar:toolbarbreak/> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.brace-pair" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.left-brace" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.right-brace" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.quad-bevel" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.octagon-bevel" toolbar:helpid="helpid:11003" /> + <toolbar:toolbaritem xlink:href=".uno:SymbolShapes.diamond-bevel" toolbar:helpid="helpid:11003" /> +</toolbar:toolbar>
\ No newline at end of file diff --git a/sc/source/filter/excel/excdoc.cxx b/sc/source/filter/excel/excdoc.cxx index e03c6bec9..10549b3d1 100644 --- a/sc/source/filter/excel/excdoc.cxx +++ b/sc/source/filter/excel/excdoc.cxx @@ -200,8 +200,6 @@ void ExcTable::FillAsHeader( ExcBoundsheetList& rBoundsheetList ) UINT16 nExcTabCount = rTabInfo.GetXclTabCount(); UINT16 nCodenames = static_cast< UINT16 >( GetExtDocOptions().GetCodeNameCount() ); - rR.pObjRecs = NULL; // per sheet - sal_uInt16 nWriteProtHash = 0; if( SfxObjectShell* pDocShell = GetDocShell() ) { @@ -416,7 +414,7 @@ void ExcTable::FillAsHeader( ExcBoundsheetList& rBoundsheetList ) Add( new XclExpRecalcId ); // MSODRAWINGGROUP per-document data - Add( new XclMsodrawinggroup( rR, ESCHER_DggContainer ) ); + aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() ); // Shared string table: SST, EXTSST aRecList.AppendRecord( CreateRecord( EXC_ID_SST ) ); @@ -438,9 +436,8 @@ void ExcTable::FillAsTable( size_t nCodeNameIdx ) DBG_ASSERT( (mnScTab >= 0L) && (mnScTab <= MAXTAB), "-ExcTable::Table(): mnScTab - no ordinary table!" ); DBG_ASSERT( nExcTab <= static_cast<sal_uInt16>(MAXTAB), "-ExcTable::Table(): nExcTab - no ordinary table!" ); - if ( eBiff == EXC_BIFF8 ) - // list holding OBJ records and creating MSODRAWING per-sheet data - rR.pObjRecs = new XclObjList( GetRoot() ); + // create a new OBJ list for this sheet (may be used by notes, autofilter, data validation) + GetObjectManager().StartSheet(); // cell table: DEFROWHEIGHT, DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records mxCellTable.reset( new XclExpCellTable( GetRoot() ) ); @@ -512,13 +509,8 @@ void ExcTable::FillAsTable( size_t nCodeNameIdx ) if( eBiff == EXC_BIFF8 ) { - rR.pEscher->AddSdrPage(); - //! close Escher group shape and ESCHER_DgContainer - //! opened by XclObjList ctor MSODRAWING - rR.pObjRecs->EndSheet(); // all MSODRAWING and OBJ stuff of this sheet goes here - Add( rR.pObjRecs ); - + aRecList.AppendRecord( GetObjectManager().ProcessDrawing( GetSdrPage( mnScTab ) ) ); // pivot tables aRecList.AppendRecord( GetPivotTableManager().CreatePivotTablesRecord( mnScTab ) ); } @@ -590,12 +582,13 @@ void ExcTable::FillAsXmlTable( size_t nCodeNameIdx ) // label ranges Add( new XclExpLabelranges( GetRoot() ) ); - rR.pEscher->AddSdrPage(); - //! close Escher group shape and ESCHER_DgContainer - //! opened by XclObjList ctor MSODRAWING - rR.pObjRecs->EndSheet(); - // all MSODRAWING and OBJ stuff of this sheet goes here - Add( rR.pObjRecs ); + // DFF not needed in MSOOXML export +// GetObjectManager().AddSdrPage(); +// //! close Escher group shape and ESCHER_DgContainer +// //! opened by XclExpObjList ctor MSODRAWING +// rR.pObjRecs->EndSheet(); +// // all MSODRAWING and OBJ stuff of this sheet goes here +// Add( rR.pObjRecs ); // pivot tables aRecList.AppendRecord( GetPivotTableManager().CreatePivotTablesRecord( mnScTab ) ); @@ -756,7 +749,7 @@ void ExcDocument::ReadDoc( void ) if ( GetBiff() == EXC_BIFF8 ) { // complete temporary Escher stream - GetOldRoot().pEscher->GetEx()->EndDocument(); + GetObjectManager().EndDocument(); // change tracking if ( GetDoc().GetChangeTrack() ) @@ -771,9 +764,6 @@ void ExcDocument::Write( SvStream& rSvStrm ) { InitializeSave(); - if ( GetBiff() == EXC_BIFF8 ) - GetOldRoot().pEscher->GetStrm().Seek(0); // ready for take off - XclExpStream aXclStrm( rSvStrm, GetRoot() ); aHeader.Write( aXclStrm ); @@ -807,8 +797,6 @@ void ExcDocument::WriteXml( SvStream& rStrm ) XclExpXmlStream aStrm( ::comphelper::getProcessServiceFactory(), rStrm, GetRoot() ); - GetOldRoot().pEscher->GetStrm().Seek(0); // ready for take off - sax_fastparser::FSHelperPtr& rWorkbook = aStrm.GetCurrentStream(); rWorkbook->startElement( XML_workbook, XML_xmlns, "http://schemas.openxmlformats.org/spreadsheetml/2006/main", diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx index e3cb29eea..bee06f17e 100644 --- a/sc/source/filter/excel/excrecds.cxx +++ b/sc/source/filter/excel/excrecds.cxx @@ -88,6 +88,7 @@ #include "formula/errorcodes.hxx" #include "excdoc.hxx" +#include "xeescher.hxx" #include "xeformula.hxx" #include "xelink.hxx" #include "xename.hxx" @@ -976,8 +977,8 @@ void ExcAutoFilterRecs::AddObjRecs() ScAddress aAddr( pFilterInfo->GetStartPos() ); for( SCCOL nObj = 0, nCount = pFilterInfo->GetColCount(); nObj < nCount; nObj++ ) { - XclObjDropDown* pObj = new XclObjDropDown( GetRoot(), aAddr, IsFiltered( nObj ) ); - GetOldRoot().pObjRecs->Add( pObj ); + XclObj* pObjRec = new XclObjDropDown( GetObjectManager(), aAddr, IsFiltered( nObj ) ); + GetObjectManager().AddObj( pObjRec ); aAddr.IncCol( 1 ); } } diff --git a/sc/source/filter/excel/exctools.cxx b/sc/source/filter/excel/exctools.cxx index 25c3d4c00..c6a5e5e24 100644 --- a/sc/source/filter/excel/exctools.cxx +++ b/sc/source/filter/excel/exctools.cxx @@ -76,9 +76,6 @@ RootData::RootData( void ) pTabId = NULL; pUserBViewList = NULL; - pObjRecs = NULL; - pEscher = NULL; - pIR = NULL; pER = NULL; } diff --git a/sc/source/filter/excel/expop2.cxx b/sc/source/filter/excel/expop2.cxx index edf9a86d1..b0b87d2cf 100644 --- a/sc/source/filter/excel/expop2.cxx +++ b/sc/source/filter/excel/expop2.cxx @@ -141,14 +141,11 @@ ExportBiff8::ExportBiff8( XclExpRootData& rExpData, SvStream& rStrm ) : ExportBiff5( rExpData, rStrm ) { pExcRoot->eDateiTyp = Biff8; - pExcRoot->pEscher = new XclEscher( GetRoot(), GetDoc().GetTableCount() ); } ExportBiff8::~ExportBiff8() { - delete pExcRoot->pEscher; - pExcRoot->pEscher = NULL; } @@ -159,16 +156,12 @@ ExportXml2007::ExportXml2007( XclExpRootData& rExpData, SvStream& rStrm ) pExcRoot = &GetOldRoot(); pExcRoot->pER = this; pExcRoot->eDateiTyp = Biff8; - pExcRoot->pEscher = new XclEscher( *pExcRoot->pER, GetDoc().GetTableCount() ); pExcDoc = new ExcDocument( *this ); } ExportXml2007::~ExportXml2007() { - delete pExcRoot->pEscher; - pExcRoot->pEscher = NULL; - delete pExcDoc; } diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx index 05e101c99..2263d2806 100644 --- a/sc/source/filter/excel/impop.cxx +++ b/sc/source/filter/excel/impop.cxx @@ -1241,7 +1241,7 @@ void ImportExcel::PostDocLoad( void ) } // #111099# open forms in alive mode (has no effect, if no controls in document) - pDocObj->setPropertyValue( CREATE_OUSTRING( SC_UNO_APPLYFMDES ), ::comphelper::makeBoolAny( sal_False ) ); + pDocObj->setPropertyValue( CREATE_OUSTRING( SC_UNO_APPLYFMDES ), uno::Any( false ) ); } // enables extended options to be set to the view after import diff --git a/sc/source/filter/excel/read.cxx b/sc/source/filter/excel/read.cxx index 239bf45c1..7aa540e3f 100644 --- a/sc/source/filter/excel/read.cxx +++ b/sc/source/filter/excel/read.cxx @@ -64,6 +64,8 @@ FltError ImportExcel::Read( void ) XclImpXFBuffer& rXFBfr = GetXFBuffer(); XclImpNameManager& rNameMgr = GetNameManager(); XclImpObjectManager& rObjMgr = GetObjectManager(); + (void)rObjMgr; + // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets) enum Zustand { Z_BiffNull, // Nicht in gueltigem Biff-Format @@ -246,7 +248,7 @@ FltError ImportExcel::Read( void ) case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] case 0x18: rNameMgr.ReadName( maStrm ); break; - case 0x1C: rObjMgr.ReadNote( maStrm ); break; + case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break; case 0x20: Columndefault(); break; // COLUMNDEFAULT[ 2 ] @@ -309,7 +311,7 @@ FltError ImportExcel::Read( void ) case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] case 0x1A: case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break; - case 0x1C: rObjMgr.ReadNote( maStrm ); break; + case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break; case 0x22: Rec1904(); break; // 1904 [ 2345] @@ -328,7 +330,7 @@ FltError ImportExcel::Read( void ) case 0x41: rTabViewSett.ReadPane( maStrm ); break; case 0x42: Codepage(); break; // CODEPAGE [ 2345] case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] - case 0x5D: rObjMgr.ReadObj( maStrm ); break; + case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; case 0x7D: Colinfo(); break; // COLINFO [ 345] case 0x8C: Country(); break; // COUNTRY [ 345] case 0x92: rPal.ReadPalette( maStrm ); break; @@ -380,7 +382,7 @@ FltError ImportExcel::Read( void ) case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] case 0x1A: case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break; - case 0x1C: rObjMgr.ReadNote( maStrm ); break; + case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; case 0x22: Rec1904(); break; // 1904 [ 2345] case 0x26: @@ -399,7 +401,7 @@ FltError ImportExcel::Read( void ) case 0x42: Codepage(); break; // CODEPAGE [ 2345] case 0x55: DefColWidth(); break; case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] - case 0x5D: rObjMgr.ReadObj( maStrm ); break; + case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; case 0x7D: Colinfo(); break; // COLINFO [ 345] case 0x8C: Country(); break; // COUNTRY [ 345] case 0x92: rPal.ReadPalette( maStrm ); break; @@ -496,7 +498,7 @@ FltError ImportExcel::Read( void ) case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; case 0x1A: case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break; - case 0x1C: rObjMgr.ReadNote( maStrm ); break; + case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; case 0x2F: // FILEPASS [ 2345] eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm ); @@ -507,7 +509,7 @@ FltError ImportExcel::Read( void ) case 0x42: Codepage(); break; // CODEPAGE [ 2345] case 0x55: DefColWidth(); break; case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] - case 0x5D: rObjMgr.ReadObj( maStrm ); break; + case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; case 0x7D: Colinfo(); break; // COLINFO [ 345] case 0x8C: Country(); break; // COUNTRY [ 345] case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ] @@ -666,7 +668,7 @@ FltError ImportExcel::Read( void ) case 0x14: case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break; case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] - case 0x1C: rObjMgr.ReadNote( maStrm ); break; + case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break; case 0x1D: rTabViewSett.ReadSelection( maStrm ); break; case 0x23: Externname25(); break; // EXTERNNAME [ 2 5] case 0x26: @@ -680,7 +682,7 @@ FltError ImportExcel::Read( void ) if( eLastErr != ERRCODE_NONE ) eAkt = Z_Ende; break; - case 0x5D: rObjMgr.ReadObj( maStrm ); break; + case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break; case 0x83: case 0x84: rPageSett.ReadCenter( maStrm ); break; case 0xA0: rTabViewSett.ReadScl( maStrm ); break; @@ -714,7 +716,7 @@ FltError ImportExcel::Read( void ) aIn.StoreGlobalPosition(); // und Position merken break; case Biff5C: // chart sheet - GetObjectManager().ReadTabChart( maStrm ); + GetCurrSheetDrawing().ReadTabChart( maStrm ); Eof(); GetTracer().TraceChartOnlySheet(); break; @@ -799,6 +801,7 @@ FltError ImportExcel8::Read( void ) XclImpNameManager& rNameMgr = GetNameManager(); XclImpLinkManager& rLinkMgr = GetLinkManager(); XclImpObjectManager& rObjMgr = GetObjectManager(); + // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets) XclImpCondFormatManager& rCondFmtMgr = GetCondFormatManager(); XclImpPivotTableManager& rPTableMgr = GetPivotTableManager(); XclImpWebQueryBuffer& rWQBfr = GetWebQueryBuffer(); @@ -1040,7 +1043,7 @@ FltError ImportExcel8::Read( void ) aIn.StoreGlobalPosition(); break; case Biff8C: // chart sheet - rObjMgr.ReadTabChart( maStrm ); + GetCurrSheetDrawing().ReadTabChart( maStrm ); Eof(); GetTracer().TraceChartOnlySheet(); break; @@ -1161,10 +1164,10 @@ FltError ImportExcel8::Read( void ) case EXC_ID_SETUP: rPageSett.ReadSetup( maStrm ); break; case EXC_ID8_IMGDATA: rPageSett.ReadImgData( maStrm ); break; - case EXC_ID_MSODRAWING: rObjMgr.ReadMsoDrawing( maStrm ); break; + case EXC_ID_MSODRAWING: GetCurrSheetDrawing().ReadMsoDrawing( maStrm ); break; // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format - case EXC_ID_OBJ: rObjMgr.ReadObj( maStrm ); break; - case EXC_ID_NOTE: rObjMgr.ReadNote( maStrm ); break; + case EXC_ID_OBJ: GetCurrSheetDrawing().ReadObj( maStrm ); break; + case EXC_ID_NOTE: GetCurrSheetDrawing().ReadNote( maStrm ); break; case EXC_ID_HLINK: XclImpHyperlink::ReadHlink( maStrm ); break; case EXC_ID_LABELRANGES: XclImpLabelranges::ReadLabelranges( maStrm ); break; diff --git a/sc/source/filter/excel/xechart.cxx b/sc/source/filter/excel/xechart.cxx index 33abb5504..36f98ebce 100644 --- a/sc/source/filter/excel/xechart.cxx +++ b/sc/source/filter/excel/xechart.cxx @@ -33,6 +33,7 @@ #include <com/sun/star/i18n/XBreakIterator.hpp> #include <com/sun/star/i18n/ScriptType.hpp> #include <com/sun/star/drawing/FillStyle.hpp> +#include <com/sun/star/drawing/XShapes.hpp> #include <com/sun/star/chart/ChartAxisLabelPosition.hpp> #include <com/sun/star/chart/ChartAxisPosition.hpp> #include <com/sun/star/chart/DataLabelPlacement.hpp> @@ -63,6 +64,7 @@ #include "compiler.hxx" #include "tokenarray.hxx" #include "token.hxx" +#include "xeescher.hxx" #include "xeformula.hxx" #include "xehelper.hxx" #include "xepage.hxx" @@ -77,6 +79,7 @@ using ::com::sun::star::uno::Exception; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::i18n::XBreakIterator; using ::com::sun::star::frame::XModel; +using ::com::sun::star::drawing::XShapes; using ::com::sun::star::chart2::XChartDocument; using ::com::sun::star::chart2::XDiagram; using ::com::sun::star::chart2::XCoordinateSystemContainer; @@ -97,7 +100,6 @@ using ::com::sun::star::chart2::XTitled; using ::com::sun::star::chart2::XTitle; using ::com::sun::star::chart2::XFormattedString; using ::com::sun::star::chart2::XColorScheme; - using ::com::sun::star::chart2::data::XDataSource; using ::com::sun::star::chart2::data::XLabeledDataSequence; using ::com::sun::star::chart2::data::XDataSequence; @@ -811,7 +813,7 @@ sal_uInt16 XclExpChSourceLink::ConvertDataSequence( Reference< XDataSequence > x if( !xDataSeq.is() ) return nDefCount; - // Compile the range representation string into token array. Note that the + // Compile the range representation string into token array. Note that the // source range text depends on the current grammar. OUString aRangeRepr = xDataSeq->getSourceRangeRepresentation(); ScCompiler aComp( GetDocPtr(), ScAddress() ); @@ -2766,6 +2768,15 @@ XclExpChAxesSet::XclExpChAxesSet( const XclExpChRoot& rRoot, sal_uInt16 nAxesSet { maData.mnAxesSetId = nAxesSetId; SetFutureRecordContext( 0, nAxesSetId ); + + /* Need to set a reasonable size for the plot area, otherwise Excel will + move away embedded shapes while auto-sizing the plot area. This is just + a wild guess, but will be fixed with implementing manual positioning of + chart elements. */ + maData.maRect.mnX = 262; + maData.maRect.mnY = 626; + maData.maRect.mnWidth = 3187; + maData.maRect.mnHeight = 2633; } sal_uInt16 XclExpChAxesSet::Convert( Reference< XDiagram > xDiagram, sal_uInt16 nFirstGroupIdx ) @@ -2904,6 +2915,14 @@ bool XclExpChAxesSet::Is3dChart() const void XclExpChAxesSet::WriteSubRecords( XclExpStream& rStrm ) { + /* Need to set a reasonable size for the plot area, otherwise Excel will + move away embedded shapes while auto-sizing the plot area. This is just + a wild guess, but will be fixed with implementing manual positioning of + chart elements. */ + rStrm.StartRecord( EXC_ID_CHFRAMEPOS, 20 ); + rStrm << sal_uInt16(2) << sal_uInt16(2) << sal_uInt32(66) << sal_uInt32(626) << sal_uInt32(3384) << sal_uInt32(3231); + rStrm.EndRecord(); + lclSaveRecord( rStrm, mxXAxis ); lclSaveRecord( rStrm, mxYAxis ); lclSaveRecord( rStrm, mxZAxis ); @@ -2965,8 +2984,8 @@ XclExpChChart::XclExpChChart( const XclExpRoot& rRoot, maRect.mnHeight = static_cast< sal_Int32 >( aPtSize.Height() << 16 ); // global chart properties (default values) - ::set_flag( maProps.mnFlags, EXC_CHPROPS_MANSERIES ); ::set_flag( maProps.mnFlags, EXC_CHPROPS_SHOWVISIBLEONLY, false ); + ::set_flag( maProps.mnFlags, EXC_CHPROPS_MANPLOTAREA ); maProps.mnEmptyMode = EXC_CHPROPS_EMPTY_SKIP; // always create both axes set objects @@ -3073,12 +3092,49 @@ void XclExpChChart::WriteBody( XclExpStream& rStrm ) // ---------------------------------------------------------------------------- +XclExpChartDrawing::XclExpChartDrawing( const XclExpRoot& rRoot, + const Reference< XModel >& rxModel, const Size& rChartSize ) : + XclExpRoot( rRoot ) +{ + if( (rChartSize.Width() > 0) && (rChartSize.Height() > 0) ) + { + ScfPropertySet aPropSet( rxModel ); + Reference< XShapes > xShapes; + if( aPropSet.GetProperty( xShapes, EXC_CHPROP_ADDITIONALSHAPES ) && xShapes.is() && (xShapes->getCount() > 0) ) + { + /* Create a new independent object manager with own DFF stream for the + DGCONTAINER, pass global manager as parent for shared usage of + global DFF data (picture container etc.). */ + mxObjMgr.reset( new XclExpEmbeddedObjectManager( GetObjectManager(), rChartSize, EXC_CHART_UNIT, EXC_CHART_UNIT ) ); + // initialize the drawing object list + mxObjMgr->StartSheet(); + // process the draw page (convert all shapes) + mxObjRecs = mxObjMgr->ProcessDrawing( xShapes ); + // finalize the DFF stream + mxObjMgr->EndDocument(); + } + } +} + +XclExpChartDrawing::~XclExpChartDrawing() +{ +} + +void XclExpChartDrawing::Save( XclExpStream& rStrm ) +{ + if( mxObjRecs.is() ) + mxObjRecs->Save( rStrm ); +} + +// ---------------------------------------------------------------------------- + XclExpChart::XclExpChart( const XclExpRoot& rRoot, Reference< XModel > xModel, const Size& rSize ) : XclExpSubStream( EXC_BOF_CHART ), XclExpRoot( rRoot ) { AppendNewRecord( new XclExpChartPageSettings( rRoot ) ); AppendNewRecord( new XclExpBoolRecord( EXC_ID_PROTECT, false ) ); + AppendNewRecord( new XclExpChartDrawing( rRoot, xModel, rSize ) ); AppendNewRecord( new XclExpUInt16Record( EXC_ID_CHUNITS, EXC_CHUNITS_TWIPS ) ); Reference< XChartDocument > xChartDoc( xModel, UNO_QUERY ); diff --git a/sc/source/filter/excel/xeescher.cxx b/sc/source/filter/excel/xeescher.cxx index db6a33c1e..f766021d5 100644 --- a/sc/source/filter/excel/xeescher.cxx +++ b/sc/source/filter/excel/xeescher.cxx @@ -28,9 +28,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" -#include <set> -#include <iterator> - #include "xeescher.hxx" #include <com/sun/star/lang/XServiceInfo.hpp> @@ -45,12 +42,15 @@ #include <com/sun/star/form/binding/XListEntrySource.hpp> #include <com/sun/star/script/ScriptEventDescriptor.hpp> +#include <set> #include <rtl/ustrbuf.h> #include <vcl/bmpacc.hxx> #include <svx/svdoole2.hxx> #include <svx/svdocapt.hxx> #include <editeng/outlobj.hxx> #include <editeng/editobj.hxx> +#include <unotools/tempfile.hxx> +#include <unotools/ucbstreamhelper.hxx> #include "editutil.hxx" #include "unonames.hxx" @@ -75,6 +75,7 @@ using ::com::sun::star::uno::Sequence; using ::com::sun::star::lang::XServiceInfo; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::drawing::XShape; +using ::com::sun::star::drawing::XShapes; using ::com::sun::star::frame::XModel; using ::com::sun::star::embed::XEmbeddedObject; using ::com::sun::star::awt::XControlModel; @@ -86,6 +87,163 @@ using ::com::sun::star::script::ScriptEventDescriptor; using ::com::sun::star::table::CellAddress; using ::com::sun::star::table::CellRangeAddress; +// Escher client anchor ======================================================= + +XclExpDffAnchorBase::XclExpDffAnchorBase( const XclExpRoot& rRoot, sal_uInt16 nFlags ) : + XclExpRoot( rRoot ), + mnFlags( nFlags ) +{ +} + +void XclExpDffAnchorBase::SetFlags( const SdrObject& rSdrObj ) +{ + ImplSetFlags( rSdrObj ); +} + +void XclExpDffAnchorBase::SetSdrObject( const SdrObject& rSdrObj ) +{ + ImplSetFlags( rSdrObj ); + ImplCalcAnchorRect( rSdrObj.GetCurrentBoundRect(), MAP_100TH_MM ); +} + +void XclExpDffAnchorBase::WriteDffData( EscherEx& rEscherEx ) const +{ + rEscherEx.AddAtom( 18, ESCHER_ClientAnchor ); + rEscherEx.GetStream() << mnFlags << maAnchor; +} + +void XclExpDffAnchorBase::WriteData( EscherEx& rEscherEx, const Rectangle& rRect ) +{ + // the passed rectangle is in twips + ImplCalcAnchorRect( rRect, MAP_TWIP ); + WriteDffData( rEscherEx ); +} + +void XclExpDffAnchorBase::ImplSetFlags( const SdrObject& ) +{ + OSL_ENSURE( false, "XclExpDffAnchorBase::ImplSetFlags - not implemented" ); +} + +void XclExpDffAnchorBase::ImplCalcAnchorRect( const Rectangle&, MapUnit ) +{ + OSL_ENSURE( false, "XclExpDffAnchorBase::ImplCalcAnchorRect - not implemented" ); +} + +// ---------------------------------------------------------------------------- + +XclExpDffSheetAnchor::XclExpDffSheetAnchor( const XclExpRoot& rRoot ) : + XclExpDffAnchorBase( rRoot ), + mnScTab( rRoot.GetCurrScTab() ) +{ +} + +void XclExpDffSheetAnchor::ImplSetFlags( const SdrObject& rSdrObj ) +{ + // Special case "page anchor" (X==0,Y==1) -> lock pos and size. + const Point& rPos = rSdrObj.GetAnchorPos(); + mnFlags = ((rPos.X() == 0) && (rPos.Y() == 1)) ? EXC_ESC_ANCHOR_LOCKED : 0; +} + +void XclExpDffSheetAnchor::ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ) +{ + maAnchor.SetRect( GetDoc(), mnScTab, rRect, eMapUnit ); +} + +// ---------------------------------------------------------------------------- + +XclExpDffEmbeddedAnchor::XclExpDffEmbeddedAnchor( const XclExpRoot& rRoot, + const Size& rPageSize, sal_Int32 nScaleX, sal_Int32 nScaleY ) : + XclExpDffAnchorBase( rRoot ), + maPageSize( rPageSize ), + mnScaleX( nScaleX ), + mnScaleY( nScaleY ) +{ +} + +void XclExpDffEmbeddedAnchor::ImplSetFlags( const SdrObject& /*rSdrObj*/ ) +{ + // TODO (unsupported feature): fixed size +} + +void XclExpDffEmbeddedAnchor::ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ) +{ + maAnchor.SetRect( maPageSize, mnScaleX, mnScaleY, rRect, eMapUnit, true ); +} + +// ---------------------------------------------------------------------------- + +XclExpDffNoteAnchor::XclExpDffNoteAnchor( const XclExpRoot& rRoot, const Rectangle& rRect ) : + XclExpDffAnchorBase( rRoot, EXC_ESC_ANCHOR_SIZELOCKED ) +{ + maAnchor.SetRect( GetDoc(), rRoot.GetCurrScTab(), rRect, MAP_100TH_MM ); +} + +// ---------------------------------------------------------------------------- + +XclExpDffDropDownAnchor::XclExpDffDropDownAnchor( const XclExpRoot& rRoot, const ScAddress& rScPos ) : + XclExpDffAnchorBase( rRoot, EXC_ESC_ANCHOR_POSLOCKED ) +{ + GetAddressConverter().ConvertAddress( maAnchor.maFirst, rScPos, true ); + maAnchor.maLast.mnCol = maAnchor.maFirst.mnCol + 1; + maAnchor.maLast.mnRow = maAnchor.maFirst.mnRow + 1; + maAnchor.mnLX = maAnchor.mnTY = maAnchor.mnRX = maAnchor.mnBY = 0; +} + +// MSODRAWING* records ======================================================== + +XclExpMsoDrawingBase::XclExpMsoDrawingBase( XclEscherEx& rEscherEx, sal_uInt16 nRecId ) : + XclExpRecord( nRecId ), + mrEscherEx( rEscherEx ), + mnFragmentKey( rEscherEx.InitNextDffFragment() ) +{ +} + +void XclExpMsoDrawingBase::WriteBody( XclExpStream& rStrm ) +{ + OSL_ENSURE( mrEscherEx.GetStreamPos() == mrEscherEx.GetDffFragmentPos( mnFragmentKey ), + "XclExpMsoDrawingBase::WriteBody - DFF stream position mismatch" ); + rStrm.CopyFromStream( mrEscherEx.GetStream(), mrEscherEx.GetDffFragmentSize( mnFragmentKey ) ); +} + +// ---------------------------------------------------------------------------- + +XclExpMsoDrawingGroup::XclExpMsoDrawingGroup( XclEscherEx& rEscherEx ) : + XclExpMsoDrawingBase( rEscherEx, EXC_ID_MSODRAWINGGROUP ) +{ + SvStream& rDffStrm = mrEscherEx.GetStream(); + + // write the DGGCONTAINER with some default settings + mrEscherEx.OpenContainer( ESCHER_DggContainer ); + + // TODO: stuff the OPT atom with our own document defaults? + static const sal_uInt8 spnDffOpt[] = { + 0xBF, 0x00, 0x08, 0x00, 0x08, 0x00, 0x81, 0x01, + 0x09, 0x00, 0x00, 0x08, 0xC0, 0x01, 0x40, 0x00, + 0x00, 0x08 + }; + mrEscherEx.AddAtom( sizeof( spnDffOpt ), ESCHER_OPT, 3, 3 ); + rDffStrm.Write( spnDffOpt, sizeof( spnDffOpt ) ); + + // SPLITMENUCOLORS contains colors in toolbar + static const sal_uInt8 spnDffSplitMenuColors[] = { + 0x0D, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x08, + 0x17, 0x00, 0x00, 0x08, 0xF7, 0x00, 0x00, 0x10 + }; + mrEscherEx.AddAtom( sizeof( spnDffSplitMenuColors ), ESCHER_SplitMenuColors, 0, 4 ); + rDffStrm.Write( spnDffSplitMenuColors, sizeof( spnDffSplitMenuColors ) ); + + // close the DGGCONTAINER + mrEscherEx.CloseContainer(); + mrEscherEx.UpdateDffFragmentEnd(); +} + +// ---------------------------------------------------------------------------- + +XclExpMsoDrawing::XclExpMsoDrawing( XclEscherEx& rEscherEx ) : + XclExpMsoDrawingBase( rEscherEx, EXC_ID_MSODRAWING ) +{ +} + // ============================================================================ XclExpImgData::XclExpImgData( const Graphic& rGraphic, sal_uInt16 nRecId ) : @@ -221,10 +379,10 @@ void XclExpControlHelper::WriteFormulaSubRec( XclExpStream& rStrm, sal_uInt16 nS #if EXC_EXP_OCX_CTRL -XclExpOcxControlObj::XclExpOcxControlObj( const XclExpRoot& rRoot, Reference< XShape > xShape, - const String& rClassName, sal_uInt32 nStrmStart, sal_uInt32 nStrmSize ) : - XclObj( rRoot, EXC_OBJTYPE_PICTURE, true ), - XclExpControlHelper( rRoot ), +XclExpOcxControlObj::XclExpOcxControlObj( XclExpObjectManager& rObjMgr, Reference< XShape > xShape, + const Rectangle* pChildAnchor, const String& rClassName, sal_uInt32 nStrmStart, sal_uInt32 nStrmSize ) : + XclObj( rObjMgr, EXC_OBJTYPE_PICTURE, true ), + XclExpControlHelper( rObjMgr.GetRoot() ), maClassName( rClassName ), mnStrmStart( nStrmStart ), mnStrmSize( nStrmSize ) @@ -238,11 +396,10 @@ XclExpOcxControlObj::XclExpOcxControlObj( const XclExpRoot& rRoot, Reference< XS SetAutoLine( FALSE ); // fill DFF property set - XclEscherEx& rEscherEx = *pMsodrawing->GetEscherEx(); - rEscherEx.OpenContainer( ESCHER_SpContainer ); - rEscherEx.AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVESPT | SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_OLESHAPE ); + mrEscherEx.OpenContainer( ESCHER_SpContainer ); + mrEscherEx.AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVESPT | SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_OLESHAPE ); Rectangle aDummyRect; - EscherPropertyContainer aPropOpt( rEscherEx, rEscherEx.QueryPicStream(), aDummyRect ); + EscherPropertyContainer aPropOpt( mrEscherEx, mrEscherEx.QueryPicStream(), aDummyRect ); aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x00080008 ); // bool field aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x08000040 ); aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x00080000 ); // bool field @@ -263,15 +420,14 @@ XclExpOcxControlObj::XclExpOcxControlObj( const XclExpRoot& rRoot, Reference< XS } // write DFF property set to stream - aPropOpt.Commit( rEscherEx.GetStream() ); + aPropOpt.Commit( mrEscherEx.GetStream() ); // anchor - if( SdrObject* pSdrObj = SdrObject::getSdrObjectFromXShape( xShape ) ) - XclExpDffAnchor( rRoot, *pSdrObj ).WriteData( rEscherEx ); - rEscherEx.AddAtom( 0, ESCHER_ClientData ); // OBJ record - rEscherEx.CloseContainer(); // ESCHER_SpContainer + ImplWriteAnchor( GetRoot(), SdrObject::getSdrObjectFromXShape( xShape ), pChildAnchor ); - pMsodrawing->UpdateStopPos(); + mrEscherEx.AddAtom( 0, ESCHER_ClientData ); // OBJ record + mrEscherEx.CloseContainer(); // ESCHER_SpContainer + mrEscherEx.UpdateDffFragmentEnd(); // spreadsheet links ConvertSheetLinks( xShape ); @@ -328,9 +484,9 @@ void XclExpOcxControlObj::WriteSubRecs( XclExpStream& rStrm ) #else -XclExpTbxControlObj::XclExpTbxControlObj( const XclExpRoot& rRoot, Reference< XShape > xShape ) : - XclObj( rRoot, EXC_OBJTYPE_UNKNOWN, true ), - XclExpControlHelper( rRoot ), +XclExpTbxControlObj::XclExpTbxControlObj( XclExpObjectManager& rObjMgr, Reference< XShape > xShape, const Rectangle* pChildAnchor ) : + XclObj( rObjMgr, EXC_OBJTYPE_UNKNOWN, true ), + XclExpControlHelper( rObjMgr.GetRoot() ), mnHeight( 0 ), mnState( 0 ), mnLineCount( 0 ), @@ -384,9 +540,8 @@ XclExpTbxControlObj::XclExpTbxControlObj( const XclExpRoot& rRoot, Reference< XS SetAutoLine( FALSE ); // fill DFF property set - XclEscherEx& rEscherEx = *pMsodrawing->GetEscherEx(); - rEscherEx.OpenContainer( ESCHER_SpContainer ); - rEscherEx.AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); + mrEscherEx.OpenContainer( ESCHER_SpContainer ); + mrEscherEx.AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); EscherPropertyContainer aPropOpt; bool bVisible = aCtrlProp.GetBoolProperty( CREATE_OUSTRING( "EnableVisible" ) ); aPropOpt.AddOpt( ESCHER_Prop_fPrint, bVisible ? 0x00080000 : 0x00080002 ); // visible flag @@ -404,13 +559,13 @@ XclExpTbxControlObj::XclExpTbxControlObj( const XclExpRoot& rRoot, Reference< XS aPropOpt.AddOpt( ESCHER_Prop_wzName, aCtrlName ); // write DFF property set to stream - aPropOpt.Commit( rEscherEx.GetStream() ); + aPropOpt.Commit( mrEscherEx.GetStream() ); // anchor - if( SdrObject* pSdrObj = SdrObject::getSdrObjectFromXShape( xShape ) ) - XclExpDffAnchor( rRoot, *pSdrObj ).WriteData( rEscherEx ); - rEscherEx.AddAtom( 0, ESCHER_ClientData ); // OBJ record - pMsodrawing->UpdateStopPos(); + ImplWriteAnchor( GetRoot(), SdrObject::getSdrObjectFromXShape( xShape ), pChildAnchor ); + + mrEscherEx.AddAtom( 0, ESCHER_ClientData ); // OBJ record + mrEscherEx.UpdateDffFragmentEnd(); // control label OUString aString; @@ -419,9 +574,9 @@ XclExpTbxControlObj::XclExpTbxControlObj( const XclExpRoot& rRoot, Reference< XS /* Be sure to construct the MSODRAWING record containing the ClientTextbox atom after the base OBJ's MSODRAWING record data is completed. */ - pClientTextbox = new XclMsodrawing( GetRoot() ); - pClientTextbox->GetEscherEx()->AddAtom( 0, ESCHER_ClientTextbox ); // TXO record - pClientTextbox->UpdateStopPos(); + pClientTextbox = new XclExpMsoDrawing( mrEscherEx ); + mrEscherEx.AddAtom( 0, ESCHER_ClientTextbox ); // TXO record + mrEscherEx.UpdateDffFragmentEnd(); sal_uInt16 nXclFont = EXC_FONT_APP; if( aString.getLength() > 0 ) @@ -437,7 +592,7 @@ XclExpTbxControlObj::XclExpTbxControlObj( const XclExpRoot& rRoot, Reference< XS pTxo->SetVerAlign( EXC_OBJ_VER_CENTER ); } - rEscherEx.CloseContainer(); // ESCHER_SpContainer + mrEscherEx.CloseContainer(); // ESCHER_SpContainer // other properties aCtrlProp.GetProperty( mnLineCount, CREATE_OUSTRING( "LineCount" ) ); @@ -763,14 +918,13 @@ void XclExpTbxControlObj::WriteSbs( XclExpStream& rStrm ) // ---------------------------------------------------------------------------- -XclExpChartObj::XclExpChartObj( const XclExpRoot& rRoot, Reference< XShape > xShape ) : - XclObj( rRoot, EXC_OBJTYPE_CHART ), - XclExpRoot( rRoot ) +XclExpChartObj::XclExpChartObj( XclExpObjectManager& rObjMgr, Reference< XShape > xShape, const Rectangle* pChildAnchor ) : + XclObj( rObjMgr, EXC_OBJTYPE_CHART ), + XclExpRoot( rObjMgr.GetRoot() ) { // create the MSODRAWING record contents for the chart object - XclEscherEx& rEscherEx = *pMsodrawing->GetEscherEx(); - rEscherEx.OpenContainer( ESCHER_SpContainer ); - rEscherEx.AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); + mrEscherEx.OpenContainer( ESCHER_SpContainer ); + mrEscherEx.AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); EscherPropertyContainer aPropOpt; aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x01040104 ); aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x00080008 ); @@ -781,17 +935,16 @@ XclExpChartObj::XclExpChartObj( const XclExpRoot& rRoot, Reference< XShape > xSh aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x00080008 ); aPropOpt.AddOpt( ESCHER_Prop_fshadowObscured, 0x00020000 ); aPropOpt.AddOpt( ESCHER_Prop_fPrint, 0x00080000 ); - aPropOpt.Commit( rEscherEx.GetStream() ); + aPropOpt.Commit( mrEscherEx.GetStream() ); - // client anchor + // anchor SdrObject* pSdrObj = SdrObject::getSdrObjectFromXShape( xShape ); - if( pSdrObj ) - XclExpDffAnchor( rRoot, *pSdrObj ).WriteData( rEscherEx ); + ImplWriteAnchor( GetRoot(), pSdrObj, pChildAnchor ); // client data (the following OBJ record) - rEscherEx.AddAtom( 0, ESCHER_ClientData ); - rEscherEx.CloseContainer(); // ESCHER_SpContainer - pMsodrawing->UpdateStopPos(); + mrEscherEx.AddAtom( 0, ESCHER_ClientData ); + mrEscherEx.CloseContainer(); // ESCHER_SpContainer + mrEscherEx.UpdateDffFragmentEnd(); // load the chart OLE object if( SdrOle2Obj* pSdrOleObj = dynamic_cast< SdrOle2Obj* >( pSdrObj ) ) @@ -804,7 +957,7 @@ XclExpChartObj::XclExpChartObj( const XclExpRoot& rRoot, Reference< XShape > xSh ::com::sun::star::awt::Rectangle aBoundRect; aShapeProp.GetProperty( aBoundRect, CREATE_OUSTRING( "BoundRect" ) ); Size aSize( aBoundRect.Width, aBoundRect.Height ); - mxChart.reset( new XclExpChart( rRoot, xModel, aSize ) ); + mxChart.reset( new XclExpChart( GetRoot(), xModel, aSize ) ); } XclExpChartObj::~XclExpChartObj() @@ -849,7 +1002,7 @@ XclExpNote::XclExpNote( const XclExpRoot& rRoot, const ScAddress& rScPos, if( pScNote ) if( SdrCaptionObj* pCaption = pScNote->GetOrCreateCaption( maScPos ) ) if( const OutlinerParaObject* pOPO = pCaption->GetOutlinerParaObject() ) - mnObjId = rRoot.GetOldRoot().pObjRecs->Add( new XclObjComment( rRoot, pCaption->GetLogicRect(), pOPO->GetTextObject(), pCaption, mbVisible ) ); + mnObjId = rRoot.GetObjectManager().AddObj( new XclObjComment( rRoot.GetObjectManager(), pCaption->GetLogicRect(), pOPO->GetTextObject(), pCaption, mbVisible ) ); SetRecSize( 9 + maAuthor.GetSize() ); } @@ -1007,5 +1160,125 @@ void XclExpComments::SaveXml( XclExpXmlStream& rStrm ) rStrm.PopStream(); } +// object manager ============================================================= + +XclExpObjectManager::XclExpObjectManager( const XclExpRoot& rRoot ) : + XclExpRoot( rRoot ) +{ + InitStream( true ); + mxEscherEx.reset( new XclEscherEx( GetRoot(), *this, *mxDffStrm ) ); +} + +XclExpObjectManager::XclExpObjectManager( const XclExpObjectManager& rParent ) : + XclExpRoot( rParent.GetRoot() ) +{ + InitStream( false ); + mxEscherEx.reset( new XclEscherEx( GetRoot(), *this, *mxDffStrm, rParent.mxEscherEx.get() ) ); +} + +XclExpObjectManager::~XclExpObjectManager() +{ +} + +XclExpDffAnchorBase* XclExpObjectManager::CreateDffAnchor() const +{ + return new XclExpDffSheetAnchor( GetRoot() ); +} + +ScfRef< XclExpRecordBase > XclExpObjectManager::CreateDrawingGroup() +{ + return ScfRef< XclExpRecordBase >( new XclExpMsoDrawingGroup( *mxEscherEx ) ); +} + +void XclExpObjectManager::StartSheet() +{ + mxObjList.reset( new XclExpObjList( GetRoot(), *mxEscherEx ) ); +} + +ScfRef< XclExpRecordBase > XclExpObjectManager::ProcessDrawing( SdrPage* pSdrPage ) +{ + if( pSdrPage ) + mxEscherEx->AddSdrPage( *pSdrPage ); + // #106213# the first dummy object may still be open + DBG_ASSERT( mxEscherEx->GetGroupLevel() <= 1, "XclExpObjectManager::ProcessDrawing - still groups open?" ); + while( mxEscherEx->GetGroupLevel() ) + mxEscherEx->LeaveGroup(); + mxObjList->EndSheet(); + return mxObjList; +} + +ScfRef< XclExpRecordBase > XclExpObjectManager::ProcessDrawing( const Reference< XShapes >& rxShapes ) +{ + if( rxShapes.is() ) + mxEscherEx->AddUnoShapes( rxShapes ); + // #106213# the first dummy object may still be open + DBG_ASSERT( mxEscherEx->GetGroupLevel() <= 1, "XclExpObjectManager::ProcessDrawing - still groups open?" ); + while( mxEscherEx->GetGroupLevel() ) + mxEscherEx->LeaveGroup(); + mxObjList->EndSheet(); + return mxObjList; +} + +void XclExpObjectManager::EndDocument() +{ + mxEscherEx->EndDocument(); +} + +XclExpMsoDrawing* XclExpObjectManager::GetMsodrawingPerSheet() +{ + return mxObjList->GetMsodrawingPerSheet(); +} + +bool XclExpObjectManager::HasObj() const +{ + return mxObjList->Count() > 0; +} + +sal_uInt16 XclExpObjectManager::AddObj( XclObj* pObjRec ) +{ + return mxObjList->Add( pObjRec ); +} + +XclObj* XclExpObjectManager::RemoveLastObj() +{ + XclObj* pLastObj = static_cast< XclObj* >( mxObjList->Last() ); + mxObjList->Remove(); // remove current, which is the Last() + return pLastObj; +} + +void XclExpObjectManager::InitStream( bool bTempFile ) +{ + if( bTempFile ) + { + mxTempFile.reset( new ::utl::TempFile ); + if( mxTempFile->IsValid() ) + { + mxTempFile->EnableKillingFile(); + mxDffStrm.reset( ::utl::UcbStreamHelper::CreateStream( mxTempFile->GetURL(), STREAM_STD_READWRITE ) ); + } + } + + if( !mxDffStrm.get() ) + mxDffStrm.reset( new SvMemoryStream ); + + mxDffStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); +} + +// ---------------------------------------------------------------------------- + +XclExpEmbeddedObjectManager::XclExpEmbeddedObjectManager( + const XclExpObjectManager& rParent, const Size& rPageSize, sal_Int32 nScaleX, sal_Int32 nScaleY ) : + XclExpObjectManager( rParent ), + maPageSize( rPageSize ), + mnScaleX( nScaleX ), + mnScaleY( nScaleY ) +{ +} + +XclExpDffAnchorBase* XclExpEmbeddedObjectManager::CreateDffAnchor() const +{ + return new XclExpDffEmbeddedAnchor( GetRoot(), maPageSize, mnScaleX, mnScaleY ); +} + // ============================================================================ diff --git a/sc/source/filter/excel/xerecord.cxx b/sc/source/filter/excel/xerecord.cxx index 35eb87030..4daee33a6 100644 --- a/sc/source/filter/excel/xerecord.cxx +++ b/sc/source/filter/excel/xerecord.cxx @@ -46,16 +46,10 @@ void XclExpRecordBase::SaveXml( XclExpXmlStream& /*rStrm*/ ) { } -//UNUSED2008-05 void XclExpRecordBase::SaveRepeated( XclExpStream& rStrm, size_t nCount ) -//UNUSED2008-05 { -//UNUSED2008-05 for( size_t nIndex = 0; nIndex < nCount; ++nIndex ) -//UNUSED2008-05 Save( rStrm ); -//UNUSED2008-05 } - // ---------------------------------------------------------------------------- -XclExpDelegatingRecord::XclExpDelegatingRecord( XclExpRecordBase* pRecord ) - : mpRecord( pRecord ) +XclExpDelegatingRecord::XclExpDelegatingRecord( XclExpRecordBase* pRecord ) : + mpRecord( pRecord ) { } @@ -67,9 +61,8 @@ XclExpDelegatingRecord::~XclExpDelegatingRecord() void XclExpDelegatingRecord::SaveXml( XclExpXmlStream& rStrm ) { - if( !mpRecord ) - return; - mpRecord->SaveXml( rStrm ); + if( mpRecord ) + mpRecord->SaveXml( rStrm ); } // ---------------------------------------------------------------------------- diff --git a/sc/source/filter/excel/xeroot.cxx b/sc/source/filter/excel/xeroot.cxx index 4101e736f..834873740 100644 --- a/sc/source/filter/excel/xeroot.cxx +++ b/sc/source/filter/excel/xeroot.cxx @@ -1,7 +1,7 @@ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * + * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite @@ -27,6 +27,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" + #include <sfx2/docfile.hxx> #include <sfx2/sfxsids.hrc> #include <unotools/saveopt.hxx> @@ -35,12 +36,13 @@ #include <svl/eitem.hxx> #include "xecontent.hxx" #include "xltracer.hxx" -#include "xehelper.hxx" +#include "xeescher.hxx" #include "xeformula.hxx" +#include "xehelper.hxx" #include "xelink.hxx" #include "xename.hxx" -#include "xestyle.hxx" #include "xepivot.hxx" +#include "xestyle.hxx" #include "xeroot.hxx" #include "excrecds.hxx" // for filter manager @@ -142,6 +144,12 @@ XclExpNameManager& XclExpRoot::GetNameManager() const return *mrExpData.mxNameMgr; } +XclExpObjectManager& XclExpRoot::GetObjectManager() const +{ + DBG_ASSERT( mrExpData.mxObjMgr.is(), "XclExpRoot::GetObjectManager - missing object (wrong BIFF?)" ); + return *mrExpData.mxObjMgr; +} + XclExpFilterManager& XclExpRoot::GetFilterManager() const { DBG_ASSERT( mrExpData.mxFilterMgr.is(), "XclExpRoot::GetFilterManager - missing object (wrong BIFF?)" ); @@ -181,6 +189,7 @@ void XclExpRoot::InitializeGlobals() if( GetBiff() == EXC_BIFF8 ) { mrExpData.mxSst.reset( new XclExpSst ); + mrExpData.mxObjMgr.reset( new XclExpObjectManager( GetRoot() ) ); mrExpData.mxFilterMgr.reset( new XclExpFilterManager( GetRoot() ) ); mrExpData.mxPTableMgr.reset( new XclExpPivotTableManager( GetRoot() ) ); // BIFF8: only one link manager for all sheets diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx index 97f0a3c6f..112002f62 100644 --- a/sc/source/filter/excel/xichart.cxx +++ b/sc/source/filter/excel/xichart.cxx @@ -37,6 +37,7 @@ #include <com/sun/star/drawing/Direction3D.hpp> #include <com/sun/star/drawing/ProjectionMode.hpp> #include <com/sun/star/drawing/ShadeMode.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> #include <com/sun/star/chart/ChartAxisArrangeOrderType.hpp> #include <com/sun/star/chart/ChartAxisLabelPosition.hpp> #include <com/sun/star/chart/ChartAxisMarkPosition.hpp> @@ -63,6 +64,8 @@ #include <com/sun/star/chart/MissingValueTreatment.hpp> #include <sfx2/objsh.hxx> +#include <svx/svdpage.hxx> +#include <svx/unoapi.hxx> #include "document.hxx" #include "drwlayer.hxx" @@ -79,7 +82,6 @@ #include "xistyle.hxx" #include "xipage.hxx" #include "xiview.hxx" -#include "xiescher.hxx" using ::rtl::OUString; using ::rtl::OUStringBuffer; @@ -88,11 +90,14 @@ using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::UNO_SET_THROW; using ::com::sun::star::uno::Exception; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::lang::XMultiServiceFactory; using ::com::sun::star::frame::XModel; using ::com::sun::star::util::XNumberFormatsSupplier; +using ::com::sun::star::drawing::XDrawPage; +using ::com::sun::star::drawing::XDrawPageSupplier; using ::com::sun::star::chart2::XChartDocument; using ::com::sun::star::chart2::XDiagram; @@ -123,8 +128,6 @@ using ::com::sun::star::chart2::data::XDataSequence; using ::formula::FormulaToken; using ::formula::StackVar; -using ::std::vector; - // Helpers ==================================================================== namespace { @@ -248,14 +251,14 @@ void XclImpChRoot::InitConversion( Reference< XChartDocument > xChartDoc ) const } } -void XclImpChRoot::FinishConversion( ScfProgressBar& rProgress ) const +void XclImpChRoot::FinishConversion( XclImpDffConverter& rDffConv ) const { - rProgress.Progress( EXC_CHART_PROGRESS_SIZE ); + rDffConv.Progress( EXC_CHART_PROGRESS_SIZE ); // unlock the model Reference< XModel > xModel( mxChData->GetChartDoc(), UNO_QUERY ); if( xModel.is() ) xModel->unlockControllers(); - rProgress.Progress( EXC_CHART_PROGRESS_SIZE ); + rDffConv.Progress( EXC_CHART_PROGRESS_SIZE ); mxChData->FinishConversion(); } @@ -793,9 +796,9 @@ Sequence< Reference< XFormattedString > > XclImpChSourceLink::CreateStringSequen return ScfApiHelper::VectorToSequence( aStringVec ); } -void XclImpChSourceLink::FillSourceLink(vector<ScSharedTokenRef>& rTokens) const +void XclImpChSourceLink::FillSourceLink( ::std::vector< ScSharedTokenRef >& rTokens ) const { - if (!mxTokenArray.is()) + if( !mxTokenArray.is() ) // no links to fill. return; @@ -1855,16 +1858,16 @@ Reference< XDataSeries > XclImpChSeries::CreateDataSeries() const return xDataSeries; } -void XclImpChSeries::FillAllSourceLinks(vector<ScSharedTokenRef>& rTokens) const +void XclImpChSeries::FillAllSourceLinks( ::std::vector< ScSharedTokenRef >& rTokens ) const { - if (mxValueLink.is()) - mxValueLink->FillSourceLink(rTokens); - if (mxCategLink.is()) - mxCategLink->FillSourceLink(rTokens); - if (mxTitleLink.is()) - mxTitleLink->FillSourceLink(rTokens); - if (mxBubbleLink.is()) - mxBubbleLink->FillSourceLink(rTokens); + if( mxValueLink.is() ) + mxValueLink->FillSourceLink( rTokens ); + if( mxCategLink.is() ) + mxCategLink->FillSourceLink( rTokens ); + if( mxTitleLink.is() ) + mxTitleLink->FillSourceLink( rTokens ); + if( mxBubbleLink.is() ) + mxBubbleLink->FillSourceLink( rTokens ); } void XclImpChSeries::ReadChSourceLink( XclImpStream& rStrm ) @@ -3513,7 +3516,7 @@ XclImpChTextRef XclImpChChart::GetDefaultText( XclChTextType eTextType ) const return maDefTexts.get( nDefTextId ); } -void XclImpChChart::Convert( Reference< XChartDocument > xChartDoc, ScfProgressBar& rProgress, const OUString& rObjName ) const +void XclImpChChart::Convert( Reference< XChartDocument > xChartDoc, XclImpDffConverter& rDffConv, const OUString& rObjName ) const { // initialize conversion (locks the model to suppress any internal updates) InitConversion( xChartDoc ); @@ -3555,27 +3558,21 @@ void XclImpChChart::Convert( Reference< XChartDocument > xChartDoc, ScfProgressB } // unlock the model - FinishConversion( rProgress ); + FinishConversion( rDffConv ); - ScDocument* pDoc = &GetRoot().GetDoc(); - ScChartListenerCollection* pChartCollection = pDoc->GetChartListenerCollection(); - if (pChartCollection) + // start listening to this chart + ScDocument& rDoc = GetRoot().GetDoc(); + if( ScChartListenerCollection* pChartCollection = rDoc.GetChartListenerCollection() ) { - // Now, start listening to this chart. - ::std::auto_ptr< vector<ScSharedTokenRef> > pRefTokens(new vector<ScSharedTokenRef>); - for (XclImpChSeriesVec::const_iterator itr = maSeries.begin(), itrEnd = maSeries.end(); itr != itrEnd; ++itr) - { - const XclImpChSeriesRef& rSeries = *itr; - rSeries->FillAllSourceLinks(*pRefTokens); - } - if (!pRefTokens->empty()) + ::std::auto_ptr< ::std::vector< ScSharedTokenRef > > xRefTokens( new ::std::vector< ScSharedTokenRef > ); + for( XclImpChSeriesVec::const_iterator aIt = maSeries.begin(), aEnd = maSeries.end(); aIt != aEnd; ++aIt ) + (*aIt)->FillAllSourceLinks( *xRefTokens ); + if( !xRefTokens->empty() ) { - ::std::auto_ptr<ScChartListener> pListener( - new ScChartListener(rObjName, pDoc, pRefTokens.release())); - pListener->SetUsed(true); - pListener->StartListeningTo(); - pChartCollection->Insert(pListener.release()); - + ::std::auto_ptr< ScChartListener > xListener( new ScChartListener( rObjName, &rDoc, xRefTokens.release() ) ); + xListener->SetUsed( true ); + xListener->StartListeningTo(); + pChartCollection->Insert( xListener.release() ); } } } @@ -3733,6 +3730,68 @@ Reference< XDiagram > XclImpChChart::CreateDiagram() const // ---------------------------------------------------------------------------- +XclImpChartDrawing::XclImpChartDrawing( const XclImpRoot& rRoot, bool bOwnTab ) : + XclImpDrawing( rRoot, bOwnTab ), // sheet charts may contain OLE objects + mnScTab( rRoot.GetCurrScTab() ), + mbOwnTab( bOwnTab ) +{ +} + +void XclImpChartDrawing::ConvertObjects( XclImpDffConverter& rDffConv, + const Reference< XModel >& rxModel, const Rectangle& rChartRect ) +{ + maChartRect = rChartRect; // needed in CalcAnchorRect() callback + + SdrModel* pSdrModel = 0; + SdrPage* pSdrPage = 0; + if( mbOwnTab ) + { + // chart sheet: insert all shapes into the sheet, not into the chart object + pSdrModel = GetDoc().GetDrawLayer(); + pSdrPage = GetSdrPage( mnScTab ); + } + else + { + // embedded chart object: insert all shapes into the chart + try + { + Reference< XDrawPageSupplier > xDrawPageSupp( rxModel, UNO_QUERY_THROW ); + Reference< XDrawPage > xDrawPage( xDrawPageSupp->getDrawPage(), UNO_SET_THROW ); + pSdrPage = ::GetSdrPageFromXDrawPage( xDrawPage ); + pSdrModel = pSdrPage ? pSdrPage->GetModel() : 0; + } + catch( Exception& ) + { + } + } + + if( pSdrModel && pSdrPage ) + ImplConvertObjects( rDffConv, *pSdrModel, *pSdrPage ); +} + +Rectangle XclImpChartDrawing::CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const +{ + /* In objects with DFF client anchor, the position of the shape is stored + in the cell address components of the client anchor. In old BIFF3-BIFF5 + objects, the position is stored in the offset components of the anchor. */ + Rectangle aRect( + static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maFirst.mnCol : rAnchor.mnLX ) / EXC_CHART_UNIT * maChartRect.GetWidth() + 0.5 ), + static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maFirst.mnRow : rAnchor.mnTY ) / EXC_CHART_UNIT * maChartRect.GetHeight() + 0.5 ), + static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maLast.mnCol : rAnchor.mnRX ) / EXC_CHART_UNIT * maChartRect.GetWidth() + 0.5 ), + static_cast< long >( static_cast< double >( bDffAnchor ? rAnchor.maLast.mnRow : rAnchor.mnBY ) / EXC_CHART_UNIT * maChartRect.GetHeight() + 0.5 ) ); + aRect.Justify(); + // move shapes into chart area for sheet charts + if( mbOwnTab ) + aRect.Move( maChartRect.Left(), maChartRect.Top() ); + return aRect; +} + +void XclImpChartDrawing::OnObjectInserted( const XclImpDrawObjBase& ) +{ +} + +// ---------------------------------------------------------------------------- + XclImpChart::XclImpChart( const XclImpRoot& rRoot, bool bOwnTab ) : XclImpRoot( rRoot ), mbOwnTab( bOwnTab ), @@ -3740,6 +3799,10 @@ XclImpChart::XclImpChart( const XclImpRoot& rRoot, bool bOwnTab ) : { } +XclImpChart::~XclImpChart() +{ +} + void XclImpChart::ReadChartSubStream( XclImpStream& rStrm ) { XclImpPageSettings& rPageSett = GetPageSettings(); @@ -3770,6 +3833,7 @@ void XclImpChart::ReadChartSubStream( XclImpStream& rStrm ) case EXC_ID_SCL: rTabViewSett.ReadScl( rStrm ); break; } + // common records switch( rStrm.GetRecId() ) { case EXC_ID_EOF: bLoop = false; break; @@ -3781,12 +3845,29 @@ void XclImpChart::ReadChartSubStream( XclImpStream& rStrm ) case EXC_ID5_BOF: XclTools::SkipSubStream( rStrm ); break; case EXC_ID_CHCHART: ReadChChart( rStrm ); break; - case EXC_ID_OBJ: GetTracer().TraceChartEmbeddedObj(); break; case EXC_ID8_CHPIVOTREF: GetTracer().TracePivotChartExists(); mbIsPivotChart = true; break; + + // BIFF specific records + default: switch( GetBiff() ) + { + case EXC_BIFF5: switch( rStrm.GetRecId() ) + { + case EXC_ID_OBJ: GetChartDrawing().ReadObj( rStrm ); break; + } + break; + case EXC_BIFF8: switch( rStrm.GetRecId() ) + { + case EXC_ID_MSODRAWING: GetChartDrawing().ReadMsoDrawing( rStrm ); break; + // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format + case EXC_ID_OBJ: GetChartDrawing().ReadObj( rStrm ); break; + } + break; + default:; + } } } } @@ -3800,14 +3881,28 @@ void XclImpChart::UpdateObjFrame( const XclObjLineData& rLineData, const XclObjF sal_Size XclImpChart::GetProgressSize() const { - return mxChartData.is() ? mxChartData->GetProgressSize() : 0; + return + (mxChartData.is() ? mxChartData->GetProgressSize() : 0) + + (mxChartDrawing.is() ? mxChartDrawing->GetProgressSize() : 0); } -void XclImpChart::Convert( Reference< XModel > xModel, ScfProgressBar& rProgress, const OUString& rObjName ) const +void XclImpChart::Convert( Reference< XModel > xModel, XclImpDffConverter& rDffConv, const OUString& rObjName, const Rectangle& rChartRect ) const { Reference< XChartDocument > xChartDoc( xModel, UNO_QUERY ); - if( mxChartData.is() && xChartDoc.is() ) - mxChartData->Convert( xChartDoc, rProgress, rObjName ); + if( xChartDoc.is() ) + { + if( mxChartData.is() ) + mxChartData->Convert( xChartDoc, rDffConv, rObjName ); + if( mxChartDrawing.is() ) + mxChartDrawing->ConvertObjects( rDffConv, xModel, rChartRect ); + } +} + +XclImpChartDrawing& XclImpChart::GetChartDrawing() +{ + if( !mxChartDrawing ) + mxChartDrawing.reset( new XclImpChartDrawing( GetRoot(), mbOwnTab ) ); + return *mxChartDrawing; } void XclImpChart::ReadChChart( XclImpStream& rStrm ) diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx index 904d00acb..b8d9fcfaf 100644 --- a/sc/source/filter/excel/xicontent.cxx +++ b/sc/source/filter/excel/xicontent.cxx @@ -710,7 +710,7 @@ void XclImpValidation::ReadDval( XclImpStream& rStrm ) if( nObjId != EXC_DVAL_NOOBJ ) { DBG_ASSERT( nObjId <= 0xFFFF, "XclImpValidation::ReadDval - invalid object ID" ); - rRoot.GetObjectManager().SetSkipObj( rRoot.GetCurrScTab(), static_cast< sal_uInt16 >( nObjId ) ); + rRoot.GetCurrSheetDrawing().SetSkipObj( static_cast< sal_uInt16 >( nObjId ) ); } } diff --git a/sc/source/filter/excel/xiescher.cxx b/sc/source/filter/excel/xiescher.cxx index f5a0ebcd7..784b29b56 100644 --- a/sc/source/filter/excel/xiescher.cxx +++ b/sc/source/filter/excel/xiescher.cxx @@ -118,13 +118,13 @@ using ::rtl::OUString; using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::XInterface; using ::com::sun::star::uno::Exception; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::UNO_SET_THROW; using ::com::sun::star::beans::NamedValue; using ::com::sun::star::lang::XMultiServiceFactory; using ::com::sun::star::container::XIndexContainer; @@ -193,10 +193,11 @@ typedef TSdrObjectPtr< SdrObject > SdrObjectPtr; XclImpDrawObjBase::XclImpDrawObjBase( const XclImpRoot& rRoot ) : XclImpRoot( rRoot ), - maObjId( rRoot.GetCurrScTab(), EXC_OBJ_INVALID_ID ), + mnObjId( EXC_OBJ_INVALID_ID ), mnObjType( EXC_OBJTYPE_UNKNOWN ), mnDffShapeId( 0 ), mnDffFlags( 0 ), + mbHasAnchor( false ), mbHidden( false ), mbVisible( true ), mbPrintable( true ), @@ -213,9 +214,8 @@ XclImpDrawObjBase::~XclImpDrawObjBase() { } -XclImpDrawObjRef XclImpDrawObjBase::ReadObj3( XclImpStream& rStrm ) +/*static*/ XclImpDrawObjRef XclImpDrawObjBase::ReadObj3( const XclImpRoot& rRoot, XclImpStream& rStrm ) { - const XclImpRoot& rRoot = rStrm.GetRoot(); XclImpDrawObjRef xDrawObj; if( rStrm.GetRecLeft() >= 30 ) @@ -245,9 +245,8 @@ XclImpDrawObjRef XclImpDrawObjBase::ReadObj3( XclImpStream& rStrm ) return xDrawObj; } -XclImpDrawObjRef XclImpDrawObjBase::ReadObj4( XclImpStream& rStrm ) +/*static*/ XclImpDrawObjRef XclImpDrawObjBase::ReadObj4( const XclImpRoot& rRoot, XclImpStream& rStrm ) { - const XclImpRoot& rRoot = rStrm.GetRoot(); XclImpDrawObjRef xDrawObj; if( rStrm.GetRecLeft() >= 30 ) @@ -278,9 +277,8 @@ XclImpDrawObjRef XclImpDrawObjBase::ReadObj4( XclImpStream& rStrm ) return xDrawObj; } -XclImpDrawObjRef XclImpDrawObjBase::ReadObj5( XclImpStream& rStrm ) +/*static*/ XclImpDrawObjRef XclImpDrawObjBase::ReadObj5( const XclImpRoot& rRoot, XclImpStream& rStrm ) { - const XclImpRoot& rRoot = rStrm.GetRoot(); XclImpDrawObjRef xDrawObj; if( rStrm.GetRecLeft() >= 34 ) @@ -321,9 +319,8 @@ XclImpDrawObjRef XclImpDrawObjBase::ReadObj5( XclImpStream& rStrm ) return xDrawObj; } -XclImpDrawObjRef XclImpDrawObjBase::ReadObj8( XclImpStream& rStrm ) +/*static*/ XclImpDrawObjRef XclImpDrawObjBase::ReadObj8( const XclImpRoot& rRoot, XclImpStream& rStrm ) { - const XclImpRoot& rRoot = rStrm.GetRoot(); XclImpDrawObjRef xDrawObj; if( rStrm.GetRecLeft() >= 10 ) @@ -380,6 +377,12 @@ XclImpDrawObjRef XclImpDrawObjBase::ReadObj8( XclImpStream& rStrm ) return xDrawObj; } +void XclImpDrawObjBase::SetAnchor( const XclObjAnchor& rAnchor ) +{ + maAnchor = rAnchor; + mbHasAnchor = true; +} + void XclImpDrawObjBase::SetDffData( const DffObjData& rDffObjData, const String& rObjName, const String& rHyperlink, bool bVisible, bool bAutoMargin ) { mnDffShapeId = rDffObjData.nShapeId; @@ -390,11 +393,6 @@ void XclImpDrawObjBase::SetDffData( const DffObjData& rDffObjData, const String& mbAutoMargin = bAutoMargin; } -void XclImpDrawObjBase::SetAnchor( const XclObjAnchor& rAnchor ) -{ - mxAnchor.reset( new XclObjAnchor( rAnchor ) ); -} - String XclImpDrawObjBase::GetObjName() const { /* #118053# #i51348# Always return a non-empty name. Create English @@ -404,6 +402,11 @@ String XclImpDrawObjBase::GetObjName() const return (maObjName.Len() > 0) ? maObjName : GetObjectManager().GetDefaultObjName( *this ); } +const XclObjAnchor* XclImpDrawObjBase::GetAnchor() const +{ + return mbHasAnchor ? &maAnchor : 0; +} + bool XclImpDrawObjBase::IsValidSize( const Rectangle& rAnchorRect ) const { // XclObjAnchor rounds up the width, width of 3 is the result of an Excel width of 0 @@ -412,56 +415,45 @@ bool XclImpDrawObjBase::IsValidSize( const Rectangle& rAnchorRect ) const ((rAnchorRect.GetWidth() > 3) || (rAnchorRect.GetHeight() > 1)); } -ScRange XclImpDrawObjBase::GetUsedArea() const +ScRange XclImpDrawObjBase::GetUsedArea( SCTAB nScTab ) const { ScRange aScUsedArea( ScAddress::INITIALIZE_INVALID ); - if( mxAnchor.is() ) + // #i44077# object inserted -> update used area for OLE object import + if( mbHasAnchor && GetAddressConverter().ConvertRange( aScUsedArea, maAnchor, nScTab, nScTab, false ) ) { - // #i44077# object inserted -> update used area for OLE object import - if( GetAddressConverter().ConvertRange( aScUsedArea, *mxAnchor, GetScTab(), GetScTab(), false ) ) - { - // reduce range, if object ends directly on borders between two columns or rows - if( (mxAnchor->mnRX == 0) && (aScUsedArea.aStart.Col() < aScUsedArea.aEnd.Col()) ) - aScUsedArea.aEnd.IncCol( -1 ); - if( (mxAnchor->mnBY == 0) && (aScUsedArea.aStart.Row() < aScUsedArea.aEnd.Row()) ) - aScUsedArea.aEnd.IncRow( -1 ); - } + // reduce range, if object ends directly on borders between two columns or rows + if( (maAnchor.mnRX == 0) && (aScUsedArea.aStart.Col() < aScUsedArea.aEnd.Col()) ) + aScUsedArea.aEnd.IncCol( -1 ); + if( (maAnchor.mnBY == 0) && (aScUsedArea.aStart.Row() < aScUsedArea.aEnd.Row()) ) + aScUsedArea.aEnd.IncRow( -1 ); } return aScUsedArea; } -Rectangle XclImpDrawObjBase::GetAnchorRect() const -{ - Rectangle aAnchorRect; - if( mxAnchor.is() ) - aAnchorRect = mxAnchor->GetRect( GetDoc(), MAP_100TH_MM ); - return aAnchorRect; -} - sal_Size XclImpDrawObjBase::GetProgressSize() const { return DoGetProgressSize(); } -SdrObject* XclImpDrawObjBase::CreateSdrObject( const Rectangle& rAnchorRect, ScfProgressBar& rProgress, bool bDffImport ) const +SdrObject* XclImpDrawObjBase::CreateSdrObject( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect, bool bIsDff ) const { SdrObjectPtr xSdrObj; - if( bDffImport && !mbCustomDff ) + if( bIsDff && !mbCustomDff ) { - rProgress.Progress( GetProgressSize() ); + rDffConv.Progress( GetProgressSize() ); } else { - xSdrObj.reset( DoCreateSdrObj( rAnchorRect, rProgress ) ); + xSdrObj.reset( DoCreateSdrObj( rDffConv, rAnchorRect ) ); if( xSdrObj.is() ) - xSdrObj->SetModel( GetDoc().GetDrawLayer() ); + xSdrObj->SetModel( rDffConv.GetModel() ); } return xSdrObj.release(); } -void XclImpDrawObjBase::ProcessSdrObject( SdrObject& rSdrObj ) const +void XclImpDrawObjBase::PreProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const { - // default: front layer, derived classes may have to set other layer in DoProcessSdrObj() + // default: front layer, derived classes may have to set other layer in DoPreProcessSdrObj() rSdrObj.NbcSetLayer( SC_LAYER_FRONT ); // set object name (GetObjName() will always return a non-empty name) @@ -473,7 +465,7 @@ void XclImpDrawObjBase::ProcessSdrObject( SdrObject& rSdrObj ) const // automatic text margin if( mbAutoMargin ) { - sal_Int32 nMargin = GetObjectManager().GetDffManager().GetDefaultTextMargin(); + sal_Int32 nMargin = rDffConv.GetDefaultTextMargin(); rSdrObj.SetMergedItem( SdrTextLeftDistItem( nMargin ) ); rSdrObj.SetMergedItem( SdrTextRightDistItem( nMargin ) ); rSdrObj.SetMergedItem( SdrTextUpperDistItem( nMargin ) ); @@ -497,7 +489,13 @@ void XclImpDrawObjBase::ProcessSdrObject( SdrObject& rSdrObj ) const #endif // call virtual function for object type specific processing - DoProcessSdrObj( rSdrObj ); + DoPreProcessSdrObj( rDffConv, rSdrObj ); +} + +void XclImpDrawObjBase::PostProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const +{ + // call virtual function for object type specific processing + DoPostProcessSdrObj( rDffConv, rSdrObj ); } // protected ------------------------------------------------------------------ @@ -759,68 +757,69 @@ sal_Size XclImpDrawObjBase::DoGetProgressSize() const return 1; } -SdrObject* XclImpDrawObjBase::DoCreateSdrObj( const Rectangle&, ScfProgressBar& rProgress ) const +SdrObject* XclImpDrawObjBase::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& ) const { - rProgress.Progress( GetProgressSize() ); + rDffConv.Progress( GetProgressSize() ); return 0; } -void XclImpDrawObjBase::DoProcessSdrObj( SdrObject& /*rSdrObj*/ ) const +void XclImpDrawObjBase::DoPreProcessSdrObj( XclImpDffConverter&, SdrObject& ) const { // trace if object is not printable if( !IsPrintable() ) GetTracer().TraceObjectNotPrintable(); } -void XclImpDrawObjBase::ImplReadObj3( XclImpStream& rStrm ) +void XclImpDrawObjBase::DoPostProcessSdrObj( XclImpDffConverter&, SdrObject& ) const { - sal_uInt16 nObjFlags, nMacroSize; - XclObjAnchor aAnchor( GetCurrScTab() ); +} +void XclImpDrawObjBase::ImplReadObj3( XclImpStream& rStrm ) +{ // back to offset 4 (ignore object count field) rStrm.Seek( 4 ); - rStrm >> mnObjType >> maObjId.mnObjId >> nObjFlags >> aAnchor >> nMacroSize; + + sal_uInt16 nObjFlags, nMacroSize; + rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize; rStrm.Ignore( 2 ); + mbHasAnchor = true; mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN ); mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE ); - SetAnchor( aAnchor ); DoReadObj3( rStrm, nMacroSize ); } void XclImpDrawObjBase::ImplReadObj4( XclImpStream& rStrm ) { - sal_uInt16 nObjFlags, nMacroSize; - XclObjAnchor aAnchor( GetCurrScTab() ); - // back to offset 4 (ignore object count field) rStrm.Seek( 4 ); - rStrm >> mnObjType >> maObjId.mnObjId >> nObjFlags >> aAnchor >> nMacroSize; + + sal_uInt16 nObjFlags, nMacroSize; + rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize; rStrm.Ignore( 2 ); + mbHasAnchor = true; mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN ); mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE ); mbPrintable = ::get_flag( nObjFlags, EXC_OBJ_PRINTABLE ); - SetAnchor( aAnchor ); DoReadObj4( rStrm, nMacroSize ); } void XclImpDrawObjBase::ImplReadObj5( XclImpStream& rStrm ) { - sal_uInt16 nObjFlags, nMacroSize, nNameLen; - XclObjAnchor aAnchor( GetCurrScTab() ); - // back to offset 4 (ignore object count field) rStrm.Seek( 4 ); - rStrm >> mnObjType >> maObjId.mnObjId >> nObjFlags >> aAnchor >> nMacroSize; + + sal_uInt16 nObjFlags, nMacroSize, nNameLen; + rStrm >> mnObjType >> mnObjId >> nObjFlags >> maAnchor >> nMacroSize; rStrm.Ignore( 2 ); rStrm >> nNameLen; rStrm.Ignore( 2 ); + mbHasAnchor = true; mbHidden = ::get_flag( nObjFlags, EXC_OBJ_HIDDEN ); mbVisible = ::get_flag( nObjFlags, EXC_OBJ_VISIBLE ); mbPrintable = ::get_flag( nObjFlags, EXC_OBJ_PRINTABLE ); - SetAnchor( aAnchor ); DoReadObj5( rStrm, nNameLen, nMacroSize ); } @@ -845,7 +844,7 @@ void XclImpDrawObjBase::ImplReadObj8( XclImpStream& rStrm ) if( (rStrm.GetRecPos() == 4) && (nSubRecSize >= 6) ) { sal_uInt16 nObjFlags; - rStrm >> mnObjType >> maObjId.mnObjId >> nObjFlags; + rStrm >> mnObjType >> mnObjId >> nObjFlags; mbPrintable = ::get_flag( nObjFlags, EXC_OBJCMO_PRINTABLE ); } break; @@ -928,7 +927,7 @@ XclImpGroupObj::XclImpGroupObj( const XclImpRoot& rRoot ) : bool XclImpGroupObj::TryInsert( XclImpDrawObjRef xDrawObj ) { - if( (xDrawObj->GetScTab() != GetScTab()) || (xDrawObj->GetObjId().mnObjId == mnFirstUngrouped) ) + if( xDrawObj->GetObjId() == mnFirstUngrouped ) return false; // insert into own list or into nested group maChildren.InsertGrouped( xDrawObj ); @@ -965,13 +964,14 @@ sal_Size XclImpGroupObj::DoGetProgressSize() const return XclImpDrawObjBase::DoGetProgressSize() + maChildren.GetProgressSize(); } -SdrObject* XclImpGroupObj::DoCreateSdrObj( const Rectangle& /*rAnchorRect*/, ScfProgressBar& rProgress ) const +SdrObject* XclImpGroupObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& /*rAnchorRect*/ ) const { TSdrObjectPtr< SdrObjGroup > xSdrObj( new SdrObjGroup ); // child objects in BIFF2-BIFF5 have absolute size, not needed to pass own anchor rectangle + SdrObjList& rObjList = *xSdrObj->GetSubList(); // SdrObjGroup always returns existing sublist for( XclImpDrawObjVector::const_iterator aIt = maChildren.begin(), aEnd = maChildren.end(); aIt != aEnd; ++aIt ) - GetObjectManager().GetDffManager().ProcessObject( xSdrObj->GetSubList(), **aIt ); - rProgress.Progress(); + rDffConv.ProcessObject( rObjList, **aIt ); + rDffConv.Progress(); return xSdrObj.release(); } @@ -1007,7 +1007,7 @@ void XclImpLineObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uI ReadMacro5( rStrm, nMacroSize ); } -SdrObject* XclImpLineObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpLineObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { ::basegfx::B2DPolygon aB2DPolygon; switch( mnStartPoint ) @@ -1100,7 +1100,7 @@ SdrObject* XclImpLineObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgr xSdrObj->SetMergedItem( XLineEndCenterItem( FALSE ) ); } } - rProgress.Progress(); + rDffConv.Progress(); return xSdrObj.release(); } @@ -1144,11 +1144,11 @@ void XclImpRectObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uI ReadMacro5( rStrm, nMacroSize ); } -SdrObject* XclImpRectObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpRectObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { SdrObjectPtr xSdrObj( new SdrRectObj( rAnchorRect ) ); ConvertRectStyle( *xSdrObj ); - rProgress.Progress(); + rDffConv.Progress(); return xSdrObj.release(); } @@ -1159,11 +1159,11 @@ XclImpOvalObj::XclImpOvalObj( const XclImpRoot& rRoot ) : { } -SdrObject* XclImpOvalObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpOvalObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { SdrObjectPtr xSdrObj( new SdrCircObj( OBJ_CIRC, rAnchorRect ) ); ConvertRectStyle( *xSdrObj ); - rProgress.Progress(); + rDffConv.Progress(); return xSdrObj.release(); } @@ -1198,7 +1198,7 @@ void XclImpArcObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uIn ReadMacro5( rStrm, nMacroSize ); } -SdrObject* XclImpArcObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpArcObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { Rectangle aNewRect = rAnchorRect; long nStartAngle = 0; @@ -1235,7 +1235,7 @@ SdrObject* XclImpArcObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgre SdrObjectPtr xSdrObj( new SdrCircObj( eObjKind, aNewRect, nStartAngle, nEndAngle ) ); ConvertFillStyle( *xSdrObj, maFillData ); ConvertLineStyle( *xSdrObj, maLineData ); - rProgress.Progress(); + rDffConv.Progress(); return xSdrObj.release(); } @@ -1297,7 +1297,7 @@ namespace { } // namespace -SdrObject* XclImpPolygonObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpPolygonObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { SdrObjectPtr xSdrObj; if( maCoords.size() >= 2 ) @@ -1314,7 +1314,7 @@ SdrObject* XclImpPolygonObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfPr xSdrObj.reset( new SdrPathObj( eObjKind, ::basegfx::B2DPolyPolygon( aB2DPolygon ) ) ); ConvertRectStyle( *xSdrObj ); } - rProgress.Progress(); + rDffConv.Progress(); return xSdrObj.release(); } @@ -1375,7 +1375,7 @@ void XclImpTextObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uI maTextData.ReadFormats( rStrm ); } -SdrObject* XclImpTextObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpTextObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { TSdrObjectPtr< SdrObjCustomShape > xSdrObj( new SdrObjCustomShape ); xSdrObj->NbcSetSnapRect( rAnchorRect ); @@ -1386,11 +1386,11 @@ SdrObject* XclImpTextObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgr xSdrObj->SetMergedItem( SdrTextAutoGrowWidthItem( bAutoSize ) ); xSdrObj->SetMergedItem( SdrTextAutoGrowHeightItem( bAutoSize ) ); xSdrObj->SetMergedItem( SdrTextWordWrapItem( TRUE ) ); - rProgress.Progress(); + rDffConv.Progress(); return xSdrObj.release(); } -void XclImpTextObj::DoProcessSdrObj( SdrObject& rSdrObj ) const +void XclImpTextObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const { // set text data if( SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( &rSdrObj ) ) @@ -1469,7 +1469,7 @@ void XclImpTextObj::DoProcessSdrObj( SdrObject& rSdrObj ) const case EXC_OBJ_HOR_RIGHT: eVerAlign = SDRTEXTVERTADJUST_BOTTOM; break; case EXC_OBJ_HOR_JUSTIFY: eVerAlign = SDRTEXTVERTADJUST_BLOCK; break; } - MSO_Anchor eTextAnchor = (MSO_Anchor)GetObjectManager().GetDffManager().GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop ); + MSO_Anchor eTextAnchor = (MSO_Anchor)rDffConv.GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop ); switch( eTextAnchor ) { case mso_anchorTopCentered : @@ -1508,7 +1508,7 @@ void XclImpTextObj::DoProcessSdrObj( SdrObject& rSdrObj ) const case EXC_OBJ_HOR_RIGHT: eVerAlign = SDRTEXTVERTADJUST_TOP; break; case EXC_OBJ_HOR_JUSTIFY: eVerAlign = SDRTEXTVERTADJUST_BLOCK; break; } - MSO_Anchor eTextAnchor = (MSO_Anchor)GetObjectManager().GetDffManager().GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop ); + MSO_Anchor eTextAnchor = (MSO_Anchor)rDffConv.GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop ); switch ( eTextAnchor ) { case mso_anchorTopCentered : @@ -1539,7 +1539,7 @@ void XclImpTextObj::DoProcessSdrObj( SdrObject& rSdrObj ) const } } // base class processing - XclImpRectObj::DoProcessSdrObj( rSdrObj ); + XclImpRectObj::DoPreProcessSdrObj( rDffConv, rSdrObj ); } // ---------------------------------------------------------------------------- @@ -1633,11 +1633,11 @@ sal_Size XclImpChartObj::DoGetProgressSize() const return mxChart.is() ? mxChart->GetProgressSize() : 1; } -SdrObject* XclImpChartObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpChartObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { SdrObjectPtr xSdrObj; SfxObjectShell* pDocShell = GetDocShell(); - if( SvtModuleOptions().IsChart() && pDocShell && mxChart.is() && !mxChart->IsPivotChart() ) + if( rDffConv.SupportsOleObjects() && SvtModuleOptions().IsChart() && pDocShell && mxChart.is() && !mxChart->IsPivotChart() ) { // create embedded chart object OUString aEmbObjName; @@ -1655,20 +1655,28 @@ SdrObject* XclImpChartObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProg // create the container OLE object xSdrObj.reset( new SdrOle2Obj( svt::EmbeddedObjectRef( xEmbObj, nAspect ), aEmbObjName, rAnchorRect ) ); + } - // convert Excel chart to OOo Chart - if( svt::EmbeddedObjectRef::TryRunningState( xEmbObj ) ) - { - Reference< XModel > xModel( xEmbObj->getComponent(), UNO_QUERY ); - mxChart->Convert( xModel, rProgress, aEmbObjName ); + return xSdrObj.release(); +} - Reference< XEmbedPersist > xPers( xEmbObj, UNO_QUERY ); - if( xPers.is() ) - xPers->storeOwn(); +void XclImpChartObj::DoPostProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const +{ + const SdrOle2Obj* pSdrOleObj = dynamic_cast< const SdrOle2Obj* >( &rSdrObj ); + if( mxChart.is() && pSdrOleObj ) + { + Reference< XEmbeddedObject > xEmbObj = pSdrOleObj->GetObjRef(); + if( xEmbObj.is() && ::svt::EmbeddedObjectRef::TryRunningState( xEmbObj ) ) try + { + Reference< XEmbedPersist > xPersist( xEmbObj, UNO_QUERY_THROW ); + Reference< XModel > xModel( xEmbObj->getComponent(), UNO_QUERY_THROW ); + mxChart->Convert( xModel, rDffConv, xPersist->getEntryName(), rSdrObj.GetLogicRect() ); + xPersist->storeOwn(); + } + catch( Exception& ) + { } } - - return xSdrObj.release(); } void XclImpChartObj::FinalizeTabChart() @@ -1683,12 +1691,12 @@ void XclImpChartObj::FinalizeTabChart() // calculate size of the chart object const XclPageData& rPageData = GetPageSettings().GetPageData(); - Size aPaperSize( rPageData.GetScPaperSize() ); + Size aPaperSize = rPageData.GetScPaperSize(); long nWidth = XclTools::GetHmmFromTwips( aPaperSize.Width() ); long nHeight = XclTools::GetHmmFromTwips( aPaperSize.Height() ); - // subtract page margins, give 1cm extra space + // subtract page margins, give some more extra space nWidth -= (XclTools::GetHmmFromInch( rPageData.mfLeftMargin + rPageData.mfRightMargin ) + 2000); nHeight -= (XclTools::GetHmmFromInch( rPageData.mfTopMargin + rPageData.mfBottomMargin ) + 1000); @@ -1700,8 +1708,8 @@ void XclImpChartObj::FinalizeTabChart() } // create the object anchor - XclObjAnchor aAnchor( GetScTab() ); - aAnchor.SetRect( GetDoc(), Rectangle( 1000, 500, nWidth, nHeight ), MAP_100TH_MM ); + XclObjAnchor aAnchor; + aAnchor.SetRect( GetDoc(), GetCurrScTab(), Rectangle( 1000, 500, nWidth, nHeight ), MAP_100TH_MM ); SetAnchor( aAnchor ); } @@ -1723,10 +1731,10 @@ void XclImpNoteObj::SetNoteData( const ScAddress& rScPos, sal_uInt16 nNoteFlags mnNoteFlags = nNoteFlags; } -void XclImpNoteObj::DoProcessSdrObj( SdrObject& rSdrObj ) const +void XclImpNoteObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const { // create formatted text - XclImpTextObj::DoProcessSdrObj( rSdrObj ); + XclImpTextObj::DoPreProcessSdrObj( rDffConv, rSdrObj ); OutlinerParaObject* pOutlinerObj = rSdrObj.GetOutlinerParaObject(); if( maScPos.IsValid() && pOutlinerObj ) { @@ -1970,16 +1978,16 @@ void XclImpTbxObjBase::ConvertLabel( ScfPropertySet& rPropSet ) const ConvertFont( rPropSet ); } -SdrObject* XclImpTbxObjBase::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpTbxObjBase::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { - SdrObjectPtr xSdrObj( GetObjectManager().GetDffManager().CreateSdrObject( *this, rAnchorRect ) ); - rProgress.Progress(); + SdrObjectPtr xSdrObj( rDffConv.CreateSdrObject( *this, rAnchorRect ) ); + rDffConv.Progress(); return xSdrObj.release(); } -void XclImpTbxObjBase::DoProcessSdrObj( SdrObject& /*rSdrObj*/ ) const +void XclImpTbxObjBase::DoPreProcessSdrObj( XclImpDffConverter& /*rDffConv*/, SdrObject& /*rSdrObj*/ ) const { - // do not call DoProcessSdrObj() from base class (to skip text processing) + // do not call DoPreProcessSdrObj() from base class (to skip text processing) ProcessControl( *this ); } @@ -2740,7 +2748,7 @@ void XclImpPictureObj::DoReadObj3( XclImpStream& rStrm, sal_uInt16 nMacroSize ) ReadPictFmla( rStrm, nLinkSize ); if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() ) - maGraphic = XclImpObjectManager::ReadImgData( rStrm ); + maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm ); } void XclImpPictureObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ) @@ -2755,7 +2763,7 @@ void XclImpPictureObj::DoReadObj4( XclImpStream& rStrm, sal_uInt16 nMacroSize ) ReadPictFmla( rStrm, nLinkSize ); if( (rStrm.GetNextRecId() == EXC_ID3_IMGDATA) && rStrm.StartNextRecord() ) - maGraphic = XclImpObjectManager::ReadImgData( rStrm ); + maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm ); } void XclImpPictureObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ) @@ -2777,7 +2785,7 @@ void XclImpPictureObj::DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal if( IsHidden() && (GetObjName() == CREATE_STRING( "__BkgndObj" )) ) GetPageSettings().ReadImgData( rStrm ); else - maGraphic = XclImpObjectManager::ReadImgData( rStrm ); + maGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm ); } } @@ -2796,10 +2804,10 @@ void XclImpPictureObj::DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRec } } -SdrObject* XclImpPictureObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const +SdrObject* XclImpPictureObj::DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const { // try to create an OLE object or form control - SdrObjectPtr xSdrObj( GetObjectManager().GetDffManager().CreateSdrObject( *this, rAnchorRect ) ); + SdrObjectPtr xSdrObj( rDffConv.CreateSdrObject( *this, rAnchorRect ) ); // no OLE - create a plain picture from IMGDATA record data if( !xSdrObj && (maGraphic.GetType() != GRAPHIC_NONE) ) @@ -2808,21 +2816,21 @@ SdrObject* XclImpPictureObj::DoCreateSdrObj( const Rectangle& rAnchorRect, ScfPr ConvertRectStyle( *xSdrObj ); } - rProgress.Progress(); + rDffConv.Progress(); return xSdrObj.release(); } -void XclImpPictureObj::DoProcessSdrObj( SdrObject& rSdrObj ) const +void XclImpPictureObj::DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const { if( IsOcxControl() ) { - // do not call XclImpRectObj::DoProcessSdrObj(), it would trace missing "printable" feature + // do not call XclImpRectObj::DoPreProcessSdrObj(), it would trace missing "printable" feature ProcessControl( *this ); } else if( mbEmbedded || mbLinked ) { // trace missing "printable" feature - XclImpRectObj::DoProcessSdrObj( rSdrObj ); + XclImpRectObj::DoPreProcessSdrObj( rDffConv, rSdrObj ); SfxObjectShell* pDocShell = GetDocShell(); SdrOle2Obj* pOleSdrObj = dynamic_cast< SdrOle2Obj* >( &rSdrObj ); @@ -3062,18 +3070,18 @@ void XclImpSolverContainer::UpdateConnection( sal_uInt32 nDffShapeId, SdrObject* // ---------------------------------------------------------------------------- -XclImpSimpleDffManager::XclImpSimpleDffManager( const XclImpRoot& rRoot, SvStream& rDffStrm ) : +XclImpSimpleDffConverter::XclImpSimpleDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ) : SvxMSDffManager( rDffStrm, rRoot.GetBasePath(), 0, 0, rRoot.GetDoc().GetDrawLayer(), 1440, COL_DEFAULT, 24, 0, &rRoot.GetTracer().GetBaseTracer() ), XclImpRoot( rRoot ) { SetSvxMSDffSettings( SVXMSDFF_SETTINGS_CROP_BITMAPS | SVXMSDFF_SETTINGS_IMPORT_EXCEL ); } -XclImpSimpleDffManager::~XclImpSimpleDffManager() +XclImpSimpleDffConverter::~XclImpSimpleDffConverter() { } -FASTBOOL XclImpSimpleDffManager::GetColorFromPalette( USHORT nIndex, Color& rColor ) const +FASTBOOL XclImpSimpleDffConverter::GetColorFromPalette( USHORT nIndex, Color& rColor ) const { ColorData nColor = GetPalette().GetColorData( static_cast< sal_uInt16 >( nIndex ) ); @@ -3086,14 +3094,23 @@ FASTBOOL XclImpSimpleDffManager::GetColorFromPalette( USHORT nIndex, Color& rCol // ---------------------------------------------------------------------------- -XclImpDffManager::XclImpDffManager( - const XclImpRoot& rRoot, XclImpObjectManager& rObjManager, SvStream& rDffStrm ) : - XclImpSimpleDffManager( rRoot, rDffStrm ), - SvxMSConvertOCXControls( rRoot.GetDocShell(), 0 ), - mrObjManager( rObjManager ), - mnOleImpFlags( 0 ), +XclImpDffConverter::XclImpDffConvData::XclImpDffConvData( + XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage ) : + mrDrawing( rDrawing ), + mrSdrModel( rSdrModel ), + mrSdrPage( rSdrPage ), mnLastCtrlIndex( -1 ), - mnCurrFormScTab( -1 ) + mbHasCtrlForm( false ) +{ +} + +// ---------------------------------------------------------------------------- + +XclImpDffConverter::XclImpDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ) : + XclImpSimpleDffConverter( rRoot, rDffStrm ), + SvxMSConvertOCXControls( rRoot.GetDocShell(), 0 ), + maStdFormName( CREATE_OUSTRING( "Standard" ) ), + mnOleImpFlags( 0 ) { if( SvtFilterOptions* pFilterOpt = SvtFilterOptions::Get() ) { @@ -3113,81 +3130,104 @@ XclImpDffManager::XclImpDffManager( ScaleEmu( mnDefTextMargin ); } -XclImpDffManager::~XclImpDffManager() +XclImpDffConverter::~XclImpDffConverter() { } -void XclImpDffManager::StartProgressBar( sal_Size nProgressSize ) +void XclImpDffConverter::StartProgressBar( sal_Size nProgressSize ) { mxProgress.reset( new ScfProgressBar( GetDocShell(), STR_PROGRESS_CALCULATING ) ); mxProgress->AddSegment( nProgressSize ); mxProgress->Activate(); } -void XclImpDffManager::ProcessObject( SdrObjList* pObjList, const XclImpDrawObjBase& rDrawObj ) +void XclImpDffConverter::Progress( sal_Size nDelta ) { - Rectangle aAnchorRect = rDrawObj.GetAnchorRect(); - if( rDrawObj.IsProcessSdrObj() && rDrawObj.IsValidSize( aAnchorRect ) ) - { - // CreateSdrObject() recursively creates embedded child objects - SdrObjectPtr xSdrObj( rDrawObj.CreateSdrObject( aAnchorRect, *mxProgress, false ) ); - if( xSdrObj.is() ) - rDrawObj.ProcessSdrObject( *xSdrObj ); - // call InsertSdrObject() also, if SdrObject is missing - InsertSdrObject( pObjList, rDrawObj, xSdrObj.release() ); - UpdateUsedArea( rDrawObj ); - } + DBG_ASSERT( mxProgress.is(), "XclImpDffConverter::Progress - invalid call, no progress bar" ); + mxProgress->Progress( nDelta ); } -void XclImpDffManager::ProcessDrawingGroup( SvStream& rDffStrm ) +void XclImpDffConverter::InitializeDrawing( XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage ) { - rDffStrm.Seek( STREAM_SEEK_TO_BEGIN ); - DffRecordHeader aHeader; - rDffStrm >> aHeader; - if( aHeader.nRecType == DFF_msofbtDggContainer ) - ProcessDggContainer( rDffStrm, aHeader ); - else + XclImpDffConvDataRef xConvData( new XclImpDffConvData( rDrawing, rSdrModel, rSdrPage ) ); + maDataStack.push_back( xConvData ); + SetModel( &xConvData->mrSdrModel, 1440 ); +} + +void XclImpDffConverter::ProcessObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj ) +{ + if( rDrawObj.IsProcessSdrObj() ) { - DBG_ERRORFILE( "XclImpDffManager::ProcessDrawingGroup - unexpected record" ); + if( const XclObjAnchor* pAnchor = rDrawObj.GetAnchor() ) + { + Rectangle aAnchorRect = GetConvData().mrDrawing.CalcAnchorRect( *pAnchor, false ); + if( rDrawObj.IsValidSize( aAnchorRect ) ) + { + // CreateSdrObject() recursively creates embedded child objects + SdrObjectPtr xSdrObj( rDrawObj.CreateSdrObject( *this, aAnchorRect, false ) ); + if( xSdrObj.is() ) + rDrawObj.PreProcessSdrObject( *this, *xSdrObj ); + // call InsertSdrObject() also, if SdrObject is missing + InsertSdrObject( rObjList, rDrawObj, xSdrObj.release() ); + } + } } } -void XclImpDffManager::ProcessDrawing( SvStream& rDffStrm, sal_Size nStrmPos ) +void XclImpDffConverter::ProcessDrawing( const XclImpDrawObjVector& rDrawObjs ) { - rDffStrm.Seek( nStrmPos ); - DffRecordHeader aHeader; - rDffStrm >> aHeader; - if( aHeader.nRecType == DFF_msofbtDgContainer ) - ProcessDgContainer( rDffStrm, aHeader ); - else + SdrPage& rSdrPage = GetConvData().mrSdrPage; + for( XclImpDrawObjVector::const_iterator aIt = rDrawObjs.begin(), aEnd = rDrawObjs.end(); aIt != aEnd; ++aIt ) + ProcessObject( rSdrPage, **aIt ); +} + +void XclImpDffConverter::ProcessDrawing( SvStream& rDffStrm ) +{ + rDffStrm.Seek( STREAM_SEEK_TO_END ); + if( rDffStrm.Tell() > 0 ) { - DBG_ERRORFILE( "XclImpDffManager::ProcessDrawing - unexpected record" ); + rDffStrm.Seek( STREAM_SEEK_TO_BEGIN ); + DffRecordHeader aHeader; + rDffStrm >> aHeader; + DBG_ASSERT( aHeader.nRecType == DFF_msofbtDgContainer, "XclImpDffConverter::ProcessDrawing - unexpected record" ); + if( aHeader.nRecType == DFF_msofbtDgContainer ) + ProcessDgContainer( rDffStrm, aHeader ); } } -SdrObject* XclImpDffManager::CreateSdrObject( const XclImpTbxObjBase& rTbxObj, const Rectangle& rAnchorRect ) +void XclImpDffConverter::FinalizeDrawing() +{ + DBG_ASSERT( !maDataStack.empty(), "XclImpDffConverter::FinalizeDrawing - no drawing manager on stack" ); + maDataStack.pop_back(); + // restore previous model at core DFF converter + if( !maDataStack.empty() ) + SetModel( &maDataStack.back()->mrSdrModel, 1440 ); +} + +SdrObject* XclImpDffConverter::CreateSdrObject( const XclImpTbxObjBase& rTbxObj, const Rectangle& rAnchorRect ) { SdrObjectPtr xSdrObj; OUString aServiceName = rTbxObj.GetServiceName(); - if( aServiceName.getLength() > 0 ) try + if( SupportsOleObjects() && (aServiceName.getLength() > 0) ) try { // create the form control from scratch Reference< XFormComponent > xFormComp( ScfApiHelper::CreateInstance( GetDocShell(), aServiceName ), UNO_QUERY_THROW ); - // set current controls form, needed in virtual function InsertControl() - SetCurrentForm( rTbxObj.GetScTab() ); + // set controls form, needed in virtual function InsertControl() + InitControlForm(); // try to insert the control into the form ::com::sun::star::awt::Size aDummySize; Reference< XShape > xShape; - if( mxCurrForm.is() && InsertControl( xFormComp, aDummySize, &xShape, TRUE ) ) + XclImpDffConvData& rConvData = GetConvData(); + if( rConvData.mxCtrlForm.is() && InsertControl( xFormComp, aDummySize, &xShape, TRUE ) ) { xSdrObj.reset( rTbxObj.CreateSdrObjectFromShape( xShape, rAnchorRect ) ); // try to attach a macro to the control ScriptEventDescriptor aDescriptor; - if( (mnLastCtrlIndex >= 0) && rTbxObj.FillMacroDescriptor( aDescriptor ) ) + if( (rConvData.mnLastCtrlIndex >= 0) && rTbxObj.FillMacroDescriptor( aDescriptor ) ) { - Reference< XEventAttacherManager > xEventMgr( mxCurrForm, UNO_QUERY_THROW ); - xEventMgr->registerScriptEvent( mnLastCtrlIndex, aDescriptor ); + Reference< XEventAttacherManager > xEventMgr( rConvData.mxCtrlForm, UNO_QUERY_THROW ); + xEventMgr->registerScriptEvent( rConvData.mnLastCtrlIndex, aDescriptor ); } } } @@ -3198,52 +3238,55 @@ SdrObject* XclImpDffManager::CreateSdrObject( const XclImpTbxObjBase& rTbxObj, c return xSdrObj.release(); } -SdrObject* XclImpDffManager::CreateSdrObject( const XclImpPictureObj& rPicObj, const Rectangle& rAnchorRect ) +SdrObject* XclImpDffConverter::CreateSdrObject( const XclImpPictureObj& rPicObj, const Rectangle& rAnchorRect ) { SdrObjectPtr xSdrObj; - if( rPicObj.IsOcxControl() ) - { - if( mxCtlsStrm.Is() ) try - { - /* set current controls form, needed in virtual function InsertControl() - called from ReadOCXExcelKludgeStream() */ - SetCurrentForm( rPicObj.GetScTab() ); - // seek to stream position of the extra data for this control - mxCtlsStrm->Seek( rPicObj.GetCtlsStreamPos() ); - // read from mxCtlsStrm into xShape, insert the control model into the form - Reference< XShape > xShape; - if( mxCurrForm.is() && ReadOCXExcelKludgeStream( mxCtlsStrm, &xShape, TRUE ) ) - xSdrObj.reset( rPicObj.CreateSdrObjectFromShape( xShape, rAnchorRect ) ); - } - catch( Exception& ) - { - } - } - else + if( SupportsOleObjects() ) { - SfxObjectShell* pDocShell = GetDocShell(); - SotStorageRef xSrcStrg = GetRootStorage(); - String aStrgName = rPicObj.GetOleStorageName(); - if( pDocShell && xSrcStrg.Is() && (aStrgName.Len() > 0) ) + if( rPicObj.IsOcxControl() ) { - // first try to resolve graphic from DFF storage - Graphic aGraphic; - Rectangle aVisArea; - if( !GetBLIP( GetPropertyValue( DFF_Prop_pib ), aGraphic, &aVisArea ) ) + if( mxCtlsStrm.Is() ) try { - // if not found, use graphic from object (imported from IMGDATA record) - aGraphic = rPicObj.GetGraphic(); - aVisArea = rPicObj.GetVisArea(); + /* set controls form, needed in virtual function InsertControl() + called from ReadOCXExcelKludgeStream() */ + InitControlForm(); + // seek to stream position of the extra data for this control + mxCtlsStrm->Seek( rPicObj.GetCtlsStreamPos() ); + // read from mxCtlsStrm into xShape, insert the control model into the form + Reference< XShape > xShape; + if( GetConvData().mxCtrlForm.is() && ReadOCXExcelKludgeStream( mxCtlsStrm, &xShape, TRUE ) ) + xSdrObj.reset( rPicObj.CreateSdrObjectFromShape( xShape, rAnchorRect ) ); } - if( aGraphic.GetType() != GRAPHIC_NONE ) + catch( Exception& ) { - ErrCode nError = ERRCODE_NONE; - namespace cssea = ::com::sun::star::embed::Aspects; - sal_Int64 nAspects = rPicObj.IsSymbol() ? cssea::MSOLE_ICON : cssea::MSOLE_CONTENT; - xSdrObj.reset( CreateSdrOLEFromStorage( - aStrgName, xSrcStrg, pDocShell->GetStorage(), aGraphic, - rAnchorRect, aVisArea, 0, nError, mnOleImpFlags, nAspects ) ); + } + } + else + { + SfxObjectShell* pDocShell = GetDocShell(); + SotStorageRef xSrcStrg = GetRootStorage(); + String aStrgName = rPicObj.GetOleStorageName(); + if( pDocShell && xSrcStrg.Is() && (aStrgName.Len() > 0) ) + { + // first try to resolve graphic from DFF storage + Graphic aGraphic; + Rectangle aVisArea; + if( !GetBLIP( GetPropertyValue( DFF_Prop_pib ), aGraphic, &aVisArea ) ) + { + // if not found, use graphic from object (imported from IMGDATA record) + aGraphic = rPicObj.GetGraphic(); + aVisArea = rPicObj.GetVisArea(); + } + if( aGraphic.GetType() != GRAPHIC_NONE ) + { + ErrCode nError = ERRCODE_NONE; + namespace cssea = ::com::sun::star::embed::Aspects; + sal_Int64 nAspects = rPicObj.IsSymbol() ? cssea::MSOLE_ICON : cssea::MSOLE_CONTENT; + xSdrObj.reset( CreateSdrOLEFromStorage( + aStrgName, xSrcStrg, pDocShell->GetStorage(), aGraphic, + rAnchorRect, aVisArea, 0, nError, mnOleImpFlags, nAspects ) ); + } } } } @@ -3251,44 +3294,43 @@ SdrObject* XclImpDffManager::CreateSdrObject( const XclImpPictureObj& rPicObj, c return xSdrObj.release(); } -ScRange XclImpDffManager::GetUsedArea( SCTAB nScTab ) const +bool XclImpDffConverter::SupportsOleObjects() const { - ScRange aScUsedArea( ScAddress::INITIALIZE_INVALID ); - ScRangeMap::const_iterator aIt = maUsedAreaMap.find( nScTab ); - if( aIt != maUsedAreaMap.end() ) - aScUsedArea = aIt->second; - return aScUsedArea; + return GetConvData().mrDrawing.SupportsOleObjects(); } // virtual functions ---------------------------------------------------------- -void XclImpDffManager::ProcessClientAnchor2( SvStream& rDffStrm, +void XclImpDffConverter::ProcessClientAnchor2( SvStream& rDffStrm, DffRecordHeader& rHeader, void* /*pClientData*/, DffObjData& rObjData ) { // find the OBJ record data related to the processed shape - if( XclImpDrawObjBase* pDrawObj = mrObjManager.FindDrawObj( rObjData.rSpHd ).get() ) + XclImpDffConvData& rConvData = GetConvData(); + if( XclImpDrawObjBase* pDrawObj = rConvData.mrDrawing.FindDrawObj( rObjData.rSpHd ).get() ) { - DBG_ASSERT( rHeader.nRecType == DFF_msofbtClientAnchor, "XclImpDffManager::ProcessClientAnchor2 - no client anchor record" ); - XclObjAnchor aAnchor( pDrawObj->GetScTab() ); + DBG_ASSERT( rHeader.nRecType == DFF_msofbtClientAnchor, "XclImpDffConverter::ProcessClientAnchor2 - no client anchor record" ); + XclObjAnchor aAnchor; rHeader.SeekToContent( rDffStrm ); rDffStrm.SeekRel( 2 ); // flags rDffStrm >> aAnchor; // anchor format equal to BIFF5 OBJ records pDrawObj->SetAnchor( aAnchor ); - rObjData.aChildAnchor = pDrawObj->GetAnchorRect(); + rObjData.aChildAnchor = rConvData.mrDrawing.CalcAnchorRect( aAnchor, true ); rObjData.bChildAnchor = sal_True; } } -SdrObject* XclImpDffManager::ProcessObj( SvStream& rDffStrm, - DffObjData& rDffObjData, void* pClientData, Rectangle& /*rTextRect*/, SdrObject* pOldSdrObj ) +SdrObject* XclImpDffConverter::ProcessObj( SvStream& rDffStrm, DffObjData& rDffObjData, + void* pClientData, Rectangle& /*rTextRect*/, SdrObject* pOldSdrObj ) { + XclImpDffConvData& rConvData = GetConvData(); + /* pOldSdrObj passes a generated SdrObject. This function owns this object and can modify it. The function has either to return it back to caller or to delete it by itself. */ SdrObjectPtr xSdrObj( pOldSdrObj ); // find the OBJ record data related to the processed shape - XclImpDrawObjRef xDrawObj = mrObjManager.FindDrawObj( rDffObjData.rSpHd ); + XclImpDrawObjRef xDrawObj = rConvData.mrDrawing.FindDrawObj( rDffObjData.rSpHd ); const Rectangle& rAnchorRect = rDffObjData.aChildAnchor; // #102378# Do not process the global page group shape (flag SP_FPATRIARCH) @@ -3326,7 +3368,7 @@ SdrObject* XclImpDffManager::ProcessObj( SvStream& rDffStrm, /* Connect textbox data (string, alignment, text orientation) to object. #98132# don't ask for a text-ID, DFF export doesn't set one. */ if( XclImpTextObj* pTextObj = dynamic_cast< XclImpTextObj* >( xDrawObj.get() ) ) - if( const XclImpObjTextData* pTextData = mrObjManager.FindTextData( rDffObjData.rSpHd ) ) + if( const XclImpObjTextData* pTextData = rConvData.mrDrawing.FindTextData( rDffObjData.rSpHd ) ) pTextObj->SetTextData( *pTextData ); // copy line and fill formatting of TBX form controls from DFF properties @@ -3334,7 +3376,7 @@ SdrObject* XclImpDffManager::ProcessObj( SvStream& rDffStrm, pTbxObj->SetDffProperties( *this ); // try to create a custom SdrObject that overwrites the passed object - SdrObjectPtr xNewSdrObj( xDrawObj->CreateSdrObject( rAnchorRect, *mxProgress, true ) ); + SdrObjectPtr xNewSdrObj( xDrawObj->CreateSdrObject( *this, rAnchorRect, true ) ); if( xNewSdrObj.is() ) xSdrObj.reset( xNewSdrObj.release() ); @@ -3346,40 +3388,50 @@ SdrObject* XclImpDffManager::ProcessObj( SvStream& rDffStrm, xSdrObj->SetMergedItem( XFillColorItem( EMPTY_STRING, GetPalette().GetColor( EXC_COLOR_WINDOWBACK ) ) ); // additional processing on the SdrObject - xDrawObj->ProcessSdrObject( *xSdrObj ); - - // add the area used by this object to the internal map of used areas - UpdateUsedArea( *xDrawObj ); + xDrawObj->PreProcessSdrObject( *this, *xSdrObj ); /* If the SdrObject will not be inserted into the draw page, delete it - here. Happens e.g. for notes: The ProcessSdrObject() call above has - inserted the note into the document, and the SdrObject is not + here. Happens e.g. for notes: The PreProcessSdrObject() call above + has inserted the note into the document, and the SdrObject is not needed anymore. */ if( !xDrawObj->IsInsertSdrObj() ) xSdrObj.reset(); } - /* Store the relation between shape ID and SdrObject for connectors. Must - be done here (and not in InsertSdrObject() function), otherwise all - SdrObjects embedded in groups would be lost. */ if( xSdrObj.is() ) - maSolverCont.InsertSdrObjectInfo( *xSdrObj, xDrawObj->GetDffShapeId(), xDrawObj->GetDffFlags() ); + { + /* Store the relation between shape ID and SdrObject for connectors. + Must be done here (and not in InsertSdrObject() function), + otherwise all SdrObjects embedded in groups would be lost. */ + rConvData.maSolverCont.InsertSdrObjectInfo( *xSdrObj, xDrawObj->GetDffShapeId(), xDrawObj->GetDffFlags() ); + + /* If the drawing object is embedded in a group object, call + PostProcessSdrObject() here. For top-level objects this will be + done automatically in InsertSdrObject() but grouped shapes are + inserted into their groups somewhere in the SvxMSDffManager base + class without chance of notification. Unfortunately, now this is + called before the object is really inserted into its group object, + but that should not have any effect for grouped objects. */ + if( !bIsTopLevel ) + xDrawObj->PostProcessSdrObject( *this, *xSdrObj ); + } return xSdrObj.release(); } -ULONG XclImpDffManager::Calc_nBLIPPos( ULONG /*nOrgVal*/, ULONG nStreamPos ) const +ULONG XclImpDffConverter::Calc_nBLIPPos( ULONG /*nOrgVal*/, ULONG nStreamPos ) const { return nStreamPos + 4; } -sal_Bool XclImpDffManager::InsertControl( const Reference< XFormComponent >& rxFormComp, +sal_Bool XclImpDffConverter::InsertControl( const Reference< XFormComponent >& rxFormComp, const ::com::sun::star::awt::Size& /*rSize*/, Reference< XShape >* pxShape, BOOL /*bFloatingCtrl*/ ) { if( GetDocShell() ) try { - Reference< XIndexContainer > xFormIC( mxCurrForm, UNO_QUERY_THROW ); + XclImpDffConvData& rConvData = GetConvData(); + Reference< XIndexContainer > xFormIC( rConvData.mxCtrlForm, UNO_QUERY_THROW ); Reference< XControlModel > xCtrlModel( rxFormComp, UNO_QUERY_THROW ); // create the control shape @@ -3390,7 +3442,7 @@ sal_Bool XclImpDffManager::InsertControl( const Reference< XFormComponent >& rxF sal_Int32 nNewIndex = xFormIC->getCount(); xFormIC->insertByIndex( nNewIndex, Any( rxFormComp ) ); // on success: store new index of the control for later use (macro events) - mnLastCtrlIndex = nNewIndex; + rConvData.mnLastCtrlIndex = nNewIndex; // set control model at control shape and pass back shape to caller xCtrlShape->setControl( xCtrlModel ); @@ -3399,7 +3451,7 @@ sal_Bool XclImpDffManager::InsertControl( const Reference< XFormComponent >& rxF } catch( Exception& ) { - DBG_ERRORFILE( "XclImpDffManager::InsertControl - cannot create form control" ); + DBG_ERRORFILE( "XclImpDffConverter::InsertControl - cannot create form control" ); } return sal_False; @@ -3407,7 +3459,19 @@ sal_Bool XclImpDffManager::InsertControl( const Reference< XFormComponent >& rxF // private -------------------------------------------------------------------- -String XclImpDffManager::ReadHlinkProperty( SvStream& rDffStrm ) const +XclImpDffConverter::XclImpDffConvData& XclImpDffConverter::GetConvData() +{ + DBG_ASSERT( !maDataStack.empty(), "XclImpDffConverter::GetConvData - no drawing manager on stack" ); + return *maDataStack.back(); +} + +const XclImpDffConverter::XclImpDffConvData& XclImpDffConverter::GetConvData() const +{ + DBG_ASSERT( !maDataStack.empty(), "XclImpDffConverter::GetConvData - no drawing manager on stack" ); + return *maDataStack.back(); +} + +String XclImpDffConverter::ReadHlinkProperty( SvStream& rDffStrm ) const { /* Reads hyperlink data from a complex DFF property. Contents of this property are equal to the HLINK record, import of this record is @@ -3438,13 +3502,7 @@ String XclImpDffManager::ReadHlinkProperty( SvStream& rDffStrm ) const return aString; } -void XclImpDffManager::ProcessDggContainer( SvStream& rDffStrm, const DffRecordHeader& rDggHeader ) -{ - // seek to end of drawing group container - rDggHeader.SeekToEndOfRecord( rDffStrm ); -} - -void XclImpDffManager::ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ) +void XclImpDffConverter::ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ) { sal_Size nEndPos = rDgHeader.GetRecEndFilePos(); while( rDffStrm.Tell() < nEndPos ) @@ -3467,12 +3525,13 @@ void XclImpDffManager::ProcessDgContainer( SvStream& rDffStrm, const DffRecordHe rDgHeader.SeekToEndOfRecord( rDffStrm ); // #i12638# #i37900# connector rules - maSolverCont.UpdateConnectorRules(); - SolveSolver( maSolverCont ); - maSolverCont.RemoveConnectorRules(); + XclImpSolverContainer& rSolverCont = GetConvData().maSolverCont; + rSolverCont.UpdateConnectorRules(); + SolveSolver( rSolverCont ); + rSolverCont.RemoveConnectorRules(); } -void XclImpDffManager::ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader ) +void XclImpDffConverter::ProcessShGrContainer( SvStream& rDffStrm, const DffRecordHeader& rShGrHeader ) { sal_Size nEndPos = rShGrHeader.GetRecEndFilePos(); while( rDffStrm.Tell() < nEndPos ) @@ -3493,17 +3552,17 @@ void XclImpDffManager::ProcessShGrContainer( SvStream& rDffStrm, const DffRecord rShGrHeader.SeekToEndOfRecord( rDffStrm ); } -void XclImpDffManager::ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader ) +void XclImpDffConverter::ProcessSolverContainer( SvStream& rDffStrm, const DffRecordHeader& rSolverHeader ) { // solver container wants to read the solver container header again rSolverHeader.SeekToBegOfRecord( rDffStrm ); // read the entire solver container - rDffStrm >> maSolverCont; + rDffStrm >> GetConvData().maSolverCont; // seek to end of solver container rSolverHeader.SeekToEndOfRecord( rDffStrm ); } -void XclImpDffManager::ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ) +void XclImpDffConverter::ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ) { rShHeader.SeekToBegOfRecord( rDffStrm ); Rectangle aDummy; @@ -3516,112 +3575,70 @@ void XclImpDffManager::ProcessShContainer( SvStream& rDffStrm, const DffRecordHe the pointer to the related draw object data (OBJ record) into pDrawObj. */ SdrObjectPtr xSdrObj( ImportObj( rDffStrm, &pDrawObj, aDummy, aDummy, 0, 0 ) ); if( pDrawObj && xSdrObj.is() ) - InsertSdrObject( GetSdrPage( pDrawObj->GetScTab() ), *pDrawObj, xSdrObj.release() ); + InsertSdrObject( GetConvData().mrSdrPage, *pDrawObj, xSdrObj.release() ); rShHeader.SeekToEndOfRecord( rDffStrm ); } -void XclImpDffManager::InsertSdrObject( SdrObjList* pObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj ) +void XclImpDffConverter::InsertSdrObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj ) { + XclImpDffConvData& rConvData = GetConvData(); /* Take ownership of the passed object. If insertion fails (e.g. rDrawObj - states to skip insertion, or missing draw page), the object is - automatically deleted. */ + states to skip insertion), the object is automatically deleted. */ SdrObjectPtr xSdrObj( pSdrObj ); - if( pObjList && xSdrObj.is() && rDrawObj.IsInsertSdrObj() ) - pObjList->NbcInsertObject( xSdrObj.release() ); - // SdrObject still here? Insertion failed, remove data from shape ID map. + if( xSdrObj.is() && rDrawObj.IsInsertSdrObj() ) + { + rObjList.NbcInsertObject( xSdrObj.release() ); + // callback to drawing manager for e.g. tracking of used sheet area + rConvData.mrDrawing.OnObjectInserted( rDrawObj ); + // callback to drawing object for post processing (use pSdrObj, xSdrObj already released) + rDrawObj.PostProcessSdrObject( *this, *pSdrObj ); + } + /* SdrObject still here? Insertion failed, remove data from shape ID map. + The SdrObject will be destructed then. */ if( xSdrObj.is() ) - maSolverCont.RemoveSdrObjectInfo( *xSdrObj ); + rConvData.maSolverCont.RemoveSdrObjectInfo( *xSdrObj ); } -void XclImpDffManager::SetCurrentForm( SCTAB nScTab ) +void XclImpDffConverter::InitControlForm() { - if( nScTab != mnCurrFormScTab ) - { - mxCurrForm.clear(); - mnCurrFormScTab = nScTab; + XclImpDffConvData& rConvData = GetConvData(); + if( rConvData.mbHasCtrlForm ) + return; - SdrPage* pSdrPage = GetSdrPage( nScTab ); - if( GetDocShell() && pSdrPage ) try + rConvData.mbHasCtrlForm = true; + if( SupportsOleObjects() ) try + { + Reference< XFormsSupplier > xFormsSupplier( rConvData.mrSdrPage.getUnoPage(), UNO_QUERY_THROW ); + Reference< XNameContainer > xFormsNC( xFormsSupplier->getForms(), UNO_SET_THROW ); + // find or create the Standard form used to insert the imported controls + if( xFormsNC->hasByName( maStdFormName ) ) { - Reference< XFormsSupplier > xFormsSupplier( pSdrPage->getUnoPage(), UNO_QUERY_THROW ); - Reference< XNameContainer > xFormsNC = xFormsSupplier->getForms(); - if( xFormsNC.is() ) - { - // find or create the Standard form used to insert the imported controls - OUString aFormName = CREATE_OUSTRING( "Standard" ); - if( xFormsNC->hasByName( aFormName ) ) - { - xFormsNC->getByName( aFormName ) >>= mxCurrForm; - } - else - { - mxCurrForm.set( ScfApiHelper::CreateInstance( GetDocShell(), CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW ); - xFormsNC->insertByName( aFormName, Any( mxCurrForm ) ); - } - } + xFormsNC->getByName( maStdFormName ) >>= rConvData.mxCtrlForm; } - catch( Exception& ) + else if( SfxObjectShell* pDocShell = GetDocShell() ) { + rConvData.mxCtrlForm.set( ScfApiHelper::CreateInstance( pDocShell, CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW ); + xFormsNC->insertByName( maStdFormName, Any( rConvData.mxCtrlForm ) ); } } -} - -void XclImpDffManager::UpdateUsedArea( const XclImpDrawObjBase& rDrawObj ) -{ - ScRange aScObjArea = rDrawObj.GetUsedArea(); - if( aScObjArea.IsValid() ) + catch( Exception& ) { - ScRange* pScTabArea = 0; - ScRangeMap::iterator aIt = maUsedAreaMap.find( rDrawObj.GetScTab() ); - if( aIt == maUsedAreaMap.end() ) - { - pScTabArea = &maUsedAreaMap[ rDrawObj.GetScTab() ]; - pScTabArea->SetInvalid(); - } - else - pScTabArea = &aIt->second; - - if( pScTabArea ) - pScTabArea->ExtendTo( aScObjArea ); } } -// The object manager ========================================================= +// Drawing manager ============================================================ -XclImpObjectManager::XclImpObjectManager( const XclImpRoot& rRoot ) : - XclImpRoot( rRoot ) +XclImpDrawing::XclImpDrawing( const XclImpRoot& rRoot, bool bOleObjects ) : + XclImpRoot( rRoot ), + mbOleObjs( bOleObjects ) { - maDefObjNames[ EXC_OBJTYPE_GROUP ] = CREATE_STRING( "Group" ); - maDefObjNames[ EXC_OBJTYPE_LINE ] = CREATE_STRING( "Line" ); - maDefObjNames[ EXC_OBJTYPE_RECTANGLE ] = CREATE_STRING( "Rectangle" ); - maDefObjNames[ EXC_OBJTYPE_OVAL ] = CREATE_STRING( "Oval" ); - maDefObjNames[ EXC_OBJTYPE_ARC ] = CREATE_STRING( "Arc" ); - maDefObjNames[ EXC_OBJTYPE_CHART ] = CREATE_STRING( "Chart" ); - maDefObjNames[ EXC_OBJTYPE_TEXT ] = CREATE_STRING( "Text" ); - maDefObjNames[ EXC_OBJTYPE_BUTTON ] = CREATE_STRING( "Button" ); - maDefObjNames[ EXC_OBJTYPE_PICTURE ] = CREATE_STRING( "Picture" ); - maDefObjNames[ EXC_OBJTYPE_POLYGON ] = CREATE_STRING( "Freeform" ); - maDefObjNames[ EXC_OBJTYPE_CHECKBOX ] = CREATE_STRING( "Check Box" ); - maDefObjNames[ EXC_OBJTYPE_OPTIONBUTTON ] = CREATE_STRING( "Option Button" ); - maDefObjNames[ EXC_OBJTYPE_EDIT ] = CREATE_STRING( "Edit Box" ); - maDefObjNames[ EXC_OBJTYPE_LABEL ] = CREATE_STRING( "Label" ); - maDefObjNames[ EXC_OBJTYPE_DIALOG ] = CREATE_STRING( "Dialog Frame" ); - maDefObjNames[ EXC_OBJTYPE_SPIN ] = CREATE_STRING( "Spinner" ); - maDefObjNames[ EXC_OBJTYPE_SCROLLBAR ] = CREATE_STRING( "Scroll Bar" ); - maDefObjNames[ EXC_OBJTYPE_LISTBOX ] = CREATE_STRING( "List Box" ); - maDefObjNames[ EXC_OBJTYPE_GROUPBOX ] = CREATE_STRING( "Group Box" ); - maDefObjNames[ EXC_OBJTYPE_DROPDOWN ] = CREATE_STRING( "Drop Down" ); - maDefObjNames[ EXC_OBJTYPE_NOTE ] = CREATE_STRING( "Comment" ); - maDefObjNames[ EXC_OBJTYPE_DRAWING ] = CREATE_STRING( "AutoShape" ); } -XclImpObjectManager::~XclImpObjectManager() +XclImpDrawing::~XclImpDrawing() { } -// *** Read Excel records *** ------------------------------------------------- - -Graphic XclImpObjectManager::ReadImgData( XclImpStream& rStrm ) // static helper +/*static*/ Graphic XclImpDrawing::ReadImgData( const XclImpRoot& rRoot, XclImpStream& rStrm ) { Graphic aGraphic; sal_uInt16 nFormat, nEnv; @@ -3631,33 +3648,33 @@ Graphic XclImpObjectManager::ReadImgData( XclImpStream& rStrm ) // static helper { switch( nFormat ) { - case EXC_IMGDATA_WMF: ReadWmf( aGraphic, rStrm ); break; - case EXC_IMGDATA_BMP: ReadBmp( aGraphic, rStrm ); break; - default: DBG_ERRORFILE( "XclImpObjectManager::ReadImgData - unknown image format" ); + case EXC_IMGDATA_WMF: ReadWmf( aGraphic, rRoot, rStrm ); break; + case EXC_IMGDATA_BMP: ReadBmp( aGraphic, rRoot, rStrm ); break; + default: DBG_ERRORFILE( "XclImpDrawing::ReadImgData - unknown image format" ); } } return aGraphic; } -void XclImpObjectManager::ReadObj( XclImpStream& rStrm ) +void XclImpDrawing::ReadObj( XclImpStream& rStrm ) { XclImpDrawObjRef xDrawObj; /* #i61786# In BIFF8 streams, OBJ records may occur without MSODRAWING records. In this case, the OBJ records are in BIFF5 format. Do a sanity check here that there is no DFF data loaded before. */ - DBG_ASSERT( maDffStrm.Tell() == 0, "XclImpObjectManager::ReadObj - unexpected DFF stream data, OBJ will be ignored" ); + DBG_ASSERT( maDffStrm.Tell() == 0, "XclImpDrawing::ReadObj - unexpected DFF stream data, OBJ will be ignored" ); if( maDffStrm.Tell() == 0 ) switch( GetBiff() ) { case EXC_BIFF3: - xDrawObj = XclImpDrawObjBase::ReadObj3( rStrm ); + xDrawObj = XclImpDrawObjBase::ReadObj3( GetRoot(), rStrm ); break; case EXC_BIFF4: - xDrawObj = XclImpDrawObjBase::ReadObj4( rStrm ); + xDrawObj = XclImpDrawObjBase::ReadObj4( GetRoot(), rStrm ); break; case EXC_BIFF5: case EXC_BIFF8: - xDrawObj = XclImpDrawObjBase::ReadObj5( rStrm ); + xDrawObj = XclImpDrawObjBase::ReadObj5( GetRoot(), rStrm ); break; default: DBG_ERROR_BIFF(); @@ -3672,30 +3689,11 @@ void XclImpObjectManager::ReadObj( XclImpStream& rStrm ) } } -void XclImpObjectManager::ReadMsoDrawingGroup( XclImpStream& rStrm ) -{ - DBG_ASSERT_BIFF( GetBiff() == EXC_BIFF8 ); - // Excel continues this record with MSODRAWINGGROUP and CONTINUE records, hmm. - rStrm.ResetRecord( true, EXC_ID_MSODRAWINGGROUP ); - ReadDffRecord( rStrm ); -} - -void XclImpObjectManager::ReadMsoDrawing( XclImpStream& rStrm ) +void XclImpDrawing::ReadMsoDrawing( XclImpStream& rStrm ) { DBG_ASSERT_BIFF( GetBiff() == EXC_BIFF8 ); // disable internal CONTINUE handling rStrm.ResetRecord( false ); - /* #i60510# real life: MSODRAWINGSELECTION record may contain garbage - - this makes it impossible to process the DFF stream in one run. - Store stream start position for every sheet separately, will be used - to seek the stream to these positions later, when processing the next - sheet. */ - size_t nTabIdx = static_cast< size_t >( GetCurrScTab() ); - if( nTabIdx >= maTabStrmPos.size() ) - { - maTabStrmPos.resize( nTabIdx, STREAM_SEEK_TO_END ); - maTabStrmPos.push_back( maDffStrm.Tell() ); - } // read leading MSODRAWING record ReadDffRecord( rStrm ); @@ -3725,36 +3723,7 @@ void XclImpObjectManager::ReadMsoDrawing( XclImpStream& rStrm ) rStrm.ResetRecord( true ); } -void XclImpObjectManager::ReadNote( XclImpStream& rStrm ) -{ - switch( GetBiff() ) - { - case EXC_BIFF2: - case EXC_BIFF3: - case EXC_BIFF4: - case EXC_BIFF5: - ReadNote3( rStrm ); - break; - case EXC_BIFF8: - ReadNote8( rStrm ); - break; - default: - DBG_ERROR_BIFF(); - } -} - -void XclImpObjectManager::ReadTabChart( XclImpStream& rStrm ) -{ - DBG_ASSERT_BIFF( GetBiff() >= EXC_BIFF5 ); - ScfRef< XclImpChartObj > xChartObj( new XclImpChartObj( GetRoot(), true ) ); - xChartObj->ReadChartSubStream( rStrm ); - // insert the chart as raw object without connected DFF data - maRawObjs.push_back( xChartObj ); -} - -// *** Drawing objects *** ---------------------------------------------------- - -XclImpDrawObjRef XclImpObjectManager::FindDrawObj( const DffRecordHeader& rHeader ) const +XclImpDrawObjRef XclImpDrawing::FindDrawObj( const DffRecordHeader& rHeader ) const { /* maObjMap stores objects by position of the client data (OBJ record) in the DFF stream, which is always behind shape start position of the @@ -3769,16 +3738,16 @@ XclImpDrawObjRef XclImpObjectManager::FindDrawObj( const DffRecordHeader& rHeade return xDrawObj; } -XclImpDrawObjRef XclImpObjectManager::FindDrawObj( const XclObjId& rObjId ) const +XclImpDrawObjRef XclImpDrawing::FindDrawObj( sal_uInt16 nObjId ) const { XclImpDrawObjRef xDrawObj; - XclImpObjMapById::const_iterator aIt = maObjMapId.find( rObjId ); + XclImpObjMapById::const_iterator aIt = maObjMapId.find( nObjId ); if( aIt != maObjMapId.end() ) xDrawObj = aIt->second; return xDrawObj; } -const XclImpObjTextData* XclImpObjectManager::FindTextData( const DffRecordHeader& rHeader ) const +const XclImpObjTextData* XclImpDrawing::FindTextData( const DffRecordHeader& rHeader ) const { /* maTextMap stores textbox data by position of the client data (TXO record) in the DFF stream, which is always behind shape start position @@ -3792,75 +3761,46 @@ const XclImpObjTextData* XclImpObjectManager::FindTextData( const DffRecordHeade return 0; } -void XclImpObjectManager::SetSkipObj( SCTAB nScTab, sal_uInt16 nObjId ) +void XclImpDrawing::SetSkipObj( sal_uInt16 nObjId ) { - maSkipObjs.push_back( XclObjId( nScTab, nObjId ) ); + maSkipObjs.push_back( nObjId ); } -// *** Drawing object conversion *** ------------------------------------------ - -XclImpDffManager& XclImpObjectManager::GetDffManager() +sal_Size XclImpDrawing::GetProgressSize() const { - if( !mxDffManager ) - mxDffManager.reset( new XclImpDffManager( GetRoot(), *this, maDffStrm ) ); - return *mxDffManager; + sal_Size nProgressSize = maRawObjs.GetProgressSize(); + for( XclImpObjMap::const_iterator aIt = maObjMap.begin(), aEnd = maObjMap.end(); aIt != aEnd; ++aIt ) + nProgressSize += aIt->second->GetProgressSize(); + return nProgressSize; } -void XclImpObjectManager::ConvertObjects() +void XclImpDrawing::ImplConvertObjects( XclImpDffConverter& rDffConv, SdrModel& rSdrModel, SdrPage& rSdrPage ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "sc", "dr104026", "XclImpObjectManager::ConvertObjects" ); - - // do nothing if the document does not contain a drawing layer - if( GetDoc().GetDrawLayer() ) - { - // process list of identifiers of objects to be skipped - for( XclObjIdVec::const_iterator aVIt = maSkipObjs.begin(), aVEnd = maSkipObjs.end(); aVIt != aVEnd; ++aVIt ) - if( XclImpDrawObjBase* pDrawObj = FindDrawObj( *aVIt ).get() ) - pDrawObj->SetProcessSdrObj( false ); - - // get progress bar size for all valid objects - sal_Size nProgressSize = GetProgressSize(); - if( nProgressSize > 0 ) - { - XclImpDffManager& rDffManager = GetDffManager(); - rDffManager.StartProgressBar( nProgressSize ); - // process drawing objects without DFF data - for( XclImpDrawObjVector::const_iterator aVIt = maRawObjs.begin(), aVEnd = maRawObjs.end(); aVIt != aVEnd; ++aVIt ) - rDffManager.ProcessObject( GetSdrPage( (*aVIt)->GetScTab() ), **aVIt ); - // process the global DFF container, contains pictures - if( !maTabStrmPos.empty() && (maTabStrmPos.front() > 0) ) - rDffManager.ProcessDrawingGroup( maDffStrm ); - // process the sheet records, this inserts the objects into the drawing layer - for( StreamPosVec::const_iterator aPIt = maTabStrmPos.begin(), aPEnd = maTabStrmPos.end(); aPIt != aPEnd; ++aPIt ) - if( *aPIt != STREAM_SEEK_TO_END ) - rDffManager.ProcessDrawing( maDffStrm, *aPIt ); - } - } - ScChartListenerCollection* pChartListeners = GetDoc().GetChartListenerCollection(); - if (pChartListeners && pChartListeners->GetCount()) - pChartListeners->SetDirty(); + // register this drawing manager at the passed (global) DFF manager + rDffConv.InitializeDrawing( *this, rSdrModel, rSdrPage ); + // process list of objects to be skipped + for( ScfUInt16Vec::const_iterator aIt = maSkipObjs.begin(), aEnd = maSkipObjs.end(); aIt != aEnd; ++aIt ) + if( XclImpDrawObjBase* pDrawObj = FindDrawObj( *aIt ).get() ) + pDrawObj->SetProcessSdrObj( false ); + // process drawing objects without DFF data + rDffConv.ProcessDrawing( maRawObjs ); + // process all objects in the DFF stream + rDffConv.ProcessDrawing( maDffStrm ); + // unregister this drawing manager at the passed (global) DFF manager + rDffConv.FinalizeDrawing(); } -String XclImpObjectManager::GetDefaultObjName( const XclImpDrawObjBase& rDrawObj ) const -{ - String aDefName; - DefObjNameMap::const_iterator aIt = maDefObjNames.find( rDrawObj.GetObjType() ); - if( aIt != maDefObjNames.end() ) - aDefName.Append( aIt->second ); - return aDefName.Append( sal_Unicode( ' ' ) ).Append( String::CreateFromInt32( rDrawObj.GetObjId().mnObjId ) ); -} +// protected ------------------------------------------------------------------ -ScRange XclImpObjectManager::GetUsedArea( SCTAB nScTab ) const +void XclImpDrawing::AppendRawObject( const XclImpDrawObjRef& rxDrawObj ) { - ScRange aScUsedArea( ScAddress::INITIALIZE_INVALID ); - if( mxDffManager.is() ) - aScUsedArea = mxDffManager->GetUsedArea( nScTab ); - return aScUsedArea; + DBG_ASSERT( rxDrawObj.is(), "XclImpDrawing::AppendRawObject - unexpected empty reference" ); + maRawObjs.push_back( rxDrawObj ); } // private -------------------------------------------------------------------- -void XclImpObjectManager::ReadWmf( Graphic& rGraphic, XclImpStream& rStrm ) // static helper +void XclImpDrawing::ReadWmf( Graphic& rGraphic, const XclImpRoot&, XclImpStream& rStrm ) // static helper { // extract graphic data from IMGDATA and following CONTINUE records rStrm.Ignore( 8 ); @@ -3873,7 +3813,7 @@ void XclImpObjectManager::ReadWmf( Graphic& rGraphic, XclImpStream& rStrm ) // s rGraphic = aGDIMetaFile; } -void XclImpObjectManager::ReadBmp( Graphic& rGraphic, XclImpStream& rStrm ) // static helper +void XclImpDrawing::ReadBmp( Graphic& rGraphic, const XclImpRoot& rRoot, XclImpStream& rStrm ) // static helper { // extract graphic data from IMGDATA and following CONTINUE records SvMemoryStream aMemStrm; @@ -3883,7 +3823,7 @@ void XclImpObjectManager::ReadBmp( Graphic& rGraphic, XclImpStream& rStrm ) // s pixel depth = 32 bit. After that, 3 unused bytes are added before the actual pixel data. This does even confuse Excel 5 and later, which cannot read the image data correctly. */ - if( rStrm.GetRoot().GetBiff() <= EXC_BIFF4 ) + if( rRoot.GetBiff() <= EXC_BIFF4 ) { rStrm.PushPosition(); sal_uInt32 nHdrSize; @@ -3910,21 +3850,21 @@ void XclImpObjectManager::ReadBmp( Graphic& rGraphic, XclImpStream& rStrm ) // s rGraphic = aBitmap; } -void XclImpObjectManager::ReadDffRecord( XclImpStream& rStrm ) +void XclImpDrawing::ReadDffRecord( XclImpStream& rStrm ) { maDffStrm.Seek( STREAM_SEEK_TO_END ); rStrm.CopyRecordToStream( maDffStrm ); } -void XclImpObjectManager::ReadObj8( XclImpStream& rStrm ) +void XclImpDrawing::ReadObj8( XclImpStream& rStrm ) { - XclImpDrawObjRef xDrawObj = XclImpDrawObjBase::ReadObj8( rStrm ); + XclImpDrawObjRef xDrawObj = XclImpDrawObjBase::ReadObj8( GetRoot(), rStrm ); // store the new object in the internal containers maObjMap[ maDffStrm.Tell() ] = xDrawObj; maObjMapId[ xDrawObj->GetObjId() ] = xDrawObj; } -void XclImpObjectManager::ReadTxo( XclImpStream& rStrm ) +void XclImpDrawing::ReadTxo( XclImpStream& rStrm ) { XclImpObjTextRef xTextData( new XclImpObjTextData ); maTextMap[ maDffStrm.Tell() ] = xTextData; @@ -3938,7 +3878,7 @@ void XclImpObjectManager::ReadTxo( XclImpStream& rStrm ) if( xTextData->maData.mnTextLen > 0 ) { bValid = (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord(); - DBG_ASSERT( bValid, "XclImpObjectManager::ReadTxo - missing CONTINUE record" ); + DBG_ASSERT( bValid, "XclImpDrawing::ReadTxo - missing CONTINUE record" ); if( bValid ) xTextData->mxString.reset( new XclImpString( rStrm.ReadUniString( xTextData->maData.mnTextLen ) ) ); } @@ -3947,21 +3887,78 @@ void XclImpObjectManager::ReadTxo( XclImpStream& rStrm ) if( xTextData->maData.mnFormatSize > 0 ) { bValid = (rStrm.GetNextRecId() == EXC_ID_CONT) && rStrm.StartNextRecord(); - DBG_ASSERT( bValid, "XclImpObjectManager::ReadTxo - missing CONTINUE record" ); + DBG_ASSERT( bValid, "XclImpDrawing::ReadTxo - missing CONTINUE record" ); if( bValid ) xTextData->ReadFormats( rStrm ); } } -void XclImpObjectManager::ReadNote3( XclImpStream& rStrm ) +// ---------------------------------------------------------------------------- + +XclImpSheetDrawing::XclImpSheetDrawing( const XclImpRoot& rRoot, SCTAB nScTab ) : + XclImpDrawing( rRoot, true ), + maScUsedArea( ScAddress::INITIALIZE_INVALID ) +{ + maScUsedArea.aStart.SetTab( nScTab ); + maScUsedArea.aEnd.SetTab( nScTab ); +} + +void XclImpSheetDrawing::ReadNote( XclImpStream& rStrm ) +{ + switch( GetBiff() ) + { + case EXC_BIFF2: + case EXC_BIFF3: + case EXC_BIFF4: + case EXC_BIFF5: + ReadNote3( rStrm ); + break; + case EXC_BIFF8: + ReadNote8( rStrm ); + break; + default: + DBG_ERROR_BIFF(); + } +} + +void XclImpSheetDrawing::ReadTabChart( XclImpStream& rStrm ) +{ + DBG_ASSERT_BIFF( GetBiff() >= EXC_BIFF5 ); + ScfRef< XclImpChartObj > xChartObj( new XclImpChartObj( GetRoot(), true ) ); + xChartObj->ReadChartSubStream( rStrm ); + // insert the chart as raw object without connected DFF data + AppendRawObject( xChartObj ); +} + +void XclImpSheetDrawing::ConvertObjects( XclImpDffConverter& rDffConv ) +{ + if( SdrModel* pSdrModel = GetDoc().GetDrawLayer() ) + if( SdrPage* pSdrPage = GetSdrPage( maScUsedArea.aStart.Tab() ) ) + ImplConvertObjects( rDffConv, *pSdrModel, *pSdrPage ); +} + +Rectangle XclImpSheetDrawing::CalcAnchorRect( const XclObjAnchor& rAnchor, bool /*bDffAnchor*/ ) const +{ + return rAnchor.GetRect( GetDoc(), maScUsedArea.aStart.Tab(), MAP_100TH_MM ); +} + +void XclImpSheetDrawing::OnObjectInserted( const XclImpDrawObjBase& rDrawObj ) +{ + ScRange aScObjArea = rDrawObj.GetUsedArea( maScUsedArea.aStart.Tab() ); + if( aScObjArea.IsValid() ) + maScUsedArea.ExtendTo( aScObjArea ); +} + +// private -------------------------------------------------------------------- + +void XclImpSheetDrawing::ReadNote3( XclImpStream& rStrm ) { XclAddress aXclPos; sal_uInt16 nTotalLen; rStrm >> aXclPos >> nTotalLen; - SCTAB nScTab = GetCurrScTab(); ScAddress aScNotePos( ScAddress::UNINITIALIZED ); - if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, nScTab, true ) ) + if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, maScUsedArea.aStart.Tab(), true ) ) { sal_uInt16 nPartLen = ::std::min( nTotalLen, static_cast< sal_uInt16 >( rStrm.GetRecLeft() ) ); String aNoteText = rStrm.ReadRawByteString( nPartLen ); @@ -3988,33 +3985,117 @@ void XclImpObjectManager::ReadNote3( XclImpStream& rStrm ) } } -void XclImpObjectManager::ReadNote8( XclImpStream& rStrm ) +void XclImpSheetDrawing::ReadNote8( XclImpStream& rStrm ) { XclAddress aXclPos; sal_uInt16 nFlags, nObjId; rStrm >> aXclPos >> nFlags >> nObjId; - SCTAB nScTab = GetCurrScTab(); ScAddress aScNotePos( ScAddress::UNINITIALIZED ); - if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, nScTab, true ) ) + if( GetAddressConverter().ConvertAddress( aScNotePos, aXclPos, maScUsedArea.aStart.Tab(), true ) ) if( nObjId != EXC_OBJ_INVALID_ID ) - if( XclImpNoteObj* pNoteObj = dynamic_cast< XclImpNoteObj* >( FindDrawObj( XclObjId( nScTab, nObjId ) ).get() ) ) + if( XclImpNoteObj* pNoteObj = dynamic_cast< XclImpNoteObj* >( FindDrawObj( nObjId ).get() ) ) pNoteObj->SetNoteData( aScNotePos, nFlags ); } -sal_Size XclImpObjectManager::GetProgressSize() const +// The object manager ========================================================= + +XclImpObjectManager::XclImpObjectManager( const XclImpRoot& rRoot ) : + XclImpRoot( rRoot ) { - sal_Size nProgressSize = maRawObjs.GetProgressSize(); - for( XclImpObjMap::const_iterator aMIt = maObjMap.begin(), aMEnd = maObjMap.end(); aMIt != aMEnd; ++aMIt ) - nProgressSize += aMIt->second->GetProgressSize(); - return nProgressSize; + maDefObjNames[ EXC_OBJTYPE_GROUP ] = CREATE_STRING( "Group" ); + maDefObjNames[ EXC_OBJTYPE_LINE ] = CREATE_STRING( "Line" ); + maDefObjNames[ EXC_OBJTYPE_RECTANGLE ] = CREATE_STRING( "Rectangle" ); + maDefObjNames[ EXC_OBJTYPE_OVAL ] = CREATE_STRING( "Oval" ); + maDefObjNames[ EXC_OBJTYPE_ARC ] = CREATE_STRING( "Arc" ); + maDefObjNames[ EXC_OBJTYPE_CHART ] = CREATE_STRING( "Chart" ); + maDefObjNames[ EXC_OBJTYPE_TEXT ] = CREATE_STRING( "Text" ); + maDefObjNames[ EXC_OBJTYPE_BUTTON ] = CREATE_STRING( "Button" ); + maDefObjNames[ EXC_OBJTYPE_PICTURE ] = CREATE_STRING( "Picture" ); + maDefObjNames[ EXC_OBJTYPE_POLYGON ] = CREATE_STRING( "Freeform" ); + maDefObjNames[ EXC_OBJTYPE_CHECKBOX ] = CREATE_STRING( "Check Box" ); + maDefObjNames[ EXC_OBJTYPE_OPTIONBUTTON ] = CREATE_STRING( "Option Button" ); + maDefObjNames[ EXC_OBJTYPE_EDIT ] = CREATE_STRING( "Edit Box" ); + maDefObjNames[ EXC_OBJTYPE_LABEL ] = CREATE_STRING( "Label" ); + maDefObjNames[ EXC_OBJTYPE_DIALOG ] = CREATE_STRING( "Dialog Frame" ); + maDefObjNames[ EXC_OBJTYPE_SPIN ] = CREATE_STRING( "Spinner" ); + maDefObjNames[ EXC_OBJTYPE_SCROLLBAR ] = CREATE_STRING( "Scroll Bar" ); + maDefObjNames[ EXC_OBJTYPE_LISTBOX ] = CREATE_STRING( "List Box" ); + maDefObjNames[ EXC_OBJTYPE_GROUPBOX ] = CREATE_STRING( "Group Box" ); + maDefObjNames[ EXC_OBJTYPE_DROPDOWN ] = CREATE_STRING( "Drop Down" ); + maDefObjNames[ EXC_OBJTYPE_NOTE ] = CREATE_STRING( "Comment" ); + maDefObjNames[ EXC_OBJTYPE_DRAWING ] = CREATE_STRING( "AutoShape" ); +} + +XclImpObjectManager::~XclImpObjectManager() +{ +} + +void XclImpObjectManager::ReadMsoDrawingGroup( XclImpStream& rStrm ) +{ + DBG_ASSERT_BIFF( GetBiff() == EXC_BIFF8 ); + // Excel continues this record with MSODRAWINGGROUP and CONTINUE records, hmm. + rStrm.ResetRecord( true, EXC_ID_MSODRAWINGGROUP ); + maDggStrm.Seek( STREAM_SEEK_TO_END ); + rStrm.CopyRecordToStream( maDggStrm ); +} + +XclImpSheetDrawing& XclImpObjectManager::GetSheetDrawing( SCTAB nScTab ) +{ + XclImpSheetDrawingRef& rxDrawing = maSheetDrawings[ nScTab ]; + if( !rxDrawing ) + rxDrawing.reset( new XclImpSheetDrawing( GetRoot(), nScTab ) ); + return *rxDrawing; +} + +void XclImpObjectManager::ConvertObjects() +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "sc", "dr104026", "XclImpObjectManager::ConvertObjects" ); + + // do nothing if the document does not contain a drawing layer + if( !GetDoc().GetDrawLayer() ) + return; + + // get total progress bar size for all sheet drawing managers + sal_Size nProgressSize = 0; + for( XclImpSheetDrawingMap::iterator aIt = maSheetDrawings.begin(), aEnd = maSheetDrawings.end(); aIt != aEnd; ++aIt ) + nProgressSize += aIt->second->GetProgressSize(); + // nothing to do if progress bar is zero (no objects present) + if( nProgressSize == 0 ) + return; + + XclImpDffConverter aDffConv( GetRoot(), maDggStrm ); + aDffConv.StartProgressBar( nProgressSize ); + for( XclImpSheetDrawingMap::iterator aIt = maSheetDrawings.begin(), aEnd = maSheetDrawings.end(); aIt != aEnd; ++aIt ) + aIt->second->ConvertObjects( aDffConv ); + + ScChartListenerCollection* pChartListeners = GetDoc().GetChartListenerCollection(); + if( pChartListeners && (pChartListeners->GetCount() > 0) ) + pChartListeners->SetDirty(); +} + +String XclImpObjectManager::GetDefaultObjName( const XclImpDrawObjBase& rDrawObj ) const +{ + String aDefName; + DefObjNameMap::const_iterator aIt = maDefObjNames.find( rDrawObj.GetObjType() ); + if( aIt != maDefObjNames.end() ) + aDefName.Append( aIt->second ); + return aDefName.Append( sal_Unicode( ' ' ) ).Append( String::CreateFromInt32( rDrawObj.GetObjId() ) ); +} + +ScRange XclImpObjectManager::GetUsedArea( SCTAB nScTab ) const +{ + XclImpSheetDrawingMap::const_iterator aIt = maSheetDrawings.find( nScTab ); + if( aIt != maSheetDrawings.end() ) + return aIt->second->GetUsedArea(); + return ScRange( ScAddress::INITIALIZE_INVALID ); } // DFF property set helper ==================================================== XclImpDffPropSet::XclImpDffPropSet( const XclImpRoot& rRoot ) : XclImpRoot( rRoot ), - maDffManager( rRoot, maDummyStrm ) + maDffConv( rRoot, maDummyStrm ) { } @@ -4030,18 +4111,18 @@ void XclImpDffPropSet::Read( XclImpStream& rStrm ) mxMemStrm.reset( new SvMemoryStream ); rStrm.CopyToStream( *mxMemStrm, 8 + nPropSetSize ); mxMemStrm->Seek( STREAM_SEEK_TO_BEGIN ); - maDffManager.ReadPropSet( *mxMemStrm, 0 ); + maDffConv.ReadPropSet( *mxMemStrm, 0 ); } sal_uInt32 XclImpDffPropSet::GetPropertyValue( sal_uInt16 nPropId, sal_uInt32 nDefault ) const { - return maDffManager.GetPropertyValue( nPropId, nDefault ); + return maDffConv.GetPropertyValue( nPropId, nDefault ); } void XclImpDffPropSet::FillToItemSet( SfxItemSet& rItemSet ) const { if( mxMemStrm.get() ) - maDffManager.ApplyAttributes( *mxMemStrm, rItemSet ); + maDffConv.ApplyAttributes( *mxMemStrm, rItemSet ); } XclImpStream& operator>>( XclImpStream& rStrm, XclImpDffPropSet& rPropSet ) diff --git a/sc/source/filter/excel/xipage.cxx b/sc/source/filter/excel/xipage.cxx index 696f0e764..7013d4062 100644 --- a/sc/source/filter/excel/xipage.cxx +++ b/sc/source/filter/excel/xipage.cxx @@ -168,7 +168,7 @@ void XclImpPageSettings::ReadPrintGridLines( XclImpStream& rStrm ) void XclImpPageSettings::ReadImgData( XclImpStream& rStrm ) { - Graphic aGraphic = XclImpObjectManager::ReadImgData( rStrm ); + Graphic aGraphic = XclImpDrawing::ReadImgData( GetRoot(), rStrm ); if( aGraphic.GetType() != GRAPHIC_NONE ) maData.mxBrushItem.reset( new SvxBrushItem( aGraphic, GPOS_TILED, ATTR_BACKGROUND ) ); } diff --git a/sc/source/filter/excel/xipivot.cxx b/sc/source/filter/excel/xipivot.cxx index ba4654485..df39312ba 100644 --- a/sc/source/filter/excel/xipivot.cxx +++ b/sc/source/filter/excel/xipivot.cxx @@ -1311,7 +1311,7 @@ void XclImpPivotTable::ReadSxpi( XclImpStream& rStrm ) maPageFields.push_back( aPageInfo.mnField ); pField->SetPageFieldInfo( aPageInfo ); } - GetObjectManager().SetSkipObj( GetCurrScTab(), aPageInfo.mnObjId ); + GetCurrSheetDrawing().SetSkipObj( aPageInfo.mnObjId ); } } diff --git a/sc/source/filter/excel/xiroot.cxx b/sc/source/filter/excel/xiroot.cxx index eaea0bfff..286ed16e5 100644 --- a/sc/source/filter/excel/xiroot.cxx +++ b/sc/source/filter/excel/xiroot.cxx @@ -206,6 +206,12 @@ XclImpObjectManager& XclImpRoot::GetObjectManager() const return *mrImpData.mxObjMgr; } +XclImpSheetDrawing& XclImpRoot::GetCurrSheetDrawing() const +{ + DBG_ASSERT( !IsInGlobals(), "XclImpRoot::GetCurrSheetDrawing - must not be called from workbook globals" ); + return mrImpData.mxObjMgr->GetSheetDrawing( GetCurrScTab() ); +} + XclImpCondFormatManager& XclImpRoot::GetCondFormatManager() const { DBG_ASSERT( mrImpData.mxCondFmtMgr.is(), "XclImpRoot::GetCondFormatManager - invalid call, wrong BIFF" ); diff --git a/sc/source/filter/excel/xlchart.cxx b/sc/source/filter/excel/xlchart.cxx index 0092fcc7b..93dbbd9f8 100644 --- a/sc/source/filter/excel/xlchart.cxx +++ b/sc/source/filter/excel/xlchart.cxx @@ -308,7 +308,7 @@ XclChTypeGroup::XclChTypeGroup() : // ---------------------------------------------------------------------------- XclChProperties::XclChProperties() : - mnFlags( EXC_CHPROPS_MANSERIES ), + mnFlags( 0 ), mnEmptyMode( EXC_CHPROPS_EMPTY_SKIP ) { } @@ -988,8 +988,8 @@ void XclChPropSetHelper::ReadLegendProperties( XclChLegend& rLegend, const ScfPr cssc::RelativePosition aRelPos; if( aRelPosAny >>= aRelPos ) { - rLegend.maRect.mnX = limit_cast< sal_Int32 >( aRelPos.Primary * 4000.0, 0, 4000 ); - rLegend.maRect.mnY = limit_cast< sal_Int32 >( aRelPos.Secondary * 4000.0, 0, 4000 ); + rLegend.maRect.mnX = limit_cast< sal_Int32 >( aRelPos.Primary * EXC_CHART_UNIT, 0, EXC_CHART_UNIT ); + rLegend.maRect.mnY = limit_cast< sal_Int32 >( aRelPos.Secondary * EXC_CHART_UNIT, 0, EXC_CHART_UNIT ); } else rLegend.mnDockMode = EXC_CHLEGEND_LEFT; @@ -1240,8 +1240,8 @@ void XclChPropSetHelper::WriteLegendProperties( eApiExpand = cssc::LegendExpansion_BALANCED; // set position cssc::RelativePosition aRelPos; - aRelPos.Primary = rLegend.maRect.mnX / 4000.0; - aRelPos.Secondary = rLegend.maRect.mnY / 4000.0; + aRelPos.Primary = static_cast< double >( rLegend.maRect.mnX ) / EXC_CHART_UNIT; + aRelPos.Secondary = static_cast< double >( rLegend.maRect.mnY ) / EXC_CHART_UNIT; aRelPos.Anchor = cssd::Alignment_TOP_LEFT; aRelPosAny <<= aRelPos; } diff --git a/sc/source/filter/excel/xlescher.cxx b/sc/source/filter/excel/xlescher.cxx index 2dbbd72e6..026673e5c 100644 --- a/sc/source/filter/excel/xlescher.cxx +++ b/sc/source/filter/excel/xlescher.cxx @@ -159,12 +159,16 @@ void lclMirrorRectangle( Rectangle& rRect ) rRect.Right() = -nLeft; } +sal_uInt16 lclGetEmbeddedScale( long nPageSize, sal_Int32 nPageScale, long nPos, double fPosScale ) +{ + return static_cast< sal_uInt16 >( nPos * fPosScale / nPageSize * nPageScale + 0.5 ); +} + } // namespace // ---------------------------------------------------------------------------- -XclObjAnchor::XclObjAnchor( SCTAB nScTab ) : - mnScTab( nScTab ), +XclObjAnchor::XclObjAnchor() : mnLX( 0 ), mnTY( 0 ), mnRX( 0 ), @@ -172,35 +176,61 @@ XclObjAnchor::XclObjAnchor( SCTAB nScTab ) : { } -Rectangle XclObjAnchor::GetRect( ScDocument& rDoc, MapUnit eMapUnit ) const +Rectangle XclObjAnchor::GetRect( ScDocument& rDoc, SCTAB nScTab, MapUnit eMapUnit ) const { double fScale = lclGetTwipsScale( eMapUnit ); Rectangle aRect( - lclGetXFromCol( rDoc, mnScTab, maFirst.mnCol, mnLX, fScale ), - lclGetYFromRow( rDoc, mnScTab, maFirst.mnRow, mnTY, fScale ), - lclGetXFromCol( rDoc, mnScTab, maLast.mnCol, mnRX + 1, fScale ), - lclGetYFromRow( rDoc, mnScTab, maLast.mnRow, mnBY, fScale ) ); + lclGetXFromCol( rDoc, nScTab, maFirst.mnCol, mnLX, fScale ), + lclGetYFromRow( rDoc, nScTab, maFirst.mnRow, mnTY, fScale ), + lclGetXFromCol( rDoc, nScTab, maLast.mnCol, mnRX + 1, fScale ), + lclGetYFromRow( rDoc, nScTab, maLast.mnRow, mnBY, fScale ) ); // #106948# adjust coordinates in mirrored sheets - if( rDoc.IsLayoutRTL( mnScTab ) ) + if( rDoc.IsLayoutRTL( nScTab ) ) lclMirrorRectangle( aRect ); return aRect; } -void XclObjAnchor::SetRect( ScDocument& rDoc, const Rectangle& rRect, MapUnit eMapUnit ) +void XclObjAnchor::SetRect( ScDocument& rDoc, SCTAB nScTab, const Rectangle& rRect, MapUnit eMapUnit ) { Rectangle aRect( rRect ); // #106948# adjust coordinates in mirrored sheets - if( rDoc.IsLayoutRTL( mnScTab ) ) + if( rDoc.IsLayoutRTL( nScTab ) ) lclMirrorRectangle( aRect ); double fScale = lclGetTwipsScale( eMapUnit ); long nDummy = 0; - lclGetColFromX( rDoc, mnScTab, maFirst.mnCol, mnLX, 0, nDummy, aRect.Left(), fScale ); - lclGetColFromX( rDoc, mnScTab, maLast.mnCol, mnRX, maFirst.mnCol, nDummy, aRect.Right(), fScale ); + lclGetColFromX( rDoc, nScTab, maFirst.mnCol, mnLX, 0, nDummy, aRect.Left(), fScale ); + lclGetColFromX( rDoc, nScTab, maLast.mnCol, mnRX, maFirst.mnCol, nDummy, aRect.Right(), fScale ); nDummy = 0; - lclGetRowFromY( rDoc, mnScTab, maFirst.mnRow, mnTY, 0, nDummy, aRect.Top(), fScale ); - lclGetRowFromY( rDoc, mnScTab, maLast.mnRow, mnBY, maFirst.mnRow, nDummy, aRect.Bottom(), fScale ); + lclGetRowFromY( rDoc, nScTab, maFirst.mnRow, mnTY, 0, nDummy, aRect.Top(), fScale ); + lclGetRowFromY( rDoc, nScTab, maLast.mnRow, mnBY, maFirst.mnRow, nDummy, aRect.Bottom(), fScale ); +} + +void XclObjAnchor::SetRect( const Size& rPageSize, sal_Int32 nScaleX, sal_Int32 nScaleY, + const Rectangle& rRect, MapUnit eMapUnit, bool bDffAnchor ) +{ + double fScale = 1.0; + switch( eMapUnit ) + { + case MAP_TWIP: fScale = HMM_PER_TWIPS; break; // Calc twips -> 1/100mm + case MAP_100TH_MM: fScale = 1.0; break; // Calc 1/100mm -> 1/100mm + default: DBG_ERRORFILE( "XclObjAnchor::SetRect - map unit not implemented" ); + } + + /* In objects with DFF client anchor, the position of the shape is stored + in the cell address components of the client anchor. In old BIFF3-BIFF5 + objects, the position is stored in the offset components of the anchor. */ + (bDffAnchor ? maFirst.mnCol : mnLX) = lclGetEmbeddedScale( rPageSize.Width(), nScaleX, rRect.Left(), fScale ); + (bDffAnchor ? maFirst.mnRow : mnTY) = lclGetEmbeddedScale( rPageSize.Height(), nScaleY, rRect.Top(), fScale ); + (bDffAnchor ? maLast.mnCol : mnRX) = lclGetEmbeddedScale( rPageSize.Width(), nScaleX, rRect.Right(), fScale ); + (bDffAnchor ? maLast.mnRow : mnBY) = lclGetEmbeddedScale( rPageSize.Height(), nScaleY, rRect.Bottom(), fScale ); + + // for safety, clear the other members + if( bDffAnchor ) + mnLX = mnTY = mnRX = mnBY = 0; + else + Set( 0, 0, 0, 0 ); } // ---------------------------------------------------------------------------- diff --git a/sc/source/filter/inc/root.hxx b/sc/source/filter/inc/root.hxx index d4cd54c2f..0e1551c8c 100644 --- a/sc/source/filter/inc/root.hxx +++ b/sc/source/filter/inc/root.hxx @@ -52,9 +52,6 @@ class _ScRangeListTabs; class XclExpChTrTabId; class XclExpUserBViewList; -class XclObjList; -class XclEscher; - class XclImpRoot; class XclExpRoot; @@ -78,10 +75,6 @@ struct RootData // -> Inkarnation jeweils im ImportExcel-Objekt! XclExpChTrTabId* pTabId; // pointer to rec list, do not destroy XclExpUserBViewList* pUserBViewList; // pointer to rec list, do not destroy - // Biff8 - XclObjList* pObjRecs; - XclEscher* pEscher; - XclImpRoot* pIR; XclExpRoot* pER; diff --git a/sc/source/filter/inc/xcl97esc.hxx b/sc/source/filter/inc/xcl97esc.hxx index 5a9e2fe06..e40e3f101 100644 --- a/sc/source/filter/inc/xcl97esc.hxx +++ b/sc/source/filter/inc/xcl97esc.hxx @@ -28,9 +28,10 @@ #ifndef SC_XCL97ESC_HXX #define SC_XCL97ESC_HXX -#include <filter/msfilter/escherex.hxx> +#include <memory> #include <tools/table.hxx> #include <tools/stack.hxx> +#include <filter/msfilter/escherex.hxx> #include "xlescher.hxx" #include "xeroot.hxx" @@ -39,10 +40,28 @@ namespace utl { class TempFile; } -// --- class XclEscherEx --------------------------------------------- +// ============================================================================ class SvStream; + +class XclEscherExGlobal : public EscherExGlobal, protected XclExpRoot +{ +public: + explicit XclEscherExGlobal( const XclExpRoot& rRoot ); + +private: + /** Overloaded to create a new temporary file and return its stream. */ + virtual SvStream* ImplQueryPictureStream(); + +private: + ::std::auto_ptr< ::utl::TempFile > mxPicTempFile; + ::std::auto_ptr< SvStream > mxPicStrm; +}; + +// ============================================================================ + class XclObj; +class XclExpDffAnchorBase; class XclEscherHostAppData; class XclEscherClientData; class XclEscherClientTextbox; @@ -54,56 +73,56 @@ class XclExpTbxControlObj; class XclEscherEx : public EscherEx, protected XclExpRoot { -private: - List aOffsetMap; - Stack aStack; - utl::TempFile* pPicTempFile; - SvStream* pPicStrm; - XclObj* pCurrXclObj; - XclEscherHostAppData* pCurrAppData; - XclEscherClientData* pTheClientData; // always the same - XclEscherClientTextbox* pAdditionalText; - USHORT nAdditionalText; - - void DeleteCurrAppData(); - public: - XclEscherEx( const XclExpRoot& rRoot, SvStream& rStrm, UINT32 nDrawings ); - virtual ~XclEscherEx(); - - /// maintains OffsetMap - virtual void InsertAtCurrentPos( UINT32 nBytes, BOOL bCont = FALSE ); - - virtual SvStream* QueryPicStream(); - virtual EscherExHostAppData* StartShape( const com::sun::star::uno::Reference< - com::sun::star::drawing::XShape>& rShape ); + explicit XclEscherEx( + const XclExpRoot& rRoot, + XclExpObjectManager& rObjMgr, + SvStream& rStrm, + const XclEscherEx* pParent = 0 ); + virtual ~XclEscherEx(); + + /** Called by MSODRAWING record constructors to initialize the DFF stream + fragment they will own. returns the DFF fragment identifier. */ + sal_uInt32 InitNextDffFragment(); + /** Called after some data has been written to the DFF stream, to update + the end position of the DFF fragment owned by an MSODRAWING record. */ + void UpdateDffFragmentEnd(); + + /** Returns the position of the specified DFF stream fragment. */ + sal_uInt32 GetDffFragmentPos( sal_uInt32 nFragmentKey ); + /** Returns the size of the specified DFF stream fragment. */ + sal_uInt32 GetDffFragmentSize( sal_uInt32 nFragmentKey ); + /** Returns true, if there is more data left in the DFF stream than owned + by the last MSODRAWING record. */ + bool HasPendingDffData(); + + /** Creates a new DFF client anchor object and calculates the anchor + position of the passed object. Caller takes ownership! */ + XclExpDffAnchorBase* CreateDffAnchor( const SdrObject& rSdrObj ) const; + + virtual EscherExHostAppData* StartShape( + const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>& rxShape, + const Rectangle* pChildAnchor ); virtual void EndShape( UINT16 nShapeType, UINT32 nShapeID ); virtual EscherExHostAppData* EnterAdditionalTextGroup(); - /// appends stream offset to list and returns position in list - ULONG AddCurrentOffsetToMap(); - /// replaces position in list with current stream offset - void ReplaceCurrentOffsetInMap( ULONG nPos ); - /// returns stream offset for position in list - inline ULONG GetOffsetFromMap( ULONG nPos ) const; - /// last position in list (count-1) - inline ULONG GetLastOffsetMapPos() const; - /// Flush and merge PicStream into EscherStream void EndDocument(); #if EXC_EXP_OCX_CTRL /** Creates an OCX form control OBJ record from the passed form control. @descr Writes the form control data to the 'Ctls' stream. */ - XclExpOcxControlObj* CreateCtrlObj( ::com::sun::star::uno::Reference< - ::com::sun::star::drawing::XShape > xShape ); + XclExpOcxControlObj* CreateCtrlObj( + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); private: SotStorageStreamRef mxCtlsStrm; /// The 'Ctls' stream. #else /** Creates a TBX form control OBJ record from the passed form control. */ - XclExpTbxControlObj* CreateCtrlObj( ::com::sun::star::uno::Reference< - ::com::sun::star::drawing::XShape > xShape ); + XclExpTbxControlObj* CreateCtrlObj( + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); private: /** Tries to get the name of a Basic macro from a control. */ @@ -112,43 +131,21 @@ private: ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > xCtrlModel ); #endif -}; - - -inline ULONG XclEscherEx::GetOffsetFromMap( ULONG nPos ) const -{ - return (ULONG) aOffsetMap.GetObject( nPos ); -} - - -inline ULONG XclEscherEx::GetLastOffsetMapPos() const -{ - return aOffsetMap.Count() - 1; -} - - -// --- class XclEscher ----------------------------------------------- -struct RootData; + void DeleteCurrAppData(); -class XclEscher : protected XclExpRoot -{ private: - utl::TempFile* pTempFile; - SvStream* pStrm; - XclEscherEx* pEx; - -public: - XclEscher( const XclExpRoot& rRoot, UINT32 nDrawings ); - ~XclEscher(); - - inline XclEscherEx* GetEx() const { return pEx; } - inline SvStream& GetStrm() const { return *pStrm; } - - void AddSdrPage(); + XclExpObjectManager& mrObjMgr; + Stack aStack; + XclObj* pCurrXclObj; + XclEscherHostAppData* pCurrAppData; + XclEscherClientData* pTheClientData; // always the same + XclEscherClientTextbox* pAdditionalText; + USHORT nAdditionalText; + sal_uInt32 mnNextKey; + bool mbIsRootDff; }; - // --- class XclEscherHostAppData ------------------------------------ class XclEscherHostAppData : public EscherExHostAppData @@ -164,55 +161,6 @@ public: }; -// DFF client anchor ========================================================== - -class Rectangle; -class SdrObject; -class ScAddress; - -/** Represents the position (anchor) of an object in a Calc document. */ -class XclExpDffAnchor : public EscherExClientAnchor_Base, protected XclExpRoot -{ -public: - /** Constructs a dummy client anchor. */ - explicit XclExpDffAnchor( const XclExpRoot& rRoot, sal_uInt16 nFlags = 0 ); - /** Constructs a client anchor directly from an SdrObject. */ - explicit XclExpDffAnchor( const XclExpRoot& rRoot, const SdrObject& rSdrObj ); - - /** Sets the flags according to the passed SdrObject. */ - void SetFlags( const SdrObject& rSdrObj ); - - /** Called from SVX Escher exporter. - @param rRect The object anchor rectangle to be exported (in twips). */ - virtual void WriteData( EscherEx& rEx, const Rectangle& rRect ); - - /** Writes the anchor structure with the current anchor position. */ - void WriteData( EscherEx& rEx ) const; - -protected: // for access in derived classes - XclObjAnchor maAnchor; /// The client anchor data. - sal_uInt16 mnFlags; /// Flags for DFF stream export. -}; - -// ---------------------------------------------------------------------------- - -/** Represents the position (anchor) of a note object. */ -class XclExpDffNoteAnchor : public XclExpDffAnchor -{ -public: - explicit XclExpDffNoteAnchor( const XclExpRoot& rRoot, const Rectangle& rRect ); -}; - - -// ---------------------------------------------------------------------------- - -/** Represents the position (anchor) of a cell dropdown object. */ -class XclExpDffDropDownAnchor : public XclExpDffAnchor -{ -public: - explicit XclExpDffDropDownAnchor( const XclExpRoot& rRoot, const ScAddress& rScPos ); -}; - // ============================================================================ @@ -221,8 +169,8 @@ public: class XclEscherClientData : public EscherExClientRecord_Base { public: - XclEscherClientData() {} - virtual void WriteData( EscherEx& rEx ) const; + XclEscherClientData() {} + virtual void WriteData( EscherEx& rEx ) const; }; @@ -233,20 +181,19 @@ class SdrTextObj; class XclEscherClientTextbox : public EscherExClientRecord_Base, protected XclExpRoot { private: - const SdrTextObj& rTextObj; - XclObj* pXclObj; + const SdrTextObj& rTextObj; + XclObj* pXclObj; public: - XclEscherClientTextbox( - const XclExpRoot& rRoot, - const SdrTextObj& rObj, - XclObj* pObj - ); + XclEscherClientTextbox( + const XclExpRoot& rRoot, + const SdrTextObj& rObj, + XclObj* pObj ); //! ONLY for the AdditionalText mimic - inline void SetXclObj( XclObj* p ) { pXclObj = p; } + inline void SetXclObj( XclObj* p ) { pXclObj = p; } - virtual void WriteData( EscherEx& rEx ) const; + virtual void WriteData( EscherEx& rEx ) const; }; diff --git a/sc/source/filter/inc/xcl97rec.hxx b/sc/source/filter/inc/xcl97rec.hxx index 1bcffdaa1..299b80d5e 100644 --- a/sc/source/filter/inc/xcl97rec.hxx +++ b/sc/source/filter/inc/xcl97rec.hxx @@ -32,88 +32,35 @@ #include "xcl97esc.hxx" #include "xlstyle.hxx" -#include <vector> - -// --- class XclMsodrawing_Base -------------------------------------- - -class XclMsodrawing_Base -{ -protected: - XclEscher* pEscher; - sal_Size nStartPos; // position in OffsetMap - sal_Size nStopPos; // position in OffsetMap - -public: - XclMsodrawing_Base( XclEscher& rEscher, sal_Size nInitialSize = 0 ); - virtual ~XclMsodrawing_Base(); - - inline XclEscher* GetEscher() const { return pEscher; } - inline XclEscherEx* GetEscherEx() const { return pEscher->GetEx(); } - void UpdateStopPos(); - sal_Size GetDataLen() const; -}; - - -// --- class XclMsodrawinggroup -------------------------------------- - -class XclMsodrawinggroup : public XclMsodrawing_Base, public XclExpRecord -{ -private: - - virtual void WriteBody( XclExpStream& rStrm ); - -public: - XclMsodrawinggroup( RootData& rRoot, - UINT16 nEscherType = 0 ); - virtual ~XclMsodrawinggroup(); -}; - - -// --- class XclMsodrawing ------------------------------------------- - -class XclMsodrawing : public XclMsodrawing_Base, public XclExpRecord -{ -private: - - virtual void WriteBody( XclExpStream& rStrm ); - -public: - XclMsodrawing( - const XclExpRoot& rRoot, - UINT16 nEscherType = 0, - sal_Size nInitialSize = 0 ); - virtual ~XclMsodrawing(); -}; - - -// --- class XclObjList ---------------------------------------------- +// ============================================================================ class XclObj; -class XclMsodrawing; +class XclExpMsoDrawing; -class XclObjList : public List, public ExcEmptyRec, protected XclExpRoot +class XclExpObjList : public List, public ExcEmptyRec, protected XclExpRoot { -private: - XclMsodrawing* pMsodrawingPerSheet; - XclMsodrawing* pSolverContainer; - public: - XclObjList( const XclExpRoot& rRoot ); - virtual ~XclObjList(); + explicit XclExpObjList( const XclExpRoot& rRoot, XclEscherEx& rEscherEx ); + virtual ~XclExpObjList(); - XclObj* First() { return (XclObj*) List::First(); } - XclObj* Next() { return (XclObj*) List::Next(); } + XclObj* First() { return (XclObj*) List::First(); } + XclObj* Next() { return (XclObj*) List::Next(); } - /// return: 1-based ObjId - ///! count>=0xFFFF: Obj will be deleted, return 0 - UINT16 Add( XclObj* ); + /// return: 1-based ObjId + ///! count>=0xFFFF: Obj will be deleted, return 0 + UINT16 Add( XclObj* ); - inline XclMsodrawing* GetMsodrawingPerSheet() { return pMsodrawingPerSheet; } + inline XclExpMsoDrawing* GetMsodrawingPerSheet() { return pMsodrawingPerSheet; } /// close groups and DgContainer opened in ctor - void EndSheet(); + void EndSheet(); - virtual void Save( XclExpStream& rStrm ); + virtual void Save( XclExpStream& rStrm ); + +private: + XclEscherEx& mrEscherEx; + XclExpMsoDrawing* pMsodrawingPerSheet; + XclExpMsoDrawing* pSolverContainer; }; @@ -125,8 +72,9 @@ class SdrTextObj; class XclObj : public XclExpRecord { protected: - XclMsodrawing* pMsodrawing; - XclMsodrawing* pClientTextbox; + XclEscherEx& mrEscherEx; + XclExpMsoDrawing* pMsodrawing; + XclExpMsoDrawing* pClientTextbox; XclTxo* pTxo; sal_uInt16 mnObjType; UINT16 nObjId; @@ -137,7 +85,9 @@ protected: /** @param bOwnEscher If set to true, this object will create its escher data. See SetOwnEscher() for details. */ - explicit XclObj( const XclExpRoot& rRoot, sal_uInt16 nObjType, bool bOwnEscher = false ); + explicit XclObj( XclExpObjectManager& rObjMgr, sal_uInt16 nObjType, bool bOwnEscher = false ); + + void ImplWriteAnchor( const XclExpRoot& rRoot, const SdrObject* pSdrObj, const Rectangle* pChildAnchor ); // overwritten for writing MSODRAWING record virtual void WriteBody( XclExpStream& rStrm ); @@ -179,27 +129,15 @@ public: //! actually writes ESCHER_ClientTextbox void SetText( const XclExpRoot& rRoot, const SdrTextObj& rObj ); - inline void UpdateStopPos(); - virtual void Save( XclExpStream& rStrm ); }; - -inline void XclObj::UpdateStopPos() -{ - if ( pClientTextbox ) - pClientTextbox->UpdateStopPos(); - else - pMsodrawing->UpdateStopPos(); -} - - // --- class XclObjComment ------------------------------------------- class XclObjComment : public XclObj { public: - XclObjComment( const XclExpRoot& rRoot, + XclObjComment( XclExpObjectManager& rObjMgr, const Rectangle& rRect, const EditTextObject& rEditObj, SdrObject* pCaption, bool bVisible ); virtual ~XclObjComment(); @@ -224,7 +162,7 @@ private: protected: public: - XclObjDropDown( const XclExpRoot& rRoot, const ScAddress& rPos, BOOL bFilt ); + XclObjDropDown( XclExpObjectManager& rObjMgr, const ScAddress& rPos, BOOL bFilt ); virtual ~XclObjDropDown(); }; @@ -271,7 +209,7 @@ private: virtual void WriteSubRecs( XclExpStream& rStrm ); public: - XclObjOle( const XclExpRoot& rRoot, const SdrObject& rObj ); + XclObjOle( XclExpObjectManager& rObjMgr, const SdrObject& rObj ); virtual ~XclObjOle(); virtual void Save( XclExpStream& rStrm ); @@ -286,7 +224,7 @@ private: virtual void WriteSubRecs( XclExpStream& rStrm ); public: - XclObjAny( const XclExpRoot& rRoot ); + XclObjAny( XclExpObjectManager& rObjMgr ); virtual ~XclObjAny(); virtual void Save( XclExpStream& rStrm ); diff --git a/sc/source/filter/inc/xechart.hxx b/sc/source/filter/inc/xechart.hxx index 1737f0f24..be8219ca2 100644 --- a/sc/source/filter/inc/xechart.hxx +++ b/sc/source/filter/inc/xechart.hxx @@ -28,6 +28,7 @@ #ifndef SC_XECHART_HXX #define SC_XECHART_HXX +#include <tools/gen.hxx> #include "xerecord.hxx" #include "xlchart.hxx" #include "xlformula.hxx" @@ -1194,6 +1195,27 @@ private: // ---------------------------------------------------------------------------- +/** Represents the group of DFF and OBJ records containing all drawing shapes + embedded in the chart object. + */ +class XclExpChartDrawing : public XclExpRecordBase, protected XclExpRoot +{ +public: + explicit XclExpChartDrawing( + const XclExpRoot& rRoot, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rxModel, + const Size& rChartSize ); + virtual ~XclExpChartDrawing(); + + virtual void Save( XclExpStream& rStrm ); + +private: + ScfRef< XclExpObjectManager > mxObjMgr; + ScfRef< XclExpRecordBase > mxObjRecs; +}; + +// ---------------------------------------------------------------------------- + /** Represents the entire chart substream (all records in BOF/EOF block). */ class XclExpChart : public XclExpSubStream, protected XclExpRoot { diff --git a/sc/source/filter/inc/xeescher.hxx b/sc/source/filter/inc/xeescher.hxx index 092008d12..259ab9761 100644 --- a/sc/source/filter/inc/xeescher.hxx +++ b/sc/source/filter/inc/xeescher.hxx @@ -29,6 +29,7 @@ #define SC_XEESCHER_HXX #include <vcl/graph.hxx> +#include <filter/msfilter/escherex.hxx> #include "xcl97rec.hxx" #include "xlescher.hxx" @@ -36,6 +37,127 @@ namespace com { namespace sun { namespace star { namespace script { struct ScriptEventDescriptor; } } } } +// DFF client anchor ========================================================== + +/** Base class for DFF client anchor atoms used in spreadsheets. */ +class XclExpDffAnchorBase : public EscherExClientAnchor_Base, protected XclExpRoot +{ +public: + /** Constructs a dummy client anchor. */ + explicit XclExpDffAnchorBase( const XclExpRoot& rRoot, sal_uInt16 nFlags = 0 ); + + /** Sets the flags according to the passed SdrObject. */ + void SetFlags( const SdrObject& rSdrObj ); + /** Sets the anchor position and flags according to the passed SdrObject. */ + void SetSdrObject( const SdrObject& rSdrObj ); + + /** Writes the DFF client anchor structure with the current anchor position. */ + void WriteDffData( EscherEx& rEscherEx ) const; + + /** Called from SVX DFF converter. + @param rRect The object anchor rectangle to be exported (in twips). */ + virtual void WriteData( EscherEx& rEscherEx, const Rectangle& rRect ); + +private: + virtual void ImplSetFlags( const SdrObject& rSdrObj ); + virtual void ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ); + +protected: // for access in derived classes + XclObjAnchor maAnchor; /// The client anchor data. + sal_uInt16 mnFlags; /// Flags for DFF stream export. +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of an object in a Calc sheet. */ +class XclExpDffSheetAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffSheetAnchor( const XclExpRoot& rRoot ); + +private: + virtual void ImplSetFlags( const SdrObject& rSdrObj ); + virtual void ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ); + +private: + SCTAB mnScTab; /// Calc sheet index. +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of a shape in an embedded draw page. */ +class XclExpDffEmbeddedAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffEmbeddedAnchor( const XclExpRoot& rRoot, + const Size& rPageSize, sal_Int32 nScaleX, sal_Int32 nScaleY ); + +private: + virtual void ImplSetFlags( const SdrObject& rSdrObj ); + virtual void ImplCalcAnchorRect( const Rectangle& rRect, MapUnit eMapUnit ); + +private: + Size maPageSize; + sal_Int32 mnScaleX; + sal_Int32 mnScaleY; +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of a note object. */ +class XclExpDffNoteAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffNoteAnchor( const XclExpRoot& rRoot, const Rectangle& rRect ); +}; + +// ---------------------------------------------------------------------------- + +/** Represents the position (anchor) of a cell dropdown object. */ +class XclExpDffDropDownAnchor : public XclExpDffAnchorBase +{ +public: + explicit XclExpDffDropDownAnchor( const XclExpRoot& rRoot, const ScAddress& rScPos ); +}; + +// MSODRAWING* records ======================================================== + +/** Base class for records holding DFF stream fragments. */ +class XclExpMsoDrawingBase : public XclExpRecord +{ +public: + explicit XclExpMsoDrawingBase( XclEscherEx& rEscherEx, sal_uInt16 nRecId ); + +private: + virtual void WriteBody( XclExpStream& rStrm ); + +protected: + XclEscherEx& mrEscherEx; /// Reference to the DFF converter containing the DFF stream. + sal_uInt32 mnFragmentKey; /// The key of the DFF stream fragment to be written by this record. +}; + +// ---------------------------------------------------------------------------- + +/** The MSODRAWINGGROUP record contains the DGGCONTAINER with global DFF data + such as the picture container. + */ +class XclExpMsoDrawingGroup : public XclExpMsoDrawingBase +{ +public: + explicit XclExpMsoDrawingGroup( XclEscherEx& rEscherEx ); +}; + +// ---------------------------------------------------------------------------- + +/** One or more MSODRAWING records contain the DFF stream data for a drawing + shape. + */ +class XclExpMsoDrawing : public XclExpMsoDrawingBase +{ +public: + explicit XclExpMsoDrawing( XclEscherEx& rEscherEx ); +}; + // ============================================================================ /** Provides export of bitmap data to an IMGDATA record. */ @@ -94,8 +216,9 @@ class XclExpOcxControlObj : public XclObj, public XclExpControlHelper { public: explicit XclExpOcxControlObj( - const XclExpRoot& rRoot, + XclExpObjectManager& rObjMgr, ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor, const String& rClassName, sal_uInt32 nStrmStart, sal_uInt32 nStrmSize ); @@ -115,8 +238,9 @@ class XclExpTbxControlObj : public XclObj, public XclExpControlHelper { public: explicit XclExpTbxControlObj( - const XclExpRoot& rRoot, - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape ); + XclExpObjectManager& rObjMgr, + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); /** Sets the name of a macro attached to this control. @return true = The passed event descriptor was valid, macro name has been found. */ @@ -161,10 +285,10 @@ class XclExpChart; class XclExpChartObj : public XclObj, protected XclExpRoot { public: - typedef ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > XShapeRef; - -public: - explicit XclExpChartObj( const XclExpRoot& rRoot, XShapeRef xShape ); + explicit XclExpChartObj( + XclExpObjectManager& rObjMgr, + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape, + const Rectangle* pChildAnchor ); virtual ~XclExpChartObj(); /** Writes the OBJ record and the entire chart substream. */ @@ -237,6 +361,74 @@ private: XclExpNoteList& mrNotes; }; +// object manager ============================================================= + +class XclExpObjectManager : public XclExpRoot +{ +public: + explicit XclExpObjectManager( const XclExpRoot& rRoot ); + virtual ~XclExpObjectManager(); + + /** Creates a new DFF client anchor object. Caller takes ownership! May be + overwritten in derived classes. */ + virtual XclExpDffAnchorBase* CreateDffAnchor() const; + + /** Creates and returns the MSODRAWINGGROUP record containing global DFF + data in the DGGCONTAINER. */ + ScfRef< XclExpRecordBase > CreateDrawingGroup(); + + /** Initializes the object manager for a new sheet. */ + void StartSheet(); + + /** Processes a drawing page and returns the record block containing all + related records (MSODRAWING, OBJ, TXO, charts, etc.). */ + ScfRef< XclExpRecordBase > ProcessDrawing( SdrPage* pSdrPage ); + /** Processes a collection of UNO shapes and returns the record block + containing all related records (MSODRAWING, OBJ, TXO, charts, etc.). */ + ScfRef< XclExpRecordBase > ProcessDrawing( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes ); + + /** Finalizes the object manager after conversion of all sheets. */ + void EndDocument(); + + inline XclEscherEx& GetEscherEx() { return *mxEscherEx; } + XclExpMsoDrawing* GetMsodrawingPerSheet(); + bool HasObj() const; + sal_uInt16 AddObj( XclObj* pObjRec ); + XclObj* RemoveLastObj(); + +protected: + explicit XclExpObjectManager( const XclExpObjectManager& rParent ); + +private: + void InitStream( bool bTempFile ); + +private: + ScfRef< ::utl::TempFile > mxTempFile; + ScfRef< SvStream > mxDffStrm; + ScfRef< XclEscherEx > mxEscherEx; + ScfRef< XclExpObjList > mxObjList; +}; + +// ---------------------------------------------------------------------------- + +class XclExpEmbeddedObjectManager : public XclExpObjectManager +{ +public: + explicit XclExpEmbeddedObjectManager( + const XclExpObjectManager& rParent, + const Size& rPageSize, + sal_Int32 nScaleX, sal_Int32 nScaleY ); + + /** Creates a new DFF client anchor object for embedded objects according + to the scaling data passed to the constructor. Caller takes ownership! */ + virtual XclExpDffAnchorBase* CreateDffAnchor() const; + +private: + Size maPageSize; + sal_Int32 mnScaleX; + sal_Int32 mnScaleY; +}; + // ============================================================================ #endif diff --git a/sc/source/filter/inc/xerecord.hxx b/sc/source/filter/inc/xerecord.hxx index cf5eac48e..6e1f7e7df 100644 --- a/sc/source/filter/inc/xerecord.hxx +++ b/sc/source/filter/inc/xerecord.hxx @@ -48,9 +48,6 @@ public: /** Overwrite this method to do any operation while saving the record. */ virtual void Save( XclExpStream& rStrm ); virtual void SaveXml( XclExpXmlStream& rStrm ); - -//UNUSED2008-05 /** Calls Save(XclExpStream&) nCount times. */ -//UNUSED2008-05 void SaveRepeated( XclExpStream& rStrm, size_t nCount ); }; // ---------------------------------------------------------------------------- diff --git a/sc/source/filter/inc/xeroot.hxx b/sc/source/filter/inc/xeroot.hxx index 6ea0674ad..f9d3a6ab2 100644 --- a/sc/source/filter/inc/xeroot.hxx +++ b/sc/source/filter/inc/xeroot.hxx @@ -1,7 +1,7 @@ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * + * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite @@ -52,6 +52,7 @@ class XclExpNumFmtBuffer; class XclExpXFBuffer; class XclExpLinkManager; class XclExpNameManager; +class XclExpObjectManager; class XclExpFilterManager; class XclExpPivotTableManager; @@ -70,6 +71,7 @@ struct XclExpRootData : public XclRootData typedef ScfRef< XclExpXFBuffer > XclExpXFBfrRef; typedef ScfRef< XclExpNameManager > XclExpNameMgrRef; typedef ScfRef< XclExpLinkManager > XclExpLinkMgrRef; + typedef ScfRef< XclExpObjectManager > XclExpObjectMgrRef; typedef ScfRef< XclExpFilterManager > XclExpFilterMgrRef; typedef ScfRef< XclExpPivotTableManager > XclExpPTableMgrRef; @@ -86,6 +88,7 @@ struct XclExpRootData : public XclRootData XclExpNameMgrRef mxNameMgr; /// Internal defined names. XclExpLinkMgrRef mxGlobLinkMgr; /// Global link manager for defined names. XclExpLinkMgrRef mxLocLinkMgr; /// Local link manager for a sheet. + XclExpObjectMgrRef mxObjMgr; /// All drawing objects. XclExpFilterMgrRef mxFilterMgr; /// Manager for filtered areas in all sheets. XclExpPTableMgrRef mxPTableMgr; /// All pivot tables and pivot caches. @@ -134,6 +137,8 @@ public: XclExpLinkManager& GetLocalLinkManager() const; /** Returns the buffer that contains internal defined names. */ XclExpNameManager& GetNameManager() const; + /** Returns the drawing object manager. */ + XclExpObjectManager& GetObjectManager() const; /** Returns the filter manager. */ XclExpFilterManager& GetFilterManager() const; /** Returns the pivot table manager. */ diff --git a/sc/source/filter/inc/xichart.hxx b/sc/source/filter/inc/xichart.hxx index f5afb3cfa..265df73f6 100644 --- a/sc/source/filter/inc/xichart.hxx +++ b/sc/source/filter/inc/xichart.hxx @@ -39,8 +39,8 @@ #include "token.hxx" #include "xlchart.hxx" #include "xlstyle.hxx" +#include "xiescher.hxx" #include "xistring.hxx" -#include "xiroot.hxx" namespace com { namespace sun { namespace star { namespace frame @@ -111,7 +111,7 @@ public: /** Starts the API chart document conversion. Must be called once before all API conversion. */ void InitConversion( XChartDocRef xChartDoc ) const; /** Finishes the API chart document conversion. Must be called once after all API conversion. */ - void FinishConversion( ScfProgressBar& rProgress ) const; + void FinishConversion( XclImpDffConverter& rDffConv ) const; /** Returns the data provider for the chart document. */ XDataProviderRef GetDataProvider() const; @@ -1355,7 +1355,9 @@ public: inline sal_Size GetProgressSize() const { return 2 * EXC_CHART_PROGRESS_SIZE; } /** Converts and writes all properties to the passed chart. */ - void Convert( XChartDocRef xChartDoc, ScfProgressBar& rProgress, const ::rtl::OUString& rObjName ) const; + void Convert( XChartDocRef xChartDoc, + XclImpDffConverter& rDffConv, + const ::rtl::OUString& rObjName ) const; private: /** Reads a CHSERIES group (data series source and formatting). */ @@ -1400,6 +1402,31 @@ typedef ScfRef< XclImpChChart > XclImpChChartRef; // ---------------------------------------------------------------------------- +/** Drawing container of a chart. */ +class XclImpChartDrawing : public XclImpDrawing +{ +public: + explicit XclImpChartDrawing( const XclImpRoot& rRoot, bool bOwnTab ); + + /** Converts all objects and inserts them into the chart drawing page. */ + void ConvertObjects( + XclImpDffConverter& rDffConv, + const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& rxModel, + const Rectangle& rChartRect ); + + /** Calculate the resulting rectangle of the passed anchor. */ + virtual Rectangle CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const; + /** Called whenever an object has been inserted into the draw page. */ + virtual void OnObjectInserted( const XclImpDrawObjBase& rDrawObj ); + +private: + Rectangle maChartRect; /// Position and size of the chart shape in 1/100 mm. + SCTAB mnScTab; /// Index of the sheet that contains the chart. + bool mbOwnTab; /// True = own sheet, false = embedded object. +}; + +// ---------------------------------------------------------------------------- + /** Represents the entire chart substream (all records in BOF/EOF block). */ class XclImpChart : protected XclImpRoot { @@ -1410,6 +1437,7 @@ public: /** Constructs a new chart object. @param bOwnTab True = chart is on an own sheet; false = chart is an embedded object. */ explicit XclImpChart( const XclImpRoot& rRoot, bool bOwnTab ); + virtual ~XclImpChart(); /** Reads the complete chart substream (BOF/EOF block). @descr The passed stream must be located in the BOF record of the chart substream. */ @@ -1423,14 +1451,22 @@ public: inline bool IsPivotChart() const { return mbIsPivotChart; } /** Creates the chart object in the passed component. */ - void Convert( XModelRef xModel, ScfProgressBar& rProgress, const ::rtl::OUString& rObjName ) const; + void Convert( XModelRef xModel, + XclImpDffConverter& rDffConv, + const ::rtl::OUString& rObjName, + const Rectangle& rChartRect ) const; private: + /** Returns (initially creates) the drawing container for embedded shapes. **/ + XclImpChartDrawing& GetChartDrawing(); /** Reads the CHCHART group (entire chart data). */ void ReadChChart( XclImpStream& rStrm ); private: + typedef ScfRef< XclImpChartDrawing > XclImpChartDrawingRef; + XclImpChChartRef mxChartData; /// The chart data (CHCHART group). + XclImpChartDrawingRef mxChartDrawing; /// Drawing container for embedded shapes. bool mbOwnTab; /// true = own sheet; false = embedded object. bool mbIsPivotChart; /// true = chart is based on a pivot table. }; diff --git a/sc/source/filter/inc/xiescher.hxx b/sc/source/filter/inc/xiescher.hxx index f1e62c985..b845207f3 100644 --- a/sc/source/filter/inc/xiescher.hxx +++ b/sc/source/filter/inc/xiescher.hxx @@ -42,9 +42,12 @@ namespace com { namespace sun { namespace star { namespace form { class XForm; } } } } +class SdrObjList; class ScfProgressBar; class ScfPropertySet; class XclImpChart; +class XclImpDffConverter; +class XclImpDrawing; // Drawing objects ============================================================ @@ -59,23 +62,23 @@ public: virtual ~XclImpDrawObjBase(); /** Reads the BIFF3 OBJ record, returns a new drawing object. */ - static XclImpDrawObjRef ReadObj3( XclImpStream& rStrm ); + static XclImpDrawObjRef ReadObj3( const XclImpRoot& rRoot, XclImpStream& rStrm ); /** Reads the BIFF4 OBJ record, returns a new drawing object. */ - static XclImpDrawObjRef ReadObj4( XclImpStream& rStrm ); + static XclImpDrawObjRef ReadObj4( const XclImpRoot& rRoot, XclImpStream& rStrm ); /** Reads the BIFF5 OBJ record, returns a new drawing object. */ - static XclImpDrawObjRef ReadObj5( XclImpStream& rStrm ); + static XclImpDrawObjRef ReadObj5( const XclImpRoot& rRoot, XclImpStream& rStrm ); /** Reads the BIFF8 OBJ record, returns a new drawing object. */ - static XclImpDrawObjRef ReadObj8( XclImpStream& rStrm ); + static XclImpDrawObjRef ReadObj8( const XclImpRoot& rRoot, XclImpStream& rStrm ); /** Sets whether this is an area object (then its width and height must be greater than 0). */ inline void SetAreaObj( bool bAreaObj ) { mbAreaObj = bAreaObj; } /** If set to true, a new SdrObject will be created while in DFF import. */ inline void SetSimpleMacro( bool bMacro ) { mbSimpleMacro = bMacro; } - /** Sets shape data from DFF stream. */ - void SetDffData( const DffObjData& rDffObjData, const String& rObjName, const String& rHyperlink, bool bVisible, bool bAutoMargin ); /** Sets the object anchor explicitly. */ void SetAnchor( const XclObjAnchor& rAnchor ); + /** Sets shape data from DFF stream. */ + void SetDffData( const DffObjData& rDffObjData, const String& rObjName, const String& rHyperlink, bool bVisible, bool bAutoMargin ); /** If set to false, the SdrObject will not be created, processed, or inserted into the draw page. */ inline void SetProcessSdrObj( bool bProcess ) { mbProcessSdr = bProcess; } @@ -84,10 +87,8 @@ public: /** If set to true, a new SdrObject will be created while in DFF import. */ inline void SetCustomDffObj( bool bCustom ) { mbCustomDff = bCustom; } - /** Returns the Calc sheet index of this object. */ - inline SCTAB GetScTab() const { return maObjId.mnScTab; } /** Returns the sheet index and Excel object identifier from OBJ record. */ - inline const XclObjId& GetObjId() const { return maObjId; } + inline sal_uInt16 GetObjId() const { return mnObjId; } /** Returns the Excel object type from OBJ record. */ inline sal_uInt16 GetObjType() const { return mnObjType; } /** Returns the name of this object, may generate a default name. */ @@ -107,14 +108,14 @@ public: /** Returns true, if the object is printable. */ inline bool IsPrintable() const { return mbPrintable; } + /** Returns the object anchor if existing, null otherwise. */ + const XclObjAnchor* GetAnchor() const; /** Returns true, if the passed size is valid for this object. */ bool IsValidSize( const Rectangle& rAnchorRect ) const; - /** Returns the area in the sheet used by this object. */ - ScRange GetUsedArea() const; - /** Returns the area on the drawing layer for this object. */ - Rectangle GetAnchorRect() const; + /** Returns the range in the sheet covered by this object. */ + ScRange GetUsedArea( SCTAB nScTab ) const; - /** Returns true, if the object is valid and will be processed.. */ + /** Returns true, if the object is valid and will be processed. */ inline bool IsProcessSdrObj() const { return mbProcessSdr && !mbHidden; } /** Returns true, if the SdrObject will be created or processed, but not be inserted into the draw page. */ inline bool IsInsertSdrObj() const { return mbInsertSdr; } @@ -122,9 +123,13 @@ public: /** Returns the needed size on the progress bar (calls virtual DoGetProgressSize() function). */ sal_Size GetProgressSize() const; /** Creates and returns an SdrObject from the contained data. Caller takes ownership! */ - SdrObject* CreateSdrObject( const Rectangle& rAnchorRect, ScfProgressBar& rProgress, bool bDffImport ) const; - /** Additional processing for the passed SdrObject (calls virtual DoProcessSdrObj() function). */ - void ProcessSdrObject( SdrObject& rSdrObj ) const; + SdrObject* CreateSdrObject( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect, bool bIsDff ) const; + /** Additional processing for the passed SdrObject before insertion into + the drawing page (calls virtual DoPreProcessSdrObj() function). */ + void PreProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + /** Additional processing for the passed SdrObject after insertion into the + drawing page (calls virtual DoPostProcessSdrObj() function). */ + void PostProcessSdrObject( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; protected: /** Reads the object name in a BIFF5 OBJ record. */ @@ -162,9 +167,11 @@ protected: /** Derived classes may return a progress bar size different from 1. */ virtual sal_Size DoGetProgressSize() const; /** Derived classes create and return a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; - /** Derived classes may perform additional processing for the passed SdrObject. */ - virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + /** Derived classes may perform additional processing for the passed SdrObject before insertion. */ + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; + /** Derived classes may perform additional processing for the passed SdrObject after insertion. */ + virtual void DoPostProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; private: /** Reads the contents of a BIFF3 OBJ record. */ @@ -177,16 +184,15 @@ private: void ImplReadObj8( XclImpStream& rStrm ); private: - typedef ScfRef< XclObjAnchor > XclObjAnchorRef; - - XclObjAnchorRef mxAnchor; /// The position of the object in the containing sheet. - XclObjId maObjId; /// Sheet index and object identifier. + XclObjAnchor maAnchor; /// The position of the object in its parent. + sal_uInt16 mnObjId; /// The object identifier (unique per drawing). sal_uInt16 mnObjType; /// The Excel object type from OBJ record. sal_uInt32 mnDffShapeId; /// Shape ID from DFF stream. sal_uInt32 mnDffFlags; /// Shape flags from DFF stream. String maObjName; /// Name of the object. String maMacroName; /// Name of an attached macro. String maHyperlink; /// On-click hyperlink URL. + bool mbHasAnchor; /// true = maAnchor is initialized. bool mbHidden; /// true = Object is hidden. bool mbVisible; /// true = Object is visible. bool mbPrintable; /// true = Object is printable. @@ -242,7 +248,7 @@ protected: /** Returns a progress bar size that takes all group children into account. */ virtual sal_Size DoGetProgressSize() const; /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; protected: XclImpDrawObjVector maChildren; /// Grouped objects. @@ -265,7 +271,7 @@ protected: /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; protected: XclObjLineData maLineData; /// BIFF5 line formatting. @@ -295,7 +301,7 @@ protected: /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; protected: XclObjFillData maFillData; /// BIFF5 fill formatting. @@ -313,7 +319,7 @@ public: protected: /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; }; // ---------------------------------------------------------------------------- @@ -332,7 +338,7 @@ protected: /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; protected: XclObjFillData maFillData; /// BIFF5 fill formatting. @@ -357,7 +363,7 @@ protected: /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; protected: typedef ::std::vector< Point > PointVector; @@ -398,9 +404,9 @@ protected: /** Reads the contents of the a BIFF5 OBJ record from the passed stream. */ virtual void DoReadObj5( XclImpStream& rStrm, sal_uInt16 nNameLen, sal_uInt16 nMacroSize ); /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; /** Inserts the contained text data at the passed object. */ - virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const; + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; protected: XclImpObjTextData maTextData; /// Textbox data from BIFF5 OBJ or BIFF8 TXO record. @@ -430,7 +436,9 @@ protected: /** Returns the needed size on the progress bar. */ virtual sal_Size DoGetProgressSize() const; /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; + /** Converts the chart document. */ + virtual void DoPostProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; private: /** Calculates the object anchor of a sheet chart (chart fills one page). */ @@ -456,7 +464,7 @@ public: protected: /** Inserts the note into the document, sets visibility. */ - virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const; + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; private: ScAddress maScPos; /// Cell position of the note object. @@ -533,9 +541,9 @@ protected: void ConvertLabel( ScfPropertySet& rPropSet ) const; /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; /** Additional processing on the SdrObject, calls new virtual function DoProcessControl(). */ - virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const; + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; /** Derived classes return the service name of the control component to be created. */ virtual ::rtl::OUString DoGetServiceName() const = 0; @@ -882,9 +890,9 @@ protected: /** Reads the contents of the specified subrecord of a BIFF8 OBJ record from stream. */ virtual void DoReadObj8SubRec( XclImpStream& rStrm, sal_uInt16 nSubRecId, sal_uInt16 nSubRecSize ); /** Creates and returns a new SdrObject from the contained data. Caller takes ownership! */ - virtual SdrObject* DoCreateSdrObj( const Rectangle& rAnchorRect, ScfProgressBar& rProgress ) const; + virtual SdrObject* DoCreateSdrObj( XclImpDffConverter& rDffConv, const Rectangle& rAnchorRect ) const; /** Overloaded to do additional processing on the SdrObject. */ - virtual void DoProcessSdrObj( SdrObject& rSdrObj ) const; + virtual void DoPreProcessSdrObj( XclImpDffConverter& rDffConv, SdrObject& rSdrObj ) const; private: /** Reads and sets the picture flags from a BIFF3-BIFF5 OBJ picture record. */ @@ -955,13 +963,13 @@ private: // ---------------------------------------------------------------------------- /** Simple implementation of the SVX DFF manager. Implements resolving palette - colors. Used by XclImpDffPropSet (as is), extended by XclImpDffManager. + colors. Used by XclImpDffPropSet (as is), extended by XclImpDffConverter. */ -class XclImpSimpleDffManager : public SvxMSDffManager, protected XclImpRoot +class XclImpSimpleDffConverter : public SvxMSDffManager, protected XclImpRoot { public: - explicit XclImpSimpleDffManager( const XclImpRoot& rRoot, SvStream& rDffStrm ); - virtual ~XclImpSimpleDffManager(); + explicit XclImpSimpleDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ); + virtual ~XclImpSimpleDffConverter(); protected: /** Returns a color from the Excel color palette. */ @@ -970,42 +978,46 @@ protected: // ---------------------------------------------------------------------------- -class XclImpObjectManager; -class SdrObjList; +/** This is the central instance for converting binary DFF data into shape + objects. Used for all sheet shapes and shapes embedded in chart objects. -/** Derived from SvxMSDffManager and SvxMSConvertOCXControls, contains core - implementation of DFF stream import and OCX form control import. + The class derives from SvxMSDffManager and SvxMSConvertOCXControls and + contains core implementation of DFF stream import and OCX form control + import. */ -class XclImpDffManager : public XclImpSimpleDffManager, protected SvxMSConvertOCXControls +class XclImpDffConverter : public XclImpSimpleDffConverter, private SvxMSConvertOCXControls { public: - explicit XclImpDffManager( - const XclImpRoot& rRoot, - XclImpObjectManager& rObjManager, - SvStream& rDffStrm ); - virtual ~XclImpDffManager(); + explicit XclImpDffConverter( const XclImpRoot& rRoot, SvStream& rDffStrm ); + virtual ~XclImpDffConverter(); /** Initializes the internal progress bar with the passed size and starts it. */ void StartProgressBar( sal_Size nProgressSize ); + /** Increase the progress bar by the passed value. */ + void Progress( sal_Size nDelta = 1 ); + /** Initially called before the objects of the passed drawing manager are converted. */ + void InitializeDrawing( XclImpDrawing& rDrawing, SdrModel& rSdrModel, SdrPage& rSdrPage ); /** Processes BIFF5 drawing objects without DFF data, inserts into the passed object list. */ - void ProcessObject( SdrObjList* pObjList, const XclImpDrawObjBase& rDrawObj ); - /** Processes the leading drawing group container in the DFF stream. */ - void ProcessDrawingGroup( SvStream& rDffStrm ); - /** Processes a drawing container for a sheet in the DFF stream, converts all objects. */ - void ProcessDrawing( SvStream& rDffStrm, sal_Size nStrmPos ); + void ProcessObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj ); + /** Processes all objects in the passed list. */ + void ProcessDrawing( const XclImpDrawObjVector& rDrawObjs ); + /** Processes a drawing container in the passed DFF stream, converts all objects. */ + void ProcessDrawing( SvStream& rDffStrm ); + /** Finally called after the objects of the passed drawing manager have been converted. */ + void FinalizeDrawing(); /** Creates the SdrObject for the passed Excel TBX form control object. */ SdrObject* CreateSdrObject( const XclImpTbxObjBase& rTbxObj, const Rectangle& rAnchorRect ); /** Creates the SdrObject for the passed Excel OLE object or OCX form control object. */ SdrObject* CreateSdrObject( const XclImpPictureObj& rPicObj, const Rectangle& rAnchorRect ); + /** Returns true, if the conversion of OLE objects is supported. */ + bool SupportsOleObjects() const; /** Returns the default text margin in drawing layer units. */ inline sal_Int32 GetDefaultTextMargin() const { return mnDefTextMargin; } - /** Returns the used area in the sheet with the passed index. */ - ScRange GetUsedArea( SCTAB nScTab ) const; -protected: +private: // virtual functions of SvxMSDffManager /** Reads the client anchor from the DFF stream and sets it at the correct object. */ @@ -1036,11 +1048,30 @@ protected: BOOL bFloatingCtrl ); private: + /** Data per registered drawing manager, will be stacked for recursive calls. */ + struct XclImpDffConvData + { + XclImpDrawing& mrDrawing; /// Current drawing container with all drawing objects. + SdrModel& mrSdrModel; /// The SdrModel of the drawing manager. + SdrPage& mrSdrPage; /// The SdrPage of the drawing manager. + XclImpSolverContainer maSolverCont; /// The solver container for connector rules. + ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > + mxCtrlForm; /// Controls form of current drawing page. + sal_Int32 mnLastCtrlIndex; /// Last insertion index of a form control (for macro events). + bool mbHasCtrlForm; /// True = mxCtrlForm is initialized (but maybe still null). + + explicit XclImpDffConvData( XclImpDrawing& rDrawing, + SdrModel& rSdrModel, SdrPage& rSdrPage ); + }; + + /** Returns the current drawing manager data struct from top of the stack. */ + XclImpDffConvData& GetConvData(); + /** Returns the current drawing manager data struct from top of the stack. */ + const XclImpDffConvData& GetConvData() const; + /** Reads contents of a hyperlink property and returns the extracted URL. */ String ReadHlinkProperty( SvStream& rDffStrm ) const; - /** Processes a drawing group container (global drawing data). */ - void ProcessDggContainer( SvStream& rDffStrm, const DffRecordHeader& rDggHeader ); /** Processes a drawing container (all drawing data of a sheet). */ void ProcessDgContainer( SvStream& rDffStrm, const DffRecordHeader& rDgHeader ); /** Processes the global shape group container (all shapes of a sheet). */ @@ -1051,87 +1082,71 @@ private: void ProcessShContainer( SvStream& rDffStrm, const DffRecordHeader& rShHeader ); /** Inserts the passed SdrObject into the document. This function takes ownership of pSdrObj! */ - void InsertSdrObject( SdrObjList* pObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj ); - /** Stores the standard controls form for the passed sheet in mxCurrForm member. */ - void SetCurrentForm( SCTAB nScTab ); - - /** Updates the used area of a sheet with the position and size of the passed object. */ - void UpdateUsedArea( const XclImpDrawObjBase& rDrawObj ); + void InsertSdrObject( SdrObjList& rObjList, const XclImpDrawObjBase& rDrawObj, SdrObject* pSdrObj ); + /** Initializes the mxCtrlForm referring to the standard controls form. */ + void InitControlForm(); private: - typedef ::std::map< SCTAB, ScRange > ScRangeMap; - typedef ScfRef< ScfProgressBar > ScfProgressBarRef; + typedef ScfRef< ScfProgressBar > ScfProgressBarRef; + typedef ScfRef< XclImpDffConvData > XclImpDffConvDataRef; + typedef ::std::vector< XclImpDffConvDataRef > XclImpDffConvDataStack; - XclImpObjectManager& mrObjManager; /// The Excel object manager. - XclImpSolverContainer maSolverCont; /// The solver container for connector rules. + const ::rtl::OUString maStdFormName; /// Standard name of control forms. SotStorageStreamRef mxCtlsStrm; /// The 'Ctls' stream for OCX form controls. - ScRangeMap maUsedAreaMap; /// Used ranges for all sheets. ScfProgressBarRef mxProgress; /// The progress bar used in ProcessObj(). - ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > - mxCurrForm; /// Controls form of current sheet (needed in virtual functions). + XclImpDffConvDataStack maDataStack; /// Stack for registered drawing managers. sal_uInt32 mnOleImpFlags; /// Application OLE import settings. sal_Int32 mnDefTextMargin; /// Default margin in text boxes. - sal_Int32 mnLastCtrlIndex; /// Last insertion index of a form control (for macro events). - SCTAB mnCurrFormScTab; /// Sheet index of form stored in mxCurrForm. }; -// The object manager ========================================================= +// Drawing manager ============================================================ -/** Stores all drawing and OLE objects and additional data related to these objects. */ -class XclImpObjectManager : protected XclImpRoot +/** Base class for a container for all objects on a drawing (spreadsheet or + embedded chart object). */ +class XclImpDrawing : protected XclImpRoot { public: - explicit XclImpObjectManager( const XclImpRoot& rRoot ); - virtual ~XclImpObjectManager(); - - // *** Read Excel records *** --------------------------------------------- + explicit XclImpDrawing( const XclImpRoot& rRoot, bool bOleObjects ); + virtual ~XclImpDrawing(); /** Reads and returns a bitmap from the IMGDATA record. */ - static Graphic ReadImgData( XclImpStream& rStrm ); + static Graphic ReadImgData( const XclImpRoot& rRoot, XclImpStream& rStrm ); /** Reads a plain OBJ record (without leading DFF data). */ void ReadObj( XclImpStream& rStrm ); - /** Reads the MSODRAWINGGROUP record. */ - void ReadMsoDrawingGroup( XclImpStream& rStrm ); /** Reads the MSODRAWING or MSODRAWINGSELECTION record. */ void ReadMsoDrawing( XclImpStream& rStrm ); - /** Reads the NOTE record. */ - void ReadNote( XclImpStream& rStrm ); - - /** Inserts a new chart object and reads the chart substream (BOF/EOF block). - @descr Used to import chart sheets, which do not have a corresponding OBJ record. */ - void ReadTabChart( XclImpStream& rStrm ); - - // *** Drawing objects *** ------------------------------------------------ + /** Returns true, if the conversion of OLE objects is supported. */ + inline bool SupportsOleObjects() const { return mbOleObjs; } /** Finds the OBJ record data related to the DFF shape at the passed position. */ XclImpDrawObjRef FindDrawObj( const DffRecordHeader& rHeader ) const; /** Finds the OBJ record data specified by the passed object identifier. */ - XclImpDrawObjRef FindDrawObj( const XclObjId& rObjId ) const; + XclImpDrawObjRef FindDrawObj( sal_uInt16 nObjId ) const; /** Finds the textbox data related to the DFF shape at the passed position. */ const XclImpObjTextData* FindTextData( const DffRecordHeader& rHeader ) const; /** Sets the object with the passed identification to be skipped on import. */ - void SetSkipObj( SCTAB nScTab, sal_uInt16 nObjId ); - - // *** Drawing object conversion *** -------------------------------------- + void SetSkipObj( sal_uInt16 nObjId ); + /** Returns the size of the progress bar shown while processing all objects. */ + sal_Size GetProgressSize() const; - /** Returns the DFF manager (DFF stream converter). Don't call before the DFF stream is read. */ - XclImpDffManager& GetDffManager(); - /** Inserts all objects into the Calc document. */ - void ConvertObjects(); + /** Derived classes calculate the resulting rectangle of the passed anchor. */ + virtual Rectangle CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const = 0; + /** Called whenever an object has been inserted into the draw page. */ + virtual void OnObjectInserted( const XclImpDrawObjBase& rDrawObj ) = 0; - /** Returns the default name for the passed object. */ - String GetDefaultObjName( const XclImpDrawObjBase& rDrawObj ) const; - /** Returns the used area in the sheet with the passed index. */ - ScRange GetUsedArea( SCTAB nScTab ) const; +protected: + /** Appends a new drawing object to the list of raw objects (without DFF data). */ + void AppendRawObject( const XclImpDrawObjRef& rxDrawObj ); + /** Converts all objects and inserts them into the current drawing page. */ + void ImplConvertObjects( XclImpDffConverter& rDffConv, SdrModel& rSdrModel, SdrPage& rSdrPage ); - // ------------------------------------------------------------------------ private: /** Reads and returns a bitmap from WMF/PICT format. */ - static void ReadWmf( Graphic& rGraphic, XclImpStream& rStrm ); + static void ReadWmf( Graphic& rGraphic, const XclImpRoot& rRoot, XclImpStream& rStrm ); /** Reads and returns a bitmap from BMP format. */ - static void ReadBmp( Graphic& rGraphic, XclImpStream& rStrm ); + static void ReadBmp( Graphic& rGraphic, const XclImpRoot& rRoot, XclImpStream& rStrm ); /** Reads contents of an DFF record and append data to internal DFF stream. */ void ReadDffRecord( XclImpStream& rStrm ); @@ -1140,36 +1155,86 @@ private: /** Reads the TXO record and following CONTINUE records containing string and formatting. */ void ReadTxo( XclImpStream& rStrm ); +private: + typedef ::std::map< sal_Size, XclImpDrawObjRef > XclImpObjMap; + typedef ::std::map< sal_uInt16, XclImpDrawObjRef > XclImpObjMapById; + typedef ScfRef< XclImpObjTextData > XclImpObjTextRef; + typedef ::std::map< sal_Size, XclImpObjTextRef > XclImpObjTextMap; + + XclImpDrawObjVector maRawObjs; /// BIFF5 objects without DFF data. + SvMemoryStream maDffStrm; /// Copy of the DFF page stream in memory. + XclImpObjMap maObjMap; /// Maps BIFF8 drawing objects to DFF stream position. + XclImpObjMapById maObjMapId; /// Maps BIFF8 drawing objects to object ID. + XclImpObjTextMap maTextMap; /// Maps BIFF8 TXO textbox data to DFF stream position. + ScfUInt16Vec maSkipObjs; /// IDs of all objects to be skipped. + bool mbOleObjs; /// True = draw model supports OLE objects. +}; + +// ---------------------------------------------------------------------------- + +/** Drawing manager of a single sheet. */ +class XclImpSheetDrawing : public XclImpDrawing +{ +public: + explicit XclImpSheetDrawing( const XclImpRoot& rRoot, SCTAB nScTab ); + + /** Reads the NOTE record. */ + void ReadNote( XclImpStream& rStrm ); + /** Inserts a new chart object and reads the chart substream (BOF/EOF block). + @descr Used to import chart sheets, which do not have a corresponding OBJ record. */ + void ReadTabChart( XclImpStream& rStrm ); + + /** Returns the total cell range covered by any shapes in the sheet. */ + inline const ScRange& GetUsedArea() const { return maScUsedArea; } + /** Converts all objects and inserts them into the sheet drawing page. */ + void ConvertObjects( XclImpDffConverter& rDffConv ); + + /** Calculate the resulting rectangle of the passed anchor. */ + virtual Rectangle CalcAnchorRect( const XclObjAnchor& rAnchor, bool bDffAnchor ) const; + /** On call, updates the used area of the sheet. */ + virtual void OnObjectInserted( const XclImpDrawObjBase& rDrawObj ); + +private: /** Reads a BIFF3-BIFF5 NOTE record. */ void ReadNote3( XclImpStream& rStrm ); /** Reads a BIFF8 NOTE record. */ void ReadNote8( XclImpStream& rStrm ); - /** Returns the size of the progress bar shown while processing all objects. */ - sal_Size GetProgressSize() const; +private: + ScRange maScUsedArea; /// Sheet index and used area in this sheet. +}; + +// The object manager ========================================================= + +/** Stores all drawing and OLE objects and additional data related to these objects. */ +class XclImpObjectManager : protected XclImpRoot +{ +public: + explicit XclImpObjectManager( const XclImpRoot& rRoot ); + virtual ~XclImpObjectManager(); + + /** Reads the MSODRAWINGGROUP record. */ + void ReadMsoDrawingGroup( XclImpStream& rStrm ); + + /** Returns (initially creates) the drawing manager of the specified sheet. */ + XclImpSheetDrawing& GetSheetDrawing( SCTAB nScTab ); + /** Inserts all objects into the Calc document. */ + void ConvertObjects(); + + /** Returns the default name for the passed object. */ + String GetDefaultObjName( const XclImpDrawObjBase& rDrawObj ) const; + /** Returns the used area in the sheet with the passed index. */ + ScRange GetUsedArea( SCTAB nScTab ) const; // ------------------------------------------------------------------------ private: - typedef ::std::map< sal_Size, XclImpDrawObjRef > XclImpObjMap; - typedef ::std::map< XclObjId, XclImpDrawObjRef > XclImpObjMapById; - typedef ScfRef< XclImpObjTextData > XclImpObjTextRef; - typedef ::std::map< sal_Size, XclImpObjTextRef > XclImpObjTextMap; - typedef ::std::vector< XclObjId > XclObjIdVec; - typedef ::std::map< sal_uInt16, String > DefObjNameMap; - typedef ::std::vector< sal_Size > StreamPosVec; - typedef ScfRef< XclImpDffManager > XclImpDffMgrRef; - - XclImpDrawObjVector maRawObjs; /// BIFF5 objects without DFF data. - XclImpObjMap maObjMap; /// Maps BIFF8 drawing objects to DFF stream position. - XclImpObjMapById maObjMapId; /// Maps BIFF8 drawing objects to sheet index and object ID. - XclImpObjTextMap maTextMap; /// Maps BIFF8 TXO textbox data to DFF stream position. - XclObjIdVec maSkipObjs; /// All objects to be skipped. + typedef ScfRef< XclImpSheetDrawing > XclImpSheetDrawingRef; + typedef ::std::map< SCTAB, XclImpSheetDrawingRef > XclImpSheetDrawingMap; DefObjNameMap maDefObjNames; /// Default base names for all object types. - SvMemoryStream maDffStrm; /// Copy of DFF stream in memory. - StreamPosVec maTabStrmPos; /// Start positions of DFF stream fragments for all sheets. - XclImpDffMgrRef mxDffManager; /// The DFF stream converter. + SvMemoryStream maDggStrm; /// Copy of global DFF data (DGG container) in memory. + XclImpSheetDrawingMap maSheetDrawings; /// Drawing managers of all sheets. }; // DFF property set helper ==================================================== @@ -1197,8 +1262,8 @@ public: private: typedef ::std::auto_ptr< SvMemoryStream > SvMemoryStreamPtr; - SvMemoryStream maDummyStrm; /// Dummy stream for DFF manager. - XclImpSimpleDffManager maDffManager;/// DFF manager used to resolve palette colors. + SvMemoryStream maDummyStrm; /// Dummy DGG stream for DFF manager. + XclImpSimpleDffConverter maDffConv; /// DFF converter used to resolve palette colors. SvMemoryStreamPtr mxMemStrm; /// Helper stream. }; diff --git a/sc/source/filter/inc/xiroot.hxx b/sc/source/filter/inc/xiroot.hxx index f222ed864..6ed1d739b 100644 --- a/sc/source/filter/inc/xiroot.hxx +++ b/sc/source/filter/inc/xiroot.hxx @@ -51,6 +51,7 @@ class XclImpTabInfo; class XclImpNameManager; class XclImpLinkManager; class XclImpObjectManager; +class XclImpSheetDrawing; class XclImpCondFormatManager; class XclImpAutoFilterBuffer; class XclImpWebQueryBuffer; @@ -176,6 +177,8 @@ public: /** Returns the drawing object manager. */ XclImpObjectManager& GetObjectManager() const; + /** Returns the drawing container of the current sheet. */ + XclImpSheetDrawing& GetCurrSheetDrawing() const; /** Returns the conditional formattings manager. */ XclImpCondFormatManager& GetCondFormatManager() const; /** Returns the filter manager. */ diff --git a/sc/source/filter/inc/xlchart.hxx b/sc/source/filter/inc/xlchart.hxx index 2785a1497..3dab9cdd7 100644 --- a/sc/source/filter/inc/xlchart.hxx +++ b/sc/source/filter/inc/xlchart.hxx @@ -71,6 +71,7 @@ namespace com { namespace sun { namespace star { #define SERVICE_CHART2_TITLE CREATE_OUSTRING( "com.sun.star.chart2.Title" ) // property names +#define EXC_CHPROP_ADDITIONALSHAPES CREATE_OUSTRING( "AdditionalShapes" ) #define EXC_CHPROP_ARRANGEORDER CREATE_OUSTRING( "ArrangeOrder" ) #define EXC_CHPROP_ATTAXISINDEX CREATE_OUSTRING( "AttachedAxisIndex" ) #define EXC_CHPROP_ATTRIBDATAPOINTS CREATE_OUSTRING( "AttributedDataPoints" ) @@ -168,6 +169,8 @@ const sal_Int32 EXC_CHART_AXESSET_NONE = -1; /// For internal use const sal_Int32 EXC_CHART_AXESSET_PRIMARY = 0; /// API primary axes set index. const sal_Int32 EXC_CHART_AXESSET_SECONDARY = 1; /// API secondary axes set index. +const sal_Int32 EXC_CHART_UNIT = 4000; /// Chart objects are positioned in 1/4000 of chart area. + // (0x0850) CHFRINFO ---------------------------------------------------------- const sal_uInt16 EXC_ID_CHFRINFO = 0x0850; diff --git a/sc/source/filter/inc/xlescher.hxx b/sc/source/filter/inc/xlescher.hxx index b249ec68d..d2b551d55 100644 --- a/sc/source/filter/inc/xlescher.hxx +++ b/sc/source/filter/inc/xlescher.hxx @@ -312,18 +312,21 @@ bool operator<( const XclObjId& rL, const XclObjId& rR ); /** Represents the position (anchor) of an object in a Calc document. */ struct XclObjAnchor : public XclRange { - SCTAB mnScTab; /// Calc sheet index. sal_uInt16 mnLX; /// X offset in left column (1/1024 of column width). sal_uInt16 mnTY; /// Y offset in top row (1/256 of row height). sal_uInt16 mnRX; /// X offset in right column (1/1024 of column width). sal_uInt16 mnBY; /// Y offset in bottom row (1/256 of row height). - explicit XclObjAnchor( SCTAB nScTab ); + explicit XclObjAnchor(); /** Calculates a rectangle from the contained coordinates. */ - Rectangle GetRect( ScDocument& rDoc, MapUnit eMapUnit ) const; - /** Initializes the anchor coordinates from a rectangle. */ - void SetRect( ScDocument& rDoc, const Rectangle& rRect, MapUnit eMapUnit ); + Rectangle GetRect( ScDocument& rDoc, SCTAB nScTab, MapUnit eMapUnit ) const; + /** Initializes the anchor coordinates for a sheet. */ + void SetRect( ScDocument& rDoc, SCTAB nScTab, const Rectangle& rRect, MapUnit eMapUnit ); + + /** Initializes the anchor coordinates for an embedded draw page. */ + void SetRect( const Size& rPageSize, sal_Int32 nScaleX, sal_Int32 nScaleY, + const Rectangle& rRect, MapUnit eMapUnit, bool bDffAnchor ); }; template< typename StreamType > diff --git a/sc/source/filter/xcl97/xcl97esc.cxx b/sc/source/filter/xcl97/xcl97esc.cxx index c631cdcff..b7e5de855 100644 --- a/sc/source/filter/xcl97/xcl97esc.cxx +++ b/sc/source/filter/xcl97/xcl97esc.cxx @@ -59,9 +59,11 @@ #include "xechart.hxx" #include "xcl97esc.hxx" +using ::rtl::OUString; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::Exception; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; using ::com::sun::star::container::XIndexAccess; @@ -72,24 +74,40 @@ using ::com::sun::star::form::XFormsSupplier; using ::com::sun::star::script::ScriptEventDescriptor; using ::com::sun::star::script::XEventAttacherManager; -// --- class XclEscherEx --------------------------------------------- +// ============================================================================ -XclEscherEx::XclEscherEx( const XclExpRoot& rRoot, SvStream& rStrm, UINT32 nDrawings ) - : - EscherEx( rStrm, nDrawings ), - XclExpRoot( rRoot ), - pPicTempFile( NULL ), - pPicStrm( NULL ), - pCurrXclObj( NULL ), - pCurrAppData( NULL ), - pTheClientData( new XclEscherClientData ), - pAdditionalText( NULL ), - nAdditionalText( 0 ) +XclEscherExGlobal::XclEscherExGlobal( const XclExpRoot& rRoot ) : + XclExpRoot( rRoot ) +{ +} + +SvStream* XclEscherExGlobal::ImplQueryPictureStream() { - aOffsetMap.Insert( (void*) 0, LIST_APPEND ); // start of stream - // Xcl forgets OLE objects completely if the Escher object is not EMF and - // the corresponding OLE application is opened and nothing is changed. - SetOleEmf( TRUE ); + mxPicTempFile.reset( new ::utl::TempFile ); + if( mxPicTempFile->IsValid() ) + { + mxPicTempFile->EnableKillingFile(); + mxPicStrm.reset( ::utl::UcbStreamHelper::CreateStream( mxPicTempFile->GetURL(), STREAM_STD_READWRITE ) ); + mxPicStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); + } + return mxPicStrm.get(); +} + +// ============================================================================ + +XclEscherEx::XclEscherEx( const XclExpRoot& rRoot, XclExpObjectManager& rObjMgr, SvStream& rStrm, const XclEscherEx* pParent ) : + EscherEx( pParent ? pParent->mxGlobal : EscherExGlobalRef( new XclEscherExGlobal( rRoot ) ), rStrm ), + XclExpRoot( rRoot ), + mrObjMgr( rObjMgr ), + pCurrXclObj( NULL ), + pCurrAppData( NULL ), + pTheClientData( new XclEscherClientData ), + pAdditionalText( NULL ), + nAdditionalText( 0 ), + mnNextKey( 0 ), + mbIsRootDff( pParent == 0 ) +{ + InsertPersistOffset( mnNextKey, 0 ); } @@ -98,86 +116,83 @@ XclEscherEx::~XclEscherEx() DBG_ASSERT( !aStack.Count(), "~XclEscherEx: stack not empty" ); DeleteCurrAppData(); delete pTheClientData; - if ( pPicStrm ) - { - delete pPicStrm; - } - if ( pPicTempFile ) - delete pPicTempFile; } -SvStream* XclEscherEx::QueryPicStream() +sal_uInt32 XclEscherEx::InitNextDffFragment() { - if ( !pPicStrm ) - { - if ( !pPicTempFile ) - { - pPicTempFile = new utl::TempFile; - if ( pPicTempFile->IsValid() ) - pPicTempFile->EnableKillingFile(); - else - { - delete pPicTempFile; - pPicTempFile = NULL; - } - } - if ( pPicTempFile ) - { - pPicStrm = utl::UcbStreamHelper::CreateStream( pPicTempFile->GetURL(), STREAM_STD_READWRITE ); - pPicStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); - } - } - return pPicStrm; + /* Current value of mnNextKey will be used by caller to refer to the + starting point of the DFF fragment. The key exists already in the + PersistTable (has been inserted by c'tor of previous call of + InitNextDffFragment(), has been updated by UpdateDffFragmentEnd(). */ + sal_uInt32 nPersistKey = mnNextKey; + + /* Prepare the next key that is used by caller as end point of the DFF + fragment. Will be updated by caller when writing to the DFF stream, + using the UpdateDffFragmentEnd() function. This is needed to find DFF + data written by the SVX base class implementation without interaction, + e.g. the solver container that will be written after the last shape. */ + ++mnNextKey; + InsertPersistOffset( mnNextKey, mpOutStrm->Tell() ); + + return nPersistKey; } - -void XclEscherEx::InsertAtCurrentPos( UINT32 nBytes, BOOL bCont ) +void XclEscherEx::UpdateDffFragmentEnd() { - ULONG nPos = GetStreamPos(); - ULONG nCnt = aOffsetMap.Count(); - ULONG j, nOff; - for ( j=0, nOff = (ULONG) aOffsetMap.First(); j<nCnt; - j++, nOff = (ULONG) aOffsetMap.Next() ) - { - if ( nOff >= nPos ) - aOffsetMap.Replace( (void*) (nOff + nBytes) ); - } - EscherEx::InsertAtCurrentPos( nBytes, bCont ); + // update existing fragment key with new stream position + ReplacePersistOffset( mnNextKey, mpOutStrm->Tell() ); } - -ULONG XclEscherEx::AddCurrentOffsetToMap() +sal_uInt32 XclEscherEx::GetDffFragmentPos( sal_uInt32 nFragmentKey ) { - aOffsetMap.Insert( (void*) GetStreamPos(), LIST_APPEND ); - return aOffsetMap.Count() - 1; + /* TODO: this function is non-const because PersistTable::PtGetOffsetByID() + is non-const due to tools/List usage. */ + return GetPersistOffset( nFragmentKey ); } +sal_uInt32 XclEscherEx::GetDffFragmentSize( sal_uInt32 nFragmentKey ) +{ + /* TODO: this function is non-const because PersistTable::PtGetOffsetByID() + is non-const due to tools/List usage. */ + return GetDffFragmentPos( nFragmentKey + 1 ) - GetDffFragmentPos( nFragmentKey ); +} -void XclEscherEx::ReplaceCurrentOffsetInMap( ULONG nPos ) +bool XclEscherEx::HasPendingDffData() { - aOffsetMap.Replace( (void*) GetStreamPos(), nPos ); + /* TODO: this function is non-const because PersistTable::PtGetOffsetByID() + is non-const due to tools/List usage. */ + return GetDffFragmentPos( mnNextKey ) < GetStreamPos(); } -sal_Bool ImplXclEscherExIsFontwork( const SdrObject* pObj ) +XclExpDffAnchorBase* XclEscherEx::CreateDffAnchor( const SdrObject& rSdrObj ) const { - const rtl::OUString sTextPath( RTL_CONSTASCII_USTRINGPARAM ( "TextPath" ) ); + // the object manager creates the correct anchor type according to context + XclExpDffAnchorBase* pAnchor = mrObjMgr.CreateDffAnchor(); + // pass the drawing object, that will calculate the anchor position + pAnchor->SetSdrObject( rSdrObj ); + return pAnchor; +} + +namespace { - sal_Bool bIsFontwork = sal_False; - if ( pObj->GetObjIdentifier() == OBJ_CUSTOMSHAPE ) +bool lcl_IsFontwork( const SdrObject* pObj ) +{ + bool bIsFontwork = false; + if( pObj->GetObjIdentifier() == OBJ_CUSTOMSHAPE ) { + const OUString aTextPath = CREATE_OUSTRING( "TextPath" ); SdrCustomShapeGeometryItem& rGeometryItem = (SdrCustomShapeGeometryItem&) pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ); - - com::sun::star::uno::Any* pAny = rGeometryItem.GetPropertyValueByName( sTextPath, sTextPath ); - if ( pAny ) + if( Any* pAny = rGeometryItem.GetPropertyValueByName( aTextPath, aTextPath ) ) *pAny >>= bIsFontwork; } return bIsFontwork; } -EscherExHostAppData* XclEscherEx::StartShape( const com::sun::star::uno::Reference< - com::sun::star::drawing::XShape >& rShape ) +} // namespace + +EscherExHostAppData* XclEscherEx::StartShape( const Reference< XShape >& rxShape, const Rectangle* pChildAnchor ) { if ( nAdditionalText ) nAdditionalText++; @@ -185,17 +200,17 @@ EscherExHostAppData* XclEscherEx::StartShape( const com::sun::star::uno::Referen if ( bInGroup ) { // stacked recursive group object if ( !pCurrAppData->IsStackedGroup() ) - { //! UpdateStopPos only once + { //! UpdateDffFragmentEnd only once pCurrAppData->SetStackedGroup( TRUE ); - pCurrXclObj->UpdateStopPos(); + UpdateDffFragmentEnd(); } } aStack.Push( pCurrXclObj ); aStack.Push( pCurrAppData ); pCurrAppData = new XclEscherHostAppData; - SdrObject* pObj = GetSdrObjectFromXShape( rShape ); + SdrObject* pObj = GetSdrObjectFromXShape( rxShape ); if ( !pObj ) - pCurrXclObj = new XclObjAny( GetRoot() ); // just what is it?!? + pCurrXclObj = new XclObjAny( mrObjMgr ); // just what is it?!? else { pCurrXclObj = NULL; @@ -203,38 +218,50 @@ EscherExHostAppData* XclEscherEx::StartShape( const com::sun::star::uno::Referen if( nObjType == OBJ_OLE2 ) { - //! not-const because GetObjRef may load the OLE object - Reference < XClassifiedObject > xObj( ((SdrOle2Obj*)pObj)->GetObjRef(), UNO_QUERY ); - if ( xObj.is() ) + // no OLE objects in embedded drawings (chart shapes) + if( mbIsRootDff ) { - SvGlobalName aObjClsId( xObj->getClassID() ); - if ( SotExchange::IsChart( aObjClsId ) ) - { // yes, it's a chart diagram - GetOldRoot().pObjRecs->Add( new XclExpChartObj( GetRoot(), rShape ) ); - pCurrXclObj = NULL; // no metafile or whatsoever + //! not-const because GetObjRef may load the OLE object + Reference < XClassifiedObject > xObj( ((SdrOle2Obj*)pObj)->GetObjRef(), UNO_QUERY ); + if ( xObj.is() ) + { + SvGlobalName aObjClsId( xObj->getClassID() ); + if ( SotExchange::IsChart( aObjClsId ) ) + { // yes, it's a chart diagram + mrObjMgr.AddObj( new XclExpChartObj( mrObjMgr, rxShape, pChildAnchor ) ); + pCurrXclObj = NULL; // no metafile or whatsoever + } + else // metafile and OLE object + pCurrXclObj = new XclObjOle( mrObjMgr, *pObj ); } - else // metafile and OLE object - pCurrXclObj = new XclObjOle( GetRoot(), *pObj ); + else // just a metafile + pCurrXclObj = new XclObjAny( mrObjMgr ); } - else // just a metafile - pCurrXclObj = new XclObjAny( GetRoot() ); + else + pCurrXclObj = new XclObjAny( mrObjMgr ); } else if( nObjType == OBJ_UNO ) { - pCurrXclObj = CreateCtrlObj( rShape ); +#if EXC_EXP_OCX_CTRL + // no ActiveX controls in embedded drawings (chart shapes) + if( mbIsRootDff ) + pCurrXclObj = CreateCtrlObj( rxShape, pChildAnchor ); +#else + pCurrXclObj = CreateCtrlObj( rxShape, pChildAnchor ); +#endif if( !pCurrXclObj ) - pCurrXclObj = new XclObjAny( GetRoot() ); // just a metafile + pCurrXclObj = new XclObjAny( mrObjMgr ); // just a metafile } else if( !ScDrawLayer::IsNoteCaption( pObj ) ) { // #107540# ignore permanent note shapes // #i12190# do not ignore callouts (do not filter by object type ID) - pCurrXclObj = new XclObjAny( GetRoot() ); // just a metafile + pCurrXclObj = new XclObjAny( mrObjMgr ); // just a metafile } } if ( pCurrXclObj ) { - if ( !GetOldRoot().pObjRecs->Add( pCurrXclObj ) ) + if ( !mrObjMgr.AddObj( pCurrXclObj ) ) { // maximum count reached, object got deleted pCurrXclObj = NULL; } @@ -247,14 +274,15 @@ EscherExHostAppData* XclEscherEx::StartShape( const com::sun::star::uno::Referen { if ( !bInGroup ) { - /* Create a dummy anchor carrying the flags. Real coordinates are - calculated later in WriteData(EscherEx&,const Rectangle&). */ - XclExpDffAnchor* pAnchor = new XclExpDffAnchor( GetRoot() ); + /* Create a dummy anchor carrying the flags. Real + coordinates are calculated later in virtual call of + WriteData(EscherEx&,const Rectangle&). */ + XclExpDffAnchorBase* pAnchor = mrObjMgr.CreateDffAnchor(); pAnchor->SetFlags( *pObj ); pCurrAppData->SetClientAnchor( pAnchor ); } const SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, pObj ); - if ( pTextObj && !ImplXclEscherExIsFontwork( pTextObj ) && ( pObj->GetObjIdentifier() != OBJ_CAPTION ) ) + if( pTextObj && !lcl_IsFontwork( pTextObj ) && (pObj->GetObjIdentifier() != OBJ_CAPTION) ) { const OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); if( pParaObj ) @@ -265,7 +293,7 @@ EscherExHostAppData* XclEscherEx::StartShape( const com::sun::star::uno::Referen else { if ( !bInGroup ) - pCurrAppData->SetClientAnchor( new XclExpDffAnchor( GetRoot() ) ); + pCurrAppData->SetClientAnchor( mrObjMgr.CreateDffAnchor() ); } } else if ( nAdditionalText == 3 ) @@ -295,13 +323,10 @@ void XclEscherEx::EndShape( UINT16 nShapeType, UINT32 nShapeID ) // escher data of last shape not written? -> delete it from object list if( nShapeID == 0 ) { - XclObj* pLastObj = static_cast< XclObj* >( GetOldRoot().pObjRecs->Last() ); + XclObj* pLastObj = mrObjMgr.RemoveLastObj(); DBG_ASSERT( pLastObj == pCurrXclObj, "XclEscherEx::EndShape - wrong object" ); - if ( pLastObj == pCurrXclObj ) - { - GetOldRoot().pObjRecs->Remove(); - DELETEZ( pCurrXclObj ); - } + DELETEZ( pLastObj ); + pCurrXclObj = 0; } if( pCurrXclObj ) @@ -312,7 +337,7 @@ void XclEscherEx::EndShape( UINT16 nShapeType, UINT32 nShapeID ) else { pCurrXclObj->SetEscherShapeType( nShapeType ); - pCurrXclObj->UpdateStopPos(); + UpdateDffFragmentEnd(); } } } @@ -335,26 +360,18 @@ EscherExHostAppData* XclEscherEx::EnterAdditionalTextGroup() } -void XclEscherEx::DeleteCurrAppData() -{ - if ( pCurrAppData ) - { - delete pCurrAppData->GetClientAnchor(); -// delete pCurrAppData->GetClientData(); - delete pCurrAppData->GetClientTextbox(); - delete pCurrAppData; - } -} - - void XclEscherEx::EndDocument() { - Flush( pPicStrm ); + if( mbIsRootDff ) + Flush( static_cast< XclEscherExGlobal& >( *mxGlobal ).GetPictureStream() ); + + // seek back DFF stream to prepare saving the MSODRAWING[GROUP] records + mpOutStrm->Seek( 0 ); } #if EXC_EXP_OCX_CTRL -XclExpOcxControlObj* XclEscherEx::CreateCtrlObj( Reference< XShape > xShape ) +XclExpOcxControlObj* XclEscherEx::CreateCtrlObj( Reference< XShape > xShape, const Rectangle* pChildAnchor ) { ::std::auto_ptr< XclExpOcxControlObj > xOcxCtrl; @@ -375,7 +392,7 @@ XclExpOcxControlObj* XclEscherEx::CreateCtrlObj( Reference< XShape > xShape ) sal_uInt32 nStrmSize = static_cast< sal_uInt32 >( mxCtlsStrm->Tell() - nStrmStart ); // adjust the class name to "Forms.***.1" aClassName.InsertAscii( "Forms.", 0 ).AppendAscii( ".1" ); - xOcxCtrl.reset( new XclExpOcxControlObj( GetRoot(), xShape, aClassName, nStrmStart, nStrmSize ) ); + xOcxCtrl.reset( new XclExpOcxControlObj( mrObjMgr, xShape, pChildAnchor, aClassName, nStrmStart, nStrmSize ) ); } } } @@ -384,9 +401,9 @@ XclExpOcxControlObj* XclEscherEx::CreateCtrlObj( Reference< XShape > xShape ) #else -XclExpTbxControlObj* XclEscherEx::CreateCtrlObj( Reference< XShape > xShape ) +XclExpTbxControlObj* XclEscherEx::CreateCtrlObj( Reference< XShape > xShape, const Rectangle* pChildAnchor ) { - ::std::auto_ptr< XclExpTbxControlObj > xTbxCtrl( new XclExpTbxControlObj( GetRoot(), xShape ) ); + ::std::auto_ptr< XclExpTbxControlObj > xTbxCtrl( new XclExpTbxControlObj( mrObjMgr, xShape, pChildAnchor ) ); if( xTbxCtrl->GetObjType() == EXC_OBJTYPE_UNKNOWN ) xTbxCtrl.reset(); @@ -454,98 +471,17 @@ void XclEscherEx::ConvertTbxMacro( XclExpTbxControlObj& rTbxCtrlObj, Reference< #endif -// --- class XclEscher ----------------------------------------------- - -XclEscher::XclEscher( const XclExpRoot& rRoot, UINT32 nDrawings ) : - XclExpRoot( rRoot ) -{ - pTempFile = new utl::TempFile; - pTempFile->EnableKillingFile(); - pStrm = utl::UcbStreamHelper::CreateStream( pTempFile->GetURL(), STREAM_STD_READWRITE ); - pStrm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); - pEx = new XclEscherEx( rRoot, *pStrm, nDrawings ); -} - - -XclEscher::~XclEscher() -{ - delete pEx; - delete pStrm; - delete pTempFile; -} - - -void XclEscher::AddSdrPage() -{ - if( SdrPage* pPage = GetSdrPage( GetCurrScTab() ) ) - pEx->AddSdrPage( *pPage ); - // #106213# the first dummy object may still be open - DBG_ASSERT( pEx->GetGroupLevel() <= 1, "XclEscher::AddSdrPage - still groups open?" ); - while( pEx->GetGroupLevel() ) - pEx->LeaveGroup(); -} - - -// Escher client anchor ======================================================= - -XclExpDffAnchor::XclExpDffAnchor( const XclExpRoot& rRoot, sal_uInt16 nFlags ) : - XclExpRoot( rRoot ), - maAnchor( rRoot.GetCurrScTab() ), - mnFlags( nFlags ) -{ -} - -XclExpDffAnchor::XclExpDffAnchor( const XclExpRoot& rRoot, const SdrObject& rSdrObj ) : - XclExpRoot( rRoot ), - maAnchor( rRoot.GetCurrScTab() ) -{ - SetFlags( rSdrObj ); - maAnchor.SetRect( GetDoc(), rSdrObj.GetCurrentBoundRect(), MAP_100TH_MM ); -} - -void XclExpDffAnchor::SetFlags( const SdrObject& rSdrObj ) -{ - // Special case "page anchor" (X==0,Y==1) -> lock pos and size. - const Point& rPos = rSdrObj.GetAnchorPos(); - mnFlags = ((rPos.X() == 0) && (rPos.Y() == 1)) ? EXC_ESC_ANCHOR_LOCKED : 0; -} - -void XclExpDffAnchor::WriteData( EscherEx& rEx, const Rectangle& rRect ) -{ - // the rectangle is already in twips - maAnchor.SetRect( GetDoc(), rRect, MAP_TWIP ); - WriteData( rEx ); -} - - -void XclExpDffAnchor::WriteData( EscherEx& rEx ) const -{ - rEx.AddAtom( 18, ESCHER_ClientAnchor ); - rEx.GetStream() << mnFlags << maAnchor; -} - - -// ---------------------------------------------------------------------------- - -XclExpDffNoteAnchor::XclExpDffNoteAnchor( const XclExpRoot& rRoot, const Rectangle& rRect ) : - XclExpDffAnchor( rRoot, EXC_ESC_ANCHOR_SIZELOCKED ) -{ - maAnchor.SetRect( GetDoc(), rRect, MAP_100TH_MM ); -} - - -// ---------------------------------------------------------------------------- - -XclExpDffDropDownAnchor::XclExpDffDropDownAnchor( const XclExpRoot& rRoot, const ScAddress& rScPos ) : - XclExpDffAnchor( rRoot, EXC_ESC_ANCHOR_POSLOCKED ) +void XclEscherEx::DeleteCurrAppData() { - GetAddressConverter().ConvertAddress( maAnchor.maFirst, rScPos, true ); - maAnchor.maLast.mnCol = maAnchor.maFirst.mnCol + 1; - maAnchor.maLast.mnRow = maAnchor.maFirst.mnRow + 1; - maAnchor.mnLX = maAnchor.mnTY = maAnchor.mnRX = maAnchor.mnBY = 0; + if ( pCurrAppData ) + { + delete pCurrAppData->GetClientAnchor(); +// delete pCurrAppData->GetClientData(); + delete pCurrAppData->GetClientTextbox(); + delete pCurrAppData; + } } - // ============================================================================ // --- class XclEscherClientData ------------------------------------- diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx index eb726b810..447046936 100644 --- a/sc/source/filter/xcl97/xcl97rec.cxx +++ b/sc/source/filter/xcl97/xcl97rec.cxx @@ -49,6 +49,7 @@ #include "xcl97esc.hxx" #include "editutil.hxx" #include "xecontent.hxx" +#include "xeescher.hxx" #include "xestyle.hxx" #include "xelink.hxx" @@ -86,158 +87,22 @@ using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::drawing::XShape; +// ============================================================================ -//___________________________________________________________________ - -// --- class XclMsodrawing_Base -------------------------------------- - -XclMsodrawing_Base::XclMsodrawing_Base( XclEscher& rEscher, sal_Size nInitialSize ) - : - pEscher( &rEscher ), - nStartPos( rEscher.GetEx()->GetLastOffsetMapPos() ) -{ - // for safety's sake add this now - nStopPos = GetEscherEx()->AddCurrentOffsetToMap(); - (void)nInitialSize; // avoid compiler warning - DBG_ASSERT( GetDataLen() == nInitialSize, "XclMsodrawing_Base ctor: do I really own that data?" ); -} - - -XclMsodrawing_Base::~XclMsodrawing_Base() -{ -} - - -void XclMsodrawing_Base::UpdateStopPos() -{ - if ( nStopPos > 0 ) - GetEscherEx()->ReplaceCurrentOffsetInMap( nStopPos ); - else - nStopPos = GetEscherEx()->AddCurrentOffsetToMap(); -} - - -sal_Size XclMsodrawing_Base::GetDataLen() const -{ - if ( nStartPos < nStopPos ) - { - XclEscherEx* pEx = GetEscherEx(); - return pEx->GetOffsetFromMap( nStopPos ) - pEx->GetOffsetFromMap( nStartPos ); - } - DBG_ERRORFILE( "XclMsodrawing_Base::GetDataLen: position mismatch" ); - return 0; -} - - - -// --- class XclMsodrawinggroup -------------------------------------- - -XclMsodrawinggroup::XclMsodrawinggroup( RootData& rRoot, UINT16 nEscherType ) : - XclMsodrawing_Base( *rRoot.pEscher ), - XclExpRecord(0x00EB, 2) // bogus record size since we don't know the actual size yet. -{ - if ( nEscherType ) - { - XclEscherEx* pEx = GetEscherEx(); - SvStream& rOut = pEx->GetStream(); - switch ( nEscherType ) - { - case ESCHER_DggContainer : - { // per-document data - pEx->OpenContainer( nEscherType ); -//2do: stuff it with our own document defaults? -#if 0 - pEx->BeginCount(); - pEx->AddOpt( ... ); - pEx->EndCount( ESCHER_OPT, 3 ); -#else - BYTE pDummyOPT[] = { - 0xBF, 0x00, 0x08, 0x00, 0x08, 0x00, 0x81, 0x01, - 0x09, 0x00, 0x00, 0x08, 0xC0, 0x01, 0x40, 0x00, - 0x00, 0x08 - }; - pEx->AddAtom( sizeof(pDummyOPT), ESCHER_OPT, 3, 3 ); - rOut.Write( pDummyOPT, sizeof(pDummyOPT) ); -#endif - BYTE pDummySplitMenuColors[] = { - 0x0D, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x08, - 0x17, 0x00, 0x00, 0x08, 0xF7, 0x00, 0x00, 0x10 - }; - pEx->AddAtom( sizeof(pDummySplitMenuColors), ESCHER_SplitMenuColors, 0, 4 ); - rOut.Write( pDummySplitMenuColors, sizeof(pDummySplitMenuColors) ); - pEx->CloseContainer(); // ESCHER_DggContainer - } - break; - } - UpdateStopPos(); - } -} - - -XclMsodrawinggroup::~XclMsodrawinggroup() -{ -} - - -void XclMsodrawinggroup::WriteBody( XclExpStream& rStrm ) -{ - DBG_ASSERT( GetEscherEx()->GetStreamPos() == GetEscherEx()->GetOffsetFromMap( nStartPos ), - "XclMsodrawinggroup::SaveCont: Escher stream position mismatch" ); - rStrm.CopyFromStream( pEscher->GetStrm(), GetDataLen() ); -} - - -// --- class XclMsodrawing -------------------------------------- - -XclMsodrawing::XclMsodrawing( const XclExpRoot& rRoot, UINT16 nEscherType, sal_Size nInitialSize ) : - XclMsodrawing_Base( *rRoot.GetOldRoot().pEscher, nInitialSize ), - XclExpRecord( 0x00EC, nInitialSize ) -{ - if ( nEscherType ) - { - XclEscherEx* pEx = GetEscherEx(); - switch ( nEscherType ) - { - case ESCHER_DgContainer : - { // per-sheet data - pEx->OpenContainer( nEscherType ); - // open group shape container - Rectangle aRect( 0, 0, 0, 0 ); - pEx->EnterGroup( &aRect ); - } - break; - } - UpdateStopPos(); - } -} - - -XclMsodrawing::~XclMsodrawing() -{ -} - - -void XclMsodrawing::WriteBody( XclExpStream& rStrm ) -{ - DBG_ASSERT( GetEscherEx()->GetStreamPos() == GetEscherEx()->GetOffsetFromMap( nStartPos ), - "XclMsodrawing::SaveCont: Escher stream position mismatch" ); - rStrm.CopyFromStream( pEscher->GetStrm(), GetDataLen() ); -} - - - - -// --- class XclObjList ---------------------------------------------- - -XclObjList::XclObjList( const XclExpRoot& rRoot ) : +XclExpObjList::XclExpObjList( const XclExpRoot& rRoot, XclEscherEx& rEscherEx ) : XclExpRoot( rRoot ), - pMsodrawingPerSheet( new XclMsodrawing( rRoot, ESCHER_DgContainer ) ), - pSolverContainer( NULL ) + mrEscherEx( rEscherEx ), + pSolverContainer( 0 ) { + pMsodrawingPerSheet = new XclExpMsoDrawing( rEscherEx ); + // open the DGCONTAINER and the patriarch group shape + mrEscherEx.OpenContainer( ESCHER_DgContainer ); + Rectangle aRect( 0, 0, 0, 0 ); + mrEscherEx.EnterGroup( &aRect ); + mrEscherEx.UpdateDffFragmentEnd(); } - -XclObjList::~XclObjList() +XclExpObjList::~XclExpObjList() { for ( XclObj* p = First(); p; p = Next() ) delete p; @@ -245,10 +110,9 @@ XclObjList::~XclObjList() delete pSolverContainer; } - -UINT16 XclObjList::Add( XclObj* pObj ) +UINT16 XclExpObjList::Add( XclObj* pObj ) { - DBG_ASSERT( Count() < 0xFFFF, "XclObjList::Add: too much for Xcl" ); + DBG_ASSERT( Count() < 0xFFFF, "XclExpObjList::Add: too much for Xcl" ); if ( Count() < 0xFFFF ) { Insert( pObj, LIST_APPEND ); @@ -263,22 +127,17 @@ UINT16 XclObjList::Add( XclObj* pObj ) } } - -void XclObjList::EndSheet() +void XclExpObjList::EndSheet() { - XclEscherEx* pEx = pMsodrawingPerSheet->GetEscherEx(); - // Is there still something in the stream? -> The solver container - sal_Size nSolverSize = pEx->GetStreamPos() - pEx->GetOffsetFromMap( pEx->GetLastOffsetMapPos() ); - if( nSolverSize > 0 ) - pSolverContainer = new XclMsodrawing( GetRoot(), ESCHER_SolverContainer, nSolverSize ); + if( mrEscherEx.HasPendingDffData() ) + pSolverContainer = new XclExpMsoDrawing( mrEscherEx ); - //! close ESCHER_DgContainer created by XclObjList ctor MSODRAWING - pEx->CloseContainer(); + // close the DGCONTAINER created by XclExpObjList ctor MSODRAWING + mrEscherEx.CloseContainer(); } - -void XclObjList::Save( XclExpStream& rStrm ) +void XclExpObjList::Save( XclExpStream& rStrm ) { //! Escher must be written, even if there are no objects pMsodrawingPerSheet->Save( rStrm ); @@ -290,28 +149,26 @@ void XclObjList::Save( XclExpStream& rStrm ) pSolverContainer->Save( rStrm ); } - - // --- class XclObj -------------------------------------------------- -XclObj::XclObj( const XclExpRoot& rRoot, sal_uInt16 nObjType, bool bOwnEscher ) : +XclObj::XclObj( XclExpObjectManager& rObjMgr, sal_uInt16 nObjType, bool bOwnEscher ) : XclExpRecord( EXC_ID_OBJ, 26 ), + mrEscherEx( rObjMgr.GetEscherEx() ), pClientTextbox( NULL ), pTxo( NULL ), mnObjType( nObjType ), nObjId(0), nGrbit( 0x6011 ), // AutoLine, AutoFill, Printable, Locked - bFirstOnSheet( rRoot.GetOldRoot().pObjRecs->Count() == 0 ), + bFirstOnSheet( !rObjMgr.HasObj() ), mbOwnEscher( bOwnEscher ) { //! first object continues the first MSODRAWING record if ( bFirstOnSheet ) - pMsodrawing = rRoot.GetOldRoot().pObjRecs->GetMsodrawingPerSheet(); + pMsodrawing = rObjMgr.GetMsodrawingPerSheet(); else - pMsodrawing = new XclMsodrawing( rRoot ); + pMsodrawing = new XclExpMsoDrawing( mrEscherEx ); } - XclObj::~XclObj() { if ( !bFirstOnSheet ) @@ -320,6 +177,18 @@ XclObj::~XclObj() delete pTxo; } +void XclObj::ImplWriteAnchor( const XclExpRoot& /*rRoot*/, const SdrObject* pSdrObj, const Rectangle* pChildAnchor ) +{ + if( pChildAnchor ) + { + mrEscherEx.AddChildAnchor( *pChildAnchor ); + } + else if( pSdrObj ) + { + ::std::auto_ptr< XclExpDffAnchorBase > xDffAnchor( mrEscherEx.CreateDffAnchor( *pSdrObj ) ); + xDffAnchor->WriteDffData( mrEscherEx ); + } +} void XclObj::SetEscherShapeType( UINT16 nType ) { @@ -350,21 +219,19 @@ void XclObj::SetEscherShapeType( UINT16 nType ) } } - void XclObj::SetText( const XclExpRoot& rRoot, const SdrTextObj& rObj ) { DBG_ASSERT( !pClientTextbox, "XclObj::SetText: already set" ); if ( !pClientTextbox ) { - pMsodrawing->UpdateStopPos(); - pClientTextbox = new XclMsodrawing( rRoot ); - pClientTextbox->GetEscherEx()->AddAtom( 0, ESCHER_ClientTextbox ); // TXO record - pClientTextbox->UpdateStopPos(); + mrEscherEx.UpdateDffFragmentEnd(); + pClientTextbox = new XclExpMsoDrawing( mrEscherEx ); + mrEscherEx.AddAtom( 0, ESCHER_ClientTextbox ); // TXO record + mrEscherEx.UpdateDffFragmentEnd(); pTxo = new XclTxo( rRoot, rObj ); } } - void XclObj::WriteBody( XclExpStream& rStrm ) { DBG_ASSERT( mnObjType != EXC_OBJTYPE_UNKNOWN, "XclObj::WriteBody - unknown type" ); @@ -392,7 +259,6 @@ void XclObj::WriteBody( XclExpStream& rStrm ) rStrm.CopyFromStream( aMemStrm ); } - void XclObj::Save( XclExpStream& rStrm ) { // MSODRAWING record (msofbtSpContainer) @@ -406,7 +272,6 @@ void XclObj::Save( XclExpStream& rStrm ) SaveTextRecs( rStrm ); } - void XclObj::WriteSubRecs( XclExpStream& /*rStrm*/ ) { } @@ -421,17 +286,14 @@ void XclObj::SaveTextRecs( XclExpStream& rStrm ) pTxo->Save( rStrm ); } - // --- class XclObjComment ------------------------------------------- - -XclObjComment::XclObjComment( const XclExpRoot& rRoot, const Rectangle& rRect, const EditTextObject& rEditObj, SdrObject* pCaption, bool bVisible ) - : - XclObj( rRoot, EXC_OBJTYPE_NOTE, true ) +XclObjComment::XclObjComment( XclExpObjectManager& rObjMgr, const Rectangle& rRect, const EditTextObject& rEditObj, SdrObject* pCaption, bool bVisible ) : + XclObj( rObjMgr, EXC_OBJTYPE_NOTE, true ) { - ProcessEscherObj(rRoot, rRect, pCaption, bVisible); + ProcessEscherObj( rObjMgr.GetRoot(), rRect, pCaption, bVisible); // TXO - pTxo = new XclTxo( rRoot, rEditObj, pCaption ); + pTxo = new XclTxo( rObjMgr.GetRoot(), rEditObj, pCaption ); } void XclObjComment::ProcessEscherObj( const XclExpRoot& rRoot, const Rectangle& rRect, SdrObject* pCaption, const bool bVisible ) @@ -482,66 +344,62 @@ void XclObjComment::ProcessEscherObj( const XclExpRoot& rRoot, const Rectangle& } nGrbit = 0; // all off: AutoLine, AutoFill, Printable, Locked - XclEscherEx* pEx = pMsodrawing->GetEscherEx(); - pEx->OpenContainer( ESCHER_SpContainer ); - pEx->AddShape( ESCHER_ShpInst_TextBox, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); + mrEscherEx.OpenContainer( ESCHER_SpContainer ); + mrEscherEx.AddShape( ESCHER_ShpInst_TextBox, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); sal_uInt32 nFlags = 0x000A0000; ::set_flag( nFlags, sal_uInt32(2), !bVisible ); aPropOpt.AddOpt( ESCHER_Prop_fPrint, nFlags ); // bool field - aPropOpt.Commit( pEx->GetStream() ); + aPropOpt.Commit( mrEscherEx.GetStream() ); - XclExpDffNoteAnchor( rRoot, rRect ).WriteData( *pEx); + XclExpDffNoteAnchor( rRoot, rRect ).WriteDffData( mrEscherEx ); + + mrEscherEx.AddAtom( 0, ESCHER_ClientData ); // OBJ record + mrEscherEx.UpdateDffFragmentEnd(); - pEx->AddAtom( 0, ESCHER_ClientData ); // OBJ record - pMsodrawing->UpdateStopPos(); //! Be sure to construct the MSODRAWING ClientTextbox record _after_ the //! base OBJ's MSODRAWING record Escher data is completed. - pClientTextbox = new XclMsodrawing( rRoot ); - pClientTextbox->GetEscherEx()->AddAtom( 0, ESCHER_ClientTextbox ); // TXO record - pClientTextbox->UpdateStopPos(); - pEx->CloseContainer(); // ESCHER_SpContainer + pClientTextbox = new XclExpMsoDrawing( mrEscherEx ); + mrEscherEx.AddAtom( 0, ESCHER_ClientTextbox ); // TXO record + mrEscherEx.UpdateDffFragmentEnd(); + mrEscherEx.CloseContainer(); // ESCHER_SpContainer } - XclObjComment::~XclObjComment() { } - void XclObjComment::Save( XclExpStream& rStrm ) { // content of this record XclObj::Save( rStrm ); } - // --- class XclObjDropDown ------------------------------------------ -XclObjDropDown::XclObjDropDown( const XclExpRoot& rRoot, const ScAddress& rPos, BOOL bFilt ) : - XclObj( rRoot, EXC_OBJTYPE_DROPDOWN, true ), - bIsFiltered( bFilt ) +XclObjDropDown::XclObjDropDown( XclExpObjectManager& rObjMgr, const ScAddress& rPos, BOOL bFilt ) : + XclObj( rObjMgr, EXC_OBJTYPE_DROPDOWN, true ), + bIsFiltered( bFilt ) { SetLocked( TRUE ); SetPrintable( FALSE ); SetAutoFill( TRUE ); SetAutoLine( FALSE ); nGrbit |= 0x0100; // undocumented - XclEscherEx* pEx = pMsodrawing->GetEscherEx(); - pEx->OpenContainer( ESCHER_SpContainer ); - pEx->AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); + mrEscherEx.OpenContainer( ESCHER_SpContainer ); + mrEscherEx.AddShape( ESCHER_ShpInst_HostControl, SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT ); EscherPropertyContainer aPropOpt; aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x01040104 ); // bool field aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x00080008 ); // bool field aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x00010000 ); // bool field aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x00080000 ); // bool field aPropOpt.AddOpt( ESCHER_Prop_fPrint, 0x000A0000 ); // bool field - aPropOpt.Commit( pEx->GetStream() ); + aPropOpt.Commit( mrEscherEx.GetStream() ); - XclExpDffDropDownAnchor( rRoot, rPos ).WriteData( *pEx ); + XclExpDffDropDownAnchor( rObjMgr.GetRoot(), rPos ).WriteDffData( mrEscherEx ); - pEx->AddAtom( 0, ESCHER_ClientData ); // OBJ record - pMsodrawing->UpdateStopPos(); - pEx->CloseContainer(); // ESCHER_SpContainer + mrEscherEx.AddAtom( 0, ESCHER_ClientData ); // OBJ record + mrEscherEx.UpdateDffFragmentEnd(); + mrEscherEx.CloseContainer(); // ESCHER_SpContainer // old size + ftSbs + ftLbsData AddRecSize( 24 + 20 ); @@ -568,7 +426,6 @@ void XclObjDropDown::WriteSubRecs( XclExpStream& rStrm ) rStrm.EndRecord(); } - // --- class XclTxo -------------------------------------------------- sal_uInt8 lcl_GetHorAlignFromItemSet( const SfxItemSet& rItemSet ) @@ -725,22 +582,19 @@ sal_Size XclTxo::GetLen() const return 18; } - // --- class XclObjOle ------------------------------------------- -XclObjOle::XclObjOle( const XclExpRoot& rRoot, const SdrObject& rObj ) : - XclObj( rRoot, EXC_OBJTYPE_PICTURE ), +XclObjOle::XclObjOle( XclExpObjectManager& rObjMgr, const SdrObject& rObj ) : + XclObj( rObjMgr, EXC_OBJTYPE_PICTURE ), rOleObj( rObj ), - pRootStorage( rRoot.GetRootStorage() ) + pRootStorage( rObjMgr.GetRoot().GetRootStorage() ) { } - XclObjOle::~XclObjOle() { } - void XclObjOle::WriteSubRecs( XclExpStream& rStrm ) { // write only as embedded, not linked @@ -810,18 +664,16 @@ void XclObjOle::WriteSubRecs( XclExpStream& rStrm ) } } - void XclObjOle::Save( XclExpStream& rStrm ) { // content of this record XclObj::Save( rStrm ); } - // --- class XclObjAny ------------------------------------------- -XclObjAny::XclObjAny( const XclExpRoot& rRoot ) : - XclObj( rRoot, EXC_OBJTYPE_UNKNOWN ) +XclObjAny::XclObjAny( XclExpObjectManager& rObjMgr ) : + XclObj( rObjMgr, EXC_OBJTYPE_UNKNOWN ) { } @@ -846,7 +698,6 @@ void XclObjAny::Save( XclExpStream& rStrm ) XclObj::Save( rStrm ); } - // --- class ExcBof8_Base -------------------------------------------- ExcBof8_Base::ExcBof8_Base() |