xref: /aoo4110/main/svx/source/form/fmpgeimp.cxx (revision b1cdbd2c)
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