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