xref: /AOO41X/main/svx/source/form/fmmodel.cxx (revision 3ce09a58b0d6873449cda31e55c66dba2dbc8f7f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 #include "fmundo.hxx"
28 #include "fmdocumentclassification.hxx"
29 #include "fmcontrollayout.hxx"
30 
31 #include <svx/fmmodel.hxx>
32 #include <svx/fmpage.hxx>
33 #include <svx/svdobj.hxx>
34 #include <tools/debug.hxx>
35 
36 #ifndef SVX_LIGHT
37 #include <sfx2/objsh.hxx>
38 #else
39 class SfxObjectShell;
40 #endif
41 
42 #include <boost/optional.hpp>
43 
44 using ::com::sun::star::uno::Reference;
45 using ::com::sun::star::container::XNameContainer;
46 using namespace svxform;
47 
48 TYPEINIT1(FmFormModel, SdrModel);
49 
50 struct FmFormModelImplData
51 {
52     FmXUndoEnvironment*     pUndoEnv;
53     sal_Bool                bOpenInDesignIsDefaulted;
54     sal_Bool                bMovingPage;
55     ::boost::optional< sal_Bool >
56                             aControlsUseRefDevice;
57 
FmFormModelImplDataFmFormModelImplData58     FmFormModelImplData()
59         :pUndoEnv( NULL )
60         ,bOpenInDesignIsDefaulted( sal_True )
61         ,bMovingPage( sal_False )
62         ,aControlsUseRefDevice()
63     {
64     }
65 };
66 
67 /*************************************************************************
68 |*
69 |* Ctor
70 |*
71 \************************************************************************/
FmFormModel(SfxItemPool * pPool,SfxObjectShell * pPers)72 FmFormModel::FmFormModel(SfxItemPool* pPool, SfxObjectShell* pPers)
73             :SdrModel(pPool, pPers, LOADREFCOUNTS)
74             ,m_pImpl(NULL)
75             ,m_pObjShell(0)
76             ,m_bOpenInDesignMode(sal_False)
77             ,m_bAutoControlFocus(sal_False)
78 {
79 #ifndef SVX_LIGHT
80     m_pImpl = new FmFormModelImplData;
81     m_pImpl->pUndoEnv = new FmXUndoEnvironment(*this);
82     m_pImpl->pUndoEnv->acquire();
83 #endif
84 }
85 
86 /*************************************************************************
87 |*
88 |* Ctor
89 |*
90 \************************************************************************/
FmFormModel(const XubString & rPath,SfxItemPool * pPool,SfxObjectShell * pPers)91 FmFormModel::FmFormModel(const XubString& rPath, SfxItemPool* pPool, SfxObjectShell* pPers)
92             :SdrModel(rPath, pPool, pPers)
93             ,m_pImpl(NULL)
94             ,m_pObjShell(0)
95             ,m_bOpenInDesignMode(sal_False)
96             ,m_bAutoControlFocus(sal_False)
97 {
98 #ifndef SVX_LIGHT
99     m_pImpl = new FmFormModelImplData;
100     m_pImpl->pUndoEnv = new FmXUndoEnvironment(*this);
101     m_pImpl->pUndoEnv->acquire();
102 #endif
103 }
104 
105 /*************************************************************************
106 |*
107 |* Dtor
108 |*
109 \************************************************************************/
~FmFormModel()110 FmFormModel::~FmFormModel()
111 {
112 #ifndef SVX_LIGHT
113     if (m_pObjShell && m_pImpl->pUndoEnv->IsListening(*m_pObjShell))
114         SetObjectShell(NULL);
115 
116     ClearUndoBuffer();
117     // minimale grenze fuer undos
118     SetMaxUndoActionCount(1);
119 
120     m_pImpl->pUndoEnv->release();
121     delete m_pImpl;
122 
123 #endif
124 }
125 
126 /*************************************************************************
127 |*
128 |* Erzeugt eine neue Seite
129 |*
130 \************************************************************************/
AllocPage(FASTBOOL bMasterPage)131 SdrPage* FmFormModel::AllocPage(FASTBOOL bMasterPage)
132 {
133     return new FmFormPage(*this, NULL, bMasterPage);
134 }
135 
136 /*************************************************************************
137 |*
138 |* InsertPage
139 |*
140 \************************************************************************/
InsertPage(SdrPage * pPage,sal_uInt16 nPos)141 void FmFormModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos)
142 {
143 #ifndef SVX_LIGHT
144     // hack solange Methode intern
145     if (m_pObjShell && !m_pImpl->pUndoEnv->IsListening( *m_pObjShell ))
146         SetObjectShell(m_pObjShell);
147 #endif
148 
149     SdrModel::InsertPage( pPage, nPos );
150 }
151 
152 /*************************************************************************
153 |*
154 |* MovePage
155 |*
156 \************************************************************************/
MovePage(sal_uInt16 nPgNum,sal_uInt16 nNewPos)157 void FmFormModel::MovePage( sal_uInt16 nPgNum, sal_uInt16 nNewPos )
158 {
159 #ifndef SVX_LIGHT
160     m_pImpl->bMovingPage = sal_True;
161         // see InsertPage for this
162 #endif
163 
164     SdrModel::MovePage( nPgNum, nNewPos );
165 
166 #ifndef SVX_LIGHT
167     m_pImpl->bMovingPage = sal_False;
168 #endif
169 }
170 
171 /*************************************************************************
172 |*
173 |* RemovePage
174 |*
175 \************************************************************************/
RemovePage(sal_uInt16 nPgNum)176 SdrPage* FmFormModel::RemovePage(sal_uInt16 nPgNum)
177 {
178     FmFormPage* pToBeRemovedPage = dynamic_cast< FmFormPage* >( GetPage( nPgNum ) );
179     OSL_ENSURE( pToBeRemovedPage, "FmFormModel::RemovePage: *which page*?" );
180 
181 #ifndef SVX_LIGHT
182     if ( pToBeRemovedPage )
183     {
184         Reference< XNameContainer > xForms( pToBeRemovedPage->GetForms( false ) );
185         if ( xForms.is() )
186             m_pImpl->pUndoEnv->RemoveForms( xForms );
187     }
188 #endif
189 
190     FmFormPage* pRemovedPage = (FmFormPage*)SdrModel::RemovePage(nPgNum);
191     OSL_ENSURE( pRemovedPage == pToBeRemovedPage, "FmFormModel::RemovePage: inconsistency!" );
192     return pRemovedPage;
193 }
194 
195 /*************************************************************************
196 |*
197 |* InsertMasterPage
198 |*
199 \************************************************************************/
InsertMasterPage(SdrPage * pPage,sal_uInt16 nPos)200 void FmFormModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos)
201 {
202 #ifndef SVX_LIGHT
203     // hack solange Methode intern
204     if (m_pObjShell && !m_pImpl->pUndoEnv->IsListening( *m_pObjShell ))
205         SetObjectShell(m_pObjShell);
206 #endif
207 
208     SdrModel::InsertMasterPage(pPage, nPos);
209 }
210 
211 /*************************************************************************
212 |*
213 |* RemoveMasterPage
214 |*
215 \************************************************************************/
RemoveMasterPage(sal_uInt16 nPgNum)216 SdrPage* FmFormModel::RemoveMasterPage(sal_uInt16 nPgNum)
217 {
218     FmFormPage* pPage = (FmFormPage*)SdrModel::RemoveMasterPage(nPgNum);
219 
220 #ifndef SVX_LIGHT
221     if ( pPage )
222     {
223         Reference< XNameContainer > xForms( pPage->GetForms( false ) );
224         if ( xForms.is() )
225             m_pImpl->pUndoEnv->RemoveForms( xForms );
226     }
227 #endif
228 
229     return pPage;
230 }
231 
232 //------------------------------------------------------------------------
GetControlExportLayerId(const SdrObject & rObj) const233 SdrLayerID FmFormModel::GetControlExportLayerId( const SdrObject& rObj ) const
234 {
235     return rObj.GetLayer();
236 }
237 
238 //------------------------------------------------------------------------
implSetOpenInDesignMode(sal_Bool _bOpenDesignMode,sal_Bool _bForce)239 void FmFormModel::implSetOpenInDesignMode( sal_Bool _bOpenDesignMode, sal_Bool _bForce )
240 {
241     if( ( _bOpenDesignMode != m_bOpenInDesignMode ) || _bForce )
242     {
243         m_bOpenInDesignMode = _bOpenDesignMode;
244 
245         if ( m_pObjShell )
246             m_pObjShell->SetModified( sal_True );
247     }
248     // no matter if we really did it or not - from now on, it does not count as defaulted anymore
249     m_pImpl->bOpenInDesignIsDefaulted = sal_False;
250 }
251 
252 //------------------------------------------------------------------------
SetOpenInDesignMode(sal_Bool bOpenDesignMode)253 void FmFormModel::SetOpenInDesignMode( sal_Bool bOpenDesignMode )
254 {
255 #ifndef SVX_LIGHT
256     implSetOpenInDesignMode( bOpenDesignMode, sal_False );
257 #endif
258 }
259 
260 #ifndef SVX_LIGHT
261 //------------------------------------------------------------------------
OpenInDesignModeIsDefaulted()262 sal_Bool FmFormModel::OpenInDesignModeIsDefaulted( )
263 {
264     return m_pImpl->bOpenInDesignIsDefaulted;
265 }
266 #endif
267 
268 //------------------------------------------------------------------------
ControlsUseRefDevice() const269 sal_Bool FmFormModel::ControlsUseRefDevice() const
270 {
271     if ( !m_pImpl->aControlsUseRefDevice )
272     {
273         DocumentType eDocType = eUnknownDocumentType;
274         if ( m_pObjShell )
275             eDocType = DocumentClassification::classifyHostDocument( m_pObjShell->GetModel() );
276         m_pImpl->aControlsUseRefDevice.reset( ControlLayouter::useDocumentReferenceDevice( eDocType ) );
277     }
278     return *m_pImpl->aControlsUseRefDevice;
279 }
280 
281 //------------------------------------------------------------------------
SetAutoControlFocus(sal_Bool _bAutoControlFocus)282 void FmFormModel::SetAutoControlFocus( sal_Bool _bAutoControlFocus )
283 {
284 #ifndef SVX_LIGHT
285     if( _bAutoControlFocus != m_bAutoControlFocus )
286     {
287         m_bAutoControlFocus = _bAutoControlFocus;
288         m_pObjShell->SetModified( sal_True );
289     }
290 #endif
291 }
292 
293 //------------------------------------------------------------------------
SetObjectShell(SfxObjectShell * pShell)294 void FmFormModel::SetObjectShell( SfxObjectShell* pShell )
295 {
296 #ifndef SVX_LIGHT
297     if (pShell == m_pObjShell)
298         return;
299 
300     if (m_pObjShell)
301     {
302         m_pImpl->pUndoEnv->EndListening( *this );
303         m_pImpl->pUndoEnv->EndListening( *m_pObjShell );
304     }
305 
306     m_pObjShell = pShell;
307 
308     if (m_pObjShell)
309     {
310         m_pImpl->pUndoEnv->SetReadOnly( m_pObjShell->IsReadOnly() || m_pObjShell->IsReadOnlyUI(), FmXUndoEnvironment::Accessor() );
311 
312         if (!m_pImpl->pUndoEnv->IsReadOnly())
313              m_pImpl->pUndoEnv->StartListening(*this);
314 
315         m_pImpl->pUndoEnv->StartListening( *m_pObjShell );
316     }
317 #endif
318 }
319 
320 //------------------------------------------------------------------------
GetUndoEnv()321 FmXUndoEnvironment& FmFormModel::GetUndoEnv()
322 {
323     return *m_pImpl->pUndoEnv;
324 }
325