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 #include "Functions.hxx"
24*b1cdbd2cSJim Jagielski #include "Function.hxx"
25*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
26*b1cdbd2cSJim Jagielski #include "core_resource.hxx"
27*b1cdbd2cSJim Jagielski #ifndef REPORTDESIGN_CORE_RESOURCE_HRC_
28*b1cdbd2cSJim Jagielski #include "core_resource.hrc"
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski #include <comphelper/property.hxx>
31*b1cdbd2cSJim Jagielski #include <boost/bind.hpp>
32*b1cdbd2cSJim Jagielski #include <algorithm>
33*b1cdbd2cSJim Jagielski // =============================================================================
34*b1cdbd2cSJim Jagielski namespace reportdesign
35*b1cdbd2cSJim Jagielski {
36*b1cdbd2cSJim Jagielski // =============================================================================
37*b1cdbd2cSJim Jagielski 	using namespace com::sun::star;
DBG_NAME(rpt_OFunctions)38*b1cdbd2cSJim Jagielski DBG_NAME( rpt_OFunctions )
39*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
40*b1cdbd2cSJim Jagielski OFunctions::OFunctions(const uno::Reference< report::XFunctionsSupplier >& _xParent,const uno::Reference< uno::XComponentContext >& context)
41*b1cdbd2cSJim Jagielski :FunctionsBase(m_aMutex)
42*b1cdbd2cSJim Jagielski ,m_aContainerListeners(m_aMutex)
43*b1cdbd2cSJim Jagielski ,m_xContext(context)
44*b1cdbd2cSJim Jagielski ,m_xParent(_xParent)
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski 	DBG_CTOR( rpt_OFunctions,NULL);
47*b1cdbd2cSJim Jagielski }
48*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
49*b1cdbd2cSJim Jagielski // TODO: VirtualFunctionFinder: This is virtual function!
50*b1cdbd2cSJim Jagielski //
~OFunctions()51*b1cdbd2cSJim Jagielski OFunctions::~OFunctions()
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski     DBG_DTOR( rpt_OFunctions,NULL);
54*b1cdbd2cSJim Jagielski }
55*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
dispose()56*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::dispose() throw(uno::RuntimeException)
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski 	cppu::WeakComponentImplHelperBase::dispose();
59*b1cdbd2cSJim Jagielski }
60*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
61*b1cdbd2cSJim Jagielski // TODO: VirtualFunctionFinder: This is virtual function!
62*b1cdbd2cSJim Jagielski //
disposing()63*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::disposing()
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski     ::std::for_each(m_aFunctions.begin(),m_aFunctions.end(),::boost::mem_fn(&com::sun::star::report::XFunction::dispose));
66*b1cdbd2cSJim Jagielski     m_aFunctions.clear();
67*b1cdbd2cSJim Jagielski     lang::EventObject aDisposeEvent( static_cast< ::cppu::OWeakObject* >( this ) );
68*b1cdbd2cSJim Jagielski     m_aContainerListeners.disposeAndClear( aDisposeEvent );
69*b1cdbd2cSJim Jagielski     m_xContext.clear();
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
72*b1cdbd2cSJim Jagielski // XFunctionsSupplier
73*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
createFunction()74*b1cdbd2cSJim Jagielski uno::Reference< report::XFunction > SAL_CALL OFunctions::createFunction(  ) throw (uno::RuntimeException)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski 	return new OFunction(m_xContext);
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
79*b1cdbd2cSJim Jagielski // XIndexContainer
insertByIndex(::sal_Int32 Index,const uno::Any & aElement)80*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::insertByIndex( ::sal_Int32 Index, const uno::Any& aElement ) throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski 	{
83*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard(m_aMutex);
84*b1cdbd2cSJim Jagielski 		sal_Bool bAdd = (Index == static_cast<sal_Int32>(m_aFunctions.size()));
85*b1cdbd2cSJim Jagielski 		if ( !bAdd )
86*b1cdbd2cSJim Jagielski 			checkIndex(Index);
87*b1cdbd2cSJim Jagielski 		uno::Reference< report::XFunction > xFunction(aElement,uno::UNO_QUERY);
88*b1cdbd2cSJim Jagielski 		if ( !xFunction.is() )
89*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException(RPT_RESSTRING(RID_STR_ARGUMENT_IS_NULL,m_xContext->getServiceManager()),*this,2);
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 		if ( bAdd )
92*b1cdbd2cSJim Jagielski 			m_aFunctions.push_back(xFunction);
93*b1cdbd2cSJim Jagielski 		else
94*b1cdbd2cSJim Jagielski 		{
95*b1cdbd2cSJim Jagielski 			TFunctions::iterator aPos = m_aFunctions.begin();
96*b1cdbd2cSJim Jagielski 			::std::advance(aPos,Index);
97*b1cdbd2cSJim Jagielski 			m_aFunctions.insert(aPos, xFunction);
98*b1cdbd2cSJim Jagielski 		}
99*b1cdbd2cSJim Jagielski         xFunction->setParent(*this);
100*b1cdbd2cSJim Jagielski 	}
101*b1cdbd2cSJim Jagielski 	// notify our container listeners
102*b1cdbd2cSJim Jagielski 	container::ContainerEvent aEvent(static_cast<container::XContainer*>(this), uno::makeAny(Index), aElement, uno::Any());
103*b1cdbd2cSJim Jagielski 	m_aContainerListeners.notifyEach(&container::XContainerListener::elementInserted,aEvent);
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
removeByIndex(::sal_Int32 Index)107*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::removeByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski 	uno::Reference< report::XFunction > xFunction;
110*b1cdbd2cSJim Jagielski 	{
111*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard(m_aMutex);
112*b1cdbd2cSJim Jagielski 		checkIndex(Index);
113*b1cdbd2cSJim Jagielski 		TFunctions::iterator aPos = m_aFunctions.begin();
114*b1cdbd2cSJim Jagielski 		::std::advance(aPos,Index);
115*b1cdbd2cSJim Jagielski 		xFunction = *aPos;
116*b1cdbd2cSJim Jagielski 		m_aFunctions.erase(aPos);
117*b1cdbd2cSJim Jagielski         xFunction->setParent(NULL);
118*b1cdbd2cSJim Jagielski 	}
119*b1cdbd2cSJim Jagielski 	container::ContainerEvent aEvent(static_cast<container::XContainer*>(this), uno::makeAny(Index), uno::makeAny(xFunction), uno::Any());
120*b1cdbd2cSJim Jagielski 	m_aContainerListeners.notifyEach(&container::XContainerListener::elementRemoved,aEvent);
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
123*b1cdbd2cSJim Jagielski // XIndexReplace
replaceByIndex(::sal_Int32 Index,const uno::Any & Element)124*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::replaceByIndex( ::sal_Int32 Index, const uno::Any& Element ) throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski 	uno::Any aOldElement;
127*b1cdbd2cSJim Jagielski 	{
128*b1cdbd2cSJim Jagielski 		::osl::MutexGuard aGuard(m_aMutex);
129*b1cdbd2cSJim Jagielski 		checkIndex(Index);
130*b1cdbd2cSJim Jagielski 		uno::Reference< report::XFunction > xFunction(Element,uno::UNO_QUERY);
131*b1cdbd2cSJim Jagielski 		if ( !xFunction.is() )
132*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException(RPT_RESSTRING(RID_STR_ARGUMENT_IS_NULL,m_xContext->getServiceManager()),*this,2);
133*b1cdbd2cSJim Jagielski 		TFunctions::iterator aPos = m_aFunctions.begin();
134*b1cdbd2cSJim Jagielski 		::std::advance(aPos,Index);
135*b1cdbd2cSJim Jagielski 		aOldElement <<= *aPos;
136*b1cdbd2cSJim Jagielski 		*aPos = xFunction;
137*b1cdbd2cSJim Jagielski 	}
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	container::ContainerEvent aEvent(static_cast<container::XContainer*>(this), uno::makeAny(Index), Element, aOldElement);
140*b1cdbd2cSJim Jagielski 	m_aContainerListeners.notifyEach(&container::XContainerListener::elementReplaced,aEvent);
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
143*b1cdbd2cSJim Jagielski // XIndexAccess
getCount()144*b1cdbd2cSJim Jagielski ::sal_Int32 SAL_CALL OFunctions::getCount(  ) throw (uno::RuntimeException)
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard(m_aMutex);
147*b1cdbd2cSJim Jagielski 	return m_aFunctions.size();
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getByIndex(::sal_Int32 Index)150*b1cdbd2cSJim Jagielski uno::Any SAL_CALL OFunctions::getByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard(m_aMutex);
153*b1cdbd2cSJim Jagielski 	checkIndex(Index);
154*b1cdbd2cSJim Jagielski 	TFunctions::iterator aPos = m_aFunctions.begin();
155*b1cdbd2cSJim Jagielski 	::std::advance(aPos,Index);
156*b1cdbd2cSJim Jagielski 	return uno::makeAny(*aPos);
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
159*b1cdbd2cSJim Jagielski // XElementAccess
getElementType()160*b1cdbd2cSJim Jagielski uno::Type SAL_CALL OFunctions::getElementType(  ) throw (uno::RuntimeException)
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski 	return ::getCppuType(static_cast< uno::Reference<report::XFunction>*>(NULL));
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
hasElements()165*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL OFunctions::hasElements(  ) throw (uno::RuntimeException)
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard(m_aMutex);
168*b1cdbd2cSJim Jagielski 	return !m_aFunctions.empty();
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
171*b1cdbd2cSJim Jagielski // XChild
getParent()172*b1cdbd2cSJim Jagielski uno::Reference< uno::XInterface > SAL_CALL OFunctions::getParent(  ) throw (uno::RuntimeException)
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski 	return m_xParent;
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
setParent(const uno::Reference<uno::XInterface> &)177*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::setParent( const uno::Reference< uno::XInterface >& /*Parent*/ ) throw (lang::NoSupportException, uno::RuntimeException)
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski 	throw lang::NoSupportException();
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
182*b1cdbd2cSJim Jagielski // XContainer
addContainerListener(const uno::Reference<container::XContainerListener> & xListener)183*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::addContainerListener( const uno::Reference< container::XContainerListener >& xListener ) throw (uno::RuntimeException)
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski 	m_aContainerListeners.addInterface(xListener);
186*b1cdbd2cSJim Jagielski }
187*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
removeContainerListener(const uno::Reference<container::XContainerListener> & xListener)188*b1cdbd2cSJim Jagielski void SAL_CALL OFunctions::removeContainerListener( const uno::Reference< container::XContainerListener >& xListener ) throw (uno::RuntimeException)
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski 	m_aContainerListeners.removeInterface(xListener);
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
checkIndex(sal_Int32 _nIndex)193*b1cdbd2cSJim Jagielski void OFunctions::checkIndex(sal_Int32 _nIndex)
194*b1cdbd2cSJim Jagielski {
195*b1cdbd2cSJim Jagielski 	if ( _nIndex < 0 || static_cast<sal_Int32>(m_aFunctions.size()) <= _nIndex )
196*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
197*b1cdbd2cSJim Jagielski }
198*b1cdbd2cSJim Jagielski // =============================================================================
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski // =============================================================================
201