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