1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #include "precompiled_reportdesign.hxx"
24 #include "Groups.hxx"
25 #include "Group.hxx"
26 #include <tools/debug.hxx>
27 #include "core_resource.hxx"
28 #ifndef REPORTDESIGN_CORE_RESOURCE_HRC_
29 #include "core_resource.hrc"
30 #endif
31 #include <boost/bind.hpp>
32 #include <algorithm>
33 // =============================================================================
34 namespace reportdesign
35 {
36 // =============================================================================
37 using namespace com::sun::star;
DBG_NAME(rpt_OGroups)38 DBG_NAME( rpt_OGroups )
39 // -----------------------------------------------------------------------------
40 OGroups::OGroups(const uno::Reference< report::XReportDefinition >& _xParent,const uno::Reference< uno::XComponentContext >& context)
41 :GroupsBase(m_aMutex)
42 ,m_aContainerListeners(m_aMutex)
43 ,m_xContext(context)
44 ,m_xParent(_xParent)
45 {
46 DBG_CTOR( rpt_OGroups,NULL);
47 }
48 //--------------------------------------------------------------------------
49 // TODO: VirtualFunctionFinder: This is virtual function!
50 //
~OGroups()51 OGroups::~OGroups()
52 {
53 DBG_DTOR( rpt_OGroups,NULL);
54 }
55 //--------------------------------------------------------------------------
copyGroups(const uno::Reference<report::XGroups> & _xSource)56 void OGroups::copyGroups(const uno::Reference< report::XGroups >& _xSource)
57 {
58 sal_Int32 nCount = _xSource->getCount();
59 for (sal_Int32 i = 0; i != nCount; ++i)
60 {
61 OGroup* pGroup = new OGroup(this,m_xContext);
62 m_aGroups.push_back(pGroup);
63 uno::Reference<report::XGroup> xGroup(_xSource->getByIndex(i),uno::UNO_QUERY);
64 pGroup->copyGroup(xGroup);
65 }
66 }
67 // -----------------------------------------------------------------------------
dispose()68 void SAL_CALL OGroups::dispose() throw(uno::RuntimeException)
69 {
70 cppu::WeakComponentImplHelperBase::dispose();
71 }
72 // -----------------------------------------------------------------------------
73 // TODO: VirtualFunctionFinder: This is virtual function!
74 //
disposing()75 void SAL_CALL OGroups::disposing()
76 {
77 ::std::for_each(m_aGroups.begin(),m_aGroups.end(),::boost::mem_fn(&com::sun::star::report::XGroup::dispose));
78 m_aGroups.clear();
79 lang::EventObject aDisposeEvent( static_cast< ::cppu::OWeakObject* >( this ) );
80 m_aContainerListeners.disposeAndClear( aDisposeEvent );
81 m_xContext.clear();
82 }
83 // -----------------------------------------------------------------------------
84 // XGroups
getReportDefinition()85 uno::Reference< report::XReportDefinition > SAL_CALL OGroups::getReportDefinition() throw (uno::RuntimeException)
86 {
87 return m_xParent;
88 }
89 // -----------------------------------------------------------------------------
createGroup()90 uno::Reference< report::XGroup > SAL_CALL OGroups::createGroup( ) throw (uno::RuntimeException)
91 {
92 return new OGroup(this,m_xContext);
93 }
94 // -----------------------------------------------------------------------------
95 // XIndexContainer
insertByIndex(::sal_Int32 Index,const uno::Any & aElement)96 void SAL_CALL OGroups::insertByIndex( ::sal_Int32 Index, const uno::Any& aElement ) throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
97 {
98 {
99 ::osl::MutexGuard aGuard(m_aMutex);
100 sal_Bool bAdd = (Index == static_cast<sal_Int32>(m_aGroups.size()));
101 if ( !bAdd )
102 checkIndex(Index);
103 uno::Reference< report::XGroup > xGroup(aElement,uno::UNO_QUERY);
104 if ( !xGroup.is() )
105 throw lang::IllegalArgumentException(RPT_RESSTRING(RID_STR_ARGUMENT_IS_NULL,m_xContext->getServiceManager()),*this,2);
106
107 if ( bAdd )
108 m_aGroups.push_back(xGroup);
109 else
110 {
111 TGroups::iterator aPos = m_aGroups.begin();
112 ::std::advance(aPos,Index);
113 m_aGroups.insert(aPos, xGroup);
114 }
115 }
116 // notify our container listeners
117 container::ContainerEvent aEvent(static_cast<container::XContainer*>(this), uno::makeAny(Index), aElement, uno::Any());
118 m_aContainerListeners.notifyEach(&container::XContainerListener::elementInserted,aEvent);
119 }
120
121 // -----------------------------------------------------------------------------
removeByIndex(::sal_Int32 Index)122 void SAL_CALL OGroups::removeByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
123 {
124 uno::Reference< report::XGroup > xGroup;
125 {
126 ::osl::MutexGuard aGuard(m_aMutex);
127 checkIndex(Index);
128 TGroups::iterator aPos = m_aGroups.begin();
129 ::std::advance(aPos,Index);
130 xGroup = *aPos;
131 m_aGroups.erase(aPos);
132 }
133 container::ContainerEvent aEvent(static_cast<container::XContainer*>(this), uno::makeAny(Index), uno::makeAny(xGroup), uno::Any());
134 m_aContainerListeners.notifyEach(&container::XContainerListener::elementRemoved,aEvent);
135 }
136 // -----------------------------------------------------------------------------
137 // XIndexReplace
replaceByIndex(::sal_Int32 Index,const uno::Any & Element)138 void SAL_CALL OGroups::replaceByIndex( ::sal_Int32 Index, const uno::Any& Element ) throw (lang::IllegalArgumentException, lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
139 {
140 uno::Any aOldElement;
141 {
142 ::osl::MutexGuard aGuard(m_aMutex);
143 checkIndex(Index);
144 uno::Reference< report::XGroup > xGroup(Element,uno::UNO_QUERY);
145 if ( !xGroup.is() )
146 throw lang::IllegalArgumentException(RPT_RESSTRING(RID_STR_ARGUMENT_IS_NULL,m_xContext->getServiceManager()),*this,2);
147 TGroups::iterator aPos = m_aGroups.begin();
148 ::std::advance(aPos,Index);
149 aOldElement <<= *aPos;
150 *aPos = xGroup;
151 }
152
153 container::ContainerEvent aEvent(static_cast<container::XContainer*>(this), uno::makeAny(Index), Element, aOldElement);
154 m_aContainerListeners.notifyEach(&container::XContainerListener::elementReplaced,aEvent);
155 }
156 // -----------------------------------------------------------------------------
157 // XIndexAccess
getCount()158 ::sal_Int32 SAL_CALL OGroups::getCount( ) throw (uno::RuntimeException)
159 {
160 ::osl::MutexGuard aGuard(m_aMutex);
161 return m_aGroups.size();
162 }
163 // -----------------------------------------------------------------------------
getByIndex(::sal_Int32 Index)164 uno::Any SAL_CALL OGroups::getByIndex( ::sal_Int32 Index ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException)
165 {
166 ::osl::MutexGuard aGuard(m_aMutex);
167 checkIndex(Index);
168 TGroups::iterator aPos = m_aGroups.begin();
169 ::std::advance(aPos,Index);
170 return uno::makeAny(*aPos);
171 }
172 // -----------------------------------------------------------------------------
173 // XElementAccess
getElementType()174 uno::Type SAL_CALL OGroups::getElementType( ) throw (uno::RuntimeException)
175 {
176 return ::getCppuType(static_cast< uno::Reference<report::XGroup>*>(NULL));
177 }
178 // -----------------------------------------------------------------------------
hasElements()179 ::sal_Bool SAL_CALL OGroups::hasElements( ) throw (uno::RuntimeException)
180 {
181 ::osl::MutexGuard aGuard(m_aMutex);
182 return !m_aGroups.empty();
183 }
184 // -----------------------------------------------------------------------------
185 // XChild
getParent()186 uno::Reference< uno::XInterface > SAL_CALL OGroups::getParent( ) throw (uno::RuntimeException)
187 {
188 return m_xParent;
189 }
190 // -----------------------------------------------------------------------------
setParent(const uno::Reference<uno::XInterface> &)191 void SAL_CALL OGroups::setParent( const uno::Reference< uno::XInterface >& /*Parent*/ ) throw (lang::NoSupportException, uno::RuntimeException)
192 {
193 throw lang::NoSupportException();
194 }
195 // -----------------------------------------------------------------------------
196 // XContainer
addContainerListener(const uno::Reference<container::XContainerListener> & xListener)197 void SAL_CALL OGroups::addContainerListener( const uno::Reference< container::XContainerListener >& xListener ) throw (uno::RuntimeException)
198 {
199 m_aContainerListeners.addInterface(xListener);
200 }
201 // -----------------------------------------------------------------------------
removeContainerListener(const uno::Reference<container::XContainerListener> & xListener)202 void SAL_CALL OGroups::removeContainerListener( const uno::Reference< container::XContainerListener >& xListener ) throw (uno::RuntimeException)
203 {
204 m_aContainerListeners.removeInterface(xListener);
205 }
206 // -----------------------------------------------------------------------------
checkIndex(sal_Int32 _nIndex)207 void OGroups::checkIndex(sal_Int32 _nIndex)
208 {
209 if ( _nIndex < 0 || static_cast<sal_Int32>(m_aGroups.size()) <= _nIndex )
210 throw lang::IndexOutOfBoundsException();
211 }
212 // =============================================================================
213 }
214 // =============================================================================
215