LCOV - code coverage report
Current view: top level - sc/source/ui/unoobj - nameuno.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 439 633 69.4 %
Date: 2014-11-03 Functions: 63 112 56.2 %
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             : #include <svl/smplhint.hxx>
      21             : #include <vcl/svapp.hxx>
      22             : 
      23             : #include <com/sun/star/sheet/NamedRangeFlag.hpp>
      24             : #include <com/sun/star/awt/XBitmap.hpp>
      25             : #include <com/sun/star/beans/PropertyAttribute.hpp>
      26             : 
      27             : #include <comphelper/servicehelper.hxx>
      28             : #include <cppuhelper/supportsservice.hxx>
      29             : 
      30             : using namespace ::com::sun::star;
      31             : using ::com::sun::star::uno::Reference;
      32             : using ::com::sun::star::uno::Any;
      33             : 
      34             : #include "nameuno.hxx"
      35             : #include "miscuno.hxx"
      36             : #include "cellsuno.hxx"
      37             : #include "convuno.hxx"
      38             : #include "targuno.hxx"
      39             : #include "tokenuno.hxx"
      40             : #include "tokenarray.hxx"
      41             : #include "docsh.hxx"
      42             : #include "docfunc.hxx"
      43             : #include "rangenam.hxx"
      44             : #include "unonames.hxx"
      45             : 
      46             : #include "scui_def.hxx"
      47             : 
      48           0 : static const SfxItemPropertyMapEntry* lcl_GetNamedRangeMap()
      49             : {
      50             :     static const SfxItemPropertyMapEntry aNamedRangeMap_Impl[] =
      51             :     {
      52           0 :         {OUString(SC_UNO_LINKDISPBIT),      0,  cppu::UnoType<awt::XBitmap>::get(), beans::PropertyAttribute::READONLY, 0 },
      53           0 :         {OUString(SC_UNO_LINKDISPNAME),     0,  cppu::UnoType<OUString>::get(),                beans::PropertyAttribute::READONLY, 0 },
      54           0 :         {OUString(SC_UNONAME_TOKENINDEX),   0,  cppu::UnoType<sal_Int32>::get(),                    beans::PropertyAttribute::READONLY, 0 },
      55           0 :         {OUString(SC_UNONAME_ISSHAREDFMLA), 0,  getBooleanCppuType(),                          0, 0 },
      56             :         { OUString(), 0, css::uno::Type(), 0, 0 }
      57           0 :     };
      58           0 :     return aNamedRangeMap_Impl;
      59             : }
      60             : 
      61           0 : static const SfxItemPropertyMapEntry* lcl_GetNamedRangesMap()
      62             : {
      63             :     static const SfxItemPropertyMapEntry aNamedRangesMap_Impl[] =
      64             :     {
      65           0 :         {OUString(SC_UNO_MODIFY_BROADCAST), 0,  getBooleanCppuType(), 0, 0 },
      66             :         { OUString(), 0, css::uno::Type(), 0, 0 }
      67           0 :     };
      68           0 :     return aNamedRangesMap_Impl;
      69             : }
      70             : 
      71             : #define SCNAMEDRANGEOBJ_SERVICE     "com.sun.star.sheet.NamedRange"
      72             : 
      73           0 : SC_SIMPLE_SERVICE_INFO( ScLabelRangeObj, "ScLabelRangeObj", "com.sun.star.sheet.LabelRange" )
      74           0 : SC_SIMPLE_SERVICE_INFO( ScLabelRangesObj, "ScLabelRangesObj", "com.sun.star.sheet.LabelRanges" )
      75           0 : SC_SIMPLE_SERVICE_INFO( ScNamedRangesObj, "ScNamedRangesObj", "com.sun.star.sheet.NamedRanges" )
      76             : 
      77         552 : static bool lcl_UserVisibleName(const ScRangeData& rData)
      78             : {
      79             :     //! as method to ScRangeData
      80             : 
      81         552 :     return !rData.HasType(RT_DATABASE);
      82             : }
      83             : 
      84         336 : ScNamedRangeObj::ScNamedRangeObj( rtl::Reference< ScNamedRangesObj > xParent, ScDocShell* pDocSh, const OUString& rNm, Reference<container::XNamed> xSheet):
      85             :     mxParent(xParent),
      86             :     pDocShell( pDocSh ),
      87             :     aName( rNm ),
      88         336 :     mxSheet( xSheet )
      89             : {
      90         336 :     pDocShell->GetDocument().AddUnoObject(*this);
      91         336 : }
      92             : 
      93        1008 : ScNamedRangeObj::~ScNamedRangeObj()
      94             : {
      95         336 :     SolarMutexGuard g;
      96             : 
      97         336 :     if (pDocShell)
      98         324 :         pDocShell->GetDocument().RemoveUnoObject(*this);
      99         672 : }
     100             : 
     101          54 : void ScNamedRangeObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
     102             : {
     103             :     // reference update is of no interest
     104             : 
     105          54 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
     106          54 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
     107          12 :         pDocShell = NULL;       // became invalid
     108          54 : }
     109             : 
     110             : // Helper functions
     111             : 
     112         324 : ScRangeData* ScNamedRangeObj::GetRangeData_Impl()
     113             : {
     114         324 :     ScRangeData* pRet = NULL;
     115         324 :     if (pDocShell)
     116             :     {
     117             :         ScRangeName* pNames;
     118         324 :         SCTAB nTab = GetTab_Impl();
     119         324 :         if (nTab >= 0)
     120           0 :             pNames = pDocShell->GetDocument().GetRangeName(nTab);
     121             :         else
     122         324 :             pNames = pDocShell->GetDocument().GetRangeName();
     123         324 :         if (pNames)
     124             :         {
     125         324 :             pRet = pNames->findByUpperName(ScGlobal::pCharClass->uppercase(aName));
     126         324 :             if (pRet)
     127         324 :                 pRet->ValidateTabRefs();        // adjust relative tab refs to valid tables
     128             :         }
     129             :     }
     130         324 :     return pRet;
     131             : }
     132             : 
     133         346 : SCTAB ScNamedRangeObj::GetTab_Impl()
     134             : {
     135         346 :     if (mxSheet.is())
     136             :     {
     137           0 :         if (!pDocShell)
     138           0 :             return -2;
     139           0 :         ScDocument& rDoc = pDocShell->GetDocument();
     140             :         SCTAB nTab;
     141           0 :         OUString sName = mxSheet->getName();
     142           0 :         bool bFound = rDoc.GetTable(sName, nTab);
     143             :         assert(bFound); (void)bFound;   // fouled up?
     144           0 :         return nTab;
     145             :     }
     146             :     else
     147         346 :         return -1;//global range name
     148             : }
     149             : 
     150             : // sheet::XNamedRange
     151             : 
     152          22 : void ScNamedRangeObj::Modify_Impl( const OUString* pNewName, const ScTokenArray* pNewTokens, const OUString* pNewContent,
     153             :                                     const ScAddress* pNewPos, const sal_uInt16* pNewType,
     154             :                                     const formula::FormulaGrammar::Grammar eGrammar )
     155             : {
     156          22 :     if (!pDocShell)
     157           0 :         return;
     158             : 
     159          22 :     ScDocument& rDoc = pDocShell->GetDocument();
     160             :     ScRangeName* pNames;
     161          22 :     SCTAB nTab = GetTab_Impl();
     162          22 :     if (nTab >= 0)
     163           0 :         pNames = rDoc.GetRangeName(nTab);
     164             :     else
     165          22 :         pNames = rDoc.GetRangeName();
     166          22 :     if (!pNames)
     167           0 :         return;
     168             : 
     169          22 :     const ScRangeData* pOld = pNames->findByUpperName(ScGlobal::pCharClass->uppercase(aName));
     170          22 :     if (!pOld)
     171           0 :         return;
     172             : 
     173          22 :     ScRangeName* pNewRanges = new ScRangeName(*pNames);
     174             : 
     175          22 :     OUString aInsName = pOld->GetName();
     176          22 :     if (pNewName)
     177           4 :         aInsName = *pNewName;
     178             : 
     179          44 :     OUString aContent;                            // Content string based =>
     180          22 :     pOld->GetSymbol( aContent, eGrammar);   // no problems with changed positions and such.
     181          22 :     if (pNewContent)
     182           6 :         aContent = *pNewContent;
     183             : 
     184          22 :     ScAddress aPos = pOld->GetPos();
     185          22 :     if (pNewPos)
     186           2 :         aPos = *pNewPos;
     187             : 
     188          22 :     sal_uInt16 nType = pOld->GetType();
     189          22 :     if (pNewType)
     190          10 :         nType = *pNewType;
     191             : 
     192          22 :     ScRangeData* pNew = NULL;
     193          22 :     if (pNewTokens)
     194           0 :         pNew = new ScRangeData( &rDoc, aInsName, *pNewTokens, aPos, nType );
     195             :     else
     196          22 :         pNew = new ScRangeData( &rDoc, aInsName, aContent, aPos, nType, eGrammar );
     197             : 
     198          22 :     pNew->SetIndex( pOld->GetIndex() );
     199             : 
     200          22 :     pNewRanges->erase(*pOld);
     201          22 :     if (pNewRanges->insert(pNew))
     202             :     {
     203          22 :         pDocShell->GetDocFunc().SetNewRangeNames(pNewRanges, mxParent->IsModifyAndBroadcast(), nTab);
     204             : 
     205          22 :         aName = aInsName;   //! broadcast?
     206             :     }
     207             :     else
     208             :     {
     209           0 :         pNew = NULL;        //! uno::Exception/Error or something
     210           0 :         delete pNewRanges;
     211          22 :     }
     212             : }
     213             : 
     214          28 : OUString SAL_CALL ScNamedRangeObj::getName() throw(uno::RuntimeException, std::exception)
     215             : {
     216          28 :     SolarMutexGuard aGuard;
     217          28 :     return aName;
     218             : }
     219             : 
     220           4 : void SAL_CALL ScNamedRangeObj::setName( const OUString& aNewName )
     221             :     throw (uno::RuntimeException, std::exception)
     222             : {
     223           4 :     SolarMutexGuard aGuard;
     224             :     //! adapt formulas ?????
     225             : 
     226           8 :     OUString aNewStr(aNewName);
     227             :     // GRAM_PODF_A1 for API compatibility.
     228           4 :     Modify_Impl( &aNewStr, NULL, NULL, NULL, NULL,formula::FormulaGrammar::GRAM_PODF_A1 );
     229             : 
     230           4 :     if ( aName != aNewStr )                 // some error occurred...
     231           4 :         throw uno::RuntimeException();      // no other exceptions specified
     232           4 : }
     233             : 
     234          54 : OUString SAL_CALL ScNamedRangeObj::getContent() throw(uno::RuntimeException, std::exception)
     235             : {
     236          54 :     SolarMutexGuard aGuard;
     237          54 :     OUString aContent;
     238          54 :     ScRangeData* pData = GetRangeData_Impl();
     239          54 :     if (pData)
     240             :         // GRAM_PODF_A1 for API compatibility.
     241          54 :         pData->GetSymbol( aContent,formula::FormulaGrammar::GRAM_PODF_A1);
     242          54 :     return aContent;
     243             : }
     244             : 
     245           6 : void SAL_CALL ScNamedRangeObj::setContent( const OUString& aContent )
     246             :     throw (uno::RuntimeException, std::exception)
     247             : {
     248           6 :     SolarMutexGuard aGuard;
     249          12 :     OUString aContStr(aContent);
     250             :     // GRAM_PODF_A1 for API compatibility.
     251          12 :     Modify_Impl( NULL, NULL, &aContStr, NULL, NULL,formula::FormulaGrammar::GRAM_PODF_A1 );
     252           6 : }
     253             : 
     254           4 : table::CellAddress SAL_CALL ScNamedRangeObj::getReferencePosition()
     255             :                                                 throw(uno::RuntimeException, std::exception)
     256             : {
     257           4 :     SolarMutexGuard aGuard;
     258           4 :     ScAddress aPos;
     259           4 :     ScRangeData* pData = GetRangeData_Impl();
     260           4 :     if (pData)
     261           4 :         aPos = pData->GetPos();
     262           4 :     table::CellAddress aAddress;
     263           4 :     aAddress.Column = aPos.Col();
     264           4 :     aAddress.Row    = aPos.Row();
     265           4 :     aAddress.Sheet  = aPos.Tab();
     266           4 :     if (pDocShell)
     267             :     {
     268           4 :         SCTAB nDocTabs = pDocShell->GetDocument().GetTableCount();
     269           4 :         if ( aAddress.Sheet >= nDocTabs && nDocTabs > 0 )
     270             :         {
     271             :             //  Even after ValidateTabRefs, the position can be invalid if
     272             :             //  the content points to preceding tables. The resulting string
     273             :             //  is invalid in any case, so the position is just shifted.
     274           0 :             aAddress.Sheet = nDocTabs - 1;
     275             :         }
     276             :     }
     277           4 :     return aAddress;
     278             : }
     279             : 
     280           2 : void SAL_CALL ScNamedRangeObj::setReferencePosition( const table::CellAddress& aReferencePosition )
     281             :     throw (uno::RuntimeException, std::exception)
     282             : {
     283           2 :     SolarMutexGuard aGuard;
     284           2 :     ScAddress aPos( (SCCOL)aReferencePosition.Column, (SCROW)aReferencePosition.Row, aReferencePosition.Sheet );
     285             :     // GRAM_PODF_A1 for API compatibility.
     286           2 :     Modify_Impl( NULL, NULL, NULL, &aPos, NULL,formula::FormulaGrammar::GRAM_PODF_A1 );
     287           2 : }
     288             : 
     289          12 : sal_Int32 SAL_CALL ScNamedRangeObj::getType() throw(uno::RuntimeException, std::exception)
     290             : {
     291          12 :     SolarMutexGuard aGuard;
     292          12 :     sal_Int32 nType=0;
     293          12 :     ScRangeData* pData = GetRangeData_Impl();
     294          12 :     if (pData)
     295             :     {
     296             :         // do not return internal RT_* flags
     297             :         // see property 'IsSharedFormula' for RT_SHARED
     298          12 :         if ( pData->HasType(RT_CRITERIA) )  nType |= sheet::NamedRangeFlag::FILTER_CRITERIA;
     299          12 :         if ( pData->HasType(RT_PRINTAREA) ) nType |= sheet::NamedRangeFlag::PRINT_AREA;
     300          12 :         if ( pData->HasType(RT_COLHEADER) ) nType |= sheet::NamedRangeFlag::COLUMN_HEADER;
     301          12 :         if ( pData->HasType(RT_ROWHEADER) ) nType |= sheet::NamedRangeFlag::ROW_HEADER;
     302             :     }
     303          12 :     return nType;
     304             : }
     305             : 
     306          10 : void SAL_CALL ScNamedRangeObj::setType( sal_Int32 nUnoType )
     307             :     throw (uno::RuntimeException, std::exception)
     308             : {
     309             :     // see property 'IsSharedFormula' for RT_SHARED
     310          10 :     SolarMutexGuard aGuard;
     311          10 :     sal_uInt16 nNewType = RT_NAME;
     312          10 :     if ( nUnoType & sheet::NamedRangeFlag::FILTER_CRITERIA )    nNewType |= RT_CRITERIA;
     313          10 :     if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA )         nNewType |= RT_PRINTAREA;
     314          10 :     if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER )      nNewType |= RT_COLHEADER;
     315          10 :     if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER )         nNewType |= RT_ROWHEADER;
     316             : 
     317             :     // GRAM_PODF_A1 for API compatibility.
     318          10 :     Modify_Impl( NULL, NULL, NULL, NULL, &nNewType,formula::FormulaGrammar::GRAM_PODF_A1 );
     319          10 : }
     320             : 
     321             : // XFormulaTokens
     322             : 
     323           0 : uno::Sequence<sheet::FormulaToken> SAL_CALL ScNamedRangeObj::getTokens()
     324             :     throw (uno::RuntimeException, std::exception)
     325             : {
     326           0 :     SolarMutexGuard aGuard;
     327           0 :     uno::Sequence<sheet::FormulaToken> aSequence;
     328           0 :     ScRangeData* pData = GetRangeData_Impl();
     329           0 :     if (pData && pDocShell)
     330             :     {
     331           0 :         ScTokenArray* pTokenArray = pData->GetCode();
     332           0 :         if ( pTokenArray )
     333           0 :             (void)ScTokenConversion::ConvertToTokenSequence( pDocShell->GetDocument(), aSequence, *pTokenArray );
     334             :     }
     335           0 :     return aSequence;
     336             : }
     337             : 
     338           0 : void SAL_CALL ScNamedRangeObj::setTokens( const uno::Sequence<sheet::FormulaToken>& rTokens )
     339             :     throw (uno::RuntimeException, std::exception)
     340             : {
     341           0 :     SolarMutexGuard aGuard;
     342           0 :     if( pDocShell )
     343             :     {
     344           0 :         ScTokenArray aTokenArray;
     345           0 :         (void)ScTokenConversion::ConvertToTokenArray( pDocShell->GetDocument(), aTokenArray, rTokens );
     346             :         // GRAM_PODF_A1 for API compatibility.
     347           0 :         Modify_Impl( NULL, &aTokenArray, NULL, NULL, NULL, formula::FormulaGrammar::GRAM_PODF_A1 );
     348           0 :     }
     349           0 : }
     350             : 
     351             : // XCellRangeSource
     352             : 
     353         238 : uno::Reference<table::XCellRange> SAL_CALL ScNamedRangeObj::getReferredCells()
     354             :                                                 throw(uno::RuntimeException, std::exception)
     355             : {
     356         238 :     SolarMutexGuard aGuard;
     357         238 :     ScRange aRange;
     358         238 :     ScRangeData* pData = GetRangeData_Impl();
     359         238 :     if ( pData && pData->IsValidReference( aRange ) )
     360             :     {
     361             :         //! static function to create ScCellObj/ScCellRangeObj at ScCellRangeObj ???
     362             : 
     363         226 :         if ( aRange.aStart == aRange.aEnd )
     364         214 :             return new ScCellObj( pDocShell, aRange.aStart );
     365             :         else
     366          12 :             return new ScCellRangeObj( pDocShell, aRange );
     367             :     }
     368          12 :     return NULL;
     369             : }
     370             : 
     371             : // beans::XPropertySet
     372             : 
     373           0 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScNamedRangeObj::getPropertySetInfo()
     374             :                                                         throw(uno::RuntimeException, std::exception)
     375             : {
     376           0 :     SolarMutexGuard aGuard;
     377           0 :     static uno::Reference< beans::XPropertySetInfo >  aRef(new SfxItemPropertySetInfo( lcl_GetNamedRangeMap() ));
     378           0 :     return aRef;
     379             : }
     380             : 
     381           0 : void SAL_CALL ScNamedRangeObj::setPropertyValue(
     382             :                         const OUString& rPropertyName, const uno::Any& /*aValue*/ )
     383             :                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
     384             :                         lang::IllegalArgumentException, lang::WrappedTargetException,
     385             :                         uno::RuntimeException, std::exception)
     386             : {
     387           0 :     SolarMutexGuard aGuard;
     388           0 :     if ( rPropertyName == SC_UNONAME_ISSHAREDFMLA )
     389             :     {
     390             :         // Ignore this.
     391           0 :     }
     392           0 : }
     393             : 
     394           0 : uno::Any SAL_CALL ScNamedRangeObj::getPropertyValue( const OUString& rPropertyName )
     395             :                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
     396             :                         uno::RuntimeException, std::exception)
     397             : {
     398           0 :     SolarMutexGuard aGuard;
     399           0 :     uno::Any aRet;
     400           0 :     if ( rPropertyName == SC_UNO_LINKDISPBIT )
     401             :     {
     402             :         //  no target bitmaps for individual entries (would be all equal)
     403             :         // ScLinkTargetTypeObj::SetLinkTargetBitmap( aRet, SC_LINKTARGETTYPE_RANGENAME );
     404             :     }
     405           0 :     else if ( rPropertyName == SC_UNO_LINKDISPNAME )
     406           0 :         aRet <<= OUString( aName );
     407           0 :     else if ( rPropertyName == SC_UNONAME_TOKENINDEX )
     408             :     {
     409             :         // get index for use in formula tokens (read-only)
     410           0 :         ScRangeData* pData = GetRangeData_Impl();
     411           0 :         if (pData)
     412           0 :             aRet <<= static_cast<sal_Int32>(pData->GetIndex());
     413             :     }
     414           0 :     else if ( rPropertyName == SC_UNONAME_ISSHAREDFMLA )
     415             :     {
     416           0 :         if (GetRangeData_Impl())
     417           0 :             aRet <<= false;
     418             :     }
     419           0 :     return aRet;
     420             : }
     421             : 
     422           0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScNamedRangeObj )
     423             : 
     424             : // lang::XServiceInfo
     425             : 
     426           0 : OUString SAL_CALL ScNamedRangeObj::getImplementationName() throw(uno::RuntimeException, std::exception)
     427             : {
     428           0 :     return OUString( "ScNamedRangeObj" );
     429             : }
     430             : 
     431           0 : sal_Bool SAL_CALL ScNamedRangeObj::supportsService( const OUString& rServiceName )
     432             :                                                     throw(uno::RuntimeException, std::exception)
     433             : {
     434           0 :     return cppu::supportsService(this, rServiceName);
     435             : }
     436             : 
     437           0 : uno::Sequence<OUString> SAL_CALL ScNamedRangeObj::getSupportedServiceNames()
     438             :                                                     throw(uno::RuntimeException, std::exception)
     439             : {
     440           0 :     uno::Sequence<OUString> aRet(2);
     441           0 :     aRet[0] = OUString( SCNAMEDRANGEOBJ_SERVICE );
     442           0 :     aRet[1] = OUString( SCLINKTARGET_SERVICE );
     443           0 :     return aRet;
     444             : }
     445             : 
     446             : // XUnoTunnel
     447             : 
     448           0 : sal_Int64 SAL_CALL ScNamedRangeObj::getSomething(
     449             :                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException, std::exception)
     450             : {
     451           0 :     if ( rId.getLength() == 16 &&
     452           0 :           0 == memcmp( getUnoTunnelId().getConstArray(),
     453           0 :                                     rId.getConstArray(), 16 ) )
     454             :     {
     455           0 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
     456             :     }
     457           0 :     return 0;
     458             : }
     459             : 
     460             : namespace
     461             : {
     462             :     class theScNamedRangeObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScNamedRangeObjUnoTunnelId> {};
     463             : }
     464             : 
     465           0 : const uno::Sequence<sal_Int8>& ScNamedRangeObj::getUnoTunnelId()
     466             : {
     467           0 :     return theScNamedRangeObjUnoTunnelId::get().getSeq();
     468             : }
     469             : 
     470        2826 : ScNamedRangesObj::ScNamedRangesObj(ScDocShell* pDocSh) :
     471             :     mbModifyAndBroadcast(true),
     472        2826 :     pDocShell( pDocSh )
     473             : {
     474        2826 :     pDocShell->GetDocument().AddUnoObject(*this);
     475        2826 : }
     476             : 
     477        5652 : ScNamedRangesObj::~ScNamedRangesObj()
     478             : {
     479        2826 :     SolarMutexGuard g;
     480             : 
     481        2826 :     if (pDocShell)
     482        2812 :         pDocShell->GetDocument().RemoveUnoObject(*this);
     483        2826 : }
     484             : 
     485         402 : void ScNamedRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
     486             : {
     487             :     // reference update is of no interest
     488             : 
     489         402 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
     490         402 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
     491             :     {
     492          14 :         pDocShell = NULL;       // became invalid
     493             :     }
     494         402 : }
     495             : 
     496             : // sheet::XNamedRanges
     497             : 
     498          26 : void SAL_CALL ScNamedRangesObj::addNewByName( const OUString& aName,
     499             :     const OUString& aContent, const table::CellAddress& aPosition,
     500             :     sal_Int32 nUnoType )
     501             :         throw (uno::RuntimeException, std::exception)
     502             : {
     503          26 :     SolarMutexGuard aGuard;
     504          26 :     ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, aPosition.Sheet );
     505             : 
     506          26 :     sal_uInt16 nNewType = RT_NAME;
     507          26 :     if ( nUnoType & sheet::NamedRangeFlag::FILTER_CRITERIA )    nNewType |= RT_CRITERIA;
     508          26 :     if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA )         nNewType |= RT_PRINTAREA;
     509          26 :     if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER )      nNewType |= RT_COLHEADER;
     510          26 :     if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER )         nNewType |= RT_ROWHEADER;
     511             : 
     512          26 :     bool bDone = false;
     513          26 :     if (pDocShell)
     514             :     {
     515          26 :         ScDocument& rDoc = pDocShell->GetDocument();
     516          26 :         ScRangeName* pNames = GetRangeName_Impl();
     517          26 :         if (pNames && !pNames->findByUpperName(ScGlobal::pCharClass->uppercase(aName)))
     518             :         {
     519          26 :             ScRangeName* pNewRanges = new ScRangeName( *pNames );
     520             :             // GRAM_PODF_A1 for API compatibility.
     521             :             ScRangeData* pNew = new ScRangeData( &rDoc, aName, aContent,
     522          26 :                                                 aPos, nNewType,formula::FormulaGrammar::GRAM_PODF_A1 );
     523          26 :             if ( pNewRanges->insert(pNew) )
     524             :             {
     525          26 :                 pDocShell->GetDocFunc().SetNewRangeNames(pNewRanges, mbModifyAndBroadcast, GetTab_Impl());
     526          26 :                 bDone = true;
     527             :             }
     528             :             else
     529             :             {
     530           0 :                 pNew = NULL;
     531           0 :                 delete pNewRanges;
     532             :             }
     533             :         }
     534             :     }
     535             : 
     536          26 :     if (!bDone)
     537           0 :         throw uno::RuntimeException();      // no other exceptions specified
     538          26 : }
     539             : 
     540           4 : void SAL_CALL ScNamedRangesObj::addNewFromTitles( const table::CellRangeAddress& aSource,
     541             :                                     sheet::Border aBorder ) throw(uno::RuntimeException, std::exception)
     542             : {
     543           4 :     SolarMutexGuard aGuard;
     544             :     //! this cannot be an enum, because multiple bits can be set !!!
     545             : 
     546           4 :     bool bTop    = ( aBorder == sheet::Border_TOP );
     547           4 :     bool bLeft   = ( aBorder == sheet::Border_LEFT );
     548           4 :     bool bBottom = ( aBorder == sheet::Border_BOTTOM );
     549           4 :     bool bRight  = ( aBorder == sheet::Border_RIGHT );
     550             : 
     551           4 :     ScRange aRange;
     552           4 :     ScUnoConversion::FillScRange( aRange, aSource );
     553             : 
     554           4 :     sal_uInt16 nFlags = 0;
     555           4 :     if (bTop)    nFlags |= NAME_TOP;
     556           4 :     if (bLeft)   nFlags |= NAME_LEFT;
     557           4 :     if (bBottom) nFlags |= NAME_BOTTOM;
     558           4 :     if (bRight)  nFlags |= NAME_RIGHT;
     559             : 
     560           4 :     if (nFlags)
     561           4 :         pDocShell->GetDocFunc().CreateNames( aRange, nFlags, true, GetTab_Impl() );
     562           4 : }
     563             : 
     564          10 : void SAL_CALL ScNamedRangesObj::removeByName( const OUString& aName )
     565             :                                                 throw(uno::RuntimeException, std::exception)
     566             : {
     567          10 :     SolarMutexGuard aGuard;
     568          10 :     bool bDone = false;
     569          10 :     if (pDocShell)
     570             :     {
     571          10 :         ScRangeName* pNames = GetRangeName_Impl();
     572          10 :         if (pNames)
     573             :         {
     574          10 :             const ScRangeData* pData = pNames->findByUpperName(ScGlobal::pCharClass->uppercase(aName));
     575          10 :             if (pData && lcl_UserVisibleName(*pData))
     576             :             {
     577          10 :                 ScRangeName* pNewRanges = new ScRangeName(*pNames);
     578          10 :                 pNewRanges->erase(*pData);
     579          10 :                 pDocShell->GetDocFunc().SetNewRangeNames( pNewRanges, mbModifyAndBroadcast, GetTab_Impl());
     580          10 :                 bDone = true;
     581             :             }
     582             :         }
     583             :     }
     584             : 
     585          10 :     if (!bDone)
     586           0 :         throw uno::RuntimeException();      // no other exceptions specified
     587          10 : }
     588             : 
     589           8 : void SAL_CALL ScNamedRangesObj::outputList( const table::CellAddress& aOutputPosition )
     590             :                                                 throw(uno::RuntimeException, std::exception)
     591             : {
     592           8 :     SolarMutexGuard aGuard;
     593           8 :     ScAddress aPos( (SCCOL)aOutputPosition.Column, (SCROW)aOutputPosition.Row, aOutputPosition.Sheet );
     594           8 :     if (pDocShell)
     595           8 :         pDocShell->GetDocFunc().InsertNameList( aPos, true );
     596           8 : }
     597             : 
     598             : // container::XEnumerationAccess
     599             : 
     600           4 : uno::Reference<container::XEnumeration> SAL_CALL ScNamedRangesObj::createEnumeration()
     601             :                                                     throw(uno::RuntimeException, std::exception)
     602             : {
     603           4 :     SolarMutexGuard aGuard;
     604           4 :     return new ScIndexEnumeration(this, OUString("com.sun.star.sheet.NamedRangesEnumeration"));
     605             : }
     606             : 
     607             : // container::XIndexAccess
     608             : 
     609          32 : sal_Int32 SAL_CALL ScNamedRangesObj::getCount() throw(uno::RuntimeException, std::exception)
     610             : {
     611          32 :     SolarMutexGuard aGuard;
     612          32 :     long nRet = 0;
     613          32 :     if (pDocShell)
     614             :     {
     615          32 :         ScRangeName* pNames = GetRangeName_Impl();
     616          32 :         if (pNames)
     617             :         {
     618          32 :             ScRangeName::const_iterator itr = pNames->begin(), itrEnd = pNames->end();
     619          96 :             for (; itr != itrEnd; ++itr)
     620          64 :                 if (lcl_UserVisibleName(*itr->second))
     621          64 :                     ++nRet;
     622             :         }
     623             :     }
     624          32 :     return nRet;
     625             : }
     626             : 
     627          24 : uno::Any SAL_CALL ScNamedRangesObj::getByIndex( sal_Int32 nIndex )
     628             :                             throw(lang::IndexOutOfBoundsException,
     629             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
     630             : {
     631          24 :     SolarMutexGuard aGuard;
     632          48 :     uno::Reference< sheet::XNamedRange >  xRange(GetObjectByIndex_Impl((sal_uInt16)nIndex));
     633          24 :     if ( xRange.is() )
     634          40 :         return uno::makeAny(xRange);
     635             :     else
     636          28 :         throw lang::IndexOutOfBoundsException();
     637             : }
     638             : 
     639           2 : uno::Type SAL_CALL ScNamedRangesObj::getElementType() throw(uno::RuntimeException, std::exception)
     640             : {
     641           2 :     SolarMutexGuard aGuard;
     642           2 :     return cppu::UnoType<sheet::XNamedRange>::get();   // must be suitable for getByIndex
     643             : }
     644             : 
     645           2 : sal_Bool SAL_CALL ScNamedRangesObj::hasElements() throw(uno::RuntimeException, std::exception)
     646             : {
     647           2 :     SolarMutexGuard aGuard;
     648           2 :     return ( getCount() != 0 );
     649             : }
     650             : 
     651           0 : Reference<beans::XPropertySetInfo> SAL_CALL ScNamedRangesObj::getPropertySetInfo()
     652             :                                                         throw(uno::RuntimeException, std::exception)
     653             : {
     654             :     static Reference<beans::XPropertySetInfo> aRef(
     655           0 :         new SfxItemPropertySetInfo(lcl_GetNamedRangesMap()));
     656           0 :     return aRef;
     657             : }
     658             : 
     659           0 : void SAL_CALL ScNamedRangesObj::setPropertyValue(
     660             :                         const OUString& rPropertyName, const uno::Any& aValue )
     661             :                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
     662             :                         lang::IllegalArgumentException, lang::WrappedTargetException,
     663             :                         uno::RuntimeException, std::exception)
     664             : {
     665           0 :     if ( rPropertyName == SC_UNO_MODIFY_BROADCAST )
     666             :     {
     667           0 :         aValue >>= mbModifyAndBroadcast;
     668             :     }
     669           0 : }
     670             : 
     671           0 : Any SAL_CALL ScNamedRangesObj::getPropertyValue( const OUString& rPropertyName )
     672             :                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
     673             :                         uno::RuntimeException, std::exception)
     674             : {
     675           0 :     Any aRet;
     676           0 :     if ( rPropertyName == SC_UNO_MODIFY_BROADCAST )
     677             :     {
     678           0 :         aRet <<= mbModifyAndBroadcast;
     679             :     }
     680             : 
     681           0 :     return aRet;
     682             : }
     683             : 
     684           0 : SC_IMPL_DUMMY_PROPERTY_LISTENER( ScNamedRangesObj )
     685             : 
     686        1434 : uno::Any SAL_CALL ScNamedRangesObj::getByName( const OUString& aName )
     687             :             throw(container::NoSuchElementException,
     688             :                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
     689             : {
     690        1434 :     SolarMutexGuard aGuard;
     691        2868 :     uno::Reference< sheet::XNamedRange >  xRange(GetObjectByName_Impl(aName));
     692        1434 :     if ( xRange.is() )
     693         632 :         return uno::makeAny(xRange);
     694             :     else
     695        2552 :         throw container::NoSuchElementException();
     696             : }
     697             : 
     698           2 : uno::Sequence<OUString> SAL_CALL ScNamedRangesObj::getElementNames()
     699             :                                                 throw(uno::RuntimeException, std::exception)
     700             : {
     701           2 :     SolarMutexGuard aGuard;
     702           2 :     if (pDocShell)
     703             :     {
     704           2 :         ScRangeName* pNames = GetRangeName_Impl();
     705           2 :         if (pNames)
     706             :         {
     707           2 :             long nVisCount = getCount();            // names with lcl_UserVisibleName
     708           2 :             uno::Sequence<OUString> aSeq(nVisCount);
     709           2 :             OUString* pAry = aSeq.getArray();
     710           2 :             sal_uInt16 nVisPos = 0;
     711           2 :             ScRangeName::const_iterator itr = pNames->begin(), itrEnd = pNames->end();
     712           4 :             for (; itr != itrEnd; ++itr)
     713             :             {
     714           2 :                 if (lcl_UserVisibleName(*itr->second))
     715           2 :                     pAry[nVisPos++] = itr->second->GetName();
     716             :             }
     717           2 :             return aSeq;
     718             :         }
     719             :     }
     720           0 :     return uno::Sequence<OUString>(0);
     721             : }
     722             : 
     723        4448 : sal_Bool SAL_CALL ScNamedRangesObj::hasByName( const OUString& aName )
     724             :                                         throw(uno::RuntimeException, std::exception)
     725             : {
     726        4448 :     SolarMutexGuard aGuard;
     727        4448 :     if (pDocShell)
     728             :     {
     729        4448 :         ScRangeName* pNames = GetRangeName_Impl();
     730        4448 :         if (pNames)
     731             :         {
     732        4448 :             const ScRangeData* pData = pNames->findByUpperName(ScGlobal::pCharClass->uppercase(aName));
     733        4448 :             if (pData && lcl_UserVisibleName(*pData))
     734         452 :                 return sal_True;
     735             :         }
     736             :     }
     737        3996 :     return false;
     738             : }
     739             : 
     740             : /** called from the XActionLockable interface methods on initial locking */
     741           0 : void ScNamedRangesObj::lock()
     742             : {
     743           0 :     pDocShell->GetDocument().PreprocessRangeNameUpdate();
     744           0 : }
     745             : 
     746             : /** called from the XActionLockable interface methods on final unlock */
     747           0 : void ScNamedRangesObj::unlock()
     748             : {
     749           0 :     pDocShell->GetDocument().CompileHybridFormula();
     750           0 : }
     751             : 
     752             : // document::XActionLockable
     753             : 
     754           0 : sal_Bool ScNamedRangesObj::isActionLocked() throw(uno::RuntimeException, std::exception)
     755             : {
     756           0 :     SolarMutexGuard aGuard;
     757           0 :     return pDocShell->GetDocument().GetNamedRangesLockCount() != 0;
     758             : }
     759             : 
     760           0 : void ScNamedRangesObj::addActionLock() throw(uno::RuntimeException, std::exception)
     761             : {
     762           0 :     SolarMutexGuard aGuard;
     763           0 :     ScDocument& rDoc = pDocShell->GetDocument();
     764           0 :     sal_Int16 nLockCount = rDoc.GetNamedRangesLockCount();
     765           0 :     ++nLockCount;
     766           0 :     if ( nLockCount == 1 )
     767             :     {
     768           0 :         lock();
     769             :     }
     770           0 :     rDoc.SetNamedRangesLockCount( nLockCount );
     771           0 : }
     772             : 
     773           0 : void ScNamedRangesObj::removeActionLock() throw(uno::RuntimeException, std::exception)
     774             : {
     775           0 :     SolarMutexGuard aGuard;
     776           0 :     ScDocument& rDoc = pDocShell->GetDocument();
     777           0 :     sal_Int16 nLockCount = rDoc.GetNamedRangesLockCount();
     778           0 :     if ( nLockCount > 0 )
     779             :     {
     780           0 :         --nLockCount;
     781           0 :         if ( nLockCount == 0 )
     782             :         {
     783           0 :             unlock();
     784             :         }
     785           0 :         rDoc.SetNamedRangesLockCount( nLockCount );
     786           0 :     }
     787           0 : }
     788             : 
     789           0 : void ScNamedRangesObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException, std::exception)
     790             : {
     791           0 :     SolarMutexGuard aGuard;
     792           0 :     if ( nLock >= 0 )
     793             :     {
     794           0 :         ScDocument& rDoc = pDocShell->GetDocument();
     795           0 :         sal_Int16 nLockCount = rDoc.GetNamedRangesLockCount();
     796           0 :         if ( nLock == 0 && nLockCount > 0 )
     797             :         {
     798           0 :             unlock();
     799             :         }
     800           0 :         if ( nLock > 0 && nLockCount == 0 )
     801             :         {
     802           0 :             lock();
     803             :         }
     804           0 :         rDoc.SetNamedRangesLockCount( nLock );
     805           0 :     }
     806           0 : }
     807             : 
     808           0 : sal_Int16 ScNamedRangesObj::resetActionLocks() throw(uno::RuntimeException, std::exception)
     809             : {
     810           0 :     SolarMutexGuard aGuard;
     811           0 :     ScDocument& rDoc = pDocShell->GetDocument();
     812           0 :     sal_Int16 nLockCount = rDoc.GetNamedRangesLockCount();
     813           0 :     if ( nLockCount > 0 )
     814             :     {
     815           0 :         unlock();
     816             :     }
     817           0 :     rDoc.SetNamedRangesLockCount( 0 );
     818           0 :     return nLockCount;
     819             : }
     820             : 
     821        2826 : ScGlobalNamedRangesObj::ScGlobalNamedRangesObj(ScDocShell* pDocSh)
     822        2826 :     : ScNamedRangesObj(pDocSh)
     823             : {
     824             : 
     825        2826 : }
     826             : 
     827        5652 : ScGlobalNamedRangesObj::~ScGlobalNamedRangesObj()
     828             : {
     829             : 
     830        5652 : }
     831             : 
     832          24 : ScNamedRangeObj* ScGlobalNamedRangesObj::GetObjectByIndex_Impl(sal_uInt16 nIndex)
     833             : {
     834          24 :     if (!pDocShell)
     835           0 :         return NULL;
     836             : 
     837          24 :     ScRangeName* pNames = pDocShell->GetDocument().GetRangeName();
     838          24 :     if (!pNames)
     839           0 :         return NULL;
     840             : 
     841          24 :     ScRangeName::const_iterator itr = pNames->begin(), itrEnd = pNames->end();
     842          24 :     sal_uInt16 nPos = 0;
     843          28 :     for (; itr != itrEnd; ++itr)
     844             :     {
     845          24 :         if (lcl_UserVisibleName(*itr->second))
     846             :         {
     847          24 :             if (nPos == nIndex)
     848          20 :                 return new ScNamedRangeObj(this, pDocShell, itr->second->GetName());
     849             :         }
     850           4 :         ++nPos;
     851             :     }
     852           4 :     return NULL;
     853             : }
     854             : 
     855        1434 : ScNamedRangeObj* ScGlobalNamedRangesObj::GetObjectByName_Impl(const OUString& aName)
     856             : {
     857        1434 :     if ( pDocShell && hasByName(aName) )
     858         316 :         return new ScNamedRangeObj(this, pDocShell, aName);
     859        1118 :     return NULL;
     860             : }
     861             : 
     862        4518 : ScRangeName* ScGlobalNamedRangesObj::GetRangeName_Impl()
     863             : {
     864        4518 :     return pDocShell->GetDocument().GetRangeName();
     865             : }
     866             : 
     867          40 : SCTAB ScGlobalNamedRangesObj::GetTab_Impl()
     868             : {
     869          40 :     return -1;
     870             : }
     871             : 
     872           0 : ScLocalNamedRangesObj::ScLocalNamedRangesObj( ScDocShell* pDocSh, uno::Reference<container::XNamed> xSheet )
     873             :     : ScNamedRangesObj(pDocSh),
     874           0 :     mxSheet(xSheet)
     875             : {
     876             : 
     877           0 : }
     878             : 
     879           0 : ScLocalNamedRangesObj::~ScLocalNamedRangesObj()
     880             : {
     881             : 
     882           0 : }
     883             : 
     884           0 : ScNamedRangeObj* ScLocalNamedRangesObj::GetObjectByName_Impl(const OUString& aName)
     885             : {
     886           0 :     if ( pDocShell && hasByName( aName ) )
     887           0 :         return new ScNamedRangeObj( this, pDocShell, aName, mxSheet);
     888           0 :     return NULL;
     889             : 
     890             : }
     891             : 
     892           0 : ScNamedRangeObj* ScLocalNamedRangesObj::GetObjectByIndex_Impl( sal_uInt16 nIndex )
     893             : {
     894           0 :     if (!pDocShell)
     895           0 :         return NULL;
     896             : 
     897           0 :     OUString aName = mxSheet->getName();
     898           0 :     ScDocument& rDoc = pDocShell->GetDocument();
     899             :     SCTAB nTab;
     900           0 :     if (!rDoc.GetTable(aName, nTab))
     901           0 :         return NULL;
     902             : 
     903           0 :     ScRangeName* pNames = rDoc.GetRangeName( nTab );
     904           0 :     if (!pNames)
     905           0 :         return NULL;
     906             : 
     907           0 :     ScRangeName::const_iterator itr = pNames->begin(), itrEnd = pNames->end();
     908           0 :     sal_uInt16 nPos = 0;
     909           0 :     for (; itr != itrEnd; ++itr)
     910             :     {
     911           0 :         if (lcl_UserVisibleName(*itr->second))
     912             :         {
     913           0 :             if (nPos == nIndex)
     914           0 :                 return new ScNamedRangeObj(this, pDocShell, itr->second->GetName(), mxSheet);
     915             :         }
     916           0 :         ++nPos;
     917             :     }
     918           0 :     return NULL;
     919             : }
     920             : 
     921           0 : ScRangeName* ScLocalNamedRangesObj::GetRangeName_Impl()
     922             : {
     923           0 :     SCTAB nTab = GetTab_Impl();
     924           0 :     return pDocShell->GetDocument().GetRangeName( nTab );
     925             : }
     926             : 
     927           0 : SCTAB ScLocalNamedRangesObj::GetTab_Impl()
     928             : {
     929             :     SCTAB nTab;
     930           0 :     (void)pDocShell->GetDocument().GetTable(mxSheet->getName(), nTab);
     931           0 :     return nTab;
     932             : }
     933             : 
     934          10 : ScLabelRangeObj::ScLabelRangeObj(ScDocShell* pDocSh, bool bCol, const ScRange& rR) :
     935             :     pDocShell( pDocSh ),
     936             :     bColumn( bCol ),
     937          10 :     aRange( rR )
     938             : {
     939          10 :     pDocShell->GetDocument().AddUnoObject(*this);
     940          10 : }
     941             : 
     942          30 : ScLabelRangeObj::~ScLabelRangeObj()
     943             : {
     944          10 :     SolarMutexGuard g;
     945             : 
     946          10 :     if (pDocShell)
     947           0 :         pDocShell->GetDocument().RemoveUnoObject(*this);
     948          20 : }
     949             : 
     950          26 : void ScLabelRangeObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
     951             : {
     952             :     //! Ref-Update !!!
     953             : 
     954          26 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
     955          26 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
     956          10 :         pDocShell = NULL;       // became invalid
     957          26 : }
     958             : 
     959             : // Helper functions
     960             : 
     961           4 : ScRangePair* ScLabelRangeObj::GetData_Impl()
     962             : {
     963           4 :     ScRangePair* pRet = NULL;
     964           4 :     if (pDocShell)
     965             :     {
     966           4 :         ScDocument& rDoc = pDocShell->GetDocument();
     967           4 :         ScRangePairList* pList = bColumn ? rDoc.GetColNameRanges() : rDoc.GetRowNameRanges();
     968           4 :         if (pList)
     969           4 :             pRet = pList->Find( aRange );
     970             :     }
     971           4 :     return pRet;
     972             : }
     973             : 
     974           4 : void ScLabelRangeObj::Modify_Impl( const ScRange* pLabel, const ScRange* pData )
     975             : {
     976           4 :     if (pDocShell)
     977             :     {
     978           4 :         ScDocument& rDoc = pDocShell->GetDocument();
     979           4 :         ScRangePairList* pOldList = bColumn ? rDoc.GetColNameRanges() : rDoc.GetRowNameRanges();
     980           4 :         if (pOldList)
     981             :         {
     982           4 :             ScRangePairListRef xNewList(pOldList->Clone());
     983           4 :             ScRangePair* pEntry = xNewList->Find( aRange );
     984           4 :             if (pEntry)
     985             :             {
     986           4 :                 xNewList->Remove( pEntry );     // only removed from list, not deleted
     987             : 
     988           4 :                 if ( pLabel )
     989           2 :                     pEntry->GetRange(0) = *pLabel;
     990           4 :                 if ( pData )
     991           2 :                     pEntry->GetRange(1) = *pData;
     992             : 
     993           4 :                 xNewList->Join( *pEntry );
     994           4 :                 delete pEntry;
     995             : 
     996           4 :                 if (bColumn)
     997           4 :                     rDoc.GetColNameRangesRef() = xNewList;
     998             :                 else
     999           0 :                     rDoc.GetRowNameRangesRef() = xNewList;
    1000             : 
    1001           4 :                 rDoc.CompileColRowNameFormula();
    1002           4 :                 pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID );
    1003           4 :                 pDocShell->SetDocumentModified();
    1004             : 
    1005             :                 //! Undo ?!?! (here and from dialog)
    1006             : 
    1007           4 :                 if ( pLabel )
    1008           2 :                     aRange = *pLabel;   // adapt object to find range again
    1009           4 :             }
    1010             :         }
    1011             :     }
    1012           4 : }
    1013             : 
    1014             : // sheet::XLabelRange
    1015             : 
    1016           2 : table::CellRangeAddress SAL_CALL ScLabelRangeObj::getLabelArea()
    1017             :                                                 throw(uno::RuntimeException, std::exception)
    1018             : {
    1019           2 :     SolarMutexGuard aGuard;
    1020           2 :     table::CellRangeAddress aRet;
    1021           2 :     ScRangePair* pData = GetData_Impl();
    1022           2 :     if (pData)
    1023           2 :         ScUnoConversion::FillApiRange( aRet, pData->GetRange(0) );
    1024           2 :     return aRet;
    1025             : }
    1026             : 
    1027           2 : void SAL_CALL ScLabelRangeObj::setLabelArea( const table::CellRangeAddress& aLabelArea )
    1028             :                                                 throw(uno::RuntimeException, std::exception)
    1029             : {
    1030           2 :     SolarMutexGuard aGuard;
    1031           2 :     ScRange aLabelRange;
    1032           2 :     ScUnoConversion::FillScRange( aLabelRange, aLabelArea );
    1033           2 :     Modify_Impl( &aLabelRange, NULL );
    1034           2 : }
    1035             : 
    1036           2 : table::CellRangeAddress SAL_CALL ScLabelRangeObj::getDataArea()
    1037             :                                                 throw(uno::RuntimeException, std::exception)
    1038             : {
    1039           2 :     SolarMutexGuard aGuard;
    1040           2 :     table::CellRangeAddress aRet;
    1041           2 :     ScRangePair* pData = GetData_Impl();
    1042           2 :     if (pData)
    1043           2 :         ScUnoConversion::FillApiRange( aRet, pData->GetRange(1) );
    1044           2 :     return aRet;
    1045             : }
    1046             : 
    1047           2 : void SAL_CALL ScLabelRangeObj::setDataArea( const table::CellRangeAddress& aDataArea )
    1048             :                                                 throw(uno::RuntimeException, std::exception)
    1049             : {
    1050           2 :     SolarMutexGuard aGuard;
    1051           2 :     ScRange aDataRange;
    1052           2 :     ScUnoConversion::FillScRange( aDataRange, aDataArea );
    1053           2 :     Modify_Impl( NULL, &aDataRange );
    1054           2 : }
    1055             : 
    1056         118 : ScLabelRangesObj::ScLabelRangesObj(ScDocShell* pDocSh, bool bCol) :
    1057             :     pDocShell( pDocSh ),
    1058         118 :     bColumn( bCol )
    1059             : {
    1060         118 :     pDocShell->GetDocument().AddUnoObject(*this);
    1061         118 : }
    1062             : 
    1063         354 : ScLabelRangesObj::~ScLabelRangesObj()
    1064             : {
    1065         118 :     SolarMutexGuard g;
    1066             : 
    1067         118 :     if (pDocShell)
    1068          96 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    1069         236 : }
    1070             : 
    1071         664 : void ScLabelRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    1072             : {
    1073             :     //  reference update is of no interest
    1074             : 
    1075         664 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
    1076         664 :     if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
    1077             :     {
    1078          22 :         pDocShell = NULL;       // became invalid
    1079             :     }
    1080         664 : }
    1081             : 
    1082             : // sheet::XLabelRanges
    1083             : 
    1084          14 : ScLabelRangeObj* ScLabelRangesObj::GetObjectByIndex_Impl(size_t nIndex)
    1085             : {
    1086          14 :     if (pDocShell)
    1087             :     {
    1088          14 :         ScDocument& rDoc = pDocShell->GetDocument();
    1089          14 :         ScRangePairList* pList = bColumn ? rDoc.GetColNameRanges() : rDoc.GetRowNameRanges();
    1090          14 :         if ( pList && nIndex < pList->size() )
    1091             :         {
    1092          10 :             ScRangePair* pData = (*pList)[nIndex];
    1093          10 :             if (pData)
    1094          10 :                 return new ScLabelRangeObj( pDocShell, bColumn, pData->GetRange(0) );
    1095             :         }
    1096             :     }
    1097           4 :     return NULL;
    1098             : }
    1099             : 
    1100           8 : void SAL_CALL ScLabelRangesObj::addNew( const table::CellRangeAddress& aLabelArea,
    1101             :                                 const table::CellRangeAddress& aDataArea )
    1102             :                                                 throw(uno::RuntimeException, std::exception)
    1103             : {
    1104           8 :     SolarMutexGuard aGuard;
    1105           8 :     if (pDocShell)
    1106             :     {
    1107           8 :         ScDocument& rDoc = pDocShell->GetDocument();
    1108           8 :         ScRangePairList* pOldList = bColumn ? rDoc.GetColNameRanges() : rDoc.GetRowNameRanges();
    1109           8 :         if (pOldList)
    1110             :         {
    1111           8 :             ScRangePairListRef xNewList(pOldList->Clone());
    1112             : 
    1113           8 :             ScRange aLabelRange;
    1114           8 :             ScRange aDataRange;
    1115           8 :             ScUnoConversion::FillScRange( aLabelRange, aLabelArea );
    1116           8 :             ScUnoConversion::FillScRange( aDataRange,  aDataArea );
    1117           8 :             xNewList->Join( ScRangePair( aLabelRange, aDataRange ) );
    1118             : 
    1119           8 :             if (bColumn)
    1120           8 :                 rDoc.GetColNameRangesRef() = xNewList;
    1121             :             else
    1122           0 :                 rDoc.GetRowNameRangesRef() = xNewList;
    1123             : 
    1124           8 :             rDoc.CompileColRowNameFormula();
    1125           8 :             pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID );
    1126           8 :             pDocShell->SetDocumentModified();
    1127             : 
    1128             :             //! Undo ?!?! (here and from dialog)
    1129             :         }
    1130           8 :     }
    1131           8 : }
    1132             : 
    1133           4 : void SAL_CALL ScLabelRangesObj::removeByIndex( sal_Int32 nIndex )
    1134             :                                                 throw(uno::RuntimeException, std::exception)
    1135             : {
    1136           4 :     SolarMutexGuard aGuard;
    1137           4 :     bool bDone = false;
    1138           4 :     if (pDocShell)
    1139             :     {
    1140           4 :         ScDocument& rDoc = pDocShell->GetDocument();
    1141           4 :         ScRangePairList* pOldList = bColumn ? rDoc.GetColNameRanges() : rDoc.GetRowNameRanges();
    1142             : 
    1143           4 :         if ( pOldList && nIndex >= 0 && nIndex < (sal_Int32)pOldList->size() )
    1144             :         {
    1145           2 :             ScRangePairListRef xNewList(pOldList->Clone());
    1146             : 
    1147           2 :             ScRangePair* pEntry = (*xNewList)[nIndex];
    1148           2 :             if (pEntry)
    1149             :             {
    1150           2 :                 xNewList->Remove( pEntry );
    1151           2 :                 delete pEntry;
    1152             : 
    1153           2 :                 if (bColumn)
    1154           2 :                     rDoc.GetColNameRangesRef() = xNewList;
    1155             :                 else
    1156           0 :                     rDoc.GetRowNameRangesRef() = xNewList;
    1157             : 
    1158           2 :                 rDoc.CompileColRowNameFormula();
    1159           2 :                 pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID );
    1160           2 :                 pDocShell->SetDocumentModified();
    1161           2 :                 bDone = true;
    1162             : 
    1163             :                 //! Undo ?!?! (here and from dialog)
    1164           2 :             }
    1165             :         }
    1166             :     }
    1167           4 :     if (!bDone)
    1168           2 :         throw uno::RuntimeException();      // no other exceptions specified
    1169           2 : }
    1170             : 
    1171             : // container::XEnumerationAccess
    1172             : 
    1173           4 : uno::Reference<container::XEnumeration> SAL_CALL ScLabelRangesObj::createEnumeration()
    1174             :                                                     throw(uno::RuntimeException, std::exception)
    1175             : {
    1176           4 :     SolarMutexGuard aGuard;
    1177           4 :     return new ScIndexEnumeration(this, OUString("com.sun.star.sheet.LabelRangesEnumeration"));
    1178             : }
    1179             : 
    1180             : // container::XIndexAccess
    1181             : 
    1182         112 : sal_Int32 SAL_CALL ScLabelRangesObj::getCount() throw(uno::RuntimeException, std::exception)
    1183             : {
    1184         112 :     SolarMutexGuard aGuard;
    1185         112 :     if (pDocShell)
    1186             :     {
    1187         112 :         ScDocument& rDoc = pDocShell->GetDocument();
    1188         112 :         ScRangePairList* pList = bColumn ? rDoc.GetColNameRanges() : rDoc.GetRowNameRanges();
    1189         112 :         if (pList)
    1190         112 :             return pList->size();
    1191             :     }
    1192           0 :     return 0;
    1193             : }
    1194             : 
    1195          14 : uno::Any SAL_CALL ScLabelRangesObj::getByIndex( sal_Int32 nIndex )
    1196             :                             throw(lang::IndexOutOfBoundsException,
    1197             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    1198             : {
    1199          14 :     SolarMutexGuard aGuard;
    1200          28 :     uno::Reference< sheet::XLabelRange >  xRange(GetObjectByIndex_Impl((sal_uInt16)nIndex));
    1201          14 :     if ( xRange.is() )
    1202          20 :         return uno::makeAny(xRange);
    1203             :     else
    1204          18 :         throw lang::IndexOutOfBoundsException();
    1205             : }
    1206             : 
    1207           2 : uno::Type SAL_CALL ScLabelRangesObj::getElementType() throw(uno::RuntimeException, std::exception)
    1208             : {
    1209           2 :     SolarMutexGuard aGuard;
    1210           2 :     return cppu::UnoType<sheet::XLabelRange>::get();   // must be suitable for getByIndex
    1211             : 
    1212             : }
    1213             : 
    1214           2 : sal_Bool SAL_CALL ScLabelRangesObj::hasElements() throw(uno::RuntimeException, std::exception)
    1215             : {
    1216           2 :     SolarMutexGuard aGuard;
    1217           2 :     return ( getCount() != 0 );
    1218         228 : }
    1219             : 
    1220             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10