xref: /AOO41X/main/svx/source/form/fmmodel.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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 
58     FmFormModelImplData()
59         :pUndoEnv( NULL )
60         ,bOpenInDesignIsDefaulted( sal_True )
61         ,bMovingPage( sal_False )
62         ,aControlsUseRefDevice()
63     {
64     }
65 };
66 
67 /*************************************************************************
68 |*
69 |* Ctor
70 |*
71 \************************************************************************/
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 \************************************************************************/
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 |* Ctor
108 |*
109 \************************************************************************/
110 FmFormModel::FmFormModel(SfxItemPool* pPool, SfxObjectShell* pPers,
111                          FASTBOOL bUseExtColorTable
112                          )
113             :SdrModel(pPool, pPers, bUseExtColorTable, LOADREFCOUNTS)
114             ,m_pImpl(NULL)
115             ,m_pObjShell(0)
116             ,m_bOpenInDesignMode(sal_False)
117             ,m_bAutoControlFocus(sal_False)
118 {
119 #ifndef SVX_LIGHT
120     m_pImpl = new FmFormModelImplData;
121     m_pImpl->pUndoEnv = new FmXUndoEnvironment(*this);
122     m_pImpl->pUndoEnv->acquire();
123 #endif
124 }
125 
126 /*************************************************************************
127 |*
128 |* Ctor
129 |*
130 \************************************************************************/
131 FmFormModel::FmFormModel(const XubString& rPath, SfxItemPool* pPool, SfxObjectShell* pPers,
132                          FASTBOOL bUseExtColorTable)
133             :SdrModel(rPath, pPool, pPers, bUseExtColorTable, LOADREFCOUNTS)
134             ,m_pImpl( NULL )
135             ,m_pObjShell(0)
136             ,m_bOpenInDesignMode(sal_False)
137             ,m_bAutoControlFocus(sal_False)
138 {
139 #ifndef SVX_LIGHT
140     m_pImpl = new FmFormModelImplData;
141     m_pImpl->pUndoEnv = new FmXUndoEnvironment(*this);
142     m_pImpl->pUndoEnv->acquire();
143 #endif
144 }
145 
146 /*************************************************************************
147 |*
148 |* Dtor
149 |*
150 \************************************************************************/
151 FmFormModel::~FmFormModel()
152 {
153 #ifndef SVX_LIGHT
154     if (m_pObjShell && m_pImpl->pUndoEnv->IsListening(*m_pObjShell))
155         SetObjectShell(NULL);
156 
157     ClearUndoBuffer();
158     // minimale grenze fuer undos
159     SetMaxUndoActionCount(1);
160 
161     m_pImpl->pUndoEnv->release();
162     delete m_pImpl;
163 
164 #endif
165 }
166 
167 /*************************************************************************
168 |*
169 |* Erzeugt eine neue Seite
170 |*
171 \************************************************************************/
172 SdrPage* FmFormModel::AllocPage(FASTBOOL bMasterPage)
173 {
174     return new FmFormPage(*this, NULL, bMasterPage);
175 }
176 
177 /*************************************************************************
178 |*
179 |* InsertPage
180 |*
181 \************************************************************************/
182 void FmFormModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos)
183 {
184 #ifndef SVX_LIGHT
185     // hack solange Methode intern
186     if (m_pObjShell && !m_pImpl->pUndoEnv->IsListening( *m_pObjShell ))
187         SetObjectShell(m_pObjShell);
188 #endif
189 
190     SdrModel::InsertPage( pPage, nPos );
191 }
192 
193 /*************************************************************************
194 |*
195 |* MovePage
196 |*
197 \************************************************************************/
198 void FmFormModel::MovePage( sal_uInt16 nPgNum, sal_uInt16 nNewPos )
199 {
200 #ifndef SVX_LIGHT
201     m_pImpl->bMovingPage = sal_True;
202         // see InsertPage for this
203 #endif
204 
205     SdrModel::MovePage( nPgNum, nNewPos );
206 
207 #ifndef SVX_LIGHT
208     m_pImpl->bMovingPage = sal_False;
209 #endif
210 }
211 
212 /*************************************************************************
213 |*
214 |* RemovePage
215 |*
216 \************************************************************************/
217 SdrPage* FmFormModel::RemovePage(sal_uInt16 nPgNum)
218 {
219     FmFormPage* pToBeRemovedPage = dynamic_cast< FmFormPage* >( GetPage( nPgNum ) );
220     OSL_ENSURE( pToBeRemovedPage, "FmFormModel::RemovePage: *which page*?" );
221 
222 #ifndef SVX_LIGHT
223     if ( pToBeRemovedPage )
224     {
225         Reference< XNameContainer > xForms( pToBeRemovedPage->GetForms( false ) );
226         if ( xForms.is() )
227             m_pImpl->pUndoEnv->RemoveForms( xForms );
228     }
229 #endif
230 
231     FmFormPage* pRemovedPage = (FmFormPage*)SdrModel::RemovePage(nPgNum);
232     OSL_ENSURE( pRemovedPage == pToBeRemovedPage, "FmFormModel::RemovePage: inconsistency!" );
233     return pRemovedPage;
234 }
235 
236 /*************************************************************************
237 |*
238 |* InsertMasterPage
239 |*
240 \************************************************************************/
241 void FmFormModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos)
242 {
243 #ifndef SVX_LIGHT
244     // hack solange Methode intern
245     if (m_pObjShell && !m_pImpl->pUndoEnv->IsListening( *m_pObjShell ))
246         SetObjectShell(m_pObjShell);
247 #endif
248 
249     SdrModel::InsertMasterPage(pPage, nPos);
250 }
251 
252 /*************************************************************************
253 |*
254 |* RemoveMasterPage
255 |*
256 \************************************************************************/
257 SdrPage* FmFormModel::RemoveMasterPage(sal_uInt16 nPgNum)
258 {
259     FmFormPage* pPage = (FmFormPage*)SdrModel::RemoveMasterPage(nPgNum);
260 
261 #ifndef SVX_LIGHT
262     if ( pPage )
263     {
264         Reference< XNameContainer > xForms( pPage->GetForms( false ) );
265         if ( xForms.is() )
266             m_pImpl->pUndoEnv->RemoveForms( xForms );
267     }
268 #endif
269 
270     return pPage;
271 }
272 
273 //------------------------------------------------------------------------
274 SdrLayerID FmFormModel::GetControlExportLayerId( const SdrObject& rObj ) const
275 {
276     return rObj.GetLayer();
277 }
278 
279 //------------------------------------------------------------------------
280 void FmFormModel::implSetOpenInDesignMode( sal_Bool _bOpenDesignMode, sal_Bool _bForce )
281 {
282     if( ( _bOpenDesignMode != m_bOpenInDesignMode ) || _bForce )
283     {
284         m_bOpenInDesignMode = _bOpenDesignMode;
285 
286         if ( m_pObjShell )
287             m_pObjShell->SetModified( sal_True );
288     }
289     // no matter if we really did it or not - from now on, it does not count as defaulted anymore
290     m_pImpl->bOpenInDesignIsDefaulted = sal_False;
291 }
292 
293 //------------------------------------------------------------------------
294 void FmFormModel::SetOpenInDesignMode( sal_Bool bOpenDesignMode )
295 {
296 #ifndef SVX_LIGHT
297     implSetOpenInDesignMode( bOpenDesignMode, sal_False );
298 #endif
299 }
300 
301 #ifndef SVX_LIGHT
302 //------------------------------------------------------------------------
303 sal_Bool FmFormModel::OpenInDesignModeIsDefaulted( )
304 {
305     return m_pImpl->bOpenInDesignIsDefaulted;
306 }
307 #endif
308 
309 //------------------------------------------------------------------------
310 sal_Bool FmFormModel::ControlsUseRefDevice() const
311 {
312     if ( !m_pImpl->aControlsUseRefDevice )
313     {
314         DocumentType eDocType = eUnknownDocumentType;
315         if ( m_pObjShell )
316             eDocType = DocumentClassification::classifyHostDocument( m_pObjShell->GetModel() );
317         m_pImpl->aControlsUseRefDevice.reset( ControlLayouter::useDocumentReferenceDevice( eDocType ) );
318     }
319     return *m_pImpl->aControlsUseRefDevice;
320 }
321 
322 //------------------------------------------------------------------------
323 void FmFormModel::SetAutoControlFocus( sal_Bool _bAutoControlFocus )
324 {
325 #ifndef SVX_LIGHT
326     if( _bAutoControlFocus != m_bAutoControlFocus )
327     {
328         m_bAutoControlFocus = _bAutoControlFocus;
329         m_pObjShell->SetModified( sal_True );
330     }
331 #endif
332 }
333 
334 //------------------------------------------------------------------------
335 void FmFormModel::SetObjectShell( SfxObjectShell* pShell )
336 {
337 #ifndef SVX_LIGHT
338     if (pShell == m_pObjShell)
339         return;
340 
341     if (m_pObjShell)
342     {
343         m_pImpl->pUndoEnv->EndListening( *this );
344         m_pImpl->pUndoEnv->EndListening( *m_pObjShell );
345     }
346 
347     m_pObjShell = pShell;
348 
349     if (m_pObjShell)
350     {
351         m_pImpl->pUndoEnv->SetReadOnly( m_pObjShell->IsReadOnly() || m_pObjShell->IsReadOnlyUI(), FmXUndoEnvironment::Accessor() );
352 
353         if (!m_pImpl->pUndoEnv->IsReadOnly())
354              m_pImpl->pUndoEnv->StartListening(*this);
355 
356         m_pImpl->pUndoEnv->StartListening( *m_pObjShell );
357     }
358 #endif
359 }
360 
361 //------------------------------------------------------------------------
362 FmXUndoEnvironment& FmFormModel::GetUndoEnv()
363 {
364     return *m_pImpl->pUndoEnv;
365 }
366