xref: /aoo42x/main/svx/source/form/fmmodel.cxx (revision c7be74b1)
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