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