1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: vbanames.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
30 #include <vbahelper/helperdecl.hxx>
32 #include <com/sun/star/table/XCellRange.hpp>
33 #include <com/sun/star/sheet/XCellRangeAddressable.hpp>
35 #include "vbanames.hxx"
36 #include "vbaname.hxx"
37 #include "vbarange.hxx"
38 #include "vbaglobals.hxx"
40 #include <rangenam.hxx>
41 #include <vcl/msgbox.hxx>
42 #include "tabvwsh.hxx"
43 #include "viewdata.hxx"
45 using namespace ::ooo::vba
;
46 using namespace ::com::sun::star
;
48 class NamesEnumeration
: public EnumerationHelperImpl
50 uno::Reference
< frame::XModel
> m_xModel
;
51 uno::WeakReference
< XHelperInterface
> m_xParent
;
52 uno::Reference
< sheet::XNamedRanges
> m_xNames
;
54 NamesEnumeration( const uno::Reference
< XHelperInterface
>& xParent
, const uno::Reference
< uno::XComponentContext
>& xContext
, const uno::Reference
< container::XEnumeration
>& xEnumeration
, const uno::Reference
< frame::XModel
>& xModel
, const uno::Reference
< sheet::XNamedRanges
>& xNames
) throw ( uno::RuntimeException
) : EnumerationHelperImpl( xContext
, xEnumeration
), m_xModel( xModel
), m_xParent( xParent
), m_xNames( xNames
) {}
56 virtual uno::Any SAL_CALL
nextElement( ) throw (container::NoSuchElementException
, lang::WrappedTargetException
, uno::RuntimeException
)
58 uno::Reference
< sheet::XNamedRange
> xNamed( m_xEnumeration
->nextElement(), uno::UNO_QUERY_THROW
);
59 return uno::makeAny( uno::Reference
< excel::XName
> ( new ScVbaName( m_xParent
, m_xContext
, xNamed
,m_xNames
, m_xModel
) ) );
65 ScVbaNames::ScVbaNames(const css::uno::Reference
< ov::XHelperInterface
>& xParent
,
66 const css::uno::Reference
< css::uno::XComponentContext
>& xContext
,
67 const css::uno::Reference
< css::sheet::XNamedRanges
>& xNames
,
68 const css::uno::Reference
< css::frame::XModel
>& xModel
):
69 ScVbaNames_BASE( xParent
, xContext
, uno::Reference
< container::XIndexAccess
>( xNames
, uno::UNO_QUERY
) ),
73 m_xNameAccess
.set( xNames
, uno::UNO_QUERY_THROW
);
76 ScVbaNames::~ScVbaNames()
81 ScVbaNames::getScDocument()
83 uno::Reference
< frame::XModel
> xModel( getModel() , uno::UNO_QUERY_THROW
);
84 ScTabViewShell
* pTabViewShell
= excel::getBestViewShell( xModel
);
86 throw uno::RuntimeException( rtl::OUString::createFromAscii("No ViewShell available"), uno::Reference
< uno::XInterface
>() );
87 ScViewData
* pViewData
= pTabViewShell
->GetViewData();
89 throw uno::RuntimeException( rtl::OUString::createFromAscii("No ViewData available"), uno::Reference
< uno::XInterface
>() );
90 return pViewData
->GetDocument();
94 ScVbaNames::Add( const css::uno::Any
& Name
,
95 const css::uno::Any
& RefersTo
,
96 const css::uno::Any
& /*Visible*/,
97 const css::uno::Any
& /*MacroType*/,
98 const css::uno::Any
& /*ShoutcutKey*/,
99 const css::uno::Any
& /*Category*/,
100 const css::uno::Any
& NameLocal
,
101 const css::uno::Any
& /*RefersToLocal*/,
102 const css::uno::Any
& /*CategoryLocal*/,
103 const css::uno::Any
& RefersToR1C1
,
104 const css::uno::Any
& RefersToR1C1Local
) throw (css::uno::RuntimeException
)
108 uno::Reference
< excel::XRange
> xRange
;
109 if ( Name
.hasValue() )
111 else if ( NameLocal
.hasValue() )
113 if ( sName
.getLength() != 0 )
115 if ( !ScRangeData::IsNameValid( sName
, getScDocument() ) )
117 ::rtl::OUString sResult
;
118 sal_Int32 nToken
= 0;
119 sal_Int32 nIndex
= 0;
120 sResult
= sName
.getToken( nToken
, '!' , nIndex
);
124 sResult
= sName
.copy( nIndex
);
126 if ( !ScRangeData::IsNameValid( sName
, getScDocument() ) )
127 throw uno::RuntimeException( rtl::OUString::createFromAscii("This Name is a valid ."), uno::Reference
< uno::XInterface
>() );
130 if ( RefersTo
.hasValue() || RefersToR1C1
.hasValue() || RefersToR1C1Local
.hasValue() )
132 if ( RefersTo
.hasValue() )
134 if ( RefersToR1C1
.hasValue() )
135 RefersToR1C1
>>= xRange
;
136 if ( RefersToR1C1Local
.hasValue() )
137 RefersToR1C1Local
>>= xRange
;
142 ScVbaRange
* pRange
= dynamic_cast< ScVbaRange
* >( xRange
.get() );
143 uno::Reference
< table::XCellRange
> thisRange
;
144 uno::Any xAny
= pRange
->getCellRange() ;
145 if ( xAny
.hasValue() )
147 uno::Reference
< sheet::XCellRangeAddressable
> thisRangeAdd( thisRange
, ::uno::UNO_QUERY_THROW
);
148 table::CellRangeAddress aAddr
= thisRangeAdd
->getRangeAddress();
149 ScAddress
aPos( static_cast< SCCOL
>( aAddr
.StartColumn
) , static_cast< SCROW
>( aAddr
.StartRow
) , static_cast< SCTAB
>(aAddr
.Sheet
) );
151 String sRangeAdd
= xRange
->Address( xAny2
, xAny2
, xAny2
, xAny2
, xAny2
);
153 sTmp
+= String::CreateFromAscii("$");
154 sTmp
+= UniString(xRange
->getWorksheet()->getName());
155 sTmp
+= String::CreateFromAscii(".");
159 RangeType nType
= RT_NAME
;
160 table::CellAddress
aCellAddr( aAddr
.Sheet
, aAddr
.StartColumn
, aAddr
.StartRow
);
161 if ( mxNames
->hasByName( sName
) )
162 mxNames
->removeByName(sName
);
163 mxNames
->addNewByName( sName
, rtl::OUString(sTmp
) , aCellAddr
, (sal_Int32
)nType
);
166 return css::uno::Any();
169 // XEnumerationAccess
171 ScVbaNames::getElementType() throw( css::uno::RuntimeException
)
173 return ov::excel::XName::static_type(0);
176 uno::Reference
< container::XEnumeration
>
177 ScVbaNames::createEnumeration() throw (uno::RuntimeException
)
181 uno::Reference
< container::XEnumerationAccess
> xAccess( m_xIndexAccess
, uno::UNO_QUERY_THROW
);
182 return xAccess
->createEnumeration();
184 uno::Reference
< container::XEnumerationAccess
> xEnumAccess( mxNames
, uno::UNO_QUERY_THROW
);
185 return new NamesEnumeration( this, mxContext
, xEnumAccess
->createEnumeration(), mxModel
, mxNames
);
189 ScVbaNames::createCollectionObject( const uno::Any
& aSource
)
191 uno::Reference
< sheet::XNamedRange
> xName( aSource
, uno::UNO_QUERY
);
192 return uno::makeAny( uno::Reference
< excel::XName
> ( new ScVbaName( getParent(), mxContext
, xName
, mxNames
, mxModel
) ) );
196 ScVbaNames::getServiceImplName()
198 static rtl::OUString
sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaNames") );
202 css::uno::Sequence
<rtl::OUString
>
203 ScVbaNames::getServiceNames()
205 static uno::Sequence
< rtl::OUString
> aServiceNames
;
206 if ( aServiceNames
.getLength() == 0 )
208 aServiceNames
.realloc( 1 );
209 aServiceNames
[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.NamedRanges" ) );
211 return aServiceNames
;