| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_svx.hxx" |
| |
| #include "fmundo.hxx" |
| #include "fmdocumentclassification.hxx" |
| #include "fmcontrollayout.hxx" |
| |
| #include <svx/fmmodel.hxx> |
| #include <svx/fmpage.hxx> |
| #include <svx/svdobj.hxx> |
| #include <tools/debug.hxx> |
| |
| #ifndef SVX_LIGHT |
| #include <sfx2/objsh.hxx> |
| #else |
| class SfxObjectShell; |
| #endif |
| |
| #include <boost/optional.hpp> |
| |
| using ::com::sun::star::uno::Reference; |
| using ::com::sun::star::container::XNameContainer; |
| using namespace svxform; |
| |
| TYPEINIT1(FmFormModel, SdrModel); |
| |
| struct FmFormModelImplData |
| { |
| FmXUndoEnvironment* pUndoEnv; |
| sal_Bool bOpenInDesignIsDefaulted; |
| sal_Bool bMovingPage; |
| ::boost::optional< sal_Bool > |
| aControlsUseRefDevice; |
| |
| FmFormModelImplData() |
| :pUndoEnv( NULL ) |
| ,bOpenInDesignIsDefaulted( sal_True ) |
| ,bMovingPage( sal_False ) |
| ,aControlsUseRefDevice() |
| { |
| } |
| }; |
| |
| /************************************************************************* |
| |* |
| |* Ctor |
| |* |
| \************************************************************************/ |
| FmFormModel::FmFormModel(SfxItemPool* pPool, SfxObjectShell* pPers) |
| :SdrModel(pPool, pPers, LOADREFCOUNTS) |
| ,m_pImpl(NULL) |
| ,m_pObjShell(0) |
| ,m_bOpenInDesignMode(sal_False) |
| ,m_bAutoControlFocus(sal_False) |
| { |
| #ifndef SVX_LIGHT |
| m_pImpl = new FmFormModelImplData; |
| m_pImpl->pUndoEnv = new FmXUndoEnvironment(*this); |
| m_pImpl->pUndoEnv->acquire(); |
| #endif |
| } |
| |
| /************************************************************************* |
| |* |
| |* Ctor |
| |* |
| \************************************************************************/ |
| FmFormModel::FmFormModel(const XubString& rPath, SfxItemPool* pPool, SfxObjectShell* pPers) |
| :SdrModel(rPath, pPool, pPers) |
| ,m_pImpl(NULL) |
| ,m_pObjShell(0) |
| ,m_bOpenInDesignMode(sal_False) |
| ,m_bAutoControlFocus(sal_False) |
| { |
| #ifndef SVX_LIGHT |
| m_pImpl = new FmFormModelImplData; |
| m_pImpl->pUndoEnv = new FmXUndoEnvironment(*this); |
| m_pImpl->pUndoEnv->acquire(); |
| #endif |
| } |
| |
| /************************************************************************* |
| |* |
| |* Dtor |
| |* |
| \************************************************************************/ |
| FmFormModel::~FmFormModel() |
| { |
| #ifndef SVX_LIGHT |
| if (m_pObjShell && m_pImpl->pUndoEnv->IsListening(*m_pObjShell)) |
| SetObjectShell(NULL); |
| |
| ClearUndoBuffer(); |
| // minimale grenze fuer undos |
| SetMaxUndoActionCount(1); |
| |
| m_pImpl->pUndoEnv->release(); |
| delete m_pImpl; |
| |
| #endif |
| } |
| |
| /************************************************************************* |
| |* |
| |* Erzeugt eine neue Seite |
| |* |
| \************************************************************************/ |
| SdrPage* FmFormModel::AllocPage(FASTBOOL bMasterPage) |
| { |
| return new FmFormPage(*this, NULL, bMasterPage); |
| } |
| |
| /************************************************************************* |
| |* |
| |* InsertPage |
| |* |
| \************************************************************************/ |
| void FmFormModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos) |
| { |
| #ifndef SVX_LIGHT |
| // hack solange Methode intern |
| if (m_pObjShell && !m_pImpl->pUndoEnv->IsListening( *m_pObjShell )) |
| SetObjectShell(m_pObjShell); |
| #endif |
| |
| SdrModel::InsertPage( pPage, nPos ); |
| } |
| |
| /************************************************************************* |
| |* |
| |* MovePage |
| |* |
| \************************************************************************/ |
| void FmFormModel::MovePage( sal_uInt16 nPgNum, sal_uInt16 nNewPos ) |
| { |
| #ifndef SVX_LIGHT |
| m_pImpl->bMovingPage = sal_True; |
| // see InsertPage for this |
| #endif |
| |
| SdrModel::MovePage( nPgNum, nNewPos ); |
| |
| #ifndef SVX_LIGHT |
| m_pImpl->bMovingPage = sal_False; |
| #endif |
| } |
| |
| /************************************************************************* |
| |* |
| |* RemovePage |
| |* |
| \************************************************************************/ |
| SdrPage* FmFormModel::RemovePage(sal_uInt16 nPgNum) |
| { |
| FmFormPage* pToBeRemovedPage = dynamic_cast< FmFormPage* >( GetPage( nPgNum ) ); |
| OSL_ENSURE( pToBeRemovedPage, "FmFormModel::RemovePage: *which page*?" ); |
| |
| #ifndef SVX_LIGHT |
| if ( pToBeRemovedPage ) |
| { |
| Reference< XNameContainer > xForms( pToBeRemovedPage->GetForms( false ) ); |
| if ( xForms.is() ) |
| m_pImpl->pUndoEnv->RemoveForms( xForms ); |
| } |
| #endif |
| |
| FmFormPage* pRemovedPage = (FmFormPage*)SdrModel::RemovePage(nPgNum); |
| OSL_ENSURE( pRemovedPage == pToBeRemovedPage, "FmFormModel::RemovePage: inconsistency!" ); |
| return pRemovedPage; |
| } |
| |
| /************************************************************************* |
| |* |
| |* InsertMasterPage |
| |* |
| \************************************************************************/ |
| void FmFormModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos) |
| { |
| #ifndef SVX_LIGHT |
| // hack solange Methode intern |
| if (m_pObjShell && !m_pImpl->pUndoEnv->IsListening( *m_pObjShell )) |
| SetObjectShell(m_pObjShell); |
| #endif |
| |
| SdrModel::InsertMasterPage(pPage, nPos); |
| } |
| |
| /************************************************************************* |
| |* |
| |* RemoveMasterPage |
| |* |
| \************************************************************************/ |
| SdrPage* FmFormModel::RemoveMasterPage(sal_uInt16 nPgNum) |
| { |
| FmFormPage* pPage = (FmFormPage*)SdrModel::RemoveMasterPage(nPgNum); |
| |
| #ifndef SVX_LIGHT |
| if ( pPage ) |
| { |
| Reference< XNameContainer > xForms( pPage->GetForms( false ) ); |
| if ( xForms.is() ) |
| m_pImpl->pUndoEnv->RemoveForms( xForms ); |
| } |
| #endif |
| |
| return pPage; |
| } |
| |
| //------------------------------------------------------------------------ |
| SdrLayerID FmFormModel::GetControlExportLayerId( const SdrObject& rObj ) const |
| { |
| return rObj.GetLayer(); |
| } |
| |
| //------------------------------------------------------------------------ |
| void FmFormModel::implSetOpenInDesignMode( sal_Bool _bOpenDesignMode, sal_Bool _bForce ) |
| { |
| if( ( _bOpenDesignMode != m_bOpenInDesignMode ) || _bForce ) |
| { |
| m_bOpenInDesignMode = _bOpenDesignMode; |
| |
| if ( m_pObjShell ) |
| m_pObjShell->SetModified( sal_True ); |
| } |
| // no matter if we really did it or not - from now on, it does not count as defaulted anymore |
| m_pImpl->bOpenInDesignIsDefaulted = sal_False; |
| } |
| |
| //------------------------------------------------------------------------ |
| void FmFormModel::SetOpenInDesignMode( sal_Bool bOpenDesignMode ) |
| { |
| #ifndef SVX_LIGHT |
| implSetOpenInDesignMode( bOpenDesignMode, sal_False ); |
| #endif |
| } |
| |
| #ifndef SVX_LIGHT |
| //------------------------------------------------------------------------ |
| sal_Bool FmFormModel::OpenInDesignModeIsDefaulted( ) |
| { |
| return m_pImpl->bOpenInDesignIsDefaulted; |
| } |
| #endif |
| |
| //------------------------------------------------------------------------ |
| sal_Bool FmFormModel::ControlsUseRefDevice() const |
| { |
| if ( !m_pImpl->aControlsUseRefDevice ) |
| { |
| DocumentType eDocType = eUnknownDocumentType; |
| if ( m_pObjShell ) |
| eDocType = DocumentClassification::classifyHostDocument( m_pObjShell->GetModel() ); |
| m_pImpl->aControlsUseRefDevice.reset( ControlLayouter::useDocumentReferenceDevice( eDocType ) ); |
| } |
| return *m_pImpl->aControlsUseRefDevice; |
| } |
| |
| //------------------------------------------------------------------------ |
| void FmFormModel::SetAutoControlFocus( sal_Bool _bAutoControlFocus ) |
| { |
| #ifndef SVX_LIGHT |
| if( _bAutoControlFocus != m_bAutoControlFocus ) |
| { |
| m_bAutoControlFocus = _bAutoControlFocus; |
| m_pObjShell->SetModified( sal_True ); |
| } |
| #endif |
| } |
| |
| //------------------------------------------------------------------------ |
| void FmFormModel::SetObjectShell( SfxObjectShell* pShell ) |
| { |
| #ifndef SVX_LIGHT |
| if (pShell == m_pObjShell) |
| return; |
| |
| if (m_pObjShell) |
| { |
| m_pImpl->pUndoEnv->EndListening( *this ); |
| m_pImpl->pUndoEnv->EndListening( *m_pObjShell ); |
| } |
| |
| m_pObjShell = pShell; |
| |
| if (m_pObjShell) |
| { |
| m_pImpl->pUndoEnv->SetReadOnly( m_pObjShell->IsReadOnly() || m_pObjShell->IsReadOnlyUI(), FmXUndoEnvironment::Accessor() ); |
| |
| if (!m_pImpl->pUndoEnv->IsReadOnly()) |
| m_pImpl->pUndoEnv->StartListening(*this); |
| |
| m_pImpl->pUndoEnv->StartListening( *m_pObjShell ); |
| } |
| #endif |
| } |
| |
| //------------------------------------------------------------------------ |
| FmXUndoEnvironment& FmFormModel::GetUndoEnv() |
| { |
| return *m_pImpl->pUndoEnv; |
| } |