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

Generated by: LCOV version 1.10