diff options
author | Thomas Benisch <tbe@openoffice.org> | 2009-07-21 14:09:00 +0000 |
---|---|---|
committer | Thomas Benisch <tbe@openoffice.org> | 2009-07-21 14:09:00 +0000 |
commit | f246eb7405930e70753ea5a65ffe9529e46542a2 (patch) | |
tree | 2e6d6fa69859430ebfc43824a1dbda22ae4d146e /chart2/source/controller/main | |
parent | dbeb6066e879baf1507d5065fb6bd4ef4adb884f (diff) |
#i12587# Inserting/editing arbitrary text objects in chart
Diffstat (limited to 'chart2/source/controller/main')
-rw-r--r-- | chart2/source/controller/main/ChartController.cxx | 11 | ||||
-rw-r--r-- | chart2/source/controller/main/ChartController_Window.cxx | 57 | ||||
-rw-r--r-- | chart2/source/controller/main/ObjectHierarchy.cxx | 269 | ||||
-rw-r--r-- | chart2/source/controller/main/SelectionHelper.cxx | 14 | ||||
-rw-r--r-- | chart2/source/controller/main/SelectionHelper.hxx | 3 |
5 files changed, 222 insertions, 132 deletions
diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx index 3aac05b8102c..1d15b36348d1 100644 --- a/chart2/source/controller/main/ChartController.cxx +++ b/chart2/source/controller/main/ChartController.cxx @@ -53,6 +53,7 @@ #include "dlg_CreationWizard.hxx" #include "dlg_ChartType.hxx" //#include "svx/ActionDescriptionProvider.hxx" +#include "AccessibleChartView.hxx" #include "DrawCommandDispatch.hxx" #include "ShapeController.hxx" @@ -102,6 +103,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; @@ -1372,12 +1374,9 @@ DrawViewWrapper* ChartController::GetDrawViewWrapper() return m_pDrawViewWrapper; } -uno::Reference< accessibility::XAccessible > ChartController::CreateAccessible() +uno::Reference< XAccessible > ChartController::CreateAccessible() { - uno::Reference< accessibility::XAccessible > xResult( - m_xCC->getServiceManager()->createInstanceWithContext( - CHART2_ACCESSIBLE_SERVICE_NAME, m_xCC ), uno::UNO_QUERY ); - + uno::Reference< XAccessible > xResult = new AccessibleChartView( m_xCC, GetDrawViewWrapper() ); impl_initializeAccessible( uno::Reference< lang::XInitialization >( xResult, uno::UNO_QUERY ) ); return xResult; } @@ -1409,7 +1408,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_Window.cxx b/chart2/source/controller/main/ChartController_Window.cxx index 47338d443ebc..94a184fe54e6 100644 --- a/chart2/source/controller/main/ChartController_Window.cxx +++ b/chart2/source/controller/main/ChartController_Window.cxx @@ -1023,17 +1023,28 @@ 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 ) ) + { + if ( aNewOID.isAutoGeneratedObject() ) + { + aNewSelection <<= aNewOID.getObjectCID(); + } + else if ( aNewOID.isAdditionalShape() ) + { + aNewSelection <<= aNewOID.getAdditionalShape(); + } + } + if ( m_eDragMode == SDRDRAG_ROTATE && !SelectionHelper::isRotateableObject( aNewOID.getObjectCID(), m_aModel->getModel() ) ) + { m_eDragMode = SDRDRAG_MOVE; + } bReturn = select( aNewSelection ); } } @@ -1286,17 +1297,43 @@ 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 ( 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( m_aSelection.setSelection( aNewCID ) ) + if ( bSuccess ) { this->impl_selectObjectAndNotiy(); return sal_True; } + return sal_False; } diff --git a/chart2/source/controller/main/ObjectHierarchy.cxx b/chart2/source/controller/main/ObjectHierarchy.cxx index 67297197cacc..c4dac17db9ab 100644 --- a/chart2/source/controller/main/ObjectHierarchy.cxx +++ b/chart2/source/controller/main/ObjectHierarchy.cxx @@ -41,6 +41,7 @@ #include "macros.hxx" #include "LineProperties.hxx" #include "ChartTypeHelper.hxx" +#include "chartview/DrawModelWrapper.hxx" #include <map> #include <algorithm> @@ -64,24 +65,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()) { @@ -99,11 +101,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 ); } } } @@ -111,49 +113,50 @@ void lcl_getChildCIDs( } // 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 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 ); 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< XCoordinateSystemContainer > & xCooSysCnt ); - ObjectHierarchy::tCID getParentImpl( - const ObjectHierarchy::tCID & rParentCID, - const ObjectHierarchy::tCID & rCID ); - - typedef ::std::map< OUString, ObjectHierarchy::tChildContainer > + ObjectHierarchy::tChildContainer& rOutDiagramSubContainer, + const Reference< XCoordinateSystemContainer >& xCooSysCnt ); + void createAdditionalShapesTree( ObjectHierarchy::tChildContainer& rContainer ); + ObjectHierarchy::tOID getParentImpl( + const ObjectHierarchy::tOID& rParentOID, + const ObjectHierarchy::tOID& rOID ); + + typedef ::std::map< ObjectHierarchy::tOID, ObjectHierarchy::tChildContainer > tChildMap; tChildMap m_aChildMap; - ExplicitValueProvider * m_pExplicitValueProvider; + ExplicitValueProvider* m_pExplicitValueProvider; bool m_bFlattenDiagram; }; ImplObjectHierarchy::ImplObjectHierarchy( - const Reference< XChartDocument > & xChartDocument, - ExplicitValueProvider * pExplicitValueProvider, + const Reference< XChartDocument >& xChartDocument, + ExplicitValueProvider* pExplicitValueProvider, bool bFlattenDiagram ) : m_pExplicitValueProvider( pExplicitValueProvider ), m_bFlattenDiagram( bFlattenDiagram ) @@ -163,9 +166,9 @@ 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 @@ -181,7 +184,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 ) ) ); } Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartDocument )); @@ -194,7 +197,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 ) ) ); } // Axis Titles. Note: These are interpreted of being top level @@ -207,25 +210,24 @@ void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChart Reference< XTitle > xAxisTitle( xAxisTitled->getTitleObject()); if( xAxisTitle.is()) aTopLevelContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForObject( xAxisTitle, xModel )); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xAxisTitle, xModel ) ) ); } } // Diagram - OUString aDiaCID( ObjectIdentifier::createClassifiedIdentifierForObject( xDiagram, xModel )); - OSL_ASSERT( aDiaCID.getLength()); - aTopLevelContainer.push_back( aDiaCID ); + ObjectHierarchy::tOID aDiaOID( ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xDiagram, xModel ) ) ); + OSL_ASSERT( aDiaOID.getObjectCID().getLength() ); + aTopLevelContainer.push_back( aDiaOID ); if( m_bFlattenDiagram ) createDiagramTree( aTopLevelContainer, xChartDocument, xDiagram ); else { ObjectHierarchy::tChildContainer aSubContainer; createDiagramTree( aSubContainer, xChartDocument, xDiagram ); - if( ! aSubContainer.empty()) - m_aChildMap[ aDiaCID ] = aSubContainer; + if( !aSubContainer.empty() ) + m_aChildMap[ aDiaOID ] = aSubContainer; } - // Legend. Note: This is interpreted of being top level Reference< XLegend > xLegend( xDiagram->getLegend()); if( xLegend.is()) @@ -236,35 +238,38 @@ void ImplObjectHierarchy::createTree( const Reference< XChartDocument > & xChart (xLegendProp->getPropertyValue( C2U("Show")) >>= bShow) && bShow ) { - OUString aLegendCID( ObjectIdentifier::createClassifiedIdentifierForObject( xLegend, xModel )); - aTopLevelContainer.push_back( aLegendCID ); + ObjectHierarchy::tOID aLegendOID( ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForObject( xLegend, xModel ) ) ); + aTopLevelContainer.push_back( aLegendOID ); - // iterate over child shapes of legend and search for matching CIDs + // iterate over child shapes of legend and search for matching OIDs 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; } } } } + // #i12587# support for shapes in chart + createAdditionalShapesTree( aTopLevelContainer ); + // Chart Area 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::createDiagramTree( - ObjectHierarchy::tChildContainer & rContainer, - const Reference< XChartDocument > & xChartDoc, - const Reference< XDiagram > & xDiagram ) + ObjectHierarchy::tChildContainer& rContainer, + const Reference< XChartDocument >& xChartDoc, + const Reference< XDiagram >& xDiagram ) { // Data Series Reference< XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW ); @@ -281,7 +286,7 @@ void ImplObjectHierarchy::createDiagramTree( Sequence< Reference< XAxis > > aAxes( AxisHelper::getAllAxesOfDiagram( xDiagram, /* bOnlyVisible = */ true ) ); ::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 ); @@ -298,7 +303,7 @@ void ImplObjectHierarchy::createDiagramTree( { //main grid rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel ) ); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel ) ) ); } Sequence< Reference< beans::XPropertySet > > aSubGrids( xAxis->getSubGridProperties() );; @@ -310,7 +315,7 @@ void ImplObjectHierarchy::createDiagramTree( { //sub grid rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, nSubGrid ) ); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifierForGrid( xAxis, xChartModel, nSubGrid ) ) ); } } } @@ -320,7 +325,7 @@ void ImplObjectHierarchy::createDiagramTree( if( bHasWall ) { rContainer.push_back( - ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString())); + ObjectIdentifier( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString() ) ) ); } // Floor @@ -329,13 +334,13 @@ void ImplObjectHierarchy::createDiagramTree( 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() ) ) ); } } void ImplObjectHierarchy::createDataSeriesTree( - ObjectHierarchy::tChildContainer & rOutDiagramSubContainer, - const Reference< XCoordinateSystemContainer > & xCooSysCnt ) + ObjectHierarchy::tChildContainer& rOutDiagramSubContainer, + const Reference< XCoordinateSystemContainer >& xCooSysCnt ) { try { @@ -358,9 +363,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; @@ -373,7 +378,7 @@ void ImplObjectHierarchy::createDataSeriesTree( { bool bIsAverageLine = RegressionCurveHelper::isMeanValueLine( aCurves[nCurveIdx] ); aSeriesSubContainer.push_back( - ObjectIdentifier::createDataCurveCID( aSeriesParticle, nCurveIdx, bIsAverageLine )); + ObjectIdentifier( ObjectIdentifier::createDataCurveCID( aSeriesParticle, nCurveIdx, bIsAverageLine ) ) ); Reference< beans::XPropertySet > xEqProp( aCurves[nCurveIdx]->getEquationProperties()); bool bShowEq = false; bool bShowCoeff = false; @@ -383,7 +388,7 @@ void ImplObjectHierarchy::createDataSeriesTree( ( bShowEq || bShowCoeff ) ) { aSeriesSubContainer.push_back( - ObjectIdentifier::createDataCurveEquationCID( aSeriesParticle, nCurveIdx )); + ObjectIdentifier( ObjectIdentifier::createDataCurveEquationCID( aSeriesParticle, nCurveIdx ) ) ); } } Reference< beans::XPropertySet > xSeriesProp( aSeriesSeq[nSeriesIdx], uno::UNO_QUERY ); @@ -397,8 +402,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 ) ) ); } } } @@ -408,12 +413,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; } } } @@ -424,9 +429,38 @@ void ImplObjectHierarchy::createDataSeriesTree( } } -bool ImplObjectHierarchy::hasChildren( const OUString & rParent ) +void ImplObjectHierarchy::createAdditionalShapesTree( ObjectHierarchy::tChildContainer& rContainer ) +{ + 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.getLength()) + if ( rParent.isValid() ) { tChildMap::const_iterator aIt( m_aChildMap.find( rParent )); if( aIt != m_aChildMap.end()) @@ -435,9 +469,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()) @@ -446,9 +480,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 ) @@ -462,23 +496,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; @@ -486,17 +520,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 */, @@ -508,60 +543,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; @@ -570,16 +605,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( @@ -608,7 +645,7 @@ bool ObjectKeyNavigation::handleKeyEvent( bResult = down(); break; case awt::Key::ESCAPE: - setCurrentSelection( OUString()); + setCurrentSelection( ObjectIdentifier() ); bResult = true; break; default: @@ -618,20 +655,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()); @@ -643,7 +680,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()); @@ -655,7 +692,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 9c50d316c2f6..1bda68a8ebad 100644 --- a/chart2/source/controller/main/SelectionHelper.cxx +++ b/chart2/source/controller/main/SelectionHelper.cxx @@ -96,6 +96,20 @@ uno::Reference< drawing::XShape > Selection::getSelectedAdditionalShape() return m_xSelectAdditionalShape; } +ObjectIdentifier Selection::getSelectedOID() const +{ + ObjectIdentifier aReturn; + if ( m_aSelectedObjectCID.getLength() > 0 ) + { + aReturn = ObjectIdentifier( m_aSelectedObjectCID ); + } + else if ( m_xSelectAdditionalShape.is() ) + { + aReturn = ObjectIdentifier( m_xSelectAdditionalShape ); + } + return aReturn; +} + bool Selection::setSelection( const ::rtl::OUString& rCID ) { if( !rCID.equals( m_aSelectedObjectCID ) ) diff --git a/chart2/source/controller/main/SelectionHelper.hxx b/chart2/source/controller/main/SelectionHelper.hxx index bf540e86802e..6ef3f2f67c0e 100644 --- a/chart2/source/controller/main/SelectionHelper.hxx +++ b/chart2/source/controller/main/SelectionHelper.hxx @@ -42,6 +42,8 @@ namespace chart { //............................................................................. +class ObjectIdentifier; + //----------------------------------------------------------------------------- /** */ @@ -53,6 +55,7 @@ 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< |