1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*f6e50924SAndrew Rist * distributed with this work for additional information
6*f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10*f6e50924SAndrew Rist *
11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist *
13*f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17*f6e50924SAndrew Rist * specific language governing permissions and limitations
18*f6e50924SAndrew Rist * under the License.
19*f6e50924SAndrew Rist *
20*f6e50924SAndrew Rist *************************************************************/
21*f6e50924SAndrew Rist
22*f6e50924SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "svx/svxerr.hxx"
28cdf0e10cSrcweir #include "fmpgeimp.hxx"
29cdf0e10cSrcweir #include "fmundo.hxx"
30cdf0e10cSrcweir #include "svx/fmtools.hxx"
31cdf0e10cSrcweir #include "fmprop.hrc"
32cdf0e10cSrcweir #include "fmservs.hxx"
33cdf0e10cSrcweir #include "fmobj.hxx"
34cdf0e10cSrcweir #include "formcontrolfactory.hxx"
35cdf0e10cSrcweir #include "svx/svditer.hxx"
36cdf0e10cSrcweir #include "svx/fmresids.hrc"
37cdf0e10cSrcweir #include "svx/dbtoolsclient.hxx"
38cdf0e10cSrcweir #include "treevisitor.hxx"
39cdf0e10cSrcweir
40cdf0e10cSrcweir #include <com/sun/star/sdb/CommandType.hpp>
41cdf0e10cSrcweir #include <com/sun/star/util/XCloneable.hpp>
42cdf0e10cSrcweir #include <com/sun/star/container/EnumerableMap.hpp>
43cdf0e10cSrcweir #include <com/sun/star/drawing/XControlShape.hpp>
44cdf0e10cSrcweir
45cdf0e10cSrcweir #include <sfx2/objsh.hxx>
46cdf0e10cSrcweir #include <svx/fmglob.hxx>
47cdf0e10cSrcweir #include <svx/fmpage.hxx>
48cdf0e10cSrcweir #include <svx/fmmodel.hxx>
49cdf0e10cSrcweir #include <tools/resid.hxx>
50cdf0e10cSrcweir #include <tools/diagnose_ex.h>
51cdf0e10cSrcweir #include <tools/shl.hxx>
52cdf0e10cSrcweir #include <vcl/stdtext.hxx>
53cdf0e10cSrcweir #include <svx/dialmgr.hxx>
54cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
55cdf0e10cSrcweir #include <comphelper/componentcontext.hxx>
56cdf0e10cSrcweir #include <comphelper/uno3.hxx>
57cdf0e10cSrcweir #include <comphelper/types.hxx>
58cdf0e10cSrcweir #include <unotools/streamwrap.hxx>
59cdf0e10cSrcweir #include <rtl/logfile.hxx>
60cdf0e10cSrcweir
61cdf0e10cSrcweir using namespace ::com::sun::star::uno;
62cdf0e10cSrcweir using namespace ::com::sun::star::lang;
63cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
64cdf0e10cSrcweir using namespace ::com::sun::star::sdb;
65cdf0e10cSrcweir using namespace ::com::sun::star::container;
66cdf0e10cSrcweir using namespace ::com::sun::star::beans;
67cdf0e10cSrcweir using namespace ::com::sun::star::form;
68cdf0e10cSrcweir using ::com::sun::star::util::XCloneable;
69cdf0e10cSrcweir using ::com::sun::star::awt::XControlModel;
70cdf0e10cSrcweir using ::com::sun::star::container::XMap;
71cdf0e10cSrcweir using ::com::sun::star::container::EnumerableMap;
72cdf0e10cSrcweir using ::com::sun::star::drawing::XControlShape;
73cdf0e10cSrcweir using namespace ::svxform;
74cdf0e10cSrcweir
DBG_NAME(FmFormPageImpl)75cdf0e10cSrcweir DBG_NAME(FmFormPageImpl)
76cdf0e10cSrcweir //------------------------------------------------------------------------------
77cdf0e10cSrcweir FmFormPageImpl::FmFormPageImpl( FmFormPage& _rPage )
78cdf0e10cSrcweir :m_rPage( _rPage )
79cdf0e10cSrcweir ,m_bFirstActivation( sal_True )
80cdf0e10cSrcweir ,m_bAttemptedFormCreation( false )
81cdf0e10cSrcweir ,m_bInFind( false )
82cdf0e10cSrcweir {
83cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPageImpl::FmFormPageImpl" );
84cdf0e10cSrcweir DBG_CTOR(FmFormPageImpl,NULL);
85cdf0e10cSrcweir }
86cdf0e10cSrcweir
87cdf0e10cSrcweir //------------------------------------------------------------------------------
88cdf0e10cSrcweir namespace
89cdf0e10cSrcweir {
90cdf0e10cSrcweir typedef Reference< XInterface > FormComponent;
91cdf0e10cSrcweir
92cdf0e10cSrcweir class FormComponentInfo
93cdf0e10cSrcweir {
94cdf0e10cSrcweir public:
childCount(const FormComponent & _component) const95cdf0e10cSrcweir size_t childCount( const FormComponent& _component ) const
96cdf0e10cSrcweir {
97cdf0e10cSrcweir Reference< XIndexAccess > xContainer( _component, UNO_QUERY );
98cdf0e10cSrcweir if ( xContainer.is() )
99cdf0e10cSrcweir return xContainer->getCount();
100cdf0e10cSrcweir return 0;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir
getChild(const FormComponent & _component,size_t _index) const103cdf0e10cSrcweir FormComponent getChild( const FormComponent& _component, size_t _index ) const
104cdf0e10cSrcweir {
105cdf0e10cSrcweir Reference< XIndexAccess > xContainer( _component, UNO_QUERY_THROW );
106cdf0e10cSrcweir return FormComponent( xContainer->getByIndex( _index ), UNO_QUERY );
107cdf0e10cSrcweir }
108cdf0e10cSrcweir };
109cdf0e10cSrcweir
110cdf0e10cSrcweir typedef ::std::pair< FormComponent, FormComponent > FormComponentPair;
111cdf0e10cSrcweir
112cdf0e10cSrcweir class FormHierarchyComparator
113cdf0e10cSrcweir {
114cdf0e10cSrcweir public:
FormHierarchyComparator()115cdf0e10cSrcweir FormHierarchyComparator()
116cdf0e10cSrcweir {
117cdf0e10cSrcweir }
118cdf0e10cSrcweir
childCount(const FormComponentPair & _components) const119cdf0e10cSrcweir size_t childCount( const FormComponentPair& _components ) const
120cdf0e10cSrcweir {
121cdf0e10cSrcweir size_t lhsCount = m_aComponentInfo.childCount( _components.first );
122cdf0e10cSrcweir size_t rhsCount = m_aComponentInfo.childCount( _components.second );
123cdf0e10cSrcweir if ( lhsCount != rhsCount )
124cdf0e10cSrcweir throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Found inconsistent form component hierarchies (1)!" ) ), NULL );
125cdf0e10cSrcweir return lhsCount;
126cdf0e10cSrcweir }
127cdf0e10cSrcweir
getChild(const FormComponentPair & _components,size_t _index) const128cdf0e10cSrcweir FormComponentPair getChild( const FormComponentPair& _components, size_t _index ) const
129cdf0e10cSrcweir {
130cdf0e10cSrcweir return FormComponentPair(
131cdf0e10cSrcweir m_aComponentInfo.getChild( _components.first, _index ),
132cdf0e10cSrcweir m_aComponentInfo.getChild( _components.second, _index )
133cdf0e10cSrcweir );
134cdf0e10cSrcweir }
135cdf0e10cSrcweir private:
136cdf0e10cSrcweir FormComponentInfo m_aComponentInfo;
137cdf0e10cSrcweir };
138cdf0e10cSrcweir
139cdf0e10cSrcweir typedef ::std::map< Reference< XControlModel >, Reference< XControlModel >, ::comphelper::OInterfaceCompare< XControlModel > > MapControlModels;
140cdf0e10cSrcweir
141cdf0e10cSrcweir class FormComponentAssignment
142cdf0e10cSrcweir {
143cdf0e10cSrcweir public:
FormComponentAssignment(MapControlModels & _out_controlModelMap)144cdf0e10cSrcweir FormComponentAssignment( MapControlModels& _out_controlModelMap )
145cdf0e10cSrcweir :m_rControlModelMap( _out_controlModelMap )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
process(const FormComponentPair & _component)149cdf0e10cSrcweir void process( const FormComponentPair& _component )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir Reference< XControlModel > lhsControlModel( _component.first, UNO_QUERY );
152cdf0e10cSrcweir Reference< XControlModel > rhsControlModel( _component.second, UNO_QUERY );
153cdf0e10cSrcweir if ( lhsControlModel.is() != rhsControlModel.is() )
154cdf0e10cSrcweir throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Found inconsistent form component hierarchies (2)!" ) ), NULL );
155cdf0e10cSrcweir
156cdf0e10cSrcweir if ( lhsControlModel.is() )
157cdf0e10cSrcweir m_rControlModelMap[ lhsControlModel ] = rhsControlModel;
158cdf0e10cSrcweir }
159cdf0e10cSrcweir
160cdf0e10cSrcweir private:
161cdf0e10cSrcweir MapControlModels& m_rControlModelMap;
162cdf0e10cSrcweir };
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
165cdf0e10cSrcweir //------------------------------------------------------------------------------
initFrom(FmFormPageImpl & i_foreignImpl)166cdf0e10cSrcweir void FmFormPageImpl::initFrom( FmFormPageImpl& i_foreignImpl )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir // clone the Forms collection
169cdf0e10cSrcweir const Reference< XNameContainer > xForeignForms( const_cast< FmFormPageImpl& >( i_foreignImpl ).getForms( false ) );
170cdf0e10cSrcweir const Reference< XCloneable > xCloneable( xForeignForms, UNO_QUERY );
171cdf0e10cSrcweir if ( !xCloneable.is() )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir // great, nothing to do
174cdf0e10cSrcweir OSL_ENSURE( !xForeignForms.is(), "FmFormPageImpl::FmFormPageImpl: a non-cloneable forms container!?" );
175cdf0e10cSrcweir return;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir
178cdf0e10cSrcweir try
179cdf0e10cSrcweir {
180cdf0e10cSrcweir m_xForms.set( xCloneable->createClone(), UNO_QUERY_THROW );
181cdf0e10cSrcweir
182cdf0e10cSrcweir // create a mapping between the original control models and their clones
183cdf0e10cSrcweir MapControlModels aModelAssignment;
184cdf0e10cSrcweir
185cdf0e10cSrcweir typedef TreeVisitor< FormComponentPair, FormHierarchyComparator, FormComponentAssignment > FormComponentVisitor;
186cdf0e10cSrcweir FormComponentVisitor aVisitor = FormComponentVisitor( FormHierarchyComparator() );
187cdf0e10cSrcweir
188cdf0e10cSrcweir FormComponentAssignment aAssignmentProcessor( aModelAssignment );
189cdf0e10cSrcweir aVisitor.process( FormComponentPair( xCloneable, m_xForms ), aAssignmentProcessor );
190cdf0e10cSrcweir
191cdf0e10cSrcweir // assign the cloned models to their SdrObjects
192cdf0e10cSrcweir SdrObjListIter aForeignIter( i_foreignImpl.m_rPage );
193cdf0e10cSrcweir SdrObjListIter aOwnIter( m_rPage );
194cdf0e10cSrcweir
195cdf0e10cSrcweir OSL_ENSURE( aForeignIter.IsMore() == aOwnIter.IsMore(), "FmFormPageImpl::FmFormPageImpl: inconsistent number of objects (1)!" );
196cdf0e10cSrcweir while ( aForeignIter.IsMore() && aOwnIter.IsMore() )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir FmFormObj* pForeignObj = dynamic_cast< FmFormObj* >( aForeignIter.Next() );
199cdf0e10cSrcweir FmFormObj* pOwnObj = dynamic_cast< FmFormObj* >( aOwnIter.Next() );
200cdf0e10cSrcweir
201cdf0e10cSrcweir bool bForeignIsForm = pForeignObj && ( pForeignObj->GetObjInventor() == FmFormInventor );
202cdf0e10cSrcweir bool bOwnIsForm = pOwnObj && ( pOwnObj->GetObjInventor() == FmFormInventor );
203cdf0e10cSrcweir
204cdf0e10cSrcweir ENSURE_OR_BREAK( bForeignIsForm == bOwnIsForm, "FmFormPageImpl::FmFormPageImpl: inconsistent ordering of objects!" );
205cdf0e10cSrcweir // if this fires, don't attempt to do further assignments, something's completely messed up
206cdf0e10cSrcweir
207cdf0e10cSrcweir if ( !bForeignIsForm )
208cdf0e10cSrcweir // no form control -> next round
209cdf0e10cSrcweir continue;
210cdf0e10cSrcweir
211cdf0e10cSrcweir Reference< XControlModel > xForeignModel( pForeignObj->GetUnoControlModel() );
212cdf0e10cSrcweir ENSURE_OR_CONTINUE( xForeignModel.is(), "FmFormPageImpl::FmFormPageImpl: control shape without control!" );
213cdf0e10cSrcweir // if this fires, the SdrObject does not have a UNO Control Model. This is pathological, but well ...
214cdf0e10cSrcweir // So the cloned SdrObject will also not have a UNO Control Model.
215cdf0e10cSrcweir
216cdf0e10cSrcweir MapControlModels::const_iterator assignment = aModelAssignment.find( xForeignModel );
217cdf0e10cSrcweir ENSURE_OR_CONTINUE( assignment != aModelAssignment.end(), "FmFormPageImpl::FmFormPageImpl: no clone found for this model!" );
218cdf0e10cSrcweir // if this fires, the source SdrObject has a model, but it is not part of the model hierarchy in
219cdf0e10cSrcweir // i_foreignImpl.getForms().
220cdf0e10cSrcweir // Pathological, too ...
221cdf0e10cSrcweir
222cdf0e10cSrcweir pOwnObj->SetUnoControlModel( assignment->second );
223cdf0e10cSrcweir }
224cdf0e10cSrcweir OSL_ENSURE( aForeignIter.IsMore() == aOwnIter.IsMore(), "FmFormPageImpl::FmFormPageImpl: inconsistent number of objects (2)!" );
225cdf0e10cSrcweir }
226cdf0e10cSrcweir catch( const Exception& )
227cdf0e10cSrcweir {
228cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
229cdf0e10cSrcweir }
230cdf0e10cSrcweir }
231cdf0e10cSrcweir
232cdf0e10cSrcweir //------------------------------------------------------------------------------
getControlToShapeMap()233cdf0e10cSrcweir Reference< XMap > FmFormPageImpl::getControlToShapeMap()
234cdf0e10cSrcweir {
235cdf0e10cSrcweir Reference< XMap > xControlShapeMap( m_aControlShapeMap.get(), UNO_QUERY );
236cdf0e10cSrcweir if ( xControlShapeMap.is() )
237cdf0e10cSrcweir return xControlShapeMap;
238cdf0e10cSrcweir
239cdf0e10cSrcweir xControlShapeMap = impl_createControlShapeMap_nothrow();
240cdf0e10cSrcweir m_aControlShapeMap = xControlShapeMap;
241cdf0e10cSrcweir return xControlShapeMap;
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
244cdf0e10cSrcweir //------------------------------------------------------------------------------
245cdf0e10cSrcweir namespace
246cdf0e10cSrcweir {
lcl_insertFormObject_throw(const FmFormObj & _object,const Reference<XMap> & _map)247cdf0e10cSrcweir static void lcl_insertFormObject_throw( const FmFormObj& _object, const Reference< XMap >& _map )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir // the control model
250cdf0e10cSrcweir Reference< XControlModel > xControlModel( _object.GetUnoControlModel(), UNO_QUERY );
251cdf0e10cSrcweir OSL_ENSURE( xControlModel.is(), "lcl_insertFormObject_throw: suspicious: no control model!" );
252cdf0e10cSrcweir if ( !xControlModel.is() )
253cdf0e10cSrcweir return;
254cdf0e10cSrcweir
255cdf0e10cSrcweir Reference< XControlShape > xControlShape( const_cast< FmFormObj& >( _object ).getUnoShape(), UNO_QUERY );
256cdf0e10cSrcweir OSL_ENSURE( xControlShape.is(), "lcl_insertFormObject_throw: suspicious: no control shape!" );
257cdf0e10cSrcweir if ( !xControlShape.is() )
258cdf0e10cSrcweir return;
259cdf0e10cSrcweir
260cdf0e10cSrcweir _map->put( makeAny( xControlModel ), makeAny( xControlShape ) );
261cdf0e10cSrcweir }
262cdf0e10cSrcweir
lcl_removeFormObject_throw(const FmFormObj & _object,const Reference<XMap> & _map,bool i_ignoreNonExistence=false)263cdf0e10cSrcweir static void lcl_removeFormObject_throw( const FmFormObj& _object, const Reference< XMap >& _map, bool i_ignoreNonExistence = false )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir // the control model
266cdf0e10cSrcweir Reference< XControlModel > xControlModel( _object.GetUnoControlModel(), UNO_QUERY );
267cdf0e10cSrcweir OSL_ENSURE( xControlModel.is(), "lcl_removeFormObject: suspicious: no control model!" );
268cdf0e10cSrcweir if ( !xControlModel.is() )
269cdf0e10cSrcweir return;
270cdf0e10cSrcweir
271cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
272cdf0e10cSrcweir Any aOldAssignment =
273cdf0e10cSrcweir #endif
274cdf0e10cSrcweir _map->remove( makeAny( xControlModel ) );
275cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
276cdf0e10cSrcweir (void)aOldAssignment;
277cdf0e10cSrcweir #endif
278cdf0e10cSrcweir OSL_ENSURE( !i_ignoreNonExistence ||
279cdf0e10cSrcweir ( aOldAssignment == makeAny( Reference< XControlShape >( const_cast< FmFormObj& >( _object ).getUnoShape(), UNO_QUERY ) ) ),
280cdf0e10cSrcweir "lcl_removeFormObject: map was inconsistent!" );
281cdf0e10cSrcweir (void)i_ignoreNonExistence;
282cdf0e10cSrcweir }
283cdf0e10cSrcweir }
284cdf0e10cSrcweir
285cdf0e10cSrcweir //------------------------------------------------------------------------------
impl_createControlShapeMap_nothrow()286cdf0e10cSrcweir Reference< XMap > FmFormPageImpl::impl_createControlShapeMap_nothrow()
287cdf0e10cSrcweir {
288cdf0e10cSrcweir Reference< XMap > xMap;
289cdf0e10cSrcweir
290cdf0e10cSrcweir try
291cdf0e10cSrcweir {
292cdf0e10cSrcweir ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
293cdf0e10cSrcweir xMap.set( EnumerableMap::create( aContext.getUNOContext(),
294cdf0e10cSrcweir ::cppu::UnoType< XControlModel >::get(),
295cdf0e10cSrcweir ::cppu::UnoType< XControlShape >::get()
296cdf0e10cSrcweir ).get(), UNO_SET_THROW );
297cdf0e10cSrcweir
298cdf0e10cSrcweir SdrObjListIter aPageIter( m_rPage );
299cdf0e10cSrcweir while ( aPageIter.IsMore() )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir // only FmFormObjs are what we're interested in
302cdf0e10cSrcweir FmFormObj* pCurrent = FmFormObj::GetFormObject( aPageIter.Next() );
303cdf0e10cSrcweir if ( !pCurrent )
304cdf0e10cSrcweir continue;
305cdf0e10cSrcweir
306cdf0e10cSrcweir lcl_insertFormObject_throw( *pCurrent, xMap );
307cdf0e10cSrcweir }
308cdf0e10cSrcweir }
309cdf0e10cSrcweir catch( const Exception& )
310cdf0e10cSrcweir {
311cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
312cdf0e10cSrcweir }
313cdf0e10cSrcweir return xMap;
314cdf0e10cSrcweir }
315cdf0e10cSrcweir
316cdf0e10cSrcweir //------------------------------------------------------------------------------
getForms(bool _bForceCreate)317cdf0e10cSrcweir const Reference< XNameContainer >& FmFormPageImpl::getForms( bool _bForceCreate )
318cdf0e10cSrcweir {
319cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPageImpl::getForms" );
320cdf0e10cSrcweir if ( m_xForms.is() || !_bForceCreate )
321cdf0e10cSrcweir return m_xForms;
322cdf0e10cSrcweir
323cdf0e10cSrcweir if ( !m_bAttemptedFormCreation )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir m_bAttemptedFormCreation = true;
326cdf0e10cSrcweir
327cdf0e10cSrcweir const ::rtl::OUString sFormsCollectionServiceName = ::rtl::OUString::createFromAscii("com.sun.star.form.Forms");
328cdf0e10cSrcweir m_xForms = Reference< XNameContainer > (
329cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( sFormsCollectionServiceName ),
330cdf0e10cSrcweir UNO_QUERY
331cdf0e10cSrcweir );
332cdf0e10cSrcweir DBG_ASSERT( m_xForms.is(), "FmFormPageImpl::getForms: could not create a forms collection!" );
333cdf0e10cSrcweir
334cdf0e10cSrcweir if ( m_aFormsCreationHdl.IsSet() )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir m_aFormsCreationHdl.Call( this );
337cdf0e10cSrcweir }
338cdf0e10cSrcweir
339cdf0e10cSrcweir FmFormModel* pFormsModel = PTR_CAST( FmFormModel, m_rPage.GetModel() );
340cdf0e10cSrcweir
341cdf0e10cSrcweir // give the newly created collection a place in the universe
342cdf0e10cSrcweir Reference< XChild > xAsChild( m_xForms, UNO_QUERY );
343cdf0e10cSrcweir if ( xAsChild.is() )
344cdf0e10cSrcweir {
345cdf0e10cSrcweir SfxObjectShell* pObjShell = pFormsModel ? pFormsModel->GetObjectShell() : NULL;
346cdf0e10cSrcweir if ( pObjShell )
347cdf0e10cSrcweir xAsChild->setParent( pObjShell->GetModel() );
348cdf0e10cSrcweir }
349cdf0e10cSrcweir
350cdf0e10cSrcweir // tell the UNDO environment that we have a new forms collection
351cdf0e10cSrcweir if ( pFormsModel )
352cdf0e10cSrcweir pFormsModel->GetUndoEnv().AddForms( m_xForms );
353cdf0e10cSrcweir }
354cdf0e10cSrcweir return m_xForms;
355cdf0e10cSrcweir }
356cdf0e10cSrcweir
357cdf0e10cSrcweir //------------------------------------------------------------------------------
~FmFormPageImpl()358cdf0e10cSrcweir FmFormPageImpl::~FmFormPageImpl()
359cdf0e10cSrcweir {
360cdf0e10cSrcweir xCurrentForm = NULL;
361cdf0e10cSrcweir
362cdf0e10cSrcweir ::comphelper::disposeComponent( m_xForms );
363cdf0e10cSrcweir DBG_DTOR(FmFormPageImpl,NULL);
364cdf0e10cSrcweir }
365cdf0e10cSrcweir
366cdf0e10cSrcweir //------------------------------------------------------------------------------
validateCurForm()367cdf0e10cSrcweir bool FmFormPageImpl::validateCurForm()
368cdf0e10cSrcweir {
369cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPageImpl::validateCurForm" );
370cdf0e10cSrcweir if ( !xCurrentForm.is() )
371cdf0e10cSrcweir return false;
372cdf0e10cSrcweir
373cdf0e10cSrcweir Reference< XChild > xAsChild( xCurrentForm, UNO_QUERY );
374cdf0e10cSrcweir DBG_ASSERT( xAsChild.is(), "FmFormPageImpl::validateCurForm: a form which is no child??" );
375cdf0e10cSrcweir if ( !xAsChild.is() || !xAsChild->getParent().is() )
376cdf0e10cSrcweir xCurrentForm.clear();
377cdf0e10cSrcweir
378cdf0e10cSrcweir return xCurrentForm.is();
379cdf0e10cSrcweir }
380cdf0e10cSrcweir
381cdf0e10cSrcweir //------------------------------------------------------------------------------
setCurForm(Reference<::com::sun::star::form::XForm> xForm)382cdf0e10cSrcweir void FmFormPageImpl::setCurForm(Reference< ::com::sun::star::form::XForm > xForm)
383cdf0e10cSrcweir {
384cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPageImpl::setCurForm" );
385cdf0e10cSrcweir xCurrentForm = xForm;
386cdf0e10cSrcweir }
387cdf0e10cSrcweir
388cdf0e10cSrcweir //------------------------------------------------------------------------------
getDefaultForm()389cdf0e10cSrcweir Reference< XForm > FmFormPageImpl::getDefaultForm()
390cdf0e10cSrcweir {
391cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPageImpl::getDefaultForm" );
392cdf0e10cSrcweir Reference< XForm > xForm;
393cdf0e10cSrcweir
394cdf0e10cSrcweir Reference< XNameContainer > xForms( getForms() );
395cdf0e10cSrcweir
396cdf0e10cSrcweir // by default, we use our "current form"
397cdf0e10cSrcweir if ( !validateCurForm() )
398cdf0e10cSrcweir {
399cdf0e10cSrcweir // check whether there is a "standard" form
400cdf0e10cSrcweir if ( xForms->hasElements() )
401cdf0e10cSrcweir {
402cdf0e10cSrcweir // suche die Standardform
403cdf0e10cSrcweir ::rtl::OUString sStandardFormname = String( SVX_RES( RID_STR_STDFORMNAME ) );
404cdf0e10cSrcweir
405cdf0e10cSrcweir try
406cdf0e10cSrcweir {
407cdf0e10cSrcweir if ( xForms->hasByName( sStandardFormname ) )
408cdf0e10cSrcweir xForm.set( xForms->getByName( sStandardFormname ), UNO_QUERY_THROW );
409cdf0e10cSrcweir else
410cdf0e10cSrcweir {
411cdf0e10cSrcweir Reference< XIndexAccess > xFormsByIndex( xForms, UNO_QUERY_THROW );
412cdf0e10cSrcweir xForm.set( xFormsByIndex->getByIndex(0), UNO_QUERY_THROW );
413cdf0e10cSrcweir }
414cdf0e10cSrcweir }
415cdf0e10cSrcweir catch( const Exception& )
416cdf0e10cSrcweir {
417cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
418cdf0e10cSrcweir }
419cdf0e10cSrcweir }
420cdf0e10cSrcweir }
421cdf0e10cSrcweir else
422cdf0e10cSrcweir {
423cdf0e10cSrcweir xForm = xCurrentForm;
424cdf0e10cSrcweir }
425cdf0e10cSrcweir
426cdf0e10cSrcweir // did not find an existing suitable form -> create a new one
427cdf0e10cSrcweir if ( !xForm.is() )
428cdf0e10cSrcweir {
429cdf0e10cSrcweir SdrModel* pModel = m_rPage.GetModel();
430cdf0e10cSrcweir
431cdf0e10cSrcweir if( pModel->IsUndoEnabled() )
432cdf0e10cSrcweir {
433cdf0e10cSrcweir XubString aStr(SVX_RES(RID_STR_FORM));
434cdf0e10cSrcweir XubString aUndoStr(SVX_RES(RID_STR_UNDO_CONTAINER_INSERT));
435cdf0e10cSrcweir aUndoStr.SearchAndReplace('#', aStr);
436cdf0e10cSrcweir pModel->BegUndo(aUndoStr);
437cdf0e10cSrcweir }
438cdf0e10cSrcweir
439cdf0e10cSrcweir try
440cdf0e10cSrcweir {
441cdf0e10cSrcweir xForm.set( ::comphelper::getProcessServiceFactory()->createInstance( FM_SUN_COMPONENT_FORM ), UNO_QUERY );
442cdf0e10cSrcweir
443cdf0e10cSrcweir // a form should always have the command type table as default
444cdf0e10cSrcweir Reference< XPropertySet > xFormProps( xForm, UNO_QUERY_THROW );
445cdf0e10cSrcweir xFormProps->setPropertyValue( FM_PROP_COMMANDTYPE, makeAny( sal_Int32( CommandType::TABLE ) ) );
446cdf0e10cSrcweir
447cdf0e10cSrcweir // and the "Standard" name
448cdf0e10cSrcweir ::rtl::OUString sName = String( SVX_RES( RID_STR_STDFORMNAME ) );
449cdf0e10cSrcweir xFormProps->setPropertyValue( FM_PROP_NAME, makeAny( sName ) );
450cdf0e10cSrcweir
451cdf0e10cSrcweir Reference< XIndexContainer > xContainer( xForms, UNO_QUERY );
452cdf0e10cSrcweir if( pModel->IsUndoEnabled() )
453cdf0e10cSrcweir {
454cdf0e10cSrcweir pModel->AddUndo(new FmUndoContainerAction(*(FmFormModel*)pModel,
455cdf0e10cSrcweir FmUndoContainerAction::Inserted,
456cdf0e10cSrcweir xContainer,
457cdf0e10cSrcweir xForm,
458cdf0e10cSrcweir xContainer->getCount()));
459cdf0e10cSrcweir }
460cdf0e10cSrcweir xForms->insertByName( sName, makeAny( xForm ) );
461cdf0e10cSrcweir xCurrentForm = xForm;
462cdf0e10cSrcweir }
463cdf0e10cSrcweir catch( const Exception& )
464cdf0e10cSrcweir {
465cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
466cdf0e10cSrcweir xForm.clear();
467cdf0e10cSrcweir }
468cdf0e10cSrcweir
469cdf0e10cSrcweir if( pModel->IsUndoEnabled() )
470cdf0e10cSrcweir pModel->EndUndo();
471cdf0e10cSrcweir }
472cdf0e10cSrcweir
473cdf0e10cSrcweir return xForm;
474cdf0e10cSrcweir }
475cdf0e10cSrcweir
476cdf0e10cSrcweir //------------------------------------------------------------------------------
findPlaceInFormComponentHierarchy(const Reference<XFormComponent> & rContent,const Reference<XDataSource> & rDatabase,const::rtl::OUString & rDBTitle,const::rtl::OUString & rCursorSource,sal_Int32 nCommandType)477cdf0e10cSrcweir Reference< ::com::sun::star::form::XForm > FmFormPageImpl::findPlaceInFormComponentHierarchy(
478cdf0e10cSrcweir const Reference< XFormComponent > & rContent, const Reference< XDataSource > & rDatabase,
479cdf0e10cSrcweir const ::rtl::OUString& rDBTitle, const ::rtl::OUString& rCursorSource, sal_Int32 nCommandType )
480cdf0e10cSrcweir {
481cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPageImpl::findPlaceInFormComponentHierarchy" );
482cdf0e10cSrcweir // if the control already is child of a form, don't do anything
483cdf0e10cSrcweir if (!rContent.is() || rContent->getParent().is())
484cdf0e10cSrcweir return NULL;
485cdf0e10cSrcweir
486cdf0e10cSrcweir Reference< XForm > xForm;
487cdf0e10cSrcweir
488cdf0e10cSrcweir // Wenn Datenbank und CursorSource gesetzt sind, dann wird
489cdf0e10cSrcweir // die Form anhand dieser Kriterien gesucht, ansonsten nur aktuelle
490cdf0e10cSrcweir // und die StandardForm
491cdf0e10cSrcweir if (rDatabase.is() && rCursorSource.getLength())
492cdf0e10cSrcweir {
493cdf0e10cSrcweir validateCurForm();
494cdf0e10cSrcweir
495cdf0e10cSrcweir // erst in der aktuellen form suchen
496cdf0e10cSrcweir xForm = findFormForDataSource( xCurrentForm, rDatabase, rCursorSource, nCommandType );
497cdf0e10cSrcweir
498cdf0e10cSrcweir Reference< ::com::sun::star::container::XIndexAccess > xFormsByIndex( getForms(), UNO_QUERY );
499cdf0e10cSrcweir DBG_ASSERT(xFormsByIndex.is(), "FmFormPageImpl::findPlaceInFormComponentHierarchy : no index access for my forms collection !");
500cdf0e10cSrcweir sal_Int32 nCount = xFormsByIndex->getCount();
501cdf0e10cSrcweir for (sal_Int32 i = 0; !xForm.is() && i < nCount; i++)
502cdf0e10cSrcweir {
503cdf0e10cSrcweir Reference< ::com::sun::star::form::XForm > xToSearch;
504cdf0e10cSrcweir xFormsByIndex->getByIndex(i) >>= xToSearch;
505cdf0e10cSrcweir xForm = findFormForDataSource( xToSearch, rDatabase, rCursorSource, nCommandType );
506cdf0e10cSrcweir }
507cdf0e10cSrcweir
508cdf0e10cSrcweir // wenn keine ::com::sun::star::form gefunden, dann eine neue erzeugen
509cdf0e10cSrcweir if (!xForm.is())
510cdf0e10cSrcweir {
511cdf0e10cSrcweir SdrModel* pModel = m_rPage.GetModel();
512cdf0e10cSrcweir
513cdf0e10cSrcweir const bool bUndo = pModel->IsUndoEnabled();
514cdf0e10cSrcweir
515cdf0e10cSrcweir if( bUndo )
516cdf0e10cSrcweir {
517cdf0e10cSrcweir XubString aStr(SVX_RES(RID_STR_FORM));
518cdf0e10cSrcweir XubString aUndoStr(SVX_RES(RID_STR_UNDO_CONTAINER_INSERT));
519cdf0e10cSrcweir aUndoStr.SearchAndReplace('#', aStr);
520cdf0e10cSrcweir pModel->BegUndo(aUndoStr);
521cdf0e10cSrcweir }
522cdf0e10cSrcweir
523cdf0e10cSrcweir xForm = Reference< ::com::sun::star::form::XForm >(::comphelper::getProcessServiceFactory()->createInstance(FM_SUN_COMPONENT_FORM), UNO_QUERY);
524cdf0e10cSrcweir // a form should always have the command type table as default
525cdf0e10cSrcweir Reference< ::com::sun::star::beans::XPropertySet > xFormProps(xForm, UNO_QUERY);
526cdf0e10cSrcweir try { xFormProps->setPropertyValue(FM_PROP_COMMANDTYPE, makeAny(sal_Int32(CommandType::TABLE))); }
527cdf0e10cSrcweir catch(Exception&) { }
528cdf0e10cSrcweir
529cdf0e10cSrcweir if (rDBTitle.getLength())
530cdf0e10cSrcweir xFormProps->setPropertyValue(FM_PROP_DATASOURCE,makeAny(rDBTitle));
531cdf0e10cSrcweir else
532cdf0e10cSrcweir {
533cdf0e10cSrcweir Reference< ::com::sun::star::beans::XPropertySet > xDatabaseProps(rDatabase, UNO_QUERY);
534cdf0e10cSrcweir Any aDatabaseUrl = xDatabaseProps->getPropertyValue(FM_PROP_URL);
535cdf0e10cSrcweir xFormProps->setPropertyValue(FM_PROP_DATASOURCE, aDatabaseUrl);
536cdf0e10cSrcweir }
537cdf0e10cSrcweir
538cdf0e10cSrcweir xFormProps->setPropertyValue(FM_PROP_COMMAND,makeAny(rCursorSource));
539cdf0e10cSrcweir xFormProps->setPropertyValue(FM_PROP_COMMANDTYPE, makeAny(nCommandType));
540cdf0e10cSrcweir
541cdf0e10cSrcweir Reference< ::com::sun::star::container::XNameAccess > xNamedSet( getForms(), UNO_QUERY );
542cdf0e10cSrcweir
543cdf0e10cSrcweir const bool bTableOrQuery = ( CommandType::TABLE == nCommandType ) || ( CommandType::QUERY == nCommandType );
544cdf0e10cSrcweir ::rtl::OUString sName = FormControlFactory::getUniqueName( xNamedSet,
545cdf0e10cSrcweir bTableOrQuery ? rCursorSource : ::rtl::OUString( String( SVX_RES( RID_STR_STDFORMNAME ) ) ) );
546cdf0e10cSrcweir
547cdf0e10cSrcweir xFormProps->setPropertyValue( FM_PROP_NAME, makeAny( sName ) );
548cdf0e10cSrcweir
549cdf0e10cSrcweir if( bUndo )
550cdf0e10cSrcweir {
551cdf0e10cSrcweir Reference< ::com::sun::star::container::XIndexContainer > xContainer( getForms(), UNO_QUERY );
552cdf0e10cSrcweir pModel->AddUndo(new FmUndoContainerAction(*(FmFormModel*)pModel,
553cdf0e10cSrcweir FmUndoContainerAction::Inserted,
554cdf0e10cSrcweir xContainer,
555cdf0e10cSrcweir xForm,
556cdf0e10cSrcweir xContainer->getCount()));
557cdf0e10cSrcweir }
558cdf0e10cSrcweir
559cdf0e10cSrcweir getForms()->insertByName( sName, makeAny( xForm ) );
560cdf0e10cSrcweir
561cdf0e10cSrcweir if( bUndo )
562cdf0e10cSrcweir pModel->EndUndo();
563cdf0e10cSrcweir }
564cdf0e10cSrcweir xCurrentForm = xForm;
565cdf0e10cSrcweir }
566cdf0e10cSrcweir
567cdf0e10cSrcweir xForm = getDefaultForm();
568cdf0e10cSrcweir return xForm;
569cdf0e10cSrcweir }
570cdf0e10cSrcweir
571cdf0e10cSrcweir //------------------------------------------------------------------------------
findFormForDataSource(const Reference<XForm> & rForm,const Reference<XDataSource> & _rxDatabase,const::rtl::OUString & _rCursorSource,sal_Int32 nCommandType)572cdf0e10cSrcweir Reference< XForm > FmFormPageImpl::findFormForDataSource(
573cdf0e10cSrcweir const Reference< XForm > & rForm, const Reference< XDataSource > & _rxDatabase,
574cdf0e10cSrcweir const ::rtl::OUString& _rCursorSource, sal_Int32 nCommandType)
575cdf0e10cSrcweir {
576cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "svx", "Ocke.Janssen@sun.com", "FmFormPageImpl::findFormForDataSource" );
577cdf0e10cSrcweir Reference< XForm > xResultForm;
578cdf0e10cSrcweir Reference< XRowSet > xDBForm(rForm, UNO_QUERY);
579cdf0e10cSrcweir Reference< XPropertySet > xFormProps(rForm, UNO_QUERY);
580cdf0e10cSrcweir if (!xDBForm.is() || !xFormProps.is())
581cdf0e10cSrcweir return xResultForm;
582cdf0e10cSrcweir
583cdf0e10cSrcweir OSL_ENSURE(_rxDatabase.is(), "FmFormPageImpl::findFormForDataSource: invalid data source!");
584cdf0e10cSrcweir ::rtl::OUString sLookupName; // the name of the data source we're looking for
585cdf0e10cSrcweir ::rtl::OUString sFormDataSourceName; // the name of the data source the current connection in the form is based on
586cdf0e10cSrcweir try
587cdf0e10cSrcweir {
588cdf0e10cSrcweir Reference< XPropertySet > xDSProps(_rxDatabase, UNO_QUERY);
589cdf0e10cSrcweir if (xDSProps.is())
590cdf0e10cSrcweir xDSProps->getPropertyValue(FM_PROP_NAME) >>= sLookupName;
591cdf0e10cSrcweir
592cdf0e10cSrcweir xFormProps->getPropertyValue(FM_PROP_DATASOURCE) >>= sFormDataSourceName;
593cdf0e10cSrcweir // if there's no DataSourceName set at the form, check whether we can deduce one from its
594cdf0e10cSrcweir // ActiveConnection
595cdf0e10cSrcweir if (0 == sFormDataSourceName.getLength())
596cdf0e10cSrcweir {
597cdf0e10cSrcweir Reference< XConnection > xFormConnection;
598cdf0e10cSrcweir xFormProps->getPropertyValue( FM_PROP_ACTIVE_CONNECTION ) >>= xFormConnection;
599cdf0e10cSrcweir if ( !xFormConnection.is() )
600cdf0e10cSrcweir OStaticDataAccessTools().isEmbeddedInDatabase( xFormProps, xFormConnection );
601cdf0e10cSrcweir if (xFormConnection.is())
602cdf0e10cSrcweir {
603cdf0e10cSrcweir Reference< XChild > xConnAsChild(xFormConnection, UNO_QUERY);
604cdf0e10cSrcweir if (xConnAsChild.is())
605cdf0e10cSrcweir {
606cdf0e10cSrcweir Reference< XDataSource > xFormDS(xConnAsChild->getParent(), UNO_QUERY);
607cdf0e10cSrcweir if (xFormDS.is())
608cdf0e10cSrcweir {
609cdf0e10cSrcweir xDSProps = xDSProps.query(xFormDS);
610cdf0e10cSrcweir if (xDSProps.is())
611cdf0e10cSrcweir xDSProps->getPropertyValue(FM_PROP_NAME) >>= sFormDataSourceName;
612cdf0e10cSrcweir }
613cdf0e10cSrcweir }
614cdf0e10cSrcweir }
615cdf0e10cSrcweir }
616cdf0e10cSrcweir }
617cdf0e10cSrcweir catch(const Exception& e)
618cdf0e10cSrcweir {
619cdf0e10cSrcweir (void)e;
620cdf0e10cSrcweir OSL_ENSURE(sal_False, "FmFormPageImpl::findFormForDataSource: caught an exception!");
621cdf0e10cSrcweir }
622cdf0e10cSrcweir
623cdf0e10cSrcweir if (sLookupName == sFormDataSourceName)
624cdf0e10cSrcweir {
625cdf0e10cSrcweir // jetzt noch ueberpruefen ob CursorSource und Type uebereinstimmen
626cdf0e10cSrcweir ::rtl::OUString aCursorSource = ::comphelper::getString(xFormProps->getPropertyValue(FM_PROP_COMMAND));
627cdf0e10cSrcweir sal_Int32 nType = ::comphelper::getINT32(xFormProps->getPropertyValue(FM_PROP_COMMANDTYPE));
628cdf0e10cSrcweir if (!aCursorSource.getLength() || ((nType == nCommandType) && (aCursorSource == _rCursorSource))) // found the form
629cdf0e10cSrcweir {
630cdf0e10cSrcweir xResultForm = rForm;
631cdf0e10cSrcweir // Ist noch keine Datenquelle gesetzt, wird dieses hier nachgeholt
632cdf0e10cSrcweir if (!aCursorSource.getLength())
633cdf0e10cSrcweir {
634cdf0e10cSrcweir xFormProps->setPropertyValue(FM_PROP_COMMAND, makeAny(_rCursorSource));
635cdf0e10cSrcweir xFormProps->setPropertyValue(FM_PROP_COMMANDTYPE, makeAny((sal_Int32)nCommandType));
636cdf0e10cSrcweir }
637cdf0e10cSrcweir }
638cdf0e10cSrcweir }
639cdf0e10cSrcweir
640cdf0e10cSrcweir // as long as xResultForm is NULL, search the child forms of rForm
641cdf0e10cSrcweir Reference< XIndexAccess > xComponents(rForm, UNO_QUERY);
642cdf0e10cSrcweir sal_Int32 nCount = xComponents->getCount();
643cdf0e10cSrcweir for (sal_Int32 i = 0; !xResultForm.is() && i < nCount; ++i)
644cdf0e10cSrcweir {
645cdf0e10cSrcweir Reference< ::com::sun::star::form::XForm > xSearchForm;
646cdf0e10cSrcweir xComponents->getByIndex(i) >>= xSearchForm;
647cdf0e10cSrcweir // continue searching in the sub form
648cdf0e10cSrcweir if (xSearchForm.is())
649cdf0e10cSrcweir xResultForm = findFormForDataSource( xSearchForm, _rxDatabase, _rCursorSource, nCommandType );
650cdf0e10cSrcweir }
651cdf0e10cSrcweir return xResultForm;
652cdf0e10cSrcweir }
653cdf0e10cSrcweir
654cdf0e10cSrcweir //------------------------------------------------------------------------------
setUniqueName(const Reference<XFormComponent> & xFormComponent,const Reference<XForm> & xControls)655cdf0e10cSrcweir ::rtl::OUString FmFormPageImpl::setUniqueName(const Reference< XFormComponent > & xFormComponent, const Reference< XForm > & xControls)
656cdf0e10cSrcweir {
657cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
658cdf0e10cSrcweir try
659cdf0e10cSrcweir {
660cdf0e10cSrcweir Reference< XChild > xChild( xFormComponent, UNO_QUERY_THROW );
661cdf0e10cSrcweir OSL_ENSURE( !xChild->getParent().is(), "FmFormPageImpl::setUniqueName: to be called before insertion!" );
662cdf0e10cSrcweir }
663cdf0e10cSrcweir catch( const Exception& )
664cdf0e10cSrcweir {
665cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
666cdf0e10cSrcweir }
667cdf0e10cSrcweir #endif
668cdf0e10cSrcweir ::rtl::OUString sName;
669cdf0e10cSrcweir Reference< ::com::sun::star::beans::XPropertySet > xSet(xFormComponent, UNO_QUERY);
670cdf0e10cSrcweir if (xSet.is())
671cdf0e10cSrcweir {
672cdf0e10cSrcweir sName = ::comphelper::getString( xSet->getPropertyValue( FM_PROP_NAME ) );
673cdf0e10cSrcweir Reference< ::com::sun::star::container::XNameAccess > xNameAcc(xControls, UNO_QUERY);
674cdf0e10cSrcweir
675cdf0e10cSrcweir if (!sName.getLength() || xNameAcc->hasByName(sName))
676cdf0e10cSrcweir {
677cdf0e10cSrcweir // setzen eines default Namens ueber die ClassId
678cdf0e10cSrcweir sal_Int16 nClassId( FormComponentType::CONTROL );
679cdf0e10cSrcweir xSet->getPropertyValue( FM_PROP_CLASSID ) >>= nClassId;
680cdf0e10cSrcweir
681cdf0e10cSrcweir ::rtl::OUString sDefaultName = FormControlFactory::getDefaultUniqueName_ByComponentType(
682cdf0e10cSrcweir Reference< XNameAccess >( xControls, UNO_QUERY ), xSet );
683cdf0e10cSrcweir
684cdf0e10cSrcweir // bei Radiobuttons, die einen Namen haben, diesen nicht ueberschreiben!
685cdf0e10cSrcweir if (!sName.getLength() || nClassId != ::com::sun::star::form::FormComponentType::RADIOBUTTON)
686cdf0e10cSrcweir {
687cdf0e10cSrcweir xSet->setPropertyValue(FM_PROP_NAME, makeAny(sDefaultName));
688cdf0e10cSrcweir }
689cdf0e10cSrcweir
690cdf0e10cSrcweir sName = sDefaultName;
691cdf0e10cSrcweir }
692cdf0e10cSrcweir }
693cdf0e10cSrcweir return sName;
694cdf0e10cSrcweir }
695cdf0e10cSrcweir
696cdf0e10cSrcweir //----------------------------------------------------------------------------------------------------------------------
formModelAssigned(const FmFormObj & _object)697cdf0e10cSrcweir void FmFormPageImpl::formModelAssigned( const FmFormObj& _object )
698cdf0e10cSrcweir {
699cdf0e10cSrcweir Reference< XMap > xControlShapeMap( m_aControlShapeMap.get(), UNO_QUERY );
700cdf0e10cSrcweir if ( !xControlShapeMap.is() )
701cdf0e10cSrcweir // our map does not exist -> not interested in this event
702cdf0e10cSrcweir return;
703cdf0e10cSrcweir
704cdf0e10cSrcweir try
705cdf0e10cSrcweir {
706cdf0e10cSrcweir lcl_removeFormObject_throw( _object, xControlShapeMap, false );
707cdf0e10cSrcweir lcl_insertFormObject_throw( _object, xControlShapeMap );
708cdf0e10cSrcweir }
709cdf0e10cSrcweir catch( const Exception& )
710cdf0e10cSrcweir {
711cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
712cdf0e10cSrcweir }
713cdf0e10cSrcweir }
714cdf0e10cSrcweir
715cdf0e10cSrcweir //----------------------------------------------------------------------------------------------------------------------
formObjectInserted(const FmFormObj & _object)716cdf0e10cSrcweir void FmFormPageImpl::formObjectInserted( const FmFormObj& _object )
717cdf0e10cSrcweir {
718cdf0e10cSrcweir Reference< XMap > xControlShapeMap( m_aControlShapeMap.get(), UNO_QUERY );
719cdf0e10cSrcweir if ( !xControlShapeMap.is() )
720cdf0e10cSrcweir // our map does not exist -> not interested in this event
721cdf0e10cSrcweir return;
722cdf0e10cSrcweir
723cdf0e10cSrcweir try
724cdf0e10cSrcweir {
725cdf0e10cSrcweir lcl_insertFormObject_throw( _object, xControlShapeMap );
726cdf0e10cSrcweir }
727cdf0e10cSrcweir catch( const Exception& )
728cdf0e10cSrcweir {
729cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
730cdf0e10cSrcweir }
731cdf0e10cSrcweir }
732cdf0e10cSrcweir
733cdf0e10cSrcweir //----------------------------------------------------------------------------------------------------------------------
formObjectRemoved(const FmFormObj & _object)734cdf0e10cSrcweir void FmFormPageImpl::formObjectRemoved( const FmFormObj& _object )
735cdf0e10cSrcweir {
736cdf0e10cSrcweir Reference< XMap > xControlShapeMap( m_aControlShapeMap.get(), UNO_QUERY );
737cdf0e10cSrcweir if ( !xControlShapeMap.is() )
738cdf0e10cSrcweir // our map does not exist -> not interested in this event
739cdf0e10cSrcweir return;
740cdf0e10cSrcweir
741cdf0e10cSrcweir try
742cdf0e10cSrcweir {
743cdf0e10cSrcweir lcl_removeFormObject_throw( _object, xControlShapeMap );
744cdf0e10cSrcweir }
745cdf0e10cSrcweir catch( const Exception& )
746cdf0e10cSrcweir {
747cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
748cdf0e10cSrcweir }
749cdf0e10cSrcweir }
750