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