xref: /AOO41X/main/sw/source/core/doc/docxforms.cxx (revision 1c582a3534e520dcb22a381d6c2592d4e463465e)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <doc.hxx>
31cdf0e10cSrcweir #include <docsh.hxx>
32cdf0e10cSrcweir #include <com/sun/star/uno/Reference.hxx>
33cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
34cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35cdf0e10cSrcweir #include <com/sun/star/frame/XModule.hpp>
36cdf0e10cSrcweir #include <com/sun/star/xforms/XModel.hpp>
37cdf0e10cSrcweir #include <com/sun/star/xforms/XFormsUIHelper1.hpp>
38cdf0e10cSrcweir #include <unotools/processfactory.hxx>
39cdf0e10cSrcweir #include <tools/diagnose_ex.h>
40*1c582a35SJian Fang Zhang #include <com/sun/star/container/XIndexAccess.hpp>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir using namespace ::com::sun::star;
43cdf0e10cSrcweir 
44cdf0e10cSrcweir using uno::Reference;
45cdf0e10cSrcweir using uno::XInterface;
46cdf0e10cSrcweir using uno::UNO_QUERY;
47cdf0e10cSrcweir using uno::makeAny;
48cdf0e10cSrcweir using uno::Exception;
49cdf0e10cSrcweir using container::XNameContainer;
50cdf0e10cSrcweir using xforms::XModel;
51cdf0e10cSrcweir using frame::XModule;
52cdf0e10cSrcweir using xforms::XFormsUIHelper1;
53cdf0e10cSrcweir using rtl::OUString;
54*1c582a35SJian Fang Zhang using com::sun::star::container::XIndexAccess;
55cdf0e10cSrcweir 
getXForms() const56cdf0e10cSrcweir Reference<XNameContainer> SwDoc::getXForms() const
57cdf0e10cSrcweir {
58cdf0e10cSrcweir     return xXForms;
59cdf0e10cSrcweir }
60cdf0e10cSrcweir 
isXForms() const61cdf0e10cSrcweir bool SwDoc::isXForms() const
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     return xXForms.is();
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
lcl_createInstance(const sal_Char * pServiceName)66cdf0e10cSrcweir Reference<XInterface> lcl_createInstance( const sal_Char* pServiceName )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir     DBG_ASSERT( pServiceName != NULL, "no service name" );
69cdf0e10cSrcweir     return utl::getProcessServiceFactory()->createInstance(
70cdf0e10cSrcweir         OUString::createFromAscii( pServiceName  ) );
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
initXForms(bool bCreateDefaultModel)73cdf0e10cSrcweir void SwDoc::initXForms( bool bCreateDefaultModel )
74cdf0e10cSrcweir {
75cdf0e10cSrcweir     DBG_ASSERT( ! isXForms(), "please initialize only once" );
76cdf0e10cSrcweir 
77cdf0e10cSrcweir     try
78cdf0e10cSrcweir     {
79cdf0e10cSrcweir         // create XForms components
80cdf0e10cSrcweir         xXForms.set( lcl_createInstance( "com.sun.star.xforms.XForms" ),
81cdf0e10cSrcweir                     UNO_QUERY );
82cdf0e10cSrcweir         DBG_ASSERT( xXForms.is(), "can't create XForms container" );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir         // change our module identifier, to be able to have a dedicated UI
85cdf0e10cSrcweir         Reference< XModule > xModule;
86cdf0e10cSrcweir         SwDocShell* pShell( GetDocShell() );
87cdf0e10cSrcweir         if ( pShell )
88cdf0e10cSrcweir             xModule = xModule.query( pShell->GetModel() );
89cdf0e10cSrcweir         DBG_ASSERT( xModule.is(), "SwDoc::initXForms: no XModule at the document!" );
90cdf0e10cSrcweir         if ( xModule.is() )
91cdf0e10cSrcweir             xModule->setIdentifier( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xforms.XMLFormDocument" ) ) );
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         // create default model
94cdf0e10cSrcweir         if( bCreateDefaultModel && xXForms.is() )
95cdf0e10cSrcweir         {
96cdf0e10cSrcweir             OUString sName(RTL_CONSTASCII_USTRINGPARAM("Model 1"));
97cdf0e10cSrcweir             Reference<XModel> xModel(
98cdf0e10cSrcweir                 lcl_createInstance( "com.sun.star.xforms.Model" ),
99cdf0e10cSrcweir                 UNO_QUERY );
100cdf0e10cSrcweir             DBG_ASSERT( xModel.is(), "no model?" );
101cdf0e10cSrcweir             if( xModel.is() )
102cdf0e10cSrcweir             {
103cdf0e10cSrcweir                 xModel->setID( sName );
104cdf0e10cSrcweir                 Reference<XFormsUIHelper1>( xModel, UNO_QUERY )->newInstance(
105cdf0e10cSrcweir                     OUString(RTL_CONSTASCII_USTRINGPARAM("Instance 1")),
106cdf0e10cSrcweir                     OUString(), sal_True );
107cdf0e10cSrcweir                 xModel->initialize();
108cdf0e10cSrcweir                 xXForms->insertByName( sName, makeAny( xModel ) );
109cdf0e10cSrcweir             }
110cdf0e10cSrcweir             DBG_ASSERT( xXForms->hasElements(), "can't create XForms model" );
111cdf0e10cSrcweir         }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir         DBG_ASSERT( isXForms(), "initialization failed" );
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir     catch( const Exception& )
116cdf0e10cSrcweir     {
117cdf0e10cSrcweir     	DBG_UNHANDLED_EXCEPTION();
118cdf0e10cSrcweir     }
119cdf0e10cSrcweir }
120*1c582a35SJian Fang Zhang 
121*1c582a35SJian Fang Zhang //
122*1c582a35SJian Fang Zhang // #i113606#, to release the cyclic reference between XFormModel and bindings/submissions.
123*1c582a35SJian Fang Zhang //
disposeXForms()124*1c582a35SJian Fang Zhang void SwDoc::disposeXForms( )
125*1c582a35SJian Fang Zhang {
126*1c582a35SJian Fang Zhang     // get XForms models
127*1c582a35SJian Fang Zhang     if( xXForms.is() )
128*1c582a35SJian Fang Zhang     {
129*1c582a35SJian Fang Zhang         // iterate over all models
130*1c582a35SJian Fang Zhang         uno::Sequence<OUString> aNames = xXForms->getElementNames();
131*1c582a35SJian Fang Zhang         const OUString* pNames = aNames.getConstArray();
132*1c582a35SJian Fang Zhang         sal_Int32 nNames = aNames.getLength();
133*1c582a35SJian Fang Zhang         for( sal_Int32 n = 0; (n < nNames); n++ )
134*1c582a35SJian Fang Zhang         {
135*1c582a35SJian Fang Zhang             Reference< xforms::XModel > xModel(
136*1c582a35SJian Fang Zhang                 xXForms->getByName( pNames[n] ), UNO_QUERY );
137*1c582a35SJian Fang Zhang 
138*1c582a35SJian Fang Zhang             if( xModel.is() )
139*1c582a35SJian Fang Zhang             {
140*1c582a35SJian Fang Zhang                 // ask model for bindings
141*1c582a35SJian Fang Zhang                 Reference< XIndexAccess > xBindings(
142*1c582a35SJian Fang Zhang                          xModel->getBindings(), UNO_QUERY );
143*1c582a35SJian Fang Zhang 
144*1c582a35SJian Fang Zhang                 //
145*1c582a35SJian Fang Zhang                 // Then release them one by one
146*1c582a35SJian Fang Zhang                 //
147*1c582a35SJian Fang Zhang                 int nCount = xBindings->getCount();
148*1c582a35SJian Fang Zhang                 for( int i = nCount-1; i >= 0; i-- )
149*1c582a35SJian Fang Zhang                 {
150*1c582a35SJian Fang Zhang                     xModel->getBindings()->remove(xBindings->getByIndex( i ));
151*1c582a35SJian Fang Zhang                 }
152*1c582a35SJian Fang Zhang 
153*1c582a35SJian Fang Zhang                 // ask model for Submissions
154*1c582a35SJian Fang Zhang                 Reference< XIndexAccess > xSubmissions(
155*1c582a35SJian Fang Zhang                          xModel->getSubmissions(), UNO_QUERY );
156*1c582a35SJian Fang Zhang 
157*1c582a35SJian Fang Zhang                 //
158*1c582a35SJian Fang Zhang                 // Then release them one by one
159*1c582a35SJian Fang Zhang                 //
160*1c582a35SJian Fang Zhang                 nCount = xSubmissions->getCount();
161*1c582a35SJian Fang Zhang                 for( int i = nCount-1; i >= 0; i-- )
162*1c582a35SJian Fang Zhang                 {
163*1c582a35SJian Fang Zhang                     xModel->getSubmissions()->remove(xSubmissions->getByIndex( i ));
164*1c582a35SJian Fang Zhang                 }
165*1c582a35SJian Fang Zhang             }
166*1c582a35SJian Fang Zhang         }
167*1c582a35SJian Fang Zhang     }
168*1c582a35SJian Fang Zhang }
169