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