LCOV - code coverage report
Current view: top level - libreoffice/chart2/source/tools - ObjectIdentifier.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 198 753 26.3 %
Date: 2012-12-27 Functions: 22 75 29.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include "ObjectIdentifier.hxx"
      22             : #include "macros.hxx"
      23             : #include "TitleHelper.hxx"
      24             : #include "ChartModelHelper.hxx"
      25             : #include "AxisHelper.hxx"
      26             : #include "servicenames_charttypes.hxx"
      27             : #include "DiagramHelper.hxx"
      28             : #include "AxisIndexDefines.hxx"
      29             : #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
      30             : #include <com/sun/star/chart2/XChartDocument.hpp>
      31             : #include <com/sun/star/chart2/XChartTypeContainer.hpp>
      32             : #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
      33             : #include <com/sun/star/chart2/XAxis.hpp>
      34             : #include <com/sun/star/chart2/XRegressionCurveContainer.hpp>
      35             : 
      36             : // header for define DBG_ASSERT
      37             : #include <tools/debug.hxx>
      38             : #include <comphelper/InlineContainer.hxx>
      39             : 
      40             : #include <rtl/ustrbuf.hxx>
      41             : 
      42             : //.............................................................................
      43             : namespace chart
      44             : {
      45             : //.............................................................................
      46             : using namespace ::com::sun::star;
      47             : using namespace ::com::sun::star::chart2;
      48             : 
      49             : using rtl::OUString;
      50             : using rtl::OUStringBuffer;
      51             : using ::com::sun::star::uno::Reference;
      52             : using ::com::sun::star::uno::Any;
      53             : 
      54           1 : static OUString m_aMultiClick( C2U("MultiClick") );
      55           1 : static OUString m_aDragMethodEquals( C2U("DragMethod=") );
      56           1 : static OUString m_aDragParameterEquals( C2U("DragParameter=") );
      57           1 : static OUString m_aProtocol( C2U("CID/") );
      58           1 : static OUString m_aEmptyString;
      59           1 : static OUString m_aPieSegmentDragMethodServiceName( C2U("PieSegmentDraging") );
      60             : 
      61             : namespace
      62             : {
      63             : 
      64         963 : OUString lcl_createClassificationStringForType( ObjectType eObjectType
      65             :             , const OUString& rDragMethodServiceName
      66             :             , const OUString& rDragParameterString
      67             :             )
      68             : {
      69         963 :     OUStringBuffer aRet;
      70         963 :     switch( eObjectType )
      71             :     {
      72             :         //these object types are all selected only after their parents was selected before
      73             :         case OBJECTTYPE_LEGEND_ENTRY: //parent is intended to be OBJECTTYPE_LEGEND
      74             :         case OBJECTTYPE_DATA_POINT: //parent is intended to be OBJECTTYPE_DATA_SERIES
      75             :         case OBJECTTYPE_DATA_LABEL: //parent is intended to be OBJECTTYPE_DATA_LABELS
      76             :         case OBJECTTYPE_DATA_ERRORS_X: //parent is intended to be OBJECTTYPE_DATA_ERRORS
      77             :         case OBJECTTYPE_DATA_ERRORS_Y: //parent is intended to be OBJECTTYPE_DATA_ERRORS
      78             :         case OBJECTTYPE_DATA_ERRORS_Z: //parent is intended to be OBJECTTYPE_DATA_ERRORS
      79         369 :             aRet=m_aMultiClick;
      80             :         default:
      81             :             ;//empty string
      82             :     }
      83         963 :     if( !rDragMethodServiceName.isEmpty() )
      84             :     {
      85           0 :         if( aRet.getLength() )
      86           0 :             aRet.appendAscii(":");
      87           0 :         aRet.append( m_aDragMethodEquals );
      88           0 :         aRet.append( rDragMethodServiceName );
      89             : 
      90           0 :         if( !rDragParameterString.isEmpty() )
      91             :         {
      92           0 :             if( aRet.getLength() )
      93           0 :                 aRet.appendAscii(":");
      94           0 :             aRet.append( m_aDragParameterEquals );
      95           0 :             aRet.append( rDragParameterString );
      96             :         }
      97             :     }
      98         963 :     return aRet.makeStringAndClear();
      99             : }
     100             : 
     101             : typedef ::comphelper::MakeMap< TitleHelper::eTitleType, OUString > tTitleMap;
     102          20 : const tTitleMap& lcl_getTitleMap()
     103             : {
     104             :     //maps the title type to the ParentParticle for that title
     105             :     static tTitleMap m_aTitleMap = tTitleMap
     106             :         ( TitleHelper::MAIN_TITLE, C2U("") )
     107           2 :         ( TitleHelper::SUB_TITLE, C2U("D=0") )
     108           3 :         ( TitleHelper::X_AXIS_TITLE, C2U("D=0:CS=0:Axis=0,0") )
     109           3 :         ( TitleHelper::Y_AXIS_TITLE, C2U("D=0:CS=0:Axis=1,0") )
     110           3 :         ( TitleHelper::Z_AXIS_TITLE, C2U("D=0:CS=0:Axis=2,0") )
     111           3 :         ( TitleHelper::SECONDARY_X_AXIS_TITLE, C2U("D=0:CS=0:Axis=0,1") )
     112          22 :         ( TitleHelper::SECONDARY_Y_AXIS_TITLE, C2U("D=0:CS=0:Axis=1,1") )
     113             :         ;
     114          20 :     return m_aTitleMap;
     115             : }
     116             : 
     117          20 : OUString lcl_getTitleParentParticle( TitleHelper::eTitleType aTitleType )
     118             : {
     119          20 :     OUString aRet;
     120             : 
     121          20 :     const tTitleMap& rMap = lcl_getTitleMap();
     122          20 :     tTitleMap::const_iterator aIt( rMap.find( aTitleType ) );
     123          20 :     if( aIt != rMap.end())
     124          20 :         aRet = (*aIt).second;
     125             : 
     126          20 :     return aRet;
     127             : }
     128             : 
     129           0 : Reference<XChartType> lcl_getFirstStockChartType( const Reference< frame::XModel >& xChartModel )
     130             : {
     131           0 :     Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
     132           0 :     if(!xDiagram.is())
     133           0 :         return 0;
     134             : 
     135             :     //iterate through all coordinate systems
     136           0 :     Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
     137           0 :     if( !xCooSysContainer.is())
     138           0 :         return 0;
     139             : 
     140           0 :     uno::Sequence< Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() );
     141           0 :     for( sal_Int32 nCS = 0; nCS < aCooSysList.getLength(); ++nCS )
     142             :     {
     143             :         //iterate through all chart types in the current coordinate system
     144           0 :         Reference< XChartTypeContainer > xChartTypeContainer( aCooSysList[nCS], uno::UNO_QUERY );
     145           0 :         if( !xChartTypeContainer.is() )
     146           0 :             continue;
     147             : 
     148           0 :         uno::Sequence< Reference< XChartType > > aChartTypeList( xChartTypeContainer->getChartTypes() );
     149           0 :         for( sal_Int32 nT = 0; nT < aChartTypeList.getLength(); ++nT )
     150             :         {
     151           0 :             Reference< XChartType > xChartType( aChartTypeList[nT] );
     152           0 :             if(!xChartType.is())
     153           0 :                 continue;
     154           0 :             OUString aChartType = xChartType->getChartType();
     155           0 :             if( aChartType.equalsIgnoreAsciiCase(CHART2_SERVICE_NAME_CHARTTYPE_CANDLESTICK) )
     156           0 :                 return xChartType;
     157           0 :         }
     158           0 :     }
     159           0 :     return 0;
     160             : }
     161             : 
     162           0 : OUString lcl_getIndexStringAfterString( const OUString& rString, const OUString& rSearchString )
     163             : {
     164           0 :     OUStringBuffer aRet;
     165             : 
     166           0 :     sal_Int32 nIndexStart = rString.lastIndexOf( rSearchString );
     167           0 :     if( nIndexStart != -1 )
     168             :     {
     169           0 :         nIndexStart += rSearchString.getLength();
     170           0 :         sal_Int32 nIndexEnd = rString.getLength();
     171           0 :         sal_Int32 nNextColon = rString.indexOf( ':', nIndexStart );
     172           0 :         if( nNextColon != -1 )
     173           0 :             nIndexEnd = nNextColon;
     174           0 :         aRet = rString.copy(nIndexStart,nIndexEnd-nIndexStart);
     175             :     }
     176             : 
     177           0 :     return aRet.makeStringAndClear();
     178             : }
     179             : 
     180           0 : sal_Int32 lcl_StringToIndex( const OUString& rIndexString )
     181             : {
     182           0 :     sal_Int32 nRet = -1;
     183           0 :     if( !rIndexString.isEmpty() )
     184             :     {
     185           0 :         nRet = rIndexString.toInt32();
     186           0 :         if( nRet < -1 )
     187           0 :             nRet = -1;
     188             :     }
     189           0 :     return nRet;
     190             : }
     191             : 
     192           0 : void lcl_parseCooSysIndices( sal_Int32& rnDiagram, sal_Int32& rnCooSys, const OUString& rString )
     193             : {
     194           0 :     rnDiagram = lcl_StringToIndex( lcl_getIndexStringAfterString( rString, C2U("D=") ) );
     195           0 :     rnCooSys = lcl_StringToIndex( lcl_getIndexStringAfterString( rString, C2U("CS=") ) );
     196           0 : }
     197             : 
     198           0 : void lcl_parseAxisIndices( sal_Int32& rnDimensionIndex, sal_Int32& rnAxisIndex, const OUString& rString )
     199             : {
     200           0 :     OUString aAxisIndexString = lcl_getIndexStringAfterString( rString, C2U(":Axis=") );
     201           0 :     sal_Int32 nCharacterIndex=0;
     202           0 :     rnDimensionIndex = lcl_StringToIndex( aAxisIndexString.getToken( 0, ',', nCharacterIndex ) );
     203           0 :     rnAxisIndex = lcl_StringToIndex( aAxisIndexString.getToken( 0, ',', nCharacterIndex ) );
     204           0 : }
     205             : 
     206           0 : void lcl_parseGridIndices( sal_Int32& rnSubGridIndex, const OUString& rString )
     207             : {
     208           0 :     rnSubGridIndex = -1;
     209           0 :     rnSubGridIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rString, C2U(":SubGrid=") ) );
     210           0 : }
     211             : 
     212           0 : void lcl_parseSeriesIndices( sal_Int32& rnChartTypeIndex, sal_Int32& rnSeriesIndex, sal_Int32& rnPointIndex, const OUString& rString )
     213             : {
     214           0 :     rnChartTypeIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rString, C2U("CT=") ) );
     215           0 :     rnSeriesIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rString, C2U("Series=") ) );
     216           0 :     rnPointIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rString, C2U("Point=") ) );
     217           0 : }
     218             : 
     219           0 : void lcl_getDiagramAndCooSys( const OUString& rObjectCID
     220             :                 , const Reference< frame::XModel >& xChartModel
     221             :                 , Reference< XDiagram >& xDiagram
     222             :                 , Reference< XCoordinateSystem >& xCooSys )
     223             : {
     224           0 :     sal_Int32 nDiagramIndex = -1;
     225           0 :     sal_Int32 nCooSysIndex = -1;
     226           0 :     lcl_parseCooSysIndices( nDiagramIndex, nCooSysIndex, rObjectCID );
     227           0 :     xDiagram = ChartModelHelper::findDiagram( xChartModel );//todo use nDiagramIndex when more than one diagram is possible in future
     228           0 :     if( !xDiagram.is() )
     229           0 :         return;
     230             : 
     231           0 :     if( nCooSysIndex > -1 )
     232             :     {
     233           0 :         Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
     234           0 :         if( xCooSysContainer.is() )
     235             :         {
     236           0 :             uno::Sequence< Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() );
     237           0 :             if( nCooSysIndex < aCooSysList.getLength() )
     238           0 :                 xCooSys = aCooSysList[nCooSysIndex];
     239           0 :         }
     240             :     }
     241             : }
     242             : 
     243             : } //anonymous namespace
     244             : 
     245           0 : ObjectIdentifier::ObjectIdentifier()
     246             :     :m_aObjectCID( OUString() )
     247           0 :     ,m_xAdditionalShape( 0 )
     248             : {
     249           0 : }
     250             : 
     251           0 : ObjectIdentifier::ObjectIdentifier( const OUString& rObjectCID )
     252             :     :m_aObjectCID( rObjectCID )
     253           0 :     ,m_xAdditionalShape( 0 )
     254             : {
     255           0 : }
     256             : 
     257           0 : ObjectIdentifier::ObjectIdentifier( const Reference< drawing::XShape >& rxShape )
     258             :     :m_aObjectCID( OUString() )
     259           0 :     ,m_xAdditionalShape( rxShape )
     260             : {
     261           0 : }
     262             : 
     263           0 : ObjectIdentifier::ObjectIdentifier( const Any& rAny )
     264             :     :m_aObjectCID( OUString() )
     265           0 :     ,m_xAdditionalShape( 0 )
     266             : {
     267           0 :     const uno::Type& rType = rAny.getValueType();
     268           0 :     if ( rType == ::getCppuType( static_cast< const OUString* >( 0 ) ) )
     269             :     {
     270           0 :         rAny >>= m_aObjectCID;
     271             :     }
     272           0 :     else if ( rType == ::getCppuType( static_cast< const Reference< drawing::XShape >* >( 0 ) ) )
     273             :     {
     274           0 :         rAny >>= m_xAdditionalShape;
     275             :     }
     276           0 : }
     277             : 
     278           0 : ObjectIdentifier::~ObjectIdentifier()
     279             : {
     280           0 : }
     281             : 
     282           0 : ObjectIdentifier::ObjectIdentifier( const ObjectIdentifier& rOID )
     283             :     :m_aObjectCID( rOID.m_aObjectCID )
     284           0 :     ,m_xAdditionalShape( rOID.m_xAdditionalShape )
     285             : {
     286             : 
     287           0 : }
     288             : 
     289           0 : ObjectIdentifier& ObjectIdentifier::operator=( const ObjectIdentifier& rOID )
     290             : {
     291           0 :     m_aObjectCID = rOID.m_aObjectCID;
     292           0 :     m_xAdditionalShape = rOID.m_xAdditionalShape;
     293           0 :     return *this;
     294             : }
     295             : 
     296           0 : bool ObjectIdentifier::operator==( const ObjectIdentifier& rOID ) const
     297             : {
     298           0 :     if ( areIdenticalObjects( m_aObjectCID, rOID.m_aObjectCID ) &&
     299           0 :          ( m_xAdditionalShape == rOID.m_xAdditionalShape ) )
     300             :     {
     301           0 :         return true;
     302             :     }
     303           0 :     return false;
     304             : }
     305             : 
     306           0 : bool ObjectIdentifier::operator!=( const ObjectIdentifier& rOID ) const
     307             : {
     308           0 :     return !operator==( rOID );
     309             : }
     310             : 
     311           0 : bool ObjectIdentifier::operator<( const ObjectIdentifier& rOID ) const
     312             : {
     313           0 :     bool bReturn = false;
     314           0 :     if ( !(m_aObjectCID.isEmpty() || rOID.m_aObjectCID.isEmpty()) )
     315             :     {
     316           0 :         bReturn = ( m_aObjectCID.compareTo( rOID.m_aObjectCID ) < 0 );
     317             :     }
     318           0 :     else if ( !m_aObjectCID.isEmpty() )
     319             :     {
     320           0 :         bReturn = true;
     321             :     }
     322           0 :     else if ( !rOID.m_aObjectCID.isEmpty() )
     323             :     {
     324           0 :         bReturn = false;
     325             :     }
     326           0 :     else if ( m_xAdditionalShape.is() && rOID.m_xAdditionalShape.is() )
     327             :     {
     328           0 :         bReturn = ( m_xAdditionalShape < rOID.m_xAdditionalShape );
     329             :     }
     330           0 :     return bReturn;
     331             : }
     332             : 
     333          20 : OUString ObjectIdentifier::createClassifiedIdentifierForObject(
     334             :           const Reference< uno::XInterface >& xObject
     335             :         , const Reference< frame::XModel >& xChartModel )
     336             : {
     337          20 :     OUString aRet;
     338             : 
     339          20 :     enum ObjectType eObjectType = OBJECTTYPE_UNKNOWN;
     340          20 :     OUString aObjectID;
     341          20 :     OUString aParentParticle;
     342          20 :     OUString aDragMethodServiceName;
     343          20 :     OUString aDragParameterString;
     344             : 
     345             : 
     346             :     try
     347             :     {
     348             :         //title
     349          20 :         Reference< XTitle > xTitle( xObject, uno::UNO_QUERY );
     350          20 :         if( xTitle.is() )
     351             :         {
     352             :             TitleHelper::eTitleType aTitleType;
     353          20 :             if( TitleHelper::getTitleType( aTitleType, xTitle, xChartModel ) )
     354             :             {
     355          20 :                 eObjectType = OBJECTTYPE_TITLE;
     356          20 :                 aParentParticle = lcl_getTitleParentParticle( aTitleType );
     357             :                 aRet = ObjectIdentifier::createClassifiedIdentifierWithParent(
     358          20 :                     eObjectType, aObjectID, aParentParticle, aDragMethodServiceName, aDragParameterString );
     359             :             }
     360          20 :             return aRet;
     361             : 
     362             :         }
     363             : 
     364             :         //axis
     365           0 :         Reference< XAxis > xAxis( xObject, uno::UNO_QUERY );
     366           0 :         if( xAxis.is() )
     367             :         {
     368           0 :             Reference< XCoordinateSystem > xCooSys( AxisHelper::getCoordinateSystemOfAxis( xAxis, ChartModelHelper::findDiagram( xChartModel ) ) );
     369           0 :             rtl::OUString aCooSysParticle( createParticleForCoordinateSystem( xCooSys, xChartModel ) );
     370           0 :             sal_Int32 nDimensionIndex=-1;
     371           0 :             sal_Int32 nAxisIndex=-1;
     372           0 :             AxisHelper::getIndicesForAxis( xAxis, xCooSys, nDimensionIndex, nAxisIndex );
     373           0 :             rtl::OUString aAxisParticle( createParticleForAxis( nDimensionIndex, nAxisIndex ) );
     374           0 :             return createClassifiedIdentifierForParticles( aCooSysParticle, aAxisParticle );
     375             :         }
     376             : 
     377             :         //legend
     378           0 :         Reference< XLegend > xLegend( xObject, uno::UNO_QUERY );
     379           0 :         if( xLegend.is() )
     380             :         {
     381           0 :             return createClassifiedIdentifierForParticle( createParticleForLegend( xLegend, xChartModel ) );
     382             :         }
     383             : 
     384             :         //diagram
     385           0 :         Reference< XDiagram > xDiagram( xObject, uno::UNO_QUERY );
     386           0 :         if( xDiagram.is() )
     387             :         {
     388           0 :             return createClassifiedIdentifierForParticle( createParticleForDiagram( xDiagram, xChartModel ) );
     389           0 :         }
     390             : 
     391             :         //todo
     392             :         //XDataSeries
     393             :         //CooSys
     394             :         //charttype
     395             :         //datapoint?
     396             :         //Gridproperties
     397             :     }
     398           0 :     catch(const uno::Exception& ex)
     399             :     {
     400             :         ASSERT_EXCEPTION( ex );
     401             :     }
     402             : 
     403           0 :     if( eObjectType != OBJECTTYPE_UNKNOWN )
     404             :     {
     405             :         aRet = ObjectIdentifier::createClassifiedIdentifierWithParent(
     406           0 :             eObjectType, aObjectID, aParentParticle, aDragMethodServiceName, aDragParameterString );
     407             :     }
     408             :     else
     409             :     {
     410             :         OSL_FAIL("give object could not be identifed in createClassifiedIdentifierForObject");
     411             :     }
     412             : 
     413           0 :     return aRet;
     414             : }
     415             : 
     416         164 : OUString ObjectIdentifier::createClassifiedIdentifierForParticle(
     417             :         const OUString& rParticle )
     418             : {
     419         164 :     return ObjectIdentifier::createClassifiedIdentifierForParticles( rParticle, OUString() );
     420             : }
     421             : 
     422         697 : OUString ObjectIdentifier::createClassifiedIdentifierForParticles(
     423             :             const OUString& rParentParticle
     424             :           , const OUString& rChildParticle
     425             :           , const OUString& rDragMethodServiceName
     426             :           , const OUString& rDragParameterString )
     427             : {
     428         697 :     ObjectType eObjectType( ObjectIdentifier::getObjectType( rChildParticle ) );
     429         697 :     if( eObjectType == OBJECTTYPE_UNKNOWN )
     430         164 :         eObjectType = ObjectIdentifier::getObjectType( rParentParticle );
     431             : 
     432         697 :     OUStringBuffer aRet( m_aProtocol );
     433         697 :     aRet.append( lcl_createClassificationStringForType( eObjectType, rDragMethodServiceName, rDragParameterString ));
     434         697 :     if(aRet.getLength()>m_aProtocol.getLength())
     435         246 :         aRet.appendAscii("/");
     436             : 
     437         697 :     if(!rParentParticle.isEmpty())
     438             :     {
     439         697 :         aRet.append(rParentParticle);
     440         697 :         if( !rChildParticle.isEmpty() )
     441         533 :             aRet.appendAscii(":");
     442             :     }
     443         697 :     aRet.append(rChildParticle);
     444             : 
     445         697 :     return aRet.makeStringAndClear();
     446             : }
     447             : 
     448          82 : OUString ObjectIdentifier::createParticleForDiagram(
     449             :           const Reference< XDiagram >& /*xDiagram*/
     450             :         , const Reference< frame::XModel >& /*xChartModel*/ )
     451             : {
     452          82 :     static OUString aRet(C2U("D=0"));
     453             :     //todo: if more than one diagram is implemeted, add the correct diagram index here
     454          82 :     return aRet;
     455             : }
     456             : 
     457          41 : OUString ObjectIdentifier::createParticleForCoordinateSystem(
     458             :           const Reference< XCoordinateSystem >& xCooSys
     459             :         , const Reference< frame::XModel >& xChartModel )
     460             : {
     461          41 :     OUStringBuffer aRet;
     462             : 
     463          41 :     Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
     464          41 :     Reference< XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY );
     465          41 :     if( xCooSysContainer.is() )
     466             :     {
     467          41 :         sal_Int32 nCooSysIndex = 0;
     468          41 :         uno::Sequence< Reference< XCoordinateSystem > > aCooSysList( xCooSysContainer->getCoordinateSystems() );
     469          41 :         for( ; nCooSysIndex < aCooSysList.getLength(); ++nCooSysIndex )
     470             :         {
     471          41 :             Reference< XCoordinateSystem > xCurrentCooSys( aCooSysList[nCooSysIndex] );
     472          41 :             if( xCooSys == xCurrentCooSys )
     473             :             {
     474          41 :                 aRet = ObjectIdentifier::createParticleForDiagram( xDiagram, xChartModel );
     475          41 :                 aRet.appendAscii(":CS=");
     476          41 :                 aRet.append( OUString::valueOf( nCooSysIndex ) );
     477             :                 break;
     478             :             }
     479          82 :         }
     480             :     }
     481             : 
     482          41 :     return aRet.makeStringAndClear();
     483             : }
     484             : 
     485          82 : OUString ObjectIdentifier::createParticleForAxis(
     486             :             sal_Int32 nDimensionIndex
     487             :           , sal_Int32 nAxisIndex )
     488             : {
     489          82 :     OUStringBuffer aRet(C2U("Axis="));
     490             : 
     491          82 :     aRet.append( OUString::valueOf( nDimensionIndex ) );
     492          82 :     aRet.appendAscii(",");
     493          82 :     aRet.append( OUString::valueOf( nAxisIndex ) );
     494             : 
     495          82 :     return aRet.makeStringAndClear();
     496             : }
     497             : 
     498          82 : OUString ObjectIdentifier::createParticleForGrid(
     499             :             sal_Int32 nDimensionIndex
     500             :           , sal_Int32 nAxisIndex )
     501             : {
     502          82 :     OUStringBuffer aRet(C2U("Axis="));
     503          82 :     aRet.append( OUString::valueOf( nDimensionIndex ) );
     504          82 :     aRet.appendAscii(",");
     505          82 :     aRet.append( OUString::valueOf( nAxisIndex ) );
     506          82 :     aRet.append( C2U(":Grid=0") );
     507             : 
     508          82 :     return aRet.makeStringAndClear();
     509             : }
     510             : 
     511           0 : OUString ObjectIdentifier::createClassifiedIdentifierForGrid(
     512             :           const Reference< XAxis >& xAxis
     513             :         , const Reference< frame::XModel >& xChartModel
     514             :         , sal_Int32 nSubGridIndex )
     515             : {
     516             :     //-1: main grid, 0: first subgrid etc
     517             : 
     518           0 :     rtl::OUString aAxisCID( createClassifiedIdentifierForObject( xAxis, xChartModel ) );
     519             :     rtl::OUString aGridCID( addChildParticle( aAxisCID
     520           0 :         , createChildParticleWithIndex( OBJECTTYPE_GRID, 0 ) ) );
     521           0 :     if( nSubGridIndex >= 0 )
     522             :     {
     523             :         aGridCID = addChildParticle( aGridCID
     524           0 :             , createChildParticleWithIndex( OBJECTTYPE_SUBGRID, 0 ) );
     525             :     }
     526           0 :     return aGridCID;
     527             : }
     528             : 
     529         123 : OUString ObjectIdentifier::createParticleForSeries(
     530             :               sal_Int32 nDiagramIndex, sal_Int32 nCooSysIndex
     531             :             , sal_Int32 nChartTypeIndex, sal_Int32 nSeriesIndex )
     532             : {
     533         123 :     OUStringBuffer aRet;
     534             : 
     535         123 :     aRet.appendAscii("D=");
     536         123 :     aRet.append( OUString::valueOf( nDiagramIndex ) );
     537         123 :     aRet.appendAscii(":CS=");
     538         123 :     aRet.append( OUString::valueOf( nCooSysIndex ) );
     539         123 :     aRet.appendAscii(":CT=");
     540         123 :     aRet.append( OUString::valueOf( nChartTypeIndex ) );
     541         123 :     aRet.appendAscii(":");
     542         123 :     aRet.append(getStringForType( OBJECTTYPE_DATA_SERIES ));
     543         123 :     aRet.appendAscii("=");
     544         123 :     aRet.append( OUString::valueOf( nSeriesIndex ) );
     545             : 
     546         123 :     return aRet.makeStringAndClear();
     547             : }
     548             : 
     549          41 : OUString ObjectIdentifier::createParticleForLegend(
     550             :           const Reference< XLegend >& /*xLegend*/
     551             :         , const Reference< frame::XModel >& xChartModel )
     552             : {
     553          41 :     OUStringBuffer aRet;
     554             : 
     555          41 :     Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xChartModel ) );
     556             :     //todo: if more than one diagram is implemeted, find the correct diagram wich is owner of the given legend
     557             : 
     558          41 :     aRet.append( ObjectIdentifier::createParticleForDiagram( xDiagram, xChartModel ) );
     559          41 :     aRet.appendAscii(":");
     560          41 :     aRet.append(getStringForType( OBJECTTYPE_LEGEND ));
     561          41 :     aRet.appendAscii("=");
     562             : 
     563          41 :     return aRet.makeStringAndClear();
     564             : }
     565             : 
     566         123 : OUString ObjectIdentifier::createClassifiedIdentifier(
     567             :         enum ObjectType eObjectType //e.g. OBJECTTYPE_DATA_SERIES
     568             :         , const OUString& rParticleID )//e.g. SeriesID
     569             : {
     570             :     return createClassifiedIdentifierWithParent(
     571         123 :         eObjectType, rParticleID, m_aEmptyString );
     572             : }
     573             : 
     574         266 : OUString ObjectIdentifier::createClassifiedIdentifierWithParent(
     575             :         enum ObjectType eObjectType //e.g. OBJECTTYPE_DATA_POINT or OBJECTTYPE_GRID
     576             :         , const OUString& rParticleID //e.g. Point Index or SubGrid Index
     577             :         , const OUString& rParentPartical //e.g. "Series=SeriesID" or "Grid=GridId"
     578             :         , const OUString& rDragMethodServiceName
     579             :         , const OUString& rDragParameterString
     580             :         )
     581             :         //, bool bIsMultiClickObject ) //e.g. true
     582             : {
     583             :     //e.g. "MultiClick/Series=2:Point=34"
     584             : 
     585         266 :     OUStringBuffer aRet( m_aProtocol );
     586         266 :     aRet.append( lcl_createClassificationStringForType( eObjectType, rDragMethodServiceName, rDragParameterString ));
     587         266 :     if(aRet.getLength()>m_aProtocol.getLength())
     588         123 :         aRet.appendAscii("/");
     589         266 :     aRet.append(rParentPartical);
     590         266 :     if(!rParentPartical.isEmpty())
     591         123 :         aRet.appendAscii(":");
     592             : 
     593         266 :     aRet.append(getStringForType( eObjectType ));
     594         266 :     aRet.appendAscii("=");
     595         266 :     aRet.append(rParticleID);
     596             : 
     597         266 :     return aRet.makeStringAndClear();
     598             : }
     599             : 
     600           0 : const OUString& ObjectIdentifier::getPieSegmentDragMethodServiceName()
     601             : {
     602           0 :     return m_aPieSegmentDragMethodServiceName;
     603             : }
     604             : 
     605           0 : OUString ObjectIdentifier::createPieSegmentDragParameterString(
     606             :           sal_Int32 nOffsetPercent
     607             :         , const awt::Point& rMinimumPosition
     608             :         , const awt::Point& rMaximumPosition )
     609             : {
     610           0 :     OUStringBuffer aRet( OUString::valueOf( nOffsetPercent ) );
     611           0 :     aRet.append( sal_Unicode( ',' ));
     612           0 :     aRet.append( OUString::valueOf( rMinimumPosition.X ) );
     613           0 :     aRet.append( sal_Unicode( ',' ));
     614           0 :     aRet.append( OUString::valueOf( rMinimumPosition.Y ) );
     615           0 :     aRet.append( sal_Unicode( ',' ));
     616           0 :     aRet.append( OUString::valueOf( rMaximumPosition.X ) );
     617           0 :     aRet.append( sal_Unicode( ',' ));
     618           0 :     aRet.append( OUString::valueOf( rMaximumPosition.Y ) );
     619           0 :     return aRet.makeStringAndClear();
     620             : }
     621             : 
     622           0 : bool ObjectIdentifier::parsePieSegmentDragParameterString(
     623             :           const OUString& rDragParameterString
     624             :         , sal_Int32& rOffsetPercent
     625             :         , awt::Point& rMinimumPosition
     626             :         , awt::Point& rMaximumPosition )
     627             : {
     628           0 :     sal_Int32 nCharacterIndex = 0;
     629             : 
     630           0 :     OUString aValueString( rDragParameterString.getToken( 0, ',', nCharacterIndex ) );
     631           0 :     rOffsetPercent = aValueString.toInt32();
     632           0 :     if( nCharacterIndex < 0 )
     633           0 :         return false;
     634             : 
     635           0 :     aValueString = rDragParameterString.getToken( 0, ',', nCharacterIndex );
     636           0 :     rMinimumPosition.X = aValueString.toInt32();
     637           0 :     if( nCharacterIndex < 0 )
     638           0 :         return false;
     639             : 
     640           0 :     aValueString = rDragParameterString.getToken( 0, ',', nCharacterIndex );
     641           0 :     rMinimumPosition.Y = aValueString.toInt32();
     642           0 :     if( nCharacterIndex < 0 )
     643           0 :         return false;
     644             : 
     645           0 :     aValueString = rDragParameterString.getToken( 0, ',', nCharacterIndex );
     646           0 :     rMaximumPosition.X = aValueString.toInt32();
     647           0 :     if( nCharacterIndex < 0 )
     648           0 :         return false;
     649             : 
     650           0 :     aValueString = rDragParameterString.getToken( 0, ',', nCharacterIndex );
     651           0 :     rMaximumPosition.Y = aValueString.toInt32();
     652           0 :     if( nCharacterIndex < 0 )
     653           0 :         return false;
     654             : 
     655           0 :     return true;
     656             : }
     657             : 
     658           0 : OUString ObjectIdentifier::getDragMethodServiceName( const OUString& rCID )
     659             : {
     660           0 :     OUString aRet;
     661             : 
     662           0 :     sal_Int32 nIndexStart = rCID.indexOf( m_aDragMethodEquals );
     663           0 :     if( nIndexStart != -1 )
     664             :     {
     665           0 :         nIndexStart = rCID.indexOf( '=', nIndexStart );
     666           0 :         if( nIndexStart != -1 )
     667             :         {
     668           0 :             nIndexStart++;
     669           0 :             sal_Int32 nNextSlash = rCID.indexOf( '/', nIndexStart );
     670           0 :             if( nNextSlash != -1 )
     671             :             {
     672           0 :                 sal_Int32 nIndexEnd = nNextSlash;
     673           0 :                 sal_Int32 nNextColon = rCID.indexOf( ':', nIndexStart );
     674           0 :                 if( nNextColon < nNextSlash )
     675           0 :                     nIndexEnd = nNextColon;
     676           0 :                 aRet = rCID.copy(nIndexStart,nIndexEnd-nIndexStart);
     677             :             }
     678             :         }
     679             :     }
     680           0 :     return aRet;
     681             : }
     682             : 
     683           0 : OUString ObjectIdentifier::getDragParameterString( const OUString& rCID )
     684             : {
     685           0 :     OUString aRet;
     686             : 
     687           0 :     sal_Int32 nIndexStart = rCID.indexOf( m_aDragParameterEquals );
     688           0 :     if( nIndexStart != -1 )
     689             :     {
     690           0 :         nIndexStart = rCID.indexOf( '=', nIndexStart );
     691           0 :         if( nIndexStart != -1 )
     692             :         {
     693           0 :             nIndexStart++;
     694           0 :             sal_Int32 nNextSlash = rCID.indexOf( '/', nIndexStart );
     695           0 :             if( nNextSlash != -1 )
     696             :             {
     697           0 :                 sal_Int32 nIndexEnd = nNextSlash;
     698           0 :                 sal_Int32 nNextColon = rCID.indexOf( ':', nIndexStart );
     699           0 :                 if( nNextColon < nNextSlash )
     700           0 :                     nIndexEnd = nNextColon;
     701           0 :                 aRet = rCID.copy(nIndexStart,nIndexEnd-nIndexStart);
     702             :             }
     703             :         }
     704             :     }
     705           0 :     return aRet;
     706             : }
     707             : 
     708           0 : bool ObjectIdentifier::isDragableObject( const OUString& rClassifiedIdentifier )
     709             : {
     710           0 :     bool bReturn = false;
     711           0 :     ObjectType eObjectType = ObjectIdentifier::getObjectType( rClassifiedIdentifier );
     712           0 :     switch( eObjectType )
     713             :     {
     714             :         case OBJECTTYPE_TITLE:
     715             :         case OBJECTTYPE_LEGEND:
     716             :         case OBJECTTYPE_DIAGRAM:
     717             :         case OBJECTTYPE_DATA_CURVE_EQUATION:
     718             :         //case OBJECTTYPE_DIAGRAM_WALL:
     719           0 :             bReturn = true;
     720             :             break;
     721             :         default:
     722           0 :             OUString aDragMethodServiceName( ObjectIdentifier::getDragMethodServiceName( rClassifiedIdentifier ) );
     723           0 :             bReturn = !aDragMethodServiceName.isEmpty();
     724           0 :             break;
     725             :     }
     726           0 :     return bReturn;
     727             : }
     728             : 
     729           0 : bool ObjectIdentifier::isDragableObject()
     730             : {
     731           0 :     bool bReturn = false;
     732           0 :     if ( isAutoGeneratedObject() )
     733             :     {
     734           0 :         bReturn = isDragableObject( m_aObjectCID );
     735             :     }
     736           0 :     else if ( isAdditionalShape() )
     737             :     {
     738           0 :         bReturn = true;
     739             :     }
     740           0 :     return bReturn;
     741             : }
     742             : 
     743           0 : bool ObjectIdentifier::isRotateableObject( const OUString& rClassifiedIdentifier )
     744             : {
     745           0 :     bool bReturn = false;
     746           0 :     ObjectType eObjectType = ObjectIdentifier::getObjectType( rClassifiedIdentifier );
     747           0 :     switch( eObjectType )
     748             :     {
     749             :         case OBJECTTYPE_DIAGRAM:
     750             :         //case OBJECTTYPE_DIAGRAM_WALL:
     751           0 :             bReturn = true;
     752           0 :             break;
     753             :         default:
     754           0 :             bReturn = false;
     755           0 :             break;
     756             :     }
     757           0 :     return bReturn;
     758             : }
     759             : 
     760           0 : bool ObjectIdentifier::isMultiClickObject( const OUString& rClassifiedIdentifier )
     761             : {
     762             :     //the name of a shape is it's ClassifiedIdentifier
     763             : 
     764             :     //a MultiClickObject is an object that is selectable by more than one click only ;
     765             :     //before a MultiClickObject can be selected it is necessary that a named parent group object
     766             :     //was selected before;
     767             : 
     768             :     //!!!!! by definition the name of a MultiClickObject starts with "CID/MultiClick:"
     769           0 :     bool bRet = false;
     770           0 :     bRet = rClassifiedIdentifier.match( m_aMultiClick, m_aProtocol.getLength() );
     771           0 :     return bRet;
     772             : }
     773             : 
     774           0 : bool ObjectIdentifier::areSiblings( const OUString& rCID1, const OUString& rCID2 )
     775             : {
     776           0 :     bool bRet=false;
     777           0 :     sal_Int32 nLastSign1 = rCID1.lastIndexOf( '=' );
     778           0 :     sal_Int32 nLastSign2 = rCID2.lastIndexOf( '=' );
     779           0 :     if( nLastSign1 == rCID1.indexOf( '=' ) )//CID cannot be sibling if only one "=" occurs
     780           0 :         bRet=false;
     781           0 :     else if( nLastSign2 == rCID2.indexOf( '=' ) )//CID cannot be sibling if only one "=" occurs
     782           0 :         bRet=false;
     783           0 :     else if( ObjectIdentifier::areIdenticalObjects( rCID1, rCID2 ) )
     784           0 :         bRet=false;
     785             :     else
     786             :     {
     787           0 :         OUString aParent1( ObjectIdentifier::getFullParentParticle( rCID1 ) );
     788           0 :         if( !aParent1.isEmpty() )
     789             :         {
     790           0 :             OUString aParent2( ObjectIdentifier::getFullParentParticle( rCID2 ) );
     791           0 :             bRet=aParent1.equals(aParent2);
     792             :         }
     793             :         //legend entries are special:
     794           0 :         if(!bRet)
     795             :         {
     796           0 :             if( OBJECTTYPE_LEGEND_ENTRY == getObjectType(rCID1)
     797           0 :                 && OBJECTTYPE_LEGEND_ENTRY == getObjectType(rCID2) )
     798           0 :                 bRet = true;
     799           0 :         }
     800             :     }
     801           0 :     return bRet;
     802             : }
     803             : 
     804        1360 : bool ObjectIdentifier::areIdenticalObjects( const OUString& rCID1, const OUString& rCID2 )
     805             : {
     806        1360 :     if( rCID1.equals( rCID2 ) )
     807           0 :         return true;
     808             :     //draggable pie or donut segments need special treatment, as their CIDs do change with offset
     809             :     {
     810        1360 :         if( rCID1.indexOf( m_aPieSegmentDragMethodServiceName ) < 0
     811           0 :             || rCID2.indexOf( m_aPieSegmentDragMethodServiceName ) < 0 )
     812        1360 :             return false;
     813             : 
     814           0 :         OUString aID1( ObjectIdentifier::getObjectID( rCID1 ) );
     815           0 :         OUString aID2( ObjectIdentifier::getObjectID( rCID2 ) );
     816           0 :         if( !aID1.isEmpty() &&  aID1.equals( aID2 ) )
     817           0 :             return true;
     818             :         }
     819           0 :     return false;
     820             : }
     821             : 
     822         799 : OUString ObjectIdentifier::getStringForType( ObjectType eObjectType )
     823             : {
     824         799 :     OUString aRet;
     825         799 :     switch( eObjectType )
     826             :     {
     827             :         case OBJECTTYPE_PAGE:
     828          41 :                 aRet=C2U("Page");
     829          41 :                 break;
     830             :         case OBJECTTYPE_TITLE:
     831          20 :                 aRet=C2U("Title");
     832          20 :                 break;
     833             :         case OBJECTTYPE_LEGEND:
     834          41 :                 aRet=C2U("Legend");
     835          41 :                 break;
     836             :         case OBJECTTYPE_LEGEND_ENTRY:
     837         123 :                 aRet=C2U("LegendEntry");
     838         123 :                 break;
     839             :         case OBJECTTYPE_DIAGRAM:
     840          41 :                 aRet=C2U("D");
     841          41 :                 break;
     842             :         case OBJECTTYPE_DIAGRAM_WALL:
     843          41 :                 aRet=C2U("DiagramWall");
     844          41 :                 break;
     845             :         case OBJECTTYPE_DIAGRAM_FLOOR:
     846           0 :                 aRet=C2U("DiagramFloor");
     847           0 :                 break;
     848             :         case OBJECTTYPE_AXIS:
     849           0 :                 aRet=C2U("Axis");
     850           0 :                 break;
     851             :         case OBJECTTYPE_AXIS_UNITLABEL:
     852           0 :                 aRet=C2U("AxisUnitLabel");
     853           0 :                 break;
     854             :         case OBJECTTYPE_GRID:
     855           0 :                 aRet=C2U("Grid");
     856           0 :                 break;
     857             :         case OBJECTTYPE_SUBGRID:
     858           0 :                 aRet=C2U("SubGrid");
     859           0 :                 break;
     860             :         case OBJECTTYPE_DATA_SERIES:
     861         123 :                 aRet=C2U("Series");
     862         123 :                 break;
     863             :         case OBJECTTYPE_DATA_POINT:
     864         123 :                 aRet=C2U("Point");
     865         123 :                 break;
     866             :         case OBJECTTYPE_DATA_LABELS:
     867         123 :                 aRet=C2U("DataLabels");
     868         123 :                 break;
     869             :         case OBJECTTYPE_DATA_LABEL:
     870         123 :                 aRet=C2U("DataLabel");
     871         123 :                 break;
     872             :         case OBJECTTYPE_DATA_ERRORS_X:
     873           0 :                 aRet=C2U("ErrorsX");
     874           0 :                 break;
     875             :         case OBJECTTYPE_DATA_ERRORS_Y:
     876           0 :                 aRet=C2U("ErrorsY");
     877           0 :                 break;
     878             :         case OBJECTTYPE_DATA_ERRORS_Z:
     879           0 :                 aRet=C2U("ErrorsZ");
     880           0 :                 break;
     881             :         case OBJECTTYPE_DATA_CURVE:
     882           0 :                 aRet=C2U("Curve");
     883           0 :                 break;
     884             :         case OBJECTTYPE_DATA_CURVE_EQUATION:
     885           0 :                 aRet=C2U("Equation");
     886           0 :                 break;
     887             :         case OBJECTTYPE_DATA_AVERAGE_LINE:
     888           0 :                 aRet=C2U("Average");
     889           0 :                 break;
     890             :         case OBJECTTYPE_DATA_STOCK_RANGE:
     891           0 :                 aRet=C2U("StockRange");
     892           0 :                 break;
     893             :         case OBJECTTYPE_DATA_STOCK_LOSS:
     894           0 :                 aRet=C2U("StockLoss");
     895           0 :                 break;
     896             :         case OBJECTTYPE_DATA_STOCK_GAIN:
     897           0 :                 aRet=C2U("StockGain");
     898           0 :                 break;
     899             :         default: //OBJECTTYPE_UNKNOWN
     900             :             ;
     901             :     }
     902         799 :     return aRet;
     903             : }
     904             : 
     905         861 : ObjectType ObjectIdentifier::getObjectType( const OUString& rCID )
     906             : {
     907             :     ObjectType eRet;
     908         861 :     sal_Int32 nLastSign = rCID.lastIndexOf( ':' );//last sign before the type string
     909         861 :     if(nLastSign==-1)
     910         615 :         nLastSign = rCID.lastIndexOf( '/' );
     911         861 :     if(nLastSign==-1)
     912             :     {
     913         615 :         sal_Int32 nEndIndex = rCID.lastIndexOf( '=' );
     914         615 :         if(nEndIndex==-1)
     915         164 :             return OBJECTTYPE_UNKNOWN;
     916         451 :         nLastSign = 0;
     917             :     }
     918         697 :     if( nLastSign>0 )
     919         246 :         nLastSign++;
     920             : 
     921         697 :     if( rCID.match(C2U("Page"),nLastSign) )
     922           0 :         eRet = OBJECTTYPE_PAGE;
     923         697 :     else if( rCID.match(C2U("Title"),nLastSign) )
     924           0 :         eRet = OBJECTTYPE_TITLE;
     925         697 :     else if( rCID.match(C2U("LegendEntry"),nLastSign) )
     926         123 :         eRet = OBJECTTYPE_LEGEND_ENTRY;
     927         574 :     else if( rCID.match(C2U("Legend"),nLastSign) )
     928          41 :         eRet = OBJECTTYPE_LEGEND;
     929         533 :     else if( rCID.match(C2U("DiagramWall"),nLastSign) )
     930           0 :         eRet = OBJECTTYPE_DIAGRAM_WALL;
     931         533 :     else if( rCID.match(C2U("DiagramFloor"),nLastSign) )
     932           0 :         eRet = OBJECTTYPE_DIAGRAM_FLOOR;
     933         533 :     else if( rCID.match(C2U("D="),nLastSign) )
     934           0 :         eRet = OBJECTTYPE_DIAGRAM;
     935         533 :     else if( rCID.match(C2U("AxisUnitLabel"),nLastSign) )
     936           0 :         eRet = OBJECTTYPE_AXIS_UNITLABEL;
     937         533 :     else if( rCID.match(C2U("Axis"),nLastSign) )
     938          82 :         eRet = OBJECTTYPE_AXIS;
     939         451 :     else if( rCID.match(C2U("Grid"),nLastSign) )
     940          82 :         eRet = OBJECTTYPE_GRID;
     941         369 :     else if( rCID.match(C2U("SubGrid"),nLastSign) )
     942           0 :         eRet = OBJECTTYPE_SUBGRID;
     943         369 :     else if( rCID.match(C2U("Series"),nLastSign) )
     944         123 :         eRet = OBJECTTYPE_DATA_SERIES;
     945         246 :     else if( rCID.match(C2U("Point"),nLastSign) )
     946         123 :         eRet = OBJECTTYPE_DATA_POINT;
     947         123 :     else if( rCID.match(C2U("DataLabels"),nLastSign) )
     948         123 :         eRet = OBJECTTYPE_DATA_LABELS;
     949           0 :     else if( rCID.match(C2U("DataLabel"),nLastSign) )
     950           0 :         eRet = OBJECTTYPE_DATA_LABEL;
     951           0 :     else if( rCID.match(C2U("ErrorsX"),nLastSign) )
     952           0 :         eRet = OBJECTTYPE_DATA_ERRORS_X;
     953           0 :     else if( rCID.match(C2U("ErrorsY"),nLastSign) )
     954           0 :         eRet = OBJECTTYPE_DATA_ERRORS_Y;
     955           0 :     else if( rCID.match(C2U("ErrorsZ"),nLastSign) )
     956           0 :         eRet = OBJECTTYPE_DATA_ERRORS_Z;
     957           0 :     else if( rCID.match(C2U("Curve"),nLastSign) )
     958           0 :         eRet = OBJECTTYPE_DATA_CURVE;
     959           0 :     else if( rCID.match(C2U("Equation"),nLastSign) )
     960           0 :         eRet = OBJECTTYPE_DATA_CURVE_EQUATION;
     961           0 :     else if( rCID.match(C2U("Average"),nLastSign) )
     962           0 :         eRet = OBJECTTYPE_DATA_AVERAGE_LINE;
     963           0 :     else if( rCID.match(C2U("StockRange"),nLastSign) )
     964           0 :         eRet = OBJECTTYPE_DATA_STOCK_RANGE;
     965           0 :     else if( rCID.match(C2U("StockLoss"),nLastSign) )
     966           0 :         eRet = OBJECTTYPE_DATA_STOCK_LOSS;
     967           0 :     else if( rCID.match(C2U("StockGain"),nLastSign) )
     968           0 :         eRet = OBJECTTYPE_DATA_STOCK_GAIN;
     969             :     else
     970           0 :         eRet = OBJECTTYPE_UNKNOWN;
     971             : 
     972         697 :     return eRet;
     973             : }
     974             : 
     975           0 : ObjectType ObjectIdentifier::getObjectType()
     976             : {
     977           0 :     ObjectType eObjectType( OBJECTTYPE_UNKNOWN );
     978           0 :     if ( isAutoGeneratedObject() )
     979             :     {
     980           0 :         eObjectType = getObjectType( m_aObjectCID );
     981             :     }
     982           0 :     else if ( isAdditionalShape() )
     983             :     {
     984           0 :         eObjectType = OBJECTTYPE_SHAPE;
     985             :     }
     986           0 :     return eObjectType;
     987             : }
     988             : 
     989           0 : OUString ObjectIdentifier::createDataCurveCID(
     990             :                                 const OUString& rSeriesParticle
     991             :                                 , sal_Int32 nCurveIndex
     992             :                                 , bool bAverageLine )
     993             : {
     994           0 :     OUString aParticleID( OUString::valueOf( nCurveIndex ) );
     995           0 :     ObjectType eType = bAverageLine ? OBJECTTYPE_DATA_AVERAGE_LINE : OBJECTTYPE_DATA_CURVE;
     996           0 :     return createClassifiedIdentifierWithParent( eType, aParticleID, rSeriesParticle );
     997             : }
     998             : 
     999           0 : OUString ObjectIdentifier::createDataCurveEquationCID(
    1000             :                                 const OUString& rSeriesParticle
    1001             :                                 , sal_Int32 nCurveIndex )
    1002             : {
    1003           0 :     OUString aParticleID( OUString::valueOf( nCurveIndex ) );
    1004           0 :     return createClassifiedIdentifierWithParent( OBJECTTYPE_DATA_CURVE_EQUATION, aParticleID, rSeriesParticle );
    1005             : }
    1006             : 
    1007           0 : OUString ObjectIdentifier::addChildParticle( const rtl::OUString& rParticle, const rtl::OUString& rChildParticle )
    1008             : {
    1009           0 :     OUStringBuffer aRet(rParticle);
    1010             : 
    1011           0 :     if( aRet.getLength() && !rChildParticle.isEmpty() )
    1012           0 :         aRet.appendAscii(":");
    1013           0 :     if( !rChildParticle.isEmpty() )
    1014           0 :         aRet.append(rChildParticle);
    1015             : 
    1016           0 :     return aRet.makeStringAndClear();
    1017             : }
    1018             : 
    1019         123 : rtl::OUString ObjectIdentifier::createChildParticleWithIndex( ObjectType eObjectType, sal_Int32 nIndex )
    1020             : {
    1021         123 :     OUStringBuffer aRet( getStringForType( eObjectType ) );
    1022         123 :     if( aRet.getLength() )
    1023             :     {
    1024         123 :         aRet.appendAscii("=");
    1025         123 :         aRet.append(OUString::valueOf(nIndex));
    1026             :     }
    1027         123 :     return aRet.makeStringAndClear();
    1028             : }
    1029             : 
    1030           0 : sal_Int32 ObjectIdentifier::getIndexFromParticleOrCID( const rtl::OUString& rParticleOrCID )
    1031             : {
    1032           0 :     sal_Int32 nRet = -1;
    1033             : 
    1034           0 :     OUString aIndexString = lcl_getIndexStringAfterString( rParticleOrCID, C2U("=") );
    1035           0 :     sal_Int32 nCharacterIndex=0;
    1036           0 :     nRet = lcl_StringToIndex( aIndexString.getToken( 0, ',', nCharacterIndex ) );
    1037             : 
    1038           0 :     return nRet;
    1039             : }
    1040             : 
    1041         123 : OUString ObjectIdentifier::createSeriesSubObjectStub( ObjectType eSubObjectType
    1042             :                     , const rtl::OUString& rSeriesParticle
    1043             :                     , const rtl::OUString& rDragMethodServiceName
    1044             :                     , const rtl::OUString& rDragParameterString )
    1045             : {
    1046         123 :     OUString aChildParticle( getStringForType( eSubObjectType ) );
    1047         123 :     aChildParticle+=(C2U("="));
    1048             : 
    1049             :     return createClassifiedIdentifierForParticles(
    1050             :             rSeriesParticle, aChildParticle
    1051         123 :           , rDragMethodServiceName, rDragParameterString );
    1052             : }
    1053             : 
    1054         492 : OUString ObjectIdentifier::createPointCID( const OUString& rPointCID_Stub, sal_Int32 nIndex  )
    1055             : {
    1056         492 :     OUString aRet(rPointCID_Stub);
    1057         492 :     return aRet+=OUString::valueOf( nIndex );
    1058             : }
    1059             : 
    1060           0 : OUString ObjectIdentifier::getParticleID( const OUString& rCID )
    1061             : {
    1062           0 :     OUString aRet;
    1063           0 :     sal_Int32 nLast = rCID.lastIndexOf('=');
    1064           0 :     if(nLast>=0)
    1065           0 :         aRet = rCID.copy(++nLast);
    1066           0 :     return aRet;
    1067             : }
    1068             : 
    1069           0 : OUString ObjectIdentifier::getFullParentParticle( const OUString& rCID )
    1070             : {
    1071           0 :     OUString aRet;
    1072             : 
    1073           0 :     sal_Int32 nStartPos = rCID.lastIndexOf('/');
    1074           0 :     if( nStartPos>=0 )
    1075             :     {
    1076           0 :         nStartPos++;
    1077           0 :         sal_Int32 nEndPos = rCID.lastIndexOf(':');
    1078           0 :         if( nEndPos>=0 && nStartPos < nEndPos )
    1079             :         {
    1080           0 :             aRet = rCID.copy(nStartPos,nEndPos-nStartPos);
    1081             :         }
    1082             :     }
    1083             : 
    1084           0 :     return aRet;
    1085             : }
    1086             : 
    1087           0 : OUString ObjectIdentifier::getObjectID( const rtl::OUString& rCID )
    1088             : {
    1089           0 :     OUString aRet;
    1090             : 
    1091           0 :     sal_Int32 nStartPos = rCID.lastIndexOf('/');
    1092           0 :     if( nStartPos>=0 )
    1093             :     {
    1094           0 :         nStartPos++;
    1095           0 :         sal_Int32 nEndPos = rCID.getLength();
    1096           0 :         aRet = rCID.copy(nStartPos,nEndPos-nStartPos);
    1097             :     }
    1098             : 
    1099           0 :     return aRet;
    1100             : }
    1101             : 
    1102           0 : bool ObjectIdentifier::isCID( const OUString& rName )
    1103             : {
    1104           0 :     return !rName.isEmpty() && rName.match( m_aProtocol );
    1105             : }
    1106             : 
    1107           0 : Reference< beans::XPropertySet > ObjectIdentifier::getObjectPropertySet(
    1108             :     const OUString& rObjectCID,
    1109             :     const Reference< chart2::XChartDocument >& xChartDocument )
    1110             : {
    1111             :     return ObjectIdentifier::getObjectPropertySet(
    1112           0 :         rObjectCID, Reference< frame::XModel >( xChartDocument, uno::UNO_QUERY ));
    1113             : }
    1114             : 
    1115           0 : Reference< beans::XPropertySet > ObjectIdentifier::getObjectPropertySet(
    1116             :                 const OUString& rObjectCID
    1117             :                 , const Reference< frame::XModel >& xChartModel )
    1118             : {
    1119             :     //return the model object that is indicated by rObjectCID
    1120           0 :     if(rObjectCID.isEmpty())
    1121           0 :         return NULL;
    1122           0 :     if(!xChartModel.is())
    1123           0 :         return NULL;
    1124             : 
    1125           0 :     Reference< beans::XPropertySet > xObjectProperties = NULL;
    1126             :     try
    1127             :     {
    1128           0 :         ObjectType eObjectType = ObjectIdentifier::getObjectType( rObjectCID );
    1129           0 :         OUString aParticleID = ObjectIdentifier::getParticleID( rObjectCID );
    1130             : 
    1131           0 :         Reference< XDiagram > xDiagram;
    1132           0 :         Reference< XCoordinateSystem > xCooSys;
    1133           0 :         lcl_getDiagramAndCooSys( rObjectCID, xChartModel, xDiagram, xCooSys );
    1134             : 
    1135           0 :         switch(eObjectType)
    1136             :         {
    1137             :             case OBJECTTYPE_PAGE:
    1138             :                 {
    1139           0 :                     Reference< XChartDocument > xChartDocument( xChartModel, uno::UNO_QUERY );
    1140           0 :                     if( xChartDocument.is())
    1141           0 :                         xObjectProperties.set( xChartDocument->getPageBackground() );
    1142             :                 }
    1143           0 :                 break;
    1144             :             case OBJECTTYPE_TITLE:
    1145             :                 {
    1146           0 :                     TitleHelper::eTitleType aTitleType = getTitleTypeForCID( rObjectCID );
    1147           0 :                     Reference< XTitle > xTitle( TitleHelper::getTitle( aTitleType, xChartModel ) );
    1148           0 :                     xObjectProperties.set( xTitle, uno::UNO_QUERY );
    1149             :                 }
    1150           0 :                 break;
    1151             :             case OBJECTTYPE_LEGEND:
    1152             :                 {
    1153           0 :                     if( xDiagram.is() )
    1154           0 :                         xObjectProperties.set( xDiagram->getLegend(), uno::UNO_QUERY );
    1155             :                 }
    1156           0 :                 break;
    1157             :             case OBJECTTYPE_LEGEND_ENTRY:
    1158           0 :                     break;
    1159             :             case OBJECTTYPE_DIAGRAM:
    1160             :                 {
    1161           0 :                     xObjectProperties.set( xDiagram, uno::UNO_QUERY );
    1162             :                 }
    1163           0 :                 break;
    1164             :             case OBJECTTYPE_DIAGRAM_WALL:
    1165             :                 {
    1166           0 :                     if( xDiagram.is() )
    1167           0 :                         xObjectProperties.set( xDiagram->getWall() );
    1168             :                 }
    1169           0 :                 break;
    1170             :             case OBJECTTYPE_DIAGRAM_FLOOR:
    1171             :                 {
    1172           0 :                     if( xDiagram.is() )
    1173           0 :                         xObjectProperties.set( xDiagram->getFloor() );
    1174             :                 }
    1175           0 :                 break;
    1176             :             case OBJECTTYPE_AXIS:
    1177             :                 {
    1178           0 :                     sal_Int32 nDimensionIndex = -1;
    1179           0 :                     sal_Int32 nAxisIndex = -1;
    1180           0 :                     lcl_parseAxisIndices( nDimensionIndex, nAxisIndex, rObjectCID );
    1181             : 
    1182             :                     Reference< chart2::XAxis > xAxis(
    1183           0 :                         AxisHelper::getAxis( nDimensionIndex, nAxisIndex, xCooSys ) );
    1184           0 :                     if( xAxis.is() )
    1185           0 :                         xObjectProperties.set( xAxis, uno::UNO_QUERY );
    1186             :                 }
    1187           0 :                 break;
    1188             :             case OBJECTTYPE_AXIS_UNITLABEL:
    1189           0 :                     break;
    1190             :             case OBJECTTYPE_GRID:
    1191             :             case OBJECTTYPE_SUBGRID:
    1192             :                 {
    1193           0 :                     sal_Int32 nDimensionIndex = -1;
    1194           0 :                     sal_Int32 nAxisIndex = -1;
    1195           0 :                     lcl_parseAxisIndices( nDimensionIndex, nAxisIndex, rObjectCID );
    1196             : 
    1197           0 :                     sal_Int32 nSubGridIndex = -1;
    1198           0 :                     lcl_parseGridIndices( nSubGridIndex, rObjectCID );
    1199             : 
    1200           0 :                     xObjectProperties.set( AxisHelper::getGridProperties( xCooSys , nDimensionIndex, nAxisIndex, nSubGridIndex ) );
    1201             :                 }
    1202           0 :                 break;
    1203             :             case OBJECTTYPE_DATA_LABELS:
    1204             :             case OBJECTTYPE_DATA_SERIES:
    1205             :                 {
    1206             :                     Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID(
    1207           0 :                         rObjectCID, xChartModel ) );
    1208           0 :                     if( xSeries.is() )
    1209           0 :                         xObjectProperties = Reference< beans::XPropertySet >( xSeries, uno::UNO_QUERY );
    1210             : 
    1211           0 :                     break;
    1212             :                 }
    1213             :             case OBJECTTYPE_DATA_LABEL:
    1214             :             case OBJECTTYPE_DATA_POINT:
    1215             :                 {
    1216             :                     Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID(
    1217           0 :                         rObjectCID, xChartModel ) );
    1218           0 :                     if(xSeries.is())
    1219             :                     {
    1220           0 :                         sal_Int32 nIndex = aParticleID.toInt32();
    1221           0 :                         xObjectProperties = xSeries->getDataPointByIndex( nIndex );
    1222             :                     }
    1223           0 :                     break;
    1224             :                 }
    1225             :             case OBJECTTYPE_DATA_ERRORS_X:
    1226             :             case OBJECTTYPE_DATA_ERRORS_Y:
    1227             :             case OBJECTTYPE_DATA_ERRORS_Z:
    1228             :                 {
    1229             :                     Reference< XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID(
    1230           0 :                         rObjectCID, xChartModel ) );
    1231           0 :                     if(xSeries.is())
    1232             :                     {
    1233           0 :                         Reference< beans::XPropertySet > xSeriesProp( xSeries, uno::UNO_QUERY );
    1234           0 :                         Reference< beans::XPropertySet > xErrorBarProp;
    1235           0 :                         if( xSeriesProp.is() )
    1236             :                         {
    1237           0 :                             OUString errorBar;
    1238             : 
    1239           0 :                             if ( eObjectType == OBJECTTYPE_DATA_ERRORS_X)
    1240           0 :                                 errorBar = C2U("ErrorBarX");
    1241           0 :                             else if (eObjectType == OBJECTTYPE_DATA_ERRORS_Y)
    1242           0 :                                 errorBar = C2U("ErrorBarY");
    1243             :                             else
    1244           0 :                                 errorBar = C2U("ErrorBarZ");
    1245             : 
    1246           0 :                             xSeriesProp->getPropertyValue( errorBar ) >>= xErrorBarProp;
    1247           0 :                             xObjectProperties = Reference< beans::XPropertySet >( xErrorBarProp, uno::UNO_QUERY );
    1248           0 :                         }
    1249             :                     }
    1250           0 :                     break;
    1251             :                 }
    1252             :             case OBJECTTYPE_DATA_AVERAGE_LINE:
    1253             :             case OBJECTTYPE_DATA_CURVE:
    1254             :             case OBJECTTYPE_DATA_CURVE_EQUATION:
    1255             :                 {
    1256             :                     Reference< XRegressionCurveContainer > xRegressionContainer( ObjectIdentifier::getDataSeriesForCID(
    1257           0 :                         rObjectCID, xChartModel ), uno::UNO_QUERY );
    1258           0 :                     if(xRegressionContainer.is())
    1259             :                     {
    1260           0 :                         sal_Int32 nIndex = aParticleID.toInt32();
    1261             :                         uno::Sequence< Reference< XRegressionCurve > > aCurveList =
    1262           0 :                             xRegressionContainer->getRegressionCurves();
    1263           0 :                         if( nIndex >= 0 && nIndex <aCurveList.getLength() )
    1264             :                         {
    1265           0 :                             if( eObjectType == OBJECTTYPE_DATA_CURVE_EQUATION )
    1266           0 :                                 xObjectProperties.set( aCurveList[nIndex]->getEquationProperties());
    1267             :                             else
    1268           0 :                                 xObjectProperties.set( aCurveList[nIndex], uno::UNO_QUERY );
    1269           0 :                         }
    1270             :                     }
    1271           0 :                     break;
    1272             :                 }
    1273             :             case OBJECTTYPE_DATA_STOCK_RANGE:
    1274           0 :                     break;
    1275             :             case OBJECTTYPE_DATA_STOCK_LOSS:
    1276             :                     {
    1277           0 :                         Reference<XChartType> xChartType( lcl_getFirstStockChartType( xChartModel ) );
    1278           0 :                         Reference< beans::XPropertySet > xChartTypeProps( xChartType, uno::UNO_QUERY );
    1279           0 :                         if(xChartTypeProps.is())
    1280           0 :                             xChartTypeProps->getPropertyValue( C2U( "BlackDay" ) ) >>= xObjectProperties;
    1281             :                     }
    1282           0 :                     break;
    1283             :             case OBJECTTYPE_DATA_STOCK_GAIN:
    1284             :                     {
    1285           0 :                         Reference<XChartType> xChartType( lcl_getFirstStockChartType( xChartModel ) );
    1286           0 :                         Reference< beans::XPropertySet > xChartTypeProps( xChartType, uno::UNO_QUERY );
    1287           0 :                         if(xChartTypeProps.is())
    1288           0 :                             xChartTypeProps->getPropertyValue( C2U( "WhiteDay" ) ) >>= xObjectProperties;
    1289             :                     }
    1290           0 :                     break;
    1291             :             default: //OBJECTTYPE_UNKNOWN
    1292           0 :                     break;
    1293           0 :         }
    1294             :     }
    1295           0 :     catch(const uno::Exception& ex)
    1296             :     {
    1297             :         ASSERT_EXCEPTION( ex );
    1298             :     }
    1299           0 :     return xObjectProperties;
    1300             : }
    1301             : 
    1302           0 : Reference< XAxis > ObjectIdentifier::getAxisForCID(
    1303             :                 const OUString& rObjectCID
    1304             :                 , const Reference< frame::XModel >& xChartModel )
    1305             : {
    1306           0 :     Reference< XDiagram > xDiagram;
    1307           0 :     Reference< XCoordinateSystem > xCooSys;
    1308           0 :     lcl_getDiagramAndCooSys( rObjectCID, xChartModel, xDiagram, xCooSys );
    1309             : 
    1310           0 :     sal_Int32 nDimensionIndex = -1;
    1311           0 :     sal_Int32 nAxisIndex = -1;
    1312           0 :     lcl_parseAxisIndices( nDimensionIndex, nAxisIndex, rObjectCID );
    1313             : 
    1314           0 :     return AxisHelper::getAxis( nDimensionIndex, nAxisIndex, xCooSys );
    1315             : }
    1316             : 
    1317           0 : Reference< XDataSeries > ObjectIdentifier::getDataSeriesForCID(
    1318             :                 const OUString& rObjectCID
    1319             :                 , const Reference< frame::XModel >& xChartModel )
    1320             : {
    1321           0 :     Reference< XDataSeries > xSeries(NULL);
    1322             : 
    1323           0 :     Reference< XDiagram > xDiagram;
    1324           0 :     Reference< XCoordinateSystem > xCooSys;
    1325           0 :     lcl_getDiagramAndCooSys( rObjectCID, xChartModel, xDiagram, xCooSys );
    1326             : 
    1327           0 :     sal_Int32 nChartTypeIndex = -1;
    1328           0 :     sal_Int32 nSeriesIndex = -1;
    1329           0 :     sal_Int32 nPointIndex = -1;
    1330           0 :     lcl_parseSeriesIndices( nChartTypeIndex, nSeriesIndex, nPointIndex, rObjectCID );
    1331             : 
    1332           0 :     Reference< XDataSeriesContainer > xDataSeriesContainer( DiagramHelper::getChartTypeByIndex( xDiagram, nChartTypeIndex ), uno::UNO_QUERY );
    1333           0 :     if( xDataSeriesContainer.is() )
    1334             :     {
    1335           0 :         uno::Sequence< uno::Reference< XDataSeries > > aDataSeriesSeq( xDataSeriesContainer->getDataSeries() );
    1336           0 :         if( nSeriesIndex >= 0 && nSeriesIndex < aDataSeriesSeq.getLength() )
    1337           0 :             xSeries.set( aDataSeriesSeq[nSeriesIndex] );
    1338             :     }
    1339             : 
    1340           0 :     return xSeries;
    1341             : }
    1342             : 
    1343           0 : Reference< XDiagram > ObjectIdentifier::getDiagramForCID(
    1344             :                   const rtl::OUString& rObjectCID
    1345             :                 , const uno::Reference< frame::XModel >& xChartModel )
    1346             : {
    1347           0 :     Reference< XDiagram > xDiagram;
    1348             : 
    1349           0 :     Reference< XCoordinateSystem > xCooSys;
    1350           0 :     lcl_getDiagramAndCooSys( rObjectCID, xChartModel, xDiagram, xCooSys );
    1351             : 
    1352           0 :     return xDiagram;
    1353             : }
    1354             : 
    1355           0 : TitleHelper::eTitleType ObjectIdentifier::getTitleTypeForCID( const OUString& rCID )
    1356             : {
    1357           0 :     TitleHelper::eTitleType eRet( TitleHelper::MAIN_TITLE );
    1358             : 
    1359           0 :     OUString aParentParticle = ObjectIdentifier::getFullParentParticle( rCID );
    1360           0 :     const tTitleMap& rMap = lcl_getTitleMap();
    1361           0 :     tTitleMap::const_iterator aIt( rMap.begin() );
    1362           0 :     for( ;aIt != rMap.end(); ++aIt )
    1363             :     {
    1364           0 :         if( aParentParticle.equals( (*aIt).second ) )
    1365             :         {
    1366           0 :             eRet = (*aIt).first;
    1367           0 :             break;
    1368             :         }
    1369             :     }
    1370             : 
    1371           0 :     return eRet;
    1372             : }
    1373             : 
    1374           0 : OUString ObjectIdentifier::getSeriesParticleFromCID( const OUString& rCID )
    1375             : {
    1376           0 :     sal_Int32 nDiagramIndex = -1;
    1377           0 :     sal_Int32 nCooSysIndex = -1;
    1378           0 :     lcl_parseCooSysIndices( nDiagramIndex, nCooSysIndex, rCID );
    1379             : 
    1380           0 :     sal_Int32 nChartTypeIndex = -1;
    1381           0 :     sal_Int32 nSeriesIndex = -1;
    1382           0 :     sal_Int32 nPointIndex = -1;
    1383           0 :     lcl_parseSeriesIndices( nChartTypeIndex, nSeriesIndex, nPointIndex, rCID );
    1384             : 
    1385           0 :     return ObjectIdentifier::createParticleForSeries( nDiagramIndex, nCooSysIndex, nChartTypeIndex, nSeriesIndex );
    1386             : }
    1387             : 
    1388           0 : OUString ObjectIdentifier::getMovedSeriesCID( const ::rtl::OUString& rObjectCID, sal_Bool bForward )
    1389             : {
    1390           0 :     sal_Int32 nDiagramIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rObjectCID, C2U("CID/D=") ) );
    1391           0 :     sal_Int32 nCooSysIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rObjectCID, C2U("CS=") ) );
    1392           0 :     sal_Int32 nChartTypeIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rObjectCID, C2U("CT=") ) );
    1393           0 :     sal_Int32 nSeriesIndex = lcl_StringToIndex( lcl_getIndexStringAfterString( rObjectCID, C2U("Series=") ) );
    1394             : 
    1395           0 :     if( bForward )
    1396           0 :         nSeriesIndex--;
    1397             :     else
    1398           0 :         nSeriesIndex++;
    1399             : 
    1400           0 :     OUString aRet = ObjectIdentifier::createParticleForSeries( nDiagramIndex, nCooSysIndex, nChartTypeIndex, nSeriesIndex );
    1401           0 :     return ObjectIdentifier::createClassifiedIdentifierForParticle( aRet );
    1402             : }
    1403             : 
    1404           0 : bool ObjectIdentifier::isValid() const
    1405             : {
    1406           0 :     return ( isAutoGeneratedObject() || isAdditionalShape() );
    1407             : }
    1408             : 
    1409           0 : bool ObjectIdentifier::isAutoGeneratedObject() const
    1410             : {
    1411           0 :     return ( !m_aObjectCID.isEmpty() );
    1412             : }
    1413             : 
    1414           0 : bool ObjectIdentifier::isAdditionalShape() const
    1415             : {
    1416           0 :     return m_xAdditionalShape.is();
    1417             : }
    1418             : 
    1419           0 : OUString ObjectIdentifier::getObjectCID() const
    1420             : {
    1421           0 :     return m_aObjectCID;
    1422             : }
    1423             : 
    1424           0 : Reference< drawing::XShape > ObjectIdentifier::getAdditionalShape() const
    1425             : {
    1426           0 :     return m_xAdditionalShape;
    1427             : }
    1428             : 
    1429           0 : Any ObjectIdentifier::getAny() const
    1430             : {
    1431           0 :     Any aAny;
    1432           0 :     if ( isAutoGeneratedObject() )
    1433             :     {
    1434           0 :         aAny = uno::makeAny( getObjectCID() );
    1435             :     }
    1436           0 :     else if ( isAdditionalShape() )
    1437             :     {
    1438           0 :         aAny = uno::makeAny( getAdditionalShape() );
    1439             :     }
    1440           0 :     return aAny;
    1441             : }
    1442             : 
    1443             : //.............................................................................
    1444           3 : } //namespace chart
    1445             : //.............................................................................
    1446             : 
    1447             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10